Sat, 02/09/2019 - 00:22

I am trying to figure out how to get Open Cascade to return the edge, wire, and/or face representing the portion of an infinite cylinder (Geom_CylindricalSurface) that sits between two infinite planes (Geom_Plane).

I have managed to construct the top and bottom caps of the cylinder as Faces. The following snippet shows the construction of the bottom cap face of the cylinder.:

GeomAPI_IntSS intersect01(simpCyl,geoPln02,1.0E-7);

BRepBuilderAPI_MakeEdge cylEdge(intersect01.Line(1));

BRepBuilderAPI_MakeWire cylWire(cylEdge);

BRepBuilderAPI_MakeFace cylFace(cylWire);

Handle(AIS_Shape) cylShape = new AIS_Shape(TopoDS_Face());

cylShape->Set(cylFace.Face());

I can similarly get the bottom cap constructed. The trouble I am have is constructing the edge/wire/face of the body of the cylinder which is the portion of the infinite Geom_CylindricalSurface that lies between the two Geom_Planes.

Does anyone know how to use the various Open Cascade utilities to return the edge, wire, and/or face representing the portion of the infinite cylinder between two planes? Or alternatively how to construct the cylindrical body from the two edges/wires of the top and bottom faces of the cylinder?

Here are my plane and cylinder definitions:

/*

* Creates a plane using the form based on the general plane equation:

* Ax+By+Cz+D=0

*/

Handle(Geom_Plane) geoPln02 = new Geom_Plane(0.0,0.0,1.0,10.0);

Handle(Geom_Plane) geoPln03 = new Geom_Plane(0.0,0.0,1.0,-10.0);

Handle(AIS_Shape) plnShape2 = new AIS_Shape(TopoDS_Face());

Handle(Geom_CylindricalSurface) simpCyl = new Geom_CylindricalSurface(cylAx3, 5.0); //Creates infinite cylindrical surface

Thanks for any help you can provide!

Sun, 02/10/2019 - 19:11

Followup:

I managed to hit upon a solution but it may not be the most efficient. Any alternative ideas/approaches?

Using the 'Face' method from BRepFill I managed to create a face representing the cylinder body from the two edges create from the intersection of the two planes and infinite cylinder:

Where cylEdge is the same edge shown in the original post and cylEdge2 is the top edge on the cylinder created from an intersection between geoPln03 and simpCyl.

I was kind of hoping there would be a method from Open Cascade that would do all of this by acting on the three original geom primitives (2 Geo_Planes and one Geom_CylindricalSurface) but at least it isn't too much effort to achieve what I want. Any additional advice or alternative methods would be appreciated.

Thanks!

Mon, 02/11/2019 - 13:23

Hello,

Make a face from a cylinder.

would seem to do what you want?

Mon, 02/11/2019 - 21:44

Thanks Adam! This is a reasonable alternative to the BRepFill::Face() I suggested in my followup post. Unclear which one would be more advantageous. Appreciate the 411 as I may need to use it if the Geom_CylindricalSource/BRepFill::Face() combination doesn't work out.

Interestingly, I had attempted to create a gp_Cylinder from the Geom_CylindricalSource I had created. I tried to use the Cylinder() method to get a gp_Cylinder but it gives a 'variable has incomplete type 'gp_Cylinder'' error which I don't fully understand.

In either case thanks again for the info.

Tue, 02/12/2019 - 14:05

I suspect using BRepBuilderAPI_MakeFace is a more direct way of doing it and therefore more robust and efficient but I haven't read the source code so can't say for sure.