From: skv Date: Thu, 5 Jun 2014 13:29:35 +0000 (+0400) Subject: GetInPlace fix for bugs 22995 and 22374 X-Git-Tag: V7_5_0a1~55 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=191621acbed9beb17fda7702222063fe15a4429c;p=modules%2Fgeom.git GetInPlace fix for bugs 22995 and 22374 --- diff --git a/src/GEOMAlgo/GEOMAlgo_GetInPlace.cxx b/src/GEOMAlgo/GEOMAlgo_GetInPlace.cxx index 450c25bce..718b25f67 100644 --- a/src/GEOMAlgo/GEOMAlgo_GetInPlace.cxx +++ b/src/GEOMAlgo/GEOMAlgo_GetInPlace.cxx @@ -167,6 +167,8 @@ const GEOMAlgo_DataMapOfShapeMapOfShape& GEOMAlgo_GetInPlace::ShapesOn()const //======================================================================= void GEOMAlgo_GetInPlace::Clear() { + TopoDS_Shape aS; + // myErrorStatus=0; myWarningStatus=0; // @@ -174,7 +176,10 @@ void GEOMAlgo_GetInPlace::Clear() myIterator.Clear(); myShapesIn.Clear(); myShapesOn.Clear(); + myShapesInclusive.Clear(); myMapShapePnt.Clear(); + myChecked.Clear(); + myResult= aS; } //======================================================================= //function : Perform @@ -209,7 +214,8 @@ void GEOMAlgo_GetInPlace::Perform() return; } // - FillEdgesOn(); + FillEdgesOn(myArgument); + FillEdgesOn(myShapeWhere); if (myErrorStatus) { return; } @@ -229,7 +235,8 @@ void GEOMAlgo_GetInPlace::Perform() return; } // - FillFacesOn(); + FillFacesOn(myArgument); + FillFacesOn(myShapeWhere); if (myErrorStatus) { return; } @@ -244,7 +251,8 @@ void GEOMAlgo_GetInPlace::Perform() return; } // - FillSolidsOn(); + FillSolidsOn(myArgument); + FillSolidsOn(myShapeWhere); if (myErrorStatus) { return; } @@ -259,7 +267,10 @@ void GEOMAlgo_GetInPlace::Perform() return; } // - FillImages(); + myImages.Clear(); + FillImages(myShapeWhere, Standard_True); + FillImages(myArgument, Standard_False); + if (myErrorStatus) { return; } @@ -318,10 +329,7 @@ void GEOMAlgo_GetInPlace::Intersect() // const TopoDS_Shape& aS1=aMS1(i); BRepBndLib::Add(aS1, aBox1); - //modified by NIZNHY-PKV Fri Jun 10 08:20:03 2011f - //aBox1.SetGap(myTolerance); aBox1.Enlarge(myTolerance); - //modified by NIZNHY-PKV Fri Jun 10 08:20:06 2011t // aTreeFiller.Add(i, aBox1); } @@ -335,10 +343,7 @@ void GEOMAlgo_GetInPlace::Intersect() // const TopoDS_Shape& aS2=aMS2(j); BRepBndLib::Add(aS2, aBox2); - //modified by NIZNHY-PKV Fri Jun 10 08:20:23 2011f - //aBox2.SetGap(myTolerance); aBox2.Enlarge(myTolerance); - //modified by NIZNHY-PKV Fri Jun 10 08:20:25 2011t // aSelector.Clear(); aSelector.SetBox(aBox2); @@ -395,20 +400,21 @@ void GEOMAlgo_GetInPlace::PerformVV() const TopoDS_Shape& aV2=aCS.Shape2(); // FillShapesOn(aV1, aV2); + FillShapesOn(aV2, aV1); } } //======================================================================= //function : FillEdgesOn //purpose : //======================================================================= -void GEOMAlgo_GetInPlace::FillEdgesOn() +void GEOMAlgo_GetInPlace::FillEdgesOn(const TopoDS_Shape &theShape) { Standard_Integer i, aNbE; TopoDS_Iterator aIt; TopTools_IndexedMapOfShape aME; TopTools_MapIteratorOfMapOfShape aItMS; // - TopExp::MapShapes(myArgument, TopAbs_EDGE, aME); + TopExp::MapShapes(theShape, TopAbs_EDGE, aME); aNbE=aME.Extent(); for (i=1; i<=aNbE; ++i) { const TopoDS_Edge& aE1=*((TopoDS_Edge*)&aME(i)); @@ -471,10 +477,6 @@ void GEOMAlgo_GetInPlace::PerformVE() //======================================================================= void GEOMAlgo_GetInPlace::PerformEE() { - Standard_Boolean bHasOn, bHasIn, bFound; - TopoDS_Iterator aIt; - TopTools_MapOfShape aMSX; - // myErrorStatus=0; myWarningStatus=0; // @@ -483,33 +485,56 @@ void GEOMAlgo_GetInPlace::PerformEE() const GEOMAlgo_CoupleOfShapes& aCS=myIterator.Value(); const TopoDS_Shape& aE1=aCS.Shape1(); const TopoDS_Shape& aE2=aCS.Shape2(); - // - bHasOn=myShapesOn.IsBound(aE1); - bHasIn=myShapesIn.IsBound(aE1); - const TopTools_MapOfShape& aMSOn=(bHasOn) ? myShapesOn.Find(aE1) : aMSX; - const TopTools_MapOfShape& aMSIn=(bHasIn) ? myShapesIn.Find(aE1) : aMSX; - // - bFound=Standard_True; - aIt.Initialize(aE2); - for (; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aV2=aIt.Value(); - if (!(aMSOn.Contains(aV2) || aMSIn.Contains(aV2))) { - bFound=!bFound; - break; - } - } - if (!bFound) { - continue; + + PerformEE(aE1, aE2); + + if (myErrorStatus) { + return; } - // - bFound=CheckCoincidence(aE1, aE2); + + PerformEE(aE2, aE1); + if (myErrorStatus) { return; } - if (bFound) { - FillShapesIn(aE1, aE2); + } +} +//======================================================================= +//function : PerformEE +//purpose : +//======================================================================= +void GEOMAlgo_GetInPlace::PerformEE(const TopoDS_Shape &theE1, + const TopoDS_Shape &theE2) +{ + Standard_Boolean bHasOn, bHasIn, bFound; + TopoDS_Iterator aIt; + TopTools_MapOfShape aMSX; + // + bHasOn=myShapesOn.IsBound(theE1); + bHasIn=myShapesIn.IsBound(theE1); + const TopTools_MapOfShape& aMSOn=(bHasOn) ? myShapesOn.Find(theE1) : aMSX; + const TopTools_MapOfShape& aMSIn=(bHasIn) ? myShapesIn.Find(theE1) : aMSX; + // + bFound=Standard_True; + aIt.Initialize(theE2); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aV2=aIt.Value(); + if (!(aMSOn.Contains(aV2) || aMSIn.Contains(aV2))) { + bFound=!bFound; + break; } } + if (!bFound) { + return; + } + // + bFound=CheckCoincidence(theE1, theE2); + if (myErrorStatus) { + return; + } + if (bFound) { + FillShapesIn(theE1, theE2); + } } //======================================================================= //function : PerformVF @@ -569,14 +594,14 @@ void GEOMAlgo_GetInPlace::PerformVF() //function : FillFacesOn //purpose : //======================================================================= -void GEOMAlgo_GetInPlace::FillFacesOn() +void GEOMAlgo_GetInPlace::FillFacesOn(const TopoDS_Shape &theShape) { Standard_Integer i, j, aNbF, aNbE; TopoDS_Iterator aIt; TopTools_IndexedMapOfShape aMF, aME; TopTools_MapIteratorOfMapOfShape aItMS; // - TopExp::MapShapes(myArgument, TopAbs_FACE, aMF); + TopExp::MapShapes(theShape, TopAbs_FACE, aMF); aNbF=aMF.Extent(); for (i=1; i<=aNbF; ++i) { const TopoDS_Face& aF1=*((TopoDS_Face*)&aMF(i)); @@ -668,11 +693,6 @@ void GEOMAlgo_GetInPlace::PerformEF() //======================================================================= void GEOMAlgo_GetInPlace::PerformFF() { - Standard_Boolean bFound, bHasOnF, bHasInF; - Standard_Integer i, aNbS2; - TopTools_MapOfShape aMSX; - TopTools_IndexedMapOfShape aMS2; - // myErrorStatus=0; myWarningStatus=0; // @@ -681,52 +701,75 @@ void GEOMAlgo_GetInPlace::PerformFF() const GEOMAlgo_CoupleOfShapes& aCS=myIterator.Value(); const TopoDS_Shape& aF1=aCS.Shape1(); const TopoDS_Shape& aF2=aCS.Shape2(); - // - bHasOnF=myShapesOn.IsBound(aF1); - const TopTools_MapOfShape& aMSOnF=(bHasOnF) ? myShapesOn.Find(aF1) : aMSX; - // - bHasInF=myShapesIn.IsBound(aF1); - const TopTools_MapOfShape& aMSInF=(bHasInF) ? myShapesIn.Find(aF1) : aMSX; - // - aMS2.Clear(); - MapBRepShapes(aF2, aMS2); - // - bFound=Standard_False; - aNbS2=aMS2.Extent(); - for (i=1; i<=aNbS2; ++i) { - const TopoDS_Shape& aS2=aMS2(i); - if (aS2.IsSame(aF2)) { - continue; - } - bFound=(aMSOnF.Contains(aS2) || aMSInF.Contains(aS2)); - if (!bFound) { - break; - } - } - if (!bFound) { - continue; + + PerformFF(aF1, aF2); + + if (myErrorStatus) { + return; } - // - bFound=CheckCoincidence(aF1, aF2); + + PerformFF(aF2, aF1); + if (myErrorStatus) { return; } - if (bFound) { - FillShapesIn(aF1, aF2); + } +} +//======================================================================= +//function : PerformFF +//purpose : +//======================================================================= +void GEOMAlgo_GetInPlace::PerformFF(const TopoDS_Shape &theF1, + const TopoDS_Shape &theF2) +{ + Standard_Boolean bFound, bHasOnF, bHasInF; + Standard_Integer i, aNbS2; + TopTools_MapOfShape aMSX; + TopTools_IndexedMapOfShape aMS2; + // + bHasOnF=myShapesOn.IsBound(theF1); + const TopTools_MapOfShape& aMSOnF=(bHasOnF) ? myShapesOn.Find(theF1) : aMSX; + // + bHasInF=myShapesIn.IsBound(theF1); + const TopTools_MapOfShape& aMSInF=(bHasInF) ? myShapesIn.Find(theF1) : aMSX; + // + MapBRepShapes(theF2, aMS2); + // + bFound=Standard_False; + aNbS2=aMS2.Extent(); + for (i=1; i<=aNbS2; ++i) { + const TopoDS_Shape& aS2=aMS2(i); + if (aS2.IsSame(theF2)) { + continue; + } + bFound=(aMSOnF.Contains(aS2) || aMSInF.Contains(aS2)); + if (!bFound) { + break; } } + if (!bFound) { + return; + } + // + bFound=CheckCoincidence(theF1, theF2); + if (myErrorStatus) { + return; + } + if (bFound) { + FillShapesIn(theF1, theF2); + } } //======================================================================= //function : FillSolidsOn //purpose : //======================================================================= -void GEOMAlgo_GetInPlace::FillSolidsOn() +void GEOMAlgo_GetInPlace::FillSolidsOn(const TopoDS_Shape &theShape) { Standard_Integer i, j, aNbS, aNbF; TopTools_IndexedMapOfShape aMS, aMF; TopTools_MapIteratorOfMapOfShape aItMS; // - TopExp::MapShapes(myArgument, TopAbs_SOLID, aMS); + TopExp::MapShapes(theShape, TopAbs_SOLID, aMS); // aNbS=aMS.Extent(); for (i=1; i<=aNbS; ++i) { @@ -798,11 +841,6 @@ void GEOMAlgo_GetInPlace::PerformZF() //======================================================================= void GEOMAlgo_GetInPlace::PerformZZ() { - Standard_Boolean bFound, bHasOn, bHasIn; - Standard_Integer i, aNbS2, iCntOn, iCntIn, iCntOut; - TopTools_MapOfShape aMSX; - TopTools_IndexedMapOfShape aMS2; - // myErrorStatus=0; myWarningStatus=0; // @@ -811,274 +849,256 @@ void GEOMAlgo_GetInPlace::PerformZZ() const GEOMAlgo_CoupleOfShapes& aCS=myIterator.Value(); const TopoDS_Shape& aSo1=aCS.Shape1(); const TopoDS_Shape& aSo2=aCS.Shape2(); - // - bHasOn=myShapesOn.IsBound(aSo1); - const TopTools_MapOfShape& aMSOn=(bHasOn) ? myShapesOn.Find(aSo1) : aMSX; - // - bHasIn=myShapesIn.IsBound(aSo1); - const TopTools_MapOfShape& aMSIn=(bHasIn) ? myShapesIn.Find(aSo1) : aMSX; - // - aMS2.Clear(); - TopExp::MapShapes(aSo2, TopAbs_FACE, aMS2); - // - iCntIn=0; - iCntOn=0; - iCntOut=0; - bFound=Standard_False; - aNbS2=aMS2.Extent(); - for (i=1; i<=aNbS2; ++i) { - const TopoDS_Shape& aF2=aMS2(i); - // - if (aMSIn.Contains(aF2)) { - ++iCntIn; - bFound=Standard_True; - break; - } - else if (!aMSOn.Contains(aF2)) { - ++iCntOut; - bFound=Standard_False;// out - break; - } - else { - ++iCntOn; //on - } + + PerformZZ(aSo1, aSo2); + + if (myErrorStatus) { + return; } - // - if (!bFound && iCntOut) { - continue; + + PerformZZ(aSo2, aSo1); + + if (myErrorStatus) { + return; } + }// for (; myIterator.More(); myIterator.Next()) { +} +//======================================================================= +//function : PerformZZ +//purpose : +//======================================================================= +void GEOMAlgo_GetInPlace::PerformZZ(const TopoDS_Shape &theSo1, + const TopoDS_Shape &theSo2) +{ + Standard_Boolean bFound, bHasOn, bHasIn; + Standard_Integer i, aNbS2, iCntOn, iCntIn, iCntOut; + TopTools_MapOfShape aMSX; + TopTools_IndexedMapOfShape aMS2; + // + bHasOn=myShapesOn.IsBound(theSo1); + const TopTools_MapOfShape& aMSOn=(bHasOn) ? myShapesOn.Find(theSo1) : aMSX; + // + bHasIn=myShapesIn.IsBound(theSo1); + const TopTools_MapOfShape& aMSIn=(bHasIn) ? myShapesIn.Find(theSo1) : aMSX; + // + TopExp::MapShapes(theSo2, TopAbs_FACE, aMS2); + // + iCntIn=0; + iCntOn=0; + iCntOut=0; + bFound=Standard_False; + aNbS2=aMS2.Extent(); + for (i=1; i<=aNbS2; ++i) { + const TopoDS_Shape& aF2=aMS2(i); // - if (!iCntIn) { - bFound=CheckCoincidence(aSo1, aSo2); - if (myErrorStatus) { - return; - } + if (aMSIn.Contains(aF2)) { + ++iCntIn; + bFound=Standard_True; + break; } - if (bFound) { - FillShapesIn(aSo1, aSo2); + else if (!aMSOn.Contains(aF2)) { + ++iCntOut; + bFound=Standard_False;// out + break; } - }// for (; myIterator.More(); myIterator.Next()) { + else { + ++iCntOn; //on + } + } + // + if (!bFound && iCntOut) { + return; + } + // + if (!iCntIn) { + bFound=CheckCoincidence(theSo1, theSo2); + if (myErrorStatus) { + return; + } + } + if (bFound) { + FillShapesIn(theSo1, theSo2); + } } //======================================================================= //function : FillImages //purpose : //======================================================================= -void GEOMAlgo_GetInPlace::FillImages() +void GEOMAlgo_GetInPlace::FillImages(const TopoDS_Shape &theShape, + const Standard_Boolean IsWhere) { - Standard_Integer i, aNbS, aNbSx, aNbSi; - TopAbs_ShapeEnum aType; - TopoDS_Iterator aIt; - TopTools_ListOfShape aLSx; - TopTools_ListIteratorOfListOfShape aItLS; - TopTools_IndexedMapOfShape aMS; - TopTools_MapIteratorOfMapOfShape aItMS; // myErrorStatus=0; myWarningStatus=0; // - myImages.Clear(); - // // 1. Vertices - aMS.Clear(); - TopExp::MapShapes(myArgument, TopAbs_VERTEX, aMS); - aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Shape& aV=aMS(i); - if (myShapesOn.IsBound(aV)) { - const TopTools_MapOfShape& aMSx=myShapesOn.Find(aV); - aNbSx=aMSx.Extent(); - // - aLSx.Clear(); - aItMS.Initialize(aMSx); - for (; aItMS.More(); aItMS.Next()) { - const TopoDS_Shape& aVx=aItMS.Key(); - aLSx.Append(aVx); - } - // - myImages.Bind(aV, aLSx); - } - } + FillImgSimple(theShape, TopAbs_VERTEX, IsWhere); // // 2. Edges - aMS.Clear(); - TopExp::MapShapes(myArgument, TopAbs_EDGE, aMS); - aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Shape& aE=aMS(i); - if (myShapesIn.IsBound(aE)) { - const TopTools_MapOfShape& aMSx=myShapesIn.Find(aE); - aNbSx=aMSx.Extent(); - // - aLSx.Clear(); - aItMS.Initialize(aMSx); - for (; aItMS.More(); aItMS.Next()) { - const TopoDS_Shape& aEx=aItMS.Key(); - aType=aEx.ShapeType(); - if (aType==TopAbs_EDGE){ - aLSx.Append(aEx); - } - } - // - myImages.Bind(aE, aLSx); - } - } + FillImgSimple(theShape, TopAbs_EDGE, IsWhere); // // 3. Wires - aMS.Clear(); - TopExp::MapShapes(myArgument, TopAbs_WIRE, aMS); - aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Shape& aW=aMS(i); - aLSx.Clear(); - aIt.Initialize(aW); - for(; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aE=aIt.Value(); - if (myImages.IsBound(aE)) { - const TopTools_ListOfShape& aLSi=myImages.Find(aE); - aNbSi=aLSi.Extent(); - // - aItLS.Initialize(aLSi); - for (; aItLS.More(); aItLS.Next()) { - const TopoDS_Shape& aEi=aItLS.Value(); - aLSx.Append(aEi); - } - } - } - myImages.Bind(aW, aLSx); - } + FillImgComplex(theShape, TopAbs_WIRE, IsWhere); // // 4. Faces - aMS.Clear(); - TopExp::MapShapes(myArgument, TopAbs_FACE, aMS); - aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Shape& aF=aMS(i); - if (myShapesIn.IsBound(aF)) { - const TopTools_MapOfShape& aMSx=myShapesIn.Find(aF); - aNbSx=aMSx.Extent(); - // - aLSx.Clear(); - aItMS.Initialize(aMSx); - for (; aItMS.More(); aItMS.Next()) { - const TopoDS_Shape& aFx=aItMS.Key(); - aType=aFx.ShapeType(); - if (aType==TopAbs_FACE){ - aLSx.Append(aFx); - } - } - // - myImages.Bind(aF, aLSx); - } - } + FillImgSimple(theShape, TopAbs_FACE, IsWhere); // // 5. Shells - aMS.Clear(); - TopExp::MapShapes(myArgument, TopAbs_SHELL, aMS); - aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Shape& aSh=aMS(i); - aLSx.Clear(); - aIt.Initialize(aSh); - for(; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aF=aIt.Value(); - if (myImages.IsBound(aF)) { - const TopTools_ListOfShape& aLSi=myImages.Find(aF); - aNbSi=aLSi.Extent(); - // - aItLS.Initialize(aLSi); - for (; aItLS.More(); aItLS.Next()) { - const TopoDS_Shape& aFi=aItLS.Value(); - aLSx.Append(aFi); - } - } - } - myImages.Bind(aSh, aLSx); - } + FillImgComplex(theShape, TopAbs_SHELL, IsWhere); // // 6. Solids - aMS.Clear(); - TopExp::MapShapes(myArgument, TopAbs_SOLID, aMS); - aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Shape& aZ=aMS(i); - if (myShapesIn.IsBound(aZ)) { - const TopTools_MapOfShape& aMSx=myShapesIn.Find(aZ); - aNbSx=aMSx.Extent(); - // - aLSx.Clear(); - aItMS.Initialize(aMSx); - for (; aItMS.More(); aItMS.Next()) { - const TopoDS_Shape& aZx=aItMS.Key(); - aType=aZx.ShapeType(); - if (aType==TopAbs_SOLID){ - aLSx.Append(aZx); - } - } - // - myImages.Bind(aZ, aLSx); - } - } + FillImgSimple(theShape, TopAbs_SOLID, IsWhere); // // 7. CompSolids - aMS.Clear(); - TopExp::MapShapes(myArgument, TopAbs_COMPSOLID, aMS); - aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Shape& aCs=aMS(i); - aLSx.Clear(); - aIt.Initialize(aCs); - for(; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aZ=aIt.Value(); - if (myImages.IsBound(aZ)) { - const TopTools_ListOfShape& aLSi=myImages.Find(aZ); - aNbSi=aLSi.Extent(); - // - aItLS.Initialize(aLSi); - for (; aItLS.More(); aItLS.Next()) { - const TopoDS_Shape& aZi=aItLS.Value(); - aLSx.Append(aZi); + FillImgComplex(theShape, TopAbs_COMPSOLID, IsWhere); + // + // 8. Compounds + const TopAbs_ShapeEnum aType = theShape.ShapeType(); + + if (aType == TopAbs_COMPOUND) { + FillImgComplex(theShape, IsWhere); + } +} + +//======================================================================= +//function : FillImgSimple +//purpose : +//======================================================================= +void GEOMAlgo_GetInPlace::FillImgSimple + (const TopoDS_Shape &theShape, + const TopAbs_ShapeEnum theSubShapeType, + const Standard_Boolean IsWhere) +{ + TopTools_IndexedMapOfShape aMS; + + TopExp::MapShapes(theShape, theSubShapeType, aMS); + + Standard_Integer i; + const Standard_Integer aNbS = aMS.Extent(); + const GEOMAlgo_DataMapOfShapeMapOfShape &aShapesInOn = + (theSubShapeType == TopAbs_VERTEX ? myShapesOn : myShapesIn); + + for (i = 1; i <= aNbS; i++) { + const TopoDS_Shape& aS = aMS(i); + + if (aShapesInOn.IsBound(aS)) { + const TopTools_MapOfShape& aMSx = aShapesInOn.Find(aS); + TopTools_ListOfShape aLSx; + TopTools_MapIteratorOfMapOfShape aItMS(aMSx); + + for (; aItMS.More(); aItMS.Next()) { + const TopoDS_Shape& aSx = aItMS.Key(); + TopAbs_ShapeEnum aType = aSx.ShapeType(); + + if (aType == theSubShapeType){ + aLSx.Append(aSx); + + if (IsWhere) { + myShapesInclusive.Bind(aSx, aS); + } } } + + myImages.Bind(aS, aLSx); } - myImages.Bind(aCs, aLSx); - } - // - // 8. Compounds - aType=myArgument.ShapeType(); - if (aType==TopAbs_COMPOUND) { - FillImagesCompound(myArgument); } } + //======================================================================= -//function : FillImagesCompound +//function : FillImgComplex //purpose : //======================================================================= -void GEOMAlgo_GetInPlace::FillImagesCompound(const TopoDS_Shape& aS) +void GEOMAlgo_GetInPlace::FillImgComplex(const TopoDS_Shape &theShape, + const Standard_Boolean IsWhere) { - TopAbs_ShapeEnum aType; - TopoDS_Iterator aIt; + TopTools_MapOfShape aMapRemaining; + TopoDS_Iterator aIt(theShape); TopTools_ListOfShape aLSx; - TopTools_ListIteratorOfListOfShape aItLS; - // - aIt.Initialize(aS); + TopTools_MapOfShape aMSx; + for(; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aSx=aIt.Value(); - aType=aSx.ShapeType(); - // - if (aType==TopAbs_COMPOUND) { - FillImagesCompound(aSx); + const TopoDS_Shape &aSubS = aIt.Value(); + TopAbs_ShapeEnum aType = aSubS.ShapeType(); + + if (aType == TopAbs_COMPOUND) { + // Recursively treat compounds. + FillImgComplex(aSubS, IsWhere); } - // - if (myImages.IsBound(aSx)) { - const TopTools_ListOfShape& aLSi=myImages.Find(aSx); - aItLS.Initialize(aLSi); + + if (myImages.IsBound(aSubS)) { + const TopTools_ListOfShape& aLSi = myImages.Find(aSubS); + TopTools_ListIteratorOfListOfShape aItLS(aLSi); + for (; aItLS.More(); aItLS.Next()) { - const TopoDS_Shape& aSi=aItLS.Value(); - aLSx.Append(aSi); + const TopoDS_Shape &aSubSi = aItLS.Value(); + + if (aMSx.Add(aSubSi)) { + aLSx.Append(aSubSi); + } } + } else if (!IsWhere) { + aMapRemaining.Add(aSubS); } } - myImages.Bind(aS, aLSx); + + if (!(IsWhere || aMapRemaining.IsEmpty())) { + // Find the whole from parts. + while (!aMapRemaining.IsEmpty()) { + TopTools_MapIteratorOfMapOfShape anIter(aMapRemaining); + const TopoDS_Shape &aShape = anIter.Key(); + + if (myShapesInclusive.IsBound(aShape)) { + // This "what" shape is inclusive to the "where" shape. + // Get the other inclusive shapes. + const TopoDS_Shape &aSWhere = myShapesInclusive.Find(aShape); + + if (myImages.IsBound(aSWhere)) { + // Remove inclusive shapes from aMapRemaining. + const TopTools_ListOfShape& aLWhat = myImages.Find(aSWhere); + TopTools_ListIteratorOfListOfShape aItLS(aLWhat); + + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape &aSWhat = aItLS.Value(); + + aMapRemaining.Remove(aSWhat); + } + + // Add "whole" shape to the list of images. + if (aMSx.Add(aSWhere)) { + aLSx.Append(aSWhere); + } + } + } else { + // This "what" shape is not inclusive to the "where" shape. Skip it. + aMapRemaining.Remove(aShape); + } + } + } + + myImages.Bind(theShape, aLSx); +} + +//======================================================================= +//function : FillImgComplex +//purpose : +//======================================================================= +void GEOMAlgo_GetInPlace::FillImgComplex + (const TopoDS_Shape &theShape, + const TopAbs_ShapeEnum theSubShapeType, + const Standard_Boolean IsWhere) +{ + TopTools_IndexedMapOfShape aMS; + + TopExp::MapShapes(theShape, theSubShapeType, aMS); + + Standard_Integer i; + const Standard_Integer aNbS = aMS.Extent(); + + for (i=1; i<=aNbS; ++i) { + const TopoDS_Shape &aS = aMS(i); + + FillImgComplex(aS, IsWhere); + } } //======================================================================= @@ -1117,6 +1137,7 @@ void GEOMAlgo_GetInPlace::FillShapesOn(const TopoDS_Shape& aS1, myShapesOn.Bind(aS1, aMS); } } + //======================================================================= //function : MapBRepShapes //purpose : @@ -1148,3 +1169,35 @@ void MapBRepShapes(const TopoDS_Shape& aS, MapBRepShapes(aSx, aM); } } +//======================================================================= +//function : Result +//purpose : +//======================================================================= +const TopoDS_Shape &GEOMAlgo_GetInPlace::Result() +{ + TopoDS_Shape aDummy; + // + myResult = aDummy; + // + Standard_Boolean bFound; + TopoDS_Compound aC; + BRep_Builder aBB; + TopTools_ListIteratorOfListOfShape aItLS; + // + bFound=myImages.IsBound(myArgument); + if (!bFound) { + return myResult; + } + // + aBB.MakeCompound(aC); + // + const TopTools_ListOfShape& aLS=myImages.Find(myArgument); + aItLS.Initialize(aLS); + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aSD=aItLS.Value(); + aBB.Add(aC, aSD); + } + // + myResult = aC; + return myResult; +} diff --git a/src/GEOMAlgo/GEOMAlgo_GetInPlace.hxx b/src/GEOMAlgo/GEOMAlgo_GetInPlace.hxx index b097f4356..f10eafca5 100644 --- a/src/GEOMAlgo/GEOMAlgo_GetInPlace.hxx +++ b/src/GEOMAlgo/GEOMAlgo_GetInPlace.hxx @@ -43,6 +43,8 @@ #include #include #include +#include +#include //======================================================================= @@ -206,7 +208,7 @@ class GEOMAlgo_GetInPlace : public GEOMAlgo_GluerAlgo, /** * Returns state of the search. * @return - * Standard_True if the argument is found. + * Standard_True if the whole argument is found. */ Standard_EXPORT Standard_Boolean IsFound() const; @@ -244,7 +246,24 @@ class GEOMAlgo_GetInPlace : public GEOMAlgo_GluerAlgo, */ Standard_EXPORT const GEOMAlgo_DataMapOfShapeMapOfShape& ShapesOn() const; - + // + /** + * Returns the result that includes parts of the whole and whole from parts. + * + * The Result is the parts (taken from myShapeWhere) that correspond to + * myArgument (the whole one or its part). To check if the whole myArgument + * is found in myShapeWhere it is possible to use the method IsFound. + * + * The Result is a compound. + * + * @return + * - the compound of the parts from myShapeWhere + * that correspond to the myArgument if success. + * - NULL shape otherwise + */ + Standard_EXPORT + const TopoDS_Shape &Result(); + protected: Standard_EXPORT void Intersect() ; @@ -258,6 +277,8 @@ protected: Standard_EXPORT void PerformEE() ; + void PerformEE(const TopoDS_Shape &theE1, const TopoDS_Shape &theE2); + Standard_EXPORT void PerformVF() ; @@ -267,14 +288,16 @@ protected: Standard_EXPORT void PerformFF() ; + void PerformFF(const TopoDS_Shape &theF1, const TopoDS_Shape &theF2); + Standard_EXPORT - void FillEdgesOn() ; + void FillEdgesOn(const TopoDS_Shape &theShape); Standard_EXPORT - void FillFacesOn() ; + void FillFacesOn(const TopoDS_Shape &theShape); Standard_EXPORT - void FillSolidsOn() ; + void FillSolidsOn(const TopoDS_Shape &theShape); Standard_EXPORT void PerformZF() ; @@ -282,17 +305,25 @@ protected: Standard_EXPORT void PerformZZ() ; - Standard_EXPORT - void FillImages() ; + void PerformZZ(const TopoDS_Shape &theSo1, const TopoDS_Shape &theSo2); Standard_EXPORT - void FillImagesCompound(const TopoDS_Shape& theS) ; + void FillImages(const TopoDS_Shape &theShape, + const Standard_Boolean IsWhere); - Standard_EXPORT - void CheckGProps() ; + void FillImgSimple(const TopoDS_Shape &theShape, + const TopAbs_ShapeEnum theSubShapeType, + const Standard_Boolean IsWhere); + + void FillImgComplex(const TopoDS_Shape &theShape, + const Standard_Boolean IsWhere); + + void FillImgComplex(const TopoDS_Shape &theShape, + const TopAbs_ShapeEnum theSubShapeType, + const Standard_Boolean IsWhere); Standard_EXPORT - void CheckGProps(const TopoDS_Shape& theS) ; + void CheckGProps() ; Standard_EXPORT void FillShapesIn(const TopoDS_Shape& theS1, @@ -305,16 +336,30 @@ protected: Standard_EXPORT Standard_Boolean CheckCoincidence(const TopoDS_Shape& theS1, const TopoDS_Shape& theS2); + + Standard_EXPORT + Standard_Integer CheckGProps(const TopoDS_Shape& theS); + Standard_Boolean CompareGProps + (const TopoDS_Shape &theShape1, + const TopTools_ListOfShape &theListShape2) const; + Standard_EXPORT + void UpdateChecked(const TopoDS_Shape& theS1, + const Standard_Integer theFlag); + // TopoDS_Shape myShapeWhere; GEOMAlgo_GetInPlaceIterator myIterator; GEOMAlgo_DataMapOfShapeMapOfShape myShapesIn; GEOMAlgo_DataMapOfShapeMapOfShape myShapesOn; + TopTools_DataMapOfShapeShape myShapesInclusive; Standard_Real myTolMass; Standard_Real myTolCG; Standard_Boolean myFound; GEOMAlgo_DataMapOfShapePnt myMapShapePnt; + TopTools_DataMapOfShapeInteger myChecked; + // + TopoDS_Shape myResult; private: }; diff --git a/src/GEOMAlgo/GEOMAlgo_GetInPlace_2.cxx b/src/GEOMAlgo/GEOMAlgo_GetInPlace_2.cxx index f058c3eba..0ac5242e1 100644 --- a/src/GEOMAlgo/GEOMAlgo_GetInPlace_2.cxx +++ b/src/GEOMAlgo/GEOMAlgo_GetInPlace_2.cxx @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -59,98 +60,198 @@ static //======================================================================= void GEOMAlgo_GetInPlace::CheckGProps() { - myFound=Standard_False; + myFound=Standard_True; CheckGProps(myArgument); } //======================================================================= //function : CheckGProps //purpose : //======================================================================= -void GEOMAlgo_GetInPlace::CheckGProps(const TopoDS_Shape& aS1) +Standard_Integer GEOMAlgo_GetInPlace::CheckGProps(const TopoDS_Shape& theS) { - Standard_Boolean bOnlyClosed; - Standard_Integer iDim, aNbS2; - Standard_Real aMass1, aMass2, aD2, aTolCG2, dM; - TopAbs_ShapeEnum aType1; - gp_Pnt aCG1, aCG2; - TopoDS_Iterator aIt; - TopoDS_Compound aC2; - BRep_Builder aBB; - TopTools_ListIteratorOfListOfShape aItLS; - // - myErrorStatus=0; - // - aType1=aS1.ShapeType(); - if (aType1==TopAbs_COMPOUND) { - aIt.Initialize(aS1); - for(; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aS1x=aIt.Value(); - CheckGProps(aS1x); - if (!myFound) { - return; + TopAbs_ShapeEnum aType = theS.ShapeType(); + + if (aType == TopAbs_COMPOUND) { + TopoDS_Iterator anIt(theS); + TopTools_MapOfShape aMapInc; + + for(; anIt.More(); anIt.Next()) { + const TopoDS_Shape &aS1x = anIt.Value(); + + aType = aS1x.ShapeType(); + + if (aType != TopAbs_COMPOUND && myShapesInclusive.IsBound(aS1x)) { + // This is a part of a whole. + aMapInc.Add(aS1x); + } else { + // Check this subshape. + const Standard_Integer iFound = CheckGProps(aS1x); + + if (!iFound) { + UpdateChecked(theS, 0); + myFound = Standard_False; + return 0; + } } } + + // Treat parts of a whole. + while (!aMapInc.IsEmpty()) { + TopTools_MapIteratorOfMapOfShape aMapIt(aMapInc); + const TopoDS_Shape &aWhole = myShapesInclusive.Find(aMapIt.Key()); + + if (!myImages.IsBound(aWhole)) { + // Should not be. + UpdateChecked(theS, 0); + myFound = Standard_False; + return 0; + } + + const TopTools_ListOfShape& aLS1 = myImages.Find(aWhole); + + if (aLS1.IsEmpty()) { + // Empty list of parts. Should not be. + UpdateChecked(theS, 0); + myFound = Standard_False; + return 0; + } + + TopTools_ListIteratorOfListOfShape aItS1x(aLS1); + + for (; aItS1x.More(); aItS1x.Next()) { + const TopoDS_Shape &aS1x = aItS1x.Value(); + + if (!aMapInc.Remove(aS1x)) { + // There is no aS1x in theS. Should not be. + UpdateChecked(theS, 0); + myFound = Standard_False; + return 0; + } + } + + // Compare a shape with an image. + if (!CompareGProps(aWhole, aLS1)) { + // Image doesn't correspond to the shape. + UpdateChecked(theS, 0); + myFound = Standard_False; + return 0; + } + } + + return myFound ? 1 : 0; } - // - iDim=Dimension(aType1); - // - if (!myImages.IsBound(aS1)) { + + // Check the simple shape. + if (!myImages.IsBound(theS)) { // it should not be. - return; + UpdateChecked(theS, 0); + myFound = Standard_False; + return 0; } - const TopTools_ListOfShape& aLS2=myImages.Find(aS1); - aNbS2=aLS2.Extent(); - if (!aNbS2) { + // + const TopTools_ListOfShape &aLS2 = myImages.Find(theS); + + if (aLS2.IsEmpty()) { // it should not be. - return; + UpdateChecked(theS, 0); + myFound = Standard_False; + return 0; } + + // Compare a shape with an image. + if (!CompareGProps(theS, aLS2)) { + // Image doesn't correspond to the shape. + UpdateChecked(theS, 0); + myFound = Standard_False; + return 0; + } + + UpdateChecked(theS, 1); // - aBB.MakeCompound(aC2); - aItLS.Initialize(aLS2); - for (; aItLS.More(); aItLS.Next()) { - const TopoDS_Shape& aS2x=aItLS.Value(); - aBB.Add(aC2, aS2x); - } - //------------------------- - GProp_GProps aG1, aG2; - // - aTolCG2=myTolCG*myTolCG; - bOnlyClosed=Standard_False; - // - if (iDim==0) { - PointProperties(aS1, aG1); - PointProperties(aC2, aG2); + return 1; +} + +//======================================================================= +//function : CompareGProps +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_GetInPlace::CompareGProps + (const TopoDS_Shape &theShape1, + const TopTools_ListOfShape &theListShape2) const +{ + Standard_Boolean aResult = Standard_True; + TopoDS_Compound aComp2; + BRep_Builder aBuilder; + TopTools_ListIteratorOfListOfShape anIt(theListShape2); + + aBuilder.MakeCompound(aComp2); + + for (; anIt.More(); anIt.Next()) { + const TopoDS_Shape &aShape2 = anIt.Value(); + + aBuilder.Add(aComp2, aShape2); } - else if (iDim==1) { - BRepGProp::LinearProperties(aS1, aG1); - BRepGProp::LinearProperties(aC2, aG2); + + // Compute General Properties. + GProp_GProps aG1; + GProp_GProps aG2; + const Standard_Real aTolCG2 = myTolCG*myTolCG; + Standard_Boolean bOnlyClosed = Standard_False; + const TopAbs_ShapeEnum aType = theShape1.ShapeType(); + const Standard_Integer iDim = Dimension(aType); + + if (iDim == 0) { + PointProperties(theShape1, aG1); + PointProperties(aComp2, aG2); } - else if (iDim==2) { - BRepGProp::SurfaceProperties(aS1, aG1); - BRepGProp::SurfaceProperties(aC2, aG2); + else if (iDim == 1) { + BRepGProp::LinearProperties(theShape1, aG1); + BRepGProp::LinearProperties(aComp2, aG2); } - else if (iDim==3) { - BRepGProp::VolumeProperties(aS1, aG1, bOnlyClosed); - BRepGProp::VolumeProperties(aC2, aG2, bOnlyClosed); + else if (iDim == 2) { + BRepGProp::SurfaceProperties(theShape1, aG1); + BRepGProp::SurfaceProperties(aComp2, aG2); } - // - aMass1=aG1.Mass(); - aMass2=aG2.Mass(); - aCG1=aG1.CentreOfMass(); - aCG2=aG2.CentreOfMass(); - // - dM=fabs(aMass1-aMass2); + else if (iDim == 3) { + BRepGProp::VolumeProperties(theShape1, aG1, bOnlyClosed); + BRepGProp::VolumeProperties(aComp2, aG2, bOnlyClosed); + } else { + return Standard_False; + } + + // Compare properties. + const Standard_Real aMass1 = aG1.Mass(); + const Standard_Real aMass2 = aG2.Mass(); + const gp_Pnt aCG1 = aG1.CentreOfMass(); + const gp_Pnt aCG2 = aG2.CentreOfMass(); + Standard_Real aDM = fabs(aMass1 - aMass2); + const Standard_Real aD2 = aCG1.SquareDistance(aCG2); + if (aMass1 > myTolMass) { - dM=dM/aMass1; + aDM /= aMass1; } - // - aD2=aCG1.SquareDistance(aCG2); - // - if ((dM > myTolMass) || (aD2 > aTolCG2)) { - myFound=Standard_False; - return; + + if ((aDM > myTolMass) || (aD2 > aTolCG2)) { + aResult = Standard_False; + } + + return aResult; +} + +//======================================================================= +//function : UpdateChecked +//purpose : +//======================================================================= +void GEOMAlgo_GetInPlace::UpdateChecked(const TopoDS_Shape& theS1, + const Standard_Integer theFlag) +{ + if (myChecked.IsBound(theS1)) { + Standard_Integer& iChecked=myChecked.ChangeFind(theS1); + iChecked=theFlag; + } + else { + myChecked.Bind(theS1, theFlag); } - myFound=Standard_True; } //======================================================================= //function : Dimension diff --git a/src/GEOMAlgo/GEOMAlgo_GetInPlace_3.cxx b/src/GEOMAlgo/GEOMAlgo_GetInPlace_3.cxx index 813ded5c4..5e77dd3be 100644 --- a/src/GEOMAlgo/GEOMAlgo_GetInPlace_3.cxx +++ b/src/GEOMAlgo/GEOMAlgo_GetInPlace_3.cxx @@ -75,6 +75,16 @@ void GEOMAlgo_GetInPlaceIterator::AppendPair(const GEOMAlgo_CoupleOfShapes& theC iX=TypeToInteger(aType1, aType2); if (iX>=0) { myLists[iX].Append(theCS); + } else { + // Add inverted pair of shapes. + iX=TypeToInteger(aType2, aType1); + + if (iX>=0) { + GEOMAlgo_CoupleOfShapes aCSInv; + + aCSInv.SetShapes(aS2, aS1); + myLists[iX].Append(aCSInv); + } } } //======================================================================= diff --git a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx index 6eae2bda6..efb82f39b 100644 --- a/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IShapesOperations.cxx @@ -3890,7 +3890,7 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace (Handle(GEOM_Object) min_l = fabs(aXmax - aXmin); if( min_l < fabs(aYmax - aYmin) ) min_l = fabs(aYmax - aYmin); if( min_l < fabs(aZmax - aZmin) ) min_l = fabs(aZmax - aZmin); - min_l /= dl_l; + // Mantis issue 0020908 BEGIN if (!Exp_Edge.More()) { min_l = Precision::Confusion(); @@ -3907,6 +3907,7 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace (Handle(GEOM_Object) if ( aProps.Mass() < min_l ) min_l = aProps.Mass(); } } + min_l *= dl_l; // Compute tolerances Tol_0D = dl_l; @@ -3948,34 +3949,23 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::GetInPlace (Handle(GEOM_Object) // return NULL; //} - const TopTools_DataMapOfShapeListOfShape& aDMSLS = aGIP.Images(); - if (!aDMSLS.IsBound(aWhat)) { - SetErrorCode(NOT_FOUND_ANY); - return NULL; - } - // - // pkvf - TopTools_ListOfShape aLSA; - // - { - TopTools_MapOfShape aMFence; - TopTools_ListIteratorOfListOfShape aIt; - // - const TopTools_ListOfShape& aLS = aDMSLS.Find(aWhat); - aIt.Initialize(aLS); - for (;aIt.More(); aIt.Next()) { - const TopoDS_Shape& aSA=aIt.Value(); - if(aMFence.Add(aSA)) { - aLSA.Append(aSA); + // Add direct result. + TopTools_ListOfShape aLSA; + const TopoDS_Shape &aShapeResult = aGIP.Result(); + TopTools_MapOfShape aMFence; + + if (aShapeResult.IsNull() == Standard_False) { + TopoDS_Iterator anIt(aShapeResult); + + for (; anIt.More(); anIt.Next()) { + const TopoDS_Shape &aPart = anIt.Value(); + + if(aWhereIndices.Contains(aPart) && aMFence.Add(aPart)) { + aLSA.Append(aPart); } } } - // - // the list of shapes aLSA contains the shapes - // of the Shape For Search that corresponds - // to the Argument aWhat - //const TopTools_ListOfShape& aLSA = aDMSLS.Find(aWhat); - //pkvt + if (aLSA.Extent() == 0) { SetErrorCode(NOT_FOUND_ANY); // Not found any Results return NULL;