Back to index

salome-geom  6.5.0
GEOMAlgo_ClsfBox.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_ClsfBox.cxx
00024 // Created:     Wed Nov 22 10:41:47 2006
00025 // Author:      Peter KURNEV
00026 //              <pkv@irinox>
00027 //
00028 #include <GEOMAlgo_ClsfBox.hxx>
00029 
00030 #include <GeomAbs_SurfaceType.hxx>
00031 #include <GEOMAlgo_SurfaceTools.hxx>
00032 #include <TopAbs_ShapeEnum.hxx>
00033 #include <TopTools_IndexedMapOfShape.hxx>
00034 #include <TopExp.hxx>
00035 #include <TopoDS_Face.hxx>
00036 #include <TopoDS.hxx>
00037 #include <Geom_Surface.hxx>
00038 #include <BRep_Tool.hxx>
00039 #include <Geom_Plane.hxx>
00040 #include <gp_Pnt.hxx>
00041 #include <gp_Dir.hxx>
00042 #include <gp_Pln.hxx>
00043 #include <gp_Ax1.hxx>
00044 #include <Geom_Plane.hxx>
00045 
00046 IMPLEMENT_STANDARD_HANDLE(GEOMAlgo_ClsfBox, GEOMAlgo_Clsf)
00047 IMPLEMENT_STANDARD_RTTIEXT(GEOMAlgo_ClsfBox, GEOMAlgo_Clsf)
00048 
00049 //=======================================================================
00050 //function :
00051 //purpose  :
00052 //=======================================================================
00053   GEOMAlgo_ClsfBox::GEOMAlgo_ClsfBox()
00054 :
00055   GEOMAlgo_Clsf()
00056 {
00057 }
00058 //=======================================================================
00059 //function : ~
00060 //purpose  :
00061 //=======================================================================
00062   GEOMAlgo_ClsfBox::~GEOMAlgo_ClsfBox()
00063 {
00064 }
00065 //=======================================================================
00066 //function : SetBox
00067 //purpose  :
00068 //=======================================================================
00069   void GEOMAlgo_ClsfBox::SetBox(const TopoDS_Shape& aBox)
00070 {
00071   myBox=aBox;
00072 }
00073 //=======================================================================
00074 //function : Box
00075 //purpose  :
00076 //=======================================================================
00077   const TopoDS_Shape& GEOMAlgo_ClsfBox::Box() const
00078 {
00079   return myBox;
00080 }
00081 //=======================================================================
00082 //function : CheckData
00083 //purpose  :
00084 //=======================================================================
00085   void GEOMAlgo_ClsfBox::CheckData()
00086 {
00087   Standard_Integer i, aNbF;
00088   TopAbs_ShapeEnum aTypeShape;
00089   TopAbs_Orientation aOr;
00090   GeomAbs_SurfaceType aType;
00091   Handle(Geom_Surface) aS;
00092   TopTools_IndexedMapOfShape aMF;
00093   //
00094   myErrorStatus=0;
00095   //
00096   if(myBox.IsNull()) {
00097     myErrorStatus=10; // myBox=NULL
00098     return;
00099   }
00100   //
00101   aTypeShape=myBox.ShapeType();
00102   if (aTypeShape!=TopAbs_SOLID) {
00103     myErrorStatus=11; // unallowed shape type
00104     return;
00105   }
00106   //
00107   TopExp::MapShapes(myBox, TopAbs_FACE, aMF);
00108   aNbF=aMF.Extent();
00109   if (aNbF!=6) {
00110     myErrorStatus=12; // wrong number of faces
00111     return;
00112   }
00113   //
00114   for (i=1; i<=aNbF; ++i) {
00115     const TopoDS_Face& aF=TopoDS::Face(aMF(i));
00116     aOr=aF.Orientation();
00117     if (!(aOr==TopAbs_FORWARD || aOr==TopAbs_REVERSED)) {
00118       myErrorStatus=12; // unallowed orientation of face
00119       return;
00120     }
00121     //
00122     aS=BRep_Tool::Surface(aF);
00123     myGAS[i-1].Load(aS);
00124     aType=myGAS[i-1].GetType();
00125     if (!aType==GeomAbs_Plane) {
00126       myErrorStatus=13; // unallowed surface type
00127       return;
00128     }
00129     //
00130     if(aOr==TopAbs_REVERSED) {
00131       gp_Ax1 aAx1;
00132       gp_Pln aPln;
00133       gp_Pnt aP;
00134       gp_Dir aD;
00135       Handle(Geom_Plane) aSR;
00136       //
00137       aPln=myGAS[i-1].Plane();
00138       aAx1=aPln.Axis();
00139       aP=aAx1.Location();
00140       aD=aAx1.Direction();
00141       aD.Reverse();
00142       aSR=new Geom_Plane(aP, aD);
00143       myGAS[i-1].Load(aSR);
00144     }
00145   }
00146 }
00147 //=======================================================================
00148 //function : Perform
00149 //purpose  :
00150 //=======================================================================
00151   void GEOMAlgo_ClsfBox::Perform()
00152 {
00153   myErrorStatus=0;
00154   //
00155   const Standard_Integer aNbS=6;
00156   Standard_Integer i, aNbON, aNbIN, iNext;
00157   TopAbs_State aSt;
00158   /*
00159   CheckData();
00160   if(myErrorStatus) {
00161     return;
00162   }
00163   */
00164   iNext=1;
00165   aNbON=0;
00166   aNbIN=0;
00167   for(i=0; i<aNbS && iNext; i++) {
00168     GEOMAlgo_SurfaceTools::GetState(myPnt, myGAS[i], myTolerance, aSt);
00169     //
00170     switch (aSt) {
00171       case TopAbs_OUT:
00172         myState=aSt;
00173         iNext=0;
00174         break;
00175       case TopAbs_ON:
00176         ++aNbON;
00177         break;
00178       case TopAbs_IN:
00179         ++aNbIN;
00180         break;
00181       default:
00182         myState=TopAbs_UNKNOWN;
00183         iNext=0;
00184         break;
00185     }
00186   }
00187   //
00188   if (iNext) {
00189     myState=TopAbs_UNKNOWN;
00190     //
00191     if (aNbON && aNbIN) {
00192       myState=TopAbs_ON;
00193     }
00194     else if (aNbIN==aNbS){
00195       myState=TopAbs_IN;
00196     }
00197   }
00198 }
00199 //=======================================================================
00200 //function : CanBeON
00201 //purpose  :
00202 //=======================================================================
00203   Standard_Boolean GEOMAlgo_ClsfBox::CanBeON(const Handle(Geom_Curve)& aC) const
00204 {
00205   return GEOMAlgo_Clsf::CanBeON(aC);
00206 }
00207 //=======================================================================
00208 //function : CanBeON
00209 //purpose  :
00210 //=======================================================================
00211   Standard_Boolean GEOMAlgo_ClsfBox::CanBeON(const Handle(Geom_Surface)& aS1) const
00212 {
00213   Standard_Boolean bRet;
00214   GeomAbs_SurfaceType  aST1;
00215   GeomAdaptor_Surface aGAS1;
00216   //
00217   aGAS1.Load(aS1);
00218   aST1=aGAS1.GetType();
00219   bRet=(aST1==GeomAbs_Plane);
00220   //
00221   return bRet;
00222 }