Files
linuxcncAllWasm/lib/python/qtvcp/widgets/axisPickTool_button.py
2026-08-20 06:17:39 +08:00

91 lines
3.1 KiB
Python

from qtpy.QtWidgets import (QToolButton, QMenu, QAction,
QComboBox, QWidgetAction, QSizePolicy)
from qtpy.QtCore import Property, Signal
from qtpy.QtGui import QIcon
from qtvcp.widgets.widget_baseclass import _HalWidgetBase
from qtvcp.widgets.indicatorMixIn import IndicatedMixIn
from qtvcp.core import Status, Action, Info
from qtvcp import logger
# Instiniate the libraries with global reference
# STATUS gives us status messages from linuxcnc
# AUX_PRGM holds helper program loader
# INI holds ini details
# ACTION gives commands to linuxcnc
# LOG is for running code logging
STATUS = Status()
INFO = Info()
ACTION = Action()
LOG = logger.getLogger(__name__)
# Force the log level for this module
#LOG.setLevel(logger.DEBUG) # One of DEBUG, INFO, WARNING, ERROR, CRITICAL
class AxisPickToolButton(QToolButton, IndicatedMixIn):
AxisSelected = Signal(str)
CurrentAxisPosition = Signal(str,float)
def __init__(self, parent=None):
super(AxisPickToolButton, self).__init__(parent)
self._textTemplate = 'Axis: %s'
self._currentAxis = 'X'
def _hal_init(self):
self.createAxisButton(self._currentAxis)
self.axisTriggered(self._currentAxis)
def createAxisButton(self, text):
tmpl = lambda s: self._textTemplate % s
self.setText(tmpl(text))
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
self.setMinimumSize(70, 40)
self.clicked.connect(self.axisClicked)
SettingMenu = QMenu()
self.settingMenu = SettingMenu
for i in INFO.AVAILABLE_AXES:
axisButton = QAction(QIcon('exit24.png'), i, self)
# weird lambda i=i to work around 'function closure'
axisButton.triggered.connect(lambda state, i=i: self.axisTriggered(i))
SettingMenu.addAction(axisButton)
self.setMenu(SettingMenu)
def axisTriggered(self, data):
tmpl = lambda s: self._textTemplate % s
self.setText(tmpl(data))
self.AxisSelected.emit(data)
def axisClicked(self):
conversion = {'X':0, 'Y':1, "Z":2, 'A':3, "B":4, "C":5, 'U':6, 'V':7, 'W':8}
digitValue = 0.0
try:
p,relp,dtg = STATUS.get_position()
text = self.text()
for let in INFO.AVAILABLE_AXES:
if let == text[-1]:
digitValue = round(p[conversion[let]],5)
break
except Exception as e:
print(e)
return
print(let, digitValue)
self.AxisSelected.emit(let)
self.CurrentAxisPosition.emit(let, digitValue)
def setTextTemplate(self, data):
self._textTemplate = data
def getTextTemplate(self):
return self._textTemplate
def resetTextTemplate(self):
self._textTemplate = 'Axis: %s'
textTemplate = Property(str, getTextTemplate, setTextTemplate, resetTextTemplate)
def setCurrentAxis(self, data):
self._currentAxis = data
def getCurrentAxis(self):
return self._currentAxis
def resetCurrentAxis(self):
self._currentAxis = 'X'
currentAxis = Property(str, getCurrentAxis, setCurrentAxis, resetCurrentAxis)