def refreshComboWB(self): if 'PathWorkbench' in FreeCADGui.listWorkbenches(): wb = FreeCADGui.getWorkbench('PathWorkbench') if hasattr(wb, '__Workbench__'): MachinekitPreferences.Setup() mks = {} for mk in [ mk for mk in machinekit.Instances() if mk.isValid() ]: if self.comboTB.get(mk) is None: name = "%s_%d" % (MachinekitCommandCombo.__name__, self.comboID) cmd = MachinekitCommandCombo(mk) self._addCommand(name, cmd) mks[mk] = (name, cmd) self.comboID = self.comboID + 1 else: mks[mk] = self.comboTB[mk] tb = FreeCADGui.getMainWindow().findChild( PySide.QtGui.QToolBar, 'MachinekitCombo') if tb: # first remove all tool buttons which are no longer valid for mk in [mk for mk in self.comboTB if not mk in mks]: actions = tb.actions() for action in actions: if action.text() == mk.name(): PathLog.track('removing', mk.name()) tb.removeAction(action) for mk in [mk for mk in mks if not mk in self.comboTB]: icon = machinekit.IconResource('machinekiticon.svg') PathLog.track('adding', mk.name()) tb.addAction(icon, mk.name(), mks[mk][1].Activated) elif mks: if 'PathWorkbench' == FreeCADGui.activeWorkbench().name(): PathLog.track('createToolbar') tb = PySide.QtGui.QToolBar() tb.setObjectName('MachinekitCombo') for mk in [mk for mk in mks if not mk in self.comboTB]: icon = machinekit.IconResource( 'machinekiticon.svg') PathLog.track('adding+', mk.name(), icon) tb.addAction(icon, mk.name(), mks[mk][1].Activated) FreeCADGui.getMainWindow().addToolBar(tb) tools = [mks[mk][0] for mk in mks] PathLog.track('appendToolbar', tools) wb.appendToolbar('MachinekitCombo', tools) self.comboTB = mks else: PathLog.track('no __Workbench__')
def changed(self, service, msg): if msg.changeTool(): if 0 == msg.toolNumber(): PathLog.debug("TC clear") service.toolChanged(self.mk['halrcmd'], True) else: tc = self.getTC(msg.toolNumber()) if tc: msg = [ "Insert tool #%d" % tc.ToolNumber, "<i>\"%s\"</i>" % tc.Label ] else: msg = ["Insert tool #%d" % msg.toolNumber()] mb = PySide.QtGui.QMessageBox() mb.setWindowIcon(machinekit.IconResource('machinekiticon.png')) mb.setWindowTitle('Machinekit') mb.setTextFormat(PySide.QtCore.Qt.TextFormat.RichText) mb.setText("<div align='center'>%s</div>" % '<br/>'.join(msg)) mb.setIcon(PySide.QtGui.QMessageBox.Warning) mb.setStandardButtons(PySide.QtGui.QMessageBox.Ok | PySide.QtGui.QMessageBox.Abort) if PySide.QtGui.QMessageBox.Ok == mb.exec_(): PathLog.debug("TC confirm") service.toolChanged(self.mk['halrcmd'], True) else: PathLog.debug("TC abort") self.mk['command'].sendCommand( MKCommand.MKCommandTaskAbort()) elif msg.toolChanged(): PathLog.debug('TC reset') service.toolChanged(self.mk['halrcmd'], False) else: PathLog.debug('TC -') pass
def setupJogButton(b, axes, icon, slot=None): b.setIcon(machinekit.IconResource(icon)) b.setText('') if slot: b.clicked.connect(slot) else: b.clicked.connect(lambda: self.jogAxes(axes)) b.pressed.connect(lambda: self.jogAxesBegin(axes)) b.released.connect(lambda: self.jogAxesEnd(axes))
def _mkerror(service, msg): mb = PySide.QtGui.QMessageBox() mb.setWindowIcon(machinekit.IconResource('machinekiticon.png')) mb.setWindowTitle('Machinekit') mb.setTextFormat(PySide.QtCore.Qt.TextFormat.RichText) mb.setText("<div align='center'>%s</div>" % '<br/>'.join(msg.messages())) if msg.isError(): mb.setIcon(PySide.QtGui.QMessageBox.Critical) elif msg.isText(): mb.setIcon(PySide.QtGui.QMessageBox.Information) else: mb.setIcon(PySide.QtGui.QMessageBox.NoIcon) mb.setStandardButtons(PySide.QtGui.QMessageBox.Ok) mb.exec_()
def _mkerror(mk, msg): '''Helper function to display an error in a message box.''' mb = PySide.QtGui.QMessageBox() mb.setWindowIcon(machinekit.IconResource('machinekiticon.svg')) mb.setWindowTitle('Machinekit') mb.setTextFormat(PySide.QtCore.Qt.TextFormat.RichText) mb.setText("<div align='center'>%s</div>" % '<br/>'.join([mk.name(), ''] + list(msg.messages()))) if msg.isError(): mb.setIcon(PySide.QtGui.QMessageBox.Critical) elif msg.isText(): mb.setIcon(PySide.QtGui.QMessageBox.Information) else: mb.setIcon(PySide.QtGui.QMessageBox.NoIcon) mb.setStandardButtons(PySide.QtGui.QMessageBox.Ok) mb.exec_()
def changed(self, service, msg): '''If MK's update includes a request for a tool change, present the user with a dialog box and ask for confirmation. On successful tool change update MK accordingly - if the user cancels the tool change abort the task in progress in MK.''' if msg.changeTool(): if 0 == msg.toolNumber(): PathLog.debug("TC clear") service.toolChanged(self.mk['halrcmd'], True) else: tc = self.getTC(msg.toolNumber()) if tc: msg = [ self.mk.name(), '', "Insert tool #%d" % tc.ToolNumber, "<i><b>\"%s\"</b></i>" % tc.Label ] else: msg = [ self.mk.name(), '', "Insert tool <b>#%d</b>" % msg.toolNumber() ] mb = PySide.QtGui.QMessageBox() mb.setWindowIcon(machinekit.IconResource('machinekiticon.svg')) mb.setWindowTitle('Machinekit') mb.setTextFormat(PySide.QtCore.Qt.TextFormat.RichText) mb.setText("<div align='center'>%s</div>" % '<br/>'.join(msg)) mb.setIcon(PySide.QtGui.QMessageBox.Warning) mb.setStandardButtons(PySide.QtGui.QMessageBox.Ok | PySide.QtGui.QMessageBox.Abort) if PySide.QtGui.QMessageBox.Ok == mb.exec_(): PathLog.debug("TC confirm") service.toolChanged(self.mk['halrcmd'], True) else: PathLog.debug("TC abort") self.mk['command'].sendCommand( MKCommand.MKCommandTaskAbort()) elif msg.toolChanged(): PathLog.debug('TC reset') service.toolChanged(self.mk['halrcmd'], False) else: PathLog.debug('TC -') pass
def scanJob(self, forward): PathLog.track() job = self.mk.getJob() if job and hasattr(job, 'Path') and job.Path: bb = job.Path.BoundBox if bb.isValid(): off = self.mk['status.motion.offset.g5x'] bb.move(FreeCAD.Vector(off['x'], off['y'], off['z'])) if self.mk.boundBox().isInside(bb): mkx = self.displayPos('x') mky = self.displayPos('y') begin = FreeCAD.Vector(mkx, mky, 0) pts = [] bb = job.Path.BoundBox if forward: pts.append(FreeCAD.Vector(bb.XMin, bb.YMin, 0)) pts.append(FreeCAD.Vector(bb.XMax, bb.YMin, 0)) pts.append(FreeCAD.Vector(bb.XMax, bb.YMax, 0)) pts.append(FreeCAD.Vector(bb.XMin, bb.YMax, 0)) else: pts.append(FreeCAD.Vector(bb.XMin, bb.YMin, 0)) pts.append(FreeCAD.Vector(bb.XMin, bb.YMax, 0)) pts.append(FreeCAD.Vector(bb.XMax, bb.YMax, 0)) pts.append(FreeCAD.Vector(bb.XMax, bb.YMin, 0)) dist = [begin.distanceToPoint(p) for p in pts] rot = dist.index(min(dist)) pts = pts[rot:] + pts[:rot] pts.append(pts[0]) PathLog.info(" begin = (%5.2f, %5.2f)" % (begin.x, begin.y)) for i, p in enumerate(pts): PathLog.info(" pts[%d] = (%5.2f, %5.2f)" % (i, p.x, p.y)) jog = [] if not PathGeom.pointsCoincide(begin, pts[0]): PathLog.info("Move to start point (%.2f, %.2f)" % (pts[0].x, pts[0].y)) jog.append(self._jogXYCmdsFromTo(begin, pts[0])) for i, j in zip(pts, pts[1:]): jog.append(self._jogXYCmdsFromTo(i, j)) sequence = [[cmd] for cmd in MKUtils.taskModeManual(self.mk)] sequence.extend(jog) self.mk['command'].sendCommandSequence(sequence) else: mbb = self.mk.boundBox() msg = ["Cannot scan job!"] if mbb.XMin > bb.XMin: msg.append("X limit min exceeded by: %.2f" % (mbb.XMin - bb.XMin)) if mbb.XMax < bb.XMax: msg.append("X limit max exceeded by: %.2f" % (bb.XMax - mbb.XMax)) if mbb.YMin > bb.YMin: msg.append("Y limit min exceeded by: %.2f" % (mbb.YMin - bb.YMin)) if mbb.YMax < bb.YMax: msg.append("Y limit max exceeded by: %.2f" % (bb.YMax - mbb.YMax)) if mbb.ZMin > bb.ZMin: msg.append("Z limit min exceeded by: %.2f" % (mbb.ZMin - bb.ZMin)) if mbb.ZMax < bb.ZMax: msg.append("Z limit max exceeded by: %.2f" % (bb.ZMax - mbb.ZMax)) mb = PySide.QtGui.QMessageBox() mb.setWindowIcon( machinekit.IconResource('machinekiticon.png')) mb.setWindowTitle('Machinekit') mb.setTextFormat(PySide.QtCore.Qt.TextFormat.RichText) mb.setText("<div align='center'>%s</div>" % '<br/>'.join(msg)) mb.setIcon(PySide.QtGui.QMessageBox.Critical) mb.setStandardButtons(PySide.QtGui.QMessageBox.Ok) mb.exec_() else: PathLog.error("BoundBox of job %s is not valid" % job.Label) else: PathLog.error('No job uploaded for scanning')