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

183 lines
6.5 KiB
Python

#!/usr/bin/env python3
# qtvcp
#
# Copyright (c) 2025 Steve Richardson
#
# This program 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 2 of the License, or
# (at your option) any later version.
#
# This program 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.
#
#################################################################################
import sys
import os
import operator
from qtpy import QtGui, QtWidgets, uic
from qtpy.QtCore import Qt, QAbstractTableModel
from qtpy.QtGui import QColor, QIcon
from qtpy.QtWidgets import (QTableView, QAbstractItemView, QCheckBox, QStyledItemDelegate, QHeaderView)
from qtvcp.widgets.widget_baseclass import _HalWidgetBase
from qtvcp.core import Status, Action, Info, Tool
from qtvcp import logger
LOG = logger.getLogger(__name__)
# Instiniate the libraries with global reference
# STATUS gives us status messages from linuxcnc
# INI holds ini details
# ACTION gives commands to linuxcnc
# LOG is for running code logging
STATUS = Status()
ACTION = Action()
INFO = Info()
TOOL = Tool()
LOG = logger.getLogger(__name__)
# Force the log level for this module
#LOG.setLevel(logger.DEBUG) # One of DEBUG, INFO, WARNING, ERROR, CRITICAL
class ToolChooser(QTableView, _HalWidgetBase):
def __init__(self, parent=None):
super(ToolChooser, self).__init__(parent)
self._current_tool = -1
self.createAllView()
def _hal_init(self):
self.delay = 0
STATUS.connect('all-homed', lambda w: self.setEnabled(True))
STATUS.connect('not-all-homed', lambda w, axis: self.setEnabled(False))
STATUS.connect('interp-idle', lambda w: self.setEnabled(STATUS.machine_is_on()
and (STATUS.is_all_homed()
or INFO.NO_HOME_REQUIRED)))
STATUS.connect('interp-run', lambda w: self.setEnabled(False))
STATUS.connect('tool-in-spindle-changed', lambda w, data: self.currentTool(data))
for i in (0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18):
self.hideColumn(i)
def currentTool(self, tool):
self._current_tool = tool
def createAllView(self):
styledItemDelegate=QStyledItemDelegate()
self.setItemDelegate(styledItemDelegate)
self.tablemodel = ToolTableModel(self)
self.setModel(self.tablemodel)
self.setMinimumSize(100, 100)
hh = self.horizontalHeader()
hh.setSectionResizeMode(QHeaderView.ResizeToContents)
hh.setStretchLastSection(True)
hh.setSortIndicator(1,Qt.AscendingOrder)
vh = self.verticalHeader()
vh.setVisible(False)
self.resizeColumnsToContents()
self.resizeRowsToContents()
self.setSortingEnabled(True)
self.setAlternatingRowColors(True)
self.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setSelectionMode(QAbstractItemView.SingleSelection)
def getSelectedTool(self):
index = self.selectionModel().currentIndex()
return self.tablemodel.arraydata[index.row()][1]
def __getitem__(self, item):
return getattr(self, item)
def __setitem__(self, item, value):
return setattr(self, item, value)
#########################################
# model holds the tool data
#########################################
class ToolTableModel(QAbstractTableModel):
def __init__(self, parent=None):
super(ToolTableModel, self).__init__(parent)
self.text_template = '%.4f'
self._current_tool_bg_color = '#00ffff'
self._current_tool_color = '#777777'
self._selectedcolor = '#00ff00'
self.headerdata = ['','tool','pocket','X','X Wear', 'Y', 'Y Wear', 'Z', 'Z Wear', 'A', 'B', 'C', 'U', 'V', 'W', 'Diameter', 'Front Angle', 'Back Angle','Orient','Comment']
if INFO.MACHINE_IS_LATHE:
self.headerdata[2] = 'Stn'
self.vheaderdata = []
self.arraydata = [[0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0,'No Tool']]
STATUS.connect('toolfile-stale',lambda o, d: self.update(d))
self.update(None)
def update(self, models):
data = TOOL.CONVERT_TO_WEAR_TYPE(models)
if data in (None, []):
data = [[0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, 0,'No Tool']]
self.arraydata = data
self.layoutChanged.emit()
def rowCount(self, parent):
return len(self.arraydata)
def columnCount(self, parent):
if len(self.arraydata) > 0:
return len(self.arraydata[0])
return 0
def data(self, index, role=Qt.DisplayRole):
if role == Qt.DisplayRole:
value = self.arraydata[index.row()][index.column()]
if isinstance(value, str):
return '%s' % value
return value
elif role == Qt.BackgroundRole:
if self.arraydata[index.row()][1] == self.parent()._current_tool:
return QColor(self._current_tool_bg_color)
return None
elif role == Qt.ForegroundRole:
if self.arraydata[index.row()][1] == self.parent()._current_tool:
return QColor(self._current_tool_color)
return None
def flags(self, index):
if not index.isValid():
return None
else:
return Qt.ItemIsEnabled | Qt.ItemIsSelectable
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.headerdata[col]
elif orientation != Qt.Horizontal and role == Qt.DisplayRole:
return ''
return None
def sort(self, Ncol, order):
self.layoutAboutToBeChanged.emit()
self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol))
if order == Qt.DescendingOrder:
self.arraydata.reverse()
self.layoutChanged.emit()
#############################
# Testing #
#############################
if __name__ == "__main__":
from qtpy.QtWidgets import *
from qtpy.QtCore import *
from qtpy.QtGui import *
app = QtWidgets.QApplication(sys.argv)
w = ToolChooser()
w.show()
sys.exit( app.exec() )