diff --git a/src/Mod/Path/PathScripts/PathJobGui.py b/src/Mod/Path/PathScripts/PathJobGui.py index 5feee1c51b..afd10ddc07 100644 --- a/src/Mod/Path/PathScripts/PathJobGui.py +++ b/src/Mod/Path/PathScripts/PathJobGui.py @@ -224,9 +224,10 @@ class StockEdit(object): Index = -1 StockType = PathStock.StockType.Unknown - def __init__(self, obj, form): + def __init__(self, obj, form, force): self.obj = obj self.form = form + self.force = force self.setupUi(obj) @classmethod @@ -250,6 +251,7 @@ class StockEdit(object): self.setFields(obj) def setStock(self, obj, stock): + PathLog.track(obj.Label, stock) if obj.Stock: obj.Document.removeObject(self.obj.Stock.Name) obj.Stock = stock @@ -272,6 +274,7 @@ class StockFromBaseBoundBoxEdit(StockEdit): StockType = PathStock.StockType.FromBase def editorFrame(self): + PathLog.track() return self.form.stockFromBase def getFields(self, obj, fields = ['xneg', 'xpos', 'yneg', 'ypos', 'zneg', 'zpos']): @@ -296,8 +299,11 @@ class StockFromBaseBoundBoxEdit(StockEdit): PathLog.error(translate('PathJob', 'Stock not from Base bound box!')) def setFields(self, obj): - if not self.IsStock(obj): + PathLog.track() + if self.force or not self.IsStock(obj): + PathLog.track() self.setStock(obj, PathStock.CreateFromBase(obj)) + self.force = False self.setLengthField(self.form.stockExtXneg, obj.Stock.ExtXneg) self.setLengthField(self.form.stockExtXpos, obj.Stock.ExtXpos) self.setLengthField(self.form.stockExtYneg, obj.Stock.ExtYneg) @@ -306,6 +312,7 @@ class StockFromBaseBoundBoxEdit(StockEdit): self.setLengthField(self.form.stockExtZpos, obj.Stock.ExtZpos) def setupUi(self, obj): + PathLog.track() self.setFields(obj) self.checkXpos() self.checkYpos() @@ -368,8 +375,9 @@ class StockCreateBoxEdit(StockEdit): pass def setFields(self, obj): - if not self.IsStock(obj): + if self.force or not self.IsStock(obj): self.setStock(obj, PathStock.CreateBox(obj)) + self.force = False self.setLengthField(self.form.stockBoxLength, obj.Stock.Length) self.setLengthField(self.form.stockBoxWidth, obj.Stock.Width) self.setLengthField(self.form.stockBoxHeight, obj.Stock.Height) @@ -400,8 +408,9 @@ class StockCreateCylinderEdit(StockEdit): pass def setFields(self, obj): - if not self.IsStock(obj): + if self.force or not self.IsStock(obj): self.setStock(obj, PathStock.CreateCylinder(obj)) + self.force = False self.setLengthField(self.form.stockCylinderRadius, obj.Stock.Radius) self.setLengthField(self.form.stockCylinderHeight, obj.Stock.Height) @@ -897,22 +906,28 @@ class TaskPanel: FreeCADGui.Selection.addSelection(selObject, selFeature) return (selObject, p) - def updateStockEditor(self, index): + def updateStockEditor(self, index, force = False): def setupFromBaseEdit(): - if not self.stockFromBase: - self.stockFromBase = StockFromBaseBoundBoxEdit(self.obj, self.form) + PathLog.track(index, force) + if force or not self.stockFromBase: + self.stockFromBase = StockFromBaseBoundBoxEdit(self.obj, self.form, force) + else: + PathLog.error('wtf') self.stockEdit = self.stockFromBase def setupCreateBoxEdit(): - if not self.stockCreateBox: - self.stockCreateBox = StockCreateBoxEdit(self.obj, self.form) + PathLog.track(index, force) + if force or not self.stockCreateBox: + self.stockCreateBox = StockCreateBoxEdit(self.obj, self.form, force) self.stockEdit = self.stockCreateBox def setupCreateCylinderEdit(): - if not self.stockCreateCylinder: - self.stockCreateCylinder = StockCreateCylinderEdit(self.obj, self.form) + PathLog.track(index, force) + if force or not self.stockCreateCylinder: + self.stockCreateCylinder = StockCreateCylinderEdit(self.obj, self.form, force) self.stockEdit = self.stockCreateCylinder def setupFromExisting(): - if not self.stockFromExisting: - self.stockFromExisting = StockFromExistingEdit(self.obj, self.form) + PathLog.track(index, force) + if force or not self.stockFromExisting: + self.stockFromExisting = StockFromExistingEdit(self.obj, self.form, force) if self.stockFromExisting.candidates(self.obj): self.stockEdit = self.stockFromExisting return True @@ -1045,7 +1060,7 @@ class TaskPanel: self.template.updateUI() def setupUi(self, activate): - self.updateStockEditor(-1) + self.updateStockEditor(-1, True) self.setFields() # Info diff --git a/src/Mod/Path/PathScripts/PathPocketShape.py b/src/Mod/Path/PathScripts/PathPocketShape.py index 902168a0ad..4336eb2f8a 100644 --- a/src/Mod/Path/PathScripts/PathPocketShape.py +++ b/src/Mod/Path/PathScripts/PathPocketShape.py @@ -133,12 +133,16 @@ class ObjectPocket(PathPocketBase.ObjectPocket): else: # process the job base object as a whole PathLog.debug("processing the whole job base object") - self.outline = Part.Face(TechDraw.findShapeOutline(self.baseobject.Shape, 1, FreeCAD.Vector(0, 0, 1))) + self.outlines = [Part.Face(TechDraw.findShapeOutline(base.Shape, 1, FreeCAD.Vector(0, 0, 1))) for base in self.model] stockBB = self.stock.Shape.BoundBox - self.outline.translate(FreeCAD.Vector(0, 0, stockBB.ZMin - 1)) - self.body = self.outline.extrude(FreeCAD.Vector(0, 0, stockBB.ZLength + 2)) - self.removalshapes = [(self.stock.Shape.cut(self.body), False)] + self.removalshapes = [] + self.bodies = [] + for outline in self.outlines: + outline.translate(FreeCAD.Vector(0, 0, stockBB.ZMin - 1)) + body = outline.extrude(FreeCAD.Vector(0, 0, stockBB.ZLength + 2)) + self.bodies.append(body) + self.removalshapes.append((self.stock.Shape.cut(body), False)) for (shape,hole) in self.removalshapes: shape.tessellate(0.1) diff --git a/src/Mod/Path/PathScripts/PathProfileFaces.py b/src/Mod/Path/PathScripts/PathProfileFaces.py index 1b9c21783c..f5de618f13 100644 --- a/src/Mod/Path/PathScripts/PathProfileFaces.py +++ b/src/Mod/Path/PathScripts/PathProfileFaces.py @@ -111,23 +111,22 @@ class ObjectProfile(PathProfileBase.ObjectProfile): shapes.append((env, False)) else: # Try to build targets from the job base - # XXX ArchPanels support not implemented yet - if False and hasattr(self.baseobject, "Proxy"): - if isinstance(self.baseobject.Proxy, ArchPanel.PanelSheet): # process the sheet + if 1 == len(self.model) and hasattr(self.model[0], "Proxy"): + if isinstance(self.model[0].Proxy, ArchPanel.PanelSheet): # process the sheet if obj.processCircles or obj.processHoles: - for shape in self.baseobject.Proxy.getHoles(self.baseobject, transform=True): + for shape in self.model[0].Proxy.getHoles(self.model[0], transform=True): for wire in shape.Wires: - drillable = PathUtils.isDrillable(self.baseobject.Proxy, wire) + drillable = PathUtils.isDrillable(self.model[0].Proxy, wire) if (drillable and obj.processCircles) or (not drillable and obj.processHoles): f = Part.makeFace(wire, 'Part::FaceMakerSimple') - env = PathUtils.getEnvelope(self.baseobject.Shape, subshape=f, depthparams=self.depthparams) + env = PathUtils.getEnvelope(self.model[0].Shape, subshape=f, depthparams=self.depthparams) shapes.append((env, True)) if obj.processPerimeter: - for shape in self.baseobject.Proxy.getOutlines(self.baseobject, transform=True): + for shape in self.model[0].Proxy.getOutlines(self.model[0], transform=True): for wire in shape.Wires: f = Part.makeFace(wire, 'Part::FaceMakerSimple') - env = PathUtils.getEnvelope(self.baseobject.Shape, subshape=f, depthparams=self.depthparams) + env = PathUtils.getEnvelope(self.model[0].Shape, subshape=f, depthparams=self.depthparams) shapes.append((env, False)) PathLog.debug("%d shapes" % len(shapes)) diff --git a/src/Mod/Path/PathScripts/PathStock.py b/src/Mod/Path/PathScripts/PathStock.py index fac9f65b1f..9f1756c5b5 100644 --- a/src/Mod/Path/PathScripts/PathStock.py +++ b/src/Mod/Path/PathScripts/PathStock.py @@ -112,8 +112,11 @@ class StockFromBase(Stock): obj.ExtZpos= 1.0 # placement is only tracked on creation - bb = shapeBoundBox(base) - obj.Placement = FreeCAD.Placement(FreeCAD.Vector(bb.XMin, bb.YMin, bb.ZMin), FreeCAD.Rotation()) + bb = shapeBoundBox(base.Group) + if bb: + obj.Placement = FreeCAD.Placement(FreeCAD.Vector(bb.XMin, bb.YMin, bb.ZMin), FreeCAD.Rotation()) + else: + PathLog.track(obj.Label, base.Label) obj.Proxy = self def __getstate__(self): @@ -210,6 +213,7 @@ class StockCreateCylinder(Stock): self.execute(obj) def SetupStockObject(obj, stockType): + PathLog.track(obj.Label, stockType) if FreeCAD.GuiUp and obj.ViewObject: obj.addProperty('App::PropertyString', 'StockType', 'Stock', QtCore.QT_TRANSLATE_NOOP("PathStock", "Internal representation of stock type")) obj.StockType = stockType @@ -220,6 +224,7 @@ def SetupStockObject(obj, stockType): obj.ViewObject.DisplayMode = 'Wireframe' def CreateFromBase(job, neg=None, pos=None, placement=None): + PathLog.track(job.Label, neg, pos, placement) base = job.Model if job and hasattr(job, 'Model') else None if base: base.Shape.tessellate(0.1)