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'''