MoleditPy-linux 1.16.1a2__py3-none-any.whl → 1.16.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. moleditpy_linux/modules/assets/icon.icns +0 -0
  2. moleditpy_linux/modules/assets/icon.ico +0 -0
  3. moleditpy_linux/modules/assets/icon.png +0 -0
  4. {moleditpy-linux → moleditpy_linux}/modules/constants.py +1 -1
  5. {moleditpy-linux → moleditpy_linux}/modules/main_window_main_init.py +16 -11
  6. {moleditpy-linux → moleditpy_linux}/modules/main_window_molecular_parsers.py +147 -66
  7. {moleditpy-linux → moleditpy_linux}/modules/main_window_view_3d.py +61 -13
  8. {moleditpy-linux → moleditpy_linux}/modules/settings_dialog.py +37 -0
  9. {moleditpy_linux-1.16.1a2.dist-info → moleditpy_linux-1.16.2.dist-info}/METADATA +1 -1
  10. moleditpy_linux-1.16.2.dist-info/RECORD +54 -0
  11. moleditpy_linux-1.16.2.dist-info/top_level.txt +1 -0
  12. moleditpy_linux-1.16.1a2.dist-info/RECORD +0 -51
  13. moleditpy_linux-1.16.1a2.dist-info/top_level.txt +0 -1
  14. {moleditpy-linux → moleditpy_linux}/__init__.py +0 -0
  15. {moleditpy-linux → moleditpy_linux}/__main__.py +0 -0
  16. {moleditpy-linux → moleditpy_linux}/main.py +0 -0
  17. {moleditpy-linux → moleditpy_linux}/modules/__init__.py +0 -0
  18. {moleditpy-linux → moleditpy_linux}/modules/about_dialog.py +0 -0
  19. {moleditpy-linux → moleditpy_linux}/modules/align_plane_dialog.py +0 -0
  20. {moleditpy-linux → moleditpy_linux}/modules/alignment_dialog.py +0 -0
  21. {moleditpy-linux → moleditpy_linux}/modules/analysis_window.py +0 -0
  22. {moleditpy-linux → moleditpy_linux}/modules/angle_dialog.py +0 -0
  23. {moleditpy-linux → moleditpy_linux}/modules/atom_item.py +0 -0
  24. {moleditpy-linux → moleditpy_linux}/modules/bond_item.py +0 -0
  25. {moleditpy-linux → moleditpy_linux}/modules/bond_length_dialog.py +0 -0
  26. {moleditpy-linux → moleditpy_linux}/modules/calculation_worker.py +0 -0
  27. {moleditpy-linux → moleditpy_linux}/modules/color_settings_dialog.py +0 -0
  28. {moleditpy-linux → moleditpy_linux}/modules/constrained_optimization_dialog.py +0 -0
  29. {moleditpy-linux → moleditpy_linux}/modules/custom_interactor_style.py +0 -0
  30. {moleditpy-linux → moleditpy_linux}/modules/custom_qt_interactor.py +0 -0
  31. {moleditpy-linux → moleditpy_linux}/modules/dialog3_d_picking_mixin.py +0 -0
  32. {moleditpy-linux → moleditpy_linux}/modules/dihedral_dialog.py +0 -0
  33. {moleditpy-linux → moleditpy_linux}/modules/main_window.py +0 -0
  34. {moleditpy-linux → moleditpy_linux}/modules/main_window_app_state.py +0 -0
  35. {moleditpy-linux → moleditpy_linux}/modules/main_window_compute.py +0 -0
  36. {moleditpy-linux → moleditpy_linux}/modules/main_window_dialog_manager.py +0 -0
  37. {moleditpy-linux → moleditpy_linux}/modules/main_window_edit_3d.py +0 -0
  38. {moleditpy-linux → moleditpy_linux}/modules/main_window_edit_actions.py +0 -0
  39. {moleditpy-linux → moleditpy_linux}/modules/main_window_export.py +0 -0
  40. {moleditpy-linux → moleditpy_linux}/modules/main_window_project_io.py +0 -0
  41. {moleditpy-linux → moleditpy_linux}/modules/main_window_string_importers.py +0 -0
  42. {moleditpy-linux → moleditpy_linux}/modules/main_window_ui_manager.py +0 -0
  43. {moleditpy-linux → moleditpy_linux}/modules/main_window_view_loaders.py +0 -0
  44. {moleditpy-linux → moleditpy_linux}/modules/mirror_dialog.py +0 -0
  45. {moleditpy-linux → moleditpy_linux}/modules/molecular_data.py +0 -0
  46. {moleditpy-linux → moleditpy_linux}/modules/molecule_scene.py +0 -0
  47. {moleditpy-linux → moleditpy_linux}/modules/move_group_dialog.py +0 -0
  48. {moleditpy-linux → moleditpy_linux}/modules/periodic_table_dialog.py +0 -0
  49. {moleditpy-linux → moleditpy_linux}/modules/planarize_dialog.py +0 -0
  50. {moleditpy-linux → moleditpy_linux}/modules/template_preview_item.py +0 -0
  51. {moleditpy-linux → moleditpy_linux}/modules/template_preview_view.py +0 -0
  52. {moleditpy-linux → moleditpy_linux}/modules/translation_dialog.py +0 -0
  53. {moleditpy-linux → moleditpy_linux}/modules/user_template_dialog.py +0 -0
  54. {moleditpy-linux → moleditpy_linux}/modules/zoomable_view.py +0 -0
  55. {moleditpy_linux-1.16.1a2.dist-info → moleditpy_linux-1.16.2.dist-info}/WHEEL +0 -0
  56. {moleditpy_linux-1.16.1a2.dist-info → moleditpy_linux-1.16.2.dist-info}/entry_points.txt +0 -0
Binary file
Binary file
Binary file
@@ -4,7 +4,7 @@ from PyQt6.QtGui import QFont, QColor
4
4
  from rdkit import Chem
5
5
 
6
6
  #Version
7
- VERSION = '1.16.1a2'
7
+ VERSION = '1.16.2'
8
8
 
9
9
  ATOM_RADIUS = 18
10
10
  BOND_OFFSET = 3.5
@@ -79,6 +79,8 @@ def detect_system_theme():
79
79
 
80
80
  # macOS: 'defaults read -g AppleInterfaceStyle'
81
81
  if platform.system() == 'Darwin':
82
+ return 'light'
83
+ '''
82
84
  try:
83
85
  # 'defaults read ...' が成功すればダークモード
84
86
  p = subprocess.run(
@@ -94,6 +96,7 @@ def detect_system_theme():
94
96
  except Exception:
95
97
  # その他のエラー
96
98
  pass
99
+ '''
97
100
 
98
101
  # Linux / GNOME: try color-scheme gsetting; fallback to gtk-theme detection
99
102
  if platform.system() == 'Linux':
@@ -494,11 +497,10 @@ class MainWindowMainInit(object):
494
497
  def _icon_foreground_color():
495
498
  """Return a QColor for icon foreground.
496
499
 
497
- NOTE: this application inverts the usual foreground mapping so icons
498
- will be the *opposite* color to the background (i.e., black on dark
499
- backgrounds, white on light backgrounds). This intentionally reverses
500
- the previous behavior so button icons don't blend into the 3D-view
501
- background. Priority: explicit setting in 'icon_foreground' -> OS
500
+ NOTE: choose icon foreground to contrast against the background
501
+ (i.e., white on dark backgrounds, black on light backgrounds). This
502
+ matches common conventions. Priority: explicit setting in
503
+ 'icon_foreground' -> OS theme preference -> configured 3D
502
504
  theme preference -> configured 3D background -> application palette.
503
505
  """
504
506
  try:
@@ -513,9 +515,9 @@ class MainWindowMainInit(object):
513
515
  # 1) Prefer the system/OS dark-mode preference if available.
514
516
  try:
515
517
  os_pref = detect_system_dark_mode()
516
- # Invert the color so in dark-pref OS we return black, in light we return white
518
+ # Standard mapping: dark -> white, light -> black
517
519
  if os_pref is not None:
518
- return QColor('#000000') if os_pref else QColor('#FFFFFF')
520
+ return QColor('#FFFFFF') if os_pref else QColor('#000000')
519
521
  except Exception:
520
522
  pass
521
523
 
@@ -527,8 +529,8 @@ class MainWindowMainInit(object):
527
529
  bg = QColor(bg_hex)
528
530
  if bg.isValid():
529
531
  lum = 0.2126 * bg.redF() + 0.7152 * bg.greenF() + 0.0722 * bg.blueF()
530
- # Inverted: return black on dark (lum<0.5), white on light
531
- return QColor('#000000') if lum < 0.5 else QColor('#FFFFFF')
532
+ # Return white on dark (lum<0.5), black on light
533
+ return QColor('#FFFFFF') if lum < 0.5 else QColor('#000000')
532
534
  except Exception:
533
535
  pass
534
536
 
@@ -537,8 +539,8 @@ class MainWindowMainInit(object):
537
539
  # palette.window() returns a QBrush; call color()
538
540
  window_bg = pal.window().color()
539
541
  lum = 0.2126 * window_bg.redF() + 0.7152 * window_bg.greenF() + 0.0722 * window_bg.blueF()
540
- # Inverted mapping for palette fallback
541
- return QColor('#000000') if lum < 0.5 else QColor('#FFFFFF')
542
+ # Palette-based mapping: white on dark palette background
543
+ return QColor('#FFFFFF') if lum < 0.5 else QColor('#000000')
542
544
  except Exception:
543
545
  return QColor('#000000')
544
546
 
@@ -1577,6 +1579,9 @@ class MainWindowMainInit(object):
1577
1579
  # Color overrides
1578
1580
  'ball_stick_bond_color': '#7F7F7F',
1579
1581
  'cpk_colors': {}, # symbol->hex overrides
1582
+ # Whether to kekulize aromatic systems for 3D display
1583
+ 'display_kekule_3d': False,
1584
+ 'always_ask_charge': False,
1580
1585
  }
1581
1586
 
1582
1587
  try:
@@ -557,92 +557,173 @@ class MainWindowMolecularParsers(object):
557
557
  # Accept the candidate
558
558
  return candidate_mol
559
559
 
560
- # Silent first attempt
560
+ # Decide whether to silently try charge=0 first, or prompt user first.
561
+ always_ask = bool(self.settings.get('always_ask_charge', False))
562
+
561
563
  try:
562
- final_mol = _process_with_charge(0)
563
- except RuntimeError:
564
- # DetermineBonds explicitly failed for charge=0. In this
565
- # situation, repeatedly prompt the user for charges until
566
- # DetermineBonds succeeds or the user cancels.
567
- while True:
568
- charge_val, ok, skip_flag = prompt_for_charge()
569
- if not ok:
570
- # user cancelled the prompt -> abort
571
- return None
572
- if skip_flag:
573
- # User selected Skip chemistry: attempt distance-based salvage
574
- try:
575
- self.estimate_bonds_from_distances(mol)
576
- except Exception:
577
- pass
578
- salvaged = None
579
- try:
580
- salvaged = mol.GetMol()
581
- except Exception:
582
- salvaged = None
564
+ if not always_ask:
565
+ # Silent first attempt (existing behavior)
566
+ try:
567
+ final_mol = _process_with_charge(0)
568
+ except RuntimeError:
569
+ # DetermineBonds explicitly failed for charge=0. In this
570
+ # situation, repeatedly prompt the user for charges until
571
+ # DetermineBonds succeeds or the user cancels.
572
+ while True:
573
+ charge_val, ok, skip_flag = prompt_for_charge()
574
+ if not ok:
575
+ # user cancelled the prompt -> abort
576
+ return None
577
+ if skip_flag:
578
+ # User selected Skip chemistry: attempt distance-based salvage
579
+ try:
580
+ self.estimate_bonds_from_distances(mol)
581
+ except Exception:
582
+ pass
583
+ salvaged = None
584
+ try:
585
+ salvaged = mol.GetMol()
586
+ except Exception:
587
+ salvaged = None
588
+
589
+ if salvaged is not None:
590
+ try:
591
+ salvaged.SetIntProp("_xyz_skip_checks", 1)
592
+ except Exception:
593
+ try:
594
+ salvaged._xyz_skip_checks = True
595
+ except Exception:
596
+ pass
597
+ final_mol = salvaged
598
+ break
599
+ else:
600
+ # Could not salvage; abort
601
+ try:
602
+ self.statusBar().showMessage("Skip chemistry selected but failed to create salvaged molecule.")
603
+ except Exception:
604
+ pass
605
+ return None
583
606
 
584
- if salvaged is not None:
585
607
  try:
586
- salvaged.SetIntProp("_xyz_skip_checks", 1)
587
- except Exception:
608
+ final_mol = _process_with_charge(charge_val)
609
+ # success -> break out of prompt loop
610
+ break
611
+ except RuntimeError:
612
+ # DetermineBonds still failing for this charge -> loop again
588
613
  try:
589
- salvaged._xyz_skip_checks = True
614
+ self.statusBar().showMessage("DetermineBonds failed for that charge; please try a different total charge or cancel.")
590
615
  except Exception:
591
616
  pass
592
- final_mol = salvaged
593
- break
594
- else:
595
- # Could not salvage; abort
617
+ continue
618
+ except Exception as e_prompt:
619
+ # Some other failure occurred after DetermineBonds or in
620
+ # finalization. If skip_chemistry_checks is enabled we
621
+ # try the salvaged mol once; otherwise prompt again.
622
+ try:
623
+ skip_checks = bool(self.settings.get('skip_chemistry_checks', False))
624
+ except Exception:
625
+ skip_checks = False
626
+
627
+ salvaged = None
628
+ try:
629
+ salvaged = mol.GetMol()
630
+ except Exception:
631
+ salvaged = None
632
+
633
+ if skip_checks and salvaged is not None:
634
+ final_mol = salvaged
635
+ # mark salvaged molecule as produced under skip_checks
636
+ try:
637
+ final_mol.SetIntProp("_xyz_skip_checks", 1)
638
+ except Exception:
639
+ try:
640
+ final_mol._xyz_skip_checks = True
641
+ except Exception:
642
+ pass
643
+ break
644
+ else:
645
+ try:
646
+ self.statusBar().showMessage(f"Retry failed: {e_prompt}")
647
+ except Exception:
648
+ pass
649
+ # Continue prompting
650
+ continue
651
+ else:
652
+ # User has requested to always be asked for charge — prompt before any silent try
653
+ while True:
654
+ charge_val, ok, skip_flag = prompt_for_charge()
655
+ if not ok:
656
+ # user cancelled the prompt -> abort
657
+ return None
658
+ if skip_flag:
659
+ # User selected Skip chemistry: attempt distance-based salvage
596
660
  try:
597
- self.statusBar().showMessage("Skip chemistry selected but failed to create salvaged molecule.")
661
+ self.estimate_bonds_from_distances(mol)
598
662
  except Exception:
599
663
  pass
600
- return None
601
-
602
- try:
603
- final_mol = _process_with_charge(charge_val)
604
- # success -> break out of prompt loop
605
- break
606
- except RuntimeError:
607
- # DetermineBonds still failing for this charge -> loop again
608
- try:
609
- self.statusBar().showMessage("DetermineBonds failed for that charge; please try a different total charge or cancel.")
610
- except Exception:
611
- pass
612
- continue
613
- except Exception as e_prompt:
614
- # Some other failure occurred after DetermineBonds or in
615
- # finalization. If skip_chemistry_checks is enabled we
616
- # try the salvaged mol once; otherwise prompt again.
617
- try:
618
- skip_checks = bool(self.settings.get('skip_chemistry_checks', False))
619
- except Exception:
620
- skip_checks = False
621
-
622
- salvaged = None
623
- try:
624
- salvaged = mol.GetMol()
625
- except Exception:
626
664
  salvaged = None
627
-
628
- if skip_checks and salvaged is not None:
629
- final_mol = salvaged
630
- # mark salvaged molecule as produced under skip_checks
631
665
  try:
632
- final_mol.SetIntProp("_xyz_skip_checks", 1)
666
+ salvaged = mol.GetMol()
633
667
  except Exception:
668
+ salvaged = None
669
+
670
+ if salvaged is not None:
634
671
  try:
635
- final_mol._xyz_skip_checks = True
672
+ salvaged.SetIntProp("_xyz_skip_checks", 1)
673
+ except Exception:
674
+ try:
675
+ salvaged._xyz_skip_checks = True
676
+ except Exception:
677
+ pass
678
+ final_mol = salvaged
679
+ break
680
+ else:
681
+ try:
682
+ self.statusBar().showMessage("Skip chemistry selected but failed to create salvaged molecule.")
636
683
  except Exception:
637
684
  pass
685
+ return None
686
+
687
+ try:
688
+ final_mol = _process_with_charge(charge_val)
689
+ # success -> break out of prompt loop
638
690
  break
639
- else:
691
+ except RuntimeError:
692
+ # DetermineBonds still failing for this charge -> loop again
640
693
  try:
641
- self.statusBar().showMessage(f"Retry failed: {e_prompt}")
694
+ self.statusBar().showMessage("DetermineBonds failed for that charge; please try a different total charge or cancel.")
642
695
  except Exception:
643
696
  pass
644
- # Continue prompting
645
697
  continue
698
+ except Exception as e_prompt:
699
+ try:
700
+ skip_checks = bool(self.settings.get('skip_chemistry_checks', False))
701
+ except Exception:
702
+ skip_checks = False
703
+
704
+ salvaged = None
705
+ try:
706
+ salvaged = mol.GetMol()
707
+ except Exception:
708
+ salvaged = None
709
+
710
+ if skip_checks and salvaged is not None:
711
+ final_mol = salvaged
712
+ try:
713
+ final_mol.SetIntProp("_xyz_skip_checks", 1)
714
+ except Exception:
715
+ try:
716
+ final_mol._xyz_skip_checks = True
717
+ except Exception:
718
+ pass
719
+ break
720
+ else:
721
+ try:
722
+ self.statusBar().showMessage(f"Retry failed: {e_prompt}")
723
+ except Exception:
724
+ pass
725
+ continue
726
+
646
727
  except Exception:
647
728
  # If the silent attempt failed for reasons other than
648
729
  # DetermineBonds failing (e.g., finalization errors), fall
@@ -156,11 +156,30 @@ class MainWindowView3d(object):
156
156
  self.plotter.add_light(light)
157
157
 
158
158
  # 5. 分子描画ロジック
159
+ # Optionally kekulize aromatic systems for 3D visualization.
160
+ mol_to_draw = mol
161
+ if self.settings.get('display_kekule_3d', False):
162
+ try:
163
+ # Operate on a copy to avoid mutating the original molecule
164
+ mol_to_draw = Chem.Mol(mol)
165
+ Chem.Kekulize(mol_to_draw, clearAromaticFlags=True)
166
+ except Exception as e:
167
+ # Kekulize failed; keep original and warn user
168
+ try:
169
+ self.statusBar().showMessage(f"Kekulize failed: {e}")
170
+ except Exception:
171
+ pass
172
+ mol_to_draw = mol
173
+
174
+ # Use the original molecule's conformer (positions) to ensure coordinates
175
+ # are preserved even when we create a kekulized copy for bond types.
159
176
  conf = mol.GetConformer()
160
177
 
161
- self.atom_positions_3d = np.array([list(conf.GetAtomPosition(i)) for i in range(mol.GetNumAtoms())])
178
+ # Use the kekulized molecule's atom ordering for color/size decisions
179
+ self.atom_positions_3d = np.array([list(conf.GetAtomPosition(i)) for i in range(mol_to_draw.GetNumAtoms())])
162
180
 
163
- sym = [a.GetSymbol() for a in mol.GetAtoms()]
181
+ # Use the possibly-kekulized molecule for symbol/bond types
182
+ sym = [a.GetSymbol() for a in mol_to_draw.GetAtoms()]
164
183
  col = np.array([CPK_COLORS_PV.get(s, [0.5, 0.5, 0.5]) for s in sym])
165
184
 
166
185
  # スタイルに応じて原子の半径を設定(設定から読み込み)
@@ -239,7 +258,7 @@ class MainWindowView3d(object):
239
258
  except Exception:
240
259
  bs_bond_rgb = [127, 127, 127]
241
260
 
242
- for bond in mol.GetBonds():
261
+ for bond in mol_to_draw.GetBonds():
243
262
  begin_atom_idx = bond.GetBeginAtomIdx()
244
263
  end_atom_idx = bond.GetEndAtomIdx()
245
264
  sp = np.array(conf.GetAtomPosition(begin_atom_idx))
@@ -313,7 +332,7 @@ class MainWindowView3d(object):
313
332
  if bt == Chem.rdchem.BondType.DOUBLE:
314
333
  r = cyl_radius * double_radius_factor
315
334
  # 二重結合の場合、結合している原子の他の結合を考慮してオフセット方向を決定
316
- off_dir = self._calculate_double_bond_offset(mol, bond, conf)
335
+ off_dir = self._calculate_double_bond_offset(mol_to_draw, bond, conf)
317
336
  # 設定から二重結合のオフセットファクターを適用
318
337
  s_double = cyl_radius * double_offset_factor
319
338
  c1, c2 = c + off_dir * (s_double / 2), c - off_dir * (s_double / 2)
@@ -432,7 +451,10 @@ class MainWindowView3d(object):
432
451
  # E/Zラベルも表示
433
452
  if getattr(self, 'show_chiral_labels', False):
434
453
  try:
435
- self.show_ez_labels_3d(mol)
454
+ # If we drew a kekulized molecule use it for E/Z detection so
455
+ # E/Z labels reflect Kekulé rendering; pass mol_to_draw as the
456
+ # molecule to scan for bond stereochemistry.
457
+ self.show_ez_labels_3d(mol, scan_mol=mol_to_draw)
436
458
  except Exception as e:
437
459
  self.statusBar().showMessage(f"3D E/Z label drawing error: {e}")
438
460
 
@@ -561,7 +583,7 @@ class MainWindowView3d(object):
561
583
 
562
584
 
563
585
 
564
- def show_ez_labels_3d(self, mol):
586
+ def show_ez_labels_3d(self, mol, scan_mol=None):
565
587
  """3DビューでE/Zラベルを表示する(RDKitのステレオ化学判定を使用)"""
566
588
  if not mol:
567
589
  return
@@ -588,11 +610,19 @@ class MainWindowView3d(object):
588
610
  pass
589
611
 
590
612
  # 二重結合でRDKitが判定したE/Z立体化学を表示
591
- for bond in mol.GetBonds():
613
+ # `scan_mol` is used for stereochemistry detection (bond types); default
614
+ # to the provided molecule if not supplied.
615
+ if scan_mol is None:
616
+ scan_mol = mol
617
+
618
+ for bond in scan_mol.GetBonds():
592
619
  if bond.GetBondType() == Chem.BondType.DOUBLE:
593
620
  stereo = bond.GetStereo()
594
621
  if stereo in [Chem.BondStereo.STEREOE, Chem.BondStereo.STEREOZ]:
595
622
  # 結合の中心座標を計算
623
+ # Use positions from the original molecule's conformer; `bond` may
624
+ # come from `scan_mol` which can be kekulized but position indices
625
+ # correspond to the original `mol`.
596
626
  begin_pos = np.array(conf.GetAtomPosition(bond.GetBeginAtomIdx()))
597
627
  end_pos = np.array(conf.GetAtomPosition(bond.GetEndAtomIdx()))
598
628
  center_pos = (begin_pos + end_pos) / 2
@@ -1083,15 +1113,33 @@ class MainWindowView3d(object):
1083
1113
  Only keys present in self.settings['cpk_colors'] are changed; other elements keep the defaults.
1084
1114
  """
1085
1115
  try:
1116
+ # Overridden CPK settings are stored in self.settings['cpk_colors'].
1117
+ # To ensure that 2D modules (e.g., atom_item.py) which imported the
1118
+ # `CPK_COLORS` mapping from `modules.constants` at import time see
1119
+ # updates, mutate the mapping in-place on the constants module
1120
+ # instead of rebinding a new local variable here.
1086
1121
  overrides = self.settings.get('cpk_colors', {}) or {}
1087
- # Start from a clean copy of the defaults
1088
- global CPK_COLORS, CPK_COLORS_PV
1089
- CPK_COLORS = {k: QColor(v) if not isinstance(v, QColor) else QColor(v) for k, v in DEFAULT_CPK_COLORS.items()}
1122
+
1123
+ # Import the constants module so we can update mappings directly
1124
+ try:
1125
+ from . import constants as constants_mod
1126
+ except Exception:
1127
+ import modules.constants as constants_mod
1128
+
1129
+ # Reset constants.CPK_COLORS to defaults but keep the same dict
1130
+ constants_mod.CPK_COLORS.clear()
1131
+ for k, v in DEFAULT_CPK_COLORS.items():
1132
+ constants_mod.CPK_COLORS[k] = QColor(v) if not isinstance(v, QColor) else v
1133
+
1134
+ # Apply overrides from settings
1090
1135
  for k, hexv in overrides.items():
1091
1136
  if isinstance(hexv, str) and hexv:
1092
- CPK_COLORS[k] = QColor(hexv)
1093
- # Rebuild PV version
1094
- CPK_COLORS_PV = {k: [c.redF(), c.greenF(), c.blueF()] for k, c in CPK_COLORS.items()}
1137
+ constants_mod.CPK_COLORS[k] = QColor(hexv)
1138
+
1139
+ # Rebuild the PV representation in-place too
1140
+ constants_mod.CPK_COLORS_PV.clear()
1141
+ for k, c in constants_mod.CPK_COLORS.items():
1142
+ constants_mod.CPK_COLORS_PV[k] = [c.redF(), c.greenF(), c.blueF()]
1095
1143
  except Exception as e:
1096
1144
  print(f"Failed to update CPK colors from settings: {e}")
1097
1145
 
@@ -62,11 +62,18 @@ class SettingsDialog(QDialog):
62
62
  # element symbol recognition will be coerced where possible and Chem.SanitizeMol
63
63
  # failures will be ignored so the 3D viewer can still display the structure.
64
64
  'skip_chemistry_checks': False,
65
+ # When True, always prompt the user for molecular charge on XYZ import
66
+ # instead of silently trying charge=0 first. Default True to disable
67
+ # the silent 'charge=0' test.
68
+ 'always_ask_charge': False,
65
69
  # 3D conversion/optimization defaults
66
70
  '3d_conversion_mode': 'fallback',
67
71
  'optimization_method': 'MMFF_RDKIT',
68
72
  'ball_stick_bond_color': '#7F7F7F',
69
73
  'cpk_colors': {},
74
+ # If True, RDKit will attempt to kekulize aromatic systems for 3D display
75
+ # (shows alternating single/double bonds rather than aromatic circles)
76
+ 'display_kekule_3d': False,
70
77
  }
71
78
 
72
79
  # --- 選択された色を管理する専用のインスタンス変数 ---
@@ -210,6 +217,26 @@ class SettingsDialog(QDialog):
210
217
  except Exception:
211
218
  pass
212
219
 
220
+ # 3D Kekule display option (under Other) will be added below the
221
+ # 'Always ask molecular charge on import' option so ordering is clear
222
+ # in the UI.
223
+ self.kekule_3d_checkbox = QCheckBox()
224
+ self.kekule_3d_checkbox.setToolTip("When enabled, aromatic bonds will be kekulized in the 3D view (show alternating single/double bonds).")
225
+ # Don't persist kekule state immediately; Apply/OK should commit setting.
226
+ # Always ask charge on XYZ import (skip silent charge=0 test)
227
+ self.always_ask_charge_checkbox = QCheckBox()
228
+ self.always_ask_charge_checkbox.setToolTip("Prompt for overall molecular charge when importing XYZ files instead of silently trying charge=0 first.")
229
+ try:
230
+ self.other_form_layout.addRow("Always ask molecular charge on import:", self.always_ask_charge_checkbox)
231
+ except Exception:
232
+ pass
233
+
234
+ # Place the Kekulé option after the always-ask-charge option
235
+ try:
236
+ self.other_form_layout.addRow("Display Kekulé bonds in 3D:", self.kekule_3d_checkbox)
237
+ except Exception:
238
+ pass
239
+
213
240
  # Add Other tab to the tab widget
214
241
  self.tab_widget.addTab(self.other_widget, "Other")
215
242
 
@@ -578,6 +605,8 @@ class SettingsDialog(QDialog):
578
605
  "Other": {
579
606
  # other options
580
607
  'skip_chemistry_checks': self.default_settings.get('skip_chemistry_checks', False),
608
+ 'display_kekule_3d': self.default_settings.get('display_kekule_3d', False),
609
+ 'always_ask_charge': self.default_settings.get('always_ask_charge', False),
581
610
  },
582
611
  "Ball & Stick": {
583
612
  'ball_stick_atom_scale': self.default_settings['ball_stick_atom_scale'],
@@ -899,6 +928,10 @@ class SettingsDialog(QDialog):
899
928
  self.projection_combo.setCurrentIndex(idx if idx != -1 else 0)
900
929
  # skip chemistry checks
901
930
  self.skip_chem_checks_checkbox.setChecked(settings_dict.get('skip_chemistry_checks', self.default_settings.get('skip_chemistry_checks', False)))
931
+ # kekule setting
932
+ self.kekule_3d_checkbox.setChecked(settings_dict.get('display_kekule_3d', self.default_settings.get('display_kekule_3d', False)))
933
+ # always ask for charge on XYZ imports
934
+ self.always_ask_charge_checkbox.setChecked(settings_dict.get('always_ask_charge', self.default_settings.get('always_ask_charge', False)))
902
935
 
903
936
  def select_color(self):
904
937
  """カラーピッカーを開き、選択された色を内部変数とUIに反映させる"""
@@ -950,7 +983,9 @@ class SettingsDialog(QDialog):
950
983
  'stick_triple_bond_offset_factor': self.stick_triple_offset_slider.value() / 100.0,
951
984
  'stick_double_bond_radius_factor': self.stick_double_radius_slider.value() / 100.0,
952
985
  'stick_triple_bond_radius_factor': self.stick_triple_radius_slider.value() / 100.0,
986
+ 'display_kekule_3d': self.kekule_3d_checkbox.isChecked(),
953
987
  'skip_chemistry_checks': self.skip_chem_checks_checkbox.isChecked(),
988
+ 'always_ask_charge': self.always_ask_charge_checkbox.isChecked(),
954
989
  # Ball & Stick bond color (3D grey/uniform color)
955
990
  'ball_stick_bond_color': getattr(self, 'bs_bond_color', self.default_settings.get('ball_stick_bond_color', '#7F7F7F')),
956
991
  }
@@ -1027,6 +1062,8 @@ class SettingsDialog(QDialog):
1027
1062
  except Exception:
1028
1063
  pass
1029
1064
 
1065
+ # Note: Kekule display is applied only when user clicks Apply/OK.
1066
+
1030
1067
  def accept(self):
1031
1068
  """ダイアログの設定を適用してから閉じる"""
1032
1069
  # apply_settingsを呼び出して設定を適用
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy-linux
3
- Version: 1.16.1a2
3
+ Version: 1.16.2
4
4
  Summary: A cross-platform, simple, and intuitive molecular structure editor built in Python. It allows 2D molecular drawing and 3D structure visualization. It supports exporting structure files for input to DFT calculation software.
5
5
  Author-email: HiroYokoyama <titech.yoko.hiro@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/HiroYokoyama/python_molecular_editor
@@ -0,0 +1,54 @@
1
+ moleditpy_linux/__init__.py,sha256=QCzpw3P5V_CwDtN4itK4hT9J99JgsH4gmpTfvuus6p8,46
2
+ moleditpy_linux/__main__.py,sha256=az0UrbFsuprbQYycF_bSUXxb0F20DuLvYxrZl1-X5EU,831
3
+ moleditpy_linux/main.py,sha256=cEZJuCL0HrLPUYvuwPSxgUkaDykVb573A-3qVvjF9RM,1180
4
+ moleditpy_linux/modules/__init__.py,sha256=DIO4nzCCnpeYLjFqzHxcRYqbECtWWMEGQ_-sb03jirs,1127
5
+ moleditpy_linux/modules/about_dialog.py,sha256=_M-8MLGXCDtVd7NW8xtglASOiIWTF7HzO8J8AzMubs0,3419
6
+ moleditpy_linux/modules/align_plane_dialog.py,sha256=D6E0_rM75rKirDkvkJ-diRqNkf8IguqBBLQqDvZJHME,11665
7
+ moleditpy_linux/modules/alignment_dialog.py,sha256=tS2_5-wnJRDhLcWtPm9-HUm4_v4bAr53EjV82vydA-k,11140
8
+ moleditpy_linux/modules/analysis_window.py,sha256=asSCm7bgDW00tGaXSwEN17j-de_BN7ql6iwmxb3f54E,9134
9
+ moleditpy_linux/modules/angle_dialog.py,sha256=_xwp8CyBEB309UEY618o065Hfqx-XZQHYFXa0fYeNNs,17548
10
+ moleditpy_linux/modules/atom_item.py,sha256=NSRO4x_5Ciq1Hnt2lfdjtVGGjuZ6iUt2bZ8NGT9FqIg,15297
11
+ moleditpy_linux/modules/bond_item.py,sha256=zjQHa4vb8xhS9B7cYPRM0nak-f7lr5NQ1uAj_J78ah4,12778
12
+ moleditpy_linux/modules/bond_length_dialog.py,sha256=xlx-bU3tVeLfShdVRw6_Geo5Gl9mztlIfTdT9tJ6WMA,14579
13
+ moleditpy_linux/modules/calculation_worker.py,sha256=detE48BW08a2tvmKjMgz8zCShgARzsRH-ABmWrPcqZA,42055
14
+ moleditpy_linux/modules/color_settings_dialog.py,sha256=h4AOKU8dCTenecI8zOM9GfnmKDm7jfe5C4Fa23Budvs,15205
15
+ moleditpy_linux/modules/constants.py,sha256=VhLR-kW7vk-FVBIofus1gkhbr3rmoHe4ycjPIqC4org,4434
16
+ moleditpy_linux/modules/constrained_optimization_dialog.py,sha256=MlWnPze0JJvnqmHx9n3qZWG_h-2kZymT0PQ6lALbCro,29861
17
+ moleditpy_linux/modules/custom_interactor_style.py,sha256=K_uGM6FezY0kZ3zPqoR6f0nowG40ytt-L4UCAbPlwGM,38184
18
+ moleditpy_linux/modules/custom_qt_interactor.py,sha256=6mzaVb3Mhp-4nryG5AraEvPPgBJpotrzVYwrpCAKmVo,2186
19
+ moleditpy_linux/modules/dialog3_d_picking_mixin.py,sha256=gaF1ATevvvF72aBfAjubRcagT2jnVG5RMpEKos_XdKg,4768
20
+ moleditpy_linux/modules/dihedral_dialog.py,sha256=H6WFvc7NvPHSd5QCMk0NUPhudOzpModXv-42dYL20KM,17809
21
+ moleditpy_linux/modules/main_window.py,sha256=Ii36JTPSkZNaqqEc8CXZ1bq9accIMg5yUs1U7_pHgYM,35791
22
+ moleditpy_linux/modules/main_window_app_state.py,sha256=f9f3JVuC46ijlea2DR8ADa0Jn5r2dgedPPdg8OkmNAU,33374
23
+ moleditpy_linux/modules/main_window_compute.py,sha256=fiIokVvjzXIwwR3FV3Ltet_K4oL_rT0Z27rPMbvlyyc,51346
24
+ moleditpy_linux/modules/main_window_dialog_manager.py,sha256=5WU6mFABB0aI4XCywP-cLFPkNQSb3bC0OK0I28SQG_w,19845
25
+ moleditpy_linux/modules/main_window_edit_3d.py,sha256=FStBWVeDVAM2MoO-JCTjPM-G7iT8QZUHxsb0dS4MEAI,19553
26
+ moleditpy_linux/modules/main_window_edit_actions.py,sha256=8tR0rYfgWYgdKTxBP4snzpxhiD2DExSKyf4jzSWb6sE,64598
27
+ moleditpy_linux/modules/main_window_export.py,sha256=f_Z4qVYKBTe06lGTFqjd3deluUdkQvHhZYa81h7UpBM,34465
28
+ moleditpy_linux/modules/main_window_main_init.py,sha256=lXJ_Zl9xGwa3P7NbFlnCttEG9Ta9vQgov7iNOEVY9NE,75377
29
+ moleditpy_linux/modules/main_window_molecular_parsers.py,sha256=tyzVb-TqyjCiEUacwEJJi7zVokjwColezrRlRxfmzks,48174
30
+ moleditpy_linux/modules/main_window_project_io.py,sha256=2ArkW23L4ahQIiktCCXlNsJphU0awO5YzJGihIJsn1c,17021
31
+ moleditpy_linux/modules/main_window_string_importers.py,sha256=yrZblvPG840qnqVEJf__XVfNnWl_r3vt68Abfs2aYDQ,10674
32
+ moleditpy_linux/modules/main_window_ui_manager.py,sha256=0jdTZGv5JRtDlDniblPKzLPXdfUBZ3qh12s6pav4ihI,22038
33
+ moleditpy_linux/modules/main_window_view_3d.py,sha256=DgEnR4IlOVjMn45JdILEU7krUU6d5AcWHJDkhXFpJKM,57990
34
+ moleditpy_linux/modules/main_window_view_loaders.py,sha256=WuzLCYC22eaDFIvUvRtXgULZb-n4B04gcdgSKqTgWGA,14234
35
+ moleditpy_linux/modules/mirror_dialog.py,sha256=wYlnqrxAZfsADB5Gvabe-MoX3j0_NjfmWPyf3GCYj9U,4427
36
+ moleditpy_linux/modules/molecular_data.py,sha256=OCdiRIDXgnqYCKmf56x6XfbOJYTEQjY-MtBfnYZtTWY,12981
37
+ moleditpy_linux/modules/molecule_scene.py,sha256=F7W7HLctfqbtM0gI76fcyEar6Q5t_rWoy1cAPUTYrMg,90222
38
+ moleditpy_linux/modules/move_group_dialog.py,sha256=MVVdy0R-HIHcsCWD2yBVDWoDN4NFXPkOc72dq9laBP4,26905
39
+ moleditpy_linux/modules/periodic_table_dialog.py,sha256=slh1X-6YidaQGzQamrKJ6aetIMKTQLRlBfaAH6B6qfw,3737
40
+ moleditpy_linux/modules/planarize_dialog.py,sha256=u8IZGUEIXnVrBOXBqJefQpFqz3wiU6oLXp4gBNcC7Iw,8402
41
+ moleditpy_linux/modules/settings_dialog.py,sha256=t2UbSsQSdcoZ5nKrayvSNoAoU1oR8lW1PGyvvIrBij0,60645
42
+ moleditpy_linux/modules/template_preview_item.py,sha256=KDuLEZpPSMm9ZB0z5ms8LZyHbFKvszemG0XnR5vi0qg,6404
43
+ moleditpy_linux/modules/template_preview_view.py,sha256=AXUaFJR0E1yX9dBY9IDbxYNsBTcRFZWnDwpS_pRZXhs,3081
44
+ moleditpy_linux/modules/translation_dialog.py,sha256=gIG_mz4wc4y4ZNq02Ql33ek6B-DrOf1pdWF3FsViCT4,14394
45
+ moleditpy_linux/modules/user_template_dialog.py,sha256=VhLh7MNbElySnAIHjkiRaYLRHJLeK-NcHtAX5yqjBzI,27955
46
+ moleditpy_linux/modules/zoomable_view.py,sha256=ZgAmmWXIKtx7AhMjs6H6PCyvb_kpYuankf8UxsZX9mg,4569
47
+ moleditpy_linux/modules/assets/icon.icns,sha256=wD5R6-Vw7K662tVKhu2E1ImN0oUuyAP4youesEQsn9c,139863
48
+ moleditpy_linux/modules/assets/icon.ico,sha256=RfgFcx7-dHY_2STdsOQCQziY5SNhDr3gPnjO6jzEDPI,147975
49
+ moleditpy_linux/modules/assets/icon.png,sha256=kCFN1WacYIdy0GN6SFEbNA00ef39pCczBnFdkkBI8Bs,147110
50
+ moleditpy_linux-1.16.2.dist-info/METADATA,sha256=kPOQfOXhHe0-CSJUAygpw-II-RcPlv2G7QFFOh7o6nY,17435
51
+ moleditpy_linux-1.16.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
+ moleditpy_linux-1.16.2.dist-info/entry_points.txt,sha256=-OzipSi__yVwlimNtu3eiRP5t5UMg55Cs0udyhXYiyw,60
53
+ moleditpy_linux-1.16.2.dist-info/top_level.txt,sha256=qyqe-hDYL6CXyin9E5Me5rVl3PG84VqiOjf9bQvfJLs,16
54
+ moleditpy_linux-1.16.2.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ moleditpy_linux
@@ -1,51 +0,0 @@
1
- moleditpy-linux/__init__.py,sha256=QCzpw3P5V_CwDtN4itK4hT9J99JgsH4gmpTfvuus6p8,46
2
- moleditpy-linux/__main__.py,sha256=az0UrbFsuprbQYycF_bSUXxb0F20DuLvYxrZl1-X5EU,831
3
- moleditpy-linux/main.py,sha256=cEZJuCL0HrLPUYvuwPSxgUkaDykVb573A-3qVvjF9RM,1180
4
- moleditpy-linux/modules/__init__.py,sha256=DIO4nzCCnpeYLjFqzHxcRYqbECtWWMEGQ_-sb03jirs,1127
5
- moleditpy-linux/modules/about_dialog.py,sha256=_M-8MLGXCDtVd7NW8xtglASOiIWTF7HzO8J8AzMubs0,3419
6
- moleditpy-linux/modules/align_plane_dialog.py,sha256=D6E0_rM75rKirDkvkJ-diRqNkf8IguqBBLQqDvZJHME,11665
7
- moleditpy-linux/modules/alignment_dialog.py,sha256=tS2_5-wnJRDhLcWtPm9-HUm4_v4bAr53EjV82vydA-k,11140
8
- moleditpy-linux/modules/analysis_window.py,sha256=asSCm7bgDW00tGaXSwEN17j-de_BN7ql6iwmxb3f54E,9134
9
- moleditpy-linux/modules/angle_dialog.py,sha256=_xwp8CyBEB309UEY618o065Hfqx-XZQHYFXa0fYeNNs,17548
10
- moleditpy-linux/modules/atom_item.py,sha256=NSRO4x_5Ciq1Hnt2lfdjtVGGjuZ6iUt2bZ8NGT9FqIg,15297
11
- moleditpy-linux/modules/bond_item.py,sha256=zjQHa4vb8xhS9B7cYPRM0nak-f7lr5NQ1uAj_J78ah4,12778
12
- moleditpy-linux/modules/bond_length_dialog.py,sha256=xlx-bU3tVeLfShdVRw6_Geo5Gl9mztlIfTdT9tJ6WMA,14579
13
- moleditpy-linux/modules/calculation_worker.py,sha256=detE48BW08a2tvmKjMgz8zCShgARzsRH-ABmWrPcqZA,42055
14
- moleditpy-linux/modules/color_settings_dialog.py,sha256=h4AOKU8dCTenecI8zOM9GfnmKDm7jfe5C4Fa23Budvs,15205
15
- moleditpy-linux/modules/constants.py,sha256=rncfyD-EbegEYA8IeIGYrFm2KHAMKPfiEUQKbA3st1o,4436
16
- moleditpy-linux/modules/constrained_optimization_dialog.py,sha256=MlWnPze0JJvnqmHx9n3qZWG_h-2kZymT0PQ6lALbCro,29861
17
- moleditpy-linux/modules/custom_interactor_style.py,sha256=K_uGM6FezY0kZ3zPqoR6f0nowG40ytt-L4UCAbPlwGM,38184
18
- moleditpy-linux/modules/custom_qt_interactor.py,sha256=6mzaVb3Mhp-4nryG5AraEvPPgBJpotrzVYwrpCAKmVo,2186
19
- moleditpy-linux/modules/dialog3_d_picking_mixin.py,sha256=gaF1ATevvvF72aBfAjubRcagT2jnVG5RMpEKos_XdKg,4768
20
- moleditpy-linux/modules/dihedral_dialog.py,sha256=H6WFvc7NvPHSd5QCMk0NUPhudOzpModXv-42dYL20KM,17809
21
- moleditpy-linux/modules/main_window.py,sha256=Ii36JTPSkZNaqqEc8CXZ1bq9accIMg5yUs1U7_pHgYM,35791
22
- moleditpy-linux/modules/main_window_app_state.py,sha256=f9f3JVuC46ijlea2DR8ADa0Jn5r2dgedPPdg8OkmNAU,33374
23
- moleditpy-linux/modules/main_window_compute.py,sha256=fiIokVvjzXIwwR3FV3Ltet_K4oL_rT0Z27rPMbvlyyc,51346
24
- moleditpy-linux/modules/main_window_dialog_manager.py,sha256=5WU6mFABB0aI4XCywP-cLFPkNQSb3bC0OK0I28SQG_w,19845
25
- moleditpy-linux/modules/main_window_edit_3d.py,sha256=FStBWVeDVAM2MoO-JCTjPM-G7iT8QZUHxsb0dS4MEAI,19553
26
- moleditpy-linux/modules/main_window_edit_actions.py,sha256=8tR0rYfgWYgdKTxBP4snzpxhiD2DExSKyf4jzSWb6sE,64598
27
- moleditpy-linux/modules/main_window_export.py,sha256=f_Z4qVYKBTe06lGTFqjd3deluUdkQvHhZYa81h7UpBM,34465
28
- moleditpy-linux/modules/main_window_main_init.py,sha256=igIxiBiC707QlI6v69GilZ4kmPLjFMNoGH62fENqUxA,75293
29
- moleditpy-linux/modules/main_window_molecular_parsers.py,sha256=8JAIgr1axzmJqX_Ue-Adkl8e_8B2Th9yutQbau8EEWQ,43401
30
- moleditpy-linux/modules/main_window_project_io.py,sha256=2ArkW23L4ahQIiktCCXlNsJphU0awO5YzJGihIJsn1c,17021
31
- moleditpy-linux/modules/main_window_string_importers.py,sha256=yrZblvPG840qnqVEJf__XVfNnWl_r3vt68Abfs2aYDQ,10674
32
- moleditpy-linux/modules/main_window_ui_manager.py,sha256=0jdTZGv5JRtDlDniblPKzLPXdfUBZ3qh12s6pav4ihI,22038
33
- moleditpy-linux/modules/main_window_view_3d.py,sha256=aU6fI-ZYUV7qOQmucsF5WuafGYyvb4P2xj0oIgsnDaU,55443
34
- moleditpy-linux/modules/main_window_view_loaders.py,sha256=WuzLCYC22eaDFIvUvRtXgULZb-n4B04gcdgSKqTgWGA,14234
35
- moleditpy-linux/modules/mirror_dialog.py,sha256=wYlnqrxAZfsADB5Gvabe-MoX3j0_NjfmWPyf3GCYj9U,4427
36
- moleditpy-linux/modules/molecular_data.py,sha256=OCdiRIDXgnqYCKmf56x6XfbOJYTEQjY-MtBfnYZtTWY,12981
37
- moleditpy-linux/modules/molecule_scene.py,sha256=F7W7HLctfqbtM0gI76fcyEar6Q5t_rWoy1cAPUTYrMg,90222
38
- moleditpy-linux/modules/move_group_dialog.py,sha256=MVVdy0R-HIHcsCWD2yBVDWoDN4NFXPkOc72dq9laBP4,26905
39
- moleditpy-linux/modules/periodic_table_dialog.py,sha256=slh1X-6YidaQGzQamrKJ6aetIMKTQLRlBfaAH6B6qfw,3737
40
- moleditpy-linux/modules/planarize_dialog.py,sha256=u8IZGUEIXnVrBOXBqJefQpFqz3wiU6oLXp4gBNcC7Iw,8402
41
- moleditpy-linux/modules/settings_dialog.py,sha256=ylofChBPAvUH-wkn_UGNqinYkKoEQKULis8i80Wzh9Y,58264
42
- moleditpy-linux/modules/template_preview_item.py,sha256=KDuLEZpPSMm9ZB0z5ms8LZyHbFKvszemG0XnR5vi0qg,6404
43
- moleditpy-linux/modules/template_preview_view.py,sha256=AXUaFJR0E1yX9dBY9IDbxYNsBTcRFZWnDwpS_pRZXhs,3081
44
- moleditpy-linux/modules/translation_dialog.py,sha256=gIG_mz4wc4y4ZNq02Ql33ek6B-DrOf1pdWF3FsViCT4,14394
45
- moleditpy-linux/modules/user_template_dialog.py,sha256=VhLh7MNbElySnAIHjkiRaYLRHJLeK-NcHtAX5yqjBzI,27955
46
- moleditpy-linux/modules/zoomable_view.py,sha256=ZgAmmWXIKtx7AhMjs6H6PCyvb_kpYuankf8UxsZX9mg,4569
47
- moleditpy_linux-1.16.1a2.dist-info/METADATA,sha256=Iql60K2DoNimGroDVUAJd_X-tVdxYrUbSZzexmTyF_8,17437
48
- moleditpy_linux-1.16.1a2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
- moleditpy_linux-1.16.1a2.dist-info/entry_points.txt,sha256=-OzipSi__yVwlimNtu3eiRP5t5UMg55Cs0udyhXYiyw,60
50
- moleditpy_linux-1.16.1a2.dist-info/top_level.txt,sha256=0HXd5y4UKKU7dhcX0rpK-30kGLmB1GdNQPy0T82HWYY,16
51
- moleditpy_linux-1.16.1a2.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- moleditpy-linux
File without changes
File without changes
File without changes
File without changes