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.
@@ -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
- # Instructions
51
- instruction_label = QLabel(
52
- "Click atoms in the 3D view to select them for translation. Specify the translation vector in Å."
53
- )
54
- instruction_label.setWordWrap(True)
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
- # Selected atoms display
58
- self.selection_label = QLabel("No atoms selected")
59
- layout.addWidget(self.selection_label)
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
- # Translation vector input
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
- vector_layout.addWidget(QLabel("dY:"))
68
- self.dy_input = QLineEdit("0.0")
69
- vector_layout.addWidget(self.dy_input)
74
+ def _build_absolute_tab(self):
75
+ widget = QWidget()
76
+ layout = QVBoxLayout(widget)
70
77
 
71
- vector_layout.addWidget(QLabel("dZ:"))
72
- self.dz_input = QLineEdit("0.0")
73
- vector_layout.addWidget(self.dz_input)
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
- layout.addLayout(vector_layout)
132
+ self.delta_selection_label = QLabel("No atoms selected")
133
+ layout.addWidget(self.delta_selection_label)
76
134
 
77
- # Buttons
78
- button_layout = QHBoxLayout()
79
- self.clear_button = QPushButton("Clear Selection")
80
- self.clear_button.clicked.connect(self.clear_selection)
81
- button_layout.addWidget(self.clear_button)
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
- # Select all atoms button
84
- self.select_all_button = QPushButton("Select All Atoms")
85
- self.select_all_button.setToolTip("Select all atoms in the molecule")
86
- self.select_all_button.clicked.connect(self.select_all_atoms)
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
- button_layout.addStretch()
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
- button_layout.addWidget(self.apply_button)
161
+ btn_row.addWidget(self.apply_button)
162
+ layout.addLayout(btn_row)
95
163
 
96
- close_button = QPushButton("Close")
97
- close_button.clicked.connect(self.reject)
98
- button_layout.addWidget(close_button)
164
+ layout.addStretch()
165
+ return widget
99
166
 
100
- layout.addLayout(button_layout)
167
+ # ------------------------------------------------------------------
168
+ # Tab switching
169
+ # ------------------------------------------------------------------
101
170
 
102
- # Connect to main window's picker
103
- self.picker_connection = None
104
- self.enable_picking()
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
- """Handle the event when an atom is picked in the 3D view."""
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
- n = self.mol.GetNumAtoms()
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
- """Apply the translation to selected atoms."""
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.camera.copy()
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.camera = camera_state
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", {})
@@ -16,7 +16,7 @@ from PyQt6.QtGui import QColor, QFont
16
16
  from rdkit import Chem
17
17
 
18
18
  # Version
19
- VERSION = "3.0.2"
19
+ VERSION = "3.0.4"
20
20
 
21
21
  ATOM_RADIUS = 18
22
22
  BOND_OFFSET = 3.5
@@ -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": "rdkit",
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.2
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=2MqxIMcTRBGoSB9i3Sa04sfAAm_y4q_azSO1OfxlVLc,6553
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=BLyKPfGIoJ-6MCZtSs8nsVwD-y3wFy2QDBT5UrjPRjs,92520
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=SiSpYXL53ggV9GyVaKKhQnqKX345h_noV3oN_CrgC4Y,5695
65
- moleditpy_linux/utils/default_settings.py,sha256=lEcQ4YWvCctS6GfNpkanm3xxL2AATSHlEHe8o37c5sE,2958
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.2.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
69
- moleditpy_linux-3.0.2.dist-info/METADATA,sha256=eXtNEVpU28yYPceE4Z7Ed_WzbWCecZoUwCNwEPZZ5LQ,62103
70
- moleditpy_linux-3.0.2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
71
- moleditpy_linux-3.0.2.dist-info/entry_points.txt,sha256=-OzipSi__yVwlimNtu3eiRP5t5UMg55Cs0udyhXYiyw,60
72
- moleditpy_linux-3.0.2.dist-info/top_level.txt,sha256=qyqe-hDYL6CXyin9E5Me5rVl3PG84VqiOjf9bQvfJLs,16
73
- moleditpy_linux-3.0.2.dist-info/RECORD,,
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,,