Back to index

salome-geom  6.5.0
GEOMAlgo_Builder.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 // File:        GEOMAlgo_Builder.cxx
00023 // Created:
00024 // Author:      Peter KURNEV
00025 //
00026 #include <GEOMAlgo_Builder.hxx>
00027 
00028 #include <TopAbs_ShapeEnum.hxx>
00029 
00030 #include <TopoDS_Shape.hxx>
00031 #include <TopoDS_Compound.hxx>
00032 #include <TopoDS_Iterator.hxx>
00033 
00034 #include <BRep_Builder.hxx>
00035 
00036 #include <TopTools_MapOfShape.hxx>
00037 #include <TopTools_ListOfShape.hxx>
00038 #include <TopTools_ListIteratorOfListOfShape.hxx>
00039 
00040 #include <BOP_CorrectTolerances.hxx>
00041 
00042 #include <BRepLib.hxx>
00043 #include <NMTTools_PaveFiller.hxx>
00044 #include <GEOMAlgo_Tools.hxx>
00045 
00046 //=======================================================================
00047 //function :
00048 //purpose  :
00049 //=======================================================================
00050   GEOMAlgo_Builder::GEOMAlgo_Builder()
00051 :
00052   GEOMAlgo_BuilderShape()
00053 {
00054   myNbTypes=9;
00055   myPaveFiller=NULL;
00056   myEntryPoint=0; // Entry point through PerformWithFiller ()
00057 }
00058 //=======================================================================
00059 //function : ~
00060 //purpose  :
00061 //=======================================================================
00062   GEOMAlgo_Builder::~GEOMAlgo_Builder()
00063 {
00064   if (myEntryPoint==1) {
00065     if (myPaveFiller) {
00066       delete myPaveFiller;
00067       myPaveFiller=NULL;
00068     }
00069   }
00070 }
00071 //=======================================================================
00072 //function : AddCompound
00073 //purpose  :
00074 //=======================================================================
00075   void GEOMAlgo_Builder::AddCompound(const TopoDS_Shape& theShape)
00076 {
00077   TopoDS_Iterator aIt;
00078   //
00079   aIt.Initialize(theShape);
00080   for (; aIt.More(); aIt.Next()) {
00081     const TopoDS_Shape& aS=aIt.Value();
00082     AddShape(aS);
00083   }
00084 }
00085 //=======================================================================
00086 //function : AddShape
00087 //purpose  :
00088 //=======================================================================
00089   void GEOMAlgo_Builder::AddShape(const TopoDS_Shape& theShape)
00090 {
00091   if (myMapFence.Add(theShape)) {
00092     myShapes.Append(theShape);
00093   }
00094 }
00095 //=======================================================================
00096 //function : Shapes
00097 //purpose  :
00098 //=======================================================================
00099   const TopTools_ListOfShape& GEOMAlgo_Builder::Shapes()const
00100 {
00101   return myShapes;
00102 }
00103 //=======================================================================
00104 //function : Clear
00105 //purpose  :
00106 //=======================================================================
00107   void GEOMAlgo_Builder::Clear()
00108 {
00109   myShapes.Clear();
00110   ClearInternals();
00111 }
00112 //=======================================================================
00113 //function : ClearInternals
00114 //purpose  :
00115 //=======================================================================
00116   void GEOMAlgo_Builder::ClearInternals()
00117 {
00118   Standard_Integer i;
00119   //
00120   for (i=0; i<myNbTypes; ++i){
00121     myShapes1[i].Clear();
00122   }
00123   myImages.Clear();
00124   //
00125   myInParts.Clear();
00126   mySplitFaces.Clear();
00127   mySameDomainShapes.Clear();
00128   myDraftSolids.Clear();
00129   myMapFence.Clear();
00130 }
00131 //=======================================================================
00132 //function : Prepare
00133 //purpose  :
00134 //=======================================================================
00135   void GEOMAlgo_Builder::Prepare()
00136 {
00137   myErrorStatus=0;
00138   //
00139   Standard_Integer aNb;
00140   BRep_Builder aBB;
00141   TopoDS_Compound aC;
00142   TopTools_ListIteratorOfListOfShape aIt;
00143   //
00144   aNb=myShapes.Extent();
00145   if (aNb<2) {
00146     myErrorStatus=10; // No shapes to process
00147     return;
00148   }
00149   //
00150   // 1. myShape is empty compound
00151   aBB.MakeCompound(aC);
00152   myShape=aC;
00153   //
00154   // 2. myShapes1
00155   aIt.Initialize(myShapes);
00156   for (; aIt.More(); aIt.Next()) {
00157     const TopoDS_Shape& aS=aIt.Value();
00158     AddShape1(aS);
00159   }
00160 }
00161 
00162 //=======================================================================
00163 //function : AddShape1
00164 //purpose  :
00165 //=======================================================================
00166   void GEOMAlgo_Builder::AddShape1(const TopoDS_Shape& theShape)
00167 {
00168   Standard_Integer iType;
00169   TopAbs_ShapeEnum aType;
00170   TopoDS_Iterator aIt;
00171   TopTools_MapOfShape aM;
00172   //
00173   aType=theShape.ShapeType();
00174   if (aType==TopAbs_COMPOUND) {
00175     aIt.Initialize(theShape);
00176     for (; aIt.More(); aIt.Next()) {
00177       const TopoDS_Shape& aS=aIt.Value();
00178       AddShape1(aS);
00179     }
00180   }
00181   //
00182   iType=(Standard_Integer)aType;
00183   if (aM.Add(theShape)) {
00184     myShapes1[iType].Append(theShape);
00185   }
00186 }
00187 //=======================================================================
00188 //function : BuildResult
00189 //purpose  :
00190 //=======================================================================
00191   void GEOMAlgo_Builder::BuildResult(const TopAbs_ShapeEnum theType)
00192 {
00193   myErrorStatus=0;
00194   //
00195   TopAbs_ShapeEnum aType;
00196   BRep_Builder aBB;
00197   TopTools_MapOfShape aM;
00198   TopTools_ListIteratorOfListOfShape aIt, aItIm;
00199   //
00200   aIt.Initialize(myShapes);
00201   for (; aIt.More(); aIt.Next()) {
00202     const TopoDS_Shape& aS=aIt.Value();
00203     aType=aS.ShapeType();
00204     if (aType==theType) {
00205       if (myImages.HasImage(aS)){
00206         const TopTools_ListOfShape& aLSIm=myImages.Image(aS);
00207         aItIm.Initialize(aLSIm);
00208         for (; aItIm.More(); aItIm.Next()) {
00209           const TopoDS_Shape& aSIm=aItIm.Value();
00210           if (aM.Add(aSIm)) {
00211             aBB.Add(myShape, aSIm);
00212           }
00213         }
00214       }
00215       else {
00216         if (aM.Add(aS)) {
00217           aBB.Add(myShape, aS);
00218         }
00219       }
00220     }
00221   }
00222 }
00223 //=======================================================================
00224 //function : Perform
00225 //purpose  :
00226 //=======================================================================
00227   void GEOMAlgo_Builder::Perform()
00228 {
00229   myErrorStatus=0;
00230   //
00231   BRep_Builder aBB;
00232   TopoDS_Compound aCS;
00233   TopTools_ListIteratorOfListOfShape aIt;
00234   //
00235   aBB.MakeCompound(aCS);
00236   //
00237   aIt.Initialize(myShapes);
00238   for (; aIt.More(); aIt.Next()) {
00239     const TopoDS_Shape& aS=aIt.Value();
00240     aBB.Add(aCS, aS);
00241   }
00242   //
00243   NMTTools_PaveFiller* pPF=new NMTTools_PaveFiller;
00244   //
00245   pPF->SetCompositeShape(aCS);
00246   pPF->Perform();
00247   //
00248   myEntryPoint=1;
00249   PerformInternal(*pPF);
00250 }
00251 //=======================================================================
00252 //function : PerformWithFiller
00253 //purpose  :
00254 //=======================================================================
00255   void GEOMAlgo_Builder::PerformWithFiller(const NMTTools_PaveFiller& theDSF)
00256 {
00257   myEntryPoint=0;
00258   //
00259   PerformInternal(theDSF);
00260 }
00261 //=======================================================================
00262 //function : PerformInternal
00263 //purpose  :
00264 //=======================================================================
00265   void GEOMAlgo_Builder::PerformInternal(const NMTTools_PaveFiller& pPF)
00266 {
00267   myErrorStatus=0;
00268   //
00269   Standard_Boolean bIsDone;
00270   //
00271   // 0. myPaveFiller
00272   myPaveFiller=(NMTTools_PaveFiller *)&pPF;
00273   //
00274   bIsDone=myPaveFiller->IsDone();
00275   if (!bIsDone) {
00276     myErrorStatus=2; // PaveFiller is failed
00277     return;
00278   }
00279   //
00280   // 1. Clear Internal fields
00281   ClearInternals();
00282   //
00283   // 2. Prepare
00284   Prepare();
00285   if (myErrorStatus) {
00286     return;
00287   }
00288   //
00289   // 3. Fill Images
00290   //
00291   // 3.1 Vertices
00292   FillImagesVertices();
00293   if (myErrorStatus) {
00294     return;
00295   }
00296   //
00297   BuildResult(TopAbs_VERTEX);
00298   if (myErrorStatus) {
00299     return;
00300   }
00301   // 3.2 Edges
00302   FillImagesEdges();
00303   if (myErrorStatus) {
00304     return;
00305   }
00306 
00307   BuildResult(TopAbs_EDGE);
00308   if (myErrorStatus) {
00309     return;
00310   }
00311   // 3.3 Wires
00312   FillImagesContainers(TopAbs_WIRE);
00313   if (myErrorStatus) {
00314     return;
00315   }
00316 
00317   BuildResult(TopAbs_WIRE);
00318   if (myErrorStatus) {
00319     return;
00320   }
00321 
00322   // 3.4 Faces
00323   FillImagesFaces();
00324   if (myErrorStatus) {
00325     return;
00326   }
00327 
00328   BuildResult(TopAbs_FACE);
00329   if (myErrorStatus) {
00330     return;
00331   }
00332   // 3.5 Shells
00333 
00334   FillImagesContainers(TopAbs_SHELL);
00335   if (myErrorStatus) {
00336     return;
00337   }
00338 
00339   BuildResult(TopAbs_SHELL);
00340   if (myErrorStatus) {
00341     return;
00342   }
00343   // 3.6 Solids
00344   FillImagesSolids();
00345   if (myErrorStatus) {
00346     return;
00347   }
00348 
00349   BuildResult(TopAbs_SOLID);
00350   if (myErrorStatus) {
00351     return;
00352   }
00353   // 3.7 CompSolids
00354   FillImagesContainers(TopAbs_COMPSOLID);
00355   if (myErrorStatus) {
00356     return;
00357   }
00358 
00359   BuildResult(TopAbs_COMPSOLID);
00360   if (myErrorStatus) {
00361     return;
00362   }
00363   // 3.8 Compounds
00364   FillImagesContainers(TopAbs_COMPOUND);
00365   if (myErrorStatus) {
00366     return;
00367   }
00368 
00369   BuildResult(TopAbs_COMPOUND);
00370   if (myErrorStatus) {
00371     return;
00372   }
00373   //
00374   // 4.History
00375   PrepareHistory();
00376   //
00377   // 5 Post-treatment
00378   PostTreat();
00379 }
00380 //
00381 // static
00382 //   void CorrectWires(const TopoDS_Shape& aS);
00383 //
00384 //=======================================================================
00385 //function : PostTreat
00386 //purpose  :
00387 //=======================================================================
00388   void GEOMAlgo_Builder::PostTreat()
00389 {
00390   Standard_Integer aNbS;
00391   TopoDS_Iterator aIt;
00392   TopTools_ListOfShape aLS;
00393   //
00394   aIt.Initialize(myShape);
00395   for (; aIt.More(); aIt.Next()) {
00396     const TopoDS_Shape& aS=aIt.Value();
00397     aLS.Append(aS);
00398   }
00399   aNbS=aLS.Extent();
00400   if (aNbS==1) {
00401     myShape=aLS.First();
00402   }
00403 
00404   BRepLib::SameParameter(myShape, 1.e-7, Standard_True);
00405   //
00406   GEOMAlgo_Tools::CorrectWires(myShape);
00407 }
00408 //
00409 // myErrorStatus
00410 //
00411 // 0  - Ok
00412 // 1  - The object is just initialized
00413 // 2  - PaveFiller is failed
00414 // 10 - No shapes to process
00415 // 30 - SolidBuilder failed
00416