diff --git a/src/Mod/Path/Gui/Resources/panels/ContourEdit.ui b/src/Mod/Path/Gui/Resources/panels/ContourEdit.ui
index 04dfd1f13..f80fdf98c 100644
--- a/src/Mod/Path/Gui/Resources/panels/ContourEdit.ui
+++ b/src/Mod/Path/Gui/Resources/panels/ContourEdit.ui
@@ -23,7 +23,7 @@
-
- 3
+ 0
@@ -42,13 +42,9 @@
Depths
-
-
-
-
- mm
-
-
-
+
+ QFormLayout::AllNonFixedFieldsGrow
+
-
@@ -90,6 +86,13 @@
+ -
+
+
+ mm
+
+
+
@@ -97,8 +100,8 @@
0
0
- 165
- 70
+ 334
+ 318
@@ -169,7 +172,7 @@
- -
+
-
diff --git a/src/Mod/Path/Gui/Resources/panels/MillFaceEdit.ui b/src/Mod/Path/Gui/Resources/panels/MillFaceEdit.ui
index 7f8f49f82..2795ac19c 100644
--- a/src/Mod/Path/Gui/Resources/panels/MillFaceEdit.ui
+++ b/src/Mod/Path/Gui/Resources/panels/MillFaceEdit.ui
@@ -6,8 +6,8 @@
0
0
- 351
- 520
+ 374
+ 453
@@ -33,8 +33,8 @@
0
0
- 333
- 353
+ 340
+ 277
@@ -111,8 +111,8 @@
0
0
- 333
- 324
+ 356
+ 124
@@ -192,8 +192,8 @@
0
0
- 333
- 324
+ 356
+ 95
@@ -237,87 +237,13 @@
-
-
-
- 0
- 0
- 333
- 353
-
-
-
- Pattern
-
-
- -
-
-
- 1
-
-
- 100
-
-
- 10
-
-
- 100
-
-
-
- -
-
-
- Step Over Percent
-
-
-
- -
-
-
- QFrame::StyledPanel
-
-
- QFrame::Raised
-
-
-
-
-
-
- Use ZigZag
-
-
-
- -
-
-
- ZigZag Unidirectional
-
-
-
- -
-
-
- -
-
-
- ZigZag Angle
-
-
-
-
-
-
-
-
0
0
- 333
- 353
+ 356
+ 296
@@ -327,50 +253,10 @@
Operation
-
- -
-
-
-
-
-
-
- Cut Mode
-
-
-
- -
-
-
-
-
- Climb
-
-
- -
-
- Conventional
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- Use Start Point
-
-
-
-
-
-
- -
+
+
-
-
+
-
@@ -388,29 +274,109 @@
+ -
+
+
+ Step Over Percent
+
+
+
+ -
+
+
+ 1
+
+
+ 100
+
+
+ 10
+
+
+ 100
+
+
+
- -
-
-
+
-
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
-
+
+
+ Use ZigZag
+
+
+
+ -
+
+
+ ZigZag Angle
+
+
+
+ -
+
+
+ -
+
+
+ ZigZag Unidirectional
+
+
+
+
+
+
+ -
+
+
+
-
+
+
+ Cut Mode
+
+
+
+ -
Boundary Shape
- -
+
-
-
- Model Perimeter
+ Perimeter
-
- Model Boundbox
+ Boundbox
+
+
+
+
+ -
+
+
-
+
+ Climb
+
+
+ -
+
+ Conventional
@@ -418,23 +384,23 @@
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 116
-
-
-
-
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
diff --git a/src/Mod/Path/Gui/Resources/panels/ProfileEdgesEdit.ui b/src/Mod/Path/Gui/Resources/panels/ProfileEdgesEdit.ui
index 4732c2b25..80ad39a54 100644
--- a/src/Mod/Path/Gui/Resources/panels/ProfileEdgesEdit.ui
+++ b/src/Mod/Path/Gui/Resources/panels/ProfileEdgesEdit.ui
@@ -111,8 +111,8 @@
0
0
- 334
- 319
+ 168
+ 99
@@ -178,8 +178,8 @@
0
0
- 334
- 319
+ 165
+ 70
@@ -250,7 +250,7 @@
- -
+
-
@@ -286,8 +286,8 @@
0
0
- 334
- 319
+ 322
+ 306
diff --git a/src/Mod/Path/Gui/Resources/panels/ProfileEdit.ui b/src/Mod/Path/Gui/Resources/panels/ProfileEdit.ui
index 1161856f9..8238fc685 100644
--- a/src/Mod/Path/Gui/Resources/panels/ProfileEdit.ui
+++ b/src/Mod/Path/Gui/Resources/panels/ProfileEdit.ui
@@ -6,8 +6,8 @@
0
0
- 352
- 525
+ 399
+ 519
@@ -33,8 +33,8 @@
0
0
- 334
- 358
+ 381
+ 353
@@ -45,22 +45,6 @@
Base Geometry
-
-
-
-
- Drag to reorder, then update.
-
-
- QAbstractItemView::DragDrop
-
-
- Qt::MoveAction
-
-
- false
-
-
-
-
@@ -104,6 +88,22 @@
+ -
+
+
+ Drag to reorder, then update.
+
+
+ QAbstractItemView::DragDrop
+
+
+ Qt::MoveAction
+
+
+ false
+
+
+
@@ -111,8 +111,8 @@
0
0
- 334
- 358
+ 381
+ 353
@@ -178,8 +178,8 @@
0
0
- 334
- 358
+ 381
+ 353
@@ -228,14 +228,28 @@
0
0
- 334
- 358
+ 381
+ 353
Holding
+ -
+
+
+ Add New
+
+
+
+ -
+
+
+ Delete
+
+
+
-
@@ -265,20 +279,6 @@
- -
-
-
- Add New
-
-
-
- -
-
-
- Delete
-
-
-
@@ -286,8 +286,8 @@
0
0
- 334
- 358
+ 381
+ 353
@@ -301,28 +301,107 @@
QFormLayout::AllNonFixedFieldsGrow
- -
-
-
- Algorithm
-
+
-
+
+
+
-
+
+
+ Use End Point
+
+
+
+ -
+
+
+ Use Start Point
+
+
+
+ -
+
+
+ Use Compensation
+
+
+
+ -
+
+
+ Process Holes
+
+
+
+ -
+
+
+ Process Perimeter
+
+
+
+
+ -
+
+
+
-
+
+
+ Extra Offset
+
+
+
+ -
+
+
+ -
+
+
+ Segment Length
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ Roll Radius
+
+
+
+ -
+
+
+ Plunge Angle
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
-
-
-
-
-
- OCC Native
-
-
- -
-
- libarea
-
-
-
-
- -
-
@@ -375,86 +454,6 @@
- -
-
-
-
-
-
-
- Use Start Point
-
-
-
- -
-
-
- Use Compensation
-
-
-
- -
-
-
- Use End Point
-
-
-
- -
-
-
- Process Holes
-
-
-
-
-
-
- -
-
-
-
-
-
-
- Extra Offset
-
-
-
- -
-
-
- -
-
-
- Segment Length
-
-
-
- -
-
-
- -
-
-
- Roll Radius
-
-
-
- -
-
-
- -
-
-
- Plunge Angle
-
-
-
- -
-
-
-
-
-
diff --git a/src/Mod/Path/InitGui.py b/src/Mod/Path/InitGui.py
index 0a9545e51..468f07fa9 100644
--- a/src/Mod/Path/InitGui.py
+++ b/src/Mod/Path/InitGui.py
@@ -136,7 +136,7 @@ class PathWorkbench (Workbench):
if len(FreeCADGui.Selection.getSelection()) == 1:
if FreeCADGui.Selection.getSelection()[0].isDerivedFrom("Path::Feature"):
self.appendContextMenu("", ["Path_Inspect"])
- if "Profile" in FreeCADGui.Selection.getSelection()[0].Name:
+ if "Profile" or "Contour" in FreeCADGui.Selection.getSelection()[0].Name:
self.appendContextMenu("", ["Add_Tag"])
self.appendContextMenu("", ["Set_StartPoint"])
self.appendContextMenu("", ["Set_EndPoint"])
diff --git a/src/Mod/Path/PathScripts/PathContour.py b/src/Mod/Path/PathScripts/PathContour.py
index 0bb61ebf8..a8386299a 100644
--- a/src/Mod/Path/PathScripts/PathContour.py
+++ b/src/Mod/Path/PathScripts/PathContour.py
@@ -419,7 +419,6 @@ class TaskPanel:
self.updating = False
def accept(self):
- print "removed"
self.getFields()
FreeCADGui.ActiveDocument.resetEdit()
@@ -428,7 +427,6 @@ class TaskPanel:
FreeCAD.ActiveDocument.recompute()
def reject(self):
- print "removed1"
FreeCADGui.Control.closeDialog()
FreeCADGui.Selection.removeObserver(self.s)
FreeCAD.ActiveDocument.recompute()
@@ -482,6 +480,7 @@ class TaskPanel:
if index >= 0:
self.form.direction.setCurrentIndex(index)
+ self.form.tagTree.blockSignals(True)
for i in range(len(self.obj.locs)):
item = QtGui.QTreeWidgetItem(self.form.tagTree)
item.setText(0, str(i+1))
@@ -492,6 +491,7 @@ class TaskPanel:
item.setText(4, str(self.obj.angles[i]))
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
item.setTextAlignment(0, QtCore.Qt.AlignLeft)
+ self.form.tagTree.blockSignals(False)
def open(self):
self.s = SelObserver()
diff --git a/src/Mod/Path/PathScripts/PathKurveUtils.py b/src/Mod/Path/PathScripts/PathKurveUtils.py
index 97f4e5f4c..4fcf5c8b6 100644
--- a/src/Mod/Path/PathScripts/PathKurveUtils.py
+++ b/src/Mod/Path/PathScripts/PathKurveUtils.py
@@ -302,26 +302,26 @@ def profile2(curve, direction="on", radius=1.0, vertfeed=0.0,
extend_at_start=0.0, extend_at_end=0.0, lead_in_line_len=0.0,
lead_out_line_len=0.0):
- print "direction: " + str(direction)
- print "radius: " + str(radius)
- print "vertfeed: " + str(vertfeed)
- print "horizfeed: " + str(horizfeed)
- print "offset_extra: " + str(offset_extra)
- print "roll_radius: " + str(roll_radius)
- print "roll_on: " + str(roll_on)
- print "roll_off: " + str(roll_off)
- print "depthparams: " + str(depthparams)
- print "extend_at_start: " + str(extend_at_start)
- print "extend_at_end: " + str(extend_at_end)
- print "lead_in_line_len: " + str(lead_in_line_len)
- print "lead_out_line_len: " + str(lead_out_line_len)
- print "in profile2: 318"
+ # print "direction: " + str(direction)
+ # print "radius: " + str(radius)
+ # print "vertfeed: " + str(vertfeed)
+ # print "horizfeed: " + str(horizfeed)
+ # print "offset_extra: " + str(offset_extra)
+ # print "roll_radius: " + str(roll_radius)
+ # print "roll_on: " + str(roll_on)
+ # print "roll_off: " + str(roll_off)
+ # print "depthparams: " + str(depthparams)
+ # print "extend_at_start: " + str(extend_at_start)
+ # print "extend_at_end: " + str(extend_at_end)
+ # print "lead_in_line_len: " + str(lead_in_line_len)
+ # print "lead_out_line_len: " + str(lead_out_line_len)
+ # print "in profile2: 318"
global tags
direction = direction.lower()
offset_curve = area.Curve(curve)
- print "curve: " , str(curve)
- print "result curve: ", offset_curve.__dict__
+ # print "curve: " , str(curve)
+ # print "result curve: ", offset_curve.__dict__
if direction == "on":
use_CRC() == False
diff --git a/src/Mod/Path/PathScripts/PathMillFace.py b/src/Mod/Path/PathScripts/PathMillFace.py
index d25ef2056..b799cf5f4 100644
--- a/src/Mod/Path/PathScripts/PathMillFace.py
+++ b/src/Mod/Path/PathScripts/PathMillFace.py
@@ -30,10 +30,7 @@ import Part
import PathScripts.PathKurveUtils
import area
import TechDraw
-import Drawing
-import DraftGeomUtils
from FreeCAD import Vector
-import Arch
FreeCADGui = None
if FreeCAD.GuiUp:
@@ -83,13 +80,13 @@ class ObjectFace:
obj.addProperty("App::PropertyEnumeration", "StartAt", "Face", QtCore.QT_TRANSLATE_NOOP("App::Property","Start Faceing at center or boundary"))
obj.StartAt = ['Center', 'Edge']
obj.addProperty("App::PropertyPercent", "StepOver", "Face", 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.StepOver = (1, 1, 100, 1)
obj.addProperty("App::PropertyBool", "KeepToolDown", "Face", QtCore.QT_TRANSLATE_NOOP("App::Property","Attempts to avoid unnecessary retractions."))
obj.addProperty("App::PropertyBool", "ZigUnidirectional", "Face", QtCore.QT_TRANSLATE_NOOP("App::Property","Lifts tool at the end of each pass to respect cut mode."))
obj.addProperty("App::PropertyBool", "UseZigZag", "Face", QtCore.QT_TRANSLATE_NOOP("App::Property","Use Zig Zag pattern to clear area."))
obj.addProperty("App::PropertyFloat", "ZigZagAngle", "Face", QtCore.QT_TRANSLATE_NOOP("App::Property","Angle of the zigzag pattern"))
obj.addProperty("App::PropertyEnumeration", "BoundaryShape", "Face", QtCore.QT_TRANSLATE_NOOP("App::Property","Shape to use for calculating Boundary"))
- obj.BoundaryShape = ['Perimeter', 'BoundBox']
+ obj.BoundaryShape = ['Perimeter', 'Boundbox']
# Start Point Properties
@@ -102,6 +99,9 @@ class ObjectFace:
if prop == "UserLabel":
obj.Label = obj.UserLabel + " :" + obj.ToolDescription
+ if prop == "StepOver":
+ if obj.StepOver == 0:
+ obj.StepOver = 1
def __getstate__(self):
return None
@@ -144,10 +144,11 @@ class ObjectFace:
item = (ss, sub)
if item in baselist:
FreeCAD.Console.PrintWarning(translate("Path", "this object already in the list" + "\n"))
+ elif PathUtils.findParentJob(obj).Base.Name != ss.Name:
+ FreeCAD.Console.PrintWarning(translate("Path", "Please select features from the Job model object" +"\n"))
else:
baselist.append(item)
obj.Base = baselist
- print "this base is: " + str(baselist)
self.execute(obj)
def getStock(self, obj):
@@ -193,8 +194,6 @@ class ObjectFace:
if obj.UseStartPoint:
start_point = (obj.StartPoint.x, obj.StartPoint.y)
- # print "a," + str(self.radius) + "," + str(extraoffset) + "," + str(stepover) + ",depthparams, " + str(from_center) + "," + str(keep_tool_down) + "," + str(use_zig_zag) + "," + str(zig_angle) + "," + str(zig_unidirectional) + "," + str(start_point) + "," + str(cut_mode)
-
PathAreaUtils.pocket(
a,
self.radius,
@@ -251,24 +250,18 @@ class ObjectFace:
else:
obj.Label = obj.UserLabel + " :" + obj.ToolDescription
- #Facing is done either against base object
+ #Facing is done either against base objects
if obj.Base:
faces = []
for b in obj.Base:
for sub in b[1]:
shape = getattr(b[0].Shape, sub)
if isinstance (shape, Part.Face):
- groups = Drawing.project(shape, Vector(0,0,1))
- if len(groups[0].Edges) > 0:
- p = DraftGeomUtils.superWire(groups[0].Edges, closed=True)
- w = []
- w.append(p)
- faces.append(Arch.makeFace(w))
+ faces.append(shape)
else:
print ('falling out')
return
- contourwire = TechDraw.findShapeOutline(faces[0].multiFuse(faces[1:]).removeSplitter(), 1, Vector(0,0,1))
- print ('269: contourwire', contourwire)
+ planeshape = Part.makeCompound(faces)
#If no base object, do planing of top surface of entire model
else:
@@ -278,18 +271,16 @@ class ObjectFace:
baseobject = parentJob.Base
if baseobject is None:
return
- # print "Plane base object: " + baseobject.Name
- contourwire = TechDraw.findShapeOutline(baseobject.Shape, 1, Vector(0,0,1))
- print ('281: contourwire', contourwire)
+ planeshape = baseobject.Shape
- if obj.BoundaryShape == 'BoundBox':
- print 'boundbox'
- bb = contourwire.BoundBox
+ #if user wants the boundbox, calculate that
+ if obj.BoundaryShape == 'Boundbox':
+ bb = planeshape.BoundBox
bbperim = Part.makeBox(bb.XLength, bb.YLength, 1, Vector(bb.XMin, bb.YMin, bb.ZMin), Vector(0,0,1))
contourwire = TechDraw.findShapeOutline(bbperim, 1, Vector(0,0,1))
-
else:
- print 'perimeter'
+ contourwire = TechDraw.findShapeOutline(planeshape, 1, Vector(0,0,1))
+
edgelist = contourwire.Edges
edgelist = Part.__sortEdges__(edgelist)
@@ -378,7 +369,6 @@ class CommandPathMillFace:
FreeCADGui.doCommand('obj.Active = True')
FreeCADGui.doCommand('PathScripts.PathMillFace.ViewProviderFace(obj.ViewObject)')
FreeCADGui.doCommand('from PathScripts import PathUtils')
- #FreeCADGui.doCommand('obj.Algorithm = "libarea"')
FreeCADGui.doCommand('obj.StepOver = 50')
FreeCADGui.doCommand('obj.ClearanceHeight = 10') # + str(bb.ZMax + 2.0))
FreeCADGui.doCommand('obj.StepDown = 1.0')
@@ -440,10 +430,10 @@ class TaskPanel:
self.obj.ClearanceHeight = self.form.clearanceHeight.text()
if hasattr(self.obj, "StepDown"):
self.obj.StepDown = self.form.stepDown.value()
- if hasattr(self.obj, "PassExtensioon"):
+ if hasattr(self.obj, "PassExtension"):
self.obj.PassExtension = self.form.extraOffset.value()
- if hasattr(self.obj, "UseStartPoint"):
- self.obj.UseStartPoint = self.form.useStartPoint.isChecked()
+ # if hasattr(self.obj, "UseStartPoint"):
+ # self.obj.UseStartPoint = self.form.useStartPoint.isChecked()
if hasattr(self.obj, "CutMode"):
self.obj.CutMode = str(self.form.cutMode.currentText())
if hasattr(self.obj, "UseZigZag"):
@@ -454,6 +444,8 @@ class TaskPanel:
self.obj.ZigZagAngle = self.form.zigZagAngle.value()
if hasattr(self.obj, "StepOver"):
self.obj.StepOver = self.form.stepOverPercent.value()
+ if hasattr(self.obj, "BoundaryShape"):
+ self.obj.BoundaryShape = str(self.form.boundaryShape.currentText())
self.obj.Proxy.execute(self.obj)
@@ -461,15 +453,31 @@ class TaskPanel:
self.form.startDepth.setText(str(self.obj.StartDepth.Value))
self.form.finalDepth.setText(str(self.obj.FinalDepth.Value))
self.form.finishDepth.setText(str(self.obj.FinishDepth.Value))
+ self.form.stepDown.setValue(self.obj.StepDown)
self.form.safeHeight.setText(str(self.obj.SafeHeight.Value))
self.form.clearanceHeight.setText(str(self.obj.ClearanceHeight.Value))
- self.form.stepDown.setValue(self.obj.StepDown)
- self.form.extraOffset.setValue(self.obj.PassExtension.Value)
- self.form.useStartPoint.setChecked(self.obj.UseStartPoint)
+ self.form.stepOverPercent.setValue(self.obj.StepOver)
self.form.useZigZag.setChecked(self.obj.UseZigZag)
self.form.zigZagUnidirectional.setChecked(self.obj.ZigUnidirectional)
self.form.zigZagAngle.setValue(self.obj.ZigZagAngle)
- self.form.stepOverPercent.setValue(self.obj.StepOver)
+ #self.form.useStartPoint.setChecked(self.obj.UseStartPoint)
+ self.form.extraOffset.setValue(self.obj.PassExtension.Value)
+
+ index = self.form.cutMode.findText(
+ self.obj.CutMode, QtCore.Qt.MatchFixedString)
+ if index >=0:
+
+ self.form.cutMode.blockSignals(True)
+ self.form.cutMode.setCurrentIndex(index)
+ self.form.cutMode.blockSignals(False)
+
+ index = self.form.boundaryShape.findText(
+ self.obj.BoundaryShape, QtCore.Qt.MatchFixedString)
+ if index >=0:
+ self.form.boundaryShape.blockSignals(True)
+ self.form.boundaryShape.setCurrentIndex(index)
+ self.form.boundaryShape.blockSignals(False)
+
for i in self.obj.Base:
for sub in i[1]:
@@ -508,8 +516,20 @@ class TaskPanel:
dlist = self.form.baseList.selectedItems()
newlist = []
for d in dlist:
+ deletebase = d.text().partition(".")[0]
+ deletesub = d.text().partition(".")[2]
+
for i in self.obj.Base:
- if i[0].Name != d.text().partition(".")[0] or i[1] != d.text().partition(".")[2]:
+ sublist = []
+ #baseobj = i[0]
+ basesubs = i[1]
+ for sub in basesubs:
+ if sub != deletesub:
+ sublist.append(sub)
+ if len(sublist) >= 1:
+ newlist.append ((deletebase, tuple(sublist)))
+
+ if i[0].Name != d.text().partition(".")[0] and d.text().partition(".")[2] not in i[1]:
newlist.append(i)
self.form.baseList.takeItem(self.form.baseList.row(d))
self.obj.Base = newlist
@@ -517,6 +537,7 @@ class TaskPanel:
FreeCAD.ActiveDocument.recompute()
def itemActivated(self):
+ print self.form.baseList.selectedItems()[0].text()
FreeCADGui.Selection.clearSelection()
slist = self.form.baseList.selectedItems()
for i in slist:
@@ -577,11 +598,9 @@ class TaskPanel:
# operation
self.form.cutMode.currentIndexChanged.connect(self.getFields)
- self.form.useStartPoint.clicked.connect(self.getFields)
+ #self.form.useStartPoint.clicked.connect(self.getFields)
self.form.extraOffset.editingFinished.connect(self.getFields)
self.form.boundaryShape.currentIndexChanged.connect(self.getFields)
-
- # Pattern
self.form.stepOverPercent.editingFinished.connect(self.getFields)
self.form.useZigZag.clicked.connect(self.getFields)
self.form.zigZagUnidirectional.clicked.connect(self.getFields)
diff --git a/src/Mod/Path/PathScripts/PathProfile.py b/src/Mod/Path/PathScripts/PathProfile.py
index 12d14f6fa..72e04326e 100644
--- a/src/Mod/Path/PathScripts/PathProfile.py
+++ b/src/Mod/Path/PathScripts/PathProfile.py
@@ -25,6 +25,7 @@
import FreeCAD
import Path
import numpy
+import TechDraw
from FreeCAD import Vector
from PathScripts import PathUtils
from PathScripts.PathUtils import depth_params
@@ -58,14 +59,11 @@ 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::PropertyEnumeration", "Algorithm", "Algorithm", QtCore.QT_TRANSLATE_NOOP("App::Property","The library or algorithm used to generate the path"))
- obj.Algorithm = ['OCC Native', 'libarea']
-
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 onlyt
+ 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"))
@@ -98,7 +96,8 @@ class ObjectProfile:
obj.addProperty("App::PropertyDistance", "OffsetExtra", "Profile", QtCore.QT_TRANSLATE_NOOP("App::Property","Extra value to stay away from final profile- good for roughing toolpath"))
obj.addProperty("App::PropertyLength", "SegLen", "Profile", QtCore.QT_TRANSLATE_NOOP("App::Property","Tesselation value for tool paths made from beziers, bsplines, and ellipses"))
obj.addProperty("App::PropertyAngle", "PlungeAngle", "Profile", QtCore.QT_TRANSLATE_NOOP("App::Property","Plunge angle with which the tool enters the work piece. Straight down is 90 degrees, if set small enough or zero the tool will descent exactly one layer depth down per turn"))
- obj.addProperty("App::PropertyBool", "processHoles", "Profile", QtCore.QT_TRANSLATE_NOOP("App::Property","Handl holes as well as the outline"))
+ obj.addProperty("App::PropertyBool", "processHoles", "Profile", QtCore.QT_TRANSLATE_NOOP("App::Property","Profile holes as well as the outline"))
+ obj.addProperty("App::PropertyBool", "processPerimeter", "Profile", QtCore.QT_TRANSLATE_NOOP("App::Property","Profile the outline"))
obj.addProperty("App::PropertyVectorList", "locs", "Tags", QtCore.QT_TRANSLATE_NOOP("App::Property","List of holding tag locations"))
@@ -114,7 +113,6 @@ class ObjectProfile:
obj.angles = angles
obj.lengths = lengths
obj.heights = heights
- #obj.ToolDescription = "UNDEFINED"
obj.Proxy = self
@@ -167,29 +165,6 @@ class ObjectProfile:
obj.Base = baselist
self.execute(obj)
- def _buildPathOCC(self, obj, wire):
- import DraftGeomUtils
- output = ""
- if obj.Comment != "":
- output += '(' + str(obj.Comment)+')\n'
-
- if obj.Direction == 'CCW':
- clockwise = False
- else:
- clockwise = True
-
- FirstEdge = None
- PathClosed = DraftGeomUtils.isReallyClosed(wire)
-
- output += PathUtils.MakePath(
- wire, obj.Side, self.radius, clockwise,
- obj.ClearanceHeight.Value, obj.StepDown, obj.StartDepth.Value,
- obj.FinalDepth.Value, FirstEdge, PathClosed, obj.SegLen.Value,
- self.vertFeed, self.horizFeed, self.vertRapid, self.horizRapid,
- PlungeAngle=obj.PlungeAngle.Value)
-
- return output
-
def _buildPathLibarea(self, obj, edgelist, isHole):
import PathScripts.PathKurveUtils as PathKurveUtils
import math
@@ -228,7 +203,6 @@ print "y - " + str(point.y)
start location
CRC
or probably other features in heekscnc'''
- # output += PathKurveUtils.profile(curve, side, radius, vf, hf, offset_extra, rapid_safety_space, clearance, start_depth, step_down, final_depth, use_CRC)
'''The following calls the original procedure from h
toolLoad = obj.activeTCeekscnc profile function. This, in turn, calls many other procedures to modify the profile.
@@ -273,8 +247,6 @@ print "y - " + str(point.y)
output = ""
toolLoad = PathUtils.getLastToolLoad(obj)
- # obj.ToolController = PathUtils.getToolControllers(obj)
- # toolLoad = PathUtils.getToolLoad(obj, obj.ToolController)
if toolLoad is None or toolLoad.ToolNumber == 0:
self.vertFeed = 100
@@ -309,62 +281,32 @@ print "y - " + str(point.y)
output += "(Uncompensated Tool Path)"
if obj.Base:
- hfaces = []
- vfaces = []
- wires = []
holes = []
-
+ faces = []
for b in obj.Base:
for sub in b[1]:
- # we only consider the outer wire if this is a Face
- # Horizontal and vertical faces are handled differently
shape = getattr(b[0].Shape, sub)
- if numpy.isclose(abs(shape.normalAt(0, 0).z), 1): # horizontal face
- hfaces.append(shape)
+ if isinstance (shape, Part.Face):
+ faces.append(shape)
+ if numpy.isclose(abs(shape.normalAt(0, 0).z), 1): # horizontal face
+ holes += shape.Wires[1:]
- elif numpy.isclose(shape.normalAt(0, 0).z, 0): # vertical face
- vfaces.append(shape)
else:
- FreeCAD.Console.PrintError(translate("Path", "Face doesn't appear to be parallel or perpendicular to the XY plane. No path will be generated for: \n"))
- FreeCAD.Console.PrintError(b[0].Name + "." + sub + "\n")
+ print ("found a base object which is not a face. Can't continue.")
+ return
+ profileshape = Part.makeCompound(faces)
+ profilewire = TechDraw.findShapeOutline(profileshape, 1, Vector(0,0,1))
if obj.processHoles:
- for h in hfaces:
- holes += h.Wires[1:]
-
- for h in hfaces:
- wires.append(h.OuterWire)
-
- tempshell = Part.makeShell(vfaces)
- slices = tempshell.slice(FreeCAD.Base.Vector(0, 0, 1), tempshell.CenterOfMass.z )
-
- wires = wires + slices
-
- for wire in holes:
- if obj.Algorithm == "OCC Native":
- output += self._buildPathOCC(obj, wire)
- else:
- try:
- import area
- except:
- FreeCAD.Console.PrintError(translate("Path", "libarea needs to be installed for this command to work.\n"))
- return
+ for wire in holes:
edgelist = wire.Edges
edgelist = Part.__sortEdges__(edgelist)
output += self._buildPathLibarea(obj, edgelist, True)
-
- for wire in wires:
- if obj.Algorithm == "OCC Native":
- output += self._buildPathOCC(obj, wire)
- else:
- try:
- import area
- except:
- FreeCAD.Console.PrintError(translate("Path", "libarea needs to be installed for this command to work.\n"))
- return
- edgelist = wire.Edges
- edgelist = Part.__sortEdges__(edgelist)
- output += self._buildPathLibarea(obj, edgelist, False)
+
+ if obj.processPerimeter:
+ edgelist = profilewire.Edges
+ edgelist = Part.__sortEdges__(edgelist)
+ output += self._buildPathLibarea(obj, edgelist, False)
if obj.Active:
path = Path.Path(output)
@@ -500,12 +442,9 @@ class CommandPathProfile:
FreeCADGui.addModule("PathScripts.PathProfile")
FreeCADGui.doCommand('obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "Profile")')
FreeCADGui.doCommand('PathScripts.PathProfile.ObjectProfile(obj)')
- FreeCADGui.doCommand('PathScripts.PathProfile._ViewProviderProfile(obj.ViewObject)')
FreeCADGui.doCommand('obj.Active = True')
- FreeCADGui.doCommand('obj.Algorithm = "libarea"')
-
FreeCADGui.doCommand('obj.ClearanceHeight = ' + str(ztop + 10.0))
FreeCADGui.doCommand('obj.StepDown = 1.0')
FreeCADGui.doCommand('obj.StartDepth= ' + str(ztop))
@@ -514,11 +453,12 @@ class CommandPathProfile:
FreeCADGui.doCommand('obj.SafeHeight = ' + str(ztop + 2.0))
FreeCADGui.doCommand('obj.Side = "Left"')
FreeCADGui.doCommand('obj.OffsetExtra = 0.0')
- FreeCADGui.doCommand('obj.Direction = "CW"')
+ FreeCADGui.doCommand('obj.Direction = "CCW"')
FreeCADGui.doCommand('obj.UseComp = False')
- FreeCADGui.doCommand('obj.processHoles = False')
+ FreeCADGui.doCommand('obj.processHoles = False')
+ FreeCADGui.doCommand('obj.processPerimeter = True')
FreeCADGui.doCommand('obj.PlungeAngle = 90.0')
- #FreeCADGui.doCommand('obj.ActiveTC = None')
+ FreeCADGui.doCommand('PathScripts.PathProfile._ViewProviderProfile(obj.ViewObject)')
FreeCADGui.doCommand('PathScripts.PathUtils.addToJob(obj)')
FreeCAD.ActiveDocument.commitTransaction()
@@ -570,14 +510,14 @@ class TaskPanel:
self.obj.UseStartPoint = self.form.useStartPoint.isChecked()
if hasattr(self.obj, "UseEndPoint"):
self.obj.UseEndPoint = self.form.useEndPoint.isChecked()
- if hasattr(self.obj, "Algorithm"):
- self.obj.Algorithm = str(self.form.algorithmSelect.currentText())
if hasattr(self.obj, "Side"):
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, "processHoles"):
self.obj.processHoles = self.form.processHoles.isChecked()
+ if hasattr(self.obj, "processPerimeter"):
+ self.obj.processPerimeter = self.form.processPerimeter.isChecked()
self.obj.Proxy.execute(self.obj)
def setFields(self):
@@ -594,13 +534,7 @@ class TaskPanel:
self.form.useStartPoint.setChecked(self.obj.UseStartPoint)
self.form.useEndPoint.setChecked(self.obj.UseEndPoint)
self.form.processHoles.setChecked(self.obj.processHoles)
-
- 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)
+ self.form.processPerimeter.setChecked(self.obj.processPerimeter)
index = self.form.cutSide.findText(
self.obj.Side, QtCore.Qt.MatchFixedString)
@@ -616,10 +550,13 @@ class TaskPanel:
self.form.direction.setCurrentIndex(index)
self.form.direction.blockSignals(False)
+ self.form.baseList.blockSignals(True)
for i in self.obj.Base:
for sub in i[1]:
self.form.baseList.addItem(i[0].Name + "." + sub)
+ self.form.baseList.blockSignals(False)
+ self.form.tagTree.blockSignals(True)
for i in range(len(self.obj.locs)):
item = QtGui.QTreeWidgetItem(self.form.tagTree)
item.setText(0, str(i+1))
@@ -630,6 +567,9 @@ class TaskPanel:
item.setText(4, str(self.obj.angles[i]))
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
item.setTextAlignment(0, QtCore.Qt.AlignLeft)
+ self.form.tagTree.blockSignals(False)
+ self.form.update()
+
def open(self):
self.s = SelObserver()
@@ -807,7 +747,6 @@ class TaskPanel:
self.form.clearanceHeight.editingFinished.connect(self.getFields)
# operation
- self.form.algorithmSelect.currentIndexChanged.connect(self.getFields)
self.form.cutSide.currentIndexChanged.connect(self.getFields)
self.form.direction.currentIndexChanged.connect(self.getFields)
self.form.useCompensation.clicked.connect(self.getFields)
@@ -817,6 +756,7 @@ class TaskPanel:
self.form.segLen.editingFinished.connect(self.getFields)
self.form.rollRadius.editingFinished.connect(self.getFields)
self.form.processHoles.clicked.connect(self.getFields)
+ self.form.processPerimeter.clicked.connect(self.getFields)
# Tag Form
QtCore.QObject.connect(
diff --git a/src/Mod/Path/PathScripts/PathProfileEdges.py b/src/Mod/Path/PathScripts/PathProfileEdges.py
index cd13dcf9b..a56a21440 100644
--- a/src/Mod/Path/PathScripts/PathProfileEdges.py
+++ b/src/Mod/Path/PathScripts/PathProfileEdges.py
@@ -528,11 +528,13 @@ class TaskPanel:
self.obj.Direction, QtCore.Qt.MatchFixedString)
if index >= 0:
self.form.direction.setCurrentIndex(index)
-
+ self.form.baseList.blockSignals(True)
for i in self.obj.Base:
for sub in i[1]:
self.form.baseList.addItem(i[0].Name + "." + sub)
+ self.form.baseList.blockSignals(False)
+ self.form.tagTree.blockSignals(True)
for i in range(len(self.obj.locs)):
item = QtGui.QTreeWidgetItem(self.form.tagTree)
item.setText(0, str(i+1))
@@ -543,6 +545,8 @@ class TaskPanel:
item.setText(4, str(self.obj.angles[i]))
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
item.setTextAlignment(0, QtCore.Qt.AlignLeft)
+ self.form.tagTree.blockSignals(False)
+
def open(self):
self.s = SelObserver()