Back to index

salome-geom  6.5.0
NMTDS_Iterator.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:        NMTDS_Iterator.cxx
00024 // Author:      Peter KURNEV
00025 
00026 #include <NMTDS_Iterator.hxx>
00027 //
00028 #include <Bnd_Box.hxx>
00029 //
00030 #include <TColStd_ListOfInteger.hxx>
00031 #include <TColStd_ListIteratorOfListOfInteger.hxx>
00032 #include <TColStd_MapOfInteger.hxx>
00033 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
00034 #include <TColStd_DataMapOfIntegerInteger.hxx>
00035 #include <TColStd_DataMapOfIntegerListOfInteger.hxx>
00036 #include <TColStd_DataMapIteratorOfDataMapOfIntegerListOfInteger.hxx>
00037 #include <TColStd_MapOfInteger.hxx>
00038 //
00039 #include <TopoDS.hxx>
00040 #include <TopoDS_Vertex.hxx>
00041 #include <TopoDS_Shape.hxx>
00042 //
00043 #include <TopTools_DataMapOfShapeInteger.hxx>
00044 //
00045 #include <NMTDS_BoxBndTree.hxx>
00046 #include <NCollection_UBTreeFiller.hxx>
00047 #include <NMTDS_CArray1OfIndexRange.hxx>
00048 #include <NMTDS_IndexRange.hxx>
00049 #include <NMTDS_PairBoolean.hxx>
00050 #include <NMTDS_MapOfPairBoolean.hxx>
00051 #include <NMTDS_IndexedDataMapOfShapeBox.hxx>
00052 #include <NMTDS_IndexedDataMapOfIntegerShape.hxx>
00053 #include <NMTDS_Tools.hxx>
00054 #include <NMTDS_DataMapOfIntegerMapOfInteger.hxx>
00055 #include <NMTDS_DataMapIteratorOfDataMapOfIntegerMapOfInteger.hxx>
00056 #include <NMTDS_ShapesDataStructure.hxx>
00057 
00058 //=======================================================================
00059 //function : NMTDS_Iterator
00060 //purpose  : 
00061 //=======================================================================
00062 NMTDS_Iterator::NMTDS_Iterator()
00063 {
00064   myDS=NULL; 
00065   myLength=0;
00066 }
00067 //=======================================================================
00068 //function : ~NMTDS_Iterator
00069 //purpose  : 
00070 //=======================================================================
00071 NMTDS_Iterator::~NMTDS_Iterator()
00072 {
00073 }
00074 //=======================================================================
00075 // function: SetDS
00076 // purpose: 
00077 //=======================================================================
00078 void NMTDS_Iterator::SetDS(const NMTDS_PShapesDataStructure& aDS)
00079 {
00080   myDS=aDS;
00081 }
00082 //=======================================================================
00083 // function: DS
00084 // purpose: 
00085 //=======================================================================
00086 const NMTDS_ShapesDataStructure&  NMTDS_Iterator::DS()const
00087 {
00088   return *myDS;
00089 }
00090 //=======================================================================
00091 // function: ExpectedLength
00092 // purpose: 
00093 //=======================================================================
00094 Standard_Integer NMTDS_Iterator::ExpectedLength() const
00095 {
00096   return myLength;
00097 }
00098 //=======================================================================
00099 // function: BlockLength
00100 // purpose: 
00101 //=======================================================================
00102 Standard_Integer NMTDS_Iterator::BlockLength() const
00103 {
00104   Standard_Integer aNbIIs, iTresh;
00105   Standard_Real aCfPredict=.5;
00106   
00107   aNbIIs=ExpectedLength();
00108   
00109   if (aNbIIs<=1) {
00110     return 1;
00111   }
00112   //modified by NIZNHY-PKV Mon Dec 12 08:50:50 2011f
00113   iTresh=1000;
00114   if (aNbIIs>iTresh) {
00115     aNbIIs=iTresh;
00116     return aNbIIs;
00117   }
00118   //modified by NIZNHY-PKV Mon Dec 12 08:50:54 2011t
00119   //
00120   aNbIIs=(Standard_Integer) (aCfPredict*(Standard_Real)aNbIIs);
00121   return aNbIIs;
00122 }
00123 //=======================================================================
00124 // function: Initialize
00125 // purpose: 
00126 //=======================================================================
00127 void NMTDS_Iterator::Initialize(const TopAbs_ShapeEnum aType1,
00128                             const TopAbs_ShapeEnum aType2)
00129 {
00130   Standard_Integer iX;
00131   //
00132   iX=NMTDS_Tools::TypeToInteger(aType1, aType2);
00133   if (iX>=0) {
00134     myIterator.Initialize(myLists[iX]);
00135     myLength=myLists[iX].Extent();
00136   }
00137   else {
00138     myIterator.Initialize(myEmptyList);
00139     myLength=0;
00140   }
00141 }
00142 //=======================================================================
00143 // function: More
00144 // purpose: 
00145 //=======================================================================
00146 Standard_Boolean NMTDS_Iterator::More()const
00147 {
00148   return myIterator.More();
00149 }
00150 //=======================================================================
00151 // function: Next
00152 // purpose: 
00153 //=======================================================================
00154 void NMTDS_Iterator::Next()
00155 {
00156   myIterator.Next();
00157 }
00158 //=======================================================================
00159 // function: Current
00160 // purpose: 
00161 //=======================================================================
00162 void NMTDS_Iterator::Current(Standard_Integer& aIndex1,
00163                           Standard_Integer& aIndex2,
00164                           Standard_Boolean& aWithSubShape) const
00165 {
00166   const NMTDS_PairBoolean& aPKB=myIterator.Value();
00167   aPKB.Ids(aIndex1, aIndex2);
00168   aWithSubShape=aPKB.Flag();
00169 }
00170 //=======================================================================
00171 // function: SDVertices
00172 // purpose: 
00173 //=======================================================================
00174 const TColStd_DataMapOfIntegerListOfInteger& NMTDS_Iterator::SDVertices()const
00175 {
00176   return myMVSD;
00177 }
00178 //=======================================================================
00179 // function: Prepare
00180 // purpose: 
00181 //=======================================================================
00182 void NMTDS_Iterator::Prepare()
00183 {
00184   Standard_Integer i;
00185   //
00186   myLength=0;
00187   for (i=0; i<6; ++i) {
00188     myLists[i].Clear();
00189   }
00190   myMVSD.Clear();
00191   //
00192   if (myDS==NULL){
00193     return;
00194   }
00195   Intersect();
00196 }
00197 //=======================================================================
00198 // function: Intersect
00199 // purpose: 
00200 //=======================================================================
00201 void NMTDS_Iterator::Intersect()
00202 {
00203   Standard_Boolean bFlag;
00204   Standard_Integer aNb, i, aNbB, aNbR, iFlag;
00205   Standard_Integer i1, i2, aNbSD, iX, j, iDS, jB, iR, k, aNbLV, aNbLV1;
00206   TColStd_ListIteratorOfListOfInteger aIt;
00207   TColStd_DataMapOfIntegerInteger aMII;
00208   TColStd_DataMapOfIntegerListOfInteger aMVSD;
00209   TColStd_DataMapIteratorOfDataMapOfIntegerListOfInteger aItVSD;
00210   TopTools_DataMapOfShapeInteger aMSI;
00211   TopAbs_ShapeEnum aTi, aTj;
00212   NMTDS_PairBoolean aPKXB; 
00213   NMTDS_MapOfPairBoolean aMPKXB;
00214   NMTDS_IndexedDataMapOfShapeBox aMSB;
00215   //
00216   NMTDS_BoxBndTreeSelector aSelector;
00217   NMTDS_BoxBndTree aBBTree;
00218   NCollection_UBTreeFiller <Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
00219   //
00220   const NMTDS_CArray1OfIndexRange& aRanges=myDS->Ranges();
00221   aNbR=aRanges.Extent();
00222   //
00223   aNb=myDS->NumberOfShapesOfTheObject();
00224   for (i=1; i<=aNb; ++i) {
00225     const TopoDS_Shape& aS=myDS->Shape(i);
00226     aTi=aS.ShapeType();
00227     if (NMTDS_Tools::HasBRep(aTi)) {
00228       Bnd_Box aBoxEx;
00229       //
00230       myDS->ComputeBoxEx(i, aBoxEx);
00231       aMSI.Bind(aS, i);
00232       aMSB.Add(aS, aBoxEx);
00233     }
00234   }
00235   //
00236   aNbB=aMSB.Extent();
00237   //
00238   for (i=1; i<=aNbB; ++i) {
00239     const TopoDS_Shape& aS=aMSB.FindKey(i);
00240     const Bnd_Box& aBoxEx=aMSB(i);
00241     //
00242     aTreeFiller.Add(i, aBoxEx);
00243     //
00244     iDS=aMSI.Find(aS);
00245     aMII.Bind(i, iDS);
00246   }
00247   //
00248   aTreeFiller.Fill();
00249   //
00250   for (iR=1; iR<aNbR; ++iR) {
00251     const NMTDS_IndexRange& aR=aRanges(iR);
00252     i1=aR.First();
00253     i2=aR.Last();
00254     for (i=i1; i<=i2; ++i) {
00255       const TopoDS_Shape& aSi=myDS->Shape(i);
00256       aTi=aSi.ShapeType();
00257       if (!NMTDS_Tools::HasBRep(aTi)){
00258         continue;
00259       }
00260       const Bnd_Box& aBoxEx=aMSB.FindFromKey(aSi);
00261       aSelector.Clear();
00262       aSelector.SetBox(aBoxEx);
00263       //
00264       aNbSD=aBBTree.Select(aSelector);
00265       //
00266       if (!aNbSD){
00267         continue;
00268       }
00269       //
00270       const TColStd_ListOfInteger& aLI=aSelector.Indices();
00271       //
00272       k=0;
00273       TColStd_ListOfInteger aLV;
00274       //
00275       aIt.Initialize(aLI);
00276       for (; aIt.More(); aIt.Next()) {
00277         jB=aIt.Value();  // box index in MII
00278         j=aMII.Find(jB); // DS index
00279         if (j>=i1 && j<=i2) {
00280           continue;// same range
00281         }
00282         //
00283         aPKXB.SetIds(i, j);
00284         //
00285         if (aMPKXB.Add(aPKXB)) {
00286           bFlag=Standard_False;// Bounding boxes are intersected
00287           const Bnd_Box& aBoxi=myDS->GetBoundingBox(i);
00288           const Bnd_Box& aBoxj=myDS->GetBoundingBox(j);
00289           if (aBoxi.IsOut(aBoxj)) {
00290             bFlag=!bFlag; //Bounding boxes of Sub-shapes are intersected
00291           }
00292           const TopoDS_Shape& aSj=myDS->Shape(j);
00293           aTj=aSj.ShapeType();
00294           iX=NMTDS_Tools::TypeToInteger(aTi, aTj);
00295           //bFlag=(iStatus==2);
00296           aPKXB.SetFlag(bFlag);
00297           myLists[iX].Append(aPKXB);
00298           //
00299           // VSD prepare
00300           if (iX==5) { //VV
00301             aLV.Append(j);
00302           }
00303         }// if (aMPKXB.Add(aPKXB)) {
00304       }// for (; aIt.More(); aIt.Next()) {
00305       //
00306       // VSD treatment
00307       aNbLV=aLV.Extent();
00308       if (aNbLV) {
00309         TColStd_ListOfInteger aLV1;
00310         //
00311         const TopoDS_Vertex& aVi=TopoDS::Vertex(aSi);
00312         aIt.Initialize(aLV);
00313         for (; aIt.More(); aIt.Next()) {
00314           j=aIt.Value();  
00315           const TopoDS_Shape&  aSj=myDS->Shape(j);
00316           const TopoDS_Vertex& aVj=TopoDS::Vertex(aSj);
00317           iFlag=NMTDS_Tools::ComputeVV(aVi, aVj);
00318           if (!iFlag) {
00319             aLV1.Append(j);
00320           }
00321           else {
00322             aPKXB.SetIds(i, j);
00323             aMPKXB.Remove(aPKXB);
00324           }
00325         }
00326        //
00327        aNbLV1=aLV1.Extent();
00328        if (aNbLV1) {
00329          aMVSD.Bind(i, aLV1);
00330        }
00331       }
00332     }//for (i=i1; i<=i2; ++i) {
00333   }//for (iR=1; iR<aNbR; ++iR) {
00334   //
00335   //
00336   // Chains
00337   //=================
00338   myMVSD.Clear();
00339   NMTDS_Iterator::FillMVSD(aMVSD, myMVSD);
00340   
00341   //modified by NIZNHY-PKV Mon Dec 12 09:51:29 2011f
00342   aMPKXB.Clear();
00343   Standard::Purge();
00344   //modified by NIZNHY-PKV Mon Dec 12 09:51:33 2011t
00345 }
00346 //=======================================================================
00347 //function : FillMVSD
00348 //purpose  : 
00349 //=======================================================================
00350 void NMTDS_Iterator::FillMVSD(const TColStd_DataMapOfIntegerListOfInteger& aMVSD,
00351                            TColStd_DataMapOfIntegerListOfInteger& bMVSD)
00352 {
00353   Standard_Boolean bFound;
00354   Standard_Integer aNbVSD, iCnt, i, j, k;
00355   TColStd_ListOfInteger aLV;
00356   TColStd_ListIteratorOfListOfInteger aIt;
00357   TColStd_MapOfInteger aMF;
00358   TColStd_MapIteratorOfMapOfInteger aItMI;
00359   TColStd_DataMapIteratorOfDataMapOfIntegerListOfInteger aItVSD;
00360   NMTDS_DataMapOfIntegerMapOfInteger aDMIMI;
00361   NMTDS_DataMapIteratorOfDataMapOfIntegerMapOfInteger aIti, aItj;
00362   //
00363   aNbVSD=aMVSD.Extent();
00364   if (!aNbVSD) {
00365     return;
00366   }
00367   //
00368   aItVSD.Initialize(aMVSD);
00369   for (; aItVSD.More(); aItVSD.Next()) {
00370     TColStd_MapOfInteger aMI;
00371     //
00372     i=aItVSD.Key();
00373     aMI.Add(i);
00374     const TColStd_ListOfInteger& aLVSD=aItVSD.Value();
00375     aIt.Initialize(aLVSD);
00376     for (; aIt.More(); aIt.Next()) {
00377       j=aIt.Value();
00378       aMI.Add(j);
00379     }
00380     aDMIMI.Bind(i, aMI);
00381   }
00382   // i
00383   aIti.Initialize(aDMIMI);
00384   for (; aIti.More(); aIti.Next()) {
00385     i=aIti.Key();
00386     if (aMF.Contains(i)) {
00387       continue;
00388     }
00389     aMF.Add(i);
00390     //
00391     //TColStd_MapOfInteger& aMIi=aDMIMI.ChangeFind(i);
00392     TColStd_MapOfInteger *pMIi=(TColStd_MapOfInteger *)&aIti.Value();
00393     TColStd_MapOfInteger& aMIi=*pMIi;
00394     //  j
00395     while (1) {
00396       iCnt=0;
00397       aItj.Initialize(aDMIMI);
00398       for (; aItj.More(); aItj.Next()) {
00399         j=aItj.Key();
00400         if (aMF.Contains(j)) {
00401           continue;
00402         }
00403         //
00404         //TColStd_MapOfInteger& aMIj=aDMIMI.ChangeFind(j);
00405         TColStd_MapOfInteger *pMj=(TColStd_MapOfInteger *)&aItj.Value();
00406         TColStd_MapOfInteger& aMIj=*pMj;
00407         //
00408         aItMI.Initialize(aMIj);
00409         for (; aItMI.More(); aItMI.Next()) {
00410           k=aItMI.Key();
00411           bFound=aMIi.Contains(k);
00412           if (bFound) {
00413             break;
00414           }
00415         }
00416         if (!bFound) {
00417           continue;
00418         }
00419         //
00420         aItMI.Initialize(aMIj);
00421         for (; aItMI.More(); aItMI.Next()) {
00422           k=aItMI.Key();
00423           aMIi.Add(k);
00424         }
00425         //
00426         if (aMF.Add(j)) {
00427           ++iCnt;
00428         }
00429       } //for (; aItj.More(); aItj.Next()) {
00430       if (!iCnt) {
00431         break;
00432       }
00433     } // while (1) {
00434     //
00435     aLV.Clear();
00436     aItMI.Initialize(aMIi);
00437     for (; aItMI.More(); aItMI.Next()) {
00438       k=aItMI.Key();
00439         if (k!=i) {
00440           aLV.Append(k);
00441         }
00442     }
00443     bMVSD.Bind(i, aLV);
00444   }// for (; aIti.More(); aIti.Next()) {
00445 }
00446 
00447   /*  
00448   {
00449     // check
00450     TColStd_DataMapIteratorOfDataMapOfIntegerListOfInteger aItX;
00451     //
00452     printf(" \n");
00453     printf(" myMVSD.Extent()=%d\n", myMVSD.Extent());
00454     aItX.Initialize(myMVSD);
00455     for (; aItX.More(); aItX.Next()) {
00456       i=aItX.Key();
00457       printf(" i=%d (", i);
00458       const TColStd_ListOfInteger& aLV=aItX.Value();
00459       aIt.Initialize(aLV);
00460       for (; aIt.More(); aIt.Next()) {
00461         j=aIt.Value();
00462         printf(" %d", j);
00463       }
00464       printf(")\n");
00465     }
00466   }
00467 */
00468