X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_BodyBuilder.cpp;h=1d3b8a4d506d48ef85e711e995ad7c75e8568f93;hb=4fc2dc9fdc0c14fab5f2780598eccdc1368d81b9;hp=45befbcb4889d791083b9edba20b61fad728d490;hpb=24f9658d6e124a268c6a3abcf24f07aa2dc6d268;p=modules%2Fshaper.git diff --git a/src/Model/Model_BodyBuilder.cpp b/src/Model/Model_BodyBuilder.cpp index 45befbcb4..1d3b8a4d5 100755 --- a/src/Model/Model_BodyBuilder.cpp +++ b/src/Model/Model_BodyBuilder.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -78,7 +79,7 @@ static void evolutionToSelectionRec(TDF_Label theLab, const bool theFlag) { std::list >::iterator aPairsIter = aShapePairs.begin(); for(; aPairsIter != aShapePairs.end(); aPairsIter++) { if (theFlag) { // disabled => make selection - aBuilder.Select(aPairsIter->first, aPairsIter->second); + aBuilder.Select(aPairsIter->second, aPairsIter->first); } else if (anEvol == TNaming_GENERATED) { aBuilder.Generated(aPairsIter->first, aPairsIter->second); } else if (anEvol == TNaming_MODIFY) { @@ -88,7 +89,7 @@ static void evolutionToSelectionRec(TDF_Label theLab, const bool theFlag) { } else if (anEvol == TNaming_PRIMITIVE) { aBuilder.Generated(aPairsIter->second); } else if (anEvol == TNaming_SELECTED) { - aBuilder.Select(aPairsIter->first, aPairsIter->second); + aBuilder.Select(aPairsIter->second, aPairsIter->first); } } // recursive call for all sub-labels @@ -107,7 +108,8 @@ void Model_BodyBuilder::evolutionToSelection(const bool theFlag) evolutionToSelectionRec(aShapeLab, theFlag); } -void Model_BodyBuilder::store(const std::shared_ptr& theShape) +void Model_BodyBuilder::store(const std::shared_ptr& theShape, + const bool theIsStoreSameShapes) { std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData) { @@ -122,8 +124,20 @@ void Model_BodyBuilder::store(const std::shared_ptr& theShape) if (aShape.IsNull()) return; // null shape inside + if(!theIsStoreSameShapes) { + Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aShape, aShapeLab); + if(!aNS.IsNull() && !aNS->IsEmpty()) { + // This shape is already in document, store reference instead of shape; + const TDF_Label aFoundLabel = aNS->Label(); + TDF_Reference::Set(aShapeLab, aFoundLabel); + aShapeLab.ForgetAttribute(TNaming_NamedShape::GetID()); + return; + } + } + aBuilder.Generated(aShape); // register name + aShapeLab.ForgetAttribute(TDF_Reference::GetID()); if(!aBuilder.NamedShape()->IsEmpty()) { Handle(TDataStd_Name) anAttr; if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) { @@ -202,11 +216,20 @@ void Model_BodyBuilder::storeModified(const std::shared_ptr& theO TopoDS_Iterator aSubIter(aShapeNew); for(int aTag = theDecomposeSolidsTag; aSubIter.More(); aSubIter.Next()) { + const TopoDS_Shape& aShape = aSubIter.Value(); + Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aShape, aShapeLab); + if(!aNS.IsNull() && !aNS->IsEmpty()) { + // This shape is already in document, don't add it. + continue; + } TNaming_Builder aSubBuilder(aShapeLab.FindChild(aTag++)); aSubBuilder.Generated(aSubIter.Value()); if(!aName.IsEmpty()) { + TCollection_AsciiString aShapeType = aShape.ShapeType() == TopAbs_EDGE ? "_Edge_" : + aShape.ShapeType() == TopAbs_FACE ? "_Face_" : + aShape.ShapeType() == TopAbs_SOLID ? "_Solid_" : "_Shape_"; std::string aSolidName = - (aName + "_Solid_" + TCollection_AsciiString(aTag - theDecomposeSolidsTag)).ToCString(); + (aName + aShapeType + TCollection_AsciiString(aTag - theDecomposeSolidsTag)).ToCString(); std::shared_ptr aDoc = std::dynamic_pointer_cast(document()); aDoc->addNamingName(aSubBuilder.NamedShape()->Label(), aSolidName); @@ -762,15 +785,14 @@ std::shared_ptr Model_BodyBuilder::shape() { std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData) { - TDF_Label& aShapeLab = aData->shapeLab(); + TDF_Label aShapeLab = aData->shapeLab(); + Handle(TDF_Reference) aRef; + if (aShapeLab.FindAttribute(TDF_Reference::GetID(), aRef)) { + aShapeLab = aRef->Get(); + } Handle(TNaming_NamedShape) aName; if (aShapeLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { TopoDS_Shape aShape = aName->Get(); - if (aShape.IsNull()) - std::cout<<"Model_BodyBuilder::shape returns empty shape "< aRes(new GeomAPI_Shape); aRes->setImpl(new TopoDS_Shape(aShape)); @@ -791,8 +813,15 @@ bool Model_BodyBuilder::isLatestEqual(const std::shared_ptr& theS Handle(TNaming_NamedShape) aName; if (aShapeLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { TopoDS_Shape aLatest = TNaming_Tool::CurrentShape(aName); + if (aLatest.IsNull()) + return false; if (aLatest.IsEqual(aShape)) return true; + // check sub-shapes for comp-solids: + for (TopExp_Explorer anExp(aShape, aLatest.ShapeType()); anExp.More(); anExp.Next()) { + if (aLatest.IsEqual(anExp.Current())) + return true; + } } } }