LCOV - code coverage report
Current view: top level - geom/OCC - OCCBody.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 281 433 64.9 %
Date: 2020-06-30 00:58:45 Functions: 29 37 78.4 %
Branches: 409 1082 37.8 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : OCCBody.cpp
       3                 :            : //
       4                 :            : // Purpose       : 
       5                 :            : //
       6                 :            : // Special Notes :
       7                 :            : //
       8                 :            : // Creator       : David White
       9                 :            : //
      10                 :            : // Creation Date : 7/18/00
      11                 :            : //
      12                 :            : //-------------------------------------------------------------------------
      13                 :            : 
      14                 :            : // ********** BEGIN STANDARD INCLUDES      **********
      15                 :            : #include <assert.h>
      16                 :            : // ********** END STANDARD INCLUDES        **********
      17                 :            : 
      18                 :            : // ********** BEGIN CUBIT INCLUDES         **********
      19                 :            : #include "CubitDefines.h"
      20                 :            : #include "CubitString.hpp"
      21                 :            : #include "CastTo.hpp"
      22                 :            : #include "BodySM.hpp"
      23                 :            : #include "Body.hpp"
      24                 :            : #include "OCCBody.hpp"
      25                 :            : #include "CubitSimpleAttrib.hpp"
      26                 :            : #include "OCCQueryEngine.hpp"
      27                 :            : #include "DLIList.hpp"
      28                 :            : #include "Surface.hpp"
      29                 :            : #include "OCCSurface.hpp"
      30                 :            : #include "CubitTransformMatrix.hpp"
      31                 :            : #include "OCCPoint.hpp"
      32                 :            : #include "OCCCurve.hpp"
      33                 :            : #include "OCCCoEdge.hpp"
      34                 :            : #include "OCCLoop.hpp"
      35                 :            : #include "OCCShell.hpp"
      36                 :            : #include "OCCLump.hpp"
      37                 :            : #include "OCCModifyEngine.hpp"
      38                 :            : #include "OCCAttribSet.hpp"
      39                 :            : 
      40                 :            : #include <TopExp.hxx>
      41                 :            : #include <TopTools_IndexedMapOfShape.hxx>
      42                 :            : #include "BRepBuilderAPI_ModifyShape.hxx"
      43                 :            : #include "BRepBuilderAPI_Transform.hxx"
      44                 :            : #include "BRepBuilderAPI_GTransform.hxx"
      45                 :            : #include "TopTools_DataMapOfShapeInteger.hxx"
      46                 :            : #include "TopTools_ListIteratorOfListOfShape.hxx"
      47                 :            : #include "gp_Ax1.hxx"
      48                 :            : #include "gp_Ax2.hxx"
      49                 :            : #include "gp_GTrsf.hxx"
      50                 :            : #include "Bnd_Box.hxx"
      51                 :            : #include "BRepBndLib.hxx"
      52                 :            : #include "TopExp_Explorer.hxx"
      53                 :            : #include "BRep_Builder.hxx"
      54                 :            : #include "TopoDS.hxx"
      55                 :            : #include "GProp_GProps.hxx"
      56                 :            : #include "BRepGProp.hxx"
      57                 :            : #include "Standard_Boolean.hxx"
      58                 :            : #include "LocOpe_SplitShape.hxx"
      59                 :            : #include "TopoDS_Compound.hxx"
      60                 :            : //-------------------------------------------------------------------------
      61                 :            : // Purpose       : A constructor with a list of lumps that are attached.
      62                 :            : //
      63                 :            : // Special Notes :
      64                 :            : //
      65                 :            : //-------------------------------------------------------------------------
      66                 :       2650 : OCCBody::OCCBody(TopoDS_Compound *theShape, 
      67 [ +  - ][ +  - ]:       2650 :                  OCCSurface* surface, OCCShell* shell, Lump* lump)
         [ +  - ][ +  - ]
                 [ +  - ]
      68                 :            : {
      69                 :       2650 :   myTopoDSShape = theShape;
      70         [ +  + ]:       2650 :   if (surface != NULL)
      71         [ +  - ]:        619 :     mySheetSurfaces.append(surface);
      72         [ -  + ]:       2650 :   if( shell != NULL)
      73         [ #  # ]:          0 :     myShells.append(shell);
      74         [ +  + ]:       2650 :   if (lump != NULL)
      75         [ +  - ]:       1934 :     myLumps.append(lump);
      76         [ +  - ]:       2650 :   update_bounding_box();
      77 [ +  + ][ +  - ]:       2650 :   if (myTopoDSShape && !myTopoDSShape->IsNull())
         [ +  - ][ +  + ]
      78 [ +  - ][ -  + ]:         97 :     assert(myTopoDSShape->ShapeType() == TopAbs_COMPOUND);
      79                 :       2650 : }
      80                 :            : 
      81                 :       5565 : TopoDS_Compound* OCCBody::get_TopoDS_Shape()
      82                 :            : {
      83 [ +  + ][ +  - ]:       5565 :   if (myTopoDSShape && !myTopoDSShape->IsNull())
                 [ +  + ]
      84                 :            :   {
      85         [ -  + ]:        183 :     assert(myTopoDSShape->ShapeType() == TopAbs_COMPOUND);
      86                 :        183 :     return myTopoDSShape;
      87                 :            :   }
      88                 :       5382 :   return (TopoDS_Compound*)NULL;
      89                 :            : }
      90                 :            : 
      91                 :       4715 : void OCCBody::get_TopoDS_Shape(TopoDS_Shape *& shape)
      92                 :            : {
      93 [ +  + ][ +  + ]:       4715 :   if (myTopoDSShape && !myTopoDSShape->IsNull())
                 [ +  + ]
      94                 :            :   {
      95         [ -  + ]:        388 :     assert(myTopoDSShape->ShapeType() == TopAbs_COMPOUND);
      96                 :        388 :     shape =  myTopoDSShape;
      97                 :            :   }
      98                 :            :   else
      99                 :            :   {
     100         [ +  - ]:       4327 :     DLIList<Lump*> lumps = this->lumps();
     101 [ +  - ][ +  - ]:       8654 :     DLIList<OCCShell*> shells = this->shells();
     102 [ +  - ][ +  - ]:       8654 :     DLIList<OCCSurface*> surfaces = this->my_sheet_surfaces();
     103 [ +  - ][ +  - ]:       4327 :     if(lumps.size() + shells.size() + surfaces.size() == 1)
         [ +  - ][ +  + ]
     104                 :            :     {
     105 [ +  - ][ +  + ]:       4239 :       if(lumps.size() == 1)
     106                 :            :       {
     107 [ +  - ][ -  + ]:       4228 :         OCCLump* lump = CAST_TO(lumps.get(), OCCLump);
     108         [ -  + ]:       4228 :         assert(lump != NULL);
     109         [ +  - ]:       4228 :         shape = CAST_TO(lump, OCCLump)->get_TopoDS_Solid();
     110                 :            :       }
     111 [ +  - ][ -  + ]:         11 :       else if(shells.size() == 1)
     112 [ #  # ][ #  # ]:          0 :         shape = shells.get()->get_TopoDS_Shell(); 
     113                 :            :       else
     114 [ +  - ][ +  - ]:       4239 :         shape = surfaces.get()->get_TopoDS_Face();
     115                 :            :     }
     116                 :            :     else
     117         [ +  - ]:       4415 :       shape = NULL;
     118                 :            :   }
     119                 :       4715 : }
     120                 :            : 
     121                 :        271 : void OCCBody::set_sheet_surfaces(DLIList<OCCSurface*> surfaces)
     122                 :            : {
     123                 :        271 :   mySheetSurfaces = surfaces;
     124                 :        271 : }
     125                 :            : 
     126                 :        271 : void OCCBody::lumps(DLIList<Lump*>& my_lumps)
     127                 :            : {
     128                 :        271 :   myLumps = my_lumps;
     129                 :        271 : }
     130                 :            : 
     131                 :         11 : CubitBoolean OCCBody::is_sheet_body()
     132                 :            : {
     133 [ +  - ][ +  - ]:         11 :   if(myLumps.size() == 0 && myShells.size() == 0 && mySheetSurfaces.size() == 1)
         [ +  - ][ +  - ]
     134                 :         11 :     return CUBIT_TRUE;
     135                 :          0 :   return CUBIT_FALSE;
     136                 :            : }
     137                 :            : 
     138                 :          0 : void OCCBody::set_TopoDS_Shape( TopoDS_Compound& theshape)
     139                 :            : {
     140         [ #  # ]:          0 :   if(!theshape.IsNull())
     141         [ #  # ]:          0 :     assert(theshape.ShapeType() == TopAbs_COMPOUND);
     142                 :            : 
     143                 :            :   else
     144                 :            :   {
     145 [ #  # ][ #  # ]:          0 :     if(myTopoDSShape && !myTopoDSShape->IsNull())
                 [ #  # ]
     146                 :          0 :       myTopoDSShape->Nullify();
     147                 :          0 :     return;
     148                 :            :   }
     149                 :            :   
     150 [ #  # ][ #  # ]:          0 :   if(myTopoDSShape && !myTopoDSShape->IsNull() && theshape.IsEqual(*myTopoDSShape))
         [ #  # ][ #  # ]
     151                 :          0 :     return;
     152                 :            : 
     153 [ #  # ][ #  # ]:          0 :   if (myTopoDSShape && !myTopoDSShape->IsNull() && theshape.IsPartner(*myTopoDSShape))
         [ #  # ][ #  # ]
     154                 :            :   {
     155                 :          0 :     myTopoDSShape->Location(theshape.Location());
     156                 :          0 :     myTopoDSShape->Orientation(theshape.Orientation());
     157                 :            :   }
     158                 :            : 
     159                 :            :   else
     160                 :            :   {
     161         [ #  # ]:          0 :     if(myTopoDSShape)
     162                 :          0 :       myTopoDSShape->Nullify();
     163                 :          0 :     *myTopoDSShape = theshape;
     164                 :            :   }
     165                 :            : }
     166                 :            : 
     167                 :          0 : OCCBody::OCCBody(DLIList<Lump*>& my_lumps, 
     168                 :            :                  DLIList<OCCShell*>& shells,
     169 [ #  # ][ #  # ]:          0 :                  DLIList<OCCSurface*>& surfaces)
         [ #  # ][ #  # ]
                 [ #  # ]
     170                 :            : {
     171         [ #  # ]:          0 :   myLumps = my_lumps;
     172         [ #  # ]:          0 :   mySheetSurfaces = surfaces;
     173         [ #  # ]:          0 :   myShells = shells;
     174         [ #  # ]:          0 :   TopoDS_Compound* new_top = make_Compound(my_lumps, shells, surfaces);
     175                 :          0 :   myTopoDSShape = new_top;
     176 [ #  # ][ #  # ]:          0 :   assert (myTopoDSShape->ShapeType() == TopAbs_COMPOUND);
     177         [ #  # ]:          0 :   update_bounding_box();
     178                 :          0 : }
     179                 :            : 
     180                 :          0 : TopoDS_Compound* OCCBody::make_Compound(DLIList<Lump*>& my_lumps,
     181                 :            :                                         DLIList<OCCShell*>& shells,
     182                 :            :                                         DLIList<OCCSurface*>& surfaces)
     183                 :            : {
     184                 :            :   BRep_Builder B;
     185         [ #  # ]:          0 :   TopoDS_Compound Co;
     186         [ #  # ]:          0 :   B.MakeCompound(Co);
     187 [ #  # ][ #  # ]:          0 :   for(int i = 0; i < my_lumps.size(); i ++)
     188                 :            :   {
     189 [ #  # ][ #  # ]:          0 :      OCCLump* lump = CAST_TO(my_lumps.get_and_step(), OCCLump);
     190         [ #  # ]:          0 :      if(!lump)
     191                 :            :      {
     192 [ #  # ][ #  # ]:          0 :        PRINT_ERROR("Cannot create an OCC BodySM from the given lumps.\n"
                 [ #  # ]
     193         [ #  # ]:          0 :                    "Possible incompatible geometry engines.\n");
     194                 :          0 :        return (TopoDS_Compound *)NULL;
     195                 :            :      }
     196         [ #  # ]:          0 :      TopoDS_Solid * solid = CAST_TO(lump, OCCLump)->get_TopoDS_Solid();
     197         [ #  # ]:          0 :      B.Add(Co, *solid);
     198                 :            :   }
     199 [ #  # ][ #  # ]:          0 :   for(int i = 0; i < shells.size(); i ++)
     200                 :            :   {
     201 [ #  # ][ #  # ]:          0 :      TopoDS_Shell * shell = shells.get_and_step()->get_TopoDS_Shell();
     202         [ #  # ]:          0 :      B.Add(Co, *shell);
     203                 :            :   }
     204 [ #  # ][ #  # ]:          0 :   for(int i = 0; i < surfaces.size(); i ++)
     205                 :            :   {
     206 [ #  # ][ #  # ]:          0 :      TopoDS_Face * face = surfaces.get_and_step()->get_TopoDS_Face();
     207         [ #  # ]:          0 :      B.Add(Co, *face);
     208                 :            :   }
     209                 :            : 
     210 [ #  # ][ #  # ]:          0 :   TopoDS_Compound* new_top = new TopoDS_Compound(Co);
     211         [ #  # ]:          0 :   return new_top; 
     212                 :            : }
     213                 :            : 
     214 [ +  - ][ +  - ]:       4746 : OCCBody::~OCCBody() 
         [ +  - ][ +  - ]
                 [ +  - ]
     215                 :            : {
     216         [ +  + ]:       1582 :   if (myTopoDSShape)
     217                 :            :   {
     218         [ +  - ]:         97 :     myTopoDSShape->Nullify();
     219 [ +  - ][ +  - ]:         97 :     delete (TopoDS_Compound*)myTopoDSShape;
                 [ +  - ]
     220                 :         97 :     myTopoDSShape = NULL;
     221                 :            :   }
     222         [ -  + ]:       3164 : }
     223                 :            : 
     224                 :       3379 : GeometryQueryEngine* OCCBody::get_geometry_query_engine() const
     225                 :            : {
     226                 :       3379 :   return OCCQueryEngine::instance();
     227                 :            : }
     228                 :            : 
     229                 :       1809 : void OCCBody::append_simple_attribute_virt(const CubitSimpleAttrib &csa)
     230                 :            : { 
     231         [ +  + ]:       1809 :   if (myTopoDSShape != NULL)
     232                 :            :   {
     233                 :        140 :     OCCAttribSet::append_attribute(csa, *myTopoDSShape);
     234                 :        140 :     return;
     235                 :            :   }
     236                 :       1669 :   csa_list.append_unique(csa);
     237                 :            : }
     238                 :            :   
     239                 :      12757 : void OCCBody::remove_simple_attribute_virt(const CubitSimpleAttrib &csa)
     240                 :            : { 
     241         [ +  - ]:      12757 :   DLIList<Lump*> my_lumps;
     242 [ +  - ][ +  - ]:      12757 :   my_lumps = lumps();
                 [ +  - ]
     243 [ +  - ][ +  - ]:      25514 :   DLIList<OCCShell*> shells = this->shells();
                 [ -  + ]
     244 [ +  - ][ +  - ]:      25514 :   DLIList<OCCSurface*> surfaces = this->my_sheet_surfaces();
                 [ -  + ]
     245                 :            : 
     246         [ +  + ]:      12757 :   if (myTopoDSShape != NULL)
     247                 :            :   {
     248         [ +  - ]:        355 :     OCCAttribSet::remove_attribute(csa, *myTopoDSShape);
     249                 :        355 :     return;
     250                 :            :   }
     251                 :            :  
     252 [ +  - ][ +  + ]:      12402 :   else if (my_lumps.size() == 1)
     253                 :            :   {
     254 [ +  - ][ -  + ]:       9393 :     OCCLump* lump = CAST_TO(my_lumps.get(), OCCLump);
     255         [ +  - ]:       9393 :     TopoDS_Solid* solid = lump->get_TopoDS_Solid();
     256         [ +  - ]:       9393 :     OCCAttribSet::remove_attribute(csa, *solid);
     257 [ +  - ][ +  + ]:       9393 :     if(!csa.isEmpty())
     258         [ +  - ]:       5716 :       csa_list.remove(csa);
     259                 :            :     else
     260         [ +  - ]:       3677 :       csa_list.clean_out();
     261                 :       9393 :     return;
     262                 :            :   }
     263                 :            : 
     264 [ +  - ][ -  + ]:       3009 :   else if(shells.size() == 1)
     265                 :            :   {
     266 [ #  # ][ #  # ]:          0 :     TopoDS_Shell * shell = shells.get()->get_TopoDS_Shell();
     267         [ #  # ]:          0 :     OCCAttribSet::remove_attribute(csa, *shell);
     268 [ #  # ][ #  # ]:          0 :     if(!csa.isEmpty())
     269         [ #  # ]:          0 :       csa_list.remove(csa);
     270                 :            :     else
     271         [ #  # ]:          0 :       csa_list.clean_out();
     272                 :          0 :     return;
     273                 :            :   }
     274                 :            : 
     275 [ +  - ][ +  - ]:       3009 :   else if(surfaces.size() == 1)
     276                 :            :   {
     277 [ +  - ][ +  - ]:       3009 :     TopoDS_Face* surf = surfaces.get()->get_TopoDS_Face();
     278         [ +  - ]:       3009 :     OCCAttribSet::remove_attribute(csa, *surf);
     279 [ +  - ][ +  + ]:       3009 :     if(!csa.isEmpty())
     280         [ +  - ]:       1419 :       csa_list.remove(csa);
     281                 :            :     else
     282         [ +  - ]:       1590 :       csa_list.clean_out();
     283 [ +  - ][ -  + ]:      12757 :     return;
     284                 :      12757 :   } 
     285                 :            : }
     286                 :            : 
     287                 :            : 
     288                 :       5406 : void OCCBody::remove_all_simple_attribute_virt()
     289                 :            : {
     290         [ +  - ]:       5406 :   remove_simple_attribute_virt(CubitSimpleAttrib());
     291                 :       5406 : }
     292                 :            :   
     293                 :       3930 : CubitStatus OCCBody::get_simple_attribute(DLIList<CubitSimpleAttrib>& csas)
     294                 :            : { 
     295         [ +  + ]:       3930 :   if (myTopoDSShape != NULL)
     296                 :        194 :     return OCCAttribSet::get_attributes(*myTopoDSShape,csas);
     297                 :            : 
     298                 :            :   else
     299                 :       3736 :     csas = csa_list;
     300                 :       3736 :   return CUBIT_SUCCESS;
     301                 :            : }
     302                 :            : 
     303                 :      19936 : CubitStatus OCCBody::get_simple_attribute( const CubitString& name,
     304                 :            :                                           DLIList<CubitSimpleAttrib>& csas )
     305                 :            : { 
     306         [ +  + ]:      19936 :   if (myTopoDSShape != NULL)
     307                 :        944 :     return OCCAttribSet::get_attributes( name, *myTopoDSShape, csa_list );
     308                 :            : 
     309         [ +  + ]:      23825 :   for(int i = 0 ; i < csa_list.size(); i ++)
     310                 :            :   {
     311                 :       4833 :     const CubitSimpleAttrib& csa = csa_list.get_and_step();
     312         [ +  - ]:       4833 :     if(csa.string_data_list().size() > 0)
     313         [ +  + ]:       4833 :       if (csa.string_data_list()[0] == name)
     314                 :        618 :        csas.append(csa);
     315                 :            :   }
     316                 :      18992 :   return CUBIT_SUCCESS;
     317                 :            : }
     318                 :            : 
     319                 :          0 : CubitStatus OCCBody::get_transforms( CubitTransformMatrix &tfm )
     320                 :            : {
     321                 :          0 :   return CUBIT_SUCCESS;
     322                 :            : }
     323                 :            : 
     324                 :            : 
     325                 :            : //----------------------------------------------------------------
     326                 :            : // Function: copy
     327                 :            : // Description: create a new copy of the body.
     328                 :            : // Author: sjowen
     329                 :            : //----------------------------------------------------------------
     330                 :          0 : BodySM* OCCBody::copy()
     331                 :            : {
     332                 :          0 :   return (BodySM*)NULL;
     333                 :            : }
     334                 :            :     
     335                 :            : //----------------------------------------------------------------
     336                 :            : // Function: move
     337                 :            : // Description: translate the body and its child entities
     338                 :            : //
     339                 :            : // Author: Jane Hu
     340                 :            : //----------------------------------------------------------------
     341                 :        766 : CubitStatus OCCBody::move(double dx, double dy, double dz)
     342                 :            : {
     343 [ +  - ][ +  - ]:        766 :   double tol = OCCQueryEngine::instance()->get_sme_resabs_tolerance();
     344 [ +  + ][ +  + ]:        766 :   if(fabs(dx) < tol && fabs(dy) < tol && fabs(dz) < tol)
                 [ +  + ]
     345                 :         55 :     return CUBIT_SUCCESS;
     346                 :            : 
     347         [ +  - ]:        711 :   gp_Vec aVec(dx, dy, dz);
     348         [ +  - ]:        711 :   gp_Trsf aTrsf;
     349         [ +  - ]:        711 :   aTrsf.SetTranslation(aVec);
     350                 :            : 
     351         [ +  - ]:        711 :   BRepBuilderAPI_Transform aBRepTrsf(aTrsf);
     352                 :            : 
     353 [ +  - ][ +  - ]:        766 :   return transform(aBRepTrsf);
     354                 :            : }
     355                 :            : 
     356                 :            : 
     357                 :            : //----------------------------------------------------------------
     358                 :            : // Function: rotate
     359                 :            : // Description: rotate the body and its child entities
     360                 :            : //
     361                 :            : // Author: Jane Hu
     362                 :            : //----------------------------------------------------------------
     363                 :         11 : CubitStatus OCCBody::rotate( double x, double y, double z, 
     364                 :            :                              double angle )//in radians
     365                 :            : {
     366         [ +  - ]:         11 :   gp_Pnt aOrigin(0,0,0);
     367         [ +  - ]:         11 :   gp_Dir aDir(x, y, z);
     368         [ +  - ]:         11 :   gp_Ax1 anAxis(aOrigin, aDir);
     369                 :            : 
     370                 :            :   //a is angular value of rotation in radians
     371         [ +  - ]:         11 :   gp_Trsf aTrsf;
     372         [ +  - ]:         11 :   aTrsf.SetRotation(anAxis, angle);
     373                 :            : 
     374         [ +  - ]:         11 :   BRepBuilderAPI_Transform aBRepTrsf(aTrsf);
     375                 :            : 
     376 [ +  - ][ +  - ]:         11 :   return transform(aBRepTrsf);
     377                 :            : }
     378                 :            : 
     379                 :            : //----------------------------------------------------------------
     380                 :            : // Function: transform
     381                 :            : // Description: transform the body and its child entities
     382                 :            : //              use a transform matrix
     383                 :            : //
     384                 :            : // Author: Jane Hu
     385                 :            : //----------------------------------------------------------------
     386                 :        733 : CubitStatus OCCBody::transform(BRepBuilderAPI_Transform& aBRepTrsf)
     387                 :            : {
     388                 :            :   TopoDS_Shape * shape;
     389         [ +  - ]:        733 :   get_TopoDS_Shape(shape);
     390         [ +  - ]:        733 :   aBRepTrsf.Perform(*shape);
     391                 :            : 
     392         [ +  - ]:        733 :   update_OCC_entity(&aBRepTrsf);
     393                 :            :   // calculate for bounding box
     394         [ +  - ]:        733 :   update_bounding_box();
     395                 :            :   
     396                 :        733 :   return CUBIT_SUCCESS;
     397                 :            : }
     398                 :            : 
     399                 :            : //----------------------------------------------------------------
     400                 :            : // Function: scale
     401                 :            : // Description: scale the body and its child entities
     402                 :            : //              use a constant scale factor
     403                 :            : //
     404                 :            : // Author: Jane Hu
     405                 :            : //----------------------------------------------------------------
     406                 :          0 : CubitStatus OCCBody::scale(double scale_factor )
     407                 :            : {
     408         [ #  # ]:          0 :   gp_Trsf aTrsf;
     409         [ #  # ]:          0 :   aTrsf.SetScaleFactor(scale_factor);
     410                 :            : 
     411         [ #  # ]:          0 :   BRepBuilderAPI_Transform aBRepTrsf(aTrsf);
     412         [ #  # ]:          0 :   CubitStatus stat = transform(aBRepTrsf);
     413         [ #  # ]:          0 :   return stat;
     414                 :            : }
     415                 :            : 
     416                 :            : //----------------------------------------------------------------
     417                 :            : // Function: scale
     418                 :            : // Description: deforming transformation of the body and its child entities
     419                 :            : // Author: Jane Hu 
     420                 :            : //----------------------------------------------------------------
     421                 :         11 : CubitStatus OCCBody::scale(double scale_factor_x,
     422                 :            :                            double scale_factor_y,
     423                 :            :                            double scale_factor_z )
     424                 :            : {
     425         [ +  - ]:         11 :   gp_GTrsf gTrsf; 
     426         [ +  - ]:         11 :   gTrsf.SetValue(1,1, scale_factor_x);
     427         [ +  - ]:         11 :   gTrsf.SetValue(2,2, scale_factor_y);
     428         [ +  - ]:         11 :   gTrsf.SetValue(3,3, scale_factor_z);
     429                 :            : 
     430         [ +  - ]:         11 :   BRepBuilderAPI_GTransform gBRepTrsf(gTrsf);
     431                 :            : 
     432                 :            :   TopoDS_Shape * shape;
     433         [ +  - ]:         11 :   get_TopoDS_Shape(shape);
     434         [ +  - ]:         11 :   gBRepTrsf.Perform(*shape);
     435                 :            : 
     436         [ +  - ]:         11 :   update_OCC_entity(&gBRepTrsf);
     437                 :            :   // calculate for bounding box
     438         [ +  - ]:         11 :   update_bounding_box();
     439                 :            : 
     440         [ +  - ]:         11 :   return CUBIT_SUCCESS;
     441                 :            : }
     442                 :            : 
     443                 :            : //----------------------------------------------------------------
     444                 :            : // Function: reflect
     445                 :            : // Description: reflect the body about an plane given the normal
     446                 :            : //              vector.
     447                 :            : //
     448                 :            : // Author: Jane Hu
     449                 :            : //----------------------------------------------------------------
     450                 :         11 : CubitStatus OCCBody::reflect( double reflect_axis_x,
     451                 :            :                               double reflect_axis_y,
     452                 :            :                               double reflect_axis_z )
     453                 :            : {
     454         [ +  - ]:         11 :   gp_Pnt aOrigin(0,0,0);
     455         [ +  - ]:         11 :   gp_Dir aDir(reflect_axis_x, reflect_axis_y,reflect_axis_z); 
     456         [ +  - ]:         11 :   gp_Ax2 anAx2(aOrigin, aDir);
     457                 :            : 
     458         [ +  - ]:         11 :   gp_Trsf aTrsf;
     459         [ +  - ]:         11 :   aTrsf.SetMirror(anAx2);
     460                 :            : 
     461         [ +  - ]:         11 :   BRepBuilderAPI_Transform aBRepTrsf(aTrsf);
     462 [ +  - ][ +  - ]:         11 :   return transform(aBRepTrsf);
     463                 :            : }
     464                 :            : 
     465                 :            : //----------------------------------------------------------------
     466                 :            : // Function: private function to update the core compound and      
     467                 :            : //           for any movement of the body.
     468                 :            : // Note:     input shape must have the same number of Compound
     469                 :            : //           as the body's lumps number.
     470                 :            : // Author: Jane Hu
     471                 :            : //----------------------------------------------------------------
     472                 :        744 : CubitStatus OCCBody::update_OCC_entity( BRepBuilderAPI_ModifyShape *aBRepTrsf,
     473                 :            :                                        BRepAlgoAPI_BooleanOperation *op) 
     474                 :            : {
     475 [ -  + ][ #  # ]:        744 :   assert(aBRepTrsf != NULL || op != NULL);
     476                 :            : 
     477         [ +  - ]:        744 :   TopoDS_Compound compsolid;
     478 [ +  - ][ +  - ]:       1488 :   TopoDS_Shape shape;
     479 [ +  - ][ +  - ]:        744 :   shape = aBRepTrsf->Shape();
     480 [ +  - ][ -  + ]:        744 :   if(aBRepTrsf && myTopoDSShape)
     481                 :            :   {
     482 [ #  # ][ #  # ]:          0 :     compsolid = TopoDS::Compound(shape);
     483                 :            :   
     484 [ #  # ][ #  # ]:          0 :     if(OCCQueryEngine::instance()->OCCMap->IsBound(*myTopoDSShape) )
                 [ #  # ]
     485 [ #  # ][ #  # ]:          0 :        OCCQueryEngine::instance()->update_OCC_map(*myTopoDSShape, shape);
     486 [ #  # ][ #  # ]:          0 :     else if (!shape.IsEqual(*myTopoDSShape))
     487         [ #  # ]:          0 :        set_TopoDS_Shape(compsolid);
     488                 :            :   }
     489                 :            : 
     490                 :            :   //Boolean operation works only on one lump body
     491                 :            :   //set the lumps
     492 [ +  - ][ +  - ]:       1488 :   DLIList<Lump *> lumps;
     493 [ +  - ][ +  - ]:        744 :   lumps = this->lumps();
                 [ +  - ]
     494 [ +  - ][ +  + ]:       1488 :   for (int i = 1; i <= lumps.size(); i++)
     495                 :            :   {
     496 [ +  - ][ -  + ]:        744 :      OCCLump *lump = CAST_TO(lumps.get_and_step(), OCCLump);
     497         [ +  - ]:        744 :      lump->update_OCC_entity(aBRepTrsf, op);
     498                 :            :   }
     499                 :            : 
     500 [ +  - ][ -  + ]:        744 :   for(int i = 0; i < mySheetSurfaces.size(); i++)
     501                 :            :   {
     502         [ #  # ]:          0 :     OCCSurface* surface = mySheetSurfaces.get_and_step();
     503         [ #  # ]:          0 :     surface->update_OCC_entity(aBRepTrsf, op);
     504                 :            :   }
     505 [ +  - ][ -  + ]:        744 :   for(int i = 0; i <myShells.size() ; i++)
     506                 :            :   {
     507         [ #  # ]:          0 :     OCCShell* occ_shell = myShells.get_and_step();
     508         [ #  # ]:          0 :     occ_shell->update_OCC_entity(aBRepTrsf,op);
     509                 :            :   }
     510                 :            : 
     511 [ +  - ][ +  - ]:        744 :   if (aBRepTrsf && !compsolid.IsNull())
         [ -  + ][ -  + ]
     512         [ #  # ]:          0 :     set_TopoDS_Shape(compsolid);
     513                 :            : 
     514         [ +  - ]:        744 :   update_bounding_box(); 
     515                 :            : 
     516                 :            :   //unset marks.
     517 [ +  - ][ +  - ]:       1488 :   DLIList<OCCCurve*> curves;
     518 [ +  - ][ +  - ]:       1488 :   DLIList<OCCPoint*> points;
     519         [ +  - ]:        744 :   get_all_curves(curves);
     520         [ +  - ]:        744 :   get_all_points(points);
     521                 :            : 
     522 [ +  - ][ +  + ]:       7442 :   for(int i = 0; i < curves.size(); i++)
     523 [ +  - ][ +  - ]:       6698 :     curves.get_and_step()->set_myMarked(CUBIT_FALSE);
     524                 :            : 
     525 [ +  - ][ +  + ]:       5340 :   for(int i = 0; i < points.size(); i++)
     526 [ +  - ][ +  - ]:       4596 :     points.get_and_step()->set_myMarked(CUBIT_FALSE);
     527         [ +  - ]:        744 :   return CUBIT_SUCCESS;
     528                 :            : }
     529                 :            : 
     530                 :            : //----------------------------------------------------------------
     531                 :            : // Function: TopoDS_Shape level function to update the core Body
     532                 :            : //           for any Boolean operation of the body.
     533                 :            : // Author: Jane Hu
     534                 :            : //----------------------------------------------------------------
     535                 :         22 : CubitStatus OCCBody::update_OCC_entity(TopoDS_Shape& old_shape,
     536                 :            :                                        TopoDS_Shape& new_shape,
     537                 :            :                                        BRepBuilderAPI_MakeShape *op,
     538                 :            :                                        LocOpe_SplitShape* sp)
     539                 :            : {
     540                 :            :   //set the Shells
     541         [ +  - ]:         22 :   TopTools_IndexedMapOfShape M;
     542         [ +  - ]:         22 :   TopExp::MapShapes(old_shape, TopAbs_SOLID, M);
     543 [ +  - ][ +  - ]:         44 :   TopTools_IndexedMapOfShape M_new;
     544         [ +  - ]:         22 :   TopExp::MapShapes(new_shape, TopAbs_SOLID, M_new);
     545 [ +  - ][ +  - ]:         44 :   TopTools_ListOfShape shapes;
     546 [ +  - ][ +  - ]:         44 :   TopoDS_Shape shape;
     547                 :            : 
     548                 :         22 :   CubitBoolean updated = CUBIT_FALSE;   
     549 [ +  - ][ +  - ]:         88 :   if(!old_shape.IsNull() && old_shape.ShapeType() == TopAbs_COMPOUND && 
         [ +  - ][ +  - ]
                 [ +  - ]
     550 [ +  - ][ +  - ]:         88 :      !new_shape.IsNull() && new_shape.ShapeType() == TopAbs_COMPOUND &&
         [ +  - ][ +  - ]
                 [ +  - ]
     551         [ +  - ]:         22 :      !old_shape.IsSame(new_shape))
     552                 :            :   {
     553                 :            :     //By updating underling solids, shells etc., the old_shape will get changed.
     554                 :            :     //trying to make sure the the number of each entity in the old and new 
     555                 :            :     //shapes are the same, which means that nothing is delete, that we can 
     556                 :            :     //update the map here. Otherwise, when deleting solids, it'll delete the
     557                 :            :     //the old body and create new body. This is Ok for general boolean operation    //except imprint when booleans are called, usually the original body are
     558                 :            :     // supposed to be kept. 
     559                 :         22 :     updated = CUBIT_TRUE;
     560 [ +  - ][ +  - ]:         22 :     OCCQueryEngine::instance()->update_OCC_map(old_shape, new_shape);
     561                 :            :   }
     562                 :            :  
     563 [ +  - ][ +  - ]:         44 :   DLIList<int> new_solid_nums;
     564 [ +  - ][ +  - ]:         44 :   DLIList<int> unfound_nums;
     565 [ +  - ][ +  + ]:         66 :   for(int ii=1; ii<=M.Extent(); ii++)
     566                 :            :   {
     567 [ +  - ][ +  - ]:         44 :     TopoDS_Solid solid = TopoDS::Solid(M(ii));
                 [ +  - ]
     568                 :            : 
     569 [ +  - ][ +  - ]:         88 :     TopTools_ListOfShape shapes;
                 [ +  - ]
     570         [ +  - ]:         44 :     if(op)
     571                 :            :     {
     572 [ +  - ][ +  - ]:         44 :       shapes.Assign(op->Modified(solid));
     573 [ +  - ][ +  - ]:         44 :       if(shapes.Extent() == 0)
     574 [ +  - ][ +  - ]:         44 :          shapes.Assign(op->Generated(solid));
     575                 :            :     }
     576         [ #  # ]:          0 :     else if(sp)
     577 [ #  # ][ #  # ]:          0 :       shapes.Assign(sp->DescendantShapes(solid));
     578                 :            : 
     579 [ +  - ][ -  + ]:         44 :     if (shapes.Extent() == 1)
     580 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
     581                 :            : 
     582 [ +  - ][ -  + ]:         44 :     else if(shapes.Extent() > 1)
     583                 :            :     {
     584                 :            :       //update all attributes first.
     585         [ #  # ]:          0 :       TopTools_ListIteratorOfListOfShape it;
     586         [ #  # ]:          0 :       it.Initialize(shapes);
     587 [ #  # ][ #  # ]:          0 :       for(; it.More(); it.Next())
                 [ #  # ]
     588                 :            :       {
     589 [ #  # ][ #  # ]:          0 :         shape = it.Value();
     590 [ #  # ][ #  # ]:          0 :         OCCQueryEngine::instance()->copy_attributes(solid, shape);
     591                 :            :       } 
     592 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
     593                 :            :     }
     594                 :            : 
     595 [ +  - ][ +  - ]:         44 :     else if(op->IsDeleted(solid))
     596                 :            :     {
     597 [ +  - ][ +  - ]:         44 :        if (M_new.Extent()== 1 && ii == 1)
         [ +  + ][ +  + ]
     598 [ +  - ][ +  - ]:         22 :          shape = M_new(1);
     599 [ +  - ][ +  - ]:         22 :        else if(M_new.Extent()== 1 && ii > 1)
         [ +  - ][ +  - ]
     600         [ +  - ]:         22 :          shape.Nullify();
     601 [ #  # ][ #  # ]:          0 :        else if(M_new.Extent() > 1)
     602                 :            :        {
     603         [ #  # ]:          0 :          GProp_GProps myProps;
     604         [ #  # ]:          0 :          BRepGProp::VolumeProperties(solid, myProps);
     605         [ #  # ]:          0 :          double bf_mass = myProps.Mass();
     606         [ #  # ]:          0 :          gp_Pnt old_center = myProps.CentreOfMass();
     607                 :          0 :          CubitBoolean found = CUBIT_FALSE;
     608 [ #  # ][ #  # ]:          0 :          for(int l = 1; l <= M_new.Extent(); l++)
     609                 :            :          {
     610 [ #  # ][ #  # ]:          0 :            BRepGProp::VolumeProperties(M_new(l), myProps);
     611         [ #  # ]:          0 :            double af_mass = myProps.Mass();
     612 [ #  # ][ #  # ]:          0 :            double dTol = OCCQueryEngine::instance()->get_sme_resabs_tolerance();
     613         [ #  # ]:          0 :            if(fabs(bf_mass-af_mass) < dTol) //unchanged
     614                 :            :            {
     615         [ #  # ]:          0 :              gp_Pnt  new_center = myProps.CentreOfMass(); 
     616 [ #  # ][ #  # ]:          0 :              if(new_center.IsEqual(old_center, dTol))
     617                 :            :              {
     618                 :          0 :                found = CUBIT_TRUE;
     619 [ #  # ][ #  # ]:          0 :                shape = M_new(l);
     620         [ #  # ]:          0 :                new_solid_nums.append(l);
     621                 :          0 :                break;
     622                 :            :              }
     623                 :            :            }
     624                 :            :          }
     625         [ #  # ]:          0 :          if(!found)
     626                 :            :          {
     627         [ #  # ]:          0 :            unfound_nums.append(ii); 
     628                 :          0 :            continue;
     629                 :            :          }
     630                 :            :        }
     631                 :            :        else
     632         [ #  # ]:         44 :          shape.Nullify();
     633                 :            :     }
     634                 :            :     else
     635                 :            :     {
     636         [ #  # ]:          0 :        shape = solid;
     637                 :          0 :        continue;
     638                 :            :     }
     639                 :            : 
     640 [ +  - ][ +  - ]:         44 :     if(shapes.Extent() > 0 || (op && op->IsDeleted(solid)))
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     641 [ +  - ][ +  - ]:         44 :       OCCLump::update_OCC_entity(solid, shape, op, sp);
                 [ +  - ]
     642                 :         44 :   }
     643                 :            : 
     644 [ +  - ][ -  + ]:         22 :   if( unfound_nums.size() == 1 )
     645                 :            :   {
     646 [ #  # ][ #  # ]:          0 :     TopoDS_Solid solid = TopoDS::Solid(M(unfound_nums.get()));
         [ #  # ][ #  # ]
     647 [ #  # ][ #  # ]:          0 :     for(int kk = 1; kk <= M_new.Extent(); kk++)
     648                 :            :     {
     649 [ #  # ][ #  # ]:          0 :       if(!new_solid_nums.move_to(kk))
     650                 :            :       {
     651 [ #  # ][ #  # ]:          0 :         shape = M_new(kk);
     652                 :          0 :         break;
     653                 :            :       } 
     654                 :            :     }
     655 [ #  # ][ #  # ]:          0 :     OCCLump::update_OCC_entity(solid, shape, op, sp);
     656                 :            :   }
     657 [ +  - ][ -  + ]:         22 :   else if(unfound_nums.size() > 1)
     658                 :            :   {
     659         [ #  # ]:          0 :     shape.Nullify();
     660 [ #  # ][ #  # ]:          0 :     for(int kk = 1; kk <=unfound_nums.size(); kk++)
     661                 :            :     {
     662 [ #  # ][ #  # ]:          0 :        TopoDS_Solid solid = TopoDS::Solid(M(unfound_nums.get_and_step()));
         [ #  # ][ #  # ]
     663         [ #  # ]:          0 :        OCCLump::update_OCC_entity(solid, shape, op, sp);
     664         [ #  # ]:          0 :     }
     665                 :            :   } 
     666 [ +  - ][ +  - ]:         22 :   if(!old_shape.IsSame(new_shape) && !updated)
         [ -  + ][ -  + ]
     667 [ #  # ][ #  # ]:          0 :     OCCQueryEngine::instance()->update_OCC_map(old_shape, new_shape);
     668         [ +  - ]:         22 :   return CUBIT_SUCCESS;
     669                 :            : }
     670                 :            : //----------------------------------------------------------------
     671                 :            : // Function: update_bounding_box
     672                 :            : // Description: calculate for bounding box of this OCCBody
     673                 :            : //
     674                 :            : // Author: janehu
     675                 :            : //----------------------------------------------------------------
     676                 :       4138 : void OCCBody::update_bounding_box() 
     677                 :            : {
     678         [ +  - ]:       4138 :   Bnd_Box box;
     679         [ +  - ]:       4138 :   TopoDS_Shape shape;
     680                 :            :     
     681 [ +  - ][ +  + ]:       7560 :   for (int i = 0; i <  myLumps.size(); i++)
     682                 :            :   {
     683 [ +  - ][ -  + ]:       3422 :      OCCLump *lump = CAST_TO(myLumps.get_and_step(), OCCLump);
     684 [ +  - ][ +  - ]:       3422 :      shape = *lump->get_TopoDS_Solid();
     685         [ +  - ]:       3422 :      BRepBndLib::Add(shape, box);
     686                 :            :   }
     687                 :            : 
     688 [ +  - ][ +  + ]:       4757 :   for(int i = 0; i < mySheetSurfaces.size(); i++)
     689                 :            :   {
     690         [ +  - ]:        619 :     OCCSurface* surface = mySheetSurfaces.get_and_step();
     691 [ +  - ][ +  - ]:        619 :     shape = *surface->get_TopoDS_Face();
     692         [ +  - ]:        619 :     BRepBndLib::Add(shape, box);
     693                 :            :   }
     694                 :            : 
     695 [ +  - ][ -  + ]:       4138 :   for(int i = 0; i <myShells.size() ; i++)
     696                 :            :   {
     697         [ #  # ]:          0 :     OCCShell* occ_shell = myShells.get_and_step();
     698 [ #  # ][ #  # ]:          0 :     shape = *occ_shell->get_TopoDS_Shell();
     699         [ #  # ]:          0 :     BRepBndLib::Add(shape, box);
     700                 :            :   }
     701                 :            :  
     702                 :            :   //calculate the bounding box
     703 [ +  - ][ +  - ]:       4138 :   if(myLumps.size() + mySheetSurfaces.size() + myShells.size() == 0)
         [ +  - ][ +  + ]
     704                 :            :   {
     705         [ -  + ]:         97 :     if(!myTopoDSShape)
     706                 :       4138 :       return;
     707         [ +  - ]:         97 :     TopoDS_Shape shape = *myTopoDSShape;
     708 [ +  - ][ +  - ]:         97 :     BRepBndLib::Add(shape, box);
     709                 :            :   }
     710                 :            :   
     711                 :            :   double min[3], max[3];
     712                 :            : 
     713                 :            :   //get values
     714         [ +  - ]:       4138 :   box.Get(min[0], min[1], min[2], max[0], max[1], max[2]);
     715                 :            : 
     716                 :            :   //update boundingbox.
     717 [ +  - ][ +  - ]:       4138 :   boundingbox.reset(min, max);
                 [ +  - ]
     718                 :            : }
     719                 :            : 
     720                 :            : //----------------------------------------------------------------
     721                 :            : // Function: get_bounding_box
     722                 :            : // Description: get the  bounding box of this OCCBody
     723                 :            : //
     724                 :            : // Author: janehu
     725                 :            : //----------------------------------------------------------------
     726                 :        227 : CubitBox OCCBody::get_bounding_box()
     727                 :            : {
     728                 :        227 :   return boundingbox ;
     729                 :            : }
     730                 :            : 
     731                 :          0 : void OCCBody::get_parents_virt( DLIList<TopologyBridge*>& ) 
     732                 :          0 :   {}
     733                 :            :   
     734                 :      21805 : void OCCBody::get_children_virt( DLIList<TopologyBridge*>& lumps )
     735                 :            : {
     736         [ +  + ]:      26548 :   for(int i = 0; i < mySheetSurfaces.size(); i++) 
     737                 :            :   { 
     738                 :       4743 :     OCCSurface* surface = mySheetSurfaces.get_and_step();
     739         [ +  - ]:       4743 :     lumps.append(surface->my_lump());
     740                 :            :   }
     741                 :            : 
     742         [ -  + ]:      21805 :   for(int i = 0; i <myShells.size() ; i++)
     743                 :            :   {
     744                 :          0 :     OCCShell* occ_shell = myShells.get_and_step();
     745         [ #  # ]:          0 :     lumps.append(occ_shell->my_lump());
     746                 :            :   }
     747                 :            : 
     748         [ +  + ]:      40997 :   for(int i = 0; i <myLumps.size(); i++)
     749         [ +  - ]:      19192 :     lumps.append( myLumps.get_and_step()); 
     750                 :      21805 :   return;
     751                 :            : }
     752                 :            : 
     753                 :            : //-------------------------------------------------------------------------
     754                 :            : // Purpose       : Find centroid and volume for lumps and shells
     755                 :            : //
     756                 :            : // Special Notes : 
     757                 :            : //
     758                 :            : // Author       : Jane Hu  
     759                 :            : //
     760                 :            : // Creation Date : 11/30/07
     761                 :            : //-------------------------------------------------------------------------
     762                 :         11 : CubitStatus OCCBody::mass_properties( CubitVector& centroid, 
     763                 :            :                                       double& volume )
     764                 :            : {
     765 [ +  - ][ +  - ]:         11 :   if( myShells.size() == 0 && myLumps.size() == 0)
         [ +  - ][ -  + ]
                 [ -  + ]
     766                 :          0 :     return CUBIT_FAILURE;
     767         [ +  - ]:         11 :   GProp_GProps myProps;
     768                 :         11 :   TopoDS_Shape* pshape = myTopoDSShape;
     769 [ -  + ][ #  # ]:         11 :   if(!pshape || pshape->IsNull())//single lump or shell or surface
         [ #  # ][ +  - ]
     770                 :            :   {
     771         [ +  - ]:         11 :     DLIList<Lump*> lumps = this->lumps();
     772 [ +  - ][ +  - ]:         11 :     if (lumps.size() > 0)
     773 [ +  - ][ -  + ]:         11 :       pshape = CAST_TO(lumps.get(), OCCLump)->get_TopoDS_Solid();
         [ +  - ][ +  - ]
     774                 :            :   } 
     775 [ +  - ][ +  - ]:         11 :   if(!pshape || pshape->IsNull())
         [ -  + ][ -  + ]
     776                 :          0 :     return CUBIT_FAILURE;
     777                 :            :  
     778         [ +  - ]:         11 :   BRepGProp::VolumeProperties(*pshape, myProps);
     779         [ +  - ]:         11 :   volume = myProps.Mass();
     780         [ +  - ]:         11 :   gp_Pnt pt = myProps.CentreOfMass(); 
     781 [ +  - ][ +  - ]:         11 :   centroid.set(pt.X(), pt.Y(), pt.Z());
         [ +  - ][ +  - ]
     782                 :         11 :   return CUBIT_SUCCESS;
     783                 :            : }
     784                 :            : 
     785                 :            : //-------------------------------------------------------------------------
     786                 :            : // Purpose       : Used to be OCCQueryEngine::is_point_in_body
     787                 :            : //
     788                 :            : // Special Notes : 
     789                 :            : //
     790                 :            : // Creator       : Jason Kraftcheck
     791                 :            : //
     792                 :            : // Creation Date : 05/10/04
     793                 :            : //-------------------------------------------------------------------------
     794                 :          0 : CubitPointContainment OCCBody::point_containment( const CubitVector &point, double /*tolerance*/ )
     795                 :            : {
     796                 :            :   CubitPointContainment pc_value;
     797                 :            :   OCCLump *lump;
     798                 :            : 
     799                 :            :   int i;
     800         [ #  # ]:          0 :   for( i=myLumps.size(); i--;)
     801                 :            :   {
     802         [ #  # ]:          0 :     lump = dynamic_cast<OCCLump*>(myLumps.get_and_step()); 
     803                 :          0 :     pc_value = lump->point_containment( point );
     804         [ #  # ]:          0 :     if( pc_value == CUBIT_PNT_INSIDE )
     805                 :          0 :       return CUBIT_PNT_INSIDE;
     806         [ #  # ]:          0 :     else if( pc_value == CUBIT_PNT_BOUNDARY )
     807                 :          0 :       return CUBIT_PNT_BOUNDARY;
     808                 :            :   }
     809                 :            : 
     810         [ #  # ]:          0 :   for(int i = 0; i < mySheetSurfaces.size(); i++)
     811                 :            :   {
     812                 :          0 :     OCCSurface* surface = mySheetSurfaces.get_and_step();
     813                 :          0 :     pc_value = surface->point_containment( point );
     814         [ #  # ]:          0 :     if( pc_value == CUBIT_PNT_INSIDE )
     815                 :          0 :       return CUBIT_PNT_INSIDE;
     816         [ #  # ]:          0 :     else if( pc_value == CUBIT_PNT_BOUNDARY )
     817                 :          0 :       return CUBIT_PNT_BOUNDARY;
     818                 :            :   }
     819                 :            : 
     820         [ #  # ]:          0 :   for(int i = 0; i <myShells.size() ; i++)
     821                 :            :   {
     822         [ #  # ]:          0 :     OCCShell* occ_shell = myShells.get_and_step();
     823         [ #  # ]:          0 :     DLIList<TopologyBridge*> children;
     824         [ #  # ]:          0 :     occ_shell->get_children_virt(children);
     825 [ #  # ][ #  # ]:          0 :     for(int j = 0; j < children.size(); j++)
         [ #  # ][ #  # ]
     826                 :            :     {
     827 [ #  # ][ #  # ]:          0 :       OCCSurface* surface = CAST_TO(children.get_and_step(), OCCSurface); 
     828         [ #  # ]:          0 :       pc_value = surface->point_containment( point );
     829         [ #  # ]:          0 :       if( pc_value == CUBIT_PNT_INSIDE )
     830                 :          0 :         return CUBIT_PNT_INSIDE;
     831         [ #  # ]:          0 :       else if( pc_value == CUBIT_PNT_BOUNDARY )
     832                 :          0 :         return CUBIT_PNT_BOUNDARY;
     833                 :            :     } 
     834                 :          0 :   }
     835                 :          0 :   return CUBIT_PNT_OUTSIDE;
     836                 :            : }
     837                 :            : 
     838                 :            : //-------------------------------------------------------------------------
     839                 :            : // Purpose       : return all surfaces in this body. 
     840                 :            : //
     841                 :            : // Special Notes :
     842                 :            : //
     843                 :            : // Creator       : Jane Hu
     844                 :            : //
     845                 :            : // Creation Date : 01/10/08
     846                 :            : //-------------------------------------------------------------------------
     847                 :            : 
     848                 :       1400 : void OCCBody::get_all_surfaces(DLIList<OCCSurface*> &surfaces)
     849                 :            : {
     850                 :            :   TopoDS_Shape *shape;
     851         [ +  - ]:       1400 :   get_TopoDS_Shape(shape);
     852                 :            : 
     853         [ +  - ]:       1400 :   TopTools_IndexedMapOfShape M;
     854         [ +  - ]:       1400 :   TopExp::MapShapes(*shape, TopAbs_FACE, M);
     855                 :            :   int ii;
     856 [ +  - ][ +  + ]:      12974 :   for (ii=1; ii<=M.Extent(); ii++) {
     857 [ +  - ][ +  - ]:      11574 :        TopologyBridge *face = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
                 [ +  - ]
     858         [ -  + ]:      11574 :        OCCSurface* occ_face = CAST_TO(face, OCCSurface);
     859         [ +  - ]:      11574 :        if (occ_face)
     860         [ +  - ]:      11574 :          surfaces.append_unique(occ_face);
     861         [ +  - ]:       1400 :   }
     862                 :       1400 : }
     863                 :            : 
     864                 :            : //-------------------------------------------------------------------------
     865                 :            : // Purpose       : return all curves in this body.
     866                 :            : //
     867                 :            : // Special Notes :
     868                 :            : //
     869                 :            : // Creator       : Jane Hu
     870                 :            : //
     871                 :            : // Creation Date : 01/10/08
     872                 :            : //-------------------------------------------------------------------------
     873                 :            : 
     874                 :       1072 : void OCCBody::get_all_curves(DLIList<OCCCurve*> &curves)
     875                 :            : {
     876                 :            :   TopoDS_Shape *shape;
     877         [ +  - ]:       1072 :   get_TopoDS_Shape(shape);
     878                 :            : 
     879         [ +  - ]:       1072 :   TopTools_IndexedMapOfShape M;
     880         [ +  - ]:       1072 :   TopExp::MapShapes(*shape, TopAbs_EDGE, M);
     881                 :            :   int ii;
     882 [ +  - ][ +  + ]:      16204 :   for (ii=1; ii<=M.Extent(); ii++) {
     883 [ +  - ][ +  - ]:      15132 :        TopologyBridge *curve = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
                 [ +  - ]
     884         [ +  + ]:      15132 :        OCCCurve* occ_curve = CAST_TO(curve, OCCCurve);
     885         [ +  + ]:      15132 :        if (occ_curve)
     886         [ +  - ]:      14056 :          curves.append_unique(occ_curve);
     887         [ +  - ]:       1072 :   }
     888                 :       1072 : }
     889                 :            : 
     890                 :            : //-------------------------------------------------------------------------
     891                 :            : // Purpose       : return all points in this body.
     892                 :            : //
     893                 :            : // Special Notes :
     894                 :            : //
     895                 :            : // Creator       : Jane Hu
     896                 :            : //
     897                 :            : // Creation Date : 01/10/08
     898                 :            : //-------------------------------------------------------------------------
     899                 :            : 
     900                 :       1072 : void OCCBody::get_all_points(DLIList<OCCPoint*> &points)
     901                 :            : {
     902                 :            :   TopoDS_Shape *shape;
     903         [ +  - ]:       1072 :   get_TopoDS_Shape(shape);
     904                 :            : 
     905         [ +  - ]:       1072 :   TopTools_IndexedMapOfShape M;
     906         [ +  - ]:       1072 :   TopExp::MapShapes(*shape, TopAbs_VERTEX, M);
     907                 :            :   int ii;
     908 [ +  - ][ +  + ]:      10720 :   for (ii=1; ii<=M.Extent(); ii++) {
     909 [ +  - ][ +  - ]:       9648 :        TopologyBridge *vertex = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
                 [ +  - ]
     910         [ -  + ]:       9648 :        OCCPoint* occ_point = CAST_TO(vertex, OCCPoint);
     911         [ +  - ]:       9648 :        if (occ_point)
     912         [ +  - ]:       9648 :          points.append_unique(occ_point);
     913                 :            :   }
     914                 :            : 
     915 [ +  - ][ +  - ]:       2144 :   DLIList<OCCSurface*> surfaces;
     916         [ +  - ]:       1072 :   this->get_all_surfaces(surfaces);
     917 [ +  - ][ +  + ]:       8654 :   for(int i = 0; i < surfaces.size(); i++)
     918                 :            :   {
     919         [ +  - ]:       7582 :     OCCSurface* occ_surf = surfaces.get_and_step();
     920 [ +  - ][ +  - ]:       7582 :     points += occ_surf->get_hardpoints();
                 [ +  - ]
     921         [ +  - ]:       1072 :   }
     922 [ +  - ][ +  - ]:       7436 : }
     923                 :            : 

Generated by: LCOV version 1.11