Back to index

salome-geom  6.5.0
GEOMAlgo_GlueAnalyser.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_GlueDetector.cxx
00024 // Created:     Wed Dec 15 11:08:09 2004
00025 // Author:      Peter KURNEV
00026 
00027 #include <GEOMAlgo_GlueAnalyser.hxx>
00028 
00029 #include <TopoDS.hxx>
00030 #include <TopoDS_Shape.hxx>
00031 #include <TopoDS_Face.hxx>
00032 #include <TopoDS_Edge.hxx>
00033 #include <TopoDS_Compound.hxx>
00034 
00035 #include <BRep_Builder.hxx>
00036 
00037 #include <TopExp.hxx>
00038 
00039 #include <TopTools_IndexedMapOfShape.hxx>
00040 #include <TopTools_ListOfShape.hxx>
00041 #include <TopTools_ListIteratorOfListOfShape.hxx>
00042 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
00043 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
00044 
00045 #include <GEOMAlgo_PassKeyShape.hxx>
00046 #include <GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape.hxx>
00047 #include <GEOMAlgo_Tools.hxx>
00048 #include <GEOMAlgo_CoupleOfShapes.hxx>
00049 #include <GEOMAlgo_ListOfCoupleOfShapes.hxx>
00050 
00051 #include <GEOMAlgo_Gluer.hxx>
00052 #include <Bnd_HArray1OfBox.hxx>
00053 #include <Bnd_BoundSortBox.hxx>
00054 #include <TopoDS_Vertex.hxx>
00055 #include <GEOMAlgo_IndexedDataMapOfIntegerShape.hxx>
00056 #include <GEOMAlgo_IndexedDataMapOfShapeBox.hxx>
00057 #include <Bnd_Box.hxx>
00058 #include <TColStd_ListOfInteger.hxx>
00059 #include <TopTools_MapOfShape.hxx>
00060 #include <TColStd_ListIteratorOfListOfInteger.hxx>
00061 #include <BRepBndLib.hxx>
00062 
00063 //=======================================================================
00064 //function :
00065 //purpose  :
00066 //=======================================================================
00067   GEOMAlgo_GlueAnalyser::GEOMAlgo_GlueAnalyser()
00068 :
00069   GEOMAlgo_Gluer()
00070 {}
00071 //=======================================================================
00072 //function : ~
00073 //purpose  :
00074 //=======================================================================
00075   GEOMAlgo_GlueAnalyser::~GEOMAlgo_GlueAnalyser()
00076 {}
00077 //=======================================================================
00078 //function : HasSolidsToGlue
00079 //purpose  :
00080 //=======================================================================
00081   Standard_Boolean GEOMAlgo_GlueAnalyser::HasSolidsToGlue()const
00082 {
00083   return !mySolidsToGlue.IsEmpty();
00084 }
00085 //=======================================================================
00086 //function : HasSolidsAlone
00087 //purpose  :
00088 //=======================================================================
00089   Standard_Boolean GEOMAlgo_GlueAnalyser::HasSolidsAlone()const
00090 {
00091   return !mySolidsAlone.IsEmpty();
00092 }
00093 //=======================================================================
00094 //function : SolidsToGlue
00095 //purpose  :
00096 //=======================================================================
00097   const GEOMAlgo_ListOfCoupleOfShapes& GEOMAlgo_GlueAnalyser::SolidsToGlue()const
00098 {
00099   return mySolidsToGlue;
00100 }
00101 //=======================================================================
00102 //function : SolidsAlone
00103 //purpose  :
00104 //=======================================================================
00105   const TopTools_ListOfShape& GEOMAlgo_GlueAnalyser::SolidsAlone()const
00106 {
00107   return mySolidsAlone;
00108 }
00109 //=======================================================================
00110 //function : Perform
00111 //purpose  :
00112 //=======================================================================
00113   void GEOMAlgo_GlueAnalyser::Perform()
00114 {
00115   myErrorStatus=0;
00116   myWarningStatus=0;
00117   //
00118   mySolidsToGlue.Clear();
00119   mySolidsAlone.Clear();
00120   //
00121   CheckData();
00122   if (myErrorStatus) {
00123     return;
00124   }
00125   //
00126   // Initialize the context
00127   GEOMAlgo_ShapeAlgo::Perform();
00128   //
00129   InnerTolerance();
00130   if (myErrorStatus) {
00131     return;
00132   }
00133   //
00134   DetectVertices();
00135   if (myErrorStatus) {
00136     return;
00137   }
00138   //
00139   DetectEdges();
00140   if (myErrorStatus) {
00141     return;
00142   }
00143   //
00144   DetectFaces();
00145   if (myErrorStatus) {
00146     return;
00147   }
00148   //
00149   DetectSolids();
00150   if (myErrorStatus) {
00151     return;
00152   }
00153 }
00154 //=======================================================================
00155 //function : DetectVertices
00156 //purpose  :
00157 //=======================================================================
00158   void GEOMAlgo_GlueAnalyser::DetectVertices()
00159 {
00160   myErrorStatus=0;
00161   //
00162   Standard_Integer j, i, aNbV, aIndex, aNbVSD;
00163   TColStd_ListIteratorOfListOfInteger aIt;
00164   Handle(Bnd_HArray1OfBox) aHAB;
00165   Bnd_BoundSortBox aBSB;
00166   TopoDS_Shape aSTmp, aVF;
00167   TopoDS_Vertex aVnew;
00168   TopTools_IndexedMapOfShape aMV, aMVProcessed;
00169   TopTools_ListIteratorOfListOfShape aItS;
00170   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm;
00171   GEOMAlgo_IndexedDataMapOfIntegerShape aMIS;
00172   GEOMAlgo_IndexedDataMapOfShapeBox aMSB;
00173   //
00174   TopExp::MapShapes(myShape, TopAbs_VERTEX, aMV);
00175   aNbV=aMV.Extent();
00176   if (!aNbV) {
00177     myErrorStatus=2; // no vertices in source shape
00178     return;
00179   }
00180   //
00181   aHAB=new Bnd_HArray1OfBox(1, aNbV);
00182   //
00183   for (i=1; i<=aNbV; ++i) {
00184     const TopoDS_Shape& aV=aMV(i);
00185     Bnd_Box aBox;
00186     //
00187     aBox.SetGap(myTol);
00188     BRepBndLib::Add(aV, aBox);
00189     aHAB->SetValue(i, aBox);
00190     aMIS.Add(i, aV);
00191     aMSB.Add(aV, aBox);
00192   }
00193   //
00194   aBSB.Initialize(aHAB);
00195   //
00196   for (i=1; i<=aNbV; ++i) {
00197     const TopoDS_Shape& aV=aMV(i);
00198     //
00199     if (aMVProcessed.Contains(aV)) {
00200       continue;
00201     }
00202     //
00203     const Bnd_Box& aBoxV=aMSB.FindFromKey(aV);
00204     const TColStd_ListOfInteger& aLI=aBSB.Compare(aBoxV);
00205     aNbVSD=aLI.Extent();
00206     if (!aNbVSD) {
00207       myErrorStatus=3; // it must not be
00208       return;
00209     }
00210     //
00211     // Images
00212     TopTools_ListOfShape aLVSD;
00213     //
00214     aIt.Initialize(aLI);
00215     for (j=0; aIt.More(); aIt.Next(), ++j) {
00216       aIndex=aIt.Value();
00217       const TopoDS_Shape& aVx=aMIS.FindFromKey(aIndex);
00218       if(!j) {
00219         aVF=aVx;
00220       }
00221       aLVSD.Append(aVx);
00222       aMVProcessed.Add(aVx);
00223     }
00224     myImages.Bind(aVF, aLVSD);
00225   }
00226   // Origins
00227   aItIm.Initialize(myImages);
00228   for (; aItIm.More(); aItIm.Next()) {
00229     const TopoDS_Shape& aV=aItIm.Key();
00230     const TopTools_ListOfShape& aLVSD=aItIm.Value();
00231     //
00232     aItS.Initialize(aLVSD);
00233     for (; aItS.More(); aItS.Next()) {
00234       const TopoDS_Shape& aVSD=aItS.Value();
00235       if (!myOrigins.IsBound(aVSD)) {
00236         myOrigins.Bind(aVSD, aV);
00237       }
00238     }
00239   }
00240 }
00241 //=======================================================================
00242 //function : DetectFaces
00243 //purpose  :
00244 //=======================================================================
00245   void GEOMAlgo_GlueAnalyser::DetectFaces()
00246 {
00247   DetectShapes(TopAbs_FACE);
00248 }
00249 //=======================================================================
00250 //function : DetectEdges
00251 //purpose  :
00252 //=======================================================================
00253   void GEOMAlgo_GlueAnalyser::DetectEdges()
00254 {
00255   DetectShapes(TopAbs_EDGE);
00256 }
00257 //=======================================================================
00258 //function : DetectShapes
00259 //purpose  :
00260 //=======================================================================
00261   void GEOMAlgo_GlueAnalyser::DetectShapes(const TopAbs_ShapeEnum aType)
00262 {
00263   myErrorStatus=0;
00264   //
00265   Standard_Integer i, aNbF, aNbSDF, iErr;
00266   TopoDS_Shape aNewShape;
00267   TopTools_IndexedMapOfShape aMF;
00268   TopTools_ListIteratorOfListOfShape aItS;
00269   GEOMAlgo_PassKeyShape aPKF;
00270   GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLF;
00271   //
00272   TopExp::MapShapes(myShape, aType, aMF);
00273   //
00274   aNbF=aMF.Extent();
00275   for (i=1; i<=aNbF; ++i) {
00276     const TopoDS_Shape& aS=aMF(i);
00277     //
00278     //aPKF.Clear();//qft
00279     if (aType==TopAbs_FACE) {
00280       const TopoDS_Face& aF=TopoDS::Face(aS);
00281       FacePassKey(aF, aPKF);
00282     }
00283     else if (aType==TopAbs_EDGE) {
00284       const TopoDS_Edge& aE=TopoDS::Edge(aS);
00285       EdgePassKey(aE, aPKF);
00286     }
00287     //
00288     if (myErrorStatus) {
00289       return;
00290     }
00291     //
00292     if (aMPKLF.Contains(aPKF)) {
00293       TopTools_ListOfShape& aLSDF=aMPKLF.ChangeFromKey(aPKF);
00294       aLSDF.Append(aS);
00295     }
00296     else {
00297       TopTools_ListOfShape aLSDF;
00298       //
00299       aLSDF.Append(aS);
00300       aMPKLF.Add(aPKF, aLSDF);
00301     }
00302   }
00303   // check geometric coincidence
00304   if (myCheckGeometry) {
00305     iErr=GEOMAlgo_Tools::RefineSDShapes(aMPKLF, myTol, myContext); //XX
00306     if (iErr) {
00307       myErrorStatus=200;
00308       return;
00309     }
00310   }
00311   //
00312   // Images/Origins
00313   aNbF=aMPKLF.Extent();
00314   for (i=1; i<=aNbF; ++i) {
00315     const TopTools_ListOfShape& aLSDF=aMPKLF(i);
00316     aNbSDF=aLSDF.Extent();
00317     if (!aNbSDF) {
00318       myErrorStatus=4; // it must not be
00319     }
00320     //
00321     const TopoDS_Shape& aS1=aLSDF.First();
00322     aNewShape=aS1;
00323     //
00324     myImages.Bind(aNewShape, aLSDF);
00325     // origins
00326     aItS.Initialize(aLSDF);
00327     for (; aItS.More(); aItS.Next()) {
00328       const TopoDS_Shape& aFSD=aItS.Value();
00329       if (!myOrigins.IsBound(aFSD)) {
00330         myOrigins.Bind(aFSD, aNewShape);
00331       }
00332     }
00333   }
00334 }
00335 //=======================================================================
00336 //function : DetectSolids
00337 //purpose  :
00338 //=======================================================================
00339   void GEOMAlgo_GlueAnalyser::DetectSolids()
00340 {
00341   myErrorStatus=0;
00342   //
00343   Standard_Integer i, aNbF, aNbS, aNbC, aNbX;
00344   TopoDS_Compound aCmp;
00345   BRep_Builder aBB;
00346   TopTools_IndexedDataMapOfShapeListOfShape aMFS;
00347   TopTools_IndexedMapOfShape aMx, aMS;
00348   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm;
00349   GEOMAlgo_CoupleOfShapes aCS;
00350   //
00351   GEOMAlgo_IndexedDataMapOfPassKeyShapeListOfShape aMPKLS;
00352   GEOMAlgo_PassKeyShape aPKSx;
00353   //
00354   aBB.MakeCompound(aCmp);
00355   //
00356   TopExp::MapShapesAndAncestors(myShape, TopAbs_FACE, TopAbs_SOLID, aMFS);
00357   //
00358   aItIm.Initialize(myImages);
00359   for (; aItIm.More(); aItIm.Next()) {
00360     const TopoDS_Shape& aIm=aItIm.Key();
00361     if (aIm.ShapeType()!=TopAbs_FACE) {
00362       continue;
00363     }
00364     //
00365     const TopTools_ListOfShape& aLF=aItIm.Value();
00366     aNbF=aLF.Extent();
00367     if (aNbF!=2) {
00368       continue;
00369     }
00370     //
00371     TopoDS_Shape aSx[2], aFx[2];
00372     //
00373     aFx[0]=aLF.First();
00374     aFx[1]=aLF.Last();
00375     for (i=0; i<2; ++i) {
00376       if (!aMFS.Contains(aFx[i])) {
00377         continue;// it must not be so
00378       }
00379       //
00380       const TopTools_ListOfShape& aLS=aMFS.FindFromKey(aFx[i]);
00381       aNbS=aLS.Extent();
00382       if (aNbS!=1) {
00383         continue;
00384       }
00385       aSx[i]=aLS.First();
00386     }
00387     //
00388     if (aSx[0].IsNull() || aSx[1].IsNull()) {
00389       continue;
00390     }
00391     //
00392     //aPKSx.Clear();//qft
00393     //qf
00394     //aPKSx.SetIds(aSx[0], aSx[1]);
00395     aPKSx.SetShapes(aSx[0], aSx[1]);
00396     //qt
00397     //
00398     if (!aMPKLS.Contains(aPKSx)) {
00399       TopTools_ListOfShape aLSx;
00400       //
00401       aLSx.Append(aSx[0]);
00402       aLSx.Append(aSx[1]);
00403       //
00404       aMPKLS.Add(aPKSx, aLSx);
00405     }
00406   }
00407   //
00408   mySolidsToGlue.Clear();
00409   mySolidsAlone.Clear();
00410 
00411   //
00412   aNbC=aMPKLS.Extent();
00413   if (!aNbC) {
00414     return;
00415   }
00416   //
00417   for (i=1; i<=aNbC; ++i) {
00418     const TopTools_ListOfShape& aLSx=aMPKLS(i);
00419     const TopoDS_Shape& aSx1=aLSx.First();
00420     const TopoDS_Shape& aSx2=aLSx.Last();
00421     aCS.SetShape1(aSx1);
00422     aCS.SetShape2(aSx2);
00423     mySolidsToGlue.Append(aCS);
00424     //
00425     if (!aMx.Contains(aSx1)) {
00426       aBB.Add(aCmp, aSx1);
00427       aMx.Add(aSx1);
00428     }
00429     if (!aMx.Contains(aSx2)) {
00430       aBB.Add(aCmp, aSx2);
00431       aMx.Add(aSx2);
00432     }
00433   }
00434   myResult=aCmp;
00435   //
00436   // check alone solids
00437   TopExp::MapShapes(myShape, TopAbs_SOLID, aMS);
00438   //
00439   aNbX=aMx.Extent();
00440   for (i=1; i<=aNbX; ++i) {
00441     const TopoDS_Shape& aSx=aMx(i);
00442     if (!aMS.Contains(aSx)) {
00443       mySolidsAlone.Append(aSx);
00444     }
00445   }
00446 }
00447 
00448 /*
00449 // A
00450   // Make vertices
00451   aMV.Clear();
00452   aItIm.Initialize(myImages);
00453   for (; aItIm.More(); aItIm.Next()) {
00454     const TopoDS_Shape& aV=aItIm.Key();
00455     aMV.Add(aV);
00456     const TopTools_ListOfShape& aLVSD=aItIm.Value();
00457     MakeVertex(aLVSD, aVnew);//ZZ
00458     myImages.Bind(aVnew, aLVSD);
00459   }
00460   //
00461   aNbV=aMV.Extent();
00462   for (i=1; i<=aNbV; ++i) {
00463     const TopoDS_Shape& aV=aMV(i);
00464     myImages.UnBind(aV);
00465   }
00466   //
00467   */