X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_Gluer.cxx;h=e2f2c9a6953713998e7f77d31f634332fc4b2494;hb=04f3d723da1ae9133d108921c8f10338a9656d12;hp=b63e99eea9c94b7e75bbfb7c9d8a5408ea914834;hpb=b7cff0a4ec43ee005440c53e196b5c94f076dbca;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer.cxx b/src/GEOMAlgo/GEOMAlgo_Gluer.cxx index b63e99eea..e2f2c9a69 100755 --- a/src/GEOMAlgo/GEOMAlgo_Gluer.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Gluer.cxx @@ -1,3 +1,22 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// // File: GEOMAlgo_Gluer.cxx // Created: Sat Dec 04 12:45:53 2004 // Author: Peter KURNEV @@ -6,6 +25,11 @@ #include +#include +#include + +#include +#include #include #include @@ -58,8 +82,8 @@ #include #include -#include -#include +#include +#include #include // @@ -78,6 +102,7 @@ GEOMAlgo_Gluer::GEOMAlgo_Gluer() myTolerance=0.0001; myTol=myTolerance; myCheckGeometry=Standard_True; + myKeepNonSolids=Standard_False; myNbAlone=0; } //======================================================================= @@ -104,6 +129,14 @@ Standard_Boolean GEOMAlgo_Gluer::CheckGeometry() const return myCheckGeometry; } //======================================================================= +//function : SetKeepNonSolids +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::SetKeepNonSolids(const Standard_Boolean aFlag) +{ + myKeepNonSolids=aFlag; +} +//======================================================================= //function : AloneShapes //purpose : //======================================================================= @@ -160,11 +193,9 @@ void GEOMAlgo_Gluer::MakeVertices() { myErrorStatus=0; // - Standard_Integer j, i, aNbV, aIndex, aNbVSD; + Standard_Integer j, i, aNbV, aNbVSD; TColStd_ListIteratorOfListOfInteger aIt; - Handle(Bnd_HArray1OfBox) aHAB; - Bnd_BoundSortBox aBSB; - TopoDS_Shape aSTmp, aVF; + TopoDS_Shape aVF; TopoDS_Vertex aVnew; TopTools_IndexedMapOfShape aMV, aMVProcessed; TopTools_ListIteratorOfListOfShape aItS; @@ -173,6 +204,11 @@ void GEOMAlgo_Gluer::MakeVertices() GEOMAlgo_IndexedDataMapOfIntegerShape aMIS; GEOMAlgo_IndexedDataMapOfShapeBox aMSB; // + NMTDS_BoxBndTreeSelector aSelector; + NMTDS_BoxBndTree aBBTree; + NCollection_UBTreeFiller aTreeFiller(aBBTree); + // + // TopExp::MapShapes(myShape, TopAbs_VERTEX, aMV); aNbV=aMV.Extent(); if (!aNbV) { @@ -180,21 +216,23 @@ void GEOMAlgo_Gluer::MakeVertices() return; } // - aHAB=new Bnd_HArray1OfBox(1, aNbV); - // for (i=1; i<=aNbV; ++i) { const TopoDS_Shape& aV=aMV(i); Bnd_Box aBox; // aBox.SetGap(myTol); BRepBndLib::Add(aV, aBox); - aHAB->SetValue(i, aBox); + // + aTreeFiller.Add(i, aBox); + // aMIS.Add(i, aV); aMSB.Add(aV, aBox); } // - aBSB.Initialize(aHAB); + aTreeFiller.Fill(); // + //------------------------------ + // Chains for (i=1; i<=aNbV; ++i) { const TopoDS_Shape& aV=aMV(i); // @@ -202,31 +240,86 @@ void GEOMAlgo_Gluer::MakeVertices() continue; } // - const Bnd_Box& aBoxV=aMSB.FindFromKey(aV); - const TColStd_ListOfInteger& aLI=aBSB.Compare(aBoxV); - aNbVSD=aLI.Extent(); - if (!aNbVSD) { - myErrorStatus=3; // it must not be - return; - } + Standard_Integer aNbIP, aIP, aNbIP1, aIP1; + TopTools_ListOfShape aLVSD; + TColStd_MapOfInteger aMIP, aMIP1, aMIPC; + TColStd_MapIteratorOfMapOfInteger aIt1; // - // Images + aMIP.Add(i); + while(1) { + aNbIP=aMIP.Extent(); + aIt1.Initialize(aMIP); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + if (aMIPC.Contains(aIP)) { + continue; + } + // + const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); + const Bnd_Box& aBoxVP=aMSB.FindFromKey(aVP); + // + aSelector.Clear(); + aSelector.SetBox(aBoxVP); + // + aNbVSD=aBBTree.Select(aSelector); + if (!aNbVSD) { + continue; // it must not be + } + // + const TColStd_ListOfInteger& aLI=aSelector.Indices(); + aIt.Initialize(aLI); + for (; aIt.More(); aIt.Next()) { + aIP1=aIt.Value(); + if (aMIP.Contains(aIP1)) { + continue; + } + aMIP1.Add(aIP1); + } //for (; aIt.More(); aIt.Next()) { + }//for(; aIt1.More(); aIt1.Next()) { + // + aNbIP1=aMIP1.Extent(); + if (!aNbIP1) { + break; + } + // + aIt1.Initialize(aMIP); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + aMIPC.Add(aIP); + } + // + aMIP.Clear(); + aIt1.Initialize(aMIP1); + for(; aIt1.More(); aIt1.Next()) { + aIP=aIt1.Key(); + aMIP.Add(aIP); + } + aMIP1.Clear(); + }// while(1) // - TopTools_ListOfShape aLVSD; + // Fill myImages + aNbIP=aMIPC.Extent(); // - aIt.Initialize(aLI); - for (j=0; aIt.More(); aIt.Next(), ++j) { - aIndex=aIt.Value(); - const TopoDS_Shape& aVx=aMIS.FindFromKey(aIndex); - if(!j) { - aVF=aVx; + if (!aNbIP) {// no SD vertices founded + aVF=aV; + aLVSD.Append(aV); + aMVProcessed.Add(aV); + } + else { // SD vertices founded [ aMIPC ] + aIt1.Initialize(aMIPC); + for(j=0; aIt1.More(); aIt1.Next(), ++j) { + aIP=aIt1.Key(); + const TopoDS_Shape& aVP=aMIS.FindFromKey(aIP); + if (!j) { + aVF=aVP; + } + aLVSD.Append(aVP); + aMVProcessed.Add(aVP); } - aLVSD.Append(aVx); - aMVProcessed.Add(aVx); } - // myImages.Bind(aVF, aLVSD); - } + }// for (i=1; i<=aNbV; ++i) { + //------------------------------ // // Make new vertices aMV.Clear(); @@ -262,7 +355,6 @@ void GEOMAlgo_Gluer::MakeVertices() for (; aItIm.More(); aItIm.Next()) { const TopoDS_Shape& aV=aItIm.Key(); const TopTools_ListOfShape& aLVSD=aItIm.Value(); - // aItS.Initialize(aLVSD); for (; aItS.More(); aItS.Next()) { const TopoDS_Shape& aVSD=aItS.Value(); @@ -273,39 +365,45 @@ void GEOMAlgo_Gluer::MakeVertices() } } //======================================================================= -//function : MakeSolids +//function : MakeSubShapes //purpose : //======================================================================= -void GEOMAlgo_Gluer::MakeSolids() +void GEOMAlgo_Gluer::MakeSubShapes (const TopoDS_Shape& theShape, + TopTools_MapOfShape& theMS, + TopoDS_Compound& theResult) { - myErrorStatus=0; + if (theMS.Contains(theShape)) + return; // - Standard_Integer aNbS; - TopAbs_Orientation anOr; - TopoDS_Compound aCmp; - TopoDS_Solid aNewSolid; - TopTools_IndexedMapOfShape aMS; - TopExp_Explorer aExpS, aExp; BRep_Builder aBB; // - aBB.MakeCompound(aCmp); + theMS.Add(theShape); // - aNbS=aMS.Extent(); - aExpS.Init(myShape, TopAbs_SOLID); - for (; aExpS.More(); aExpS.Next()) { - const TopoDS_Solid& aSolid=TopoDS::Solid(aExpS.Current()); - if (aMS.Contains(aSolid)) { - continue; + if (theShape.ShapeType() == TopAbs_COMPOUND || + theShape.ShapeType() == TopAbs_COMPSOLID) + { + TopoDS_Iterator It (theShape, Standard_True, Standard_True); + for (; It.More(); It.Next()) + { + MakeSubShapes(It.Value(), theMS, theResult); } - aMS.Add(aSolid); + } + else if (theShape.ShapeType() == TopAbs_SOLID) + { + // build a solid + TopoDS_Solid aNewSolid; + TopExp_Explorer aExpS, aExp; + // + const TopoDS_Solid& aSolid = TopoDS::Solid(theShape); // - anOr=aSolid.Orientation(); + TopAbs_Orientation anOr = aSolid.Orientation(); // aBB.MakeSolid(aNewSolid); aNewSolid.Orientation(anOr); // aExp.Init(aSolid, TopAbs_SHELL); - for (; aExp.More(); aExp.Next()) { + for (; aExp.More(); aExp.Next()) + { const TopoDS_Shape& aShell=aExp.Current(); const TopoDS_Shape& aShellR=myOrigins.Find(aShell); aBB.Add(aNewSolid, aShellR); @@ -317,14 +415,88 @@ void GEOMAlgo_Gluer::MakeSolids() myImages.Bind(aNewSolid, aLS); myOrigins.Bind(aSolid, aNewSolid); // - aBB.Add(aCmp, aNewSolid); + aBB.Add(theResult, aNewSolid); } + else if (theShape.ShapeType() == TopAbs_WIRE) + { + if (myKeepNonSolids) + { + // just add image + if (!myOrigins.IsBound(theShape)) + { + // build wire + const TopoDS_Wire& aW=TopoDS::Wire(theShape); + // + TopoDS_Wire newWire; + aBB.MakeWire(newWire); + // + TopExp_Explorer aExpE (aW, TopAbs_EDGE); + for (; aExpE.More(); aExpE.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(aExpE.Current()); + TopoDS_Edge aER=TopoDS::Edge(myOrigins.Find(aE)); + // + aER.Orientation(TopAbs_FORWARD); + if (!BRep_Tool::Degenerated(aER)) { + // build p-curve + //if (bIsUPeriodic) { + // GEOMAlgo_Tools::RefinePCurveForEdgeOnFace(aER, aFFWD, aUMin, aUMax); + //} + //BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aER, aFFWD); + // + // orient image + Standard_Boolean bIsToReverse=BOPTools_Tools3D::IsSplitToReverse1(aER, aE, myContext); + if (bIsToReverse) { + aER.Reverse(); + } + } + else { + aER.Orientation(aE.Orientation()); + } + // + aBB.Add(newWire, aER); + } + // xf + TopTools_ListOfShape aLW; + // + aLW.Append(aW); + myImages.Bind(newWire, aLW); + myOrigins.Bind(aW, newWire); + } + const TopoDS_Shape& aShapeR = myOrigins.Find(theShape); + aBB.Add(theResult, aShapeR); + } + } + else + { + if (myKeepNonSolids) + { + // just add image + const TopoDS_Shape& aShapeR = myOrigins.Find(theShape); + aBB.Add(theResult, aShapeR); + } + } +} +//======================================================================= +//function : MakeSolids +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeSolids() +{ + myErrorStatus=0; + // + BRep_Builder aBB; + TopoDS_Compound aCmp; + TopTools_MapOfShape aMS; + // + aBB.MakeCompound(aCmp); + // + // Add images of all initial sub-shapes in the result. + // If myKeepNonSolids==false, add only solids images. + MakeSubShapes(myShape, aMS, aCmp); // myResult=aCmp; // - aNbS=aMS.Extent(); - if (aNbS) { - //Standard_Real aTol=1.e-7; + if (aMS.Extent()) { BOP_CorrectTolerances::CorrectCurveOnSurface(myResult); } } @@ -405,8 +577,8 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) TopoDS_Shape aNewShape; TopTools_IndexedMapOfShape aMF; TopTools_ListIteratorOfListOfShape aItS; - GEOMAlgo_PassKey aPKF; - GEOMAlgo_IndexedDataMapOfPassKeyListOfShape aMPKLF; + GEOMAlgo_PassKeyShape aPKF; + GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLF; // TopExp::MapShapes(myShape, aType, aMF); // @@ -414,7 +586,6 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) for (i=1; i<=aNbF; ++i) { const TopoDS_Shape& aS=aMF(i); // - aPKF.Clear(); if (aType==TopAbs_FACE) { const TopoDS_Face& aF=TopoDS::Face(aS); FacePassKey(aF, aPKF); @@ -460,8 +631,6 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) // const TopoDS_Shape& aS1=aLSDF.First(); // - //modified by NIZNHY-PKV Fri Jan 21 15:34:00 2005 f - // bHasNewSubShape=Standard_True; // prevent creation of a new shape if there are not // new subshapes of aSS among the originals @@ -472,9 +641,8 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) aNewShape.Orientation(TopAbs_FORWARD); } } - //modified by NIZNHY-PKV Fri Jan 21 15:34:05 2005 t // - if (bHasNewSubShape) {//modified by NIZNHY-PKV Fri Jan 21 15:34:10 2005ft + if (bHasNewSubShape) { if (aType==TopAbs_FACE) { TopoDS_Face aNewFace; // @@ -604,19 +772,14 @@ void GEOMAlgo_Gluer::InnerTolerance() //purpose : //======================================================================= void GEOMAlgo_Gluer::FacePassKey(const TopoDS_Face& aF, - GEOMAlgo_PassKey& aPK) + GEOMAlgo_PassKeyShape& aPK) { - Standard_Integer i, aNbE, aNbMax; + Standard_Integer i, aNbE; TopTools_ListOfShape aLE; TopTools_IndexedMapOfShape aME; // TopExp::MapShapes(aF, TopAbs_EDGE, aME); aNbE=aME.Extent(); - aNbMax=aPK.NbMax(); - if (!aNbE || aNbE>aNbMax) { - myErrorStatus=101; // temprorary - return; - } // for (i=1; i<=aNbE; ++i) { const TopoDS_Shape& aE=aME(i); @@ -627,14 +790,14 @@ void GEOMAlgo_Gluer::FacePassKey(const TopoDS_Face& aF, const TopoDS_Shape& aER=myOrigins.Find(aE); aLE.Append(aER); } - aPK.SetIds(aLE); + aPK.SetShapes(aLE); } //======================================================================= //function : EdgePassKey //purpose : //======================================================================= void GEOMAlgo_Gluer::EdgePassKey(const TopoDS_Edge& aE, - GEOMAlgo_PassKey& aPK) + GEOMAlgo_PassKeyShape& aPK) { TopoDS_Vertex aV1, aV2; // @@ -646,7 +809,7 @@ void GEOMAlgo_Gluer::EdgePassKey(const TopoDS_Edge& aE, } const TopoDS_Shape& aVR1=myOrigins.Find(aV1); const TopoDS_Shape& aVR2=myOrigins.Find(aV2); - aPK.SetIds(aVR1, aVR2); + aPK.SetShapes(aVR1, aVR2); } //======================================================================= //function : MakeVertex @@ -748,7 +911,6 @@ void GEOMAlgo_Gluer::MakeEdge(const TopoDS_Edge& aE, BOPTools_Tools::MakeSplitEdge(aEx, aVR1, aT1, aVR2, aT2, aNewEdge); } } -// //======================================================================= //function : MakeFace //purpose : @@ -808,6 +970,13 @@ void GEOMAlgo_Gluer::MakeFace(const TopoDS_Face& aF, // aBB.Add(newWire, aER); } + // xf + TopTools_ListOfShape aLW; + // + aLW.Append(aW); + myImages.Bind(newWire, aLW); + myOrigins.Bind(aW, newWire); + // xt aBB.Add(newFace, newWire); } aNewFace=newFace; @@ -858,8 +1027,6 @@ Standard_Boolean GEOMAlgo_Gluer::IsToReverse(const TopoDS_Face& aFR, } return bRet; } -// -//modified by NIZNHY-PKV Fri Jan 21 10:55:42 2005 f //======================================================================= //function : HasNewSubShape //purpose : @@ -928,9 +1095,12 @@ const TopTools_ListOfShape& GEOMAlgo_Gluer::Modified (const TopoDS_Shape& aS) myGenerated.Clear(); // aType=aS.ShapeType(); - if (aType==TopAbs_FACE || - aType==TopAbs_EDGE || - aType==TopAbs_VERTEX) { + if (aType==TopAbs_VERTEX || + aType==TopAbs_EDGE || + aType==TopAbs_WIRE || + aType==TopAbs_FACE || + aType==TopAbs_SHELL || + aType==TopAbs_SOLID) { if(myOrigins.IsBound(aS)) { const TopoDS_Shape& aSnew=myOrigins.Find(aS); if (!aSnew.IsSame(aS)) { @@ -963,7 +1133,6 @@ Standard_Boolean GEOMAlgo_Gluer::IsDeleted (const TopoDS_Shape& aS) // return bRet; } -//modified by NIZNHY-PKV Fri Jan 21 10:59:21 2005 t // // ErrorStatus //