X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_ResultBody.cpp;h=7708c92cfbda5f6707876e72b6e6e49db579d23f;hb=6a7e53a3d3b52f1f798b7e3aa3c48de9c870d92b;hp=4a04dda1ade5b955eb825167228ae3a117cbd552;hpb=7b40a96da76a35be80875b1d3f97abb4ca15189a;p=modules%2Fshaper.git diff --git a/src/Model/Model_ResultBody.cpp b/src/Model/Model_ResultBody.cpp index 4a04dda1a..7708c92cf 100644 --- a/src/Model/Model_ResultBody.cpp +++ b/src/Model/Model_ResultBody.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -27,16 +28,35 @@ #include #include #include +#include #include #include +#include // DEB //#include //#include +//#define DEB_IMPORT 1 + Model_ResultBody::Model_ResultBody() { setIsConcealed(false); } +void Model_ResultBody::initAttributes() +{ + // append the color attribute. It is empty, the attribute will be filled by a request + DataPtr aData = data(); + aData->addAttribute(COLOR_ID(), ModelAPI_AttributeIntArray::typeId()); +} + +void Model_ResultBody::colorConfigInfo(std::string& theSection, std::string& theName, + std::string& theDefault) +{ + theSection = "Visualization"; + theName = "result_body_color"; + theDefault = DEFAULT_COLOR(); +} + void Model_ResultBody::store(const std::shared_ptr& theShape) { std::shared_ptr aData = std::dynamic_pointer_cast(data()); @@ -371,6 +391,8 @@ void Model_ResultBody::loadNextLevels(std::shared_ptr theShape, { const TopTools_ListOfShape& aLL = anEdgeAndNeighbourFaces.FindFromIndex(i); if (aLL.Extent() < 2) { + if (BRep_Tool::Degenerated(TopoDS::Edge(anEdgeAndNeighbourFaces.FindKey(i)))) + continue; builder(theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i)); TCollection_AsciiString aStr(theTag); aName = theName + aStr.ToCString(); @@ -430,6 +452,49 @@ void Model_ResultBody::loadNextLevels(std::shared_ptr theShape, } } } + +//======================================================================= +int findAmbiguities(const TopoDS_Shape& theShapeIn, + TopTools_ListOfShape& theList) +{ + int aNumEdges(0); + theList.Clear(); + TopTools_IndexedDataMapOfShapeListOfShape subShapeAndAncestors; + TopAbs_ShapeEnum aTS(TopAbs_EDGE); + TopAbs_ShapeEnum aTA(TopAbs_FACE); + TopTools_MapOfShape aMap1, aMap2; // map1 - for edge ancestors; map2 - for keys => edges + TopTools_ListOfShape aKeyList; + TopExp::MapShapesAndAncestors(theShapeIn, aTS, aTA, subShapeAndAncestors); + for (Standard_Integer i = 1; i <= subShapeAndAncestors.Extent(); i++) { + const TopoDS_Shape& aKeyEdge1 = subShapeAndAncestors.FindKey(i); + const TopTools_ListOfShape& ancestors1 = subShapeAndAncestors.FindFromIndex(i); + aMap1.Clear(); + TopTools_ListIteratorOfListOfShape it(ancestors1); + for(;it.More();it.Next()) aMap1.Add(it.Value()); // fill map with key ancestors => aKey1 + for (Standard_Integer j = 1; j <= subShapeAndAncestors.Extent(); j++) { + if (i == j) continue; + const TopoDS_Shape& aKeyEdge2 = subShapeAndAncestors.FindKey(j); + const TopTools_ListOfShape& ancestors2 = subShapeAndAncestors.FindFromIndex(j); + if(ancestors1.Extent() == ancestors2.Extent() && ancestors1.Extent() > 1) { + int aNum (ancestors2.Extent()); + TopTools_ListIteratorOfListOfShape it(ancestors2); + for(;it.More();it.Next()) + if(aMap1.Contains(it.Value())) aNum--; + if(aNum == 0) { + if(aMap2.Add(aKeyEdge1)) + aKeyList.Append(aKeyEdge1); + if(aMap2.Add(aKeyEdge2)) + aKeyList.Append(aKeyEdge2); + } + } + } // at the end ==> List of edges to be named in addition + } + aNumEdges = aKeyList.Extent(); + if(aNumEdges) + theList.Assign(aKeyList); + return aNumEdges; +} + //======================================================================= void Model_ResultBody::loadFirstLevel( std::shared_ptr theShape, const std::string& theName, int& theTag) @@ -462,6 +527,16 @@ void Model_ResultBody::loadFirstLevel( itrShape->setImpl(new TopoDS_Shape(aShape)); loadNextLevels(itrShape, theName, theTag); } + TopTools_ListOfShape aList; + if(findAmbiguities(aShape, aList)) { + TopTools_ListIteratorOfListOfShape it(aList); + for (; it.More(); it.Next(),theTag++) { + builder(theTag)->Generated(it.Value()); + TCollection_AsciiString aStr(theTag); + aName = theName + aStr.ToCString(); + buildName(theTag, aName); + } + } } //======================================================================= @@ -491,7 +566,24 @@ void Model_ResultBody::loadDisconnectedEdges( edgeNaborFaces.ChangeFind(anEdge).Append(aFace); } } - + +/* TopTools_IndexedDataMapOfShapeListOfShape aDM; + TopExp::MapShapesAndAncestors(aShape, TopAbs_EDGE, TopAbs_FACE, aDM); + for(int i=1; i <= aDM.Extent(); i++) { + if(aDM.FindFromIndex(i).Extent() > 1) continue; + if (BRep_Tool::Degenerated(TopoDS::Edge(aDM.FindKey(i)))) + continue; + builder(theTag)->Generated(aDM.FindKey(i)); + TCollection_AsciiString aStr(theTag); + std::string aName = theName + aStr.ToCString(); + buildName(theTag, aName); +#ifdef DEB_IMPORT + aName += + ".brep"; + BRepTools::Write(aDM.FindKey(i), aName.c_str()); +#endif + theTag++; + } +*/ TopTools_MapOfShape anEdgesToDelete; TopExp_Explorer anEx(aShape,TopAbs_EDGE); std::string aName; @@ -536,7 +628,7 @@ void Model_ResultBody::loadDisconnectedEdges( buildName(theTag, aName); theTag++; } - } + } } void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr theShape, const std::string& theName, int& theTag) @@ -577,4 +669,4 @@ void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr t theTag++; } } -} \ No newline at end of file +}