Back to index

salome-geom  6.5.0
GEOMAlgo_Gluer2.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_Gluer2.cxx
00024 // Author:      Peter KURNEV
00025 
00026 #include <GEOMAlgo_Gluer2.hxx>
00027 
00028 #include <TopAbs_ShapeEnum.hxx>
00029 
00030 #include <TopoDS_Compound.hxx>
00031 #include <TopoDS_Iterator.hxx>
00032 #include <TopoDS_Shape.hxx>
00033 #include <TopoDS_Vertex.hxx>
00034 
00035 #include <BRep_Builder.hxx>
00036 #include <TopExp.hxx>
00037 #include <BRepLib.hxx>
00038 
00039 #include <TopTools_MapOfShape.hxx>
00040 #include <TopTools_MapIteratorOfMapOfShape.hxx>
00041 #include <TopTools_DataMapOfShapeShape.hxx>
00042 #include <TopTools_ListOfShape.hxx>
00043 #include <TopTools_ListIteratorOfListOfShape.hxx>
00044 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
00045 #include <TopTools_IndexedMapOfShape.hxx>
00046 
00047 #include <GEOMAlgo_GlueDetector.hxx>
00048 #include <GEOMAlgo_Tools3D.hxx>
00049 
00050 //=======================================================================
00051 //function : GEOMAlgo_Gluer2
00052 //purpose  :
00053 //=======================================================================
00054 GEOMAlgo_Gluer2::GEOMAlgo_Gluer2()
00055 :
00056   GEOMAlgo_GluerAlgo(),
00057   GEOMAlgo_BuilderShape()
00058 {
00059   myTolerance=0.0001;
00060 }
00061 //=======================================================================
00062 //function : ~GEOMAlgo_Gluer2
00063 //purpose  :
00064 //=======================================================================
00065 GEOMAlgo_Gluer2::~GEOMAlgo_Gluer2()
00066 {
00067 }
00068 //=======================================================================
00069 //function : Clear
00070 //purpose  :
00071 //=======================================================================
00072 void GEOMAlgo_Gluer2::Clear()
00073 {
00074   myErrorStatus=0;
00075   myWarningStatus=0;
00076   //
00077   GEOMAlgo_GluerAlgo::Clear();
00078   //
00079   myImagesDetected.Clear();
00080   myOriginsDetected.Clear();
00081   myShapesToGlue.Clear();
00082   myImagesToWork.Clear();
00083   myOriginsToWork.Clear();
00084   myKeepNonSolids=Standard_False;
00085   //modified by NIZNHY-PKV Tue Mar 13 13:38:28 2012f
00086   myDetector.Clear();
00087   //modified by NIZNHY-PKV Tue Mar 13 13:38:30 2012t
00088 }
00089 //modified by NIZNHY-PKV Tue Mar 13 12:26:50 2012f
00090 //=======================================================================
00091 //function : StickedShapes
00092 //purpose  :
00093 //=======================================================================
00094 const TopTools_IndexedDataMapOfShapeListOfShape&
00095   GEOMAlgo_Gluer2::StickedShapes()
00096 {
00097   return myDetector.StickedShapes();
00098 }
00099 //modified by NIZNHY-PKV Tue Mar 13 12:26:54 2012t
00100 //=======================================================================
00101 //function : SetShapesToGlue
00102 //purpose  :
00103 //=======================================================================
00104 void GEOMAlgo_Gluer2::SetShapesToGlue(const TopTools_DataMapOfShapeListOfShape& aM)
00105 {
00106   myShapesToGlue=aM;
00107 }
00108 //=======================================================================
00109 //function : ShapesToGlue
00110 //purpose  :
00111 //=======================================================================
00112 const TopTools_DataMapOfShapeListOfShape& GEOMAlgo_Gluer2::ShapesToGlue()const
00113 {
00114   return myShapesToGlue;
00115 }
00116 //=======================================================================
00117 //function : SetKeepNonSolids
00118 //purpose  :
00119 //=======================================================================
00120 void GEOMAlgo_Gluer2::SetKeepNonSolids(const Standard_Boolean aFlag)
00121 {
00122   myKeepNonSolids=aFlag;
00123 }
00124 //=======================================================================
00125 //function : KeepNonSolids
00126 //purpose  :
00127 //=======================================================================
00128 Standard_Boolean GEOMAlgo_Gluer2::KeepNonSolids()const
00129 {
00130   return myKeepNonSolids;
00131 }
00132 //=======================================================================
00133 //function : ShapesDetected
00134 //purpose  :
00135 //=======================================================================
00136 const TopTools_DataMapOfShapeListOfShape& GEOMAlgo_Gluer2::ShapesDetected()const
00137 {
00138   return myImagesDetected;
00139 }
00140 //=======================================================================
00141 //function : ImagesToWork
00142 //purpose  :
00143 //=======================================================================
00144 const TopTools_DataMapOfShapeListOfShape& GEOMAlgo_Gluer2::ImagesToWork()const
00145 {
00146   return myImagesToWork;
00147 }
00148 //=======================================================================
00149 //function : Perform
00150 //purpose  :
00151 //=======================================================================
00152 void GEOMAlgo_Gluer2::Perform()
00153 {
00154   myErrorStatus=0;
00155   myWarningStatus=0;
00156   //
00157   CheckData();
00158   if (myErrorStatus) {
00159     return;
00160   }
00161   //
00162   // Initialize the context
00163   GEOMAlgo_GluerAlgo::Perform();
00164   //
00165   PerformShapesToWork();
00166   if (myErrorStatus) {
00167     return;
00168   }
00169   if (myWarningStatus==1) {
00170     // no shapes to glue
00171     myShape=myArgument;
00172     return;
00173   }
00174   //
00175   FillVertices();
00176   if (myErrorStatus) {
00177     return;
00178   }
00179   //
00180   FillEdges();
00181   if (myErrorStatus) {
00182     return;
00183   }
00184   //
00185   FillWires();
00186   if (myErrorStatus) {
00187     return;
00188   }
00189   //
00190   FillFaces();
00191   if (myErrorStatus) {
00192     return;
00193   }
00194   //
00195   FillShells();
00196   if (myErrorStatus) {
00197     return;
00198   }
00199   //
00200   FillSolids();
00201   if (myErrorStatus) {
00202     return;
00203   }
00204   //
00205   FillCompSolids();
00206   if (myErrorStatus) {
00207     return;
00208   }
00209   //
00210   FillCompounds();
00211   if (myErrorStatus) {
00212     return;
00213   }
00214   //
00215   BuildResult();
00216   if (myErrorStatus) {
00217     return;
00218   }
00219   //
00220   PrepareHistory();
00221   if (myErrorStatus) {
00222     return;
00223   }
00224   //
00225   BRepLib::SameParameter(myShape, myTolerance, Standard_True);
00226 }
00227 //=======================================================================
00228 //function : CheckData
00229 //purpose  :
00230 //=======================================================================
00231 void GEOMAlgo_Gluer2::CheckData()
00232 {
00233   Standard_Integer aNbSG, i;
00234   TopAbs_ShapeEnum aType, aTypeX;
00235   TopTools_ListIteratorOfListOfShape aItLS;
00236   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItDMSLS;
00237   //
00238   myErrorStatus=0;
00239   myWarningStatus=0;
00240   //
00241   aNbSG=myShapesToGlue.Extent();
00242   if (aNbSG) {
00243     // Check myShapesToGlue
00244     aItDMSLS.Initialize(myShapesToGlue);
00245     for (; aItDMSLS.More(); aItDMSLS.Next()) {
00246       //const TopoDS_Shape& aSkey=aItDMSLS.Key();
00247       const TopTools_ListOfShape& aLSG=aItDMSLS.Value();
00248       aItLS.Initialize(aLSG);
00249       for (i=0; aItLS.More(); aItLS.Next(), ++i) {
00250         const TopoDS_Shape& aSG=aItLS.Value();
00251         aTypeX=aSG.ShapeType();
00252         if (!i) {
00253           aType=aTypeX;
00254           if (!(aType==TopAbs_VERTEX ||
00255                 aType==TopAbs_EDGE ||
00256                 aType==TopAbs_FACE)) {
00257             myErrorStatus=21;// non-brep shapes
00258             return;
00259           }
00260           continue;
00261         }
00262         if (aTypeX!=aType) {
00263           myErrorStatus=20;// non-homogeneous shapes
00264           return;
00265         }
00266       }
00267     }
00268   }// if (aNbSG) {
00269 }
00270 //=======================================================================
00271 //function : FillEdges
00272 //purpose  :
00273 //=======================================================================
00274 void GEOMAlgo_Gluer2::FillEdges()
00275 {
00276   FillBRepShapes(TopAbs_EDGE);
00277 }
00278 //=======================================================================
00279 //function : FillFaces
00280 //purpose  :
00281 //=======================================================================
00282 void GEOMAlgo_Gluer2::FillFaces()
00283 {
00284   FillBRepShapes(TopAbs_FACE);
00285 }
00286 //=======================================================================
00287 //function : FillWires
00288 //purpose  :
00289 //=======================================================================
00290 void GEOMAlgo_Gluer2::FillWires()
00291 {
00292   FillContainers(TopAbs_WIRE);
00293 }
00294 //=======================================================================
00295 //function : FillShells
00296 //purpose  :
00297 //=======================================================================
00298 void GEOMAlgo_Gluer2::FillShells()
00299 {
00300   FillContainers(TopAbs_SHELL);
00301 }
00302 //=======================================================================
00303 //function : FillSolids
00304 //purpose  :
00305 //=======================================================================
00306 void GEOMAlgo_Gluer2::FillSolids()
00307 {
00308   FillContainers(TopAbs_SOLID);
00309 }
00310 //=======================================================================
00311 //function : FillCompSolids
00312 //purpose  :
00313 //=======================================================================
00314 void GEOMAlgo_Gluer2::FillCompSolids()
00315 {
00316   FillContainers(TopAbs_COMPSOLID);
00317 }
00318 //=======================================================================
00319 //function : FillVertices
00320 //purpose  :
00321 //=======================================================================
00322 void GEOMAlgo_Gluer2::FillVertices()
00323 {
00324   TopAbs_ShapeEnum aType;
00325   TopoDS_Vertex aVnew;
00326   TopTools_ListIteratorOfListOfShape aItLS;
00327   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItDMSLS;
00328   //
00329   myErrorStatus=0;
00330   myWarningStatus=0;
00331   //
00332   aItDMSLS.Initialize(myImagesToWork);
00333   for (; aItDMSLS.More(); aItDMSLS.Next()) {
00334     const TopoDS_Shape& aSkey=aItDMSLS.Key();
00335     aType=aSkey.ShapeType();
00336     if (aType!=TopAbs_VERTEX) {
00337       continue;
00338     }
00339     //
00340     const TopTools_ListOfShape& aLSD=aItDMSLS.Value();
00341     //
00342     GEOMAlgo_Gluer2::MakeVertex(aLSD, aVnew);
00343     //
00344     myImages.Bind(aVnew, aLSD);
00345     //
00346     aItLS.Initialize(aLSD);
00347     for (; aItLS.More(); aItLS.Next()) {
00348       const TopoDS_Shape& aV=aItLS.Value();
00349       myOrigins.Bind(aV, aVnew);
00350     }
00351   }
00352 }
00353 //=======================================================================
00354 //function : FillBRepShapes
00355 //purpose  :
00356 //=======================================================================
00357 void GEOMAlgo_Gluer2::FillBRepShapes(const TopAbs_ShapeEnum theType)
00358 {
00359   Standard_Boolean bHasImage, bIsToWork;
00360   Standard_Integer i, aNbE;
00361   TopoDS_Iterator aItS;
00362   TopoDS_Shape aEnew;
00363   TopTools_IndexedMapOfShape aME;
00364   TopTools_MapOfShape aMFence;
00365   TopTools_ListIteratorOfListOfShape aItLS;
00366   //
00367   myErrorStatus=0;
00368   myWarningStatus=0;
00369   //
00370   TopExp::MapShapes(myArgument, theType, aME);
00371   //
00372   aNbE=aME.Extent();
00373   for (i=1; i<=aNbE; ++i) {
00374     const TopoDS_Shape& aE=aME(i);
00375     //
00376     if (!aMFence.Add(aE)) {
00377       continue;
00378     }
00379     //
00380     bIsToWork=myOriginsToWork.IsBound(aE);
00381     bHasImage=HasImage(aE);
00382     if (!bHasImage && !bIsToWork) {
00383       continue;
00384     }
00385     //
00386     MakeBRepShapes(aE, aEnew);
00387     //
00388     //myImages / myOrigins
00389     if (bIsToWork) {
00390       const TopoDS_Shape& aSkey=myOriginsToWork.Find(aE);
00391       const TopTools_ListOfShape& aLSD=myImagesToWork.Find(aSkey);
00392       //
00393       myImages.Bind(aEnew, aLSD);
00394       //
00395       aItLS.Initialize(aLSD);
00396       for (; aItLS.More(); aItLS.Next()) {
00397         const TopoDS_Shape& aEx=aItLS.Value();
00398         myOrigins.Bind(aEx, aEnew);
00399         //
00400         aMFence.Add(aEx);
00401       }
00402     }
00403     else {
00404       TopTools_ListOfShape aLSD;
00405       //
00406       aLSD.Append(aE);
00407       myImages.Bind(aEnew, aLSD);
00408       myOrigins.Bind(aE, aEnew);
00409     }
00410   }//for (i=1; i<=aNbF; ++i) {
00411 }
00412 //=======================================================================
00413 //function : FillContainers
00414 //purpose  :
00415 //=======================================================================
00416 void GEOMAlgo_Gluer2::FillContainers(const TopAbs_ShapeEnum aType)
00417 {
00418   Standard_Boolean bHasImage, bToReverse;
00419   Standard_Integer i, aNbW;
00420   TopoDS_Shape aWnew, aEnew;
00421   TopoDS_Iterator aItS;
00422   BRep_Builder aBB;
00423   TopTools_IndexedMapOfShape aMW;
00424   TopTools_MapOfShape aMFence;
00425   //
00426   myErrorStatus=0;
00427   myWarningStatus=0;
00428   //
00429   TopExp::MapShapes(myArgument, aType, aMW);
00430   //
00431   aNbW=aMW.Extent();
00432   for (i=1; i<=aNbW; ++i) {
00433     const TopoDS_Shape& aW=aMW(i);
00434     //
00435     if (!aMFence.Add(aW)) {
00436       continue;
00437     }
00438     //
00439     bHasImage=HasImage(aW);
00440     if (!bHasImage) {
00441       continue;
00442     }
00443     //
00444     GEOMAlgo_Tools3D::MakeContainer(aType, aWnew);
00445     aWnew.Orientation(aW.Orientation());
00446     //
00447     aItS.Initialize(aW);
00448     for (; aItS.More(); aItS.Next()) {
00449       const TopoDS_Shape& aE=aItS.Value();
00450       if (myOrigins.IsBound(aE)) {
00451         aEnew=myOrigins.Find(aE);
00452         //
00453         bToReverse=GEOMAlgo_Tools3D::IsSplitToReverse(aEnew, aE, myContext);
00454         if (bToReverse) {
00455           aEnew.Reverse();
00456         }
00457         //
00458         aBB.Add(aWnew, aEnew);
00459       }
00460       else {
00461         aBB.Add(aWnew, aE);
00462       }
00463     }
00464     //
00465     //myImages / myOrigins
00466     TopTools_ListOfShape aLSD;
00467     //
00468     aLSD.Append(aW);
00469     myImages.Bind(aWnew, aLSD);
00470     myOrigins.Bind(aW, aWnew);
00471     //
00472   }//for (i=1; i<=aNbE; ++i) {
00473 }
00474 //=======================================================================
00475 //function : FillCompounds
00476 //purpose  :
00477 //=======================================================================
00478 void GEOMAlgo_Gluer2::FillCompounds()
00479 {
00480   TopAbs_ShapeEnum aType;
00481   TopoDS_Iterator aItC;
00482   //
00483   myErrorStatus=0;
00484   myWarningStatus=0;
00485   //
00486   aItC.Initialize(myArgument);
00487   for (; aItC.More(); aItC.Next()) {
00488     const TopoDS_Shape& aCx=aItC.Value();
00489     aType=aCx.ShapeType();
00490     if (aType==TopAbs_COMPOUND) {
00491       FillCompound(aCx);
00492     }
00493   }
00494 }
00495 //=======================================================================
00496 //function : FillCompound
00497 //purpose  :
00498 //=======================================================================
00499 void GEOMAlgo_Gluer2::FillCompound(const TopoDS_Shape& aC)
00500 {
00501   Standard_Boolean bHasImage;
00502   TopAbs_ShapeEnum aType;
00503   TopoDS_Shape aCnew, aCXnew;
00504   TopoDS_Iterator aItC;
00505   BRep_Builder aBB;
00506   //
00507   bHasImage=HasImage(aC);
00508   if (!bHasImage) {
00509     return;
00510   }
00511   //
00512   GEOMAlgo_Tools3D::MakeContainer(TopAbs_COMPOUND, aCnew);
00513   //
00514   aItC.Initialize(aC);
00515   for (; aItC.More(); aItC.Next()) {
00516     const TopoDS_Shape& aCX=aItC.Value();
00517     aType=aCX.ShapeType();
00518     //
00519     if (aType==TopAbs_COMPOUND) {
00520       FillCompound(aCX);
00521     }
00522     //
00523     if (myOrigins.IsBound(aCX)) {
00524       aCXnew=myOrigins.Find(aCX);
00525       aCXnew.Orientation(aCX.Orientation());
00526       aBB.Add(aCnew, aCXnew);
00527     }
00528     else {
00529       aBB.Add(aCnew, aCX);
00530     }
00531   }
00532   //
00533   //myImages / myOrigins
00534   TopTools_ListOfShape aLSD;
00535   //
00536   aLSD.Append(aC);
00537   myImages.Bind(aCnew, aLSD);
00538   myOrigins.Bind(aC, aCnew);
00539 }
00540 //=======================================================================
00541 //function : HasImage
00542 //purpose  :
00543 //=======================================================================
00544 Standard_Boolean GEOMAlgo_Gluer2::HasImage(const TopoDS_Shape& aC)
00545 {
00546   Standard_Boolean bRet;
00547   TopAbs_ShapeEnum aType;
00548   TopoDS_Iterator aItC;
00549   //
00550   bRet=Standard_False;
00551   aItC.Initialize(aC);
00552   for (; aItC.More(); aItC.Next()) {
00553     const TopoDS_Shape& aCx=aItC.Value();
00554     aType=aCx.ShapeType();
00555     //
00556     if (aType==TopAbs_COMPOUND) {
00557       bRet=HasImage(aCx);
00558       if (bRet) {
00559         return bRet;
00560       }
00561     }
00562     else {
00563       bRet=myOrigins.IsBound(aCx);
00564       if (bRet) {
00565         return bRet;
00566       }
00567     }
00568   }
00569   //
00570   bRet=myOrigins.IsBound(aC);
00571   //
00572   return bRet;
00573 }
00574 //=======================================================================
00575 //function : BuildResult
00576 //purpose  :
00577 //=======================================================================
00578 void GEOMAlgo_Gluer2::BuildResult()
00579 {
00580   Standard_Boolean bHasImage;
00581   TopoDS_Shape aCnew, aCXnew;
00582   TopoDS_Iterator aItC;
00583   BRep_Builder aBB;
00584   //
00585   myErrorStatus=0;
00586   myWarningStatus=0;
00587   //
00588   aItC.Initialize(myArgument);
00589   for (; aItC.More(); aItC.Next()) {
00590     const TopoDS_Shape& aCx=aItC.Value();
00591     bHasImage=HasImage(aCx);
00592     if (bHasImage) {
00593       break;
00594     }
00595   }
00596   //
00597   if (!bHasImage) {
00598     myShape=myArgument;
00599     return;
00600   }
00601   //
00602   GEOMAlgo_Tools3D::MakeContainer(TopAbs_COMPOUND, aCnew);
00603   //
00604   aItC.Initialize(myArgument);
00605   for (; aItC.More(); aItC.Next()) {
00606     const TopoDS_Shape& aCX=aItC.Value();
00607     if (myOrigins.IsBound(aCX)) {
00608       aCXnew=myOrigins.Find(aCX);
00609       aCXnew.Orientation(aCX.Orientation());
00610       aBB.Add(aCnew, aCXnew);
00611     }
00612     else {
00613       aBB.Add(aCnew, aCX);
00614     }
00615   }
00616   //
00617   if (!myKeepNonSolids) {
00618     Standard_Integer i, aNb;
00619     TopoDS_Shape aCnew1;
00620     TopTools_IndexedMapOfShape aM;
00621     //
00622     GEOMAlgo_Tools3D::MakeContainer(TopAbs_COMPOUND, aCnew1);
00623     //
00624     TopExp::MapShapes(aCnew, TopAbs_SOLID, aM);
00625 
00626     aNb=aM.Extent();
00627     for (i=1; i<=aNb; ++i) {
00628       const TopoDS_Shape& aS=aM(i);
00629       aBB.Add(aCnew1, aS);
00630     }
00631     aCnew=aCnew1;
00632   }
00633   //
00634   myShape=aCnew;
00635 }
00636 //--------------------------------------------------------
00637 //
00638 // ErrorStatus
00639 // 11   - GEOMAlgo_GlueDetector failed
00640 // 13   - PerformImagesToWork failed
00641 // 14   - PerformImagesToWork failed
00642 //
00643 // WarningStatus
00644 // 1   - no shapes to glue
00645 // 2  - sticked shapes are detected.
00646 //      The value of myTolerance is so large that
00647 //      subshapes of a shape becomes intefere
00648 //      (e.g. vertices of an edge).
00649 //      In the case
00650 //      the result is can not be obtained