use shape.proximity(s) to test for overlapping faces in CSG import

This commit is contained in:
Sebastian Hoogen 2015-03-15 10:58:43 +01:00 committed by wmayer
parent 565a875365
commit 01b491b16e

View File

@ -51,6 +51,11 @@ class Overlappingfaces():
return all([f1.isInside(vert.Point,tol,inface) for vert in verts]) return all([f1.isInside(vert.Point,tol,inface) for vert in verts])
return vertsinface(bigface,smallface.Vertexes) return vertsinface(bigface,smallface.Vertexes)
@staticmethod
def dofacesoverlapproximity(bigface,smallface):
l1,l2 = bigface.proximity(smallface)
return len(l1) > 0 or len(l2) > 0
@staticmethod @staticmethod
def dofacesoverlapboolean(bigface,smallface): def dofacesoverlapboolean(bigface,smallface):
#import FreeCAD,FreeCADGui #import FreeCAD,FreeCADGui
@ -64,13 +69,20 @@ class Overlappingfaces():
#isinsidelist = [] #isinsidelist = []
self.isinsidedict = {} self.isinsidedict = {}
#for bigface, smallface in itertools.combinations(sortedfaces,2): #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.dofacesoverlapproximity(\
self.sortedfaces[bigfacei],self.sortedfaces[smallfacei])
except (NotImplementedError, Part.OCCError) as e:
try: try:
overlap = Overlappingfaces.dofacesoverlapboolean(\ overlap = Overlappingfaces.dofacesoverlapboolean(\
self.sortedfaces[bigfacei],self.sortedfaces[smallfacei]) self.sortedfaces[bigfacei],\
self.sortedfaces[smallfacei])
except Part.OCCError: except Part.OCCError:
overlap = Overlappingfaces.dofacesoverlapallverts(\ overlap = Overlappingfaces.dofacesoverlapallverts(\
self.sortedfaces[bigfacei],self.sortedfaces[smallfacei]) self.sortedfaces[bigfacei],\
self.sortedfaces[smallfacei])
if overlap: if overlap:
#isinsidelist.append((bigfacei,smallfacei)) #isinsidelist.append((bigfacei,smallfacei))
smallinbig = self.isinsidedict.get(bigfacei,[]) smallinbig = self.isinsidedict.get(bigfacei,[])
@ -158,8 +170,10 @@ class Overlappingfaces():
if len(directchildren) == 1: if len(directchildren) == 1:
obj.Tool = addfeature(directchildren[0],subdict) obj.Tool = addfeature(directchildren[0],subdict)
else: else:
obj.Tool = doc.addObject("Part::MultiFuse","facesfromedges_union") obj.Tool = doc.addObject("Part::MultiFuse",\
obj.Tool.Shapes = [addfeature(child,subdict) for child in directchildren] "facesfromedges_union")
obj.Tool.Shapes = [addfeature(child,subdict)\
for child in directchildren]
obj.Tool.ViewObject.hide() obj.Tool.ViewObject.hide()
obj.ViewObject.hide() obj.ViewObject.hide()
return obj return obj