MoleditPy-linux 3.0.2__py3-none-any.whl → 3.0.4__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/ui/translation_dialog.py +227 -80
- moleditpy_linux/ui/view_3d_logic.py +2 -2
- moleditpy_linux/utils/constants.py +1 -1
- moleditpy_linux/utils/default_settings.py +1 -1
- {moleditpy_linux-3.0.2.dist-info → moleditpy_linux-3.0.4.dist-info}/METADATA +1 -1
- {moleditpy_linux-3.0.2.dist-info → moleditpy_linux-3.0.4.dist-info}/RECORD +10 -10
- {moleditpy_linux-3.0.2.dist-info → moleditpy_linux-3.0.4.dist-info}/WHEEL +0 -0
- {moleditpy_linux-3.0.2.dist-info → moleditpy_linux-3.0.4.dist-info}/entry_points.txt +0 -0
- {moleditpy_linux-3.0.2.dist-info → moleditpy_linux-3.0.4.dist-info}/licenses/LICENSE +0 -0
- {moleditpy_linux-3.0.2.dist-info → moleditpy_linux-3.0.4.dist-info}/top_level.txt +0 -0
|
@@ -12,12 +12,15 @@ DOI: 10.5281/zenodo.17268532
|
|
|
12
12
|
|
|
13
13
|
import numpy as np
|
|
14
14
|
from PyQt6.QtWidgets import (
|
|
15
|
+
QCheckBox,
|
|
15
16
|
QHBoxLayout,
|
|
16
17
|
QLabel,
|
|
17
18
|
QLineEdit,
|
|
18
19
|
QMessageBox,
|
|
19
20
|
QPushButton,
|
|
21
|
+
QTabWidget,
|
|
20
22
|
QVBoxLayout,
|
|
23
|
+
QWidget,
|
|
21
24
|
)
|
|
22
25
|
|
|
23
26
|
try:
|
|
@@ -25,140 +28,260 @@ try:
|
|
|
25
28
|
except ImportError:
|
|
26
29
|
from moleditpy_linux.ui.base_picking_dialog import BasePickingDialog
|
|
27
30
|
|
|
31
|
+
_TAB_ABSOLUTE = 0
|
|
32
|
+
_TAB_DELTA = 1
|
|
33
|
+
|
|
28
34
|
|
|
29
35
|
class TranslationDialog(BasePickingDialog):
|
|
30
36
|
def __init__(self, mol, main_window, preselected_atoms=None, parent=None):
|
|
31
37
|
super().__init__(mol, main_window, parent)
|
|
32
38
|
self.selected_atoms = set()
|
|
33
39
|
|
|
34
|
-
# Add preselected atoms
|
|
35
40
|
if preselected_atoms:
|
|
36
41
|
self.selected_atoms.update(preselected_atoms)
|
|
37
42
|
|
|
38
43
|
self.init_ui()
|
|
39
44
|
|
|
40
|
-
# Add labels to preselected atoms
|
|
41
45
|
if self.selected_atoms:
|
|
42
46
|
self.show_atom_labels()
|
|
43
47
|
self.update_display()
|
|
44
48
|
|
|
49
|
+
# ------------------------------------------------------------------
|
|
50
|
+
# UI construction
|
|
51
|
+
# ------------------------------------------------------------------
|
|
52
|
+
|
|
45
53
|
def init_ui(self):
|
|
46
54
|
self.setWindowTitle("Translate Atoms")
|
|
47
55
|
self.setModal(False)
|
|
48
56
|
layout = QVBoxLayout(self)
|
|
49
57
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
layout.addWidget(instruction_label)
|
|
58
|
+
self.tabs = QTabWidget()
|
|
59
|
+
self.tabs.addTab(self._build_absolute_tab(), "Absolute")
|
|
60
|
+
self.tabs.addTab(self._build_delta_tab(), "Delta")
|
|
61
|
+
self.tabs.currentChanged.connect(self._on_tab_changed)
|
|
62
|
+
layout.addWidget(self.tabs)
|
|
56
63
|
|
|
57
|
-
#
|
|
58
|
-
|
|
59
|
-
|
|
64
|
+
# Shared Close button row
|
|
65
|
+
close_row = QHBoxLayout()
|
|
66
|
+
close_row.addStretch()
|
|
67
|
+
close_btn = QPushButton("Close")
|
|
68
|
+
close_btn.clicked.connect(self.reject)
|
|
69
|
+
close_row.addWidget(close_btn)
|
|
70
|
+
layout.addLayout(close_row)
|
|
60
71
|
|
|
61
|
-
|
|
62
|
-
vector_layout = QHBoxLayout()
|
|
63
|
-
vector_layout.addWidget(QLabel("dX:"))
|
|
64
|
-
self.dx_input = QLineEdit("0.0")
|
|
65
|
-
vector_layout.addWidget(self.dx_input)
|
|
72
|
+
self.enable_picking()
|
|
66
73
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
def _build_absolute_tab(self):
|
|
75
|
+
widget = QWidget()
|
|
76
|
+
layout = QVBoxLayout(widget)
|
|
70
77
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
78
|
+
instr = QLabel(
|
|
79
|
+
"Click one atom to select it, then specify its target absolute coordinates (Å)."
|
|
80
|
+
)
|
|
81
|
+
instr.setWordWrap(True)
|
|
82
|
+
layout.addWidget(instr)
|
|
83
|
+
|
|
84
|
+
self.abs_selection_label = QLabel("No atom selected")
|
|
85
|
+
layout.addWidget(self.abs_selection_label)
|
|
86
|
+
|
|
87
|
+
coord_row = QHBoxLayout()
|
|
88
|
+
coord_row.addWidget(QLabel("X:"))
|
|
89
|
+
self.abs_x_input = QLineEdit("0.000")
|
|
90
|
+
coord_row.addWidget(self.abs_x_input)
|
|
91
|
+
coord_row.addWidget(QLabel("Y:"))
|
|
92
|
+
self.abs_y_input = QLineEdit("0.000")
|
|
93
|
+
coord_row.addWidget(self.abs_y_input)
|
|
94
|
+
coord_row.addWidget(QLabel("Z:"))
|
|
95
|
+
self.abs_z_input = QLineEdit("0.000")
|
|
96
|
+
coord_row.addWidget(self.abs_z_input)
|
|
97
|
+
layout.addLayout(coord_row)
|
|
98
|
+
|
|
99
|
+
self.move_mol_checkbox = QCheckBox("Move entire molecule")
|
|
100
|
+
self.move_mol_checkbox.setChecked(True)
|
|
101
|
+
self.move_mol_checkbox.stateChanged.connect(self._on_move_mol_toggled)
|
|
102
|
+
layout.addWidget(self.move_mol_checkbox)
|
|
103
|
+
|
|
104
|
+
btn_row = QHBoxLayout()
|
|
105
|
+
abs_clear_btn = QPushButton("Clear Selection")
|
|
106
|
+
abs_clear_btn.clicked.connect(self._abs_clear_selection)
|
|
107
|
+
btn_row.addWidget(abs_clear_btn)
|
|
108
|
+
origin_btn = QPushButton("Set to Origin")
|
|
109
|
+
origin_btn.setToolTip("Set target coordinates to the origin")
|
|
110
|
+
origin_btn.clicked.connect(self._set_origin)
|
|
111
|
+
btn_row.addWidget(origin_btn)
|
|
112
|
+
btn_row.addStretch()
|
|
113
|
+
self.abs_apply_btn = QPushButton("Move Molecule")
|
|
114
|
+
self.abs_apply_btn.clicked.connect(self.apply_absolute)
|
|
115
|
+
self.abs_apply_btn.setEnabled(False)
|
|
116
|
+
btn_row.addWidget(self.abs_apply_btn)
|
|
117
|
+
layout.addLayout(btn_row)
|
|
118
|
+
|
|
119
|
+
layout.addStretch()
|
|
120
|
+
return widget
|
|
121
|
+
|
|
122
|
+
def _build_delta_tab(self):
|
|
123
|
+
widget = QWidget()
|
|
124
|
+
layout = QVBoxLayout(widget)
|
|
125
|
+
|
|
126
|
+
instr = QLabel(
|
|
127
|
+
"Click atoms in the 3D view to select them, then specify the translation vector (Å)."
|
|
128
|
+
)
|
|
129
|
+
instr.setWordWrap(True)
|
|
130
|
+
layout.addWidget(instr)
|
|
74
131
|
|
|
75
|
-
|
|
132
|
+
self.delta_selection_label = QLabel("No atoms selected")
|
|
133
|
+
layout.addWidget(self.delta_selection_label)
|
|
76
134
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
self.
|
|
80
|
-
|
|
81
|
-
|
|
135
|
+
vector_row = QHBoxLayout()
|
|
136
|
+
vector_row.addWidget(QLabel("dX:"))
|
|
137
|
+
self.dx_input = QLineEdit("0.0")
|
|
138
|
+
vector_row.addWidget(self.dx_input)
|
|
139
|
+
vector_row.addWidget(QLabel("dY:"))
|
|
140
|
+
self.dy_input = QLineEdit("0.0")
|
|
141
|
+
vector_row.addWidget(self.dy_input)
|
|
142
|
+
vector_row.addWidget(QLabel("dZ:"))
|
|
143
|
+
self.dz_input = QLineEdit("0.0")
|
|
144
|
+
vector_row.addWidget(self.dz_input)
|
|
145
|
+
layout.addLayout(vector_row)
|
|
82
146
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
button_layout.addWidget(self.select_all_button)
|
|
147
|
+
btn_row = QHBoxLayout()
|
|
148
|
+
clear_btn = QPushButton("Clear Selection")
|
|
149
|
+
clear_btn.clicked.connect(self.clear_selection)
|
|
150
|
+
btn_row.addWidget(clear_btn)
|
|
88
151
|
|
|
89
|
-
|
|
152
|
+
select_all_btn = QPushButton("Select All Atoms")
|
|
153
|
+
select_all_btn.setToolTip("Select all atoms in the molecule")
|
|
154
|
+
select_all_btn.clicked.connect(self.select_all_atoms)
|
|
155
|
+
btn_row.addWidget(select_all_btn)
|
|
90
156
|
|
|
157
|
+
btn_row.addStretch()
|
|
91
158
|
self.apply_button = QPushButton("Apply Translation")
|
|
92
159
|
self.apply_button.clicked.connect(self.apply_translation)
|
|
93
160
|
self.apply_button.setEnabled(False)
|
|
94
|
-
|
|
161
|
+
btn_row.addWidget(self.apply_button)
|
|
162
|
+
layout.addLayout(btn_row)
|
|
95
163
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
button_layout.addWidget(close_button)
|
|
164
|
+
layout.addStretch()
|
|
165
|
+
return widget
|
|
99
166
|
|
|
100
|
-
|
|
167
|
+
# ------------------------------------------------------------------
|
|
168
|
+
# Tab switching
|
|
169
|
+
# ------------------------------------------------------------------
|
|
101
170
|
|
|
102
|
-
|
|
103
|
-
self.
|
|
104
|
-
self.
|
|
171
|
+
def _on_tab_changed(self, index):
|
|
172
|
+
self.selected_atoms.clear()
|
|
173
|
+
self.clear_atom_labels()
|
|
174
|
+
self.update_display()
|
|
175
|
+
|
|
176
|
+
# ------------------------------------------------------------------
|
|
177
|
+
# Atom picking dispatch
|
|
178
|
+
# ------------------------------------------------------------------
|
|
105
179
|
|
|
106
180
|
def on_atom_picked(self, atom_idx):
|
|
107
|
-
|
|
181
|
+
if self.tabs.currentIndex() == _TAB_ABSOLUTE:
|
|
182
|
+
self._abs_on_atom_picked(atom_idx)
|
|
183
|
+
else:
|
|
184
|
+
self._delta_on_atom_picked(atom_idx)
|
|
185
|
+
|
|
186
|
+
def _abs_on_atom_picked(self, atom_idx):
|
|
187
|
+
# Enforce single selection: replace previous atom
|
|
188
|
+
self.selected_atoms = {atom_idx}
|
|
189
|
+
self._populate_abs_inputs_from_atom(atom_idx)
|
|
190
|
+
self.show_atom_labels()
|
|
191
|
+
self.update_display()
|
|
192
|
+
|
|
193
|
+
def _delta_on_atom_picked(self, atom_idx):
|
|
108
194
|
if atom_idx in self.selected_atoms:
|
|
109
195
|
self.selected_atoms.remove(atom_idx)
|
|
110
196
|
else:
|
|
111
197
|
self.selected_atoms.add(atom_idx)
|
|
112
|
-
|
|
113
|
-
# Display labels on the atoms
|
|
114
198
|
self.show_atom_labels()
|
|
115
199
|
self.update_display()
|
|
116
200
|
|
|
201
|
+
# ------------------------------------------------------------------
|
|
202
|
+
# Absolute tab helpers
|
|
203
|
+
# ------------------------------------------------------------------
|
|
204
|
+
|
|
205
|
+
def _populate_abs_inputs_from_atom(self, atom_idx):
|
|
206
|
+
pos = self.main_window.view_3d_manager.current_mol.GetConformer().GetPositions()[atom_idx]
|
|
207
|
+
self.abs_x_input.setText(f"{pos[0]:.4f}")
|
|
208
|
+
self.abs_y_input.setText(f"{pos[1]:.4f}")
|
|
209
|
+
self.abs_z_input.setText(f"{pos[2]:.4f}")
|
|
210
|
+
|
|
211
|
+
def _abs_clear_selection(self):
|
|
212
|
+
self.selected_atoms.clear()
|
|
213
|
+
self.clear_atom_labels()
|
|
214
|
+
self.abs_x_input.setText("0.000")
|
|
215
|
+
self.abs_y_input.setText("0.000")
|
|
216
|
+
self.abs_z_input.setText("0.000")
|
|
217
|
+
self.update_display()
|
|
218
|
+
|
|
219
|
+
def _set_origin(self):
|
|
220
|
+
self.abs_x_input.setText("0.0000")
|
|
221
|
+
self.abs_y_input.setText("0.0000")
|
|
222
|
+
self.abs_z_input.setText("0.0000")
|
|
223
|
+
|
|
224
|
+
def _on_move_mol_toggled(self, state):
|
|
225
|
+
label = "Move Molecule" if self.move_mol_checkbox.isChecked() else "Move Atom"
|
|
226
|
+
self.abs_apply_btn.setText(label)
|
|
227
|
+
|
|
228
|
+
def apply_absolute(self):
|
|
229
|
+
self.mol = self.main_window.view_3d_manager.current_mol
|
|
230
|
+
if len(self.selected_atoms) != 1:
|
|
231
|
+
QMessageBox.warning(self, "Warning", "Please select exactly one atom.")
|
|
232
|
+
return
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
tx = float(self.abs_x_input.text())
|
|
236
|
+
ty = float(self.abs_y_input.text())
|
|
237
|
+
tz = float(self.abs_z_input.text())
|
|
238
|
+
except ValueError:
|
|
239
|
+
QMessageBox.warning(self, "Warning", "Please enter valid numbers for X, Y, Z.")
|
|
240
|
+
return
|
|
241
|
+
|
|
242
|
+
atom_idx = next(iter(self.selected_atoms))
|
|
243
|
+
positions = self.mol.GetConformer().GetPositions()
|
|
244
|
+
current = positions[atom_idx]
|
|
245
|
+
delta = np.array([tx, ty, tz]) - current
|
|
246
|
+
|
|
247
|
+
if np.allclose(delta, 0):
|
|
248
|
+
return
|
|
249
|
+
|
|
250
|
+
if self.move_mol_checkbox.isChecked():
|
|
251
|
+
positions += delta
|
|
252
|
+
else:
|
|
253
|
+
positions[atom_idx] += delta
|
|
254
|
+
|
|
255
|
+
self._update_molecule_geometry(positions)
|
|
256
|
+
self._push_undo()
|
|
257
|
+
self.show_atom_labels()
|
|
258
|
+
|
|
259
|
+
# ------------------------------------------------------------------
|
|
260
|
+
# Delta tab methods (unchanged logic)
|
|
261
|
+
# ------------------------------------------------------------------
|
|
262
|
+
|
|
117
263
|
def clear_selection(self):
|
|
118
|
-
"""Clear the current atom selection."""
|
|
119
264
|
self.selected_atoms.clear()
|
|
120
265
|
self.clear_atom_labels()
|
|
121
266
|
self.update_display()
|
|
122
267
|
|
|
123
268
|
def select_all_atoms(self):
|
|
124
|
-
"""Select all atoms in the current molecule."""
|
|
125
269
|
try:
|
|
126
270
|
if hasattr(self, "mol") and self.mol is not None:
|
|
127
|
-
|
|
128
|
-
self.selected_atoms = set(range(n))
|
|
271
|
+
self.selected_atoms = set(range(self.mol.GetNumAtoms()))
|
|
129
272
|
else:
|
|
130
273
|
self.selected_atoms = (
|
|
131
274
|
set(self.main_window.state_manager.data.atoms.keys())
|
|
132
275
|
if hasattr(self.main_window.state_manager, "data")
|
|
133
276
|
else set()
|
|
134
277
|
)
|
|
135
|
-
|
|
136
278
|
self.show_atom_labels()
|
|
137
279
|
self.update_display()
|
|
138
280
|
except (AttributeError, RuntimeError, TypeError, KeyError) as e:
|
|
139
281
|
QMessageBox.warning(self, "Warning", f"Failed to select all atoms: {e}")
|
|
140
282
|
|
|
141
|
-
def update_display(self):
|
|
142
|
-
"""Update the UI display with current selection info."""
|
|
143
|
-
count = len(self.selected_atoms)
|
|
144
|
-
if count == 0:
|
|
145
|
-
self.selection_label.setText("Click atoms to select (minimum 1 required)")
|
|
146
|
-
self.apply_button.setEnabled(False)
|
|
147
|
-
else:
|
|
148
|
-
self.selection_label.setText(f"Selected {count} atoms")
|
|
149
|
-
self.apply_button.setEnabled(True)
|
|
150
|
-
|
|
151
|
-
def show_atom_labels(self):
|
|
152
|
-
"""Show numeric labels for the selected atoms."""
|
|
153
|
-
if self.selected_atoms:
|
|
154
|
-
sorted_atoms = sorted(self.selected_atoms)
|
|
155
|
-
pairs = [(idx, str(i + 1)) for i, idx in enumerate(sorted_atoms)]
|
|
156
|
-
self.show_atom_labels_for(pairs)
|
|
157
|
-
else:
|
|
158
|
-
self.clear_atom_labels()
|
|
159
|
-
|
|
160
283
|
def apply_translation(self):
|
|
161
|
-
|
|
284
|
+
self.mol = self.main_window.view_3d_manager.current_mol
|
|
162
285
|
if not self.selected_atoms:
|
|
163
286
|
QMessageBox.warning(self, "Warning", "Please select at least one atom.")
|
|
164
287
|
return
|
|
@@ -168,26 +291,50 @@ class TranslationDialog(BasePickingDialog):
|
|
|
168
291
|
dy = float(self.dy_input.text())
|
|
169
292
|
dz = float(self.dz_input.text())
|
|
170
293
|
except ValueError:
|
|
171
|
-
QMessageBox.warning(
|
|
172
|
-
self, "Warning", "Please enter valid numbers for dx, dy, dz."
|
|
173
|
-
)
|
|
294
|
+
QMessageBox.warning(self, "Warning", "Please enter valid numbers for dx, dy, dz.")
|
|
174
295
|
return
|
|
175
296
|
|
|
176
297
|
if dx == 0 and dy == 0 and dz == 0:
|
|
177
298
|
return
|
|
178
299
|
|
|
179
300
|
translation_vec = np.array([dx, dy, dz])
|
|
180
|
-
|
|
181
|
-
# Update positions
|
|
182
301
|
positions = self.mol.GetConformer().GetPositions()
|
|
183
302
|
for atom_idx in self.selected_atoms:
|
|
184
303
|
positions[atom_idx] += translation_vec
|
|
185
304
|
|
|
186
|
-
# Write updated positions back using inherited helper
|
|
187
305
|
self._update_molecule_geometry(positions)
|
|
188
|
-
|
|
189
|
-
# Push Undo state AFTER modification
|
|
190
306
|
self._push_undo()
|
|
191
|
-
|
|
192
|
-
# Update labels
|
|
193
307
|
self.show_atom_labels()
|
|
308
|
+
|
|
309
|
+
# ------------------------------------------------------------------
|
|
310
|
+
# Shared display update
|
|
311
|
+
# ------------------------------------------------------------------
|
|
312
|
+
|
|
313
|
+
def update_display(self):
|
|
314
|
+
tab = self.tabs.currentIndex()
|
|
315
|
+
count = len(self.selected_atoms)
|
|
316
|
+
|
|
317
|
+
if tab == _TAB_ABSOLUTE:
|
|
318
|
+
if count == 0:
|
|
319
|
+
self.abs_selection_label.setText("Click one atom to select it")
|
|
320
|
+
self.abs_apply_btn.setEnabled(False)
|
|
321
|
+
else:
|
|
322
|
+
atom_idx = next(iter(self.selected_atoms))
|
|
323
|
+
sym = self.mol.GetAtomWithIdx(atom_idx).GetSymbol()
|
|
324
|
+
self.abs_selection_label.setText(f"Selected: atom {atom_idx} ({sym})")
|
|
325
|
+
self.abs_apply_btn.setEnabled(True)
|
|
326
|
+
else:
|
|
327
|
+
if count == 0:
|
|
328
|
+
self.delta_selection_label.setText("Click atoms to select (minimum 1 required)")
|
|
329
|
+
self.apply_button.setEnabled(False)
|
|
330
|
+
else:
|
|
331
|
+
self.delta_selection_label.setText(f"Selected {count} atom{'s' if count != 1 else ''}")
|
|
332
|
+
self.apply_button.setEnabled(True)
|
|
333
|
+
|
|
334
|
+
def show_atom_labels(self):
|
|
335
|
+
if self.selected_atoms:
|
|
336
|
+
sorted_atoms = sorted(self.selected_atoms)
|
|
337
|
+
pairs = [(idx, str(i + 1)) for i, idx in enumerate(sorted_atoms)]
|
|
338
|
+
self.show_atom_labels_for(pairs)
|
|
339
|
+
else:
|
|
340
|
+
self.clear_atom_labels()
|
|
@@ -175,7 +175,7 @@ class View3DManager:
|
|
|
175
175
|
self._3d_color_map.clear()
|
|
176
176
|
|
|
177
177
|
# 1. Camera state and clear
|
|
178
|
-
camera_state = self.host.view_3d_manager.plotter.
|
|
178
|
+
camera_state = self.host.view_3d_manager.plotter.camera_position
|
|
179
179
|
|
|
180
180
|
# Force removal to prevent ghost actor residues
|
|
181
181
|
old_axes_actor = getattr(self, "axes_actor", None)
|
|
@@ -279,7 +279,7 @@ class View3DManager:
|
|
|
279
279
|
self._add_3d_bond_cylinders(mol_to_draw, conf, col, current_style, mesh_props)
|
|
280
280
|
self._add_3d_aromatic_rings(mol_to_draw, current_style, mesh_props)
|
|
281
281
|
self._add_3d_labels(mol, mol_to_draw)
|
|
282
|
-
self.host.view_3d_manager.plotter.
|
|
282
|
+
self.host.view_3d_manager.plotter.camera_position = camera_state
|
|
283
283
|
|
|
284
284
|
# Update projection mode and force render
|
|
285
285
|
settings = getattr(self, "settings", {})
|
|
@@ -53,7 +53,7 @@ DEFAULT_SETTINGS = {
|
|
|
53
53
|
"display_aromatic_circles_3d": False,
|
|
54
54
|
"display_kekule_3d": False,
|
|
55
55
|
# --- 3D Conversion and Optimization ---
|
|
56
|
-
"3d_conversion_mode": "
|
|
56
|
+
"3d_conversion_mode": "fallback",
|
|
57
57
|
"optimization_method": "MMFF_RDKIT",
|
|
58
58
|
"optimize_intermolecular_interaction_rdkit": True,
|
|
59
59
|
"skip_chemistry_checks": False,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: MoleditPy-linux
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.4
|
|
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
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -50,10 +50,10 @@ moleditpy_linux/ui/sip_isdeleted_safe.py,sha256=VhfzaFwcYyLBIEmi5Pi3fxhtOGf29tTP
|
|
|
50
50
|
moleditpy_linux/ui/string_importers.py,sha256=9Caud7JwyuQDz-xr8cFBTG_CzeJZbyHacEVLjhHcpO8,10584
|
|
51
51
|
moleditpy_linux/ui/template_preview_item.py,sha256=05e1dTVuFn5e9tIC27-t22J8J2uxFUDYrXJlW9IjU3s,6776
|
|
52
52
|
moleditpy_linux/ui/template_preview_view.py,sha256=pb_iAW_HuxDzMG2aB9a4JkUV9vbJTJVWkNw3FQ3wGG0,3531
|
|
53
|
-
moleditpy_linux/ui/translation_dialog.py,sha256=
|
|
53
|
+
moleditpy_linux/ui/translation_dialog.py,sha256=YHMkmKnDT5OrV14GPz36S32K96qyZlRIN4X4LnSOZUw,12348
|
|
54
54
|
moleditpy_linux/ui/ui_manager.py,sha256=1WMaxR1QEJvHAwwnzoIY1M6hybOXsR34iS9Ms1SJZKo,26332
|
|
55
55
|
moleditpy_linux/ui/user_template_dialog.py,sha256=TYFYvUeFxwE-RU4oNRSOzJXN-WOhCIJWoeOsEZAwI4E,29693
|
|
56
|
-
moleditpy_linux/ui/view_3d_logic.py,sha256=
|
|
56
|
+
moleditpy_linux/ui/view_3d_logic.py,sha256=4gnKQ761h7cW-hhiK8Z9K_fP4TLmB2DXSw2ro4CUztk,92531
|
|
57
57
|
moleditpy_linux/ui/zoomable_view.py,sha256=PvUNty10wUUtcdoNYtQ4e4uNmHShkMDKvtZtICAspes,5278
|
|
58
58
|
moleditpy_linux/ui/settings_tabs/__init__.py,sha256=BEOaCz93HzgTe0FhBzSj6Sfk8MAWxcY9vCDGmOriJx4,267
|
|
59
59
|
moleditpy_linux/ui/settings_tabs/settings_2d_tab.py,sha256=6XxK7ybL8fFTV3Tm7VH1U71Yt8fQPyHJocNiaFBS1gc,8360
|
|
@@ -61,13 +61,13 @@ moleditpy_linux/ui/settings_tabs/settings_3d_tabs.py,sha256=1wDdk4u0QYW_SnS5T3cm
|
|
|
61
61
|
moleditpy_linux/ui/settings_tabs/settings_other_tab.py,sha256=sOkbuVn2J4wsvbIiNIHX1e-oc8VSjg5_--st2PExILQ,4494
|
|
62
62
|
moleditpy_linux/ui/settings_tabs/settings_tab_base.py,sha256=f7aw9ALQwmPj7uhwFDii61J8ABDT1zB2VfwSQg9JP3E,2218
|
|
63
63
|
moleditpy_linux/utils/__init__.py,sha256=BEOaCz93HzgTe0FhBzSj6Sfk8MAWxcY9vCDGmOriJx4,267
|
|
64
|
-
moleditpy_linux/utils/constants.py,sha256=
|
|
65
|
-
moleditpy_linux/utils/default_settings.py,sha256=
|
|
64
|
+
moleditpy_linux/utils/constants.py,sha256=Ag5KqIRx9Fu-uz5MgpYxpL2rtY7w76UZjS3Ux_EEOyI,5695
|
|
65
|
+
moleditpy_linux/utils/default_settings.py,sha256=1JqHosMDpCjSuKodu6idZHbVatYyTTAwouLFl26VfeM,2961
|
|
66
66
|
moleditpy_linux/utils/sip_isdeleted_safe.py,sha256=96yyiZRCGPKQK91Ifw2JyniVD2MnPq-E0EwT6FFIR3s,1153
|
|
67
67
|
moleditpy_linux/utils/system_utils.py,sha256=CnZmPMoCjXo5zmhdBWexDMW2Yg72ObD7CW0QHYjTVyA,2195
|
|
68
|
-
moleditpy_linux-3.0.
|
|
69
|
-
moleditpy_linux-3.0.
|
|
70
|
-
moleditpy_linux-3.0.
|
|
71
|
-
moleditpy_linux-3.0.
|
|
72
|
-
moleditpy_linux-3.0.
|
|
73
|
-
moleditpy_linux-3.0.
|
|
68
|
+
moleditpy_linux-3.0.4.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
|
|
69
|
+
moleditpy_linux-3.0.4.dist-info/METADATA,sha256=Msz1Pfg3JzigGRfD5doceIhbfWXZt_GVLta_9834h14,62103
|
|
70
|
+
moleditpy_linux-3.0.4.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
71
|
+
moleditpy_linux-3.0.4.dist-info/entry_points.txt,sha256=-OzipSi__yVwlimNtu3eiRP5t5UMg55Cs0udyhXYiyw,60
|
|
72
|
+
moleditpy_linux-3.0.4.dist-info/top_level.txt,sha256=qyqe-hDYL6CXyin9E5Me5rVl3PG84VqiOjf9bQvfJLs,16
|
|
73
|
+
moleditpy_linux-3.0.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|