From 173af46744ed45c77f870f06f21555244df48fa3 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 20 Apr 2012 13:07:42 -0300 Subject: [PATCH] Bugfixes in Arch Section plane --- src/Mod/Arch/ArchSectionPlane.py | 9 ++++--- src/Mod/Arch/ArchVRM.py | 3 +-- src/Mod/Draft/draftlibs/fcgeo.py | 43 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/Mod/Arch/ArchSectionPlane.py b/src/Mod/Arch/ArchSectionPlane.py index 4282d97f6..b50f0f5b4 100644 --- a/src/Mod/Arch/ArchSectionPlane.py +++ b/src/Mod/Arch/ArchSectionPlane.py @@ -195,9 +195,10 @@ class _ArchDrawingView: colors.append(color) sec = o.Shape.section(cp[0]) if sec.Edges: - sec = Part.Wire(fcgeo.sortEdges(sec.Edges)) - sec = Part.Face(sec) - sections.append(sec) + wires = fcgeo.findWires(sec.Edges) + for w in wires: + sec = Part.Face(fcgeo.sortEdges(w)) + sections.append(sec) else: shapes.append(o.Shape) colors.append(color) @@ -237,7 +238,7 @@ class _ArchDrawingView: def renderVRM(self,shapes,placement,colors,linewidth): "renders an SVG fragment with the ArchVRM method" import ArchVRM - render = ArchVRM.Renderer(debug=False) + render = ArchVRM.Renderer() render.setWorkingPlane(FreeCAD.Placement(placement)) for i in range(len(shapes)): if colors: diff --git a/src/Mod/Arch/ArchVRM.py b/src/Mod/Arch/ArchVRM.py index d910c7cae..c062d912e 100644 --- a/src/Mod/Arch/ArchVRM.py +++ b/src/Mod/Arch/ArchVRM.py @@ -31,7 +31,7 @@ MAXLOOP = 10 # the max number of loop before abort class Renderer: "A renderer object" - def __init__(self,wp=None,debug=None): + def __init__(self,wp=None): """ Creates a renderer with a default Draft WorkingPlane @@ -44,7 +44,6 @@ class Renderer: p.buildDummy() """ - if debug != None: DEBUG = debug self.defaultFill = (0.9,0.9,0.9,1.0) # the default fill color self.wp = wp self.faces = [] diff --git a/src/Mod/Draft/draftlibs/fcgeo.py b/src/Mod/Draft/draftlibs/fcgeo.py index 8b55e4fc9..d0543ee49 100755 --- a/src/Mod/Draft/draftlibs/fcgeo.py +++ b/src/Mod/Draft/draftlibs/fcgeo.py @@ -513,6 +513,49 @@ def sortEdges(lEdges, aVertex=None): else : return [] + +def findWires(edgeslist): + '''finds connected wires in the given list of edges''' + + def touches(e1,e2): + if len(e1.Vertexes) < 2: + return False + if len(e2.Vertexes) < 2: + return False + if fcvec.equals(e1.Vertexes[0].Point,e2.Vertexes[0].Point): + return True + if fcvec.equals(e1.Vertexes[0].Point,e2.Vertexes[-1].Point): + return True + if fcvec.equals(e1.Vertexes[-1].Point,e2.Vertexes[0].Point): + return True + if fcvec.equals(e1.Vertexes[-1].Point,e2.Vertexes[-1].Point): + return True + return False + + edges = edgeslist[:] + wires = [] + while edges: + e = edges[0] + if not wires: + # create first group + edges.remove(e) + wires.append([e]) + else: + found = False + for w in wires: + if found: + break + for we in w: + if touches(e,we): + edges.remove(e) + w.append(e) + found = True + break + else: + # edge doesn't connect with any existing group + edges.remove(e) + wires.append([e]) + return wires def superWire(edgeslist,closed=False): '''superWire(edges,[closed]): forces a wire between edges that don't necessarily