From 01b491b16e98adc6a2f3fc5e2a8bc528c734fcbd Mon Sep 17 00:00:00 2001 From: Sebastian Hoogen Date: Sun, 15 Mar 2015 10:58:43 +0100 Subject: [PATCH] use shape.proximity(s) to test for overlapping faces in CSG import --- src/Mod/OpenSCAD/OpenSCAD2Dgeom.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py b/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py index 76b8858ab..0ce879776 100644 --- a/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py +++ b/src/Mod/OpenSCAD/OpenSCAD2Dgeom.py @@ -51,6 +51,11 @@ class Overlappingfaces(): return all([f1.isInside(vert.Point,tol,inface) for vert in verts]) return vertsinface(bigface,smallface.Vertexes) + @staticmethod + def dofacesoverlapproximity(bigface,smallface): + l1,l2 = bigface.proximity(smallface) + return len(l1) > 0 or len(l2) > 0 + @staticmethod def dofacesoverlapboolean(bigface,smallface): #import FreeCAD,FreeCADGui @@ -64,13 +69,20 @@ class Overlappingfaces(): #isinsidelist = [] self.isinsidedict = {} #for bigface, smallface in itertools.combinations(sortedfaces,2): - for bigfacei, smallfacei in itertools.combinations(range(len(self.sortedfaces)),2): + for bigfacei, smallfacei in\ + itertools.combinations(range(len(self.sortedfaces)),2): try: - overlap = Overlappingfaces.dofacesoverlapboolean(\ - self.sortedfaces[bigfacei],self.sortedfaces[smallfacei]) - except Part.OCCError: - overlap = Overlappingfaces.dofacesoverlapallverts(\ + overlap = Overlappingfaces.dofacesoverlapproximity(\ self.sortedfaces[bigfacei],self.sortedfaces[smallfacei]) + except (NotImplementedError, Part.OCCError) as e: + try: + overlap = Overlappingfaces.dofacesoverlapboolean(\ + self.sortedfaces[bigfacei],\ + self.sortedfaces[smallfacei]) + except Part.OCCError: + overlap = Overlappingfaces.dofacesoverlapallverts(\ + self.sortedfaces[bigfacei],\ + self.sortedfaces[smallfacei]) if overlap: #isinsidelist.append((bigfacei,smallfacei)) smallinbig = self.isinsidedict.get(bigfacei,[]) @@ -158,8 +170,10 @@ class Overlappingfaces(): if len(directchildren) == 1: obj.Tool = addfeature(directchildren[0],subdict) else: - obj.Tool = doc.addObject("Part::MultiFuse","facesfromedges_union") - obj.Tool.Shapes = [addfeature(child,subdict) for child in directchildren] + obj.Tool = doc.addObject("Part::MultiFuse",\ + "facesfromedges_union") + obj.Tool.Shapes = [addfeature(child,subdict)\ + for child in directchildren] obj.Tool.ViewObject.hide() obj.ViewObject.hide() return obj