diff --git a/src/Mod/Path/Gui/Resources/panels/DlgToolCopy.ui b/src/Mod/Path/Gui/Resources/panels/DlgToolCopy.ui index 0f05cdc7ae85..a200d45b60d0 100644 --- a/src/Mod/Path/Gui/Resources/panels/DlgToolCopy.ui +++ b/src/Mod/Path/Gui/Resources/panels/DlgToolCopy.ui @@ -10,7 +10,7 @@ 0 0 367 - 119 + 98 @@ -33,16 +33,6 @@ - - - - Create Tool Controllers - - - true - - - diff --git a/src/Mod/Path/Gui/Resources/panels/ToolControl.ui b/src/Mod/Path/Gui/Resources/panels/ToolControl.ui index a7a69ff13dbd..25140cc194d1 100644 --- a/src/Mod/Path/Gui/Resources/panels/ToolControl.ui +++ b/src/Mod/Path/Gui/Resources/panels/ToolControl.ui @@ -7,7 +7,7 @@ 0 0 308 - 389 + 352 @@ -15,10 +15,25 @@ - - - true + + + QFrame::StyledPanel + + QFrame::Raised + + + + + + false + + + + + + + @@ -30,18 +45,15 @@ QFrame::Raised - - + + Unknown - - - - - + + Unknown @@ -54,6 +66,13 @@ + + + + Unknown + + + @@ -73,9 +92,6 @@ - - - @@ -83,9 +99,6 @@ - - - @@ -93,13 +106,6 @@ - - - - - - - @@ -107,10 +113,43 @@ + + + + 0.000000000000000 + + + mm/s + + + + + + + 0.000000000000000 + + + mm/s + + + + + + + 0.000000000000000 + + + mm/s + + + - - - + + + 0.000000000000000 + + + mm/s @@ -159,6 +198,13 @@ + + + Gui::InputField + QLineEdit +
Gui/InputField.h
+
+
diff --git a/src/Mod/Path/PathScripts/PathJob.py b/src/Mod/Path/PathScripts/PathJob.py index 036e927e79a0..71f2400e1e63 100644 --- a/src/Mod/Path/PathScripts/PathJob.py +++ b/src/Mod/Path/PathScripts/PathJob.py @@ -67,7 +67,7 @@ def __init__(self, obj): obj.PostProcessorArgs = PathPreferences.defaultPostProcessorArgs() obj.addProperty("App::PropertyString", "MachineName", "Output", QtCore.QT_TRANSLATE_NOOP("App::Property","Name of the Machine that will use the CNC program")) - obj.addProperty("Path::PropertyTooltable", "Tooltable", "Base", QtCore.QT_TRANSLATE_NOOP("App::Property","The tooltable used for this CNC program")) + #obj.addProperty("Path::PropertyTooltable", "Tooltable", "Base", QtCore.QT_TRANSLATE_NOOP("App::Property","The tooltable used for this CNC program")) obj.addProperty("App::PropertyEnumeration", "MachineUnits", "Output", QtCore.QT_TRANSLATE_NOOP("App::Property","Units that the machine works in, ie Metric or Inch")) obj.MachineUnits = ['Metric', 'Inch'] @@ -206,15 +206,6 @@ def Create(): obj = FreeCAD.ActiveDocument.addObject("Path::FeatureCompoundPython", "Job") PathScripts.PathJob.ObjectPathJob(obj) PathLoadTool.CommandPathLoadTool.Create(obj.Name) -tl = obj.Group[0] -tool = Path.Tool() -tool.Diameter = 5.0 -tool.Name = "Default Tool" -tool.CuttingEdgeHeight = 15.0 -tool.ToolType = "EndMill" -tool.Material = "HighSpeedSteel" -obj.Tooltable.addTools(tool) -tl.ToolNumber = 1 obj.ViewObject.Proxy.deleteOnReject = True obj.ViewObject.startEditing() ''' diff --git a/src/Mod/Path/PathScripts/PathLoadTool.py b/src/Mod/Path/PathScripts/PathLoadTool.py index d5fd34602d23..56bdd55e3df3 100644 --- a/src/Mod/Path/PathScripts/PathLoadTool.py +++ b/src/Mod/Path/PathScripts/PathLoadTool.py @@ -30,6 +30,11 @@ import Part import PathScripts from PySide import QtCore, QtGui +import PathScripts.PathLog as PathLog + +LOG_MODULE = 'PathLoadTool' +PathLog.setLevel(PathLog.Level.DEBUG, LOG_MODULE) +PathLog.trackModule('PathLoadTool') # Qt tanslation handling try: @@ -43,14 +48,18 @@ def translate(context, text, disambig=None): class LoadTool(): - def __init__(self, obj): - obj.addProperty("App::PropertyIntegerConstraint", "ToolNumber", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property","The active tool")) + def __init__(self, obj, tool=1): + PathLog.track('tool: {}'.format(tool)) + + obj.addProperty("App::PropertyIntegerConstraint", "ToolNumber", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property", "The active tool")) obj.ToolNumber = (0, 0, 10000, 1) - obj.addProperty("App::PropertyFloat", "SpindleSpeed", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property","The speed of the cutting spindle in RPM")) - obj.addProperty("App::PropertyEnumeration", "SpindleDir", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property","Direction of spindle rotation")) + obj.addProperty("Path::PropertyTooltable", "Tooltable", "Base", QtCore.QT_TRANSLATE_NOOP("App::Property", "The tooltable used for this CNC program")) + + obj.addProperty("App::PropertyFloat", "SpindleSpeed", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property", "The speed of the cutting spindle in RPM")) + obj.addProperty("App::PropertyEnumeration", "SpindleDir", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property", "Direction of spindle rotation")) obj.SpindleDir = ['Forward', 'Reverse'] - obj.addProperty("App::PropertySpeed", "VertFeed", "Feed", QtCore.QT_TRANSLATE_NOOP("App::Property","Feed rate for vertical moves in Z")) - obj.addProperty("App::PropertySpeed", "HorizFeed", "Feed", QtCore.QT_TRANSLATE_NOOP("App::Property","Feed rate for horizontal moves")) + obj.addProperty("App::PropertySpeed", "VertFeed", "Feed", QtCore.QT_TRANSLATE_NOOP("App::Property", "Feed rate for vertical moves in Z")) + obj.addProperty("App::PropertySpeed", "HorizFeed", "Feed", QtCore.QT_TRANSLATE_NOOP("App::Property", "Feed rate for horizontal moves")) obj.addProperty("App::PropertySpeed", "VertRapid", "Rapid", QtCore.QT_TRANSLATE_NOOP("App::Property", "Rapid rate for vertical moves in Z")) obj.addProperty("App::PropertySpeed", "HorizRapid", "Rapid", QtCore.QT_TRANSLATE_NOOP("App::Property", "Rapid rate for horizontal moves")) obj.Proxy = self @@ -58,39 +67,48 @@ def __init__(self, obj): obj.setEditorMode('Placement', mode) def execute(self, obj): - tool = PathUtils.getTool(obj, obj.ToolNumber) - if tool is not None: - obj.Label = obj.Name + ": " + tool.Name - else: - obj.Label = obj.Name + ": UNDEFINED TOOL" + PathLog.track() + toolnum = obj.Tooltable.Tools.keys()[0] commands = "" commands += "(" + obj.Label + ")"+'\n' - commands += 'M6T'+str(obj.ToolNumber)+'\n' + commands += 'M6T'+str(toolnum)+'\n' if obj.SpindleDir == 'Forward': commands += 'M3S' + str(obj.SpindleSpeed) + '\n' - else: commands += 'M4S' + str(obj.SpindleSpeed) + '\n' - # print output if commands == "": commands += "(No commands processed)" - path = Path.Path(commands) obj.Path = path if obj.ViewObject: obj.ViewObject.Visibility = True def onChanged(self, obj, prop): - if prop == "ToolNumber" and not 'Restore' in obj.State: - job = PathUtils.findParentJob(obj) - if job is not None: - for g in job.Group: - if not(isinstance(g.Proxy, PathScripts.PathLoadTool.LoadTool)): - g.touch() + PathLog.track('prop: {}'.format(prop)) + + if 'Restore' not in obj.State: + if prop == "ToolNumber": + toolitem = obj.Tooltable.Tools.popitem() + oldtoolnum = toolitem[0] + tool = toolitem[1] + obj.Tooltable.deleteTool(oldtoolnum) + obj.Tooltable.setTool(obj.ToolNumber, tool) + else: + job = PathUtils.findParentJob(obj) + if job is not None: + for g in job.Group: + if not(isinstance(g.Proxy, PathScripts.PathLoadTool.LoadTool)): + g.touch() + + def getTool(self, obj): + '''returns the tool associated with this tool controller''' + PathLog.track() + toolitem = obj.Tooltable.Tools.popitem() + return toolitem[1] class _ViewProviderLoadTool: @@ -163,31 +181,41 @@ def IsActive(self): return False def Activated(self): - FreeCAD.ActiveDocument.openTransaction(translate("Path_LoadTool", "Create Tool Controller Object")) - snippet = ''' -import Path, PathScripts -from PathScripts import PathUtils, PathLoadTool - -obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython","TC") -PathScripts.PathLoadTool.LoadTool(obj) -PathScripts.PathLoadTool._ViewProviderLoadTool(obj.ViewObject) - -PathUtils.addToJob(obj) -''' - FreeCADGui.doCommand(snippet) - FreeCAD.ActiveDocument.commitTransaction() - FreeCAD.ActiveDocument.recompute() + PathLog.track() + self.Create() + +# FreeCAD.ActiveDocument.openTransaction(translate("Path_LoadTool", "Create Tool Controller Object")) + +# obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "TC") +# PathScripts.PathLoadTool.LoadTool(obj) +# PathScripts.PathLoadTool._ViewProviderLoadTool(obj.ViewObject) + +# PathUtils.addToJob(obj) + +# FreeCAD.ActiveDocument.commitTransaction() +# FreeCAD.ActiveDocument.recompute() @staticmethod - def Create(jobname = None, assignViewProvider = True): + def Create(jobname=None, assignViewProvider=True, tool=None, toolNumber=1): + PathLog.track("tool: {} with toolNumber: {}".format(tool, toolNumber)) + import PathScripts import PathUtils - obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "TC") + obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "Default Tool") PathScripts.PathLoadTool.LoadTool(obj) if assignViewProvider: PathScripts.PathLoadTool._ViewProviderLoadTool(obj.ViewObject) + if tool is None: + tool = Path.Tool() + tool.Diameter = 5.0 + tool.Name = "Default Tool" + tool.CuttingEdgeHeight = 15.0 + tool.ToolType = "EndMill" + tool.Material = "HighSpeedSteel" + obj.Tooltable.setTool(toolNumber, tool) + obj.ToolNumber = toolNumber PathUtils.addToJob(obj, jobname) @@ -198,7 +226,6 @@ def __init__(self): self.updating = False self.toolrep = None - def accept(self): self.getFields() @@ -209,7 +236,6 @@ def accept(self): FreeCAD.ActiveDocument.recompute() FreeCADGui.Selection.removeObserver(self.s) - def reject(self): FreeCADGui.Control.closeDialog() if self.toolrep is not None: @@ -230,7 +256,8 @@ def getFields(self): self.obj.VertRapid = self.form.vertRapid.text() if hasattr(self.obj, "HorizRapid"): self.obj.HorizRapid = self.form.horizRapid.text() - + if hasattr(self.obj, "ToolNumber"): + self.obj.ToolNumber = self.form.uiToolNum.value() if hasattr(self.obj, "SpindleSpeed"): self.obj.SpindleSpeed = self.form.spindleSpeed.value() if hasattr(self.obj, "SpindleDir"): @@ -239,65 +266,42 @@ def getFields(self): self.obj.Proxy.execute(self.obj) def setFields(self): - self.form.cboToolSelect.blockSignals(True) - + self.form.tcoName.setText(self.obj.Label) + self.form.uiToolNum.setValue(self.obj.ToolNumber) self.form.vertFeed.setText(str(self.obj.VertFeed.Value)) self.form.horizFeed.setText(str(self.obj.HorizFeed.Value)) self.form.vertRapid.setText(str(self.obj.VertRapid.Value)) self.form.horizRapid.setText(str(self.obj.HorizRapid.Value)) self.form.spindleSpeed.setValue(self.obj.SpindleSpeed) - self.form.tcoName.setText(str(self.obj.Label)) index = self.form.cboSpindleDirection.findText(self.obj.SpindleDir, QtCore.Qt.MatchFixedString) if index >= 0: self.form.cboSpindleDirection.setCurrentIndex(index) - myJob = PathUtils.findParentJob(self.obj) - - #populate the toolselector and select correct tool - self.form.cboToolSelect.clear() - tooltable = myJob.Tooltable - for number, tool in tooltable.Tools.iteritems(): - self.form.cboToolSelect.addItem(tool.Name) + tooltable = self.obj.Tooltable try: - tool = myJob.Tooltable.Tools[self.obj.ToolNumber] + toolnum = tooltable.Tools.keys()[0] + tool = tooltable.getTool(toolnum) self.form.txtToolType.setText(tool.ToolType) self.form.txtToolMaterial.setText(tool.Material) self.form.txtToolDiameter.setText(str(tool.Diameter)) - - index = self.form.cboToolSelect.findText(tool.Name, QtCore.Qt.MatchFixedString) - if index >= 0: - self.form.cboToolSelect.setCurrentIndex(index) - + self.form.txtToolName.setText(tool.Name) except: - self.form.cboToolSelect.setCurrentIndex(-1) self.form.txtToolType.setText("UNDEFINED") self.form.txtToolMaterial.setText("UNDEFINED") self.form.txtToolDiameter.setText("UNDEFINED") - self.form.cboToolSelect.blockSignals(False) radius = tool.Diameter / 2 length = tool.CuttingEdgeHeight t = Part.makeCylinder(radius, length) self.toolrep.Shape = t - def changeTool(self): - myJob = PathUtils.findParentJob(self.obj) - newtool = self.form.cboToolSelect.currentText() - - tooltable = myJob.Tooltable - for number, tool in tooltable.Tools.iteritems(): - if tool.Name == newtool: - self.obj.ToolNumber = number - self.setFields() - def open(self): self.s = SelObserver() # install the function mode resident FreeCADGui.Selection.addObserver(self.s) - def getStandardButtons(self): return int(QtGui.QDialogButtonBox.Ok) @@ -310,19 +314,15 @@ def resetObject(self, remove=None): FreeCAD.ActiveDocument.recompute() def setupUi(self): - - self.form.cboToolSelect.currentIndexChanged.connect(self.changeTool) self.form.tcoName.editingFinished.connect(self.getFields) - # build the tool representation - if self.obj.ToolNumber != 0: - t = Part.makeCylinder(1, 1) - self.toolrep = FreeCAD.ActiveDocument.addObject("Part::Feature", "tool") - self.toolrep.Shape = t + t = Part.makeCylinder(1, 1) + self.toolrep = FreeCAD.ActiveDocument.addObject("Part::Feature", "tool") + self.toolrep.Shape = t - # setup the form fields self.setFields() + class SelObserver: def __init__(self): pass @@ -330,7 +330,6 @@ def __init__(self): def __del__(self): pass - if FreeCAD.GuiUp: # register the FreeCAD command FreeCADGui.addCommand('Path_LoadTool', CommandPathLoadTool()) diff --git a/src/Mod/Path/PathScripts/PathToolLibraryManager.py b/src/Mod/Path/PathScripts/PathToolLibraryManager.py index d84797137a66..f2cf5b5a37b1 100644 --- a/src/Mod/Path/PathScripts/PathToolLibraryManager.py +++ b/src/Mod/Path/PathScripts/PathToolLibraryManager.py @@ -29,6 +29,8 @@ import Path import os from PySide import QtCore, QtGui +import PathScripts +import PathUtils try: _encoding = QtGui.QApplication.UnicodeUTF8 @@ -561,19 +563,25 @@ def copyTools(self): targetlist = form.cboTarget.currentText() for toolnum in tools: tool = self.TLM.getTool(currList, int(toolnum)) - newtoolid = self.TLM.addnew(targetlist, tool.copy(), int(toolnum)) - if form.chkMakeController.checkState() == QtCore.Qt.CheckState.Checked and targetlist != "
": - snippet = ''' -import Path, PathScripts -from PathScripts import PathUtils, PathLoadTool -obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython","TC") -PathScripts.PathLoadTool.LoadTool(obj) -PathScripts.PathLoadTool._ViewProviderLoadTool(obj.ViewObject) -obj.ToolNumber = %d -PathUtils.addToJob(obj, "%s") -App.activeDocument().recompute() -''' % (newtoolid, targetlist) - FreeCADGui.doCommand(snippet) + for i in FreeCAD.ActiveDocument.findObjects("Path::Feature"): + if isinstance(i.Proxy, PathScripts.PathJob.ObjectPathJob) and i.Label == targetlist: + + #if form.chkMakeController.checkState() == QtCore.Qt.CheckState.Checked and targetlist != "
": + # snippet = ''' +#import Path, PathScripts +#from PathScripts import PathUtils, PathLoadTool + obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython","TC") + PathScripts.PathLoadTool.LoadTool(obj) + PathScripts.PathLoadTool._ViewProviderLoadTool(obj.ViewObject) + #obj.ToolNumber = %d + PathUtils.addToJob(obj, targetlist) + FreeCAD.activeDocument().recompute() + obj.tooltable.setTool(tool.copy(), int(toolnum)) + else: + newtoolid = self.TLM.addnew(targetlist, tool.copy(), int(toolnum)) + +#''' % (newtoolid, targetlist) + # FreeCADGui.doCommand(snippet) def getStandardButtons(self): return int(QtGui.QDialogButtonBox.Ok)