LCOV - code coverage report
Current view: top level - geom/virtual - PartitionBody.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1 174 0.6 %
Date: 2020-06-30 00:58:45 Functions: 2 25 8.0 %
Branches: 2 358 0.6 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : PartitionBody.cpp
       3                 :            : //
       4                 :            : // Purpose       : 
       5                 :            : //
       6                 :            : // Special Notes : 
       7                 :            : //
       8                 :            : // Creator       : Jason Kraftcheck
       9                 :            : //
      10                 :            : // Creation Date : 02/14/03
      11                 :            : //-------------------------------------------------------------------------
      12                 :            : 
      13                 :            : #include "PartitionBody.hpp"
      14                 :            : #include "CubitTransformMatrix.hpp"
      15                 :            : #include "CubitFacetData.hpp"
      16                 :            : #include "CubitPointData.hpp"
      17                 :            : #include "PartitionPoint.hpp"
      18                 :            : #include "PartitionSurface.hpp"
      19                 :            : #include "SegmentedCurve.hpp"
      20                 :            : #include "PartitionCoEdge.hpp"
      21                 :            : #include "PartitionLump.hpp"
      22                 :            : #include "VirtualQueryEngine.hpp"
      23                 :            : 
      24                 :            : //-------------------------------------------------------------------------
      25                 :            : // Purpose       : Constructor
      26                 :            : //
      27                 :            : // Special Notes : 
      28                 :            : //
      29                 :            : // Creator       : Jason Kraftcheck
      30                 :            : //
      31                 :            : // Creation Date : 02/14/03
      32                 :            : //-------------------------------------------------------------------------
      33                 :          0 : PartitionBody::PartitionBody( BodySM* body )
      34         [ #  # ]:          0 :   : childList(0)
      35                 :            : { 
      36 [ #  # ][ #  # ]:          0 :   SubEntitySet* set = new SubEntitySet( body,this ); 
      37                 :          0 :   set->bodyNext = 0;
      38                 :          0 :   set->bodyPtr = this;
      39                 :          0 : }
      40                 :            : 
      41                 :            : 
      42                 :            : //-------------------------------------------------------------------------
      43                 :            : // Purpose       : Desturctor
      44                 :            : //
      45                 :            : // Special Notes : 
      46                 :            : //
      47                 :            : // Creator       : Jason Kraftcheck
      48                 :            : //
      49                 :            : // Creation Date : 02/14/03
      50                 :            : //-------------------------------------------------------------------------
      51         [ #  # ]:          0 : PartitionBody::~PartitionBody()
      52                 :            : { 
      53 [ #  # ][ #  # ]:          0 :   assert(! sub_entity_set().bodyNext);
      54         [ #  # ]:          0 :   sub_entity_set().bodyPtr = 0;
      55                 :            :   
      56         [ #  # ]:          0 :   while( SubEntitySet* dead = childList )
      57                 :            :   {
      58                 :          0 :     childList = dead->bodyNext;
      59                 :          0 :     dead->bodyNext = 0;
      60                 :          0 :     dead->bodyPtr = 0;
      61                 :          0 :   }
      62         [ #  # ]:          0 : }
      63                 :            : 
      64                 :            : //-------------------------------------------------------------------------
      65                 :            : // Purpose       : Get transform matrix
      66                 :            : //
      67                 :            : // Special Notes : 
      68                 :            : //
      69                 :            : // Creator       : Jason Kraftcheck
      70                 :            : //
      71                 :            : // Creation Date : 02/14/03
      72                 :            : //-------------------------------------------------------------------------
      73                 :          0 : CubitStatus PartitionBody::get_transforms( CubitTransformMatrix& xforms )
      74                 :            : {
      75                 :          0 :   return real_body()->get_transforms( xforms );
      76                 :            : }
      77                 :            : 
      78                 :            : //-------------------------------------------------------------------------
      79                 :            : // Purpose       : Attributes
      80                 :            : //
      81                 :            : // Special Notes : 
      82                 :            : //
      83                 :            : // Creator       : Jason Kraftcheck
      84                 :            : //
      85                 :            : // Creation Date : 02/14/03
      86                 :            : //-------------------------------------------------------------------------
      87                 :          0 : void PartitionBody::append_simple_attribute_virt(const CubitSimpleAttrib& csa)
      88                 :          0 :   { real_body()->append_simple_attribute_virt(csa); }
      89                 :          0 : void PartitionBody::remove_simple_attribute_virt(const CubitSimpleAttrib& csa)
      90                 :          0 :   { real_body()->remove_simple_attribute_virt(csa); }
      91                 :          0 : void PartitionBody::remove_all_simple_attribute_virt()
      92                 :          0 :   { real_body()->remove_all_simple_attribute_virt(); }
      93                 :          0 : CubitStatus PartitionBody::get_simple_attribute(DLIList<CubitSimpleAttrib>& list)
      94                 :          0 :   { return real_body()->get_simple_attribute(list); }
      95                 :          0 : CubitStatus PartitionBody::get_simple_attribute(const CubitString& name,
      96                 :            :                                        DLIList<CubitSimpleAttrib>& list)
      97                 :          0 :   { return real_body()->get_simple_attribute(name,list); }
      98                 :            : 
      99                 :            : //-------------------------------------------------------------------------
     100                 :            : // Purpose       : Which layer
     101                 :            : //
     102                 :            : // Special Notes : 
     103                 :            : //
     104                 :            : // Creator       : Jason Kraftcheck
     105                 :            : //
     106                 :            : // Creation Date : 02/14/03
     107                 :            : //-------------------------------------------------------------------------
     108                 :          0 : int PartitionBody::layer() const
     109                 :          0 :   { return sub_entity_set().get_owner_layer(); }
     110                 :            : 
     111                 :            : //-------------------------------------------------------------------------
     112                 :            : // Purpose       : get children
     113                 :            : //
     114                 :            : // Special Notes : 
     115                 :            : //
     116                 :            : // Creator       : Jason Kraftcheck
     117                 :            : //
     118                 :            : // Creation Date : 02/14/03
     119                 :            : //-------------------------------------------------------------------------
     120                 :          0 : void PartitionBody::get_parents_virt( DLIList<TopologyBridge*>& )
     121                 :          0 :   { }
     122                 :          0 : void PartitionBody::get_children_virt( DLIList<TopologyBridge*>& list )
     123                 :          0 :   { real_body()->get_children_virt(list); }
     124                 :            : 
     125                 :            : //-------------------------------------------------------------------------
     126                 :            : // Purpose       : get GQE
     127                 :            : //
     128                 :            : // Special Notes : 
     129                 :            : //
     130                 :            : // Creator       : Jason Kraftcheck
     131                 :            : //
     132                 :            : // Creation Date : 02/14/03
     133                 :            : //-------------------------------------------------------------------------
     134                 :          0 : GeometryQueryEngine* PartitionBody::get_geometry_query_engine() const
     135                 :          0 :   { return VirtualQueryEngine::instance(); }
     136                 :            :   
     137                 :            : //-------------------------------------------------------------------------
     138                 :            : // Purpose       : misc. junk from PartitionEntity
     139                 :            : //
     140                 :            : // Special Notes : 
     141                 :            : //
     142                 :            : // Creator       : Jason Kraftcheck
     143                 :            : //
     144                 :            : // Creation Date : 02/14/03
     145                 :            : //-------------------------------------------------------------------------
     146                 :          0 : void PartitionBody::reverse_sense() { assert(0); }
     147                 :          0 : void PartitionBody::notify_split(FacetEntity*, FacetEntity* ) { assert(0); }
     148                 :          0 : CubitStatus PartitionBody::save(CubitSimpleAttrib&) { return CUBIT_FAILURE; }
     149                 :            : 
     150                 :            : 
     151                 :            : //-------------------------------------------------------------------------
     152                 :            : // Purpose       : get bounding box
     153                 :            : //
     154                 :            : // Special Notes : 
     155                 :            : //
     156                 :            : // Creator       : Jason Kraftcheck
     157                 :            : //
     158                 :            : // Creation Date : 02/14/03
     159                 :            : //-------------------------------------------------------------------------
     160                 :          0 : CubitBox PartitionBody::bounding_box() const
     161                 :            : {
     162         [ #  # ]:          0 :   DLIList<TopologyBridge*> lumps;
     163 [ #  # ][ #  # ]:          0 :   real_body()->get_children_virt(lumps);
     164                 :            :   
     165 [ #  # ][ #  # ]:          0 :   CubitBox result = dynamic_cast<Lump*>(lumps.step_and_get())->bounding_box();
                 [ #  # ]
     166 [ #  # ][ #  # ]:          0 :   for( int i = 1; i < lumps.size(); i++ )
     167 [ #  # ][ #  # ]:          0 :     result |= dynamic_cast<Lump*>(lumps.step_and_get())->bounding_box();
         [ #  # ][ #  # ]
                 [ #  # ]
     168                 :            :   
     169         [ #  # ]:          0 :   return result;
     170                 :            : }
     171                 :            : 
     172                 :            : 
     173                 :            : //-------------------------------------------------------------------------
     174                 :            : // Purpose       : Get BodySM
     175                 :            : //
     176                 :            : // Special Notes : 
     177                 :            : //
     178                 :            : // Creator       : Jason Kraftcheck
     179                 :            : //
     180                 :            : // Creation Date : 02/14/03
     181                 :            : //-------------------------------------------------------------------------
     182                 :          0 : BodySM* PartitionBody::real_body() const
     183         [ #  # ]:          0 :   { return dynamic_cast<BodySM*>(partitioned_entity()); }
     184                 :            : 
     185                 :            : 
     186                 :            : //-------------------------------------------------------------------------
     187                 :            : // Purpose       : Add an entity to the list we need to transform
     188                 :            : //
     189                 :            : // Special Notes : 
     190                 :            : //
     191                 :            : // Creator       : Jason Kraftcheck
     192                 :            : //
     193                 :            : // Creation Date : 02/14/03
     194                 :            : //-------------------------------------------------------------------------
     195                 :          0 : void PartitionBody::add( SubEntitySet& set )
     196                 :            : {
     197         [ #  # ]:          0 :   assert(!set.bodyPtr);
     198                 :          0 :   set.bodyPtr = this;
     199                 :          0 :   set.bodyNext = childList;
     200                 :          0 :   childList = &set;
     201                 :          0 : }
     202                 :            : 
     203                 :            : //-------------------------------------------------------------------------
     204                 :            : // Purpose       : Remove an entity from the list of entities to transform
     205                 :            : //
     206                 :            : // Special Notes : 
     207                 :            : //
     208                 :            : // Creator       : Jason Kraftcheck
     209                 :            : //
     210                 :            : // Creation Date : 02/14/03
     211                 :            : //-------------------------------------------------------------------------
     212                 :          0 : void PartitionBody::remove( SubEntitySet& set )
     213                 :            : {
     214         [ #  # ]:          0 :   assert(set.bodyPtr == this);
     215         [ #  # ]:          0 :   if( childList == &set )
     216                 :            :   {
     217                 :          0 :     childList = set.bodyNext;
     218                 :            :   }
     219                 :            :   else
     220                 :            :   {
     221                 :          0 :     SubEntitySet* ptr = childList;
     222         [ #  # ]:          0 :     while( ptr->bodyNext != &set )
     223                 :            :     {
     224                 :          0 :       ptr = ptr->bodyNext;
     225         [ #  # ]:          0 :       assert(!!ptr);
     226                 :            :     }
     227                 :          0 :     ptr->bodyNext = set.bodyNext;
     228                 :            :   }
     229                 :          0 :   set.bodyNext = 0;
     230                 :          0 :   set.bodyPtr = 0;
     231                 :          0 : }
     232                 :            : 
     233                 :            :   
     234                 :            : //-------------------------------------------------------------------------
     235                 :            : // Purpose       : Remove all child partition geometry (body deleted)
     236                 :            : //
     237                 :            : // Special Notes : 
     238                 :            : //
     239                 :            : // Creator       : Jason Kraftcheck
     240                 :            : //
     241                 :            : // Creation Date : 04/04/03
     242                 :            : //-------------------------------------------------------------------------
     243                 :          0 : void PartitionBody::destroy_all_children()
     244                 :            : {
     245         [ #  # ]:          0 :   DLIList<PartitionLump*> lumps;
     246 [ #  # ][ #  # ]:          0 :   DLIList<PartitionSurface*> surfs;
     247 [ #  # ][ #  # ]:          0 :   DLIList<PartitionCoEdge*> coedges;
     248 [ #  # ][ #  # ]:          0 :   DLIList<PartitionCurve*> curves;
     249 [ #  # ][ #  # ]:          0 :   DLIList<PartitionPoint*> points;
     250                 :            :   
     251 [ #  # ][ #  # ]:          0 :   DLIList<PartitionEntity*> sub_geom, split_geom;
         [ #  # ][ #  # ]
     252 [ #  # ][ #  # ]:          0 :   for ( SubEntitySet* ptr = childList; ptr; ptr = ptr->next_in_body() )
     253                 :            :   {
     254         [ #  # ]:          0 :     ptr->get_sub_entities( sub_geom );
     255         [ #  # ]:          0 :     ptr->get_lower_order( split_geom );
     256         [ #  # ]:          0 :     sub_geom += split_geom;
     257         [ #  # ]:          0 :     split_geom.clean_out();
     258 [ #  # ][ #  # ]:          0 :     while( sub_geom.size() )
     259                 :            :     { 
     260         [ #  # ]:          0 :       PartitionEntity* ent = sub_geom.pop();
     261 [ #  # ][ #  # ]:          0 :       if ( PartitionPoint* point = dynamic_cast<PartitionPoint*>(ent) )
     262         [ #  # ]:          0 :         points.append(point);
     263 [ #  # ][ #  # ]:          0 :       else if( PartitionCoEdge* coedge = dynamic_cast<PartitionCoEdge*>(ent) )
     264         [ #  # ]:          0 :         coedges.append(coedge);
     265 [ #  # ][ #  # ]:          0 :       else if( PartitionCurve* curve = dynamic_cast<PartitionCurve*>(ent) )
     266         [ #  # ]:          0 :         curves.append(curve);
     267 [ #  # ][ #  # ]:          0 :       else if( PartitionSurface* surf = dynamic_cast<PartitionSurface*>(ent) )
     268         [ #  # ]:          0 :         surfs.append(surf);
     269 [ #  # ][ #  # ]:          0 :       else if ( PartitionLump* lump = dynamic_cast<PartitionLump*>(ent) )
     270         [ #  # ]:          0 :         lumps.append(lump);
     271                 :            :       else
     272                 :          0 :         assert(0);
     273                 :            :     }
     274                 :            :   }
     275                 :            :   
     276 [ #  # ][ #  # ]:          0 :   while( lumps.size() )
     277                 :            :   {
     278         [ #  # ]:          0 :     PartitionLump* lump = lumps.pop();
     279 [ #  # ][ #  # ]:          0 :     while( PartitionShell* shell = lump->first_shell() )
     280                 :            :     {
     281         [ #  # ]:          0 :       lump->remove(shell);
     282         [ #  # ]:          0 :       shell->remove_all_surfaces();
     283 [ #  # ][ #  # ]:          0 :       delete shell;
     284                 :            :     }
     285 [ #  # ][ #  # ]:          0 :     delete lump;
     286                 :          0 :   }
     287                 :            : 
     288 [ #  # ][ #  # ]:          0 :   while( surfs.size() )
     289                 :            :   {
     290         [ #  # ]:          0 :     PartitionSurface* surf = surfs.pop();
     291 [ #  # ][ #  # ]:          0 :     while( PartitionLoop* loop = surf->next_loop(NULL) )
     292                 :            :     {
     293         [ #  # ]:          0 :       surf->remove(loop);
     294         [ #  # ]:          0 :       loop->remove_all_coedges();
     295 [ #  # ][ #  # ]:          0 :       delete loop;
     296                 :            :     }
     297 [ #  # ][ #  # ]:          0 :     delete surf;
     298                 :          0 :   }
     299                 :            : 
     300 [ #  # ][ #  # ]:          0 :   while( coedges.size() )
     301                 :            :   {
     302         [ #  # ]:          0 :     PartitionCoEdge* coedge = coedges.pop();
     303 [ #  # ][ #  # ]:          0 :     if (coedge->get_curve() != NULL)
     304 [ #  # ][ #  # ]:          0 :        coedge->get_curve()->remove( coedge );
     305 [ #  # ][ #  # ]:          0 :     delete coedge;
     306                 :            :   }
     307                 :            : 
     308 [ #  # ][ #  # ]:          0 :   while( curves.size() )
     309                 :            :   {
     310         [ #  # ]:          0 :     PartitionCurve* curve = curves.pop();
     311 [ #  # ][ #  # ]:          0 :     assert( !curve->next_coedge(NULL) );
     312 [ #  # ][ #  # ]:          0 :     delete curve;
     313                 :            :   }
     314                 :            : 
     315 [ #  # ][ #  # ]:          0 :   while( points.size() )
     316                 :            :   {
     317         [ #  # ]:          0 :     PartitionPoint* point = points.pop();
     318 [ #  # ][ #  # ]:          0 :     assert( !point->num_curves() );
     319 [ #  # ][ #  # ]:          0 :     delete point;
     320         [ #  # ]:          0 :   }
     321                 :            : 
     322                 :            :   // All child SubEntitySets should have been deleted when they
     323                 :            :   // became empty, and should be removed from the list in this
     324                 :            :   // body as they are destroyed.  However, when the last SubEntitySet
     325                 :            :   // in this body is destroyed, this body will be destroyed as well.
     326                 :            :   // So don't do this check!
     327                 :            :   //assert(!childList);
     328                 :          0 : }
     329                 :            : 
     330                 :            : //-------------------------------------------------------------------------
     331                 :            : // Purpose       : 
     332                 :            : //
     333                 :            : // Special Notes : 
     334                 :            : //
     335                 :            : // Creator       : Jason Kraftcheck
     336                 :            : //
     337                 :            : // Creation Date : 05/10/04
     338                 :            : //-------------------------------------------------------------------------
     339                 :          0 : CubitStatus PartitionBody::mass_properties( CubitVector& result, double& volume )
     340                 :            : {
     341         [ #  # ]:          0 :   DLIList<Lump*> lump_list;
     342         [ #  # ]:          0 :   lumps( lump_list );
     343                 :            :   
     344 [ #  # ][ #  # ]:          0 :   DLIList<PartitionLump*> part_list;
     345 [ #  # ][ #  # ]:          0 :   CAST_LIST( lump_list, part_list, PartitionLump );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     346 [ #  # ][ #  # ]:          0 :   if (part_list.size() < lump_list.size())
                 [ #  # ]
     347 [ #  # ][ #  # ]:          0 :     return real_body()->mass_properties( result, volume );
     348                 :            :   
     349 [ #  # ][ #  # ]:          0 :   CubitVector centroid(0.0, 0.0, 0.0), tmp_centroid;
     350                 :          0 :   volume = 0.0;
     351                 :            :   double tmp_volume;
     352 [ #  # ][ #  # ]:          0 :   for (int i = part_list.size(); i--; )
     353                 :            :   {
     354         [ #  # ]:          0 :     if (CUBIT_FAILURE == 
     355 [ #  # ][ #  # ]:          0 :         part_list.get_and_step()->mass_properties( tmp_centroid, tmp_volume ))
     356                 :          0 :       return CUBIT_FAILURE;
     357                 :            :     
     358 [ #  # ][ #  # ]:          0 :     centroid += tmp_volume * tmp_centroid;
     359                 :          0 :     volume += tmp_volume;
     360                 :            :   }
     361                 :            :   
     362         [ #  # ]:          0 :   if (volume > CUBIT_RESABS)
     363                 :            :   {
     364 [ #  # ][ #  # ]:          0 :     result = centroid / volume;
     365                 :            :   }
     366                 :            :   else
     367                 :            :   {
     368         [ #  # ]:          0 :     result.set( 0.0, 0.0, 0.0 );
     369                 :          0 :     volume = 0.0;
     370                 :            :   }
     371         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     372                 :            : }
     373                 :            : 
     374                 :            : //-------------------------------------------------------------------------
     375                 :            : // Purpose       : 
     376                 :            : //
     377                 :            : // Special Notes : 
     378                 :            : //
     379                 :            : // Creator       : Jason Kraftcheck
     380                 :            : //
     381                 :            : // Creation Date : 05/10/04
     382                 :            : //-------------------------------------------------------------------------
     383                 :          0 : CubitPointContainment PartitionBody::point_containment( const CubitVector& pos,
     384                 :            :   double tolerance )
     385                 :            : {
     386         [ #  # ]:          0 :   DLIList<Lump*> lump_list;
     387         [ #  # ]:          0 :   lumps( lump_list );
     388                 :            :   
     389 [ #  # ][ #  # ]:          0 :   DLIList<PartitionLump*> part_list;
     390 [ #  # ][ #  # ]:          0 :   CAST_LIST( lump_list, part_list, PartitionLump );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     391                 :            :   
     392 [ #  # ][ #  # ]:          0 :   if (part_list.size() < lump_list.size())
                 [ #  # ]
     393                 :            :   {
     394 [ #  # ][ #  # ]:          0 :     return real_body()->point_containment( pos, tolerance );
     395                 :            :   }
     396                 :            :   
     397                 :          0 :   bool inside = false, on = false;
     398         [ #  # ]:          0 :   part_list.reset();
     399 [ #  # ][ #  # ]:          0 :   for (int i = part_list.size(); i--; )
     400                 :            :   {
     401 [ #  # ][ #  # ]:          0 :     switch( part_list.get_and_step()->point_containment( pos ) )
           [ #  #  #  # ]
     402                 :            :     {
     403                 :            :       case CUBIT_PNT_INSIDE:
     404                 :          0 :         inside = true;
     405                 :          0 :         break;
     406                 :            :       case CUBIT_PNT_BOUNDARY:
     407                 :          0 :         on = true;
     408                 :          0 :         break;
     409                 :            :       case CUBIT_PNT_OUTSIDE:
     410                 :          0 :         break;
     411                 :            :       default:
     412                 :          0 :         return CUBIT_PNT_UNKNOWN;
     413                 :            :     }
     414                 :            :   }
     415                 :            :   
     416         [ #  # ]:          0 :   if (inside)
     417                 :          0 :     return CUBIT_PNT_INSIDE;
     418         [ #  # ]:          0 :   else if(on)
     419                 :          0 :     return CUBIT_PNT_BOUNDARY;
     420                 :            :   else
     421         [ #  # ]:          0 :     return CUBIT_PNT_OUTSIDE; 
     422                 :            : }
     423                 :            : 
     424                 :            : //-------------------------------------------------------------------------
     425                 :            : // Purpose       : 
     426                 :            : //
     427                 :            : // Special Notes : 
     428                 :            : //
     429                 :            : // Creator       : Jason Kraftcheck
     430                 :            : //
     431                 :            : // Creation Date : 05/26/04
     432                 :            : //-------------------------------------------------------------------------
     433                 :          0 : void PartitionBody::get_all_children( DLIList<PartitionEntity*>& list )
     434                 :            : {
     435         [ #  # ]:          0 :   DLIList<PartitionEntity*> tmp;
     436         [ #  # ]:          0 :   for (SubEntitySet* ptr = childList; ptr; ptr = ptr->bodyNext )
     437                 :            :   {
     438         [ #  # ]:          0 :     tmp.clean_out();
     439         [ #  # ]:          0 :     ptr->get_sub_entities( tmp );
     440         [ #  # ]:          0 :     list += tmp;
     441                 :            :     
     442         [ #  # ]:          0 :     tmp.clean_out();
     443         [ #  # ]:          0 :     ptr->get_lower_order( tmp );
     444         [ #  # ]:          0 :     list += tmp;
     445         [ #  # ]:          0 :   }
     446 [ +  - ][ +  - ]:       6364 : }

Generated by: LCOV version 1.11