From: dbv Date: Fri, 28 Sep 2018 15:24:04 +0000 (+0300) Subject: Issue #2650: Crash when create pipe X-Git-Tag: CEA_2018-2~47 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=c66ffb67c688d6a40a765957538b635a94a35ecf;p=modules%2Fshaper.git Issue #2650: Crash when create pipe Added one more fix. --- diff --git a/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp b/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp index 411a6470b..8d785e658 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Validators.cpp @@ -141,12 +141,6 @@ bool FeaturesPlugin_ValidatorPipeLocations::isValid(const AttributePtr& theAttri return false; } } - ResultConstructionPtr aResultConstruction = - std::dynamic_pointer_cast(aContext); - if (aResultConstruction.get()) { - theError = "Error: Result construction not allowed for selection."; - return false; - } std::shared_ptr aShape = anAttrSelection->value(); if (!aShape.get() && aContext.get()) { GeomShapePtr aContextShape = aContext->shape(); diff --git a/src/FeaturesPlugin/Test/Test2650.py b/src/FeaturesPlugin/Test/Test2650.py index e32141161..8d7c256e6 100644 --- a/src/FeaturesPlugin/Test/Test2650.py +++ b/src/FeaturesPlugin/Test/Test2650.py @@ -24,27 +24,31 @@ model.begin() partSet = model.moduleDocument() Part_1 = model.addPart(partSet) Part_1_doc = Part_1.document() -Import_1 = model.addImport(Part_1_doc, "D:/rq_1.brep") +Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOZ")) +SketchLine_1 = Sketch_1.addLine(10.96877310597264, 4.388320842434023, 10.96877310597264, 75.63259202833271) model.do() -Import_1.setName("rq_1") -Import_1.result().setName("rq_1_1") -Import_2 = model.addImport(Part_1_doc, "D:/rq2_1.brep") +Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY")) +SketchLine_2 = Sketch_2.addLine(20.69511709668412, -6.720507935503198, 19.39808085030927, 19.46570269579372) +SketchLine_3 = Sketch_2.addLine(19.39808085030927, 19.46570269579372, 61.20243103906213, 28.02128023393725) +SketchConstraintCoincidence_1 = Sketch_2.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint()) +SketchLine_4 = Sketch_2.addLine(61.20243103906213, 28.02128023393725, 64.54729867171925, -32.684941224703) +SketchConstraintCoincidence_2 = Sketch_2.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint()) +SketchLine_5 = Sketch_2.addLine(64.54729867171925, -32.684941224703, 20.69511709668412, -6.720507935503198) +SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchLine_5.startPoint()) +SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_2.startPoint(), SketchLine_5.endPoint()) model.do() -Import_2.setName("rq2_1") -Import_2.result().setName("rq2_1_1") -Import_3 = model.addImport(Part_1_doc, "D:/spine.brep") +Plane_4 = model.addPlane(Part_1_doc, model.selection("FACE", "PartSet/XOY"), model.selection("VERTEX", "Sketch_1/Vertex-SketchLine_1e")) +Sketch_3 = model.addSketch(Part_1_doc, model.selection("FACE", "Plane_1")) +SketchLine_6 = Sketch_3.addLine(18.78449167586506, 11.40320166178118, 18.60732592394469, -15.47067574876233) +SketchLine_7 = Sketch_3.addLine(18.60732592394469, -15.47067574876233, 57.06415928764967, -9.455161348995592) +SketchConstraintCoincidence_5 = Sketch_3.setCoincident(SketchLine_6.endPoint(), SketchLine_7.startPoint()) +SketchLine_8 = Sketch_3.addLine(57.06415928764967, -9.455161348995592, 56.5687276408287, 11.2362868340608) +SketchConstraintCoincidence_6 = Sketch_3.setCoincident(SketchLine_7.endPoint(), SketchLine_8.startPoint()) +SketchLine_9 = Sketch_3.addLine(56.5687276408287, 11.2362868340608, 18.78449167586506, 11.40320166178118) +SketchConstraintCoincidence_7 = Sketch_3.setCoincident(SketchLine_8.endPoint(), SketchLine_9.startPoint()) +SketchConstraintCoincidence_8 = Sketch_3.setCoincident(SketchLine_6.startPoint(), SketchLine_9.endPoint()) model.do() -Import_3.setName("spine") -Import_3.result().setName("spine_1") -Import_4 = model.addImport(Part_1_doc, "D:/v1.brep") -model.do() -Import_4.setName("v1") -Import_4.result().setName("v1_1") -Import_5 = model.addImport(Part_1_doc, "D:/v2.brep") -model.do() -Import_5.setName("v2") -Import_5.result().setName("v2_1") -Pipe_1 = model.addPipe(Part_1_doc, [model.selection("WIRE", "rq_1_1"), model.selection("WIRE", "rq2_1_1")], model.selection("WIRE", "spine_1"), [model.selection("VERTEX", "spine_1/Shape2"), model.selection("VERTEX", "spine_1/Shape3")]) +Pipe_1 = model.addPipe(Part_1_doc, [model.selection("FACE", "Sketch_2/Face-SketchLine_2r-SketchLine_3r-SketchLine_4r-SketchLine_5r"), model.selection("FACE", "Sketch_3/Face-SketchLine_6f-SketchLine_7f-SketchLine_8f-SketchLine_9f")], model.selection("EDGE", "Sketch_1/Edge-SketchLine_1"), [model.selection("VERTEX", "Sketch_1/Vertex-SketchLine_1s"), model.selection("VERTEX", "Sketch_1/Vertex-SketchLine_1e")]) model.do() model.end() @@ -52,9 +56,9 @@ from GeomAPI import GeomAPI_Shape model.testNbResults(Pipe_1, 1) model.testNbSubResults(Pipe_1, [0]) -model.testNbSubShapes(Pipe_1, GeomAPI_Shape.SOLID, [0]) -model.testNbSubShapes(Pipe_1, GeomAPI_Shape.FACE, [4]) -model.testNbSubShapes(Pipe_1, GeomAPI_Shape.EDGE, [16]) -model.testNbSubShapes(Pipe_1, GeomAPI_Shape.VERTEX, [32]) +model.testNbSubShapes(Pipe_1, GeomAPI_Shape.SOLID, [1]) +model.testNbSubShapes(Pipe_1, GeomAPI_Shape.FACE, [6]) +model.testNbSubShapes(Pipe_1, GeomAPI_Shape.EDGE, [24]) +model.testNbSubShapes(Pipe_1, GeomAPI_Shape.VERTEX, [48]) assert(model.checkPythonDump()) diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp index 84a09ea10..2578c836c 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Pipe.cpp @@ -209,11 +209,6 @@ void GeomAlgoAPI_Pipe::build(const ListOfShape& theBaseShapes, return; } - bool aHasLocations = false; - if(!theLocations.empty()) { - aHasLocations = true; - } - // Getting path. TopoDS_Shape aBaseShape; TopAbs_ShapeEnum aBaseShapeType; @@ -229,6 +224,37 @@ void GeomAlgoAPI_Pipe::build(const ListOfShape& theBaseShapes, gp_Trsf aTrsf = getPathToBaseTranslation(aBaseShape, aPathWire); aPathWire.Move(aTrsf); + // Get locations after moving path shape. + std::list aLocations; + for (ListOfShape::const_iterator aLocIt = theLocations.cbegin(); + aLocIt != theLocations.cend(); + ++aLocIt) + { + GeomShapePtr aLocation = *aLocIt; + if (!aLocation.get() || aLocation->shapeType() != GeomAPI_Shape::VERTEX) { + return; + } + + TopoDS_Vertex aLocationVertex = aLocation->impl(); + TopoDS_Vertex aMovedVertex; + for (TopExp_Explorer anExp(aPathWire, TopAbs_VERTEX); anExp.More(); anExp.Next()) { + if (anExp.Current().IsPartner(aLocationVertex)) { + aMovedVertex = TopoDS::Vertex(anExp.Current()); + aLocations.push_back(aMovedVertex); + break; + } + } + if (aMovedVertex.IsNull()) { + return; + } + } + + if (theLocations.size() != aLocations.size()) { + return; + } + + bool aHasLocations = !aLocations.empty(); + // Making pipe. Standard_Boolean isDone = Standard_False; bool anIsSolidNeeded = false; @@ -239,7 +265,7 @@ void GeomAlgoAPI_Pipe::build(const ListOfShape& theBaseShapes, return; } ListOfShape::const_iterator aBaseIt = theBaseShapes.cbegin(); - ListOfShape::const_iterator aLocIt = theLocations.cbegin(); + std::list::const_iterator aLocationsIt = aLocations.cbegin(); while(aBaseIt != theBaseShapes.cend()) { GeomShapePtr aBase = *aBaseIt; if(!getBase(aBaseShape, aBaseShapeType, aBase)) { @@ -252,15 +278,8 @@ void GeomAlgoAPI_Pipe::build(const ListOfShape& theBaseShapes, } if(aHasLocations) { - GeomShapePtr aLocation = *aLocIt; - if(!aLocation.get() || aLocation->shapeType() != GeomAPI_Shape::VERTEX) { - delete aPipeBuilder; - return; - } - TopoDS_Vertex aLocationVertex = aLocation->impl(); - aLocationVertex.Move(aTrsf); - ++aLocIt; - aPipeBuilder->Add(aBaseShape, aLocationVertex); + aPipeBuilder->Add(aBaseShape, *aLocationsIt); + ++aLocationsIt; } else { aPipeBuilder->Add(aBaseShape); }