Back to index

salome-geom  6.5.0
GEOMAlgo_Splitter.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 
00023 //  File:   GEOMAlgo_Splitter.cxx
00024 //  Author: Peter KURNEV
00025 //
00026 #include <GEOMAlgo_Splitter.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 <TopExp.hxx>
00035 
00036 #include <BRep_Builder.hxx>
00037 #include <BRepLib.hxx>
00038 
00039 #include <TopTools_MapOfShape.hxx>
00040 #include <TopTools_ListOfShape.hxx>
00041 #include <TopTools_ListIteratorOfListOfShape.hxx>
00042 #include <TopTools_IndexedMapOfShape.hxx>
00043 
00044 #include <BOP_CorrectTolerances.hxx>
00045 
00046 
00047 static
00048   void TreatCompound(const TopoDS_Shape& aC,
00049                      TopTools_ListOfShape& aLSX);
00050 
00051 //=======================================================================
00052 //function :
00053 //purpose  :
00054 //=======================================================================
00055   GEOMAlgo_Splitter::GEOMAlgo_Splitter()
00056 :
00057   GEOMAlgo_Builder()
00058 {
00059   myLimit=TopAbs_SHAPE;
00060   myLimitMode=0;
00061 }
00062 //=======================================================================
00063 //function : ~
00064 //purpose  :
00065 //=======================================================================
00066   GEOMAlgo_Splitter::~GEOMAlgo_Splitter()
00067 {
00068 }
00069 //=======================================================================
00070 //function : AddToolCompound
00071 //purpose  :
00072 //=======================================================================
00073   void GEOMAlgo_Splitter::AddToolCompound(const TopoDS_Shape& theShape)
00074 {
00075   TopoDS_Iterator aIt;
00076   //
00077   aIt.Initialize(theShape);
00078   for (; aIt.More(); aIt.Next()) {
00079     const TopoDS_Shape& aS=aIt.Value();
00080     AddTool(aS);
00081   }
00082 }
00083 //=======================================================================
00084 //function : AddTool
00085 //purpose  :
00086 //=======================================================================
00087   void GEOMAlgo_Splitter::AddTool(const TopoDS_Shape& theShape)
00088 {
00089   if (myMapTools.Add(theShape)) {
00090     myTools.Append(theShape);
00091     //
00092     AddShape(theShape);
00093   }
00094 }
00095 //=======================================================================
00096 //function : Tools
00097 //purpose  :
00098 //=======================================================================
00099   const TopTools_ListOfShape& GEOMAlgo_Splitter::Tools()const
00100 {
00101   return myTools;
00102 }
00103 //=======================================================================
00104 //function : SetLimit
00105 //purpose  :
00106 //=======================================================================
00107   void GEOMAlgo_Splitter::SetLimit(const TopAbs_ShapeEnum aLimit)
00108 {
00109   myLimit=aLimit;
00110 }
00111 //=======================================================================
00112 //function : Limit
00113 //purpose  :
00114 //=======================================================================
00115   TopAbs_ShapeEnum GEOMAlgo_Splitter::Limit()const
00116 {
00117   return myLimit;
00118 }
00119 //=======================================================================
00120 //function : SetLimitMode
00121 //purpose  :
00122 //=======================================================================
00123   void GEOMAlgo_Splitter::SetLimitMode(const Standard_Integer aMode)
00124 {
00125   myLimitMode=aMode;
00126 }
00127 //=======================================================================
00128 //function : LimitMode
00129 //purpose  :
00130 //=======================================================================
00131   Standard_Integer GEOMAlgo_Splitter::LimitMode()const
00132 {
00133   return myLimitMode;
00134 }
00135 //=======================================================================
00136 //function : Clear
00137 //purpose  :
00138 //=======================================================================
00139   void GEOMAlgo_Splitter::Clear()
00140 {
00141   myTools.Clear();
00142   myMapTools.Clear();
00143   myLimit=TopAbs_SHAPE;
00144   GEOMAlgo_Builder::Clear();
00145 }
00146 //=======================================================================
00147 //function : BuildResult
00148 //purpose  :
00149 //=======================================================================
00150   void GEOMAlgo_Splitter::BuildResult(const TopAbs_ShapeEnum theType)
00151 {
00152   myErrorStatus=0;
00153   //
00154   TopAbs_ShapeEnum aType;
00155   BRep_Builder aBB;
00156   TopTools_MapOfShape aM;
00157   TopTools_ListIteratorOfListOfShape aIt, aItIm;
00158   //
00159   aIt.Initialize(myShapes);
00160   for (; aIt.More(); aIt.Next()) {
00161     const TopoDS_Shape& aS=aIt.Value();
00162     aType=aS.ShapeType();
00163     if (aType==theType && !myMapTools.Contains(aS)) {
00164       if (myImages.HasImage(aS)) {
00165         const TopTools_ListOfShape& aLSIm=myImages.Image(aS);
00166         aItIm.Initialize(aLSIm);
00167         for (; aItIm.More(); aItIm.Next()) {
00168           const TopoDS_Shape& aSIm=aItIm.Value();
00169           if (aM.Add(aSIm)) {
00170             aBB.Add(myShape, aSIm);
00171           }
00172         }
00173       }
00174       else {
00175         if (aM.Add(aS)) {
00176           aBB.Add(myShape, aS);
00177         }
00178       }
00179     }
00180   }
00181 }
00182 //=======================================================================
00183 //function : PostTreat
00184 //purpose  :
00185 //=======================================================================
00186   void GEOMAlgo_Splitter::PostTreat()
00187 {
00188   if (myLimit!=TopAbs_SHAPE) {
00189     Standard_Integer i, aNbS;
00190     BRep_Builder aBB;
00191     TopoDS_Compound aC;
00192     TopTools_IndexedMapOfShape aMx;
00193     //
00194     aBB.MakeCompound(aC);
00195     //
00196     TopExp::MapShapes(myShape, myLimit, aMx);
00197     aNbS=aMx.Extent();
00198     for (i=1; i<=aNbS; ++i) {
00199       const TopoDS_Shape& aS=aMx(i);
00200       aBB.Add(aC, aS);
00201     }
00202     //
00203     if (myLimitMode) {
00204       Standard_Integer iType, iLimit, iTypeX;
00205       TopAbs_ShapeEnum aType, aTypeX;
00206       TopTools_ListOfShape aLSP, aLSX;
00207       TopTools_ListIteratorOfListOfShape aIt, aItX, aItIm;
00208       TopTools_MapOfShape  aM;
00209       //
00210       iLimit=(Standard_Integer)myLimit;
00211       //
00212       // 1. Collect the shapes to process aLSP
00213       aIt.Initialize(myShapes);
00214       for (; aIt.More(); aIt.Next()) {
00215         const TopoDS_Shape& aS=aIt.Value();
00216         if (myMapTools.Contains(aS)) {
00217           continue;
00218         }
00219         //
00220         aType=aS.ShapeType();
00221         iType=(Standard_Integer)aType;
00222         //
00223         if (iType>iLimit) {
00224           aLSP.Append(aS);
00225         }
00226         //
00227         else if (aType==TopAbs_COMPOUND) {
00228           aLSX.Clear();
00229           //
00230           TreatCompound(aS, aLSX);
00231           //
00232           aItX.Initialize(aLSX);
00233           for (; aItX.More(); aItX.Next()) {
00234             const TopoDS_Shape& aSX=aItX.Value();
00235             aTypeX=aSX.ShapeType();
00236             iTypeX=(Standard_Integer)aTypeX;
00237             //
00238             if (iTypeX>iLimit) {
00239               aLSP.Append(aSX);
00240             }
00241           }
00242         }
00243       }// for (; aIt.More(); aIt.Next()) {
00244       //
00245       //modified by NIZNHY-PKV Fri Oct 30 11:07:08 2009 f
00246       aMx.Clear();
00247       TopExp::MapShapes(aC, aMx);
00248       //modified by NIZNHY-PKV Fri Oct 30 11:12:30 2009t
00249       //
00250       // 2. Add them to aC
00251       aIt.Initialize(aLSP);
00252       for (; aIt.More(); aIt.Next()) {
00253         const TopoDS_Shape& aS=aIt.Value();
00254         if (myImages.HasImage(aS)) {
00255           const TopTools_ListOfShape& aLSIm=myImages.Image(aS);
00256           aItIm.Initialize(aLSIm);
00257           for (; aItIm.More(); aItIm.Next()) {
00258             const TopoDS_Shape& aSIm=aItIm.Value();
00259             if (aM.Add(aSIm)) {
00260               //modified by NIZNHY-PKV Fri Oct 30 11:09:57 2009f
00261               if (!aMx.Contains(aSIm)) {
00262                 aBB.Add(aC, aSIm);
00263               }
00264               //aBB.Add(aC, aSIm);
00265               //modified by NIZNHY-PKV Fri Oct 30 11:10:02 2009
00266             }
00267           }
00268         }
00269         else {
00270           if (aM.Add(aS)) {
00271             //modified by NIZNHY-PKV Fri Oct 30 11:10:46 2009f
00272             if (!aMx.Contains(aS)) {
00273               aBB.Add(aC, aS);
00274             }
00275             //aBB.Add(aC, aS);
00276             //modified by NIZNHY-PKV Fri Oct 30 11:11:00 2009t
00277           }
00278         }
00279       }
00280     }// if (myLimitMode) {
00281     myShape=aC;
00282   }//if (myLimit!=TopAbs_SHAPE) {
00283   //
00284   GEOMAlgo_Builder::PostTreat();
00285 }
00286 //=======================================================================
00287 //function : TreatCompound
00288 //purpose  :
00289 //=======================================================================
00290 void TreatCompound(const TopoDS_Shape& aC1,
00291                    TopTools_ListOfShape& aLSX)
00292 {
00293   Standard_Integer aNbC1;
00294   TopAbs_ShapeEnum aType;
00295   TopTools_ListOfShape aLC, aLC1;
00296   TopTools_ListIteratorOfListOfShape aIt, aIt1;
00297   TopoDS_Iterator aItC;
00298   //
00299   aLC.Append (aC1);
00300   while(1) {
00301     aLC1.Clear();
00302     aIt.Initialize(aLC);
00303     for (; aIt.More(); aIt.Next()) {
00304       const TopoDS_Shape& aC=aIt.Value(); //C is compound
00305       //
00306       aItC.Initialize(aC);
00307       for (; aItC.More(); aItC.Next()) {
00308         const TopoDS_Shape& aS=aItC.Value();
00309         aType=aS.ShapeType();
00310         if (aType==TopAbs_COMPOUND) {
00311           aLC1.Append(aS);
00312         }
00313         else {
00314           aLSX.Append(aS);
00315         }
00316       }
00317     }
00318     //
00319     aNbC1=aLC1.Extent();
00320     if (!aNbC1) {
00321       break;
00322     }
00323     //
00324     aLC.Clear();
00325     aIt.Initialize(aLC1);
00326     for (; aIt.More(); aIt.Next()) {
00327       const TopoDS_Shape& aSC=aIt.Value();
00328       aLC.Append(aSC);
00329     }
00330   }// while(1)
00331 }
00332 //
00333 // myErrorStatus
00334 //
00335 // 0  - Ok
00336 // 1  - The object is just initialized
00337 // 2  - PaveFiller is failed
00338 // 10 - No shapes to process
00339 // 30 - SolidBuilder failed