LCOV - code coverage report
Current view: top level - geom - RefGroup.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 149 310 48.1 %
Date: 2020-06-30 00:58:45 Functions: 19 33 57.6 %
Branches: 156 584 26.7 %

           Branch data     Line data    Source code
       1                 :            : //-- File: RefGroup.cc
       2                 :            : 
       3                 :            : #include <stdio.h>
       4                 :            : #include <string.h>
       5                 :            : #include <assert.h>
       6                 :            : 
       7                 :            : #include "RefGroup.hpp"
       8                 :            : #include "CubitObservable.hpp"
       9                 :            : #include "CubitBox.hpp"
      10                 :            : #include "DLIList.hpp"  
      11                 :            : #include "CastTo.hpp"
      12                 :            : #include "GeometryQueryTool.hpp"
      13                 :            : #include "RefEntityFactory.hpp"
      14                 :            : #include "AppUtil.hpp"
      15                 :            : #include "GeometryEvent.hpp"
      16                 :            : 
      17 [ +  - ][ +  - ]:        280 : RefGroup::RefGroup( const char* name, int id)
      18                 :            : {
      19                 :        140 :   recursionMark = 0;
      20                 :            : 
      21         [ +  - ]:        140 :   if( id == 0 )
      22 [ +  - ][ +  - ]:        140 :     entityId = RefEntityFactory::instance()->next_ref_group_id();
      23                 :            :   else 
      24                 :          0 :     entityId = id;
      25                 :            : 
      26                 :            :   // assign default names
      27         [ +  - ]:        140 :   assign_default_name();
      28                 :            :   
      29         [ +  + ]:        140 :   if (name != NULL)
      30 [ +  - ][ +  - ]:         11 :     entity_name( name );
                 [ +  - ]
      31                 :        140 : }
      32                 :            : 
      33 [ #  # ][ #  # ]:          0 : RefGroup::RefGroup (DLIList<RefEntity*>& entity_list)
      34                 :            : {
      35                 :          0 :   recursionMark = 0;
      36                 :            :   //entityList = entity_list;
      37                 :            :   int i;
      38 [ #  # ][ #  # ]:          0 :   for ( i = entity_list.size(); i > 0; i-- )
      39                 :            :   {
      40         [ #  # ]:          0 :     RefEntity *ent_ptr = entity_list.get_and_step();
      41 [ #  # ][ #  # ]:          0 :     if ( !entityList.move_to(ent_ptr) )
      42         [ #  # ]:          0 :       entityList.append(ent_ptr);
      43                 :            :   }  
      44         [ #  # ]:          0 :   entityList.reset();
      45 [ #  # ][ #  # ]:          0 :   for (i=entityList.size(); i > 0; i--)
      46 [ #  # ][ #  # ]:          0 :     register_observable(entityList.get_and_step());
                 [ #  # ]
      47                 :            : 
      48 [ #  # ][ #  # ]:          0 :   entityId = RefEntityFactory::instance()->next_ref_group_id();
      49                 :            : 
      50                 :            :     // Notify Model about the creation of this object
      51 [ #  # ][ #  # ]:          0 :   AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOPOLOGY_ENTITY_CONSTRUCTED, this)) ;
         [ #  # ][ #  # ]
      52                 :            : 
      53                 :            :   // assign default names
      54         [ #  # ]:          0 :   assign_default_name();
      55                 :            : 
      56                 :          0 : }
      57                 :            : 
      58 [ #  # ][ #  # ]:          0 : RefGroup::RefGroup(int /*proe_type*/)
      59                 :            : {
      60                 :            :    // This constructor was created just to get around not doing a notify,
      61                 :            :    // so we can use it for Pro/E parts and assemblies.
      62                 :          0 :   recursionMark = 0;
      63                 :          0 : }
      64                 :            : 
      65 [ +  - ][ +  - ]:        297 : RefGroup::~RefGroup ()
      66                 :            : {
      67         [ +  - ]:         99 :    remove_all_ref_entities();
      68         [ -  + ]:        198 : }
      69                 :            : 
      70                 :       8502 : CubitStatus RefGroup::add_ref_entity(RefEntity *ref_entity, bool emit_event)
      71                 :            : {
      72                 :       8502 :   CubitStatus status = CUBIT_FAILURE;
      73                 :            :   
      74                 :            :   //  Force failure of commands like: group 3 add group 3
      75 [ +  - ][ +  - ]:      17092 :   if ( ( ref_entity->entity_type_info() == entity_type_info() ) &&
         [ +  - ][ +  + ]
         [ -  + ][ -  + ]
      76 [ +  - ][ +  - ]:       8590 :            ( ref_entity->entity_name() == entity_name() ) )
         [ +  - ][ +  + ]
         [ +  - ][ +  + ]
           [ #  #  #  # ]
      77                 :          0 :           return CUBIT_FAILURE;
      78                 :            : 
      79         [ +  - ]:       8502 :   if (!entityList.move_to(ref_entity)) 
      80                 :            :   {
      81                 :       8502 :     entityList.append(ref_entity);
      82         [ +  - ]:       8502 :     register_observable(ref_entity);
      83                 :       8502 :     status = CUBIT_SUCCESS;
      84         [ -  + ]:       8502 :     if (emit_event)
      85 [ #  # ][ #  # ]:          0 :       AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::GROUP_MODIFIED, this));
      86                 :            :   }
      87                 :       8502 :   return status;
      88                 :            : }
      89                 :            : 
      90                 :         33 : CubitStatus RefGroup::add_ref_entity(DLIList<RefEntity*>& entity_list, 
      91                 :            :                                         bool emit_event)
      92                 :            : {
      93                 :         33 :   RefEntity* entity = NULL;
      94                 :         33 :   CubitStatus status = CUBIT_FAILURE;
      95 [ +  - ][ +  + ]:       4235 :   for (int i=entity_list.size(); i > 0; i--) 
      96                 :            :   {
      97         [ +  - ]:       4202 :     entity = entity_list.get_and_step();
      98 [ +  - ][ +  - ]:       4202 :     if ( entityList.move_to(entity) == CUBIT_FALSE )
      99                 :            :     {
     100         [ +  - ]:       4202 :        entityList.append(entity);
     101 [ +  - ][ +  - ]:       4202 :        register_observable(entity);
     102                 :       4202 :        status = CUBIT_SUCCESS;
     103                 :            :     }
     104                 :            :   }
     105                 :            : 
     106 [ -  + ][ #  # ]:         33 :   if (emit_event && status == CUBIT_SUCCESS)
     107 [ #  # ][ #  # ]:          0 :       AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::GROUP_MODIFIED, this));
         [ #  # ][ #  # ]
     108                 :            : 
     109                 :         33 :   return status;
     110                 :            : }
     111                 :            : 
     112                 :        737 : CubitStatus RefGroup::remove_ref_entity(RefEntity *entity,
     113                 :            :                                         bool emit_event)
     114                 :            : {
     115                 :        737 :   CubitStatus status = CUBIT_FAILURE;
     116         [ +  - ]:        737 :   if (entityList.remove(entity)) {
     117         [ +  - ]:        737 :     unregister_observable(entity);
     118                 :        737 :     status = CUBIT_SUCCESS;
     119         [ -  + ]:        737 :     if (emit_event)
     120 [ #  # ][ #  # ]:          0 :       AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::GROUP_MODIFIED, this));
     121                 :            :   }
     122                 :        737 :   return status;
     123                 :            : }
     124                 :            : 
     125                 :          0 : CubitStatus RefGroup::remove_ref_entity(DLIList<RefEntity*> &entity_list,
     126                 :            :                                         bool emit_event)
     127                 :            : {
     128                 :            :   
     129                 :            :   int i;
     130                 :            :   RefEntity *entity;
     131                 :          0 :   CubitStatus status = CUBIT_FAILURE;
     132 [ #  # ][ #  # ]:          0 :   for (i = entity_list.size(); i > 0; i--) {
     133         [ #  # ]:          0 :     entity = entity_list.get_and_step();
     134 [ #  # ][ #  # ]:          0 :     if (entityList.remove(entity)) {
     135 [ #  # ][ #  # ]:          0 :       unregister_observable(entity);
     136                 :          0 :       status = CUBIT_SUCCESS;
     137                 :            :     }
     138                 :            :   }
     139                 :            : 
     140 [ #  # ][ #  # ]:          0 :   if (emit_event && status == CUBIT_SUCCESS)
     141 [ #  # ][ #  # ]:          0 :       AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::GROUP_MODIFIED, this));
         [ #  # ][ #  # ]
     142                 :            :     
     143                 :          0 :   return status;
     144                 :            : }
     145                 :            : 
     146                 :        231 : int RefGroup::remove_all_ref_entities()
     147                 :            : {
     148                 :        231 :   int num_entities = entityList.size();
     149         [ +  + ]:      12188 :   for (int i=entityList.size(); i > 0; i--) {
     150         [ +  - ]:      11957 :     unregister_observable(entityList.get_and_step());
     151                 :            :   }
     152                 :        231 :   entityList.clean_out();
     153                 :        231 :   return num_entities;
     154                 :            : }
     155                 :            : 
     156                 :        121 : void RefGroup::get_child_ref_entities(DLIList<RefEntity*>& entity_list)
     157                 :            : {
     158                 :        121 :   entityList.reset();
     159                 :        121 :   entity_list.merge_unique(entityList, CUBIT_TRUE );
     160                 :        121 : }
     161                 :            : 
     162                 :          0 : int RefGroup::get_num_child_ref_entities_by_type(const std::type_info &entity_type)
     163                 :            : {
     164                 :          0 :   int count = 0;
     165                 :          0 :   int size = entityList.size();
     166         [ #  # ]:          0 :   for(int i=0; i<size; i++)
     167                 :            :   {
     168                 :          0 :     RefEntity *cur_ent = entityList[i];
     169         [ #  # ]:          0 :     if(cur_ent->entity_type_info() == entity_type)
     170                 :          0 :       count++;
     171                 :            :   }
     172                 :          0 :   return count;
     173                 :            : }
     174                 :            : 
     175                 :          0 : RefEntity* RefGroup::get_child_ref_entity_by_index(const std::type_info& entity_type, int index)
     176                 :            : {
     177                 :          0 :   RefEntity *entity = NULL;
     178                 :          0 :   int size = entityList.size();
     179                 :          0 :   int type_index = 0;
     180 [ #  # ][ #  # ]:          0 :   for(int i=0; i<size && !entity; i++)
     181                 :            :   {
     182                 :          0 :     RefEntity *cur_ent = entityList[i];
     183         [ #  # ]:          0 :     if(cur_ent->entity_type_info() == entity_type)
     184                 :            :     {
     185         [ #  # ]:          0 :       if(type_index == index)
     186                 :          0 :         entity = cur_ent;
     187                 :            :       else
     188                 :          0 :         type_index++;
     189                 :            :     }
     190                 :            :   }
     191                 :          0 :   return entity;
     192                 :            : }
     193                 :            : 
     194                 :        132 : void RefGroup::get_child_entities(DLIList<CubitEntity*>& cub_entity_list)
     195                 :            : {
     196                 :        132 :   cub_entity_list.casting_merge_unique(entityList, CUBIT_TRUE);
     197                 :        132 : }
     198                 :            : 
     199                 :          0 : void RefGroup::expand_group( DLIList<RefEntity*> & entity_list )
     200                 :            : {
     201                 :            :     //This function will get the list of child entities for this group and 
     202                 :            :     //if there are any groups in its child list, it will call this fucntion
     203                 :            :     //again on those groups.  The end result should be that the returned
     204                 :            :     //list does not contain groups... just basic_topology entities
     205                 :            :     //(the other ref_entities) 
     206 [ #  # ][ #  # ]:          0 :   DLIList<RefEntity*> group_list, mixed_list;
                 [ #  # ]
     207                 :            :   RefEntity *ref_entity_ptr;
     208                 :            :   RefGroup *group;
     209         [ #  # ]:          0 :   mixed_list.append( this );
     210                 :            : 
     211                 :            :   // don't swap the upper and lower bounds on ii.
     212 [ #  # ][ #  # ]:          0 :   for ( int ii = 0; ii < mixed_list.size(); ii++ )
     213                 :            :   {
     214                 :            :     //Note, the list gets added to, so don't do a simple get_and_step
     215         [ #  # ]:          0 :     mixed_list.reset();
     216         [ #  # ]:          0 :     mixed_list.step(ii);
     217         [ #  # ]:          0 :     ref_entity_ptr = mixed_list.get();
     218                 :            :     
     219         [ #  # ]:          0 :     group = CAST_TO( ref_entity_ptr, RefGroup );
     220         [ #  # ]:          0 :     if (group)
     221                 :            :       {
     222                 :            :         // avoid infinite recursion of groups A and B containing each other
     223 [ #  # ][ #  # ]:          0 :         if (!group_list.move_to(group)) {
     224         [ #  # ]:          0 :           group->get_child_ref_entities(mixed_list);
     225         [ #  # ]:          0 :           group_list.append(group);
     226                 :            :         }
     227                 :            :       }
     228                 :            :     // In the future if we have other RefEntities that are grouping
     229                 :            :     // entities then we should have another statement here...
     230                 :            :     else
     231         [ #  # ]:          0 :       entity_list.append( ref_entity_ptr );
     232                 :            :   }
     233                 :            : 
     234         [ #  # ]:          0 :   return;
     235                 :            : }
     236                 :            : 
     237                 :          0 : void RefGroup::get_parent_ref_entities(DLIList<RefEntity*>&)
     238                 :            : {
     239                 :            :   //- appends all ref entities that own this to entity_list.
     240                 :            :   //- Goes up just one dimension.
     241                 :            :   // There is nothing above us. Do nothing
     242                 :          0 : }
     243                 :            : 
     244                 :          0 : int RefGroup::maximum_dimension()
     245                 :            : {
     246                 :          0 :   recursionMark = 1;
     247                 :            :   // This routine returns the maximum dimension of its owned subentities.
     248                 :            :   // The 'only' kludge is that if one of its subentities is a RefGroup, it
     249                 :            :   // must call 'maximum_dimension' on that entity instead of dimension().
     250                 :            :   
     251                 :            :   RefEntity *entity;
     252                 :          0 :   int test_dim = 0;
     253                 :          0 :   int dimension = 0;
     254                 :            :   
     255         [ #  # ]:          0 :   for (int i = entityList.size(); i > 0; i--)  
     256                 :            :   {
     257                 :          0 :     entity = entityList.get_and_step();
     258                 :            :     RefGroup* group;
     259 [ #  # ][ #  # ]:          0 :     if ( (group = CAST_TO(entity,RefGroup) ) != NULL )
     260                 :            :     {
     261         [ #  # ]:          0 :       if (group->recursionMark == 0)
     262                 :          0 :         test_dim = group->maximum_dimension();
     263                 :            :     } 
     264                 :            :     else 
     265                 :            :     {
     266                 :          0 :       test_dim = entity->dimension();
     267                 :            :     }
     268         [ #  # ]:          0 :     dimension = CUBIT_MAX(dimension, test_dim);
     269                 :            :   }
     270                 :          0 :   recursionMark = 0;
     271                 :          0 :   return dimension;
     272                 :            : }
     273                 :            : 
     274                 :          0 : CubitBox RefGroup::bounding_box()
     275                 :            : {
     276                 :          0 :   recursionMark = 1;
     277                 :            :  
     278                 :          0 :   CubitBox super_box = CubitBox();
     279                 :          0 :   int super_box_defined = CUBIT_FALSE;
     280                 :            :   
     281 [ #  # ][ #  # ]:          0 :   for (int i = entityList.size(); i > 0; i--) {
     282                 :            :       
     283         [ #  # ]:          0 :     RefEntity *entity = entityList.get_and_step();
     284         [ #  # ]:          0 :     RefGroup *group = CAST_TO(entity, RefGroup);
     285 [ #  # ][ #  # ]:          0 :     if (!group || group->recursionMark == 0) {
     286         [ #  # ]:          0 :       CubitBox entity_box = entity->bounding_box();
     287                 :            :       
     288                 :            :       // "Concatenate" this box with the super_box, creating a bounding
     289                 :            :       // box that bounds the entities (from the list), processed so far.
     290         [ #  # ]:          0 :       if (super_box_defined)
     291         [ #  # ]:          0 :         super_box |= entity_box;
     292                 :            :       else {
     293         [ #  # ]:          0 :         super_box = entity_box;
     294                 :          0 :         super_box_defined = CUBIT_TRUE;
     295         [ #  # ]:          0 :       }
     296                 :            :     }
     297                 :            :   }
     298                 :          0 :   recursionMark = 0;
     299                 :            : 
     300                 :          0 :   return super_box;
     301                 :            : }
     302                 :            : 
     303                 :         11 : void RefGroup::get_sub_entities(DLIList<RefEntity*> &entity_list)
     304                 :            : {  
     305                 :         11 :   recursionMark = 1;
     306                 :            : 
     307                 :            :   //- appends all ref entities owned by this entity on entity_list
     308                 :            :   //- and recurses all the way down to dimension 0
     309         [ +  - ]:         11 :   DLIList<RefEntity*> local_entity_list;
     310         [ +  - ]:         11 :   get_child_ref_entities(local_entity_list);
     311                 :            : 
     312                 :            :   // *need* to merge now if a group
     313                 :            :   // else more efficient to merge later
     314         [ +  - ]:         11 :   entity_list.merge_unique(local_entity_list, CUBIT_TRUE);
     315 [ +  - ][ +  - ]:         22 : DLIList<RefEntity*> temp_list, temp_list2;
         [ +  - ][ +  - ]
     316                 :            : 
     317                 :            : 
     318 [ +  - ][ +  + ]:         22 :   for (int i=local_entity_list.size(); i > 0; i--) {
     319                 :            :     // take some care to avoid infinite recursion
     320         [ +  - ]:         11 :     RefEntity *child = local_entity_list.get_and_step();
     321         [ -  + ]:         11 :     RefGroup *group = CAST_TO(child, RefGroup);
     322 [ -  + ][ #  # ]:         11 :     if (!group || group->recursionMark == 0) {
     323         [ +  - ]:         11 :         temp_list2.clean_out();
     324         [ +  - ]:         11 :         child->get_all_child_ref_entities(temp_list2);  
     325         [ +  - ]:         11 :         temp_list.merge_unique(temp_list2);
     326                 :            :      }
     327                 :            :   }
     328                 :            : 
     329         [ +  - ]:         11 :   entity_list.merge_unique(temp_list);
     330         [ +  - ]:         11 :   recursionMark = 0;
     331                 :         11 : }
     332                 :            : 
     333                 :          0 : void RefGroup::is_mergeable(AutoMergeStatus val)
     334                 :            : {
     335                 :          0 :   recursionMark = 1;
     336                 :          0 :   autoMergeStatus = val;
     337         [ #  # ]:          0 :   DLIList<RefEntity*> children;
     338         [ #  # ]:          0 :   get_child_ref_entities( children );
     339 [ #  # ][ #  # ]:          0 :   for ( int i = children.size(); i > 0; i-- ) {
     340         [ #  # ]:          0 :     RefEntity *child = children.get_and_step();
     341         [ #  # ]:          0 :     RefGroup *group = CAST_TO(child, RefGroup);
     342 [ #  # ][ #  # ]:          0 :     if (!group || group->recursionMark == 0)
     343         [ #  # ]:          0 :       child->is_mergeable(val);
     344                 :            :   }
     345         [ #  # ]:          0 :   recursionMark = 0;
     346                 :          0 : }
     347                 :            : 
     348                 :          0 : CubitVector RefGroup::center_point()
     349         [ #  # ]:          0 : { return bounding_box().center(); }
     350                 :            : 
     351                 :            : 
     352                 :         11 : int RefGroup::subtract(RefGroup *group_to_subtract, RefGroup *target_group)
     353                 :            : {
     354                 :            :   // Get the list of RefEntities associated with each group
     355         [ +  - ]:         11 :   DLIList<RefEntity*> final_list;
     356 [ +  - ][ +  - ]:         22 :   DLIList<RefEntity*> entity_list_2;
     357                 :            : 
     358         [ +  - ]:         11 :   get_child_ref_entities(final_list);
     359         [ +  - ]:         11 :   group_to_subtract->get_child_ref_entities(entity_list_2);
     360                 :            : 
     361                 :            :   // At this point, we have three groups, all non-null. Note that
     362                 :            :   // some or all of these may be the same group, so don't destroy
     363                 :            :   // the target group until all information is generated.
     364                 :            :   
     365                 :            :   // 1. Final = group 2
     366                 :            :   // 2. Remove from final all items that are in both final and group 1
     367 [ +  - ][ +  + ]:       1760 :   for (int i=entity_list_2.size(); i > 0; i--) {
     368         [ +  - ]:       1749 :     RefEntity *entity = entity_list_2.get_and_step();
     369         [ +  - ]:       1749 :     final_list.remove(entity);
     370                 :            :   }
     371                 :            : 
     372         [ +  - ]:         11 :   target_group->remove_all_ref_entities();
     373         [ +  - ]:         11 :   target_group->add_ref_entity(final_list);
     374                 :            : 
     375         [ +  - ]:         11 :   return CUBIT_SUCCESS;
     376                 :            : }
     377                 :            : 
     378                 :         11 : int RefGroup::intersect(RefGroup *other_group, RefGroup *target_group)
     379                 :            : {
     380                 :            :   // Get the list of RefEntities associated with each group
     381         [ +  - ]:         11 :   DLIList<RefEntity*> entity_list_1;
     382 [ +  - ][ +  - ]:         22 :   DLIList<RefEntity*> entity_list_2;
     383                 :            : 
     384         [ +  - ]:         11 :   get_child_ref_entities(entity_list_1);
     385         [ +  - ]:         11 :   other_group->get_child_ref_entities(entity_list_2);
     386                 :            : 
     387 [ +  - ][ +  - ]:         22 :   DLIList<RefEntity*> final_list;
     388                 :            : 
     389                 :            :   // At this point, we have three groups, all non-null. Note that
     390                 :            :   // some or all of these may be the same group, so don't destroy
     391                 :            :   // the target group until all information is generated.
     392                 :            :   
     393                 :            :   // Final = all items in both group 1 and group 2.
     394 [ +  - ][ +  + ]:       1760 :   for (int i=entity_list_2.size(); i > 0; i--) {
     395         [ +  - ]:       1749 :     RefEntity *entity = entity_list_2.get_and_step();
     396 [ +  - ][ +  - ]:       1749 :     if (entity_list_1.move_to(entity)) {
     397         [ +  - ]:       1749 :       final_list.append_unique(entity);
     398                 :            :     }
     399                 :            :   }
     400                 :            : 
     401         [ +  - ]:         11 :   target_group->remove_all_ref_entities();
     402         [ +  - ]:         11 :   target_group->add_ref_entity(final_list);
     403                 :            : 
     404         [ +  - ]:         11 :   return CUBIT_SUCCESS;
     405                 :            : }
     406                 :            :   
     407                 :         11 : int RefGroup::unite(RefGroup *other_group, RefGroup *target_group)
     408                 :            : {
     409                 :            :   // Get the list of RefEntities associated with each group
     410         [ +  - ]:         11 :   DLIList<RefEntity*> final_list;
     411 [ +  - ][ +  - ]:         22 :   DLIList<RefEntity*> entity_list_2;
     412                 :            : 
     413         [ +  - ]:         11 :   get_child_ref_entities(final_list);
     414         [ +  - ]:         11 :   other_group->get_child_ref_entities(entity_list_2);
     415                 :            : 
     416                 :            :   // At this point, we have three groups, all non-null. Note that
     417                 :            :   // some or all of these may be the same group, so don't destroy
     418                 :            :   // the target group until all information is generated.
     419                 :            :   
     420                 :            :   // 1. Final = group 1
     421                 :            :   // 2. Add all items that are in group 2, but not already in group 1
     422 [ +  - ][ +  + ]:         22 :   for (int i=entity_list_2.size(); i > 0; i--) {
     423         [ +  - ]:         11 :     RefEntity *entity = entity_list_2.get_and_step();
     424         [ +  - ]:         11 :     final_list.append_unique(entity);
     425                 :            :   }
     426                 :            :   
     427         [ +  - ]:         11 :   target_group->remove_all_ref_entities();
     428         [ +  - ]:         11 :   target_group->add_ref_entity(final_list);
     429                 :            : 
     430         [ +  - ]:         11 :   return CUBIT_SUCCESS;
     431                 :            : }
     432                 :            : 
     433                 :          0 : int RefGroup::validate()
     434                 :            : {
     435                 :            :   // NOTE: RefGroup::validate() should not call RefEntity::validate()
     436                 :            :   //       directly since the contained entities will make that
     437                 :            :   //       call in their respective validate() functions.
     438                 :            : 
     439                 :          0 :   recursionMark = 1;
     440                 :          0 :   int error = 0;
     441         [ #  # ]:          0 :   for (int i = entityList.size(); i > 0; i--) {
     442                 :          0 :     RefEntity *entity = entityList.get_and_step();
     443         [ #  # ]:          0 :     RefGroup *group = CAST_TO(entity, RefGroup);
     444 [ #  # ][ #  # ]:          0 :     if (!group || group->recursionMark == 0) 
     445                 :          0 :       error += entity->validate();
     446                 :            :   }
     447                 :          0 :   recursionMark = 0;
     448                 :          0 :   return error;
     449                 :            : }
     450                 :            : 
     451                 :         99 : CubitStatus RefGroup::delete_group(RefGroup *group_ptr, CubitBoolean propagate)
     452                 :            : {
     453                 :            :    // This function will delete the corresponding group from the Model
     454                 :            :    // If propagate is CUBIT_TRUE, the contained groups are deleted also.
     455                 :            : 
     456 [ +  - ][ +  - ]:         99 :    AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOPOLOGY_ENTITY_DESTRUCTED, group_ptr));
     457                 :            : 
     458         [ -  + ]:         99 :    if( propagate )
     459                 :            :    {
     460         [ #  # ]:          0 :       DLIList<RefGroup*> contained_groups;
     461         [ #  # ]:          0 :       get_contained_groups ( group_ptr, contained_groups );
     462 [ #  # ][ #  # ]:          0 :       for( int i=0; i<contained_groups.size(); i++ )
     463                 :            :       {
     464 [ #  # ][ #  # ]:          0 :          delete_group( contained_groups.get_and_step(), false );
     465         [ #  # ]:          0 :       }
     466                 :            :    }
     467                 :            :    
     468                 :         99 :    group_ptr->remove_all_ref_entities();
     469         [ +  - ]:         99 :    delete group_ptr;
     470                 :            : 
     471                 :         99 :    return CUBIT_SUCCESS;
     472                 :            : }
     473                 :            : 
     474                 :        332 : void RefGroup::delete_all_groups()
     475                 :            : {
     476         [ +  - ]:        332 :    DLIList<RefGroup*> ref_groups;
     477 [ +  - ][ +  - ]:        332 :    GeometryQueryTool::instance()->ref_groups(ref_groups);
     478         [ +  - ]:        332 :    int num_groups = ref_groups.size();
     479         [ +  + ]:        431 :    for( int i=0; i<num_groups; i++ )
     480 [ +  - ][ +  - ]:        431 :       delete_group( ref_groups.get_and_step() );
                 [ +  - ]
     481                 :            :    
     482                 :        332 : }
     483                 :            : 
     484                 :          0 : void RefGroup::get_contained_groups (RefGroup *group_ptr, DLIList<RefGroup*> &contained_groups)
     485                 :            : {
     486 [ #  # ][ #  # ]:          0 :    DLIList<RefEntity*> group_list, mixed_list;
                 [ #  # ]
     487                 :            :    RefEntity *ref_entity_ptr;
     488                 :            :    RefGroup *group;
     489                 :            :    
     490         [ #  # ]:          0 :    mixed_list.append( group_ptr );
     491                 :            :    
     492                 :            :    // Using expand_group algorithm to get sub_groups of group_ptr
     493                 :            :    // don't swap the upper and lower bounds on ii.
     494 [ #  # ][ #  # ]:          0 :    for ( int ii = 0; ii < mixed_list.size(); ii++ )
     495                 :            :    {
     496                 :            :       // Note, the list gets added to, so don't do a simple get_and_step
     497         [ #  # ]:          0 :       mixed_list.reset();
     498         [ #  # ]:          0 :       mixed_list.step(ii);
     499         [ #  # ]:          0 :       ref_entity_ptr = mixed_list.get();
     500                 :            :       
     501         [ #  # ]:          0 :       group = CAST_TO( ref_entity_ptr, RefGroup ); //which it should be the first time around
     502         [ #  # ]:          0 :       if (group)
     503                 :            :       {
     504                 :            :          // avoid infinite recursion of groups A and B containing each other
     505 [ #  # ][ #  # ]:          0 :          if (!group_list.move_to(group)) {
     506         [ #  # ]:          0 :             group->get_child_ref_entities(mixed_list);
     507         [ #  # ]:          0 :             group_list.append(group);
     508                 :            :          }  
     509                 :            :       }
     510                 :            :    }
     511 [ #  # ][ #  # ]:          0 :    CAST_LIST(group_list, contained_groups, RefGroup);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     512                 :          0 : }
     513                 :            : 
     514                 :          0 : void RefGroup::get_groups_within( CubitEntity* cubit_entity_ptr, 
     515                 :            :                                   DLIList<RefGroup*> &groups_within,
     516                 :            :                                   const CubitBoolean recursive)
     517                 :            : {
     518         [ #  # ]:          0 :   RefEntity* ref_entity_ptr = CAST_TO( cubit_entity_ptr, RefEntity );
     519         [ #  # ]:          0 :   if( ref_entity_ptr != NULL )
     520                 :            :   {
     521                 :          0 :     get_groups_within( ref_entity_ptr, groups_within, recursive);
     522                 :          0 :     return;
     523                 :            :   }
     524                 :            : 
     525                 :          0 :   return;
     526                 :            : }
     527                 :            : 
     528                 :       6378 : void RefGroup::get_groups_within( RefEntity* ref_entity_ptr, 
     529                 :            :                                   DLIList<RefGroup*> &groups_within,
     530                 :            :                                   const CubitBoolean recursive)
     531                 :            : {
     532                 :            :   RefGroup* ref_group_ptr;
     533                 :            :   
     534                 :            :   // Get the observer's of this entity
     535         [ +  - ]:       6378 :   DLIList <CubitObserver*> observer_list;
     536         [ +  - ]:       6378 :   ref_entity_ptr->get_observer_list( observer_list );
     537                 :            :   
     538                 :            :   // Now, loop through the observer list, adding them
     539 [ +  - ][ +  + ]:       6400 :   for (int i=0; i<observer_list.size(); i++)
     540                 :            :   {
     541 [ +  - ][ -  + ]:         22 :     ref_group_ptr = CAST_TO (observer_list.get(), RefGroup);
     542                 :            :     
     543         [ +  - ]:         22 :     if( ref_group_ptr != NULL )
     544                 :            :     {
     545                 :            :       // Add this observer
     546         [ +  - ]:         22 :       groups_within.append_unique( ref_group_ptr );
     547                 :            :       
     548                 :            :       // Add all the groups the observer is within
     549 [ -  + ][ #  # ]:         22 :       if (recursive) get_groups_within( ref_group_ptr, groups_within );
     550                 :            :     }
     551         [ +  - ]:         22 :     observer_list.step();
     552         [ +  - ]:       6378 :   }
     553                 :       6378 : }
     554                 :            : 
     555                 :            : // Here we need to move through all the model's group's, since observer's
     556                 :            : // aren't recursive (i.e., if group 2 contains group 3 which contains
     557                 :            : // hex 1, then hex 1's observer is only group 3.  Group 2 actually
     558                 :            : // contains hex 1 however, but through group 3).
     559                 :         11 : void RefGroup::get_groups_within( RefGroup* ref_group_ptr, 
     560                 :            :                                   DLIList<RefGroup*> &groups_within,
     561                 :            :                                   const CubitBoolean recursive)
     562                 :            : {
     563                 :            :   // Get the model's groups
     564         [ +  - ]:         11 :   DLIList<RefGroup*> model_group_list;
     565 [ +  - ][ +  - ]:         11 :   GeometryQueryTool::instance()->ref_groups(model_group_list);
     566                 :            :   int i, j;
     567                 :            :   RefGroup* model_group;
     568                 :            :   RefGroup* contained_group;
     569                 :            :   
     570                 :            :   // Go through all the groups, finding which ones contain
     571                 :            :   // the entity, at any level below (checks groups within
     572                 :            :   // groups).
     573 [ +  - ][ +  + ]:         22 :   for( i=0; i<model_group_list.size(); i++ )
     574                 :            :   {
     575         [ +  - ]:         11 :     model_group = model_group_list.get_and_step();
     576                 :            :     
     577                 :            :     // See if it exists directly in model_group
     578         [ +  - ]:         11 :     DLIList<RefEntity*> contained_ref_entities;
     579         [ +  - ]:         11 :     model_group->get_child_ref_entities( contained_ref_entities );
     580 [ +  - ][ -  + ]:         11 :     if( contained_ref_entities.move_to( (RefEntity*)ref_group_ptr ) )
     581         [ #  # ]:          0 :       groups_within.append_unique( model_group );
     582                 :            : 
     583         [ +  - ]:         11 :     if (!recursive) continue;
     584                 :            :     
     585                 :            :     // Now check all of model group's contained groups
     586 [ #  # ][ #  # ]:         11 :     DLIList<RefGroup*> contained_group_list;
         [ +  - ][ -  + ]
     587         [ #  # ]:          0 :     model_group->get_contained_groups( model_group, contained_group_list );
     588         [ #  # ]:          0 :     contained_group_list.remove( model_group );
     589 [ #  # ][ #  # ]:          0 :     for( j=0; j<contained_group_list.size(); j++ )
     590                 :            :     {
     591         [ #  # ]:          0 :       contained_group = contained_group_list.get_and_step();
     592                 :            :       
     593         [ #  # ]:          0 :       contained_ref_entities.clean_out();
     594         [ #  # ]:          0 :       contained_group->get_child_ref_entities( contained_ref_entities );
     595                 :            :       
     596 [ #  # ][ #  # ]:          0 :       if( contained_ref_entities.move_to( (RefEntity*)ref_group_ptr ) )
     597         [ #  # ]:          0 :         groups_within.append_unique( model_group );
     598                 :            :     }
     599         [ +  - ]:         22 :   }
     600                 :         11 : }
     601                 :            : 
     602                 :         44 : void RefGroup::notify_observer(const CubitEvent *observer_event)
     603                 :            : {
     604         [ -  + ]:         44 :   const GeometryEvent* geom_event = dynamic_cast<const GeometryEvent*>(observer_event);
     605         [ +  - ]:         44 :   if (geom_event != NULL)
     606                 :            :   {
     607                 :         44 :     RefEntity *entity = geom_event->get_entity();
     608                 :            : 
     609                 :         44 :     int event = geom_event->get_type();
     610         [ -  + ]:         44 :     if (event == GeometryEvent::TOPOLOGY_ENTITY_CONSTRUCTED) {
     611                 :          0 :       add_ref_entity(entity);
     612                 :          0 :       return;
     613                 :            :     }
     614         [ +  - ]:         44 :     else if (event ==GeometryEvent:: TOPOLOGY_ENTITY_DESTRUCTED) {
     615                 :         44 :       remove_ref_entity(entity);
     616                 :         44 :       return;
     617                 :            :     }
     618         [ #  # ]:          0 :     else if ( event == GeometryEvent::ENTITIES_MERGED )
     619                 :            :     {
     620                 :            :         // Out with the old...
     621                 :          0 :       remove_ref_entity(entity);
     622                 :            : 
     623                 :            :         // ...in with the new.
     624                 :          0 :       const MergeEvent *merge_event = static_cast<const MergeEvent*>(geom_event);
     625                 :            :       RefEntity *kept_entity = 
     626                 :          0 :         CAST_TO( merge_event->get_kept_entity(), RefEntity );
     627                 :          0 :       add_ref_entity(kept_entity);
     628                 :            :     }
     629                 :            :   }
     630                 :          0 :   return;
     631 [ +  - ][ +  - ]:       6540 : }
     632                 :            : 
     633                 :            : /*
     634                 :            : void RefGroup::draw (int color)
     635                 :            : {
     636                 :            :    recursionMark = 1;
     637                 :            :    if (is_visible())
     638                 :            :    {
     639                 :            :       for (int i = entityList.size(); i > 0; i--)
     640                 :            :       {
     641                 :            :          RefEntity *entity = entityList.get_and_step();
     642                 :            :          RefGroup *group = CAST_TO(entity, RefGroup);
     643                 :            :          if (!group || group->recursionMark == 0)
     644                 :            :             entity->draw(color);
     645                 :            :       }
     646                 :            :    }
     647                 :            :    recursionMark = 0;
     648                 :            : }
     649                 :            : */
     650                 :            : 

Generated by: LCOV version 1.11