Back to index

salome-geom  6.5.0
GEOMAlgo_SolidSolid.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_SolidSolid.cxx
00024 // Created:     Wed Jan 26 12:06:26 2005
00025 // Author:      Peter KURNEV
00026 //              <pkv@irinox>
00027 //
00028 #include <GEOMAlgo_SolidSolid.hxx>
00029 
00030 #include <Standard_Failure.hxx>
00031 
00032 #include <TopAbs_State.hxx>
00033 #include <TopoDS_Shape.hxx>
00034 #include <TopExp.hxx>
00035 
00036 #include <TopTools_ListOfShape.hxx>
00037 #include <TopTools_ListIteratorOfListOfShape.hxx>
00038 #include <TopTools_IndexedMapOfShape.hxx>
00039 
00040 #include <BooleanOperations_ShapesDataStructure.hxx>
00041 #include <BOPTools_DSFiller.hxx>
00042 
00043 #include <GEOMAlgo_IndexedDataMapOfShapeState.hxx>
00044 
00045 //=======================================================================
00046 //function : GEOMAlgo_SolidSolid
00047 //purpose  :
00048 //=======================================================================
00049 GEOMAlgo_SolidSolid::GEOMAlgo_SolidSolid()
00050 :
00051   GEOMAlgo_ShellSolid()
00052 {
00053 }
00054 //=======================================================================
00055 //function : ~
00056 //purpose  :
00057 //=======================================================================
00058 GEOMAlgo_SolidSolid::~GEOMAlgo_SolidSolid()
00059 {
00060 }
00061 //=======================================================================
00062 // function: SetShape2
00063 // purpose:
00064 //=======================================================================
00065 void GEOMAlgo_SolidSolid::SetShape2(const TopoDS_Shape& aS2)
00066 {
00067   myS2=aS2;
00068 }
00069 //=======================================================================
00070 // function: Shape2
00071 // purpose:
00072 //=======================================================================
00073 const TopoDS_Shape& GEOMAlgo_SolidSolid::Shape2()const
00074 {
00075   return myS2;
00076 }
00077 //=======================================================================
00078 // function: Perform
00079 // purpose:
00080 //=======================================================================
00081 void GEOMAlgo_SolidSolid::Perform()
00082 {
00083   myErrorStatus=0;
00084   try {
00085     if (myDSFiller==NULL) {
00086       myErrorStatus=10;
00087       return;
00088     }
00089     if(!myDSFiller->IsDone()) {
00090       myErrorStatus=11;
00091       return;
00092     }
00093     //
00094     Standard_Boolean bIsNewFiller;
00095     //
00096     bIsNewFiller=myDSFiller->IsNewFiller();
00097     if (bIsNewFiller) {
00098       Prepare();
00099       myDSFiller->SetNewFiller(!bIsNewFiller);
00100     }
00101     //
00102     myRank=2;
00103     BuildResult();
00104   }
00105   catch (Standard_Failure) {
00106     myErrorStatus=12;
00107   }
00108 }
00109 //=================================================================================
00110 // function: BuildResult
00111 // purpose:
00112 //=================================================================================
00113 void GEOMAlgo_SolidSolid::BuildResult()
00114 {
00115   myErrorStatus=0;
00116   //
00117   Standard_Integer i, j, aNbF, aNbS;
00118   Standard_Integer aNbFIN, aNbFOUT, aNbFON, aNbFINTR;
00119   TopAbs_State aState;
00120   TopTools_ListIteratorOfListOfShape aIt;
00121   TopTools_IndexedMapOfShape aMF, aMS;
00122   GEOMAlgo_IndexedDataMapOfShapeState aMFS;
00123   //
00124   // 1. classify the faces
00125   GEOMAlgo_ShellSolid::BuildResult();
00126   //
00127   // 2. fill Shape-State map
00128   aIt.Initialize(myLSIN);
00129   for (; aIt.More(); aIt.Next()) {
00130     const TopoDS_Shape& aF=aIt.Value();
00131     aMFS.Add(aF, TopAbs_IN);
00132   }
00133   aIt.Initialize(myLSOUT);
00134   for (; aIt.More(); aIt.Next()) {
00135     const TopoDS_Shape& aF=aIt.Value();
00136     aMFS.Add(aF, TopAbs_OUT);
00137   }
00138   aIt.Initialize(myLSON);
00139   for (; aIt.More(); aIt.Next()) {
00140     const TopoDS_Shape& aF=aIt.Value();
00141     aMFS.Add(aF, TopAbs_ON);
00142   }
00143   myLSIN.Clear();
00144   myLSON.Clear();
00145   myLSOUT.Clear();
00146   //
00147   // 3. fill states for solids
00148   TopExp::MapShapes(myS2, TopAbs_SOLID, aMS);
00149   //
00150   aNbS=aMS.Extent();
00151   for (i=1; i<=aNbS; ++i) {
00152     const TopoDS_Shape& aSolid=aMS(i);
00153     //
00154     aMF.Clear();
00155     TopExp::MapShapes(aSolid, TopAbs_FACE, aMF);
00156     //
00157     aNbFIN=0;
00158     aNbFOUT=0;
00159     aNbFON=0;
00160     aNbFINTR=0;
00161     //
00162     aNbF=aMF.Extent();
00163     for(j=1; j<aNbF; ++j) {
00164       const TopoDS_Shape& aF=aMF(j);
00165       //
00166       if (!aMFS.Contains(aF)) {// the face is intesected
00167         ++aNbFINTR;
00168         break;
00169       }
00170       //
00171       aState=aMFS.FindFromKey(aF);
00172       switch (aState) {
00173         case TopAbs_IN:
00174           ++aNbFIN;
00175           break;
00176         case TopAbs_OUT:
00177           ++aNbFOUT;
00178           break;
00179         case TopAbs_ON:
00180           ++aNbFON;
00181           break;
00182         default:
00183           break;
00184       }
00185       if (aNbFIN && aNbFOUT) {
00186         ++aNbFINTR;
00187         break;
00188       }
00189     }
00190     //
00191     if (!aNbFINTR) {
00192       if (aNbFON==aNbF) {
00193         myLSON.Append(aSolid);
00194       }
00195       else if (aNbFIN) {
00196         myLSIN.Append(aSolid);
00197       }
00198       else if (aNbFOUT) {
00199         myLSOUT.Append(aSolid);
00200       }
00201     }
00202   }
00203 }