From 6b1f8f007414547ae99d87507daf074934110937 Mon Sep 17 00:00:00 2001 From: "Morgan 'ARR\\!' Allen" Date: Sun, 25 Dec 2022 00:04:17 -0800 Subject: [PATCH] major refactor on processing approach instead of processing from an Assembly Link prospective, it now just pulls bodies from the first level Links in the Assembly. From those LCS points are found. Planes and sketches are created from there --- Macro/FlatpackWB.FCMacro | 97 ++++++++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/Macro/FlatpackWB.FCMacro b/Macro/FlatpackWB.FCMacro index 17c41c1..985ea43 100644 --- a/Macro/FlatpackWB.FCMacro +++ b/Macro/FlatpackWB.FCMacro @@ -18,7 +18,7 @@ class FlatpackGroupViewProvider(): self.Proxy = group class FlatpackWBTools(): - def createDatumPlaneOnLink(self, part, link): + def createDatumPlaneOnLink(self, part): plane = part.newObject('PartDesign::Plane', 'DatumPlane') return plane @@ -33,48 +33,69 @@ class FlatpackWBTools(): self.links = self.findLinks(asm) + assembly_bodies = [] + for link in self.links: - attached_to = ad.getObject(link.AttachedTo.split('#')[1]) - - # not much to do when attached to the root - if attached_to.Name == 'LCS_Origin': - print('Skipping LCS_Origin') - continue + if link.LinkedObject not in assembly_bodies: + assembly_bodies.append(link.LinkedObject) - print(link.Name, link.Placement) + continue - # find all the App::Links that are on the same Plane as this one - coplaner_links = [] - for i in [ l for l in link.OutList if l.TypeId == 'PartDesign::CoordinateSystem' ]: - if l not in coplaner_links and abs(link.Placement.Base.z - l.Placement.Base.z) < 0.000001: - print(link.Label, l.Label, abs(link.Placement.Base.z- l.Placement.Base.z), link.Placement.Base.z==l.Placement.Base.z) - coplaner_links.append(l) + for body in assembly_bodies: + sketch_planes = {} + sketch_pockets = {} + sketch_pads = {} - print('coplaner_links', coplaner_links) - for cp_link in coplaner_links: - base = cp_link.Placement.Base + for lcs in self.findLCS(body.OutList): + base = lcs.Placement.Base + z = base.z - # create DatumPlane for Sketch Support - # TODO track planes per Z offset - plane = self.createDatumPlaneOnLink(link.LinkedObject, link) - plane.Visibility = False - plane.Placement.Base.z = base.z + if sketch_planes.get(z) is None: + # create new plane to hold sketch + plane = self.createDatumPlaneOnLink(body) + plane.Visibility = False + plane.Placement.Base.z = z - # create Sketch for drawing attachment features - sketch = self.createSketch(link.LinkedObject, plane) - sketch.Visibility = False + sketch_planes[z] = plane + else: + plane = sketch_planes[z] - # TODO needs input parameters from 1) the Flatpack object 2) the depth of the LinkedObject - sketch.addGeometry(Part.LineSegment(App.Vector(base.x-10, base.y, 0), App.Vector(base.x+10, base.y, 0)), False) - sketch.addGeometry(Part.LineSegment(App.Vector(base.x+10, base.y, 0), App.Vector(base.x+10, base.y + 5, 0)), False) - sketch.addGeometry(Part.LineSegment(App.Vector(base.x+10, base.y + 5, 0), App.Vector(base.x-10, base.y + 5, 0)), False) - sketch.addGeometry(Part.LineSegment(App.Vector(base.x-10, base.y + 5, 0), App.Vector(base.x-10, base.y, 0)), False) - - # TODO determine if Feature should be Pad or Pocket, based on inside/outside of BoundingBox + bb = body.Shape.BoundBox + if self.insideBB(bb, lcs.Placement.Base): + sketch_book = sketch_pockets + sketch_label = 'Inside' + else: + sketch_book = sketch_pads + sketch_label = 'Outside' + + if sketch_book.get(z) is None: + sketch = self.createSketch(body, plane) + sketch.Visibility = False + sketch.Label = sketch_label + sketch_book[z] = sketch + else: + sketch = sketch_book[z] + + tab_length = abs(bb.ZMin) + bb.ZMax + + sketch.addGeometry(Part.LineSegment(App.Vector(base.x-10, base.y - (tab_length / 2), 0), App.Vector(base.x+10, base.y - (tab_length / 2), 0)), False) + sketch.addGeometry(Part.LineSegment(App.Vector(base.x+10, base.y - (tab_length / 2), 0), App.Vector(base.x+10, base.y + tab_length / 2, 0)), False) + sketch.addGeometry(Part.LineSegment(App.Vector(base.x+10, base.y + tab_length / 2, 0), App.Vector(base.x-10, base.y + tab_length / 2, 0)), False) + sketch.addGeometry(Part.LineSegment(App.Vector(base.x-10, base.y + tab_length / 2, 0), App.Vector(base.x-10, base.y - (tab_length / 2), 0)), False) + + for z in sketch_pads: + sketch = sketch_pads[z] pad = link.LinkedObject.newObject('PartDesign::Pad', 'Pad') pad.Profile = sketch - # TODO get value from elsewhere - pad.Length = 10 + pad.Length = tab_length + pad.Midplane = 1 + pad.Refine = 1 + + for z in sketch_pockets: + sketch = sketch_pockets[z] + pad = link.LinkedObject.newObject('PartDesign::Pocket', 'Pocket') + pad.Profile = sketch + pad.Length = tab_length pad.Midplane = 1 pad.Refine = 1 @@ -99,16 +120,24 @@ class FlatpackWBTools(): def findLinks(self, asm, discard_origin = False): return [] if not asm else [el for el in asm.OutList if el.TypeId == 'App::Link'] + def findLCS(self, obj_list): + return [ l for l in obj_list if l.TypeId == 'PartDesign::CoordinateSystem' ] + def getLinkOwner(self, link): return link.LinkedObject + def insideBB(self, bb, p): + return (p.x > bb.XMin and p.x < bb.XMax) and (p.y > bb.YMin and p.y < bb.YMax) and (p.z > bb.ZMin and p.z < bb.ZMax) + FP = App.Flatpack = FlatpackWBTools() asm = Gui.ActiveDocument.Document.getObject('Model') asm = FP.findAssembly() if asm: + ad.openTransaction('flatpack') FP.createGroup(asm) + ad.commitTransaction() else: print('No Assembly selected.')