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

Reply via email to