From a548169553c6c66fba8e7c4d071df7943fd0519a Mon Sep 17 00:00:00 2001 From: dbv Date: Wed, 26 Jul 2017 19:23:40 +0300 Subject: [PATCH] Issue #2235: Segmentation fault in pipe when adding an edge to base objects before changing path object Fixed crash. --- src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp | 77 +++++++++++++++++----------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp index fb5f6e8b8..236f8e944 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp @@ -214,49 +214,66 @@ void GeomAlgoAPI_Pipe::build(const ListOfShape& theBaseShapes, } // Making pipe. - BRepOffsetAPI_MakePipeShell* aPipeBuilder = new BRepOffsetAPI_MakePipeShell(aPathWire); - if(!aPipeBuilder) { - return; - } + Standard_Boolean isDone = Standard_False; bool anIsSolidNeeded = false; - ListOfShape::const_iterator aBaseIt = theBaseShapes.cbegin(); - ListOfShape::const_iterator aLocIt = theLocations.cbegin(); - while(aBaseIt != theBaseShapes.cend()) { - GeomShapePtr aBase = *aBaseIt; - TopoDS_Shape aBaseShape; - TopAbs_ShapeEnum aBaseShapeType; - if(!getBase(aBaseShape, aBaseShapeType, aBase)) { - delete aPipeBuilder; + BRepOffsetAPI_MakePipeShell* aPipeBuilder; + for(int i = 0; i < 2; ++i) { + aPipeBuilder = new BRepOffsetAPI_MakePipeShell(aPathWire); + if(!aPipeBuilder) { return; } - ++aBaseIt; - if(aBaseShapeType == TopAbs_FACE) { - anIsSolidNeeded = true; - } - - if(aHasLocations) { - GeomShapePtr aLocation = *aLocIt; - if(!aLocation.get() || aLocation->shapeType() != GeomAPI_Shape::VERTEX) { + ListOfShape::const_iterator aBaseIt = theBaseShapes.cbegin(); + ListOfShape::const_iterator aLocIt = theLocations.cbegin(); + while(aBaseIt != theBaseShapes.cend()) { + GeomShapePtr aBase = *aBaseIt; + TopoDS_Shape aBaseShape; + TopAbs_ShapeEnum aBaseShapeType; + if(!getBase(aBaseShape, aBaseShapeType, aBase)) { delete aPipeBuilder; return; } - TopoDS_Vertex aLocationVertex = aLocation->impl(); - ++aLocIt; - aPipeBuilder->Add(aBaseShape, aLocationVertex); - } else { - aPipeBuilder->Add(aBaseShape); + ++aBaseIt; + if(aBaseShapeType == TopAbs_FACE) { + anIsSolidNeeded = true; + } + + if(aHasLocations) { + GeomShapePtr aLocation = *aLocIt; + if(!aLocation.get() || aLocation->shapeType() != GeomAPI_Shape::VERTEX) { + delete aPipeBuilder; + return; + } + TopoDS_Vertex aLocationVertex = aLocation->impl(); + ++aLocIt; + aPipeBuilder->Add(aBaseShape, aLocationVertex); + } else { + aPipeBuilder->Add(aBaseShape); + } + } + + if(aPipeBuilder->IsReady() == Standard_False) { + delete aPipeBuilder; + return; + } + + if (i == 1) { + // Try to use Descrete Trihedron mode. + aPipeBuilder->SetDiscreteMode(); + } + aPipeBuilder->Build(); + isDone = aPipeBuilder->IsDone(); + + if (isDone) { + break; } - } - if(aPipeBuilder->IsReady() == Standard_False) { delete aPipeBuilder; - return; } - if(!buildPipe(aPipeBuilder)) { - delete aPipeBuilder; + if (!isDone) { return; } + this->initialize(aPipeBuilder); // Checking result. -- 2.39.2