diff --git a/src/Mod/Path/PathScripts/PathContour.py b/src/Mod/Path/PathScripts/PathContour.py index 69b1a9541a..395ca476f3 100644 --- a/src/Mod/Path/PathScripts/PathContour.py +++ b/src/Mod/Path/PathScripts/PathContour.py @@ -222,19 +222,20 @@ class ObjectContour: if baseobject is None: return - if isinstance(baseobject.Proxy, ArchPanel.PanelSheet): # process the sheet - baseobject.Proxy.execute(baseobject) - for subobj in baseobject.Group: # process the group of panels - if isinstance(subobj.Proxy, ArchPanel.PanelCut): - subobj.Proxy.execute(subobj) - contourwire = TechDraw.findOuterWire(subobj.Shape.Edges) - if contourwire is not None: - edgelist = contourwire.Edges - edgelist = Part.__sortEdges__(edgelist) - try: - output += self._buildPathLibarea(obj, edgelist) - except: - FreeCAD.Console.PrintError("Something unexpected happened. Unable to generate a contour path. Check project and tool config.") + if hasattr(baseobject, "Proxy"): + if isinstance(baseobject.Proxy, ArchPanel.PanelSheet): # process the sheet + baseobject.Proxy.execute(baseobject) + for subobj in baseobject.Group: # process the group of panels + if isinstance(subobj.Proxy, ArchPanel.PanelCut): + subobj.Proxy.execute(subobj) + contourwire = TechDraw.findOuterWire(subobj.Shape.Edges) + if contourwire is not None: + edgelist = contourwire.Edges + edgelist = Part.__sortEdges__(edgelist) + try: + output += self._buildPathLibarea(obj, edgelist) + except: + FreeCAD.Console.PrintError("Something unexpected happened. Unable to generate a contour path. Check project and tool config.") else: contourwire = TechDraw.findShapeOutline(baseobject.Shape, 1, Vector(0, 0, 1)) diff --git a/src/Mod/Path/PathScripts/PathDressupHoldingTags.py b/src/Mod/Path/PathScripts/PathDressupHoldingTags.py index 150d22ca02..4b132748e7 100644 --- a/src/Mod/Path/PathScripts/PathDressupHoldingTags.py +++ b/src/Mod/Path/PathScripts/PathDressupHoldingTags.py @@ -912,15 +912,31 @@ class ObjectDressup: return None self.toolRadius = 5 - toolLoad = PathUtils.getLastToolLoad(obj) + # toolLoad = PathUtils.getLastToolLoad(obj) + # if toolLoad is None or toolLoad.ToolNumber == 0: + # self.toolRadius = 5 + # else: + # tool = PathUtils.getTool(obj, toolLoad.ToolNumber) + # if not tool or tool.Diameter == 0: + # self.toolRadius = 5 + # else: + # self.toolRadius = tool.Diameter / 2 + toolLoad = obj.Base.ToolController if toolLoad is None or toolLoad.ToolNumber == 0: - self.toolRadius = 5 + PathLog.error(translate("No Tool Controller is selected. We need a tool to build a Path\n")) + #return else: - tool = PathUtils.getTool(obj, toolLoad.ToolNumber) + # self.vertFeed = toolLoad.VertFeed.Value + # self.horizFeed = toolLoad.HorizFeed.Value + # self.vertRapid = toolLoad.VertRapid.Value + # self.horizRapid = toolLoad.HorizRapid.Value + tool = toolLoad.Proxy.getTool(toolLoad) if not tool or tool.Diameter == 0: - self.toolRadius = 5 + PathLog.error(translate("No Tool found or diameter is zero. We need a tool to build a Path.\n")) + return else: - self.toolRadius = tool.Diameter / 2 + self.toolRadius = tool.Diameter/2 + self.pathData = pathData if generate: obj.Height = self.pathData.defaultTagHeight() diff --git a/src/Mod/Path/PathScripts/PathPocket.py b/src/Mod/Path/PathScripts/PathPocket.py index 4d8c4fae8b..81773d034a 100644 --- a/src/Mod/Path/PathScripts/PathPocket.py +++ b/src/Mod/Path/PathScripts/PathPocket.py @@ -26,6 +26,7 @@ import FreeCAD import Path from PySide import QtCore, QtGui from PathScripts import PathUtils +import PathScripts.PathLog as PathLog FreeCADGui = None if FreeCAD.GuiUp: @@ -33,6 +34,10 @@ if FreeCAD.GuiUp: """Path Pocket object and FreeCAD command""" +LOG_MODULE = 'PathPocket' +PathLog.setLevel(PathLog.Level.INFO, LOG_MODULE) +# PathLog.trackModule('PathPocket') + # Qt tanslation handling try: _encoding = QtGui.QApplication.UnicodeUTF8 @@ -47,55 +52,49 @@ except AttributeError: class ObjectPocket: def __init__(self, obj): - obj.addProperty("App::PropertyLinkSubList", "Base", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property","The base geometry of this object")) - obj.addProperty("App::PropertyBool", "Active", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property","Make False, to prevent operation from generating code")) - obj.addProperty("App::PropertyString", "Comment", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property","An optional comment for this profile")) - obj.addProperty("App::PropertyString", "UserLabel", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property","User Assigned Label")) + obj.addProperty("App::PropertyLinkSubList", "Base", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The base geometry of this object")) + obj.addProperty("App::PropertyBool", "Active", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "Make False, to prevent operation from generating code")) + obj.addProperty("App::PropertyString", "Comment", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "An optional comment for this profile")) + obj.addProperty("App::PropertyString", "UserLabel", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "User Assigned Label")) - obj.addProperty("App::PropertyEnumeration", "Algorithm", "Algorithm", QtCore.QT_TRANSLATE_NOOP("App::Property","The library to use to generate the path")) + obj.addProperty("App::PropertyEnumeration", "Algorithm", "Algorithm", QtCore.QT_TRANSLATE_NOOP("App::Property", "The library to use to generate the path")) obj.Algorithm = ['OCC Native', 'libarea'] # Tool Properties - obj.addProperty("App::PropertyIntegerConstraint", "ToolNumber", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property","The tool number in use")) - obj.ToolNumber = (0, 0, 1000, 0) - obj.setEditorMode('ToolNumber', 1) # make this read only - obj.addProperty("App::PropertyString", "ToolDescription", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property","The description of the tool ")) - obj.setEditorMode('ToolDescription', 1) # make this read only + obj.addProperty("App::PropertyLink", "ToolController", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The tool controller that will be used to calculate the path")) # Depth Properties - obj.addProperty("App::PropertyDistance", "ClearanceHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","The height needed to clear clamps and obstructions")) - obj.addProperty("App::PropertyDistance", "SafeHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Rapid Safety Height between locations.")) - obj.addProperty("App::PropertyDistance", "StepDown", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Incremental Step Down of Tool")) - #obj.StepDown = (0.0, 0.01, 100.0, 0.5) - obj.addProperty("App::PropertyDistance", "StartDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Starting Depth of Tool- first cut depth in Z")) - obj.addProperty("App::PropertyDistance", "FinalDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Final Depth of Tool- lowest value in Z")) - obj.addProperty("App::PropertyDistance", "FinishDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Maximum material removed on final pass.")) + obj.addProperty("App::PropertyDistance", "ClearanceHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "The height needed to clear clamps and obstructions")) + obj.addProperty("App::PropertyDistance", "SafeHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Rapid Safety Height between locations.")) + obj.addProperty("App::PropertyDistance", "StepDown", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Incremental Step Down of Tool")) + obj.addProperty("App::PropertyDistance", "StartDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Starting Depth of Tool- first cut depth in Z")) + obj.addProperty("App::PropertyDistance", "FinalDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Final Depth of Tool- lowest value in Z")) + obj.addProperty("App::PropertyDistance", "FinishDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Maximum material removed on final pass.")) # Pocket Properties - obj.addProperty("App::PropertyEnumeration", "CutMode", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property","The direction that the toolpath should go around the part ClockWise CW or CounterClockWise CCW")) + obj.addProperty("App::PropertyEnumeration", "CutMode", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property", "The direction that the toolpath should go around the part ClockWise CW or CounterClockWise CCW")) obj.CutMode = ['Climb', 'Conventional'] - obj.addProperty("App::PropertyDistance", "MaterialAllowance", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property","Amount of material to leave")) - obj.addProperty("App::PropertyEnumeration", "StartAt", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property","Start pocketing at center or boundary")) + obj.addProperty("App::PropertyDistance", "MaterialAllowance", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property", "Amount of material to leave")) + obj.addProperty("App::PropertyEnumeration", "StartAt", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property", "Start pocketing at center or boundary")) obj.StartAt = ['Center', 'Edge'] - obj.addProperty("App::PropertyPercent", "StepOver", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property","Percent of cutter diameter to step over on each pass")) - # obj.StepOver = (0.0, 0.01, 100.0, 0.5) - obj.addProperty("App::PropertyBool", "KeepToolDown", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property","Attempts to avoid unnecessary retractions.")) - obj.addProperty("App::PropertyBool", "ZigUnidirectional", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property","Lifts tool at the end of each pass to respect cut mode.")) - obj.addProperty("App::PropertyBool", "UseZigZag", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property","Use Zig Zag pattern to clear area.")) - obj.addProperty("App::PropertyFloat", "ZigZagAngle", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property","Angle of the zigzag pattern")) + obj.addProperty("App::PropertyPercent", "StepOver", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property", "Percent of cutter diameter to step over on each pass")) + obj.addProperty("App::PropertyBool", "KeepToolDown", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property", "Attempts to avoid unnecessary retractions.")) + obj.addProperty("App::PropertyBool", "ZigUnidirectional", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property", "Lifts tool at the end of each pass to respect cut mode.")) + obj.addProperty("App::PropertyBool", "UseZigZag", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property", "Use Zig Zag pattern to clear area.")) + obj.addProperty("App::PropertyFloat", "ZigZagAngle", "Pocket", QtCore.QT_TRANSLATE_NOOP("App::Property", "Angle of the zigzag pattern")) # Entry Properties - obj.addProperty("App::PropertyBool", "UseEntry", "Entry", QtCore.QT_TRANSLATE_NOOP("App::Property","Allow Cutter enter material with a straight plunge.")) - obj.addProperty("App::PropertyFloatConstraint", "RampSize", "Entry", QtCore.QT_TRANSLATE_NOOP("App::Property","The minimum fraction of tool diameter to use for ramp length")) + obj.addProperty("App::PropertyBool", "UseEntry", "Entry", QtCore.QT_TRANSLATE_NOOP("App::Property", "Allow Cutter enter material with a straight plunge.")) + obj.addProperty("App::PropertyFloatConstraint", "RampSize", "Entry", QtCore.QT_TRANSLATE_NOOP("App::Property", "The minimum fraction of tool diameter to use for ramp length")) obj.RampSize = (0.0, 0.01, 100.0, 0.5) - obj.addProperty("App::PropertyFloatConstraint", "HelixSize", "Entry", QtCore.QT_TRANSLATE_NOOP("App::Property","The fraction of tool diameter to use for calculating helix size.")) + obj.addProperty("App::PropertyFloatConstraint", "HelixSize", "Entry", QtCore.QT_TRANSLATE_NOOP("App::Property", "The fraction of tool diameter to use for calculating helix size.")) obj.HelixSize = (0.0, 0.01, 100.0, 0.5) - obj.addProperty("App::PropertyFloatConstraint", "RampAngle", "Entry", QtCore.QT_TRANSLATE_NOOP("App::Property","The Angle of the ramp entry.")) + obj.addProperty("App::PropertyFloatConstraint", "RampAngle", "Entry", QtCore.QT_TRANSLATE_NOOP("App::Property", "The Angle of the ramp entry.")) obj.RampAngle = (0.0, 0.01, 100.0, 0.5) # Start Point Properties - obj.addProperty("App::PropertyVector", "StartPoint", "Start Point", QtCore.QT_TRANSLATE_NOOP("App::Property","The start point of this path")) - obj.addProperty("App::PropertyBool", "UseStartPoint", "Start Point", QtCore.QT_TRANSLATE_NOOP("App::Property","make True, if specifying a Start Point")) + obj.addProperty("App::PropertyVector", "StartPoint", "Start Point", QtCore.QT_TRANSLATE_NOOP("App::Property", "The start point of this path")) + obj.addProperty("App::PropertyBool", "UseStartPoint", "Start Point", QtCore.QT_TRANSLATE_NOOP("App::Property", "make True, if specifying a Start Point")) obj.Proxy = self @@ -338,14 +337,14 @@ class ObjectPocket: else: output += "G3" output += " X" + fmt(point.x) + " Y" + fmt(point.y) + " Z" + fmt(vpos) - output += " I" + fmt(relcenter.x) + " J" + fmt(relcenter.y) + " K" + fmt(relcenter.z) + " F" + fmt(self.horizFeed) + output += " I" + fmt(relcenter.x) + " J" + fmt(relcenter.y) + " K" + fmt(relcenter.z) + " F" + fmt(self.horizFeed) output += "\n" last = point else: point = edge.Vertexes[-1].Point if point == last: # edges can come flipped point = edge.Vertexes[0].Point - output += "G1 X" + fmt(point.x) + " Y" + fmt(point.y) + " Z" + fmt(vpos) + " F" + fmt(self.horizFeed) + "\n" + output += "G1 X" + fmt(point.x) + " Y" + fmt(point.y) + " Z" + fmt(vpos) + " F" + fmt(self.horizFeed) + "\n" last = point # move back up @@ -355,34 +354,21 @@ class ObjectPocket: # To reload this from FreeCAD, use: import PathScripts.PathPocket; reload(PathScripts.PathPocket) def execute(self, obj): output = "" - toolLoad = PathUtils.getLastToolLoad(obj) + + toolLoad = obj.ToolController if toolLoad is None or toolLoad.ToolNumber == 0: - self.vertFeed = 100 - self.horizFeed = 100 - self.vertRapid = 100 - self.horiRrapid = 100 - self.radius = 0.25 - obj.ToolNumber = 0 - obj.ToolDescription = "UNDEFINED" + FreeCAD.Console.PrintError("No Tool Controller is selected. We need a tool to build a Path.") else: self.vertFeed = toolLoad.VertFeed.Value self.horizFeed = toolLoad.HorizFeed.Value self.vertRapid = toolLoad.VertRapid.Value self.horizRapid = toolLoad.HorizRapid.Value - tool = PathUtils.getTool(obj, toolLoad.ToolNumber) - if tool.Diameter == 0: - self.radius = 0.25 + tool = toolLoad.Proxy.getTool(toolLoad) + if not tool or tool.Diameter == 0: + FreeCAD.Console.PrintError("No Tool found or diameter is zero. We need a tool to build a Path.") + return else: self.radius = tool.Diameter/2 - obj.ToolNumber = toolLoad.ToolNumber - obj.ToolDescription = toolLoad.Name - - output += "(" + obj.Label + ")" - - if obj.UserLabel == "": - obj.Label = obj.Name + " :" + obj.ToolDescription - else: - obj.Label = obj.UserLabel + " :" + obj.ToolDescription if obj.Base: for b in obj.Base: @@ -571,6 +557,11 @@ class TaskPanel: if hasattr(self.obj, "StepOver"): self.obj.StepOver = self.form.stepOverPercent.value() + if hasattr(self.obj, "ToolController"): + PathLog.debug("name: {}".format(self.form.uiToolController.currentText())) + tc = PathUtils.findToolController(self.obj, self.form.uiToolController.currentText()) + self.obj.ToolController = tc + self.obj.Proxy.execute(self.obj) def setFields(self): @@ -607,6 +598,22 @@ class TaskPanel: self.form.baseList.addItem(i[0].Name + "." + sub) self.form.baseList.blockSignals(False) + controllers = PathUtils.getToolControllers(self.obj) + labels = [c.Label for c in controllers] + self.form.uiToolController.blockSignals(True) + self.form.uiToolController.addItems(labels) + self.form.uiToolController.blockSignals(False) + if self.obj.ToolController is not None: + index = self.form.uiToolController.findText( + self.obj.ToolController.Label, QtCore.Qt.MatchFixedString) + PathLog.debug("searching for TC label {}. Found Index: {}".format(self.obj.ToolController.Label, index)) + if index >= 0: + self.form.uiToolController.blockSignals(True) + self.form.uiToolController.setCurrentIndex(index) + self.form.uiToolController.blockSignals(False) + else: + self.obj.ToolController = PathUtils.findToolController(self.obj) + def open(self): self.s = SelObserver() # install the function mode resident @@ -693,6 +700,7 @@ class TaskPanel: self.form.addBase.clicked.connect(self.addBase) self.form.deleteBase.clicked.connect(self.deleteBase) self.form.reorderBase.clicked.connect(self.reorderBase) + self.form.uiToolController.currentIndexChanged.connect(self.getFields) # Depths self.form.startDepth.editingFinished.connect(self.getFields) diff --git a/src/Mod/Path/PathScripts/PathProfile.py b/src/Mod/Path/PathScripts/PathProfile.py index 6265ec6e37..f47b082e93 100644 --- a/src/Mod/Path/PathScripts/PathProfile.py +++ b/src/Mod/Path/PathScripts/PathProfile.py @@ -29,6 +29,11 @@ import TechDraw from FreeCAD import Vector from PathScripts import PathUtils from PathScripts.PathUtils import depth_params +import PathScripts.PathLog as PathLog + +LOG_MODULE = 'PathProfile' +PathLog.setLevel(PathLog.Level.INFO, LOG_MODULE) +# PathLog.trackModule('PathProfile') if FreeCAD.GuiUp: import FreeCADGui @@ -61,11 +66,8 @@ class ObjectProfile: obj.addProperty("App::PropertyString", "Comment", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "An optional comment for this profile")) obj.addProperty("App::PropertyString", "UserLabel", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "User Assigned Label")) - obj.addProperty("App::PropertyIntegerConstraint", "ToolNumber", "Tool", "The tool number in use") - obj.ToolNumber = (0, 0, 1000, 1) - obj.setEditorMode('ToolNumber', 1) # make this read only - obj.addProperty("App::PropertyString", "ToolDescription", "Tool", "The description of the tool ") - obj.setEditorMode('ToolDescription', 1) # make this read only + # Tool Properties + obj.addProperty("App::PropertyLink", "ToolController", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The tool controller that will be used to calculate the path")) # Depth Properties obj.addProperty("App::PropertyDistance", "ClearanceHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "The height needed to clear clamps and obstructions")) @@ -153,6 +155,9 @@ class ObjectProfile: import PathScripts.PathKurveUtils as PathKurveUtils # import math # import area + + PathLog.track("edgelist: {} \n".format(edgelist)) + output = "" if obj.Comment != "": output += '(' + str(obj.Comment)+')\n' @@ -222,33 +227,21 @@ print "y - " + str(point.y) import Part # math #DraftGeomUtils output = "" - toolLoad = PathUtils.getLastToolLoad(obj) - + toolLoad = obj.ToolController if toolLoad is None or toolLoad.ToolNumber == 0: - self.vertFeed = 100 - self.horizFeed = 100 - self.vertRapid = 100 - self.horizRapid = 100 - self.radius = 0.25 - obj.ToolNumber = 0 - obj.ToolDescription = "UNDEFINED" + FreeCAD.Console.PrintError("No Tool Controller is selected. We need a tool to build a Path.") + #return else: self.vertFeed = toolLoad.VertFeed.Value self.horizFeed = toolLoad.HorizFeed.Value self.vertRapid = toolLoad.VertRapid.Value self.horizRapid = toolLoad.HorizRapid.Value - tool = PathUtils.getTool(obj, toolLoad.ToolNumber) - if tool.Diameter == 0: - self.radius = 0.25 + tool = toolLoad.Proxy.getTool(toolLoad) + if not tool or tool.Diameter == 0: + FreeCAD.Console.PrintError("No Tool found or diameter is zero. We need a tool to build a Path.") + return else: self.radius = tool.Diameter/2 - obj.ToolNumber = toolLoad.ToolNumber - obj.ToolDescription = toolLoad.Name - - if obj.UserLabel == "": - obj.Label = obj.Name + " :" + obj.ToolDescription - else: - obj.Label = obj.UserLabel + " :" + obj.ToolDescription output += "(" + obj.Label + ")" if obj.Side != "On": @@ -454,6 +447,11 @@ class TaskPanel: self.obj.processHoles = self.form.processHoles.isChecked() if hasattr(self.obj, "processPerimeter"): self.obj.processPerimeter = self.form.processPerimeter.isChecked() + if hasattr(self.obj, "ToolController"): + PathLog.debug("name: {}".format(self.form.uiToolController.currentText())) + tc = PathUtils.findToolController(self.obj, self.form.uiToolController.currentText()) + self.obj.ToolController = tc + self.obj.Proxy.execute(self.obj) def setFields(self): @@ -484,6 +482,22 @@ class TaskPanel: self.form.direction.setCurrentIndex(index) self.form.direction.blockSignals(False) + controllers = PathUtils.getToolControllers(self.obj) + labels = [c.Label for c in controllers] + self.form.uiToolController.blockSignals(True) + self.form.uiToolController.addItems(labels) + self.form.uiToolController.blockSignals(False) + if self.obj.ToolController is not None: + index = self.form.uiToolController.findText( + self.obj.ToolController.Label, QtCore.Qt.MatchFixedString) + PathLog.debug("searching for TC label {}. Found Index: {}".format(self.obj.ToolController.Label, index)) + if index >= 0: + self.form.uiToolController.blockSignals(True) + self.form.uiToolController.setCurrentIndex(index) + self.form.uiToolController.blockSignals(False) + else: + self.obj.ToolController = PathUtils.findToolController(self.obj) + self.form.baseList.blockSignals(True) for i in self.obj.Base: for sub in i[1]: @@ -572,6 +586,7 @@ class TaskPanel: self.form.addBase.clicked.connect(self.addBase) self.form.deleteBase.clicked.connect(self.deleteBase) self.form.reorderBase.clicked.connect(self.reorderBase) + self.form.uiToolController.currentIndexChanged.connect(self.getFields) # Depths self.form.startDepth.editingFinished.connect(self.getFields) diff --git a/src/Mod/Path/PathScripts/PathProfileEdges.py b/src/Mod/Path/PathScripts/PathProfileEdges.py index 2abadf38ff..ac14b4fc25 100644 --- a/src/Mod/Path/PathScripts/PathProfileEdges.py +++ b/src/Mod/Path/PathScripts/PathProfileEdges.py @@ -27,6 +27,13 @@ import Path from PathScripts import PathUtils from PathScripts.PathUtils import depth_params from DraftGeomUtils import findWires +import PathScripts.PathLog as PathLog + +"""Path Profile from Edges Object and Command""" + +LOG_MODULE = 'PathProfileEdges' +PathLog.setLevel(PathLog.Level.INFO, LOG_MODULE) +# PathLog.trackModule('PathProfileEdges') if FreeCAD.GuiUp: import FreeCADGui @@ -34,6 +41,7 @@ if FreeCAD.GuiUp: # Qt tanslation handling try: _encoding = QtGui.QApplication.UnicodeUTF8 + def translate(context, text, disambig=None): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: @@ -58,11 +66,8 @@ class ObjectProfile: obj.addProperty("App::PropertyString", "Comment", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "An optional comment for this profile")) obj.addProperty("App::PropertyString", "UserLabel", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "User Assigned Label")) - obj.addProperty("App::PropertyIntegerConstraint", "ToolNumber", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property", "The tool number in use")) - obj.ToolNumber = (0, 0, 1000, 1) - obj.setEditorMode('ToolNumber', 1) # make this read only - obj.addProperty("App::PropertyString", "ToolDescription", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property", "The description of the tool")) - obj.setEditorMode('ToolDescription', 1) # make this read onlyt + # Tool Properties + obj.addProperty("App::PropertyLink", "ToolController", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The tool controller that will be used to calculate the path")) # Depth Properties obj.addProperty("App::PropertyDistance", "ClearanceHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "The height needed to clear clamps and obstructions")) @@ -207,33 +212,20 @@ print("y - " + str(point.y)) import Part # math #DraftGeomUtils output = "" - toolLoad = PathUtils.getLastToolLoad(obj) - + toolLoad = obj.ToolController if toolLoad is None or toolLoad.ToolNumber == 0: - self.vertFeed = 100 - self.horizFeed = 100 - self.vertRapid = 100 - self.horizRapid = 100 - self.radius = 0.25 - obj.ToolNumber = 0 - obj.ToolDescription = "UNDEFINED" + FreeCAD.Console.PrintError("No Tool Controller is selected. We need a tool to build a Path.") else: self.vertFeed = toolLoad.VertFeed.Value self.horizFeed = toolLoad.HorizFeed.Value self.vertRapid = toolLoad.VertRapid.Value self.horizRapid = toolLoad.HorizRapid.Value - tool = PathUtils.getTool(obj, toolLoad.ToolNumber) - if tool.Diameter == 0: - self.radius = 0.25 + tool = toolLoad.Proxy.getTool(toolLoad) + if not tool or tool.Diameter == 0: + FreeCAD.Console.PrintError("No Tool found or diameter is zero. We need a tool to build a Path.") + return else: self.radius = tool.Diameter/2 - obj.ToolNumber = toolLoad.ToolNumber - obj.ToolDescription = toolLoad.Name - - if obj.UserLabel == "": - obj.Label = obj.Name + " :" + obj.ToolDescription - else: - obj.Label = obj.UserLabel + " :" + obj.ToolDescription output += "(" + obj.Label + ")" if obj.Side != "On": @@ -421,6 +413,11 @@ class TaskPanel: self.obj.Side = str(self.form.cutSide.currentText()) if hasattr(self.obj, "Direction"): self.obj.Direction = str(self.form.direction.currentText()) + if hasattr(self.obj, "ToolController"): + PathLog.debug("name: {}".format(self.form.uiToolController.currentText())) + tc = PathUtils.findToolController(self.obj, self.form.uiToolController.currentText()) + self.obj.ToolController = tc + self.obj.Proxy.execute(self.obj) def setFields(self): @@ -435,6 +432,22 @@ class TaskPanel: self.form.useStartPoint.setChecked(self.obj.UseStartPoint) self.form.useEndPoint.setChecked(self.obj.UseEndPoint) + controllers = PathUtils.getToolControllers(self.obj) + labels = [c.Label for c in controllers] + self.form.uiToolController.blockSignals(True) + self.form.uiToolController.addItems(labels) + self.form.uiToolController.blockSignals(False) + if self.obj.ToolController is not None: + index = self.form.uiToolController.findText( + self.obj.ToolController.Label, QtCore.Qt.MatchFixedString) + PathLog.debug("searching for TC label {}. Found Index: {}".format(self.obj.ToolController.Label, index)) + if index >= 0: + self.form.uiToolController.blockSignals(True) + self.form.uiToolController.setCurrentIndex(index) + self.form.uiToolController.blockSignals(False) + else: + self.obj.ToolController = PathUtils.findToolController(self.obj) + index = self.form.cutSide.findText( self.obj.Side, QtCore.Qt.MatchFixedString) if index >= 0: @@ -530,6 +543,7 @@ class TaskPanel: self.form.addBase.clicked.connect(self.addBase) self.form.deleteBase.clicked.connect(self.deleteBase) self.form.reorderBase.clicked.connect(self.reorderBase) + self.form.uiToolController.currentIndexChanged.connect(self.getFields) # Depths self.form.startDepth.editingFinished.connect(self.getFields) diff --git a/src/Mod/Path/PathScripts/PathSurface.py b/src/Mod/Path/PathScripts/PathSurface.py index d38fdc05b2..d66816a261 100644 --- a/src/Mod/Path/PathScripts/PathSurface.py +++ b/src/Mod/Path/PathScripts/PathSurface.py @@ -26,6 +26,11 @@ from __future__ import print_function import FreeCAD import Path from PathScripts import PathUtils +import PathScripts.PathLog as PathLog + +LOG_MODULE = 'PathSurface' +PathLog.setLevel(PathLog.Level.INFO, LOG_MODULE) +#PathLog.trackModule('PathSurface') if FreeCAD.GuiUp: import FreeCADGui @@ -51,33 +56,35 @@ except AttributeError: class ObjectSurface: def __init__(self, obj): - obj.addProperty("App::PropertyLinkSubList", "Base", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property","The base geometry of this toolpath")) - obj.addProperty("App::PropertyBool", "Active", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property","Make False, to prevent operation from generating code")) - obj.addProperty("App::PropertyString", "Comment", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property","An optional comment for this profile")) - obj.addProperty("App::PropertyString", "UserLabel", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property","User Assigned Label")) + obj.addProperty("App::PropertyLinkSubList", "Base", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The base geometry of this toolpath")) + obj.addProperty("App::PropertyBool", "Active", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "Make False, to prevent operation from generating code")) + obj.addProperty("App::PropertyString", "Comment", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "An optional comment for this profile")) + obj.addProperty("App::PropertyString", "UserLabel", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "User Assigned Label")) - obj.addProperty("App::PropertyEnumeration", "Algorithm", "Algorithm", QtCore.QT_TRANSLATE_NOOP("App::Property","The library to use to generate the path")) + obj.addProperty("App::PropertyEnumeration", "Algorithm", "Algorithm", QtCore.QT_TRANSLATE_NOOP("App::Property", "The library to use to generate the path")) obj.Algorithm = ['OCL Dropcutter', 'OCL Waterline'] - # Tool Properties - obj.addProperty("App::PropertyIntegerConstraint", "ToolNumber", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property","The tool number in use")) - obj.ToolNumber = (0, 0, 1000, 0) - obj.setEditorMode('ToolNumber', 1) # make this read only - obj.addProperty("App::PropertyString", "ToolDescription", "Tool", QtCore.QT_TRANSLATE_NOOP("App::Property","The description of the tool ")) - obj.setEditorMode('ToolDescription', 1) # make this read onlyt - # Surface Properties - obj.addProperty("App::PropertyFloatConstraint", "SampleInterval", "Surface", QtCore.QT_TRANSLATE_NOOP("App::Property","The Sample Interval. Small values cause long wait")) + obj.addProperty("App::PropertyFloatConstraint", "SampleInterval", "Surface", QtCore.QT_TRANSLATE_NOOP("App::Property", "The Sample Interval. Small values cause long wait")) obj.SampleInterval = (0, 0, 1, 0) + # Tool Properties + obj.addProperty("App::PropertyLink", "ToolController", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The tool controller that will be used to calculate the path")) + # Depth Properties - obj.addProperty("App::PropertyDistance", "ClearanceHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","The height needed to clear clamps and obstructions")) - obj.addProperty("App::PropertyDistance", "SafeHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Rapid Safety Height between locations.")) - obj.addProperty("App::PropertyFloatConstraint", "StepDown", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Incremental Step Down of Tool")) + obj.addProperty("App::PropertyDistance", "ClearanceHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "The height needed to clear clamps and obstructions")) + obj.addProperty("App::PropertyDistance", "SafeHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Rapid Safety Height between locations.")) + obj.addProperty("App::PropertyFloatConstraint", "StepDown", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Incremental Step Down of Tool")) obj.StepDown = (0.0, 0.01, 100.0, 0.5) - obj.addProperty("App::PropertyDistance", "StartDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Starting Depth of Tool- first cut depth in Z")) - obj.addProperty("App::PropertyDistance", "FinalDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Final Depth of Tool- lowest value in Z")) - obj.addProperty("App::PropertyDistance", "FinishDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property","Maximum material removed on final pass.")) + obj.addProperty("App::PropertyDistance", "StartDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Starting Depth of Tool- first cut depth in Z")) + obj.addProperty("App::PropertyDistance", "FinalDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Final Depth of Tool- lowest value in Z")) + obj.addProperty("App::PropertyDistance", "FinishDepth", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "Maximum material removed on final pass.")) + + self.vertFeed = 0.0 + self.horizFeed = 0.0 + self.vertRapid = 0.0 + self.horizRapid = 0.0 + self.radius = 0.0 obj.Proxy = self @@ -258,32 +265,20 @@ class ObjectSurface: if obj.Comment != "": output += '(' + str(obj.Comment)+')\n' - toolLoad = PathUtils.getLastToolLoad(obj) + toolLoad = obj.ToolController if toolLoad is None or toolLoad.ToolNumber == 0: - self.vertFeed = 100 - self.horizFeed = 100 - self.vertRapid = 100 - self.horizRapid = 100 - self.radius = 0.25 - obj.ToolNumber = 0 - obj.ToolDescription = "UNDEFINED" + FreeCAD.Console.PrintError("No Tool Controller is selected. We need a tool to build a Path.") else: self.vertFeed = toolLoad.VertFeed.Value self.horizFeed = toolLoad.HorizFeed.Value self.vertRapid = toolLoad.VertRapid.Value self.horizRapid = toolLoad.HorizRapid.Value - tool = PathUtils.getTool(obj, toolLoad.ToolNumber) - if tool.Diameter == 0: - self.radius = 0.25 + tool = toolLoad.Proxy.getTool(toolLoad) + if not tool or tool.Diameter == 0: + FreeCAD.Console.PrintError("No Tool found or diameter is zero. We need a tool to build a Path.") + return else: self.radius = tool.Diameter/2 - obj.ToolNumber = toolLoad.ToolNumber - obj.ToolDescription = toolLoad.Name - - if obj.UserLabel == "": - obj.Label = obj.Name + " :" + obj.ToolDescription - else: - obj.Label = obj.UserLabel + " :" + obj.ToolDescription output += "(" + obj.Label + ")" output += "(Compensated Tool Path. Diameter: " + str(self.radius * 2) + ")" @@ -299,8 +294,6 @@ class ObjectSurface: return print("base object: " + mesh.Name) - - if obj.Algorithm in ['OCL Dropcutter', 'OCL Waterline']: try: import ocl @@ -309,7 +302,6 @@ class ObjectSurface: "PathSurface", "This operation requires OpenCamLib to be installed.\n")) return - #mesh = b[0] if mesh.TypeId.startswith('Mesh'): mesh = mesh.Mesh bb = mesh.BoundBox @@ -341,6 +333,7 @@ class ObjectSurface: obj.Path = path obj.ViewObject.Visibility = False + class ViewProviderSurface: def __init__(self, obj): # mandatory @@ -459,6 +452,10 @@ class TaskPanel: if hasattr(self.obj, "Algorithm"): self.obj.Algorithm = str( self.form.algorithmSelect.currentText()) + if hasattr(self.obj, "ToolController"): + PathLog.debug("name: {}".format(self.form.uiToolController.currentText())) + tc = PathUtils.findToolController(self.obj, self.form.uiToolController.currentText()) + self.obj.ToolController = tc self.obj.Proxy.execute(self.obj) @@ -470,13 +467,31 @@ class TaskPanel: self.form.safeHeight.setText(FreeCAD.Units.Quantity(self.obj.SafeHeight.Value, FreeCAD.Units.Length).UserString) self.form.clearanceHeight.setText(FreeCAD.Units.Quantity(self.obj.ClearanceHeight.Value, FreeCAD.Units.Length).UserString) + controllers = PathUtils.getToolControllers(self.obj) + labels = [c.Label for c in controllers] + self.form.uiToolController.blockSignals(True) + self.form.uiToolController.addItems(labels) + self.form.uiToolController.blockSignals(False) + if self.obj.ToolController is not None: + index = self.form.uiToolController.findText( + self.obj.ToolController.Label, QtCore.Qt.MatchFixedString) + PathLog.debug("searching for TC label {}. Found Index: {}".format(self.obj.ToolController.Label, index)) + if index >= 0: + self.form.uiToolController.blockSignals(True) + self.form.uiToolController.setCurrentIndex(index) + self.form.uiToolController.blockSignals(False) + else: + self.obj.ToolController = PathUtils.findToolController(self.obj) + for i in self.obj.Base: self.form.baseList.addItem(i[0].Name) index = self.form.algorithmSelect.findText( self.obj.Algorithm, QtCore.Qt.MatchFixedString) if index >= 0: + self.form.algorithmSelect.blockSignals(True) self.form.algorithmSelect.setCurrentIndex(index) + self.form.algorithmSelect.blockSignals(False) def open(self): self.s = SelObserver() @@ -554,14 +569,12 @@ class TaskPanel: return int(QtGui.QDialogButtonBox.Ok) def setupUi(self): - - # Connect Signals and Slots - - #Base Geometry + # Base Geometry self.form.addBase.clicked.connect(self.addBase) self.form.deleteBase.clicked.connect(self.deleteBase) self.form.reorderBase.clicked.connect(self.reorderBase) self.form.baseList.itemSelectionChanged.connect(self.itemActivated) + self.form.uiToolController.currentIndexChanged.connect(self.getFields) # Depths self.form.startDepth.editingFinished.connect(self.getFields)