コード例 #1
0
 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__')
コード例 #2
0
 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
コード例 #3
0
 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))
コード例 #4
0
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_()
コード例 #5
0
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_()
コード例 #6
0
 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
コード例 #7
0
    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')