X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_BodyBuilder.cpp;h=bfa8d62fe1a32d7a78b6a20dd77aa45c8e1e4172;hb=383021cb51c4720904096ca851db5ee79255b402;hp=1d3b8a4d506d48ef85e711e995ad7c75e8568f93;hpb=03b823cbbe43236117bc50c34398f3ce273f729b;p=modules%2Fshaper.git diff --git a/src/Model/Model_BodyBuilder.cpp b/src/Model/Model_BodyBuilder.cpp index 1d3b8a4d5..bfa8d62fe 100755 --- a/src/Model/Model_BodyBuilder.cpp +++ b/src/Model/Model_BodyBuilder.cpp @@ -8,7 +8,6 @@ #include #include -#include #include #include #include @@ -307,6 +306,22 @@ void Model_BodyBuilder::generated(const std::shared_ptr& theOldSh builder(theTag)->Generated(anOldShape, aNewShape); if(!theName.empty()) buildName(theTag, theName); + TopAbs_ShapeEnum aGenShapeType = aNewShape.ShapeType(); + if(aGenShapeType == TopAbs_WIRE || aGenShapeType == TopAbs_SHELL) { + TopAbs_ShapeEnum anExplodeShapeType = aGenShapeType == TopAbs_WIRE ? TopAbs_EDGE : TopAbs_FACE; + const TDF_Label aLabel = builder(theTag)->NamedShape()->Label(); + int aTag = 1; + std::shared_ptr aDoc = std::dynamic_pointer_cast(document()); + for(TopExp_Explorer anExp(aNewShape, anExplodeShapeType); anExp.More(); anExp.Next()) { + TDF_Label aChildLabel = aLabel.FindChild(aTag); + TNaming_Builder aBuilder(aChildLabel); + aBuilder.Generated(anOldShape, anExp.Current()); + TCollection_AsciiString aChildName = TCollection_AsciiString((data()->name() + "/" + theName + "_").c_str()) + aTag; + aDoc->addNamingName(aChildLabel, aChildName.ToCString()); + TDataStd_Name::Set(aChildLabel, aChildName.ToCString()); + aTag++; + } + } } @@ -355,13 +370,14 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes ( GeomAPI_DataMapOfShapeShape& theSubShapes, const bool theIsStoreSeparate) { + int anIndex = 1; int aTag = theTag; + bool isBuilt = !theName.empty(); std::string aName = theName; std::ostringstream aStream; - int anIndex = 1; + GeomShapePtr aResultShape = shape(); TopoDS_Shape aShapeIn = theShapeIn->impl(); TopTools_MapOfShape aView; - bool isBuilt = theName.empty(); TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape); for (; aShapeExplorer.More(); aShapeExplorer.Next ()) { const TopoDS_Shape& aRoot = aShapeExplorer.Current (); @@ -372,14 +388,16 @@ void Model_BodyBuilder::loadAndOrientModifiedShapes ( theMS->modified(aRShape, aList); std::list >::const_iterator anIt = aList.begin(), aLast = aList.end(); for (; anIt != aLast; anIt++) { - TopoDS_Shape aNewShape = (*anIt)->impl(); + TopoDS_Shape aNewShape = (*anIt)->impl(); if (theSubShapes.isBound(*anIt)) { std::shared_ptr aMapShape(theSubShapes.find(*anIt)); aNewShape.Orientation(aMapShape->impl().Orientation()); } - if (!aRoot.IsSame (aNewShape)) { + 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(isBuilt) { if(theIsStoreSeparate) { aStream.str(std::string()); aStream.clear(); @@ -406,7 +424,7 @@ void Model_BodyBuilder::loadAndOrientGeneratedShapes ( { TopoDS_Shape aShapeIn = theShapeIn->impl(); TopTools_MapOfShape aView; - bool isBuilt = theName.empty(); + bool isBuilt = !theName.empty(); TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape); for (; aShapeExplorer.More(); aShapeExplorer.Next ()) { const TopoDS_Shape& aRoot = aShapeExplorer.Current (); @@ -417,15 +435,31 @@ void Model_BodyBuilder::loadAndOrientGeneratedShapes ( theMS->generated(aRShape, aList); std::list >::const_iterator anIt = aList.begin(), aLast = aList.end(); for (; anIt != aLast; anIt++) { - TopoDS_Shape aNewShape = (*anIt)->impl(); + TopoDS_Shape aNewShape = (*anIt)->impl(); if (theSubShapes.isBound(*anIt)) { std::shared_ptr aMapShape(theSubShapes.find(*anIt)); aNewShape.Orientation(aMapShape->impl().Orientation()); } if (!aRoot.IsSame (aNewShape)) { builder(theTag)->Generated(aRoot,aNewShape); - if(!isBuilt) - buildName(theTag, theName); + if(isBuilt) + buildName(theTag, theName); + } + TopAbs_ShapeEnum aGenShapeType = aNewShape.ShapeType(); + if(aGenShapeType == TopAbs_WIRE || aGenShapeType == TopAbs_SHELL) { + TopAbs_ShapeEnum anExplodeShapeType = aGenShapeType == TopAbs_WIRE ? TopAbs_EDGE : TopAbs_FACE; + const TDF_Label aLabel = builder(theTag)->NamedShape()->Label(); + int aTag = 1; + std::shared_ptr aDoc = std::dynamic_pointer_cast(document()); + for(TopExp_Explorer anExp(aNewShape, anExplodeShapeType); anExp.More(); anExp.Next()) { + TDF_Label aChildLabel = aLabel.FindChild(aTag); + TNaming_Builder aBuilder(aChildLabel); + aBuilder.Generated(aRoot, anExp.Current()); + TCollection_AsciiString aChildName = TCollection_AsciiString((data()->name() + "/" + theName + "_").c_str()) + aTag; + aDoc->addNamingName(aChildLabel, aChildName.ToCString()); + TDataStd_Name::Set(aChildLabel, aChildName.ToCString()); + aTag++; + } } } }