LCOV - code coverage report
Current view: top level - geom/OCC - OCCShell.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 95 122 77.9 %
Date: 2020-06-30 00:58:45 Functions: 10 16 62.5 %
Branches: 147 312 47.1 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : OCCShell.cpp
       3                 :            : //
       4                 :            : // Purpose       : 
       5                 :            : //
       6                 :            : // Special Notes :
       7                 :            : //
       8                 :            : // Creator       : David White
       9                 :            : //
      10                 :            : // Creation Date : 7/18/2000
      11                 :            : //
      12                 :            : //-------------------------------------------------------------------------
      13                 :            : 
      14                 :            : // ********** BEGIN STANDARD INCLUDES      **********
      15                 :            : #include <stddef.h>
      16                 :            : // ********** END STANDARD INCLUDES        **********
      17                 :            : // ********** BEGIN CUBIT INCLUDES         **********
      18                 :            : #include "CastTo.hpp"
      19                 :            : #include "CubitUtil.hpp"
      20                 :            : 
      21                 :            : #include "OCCQueryEngine.hpp"
      22                 :            : #include "OCCShell.hpp"
      23                 :            : #include "ShellSM.hpp"
      24                 :            : #include "Lump.hpp"
      25                 :            : #include "Surface.hpp"
      26                 :            : 
      27                 :            : #include "OCCBody.hpp"
      28                 :            : #include "OCCLump.hpp"
      29                 :            : #include "OCCSurface.hpp"
      30                 :            : #include "GfxDebug.hpp"
      31                 :            : 
      32                 :            : #include <TopExp.hxx>
      33                 :            : #include <TopTools_IndexedMapOfShape.hxx>
      34                 :            : #include "TopExp_Explorer.hxx"
      35                 :            : #include "TopTools_IndexedDataMapOfShapeListOfShape.hxx"
      36                 :            : #include "TopoDS.hxx"
      37                 :            : #include "TopTools_ListIteratorOfListOfShape.hxx"
      38                 :            : #include "GProp_GProps.hxx"
      39                 :            : #include "BRepGProp.hxx"
      40                 :            : #include "TopTools_DataMapOfShapeInteger.hxx"
      41                 :            : #include "TopTools_ListOfShape.hxx"
      42                 :            : #include "BRepAlgoAPI_BooleanOperation.hxx"
      43                 :            : #include "BRepBuilderAPI_MakeShape.hxx"
      44                 :            : #include "BRepBuilderAPI_ModifyShape.hxx"
      45                 :            : #include "BRepBuilderAPI_Transform.hxx"
      46                 :            : #include "BRepBuilderAPI_GTransform.hxx"
      47                 :            : #include "LocOpe_SplitShape.hxx"
      48                 :            : #include "TopoDS_Compound.hxx"
      49                 :            : // ********** END CUBIT INCLUDES           **********
      50                 :            : 
      51                 :            : // ********** BEGIN STATIC DECLARATIONS    **********
      52                 :            : // ********** END STATIC DECLARATIONS      **********
      53                 :            : 
      54                 :            : // ********** BEGIN PUBLIC FUNCTIONS       **********
      55                 :            : 
      56                 :            : 
      57                 :            : //-------------------------------------------------------------------------
      58                 :            : // Purpose       : A constructor with a pointer to an OCC SHELL.
      59                 :            : //
      60                 :            : // Special Notes :
      61                 :            : //
      62                 :            : //-------------------------------------------------------------------------
      63         [ +  - ]:       5834 : OCCShell::OCCShell(TopoDS_Shell *theShell, OCCSurface* surface)
      64                 :            : {
      65                 :       2917 :   myTopoDSShell = theShell;
      66                 :       2917 :   mySheetSurface = surface;
      67 [ +  + ][ +  - ]:       2917 :   if(myTopoDSShell && !myTopoDSShell->IsNull())
         [ +  - ][ +  + ]
      68 [ +  - ][ -  + ]:       2298 :     assert (myTopoDSShell->ShapeType() == TopAbs_SHELL);
      69                 :       2917 : }
      70                 :            : 
      71                 :            : //-------------------------------------------------------------------------
      72                 :            : // Purpose       : The destructor.
      73                 :            : //
      74                 :            : // Special Notes :
      75                 :            : //
      76                 :            : //-------------------------------------------------------------------------
      77         [ +  - ]:       5367 : OCCShell::~OCCShell()
      78                 :            : {
      79         [ +  + ]:       1789 :   if(myTopoDSShell)
      80                 :            :   {
      81         [ +  - ]:       1514 :     myTopoDSShell->Nullify();
      82 [ +  - ][ +  - ]:       1514 :     delete (TopoDS_Shell*)myTopoDSShell;
                 [ +  - ]
      83                 :       1514 :     myTopoDSShell = NULL;
      84                 :            :   }
      85         [ -  + ]:       3578 : }
      86                 :            : 
      87                 :       1246 : void OCCShell::set_TopoDS_Shell(TopoDS_Shell shell)
      88                 :            : {
      89 [ +  - ][ +  + ]:       1246 :   if(myTopoDSShell && shell.IsEqual(*myTopoDSShell))
                 [ +  + ]
      90                 :        295 :     return;
      91                 :            : 
      92         [ +  - ]:        951 :   if (myTopoDSShell)
      93                 :        951 :     myTopoDSShell->Nullify();
      94                 :            : 
      95                 :        951 :   *myTopoDSShell = shell;
      96                 :            : }
      97                 :            : 
      98                 :            : //-------------------------------------------------------------------------
      99                 :            : // Purpose       : Get geometry modeling engine: OCCQueryEngine
     100                 :            : //
     101                 :            : // Special Notes :
     102                 :            : //
     103                 :            : //-------------------------------------------------------------------------
     104                 :            : GeometryQueryEngine* 
     105                 :         11 :                  OCCShell::get_geometry_query_engine() const
     106                 :            : {
     107                 :         11 :    return OCCQueryEngine::instance();
     108                 :            : }                 
     109                 :            : 
     110                 :          0 : void OCCShell::append_simple_attribute_virt(const CubitSimpleAttrib&)
     111                 :            : {
     112                 :          0 : }
     113                 :          0 : void OCCShell::remove_simple_attribute_virt(const CubitSimpleAttrib& )
     114                 :            : {
     115                 :          0 : }
     116                 :          0 : void OCCShell::remove_all_simple_attribute_virt()
     117                 :            : {
     118                 :          0 : }
     119                 :          0 : CubitStatus OCCShell::get_simple_attribute(DLIList<CubitSimpleAttrib>&)
     120                 :            : {
     121                 :          0 :   return CUBIT_FAILURE;
     122                 :            : }
     123                 :          0 : CubitStatus OCCShell::get_simple_attribute(const CubitString&,
     124                 :            :                                               DLIList<CubitSimpleAttrib>&)
     125                 :          0 :   { return CUBIT_FAILURE; }
     126                 :            : 
     127                 :            : //-------------------------------------------------------------------------
     128                 :            : // Purpose       : Query solid modeler topology
     129                 :            : //
     130                 :            : // Special Notes : 
     131                 :            : //
     132                 :            : // Author        : Jane Hu 
     133                 :            : //
     134                 :            : // Creation Date : 11/28/07
     135                 :            : //-------------------------------------------------------------------------
     136                 :         22 : void OCCShell::get_parents_virt( DLIList<TopologyBridge*>& parents ) 
     137                 :            : { 
     138         [ +  + ]:         22 :   if(mySheetSurface)
     139                 :            :   {
     140 [ +  - ][ +  - ]:         11 :     parents.append(mySheetSurface->my_lump());
     141                 :         22 :     return;
     142                 :            :   }
     143                 :            : 
     144         [ +  - ]:         11 :   OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
     145                 :         11 :   OCCBody * body = NULL;
     146                 :         11 :   DLIList <OCCBody* > *bodies = oqe->BodyList;
     147         [ +  - ]:         11 :   TopTools_IndexedDataMapOfShapeListOfShape M;
     148 [ +  - ][ +  + ]:         22 :   for(int i = 0; i <  bodies->size(); i++)
     149                 :            :   {
     150         [ +  - ]:         11 :      body = bodies->get_and_step();
     151                 :            :      TopoDS_Shape* shape ; 
     152         [ +  - ]:         11 :      body->get_TopoDS_Shape(shape);
     153         [ -  + ]:         11 :      assert(shape != NULL); 
     154                 :            :      TopExp::MapShapesAndAncestors(*shape,
     155         [ +  - ]:         11 :                                    TopAbs_SHELL, TopAbs_SOLID, M);
     156         [ +  - ]:         11 :      TopoDS_Shell *shell = get_TopoDS_Shell(); 
     157 [ +  - ][ -  + ]:         11 :      if (!M.Contains(*shell))
     158                 :          0 :         continue;
     159                 :            : 
     160                 :            :      const TopTools_ListOfShape& ListOfShapes = 
     161 [ +  - ][ +  - ]:         11 :                                 M.FindFromKey(*(get_TopoDS_Shell()));
     162 [ +  - ][ +  - ]:         11 :      if (!ListOfShapes.IsEmpty()) 
     163                 :            :      {
     164         [ +  - ]:         11 :          TopTools_ListIteratorOfListOfShape it(ListOfShapes) ;
     165 [ +  - ][ +  - ]:         22 :          for (;it.More(); it.Next())
                 [ +  + ]
     166                 :            :          {
     167 [ +  - ][ +  - ]:         11 :            TopoDS_Solid Solid = TopoDS::Solid(it.Value());
                 [ +  - ]
     168         [ +  - ]:         11 :            int k = oqe->OCCMap->Find(Solid);
     169 [ +  - ][ +  - ]:         11 :            parents.append((OCCLump*)(oqe->OccToCGM->find(k))->second);
                 [ +  - ]
     170         [ +  - ]:         11 :          }
     171                 :            :      } 
     172         [ +  - ]:         11 :   }
     173                 :            : }
     174                 :            : 
     175                 :            : 
     176                 :      23665 : void OCCShell::get_children_virt( DLIList<TopologyBridge*>& children )
     177                 :            : {
     178         [ +  + ]:      23665 :   if(mySheetSurface)
     179                 :            :   {
     180         [ +  - ]:       4223 :     children.append(mySheetSurface);
     181                 :      23665 :     return;
     182                 :            :   }
     183         [ +  - ]:      19442 :   TopTools_IndexedMapOfShape M;
     184         [ +  - ]:      19442 :   TopExp::MapShapes(*myTopoDSShell, TopAbs_FACE, M);
     185                 :            :   int ii;
     186 [ +  - ][ +  + ]:     152685 :   for (ii=1; ii<=M.Extent(); ii++) {
     187 [ +  - ][ +  - ]:     133243 :           TopologyBridge *surface = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
                 [ +  - ]
     188         [ +  - ]:     133243 :           if(surface)
     189         [ +  - ]:     133243 :             children.append_unique(surface);
     190         [ +  - ]:      19442 :   }
     191                 :            : }
     192                 :            : 
     193                 :            : //----------------------------------------------------------------
     194                 :            : // Function: to update the core Shell
     195                 :            : //           for any movement of the body.
     196                 :            : // Author: Jane Hu
     197                 :            : //----------------------------------------------------------------
     198                 :        744 : CubitStatus OCCShell::update_OCC_entity( BRepBuilderAPI_ModifyShape *aBRepTrsf,
     199                 :            :                                         BRepAlgoAPI_BooleanOperation *op)
     200                 :            : {
     201 [ -  + ][ #  # ]:        744 :   if(mySheetSurface && op == NULL)
     202                 :          0 :     return CUBIT_FAILURE;
     203                 :            : 
     204 [ -  + ][ #  # ]:        744 :   assert (aBRepTrsf != NULL || op != NULL);
     205                 :            : 
     206         [ +  - ]:        744 :   TopoDS_Shape shape;
     207         [ +  - ]:        744 :   if(aBRepTrsf)
     208 [ +  - ][ +  - ]:        744 :     shape = aBRepTrsf->ModifiedShape(*get_TopoDS_Shell());
                 [ +  - ]
     209                 :            : 
     210         [ #  # ]:          0 :   else if(!mySheetSurface)
     211                 :            :   {
     212         [ #  # ]:          0 :     TopTools_ListOfShape shapes;
     213 [ #  # ][ #  # ]:          0 :     shapes.Assign(op->Modified(*get_TopoDS_Shell()));
                 [ #  # ]
     214 [ #  # ][ #  # ]:          0 :     if(shapes.Extent() == 0)
     215 [ #  # ][ #  # ]:          0 :       shapes.Assign(op->Generated(*get_TopoDS_Shell()));
                 [ #  # ]
     216 [ #  # ][ #  # ]:          0 :     if (shapes.Extent())
     217 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
     218                 :            :     
     219 [ #  # ][ #  # ]:          0 :     else if(op->IsDeleted(*get_TopoDS_Shell()))
                 [ #  # ]
     220                 :            :       ;
     221                 :            :     else
     222 [ #  # ][ #  # ]:          0 :       return CUBIT_SUCCESS;
     223                 :            :   } 
     224 [ +  - ][ +  - ]:       1488 :   TopoDS_Shell shell;
     225 [ +  - ][ +  - ]:        744 :   if (!shape.IsNull())
     226 [ +  - ][ +  - ]:        744 :     shell = TopoDS::Shell(shape);
     227                 :            : 
     228                 :            :   //set the surfaces
     229 [ +  - ][ +  - ]:       1488 :   DLIList<TopologyBridge *> surfaces;
     230         [ +  - ]:        744 :   this->get_children_virt(surfaces);
     231 [ +  - ][ +  + ]:       4334 :   for (int i = 1; i <= surfaces.size(); i++)
     232                 :            :   {
     233 [ +  - ][ -  + ]:       3590 :      OCCSurface *surface = CAST_TO(surfaces.get_and_step(), OCCSurface);
     234         [ +  - ]:       3590 :      surface->update_OCC_entity(aBRepTrsf, op);
     235                 :            :   }
     236 [ +  - ][ +  - ]:        744 :   OCCQueryEngine::instance()->update_OCC_map(*myTopoDSShell, shell);
     237         [ +  - ]:        744 :   return CUBIT_SUCCESS;
     238                 :            : }
     239                 :            : 
     240                 :            : //-------------------------------------------------------------------------
     241                 :            : // Purpose       : Returns the area of the Shell
     242                 :            : //
     243                 :            : //-------------------------------------------------------------------------
     244                 :          0 : double OCCShell::measure()
     245                 :            : {
     246         [ #  # ]:          0 :   GProp_GProps myProps;
     247         [ #  # ]:          0 :   BRepGProp::SurfaceProperties(*myTopoDSShell, myProps);
     248         [ #  # ]:          0 :   return myProps.Mass();
     249                 :            : }
     250                 :            : 
     251                 :            : //----------------------------------------------------------------
     252                 :            : // Function: TopoDS_Shape level function to update the core Shell
     253                 :            : //           for any boolean operation of the body.
     254                 :            : // Author: Jane Hu
     255                 :            : //----------------------------------------------------------------
     256                 :        394 : CubitStatus OCCShell::update_OCC_entity(TopoDS_Shell& old_shell,
     257                 :            :                                         TopoDS_Shape& new_shell,
     258                 :            :                                         BRepBuilderAPI_MakeShape *op,
     259                 :            :                                         LocOpe_SplitShape* sp)
     260                 :            : {
     261                 :            :   //set the surfaces
     262         [ +  - ]:        394 :   TopTools_IndexedMapOfShape M;
     263 [ +  - ][ +  - ]:        788 :   TopoDS_Shape shape;
     264         [ +  - ]:        394 :   TopExp::MapShapes(old_shell, TopAbs_FACE, M);
     265 [ +  - ][ +  - ]:        788 :   TopTools_ListOfShape shapes;
     266 [ +  - ][ +  + ]:       2615 :   for(int ii=1; ii<=M.Extent(); ii++)
     267                 :            :   {
     268 [ +  - ][ +  - ]:       2221 :     TopoDS_Face face = TopoDS::Face(M(ii));
                 [ +  - ]
     269         [ +  - ]:       2221 :     if (op)
     270                 :            :     {
     271 [ +  - ][ +  - ]:       2221 :       shapes.Assign(op->Modified(face));
     272 [ +  - ][ +  + ]:       2221 :       if(shapes.Extent() == 0)
     273 [ +  - ][ +  - ]:        971 :          shapes.Assign(op->Generated(face));
     274                 :            :     }
     275         [ #  # ]:          0 :     else if(sp)
     276 [ #  # ][ #  # ]:          0 :       shapes.Assign(sp->DescendantShapes(face));
     277                 :            : 
     278 [ +  - ][ +  + ]:       2221 :     if(shapes.Extent() == 1)
     279 [ +  - ][ +  - ]:        997 :       shape = shapes.First();
     280 [ +  - ][ +  + ]:       1224 :     else if(shapes.Extent() > 1)
     281                 :            :     {
     282 [ +  - ][ +  - ]:        253 :       shape = shapes.First() ;
     283                 :            :     }
     284                 :            :     else 
     285                 :            :     {
     286         [ +  - ]:        971 :       TopoDS_Face nullFace;
     287 [ +  - ][ +  - ]:        971 :       shape = nullFace;
     288                 :            :     }
     289 [ +  - ][ +  + ]:       2221 :     if(shapes.Extent() > 0 || (op && op->IsDeleted(face)))
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
     290         [ +  - ]:       1525 :       OCCSurface::update_OCC_entity(face,shape, op, NULL, sp);
     291         [ +  - ]:       2221 :   }
     292 [ +  - ][ +  - ]:        394 :   if(!old_shell.IsSame(new_shell))
     293 [ +  - ][ +  - ]:        394 :     OCCQueryEngine::instance()->update_OCC_map(old_shell, new_shell);
     294         [ +  - ]:        394 :   return CUBIT_SUCCESS;
     295 [ +  - ][ +  - ]:       6364 : }
     296                 :            : // ********** END PUBLIC FUNCTIONS         **********
     297                 :            : 
     298                 :            : // ********** BEGIN PROTECTED FUNCTIONS    **********
     299                 :            : // ********** END PROTECTED FUNCTIONS      **********
     300                 :            : 
     301                 :            : // ********** BEGIN PRIVATE FUNCTIONS      **********
     302                 :            : // ********** END PRIVATE FUNCTIONS        **********
     303                 :            : 
     304                 :            : // ********** BEGIN HELPER CLASSES         **********
     305                 :            : // ********** END HELPER CLASSES           **********
     306                 :            : 
     307                 :            : // ********** BEGIN EXTERN FUNCTIONS       **********
     308                 :            : // ********** END EXTERN FUNCTIONS         **********
     309                 :            : 
     310                 :            : // ********** BEGIN STATIC FUNCTIONS       **********
     311                 :            : // ********** END STATIC FUNCTIONS         **********
     312                 :            : 

Generated by: LCOV version 1.11