That's very instructive Thomas, I completely forgot about this too... On Wed, Jan 5, 2011 at 5:50 AM, Thomas Paviot <tpav...@gmail.com> wrote:
> 2011/1/4 Balint Balassa <balint.bala...@gmx.de> > > Hi everyone, >> >> I'm relatively new to pythonOCC and I'm having a bit of a problem with my >> code. It's really quite basic. I created a cylinder and extracted an edge, >> which I made into a wire and a face, which in theory should not be a >> problem. Unfortunately the face does not show up in the display window (see >> the code below). I've tried the doxygen documentation, but didn't find >> anything helpful. Is there any way to make a face from extracted edges? >> Thank you very much for your help in advance. >> >> Regards, >> Balint >> >> >> >> import OCC.TopoDS >> from OCC.Utils.Topology import Topo >> from OCC.TopTools import * >> import math >> >> from OCC.Display.SimpleGui import * >> display, start_display, add_menu, add_function_to_menu = init_display() >> >> shroudRadius = 3.0 >> hubRadius = 1.0 >> radius = 0.2 >> epsilon = 1.0e-1 >> >> ## Creating circle and making cylinder: >> centerCircle = OCC.gp.gp_Pnt(hubRadius-epsilon, 0, 0.5) >> myAX2 = OCC.gp.gp_Ax2(centerCircle,OCC.gp.gp_Dir(1, 0, 0)) >> circle = OCC.gp.gp_Circ(myAX2, radius) >> >> Edge2 = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeEdge(circle, 0, >> 2.0*math.pi).Edge() >> ExistingWire = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeWire(Edge2).Wire() >> PrismFace = >> OCC.BRepBuilderAPI.BRepBuilderAPI_MakeFace(ExistingWire).Shape() >> >> length = OCC.gp.gp_Vec(shroudRadius-hubRadius+2.0*epsilon, 0, 0) >> >> bladeSurface = OCC.BRepPrimAPI.BRepPrimAPI_MakePrism(PrismFace, >> length).Shape() >> bladeSurface = OCC.BRepPrimAPI.BRepPrimAPI_MakePrism(ExistingWire, >> length).Shape() >> #display.DisplayShape(bladeSurface) >> topoBlade = OCC.Utils.Topology.Topo(bladeSurface) >> topoBlade.number_of_shells() >> bladeFace = topoBlade.faces().next() >> >> ## Getting the desired edge: >> edges = [] >> for edge in topoBlade.edges_from_face(bladeFace): >> edge.Reverse() >> edges.append(edge) >> >> ## Creating wire and face >> edgeWire = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeWire(edges[1]).Wire() >> edgeFace = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeFace(edgeWire).Shape() >> display.DisplayShape(edgeFace) >> start_display() >> > > Hi Balint, > > Jelle's fix works perfectly, and is quite more pythonic than your code, > however you may know *why* the planar face is not displayed. So here is a > code that reproduces the issue you reported: > > ####### > from OCC.BRepPrimAPI import * > from OCC.BRepBuilderAPI import * > from OCC.Utils.Construct import * > from OCC.gp import * > import math > > from OCC.Display.SimpleGui import * > display, start_display, add_menu, add_function_to_menu = init_display() > > ## Creating circle > centerCircle = gp_Pnt(1, 0, 0.5) > myAX2 = gp_Ax2(centerCircle,gp_Dir(1, 0, 0)) > circle = gp_Circ(myAX2, 0.2) > edge = BRepBuilderAPI_MakeEdge(circle, 0, 2.0*math.pi).Edge() > wire = BRepBuilderAPI_MakeWire(edge).Wire() > > ## Creating cylinder from extrusion of wire > extrusion_vector = gp_Vec(2., 0., 0.) > cylinderSurface = BRepPrimAPI_MakePrism(wire, extrusion_vector).Shape() > planeFace = BRepBuilderAPI_MakeFace(wire).Shape() > > display.DisplayShape(planeFace) > display.DisplayShape(cylinderSurface) > start_display() > ############ > > You will notice that the 'planeFace' is not displayed. However, if you > switch the cylinderSurface and planeFace lines as following: > planeFace = BRepBuilderAPI_MakeFace(wire).Shape() > cylinderSurface = BRepPrimAPI_MakePrism(wire, extrusion_vector).Shape() > > Then this time, both planarFace and cylindersSurface will be displayed! > Weird, no? There are strange things happening here with C++ references and > pointers. Jelle's make_prim function actually pass the 'True' Parameter to > the BRepPrimAPI_MakePrism class. Here is a part of the OCC documentation > related to the BRepAPI_MakePrism class: > """ > //! Builds the prism of base S and vector V. If C is true, <br> > //! S is copied. If Canonize is true then generated surfaces <br> > //! are attempted to be canonized in simple types <br> > Standard_EXPORT BRepPrimAPI_MakePrism(const TopoDS_Shape& S,const gp_Vec& > V,const Standard_Boolean Copy = Standard_False,const Standard_Boolean > Canonize = Standard_True); > """ > > Just passing the 'True' parameter to BRepPrimAPI_MakePrism then makes the > __init__ method copy the S shape and build the prism from that function. > It's enough to solve the references/pointers/shared objects issues. > > Then, here is my solution to fix your code : just move the line > cylinderSurface = BRepPrimAPI_MakePrism(wire, extrusion_vector).Shape() > to > cylinderSurface = BRepPrimAPI_MakePrism(wire, > extrusion_vector,True).Shape() > > Less pythonic than Jelle (how could it be *more* pythonic than Jelle ;) ?), > but I hope you will deeply understand what happened. > > Thomas > > _______________________________________________ > Pythonocc-users mailing list > Pythonocc-users@gna.org > https://mail.gna.org/listinfo/pythonocc-users > >
_______________________________________________ Pythonocc-users mailing list Pythonocc-users@gna.org https://mail.gna.org/listinfo/pythonocc-users