From 17e8650ef6b7eb406cdeab881802cf9fadc0750e Mon Sep 17 00:00:00 2001 From: dbv Date: Tue, 24 May 2016 12:50:27 +0300 Subject: [PATCH] Issue #1503: Fixed naming for Build/Sub-Shapes feature --- src/BuildPlugin/BuildPlugin_SubShapes.cpp | 7 ++- src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp | 5 ++ src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp | 60 +++++++++++++------- src/Model/Model_BodyBuilder.cpp | 4 +- 4 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/BuildPlugin/BuildPlugin_SubShapes.cpp b/src/BuildPlugin/BuildPlugin_SubShapes.cpp index 1689fb785..000fb19e3 100644 --- a/src/BuildPlugin/BuildPlugin_SubShapes.cpp +++ b/src/BuildPlugin/BuildPlugin_SubShapes.cpp @@ -108,13 +108,16 @@ void BuildPlugin_SubShapes::execute() } // Store result. + const int aModVertexTag = 1; + const int aModEdgeTag = 2; ResultBodyPtr aResultBody = document()->createBody(data()); aResultBody->storeModified(aBaseShape, aResultShape); - aResultBody->loadAndOrientModifiedShapes(&aBuilder, aBaseShape, GeomAPI_Shape::EDGE, 1, + aResultBody->loadAndOrientModifiedShapes(&aBuilder, aBaseShape, GeomAPI_Shape::EDGE, aModEdgeTag, "Modified_Edge", *aBuilder.mapOfSubShapes().get()); for(ListOfShape::const_iterator anIt = aShapesToAdd.cbegin(); anIt != aShapesToAdd.cend(); ++anIt) { GeomAPI_Shape::ShapeType aShType = (*anIt)->shapeType(); - aResultBody->loadAndOrientModifiedShapes(&aBuilder, *anIt, aShType, 1, + aResultBody->loadAndOrientModifiedShapes(&aBuilder, *anIt, aShType, + aShType == GeomAPI_Shape::VERTEX ? aModVertexTag : aModEdgeTag, aShType == GeomAPI_Shape::VERTEX ? "Modified_Vertex" : "Modified_Edge", *aBuilder.mapOfSubShapes().get()); } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp index 2397dafbf..87d38d2b8 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp @@ -154,6 +154,11 @@ void GeomAlgoAPI_MakeShape::setShape(const std::shared_ptr theSha } const TopoDS_Shape& aTopoDSShape = myShape->impl(); + for(TopExp_Explorer anExp(aTopoDSShape,TopAbs_EDGE); anExp.More(); anExp.Next()) { + std::shared_ptr aCurrentShape(new GeomAPI_Shape()); + aCurrentShape->setImpl(new TopoDS_Shape(anExp.Current())); + myMap->bind(aCurrentShape, aCurrentShape); + } for(TopExp_Explorer anExp(aTopoDSShape,TopAbs_FACE); anExp.More(); anExp.Next()) { std::shared_ptr aCurrentShape(new GeomAPI_Shape()); aCurrentShape->setImpl(new TopoDS_Shape(anExp.Current())); diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp index eea9ae912..c8a63bf91 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp @@ -60,31 +60,46 @@ GeomAlgoAPI_ShapeBuilder::GeomAlgoAPI_ShapeBuilder() //================================================================================================== void GeomAlgoAPI_ShapeBuilder::removeInternal(const std::shared_ptr theShape) { - GeomShapePtr aResultShape = theShape->emptyCopied(); + GeomShapePtr aResultShape; + GeomAPI_Shape::ShapeType aBaseShapeType = theShape->shapeType(); - std::shared_ptr aMakeShapeCustom(new GeomAlgoAPI_MakeShapeCustom()); - for(GeomAPI_ShapeIterator anIter(theShape); anIter.more(); anIter.next()) { - GeomShapePtr aSubShape = anIter.current(); - if(aBaseShapeType == GeomAPI_Shape::WIRE) { + if(aBaseShapeType == GeomAPI_Shape::WIRE) { + aResultShape = theShape->emptyCopied(); + std::shared_ptr aMakeShapeCustom(new GeomAlgoAPI_MakeShapeCustom()); + for(GeomAPI_ShapeIterator anIter(theShape); anIter.more(); anIter.next()) { + GeomShapePtr aSubShape = anIter.current(); GeomShapePtr aSubShapeCopy = aSubShape->emptyCopied(); - aMakeShapeCustom->addModified(aSubShape, aSubShapeCopy); for(GeomAPI_ShapeIterator aSubIter(aSubShape); aSubIter.more(); aSubIter.next()) { GeomShapePtr aSubOfSubShape = aSubIter.current(); if(aSubOfSubShape->orientation() != GeomAPI_Shape::INTERNAL) { GeomAlgoAPI_ShapeBuilder::add(aSubShapeCopy, aSubOfSubShape); } } + aMakeShapeCustom->addModified(aSubShape, aSubShapeCopy); GeomAlgoAPI_ShapeBuilder::add(aResultShape, aSubShapeCopy); - } else if(aBaseShapeType == GeomAPI_Shape::FACE) { - if(aSubShape->shapeType() == GeomAPI_Shape::WIRE - && aSubShape->orientation() != GeomAPI_Shape::INTERNAL) { - GeomAlgoAPI_ShapeBuilder::add(aResultShape, aSubShape); + } + this->appendAlgo(aMakeShapeCustom); + } else if(aBaseShapeType == GeomAPI_Shape::FACE) { + const TopoDS_Shape& aBaseShape = theShape->impl(); + BRepBuilderAPI_Copy* aCopyBuilder = new BRepBuilderAPI_Copy(aBaseShape); + this->appendAlgo(std::shared_ptr(new GeomAlgoAPI_MakeShape(aCopyBuilder))); + if(!aCopyBuilder->IsDone()) { + return; + } + TopoDS_Shape aShape = aCopyBuilder->Shape(); + TopoDS_Shape aShapeCopy = aShape.EmptyCopied(); + BRep_Builder aBuilder; + for(TopoDS_Iterator anIt(aShape); anIt.More(); anIt.Next()) { + const TopoDS_Shape& aSubShape = anIt.Value(); + if(aSubShape.ShapeType() == TopAbs_WIRE + && aSubShape.Orientation() != TopAbs_INTERNAL) { + aBuilder.Add(aShapeCopy, aSubShape); } } + aResultShape.reset(new GeomAPI_Shape()); + aResultShape->setImpl(new TopoDS_Shape(aShapeCopy)); } - this->appendAlgo(aMakeShapeCustom); - setShape(aResultShape); setDone(true); } @@ -101,7 +116,7 @@ void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape TopAbs_ShapeEnum aBaseShapeType = aBaseShape.ShapeType(); // Copy base shape. - BRepBuilderAPI_Copy* aCopyBuilder = new BRepBuilderAPI_Copy(aBaseShape, Standard_False); + BRepBuilderAPI_Copy* aCopyBuilder = new BRepBuilderAPI_Copy(aBaseShape); this->appendAlgo(std::shared_ptr(new GeomAlgoAPI_MakeShape(aCopyBuilder))); if(!aCopyBuilder->IsDone()) { return; @@ -113,6 +128,8 @@ void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape std::shared_ptr aMakeShapeCustom(new GeomAlgoAPI_MakeShapeCustom()); for(ListOfShape::const_iterator anIt = theShapesToAdd.cbegin(); anIt != theShapesToAdd.cend(); ++anIt) { TopoDS_Shape aShapeToAdd = (*anIt)->impl(); + TopoDS_Shape aModShapeToAdd = aShapeToAdd; + aModShapeToAdd.Orientation(TopAbs_INTERNAL); for(TopExp_Explorer aResExp(aResultShape, TopAbs_VERTEX); aResExp.More(); aResExp.Next()) { const TopoDS_Vertex& aVertexInRes = TopoDS::Vertex(aResExp.Current()); const gp_Pnt aPntInRes = BRep_Tool::Pnt(aVertexInRes); @@ -124,17 +141,18 @@ void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape TopoDS_Shape aVertexInResMod = aVertexInRes; aVertexInResMod.Orientation(aVertexInAdd.Orientation()); aReShape.Replace(aVertexInAdd, aVertexInResMod); - TopoDS_Shape aModShape = aReShape.Apply(aShapeToAdd); - - GeomShapePtr aGeomBaseShape(new GeomAPI_Shape()); - GeomShapePtr aGeomModShape(new GeomAPI_Shape()); - aGeomBaseShape->setImpl(new TopoDS_Shape(aShapeToAdd)); - aGeomModShape->setImpl(new TopoDS_Shape(aModShape)); - aMakeShapeCustom->addModified(aGeomBaseShape, aGeomModShape); - aShapeToAdd = aModShape; + aModShapeToAdd = aReShape.Apply(aModShapeToAdd); } } } + + GeomShapePtr aGeomBaseShape(new GeomAPI_Shape()); + GeomShapePtr aGeomModShape(new GeomAPI_Shape()); + aGeomBaseShape->setImpl(new TopoDS_Shape(aShapeToAdd)); + aGeomModShape->setImpl(new TopoDS_Shape(aModShapeToAdd)); + aMakeShapeCustom->addModified(aGeomBaseShape, aGeomModShape); + aShapeToAdd = aModShapeToAdd; + TopAbs_ShapeEnum aShapeToAddType = aShapeToAdd.ShapeType(); if(aBaseShapeType == TopAbs_WIRE) { if(aShapeToAddType == TopAbs_VERTEX) { diff --git a/src/Model/Model_BodyBuilder.cpp b/src/Model/Model_BodyBuilder.cpp index fe1541286..bfa8d62fe 100755 --- a/src/Model/Model_BodyBuilder.cpp +++ b/src/Model/Model_BodyBuilder.cpp @@ -393,7 +393,9 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes ( std::shared_ptr aMapShape(theSubShapes.find(*anIt)); aNewShape.Orientation(aMapShape->impl().Orientation()); } - if(!aRoot.IsSame(aNewShape) && aResultShape->isSubShape(*anIt)) { + GeomShapePtr aGeomNewShape(new GeomAPI_Shape()); + aGeomNewShape->setImpl(new TopoDS_Shape(aNewShape)); + if(!aRoot.IsSame(aNewShape) && aResultShape->isSubShape(aGeomNewShape)) { builder(aTag)->Modify(aRoot,aNewShape); if(isBuilt) { if(theIsStoreSeparate) { -- 2.39.2