X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FNMTAlgo%2FNMTAlgo_Splitter_2.cxx;h=8229af154c4fe120a4a5ca3d6aad3bc89a0ac211;hb=8039f8cb66ee8b0e077ba34106963b8a438a2d4a;hp=d50bc6d3d21ce26135f9dfa5d7cecb3099502877;hpb=ca429d817a18d6acc571443f6a596575dee03c2f;p=modules%2Fgeom.git diff --git a/src/NMTAlgo/NMTAlgo_Splitter_2.cxx b/src/NMTAlgo/NMTAlgo_Splitter_2.cxx index d50bc6d3d..8229af154 100644 --- a/src/NMTAlgo/NMTAlgo_Splitter_2.cxx +++ b/src/NMTAlgo/NMTAlgo_Splitter_2.cxx @@ -5,23 +5,25 @@ #include -#include -#include + #include -#include #include -#include #include #include -#include #include #include #include +#include + +#include +#include + +#include +#include #include #include -#include -#include -#include +#include + #include #include #include @@ -29,6 +31,11 @@ #include #include +#include +#include +#include +#include + //======================================================================= //function : KeepShapesInside //purpose : remove shapes that are outside of S from result @@ -104,48 +111,42 @@ //function : RemoveShapesInside //purpose : remove shapes that are inside S from result //======================================================================= - void NMTAlgo_Splitter::RemoveShapesInside (const TopoDS_Shape& aS) + void NMTAlgo_Splitter::RemoveShapesInside (const TopoDS_Shape& S) { TopoDS_Iterator it; - TopAbs_ShapeEnum aTypeS; - // - aTypeS=aS.ShapeType(); - if (aTypeS < TopAbs_SOLID) { // compound or compsolid - it.Initialize(aS); + if (S.ShapeType() < TopAbs_SOLID) { // compound or compsolid + it.Initialize( S ); for (; it.More(); it.Next()) { - const TopoDS_Shape& aSx=it.Value(); - RemoveShapesInside(aSx); + RemoveShapesInside( it.Value()); } return; } // - Standard_Boolean bFromTool, bIsClosed; - Standard_Integer i, aNbE; - TopoDS_Shape aIntFacesComp; - TopoDS_Compound aC; + Standard_Boolean isTool; + TopoDS_Shape IntFacesComp; + TopoDS_Compound C; TopTools_IndexedMapOfShape MIF; // map of internal faces TopTools_MapOfShape RFM; TopTools_MapIteratorOfMapOfShape itF; - TopTools_IndexedDataMapOfShapeListOfShape aMEF; - // - bFromTool=myToolShapes.Contains(aS); // - if (!myImageShape.HasImage(aS)) { - return; + isTool=myToolShapes.Contains(S); + //isTool = Standard_False; + if (!myImageShape.HasImage( S )) { + return; } // - aIntFacesComp = FindFacesInside(aS, Standard_False, Standard_True); + IntFacesComp = FindFacesInside( S, Standard_False, Standard_True); // - TopExp::MapShapes(aIntFacesComp, TopAbs_FACE, MIF); + TopExp::MapShapes( IntFacesComp, TopAbs_FACE, MIF); if (MIF.IsEmpty()) { return; } // add to MIF split faces of S - const TopoDS_Shape& aSIm=myImageShape.Image(aS).First(); + const TopoDS_Shape& aSIm=myImageShape.Image(S).First(); TopExp::MapShapes(aSIm, TopAbs_FACE, MIF); // // leave in the result only those shapes not having all face in MIF - myBuilder.MakeCompound(aC); + myBuilder.MakeCompound(C); // // RFM : faces of removed shapes that encounter once it.Initialize(myShape); @@ -164,177 +165,166 @@ // if (expResF.More()) { // add shape to result - myBuilder.Add(aC, aSR); + myBuilder.Add(C, aSR); } else { // add faces of a removed shape to RFM - if (!bFromTool) { //modified by NIZNHY-PKV Thu Dec 23 09:55:39 2004 ft - for (expResF.ReInit(); expResF.More(); expResF.Next()) { - const TopoDS_Shape& aF = expResF.Current(); - if (!RFM.Remove(aF)) { - RFM.Add(aF); - } + for (expResF.ReInit(); expResF.More(); expResF.Next()) { + const TopoDS_Shape& aF = expResF.Current(); + if (!RFM.Remove(aF)) { + RFM.Add(aF); } - }//modified by NIZNHY-PKV Thu Dec 23 09:55:29 2004 ft + } } }// for (; it.More(); it.Next()) // - if (bFromTool) { - myShape=aC; - return; - } // - // bIsClosed - bIsClosed = Standard_False; - if (aTypeS==TopAbs_SOLID) { - bIsClosed = Standard_True; - } - else if (aTypeS==TopAbs_SHELL) { - aMEF.Clear(); - TopExp::MapShapesAndAncestors(aS, TopAbs_EDGE, TopAbs_FACE, aMEF); - aNbE=aMEF.Extent(); - for (i=1; bIsClosed && i<=aNbE; ++i) { - bIsClosed=(aMEF(i).Extent()!=1); - } + TopoDS_Compound aCx; + // + myBuilder.MakeCompound(aCx); + itF.Initialize (RFM); + for (; itF.More(); itF.Next()) { + const TopoDS_Shape& aF=itF.Key(); + myBuilder.Add(aCx, aF); } // - // rebuild S, it must remain in the result - if (bIsClosed) { - // add to a new shape external faces of removed shapes, ie those in RFM - TopoDS_Shell aShell; - // - myBuilder.MakeShell(aShell); - // exclude redundant internal face with edges encounterd only once - aMEF.Clear(); - itF.Initialize (RFM); - for (; itF.More(); itF.Next()) { - const TopoDS_Shape& aF=itF.Key(); - TopExp::MapShapesAndAncestors(aF, TopAbs_EDGE, TopAbs_FACE, aMEF); - } - // add only faces forming a closed shell - for (itF.Reset() ; itF.More(); itF.Next()) { - const TopoDS_Shape& aF=itF.Key(); - TopExp_Explorer expE (aF, TopAbs_EDGE); - for (; expE.More(); expE.Next()) { - if (aMEF.FindFromKey(expE.Current()).Extent()==1) { - break; - } - } - if (!expE.More()) { - myBuilder.Add(aShell, aF); + if (!isTool) { + // rebuild S, it must remain in the result + Standard_Boolean isClosed = Standard_False; + switch (S.ShapeType()) { + case TopAbs_SOLID : + isClosed = Standard_True; break; + case TopAbs_SHELL: { + TopTools_IndexedDataMapOfShapeListOfShape MEF; + TopExp::MapShapesAndAncestors(S, TopAbs_EDGE, TopAbs_FACE, MEF); + Standard_Integer i; + for (i=1; isClosed && i<=MEF.Extent(); ++i) { + isClosed = ( MEF(i).Extent() != 1 ); } + break; + } + default: + isClosed = Standard_False; } // - if (aTypeS==TopAbs_SOLID) { - TopoDS_Solid aSolid; + if (isClosed) { + // add to a new shape external faces of removed shapes, ie those in RFM + TopoDS_Shell Shell; + myBuilder.MakeShell(Shell); + // exclude redundant internal face with edges encounterd only once + TopTools_IndexedDataMapOfShapeListOfShape MEF; // - myBuilder.MakeSolid(aSolid); - myBuilder.Add (aSolid, aShell); - myBuilder.Add (aC, aSolid); - } + itF.Initialize (RFM); + for ( ; itF.More(); itF.Next()) { + const TopoDS_Shape& aF=itF.Key(); + TopExp::MapShapesAndAncestors(aF, TopAbs_EDGE, TopAbs_FACE, MEF); + } + // add only faces forming a closed shell + for (itF.Reset() ; itF.More(); itF.Next()) { + const TopoDS_Shape& aF=itF.Key(); + TopExp_Explorer expE (aF, TopAbs_EDGE); + for (; expE.More(); expE.Next()) { + if (MEF.FindFromKey(expE.Current()).Extent() == 1) { + break; + } + } + if (!expE.More()) { + myBuilder.Add( Shell, aF); + } + else { + //int a=0; + } + } + + if (S.ShapeType() == TopAbs_SOLID) { + TopoDS_Solid Solid; + myBuilder.MakeSolid( Solid ); + myBuilder.Add (Solid, Shell); + myBuilder.Add (C, Solid); + } + else { + myBuilder.Add (C, Shell); + } + } // if (isClosed) { else { - myBuilder.Add (aC, aShell); - } - } // if (bIsClosed) { - // - else { - it.Initialize(aSIm); - for (; it.More(); it.Next()) { - const TopoDS_Shape& aSx=it.Value(); - myBuilder.Add (aC, aSx); + it.Initialize(aSIm); + for (; it.More(); it.Next()) { + myBuilder.Add (C, it.Value()); + } } } // - myShape=aC; + myShape = C; } - +// +//modified by NIZNHY-PKV Tue Feb 1 16:02:29 2005 f //======================================================================= //function : Modified //purpose : //======================================================================= - const TopTools_ListOfShape& NMTAlgo_Splitter::Modified (const TopoDS_Shape& S) +const TopTools_ListOfShape& NMTAlgo_Splitter::Modified (const TopoDS_Shape& S) { + TopAbs_ShapeEnum aType; + // myGenerated.Clear(); - TopTools_ListIteratorOfListOfShape it; - TopTools_MapOfShape aMap; - TopExp_Explorer anExp; - - if(S.ShapeType() == TopAbs_FACE || S.ShapeType() == TopAbs_EDGE) { - - if(S.ShapeType() == TopAbs_FACE) { - if (myImagesFaces.HasImage( S )) { - it.Initialize(myImagesFaces.Image(S)); - anExp.Init(myShape, TopAbs_FACE); - } - } - else { - if (myImagesEdges.HasImage( S )) { - it.Initialize(myImagesEdges.Image(S)); - anExp.Init(myShape, TopAbs_EDGE); - } - } - - for(; anExp.More(); anExp.Next()) { - aMap.Add(anExp.Current()); - } - - for (; it.More(); it.Next()) { - if(aMap.Contains(it.Value())) { - myGenerated.Append(it.Value()); - } - } - - return myGenerated; - - } - - if(S.ShapeType() == TopAbs_VERTEX) { + // + aType=S.ShapeType(); + // + switch (aType) { + case TopAbs_SOLID: + case TopAbs_FACE: + case TopAbs_EDGE: + case TopAbs_VERTEX: + FindImage(S, myGenerated); + break; - const NMTTools_DSFiller& aDSF = Filler(); - const NMTTools_PaveFiller& aPF = aDSF.PaveFiller(); - const NMTDS_ShapesDataStructure& aDS = aDSF.DS(); - - Standard_Integer aNbS = aDS.NumberOfSourceShapes(); - Standard_Integer anIndex = 0, i; - - for(i = 1; i <= aNbS; ++i) { - - const TopoDS_Shape& aS = aDS.Shape(i); - if(S.IsSame(aS)) { - anIndex = i; - break; - } - - } + case TopAbs_SHELL: + break; + + case TopAbs_WIRE: + break; + + default: + break; + } + // + return myGenerated; +} +//modified by NIZNHY-PKV Tue Feb 1 16:02:33 2005 t +//======================================================================= +//function : IsDeleted +//purpose : +//======================================================================= +Standard_Boolean NMTAlgo_Splitter::IsDeleted (const TopoDS_Shape& S) - if(anIndex == 0) return myGenerated; +{ + const TopTools_ListOfShape& aL = Modified(S); + if(aL.Extent() != 0) return Standard_False; - Standard_Integer aSDVInd = aPF.FindSDVertex(anIndex); + TopTools_MapOfShape aMap; + TopExp_Explorer anExp; - if(aSDVInd == 0) return myGenerated; + TopAbs_ShapeEnum aType = S.ShapeType(); - const TopoDS_Shape aSDV = aDS.Shape(aSDVInd); + if(aType == TopAbs_VERTEX || + aType == TopAbs_EDGE || + aType == TopAbs_FACE ) { - anExp.Init(myShape, TopAbs_VERTEX); + anExp.Init(myShape, aType); for(; anExp.More(); anExp.Next()) { - - if(aSDV.IsSame(anExp.Current())) { - myGenerated.Append(aSDV); - break; - } - + if(S.IsSame(anExp.Current())) return Standard_False; } - - } - return myGenerated; + } + + return Standard_True; } //======================================================================= //function : Generated //purpose : //======================================================================= - const TopTools_ListOfShape& NMTAlgo_Splitter::Generated(const TopoDS_Shape& S) +const TopTools_ListOfShape& NMTAlgo_Splitter::Generated(const TopoDS_Shape& S) { myGenerated.Clear(); TopTools_ListIteratorOfListOfShape it; @@ -502,43 +492,169 @@ if(!aMap.Contains(it.Value())) { myGenerated.Remove(it); } - } } - return myGenerated; - } - return myGenerated; } - +//modified by NIZNHY-PKV Tue Feb 1 10:26:18 2005f //======================================================================= -//function : IsDeleted +//function : FindImage //purpose : //======================================================================= - Standard_Boolean NMTAlgo_Splitter::IsDeleted (const TopoDS_Shape& S) - +void NMTAlgo_Splitter::FindImage(const TopoDS_Shape& aS, + TopTools_ListOfShape& aLIms) { - const TopTools_ListOfShape& aL = Modified(S); - if(aL.Extent() != 0) return Standard_False; - - TopTools_MapOfShape aMap; - TopExp_Explorer anExp; - - TopAbs_ShapeEnum aType = S.ShapeType(); - - if(aType == TopAbs_VERTEX || - aType == TopAbs_EDGE || - aType == TopAbs_FACE ) { - + TopAbs_ShapeEnum aType; + // + aType=aS.ShapeType(); + // + if (aType==TopAbs_SOLID) { + Standard_Boolean bHasImage, bHasInternalFaces; + Standard_Integer i, aNbSd; + TopTools_IndexedMapOfShape aMSo, aMSd; + TopoDS_Iterator aIt; + TopTools_IndexedDataMapOfShapeListOfShape aMFS; + TopTools_ListIteratorOfListOfShape aItLS; + // + bHasInternalFaces=myMapSIFC.IsBound(aS); + if (bHasInternalFaces){ + TopExp::MapShapesAndAncestors(myShape, TopAbs_FACE, TopAbs_SOLID, aMFS); + // + const TopoDS_Shape& aIFC=myMapSIFC.Find(aS); + // + aIt.Initialize(aIFC); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aIF=aIt.Value(); + if (aMFS.Contains(aIF)) { + const TopTools_ListOfShape& aLS=aMFS.FindFromKey(aIF); + // + aItLS.Initialize(aLS); + for (; aItLS.More(); aItLS.Next()) { + const TopoDS_Shape& aSx=aItLS.Value(); + aMSd.Add(aSx); + } + } + } + // + aNbSd=aMSd.Extent(); + if (aNbSd) { + for (i=1; i<=aNbSd; ++i) { + const TopoDS_Shape& aSx=aMSd(i); + if (!aSx.IsSame(aS)) { + aLIms.Append(aSx); + } + } + return; + } + } + // + bHasImage=myImageShape.HasImage(aS); + if (!bHasImage) { + return; + } + // + TopoDS_Shape aSd; + // + TopExp::MapShapes(myShape, TopAbs_SOLID, aMSo); + // + const TopoDS_Shape& aFC=myImageShape.Image(aS).First(); + bHasImage=NMTAlgo_Tools::FindImageSolid(aFC, aMSo, aSd); + if (bHasImage) { + if (!aSd.IsSame(aS)) { + aLIms.Append(aSd); + } + } + } //if (aType==TopAbs_SOLID) { + //== + else if (aType==TopAbs_FACE) { + TopTools_MapOfShape aMap; + TopTools_ListIteratorOfListOfShape aIt; + TopExp_Explorer anExp; + // + if (myModifiedFaces.IsBound(aS)) { + anExp.Init(myShape, aType); + for(; anExp.More(); anExp.Next()) { + aMap.Add(anExp.Current()); + } + // + const TopTools_ListOfShape& aLS=myModifiedFaces.Find(aS); + aIt.Initialize(aLS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aFx=aIt.Value(); + if (!aFx.IsSame(aS)) { + if (aMap.Contains(aFx)) { + aLIms.Append(aFx); + } + } + } + } + } // else if (aType==TopAbs_FACE) + //== + else if (aType==TopAbs_EDGE) { + TopTools_MapOfShape aMap; + TopTools_ListIteratorOfListOfShape aIt; + TopExp_Explorer anExp; + // + if (myImagesEdges.HasImage(aS)) { + anExp.Init(myShape, aType); + for(; anExp.More(); anExp.Next()) { + aMap.Add(anExp.Current()); + } + // + const TopTools_ListOfShape& aLE=myImagesEdges.Image(aS); + aIt.Initialize(aLE); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aEx=aIt.Value(); + if (!aEx.IsSame(aS)) { + if(aMap.Contains(aEx)) { + aLIms.Append(aEx); + } + } + } + } + }// else if (aType==TopAbs_EDGE) + //== + else if (aType==TopAbs_VERTEX) { + Standard_Integer aNbS, anIndex, i, aSDVInd; + TopExp_Explorer anExp; + // + const NMTTools_DSFiller& aDSF = Filler(); + const NMTTools_PaveFiller& aPF = aDSF.PaveFiller(); + const NMTDS_ShapesDataStructure& aDS = aDSF.DS(); + // + aNbS = aDS.NumberOfSourceShapes(); + anIndex = 0; + // + for(i=1; i<=aNbS; ++i) { + const TopoDS_Shape& aSx = aDS.Shape(i); + if(aS.IsSame(aSx)) { + anIndex = i; + break; + } + } + // + if(!anIndex) { + return; + } + // + aSDVInd=aPF.FindSDVertex(anIndex); + if(!aSDVInd) { + return; + } + // + const TopoDS_Shape& aSDV=aDS.Shape(aSDVInd); + // anExp.Init(myShape, aType); for(; anExp.More(); anExp.Next()) { - if(S.IsSame(anExp.Current())) return Standard_False; + const TopoDS_Shape& aVx=anExp.Current(); + if(aSDV.IsSame(aVx)) { + aLIms.Append(aSDV); + break; + } } - - } - - return Standard_True; + }// else if (aType==TopAbs_VERTEX) } +//modified by NIZNHY-PKV Tue Feb 1 10:26:22 2005t