Easy Wedge Cylinder ?


Is there an easy way to make a cylinder with one slanted end ?
I've succeded with the boolean Cut operator, but it's quite heavy...




Gianluca Antoniacci's picture

What if you create the boundary curves (one circle and one ellipse) and then you create a mesh surface from the first cuve to the second one? This would give the lateral surface. Usinig the top and the bottom surfaces, you could build a shell and eventually the solid associated to the cilindrical wedge...


John Whitaker's picture

Hey  Gianluca,
Thanks for you answer, this is exactly what I've been trying .
For both ends of the cylinder (including the slanted one) are OK.
For some reason, the outer cylinder doesn't appear.
Here is the code :

// Left Surface wire.
 BRepBuilderAPI_MakeWire  LeftSurface_Outer_WireMaker;
 // Outer Wire : Left  outer diameter.
 Handle(Geom_Circle) LeftSurface_OuterCircle    = GC_MakeCircle(LeftSurface_Axis, EdgeRadius );
 TopoDS_Edge    LeftSurface_OuterCircle_Edge    = BRepBuilderAPI_MakeEdge(  LeftSurface_OuterCircle    );
 LeftSurface_Outer_WireMaker.Add( LeftSurface_OuterCircle_Edge );
 // Make a face from the Outer wire.
 TopoDS_Face  LeftSurface_Face  = BRepBuilderAPI_MakeFace( LeftSurface_Outer_WireMaker,  Standard_True );

 // Right WEDGE surface
 // Right Surface Normal.
 gp_Dir  RightSurface_Normal_gpDir( Geometry_RightSurface_Vertex_GlobalBasis.Nx, Geometry_RightSurface_Vertex_GlobalBasis.Ny,  Geometry_RightSurface_Vertex_GlobalBasis.Nz );
 // Right Surface Vertex.
 gp_Pnt  RightSurface_Vertex_gpPnt( Geometry_RightSurface_Vertex_GlobalBasis.X,  Geometry_RightSurface_Vertex_GlobalBasis.Y,  Geometry_RightSurface_Vertex_GlobalBasis.Z );
 // Basis.
 auto RightSurface_Axis  = gp_Ax2( RightSurface_Vertex_gpPnt,  RightSurface_Normal_gpDir  );

 // Right Surface wire.
 BRepBuilderAPI_MakeWire  RightSurface_WireMaker;
 // Right Wire : Right  outer diameter.
 Handle(Geom_Ellipse) RightSurface_WedgeEllipse = GC_MakeEllipse( RightSurface_Axis, EdgeRadius/( IRISmath::cos( WedgeAngle )), EdgeRadius   );
 TopoDS_Edge  RightSurface_OuterCircle_Edge  = BRepBuilderAPI_MakeEdge( RightSurface_WedgeEllipse );
 RightSurface_WireMaker.Add( RightSurface_OuterCircle_Edge );
 // Make a face from the Outer wire.
 TopoDS_Face  RightSurface_Face  = BRepBuilderAPI_MakeFace( RightSurface_WireMaker,  Standard_True );

 // Cylindrical Edge of the window.
 // Outer Cylinder surface
 TopoDS_Face  EdgeCylinder_Face = BRepBuilderAPI_MakeFace(  gp_Cylinder( LeftSurface_Axis , EdgeRadius ),      0.0, 2*M_PI,    0.0,  - ( Thickness + EdgeRadius/( IRISmath::cos( WedgeAngle ))  )     );
 // Modify face according to the Right wire.
 EdgeCylinder_Face = BRepBuilderAPI_MakeFace( EdgeCylinder_Face, RightSurface_WireMaker);

Kirill Gavrilov's picture

Hint: use "Insert code snippet" to post your code for better readability.

Gianluca Antoniacci's picture

Hello Robert,

for the outer cylinder I was thinking of something like this:

// C# syntax
//ConvertToBspline is a function of yours that does exactly what you think! ;)
Geom_BSplineCurve splineCurve1 = ConvertToBspline(leftCurve);
Geom_BSplineCurve splineCurve2 = ConverrtToBspline(rightCurve);
GeomFill_BSplineCurves curves = new GeomFill_BSplineCurves(splineCurve1, splineCurve2, GeomFill_FillingStyle.GeomFill_CoonsStyle);
Geom_BSplineSurface surface = curves.Surface();

Now you can build the outer TopoDS_Face out of this surface.

I hope this might help...


John Whitaker's picture

Hey Kirill, 

Understood, thanks !
Any suggestions concerning the slanted cylinder ;)