LCOV - code coverage report
Current view: top level - geom/OCC - OCCSurface.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 408 684 59.6 %
Date: 2020-06-30 00:58:45 Functions: 35 54 64.8 %
Branches: 693 2110 32.8 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : OCCSurface.cpp
       3                 :            : //
       4                 :            : // Purpose       : 
       5                 :            : //
       6                 :            : // Special Notes :
       7                 :            : //
       8                 :            : // Creator       : Alexander Danilov
       9                 :            : //
      10                 :            : // Creation Date : 
      11                 :            : //
      12                 :            : // Owner         : 
      13                 :            : //-------------------------------------------------------------------------
      14                 :            : 
      15                 :            : // ********** BEGIN OCC INCLUDES           **********
      16                 :            : #include "OCCSurface.hpp"
      17                 :            : #include "OCCQueryEngine.hpp"
      18                 :            : 
      19                 :            : #include "OCCBody.hpp"
      20                 :            : #include "OCCLump.hpp"
      21                 :            : #include "OCCShell.hpp"
      22                 :            : #include "OCCLoop.hpp"
      23                 :            : #include "OCCCoEdge.hpp"
      24                 :            : #include "OCCCurve.hpp"
      25                 :            : #include "OCCPoint.hpp"
      26                 :            : #include "OCCAttribSet.hpp"
      27                 :            : #include "GfxDebug.hpp"
      28                 :            : #include "OCCDrawTool.hpp"
      29                 :            : // ********** END OCC INCLUDES           **********
      30                 :            : 
      31                 :            : // ********** BEGIN CUBIT INCLUDES       **********
      32                 :            : 
      33                 :            : #include "CubitVector.hpp"
      34                 :            : #include "GeometryDefines.h"
      35                 :            : #include "CubitUtil.hpp"
      36                 :            : #include "CastTo.hpp"
      37                 :            : #include "GeometryQueryEngine.hpp"
      38                 :            : #include "DLIList.hpp"
      39                 :            : #include "ShellSM.hpp"
      40                 :            : #include "Lump.hpp"
      41                 :            : #include "LoopSM.hpp"
      42                 :            : // ********** END CUBIT INCLUDES           **********
      43                 :            : 
      44                 :            : 
      45                 :            : // ********** BEGIN OpenCascade INCLUDES   **********
      46                 :            : 
      47                 :            : #include <BRepAdaptor_Surface.hxx>
      48                 :            : #include <TopExp.hxx>
      49                 :            : #include <TopTools_IndexedMapOfShape.hxx>
      50                 :            : #include <Bnd_Box.hxx>
      51                 :            : #include <BndLib_AddSurface.hxx>
      52                 :            : #include <Precision.hxx>
      53                 :            : #include <TopoDS.hxx>
      54                 :            : #include <Extrema_ExtPS.hxx>
      55                 :            : #include <BRepLProp_SLProps.hxx>
      56                 :            : #include <BRepGProp.hxx>
      57                 :            : #include <GProp_GProps.hxx>
      58                 :            : #include "TopTools_ListIteratorOfListOfShape.hxx"
      59                 :            : #include "TopTools_DataMapOfShapeInteger.hxx"
      60                 :            : #include "TopTools_IndexedDataMapOfShapeListOfShape.hxx"
      61                 :            : #include "BRepClass_FaceClassifier.hxx"
      62                 :            : #include "BRepBuilderAPI_ModifyShape.hxx"
      63                 :            : #include "BRepAlgoAPI_BooleanOperation.hxx"
      64                 :            : #include "BRepBuilderAPI_MakeShape.hxx"
      65                 :            : #include "BRepBuilderAPI_Transform.hxx"
      66                 :            : #include "BRepBuilderAPI_GTransform.hxx"
      67                 :            : #include "BRepFilletAPI_MakeFillet2d.hxx"
      68                 :            : #include "BRepTools_WireExplorer.hxx"
      69                 :            : #include "TopExp.hxx"
      70                 :            : #include "BRep_Tool.hxx"
      71                 :            : #include "BRep_Builder.hxx"
      72                 :            : #include "LocOpe_SplitShape.hxx"
      73                 :            : #include "TopoDS_Compound.hxx"
      74                 :            : #include "BRepExtrema_DistShapeShape.hxx"
      75                 :            : #include "Geom_BSplineSurface.hxx"
      76                 :            : #include "IntCurvesFace_ShapeIntersector.hxx"
      77                 :            : #include "TColgp_Array2OfPnt.hxx"
      78                 :            : #include "TColStd_Array2OfReal.hxx"
      79                 :            : #include "TColStd_Array1OfReal.hxx"
      80                 :            : #include "gp_Dir.hxx"
      81                 :            : #include "gp_Lin.hxx"
      82                 :            : #include "gp_Pnt.hxx"
      83                 :            : #include "gp_Sphere.hxx"
      84                 :            : #include "gp_Cone.hxx"
      85                 :            : #include "gp_Torus.hxx"
      86                 :            : // ********** END OpenCascade INCLUDES      **********
      87                 :            : 
      88                 :            : 
      89                 :            : // ********** BEGIN STATIC DECLARATIONS    **********
      90                 :            : // ********** END STATIC DECLARATIONS      **********
      91                 :            : 
      92                 :            : 
      93                 :            : // ********** BEGIN PUBLIC FUNCTIONS       **********
      94                 :            : 
      95                 :            : //-------------------------------------------------------------------------
      96                 :            : // Purpose       : The constructor with a pointer to the TopoDS_Face. 
      97                 :            : //
      98                 :            : // Special Notes :
      99                 :            : //
     100                 :            : //-------------------------------------------------------------------------
     101         [ +  - ]:      31662 : OCCSurface::OCCSurface(TopoDS_Face *theFace)
     102                 :            : {
     103                 :      15831 :   myTopoDSFace = theFace;
     104                 :      15831 :   myShell = NULL;
     105                 :      15831 :   myLump = NULL;
     106                 :      15831 :   myBody = NULL;
     107 [ +  - ][ +  - ]:      15831 :   if(myTopoDSFace && !myTopoDSFace->IsNull())
         [ +  - ][ +  - ]
     108 [ +  - ][ -  + ]:      15831 :     assert(myTopoDSFace->ShapeType() == TopAbs_FACE);
     109                 :      15831 : }
     110                 :            : 
     111                 :            : 
     112         [ +  - ]:      29946 : OCCSurface::~OCCSurface() 
     113                 :            : {
     114         [ +  - ]:       9982 :   if(myTopoDSFace)
     115                 :            :   {
     116         [ +  - ]:       9982 :     myTopoDSFace->Nullify();
     117 [ +  - ][ +  - ]:       9982 :     delete (TopoDS_Face*)myTopoDSFace;
                 [ +  - ]
     118                 :       9982 :     myTopoDSFace = NULL;
     119                 :            :   }
     120         [ -  + ]:      19964 : }
     121                 :            : 
     122                 :       6610 : void OCCSurface::set_TopoDS_Face(TopoDS_Face& face)
     123                 :            : {
     124 [ +  - ][ +  + ]:       6610 :   if(myTopoDSFace && face.IsEqual(*myTopoDSFace))
                 [ +  + ]
     125                 :       1924 :     return;
     126                 :            : 
     127         [ +  - ]:       4686 :   if(myTopoDSFace)
     128                 :       4686 :     myTopoDSFace->Nullify();
     129                 :       4686 :   *myTopoDSFace = face ;
     130                 :            : }
     131                 :            : 
     132                 :            : 
     133                 :            : //-------------------------------------------------------------------------
     134                 :            : // Purpose       : The purpose of this function is to append a
     135                 :            : //                 attribute to the GE. The name is attached to the 
     136                 :            : //                 underlying solid model entity this one points to.
     137                 :            : //
     138                 :            : //
     139                 :            : // Special Notes : 
     140                 :            : //
     141                 :            : //-------------------------------------------------------------------------
     142                 :      11848 : void OCCSurface::append_simple_attribute_virt(const CubitSimpleAttrib &csa)
     143                 :      11848 :   { OCCAttribSet::append_attribute(csa, *myTopoDSFace); }
     144                 :            : 
     145                 :            : 
     146                 :            : //-------------------------------------------------------------------------
     147                 :            : // Purpose       : The purpose of this function is to remove a simple 
     148                 :            : //                 attribute attached to this geometry entity. The name is 
     149                 :            : //                 removed from the underlying BODY this points to.
     150                 :            : //
     151                 :            : // Special Notes : 
     152                 :            : //
     153                 :            : //-------------------------------------------------------------------------
     154                 :      47031 : void OCCSurface::remove_simple_attribute_virt(const CubitSimpleAttrib &csa)
     155                 :      47031 :   { OCCAttribSet::remove_attribute( csa , *myTopoDSFace); }
     156                 :            : 
     157                 :            : 
     158                 :            : //-------------------------------------------------------------------------
     159                 :            : // Purpose       : The purpose of this function is to remove all simple 
     160                 :            : //                 attributes attached to this geometry entity.  Also
     161                 :            : //                 removes lingering GTC attributes.
     162                 :            : //
     163                 :            : //
     164                 :            : // Special Notes : 
     165                 :            : //
     166                 :            : //-------------------------------------------------------------------------
     167                 :      31935 : void OCCSurface::remove_all_simple_attribute_virt()
     168                 :            : {
     169         [ +  - ]:      31935 :   OCCAttribSet::remove_attribute(CubitSimpleAttrib(), *myTopoDSFace);
     170                 :      31935 : }
     171                 :            : 
     172                 :            : 
     173                 :            : //-------------------------------------------------------------------------
     174                 :            : // Purpose       : The purpose of this function is to get the  
     175                 :            : //                 attributes attached to this geometry entity. The name is 
     176                 :            : //                 attached to the underlying BODY this points to.
     177                 :            : //
     178                 :            : // Special Notes : 
     179                 :            : //
     180                 :            : //-------------------------------------------------------------------------
     181                 :      21655 : CubitStatus OCCSurface::get_simple_attribute(DLIList<CubitSimpleAttrib>&
     182                 :            :                                                  csa_list)
     183                 :      21655 :   { return OCCAttribSet::get_attributes(*myTopoDSFace,csa_list); }
     184                 :            : 
     185                 :     181778 : CubitStatus OCCSurface::get_simple_attribute(const CubitString& name,
     186                 :            :                                         DLIList<CubitSimpleAttrib>& csa_list )
     187                 :     181778 :   { return OCCAttribSet::get_attributes( name, *myTopoDSFace, csa_list ); }
     188                 :            : 
     189                 :            : 
     190                 :            : //-------------------------------------------------------------------------
     191                 :            : // Purpose       : Get geometry modeling engine: OCCQueryEngine
     192                 :            : //
     193                 :            : // Special Notes :
     194                 :            : //
     195                 :            : //-------------------------------------------------------------------------
     196                 :            : GeometryQueryEngine* 
     197                 :       7639 :                  OCCSurface::get_geometry_query_engine() const
     198                 :            : {
     199                 :       7639 :    return OCCQueryEngine::instance();
     200                 :            : }   
     201                 :            : 
     202                 :            : 
     203                 :      80951 : CubitStatus OCCSurface::closest_point_along_vector(CubitVector& from_point, 
     204                 :            :   CubitVector& along_vector,
     205                 :            :   CubitVector& point_on_surface)
     206                 :            : {
     207                 :            :   // define the search ray in a way that OCC will understand
     208 [ +  - ][ +  - ]:      80951 :   gp_Pnt vectorOrigin(from_point.x(), from_point.y(), from_point.z());
         [ +  - ][ +  - ]
     209 [ +  - ][ +  - ]:      80951 :   gp_Dir vectorDir(along_vector.x(), along_vector.y(), along_vector.z());
         [ +  - ][ +  - ]
     210         [ +  - ]:      80951 :   gp_Lin occVector(vectorOrigin, vectorDir);
     211                 :            : 
     212                 :            :   // perform the OCC intersection algorithm
     213         [ +  - ]:      80951 :   IntCurvesFace_ShapeIntersector csIntersector;
     214 [ +  - ][ +  - ]:      80951 :   csIntersector.Load(*get_TopoDS_Face(), Precision::Intersection());
                 [ +  - ]
     215         [ +  - ]:      80951 :   csIntersector.Perform(occVector, 0, 1e63);
     216                 :            : 
     217                 :            :   // fail if intersection could not be computed or there is no intersection
     218 [ +  - ][ +  - ]:      80951 :   if (!csIntersector.IsDone() || csIntersector.NbPnt() == 0)
         [ +  - ][ +  + ]
                 [ +  + ]
     219                 :            :   {
     220                 :      19838 :     return CUBIT_FAILURE;
     221                 :            :   }
     222                 :            : 
     223                 :            :   // identify which of the intersection points along the vector is the closest
     224                 :      61113 :   double minWParam = -1;
     225                 :      61113 :   int minIndex = 0;
     226 [ +  - ][ +  + ]:     126342 :   for (int iPntIndx = 1; iPntIndx <= csIntersector.NbPnt(); ++iPntIndx)
     227                 :            :   {
     228         [ +  - ]:      65229 :     double wParam = csIntersector.WParameter(iPntIndx);
     229 [ +  + ][ -  + ]:      65229 :     if (minIndex == 0 || wParam < minWParam)
     230                 :            :     {
     231                 :      61113 :       minIndex = iPntIndx;
     232                 :      61113 :       minWParam = wParam;
     233                 :            :     }
     234                 :            :   }
     235                 :            : 
     236                 :            :   // package and return the closest intersection point
     237         [ +  - ]:      61113 :   gp_Pnt closestIntPnt = csIntersector.Pnt(minIndex);
     238                 :            :   point_on_surface.set(closestIntPnt.X(),
     239 [ +  - ][ +  - ]:      61113 :       closestIntPnt.Y(), closestIntPnt.Z());
         [ +  - ][ +  - ]
     240         [ +  - ]:      80951 :   return CUBIT_SUCCESS;
     241                 :            : }
     242                 :            : 
     243                 :            : //-------------------------------------------------------------------------
     244                 :            : // Purpose       : Returns a surface type ID -- the values of these are
     245                 :            : //                 determined by OCC.
     246                 :            : //
     247                 :            : // Special Notes : 
     248                 :            : //                 This code is very -specific and could change with
     249                 :            : //                 new versions of .  There are #defines for the
     250                 :            : //                 various surface type ID's.  These are defined in the
     251                 :            : //                 header files of each of the specific surface classes
     252                 :            : //                 in .
     253                 :            : //
     254                 :            : //
     255                 :            : // Creator       : Jane HU
     256                 :            : //
     257                 :            : // Creation Date : 12/06/07
     258                 :            : //-------------------------------------------------------------------------
     259                 :       5317 : GeometryType OCCSurface::geometry_type()
     260                 :            : {
     261         [ +  - ]:       5317 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     262 [ +  - ][ -  + ]:       5317 :   if (asurface.GetType() == GeomAbs_BezierSurface)
     263                 :          0 :      return SPLINE_SURFACE_TYPE;
     264 [ +  - ][ -  + ]:       5317 :   if (asurface.GetType() == GeomAbs_BSplineSurface)
     265                 :          0 :      return SPLINE_SURFACE_TYPE;
     266 [ +  - ][ +  + ]:       5317 :   if (asurface.GetType() == GeomAbs_Plane)      
     267                 :       4997 :      return PLANE_SURFACE_TYPE;
     268 [ +  - ][ -  + ]:        320 :   if (asurface.GetType() == GeomAbs_Cylinder ||
         [ #  # ][ +  - ]
     269         [ #  # ]:          0 :       asurface.GetType() == GeomAbs_Cone)
     270                 :        320 :      return CONE_SURFACE_TYPE;
     271 [ #  # ][ #  # ]:          0 :   if (asurface.GetType() == GeomAbs_Sphere)
     272                 :          0 :      return SPHERE_SURFACE_TYPE;
     273 [ #  # ][ #  # ]:          0 :   if (asurface.GetType() == GeomAbs_Torus)
     274                 :          0 :       return TORUS_SURFACE_TYPE;
     275 [ #  # ][ #  # ]:          0 :   if (asurface.GetType() == GeomAbs_SurfaceOfRevolution)
     276                 :          0 :      return UNDEFINED_SURFACE_TYPE;
     277 [ #  # ][ #  # ]:          0 :   if (asurface.GetType() == GeomAbs_SurfaceOfExtrusion)
     278                 :          0 :      return UNDEFINED_SURFACE_TYPE;
     279 [ #  # ][ #  # ]:          0 :   if (asurface.GetType() == GeomAbs_OffsetSurface)
     280                 :          0 :      return UNDEFINED_SURFACE_TYPE;
     281         [ +  - ]:       5317 :   return UNDEFINED_SURFACE_TYPE;  
     282                 :            : }
     283                 :            : //-------------------------------------------------------------------------
     284                 :            : // Purpose       : Get the bounding box of the object.
     285                 :            : //
     286                 :            : // Special Notes :
     287                 :            : //
     288                 :            : //-------------------------------------------------------------------------
     289                 :      28296 : CubitBox OCCSurface::bounding_box() const 
     290                 :            : {
     291         [ +  - ]:      28296 :   TopoDS_Face face = *myTopoDSFace;
     292 [ +  - ][ +  - ]:      56592 :   BRepAdaptor_Surface asurface(face);
     293         [ +  - ]:      28296 :   Bnd_Box aBox;
     294 [ +  - ][ +  - ]:      28296 :   BndLib_AddSurface::Add(asurface, Precision::Approximation(), aBox);
     295                 :            :   double min[3], max[3];
     296         [ +  - ]:      28296 :   aBox.Get( min[0], min[1], min[2], max[0], max[1], max[2]);
     297 [ +  - ][ +  - ]:      56592 :   return CubitBox(min, max);
     298                 :            : }
     299                 :            : 
     300                 :            : 
     301                 :          0 : CubitStatus OCCSurface::get_point_normal( CubitVector& location,
     302                 :            :                                             CubitVector& normal )
     303                 :            : {
     304 [ #  # ][ #  # ]:          0 :   return closest_point( bounding_box().center(), &location, &normal );
     305                 :            : }   
     306                 :            : 
     307                 :          0 : CubitStatus OCCSurface::closest_point_uv_guess(  
     308                 :            :           CubitVector const& location,
     309                 :            :           double& , double& ,
     310                 :            :           CubitVector* closest_location,
     311                 :            :           CubitVector* unit_normal )
     312                 :            : {
     313                 :            :   // don't use u and v guesses
     314                 :          0 :  return closest_point(location, closest_location, unit_normal);
     315                 :            : }
     316                 :            : 
     317                 :            : 
     318                 :            : //-------------------------------------------------------------------------
     319                 :            : // Purpose       : Computes the closest_point on the surface to the input 
     320                 :            : //                 location.  Optionally, it also computes and returns
     321                 :            : //                 the normal to the surface at closest_location and the 
     322                 :            : //                 principal curvatures(1-min, 2-max)
     323                 :            : //
     324                 :            : //-------------------------------------------------------------------------
     325                 :    3739327 : CubitStatus OCCSurface::closest_point( CubitVector const& location, 
     326                 :            :                                          CubitVector* closest_location,
     327                 :            :                                          CubitVector* unit_normal_ptr,
     328                 :            :                                          CubitVector* curvature_1,
     329                 :            :                                          CubitVector* curvature_2)
     330                 :            : {
     331         [ +  - ]:    3739327 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     332 [ +  - ][ +  - ]:    3739327 :   gp_Pnt p(location.x(), location.y(), location.z()), newP(0.0, 0.0, 0.0);
         [ +  - ][ +  - ]
                 [ +  - ]
     333                 :    3739327 :   double minDist=0.0, u, v;
     334                 :            :   int i;
     335 [ +  - ][ +  - ]:    7478654 :   BRepLProp_SLProps SLP(asurface, 2, Precision::PConfusion());
                 [ +  - ]
     336 [ +  - ][ +  - ]:    7478654 :   Extrema_ExtPS ext(p, asurface, Precision::Approximation(), Precision::Approximation());
         [ +  - ][ +  - ]
     337 [ +  - ][ +  + ]:    3739327 :   if (ext.IsDone() && (ext.NbExt() > 0)) {
         [ +  - ][ +  + ]
                 [ +  + ]
     338 [ +  - ][ +  + ]:    7635963 :           for ( i = 1 ; i <= ext.NbExt() ; i++ ) {
     339 [ +  + ][ +  - ]:    3898291 :             if ( (i==1) || (p.Distance(ext.Point(i).Value()) < minDist) ) {
         [ +  - ][ +  - ]
         [ -  + ][ +  + ]
     340 [ +  - ][ +  - ]:    3737672 :                           minDist = p.Distance(ext.Point(i).Value());
                 [ +  - ]
     341 [ +  - ][ +  - ]:    3737672 :                           newP = ext.Point(i).Value();
     342 [ +  - ][ +  - ]:    3737672 :                           ext.Point(i).Parameter(u, v);
     343         [ +  - ]:    3737672 :                           SLP.SetParameters(u, v);
     344                 :            :             }
     345                 :            :           }
     346                 :            :   
     347         [ +  + ]:    3737672 :         if (closest_location != NULL)
     348 [ +  - ][ +  - ]:     147870 :                 *closest_location = CubitVector(newP.X(), newP.Y(), newP.Z());
         [ +  - ][ +  - ]
                 [ +  - ]
     349         [ +  + ]:    3737672 :         if (unit_normal_ptr != NULL) {
     350         [ +  - ]:    3728743 :           gp_Dir normal;
     351 [ +  - ][ +  - ]:    3728743 :           if (SLP.IsNormalDefined()) {
     352         [ +  - ]:    3728743 :             normal = SLP.Normal();
     353 [ +  - ][ +  - ]:    3728743 :             *unit_normal_ptr = CubitVector(normal.X(), normal.Y(), normal.Z()); 
         [ +  - ][ +  - ]
                 [ +  - ]
     354                 :            :           }
     355                 :            :         }
     356                 :            :   
     357 [ +  - ][ +  - ]:    3737672 :         gp_Dir MaxD, MinD;
     358 [ +  - ][ +  + ]:    3737672 :         if (SLP.IsCurvatureDefined())
     359                 :            :         {
     360         [ +  - ]:    3737107 :            SLP.CurvatureDirections(MaxD, MinD);
     361         [ +  + ]:    3737107 :            if (curvature_1 != NULL)
     362 [ +  - ][ +  - ]:      68902 :               *curvature_1 = CubitVector(MinD.X(), MinD.Y(), MinD.Z());
         [ +  - ][ +  - ]
                 [ +  - ]
     363         [ +  + ]:    3737107 :            if (curvature_2 != NULL)
     364 [ +  - ][ +  - ]:      68902 :               *curvature_2 = CubitVector(MaxD.X(), MaxD.Y(), MaxD.Z());
         [ +  - ][ +  - ]
                 [ +  - ]
     365                 :            :         }
     366                 :    3737672 :   return CUBIT_SUCCESS;
     367                 :            :   }
     368                 :            :   //return as OCC did.
     369         [ +  - ]:    3740982 :   return CUBIT_SUCCESS;
     370                 :            : }
     371                 :            : 
     372                 :            : //-------------------------------------------------------------------------
     373                 :            : // Purpose       : Computes the closest_point on the trimmed surface to the 
     374                 :            : //                 input location. if the point is not on surface, like in the
     375                 :            : //                 hole of the surface, try to project to one of the curves. 
     376                 :            : //
     377                 :            : // Special Notes : 
     378                 :            : //-------------------------------------------------------------------------
     379                 :       6223 : void OCCSurface::closest_point_trimmed( CubitVector from_point, 
     380                 :            :                                          CubitVector& point_on_surface)
     381                 :            : {
     382         [ +  - ]:       6223 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     383 [ +  - ][ +  - ]:       6223 :   gp_Pnt p(from_point.x(), from_point.y(), from_point.z()), newP(0.0, 0.0, 0.0);
         [ +  - ][ +  - ]
                 [ +  - ]
     384                 :       6223 :   double minDist=0.0;
     385                 :            :   int i;
     386 [ +  - ][ +  - ]:      12446 :   Extrema_ExtPS ext(p, asurface, Precision::Approximation(), Precision::Approximation());
         [ +  - ][ +  - ]
                 [ +  + ]
     387 [ +  - ][ +  + ]:       6223 :   if (ext.IsDone() && (ext.NbExt() > 0)) {
         [ +  - ][ +  - ]
                 [ +  + ]
     388 [ +  - ][ +  + ]:      12786 :           for ( i = 1 ; i <= ext.NbExt() ; i++ ) {
     389 [ +  + ][ +  - ]:       6583 :                  if ( (i==1) || (p.Distance(ext.Point(i).Value()) < minDist) ) {
         [ +  - ][ +  - ]
         [ -  + ][ +  + ]
     390 [ +  - ][ +  - ]:       6203 :                           minDist = p.Distance(ext.Point(i).Value());
                 [ +  - ]
     391 [ +  - ][ +  - ]:       6203 :                           newP = ext.Point(i).Value();
     392                 :            :                   }
     393                 :            :           }
     394 [ +  - ][ +  - ]:       6203 :           point_on_surface = CubitVector(newP.X(), newP.Y(), newP.Z());
         [ +  - ][ +  - ]
                 [ +  - ]
     395                 :            :   }
     396                 :            :   else
     397                 :       6243 :     return;
     398                 :            : 
     399         [ +  - ]:       6203 :   CubitPointContainment pos = point_containment(point_on_surface);
     400         [ +  + ]:       6203 :   if(pos == CUBIT_PNT_OUTSIDE)
     401                 :            :   {
     402         [ +  - ]:         22 :     DLIList<OCCCurve*> curves;
     403         [ +  - ]:         22 :     int num_curve = get_curves(curves);
     404                 :         22 :     double d_min = 0., d;
     405                 :         22 :     OCCCurve* the_curve = NULL;
     406 [ +  - ][ +  - ]:         22 :     gp_Pnt pt = gp_Pnt(point_on_surface.x(), point_on_surface.y(), 
     407 [ +  - ][ +  - ]:         44 :                        point_on_surface.z());
     408 [ +  - ][ +  - ]:         44 :     TopoDS_Vertex theVertex = BRepBuilderAPI_MakeVertex(pt);
         [ +  - ][ +  - ]
     409         [ +  - ]:         22 :     CubitVector closest_location;
     410         [ #  # ]:          0 :     do
     411                 :            :     {
     412         [ +  + ]:        198 :       for (i = 0; i < num_curve; i++)
     413                 :            :       {
     414         [ +  - ]:        176 :         OCCCurve* curve = curves.get_and_step();
     415         [ +  - ]:        176 :         TopoDS_Edge* theEdge = curve->get_TopoDS_Edge( );
     416         [ +  - ]:        176 :         BRepExtrema_DistShapeShape distShapeShape(*theEdge, theVertex);
     417         [ +  - ]:        176 :         d = distShapeShape.Value();
     418 [ +  + ][ +  + ]:        176 :         if ( i == 0 || d_min > d)
     419                 :            :         {
     420                 :         44 :           d_min = d;
     421                 :         44 :           the_curve = curve;
     422                 :            :         }
     423         [ +  - ]:        176 :      } 
     424         [ +  - ]:         22 :      the_curve->closest_point(point_on_surface, closest_location);       
     425         [ +  - ]:         22 :      pos = the_curve->point_containment(closest_location);
     426         [ -  + ]:         22 :      if(pos == CUBIT_PNT_OUTSIDE)
     427         [ #  # ]:          0 :        curves.remove(the_curve);
     428                 :            :      else
     429                 :         22 :        break;
     430         [ #  # ]:          0 :     }while(curves.size() > 0);
     431 [ +  - ][ +  - ]:       6245 :     point_on_surface = closest_location;
         [ +  - ][ +  + ]
     432                 :       6223 :   }
     433                 :            : }
     434                 :            : 
     435                 :            : //-------------------------------------------------------------------------
     436                 :            : // Purpose       : This functions computes the point on the surface that is 
     437                 :            : //                 closest to the input location and then calculates the 
     438                 :            : //                 magnitudes of the principal curvatures at this (possibly, 
     439                 :            : //                 new) point on the surface. Specifying the RefVolume for 
     440                 :            : //                 reference is optional.
     441                 :            : //
     442                 :            : // Special Notes :
     443                 :            : //
     444                 :            : //-------------------------------------------------------------------------
     445                 :            : 
     446                 :          0 : CubitStatus OCCSurface::principal_curvatures(
     447                 :            :   CubitVector const& location, 
     448                 :            :   double& curvature_1,
     449                 :            :   double& curvature_2,
     450                 :            :   CubitVector* closest_location )
     451                 :            : {
     452         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     453 [ #  # ][ #  # ]:          0 :   gp_Pnt p(location.x(), location.y(), location.z()), newP(0.0, 0.0, 0.0);
         [ #  # ][ #  # ]
                 [ #  # ]
     454                 :          0 :   double minDist=0.0, u, v;
     455                 :            :   int i;
     456 [ #  # ][ #  # ]:          0 :   BRepLProp_SLProps SLP(asurface, 2, Precision::PConfusion());
                 [ #  # ]
     457 [ #  # ][ #  # ]:          0 :   Extrema_ExtPS ext(p, asurface, Precision::Approximation(), Precision::Approximation());
         [ #  # ][ #  # ]
     458 [ #  # ][ #  # ]:          0 :   if (ext.IsDone() && (ext.NbExt() > 0)) {
         [ #  # ][ #  # ]
                 [ #  # ]
     459 [ #  # ][ #  # ]:          0 :           for ( i = 1 ; i <= ext.NbExt() ; i++ ) {
     460 [ #  # ][ #  # ]:          0 :                   if ( (i==1) || (p.Distance(ext.Point(i).Value()) < minDist) ) {
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     461 [ #  # ][ #  # ]:          0 :                           minDist = p.Distance(ext.Point(i).Value());
                 [ #  # ]
     462 [ #  # ][ #  # ]:          0 :                           newP = ext.Point(i).Value();
     463 [ #  # ][ #  # ]:          0 :                           ext.Point(i).Parameter(u, v);
     464         [ #  # ]:          0 :                           SLP.SetParameters(u, v);
     465                 :            :                   }
     466                 :            :           }
     467                 :            :   }
     468         [ #  # ]:          0 :   if (closest_location != NULL)
     469 [ #  # ][ #  # ]:          0 :     *closest_location = CubitVector(newP.X(), newP.Y(), newP.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
     470                 :            : 
     471 [ #  # ][ #  # ]:          0 :   if (SLP.IsCurvatureDefined())
     472                 :            :   {
     473         [ #  # ]:          0 :     curvature_1 = SLP.MinCurvature();
     474         [ #  # ]:          0 :     curvature_2 = SLP.MaxCurvature();
     475                 :            :   }
     476         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     477                 :            : }
     478                 :            : 
     479                 :            : 
     480                 :            : 
     481                 :            : 
     482                 :            : 
     483                 :          0 : CubitStatus OCCSurface::evaluate( double u, double v,
     484                 :            :                                CubitVector *position,                                   
     485                 :            :                                CubitVector *normal,
     486                 :            :                                CubitVector *curvature1,
     487                 :            :                                CubitVector *curvature2 )
     488                 :            : {
     489         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     490                 :            : 
     491         [ #  # ]:          0 :   gp_Pnt p = asurface.Value(u, v);
     492         [ #  # ]:          0 :   if(position!=NULL)
     493 [ #  # ][ #  # ]:          0 :       position->set(p.X(), p.Y(), p.Z());
         [ #  # ][ #  # ]
     494                 :            : 
     495                 :            : 
     496 [ #  # ][ #  # ]:          0 :   BRepLProp_SLProps SLP(asurface, 2, Precision::PConfusion());
                 [ #  # ]
     497         [ #  # ]:          0 :   SLP.SetParameters(u, v);
     498                 :            : 
     499                 :            : 
     500         [ #  # ]:          0 :   if(normal!=NULL)
     501                 :            :   {
     502         [ #  # ]:          0 :     gp_Dir occ_normal;
     503                 :            :     //normal of a RefFace point to outside of the material
     504 [ #  # ][ #  # ]:          0 :     if (SLP.IsNormalDefined()) 
     505                 :            :     {
     506         [ #  # ]:          0 :       occ_normal = SLP.Normal();
     507 [ #  # ][ #  # ]:          0 :       normal->set(occ_normal.X(), occ_normal.Y(), occ_normal.Z()); 
         [ #  # ][ #  # ]
     508                 :            :     }
     509                 :            :   }
     510                 :            : 
     511                 :            : 
     512 [ #  # ][ #  # ]:          0 :   gp_Dir MaxD, MinD;
     513 [ #  # ][ #  # ]:          0 :   if (curvature1 && curvature2 && SLP.IsCurvatureDefined())
         [ #  # ][ #  # ]
                 [ #  # ]
     514                 :            :   {
     515         [ #  # ]:          0 :     SLP.CurvatureDirections(MaxD, MinD);
     516         [ #  # ]:          0 :     if (curvature1 != NULL)
     517 [ #  # ][ #  # ]:          0 :       *curvature1 = CubitVector(MinD.X(), MinD.Y(), MinD.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
     518         [ #  # ]:          0 :     if (curvature2 != NULL)
     519 [ #  # ][ #  # ]:          0 :       *curvature2 = CubitVector(MaxD.X(), MaxD.Y(), MaxD.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
     520                 :            :   }
     521                 :            : 
     522                 :            : 
     523         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     524                 :            : }
     525                 :            : 
     526                 :            : //-------------------------------------------------------------------------
     527                 :            : // Purpose       : Given values of the two parameters, get the position.
     528                 :            : //
     529                 :            : // Special Notes :
     530                 :            : //
     531                 :            : //-------------------------------------------------------------------------
     532                 :          0 : CubitVector OCCSurface::position_from_u_v (double u, double v)
     533                 :            : {
     534         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace, Standard_False);
     535         [ #  # ]:          0 :   gp_Pnt p = asurface.Value(u, v);
     536 [ #  # ][ #  # ]:          0 :   return CubitVector (p.X(), p.Y(), p.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
     537                 :            : }
     538                 :            : 
     539                 :            : //-------------------------------------------------------------------------
     540                 :            : // Purpose       : This function returns the {u, v} coordinates of the point 
     541                 :            : //                 on the Surface closest to the input point (specified in 
     542                 :            : //                 global space). The closest_location is also returned.
     543                 :            : //
     544                 :            : // Special Notes :
     545                 :            : //
     546                 :            : //-------------------------------------------------------------------------
     547                 :       1232 : CubitStatus OCCSurface::u_v_from_position( CubitVector const& location,
     548                 :            :                                              double& u,
     549                 :            :                                              double& v,
     550                 :            :                                              CubitVector* closest_location )
     551                 :            : {
     552         [ +  - ]:       1232 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     553 [ +  - ][ +  - ]:       1232 :   gp_Pnt p(location.x(), location.y(), location.z()), newP(0.0, 0.0, 0.0);
         [ +  - ][ +  - ]
                 [ +  - ]
     554                 :       1232 :   double minDist=0.0;
     555                 :            :   int i;
     556 [ +  - ][ +  - ]:       2464 :   Extrema_ExtPS ext(p, asurface, Precision::Confusion(), Precision::Confusion());
         [ +  - ][ +  - ]
     557 [ +  - ][ +  - ]:       1232 :   if (ext.IsDone() && (ext.NbExt() > 0)) {
         [ +  - ][ +  - ]
                 [ +  - ]
     558 [ +  - ][ +  + ]:       2464 :           for ( i = 1 ; i <= ext.NbExt() ; i++ ) {
     559 [ -  + ][ #  # ]:       1232 :                   if ( (i==1) || (p.Distance(ext.Point(i).Value()) < minDist) ) {
         [ #  # ][ #  # ]
         [ #  # ][ +  - ]
     560 [ +  - ][ +  - ]:       1232 :                           minDist = p.Distance(ext.Point(i).Value());
                 [ +  - ]
     561 [ +  - ][ +  - ]:       1232 :                           newP = ext.Point(i).Value();
     562 [ +  - ][ +  - ]:       1232 :                           ext.Point(i).Parameter(u, v);
     563                 :            :                   }
     564                 :            :           }
     565                 :            :   }
     566 [ +  + ][ +  - ]:       1232 :   if (closest_location != NULL) *closest_location = CubitVector(newP.X(), newP.Y(), newP.Z());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     567         [ +  - ]:       1232 :   return CUBIT_SUCCESS;
     568                 :            : }
     569                 :            : 
     570                 :            : //-------------------------------------------------------------------------
     571                 :            : // Purpose       : Determines whether the Facet surface is periodic. Not
     572                 :            : //                 available yet.
     573                 :            : //                 
     574                 :            : //
     575                 :            : //-------------------------------------------------------------------------
     576                 :        703 : CubitBoolean OCCSurface::is_periodic() 
     577                 :            : {
     578         [ +  - ]:        703 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     579 [ +  - ][ +  + ]:        703 :   return (asurface.IsUPeriodic() || asurface.IsVPeriodic())?CUBIT_TRUE:CUBIT_FALSE;
         [ +  - ][ -  + ]
                 [ +  - ]
     580                 :            : }
     581                 :            : 
     582                 :            : //-------------------------------------------------------------------------
     583                 :            : // Purpose       : Determines if the face is periodic in the given parameter
     584                 :            : //                 direction.  Not available yet.
     585                 :            : //
     586                 :            : //-------------------------------------------------------------------------
     587                 :        240 : CubitBoolean OCCSurface::is_periodic_in_U( double& period ) 
     588                 :            : {
     589                 :            : 
     590         [ +  - ]:        240 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     591 [ +  - ][ -  + ]:        240 :   if (!asurface.IsUPeriodic())
     592                 :          0 :      return CUBIT_FALSE;
     593                 :            : 
     594         [ +  - ]:        240 :   period = asurface.UPeriod(); 
     595         [ +  - ]:        240 :   return CUBIT_TRUE;
     596                 :            : }
     597                 :            : 
     598                 :            : //-------------------------------------------------------------------------
     599                 :            : // Purpose       : Determines if the face is periodic in the given parameter
     600                 :            : //                 direction.  Not available yet.
     601                 :            : //
     602                 :            : //
     603                 :            : //-------------------------------------------------------------------------
     604                 :        240 : CubitBoolean OCCSurface::is_periodic_in_V( double& period ) 
     605                 :            : {
     606         [ +  - ]:        240 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     607 [ +  - ][ +  - ]:        240 :   if (!asurface.IsVPeriodic())
     608                 :        240 :      return CUBIT_FALSE;
     609                 :            : 
     610         [ #  # ]:          0 :   period = asurface.VPeriod();
     611         [ +  - ]:        240 :   return CUBIT_TRUE;
     612                 :            : }
     613                 :            : 
     614                 :            : //-------------------------------------------------------------------------
     615                 :            : // Purpose       : Determines if the face is singular in the given parameter
     616                 :            : //                 direction. Based on comments in Surface: "The
     617                 :            : //                 assumption is made that the u_param is in the
     618                 :            : //                 bounds of the surface. 
     619                 :            : //
     620                 :            : //-------------------------------------------------------------------------
     621                 :          0 : CubitBoolean OCCSurface::is_singular_in_U( double u_param)
     622                 :            : {
     623                 :            :   //from  MasterIndex.htm:
     624                 :            :   // singular_u
     625                 :            :   // The only singularity recognized is where every value of the 
     626                 :            :   // nonconstant parameter generates the same object-space point,
     627                 :            :   // and these can only occur at the ends of the parameter range
     628                 :            :   // as returned by the functions above. A plane is nonsingular 
     629                 :            :   // in both directions. 
     630                 :            :   double u_lower, u_upper;
     631         [ #  # ]:          0 :   get_param_range_U( u_lower, u_upper );
     632                 :            : 
     633 [ #  # ][ #  # ]:          0 :   if ( u_param < u_lower - CUBIT_RESABS ||
     634                 :          0 :        u_param > u_upper + CUBIT_RESABS )
     635                 :            :   {
     636 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("u parameter is outside parameter bounds.\n");
         [ #  # ][ #  # ]
     637                 :          0 :     return CUBIT_FALSE;
     638                 :            :   }
     639                 :            : 
     640                 :            :   //Currently, haven't found any singularity check in OCC.
     641                 :          0 :   return CUBIT_FALSE;
     642                 :            : }  
     643                 :            : 
     644                 :            : //-------------------------------------------------------------------------
     645                 :            : // Purpose       : Determines if the face is singular in the given parameter
     646                 :            : //                 direction.  Not available yet.
     647                 :            : //-------------------------------------------------------------------------
     648                 :          0 : CubitBoolean OCCSurface::is_singular_in_V( double v_param)
     649                 :            : {
     650                 :            :   double v_lower, v_upper;
     651         [ #  # ]:          0 :   get_param_range_V( v_lower, v_upper );
     652                 :            : 
     653 [ #  # ][ #  # ]:          0 :   if ( v_param < v_lower - CUBIT_RESABS ||
     654                 :          0 :        v_param > v_upper + CUBIT_RESABS )
     655                 :            :   {
     656 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("v parameter is outside parameter bounds.\n");
         [ #  # ][ #  # ]
     657                 :          0 :     return CUBIT_FALSE;
     658                 :            :   }
     659                 :            : 
     660                 :            :   //Currently, haven't found any singularity check in OCC.
     661                 :          0 :   return CUBIT_FALSE;
     662                 :            : }
     663                 :            : 
     664                 :            : //-------------------------------------------------------------------------
     665                 :            : // Purpose       : Determines if the face is closed in the U parameter.
     666                 :            : //
     667                 :            : //-------------------------------------------------------------------------
     668                 :          0 : CubitBoolean OCCSurface::is_closed_in_U()
     669                 :            : {
     670         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     671 [ #  # ][ #  # ]:          0 :   return (asurface.IsUClosed())?CUBIT_TRUE:CUBIT_FALSE;
                 [ #  # ]
     672                 :            : }
     673                 :            : 
     674                 :            : //-------------------------------------------------------------------------
     675                 :            : // Purpose       : Determines if the face is closed in the V parameter.
     676                 :            : //-------------------------------------------------------------------------
     677                 :          0 : CubitBoolean OCCSurface::is_closed_in_V()
     678                 :            : {
     679         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     680 [ #  # ][ #  # ]:          0 :   return (asurface.IsVClosed())?CUBIT_TRUE:CUBIT_FALSE;
                 [ #  # ]
     681                 :            : }
     682                 :            : 
     683                 :            : //-------------------------------------------------------------------------
     684                 :            : // Purpose       : Calculates the derivitives at a given parameter location.
     685                 :            : //
     686                 :            : //-------------------------------------------------------------------------
     687                 :          0 : CubitStatus OCCSurface::uv_derivitives( double u,
     688                 :            :                                           double v,
     689                 :            :                                           CubitVector &du,
     690                 :            :                                           CubitVector &dv )
     691                 :            : {
     692         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     693         [ #  # ]:          0 :   gp_Pnt p;
     694 [ #  # ][ #  # ]:          0 :   gp_Vec d1u, d1v;
     695         [ #  # ]:          0 :   asurface.D1(u, v, p, d1u, d1v);
     696 [ #  # ][ #  # ]:          0 :   du = CubitVector(d1u.X(), d1u.Y(), d1u.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
     697 [ #  # ][ #  # ]:          0 :   dv = CubitVector(d1v.X(), d1v.Y(), d1v.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
     698         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     699                 :            : }
     700                 :            : 
     701                 :            : //-------------------------------------------------------------------------
     702                 :            : // Purpose       : Calculates the derivitives at a given parameter location.
     703                 :            : //
     704                 :            : //-------------------------------------------------------------------------
     705                 :            : /*
     706                 :            : CubitStatus OCCSurface::uv_2nd_derivitives( double u,
     707                 :            :                                             double v,
     708                 :            :                                             CubitVector &d2u,
     709                 :            :                                             CubitVector &d2v,
     710                 :            :                                             CubitVector &d2uv )
     711                 :            : {
     712                 :            :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     713                 :            :   gp_Pnt p;
     714                 :            :   gp_Vec d1u, d1v, du, dv, duv ;
     715                 :            :   asurface.D2(u, v, p, d1u, d1v, du, dv, duv);
     716                 :            :   d2u = CubitVector(du.X(), du.Y(), du.Z());
     717                 :            :   d2v = CubitVector(dv.X(), dv.Y(), dv.Z());
     718                 :            :   d2uv =CubitVector(duv.X(), duv.Y(), duv.Z()); 
     719                 :            :   return CUBIT_SUCCESS;
     720                 :            : }
     721                 :            : */
     722                 :            : //-------------------------------------------------------------------------
     723                 :            : // Purpose       : Determines whether the surface is parametrically defined.
     724                 :            : //                 Hopefully later this will be available.
     725                 :            : //
     726                 :            : //-------------------------------------------------------------------------
     727                 :       2210 : CubitBoolean OCCSurface::is_parametric() 
     728                 :            : {
     729                 :       2210 :   return CUBIT_TRUE;
     730                 :            : }
     731                 :            : 
     732                 :            : //-------------------------------------------------------------------------
     733                 :            : // Purpose       : Returns the lower and upper parametric bounds of the 
     734                 :            : //                 surface in U, if it is parametric.  Otherwise, it returns
     735                 :            : //                 CUBIT_FALSE and zeroes for the upper and lower parametric
     736                 :            : //                 bounds.
     737                 :            : //
     738                 :            : // Creator       : 
     739                 :            : //
     740                 :            : // Creation Date : 
     741                 :            : //-------------------------------------------------------------------------
     742                 :        208 : CubitBoolean OCCSurface::get_param_range_U( double& lower_bound,
     743                 :            :                                             double& upper_bound )
     744                 :            : {
     745         [ +  - ]:        208 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     746         [ +  - ]:        208 :   lower_bound = asurface.FirstUParameter();
     747         [ +  - ]:        208 :   upper_bound = asurface.LastUParameter();
     748         [ +  - ]:        208 :   return CUBIT_TRUE;
     749                 :            : }
     750                 :            : 
     751                 :            : //-------------------------------------------------------------------------
     752                 :            : // Purpose       : Returns the lower and upper parametric bounds of the 
     753                 :            : //                 surface in V, if it is parametric.  Otherwise, it returns
     754                 :            : //                 CUBIT_FALSE and zeroes for the upper and lower parametric
     755                 :            : //                 bounds.
     756                 :            : //
     757                 :            : //-------------------------------------------------------------------------
     758                 :        208 : CubitBoolean OCCSurface::get_param_range_V( double& lower_bound,
     759                 :            :                                             double& upper_bound )
     760                 :            : {
     761         [ +  - ]:        208 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
     762         [ +  - ]:        208 :   lower_bound = asurface.FirstVParameter();
     763                 :            : 
     764         [ +  - ]:        208 :   upper_bound = asurface.LastVParameter();
     765         [ +  - ]:        208 :   return CUBIT_TRUE;
     766                 :            : }
     767                 :            : 
     768                 :            : //-------------------------------------------------------------------------
     769                 :            : // Purpose       : Returns the area of the Surface
     770                 :            : //
     771                 :            : //-------------------------------------------------------------------------
     772                 :      10187 : double OCCSurface::measure() 
     773                 :            : {
     774         [ +  - ]:      10187 :   GProp_GProps myProps;
     775         [ +  - ]:      10187 :   BRepGProp::SurfaceProperties(*myTopoDSFace, myProps);
     776         [ +  - ]:      10187 :   return myProps.Mass();
     777                 :            : }
     778                 :            : 
     779                 :            : //-------------------------------------------------------------------------
     780                 :            : // Purpose       : Returns the center of the Surface mass
     781                 :            : //
     782                 :            : //-------------------------------------------------------------------------
     783                 :          0 : CubitVector OCCSurface::center_point()
     784                 :            : {
     785         [ #  # ]:          0 :   GProp_GProps myProps;
     786         [ #  # ]:          0 :   BRepGProp::SurfaceProperties(*myTopoDSFace, myProps);
     787         [ #  # ]:          0 :   gp_Pnt pt = myProps.CentreOfMass();
     788 [ #  # ][ #  # ]:          0 :   CubitVector v(pt.X(),pt.Y(), pt.Z());
         [ #  # ][ #  # ]
     789                 :          0 :   return v; 
     790                 :            : }
     791                 :            : 
     792                 :            : //-------------------------------------------------------------------------
     793                 :            : // Purpose       : This function tests the passed in position to see if
     794                 :            : //                 is on the underlying surface.
     795                 :            : //
     796                 :            : //-------------------------------------------------------------------------
     797                 :          0 : CubitBoolean OCCSurface::is_position_on( CubitVector &test_position )
     798                 :            : {
     799         [ #  # ]:          0 :   CubitVector new_point;
     800         [ #  # ]:          0 :   CubitStatus stat = closest_point(test_position, &new_point, NULL,NULL,NULL);
     801         [ #  # ]:          0 :   if ( !stat )
     802                 :          0 :     return CUBIT_FALSE;
     803         [ #  # ]:          0 :   CubitVector result_vec = test_position - new_point;
     804 [ #  # ][ #  # ]:          0 :   if ( result_vec.length_squared() < GEOMETRY_RESABS )
     805                 :          0 :     return CUBIT_TRUE;
     806                 :          0 :   return CUBIT_FALSE;
     807                 :            : }
     808                 :            : 
     809                 :       6203 : CubitPointContainment OCCSurface::point_containment( const CubitVector &point )
     810                 :            : {
     811         [ +  - ]:       6203 :    TopoDS_Face *face = get_TopoDS_Face();
     812 [ +  - ][ +  - ]:       6203 :    gp_Pnt p(point.x(), point.y(), point.z());
         [ +  - ][ +  - ]
     813 [ +  - ][ +  - ]:       6203 :    double tol = OCCQueryEngine::instance()->get_sme_resabs_tolerance();
     814                 :            : 
     815                 :            :    //It's checking the state of the projected point of THIS Point
     816         [ +  - ]:       6203 :    BRepClass_FaceClassifier face_classifier;
     817         [ +  - ]:       6203 :    face_classifier.Perform(*face, p, tol);
     818         [ +  - ]:       6203 :    TopAbs_State state = face_classifier.State();
     819                 :            :    
     820         [ +  + ]:       6203 :    if (state == TopAbs_IN)
     821                 :       4787 :      return CUBIT_PNT_INSIDE;
     822         [ +  + ]:       1416 :    else if (state == TopAbs_OUT)
     823                 :         22 :      return CUBIT_PNT_OUTSIDE;
     824         [ +  - ]:       1394 :    else if (state == TopAbs_ON)
     825                 :       1394 :      return CUBIT_PNT_BOUNDARY;
     826                 :            : 
     827         [ +  - ]:       6203 :    return CUBIT_PNT_UNKNOWN;
     828                 :            : }
     829                 :            : 
     830                 :          0 : CubitPointContainment OCCSurface::point_containment( double u_param, 
     831                 :            :                                                      double v_param )
     832                 :            : {
     833         [ #  # ]:          0 :   CubitVector point = position_from_u_v(u_param, v_param);
     834         [ #  # ]:          0 :   return point_containment(point);
     835                 :            : }
     836                 :            : 
     837                 :            : 
     838                 :          0 : CubitSense OCCSurface::get_geometry_sense()
     839                 :            : {
     840                 :          0 :   return CUBIT_FORWARD;
     841                 :            : }
     842                 :            : 
     843                 :       4235 : void OCCSurface::get_parents_virt( DLIList<TopologyBridge*>& parents )
     844                 :            : { 
     845         [ +  - ]:       4235 :   if(myShell) //shell or sheet body
     846                 :            :   {
     847         [ +  - ]:       4235 :     parents.append(myShell);
     848                 :       4235 :     return;
     849                 :            :   }
     850                 :            : 
     851         [ #  # ]:          0 :   OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
     852                 :          0 :   OCCBody * body = NULL;
     853                 :          0 :   DLIList <OCCBody* > *bodies = oqe->BodyList;
     854         [ #  # ]:          0 :   TopTools_IndexedDataMapOfShapeListOfShape M;
     855 [ #  # ][ #  # ]:          0 :   for(int i = 0; i <  bodies->size(); i++)
     856                 :            :   {
     857         [ #  # ]:          0 :      body = bodies->get_and_step();
     858         [ #  # ]:          0 :      DLIList<OCCSurface*> surfaces;
     859         [ #  # ]:          0 :      body = bodies->get_and_step();
     860         [ #  # ]:          0 :      body->get_all_surfaces(surfaces);
     861 [ #  # ][ #  # ]:          0 :      if(surfaces.move_to(this))
     862                 :            :      {
     863                 :            :        TopoDS_Shape* shape = oqe->instance()->
     864 [ #  # ][ #  # ]:          0 :           get_TopoDS_Shape_of_entity(CAST_TO(body, TopologyBridge));
     865         [ #  # ]:          0 :        TopExp::MapShapesAndAncestors(*shape, TopAbs_FACE, TopAbs_SHELL, M);
     866 [ #  # ][ #  # ]:          0 :        if(!M.Contains(*(get_TopoDS_Face())))
                 [ #  # ]
     867                 :          0 :          continue;
     868                 :            :        const TopTools_ListOfShape& ListOfShapes =
     869 [ #  # ][ #  # ]:          0 :                                 M.FindFromKey(*(get_TopoDS_Face()));
     870 [ #  # ][ #  # ]:          0 :        if (!ListOfShapes.IsEmpty())
     871                 :            :        {
     872         [ #  # ]:          0 :          TopTools_ListIteratorOfListOfShape it(ListOfShapes) ;
     873 [ #  # ][ #  # ]:          0 :          for (;it.More(); it.Next())
         [ #  # ][ #  # ]
                 [ #  # ]
     874                 :            :          {
     875 [ #  # ][ #  # ]:          0 :            TopoDS_Shell Shell = TopoDS::Shell(it.Value());
                 [ #  # ]
     876         [ #  # ]:          0 :            int k = oqe->OCCMap->Find(Shell);
     877 [ #  # ][ #  # ]:          0 :            parents.append((OCCShell*)(oqe->OccToCGM->find(k))->second);
                 [ #  # ]
     878         [ #  # ]:          0 :          }
     879                 :            :        }
     880                 :            :     }
     881         [ #  # ]:          0 :   }
     882                 :            : }
     883                 :            : 
     884                 :     119026 : void OCCSurface::get_children_virt( DLIList<TopologyBridge*>& children )
     885                 :            : {
     886         [ +  - ]:     119026 :   TopTools_IndexedMapOfShape M;
     887         [ +  - ]:     119026 :   TopExp::MapShapes(*myTopoDSFace, TopAbs_WIRE, M);
     888                 :            :   int ii;
     889 [ +  - ][ +  + ]:     245790 :   for (ii=1; ii<=M.Extent(); ii++) {
     890 [ +  - ][ +  - ]:     126764 :      TopologyBridge *loop = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
                 [ +  - ]
     891         [ +  + ]:     126764 :      if(loop)
     892         [ +  - ]:     126753 :        children.append_unique(loop);
     893         [ +  - ]:     119026 :   }
     894                 :     119026 : }
     895                 :            : 
     896                 :            : // return the sense with respect to the given shell
     897                 :      18411 : CubitSense OCCSurface::get_shell_sense( ShellSM* shell_ptr ) const
     898                 :            : {
     899         [ -  + ]:      18411 :   OCCShell* shell = dynamic_cast<OCCShell*>(shell_ptr);
     900         [ -  + ]:      18411 :   if (!shell) // error
     901                 :          0 :     return CUBIT_UNKNOWN;
     902                 :            :     
     903 [ +  - ][ +  + ]:      18411 :   if (shell->is_sheet())  // relative sense is "both" for sheet
     904                 :        597 :     return CUBIT_UNKNOWN;
     905                 :            : 
     906         [ +  - ]:      17814 :   TopoDS_Shell* shellShapePtr = shell->get_TopoDS_Shell();
     907         [ -  + ]:      17814 :   if (!shellShapePtr) // error
     908                 :          0 :     return CUBIT_UNKNOWN;
     909                 :            : 
     910                 :            :   TopExp_Explorer shellFaceExp(shellShapePtr->Oriented(TopAbs_FORWARD),
     911 [ +  - ][ +  - ]:      17814 :       TopAbs_FACE);
                 [ +  - ]
     912                 :      17814 :   bool isForward = false;
     913                 :      17814 :   bool isReversed = false;
     914 [ +  - ][ +  + ]:     403374 :   while (shellFaceExp.More())
     915                 :            :   {
     916 [ +  - ][ +  - ]:     385560 :     const TopoDS_Shape shellFace = shellFaceExp.Current();
     917 [ +  - ][ +  + ]:     385560 :     if (shellFace.IsSame(*myTopoDSFace))
     918                 :            :     {
     919 [ +  - ][ +  + ]:      17814 :       if (shellFace.Orientation() == TopAbs_FORWARD)
     920                 :            :       {
     921                 :       8710 :         isForward = true;
     922                 :            :       }
     923 [ +  - ][ +  - ]:       9104 :       else if (shellFace.Orientation() == TopAbs_REVERSED)
     924                 :            :       {
     925                 :       9104 :         isReversed = true;
     926                 :            :       }
     927                 :            :       else
     928                 :            :       {
     929                 :          0 :         isForward = true;
     930                 :      17814 :         isReversed = true;
     931                 :            :       }
     932                 :            :     }
     933         [ +  - ]:     385560 :     shellFaceExp.Next();
     934         [ +  - ]:     385560 :   }
     935                 :            : 
     936 [ +  + ][ -  + ]:      17814 :   if (isForward && isReversed)
     937                 :          0 :     return CUBIT_UNKNOWN;
     938         [ +  + ]:      17814 :   if (isReversed)
     939                 :       9104 :     return CUBIT_REVERSED;
     940         [ +  - ]:       8710 :   if (isForward)
     941                 :       8710 :     return CUBIT_FORWARD;
     942         [ +  - ]:      18411 :   return CUBIT_UNKNOWN;
     943                 :            : }
     944                 :            : 
     945                 :            : 
     946                 :       3744 : int OCCSurface::get_loops( DLIList<OCCLoop*>& result_list )
     947                 :            : {
     948         [ +  - ]:       3744 :   TopTools_IndexedMapOfShape M;
     949         [ +  - ]:       3744 :   TopExp::MapShapes(*myTopoDSFace, TopAbs_WIRE, M);
     950                 :            :   int ii;
     951 [ +  - ][ +  + ]:       7690 :   for (ii=1; ii<=M.Extent(); ii++) {
     952 [ +  - ][ +  - ]:       3946 :      TopologyBridge *loop = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
                 [ +  - ]
     953         [ +  - ]:       3946 :      if(loop)
     954 [ -  + ][ +  - ]:       3946 :        result_list.append_unique(dynamic_cast<OCCLoop*>(loop));
     955                 :            :   }
     956 [ +  - ][ +  - ]:       3744 :   return result_list.size();
     957                 :            : }
     958                 :            : 
     959                 :        154 : int OCCSurface::get_coedges( DLIList<OCCCoEdge*>& result_list )
     960                 :            : {
     961         [ +  - ]:        154 :   DLIList<OCCLoop*> loop_list;
     962         [ +  - ]:        154 :   get_loops( loop_list );
     963         [ +  - ]:        154 :   loop_list.reset();
     964 [ +  - ][ +  + ]:        330 :   for ( int i = 0; i < loop_list.size(); i++ )
     965                 :            :   {
     966 [ +  - ][ +  - ]:        176 :     result_list += loop_list.next(i)->coedges( );
         [ +  - ][ +  - ]
     967                 :            :   }
     968 [ +  - ][ +  - ]:        154 :   return result_list.size();
     969                 :            : }
     970                 :            : 
     971                 :        154 : int OCCSurface::get_curves( DLIList<OCCCurve*>& result_list )
     972                 :            : {
     973         [ +  - ]:        154 :   DLIList<OCCCoEdge*> coedge_list;
     974         [ +  - ]:        154 :   get_coedges( coedge_list );
     975         [ +  - ]:        154 :   coedge_list.reset();
     976 [ +  - ][ +  + ]:        858 :   for ( int i = coedge_list.size(); i--; )
     977                 :            :   {
     978         [ +  - ]:        704 :     OCCCoEdge* coedge = coedge_list.get_and_step();
     979 [ +  - ][ -  + ]:        704 :     OCCCurve* curve = dynamic_cast<OCCCurve*>(coedge->curve());
     980         [ +  - ]:        704 :     if (curve)
     981         [ +  - ]:        704 :       result_list.append_unique(curve);
     982                 :            :   }
     983 [ +  - ][ +  - ]:        154 :   return result_list.size();
     984                 :            : }
     985                 :            : 
     986                 :        132 : int OCCSurface::get_points(DLIList<OCCPoint*>& points)
     987                 :            : {
     988         [ +  - ]:        132 :   DLIList<OCCCurve*> curves;
     989         [ +  - ]:        132 :   int num_crv = get_curves(curves);
     990         [ +  + ]:        660 :   for(int i = 0; i < num_crv; i++)
     991                 :            :   {
     992         [ +  - ]:        528 :     OCCCurve* curve = curves.get_and_step();
     993         [ +  - ]:        528 :     curve->get_points(points);
     994                 :            :   }
     995 [ +  - ][ +  - ]:        132 :   points += get_hardpoints();
                 [ +  - ]
     996 [ +  - ][ +  - ]:        132 :   return points.size();
     997                 :            : }
     998                 :            : 
     999                 :            : //----------------------------------------------------------------
    1000                 :            : // Function: to update the core Surface
    1001                 :            : //           for any movement  or Boolean operation of the body.
    1002                 :            : // Author: Jane Hu
    1003                 :            : //----------------------------------------------------------------
    1004                 :       3590 : CubitStatus OCCSurface::update_OCC_entity( BRepBuilderAPI_ModifyShape *aBRepTrsf,
    1005                 :            :                                          BRepAlgoAPI_BooleanOperation *op)
    1006                 :            : {
    1007 [ -  + ][ #  # ]:       3590 :   assert(aBRepTrsf != NULL || op != NULL);
    1008         [ +  - ]:       3590 :   TopoDS_Shape shape;
    1009                 :            : 
    1010         [ +  - ]:       3590 :   if(aBRepTrsf)
    1011 [ +  - ][ +  - ]:       3590 :     shape = aBRepTrsf->ModifiedShape(*get_TopoDS_Face());
                 [ +  - ]
    1012                 :            : 
    1013                 :            :   else
    1014                 :            :   {
    1015         [ #  # ]:          0 :     TopTools_ListOfShape shapes;
    1016 [ #  # ][ #  # ]:          0 :     shapes.Assign(op->Modified(*get_TopoDS_Face()));
                 [ #  # ]
    1017 [ #  # ][ #  # ]:          0 :     if(shapes.Extent() == 0)
    1018 [ #  # ][ #  # ]:          0 :          shapes.Assign(op->Generated(*get_TopoDS_Face()));
                 [ #  # ]
    1019 [ #  # ][ #  # ]:          0 :     if (shapes.Extent() == 1)
    1020 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
    1021 [ #  # ][ #  # ]:          0 :     else if(shapes.Extent() > 1)
    1022                 :            :     {
    1023 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
    1024                 :            :     }
    1025 [ #  # ][ #  # ]:          0 :     else if(op->IsDeleted(*get_TopoDS_Face()))
                 [ #  # ]
    1026                 :            :       ;
    1027                 :            :     else
    1028 [ #  # ][ #  # ]:          0 :       return CUBIT_SUCCESS;
    1029                 :            :   }
    1030                 :            :  
    1031 [ +  - ][ +  - ]:       7180 :   TopoDS_Face surface; 
    1032 [ +  - ][ +  - ]:       3590 :   if(!shape.IsNull())
    1033 [ +  - ][ +  - ]:       3590 :     surface = TopoDS::Face(shape);
    1034                 :            : 
    1035         [ +  - ]:       3590 :   if (aBRepTrsf) 
    1036                 :            :   {
    1037                 :            :     //set the loops
    1038         [ +  - ]:       3590 :     DLIList<OCCLoop *> loops;
    1039         [ +  - ]:       3590 :     this->get_loops(loops);
    1040 [ +  - ][ +  + ]:       7360 :     for (int i = 1; i <= loops.size(); i++)
    1041                 :            :     {
    1042         [ +  - ]:       3770 :        OCCLoop *loop = loops.get_and_step();
    1043         [ +  - ]:       3770 :        loop->update_OCC_entity(aBRepTrsf, op);
    1044                 :            :     }
    1045 [ +  - ][ +  - ]:       3590 :     OCCQueryEngine::instance()->update_OCC_map(*myTopoDSFace, surface);
                 [ +  - ]
    1046                 :            :   }
    1047                 :            : 
    1048         [ #  # ]:          0 :   else if(op)
    1049         [ #  # ]:          0 :     update_OCC_entity(*myTopoDSFace, surface, op);
    1050                 :            : 
    1051         [ +  - ]:       3590 :   return CUBIT_SUCCESS;
    1052                 :            : }
    1053                 :            : 
    1054                 :            : //----------------------------------------------------------------
    1055                 :            : // Function: TopoDS_Shape level function to update the core Surface
    1056                 :            : //           for any movement  or Boolean operation of the body.
    1057                 :            : // Author: Jane Hu
    1058                 :            : //----------------------------------------------------------------
    1059                 :       1525 : CubitStatus OCCSurface::update_OCC_entity(TopoDS_Face& old_surface,
    1060                 :            :                                           TopoDS_Shape& new_surface,
    1061                 :            :                                           BRepBuilderAPI_MakeShape *op,
    1062                 :            :                                           TopoDS_Vertex* removed_vertex,
    1063                 :            :                                           LocOpe_SplitShape* sp) 
    1064                 :            : {
    1065 [ +  - ][ +  - ]:       3050 :   TopTools_IndexedMapOfShape M, M2;
                 [ +  - ]
    1066 [ +  - ][ +  - ]:       3050 :   TopoDS_Shape shape_face, shape, shape2, shape_edge, shape_vertex;
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1067 [ +  - ][ +  - ]:       1525 :   double dTOL = OCCQueryEngine::instance()->get_sme_resabs_tolerance();
    1068                 :            : 
    1069                 :            :   //First check if new_surface is type shell.
    1070         [ +  - ]:       1525 :   TopExp::MapShapes(new_surface, TopAbs_FACE,M);
    1071 [ +  - ][ -  + ]:       1525 :   if(M.Extent() > 1 )
    1072                 :            :   {
    1073 [ #  # ][ #  # ]:          0 :     OCCQueryEngine::instance()->update_OCC_map(old_surface, new_surface);
    1074                 :          0 :     return CUBIT_SUCCESS;
    1075                 :            :   }
    1076                 :            : 
    1077                 :            :   
    1078 [ +  - ][ +  + ]:       1525 :   if(M.Extent() == 1 )
    1079 [ +  - ][ +  - ]:       1250 :     shape_face = M(1);
    1080                 :            : 
    1081                 :            :       //     GfxDebug::clear();
    1082                 :            :       ////    OCCDrawTool::instance()->draw_FACE(&old_face,CUBIT_BLUE,false,false);
    1083                 :            :       //    OCCDrawTool::instance()->draw_TopoDS_Shape(&shape_face,CUBIT_GREEN,false,true);
    1084                 :            :       //    GfxDebug::mouse_xforms();
    1085                 :            : 
    1086                 :            : 
    1087         [ +  - ]:       1525 :   M.Clear(); 
    1088                 :            :   //set the Wires
    1089         [ +  - ]:       1525 :   TopExp::MapShapes(old_surface, TopAbs_WIRE, M);
    1090                 :            : 
    1091 [ +  - ][ +  - ]:       3050 :   TopTools_ListOfShape shapes;  
    1092                 :       1525 :   BRepFilletAPI_MakeFillet2d* test_op = NULL;
    1093                 :            : 
    1094 [ +  - ][ +  + ]:       3182 :   for (int ii=1; ii<=M.Extent(); ii++) 
    1095                 :            :   {
    1096 [ +  - ][ +  - ]:       1657 :      TopoDS_Wire wire = TopoDS::Wire(M(ii));
                 [ +  - ]
    1097 [ +  - ][ +  - ]:       3314 :      TopTools_ListOfShape shapes;
                 [ +  - ]
    1098         [ +  - ]:       1657 :      if(op)
    1099                 :            :      {
    1100                 :            :        //test_op = dynamic_cast<BRepFilletAPI_MakeFillet2d*>(op);
    1101                 :       1657 :        test_op = NULL; //casting fails on both OSX and Linux
    1102         [ +  - ]:       1657 :        if(!test_op)
    1103 [ +  - ][ +  - ]:       1657 :          shapes.Assign(op->Modified(wire));
    1104 [ +  - ][ +  + ]:       1657 :        if(shapes.Extent() == 0)
    1105 [ +  - ][ +  - ]:       1437 :          shapes.Assign(op->Generated(wire));
    1106 [ +  - ][ +  + ]:       1657 :        if(!new_surface.IsNull())
    1107         [ +  - ]:       1382 :          TopExp::MapShapes(new_surface,TopAbs_WIRE, M2);
    1108                 :            :      }
    1109         [ #  # ]:          0 :      else if(sp)
    1110 [ #  # ][ #  # ]:          0 :        shapes.Assign(sp->DescendantShapes(wire));
    1111                 :            : 
    1112 [ +  - ][ +  + ]:       1657 :      if (shapes.Extent() == 1)
    1113                 :            :      {
    1114 [ +  - ][ +  - ]:        187 :        shape = shapes.First();
    1115 [ +  - ][ +  - ]:        187 :        if(M2.Extent() == 1)
    1116                 :            :        {
    1117 [ +  - ][ +  - ]:        187 :          shape2 = TopoDS::Wire(M2(1));
                 [ +  - ]
    1118 [ +  - ][ -  + ]:        187 :          if(!shape.IsSame(shape2))
    1119         [ #  # ]:          0 :            shape = shape2;
    1120                 :            :        }
    1121 [ #  # ][ #  # ]:          0 :        else if(M2.Extent() > 1)
    1122         [ #  # ]:          0 :          shape.Nullify();
    1123                 :            :      }
    1124 [ +  - ][ +  + ]:       1470 :      else if(shapes.Extent() > 1)
    1125         [ +  - ]:         33 :        shape.Nullify();
    1126 [ +  - ][ -  + ]:       1437 :      else if(op->IsDeleted(wire) || shapes.Extent() == 0)
         [ #  # ][ #  # ]
                 [ +  - ]
    1127                 :            :      {
    1128         [ +  - ]:       1437 :        TopTools_IndexedMapOfShape M_new;
    1129         [ +  - ]:       1437 :        TopExp::MapShapes(new_surface, TopAbs_WIRE, M_new);
    1130 [ +  - ][ +  + ]:       1437 :        if (M_new.Extent()== 1)
    1131 [ +  - ][ +  - ]:        792 :          shape = M_new(1);
    1132 [ +  - ][ +  + ]:        645 :        else if(!shape_face.IsNull())
    1133                 :            :        {
    1134         [ +  - ]:        370 :          M_new.Clear();
    1135         [ +  - ]:        370 :          TopExp::MapShapes(shape_face, TopAbs_WIRE, M_new);
    1136 [ +  - ][ -  + ]:        370 :          if (M_new.Extent()== 1)
    1137 [ #  # ][ #  # ]:          0 :            shape = M_new(1);
    1138                 :            :        }
    1139                 :            :        else 
    1140 [ +  - ][ +  - ]:       1437 :          shape.Nullify();
    1141                 :            :      }
    1142                 :            :      else
    1143                 :            :      {
    1144         [ #  # ]:          0 :        shape = wire;
    1145                 :          0 :        continue;
    1146                 :            :      }
    1147                 :            : 
    1148                 :            :      //set curves
    1149 [ +  - ][ +  - ]:       3314 :      BRepTools_WireExplorer Ex;
         [ +  - ][ +  - ]
    1150                 :            :       
    1151 [ +  - ][ +  - ]:       7801 :      for(Ex.Init(wire); Ex.More();Ex.Next())
         [ +  - ][ +  + ]
    1152                 :            :      {
    1153 [ +  - ][ +  - ]:       6144 :        TopoDS_Edge edge = Ex.Current();
    1154                 :            :        //check to see if the edge made itself into a curve.
    1155         [ +  - ]:       6144 :        GProp_GProps myProps;
    1156         [ +  - ]:       6144 :        BRepGProp::LinearProperties(edge, myProps);
    1157         [ +  - ]:       6144 :        double length =  myProps.Mass();
    1158         [ +  + ]:       6144 :        if(length < dTOL)
    1159                 :         22 :          continue;
    1160 [ +  - ][ +  - ]:       6122 :        if(op && !test_op)
    1161                 :            :        {
    1162 [ +  - ][ +  - ]:       6122 :          shapes.Assign(op->Modified(edge));
    1163 [ +  - ][ +  + ]:       8526 :          if(shapes.Extent() == 0)
    1164 [ +  - ][ +  - ]:       2404 :            shapes.Assign(op->Generated(edge));
    1165                 :            :        }
    1166                 :            :          
    1167         [ #  # ]:          0 :        else if(sp)
    1168 [ #  # ][ #  # ]:          0 :          shapes.Assign(sp->DescendantShapes(edge));
    1169                 :            : 
    1170 [ +  - ][ +  + ]:       6122 :        if (shapes.Extent() == 1)
    1171                 :            :        {
    1172                 :            :         //in fillet creating mothod, one edge could generated a face, so check
    1173                 :            :         //it here.
    1174 [ +  - ][ +  - ]:       2948 :          TopAbs_ShapeEnum type = shapes.First().TShape()->ShapeType(); 
         [ +  - ][ +  - ]
    1175         [ -  + ]:       2948 :          if(type != TopAbs_EDGE)
    1176         [ #  # ]:          0 :            shape_edge.Nullify();
    1177                 :            :          else
    1178 [ +  - ][ +  - ]:       2948 :            shape_edge = shapes.First();
    1179                 :            :        }
    1180 [ +  - ][ +  + ]:       3174 :        else if (shapes.Extent() > 1)
    1181                 :            :        {
    1182                 :            :          //update all attributes first.
    1183         [ +  - ]:        770 :          TopTools_ListIteratorOfListOfShape it;
    1184         [ +  - ]:        770 :          it.Initialize(shapes);
    1185 [ +  - ][ +  - ]:       2442 :          for(; it.More(); it.Next())
                 [ +  + ]
    1186                 :            :          {
    1187 [ +  - ][ +  - ]:       1672 :            shape_edge = it.Value();
    1188 [ +  - ][ +  - ]:       1672 :            OCCQueryEngine::instance()->copy_attributes(edge, shape_edge);
    1189                 :            :          }
    1190         [ +  - ]:        770 :          shape_edge.Nullify();
    1191                 :            :        }
    1192 [ +  - ][ +  + ]:       2404 :        else if (op->IsDeleted(edge))
    1193         [ +  - ]:        968 :          shape_edge.Nullify(); 
    1194         [ -  + ]:       1436 :        else if (test_op)
    1195                 :            :        {
    1196 [ #  # ][ #  # ]:          0 :          if(!test_op->IsModified(edge))
    1197         [ #  # ]:          0 :            shape_edge = edge;
    1198                 :            :          else
    1199 [ #  # ][ #  # ]:          0 :            shape_edge = (test_op->Modified(edge)).First();
                 [ #  # ]
    1200                 :            :        } 
    1201                 :            :        else
    1202         [ +  - ]:       1436 :          shape_edge = edge;
    1203                 :            : 
    1204                 :            :        //update vertex
    1205 [ +  - ][ +  - ]:      12266 :        TopoDS_Vertex vertex = Ex.CurrentVertex();
         [ +  - ][ +  - ]
                 [ +  + ]
    1206         [ +  - ]:       6122 :        shapes.Clear();
    1207         [ -  + ]:       6122 :        if(test_op)
    1208         [ #  # ]:          0 :          assert(removed_vertex != NULL);
    1209                 :            : 
    1210 [ +  - ][ +  - ]:       6122 :        if(op && ! test_op )
    1211                 :            :        {
    1212 [ +  - ][ +  - ]:       6122 :          shapes.Assign(op->Modified(vertex));
    1213 [ +  - ][ +  + ]:       6122 :          if(shapes.Extent() == 0)
    1214 [ +  - ][ +  - ]:       3944 :            shapes.Assign(op->Generated(vertex));
    1215                 :            :        }
    1216         [ -  + ]:       6122 :        if(sp)
    1217 [ #  # ][ #  # ]:          0 :          shapes.Assign(sp->DescendantShapes(vertex));
    1218                 :            : 
    1219 [ +  - ][ +  + ]:       6122 :        if (shapes.Extent() == 1)
    1220 [ +  - ][ +  - ]:       2178 :          shape_vertex = shapes.First();
    1221                 :            : 
    1222 [ +  - ][ -  + ]:       3944 :        else if(shapes.Extent() > 1)
    1223                 :            :        {
    1224                 :            :          //update all attributes first.
    1225         [ #  # ]:          0 :          TopTools_ListIteratorOfListOfShape it;
    1226         [ #  # ]:          0 :          it.Initialize(shapes);
    1227 [ #  # ][ #  # ]:          0 :          for(; it.More(); it.Next())
                 [ #  # ]
    1228                 :            :          {
    1229 [ #  # ][ #  # ]:          0 :            shape_vertex = it.Value();
    1230 [ #  # ][ #  # ]:          0 :            OCCQueryEngine::instance()->copy_attributes(vertex, shape_vertex);
    1231                 :            :          }
    1232         [ #  # ]:          0 :          shape_vertex.Nullify() ;
    1233                 :            :        }
    1234 [ +  - ][ +  + ]:       3944 :        else if(op->IsDeleted(vertex) || (test_op && vertex.IsSame( *removed_vertex)))
         [ -  + ][ #  # ]
         [ #  # ][ +  + ]
    1235                 :            :        {
    1236 [ +  - ][ +  + ]:       1254 :          if(!shape.IsNull() && !shape_edge.IsNull() && !shape_edge.Closed()) 
         [ +  - ][ +  + ]
         [ +  - ][ +  - ]
                 [ +  + ]
    1237                 :            :          //there should be a vertex corresponding to the old_vertex.
    1238                 :            :          //find the vertices within tolerance distance with old_vertex.
    1239                 :            :          {
    1240         [ +  - ]:        484 :            TopoDS_Iterator It(shape_edge);
    1241 [ +  - ][ +  - ]:       1452 :            for(; It.More(); It.Next())
                 [ +  + ]
    1242                 :            :            {
    1243 [ +  - ][ +  - ]:        968 :              TopoDS_Vertex v = TopoDS::Vertex(It.Value());
                 [ +  - ]
    1244         [ +  - ]:        968 :              gp_Pnt pt1 = BRep_Tool::Pnt(v);
    1245         [ +  - ]:        968 :              gp_Pnt pt2 = BRep_Tool::Pnt(vertex);
    1246 [ +  - ][ -  + ]:        968 :              if(pt1.IsEqual(pt2, dTOL))
    1247                 :            :              {
    1248         [ #  # ]:          0 :                shape_vertex = v;  
    1249 [ +  - ][ +  - ]:        968 :                break;
    1250                 :            :              }
    1251         [ +  - ]:       1452 :            }
    1252                 :            :          }
    1253                 :            :          else   
    1254         [ +  - ]:       1254 :            shape_vertex.Nullify() ;
    1255                 :            :        } 
    1256                 :            :        else
    1257         [ +  - ]:       2690 :          shape_vertex = vertex;
    1258                 :            :       
    1259 [ +  - ][ +  + ]:       6122 :        if(!vertex.IsSame(shape_vertex) )
    1260 [ +  - ][ +  - ]:       2508 :          OCCQueryEngine::instance()->update_OCC_map(vertex, shape_vertex);
    1261                 :            : 
    1262 [ +  - ][ +  + ]:       6122 :        if (!edge.IsSame(shape_edge))
    1263 [ +  - ][ +  - ]:       3784 :          OCCQueryEngine::instance()->update_OCC_map(edge, shape_edge);
    1264                 :       6144 :      }
    1265 [ +  - ][ +  + ]:       1657 :      if (!wire.IsSame(shape))
    1266 [ +  - ][ +  - ]:       1536 :        OCCQueryEngine::instance()->update_OCC_map(wire, shape);
    1267                 :       1657 :   }
    1268                 :            : 
    1269 [ +  - ][ +  + ]:       1525 :   if (!old_surface.IsSame(new_surface))
    1270                 :            :   {
    1271                 :       1404 :     TopAbs_ShapeEnum shapetype =  TopAbs_SHAPE;
    1272 [ +  - ][ +  + ]:       1404 :     if(!new_surface.IsNull())
    1273 [ +  - ][ +  - ]:       1129 :       shapetype = new_surface.TShape()->ShapeType();  
                 [ +  - ]
    1274 [ +  + ][ +  - ]:       1404 :     if(shapetype == TopAbs_FACE || new_surface.IsNull())
         [ +  - ][ +  - ]
    1275 [ +  - ][ +  - ]:       1404 :       OCCQueryEngine::instance()->update_OCC_map(old_surface, new_surface);
    1276                 :            :     else 
    1277                 :            :     {
    1278         [ #  # ]:          0 :       TopTools_IndexedMapOfShape M;
    1279         [ #  # ]:          0 :       TopExp::MapShapes(new_surface, TopAbs_FACE, M);   
    1280 [ #  # ][ #  # ]:          0 :       TopoDS_Shape new_shape;
    1281 [ #  # ][ #  # ]:          0 :       if(M.Extent() == 1)
    1282 [ #  # ][ #  # ]:          0 :         new_shape = M(1);
    1283 [ #  # ][ #  # ]:          0 :       else if(M.Extent() > 1)
    1284                 :            :       {
    1285 [ #  # ][ #  # ]:          0 :         for(int i = 1; i <= M.Extent(); i++)
    1286                 :            :         {
    1287         [ #  # ]:          0 :           GProp_GProps myProps;
    1288         [ #  # ]:          0 :           BRepGProp::SurfaceProperties(old_surface, myProps);
    1289         [ #  # ]:          0 :           double orig_mass = myProps.Mass();
    1290         [ #  # ]:          0 :           gp_Pnt orig_pnt = myProps.CentreOfMass();
    1291 [ #  # ][ #  # ]:          0 :           BRepGProp::SurfaceProperties(M(i), myProps);
    1292         [ #  # ]:          0 :           double after_mass = myProps.Mass();
    1293         [ #  # ]:          0 :           gp_Pnt after_pnt = myProps.CentreOfMass();
    1294 [ #  # ][ #  # ]:          0 :           if(fabs(-after_mass + orig_mass) <= dTOL && 
                 [ #  # ]
    1295         [ #  # ]:          0 :              orig_pnt.IsEqual(after_pnt, dTOL))
    1296                 :            :           {
    1297 [ #  # ][ #  # ]:          0 :             new_shape = M(i);
    1298                 :          0 :             break;
    1299                 :            :           }
    1300                 :            :         }
    1301                 :            :       }
    1302 [ #  # ][ #  # ]:       1404 :       OCCQueryEngine::instance()->update_OCC_map(old_surface, new_shape);
                 [ #  # ]
    1303                 :            :     }
    1304                 :            :   }
    1305         [ +  - ]:       1525 :   return CUBIT_SUCCESS;
    1306                 :            : }
    1307                 :            : 
    1308                 :         11 : CubitStatus OCCSurface::get_bodies(DLIList<OCCBody*>& bodies)
    1309                 :            : {
    1310         [ +  - ]:         11 :    TopoDS_Face* topo_face = this->get_TopoDS_Face();
    1311         [ +  - ]:         11 :    OCCQueryEngine* oqe = OCCQueryEngine::instance();
    1312                 :         11 :    DLIList <OCCBody* > *all_bodies = oqe->BodyList;
    1313         [ +  - ]:         11 :    TopTools_IndexedDataMapOfShapeListOfShape M;
    1314                 :         11 :    OCCBody * body = NULL;
    1315 [ +  - ][ +  + ]:         55 :    for(int j = 0; j <  all_bodies->size(); j++)
    1316                 :            :    {
    1317         [ +  - ]:         44 :      body = all_bodies->get_and_step();
    1318         [ +  - ]:         44 :      TopExp_Explorer Ex;
    1319 [ +  - ][ +  - ]:         88 :      TopoDS_Face the_face;
                 [ +  + ]
    1320                 :            :      TopoDS_Shape* pshape;
    1321         [ +  - ]:         44 :      body->get_TopoDS_Shape(pshape);
    1322 [ +  - ][ +  - ]:         88 :      TopoDS_Shape ashape;
                 [ +  + ]
    1323 [ +  - ][ +  - ]:        132 :      if (pshape && !pshape->IsNull() && 
         [ +  - ][ +  - ]
    1324 [ +  - ][ +  - ]:        132 :          pshape->ShapeType() <= TopAbs_FACE &&
                 [ +  - ]
    1325 [ +  - ][ +  - ]:         44 :          OCCQueryEngine::instance()->OCCMap->IsBound(*pshape) == Standard_True)
    1326         [ +  - ]:         44 :        ashape = *pshape;
    1327         [ +  - ]:         44 :      M.Clear();
    1328                 :            : 
    1329         [ +  - ]:         44 :      TopExp::MapShapesAndAncestors(ashape, TopAbs_FACE, TopAbs_COMPOUND, M);
    1330 [ +  - ][ +  + ]:         44 :      if(!M.Contains(*topo_face))
    1331                 :         33 :        continue;
    1332 [ +  - ][ +  - ]:         44 :      bodies.append_unique(body);
                 [ +  + ]
    1333                 :         44 :   }
    1334         [ +  - ]:         11 :   return CUBIT_SUCCESS;
    1335                 :            : }
    1336                 :            : 
    1337                 :          0 : CubitStatus OCCSurface::get_projected_distance_on_surface( CubitVector *pos1,
    1338                 :            :                                                             CubitVector *pos2,
    1339                 :            :                                                             double &distance )
    1340                 :            : {
    1341         [ #  # ]:          0 :   CubitVector closest_point1;
    1342 [ #  # ][ #  # ]:          0 :   this->closest_point_trimmed(*pos1, closest_point1);  
    1343         [ #  # ]:          0 :   CubitVector closest_point2;
    1344 [ #  # ][ #  # ]:          0 :   this->closest_point_trimmed(*pos2, closest_point2); 
    1345         [ #  # ]:          0 :   distance = closest_point1.distance_between(closest_point2);
    1346                 :          0 :   return CUBIT_SUCCESS;
    1347                 :            : }
    1348                 :            : 
    1349                 :          0 : CubitStatus OCCSurface::get_nurb_params
    1350                 :            : (
    1351                 :            :   bool &rational,
    1352                 :            :   int &degree_u,
    1353                 :            :   int &degree_v,
    1354                 :            :   int &num_cntrl_pts_u,
    1355                 :            :   int &num_cntrl_pts_v,
    1356                 :            :   DLIList<CubitVector> &cntrl_pts,
    1357                 :            :   DLIList<double> &cntrl_pt_weights,
    1358                 :            :   DLIList<double> &u_knots,
    1359                 :            :   DLIList<double> &v_knots
    1360                 :            : ) const
    1361                 :            : {
    1362         [ #  # ]:          0 :   BRepAdaptor_Surface asurf(*myTopoDSFace);
    1363 [ #  # ][ #  # ]:          0 :   Handle_Geom_BSplineSurface h_S = NULL;
    1364 [ #  # ][ #  # ]:          0 :   if (asurf.GetType() == GeomAbs_BSplineSurface)
    1365 [ #  # ][ #  # ]:          0 :     h_S = asurf.BSpline();
                 [ #  # ]
    1366                 :            :   else
    1367                 :          0 :     return CUBIT_FAILURE;
    1368 [ #  # ][ #  # ]:          0 :   assert ( h_S != NULL);
    1369                 :            : 
    1370 [ #  # ][ #  # ]:          0 :   if(h_S->IsURational() || h_S->IsVRational())
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1371                 :          0 :     rational = true;
    1372                 :            :   else 
    1373                 :          0 :     rational = false;
    1374                 :            : 
    1375 [ #  # ][ #  # ]:          0 :   degree_u = h_S->UDegree();
    1376 [ #  # ][ #  # ]:          0 :   degree_v = h_S->VDegree();
    1377                 :            : 
    1378 [ #  # ][ #  # ]:          0 :   num_cntrl_pts_u = h_S->NbUPoles();
    1379 [ #  # ][ #  # ]:          0 :   num_cntrl_pts_v = h_S->NbVPoles();
    1380                 :            : 
    1381 [ #  # ][ #  # ]:          0 :   TColgp_Array2OfPnt P(1, h_S->NbUPoles(), 1, h_S->NbVPoles());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1382 [ #  # ][ #  # ]:          0 :   h_S->Poles(P);
    1383         [ #  # ]:          0 :   gp_Pnt cnt_p;
    1384 [ #  # ][ #  # ]:          0 :   for(int i = P.LowerRow(); i <= P.UpperRow(); i++)
                 [ #  # ]
    1385                 :            :   {
    1386 [ #  # ][ #  # ]:          0 :     for (int j = P.LowerCol(); j <= P.UpperCol(); j++)
                 [ #  # ]
    1387                 :            :     {
    1388         [ #  # ]:          0 :       cnt_p = P(i,j);
    1389 [ #  # ][ #  # ]:          0 :       cntrl_pts.append(CubitVector(cnt_p.X(), cnt_p.Y(), cnt_p.Z()));
         [ #  # ][ #  # ]
                 [ #  # ]
    1390                 :            :     }
    1391                 :            :   } 
    1392 [ #  # ][ #  # ]:          0 :   TColStd_Array2OfReal W(1,h_S->NbUPoles(), 1, h_S->NbVPoles());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1393 [ #  # ][ #  # ]:          0 :   h_S->Weights(W);
    1394 [ #  # ][ #  # ]:          0 :   for(int i = W.LowerRow(); i <= W.UpperRow(); i++)
                 [ #  # ]
    1395                 :            :   { 
    1396 [ #  # ][ #  # ]:          0 :     for (int j = W.LowerCol(); j <= W.UpperCol(); j++)
                 [ #  # ]
    1397                 :            :     {
    1398 [ #  # ][ #  # ]:          0 :       cntrl_pt_weights.append(W(i,j));
    1399                 :            :     }
    1400                 :            :   }
    1401 [ #  # ][ #  # ]:          0 :   TColStd_Array1OfReal Ku(1,h_S->NbUKnots()), Kv(1, h_S->NbVKnots());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1402 [ #  # ][ #  # ]:          0 :   h_S->UKnots(Ku);
    1403 [ #  # ][ #  # ]:          0 :   h_S->VKnots(Kv);
    1404 [ #  # ][ #  # ]:          0 :   for(int i = Ku.Lower(); i <= Ku.Upper(); i++)
                 [ #  # ]
    1405 [ #  # ][ #  # ]:          0 :     u_knots.append(Ku.Value(i));
    1406                 :            : 
    1407 [ #  # ][ #  # ]:          0 :   for (int i = Kv.Lower(); i <= Kv.Upper(); i++)
                 [ #  # ]
    1408 [ #  # ][ #  # ]:          0 :     v_knots.append(Kv.Value(i));
    1409         [ #  # ]:          0 :    return CUBIT_SUCCESS; 
    1410                 :            : }
    1411                 :            : //-------------------------------------------------------------------------
    1412                 :            : // Purpose       : Return parameters about a surface assuming that it is
    1413                 :            : //                 a spherical surface.  If it not CUBIT_FAILURE.
    1414                 :            : //
    1415                 :            : // Special Notes :
    1416                 :            : //
    1417                 :            : // Creator       : Jane Hu
    1418                 :            : //
    1419                 :            : // Creation Date : 2/28/2012
    1420                 :            : //-------------------------------------------------------------------------
    1421                 :          0 : CubitStatus OCCSurface::get_sphere_params( CubitVector &center,
    1422                 :            :                                            double &radius ) const
    1423                 :            : {
    1424 [ #  # ][ #  # ]:          0 :   if(const_cast<OCCSurface*> (this)->geometry_type() != SPHERE_SURFACE_TYPE)
    1425                 :          0 :     return CUBIT_FAILURE;
    1426                 :            : 
    1427         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
    1428         [ #  # ]:          0 :   gp_Sphere sphere =  asurface.Sphere(); 
    1429         [ #  # ]:          0 :   gp_Pnt center_pt = sphere.Location();
    1430 [ #  # ][ #  # ]:          0 :   center = CubitVector(center_pt.X(), center_pt.Y(), center_pt.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
    1431                 :            : 
    1432         [ #  # ]:          0 :   radius = sphere.Radius();
    1433         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    1434                 :            : }
    1435                 :            : 
    1436                 :            : //-------------------------------------------------------------------------
    1437                 :            : // Purpose       : Return parameters about a surface assuming that it is
    1438                 :            : //                 a conical surface.  If it not CUBIT_FAILURE.
    1439                 :            : //
    1440                 :            : // Special Notes :
    1441                 :            : //
    1442                 :            : // Creator       : Jane Hu
    1443                 :            : //
    1444                 :            : // Creation Date : 2/28/2012
    1445                 :            : //-------------------------------------------------------------------------
    1446                 :          0 : CubitStatus OCCSurface::get_cone_params
    1447                 :            : (
    1448                 :            :    CubitVector &center,
    1449                 :            :    CubitVector &normal,
    1450                 :            :    CubitVector &major_axis,
    1451                 :            :    double &radius_ratio,
    1452                 :            :    double &sine_angle,
    1453                 :            :    double &cos_angle
    1454                 :            : ) const
    1455                 :            : {
    1456 [ #  # ][ #  # ]:          0 :   if(const_cast<OCCSurface*> (this)->geometry_type() != CONE_SURFACE_TYPE)
    1457                 :          0 :     return CUBIT_FAILURE;
    1458                 :            : 
    1459                 :            :   //all cone type surface in OCC have circular base.
    1460         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
    1461         [ #  # ]:          0 :   gp_Cone cone = asurface.Cone();
    1462         [ #  # ]:          0 :   double half_angle = cone.SemiAngle();
    1463                 :          0 :   sine_angle = sin(half_angle);
    1464                 :          0 :   cos_angle = cos(half_angle);
    1465                 :            : 
    1466         [ #  # ]:          0 :   gp_Ax1 axis = cone.Axis();
    1467         [ #  # ]:          0 :   gp_Dir dir = axis.Direction();
    1468 [ #  # ][ #  # ]:          0 :   normal.set(dir.X(), dir.Y(), dir.Z());
         [ #  # ][ #  # ]
    1469                 :            : 
    1470         [ #  # ]:          0 :   gp_Pnt center_pt = cone.Location();
    1471 [ #  # ][ #  # ]:          0 :   center = CubitVector(center_pt.X(), center_pt.Y(), center_pt.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
    1472                 :            : 
    1473         [ #  # ]:          0 :   gp_Ax1 x_axis = cone.XAxis();
    1474         [ #  # ]:          0 :   dir = x_axis.Direction();   
    1475 [ #  # ][ #  # ]:          0 :   major_axis.set(dir.X(), dir.Y(), dir.Z());
         [ #  # ][ #  # ]
    1476                 :            : 
    1477                 :          0 :   radius_ratio = 1;
    1478         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    1479                 :            : }
    1480                 :            : 
    1481                 :            : //-------------------------------------------------------------------------
    1482                 :            : // Purpose       : Return parameters about a surface assuming that it is
    1483                 :            : //                 a torus surface.  If it not CUBIT_FAILURE.
    1484                 :            : //
    1485                 :            : // Special Notes :
    1486                 :            : //
    1487                 :            : // Creator       :  Jane Hu
    1488                 :            : //
    1489                 :            : // Creation Date : 2/28/2012
    1490                 :            : //-------------------------------------------------------------------------
    1491                 :          0 : CubitStatus OCCSurface::get_torus_params
    1492                 :            : (
    1493                 :            :    CubitVector &center,
    1494                 :            :    CubitVector &normal,
    1495                 :            :    double &major_radius,
    1496                 :            :    double &minor_radius
    1497                 :            : ) const
    1498                 :            : {
    1499 [ #  # ][ #  # ]:          0 :   if(const_cast<OCCSurface*> (this)->geometry_type() != TORUS_SURFACE_TYPE)
    1500                 :          0 :     return CUBIT_FAILURE;
    1501                 :            : 
    1502         [ #  # ]:          0 :   BRepAdaptor_Surface asurface(*myTopoDSFace);
    1503         [ #  # ]:          0 :   gp_Torus torus = asurface.Torus();
    1504         [ #  # ]:          0 :   gp_Pnt center_pt = torus.Location();
    1505 [ #  # ][ #  # ]:          0 :   center = CubitVector(center_pt.X(), center_pt.Y(), center_pt.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
    1506                 :            : 
    1507         [ #  # ]:          0 :   gp_Ax1 axis = torus.Axis();
    1508         [ #  # ]:          0 :   gp_Dir dir = axis.Direction();
    1509 [ #  # ][ #  # ]:          0 :   normal.set(dir.X(), dir.Y(), dir.Z());
         [ #  # ][ #  # ]
    1510                 :            : 
    1511         [ #  # ]:          0 :   major_radius = torus.MajorRadius();
    1512         [ #  # ]:          0 :   minor_radius = torus.MinorRadius();
    1513                 :            : 
    1514         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    1515 [ +  - ][ +  - ]:       6364 : }
    1516                 :            : // ********** END PUBLIC FUNCTIONS         **********
    1517                 :            : 
    1518                 :            : // ********** BEGIN PROTECTED FUNCTIONS    **********
    1519                 :            : // ********** END PROTECTED FUNCTIONS      **********
    1520                 :            : 
    1521                 :            : // ********** BEGIN PRIVATE FUNCTIONS      **********
    1522                 :            : 
    1523                 :            : 
    1524                 :            : // ********** END PRIVATE FUNCTIONS        **********
    1525                 :            : 
    1526                 :            : // ********** BEGIN HELPER CLASSES         **********
    1527                 :            : // ********** END HELPER CLASSES           **********
    1528                 :            : 
    1529                 :            : // ********** BEGIN EXTERN FUNCTIONS       **********
    1530                 :            : // ********** END EXTERN FUNCTIONS         **********
    1531                 :            : 
    1532                 :            : // ********** BEGIN STATIC FUNCTIONS       **********
    1533                 :            : // ********** END STATIC FUNCTIONS         **********

Generated by: LCOV version 1.11