
Thu, 08/14/2025 - 08:42
Forums:
Hi all,
I'm trying to build a pipe with consecutive line segments as the spine, and a circle as the profile with BRepFill_PipeShell
. The transition mode is BRepFill_Right
.
Following is the code snippet
std::vector<gp_Pnt> pnts = {
{-11.632049,994.694902,48.628134},
{10.065155,966.861115,-9.835286},
{53.461328,911.191278,-141.164126},
{75.160044,883.355551,-211.971287},
{96.859012,855.519500,-284.834769},
{118.558107,827.683289,-358.725443},
{140.257201,799.847077,-432.614179},
{161.956168,772.011028,-505.471848},
{183.654883,744.175302,-576.269319},
{205.353220,716.340062,-643.977464},
{227.051052,688.505470,-707.567154},
{248.748253,660.671686,-766.009258},
{270.444698,632.838874,-818.274647},
{292.140259,605.007194,-863.334191},
{313.834812,577.176808,-900.158762},
{335.528229,549.347879,-927.719228},
{357.220385,521.520567,-944.986462},
{378.911154,493.695035,-950.931334},
{400.600453,465.871390,-944.873493},
{422.288365,438.049523,-927.504268},
{443.975017,410.229272,-899.852141},
{465.660536,382.410475,-862.945597},
{487.345047,354.592972,-817.813120},
{509.028675,326.776600,-765.483193},
{530.711548,298.961197,-706.984299},
{552.393791,271.146602,-643.344924},
{574.075530,243.332654,-575.593550},
{595.756892,215.519191,-504.758662},
{617.438001,187.706050,-431.868742},
{639.118985,159.893071,-357.952276},
{660.799969,132.080092,-284.037746},
{682.481079,104.266950,-211.153636},
{704.162442,76.453485,-140.328431},
{725.844183,48.639535,-72.590614},
{747.526428,20.824937,-8.968668},
{769.209303,-6.990468,49.508922}
};
gp_Dir dir = gp_Vec(pnts[0], pnts[1]);
// prepare profile
gp_Ax2 circleAx(pnts[0], dir);
BRep_Builder B;
Handle(Geom_Circle) circle = new Geom_Circle(circleAx, 4.8);
TopoDS_Wire profile;
B.MakeWire(profile);
B.Add(profile, BRepBuilderAPI_MakeEdge(circle));
// prepare spine
TopoDS_Wire spine;
B.MakeWire(spine);
for(int i = 1; i < pnts.size(); i++){
Handle(Geom_Curve) seg = GC_MakeSegment(pnts[i-1],pnts[i]).Value();
B.Add(spine, BRepBuilderAPI_MakeEdge(seg));
}
ShapeFix_Wire aWireFix(spine, TopoDS_Face(), 1e-2);
aWireFix.FixConnected();
spine = aWireFix.Wire();
// prepare support
gp_Dir supportPlaneY(0,0,1);
gp_Dir supportPlaneNormal = dir ^ supportPlaneY;
gp_Dir supportPlaneX = supportPlaneY ^ supportPlaneNormal;
Handle(Geom_Surface) support = new Geom_Plane(pnts[0], supportPlaneNormal);
support = new Geom_RectangularTrimmedSurface(support, -10000., 10000., -10000., 10000.);
TopoDS_Face supportFace = BRepBuilderAPI_MakeFace(support, 0.01);
// build pipe
BRepFill_PipeShell aPipeMaker(spine);
aPipeMaker.Set(true);
//aPipeMaker.Set(supportFace);
aPipeMaker.SetTransition(BRepFill_Right);
aPipeMaker.Add(profile);
aPipeMaker.Build();
aPipeMaker.MakeSolid();
auto pipeShape = aPipeMaker.Shape();
I have tried different modes(isFrenet = true/false and planar spine support), but some segements of the pipe is broken(see the attachments). I'm current running on OCCT7.8.1 and I have also tried 8.0.0rc2, both produce broken segement(s).
Any suggestions on this?
Best regards,
Andy
Attachments: