LCOV - code coverage report
Current view: top level - geom/OCC - OCCLump.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 159 230 69.1 %
Date: 2020-06-30 00:58:45 Functions: 18 20 90.0 %
Branches: 235 630 37.3 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : OCCLump.cpp
       3                 :            : //
       4                 :            : // Purpose       : 
       5                 :            : //
       6                 :            : // Creator       : David White
       7                 :            : //
       8                 :            : // Creation Date : 7/18/2000
       9                 :            : //
      10                 :            : //-------------------------------------------------------------------------
      11                 :            : 
      12                 :            : // ********** BEGIN STANDARD INCLUDES      **********
      13                 :            : #include <assert.h>
      14                 :            : // ********** END STANDARD INCLUDES        **********
      15                 :            : // ********** BEGIN CUBIT INCLUDES         **********
      16                 :            : #include "OCCQueryEngine.hpp"
      17                 :            : #include "OCCLump.hpp"
      18                 :            : #include "CastTo.hpp"
      19                 :            : #include "Surface.hpp"
      20                 :            : #include "DLIList.hpp"
      21                 :            : #include "CubitVector.hpp"
      22                 :            : #include "CubitString.hpp"
      23                 :            : #include "ShellSM.hpp"
      24                 :            : #include "BodySM.hpp"
      25                 :            : #include "Body.hpp"
      26                 :            : 
      27                 :            : #include "OCCBody.hpp"
      28                 :            : #include "OCCShell.hpp"
      29                 :            : #include "OCCSurface.hpp"
      30                 :            : #include "OCCLoop.hpp"
      31                 :            : #include "OCCCoEdge.hpp"
      32                 :            : #include "OCCCurve.hpp"
      33                 :            : #include "OCCPoint.hpp"
      34                 :            : #include "OCCAttribSet.hpp"
      35                 :            : 
      36                 :            : #include <TopExp.hxx>
      37                 :            : #include <TopTools_IndexedMapOfShape.hxx>
      38                 :            : #include "BRepBuilderAPI_Transform.hxx"
      39                 :            : #include "BRepBuilderAPI_GTransform.hxx"
      40                 :            : #include "TopTools_DataMapOfShapeInteger.hxx"
      41                 :            : #include "TopTools_ListIteratorOfListOfShape.hxx"
      42                 :            : #include "BRepAlgoAPI_BooleanOperation.hxx"
      43                 :            : #include "BRepBuilderAPI_MakeShape.hxx"
      44                 :            : #include "BRepBuilderAPI_ModifyShape.hxx"
      45                 :            : #include "Bnd_Box.hxx"
      46                 :            : #include "BRepBndLib.hxx"
      47                 :            : #include "GProp_GProps.hxx"
      48                 :            : #include "BRepGProp.hxx"
      49                 :            : #include "BRepClass3d_SolidExplorer.hxx"
      50                 :            : #include "BRepClass3d_SClassifier.hxx"
      51                 :            : #include "TopExp_Explorer.hxx"
      52                 :            : #include "TopoDS.hxx"
      53                 :            : #include "BRep_Tool.hxx"
      54                 :            : #include "LocOpe_SplitShape.hxx"
      55                 :            : // ********** END CUBIT INCLUDES           **********
      56                 :            : 
      57                 :            : // ********** BEGIN FORWARD DECLARATIONS   **********
      58                 :            : class RefVolume;
      59                 :            : // ********** END FORWARD DECLARATIONS     **********
      60                 :            : 
      61                 :            : // ********** BEGIN STATIC DECLARATIONS    **********
      62                 :            : // ********** END STATIC DECLARATIONS      **********
      63                 :            : 
      64                 :            : // ********** BEGIN PUBLIC FUNCTIONS       **********
      65                 :            : 
      66                 :            : //-------------------------------------------------------------------------
      67                 :            : // Purpose       : The constructor with a pointer to TopoDS_Solid
      68                 :            : //
      69                 :            : // Special Notes :
      70                 :            : //
      71                 :            : //-------------------------------------------------------------------------
      72                 :       5714 : OCCLump::OCCLump(TopoDS_Solid *theSolid, OCCSurface* surface, OCCShell* shell)
      73                 :            : {
      74                 :       2857 :   myTopoDSSolid = theSolid;
      75                 :       2857 :   mySheetSurface = surface;
      76                 :       2857 :   myShell = shell;
      77 [ +  + ][ +  - ]:       2857 :   if(myTopoDSSolid && !myTopoDSSolid->IsNull())
         [ +  - ][ +  + ]
      78 [ +  - ][ -  + ]:       2238 :     assert(myTopoDSSolid->ShapeType() == TopAbs_SOLID);
      79                 :       2857 : }
      80                 :            : 
      81                 :       5367 : OCCLump::~OCCLump()
      82                 :            : { 
      83         [ +  + ]:       1789 :   if (myTopoDSSolid)
      84                 :            :   {
      85         [ +  - ]:       1514 :     myTopoDSSolid->Nullify();
      86 [ +  - ][ +  - ]:       1514 :     delete myTopoDSSolid;
                 [ +  - ]
      87                 :            :   }
      88         [ -  + ]:       3578 : }
      89                 :            : 
      90                 :       1246 : void OCCLump::set_TopoDS_Solid(TopoDS_Solid solid)
      91                 :            : {
      92 [ +  - ][ +  + ]:       1246 :   if(myTopoDSSolid && solid.IsEqual(*myTopoDSSolid) )
                 [ +  + ]
      93                 :        295 :     return;
      94                 :            : 
      95         [ +  - ]:        951 :   if(myTopoDSSolid)
      96                 :        951 :     myTopoDSSolid->Nullify() ;
      97                 :            : 
      98                 :        951 :   *myTopoDSSolid = solid;
      99                 :            : }
     100                 :            : //-------------------------------------------------------------------------
     101                 :            : // Purpose       : Find centroid
     102                 :            : //
     103                 :            : // Special Notes :
     104                 :            : //
     105                 :            : // Author       : Jane Hu
     106                 :            : //
     107                 :            : // Creation Date : 12/06/07
     108                 :            : //-------------------------------------------------------------------------
     109                 :          0 : CubitStatus OCCLump::mass_properties( CubitVector& centroid,
     110                 :            :                                       double& volume )
     111                 :            : {
     112 [ #  # ][ #  # ]:          0 :   if (mySheetSurface || myShell)
     113                 :          0 :     return CUBIT_FAILURE;
     114                 :            : 
     115         [ #  # ]:          0 :   GProp_GProps myProps;
     116         [ #  # ]:          0 :   BRepGProp::VolumeProperties(*myTopoDSSolid, myProps);
     117         [ #  # ]:          0 :   volume = myProps.Mass();
     118         [ #  # ]:          0 :   gp_Pnt pt = myProps.CentreOfMass();
     119 [ #  # ][ #  # ]:          0 :   centroid.set(pt.X(), pt.Y(), pt.Z());
         [ #  # ][ #  # ]
     120                 :            : 
     121                 :          0 :   return CUBIT_SUCCESS;
     122                 :            : }
     123                 :            : 
     124                 :            : //-------------------------------------------------------------------------
     125                 :            : // Purpose       : The purpose of this function is to append a
     126                 :            : //                 attribute to the GE. The name is attached to the 
     127                 :            : //                 underlying solid model entity this one points to.
     128                 :            : //
     129                 :            : //
     130                 :            : // Special Notes : 
     131                 :            : //
     132                 :            : // Creator       : Malcolm J. Panthaki
     133                 :            : //
     134                 :            : // Creation Date : 11/21/96
     135                 :            : //-------------------------------------------------------------------------
     136                 :       1350 : void OCCLump::append_simple_attribute_virt(const CubitSimpleAttrib &csa)
     137                 :            : { 
     138         [ +  - ]:       1350 :   TopoDS_Shape shape;
     139         [ -  + ]:       1350 :   if(mySheetSurface)
     140 [ #  # ][ #  # ]:          0 :     shape = *(mySheetSurface->get_TopoDS_Face());
     141         [ -  + ]:       1350 :   else if(myShell)
     142 [ #  # ][ #  # ]:          0 :     shape = *(myShell->get_TopoDS_Shell());
     143                 :            :   else
     144         [ +  - ]:       1350 :     shape =*myTopoDSSolid;
     145 [ +  - ][ +  - ]:       1350 :   OCCAttribSet::append_attribute(csa, shape); 
     146                 :       1350 : }
     147                 :            : 
     148                 :            : //-------------------------------------------------------------------------
     149                 :            : // Purpose       : The purpose of this function is to remove a simple 
     150                 :            : //                 attribute attached to this geometry entity. The name is 
     151                 :            : //                 removed from the underlying BODY this points to.
     152                 :            : //
     153                 :            : // Special Notes : 
     154                 :            : //
     155                 :            : // Creator       : David R. White
     156                 :            : //
     157                 :            : // Creation Date : 03/18/97
     158                 :            : //-------------------------------------------------------------------------
     159                 :       8440 : void OCCLump::remove_simple_attribute_virt(const CubitSimpleAttrib &csa )
     160                 :            : { 
     161         [ +  - ]:       8440 :   TopoDS_Shape shape;
     162         [ +  + ]:       8440 :   if(mySheetSurface)
     163 [ +  - ][ +  - ]:       1419 :     shape = *(mySheetSurface->get_TopoDS_Face());
     164         [ -  + ]:       7021 :   else if(myShell)
     165 [ #  # ][ #  # ]:          0 :     shape = *(myShell->get_TopoDS_Shell());
     166                 :            :   else
     167         [ +  - ]:       7021 :     shape =*myTopoDSSolid;
     168 [ +  - ][ +  - ]:       8440 :   OCCAttribSet::remove_attribute(csa, shape); 
     169                 :       8440 : }
     170                 :            : 
     171                 :            : //-------------------------------------------------------------------------
     172                 :            : // Purpose       : The purpose of this function is to remove all simple 
     173                 :            : //                 attributes attached to this geometry entity.  Also
     174                 :            : //                 removes lingering GTC attributes.
     175                 :            : //
     176                 :            : //
     177                 :            : // Special Notes : 
     178                 :            : //
     179                 :            : // Creator       : Greg Nielson
     180                 :            : //
     181                 :            : // Creation Date : 07/10/98
     182                 :            : //-------------------------------------------------------------------------
     183                 :       5589 : void OCCLump::remove_all_simple_attribute_virt()
     184                 :            : { 
     185         [ +  - ]:       5589 :   TopoDS_Shape shape;
     186         [ +  + ]:       5589 :   if(mySheetSurface)
     187 [ +  - ][ +  - ]:       1590 :     shape = *(mySheetSurface->get_TopoDS_Face());
     188         [ -  + ]:       3999 :   else if(myShell)
     189 [ #  # ][ #  # ]:          0 :     shape = *(myShell->get_TopoDS_Shell());
     190                 :            :   else
     191         [ +  - ]:       3999 :     shape =*myTopoDSSolid;
     192 [ +  - ][ +  - ]:       5589 :   OCCAttribSet::remove_attribute(CubitSimpleAttrib(), shape);
         [ +  - ][ +  - ]
     193                 :       5589 : }
     194                 :            : 
     195                 :            : //-------------------------------------------------------------------------
     196                 :            : // Purpose       : The purpose of this function is to get the  
     197                 :            : //                 attributes attached to this geometry entity. The name is 
     198                 :            : //                 attached to the underlying BODY this points to.
     199                 :            : //
     200                 :            : // Special Notes : 
     201                 :            : //
     202                 :            : //-------------------------------------------------------------------------
     203                 :       5294 : CubitStatus OCCLump::get_simple_attribute(DLIList<CubitSimpleAttrib>& csa_list)
     204                 :            : { 
     205         [ +  - ]:       5294 :   TopoDS_Shape shape;
     206         [ +  + ]:       5294 :   if(mySheetSurface)
     207 [ +  - ][ +  - ]:        847 :     shape = *(mySheetSurface->get_TopoDS_Face());
     208         [ -  + ]:       4447 :   else if(myShell)
     209 [ #  # ][ #  # ]:          0 :     shape = *(myShell->get_TopoDS_Shell());
     210                 :            :   else
     211         [ +  - ]:       4447 :     shape =*myTopoDSSolid;
     212 [ +  - ][ +  - ]:       5294 :   return OCCAttribSet::get_attributes(shape, csa_list ); 
     213                 :            : }
     214                 :            : 
     215                 :       4255 : CubitStatus OCCLump::get_simple_attribute( const CubitString& name,
     216                 :            :                                         DLIList<CubitSimpleAttrib>& csa_list )
     217                 :            : {
     218         [ +  - ]:       4255 :   TopoDS_Shape shape;
     219         [ +  + ]:       4255 :   if(mySheetSurface)
     220 [ +  - ][ +  - ]:        960 :     shape = *(mySheetSurface->get_TopoDS_Face());
     221         [ -  + ]:       3295 :   else if(myShell)
     222 [ #  # ][ #  # ]:          0 :     shape = *(myShell->get_TopoDS_Shell());
     223                 :            :   else
     224         [ +  - ]:       3295 :     shape =*myTopoDSSolid;
     225 [ +  - ][ +  - ]:       4255 :   return OCCAttribSet::get_attributes( name, shape, csa_list ); 
     226                 :            : }
     227                 :            : 
     228                 :            : 
     229                 :            : //-------------------------------------------------------------------------
     230                 :            : // Purpose       : Get the bounding box of the object.
     231                 :            : //
     232                 :            : // Special Notes :
     233                 :            : //
     234                 :            : //-------------------------------------------------------------------------
     235                 :        661 : CubitBox OCCLump::bounding_box() const 
     236                 :            : {
     237         [ +  - ]:        661 :   Bnd_Box box;
     238         [ +  - ]:        661 :   TopoDS_Shape shape;
     239         [ +  + ]:        661 :   if(mySheetSurface)
     240 [ +  - ][ +  - ]:         22 :     shape = *(mySheetSurface->get_TopoDS_Face());
     241         [ -  + ]:        639 :   else if(myShell)
     242 [ #  # ][ #  # ]:          0 :     shape = *(myShell->get_TopoDS_Shell());
     243                 :            :   else
     244         [ +  - ]:        639 :     shape =*myTopoDSSolid;
     245                 :            : 
     246                 :            :   //calculate the bounding box
     247         [ +  - ]:        661 :   BRepBndLib::Add(shape, box);
     248                 :            :   double min[3], max[3];
     249                 :            : 
     250                 :            :   //get values
     251         [ +  - ]:        661 :   box.Get(min[0], min[1], min[2], max[0], max[1], max[2]);
     252                 :            : 
     253                 :            :   //update boundingbox.
     254         [ +  - ]:        661 :   CubitBox cBox(min, max);
     255         [ +  - ]:        661 :   return cBox;
     256                 :            : }
     257                 :            : 
     258                 :            : //-------------------------------------------------------------------------
     259                 :            : // Purpose       : Get geometry modeling engine: OCCGeometryEngine
     260                 :            : //
     261                 :            : // Special Notes :
     262                 :            : //
     263                 :            : //-------------------------------------------------------------------------
     264                 :            : GeometryQueryEngine* 
     265                 :         22 :                  OCCLump::get_geometry_query_engine() const
     266                 :            : {
     267                 :         22 :    return OCCQueryEngine::instance();
     268                 :            : }                 
     269                 :            : 
     270                 :            : //-------------------------------------------------------------------------
     271                 :            : // Purpose       : Returns the volume of the Lump
     272                 :            : //
     273                 :            : // Special Notes :
     274                 :            : //
     275                 :            : // Creator       : 
     276                 :            : //
     277                 :            : // Creation Date : 
     278                 :            : //-------------------------------------------------------------------------
     279                 :        106 : double OCCLump::measure()
     280                 :            : {
     281         [ +  + ]:        106 :   if(mySheetSurface) 
     282         [ +  - ]:         22 :     return mySheetSurface->measure();
     283         [ -  + ]:         84 :   else if(myShell)
     284         [ #  # ]:          0 :     return myShell->measure();
     285                 :            : 
     286         [ +  - ]:         84 :   GProp_GProps myProps;
     287         [ +  - ]:         84 :   BRepGProp::VolumeProperties(*myTopoDSSolid, myProps);
     288         [ +  - ]:        106 :   return myProps.Mass();
     289                 :            : }
     290                 :            : 
     291                 :        942 : void OCCLump::get_parents_virt(DLIList<TopologyBridge*> &bodies) 
     292                 :            : {
     293         [ +  + ]:        942 :   if(mySheetSurface)
     294         [ +  - ]:        484 :     bodies.append(mySheetSurface->my_body());
     295         [ -  + ]:        458 :   else if (myShell)
     296         [ #  # ]:          0 :     bodies.append(myShell->my_body());
     297                 :            :   else
     298         [ +  - ]:        458 :     bodies.append(myBodyPtr);
     299                 :        942 : }
     300                 :            : 
     301                 :       4512 : BodySM* OCCLump::get_body() const
     302                 :            : {
     303         [ -  + ]:       4512 :   if(mySheetSurface)
     304                 :          0 :     return mySheetSurface->my_body();
     305         [ -  + ]:       4512 :   if(myShell)
     306                 :          0 :     return myShell->my_body();
     307                 :       4512 :   return myBodyPtr;
     308                 :            : }
     309                 :            : 
     310                 :      24880 : void OCCLump::get_children_virt(DLIList<TopologyBridge*> &shellsms)
     311                 :            : {
     312         [ +  + ]:      24880 :   if (mySheetSurface)
     313                 :            :   {
     314 [ +  - ][ +  - ]:       4223 :     shellsms.append(mySheetSurface->my_shell());
     315                 :      24880 :     return;
     316                 :            :   }
     317         [ -  + ]:      20657 :   else if(myShell)
     318                 :            :   {
     319         [ #  # ]:          0 :     shellsms.append(myShell);
     320                 :          0 :     return;
     321                 :            :   }
     322         [ +  - ]:      20657 :   TopTools_IndexedMapOfShape M;
     323         [ +  - ]:      20657 :   TopExp::MapShapes(*myTopoDSSolid, TopAbs_SHELL, M);
     324                 :            :   int ii;
     325 [ +  - ][ +  + ]:      41734 :   for (ii=1; ii<=M.Extent(); ii++) {
     326 [ +  - ][ +  - ]:      21077 :           TopologyBridge *shell = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
                 [ +  - ]
     327         [ +  + ]:      21077 :           if (shell)
     328         [ +  - ]:      20835 :             shellsms.append_unique(shell);
     329         [ +  - ]:      20657 :   }
     330                 :            : }
     331                 :            : 
     332                 :            : 
     333                 :            : 
     334                 :          0 : CubitPointContainment OCCLump::point_containment( const CubitVector &point )
     335                 :            : {
     336 [ #  # ][ #  # ]:          0 :   if (mySheetSurface || myShell)
     337                 :          0 :     return CUBIT_PNT_UNKNOWN;
     338                 :            : 
     339         [ #  # ]:          0 :   TopoDS_Solid * solid = get_TopoDS_Solid();
     340 [ #  # ][ #  # ]:          0 :   gp_Pnt pnt(point.x(), point.y(), point.z());
         [ #  # ][ #  # ]
     341         [ #  # ]:          0 :   BRepClass3d_SolidExplorer ex(*solid);
     342                 :            :    
     343                 :            :   //use face tolerance at the tolerence to see if the point is on.
     344 [ #  # ][ #  # ]:          0 :   TopExp_Explorer Ex;
     345         [ #  # ]:          0 :   Ex.Init(*solid, TopAbs_FACE);
     346 [ #  # ][ #  # ]:          0 :   TopoDS_Face face = TopoDS::Face(Ex.Current());
         [ #  # ][ #  # ]
     347                 :            :   
     348         [ #  # ]:          0 :   double dtol = BRep_Tool::Tolerance(face);
     349 [ #  # ][ #  # ]:          0 :   BRepClass3d_SClassifier ps(ex, pnt, dtol);
     350                 :            :   
     351         [ #  # ]:          0 :   TopAbs_State state = ps.State();
     352         [ #  # ]:          0 :   if (state == TopAbs_IN)
     353                 :          0 :      return CUBIT_PNT_INSIDE;
     354         [ #  # ]:          0 :   else if (state == TopAbs_OUT)
     355                 :          0 :      return CUBIT_PNT_OUTSIDE;
     356         [ #  # ]:          0 :   else if (state == TopAbs_ON)
     357                 :          0 :      return CUBIT_PNT_BOUNDARY;
     358                 :            : 
     359         [ #  # ]:          0 :   return CUBIT_PNT_UNKNOWN;
     360                 :            :   
     361                 :            : }
     362                 :            : 
     363                 :            : //----------------------------------------------------------------
     364                 :            : // Function: to update the core Solid
     365                 :            : //           for any movement of the lump.
     366                 :            : // Author: Jane Hu
     367                 :            : //----------------------------------------------------------------
     368                 :        744 : CubitStatus OCCLump::update_OCC_entity( BRepBuilderAPI_ModifyShape *aBRepTrsf,
     369                 :            :                                         BRepAlgoAPI_BooleanOperation *op)
     370                 :            : {
     371 [ +  - ][ -  + ]:        744 :   if(mySheetSurface || myShell)
     372                 :          0 :     return CUBIT_FAILURE;
     373                 :            : 
     374 [ -  + ][ #  # ]:        744 :   assert(aBRepTrsf != NULL || op != NULL);
     375                 :            :  
     376         [ +  - ]:        744 :   TopoDS_Shape shape;
     377         [ +  - ]:        744 :   if(aBRepTrsf)
     378 [ +  - ][ +  - ]:        744 :     shape = aBRepTrsf->ModifiedShape(*get_TopoDS_Solid());
                 [ +  - ]
     379                 :            : 
     380                 :            :   else
     381                 :            :   {
     382         [ #  # ]:          0 :     TopTools_ListOfShape shapes;
     383 [ #  # ][ #  # ]:          0 :     shapes.Assign(op->Modified(*get_TopoDS_Solid()));
                 [ #  # ]
     384 [ #  # ][ #  # ]:          0 :     if(shapes.Extent() == 0)
     385 [ #  # ][ #  # ]:          0 :       shapes.Assign(op->Generated(*get_TopoDS_Solid()));
                 [ #  # ]
     386 [ #  # ][ #  # ]:          0 :     if(shapes.Extent() > 1)
     387                 :            :     { 
     388                 :            :       //update all attributes first.
     389         [ #  # ]:          0 :       TopTools_ListIteratorOfListOfShape it;
     390         [ #  # ]:          0 :       it.Initialize(shapes);
     391 [ #  # ][ #  # ]:          0 :       for(; it.More(); it.Next())
                 [ #  # ]
     392                 :            :       {
     393 [ #  # ][ #  # ]:          0 :         shape = it.Value();
     394         [ #  # ]:          0 :         OCCQueryEngine::instance()->copy_attributes(*get_TopoDS_Solid(), 
     395 [ #  # ][ #  # ]:          0 :                                                     shape);
     396                 :            :       }
     397 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
     398                 :            :     }
     399 [ #  # ][ #  # ]:          0 :     else if (shapes.Extent() == 1)
     400 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
     401 [ #  # ][ #  # ]:          0 :     else if(op->IsDeleted(*get_TopoDS_Solid()))
                 [ #  # ]
     402                 :            :       ;
     403                 :            :     else
     404 [ #  # ][ #  # ]:          0 :       return CUBIT_SUCCESS;
     405                 :            :   }
     406                 :            :   
     407 [ +  - ][ +  - ]:       1488 :   TopoDS_Solid solid;
     408 [ -  + ][ #  # ]:        744 :   if(aBRepTrsf || !op->IsDeleted(*get_TopoDS_Solid()))
         [ #  # ][ #  # ]
                 [ +  - ]
     409 [ +  - ][ +  - ]:        744 :     solid = TopoDS::Solid(shape);
     410                 :            : 
     411                 :            :   //set the lumps
     412 [ +  - ][ +  - ]:       1488 :   DLIList<TopologyBridge *> shells;
     413         [ +  - ]:        744 :   this->get_children_virt(shells);
     414 [ +  - ][ +  + ]:       1488 :   for (int i = 1; i <= shells.size(); i++)
     415                 :            :   {
     416 [ +  - ][ -  + ]:        744 :      OCCShell *shell = CAST_TO(shells.get_and_step(), OCCShell);
     417         [ +  - ]:        744 :      shell->update_OCC_entity(aBRepTrsf, op);
     418                 :            :   }
     419 [ +  - ][ +  - ]:        744 :   OCCQueryEngine::instance()->update_OCC_map(*myTopoDSSolid, solid);
     420                 :            : 
     421         [ +  - ]:        744 :   return CUBIT_SUCCESS;
     422                 :            : }
     423                 :            : 
     424                 :            : //----------------------------------------------------------------
     425                 :            : // Function: TopoDS_Shape level function to update the core Lump
     426                 :            : //           for any movement  or Boolean operation of the body.
     427                 :            : // Author: Jane Hu
     428                 :            : //----------------------------------------------------------------
     429                 :        394 : CubitStatus OCCLump::update_OCC_entity(TopoDS_Solid& old_solid,
     430                 :            :                                        TopoDS_Shape& new_shape,
     431                 :            :                                        BRepBuilderAPI_MakeShape *op,
     432                 :            :                                        LocOpe_SplitShape* sp)
     433                 :            : {
     434                 :            :   //set the Shells
     435         [ +  - ]:        394 :   TopTools_IndexedMapOfShape M;
     436 [ +  - ][ +  - ]:        788 :   TopoDS_Shape shape, shape2;
         [ +  - ][ +  - ]
     437         [ +  - ]:        394 :   TopExp::MapShapes(new_shape, TopAbs_SOLID,M);
     438 [ +  - ][ +  - ]:        788 :   TopoDS_Solid new_solid;
     439                 :        394 :   CubitBoolean isCompound = CUBIT_FALSE;
     440 [ +  - ][ +  + ]:        394 :   if(M.Extent() > 1 )
     441                 :         77 :     isCompound = CUBIT_TRUE;
     442                 :            : 
     443 [ +  - ][ +  + ]:        394 :   if(M.Extent() == 1 )
     444 [ +  - ][ +  - ]:        295 :     new_solid = TopoDS::Solid(M(1));  
                 [ +  - ]
     445                 :            : 
     446         [ +  - ]:        394 :   M.Clear();
     447         [ +  - ]:        394 :   TopExp::MapShapes(old_solid, TopAbs_SHELL, M);
     448 [ +  - ][ +  - ]:        788 :   TopTools_ListOfShape shapes;
     449                 :            :  
     450 [ +  - ][ +  + ]:        788 :   for(int ii=1; ii<=M.Extent(); ii++)
     451                 :            :   {
     452 [ +  - ][ +  - ]:        394 :     TopoDS_Shell shell = TopoDS::Shell(M(ii));
                 [ +  - ]
     453                 :            : 
     454 [ +  - ][ +  - ]:        788 :     TopTools_ListOfShape shapes;
                 [ +  - ]
     455 [ +  - ][ +  - ]:        788 :     TopTools_IndexedMapOfShape M2;
                 [ +  - ]
     456         [ +  - ]:        394 :     if (op)
     457                 :            :     {
     458 [ +  - ][ +  - ]:        394 :       shapes.Assign(op->Modified(shell));
     459 [ +  - ][ +  + ]:        394 :       if(shapes.Extent() == 0)
     460 [ +  - ][ +  - ]:        361 :          shapes.Assign(op->Generated(shell));
     461                 :            :       // bug fix for hollow operation, in which a new shell is genearted
     462                 :            :       // but the shapes we get from old_shell->Generated() is still old_shell
     463                 :            :       // not the new one.
     464 [ +  - ][ +  + ]:        394 :       if(!new_solid.IsNull())  
     465         [ +  - ]:        295 :          TopExp::MapShapes(new_solid, TopAbs_SHELL, M2);
     466                 :            :     }
     467         [ #  # ]:          0 :     else if(sp)
     468 [ #  # ][ #  # ]:          0 :       shapes.Assign(sp->DescendantShapes(shell));
     469                 :            : 
     470 [ +  - ][ +  + ]:        394 :     if (shapes.Extent() == 1)
     471                 :            :     {
     472 [ +  - ][ +  - ]:         33 :       shape = shapes.First(); 
     473 [ +  - ][ +  - ]:         33 :       if(M2.Extent() > 0)
     474 [ +  - ][ +  - ]:         33 :         shape2 = TopoDS::Shell(M2(1)); 
                 [ +  - ]
     475 [ +  - ][ +  - ]:         33 :       if(M2.Extent() == 1 && !shape.IsSame(shape2))
         [ +  - ][ -  + ]
                 [ -  + ]
     476         [ #  # ]:          0 :          shape = shape2;
     477 [ +  - ][ -  + ]:         33 :       else if(M2.Extent() > 1)
     478                 :            :       {
     479         [ #  # ]:          0 :          shapes.Clear(); 
     480 [ #  # ][ #  # ]:         33 :          for(int jj = 1; jj <= M2.Extent(); jj++) 
     481 [ #  # ][ #  # ]:          0 :            shapes.Append(M2(jj));
     482                 :            :       }
     483                 :            :     }
     484                 :            : 
     485 [ +  - ][ -  + ]:        361 :     else if(shapes.Extent() > 1)
     486                 :            :     {
     487                 :            :       //update all attributes first.
     488         [ #  # ]:          0 :       TopTools_ListIteratorOfListOfShape it;
     489         [ #  # ]:          0 :       it.Initialize(shapes);
     490 [ #  # ][ #  # ]:          0 :       for(; it.More(); it.Next())
                 [ #  # ]
     491                 :            :       {
     492 [ #  # ][ #  # ]:          0 :         shape = it.Value();
     493 [ #  # ][ #  # ]:          0 :         OCCQueryEngine::instance()->copy_attributes(shell, shape);
     494                 :            :       }
     495 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
     496                 :            :     }
     497 [ +  - ][ +  - ]:        361 :     else if(op->IsDeleted(shell))
     498                 :            :     {
     499         [ +  - ]:        361 :        TopTools_IndexedMapOfShape M_new;
     500         [ +  - ]:        361 :        TopExp::MapShapes(new_shape, TopAbs_SHELL, M_new);
     501 [ +  - ][ +  + ]:        361 :        if (M_new.Extent()== 1)
     502 [ +  - ][ +  - ]:        262 :          shape = M_new(1);
     503                 :            :        else
     504 [ +  - ][ +  - ]:        361 :          shape.Nullify();
     505                 :            :     }
     506                 :            :     else
     507                 :            :     {
     508         [ #  # ]:          0 :        shape = shell;
     509                 :          0 :        continue;
     510                 :            :     }
     511                 :            :  
     512 [ +  - ][ +  + ]:        394 :     if(shapes.Extent() > 0 || (op && op->IsDeleted(shell)))
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     513 [ +  - ][ +  - ]:        394 :       OCCShell::update_OCC_entity(shell, shape, op, sp);
                 [ +  - ]
     514                 :        394 :   }
     515 [ +  - ][ +  + ]:        394 :   if(!new_solid.IsNull() && !old_solid.IsSame(new_solid))
         [ +  - ][ +  - ]
                 [ +  + ]
     516 [ +  - ][ +  - ]:        295 :     OCCQueryEngine::instance()->update_OCC_map(old_solid, new_solid);
     517         [ +  + ]:         99 :   else if(isCompound)
     518 [ +  - ][ +  - ]:         77 :     OCCQueryEngine::instance()->update_OCC_map(old_solid, new_shape);  
     519         [ +  - ]:        394 :   return CUBIT_SUCCESS;
     520 [ +  - ][ +  - ]:       6364 : }

Generated by: LCOV version 1.11