Hi again,
can you help me use ShapeFix in the correct way, or suggest other solutions to
a
problem with self-intersecting wires?
The code below generates an example of such a wire. There is a small loop close
to the point (1.0,1.0,0.0) which is the reason why no face can be made from it,
I guess.
The code also shows my attempt to solve the problem using sf=ShapeFix_Wire().
But sf.Perform() always fails, even if the wire is without problems (using
vertex definitions as in the line which is commented out).
What is the simplest solution to generate a face from self-intersecting wires
_automatically_? In my example, the small loop could be collapsed to a single
vertex, or the wire could be split into two (the large loop and the small loop)
- both solutions would be fine.
How about OCC's ShapeHealing functions? Are they more powerful than ShapeFix? I
don't understand the relation between ShapeFix and ShapeHealing. Is
ShapeHealing
available in the non-commercial OCC distribution?
Thank you
Björn
--- code example: ---
from OCC.BRepBuilderAPI import *
from OCC.gp import *
from OCC.ShapeFix import *
from OCC.TopoDS import *
def fixWire(wire):
sf=ShapeFix_Wire()
sf.Load(wire)
sf.SetFixIntersectingEdgesMode(1)
sf.SetFixNonAdjacentIntersectingEdgesMode(1)
sf.SetFixSelfIntersectingEdgeMode(1)
if sf.Perform():
print 'Fix Successful'
return sf.Wire()
else:
print 'Fix Unsuccessful'
return wire
def vertex(x,y,z):
mv=BRepBuilderAPI_MakeVertex(gp_Pnt(x,y,z))
return mv.Vertex()
def edge(v1,v2):
me=BRepBuilderAPI_MakeEdge(v1,v2)
return me.Edge()
def face(w):
mf=BRepBuilderAPI_MakeFace(w)
return mf.Face()
def wire(e1,e2,e3,e4):
mw=BRepBuilderAPI_MakeWire(e1)
mw.Add(e2); mw.Add(e3); mw.Add(e4);
return mw.Wire()
v=[vertex(0,0,0),vertex(1,0,0),vertex(0.95,1,0),vertex(1,1,0)] #self
intersecting, no face visible
#v=[vertex(0,0,0),vertex(1,0,0),vertex(1,1,0),vertex(0.9,1,0)] #valid wire
e=[]
for i in range(4):
e.append(edge(v[i-1],v[i]))
w=wire(e[0],e[1],e[2],e[3])
f=face(fixWire(w))
from OCC.Display.SimpleGui import *
display, start_display, add_menu, add_function_to_menu = init_display()
display.DisplayShape([w,f])
start_display()
_______________________________________________
Pythonocc-users mailing list
[email protected]
https://mail.gna.org/listinfo/pythonocc-users