-
-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathgrblG92.py
246 lines (209 loc) · 12 KB
/
grblG92.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# -*- coding: UTF-8 -*-
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' '
' Copyright 2018-2024 Gauthier Brière (gauthier.briere "at" gmail.com) '
' '
' This file is part of cn5X++ '
' '
' cn5X++ is free software: you can redistribute it and/or modify it '
' under the terms of the GNU General Public License as published by '
' the Free Software Foundation, either version 3 of the License, or '
' (at your option) any later version. '
' '
' cn5X++ is distributed in the hope that it will be useful, but '
' WITHOUT ANY WARRANTY; without even the implied warranty of '
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the '
' GNU General Public License for more details. '
' '
' You should have received a copy of the GNU General Public License '
' along with this program. If not, see <http://www.gnu.org/licenses/>. '
' cn5X_dlgG92 '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
import os
from PyQt6 import QtCore, QtGui, QtWidgets, uic
from PyQt6.QtCore import Qt, QObject, pyqtSignal, pyqtSlot, QSettings
from PyQt6.QtWidgets import QDialog, QAbstractButton, QDialogButtonBox, QCheckBox, QSpinBox, QDoubleSpinBox, QLineEdit
from PyQt6.QtGui import QStandardItemModel, QStandardItem, QValidator, QPalette
from cn5X_config import *
from grblCom import grblCom
from msgbox import *
class dlgG92(QDialog):
''' Classe assurant la gestion de la boite de dialogue G92 '''
def __init__(self, grbl: grblCom, decoder, axisNumber: int, axisNames: list):
super().__init__()
self.di = uic.loadUi(os.path.join(os.path.dirname(__file__), "dlgG92.ui"), self)
self.__grblCom = grbl
self.__decode = decoder
self.__nbAxis = axisNumber
self.__axisNames = axisNames
self.__settings = QSettings(QSettings.Format.NativeFormat, QSettings.Scope.UserScope, ORG_NAME, APP_NAME)
self.di.chkAutoclose.setChecked(self.__settings.value("G92/autoCloseDialog", False, type=bool))
# Mémorise les couleurs standard des spin boxes
self.activeColor = self.di.dsbG92valeurX.palette().color(QPalette.ColorGroup.Active, QPalette.ColorRole.WindowText).name()
self.disabledColor = self.di.dsbG92valeurX.palette().color(QPalette.ColorGroup.Disabled, QPalette.ColorRole.WindowText).name()
# Mise à jour de l'interface en fonction de la définition des axes:
self.di.chkDefineX.setText("Assign {} value".format(self.__axisNames[0]))
self.di.chkDefineY.setText("Assign {} value".format(self.__axisNames[1]))
self.di.chkDefineZ.setText("Assign {} value".format(self.__axisNames[2]))
if self.__nbAxis > 3:
self.di.chkDefineA.setText("Assign {} value".format(self.__axisNames[3]))
self.di.chkDefineA.setEnabled(True)
self.di.dsbG92valeurA.setEnabled(True)
else:
self.di.chkDefineA.setText("Assign - value")
self.di.chkDefineA.setEnabled(False)
self.di.dsbG92valeurA.setEnabled(False)
if self.__nbAxis > 4:
self.di.chkDefineB.setText("Assign {} value".format(self.__axisNames[4]))
self.di.chkDefineB.setEnabled(True)
self.di.dsbG92valeurB.setEnabled(True)
else:
self.di.chkDefineB.setText("Assign - value")
self.di.chkDefineB.setEnabled(False)
self.di.dsbG92valeurB.setEnabled(False)
if self.__nbAxis > 5:
self.di.chkDefineC.setText("Assign {} value".format(self.__axisNames[5]))
self.di.chkDefineC.setEnabled(True)
self.di.dsbG92valeurC.setEnabled(True)
else:
self.di.chkDefineC.setText("Assign - value")
self.di.chkDefineC.setEnabled(False)
self.di.dsbG92valeurC.setEnabled(False)
palette = self.di.dsbG92valeurX.palette()
palette.setColor(QPalette.Inactive, QPalette.WindowText, Qt.GlobalColor.red)
self.di.dsbG92valeurX.setPalette(palette)
# Mise à jour des valeurs avec les coordonnées courantes
self.di.dsbG92valeurX.setValue(self.__decode.getWpos(self.__axisNames[0]))
self.di.dsbG92valeurY.setValue(self.__decode.getWpos(self.__axisNames[1]))
self.di.dsbG92valeurZ.setValue(self.__decode.getWpos(self.__axisNames[2]))
if self.__nbAxis > 3:
self.di.dsbG92valeurA.setValue(self.__decode.getWpos(self.__axisNames[3]))
if self.__nbAxis > 4:
self.di.dsbG92valeurB.setValue(self.__decode.getWpos(self.__axisNames[4]))
if self.__nbAxis > 5:
self.di.dsbG92valeurC.setValue(self.__decode.getWpos(self.__axisNames[5]))
# Connection des actions
self.di.chkAutoclose.toggled.connect(self.on_chkAutoclose_toggled)
self.di.buttonBox.button(QDialogButtonBox.Close).clicked.connect(self.close)
self.di.btnSetOriginG92.clicked.connect(self.on_btnSetOriginG92)
self.di.btnSetOriginG92_1.clicked.connect(self.on_btnSetOriginG92_1)
self.di.chkDefineX.toggled.connect(lambda: self.on_chkDefine_toogle('X'))
self.di.chkDefineY.toggled.connect(lambda: self.on_chkDefine_toogle('Y'))
self.di.chkDefineZ.toggled.connect(lambda: self.on_chkDefine_toogle('Z'))
self.di.chkDefineA.toggled.connect(lambda: self.on_chkDefine_toogle('A'))
self.di.chkDefineB.toggled.connect(lambda: self.on_chkDefine_toogle('B'))
self.di.chkDefineC.toggled.connect(lambda: self.on_chkDefine_toogle('C'))
self.di.chkDefineX.stateChanged.connect(lambda: self.on_chkDefine_changed(self.di.chkDefineX, 0))
self.di.chkDefineY.stateChanged.connect(lambda: self.on_chkDefine_changed(self.di.chkDefineY, 1))
self.di.chkDefineZ.stateChanged.connect(lambda: self.on_chkDefine_changed(self.di.chkDefineZ, 2))
self.di.chkDefineA.stateChanged.connect(lambda: self.on_chkDefine_changed(self.di.chkDefineA, 3))
self.di.chkDefineB.stateChanged.connect(lambda: self.on_chkDefine_changed(self.di.chkDefineB, 4))
self.di.chkDefineC.stateChanged.connect(lambda: self.on_chkDefine_changed(self.di.chkDefineC, 5))
self.di.dsbG92valeurX.valueChanged.connect(lambda: self.on_dsbG92valeur_changed(self.di.dsbG92valeurX, self.di.chkDefineX, 0))
self.di.dsbG92valeurY.valueChanged.connect(lambda: self.on_dsbG92valeur_changed(self.di.dsbG92valeurY, self.di.chkDefineY, 1))
self.di.dsbG92valeurZ.valueChanged.connect(lambda: self.on_dsbG92valeur_changed(self.di.dsbG92valeurZ, self.di.chkDefineZ, 2))
self.di.dsbG92valeurA.valueChanged.connect(lambda: self.on_dsbG92valeur_changed(self.di.dsbG92valeurA, self.di.chkDefineA, 3))
self.di.dsbG92valeurB.valueChanged.connect(lambda: self.on_dsbG92valeur_changed(self.di.dsbG92valeurB, self.di.chkDefineB, 4))
self.di.dsbG92valeurC.valueChanged.connect(lambda: self.on_dsbG92valeur_changed(self.di.dsbG92valeurC, self.di.chkDefineC, 5))
def on_dsbG92valeur_changed(self, dbsChanged, chkDefine, axisNumChanged):
# Coche la case correspondante
chkDefine.setChecked(True)
# Vérifie si 2 axes ont le même nom, et dans ce cas, assure que les 2 valeurs soient la même
i = 0
for dbs in [self.di.dsbG92valeurX, self.di.dsbG92valeurY, self.di.dsbG92valeurZ, self.di.dsbG92valeurA, self.di.dsbG92valeurB, self.di.dsbG92valeurC]:
if dbs != dbsChanged:
if i >= self.__nbAxis:
break
if self.__axisNames[i] == self.__axisNames[axisNumChanged]:
# Force le même état des 2 checkBox
dbs.setValue(dbsChanged.value())
i += 1
def on_chkDefine_changed(self, chkChanged, axisNumChanged):
''' Vérifie si 2 axes ont le même nom, et dans ce cas, assure que les 2 axes soit cochée ou décochés de la même manière '''
i = 0
for chk in [self.di.chkDefineX, self.di.chkDefineY, self.di.chkDefineZ, self.di.chkDefineA, self.di.chkDefineB, self.di.chkDefineC]:
if chk != chkChanged:
if i >= self.__nbAxis:
break
if self.__axisNames[i] == self.__axisNames[axisNumChanged]:
# Force le même état des 2 checkBox
chk.setChecked(chkChanged.isChecked())
i += 1
def showDialog(self):
# Centrage de la boite de dialogue sur la fenetre principale
ParentX = self.parent().geometry().x()
ParentY = self.parent().geometry().y()
ParentWidth = self.parent().geometry().width()
ParentHeight = self.parent().geometry().height()
myWidth = self.geometry().width()
myHeight = self.geometry().height()
self.setFixedSize(self.geometry().width(),self.geometry().height())
self.move(ParentX + int((ParentWidth - myWidth) / 2),ParentY + int((ParentHeight - myHeight) / 2),)
self.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.Dialog)
RC = self.exec()
return RC
def on_chkAutoclose_toggled(self):
self.__settings.setValue("G92/autoCloseDialog", self.di.chkAutoclose.isChecked())
def on_btnSetOriginG92(self):
'''
Construit et envoi l'ordre G92 à Grbl
'''
originGcode = "G92"
if self.di.chkDefineX.isChecked(): originGcode += "X{}".format(float(self.di.dsbG92valeurX.value()))
if self.di.chkDefineY.isChecked(): originGcode += "Y{}".format(float(self.di.dsbG92valeurY.value()))
if self.di.chkDefineZ.isChecked(): originGcode += "Z{}".format(float(self.di.dsbG92valeurZ.value()))
if self.di.chkDefineA.isChecked(): originGcode += "A{}".format(float(self.di.dsbG92valeurA.value()))
if self.di.chkDefineB.isChecked(): originGcode += "B{}".format(float(self.di.dsbG92valeurB.value()))
if self.di.chkDefineC.isChecked(): originGcode += "C{}".format(float(self.di.dsbG92valeurC.value()))
# Envoi du changement d'origine à Grbl
self.__grblCom.gcodePush(originGcode)
if self.di.chkAutoclose.isChecked():
# Fermeture de la dialog
self.close()
def on_btnSetOriginG92_1(self):
''' Envoi G92.1 '''
self.__grblCom.gcodePush("G92.1")
if self.di.chkAutoclose.isChecked():
# Fermeture de la dialog
self.close()
def on_chkDefine_toogle(self, axis: str):
''' Change la couleur des spinBoxes dynamiquement et traite l'activation ou la désactivation du bouton d'envoi '''
if axis == 'X':
if self.di.chkDefineX.isChecked():
self.di.dsbG92valeurX.setStyleSheet("color: {};".format(self.activeColor))
else:
self.di.dsbG92valeurX.setStyleSheet("color: {};".format(self.disabledColor))
if axis == 'Y':
if self.di.chkDefineY.isChecked():
self.di.dsbG92valeurY.setStyleSheet("color: {};".format(self.activeColor))
else:
self.di.dsbG92valeurY.setStyleSheet("color: {};".format(self.disabledColor))
if axis == 'Z':
if self.di.chkDefineZ.isChecked():
self.di.dsbG92valeurZ.setStyleSheet("color: {};".format(self.activeColor))
else:
self.di.dsbG92valeurZ.setStyleSheet("color: {};".format(self.disabledColor))
if axis == 'A':
if self.di.chkDefineA.isChecked():
self.di.dsbG92valeurA.setStyleSheet("color: {};".format(self.activeColor))
else:
self.di.dsbG92valeurA.setStyleSheet("color: {};".format(self.disabledColor))
if axis == 'B':
if self.di.chkDefineB.isChecked():
self.di.dsbG92valeurB.setStyleSheet("color: {};".format(self.activeColor))
else:
self.di.dsbG92valeurB.setStyleSheet("color: {};".format(self.disabledColor))
if axis == 'C':
if self.di.chkDefineC.isChecked():
self.di.dsbG92valeurC.setStyleSheet("color: {};".format(self.activeColor))
else:
self.di.dsbG92valeurC.setStyleSheet("color: {};".format(self.disabledColor))
if self.di.chkDefineX.isChecked() \
or self.di.chkDefineY.isChecked() \
or self.di.chkDefineZ.isChecked() \
or self.di.chkDefineA.isChecked() \
or self.di.chkDefineB.isChecked() \
or self.di.chkDefineC.isChecked():
self.di.btnSetOriginG92.setEnabled(True)
else:
self.di.btnSetOriginG92.setEnabled(False)