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.
- moleditpy_linux/modules/assets/icon.icns +0 -0
- moleditpy_linux/modules/assets/icon.ico +0 -0
- moleditpy_linux/modules/assets/icon.png +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/constants.py +1 -1
- {moleditpy-linux → moleditpy_linux}/modules/main_window_main_init.py +16 -11
- {moleditpy-linux → moleditpy_linux}/modules/main_window_molecular_parsers.py +147 -66
- {moleditpy-linux → moleditpy_linux}/modules/main_window_view_3d.py +61 -13
- {moleditpy-linux → moleditpy_linux}/modules/settings_dialog.py +37 -0
- {moleditpy_linux-1.16.1a2.dist-info → moleditpy_linux-1.16.2.dist-info}/METADATA +1 -1
- moleditpy_linux-1.16.2.dist-info/RECORD +54 -0
- moleditpy_linux-1.16.2.dist-info/top_level.txt +1 -0
- moleditpy_linux-1.16.1a2.dist-info/RECORD +0 -51
- moleditpy_linux-1.16.1a2.dist-info/top_level.txt +0 -1
- {moleditpy-linux → moleditpy_linux}/__init__.py +0 -0
- {moleditpy-linux → moleditpy_linux}/__main__.py +0 -0
- {moleditpy-linux → moleditpy_linux}/main.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/__init__.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/about_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/align_plane_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/alignment_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/analysis_window.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/angle_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/atom_item.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/bond_item.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/bond_length_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/calculation_worker.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/color_settings_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/constrained_optimization_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/custom_interactor_style.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/custom_qt_interactor.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/dialog3_d_picking_mixin.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/dihedral_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_app_state.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_compute.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_dialog_manager.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_edit_3d.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_edit_actions.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_export.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_project_io.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_string_importers.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_ui_manager.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/main_window_view_loaders.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/mirror_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/molecular_data.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/molecule_scene.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/move_group_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/periodic_table_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/planarize_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/template_preview_item.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/template_preview_view.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/translation_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/user_template_dialog.py +0 -0
- {moleditpy-linux → moleditpy_linux}/modules/zoomable_view.py +0 -0
- {moleditpy_linux-1.16.1a2.dist-info → moleditpy_linux-1.16.2.dist-info}/WHEEL +0 -0
- {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
|
|
@@ -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:
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
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
|
-
#
|
|
518
|
+
# Standard mapping: dark -> white, light -> black
|
|
517
519
|
if os_pref is not None:
|
|
518
|
-
return QColor('#
|
|
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
|
-
#
|
|
531
|
-
return QColor('#
|
|
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
|
-
#
|
|
541
|
-
return QColor('#
|
|
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
|
-
#
|
|
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
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
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
|
-
|
|
587
|
-
|
|
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
|
-
|
|
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
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
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.
|
|
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
|
-
|
|
666
|
+
salvaged = mol.GetMol()
|
|
633
667
|
except Exception:
|
|
668
|
+
salvaged = None
|
|
669
|
+
|
|
670
|
+
if salvaged is not None:
|
|
634
671
|
try:
|
|
635
|
-
|
|
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
|
-
|
|
691
|
+
except RuntimeError:
|
|
692
|
+
# DetermineBonds still failing for this charge -> loop again
|
|
640
693
|
try:
|
|
641
|
-
self.statusBar().showMessage(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
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
|
-
|
|
1094
|
-
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|