X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultConstruction.cpp;h=103c5425904bf65d8e8bb299ee2a43c6f5bda36b;hb=b0196aeefbaa53754b1052fab904386707caad87;hp=9676918dbcbe221a669ee1f850fa9b9413ef0bda;hpb=2da91de2a9adef6b5bc5c94f840831f33334e0cb;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultConstruction.cpp b/src/Model/Model_ResultConstruction.cpp index 9676918db..103c54259 100644 --- a/src/Model/Model_ResultConstruction.cpp +++ b/src/Model/Model_ResultConstruction.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include @@ -102,7 +103,7 @@ bool Model_ResultConstruction::updateShape() { std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData && aData->isValid()) { - TDF_Label& aShapeLab = aData->shapeLab(); + TDF_Label aShapeLab = aData->shapeLab(); Handle(TNaming_NamedShape) aNS; if (aShapeLab.FindAttribute(TNaming_NamedShape::GetID(), aNS)) { TopoDS_Shape aShape = aNS->Get(); @@ -166,7 +167,7 @@ int Model_ResultConstruction::facesNum(const bool theUpdateNaming) int aResult = 0; std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData.get() && aData->isValid()) { - TDF_Label& aShapeLab = aData->shapeLab(); + TDF_Label aShapeLab = aData->shapeLab(); TDF_ChildIDIterator anOldIter(aShapeLab, TDataStd_IntPackedMap::GetID()); for (; anOldIter.More(); anOldIter.Next()) { aResult++; @@ -181,7 +182,7 @@ std::shared_ptr Model_ResultConstruction::face(const int theIndex) int anIndex = 0; std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData.get() && aData->isValid()) { - TDF_Label& aShapeLab = aData->shapeLab(); + TDF_Label aShapeLab = aData->shapeLab(); TDF_ChildIDIterator anOldIter(aShapeLab, TDataStd_IntPackedMap::GetID()); for (; anOldIter.More(); anOldIter.Next()) { if (anIndex == theIndex) { @@ -207,7 +208,7 @@ void Model_ResultConstruction::storeShape(std::shared_ptr theShap std::shared_ptr aData = std::dynamic_pointer_cast(data()); if (aData && aData->isValid()) { std::string aMyName = data()->name(); - TDF_Label& aShapeLab = aData->shapeLab(); + TDF_Label aShapeLab = aData->shapeLab(); if (!theShape.get() || theShape->isNull()) { aShapeLab.ForgetAllAttributes(); TDataStd_Name::Set(aShapeLab, aMyName.c_str()); // restore name forgotten @@ -275,14 +276,15 @@ void Model_ResultConstruction::storeShape(std::shared_ptr theShap std::list > aFaces; GeomAlgoAPI_SketchBuilder::createFaces(aWirePtr->origin(), aWirePtr->dirX(), aWirePtr->norm(), aWirePtr, aFaces); - NCollection_DataMap aNewIndices; // edges indices + // order is important to store faces in the same order if sketch is created from scratch + NCollection_IndexedDataMap aNewIndices; // edges indices std::list >::iterator aFIter = aFaces.begin(); for (; aFIter != aFaces.end(); aFIter++) { std::shared_ptr aFace(new GeomAPI_Face(*aFIter)); // put them to a label, trying to keep the same faces on the same labels if (aFace.get() && !aFace->isNull()) { TopoDS_Face aTopoFace = TopoDS::Face(aFace->impl()); - aNewIndices.Bind(aTopoFace, TColStd_ListOfInteger()); + aNewIndices.Add(aTopoFace, TColStd_ListOfInteger()); // keep new indices of sub-elements used in this face for (TopExp_Explorer anEdges(aTopoFace, TopAbs_EDGE); anEdges.More(); anEdges.Next()) { TopoDS_Edge anEdge = TopoDS::Edge(anEdges.Current()); @@ -292,7 +294,7 @@ void Model_ResultConstruction::storeShape(std::shared_ptr theShap int anIndex = aCurvesIndices.Find(aCurve); if ((aFirst > aLast) != (anEdge.Orientation() == TopAbs_REVERSED)) anIndex = -anIndex; - aNewIndices.ChangeFind(aTopoFace).Append(anIndex); + aNewIndices.ChangeFromKey(aTopoFace).Append(anIndex); } } } @@ -300,7 +302,8 @@ void Model_ResultConstruction::storeShape(std::shared_ptr theShap NCollection_DataMap aFacesOrder; // faces -> tag where they must be set NCollection_List anUnorderedFaces; // faces that may be located at any index // searching for the best new candidate to old location - NCollection_DataMap::Iterator aNewIter(aNewIndices); + NCollection_IndexedDataMap::Iterator + aNewIter(aNewIndices); for (; aNewIter.More(); aNewIter.Next()) { double aBestFound = 0, aBestNotFound = 1.e+100; int aBestTag = 0; @@ -369,7 +372,7 @@ void Model_ResultConstruction::storeShape(std::shared_ptr theShap aFaceBuilder.Generated(aFaceToPut); // store also indices of the new face edges Handle(TDataStd_IntPackedMap) aNewMap = TDataStd_IntPackedMap::Set(aLab); - const TColStd_ListOfInteger& aNewInd = aNewIndices.Find(aFaceToPut); + const TColStd_ListOfInteger& aNewInd = aNewIndices.FindFromKey(aFaceToPut); std::stringstream aName; aName<<"Face"; TopExp_Explorer aPutEdges(aFaceToPut, TopAbs_EDGE); @@ -389,7 +392,10 @@ void Model_ResultConstruction::storeShape(std::shared_ptr theShap if (!anEdgesBuilder) { TDF_Label anEdgesLabel = aLab.FindChild(1); anEdgesBuilder = new TNaming_Builder(anEdgesLabel); - TDataStd_Name::Set(anEdgesLabel, "SubEdge"); + std::ostringstream aSubName; + // tag is needed for Test1922 to distinguish subedges of different faces + aSubName<<"SubEdge_"<Modify(anEdgeIndices.Find(aModIndex), aPutEdges.Current()); } @@ -397,6 +403,20 @@ void Model_ResultConstruction::storeShape(std::shared_ptr theShap } TDataStd_Name::Set(aLab, TCollection_ExtendedString(aName.str().c_str())); aMyDoc->addNamingName(aLab, aName.str()); + // put also wires to sub-labels to correctly select them instead of collection by edges + int aWireTag = 2; // first tag is for SubEdge-s + for(TopExp_Explorer aWires(aFaceToPut, TopAbs_WIRE); aWires.More(); aWires.Next()) { + TDF_Label aWireLab = aLab.FindChild(aWireTag); + TNaming_Builder aWireBuilder(aWireLab); + aWireBuilder.Generated(aWires.Current()); + std::ostringstream aWireName; + aWireName< 2) + aWireName<<"_"<addNamingName(aWireLab, aWireName.str()); + aWireTag++; + } } } }