From c24ea6eff30f134917a73b0158c15754d94ae584 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 27 Oct 2017 16:41:31 -0200 Subject: [PATCH] Draft/Arch: Support for Y situations in sketches - issue #3163 --- src/Mod/Arch/ArchWall.py | 9 +++++++-- src/Mod/Draft/Draft.py | 3 ++- src/Mod/Draft/DraftGeomUtils.py | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/Mod/Arch/ArchWall.py b/src/Mod/Arch/ArchWall.py index b4bd5adda3..7cd8975ef5 100644 --- a/src/Mod/Arch/ArchWall.py +++ b/src/Mod/Arch/ArchWall.py @@ -625,10 +625,11 @@ class _Wall(ArchComponent.Component): return None else: base,placement = self.rebase(obj.Base.Shape) - elif obj.Base.Shape.Wires: - basewires = obj.Base.Shape.Wires elif len(obj.Base.Shape.Edges) == 1: basewires = [Part.Wire(obj.Base.Shape.Edges)] + else: + # basewires = obj.Base.Shape.Wires + basewires = [Part.Wire(cluster) for cluster in Part.getSortedClusters(obj.Base.Shape.Edges)] if basewires and width: if (len(basewires) == 1) and layers: basewires = [basewires[0] for l in layers] @@ -695,6 +696,10 @@ class _Wall(ArchComponent.Component): baseface.append(f) else: baseface = baseface.fuse(f) + # baseface = baseface.removeSplitter() + s = DraftGeomUtils.removeSplitter(baseface) + if s: + baseface = s else: if layers: baseface = [f] diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 7928f68b33..e962792026 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -1727,7 +1727,8 @@ def draftify(objectslist,makeblock=False,delete=True): newobjlist = [] for obj in objectslist: if obj.isDerivedFrom('Part::Feature'): - for w in obj.Shape.Wires: + for cluster in Part.getSortedClusters(obj.Shape.Edges): + w = Part.Wire(cluster) if DraftGeomUtils.hasCurves(w): if (len(w.Edges) == 1) and (DraftGeomUtils.geomType(w.Edges[0]) == "Circle"): nobj = makeCircle(w.Edges[0]) diff --git a/src/Mod/Draft/DraftGeomUtils.py b/src/Mod/Draft/DraftGeomUtils.py index 4fe1ac5e2c..f6531fc4d1 100755 --- a/src/Mod/Draft/DraftGeomUtils.py +++ b/src/Mod/Draft/DraftGeomUtils.py @@ -2129,6 +2129,29 @@ def rebaseWire(wire,vidx): return Part.Wire(wire.Edges[vidx-1:] + wire.Edges[:vidx-1]) +def removeSplitter(shape): + """an alternative, shared edge-based version of Part.removeSplitter. Returns a + face or None if the operation failed""" + lut = {} + for f in shape.Faces: + for e in f.Edges: + h = e.hashCode() + if h in lut: + lut[h].append(e) + else: + lut[h] = [e] + edges = [e[0] for e in lut.values() if len(e) == 1] + try: + face = Part.Face(Part.Wire(edges)) + except: + # operation failed + return None + else: + if face.isValid(): + return face + return None + + # circle functions *********************************************************