LCOV - code coverage report
Current view: top level - geom/OCC - OCCLoop.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 85 130 65.4 %
Date: 2020-06-30 00:58:45 Functions: 11 18 61.1 %
Branches: 108 308 35.1 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : OCCLoop.cpp
       3                 :            : //
       4                 :            : // Purpose       : Loops for Facet-based geometry module
       5                 :            : //
       6                 :            : // Special Notes :
       7                 :            : //
       8                 :            : // Creator       : Steven J. Owen
       9                 :            : //
      10                 :            : // Creation Date : 12/06/00
      11                 :            : //
      12                 :            : // Owner         : Steven J. Owen
      13                 :            : //-------------------------------------------------------------------------
      14                 :            : 
      15                 :            : #include "CastTo.hpp"
      16                 :            : #include "OCCLoop.hpp"
      17                 :            : #include "OCCQueryEngine.hpp"
      18                 :            : #include "CoEdgeSM.hpp"
      19                 :            : 
      20                 :            : #include "OCCBody.hpp"
      21                 :            : #include "OCCLump.hpp"
      22                 :            : #include "OCCShell.hpp"
      23                 :            : #include "OCCSurface.hpp"
      24                 :            : #include "OCCCoEdge.hpp"
      25                 :            : #include "OCCCurve.hpp"
      26                 :            : #include "OCCPoint.hpp"
      27                 :            : 
      28                 :            : #include <TopExp.hxx>
      29                 :            : #include <TopTools_IndexedMapOfShape.hxx>
      30                 :            : #include "TopExp_Explorer.hxx"
      31                 :            : #include "TopoDS.hxx"
      32                 :            : #include "TopTools_ListIteratorOfListOfShape.hxx"
      33                 :            : #include "TopTools_DataMapOfShapeInteger.hxx"
      34                 :            : #include "TopTools_DataMapOfOrientedShapeInteger.hxx"
      35                 :            : #include "TopTools_IndexedDataMapOfShapeListOfShape.hxx"
      36                 :            : #include "BRepBuilderAPI_Transform.hxx"
      37                 :            : #include "BRepBuilderAPI_GTransform.hxx"
      38                 :            : #include "BRepBuilderAPI_ModifyShape.hxx"
      39                 :            : #include "BRepAlgoAPI_BooleanOperation.hxx"
      40                 :            : #include "LocOpe_SplitShape.hxx"
      41                 :            : #include "BRepTools_WireExplorer.hxx"
      42                 :            : // ********** END CUBIT INCLUDES           **********
      43                 :            : 
      44                 :            : // ********** BEGIN STATIC DECLARATIONS    **********
      45                 :            : // ********** END STATIC DECLARATIONS      **********
      46                 :            : 
      47                 :            : // ********** BEGIN PUBLIC FUNCTIONS       **********
      48                 :            : 
      49                 :            : //-------------------------------------------------------------------------
      50                 :            : // Purpose       : The constructor with a pointer to the TopoDS_Wire.
      51                 :            : //
      52                 :            : // Special Notes :
      53                 :            : //
      54                 :            : //-------------------------------------------------------------------------
      55         [ +  - ]:      34562 : OCCLoop::OCCLoop( TopoDS_Wire *theWire )
      56                 :            : {
      57                 :      17281 :   myTopoDSWire = theWire;
      58                 :      17281 : }
      59                 :            : 
      60                 :            : //-------------------------------------------------------------------------
      61                 :            : // Purpose       : The default destructor.
      62                 :            : //
      63                 :            : // Special Notes :
      64                 :            : //
      65                 :            : //-------------------------------------------------------------------------
      66         [ +  - ]:      32559 : OCCLoop::~OCCLoop()
      67                 :            : {
      68         [ +  - ]:      10853 :   disconnect_all_curves();
      69         [ +  - ]:      10853 :   if (myTopoDSWire)
      70                 :            :   {
      71         [ +  - ]:      10853 :     myTopoDSWire->Nullify(); 
      72 [ +  - ][ +  - ]:      10853 :     delete (TopoDS_Wire*)myTopoDSWire;
                 [ +  - ]
      73                 :      10853 :     myTopoDSWire = NULL;
      74                 :            :   }
      75         [ -  + ]:      21706 : }
      76                 :            : 
      77                 :       6259 : void OCCLoop::set_TopoDS_Wire(TopoDS_Wire loop)
      78                 :            : {
      79 [ +  - ][ +  + ]:       6259 :    if(myTopoDSWire && loop.IsEqual(*myTopoDSWire))
                 [ +  + ]
      80                 :       6259 :      return;
      81 [ +  - ][ +  + ]:       4925 :    if(myTopoDSWire && !loop.IsSame(*myTopoDSWire))
                 [ +  + ]
      82                 :            :    {
      83         [ +  - ]:       4518 :      DLIList<OCCCoEdge*> coedges = this->coedges();
      84 [ +  - ][ +  + ]:      20070 :      for(int i = 0; i < coedges.size(); i++)
      85                 :            :      {
      86         [ +  - ]:      15552 :        OCCCoEdge* coedge = coedges.get_and_step();
      87 [ +  - ][ -  + ]:      15552 :        OCCCurve* curve = CAST_TO(coedge->curve(), OCCCurve);
      88         [ +  - ]:      15552 :        TopoDS_Edge *edge = curve->get_TopoDS_Edge( );
      89         [ +  - ]:      15552 :        BRepTools_WireExplorer Ex;
      90                 :      15552 :        CubitBoolean found = false;
      91 [ +  - ][ +  - ]:      54304 :        for (Ex.Init(loop); Ex.More(); Ex.Next())
         [ +  - ][ +  + ]
      92                 :            :        {
      93 [ +  - ][ +  - ]:      38752 :          TopoDS_Shape crv = Ex.Current();
      94 [ +  - ][ +  + ]:      38752 :          if(edge->IsPartner(crv))
      95                 :            :          {
      96                 :      15310 :            found = true;
      97 [ +  - ][ +  + ]:      38752 :            break;
      98                 :            :          }
      99                 :      23442 :        }
     100         [ +  + ]:      15552 :        if (!found)
     101         [ +  - ]:        242 :          curve->remove_loop(this); 
     102 [ +  - ][ +  - ]:      20070 :      }
     103                 :            :    }
     104         [ +  - ]:       4925 :    TopoDS_Wire* the_wire = new TopoDS_Wire(loop);
     105         [ +  - ]:       4925 :    if(myTopoDSWire)
     106         [ +  - ]:       4925 :      delete (TopoDS_Wire*)myTopoDSWire;
     107                 :       4925 :    myTopoDSWire = the_wire;
     108                 :            : }
     109                 :            : //-------------------------------------------------------------------------
     110                 :            : // Purpose       : Tear down topology
     111                 :            : //
     112                 :            : // Special Notes :
     113                 :            : //
     114                 :            : // Creator       : Jane Hu
     115                 :            : //
     116                 :            : // Creation Date : 11/29/07
     117                 :            : //-------------------------------------------------------------------------
     118                 :      10853 : void OCCLoop::disconnect_all_curves()
     119                 :            : {
     120                 :      10853 :   myCoEdgeList.clean_out();
     121                 :      10853 : }
     122                 :            : 
     123                 :      40679 : OCCCoEdge* OCCLoop::remove_coedge(OCCCoEdge *coedge)
     124                 :            : { 
     125         [ +  - ]:      40679 :   if(myCoEdgeList.remove(coedge))
     126                 :      40679 :     return coedge;
     127                 :          0 :   return NULL;
     128                 :            : }
     129                 :            : 
     130                 :            : //-------------------------------------------------------------------------
     131                 :            : // Purpose       : The purpose of this function is to append a
     132                 :            : //                 attribute to the GE. The name is attached to the
     133                 :            : //                 underlying solid model entity this one points to.
     134                 :            : //
     135                 :            : //
     136                 :            : // Special Notes :
     137                 :            : //
     138                 :            : //-------------------------------------------------------------------------
     139                 :          0 : void OCCLoop::append_simple_attribute_virt(const CubitSimpleAttrib& /*csattrib_ptr*/)
     140                 :            : {
     141                 :          0 : }
     142                 :            : 
     143                 :            : //-------------------------------------------------------------------------
     144                 :            : // Purpose       : The purpose of this function is to remove a simple
     145                 :            : //                 attribute attached to this geometry entity. The name is
     146                 :            : //                 removed from the underlying BODY this points to.
     147                 :            : //
     148                 :            : // Special Notes :
     149                 :            : //
     150                 :            : //-------------------------------------------------------------------------
     151                 :          0 : void OCCLoop::remove_simple_attribute_virt(const CubitSimpleAttrib& /*csattrib_ptr*/)
     152                 :            : {
     153                 :          0 : }
     154                 :            : 
     155                 :            : //-------------------------------------------------------------------------
     156                 :            : // Purpose       : The purpose of this function is to remove all simple
     157                 :            : //                 attributes attached to this geometry entity.  Also
     158                 :            : //                 removes lingering GTC attributes.
     159                 :            : //
     160                 :            : //
     161                 :            : // Special Notes :
     162                 :            : //
     163                 :            : //-------------------------------------------------------------------------
     164                 :          0 : void OCCLoop::remove_all_simple_attribute_virt()
     165                 :            : {
     166                 :          0 : }
     167                 :            : 
     168                 :            : //-------------------------------------------------------------------------
     169                 :            : // Purpose       : The purpose of this function is to get the
     170                 :            : //                 attributes attached to this geometry entity. The name is
     171                 :            : //                 attached to the underlying BODY this points to.
     172                 :            : //
     173                 :            : // Special Notes :
     174                 :            : //
     175                 :            : //-------------------------------------------------------------------------
     176                 :          0 : CubitStatus OCCLoop::get_simple_attribute(DLIList<CubitSimpleAttrib>&
     177                 :            :                                                  /*cubit_simple_attrib_list*/)
     178                 :            : {
     179                 :          0 :   return CUBIT_FAILURE;
     180                 :            : }
     181                 :          0 : CubitStatus OCCLoop::get_simple_attribute(const CubitString&,
     182                 :            :                                           DLIList<CubitSimpleAttrib>&)
     183                 :          0 :   { return CUBIT_FAILURE; }
     184                 :            : 
     185                 :        314 : void OCCLoop::get_parents_virt( DLIList<TopologyBridge*>& parents )
     186                 :            : {
     187         [ +  - ]:        314 :   OCCQueryEngine* oqe = (OCCQueryEngine*) get_geometry_query_engine();
     188                 :        314 :   OCCSurface * surf = NULL;
     189                 :        314 :   DLIList <OCCSurface* > *surfs = oqe->SurfaceList;
     190         [ +  - ]:        314 :   TopTools_IndexedDataMapOfShapeListOfShape M;
     191 [ +  - ][ +  + ]:       7850 :   for(int i = 0; i <  surfs->size(); i++)
     192                 :            :   {
     193         [ +  - ]:       7536 :      surf = surfs->get_and_step();
     194         [ +  - ]:       7536 :      TopExp::MapShapesAndAncestors(*(surf->get_TopoDS_Face()),
     195         [ +  - ]:       7536 :                                    TopAbs_WIRE, TopAbs_FACE, M);
     196 [ +  - ][ +  - ]:       7536 :      if (!M.Contains(*(get_TopoDS_Wire())))
                 [ +  + ]
     197                 :       3898 :         continue;
     198                 :            : 
     199                 :            :      const TopTools_ListOfShape& ListOfShapes =
     200 [ +  - ][ +  - ]:       3638 :                                 M.FindFromKey(*(get_TopoDS_Wire()));
     201 [ +  - ][ +  - ]:       3638 :      if (!ListOfShapes.IsEmpty())
     202                 :            :      {
     203         [ +  - ]:       3638 :          TopTools_ListIteratorOfListOfShape it(ListOfShapes) ;
     204 [ +  - ][ +  - ]:       7276 :          for (;it.More(); it.Next())
                 [ +  + ]
     205                 :            :          {
     206 [ +  - ][ +  - ]:       3638 :            TopoDS_Face Face = TopoDS::Face(it.Value());
                 [ +  - ]
     207         [ +  - ]:       3638 :            int k = oqe->OCCMap->Find(Face);
     208 [ +  - ][ +  - ]:       3638 :            parents.append_unique((OCCSurface*)(oqe->OccToCGM->find(k))->second);
                 [ +  - ]
     209         [ +  - ]:       3638 :          }
     210                 :            :      }
     211         [ +  - ]:        314 :   }
     212                 :        314 : }
     213                 :            : 
     214                 :     116545 : void OCCLoop::get_children_virt( DLIList<TopologyBridge*>& children )
     215                 :            : {
     216 [ +  - ][ +  + ]:     561069 :   CAST_LIST_TO_PARENT(myCoEdgeList, children);
     217                 :     116545 : }
     218                 :            : 
     219                 :            : //-------------------------------------------------------------------------
     220                 :            : // Purpose       : compute bounding box of loop
     221                 :            : //
     222                 :            : // Special Notes :
     223                 :            : //
     224                 :            : //-------------------------------------------------------------------------
     225                 :          0 : CubitBox OCCLoop::bounding_box() const
     226                 :            : {
     227                 :          0 :    CubitBox box;
     228 [ #  # ][ #  # ]:          0 :    for (int i = myCoEdgeList.size(); i > 0; i--)
     229                 :            :    {
     230         [ #  # ]:          0 :       DLIList<OCCCoEdge*> coedges = myCoEdgeList;
     231         [ #  # ]:          0 :       OCCCoEdge* coedge = coedges.get_and_step();
     232 [ #  # ][ #  # ]:          0 :       box |= coedge->curve()->bounding_box();
         [ #  # ][ #  # ]
     233         [ #  # ]:          0 :    }
     234                 :          0 :    return box;
     235                 :            : }
     236                 :            : 
     237                 :            : //-------------------------------------------------------------------------
     238                 :            : // Purpose       : Get geometry modeling engine: OCCQueryEngine
     239                 :            : //
     240                 :            : // Special Notes :
     241                 :            : //
     242                 :            : //-------------------------------------------------------------------------
     243                 :        314 : GeometryQueryEngine* OCCLoop::get_geometry_query_engine() const
     244                 :            : {
     245                 :        314 :    return OCCQueryEngine::instance();
     246                 :            : }                
     247                 :            : 
     248                 :            : 
     249                 :            : //----------------------------------------------------------------
     250                 :            : // Function: to update the core Loop
     251                 :            : //           for any movement of the body/surface.
     252                 :            : // Author: Jane Hu
     253                 :            : //----------------------------------------------------------------
     254                 :       3770 : CubitStatus OCCLoop::update_OCC_entity( BRepBuilderAPI_ModifyShape *aBRepTrsf,
     255                 :            :                                         BRepAlgoAPI_BooleanOperation *op)
     256                 :            : {
     257 [ -  + ][ #  # ]:       3770 :   assert(aBRepTrsf != NULL || op != NULL);
     258                 :            : 
     259         [ +  - ]:       3770 :   TopoDS_Shape shape;
     260                 :       3770 :   CubitBoolean need_update = CUBIT_TRUE;
     261                 :       3770 :   BRepBuilderAPI_Transform* pTrsf = NULL;
     262                 :       3770 :   BRepBuilderAPI_GTransform* gTrsf = NULL;
     263         [ +  - ]:       3770 :   if(aBRepTrsf)
     264                 :            :   {
     265                 :       3770 :     pTrsf = (BRepBuilderAPI_Transform*)aBRepTrsf;
     266 [ +  - ][ +  - ]:       3770 :     shape = pTrsf->ModifiedShape(*get_TopoDS_Wire());
                 [ +  - ]
     267 [ +  - ][ -  + ]:       3770 :     if(shape.IsNull())
     268                 :            :     {
     269                 :          0 :       gTrsf = (BRepBuilderAPI_GTransform*)aBRepTrsf;
     270 [ #  # ][ #  # ]:          0 :       shape = gTrsf->ModifiedShape(*get_TopoDS_Wire());
                 [ #  # ]
     271                 :            :     }
     272                 :            :   }
     273                 :            :   else
     274                 :            :   {
     275         [ #  # ]:          0 :     TopTools_ListOfShape shapes; 
     276 [ #  # ][ #  # ]:          0 :     shapes.Assign(op->Modified(*get_TopoDS_Wire()));
                 [ #  # ]
     277 [ #  # ][ #  # ]:          0 :     if(shapes.Extent() == 0)
     278 [ #  # ][ #  # ]:          0 :          shapes.Assign(op->Generated(*get_TopoDS_Wire()));
                 [ #  # ]
     279 [ #  # ][ #  # ]:          0 :     if(shapes.Extent())
     280 [ #  # ][ #  # ]:          0 :       shape = shapes.First();
     281 [ #  # ][ #  # ]:          0 :     else if (op->IsDeleted(*get_TopoDS_Wire()))
                 [ #  # ]
     282                 :            :       ;
     283                 :            :     else
     284         [ #  # ]:          0 :       need_update = CUBIT_FALSE;
     285                 :            :   }
     286                 :            : 
     287                 :            :   //set the curves
     288 [ +  - ][ +  + ]:      17166 :   for (int i = 1; i <= myCoEdgeList.size(); i++)
     289                 :            :   {
     290 [ +  - ][ +  - ]:      13396 :      OCCCurve *curve = CAST_TO(myCoEdgeList.get_and_step()->curve(), OCCCurve);
                 [ -  + ]
     291         [ +  - ]:      13396 :      curve->update_OCC_entity(aBRepTrsf, op);
     292                 :            :   }
     293 [ +  - ][ +  - ]:       7540 :   TopoDS_Wire loop;
     294         [ +  - ]:       3770 :   if (need_update)
     295                 :            :   {
     296 [ +  - ][ +  - ]:       3770 :     loop = TopoDS::Wire(shape);
     297 [ +  - ][ +  - ]:       3770 :     OCCQueryEngine::instance()->update_OCC_map(*myTopoDSWire, loop);
     298                 :            :   }
     299         [ +  - ]:       3770 :   return CUBIT_SUCCESS;
     300                 :            : }
     301                 :            : 
     302                 :            : //----------------------------------------------------------------
     303                 :            : // Function: TopoDS_Shape level function to update the core Loop
     304                 :            : //           for split Boolean operation of the body.
     305                 :            : // Author: Jane Hu
     306                 :            : //----------------------------------------------------------------
     307                 :          0 : CubitStatus OCCLoop::update_OCC_entity(TopoDS_Wire & old_loop,
     308                 :            :                                        LocOpe_SplitShape* sp)
     309                 :            : {
     310         [ #  # ]:          0 :   TopTools_ListOfShape shapes;
     311 [ #  # ][ #  # ]:          0 :   shapes.Assign(sp->DescendantShapes(old_loop));
     312 [ #  # ][ #  # ]:          0 :   assert(shapes.Extent() == 1);
     313 [ #  # ][ #  # ]:          0 :   TopoDS_Shape new_loop = shapes.First();
                 [ #  # ]
     314 [ #  # ][ #  # ]:          0 :   TopoDS_Shape shape_edge;
     315                 :            : 
     316                 :            :   //set curves
     317 [ #  # ][ #  # ]:          0 :   BRepTools_WireExplorer Ex;
     318 [ #  # ][ #  # ]:          0 :   for(Ex.Init(old_loop); Ex.More();Ex.Next())   
         [ #  # ][ #  # ]
     319                 :            :   {
     320 [ #  # ][ #  # ]:          0 :     TopoDS_Edge edge = Ex.Current();
     321 [ #  # ][ #  # ]:          0 :     shapes.Assign(sp->DescendantShapes(edge));
     322 [ #  # ][ #  # ]:          0 :     if(shapes.Extent() > 1)
     323                 :            :     {
     324 [ #  # ][ #  # ]:          0 :       shape_edge = shapes.First();
     325                 :            :      
     326 [ #  # ][ #  # ]:          0 :       OCCQueryEngine::instance()->update_OCC_map(edge, shape_edge);
     327                 :            :     } 
     328         [ #  # ]:          0 :   }
     329                 :            :   
     330 [ #  # ][ #  # ]:          0 :   OCCQueryEngine::instance()->update_OCC_map(old_loop , new_loop );
     331         [ #  # ]:          0 :   return CUBIT_SUCCESS; 
     332 [ +  - ][ +  - ]:       6364 : }

Generated by: LCOV version 1.11