From f64a757dd4cadbe71a12d8c8a46f452b93671626 Mon Sep 17 00:00:00 2001 From: jgv Date: Tue, 13 Oct 2020 03:17:48 +0300 Subject: [PATCH] 0031828: BRepFeat_SplitShape history improvement Treatment of input embedded edges has been added to method Modified. --- src/LocOpe/LocOpe_SplitShape.cxx | 10 +++++++++- src/LocOpe/LocOpe_Spliter.cxx | 12 +++++++++++- src/LocOpe/LocOpe_WiresOnShape.cxx | 11 ++++++----- src/LocOpe/LocOpe_WiresOnShape.hxx | 7 +++++-- src/LocOpe/LocOpe_WiresOnShape.lxx | 10 ++++++++++ 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/LocOpe/LocOpe_SplitShape.cxx b/src/LocOpe/LocOpe_SplitShape.cxx index 4d292c9351..f3a9816912 100644 --- a/src/LocOpe/LocOpe_SplitShape.cxx +++ b/src/LocOpe/LocOpe_SplitShape.cxx @@ -1225,12 +1225,20 @@ const TopTools_ListOfShape& LocOpe_SplitShape::DescendantShapes Rebuild(myShape); myDone = Standard_True; } + #ifdef OCCT_DEBUG if (!myDblE.IsEmpty()) { std::cout << "Le shape comporte des faces invalides" << std::endl; } #endif - return myMap(S); + + if (myMap.IsBound(S)) + return myMap(S); + else + { + static TopTools_ListOfShape anEmptyList; + return anEmptyList; + } } diff --git a/src/LocOpe/LocOpe_Spliter.cxx b/src/LocOpe/LocOpe_Spliter.cxx index 6852f8b187..3839a24ae8 100644 --- a/src/LocOpe/LocOpe_Spliter.cxx +++ b/src/LocOpe/LocOpe_Spliter.cxx @@ -116,6 +116,14 @@ void LocOpe_Spliter::Perform(const Handle(LocOpe_WiresOnShape)& PW) } } + const TopTools_IndexedDataMapOfShapeListOfShape& Splits = PW->Splits(); + for (Standard_Integer i = 1; i <= Splits.Extent(); i++) + { + const TopoDS_Shape& anEdge = Splits.FindKey(i); + const TopTools_ListOfShape& aListEdges = Splits(i); + myMap.Bind (anEdge, aListEdges); + } + theSubs.Build(myShape); TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itdesc(myMap); if (theSubs.IsCopied(myShape)) { @@ -201,7 +209,9 @@ void LocOpe_Spliter::Perform(const Handle(LocOpe_WiresOnShape)& PW) for (itdesc.Reset(); itdesc.More(); itdesc.Next()) { const TopoDS_Shape& sori = itdesc.Key(); const TopoDS_Shape& scib = itdesc.Value().First(); - myMap(sori) = theCFace.DescendantShapes(scib); + const TopTools_ListOfShape& aShapeList = theCFace.DescendantShapes(scib); + if (!aShapeList.IsEmpty()) + myMap(sori) = aShapeList; } const TopTools_ListOfShape& lres = myMap(myShape); diff --git a/src/LocOpe/LocOpe_WiresOnShape.cxx b/src/LocOpe/LocOpe_WiresOnShape.cxx index 3bbfc98b7a..ffa5fc1ad9 100644 --- a/src/LocOpe/LocOpe_WiresOnShape.cxx +++ b/src/LocOpe/LocOpe_WiresOnShape.cxx @@ -124,6 +124,8 @@ void LocOpe_WiresOnShape::Init(const TopoDS_Shape& S) myDone = Standard_False; myMap.Clear(); myMapEF.Clear(); + myFacesWithSection.Clear(); + mySplits.Clear(); } //======================================================================= @@ -240,7 +242,6 @@ void LocOpe_WiresOnShape::BindAll() myMap.Bind(ite.Key(),ite.Value()); } - TopTools_IndexedDataMapOfShapeListOfShape Splits; Standard_Integer Ind; TopTools_MapOfShape anOverlappedEdges; for (Ind = 1; Ind <= myMapEF.Extent(); Ind++) @@ -257,21 +258,21 @@ void LocOpe_WiresOnShape::BindAll() if (myCheckInterior) { Standard_Boolean isOverlapped = Standard_False; - FindInternalIntersections(edg, fac, Splits, isOverlapped); + FindInternalIntersections(edg, fac, mySplits, isOverlapped); if(isOverlapped) anOverlappedEdges.Add(edg); } } - for (Ind = 1; Ind <= Splits.Extent(); Ind++) + for (Ind = 1; Ind <= mySplits.Extent(); Ind++) { - TopoDS_Shape anEdge = Splits.FindKey(Ind); + TopoDS_Shape anEdge = mySplits.FindKey(Ind); if(anOverlappedEdges.Contains(anEdge)) continue; TopoDS_Shape aFace = myMapEF.FindFromKey(anEdge); //Remove "anEdge" from "myMapEF" myMapEF.RemoveKey(anEdge); - TopTools_ListIteratorOfListOfShape itl(Splits(Ind)); + TopTools_ListIteratorOfListOfShape itl(mySplits(Ind)); for (; itl.More(); itl.Next()) myMapEF.Add(itl.Value(), aFace); } diff --git a/src/LocOpe/LocOpe_WiresOnShape.hxx b/src/LocOpe/LocOpe_WiresOnShape.hxx index 144cb7a8fb..008e4fa2d1 100644 --- a/src/LocOpe/LocOpe_WiresOnShape.hxx +++ b/src/LocOpe/LocOpe_WiresOnShape.hxx @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -109,8 +110,9 @@ public: //! tells is the face to be split by section or not Standard_Boolean IsFaceWithSection (const TopoDS_Shape& aFace) const; - - + //! returns the map of edges embedded into the faces and their splits + Standard_EXPORT const TopTools_IndexedDataMapOfShapeListOfShape& Splits(); + DEFINE_STANDARD_RTTIEXT(LocOpe_WiresOnShape,Standard_Transient) @@ -125,6 +127,7 @@ private: TopoDS_Shape myShape; TopTools_IndexedDataMapOfShapeShape myMapEF; TopTools_MapOfShape myFacesWithSection; + TopTools_IndexedDataMapOfShapeListOfShape mySplits; Standard_Boolean myCheckInterior; TopTools_DataMapOfShapeShape myMap; Standard_Boolean myDone; diff --git a/src/LocOpe/LocOpe_WiresOnShape.lxx b/src/LocOpe/LocOpe_WiresOnShape.lxx index a21acfc0d7..97326c5165 100644 --- a/src/LocOpe/LocOpe_WiresOnShape.lxx +++ b/src/LocOpe/LocOpe_WiresOnShape.lxx @@ -43,3 +43,13 @@ inline Standard_Boolean LocOpe_WiresOnShape::IsFaceWithSection(const TopoDS_Shap { return (myFacesWithSection.Contains(aFace)); } + +//======================================================================= +//function : Splits +//purpose : +//======================================================================= + +inline const TopTools_IndexedDataMapOfShapeListOfShape& LocOpe_WiresOnShape::Splits() +{ + return mySplits; +} -- 2.39.5