MoleditPy 2.4.1__py3-none-any.whl → 2.4.3__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.
@@ -16,7 +16,7 @@ from PyQt6.QtGui import QFont, QColor
16
16
  from rdkit import Chem
17
17
 
18
18
  #Version
19
- VERSION = '2.4.1'
19
+ VERSION = '2.4.3'
20
20
 
21
21
  ATOM_RADIUS = 18
22
22
  BOND_OFFSET = 3.5
@@ -532,6 +532,10 @@ class MainWindow(QMainWindow):
532
532
  # --- MOVED TO main_window_edit_actions.py ---
533
533
  return self.main_window_edit_actions.open_rotate_2d_dialog()
534
534
 
535
+ def rotate_molecule_2d(self, angle_degrees):
536
+ # --- MOVED TO main_window_edit_actions.py ---
537
+ return self.main_window_edit_actions.rotate_molecule_2d(angle_degrees)
538
+
535
539
  def draw_molecule_3d(self, mol):
536
540
  # --- MOVED TO main_window_view_3d.py ---
537
541
  return self.main_window_view_3d.draw_molecule_3d(mol)
@@ -47,7 +47,7 @@ from PyQt6.QtCore import (
47
47
  )
48
48
 
49
49
  class Rotate2DDialog(QDialog):
50
- def __init__(self, parent=None):
50
+ def __init__(self, parent=None, initial_angle=0):
51
51
  super().__init__(parent)
52
52
  self.setWindowTitle("Rotate 2D")
53
53
  self.setFixedWidth(300)
@@ -59,14 +59,14 @@ class Rotate2DDialog(QDialog):
59
59
  input_layout.addWidget(QLabel("Angle (degrees):"))
60
60
  self.angle_spin = QSpinBox()
61
61
  self.angle_spin.setRange(-360, 360)
62
- self.angle_spin.setValue(45)
62
+ self.angle_spin.setValue(initial_angle)
63
63
  input_layout.addWidget(self.angle_spin)
64
64
  layout.addLayout(input_layout)
65
65
 
66
66
  # Slider
67
67
  self.slider = QSlider(Qt.Orientation.Horizontal)
68
68
  self.slider.setRange(-180, 180)
69
- self.slider.setValue(45)
69
+ self.slider.setValue(initial_angle)
70
70
  self.slider.setTickPosition(QSlider.TickPosition.TicksBelow)
71
71
  self.slider.setTickInterval(15)
72
72
  layout.addWidget(self.slider)
@@ -612,9 +612,14 @@ class MainWindowEditActions(object):
612
612
 
613
613
  def open_rotate_2d_dialog(self):
614
614
  """2D回転ダイアログを開く"""
615
- dialog = Rotate2DDialog(self)
615
+ # Initialize last_rotation_angle if not present
616
+ if not hasattr(self, 'last_rotation_angle'):
617
+ self.last_rotation_angle = 0
618
+
619
+ dialog = Rotate2DDialog(self, initial_angle=self.last_rotation_angle)
616
620
  if dialog.exec() == QDialog.DialogCode.Accepted:
617
621
  angle = dialog.get_angle()
622
+ self.last_rotation_angle = angle # Remember for next time
618
623
  self.rotate_molecule_2d(angle)
619
624
 
620
625
  def rotate_molecule_2d(self, angle_degrees):
@@ -663,6 +668,8 @@ class MainWindowEditActions(object):
663
668
  self.push_undo_state()
664
669
  self.statusBar().showMessage(f"Rotated {len(target_atoms)} atoms by {angle_degrees} degrees.")
665
670
  self.scene.update()
671
+ # Force full redraw as requested
672
+ self.scene.update_all_items()
666
673
 
667
674
  except Exception as e:
668
675
  print(f"Error rotating molecule: {e}")
@@ -992,6 +992,7 @@ class MainWindowMainInit(object):
992
992
  edit_menu.addSeparator()
993
993
 
994
994
  rotate_2d_action = QAction("Rotate 2D...", self)
995
+ rotate_2d_action.setShortcut(QKeySequence("Ctrl+R"))
995
996
  rotate_2d_action.triggered.connect(self.open_rotate_2d_dialog)
996
997
  edit_menu.addAction(rotate_2d_action)
997
998
 
@@ -1054,7 +1055,7 @@ class MainWindowMainInit(object):
1054
1055
 
1055
1056
  reset_3d_view_action = QAction("Reset 3D View", self)
1056
1057
  reset_3d_view_action.triggered.connect(lambda: self.plotter.reset_camera() if hasattr(self, 'plotter') else None)
1057
- reset_3d_view_action.setShortcut(QKeySequence("Ctrl+R"))
1058
+ reset_3d_view_action.setShortcut(QKeySequence("Ctrl+Shift+R"))
1058
1059
  view_menu.addAction(reset_3d_view_action)
1059
1060
 
1060
1061
  view_menu.addSeparator()
@@ -116,6 +116,20 @@ class MoleculeScene(QGraphicsScene):
116
116
  self.reinitialize_items()
117
117
 
118
118
 
119
+ def update_connected_bonds(self, atoms):
120
+ """指定された原子リストに接続する全ての結合の位置を更新する"""
121
+ bonds_to_update = set()
122
+ for atom in atoms:
123
+ if hasattr(atom, 'bonds'):
124
+ bonds_to_update.update(atom.bonds)
125
+
126
+ for bond in bonds_to_update:
127
+ try:
128
+ if not sip_isdeleted_safe(bond):
129
+ bond.update_position()
130
+ except Exception:
131
+ continue
132
+
119
133
  def update_all_items(self):
120
134
  """全てのアイテムを強制的に再描画する"""
121
135
  for item in self.items():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MoleditPy
3
- Version: 2.4.1
3
+ Version: 2.4.3
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
@@ -12,20 +12,20 @@ moleditpy/modules/bond_item.py,sha256=hOwga7DcxZf8zxwZr8F7viTNgEi_9wftKFgSpROUJs
12
12
  moleditpy/modules/bond_length_dialog.py,sha256=6bFPGssnqlgINuqpxLv-OhjMH3_hspnaH8QtorAyu2M,14782
13
13
  moleditpy/modules/calculation_worker.py,sha256=KiGQY7i-QCQofEoE0r65KoQgpEGFcbhmxWv6egfkUdc,42324
14
14
  moleditpy/modules/color_settings_dialog.py,sha256=Ow44BhCOLo0AFb6klO001k6B4drOgKX9DeNBQhZLp5o,15474
15
- moleditpy/modules/constants.py,sha256=_KThEyBuzjfnKMFRCmrcHetn0kEWmXmVyiLT2bFsrQ0,4702
15
+ moleditpy/modules/constants.py,sha256=JnedcxOEw20rOrJh2Qb2t1CbYdcnkBwiHdhV1RtfNPY,4702
16
16
  moleditpy/modules/constrained_optimization_dialog.py,sha256=REsk4ePsqNmAGPMTS_jckeM7jexrU3krwun8sKqKUCs,30062
17
17
  moleditpy/modules/custom_interactor_style.py,sha256=LDNODMJoNHGe1AUSrvqv6PdeJm-hpPmSpWINppnJLt0,38942
18
18
  moleditpy/modules/custom_qt_interactor.py,sha256=vCZsDfRO-FtphD5cTP7Ps-5rpHZMIGloaoe6EaKzrsw,4139
19
19
  moleditpy/modules/dialog3_d_picking_mixin.py,sha256=z4udbkiX9PYmIGazPXsbftkk_oRRwZhcvlCqbyJzr24,6493
20
20
  moleditpy/modules/dihedral_dialog.py,sha256=bOTDO6-b74vEDn_z6OyuBr5cRz3RnRj83PiaEBUyWJA,18002
21
- moleditpy/modules/main_window.py,sha256=bYioEvqRVZVfLSJeV_Sw0TyA0rVWR4unQ0C5OgaDN2s,36642
21
+ moleditpy/modules/main_window.py,sha256=w52L0F7V3b0BiNhQImbulZ9N8cRKolYy06szfoMOIcg,36830
22
22
  moleditpy/modules/main_window_app_state.py,sha256=8YDcGNCSpLTO1NGL9tEvNkXpUcS7JW-uK7TdUGvEqnk,35189
23
23
  moleditpy/modules/main_window_compute.py,sha256=ipIkhH_DONXDnPzh7xeym9X-Yfx8EhsvXYOdyxsAj4c,53347
24
24
  moleditpy/modules/main_window_dialog_manager.py,sha256=QR96LqHAPSOShXbc9cK-Ffq8a16JrXAoMKB0pHjESrQ,20072
25
25
  moleditpy/modules/main_window_edit_3d.py,sha256=CUArB5wcsgq1C7LygAEC6URlbnn4RhRYDa5n-Y-etWI,19731
26
- moleditpy/modules/main_window_edit_actions.py,sha256=jjMBwCzwflEHHvf_zh_RBcup9ceR_H4dDEvdRrb6wno,69009
26
+ moleditpy/modules/main_window_edit_actions.py,sha256=drVXRFpSOhILYfApcSro9zssnDw-a8F7wNcfQ3xQukw,69412
27
27
  moleditpy/modules/main_window_export.py,sha256=_Vd7MeP_xaLWDYDm3-ZIZiPuAXhP-AvrQbi7Yx3Jy3c,43020
28
- moleditpy/modules/main_window_main_init.py,sha256=t-um1lHvXo_tPXSkjx5Y0mjZlrKUhZbmb529e-7ffNU,94781
28
+ moleditpy/modules/main_window_main_init.py,sha256=tqXkyyE7TSkq-On7LZ7RMoZAoq9pzFcHWBsqrVV-1WY,94849
29
29
  moleditpy/modules/main_window_molecular_parsers.py,sha256=KR6vzuqc3nutOcorpYr0QOyX3MFBcxTwDhZX96VgJ9Q,48291
30
30
  moleditpy/modules/main_window_project_io.py,sha256=TWwtuKDuvgcvPZ9IGmW8r1EJJOrgxrIJRnxe_f4C1oM,17149
31
31
  moleditpy/modules/main_window_string_importers.py,sha256=v47wOd4RtjKYcF-aLP-mogGGdYTpTEo3dDyAu79_5MM,10782
@@ -34,7 +34,7 @@ moleditpy/modules/main_window_view_3d.py,sha256=CxZxyJHl2isF7KtyVWSI9f8LVbvdZM5H
34
34
  moleditpy/modules/main_window_view_loaders.py,sha256=gklTMo27QnyJ8Gd0ampPdbm9d0Gi-oHWkIqQuGADHmI,14352
35
35
  moleditpy/modules/mirror_dialog.py,sha256=c3v4qY6R4FAljzk4EPaDjL9ZdZMjLQSFLqDMXz2fBUk,4696
36
36
  moleditpy/modules/molecular_data.py,sha256=8gE9ByYg3kSBfb1zANsyad_BVBTm6WOLF7NsZIYuG2E,13250
37
- moleditpy/modules/molecule_scene.py,sha256=khdt7h9Mk_D1cMbYeHGtq7P9aFXo0xG-hcShU_H2Y-Q,95911
37
+ moleditpy/modules/molecule_scene.py,sha256=7NijkUjelz7ZrGxZxaPPGMrMFRB8kw_eLQ0gXqge9BY,96429
38
38
  moleditpy/modules/move_group_dialog.py,sha256=Fyuy3Uq1KsFsk9qR96r_FxPbAM_-zSfW2dsMQGv7btc,27276
39
39
  moleditpy/modules/periodic_table_dialog.py,sha256=ItEZUts1XCietz9paY-spvbzxh6SXak3GnikwqkHZCw,4006
40
40
  moleditpy/modules/planarize_dialog.py,sha256=eaqI1MpF35e-VUMpJATt-EtGG5FhcSUlbAenUaFGabY,8593
@@ -51,9 +51,9 @@ moleditpy/modules/assets/file_icon.ico,sha256=yyVj084A7HuMNbV073cE_Ag3Ne405qgOP3
51
51
  moleditpy/modules/assets/icon.icns,sha256=wD5R6-Vw7K662tVKhu2E1ImN0oUuyAP4youesEQsn9c,139863
52
52
  moleditpy/modules/assets/icon.ico,sha256=RfgFcx7-dHY_2STdsOQCQziY5SNhDr3gPnjO6jzEDPI,147975
53
53
  moleditpy/modules/assets/icon.png,sha256=kCFN1WacYIdy0GN6SFEbNA00ef39pCczBnFdkkBI8Bs,147110
54
- moleditpy-2.4.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
55
- moleditpy-2.4.1.dist-info/METADATA,sha256=Au-0u49T92vgtUFeMp_45D-KulYajiHuKYL0K0LsScw,60629
56
- moleditpy-2.4.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
57
- moleditpy-2.4.1.dist-info/entry_points.txt,sha256=yH1h9JjALhok1foXT3-hYrC4ufoZt8b7oiBcsdnGNNM,54
58
- moleditpy-2.4.1.dist-info/top_level.txt,sha256=ARICrS4ihlPXqywlKl6o-oJa3Qz3gZRWu_VZsQ3_c44,10
59
- moleditpy-2.4.1.dist-info/RECORD,,
54
+ moleditpy-2.4.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
55
+ moleditpy-2.4.3.dist-info/METADATA,sha256=lrVpgjjImgRqAVoYXEE-dB1fkgkytqXl3uqI_5gMaGY,60629
56
+ moleditpy-2.4.3.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
57
+ moleditpy-2.4.3.dist-info/entry_points.txt,sha256=yH1h9JjALhok1foXT3-hYrC4ufoZt8b7oiBcsdnGNNM,54
58
+ moleditpy-2.4.3.dist-info/top_level.txt,sha256=ARICrS4ihlPXqywlKl6o-oJa3Qz3gZRWu_VZsQ3_c44,10
59
+ moleditpy-2.4.3.dist-info/RECORD,,