1 // Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: GEOMAlgo_SurfaceTools.cxx
24 // Created: Thu Jan 27 11:05:16 2005
25 // Author: Peter KURNEV
28 #include <GEOMAlgo_SurfaceTools.ixx>
33 #include <gp_Cylinder.hxx>
34 #include <gp_Sphere.hxx>
42 #include <GeomAbs_SurfaceType.hxx>
43 #include <GeomAdaptor_Surface.hxx>
46 //=======================================================================
49 //=======================================================================
50 Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP,
51 const GeomAdaptor_Surface& aGAS,
52 const Standard_Real aTol,
55 Standard_Integer iErr;
56 Standard_Real aDp, aR;
57 GeomAbs_SurfaceType aType;
63 aState=TopAbs_UNKNOWN;
70 aDp=GEOMAlgo_SurfaceTools::Distance(aP, aPln);
73 case GeomAbs_Cylinder:
76 aDp=GEOMAlgo_SurfaceTools::Distance(aP, aCyl);
82 aDp=GEOMAlgo_SurfaceTools::Distance(aP, aSph);
86 iErr=1; // unprocessed surface type
95 else if (aDp<aR-aTol) {
102 //=======================================================================
103 //function : GetState
105 //=======================================================================
106 Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP,
107 const Handle(Geom_Surface)& aSurf,
108 const Standard_Real aTol,
109 TopAbs_State& aState)
111 Standard_Integer iErr;
112 GeomAdaptor_Surface aGAS;
114 aState=TopAbs_UNKNOWN;
117 iErr=GEOMAlgo_SurfaceTools::GetState(aP, aGAS, aTol, aState);
121 //=======================================================================
122 //function : ReverseState
124 //=======================================================================
125 TopAbs_State GEOMAlgo_SurfaceTools::ReverseState(const TopAbs_State aState)
127 TopAbs_State aRSt=aState;
142 //=======================================================================
143 //function : Distance
145 //=======================================================================
146 Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
147 const gp_Sphere& aSph)
151 const gp_Pnt& aLoc=aSph.Location();
152 aD=aLoc.Distance(aP);
156 //=======================================================================
157 //function : Distance
159 //=======================================================================
160 Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
161 const gp_Cylinder& aCyl)
165 const gp_Ax1& aAxis=aCyl.Axis();
167 aD=aLin.Distance(aP);
171 //=======================================================================
172 //function : Distance
174 //=======================================================================
175 Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
180 const gp_Ax3& aPos=aPL.Position();
181 const gp_Pnt& aLoc=aPos.Location ();
182 const gp_Dir& aDir=aPos.Direction();
184 aD= (aDir.X() * (aP.X() - aLoc.X()) +
185 aDir.Y() * (aP.Y() - aLoc.Y()) +
186 aDir.Z() * (aP.Z() - aLoc.Z()));
189 //=======================================================================
190 //function : IsCoaxial
192 //=======================================================================
193 Standard_Boolean GEOMAlgo_SurfaceTools::IsCoaxial(const gp_Pnt& aP1,
195 const gp_Cylinder& aCyl,
196 const Standard_Real aTol)
198 Standard_Boolean bRet=Standard_False;
201 gp_Vec aV12(aP1, aP2);
204 const gp_Ax1& aAxis=aCyl.Axis();
205 const gp_Dir& aDAxis=aAxis.Direction();
207 aSM=fabs(aD12*aDAxis);
208 if (fabs(1.-aSM) > aTol) {
214 //=======================================================================
215 //function : IsAnalytic
217 //=======================================================================
218 Standard_Boolean GEOMAlgo_SurfaceTools::IsAnalytic(const Handle(Geom_Surface)& aSurf)
220 Standard_Boolean bRet;
221 GeomAbs_SurfaceType aType;
222 GeomAdaptor_Surface aGAS;
225 aType=aGAS.GetType();
226 bRet=(aType==GeomAbs_Plane ||
227 aType==GeomAbs_Cylinder ||
228 aType==GeomAbs_Sphere);
231 //=======================================================================
232 //function : IsConformState
234 //=======================================================================
235 Standard_Boolean GEOMAlgo_SurfaceTools::IsConformState(const TopAbs_State aST1,
236 const GEOMAlgo_State aST2)
238 Standard_Boolean bRet=Standard_False;
242 if (aST1==TopAbs_IN) {
246 case GEOMAlgo_ST_OUT:
247 if (aST1==TopAbs_OUT) {
252 if (aST1==TopAbs_ON) {
256 case GEOMAlgo_ST_ONIN:
257 if (aST1==TopAbs_ON || aST1==TopAbs_IN) {
261 case GEOMAlgo_ST_ONOUT:
262 if (aST1==TopAbs_ON || aST1==TopAbs_OUT) {