diff --git a/src/Mod/Path/Gui/Resources/panels/ContourEdit.ui b/src/Mod/Path/Gui/Resources/panels/ContourEdit.ui index 9826a41d93..2c445c76a9 100644 --- a/src/Mod/Path/Gui/Resources/panels/ContourEdit.ui +++ b/src/Mod/Path/Gui/Resources/panels/ContourEdit.ui @@ -7,7 +7,7 @@ 0 0 352 - 455 + 400 @@ -31,7 +31,7 @@ 0 0 334 - 347 + 292 @@ -98,7 +98,7 @@ 0 0 334 - 347 + 292 @@ -148,7 +148,7 @@ 0 0 334 - 347 + 292 @@ -162,7 +162,7 @@ QFormLayout::AllNonFixedFieldsGrow - + @@ -189,7 +189,7 @@ - + @@ -216,7 +216,7 @@ - + @@ -256,6 +256,28 @@ + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + ToolController + + + + + + + + + diff --git a/src/Mod/Path/PathScripts/PathContour.py b/src/Mod/Path/PathScripts/PathContour.py index ed8a001649..cbc12d24e8 100644 --- a/src/Mod/Path/PathScripts/PathContour.py +++ b/src/Mod/Path/PathScripts/PathContour.py @@ -23,12 +23,17 @@ # *************************************************************************** import FreeCAD -import Path from FreeCAD import Vector -import TechDraw +import Path +import PathScripts.PathLog as PathLog from PathScripts import PathUtils from PathScripts.PathUtils import depth_params from PySide import QtCore +import TechDraw + +LOG_MODULE = 'PathContour' +PathLog.setLevel(PathLog.Level.DEBUG, LOG_MODULE) +PathLog.trackModule('PathContour') if FreeCAD.GuiUp: import FreeCADGui @@ -60,11 +65,13 @@ class ObjectContour: obj.addProperty("App::PropertyString", "Comment", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "An optional comment for this Contour")) 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 only + obj.addProperty("App::PropertyLink", "ToolController", "Path", QtCore.QT_TRANSLATE_NOOP("App::Property", "The tool controller that will be used to calculate the path")) + + # 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 only # Depth Properties obj.addProperty("App::PropertyDistance", "ClearanceHeight", "Depth", QtCore.QT_TRANSLATE_NOOP("App::Property", "The height needed to clear clamps and obstructions")) @@ -104,17 +111,18 @@ class ObjectContour: def __setstate__(self, state): return None - def setLabel(self, obj): - if not obj.UserLabel: - obj.Label = obj.Name + " :" + obj.ToolDescription - else: - obj.Label = obj.UserLabel + " :" + obj.ToolDescription + # def setLabel(self, obj): + # if not obj.UserLabel: + # obj.Label = obj.Name + " :" + obj.ToolDescription + # else: + # obj.Label = obj.UserLabel + " :" + obj.ToolDescription def onChanged(self, obj, prop): if prop == "UserLabel": self.setLabel(obj) def setDepths(proxy, obj): + PathLog.track() parentJob = PathUtils.findParentJob(obj) if parentJob is None: return @@ -136,6 +144,7 @@ class ObjectContour: def _buildPathLibarea(self, obj, edgelist): import PathScripts.PathKurveUtils as PathKurveUtils + PathLog.track() # import math # import area output = "" @@ -188,33 +197,37 @@ class ObjectContour: return output def execute(self, obj): + PathLog.track() 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 + + # self.vertFeed = 100 + # self.horizFeed = 100 + # self.vertRapid = 100 + # self.horizRapid = 100 + # self.radius = 0.25 + # obj.ToolNumber = 0 + # obj.ToolDescription = "UNDEFINED" 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) + tool = toolLoad.Proxy.getTool(toolLoad) #PathUtils.getTool(obj, toolLoad.ToolNumber) if not tool or tool.Diameter == 0: self.radius = 0.25 else: self.radius = tool.Diameter/2 - obj.ToolNumber = toolLoad.ToolNumber - obj.ToolDescription = toolLoad.Name + # obj.ToolNumber = toolLoad.ToolNumber + # obj.ToolDescription = toolLoad.Name - self.setLabel(obj) + #self.setLabel(obj) output += "(" + obj.Label + ")" if not obj.UseComp: @@ -377,6 +390,7 @@ class TaskPanel: FreeCAD.ActiveDocument.recompute() def getFields(self): + PathLog.track() if self.obj: if hasattr(self.obj, "StartDepth"): self.obj.StartDepth = FreeCAD.Units.Quantity(self.form.startDepth.text()).Value @@ -400,9 +414,13 @@ class TaskPanel: self.obj.UseEndPoint = self.form.useEndPoint.isChecked() if hasattr(self.obj, "Direction"): self.obj.Direction = str(self.form.direction.currentText()) + if hasattr(self.obj, "ToolController"): + tc = PathUtils.findToolController(self.obj, self.form.uiToolController.currentText()) + self.obj.ToolController = tc self.obj.Proxy.execute(self.obj) def setFields(self): + PathLog.track() self.form.startDepth.setText(FreeCAD.Units.Quantity(self.obj.StartDepth.Value, FreeCAD.Units.Length).UserString) self.form.finalDepth.setText(FreeCAD.Units.Quantity(self.obj.FinalDepth.Value, FreeCAD.Units.Length).UserString) self.form.safeHeight.setText(FreeCAD.Units.Quantity(self.obj.SafeHeight.Value, FreeCAD.Units.Length).UserString) @@ -419,6 +437,15 @@ class TaskPanel: if index >= 0: self.form.direction.setCurrentIndex(index) + controllers = PathUtils.getToolControllers(self.obj) + labels = [c.Label for c in controllers] + self.form.uiToolController.addItems(labels) + if self.obj.ToolController is not None: + index = self.form.direction.findText( + self.obj.ToolController.Label, QtCore.Qt.MatchFixedString) + if index >= 0: + self.form.uiToolController.setCurrentIndex(index) + def open(self): self.s = SelObserver() # install the function mode resident @@ -428,7 +455,7 @@ class TaskPanel: return int(QtGui.QDialogButtonBox.Ok) def setupUi(self): - + PathLog.track() # Connect Signals and Slots # Depths self.form.startDepth.editingFinished.connect(self.getFields) @@ -441,6 +468,7 @@ class TaskPanel: # operation self.form.direction.currentIndexChanged.connect(self.getFields) + self.form.uiToolController.currentIndexChanged.connect(self.getFields) self.form.useCompensation.clicked.connect(self.getFields) self.form.useStartPoint.clicked.connect(self.getFields) self.form.useEndPoint.clicked.connect(self.getFields) diff --git a/src/Mod/Path/PathScripts/PathUtils.py b/src/Mod/Path/PathScripts/PathUtils.py index 2f70c10492..30c5e11ac8 100644 --- a/src/Mod/Path/PathScripts/PathUtils.py +++ b/src/Mod/Path/PathScripts/PathUtils.py @@ -548,21 +548,33 @@ def getLastToolLoad(obj): continue return tc -# def getToolControllers(obj): -# controllers = [] -# try: -# parent = obj.InList[0] -# except: -# parent = None +def getToolControllers(obj): + controllers = [] + try: + parent = obj.InList[0] + except: + parent = None -# if parent is not None and hasattr(parent, 'Group'): -# sibs = parent.Group -# for g in sibs: -# if isinstance(g.Proxy, PathScripts.PathLoadTool.LoadTool): -# controllers.append(g.Name) -# return controllers + if parent is not None and hasattr(parent, 'Group'): + sibs = parent.Group + for g in sibs: + if isinstance(g.Proxy, PathScripts.PathLoadTool.LoadTool): + controllers.append(g) + return controllers +def findToolController(obj, name=""): + '''returns a tool controller with a given name. + If no name is specified, returns the first controller. + if no controller is found, returns None''' + controllers = getToolControllers(obj) + for c in controllers: + if c.Label == name: + return c + if len(controllers) > 0: + return controllers[0] + else: + return None def findParentJob(obj): '''retrieves a parent job object for an operation or other Path object'''