]> SALOME platform Git repositories - modules/geom.git/blobdiff - src/GEOMAlgo/GEOMAlgo_SurfaceTools.cxx
Salome HOME
0021672: [CEA 565] Dump Study from script
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_SurfaceTools.cxx
index b07749692d85e256c433e9417ba857cde1461290..f9d0f036b44dd021fa0b206f89195bf5ab5b3b8a 100644 (file)
@@ -1,10 +1,33 @@
-// File:       GEOMAlgo_SurfaceTools.cxx
-// Created:    Thu Jan 27 11:05:16 2005
-// Author:     Peter KURNEV
-//             <pkv@irinox>
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
 
+// File:        GEOMAlgo_SurfaceTools.cxx
+// Created:     Thu Jan 27 11:05:16 2005
+// Author:      Peter KURNEV
+//              <pkv@irinox>
+//
+#include <GEOMAlgo_SurfaceTools.hxx>
 
-#include <GEOMAlgo_SurfaceTools.ixx>
+#include <math.h>
 
 #include <gp_Pln.hxx>
 #include <gp_Cylinder.hxx>
 #include <gp_Lin.hxx>
 #include <gp_Ax3.hxx>
 #include <gp_Dir.hxx>
+#include <gp_Ax1.hxx>
+#include <gp_Vec.hxx>
 
 #include <GeomAbs_SurfaceType.hxx>
 #include <GeomAdaptor_Surface.hxx>
 
+
 //=======================================================================
 //function : GetState
-//purpose  : 
+//purpose  :
 //=======================================================================
  Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP,
-                                                 const Handle(Geom_Surface)& aSurf,
-                                                 const Standard_Real aTol,
-                                                 TopAbs_State& aState)
+                                                  const GeomAdaptor_Surface& aGAS,
+                                                  const Standard_Real aTol,
+                                                  TopAbs_State& aState)
 {
   Standard_Integer iErr;
   Standard_Real aDp, aR;
   GeomAbs_SurfaceType aType;
-  GeomAdaptor_Surface aGAS;
   gp_Sphere aSph;
   gp_Cylinder aCyl;
   gp_Pln aPln;
   //
   iErr=0;
   aState=TopAbs_UNKNOWN;
-  aGAS.Load(aSurf);
   //
   aType=aGAS.GetType();
   switch (aType) {
     aR=0.;
     aDp=GEOMAlgo_SurfaceTools::Distance(aP, aPln);
     break;
-  
-  case GeomAbs_Cylinder: 
+
+  case GeomAbs_Cylinder:
     aCyl=aGAS.Cylinder();
     aR=aCyl.Radius();
     aDp=GEOMAlgo_SurfaceTools::Distance(aP, aCyl);
-    break; 
+    break;
 
-  case GeomAbs_Sphere: 
+  case GeomAbs_Sphere:
     aSph=aGAS.Sphere();
     aR=aSph.Radius();
     aDp=GEOMAlgo_SurfaceTools::Distance(aP, aSph);
     break;
-    
+
   default:
     iErr=1; // unprocessed surface type
     break;
   return iErr;
 }
 //=======================================================================
+//function : GetState
+//purpose  :
+//=======================================================================
+ Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP,
+                                                  const Handle(Geom_Surface)& aSurf,
+                                                  const Standard_Real aTol,
+                                                  TopAbs_State& aState)
+{
+  Standard_Integer iErr;
+  GeomAdaptor_Surface aGAS;
+  //
+  aState=TopAbs_UNKNOWN;
+  aGAS.Load(aSurf);
+  //
+  iErr=GEOMAlgo_SurfaceTools::GetState(aP, aGAS, aTol, aState);
+  //
+  return iErr;
+}
+//=======================================================================
 //function : ReverseState
-//purpose  : 
+//purpose  :
 //=======================================================================
  TopAbs_State GEOMAlgo_SurfaceTools::ReverseState(const TopAbs_State aState)
 {
 }
 //=======================================================================
 //function : Distance
-//purpose  : 
+//purpose  :
 //=======================================================================
-Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP, 
-                                             const gp_Sphere& aSph)
+Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
+                                              const gp_Sphere& aSph)
 {
-  Standard_Real aD, aR;
+  Standard_Real aD;
   //
-  aR=aSph.Radius();
   const gp_Pnt& aLoc=aSph.Location();
   aD=aLoc.Distance(aP);
   //
@@ -113,14 +155,13 @@ Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
 }
 //=======================================================================
 //function : Distance
-//purpose  : 
+//purpose  :
 //=======================================================================
-Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP, 
-                                             const gp_Cylinder& aCyl)
+Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
+                                              const gp_Cylinder& aCyl)
 {
-  Standard_Real aD, aR;
+  Standard_Real aD;
   //
-  aR=aCyl.Radius();
   const gp_Ax1& aAxis=aCyl.Axis();
   gp_Lin aLin(aAxis);
   aD=aLin.Distance(aP);
@@ -129,10 +170,10 @@ Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
 }
 //=======================================================================
 //function : Distance
-//purpose  : 
+//purpose  :
 //=======================================================================
-Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP, 
-                                             const gp_Pln& aPL)
+Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
+                                              const gp_Pln& aPL)
 {
   Standard_Real aD;
   //
@@ -146,8 +187,33 @@ Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
   return aD;
 }
 //=======================================================================
+//function : IsCoaxial
+//purpose  :
+//=======================================================================
+Standard_Boolean GEOMAlgo_SurfaceTools::IsCoaxial(const gp_Pnt& aP1,
+                                                  const gp_Pnt& aP2,
+                                                  const gp_Cylinder& aCyl,
+                                                  const Standard_Real aTol)
+{
+  Standard_Boolean bRet=Standard_False;
+  Standard_Real aSM;
+  //
+  gp_Vec aV12(aP1, aP2);
+  gp_Dir aD12(aV12);
+  //
+  const gp_Ax1& aAxis=aCyl.Axis();
+  const gp_Dir& aDAxis=aAxis.Direction();
+  //
+  aSM=fabs(aD12*aDAxis);
+  if (fabs(1.-aSM) > aTol) {
+    return bRet;
+  }
+  //
+  return !bRet;
+}
+//=======================================================================
 //function : IsAnalytic
-//purpose  : 
+//purpose  :
 //=======================================================================
 Standard_Boolean GEOMAlgo_SurfaceTools::IsAnalytic(const Handle(Geom_Surface)& aSurf)
 {
@@ -157,44 +223,44 @@ Standard_Boolean GEOMAlgo_SurfaceTools::IsAnalytic(const Handle(Geom_Surface)& a
   //
   aGAS.Load(aSurf);
   aType=aGAS.GetType();
-  bRet=(aType==GeomAbs_Plane || 
-       aType==GeomAbs_Cylinder ||
-       aType==GeomAbs_Sphere);
+  bRet=(aType==GeomAbs_Plane ||
+        aType==GeomAbs_Cylinder ||
+        aType==GeomAbs_Sphere);
   return bRet;
 }
 //=======================================================================
 //function : IsConformState
-//purpose  : 
+//purpose  :
 //=======================================================================
 Standard_Boolean GEOMAlgo_SurfaceTools::IsConformState(const TopAbs_State aST1,
-                                                      const GEOMAlgo_State aST2)
+                                                       const GEOMAlgo_State aST2)
 {
   Standard_Boolean bRet=Standard_False;
   //
   switch (aST2) {
     case GEOMAlgo_ST_IN:
       if (aST1==TopAbs_IN) {
-       bRet=!bRet;
+        bRet=!bRet;
       }
       break;
     case GEOMAlgo_ST_OUT:
       if (aST1==TopAbs_OUT) {
-       bRet=!bRet;
+        bRet=!bRet;
       }
       break;
     case GEOMAlgo_ST_ON:
       if (aST1==TopAbs_ON) {
-       bRet=!bRet;
+        bRet=!bRet;
       }
       break;
     case GEOMAlgo_ST_ONIN:
       if (aST1==TopAbs_ON || aST1==TopAbs_IN) {
-       bRet=!bRet;
+        bRet=!bRet;
       }
       break;
     case GEOMAlgo_ST_ONOUT:
       if (aST1==TopAbs_ON || aST1==TopAbs_OUT) {
-       bRet=!bRet;
+        bRet=!bRet;
       }
       break;
     default: