LCOV - code coverage report
Current view: top level - geom - CubitAttribUser.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 365 562 64.9 %
Date: 2020-06-30 00:58:45 Functions: 33 43 76.7 %
Branches: 456 1434 31.8 %

           Branch data     Line data    Source code
       1                 :            : //- class:          CubitAttribUser
       2                 :            : //- Owner:          Greg Nielson
       3                 :            : //- Description:    implementation of CubitAttribUser class.
       4                 :            : //- Checked By:
       5                 :            : //- Version: $Id:
       6                 :            : 
       7                 :            : 
       8                 :            : // #include "CubitSimpleAttrib.hpp"
       9                 :            : #include "CubitAttribUser.hpp"
      10                 :            : #include "CastTo.hpp"
      11                 :            : #include "Body.hpp"
      12                 :            : #include "GeometryEntity.hpp"
      13                 :            : #include "BasicTopologyEntity.hpp"
      14                 :            : #include "BodySM.hpp"
      15                 :            : #include "CAGroup.hpp"
      16                 :            : #include "CAMergePartner.hpp"
      17                 :            : //#include "CADeferredAttrib.hpp"
      18                 :            : #include "RefFace.hpp"
      19                 :            : #include "RefEdge.hpp"
      20                 :            : #include "RefVertex.hpp"
      21                 :            : // #include "DLIList.hpp"
      22                 :            : // #include "CubitString.hpp"
      23                 :            : #include "GeometryModifyTool.hpp"
      24                 :            : #include "BridgeManager.hpp"
      25                 :            : #include "CubitMessage.hpp"
      26                 :            : 
      27                 :            : 
      28                 :      81482 : CubitAttribUser::CubitAttribUser(CubitAttrib* cubit_attrib_ptr)
      29                 :            : {
      30                 :      81482 :   headAttrib = cubit_attrib_ptr;
      31                 :      81482 : }
      32                 :            : 
      33                 :      50333 : CubitAttribUser::~CubitAttribUser()
      34                 :            : {
      35                 :            :   //delete all ToolData's chained off this user.
      36                 :      50333 :   CubitAttrib *ca_ptr = headAttrib;
      37                 :            :   
      38         [ +  + ]:      75430 :   while ( ca_ptr) {
      39                 :      25097 :     CubitAttrib *next = ca_ptr->next_attrib();
      40         [ +  - ]:      25097 :     delete ca_ptr;
      41                 :      25097 :     ca_ptr = next;
      42                 :            :   }
      43                 :            : 
      44                 :      50333 :   headAttrib = NULL;
      45         [ -  + ]:      50333 : }
      46                 :            : 
      47                 :     279713 : CubitAttrib* CubitAttribUser::get_cubit_attrib (int attrib_type,
      48                 :            :                                                 CubitBoolean create_if_missing)
      49                 :            : {
      50                 :     279713 :   CubitAttrib* cubit_attrib_ptr = NULL;
      51                 :     279713 :   RefEntity* entity = NULL;
      52         [ +  - ]:     279713 :   DLIList<CubitAttrib*> attrib_list;
      53         [ +  - ]:     279713 :   find_cubit_attrib_type (attrib_type, attrib_list);
      54 [ +  - ][ +  + ]:     279713 :   if (attrib_list.size() > 0)
      55         [ +  - ]:     171835 :     cubit_attrib_ptr =  attrib_list.get();
      56         [ +  + ]:     107878 :   else if ( create_if_missing == CUBIT_TRUE )
      57                 :            :   {
      58         [ -  + ]:      74661 :     entity = CAST_TO(this, RefEntity);
      59 [ +  - ][ +  - ]:      74661 :     cubit_attrib_ptr = CGMApp::instance()->attrib_manager()->create_cubit_attrib(attrib_type, entity, CubitSimpleAttrib());
         [ +  - ][ +  - ]
                 [ +  - ]
      60                 :            :   }
      61                 :            : 
      62         [ +  - ]:     279713 :   return cubit_attrib_ptr;
      63                 :            : }
      64                 :            : 
      65                 :     241710 : CubitStatus CubitAttribUser::add_cubit_attrib (CubitAttrib* cubit_attrib_ptr)
      66                 :            : {
      67         [ -  + ]:     241710 :   if (cubit_attrib_ptr == NULL)
      68                 :          0 :     return CUBIT_FAILURE;
      69                 :            : 
      70                 :     241710 :   CubitStatus cubit_attribute_status = CUBIT_FAILURE;
      71                 :            :   CubitAttrib *temp_ptr;
      72                 :            :   
      73         [ +  + ]:     241710 :   if (headAttrib == NULL)
      74                 :            :   {
      75                 :      66903 :     headAttrib = cubit_attrib_ptr;
      76                 :      66903 :     cubit_attribute_status = CUBIT_SUCCESS;
      77                 :            :   }
      78                 :            :   else
      79                 :            :   {
      80         [ +  + ]:    1062028 :     for(temp_ptr = headAttrib;
      81                 :     887221 :         temp_ptr->next_attrib() != NULL;
      82                 :            :         temp_ptr = temp_ptr->next_attrib());
      83                 :     174807 :     temp_ptr->set_next_attrib(cubit_attrib_ptr);
      84                 :     174807 :     cubit_attribute_status = CUBIT_SUCCESS;
      85                 :            :   }
      86                 :     241710 :   return cubit_attribute_status;
      87                 :            : }
      88                 :            : 
      89                 :      26451 : CubitStatus CubitAttribUser::put_simple_attrib 
      90                 :            :   (const CubitSimpleAttrib& new_csattrib_ptr, CubitBoolean append_it)
      91                 :            : {
      92                 :            :   Body* Body_ptr;
      93         [ -  + ]:      26451 :   Body_ptr = CAST_TO(this, Body);
      94                 :            :   BasicTopologyEntity* BTE_ptr;
      95         [ -  + ]:      26451 :   BTE_ptr = CAST_TO(this, BasicTopologyEntity);
      96         [ +  + ]:      26451 :   if ( Body_ptr != NULL )
      97                 :            :   {
      98                 :            :       // Get the OSME pointer
      99                 :       1520 :     BodySM* OSME_ptr = Body_ptr->get_body_sm_ptr();
     100                 :            :     
     101                 :            :       // check for duplicates
     102         [ -  + ]:       1520 :     if (DEBUG_FLAG(94))
     103                 :            :     {
     104         [ #  # ]:          0 :       DLIList<CubitSimpleAttrib> cs_list;
     105         [ #  # ]:          0 :       OSME_ptr->get_simple_attribute(cs_list);
     106 [ #  # ][ #  # ]:          0 :       for (int i = cs_list.size(); i > 0; i--)
     107                 :            :       {
     108 [ #  # ][ #  # ]:          0 :         const CubitSimpleAttrib cs_attrib = cs_list.get_and_step();
     109 [ #  # ][ #  # ]:          0 :         if (cs_attrib == new_csattrib_ptr)
     110 [ #  # ][ #  # ]:          0 :           PRINT_INFO("Trying to add equivalent attribute of type %s on Body %d.\n",
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     111         [ #  # ]:          0 :                      new_csattrib_ptr.character_type().c_str(), Body_ptr->id());
     112 [ #  # ][ #  # ]:          0 :         else if (cs_attrib.character_type() == new_csattrib_ptr.character_type())
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     113 [ #  # ][ #  # ]:          0 :           PRINT_INFO("Trying to add attribute of same type %s on Body %d.\n",
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     114         [ #  # ]:          0 :                      new_csattrib_ptr.character_type().c_str(), Body_ptr->id());
     115 [ #  # ][ #  # ]:          0 :       }
     116                 :            :     }
     117                 :            :     
     118                 :            : //________  Change Code by DZ of Cat,  3/11/99 12:25:30 PM  ________
     119                 :            :       // Attach this name to it
     120         [ +  - ]:       1520 :     if ( append_it )
     121                 :       1520 :        append_simple_attribute(OSME_ptr, new_csattrib_ptr);
     122                 :            : //________  Change End by DZ of Cat,  3/11/99 12:25:30 PM  ________
     123                 :            :   }
     124                 :            :     // Deal with BasicTopologyEntities
     125         [ +  + ]:      24931 :   else if ( BTE_ptr != NULL )
     126                 :            :   {
     127                 :            :       // Get the GeometryEntity pointer
     128                 :            :     GeometryEntity* GE_ptr =
     129                 :      24899 :       BTE_ptr->get_geometry_entity_ptr();
     130                 :            :     
     131         [ +  + ]:      24899 :     if( NULL == GE_ptr )
     132                 :         33 :       return CUBIT_FAILURE;
     133                 :            : 
     134                 :            :       // check for duplicates
     135         [ -  + ]:      24866 :     if (DEBUG_FLAG(94))
     136                 :            :     {
     137         [ #  # ]:          0 :       DLIList<CubitSimpleAttrib> cs_list;
     138         [ #  # ]:          0 :       GE_ptr->get_simple_attribute(cs_list);
     139 [ #  # ][ #  # ]:          0 :       for (int i = cs_list.size(); i > 0; i--)
     140                 :            :       {
     141         [ #  # ]:          0 :         const CubitSimpleAttrib &cs_attrib = cs_list.get_and_step();
     142 [ #  # ][ #  # ]:          0 :         if (cs_attrib == new_csattrib_ptr)
     143 [ #  # ][ #  # ]:          0 :           PRINT_INFO("Trying to add equivalent attribute of type %s on %s %d.\n",
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     144                 :            :                      new_csattrib_ptr.character_type().c_str(),
     145         [ #  # ]:          0 :                      BTE_ptr->class_name(), BTE_ptr->id());
     146 [ #  # ][ #  # ]:          0 :         else if (cs_attrib.character_type() == new_csattrib_ptr.character_type())
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     147 [ #  # ][ #  # ]:          0 :           PRINT_INFO("Trying to add attribute of same type %s on %s %d.\n",
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     148                 :            :                      new_csattrib_ptr.character_type().c_str(),
     149         [ #  # ]:          0 :                      BTE_ptr->class_name(), BTE_ptr->id());
     150         [ #  # ]:          0 :       }
     151                 :            :     }
     152                 :            : 
     153                 :            : //_________  Add Code by DZ of Cat,  3/11/99 11:10:29 AM  _________
     154                 :            :       // Attach this name to it
     155         [ +  - ]:      24866 :     if ( append_it )
     156                 :      24866 :        append_simple_attribute(GE_ptr, new_csattrib_ptr);
     157                 :            : //_________  Code End by DZ of Cat,  3/11/99 11:10:29 AM  _________
     158                 :            :    
     159                 :            :   }
     160                 :            :     // Deal with all other RefEntities.  As these do not have any
     161                 :            :     // underlying entities (such as solid model entities) associated
     162                 :            :     // with them, this block is a do-nothing block.
     163                 :            :   else
     164                 :            :   {
     165                 :            :   }
     166                 :            :   
     167         [ -  + ]:      26418 :   if (DEBUG_FLAG(90))
     168                 :            :   {
     169         [ #  # ]:          0 :     RefEntity *ref_entity = CAST_TO(this, RefEntity);
     170 [ #  # ][ #  # ]:          0 :     PRINT_DEBUG_90( "Putting simple attribute of type %s on"
         [ #  # ][ #  # ]
                 [ #  # ]
     171                 :            :                 " %s %d.\n", new_csattrib_ptr.character_type().c_str(),
     172         [ #  # ]:          0 :                 ref_entity->class_name(), ref_entity->id());
     173                 :            :   }
     174                 :            :   
     175                 :      26451 :   return CUBIT_SUCCESS;
     176                 :            : }
     177                 :            : 
     178                 :      58379 : CubitStatus CubitAttribUser::clear_simple_attribs_set_to_actuate()
     179                 :            : {
     180                 :      58379 :   CubitAttrib *cubit_attrib_ptr = NULL;
     181                 :      58379 :   CubitAttrib *next_attrib_ptr = NULL;
     182         [ +  + ]:      62408 :   for(cubit_attrib_ptr = headAttrib;
     183                 :            :       cubit_attrib_ptr != NULL;)
     184                 :            :   {
     185                 :            :     //ignore Assembly and Name attributes
     186                 :       4029 :     next_attrib_ptr = cubit_attrib_ptr->next_attrib();
     187 [ +  - ][ +  + ]:      11151 :     if( cubit_attrib_ptr->int_attrib_type() != CA_ENTITY_NAME && 
     188 [ +  + ][ +  - ]:       7122 :         cubit_attrib_ptr->int_attrib_type() != CA_ASSEMBLY_DATA &&
     189                 :            :         CGMApp::instance()->attrib_manager()->auto_actuate_flag(
     190                 :       3093 :           cubit_attrib_ptr->int_attrib_type()))
     191                 :            :     {
     192                 :       3093 :       remove_cubit_attrib( cubit_attrib_ptr );
     193         [ +  - ]:       3093 :       delete cubit_attrib_ptr;
     194                 :            :     }
     195                 :       4029 :     cubit_attrib_ptr = next_attrib_ptr;
     196                 :            :   }
     197                 :            :  
     198         [ -  + ]:      58379 :   if (DEBUG_FLAG(94))
     199                 :            :   {
     200 [ #  # ][ #  # ]:          0 :     PRINT_DEBUG_94("CubitAttribUser::clear_simple_attribs()\n");
                 [ #  # ]
     201                 :            :   }
     202         [ -  + ]:      58379 :   TopologyEntity* te_ptr = dynamic_cast<TopologyEntity*>(this);
     203         [ -  + ]:      58379 :   if( !te_ptr )
     204                 :          0 :     return CUBIT_FAILURE;
     205                 :            : 
     206                 :      58379 :   remove_all_simple_attribute(te_ptr->bridge_manager()->topology_bridge());
     207                 :      58379 :   write_cubit_attrib_by_type(CA_ASSEMBLY_DATA);
     208                 :      58379 :   write_cubit_attrib_by_type( CA_ENTITY_NAME );
     209                 :      58379 :   set_written_flag(CUBIT_FALSE);
     210                 :      58379 :   return CUBIT_SUCCESS; 
     211                 :            : }
     212                 :            : 
     213                 :      30884 : CubitStatus CubitAttribUser::clear_simple_attribs()
     214                 :            : {
     215                 :            : 
     216                 :      30884 :   CubitAttrib *cubit_attrib_ptr = NULL;
     217                 :      30884 :   CubitAttrib *next_attrib_ptr = NULL;
     218         [ +  + ]:      43131 :   for(cubit_attrib_ptr = headAttrib;
     219                 :            :       cubit_attrib_ptr != NULL;)
     220                 :            :   {
     221                 :            :     //ignore Assembly and Name attributes
     222                 :      12247 :     next_attrib_ptr = cubit_attrib_ptr->next_attrib();
     223   [ +  +  +  - ]:      21868 :     if( cubit_attrib_ptr->int_attrib_type() != CA_ENTITY_NAME && 
                 [ +  + ]
     224                 :       9621 :         cubit_attrib_ptr->int_attrib_type() != CA_ASSEMBLY_DATA)
     225                 :            :     {
     226                 :       9621 :       remove_cubit_attrib( cubit_attrib_ptr );
     227         [ +  - ]:       9621 :       delete cubit_attrib_ptr;
     228                 :            :     }
     229                 :      12247 :     cubit_attrib_ptr = next_attrib_ptr;
     230                 :            :   }
     231                 :            :  
     232         [ -  + ]:      30884 :   if (DEBUG_FLAG(94))
     233                 :            :   {
     234 [ #  # ][ #  # ]:          0 :     PRINT_DEBUG_94("CubitAttribUser::clear_simple_attribs()\n");
                 [ #  # ]
     235                 :            :   }
     236         [ -  + ]:      30884 :   TopologyEntity* te_ptr = dynamic_cast<TopologyEntity*>(this);
     237         [ -  + ]:      30884 :   if( !te_ptr )
     238                 :          0 :     return CUBIT_FAILURE;
     239                 :            :   
     240                 :      30884 :   remove_all_simple_attribute(te_ptr->bridge_manager()->topology_bridge());
     241                 :            : 
     242                 :      30884 :   update_cubit_attrib(CA_ASSEMBLY_DATA);
     243                 :      30884 :   write_cubit_attrib_by_type(CA_ASSEMBLY_DATA);
     244                 :      30884 :   update_cubit_attrib(CA_ENTITY_NAME);
     245                 :      30884 :   write_cubit_attrib_by_type( CA_ENTITY_NAME );
     246                 :      30884 :   set_written_flag(CUBIT_FALSE);
     247                 :      30884 :   return CUBIT_SUCCESS; 
     248                 :            : }
     249                 :            : 
     250                 :      55603 : CubitStatus CubitAttribUser::write_specific_cubit_attrib(CubitAttrib* cubit_attrib_ptr)
     251                 :            : {
     252                 :      55603 :   CubitStatus result = CUBIT_SUCCESS;
     253                 :            :   
     254                 :            :     // don't write if this attrib is marked as deleted or it has already been written
     255                 :            :     // Also, only write if the write flag is on for this attribute type
     256   [ +  +  +  - ]:      82054 :   if ((cubit_attrib_ptr->delete_attrib() != CUBIT_TRUE) &&
                 [ +  + ]
     257                 :            : //      (cubit_attrib_ptr->has_written() != CUBIT_TRUE) &&
     258                 :      26451 :       (CGMApp::instance()->attrib_manager()->auto_write_flag(cubit_attrib_ptr->int_attrib_type()) == CUBIT_TRUE)) 
     259                 :            :   {
     260                 :            : 
     261         [ -  + ]:      26451 :     if (DEBUG_FLAG(90)) {
     262         [ #  # ]:          0 :       RefEntity *this_entity = CAST_TO(this, RefEntity);
     263 [ #  # ][ #  # ]:          0 :       PRINT_DEBUG_90( "Writing attribute for %s %d, type %s\n",
     264                 :            :                   this_entity->class_name(), this_entity->id(),
     265         [ #  # ]:          0 :                   cubit_attrib_ptr->att_internal_name());
     266                 :            :     }
     267                 :            : 
     268                 :            :       // set has_written flag here, before actually writing - a trick to
     269                 :            :       // allow some attributes to detect they're being written, and do any
     270                 :            :       // final setup they need to do before the actual write takes place (used
     271                 :            :       // in CAMeshContainer, for example)
     272                 :      26451 :     cubit_attrib_ptr->has_written(CUBIT_TRUE);
     273                 :            : 
     274                 :      26451 :     const CubitSimpleAttrib &csa_ptr = cubit_attrib_ptr->cubit_simple_attrib();
     275                 :            :     
     276         [ +  - ]:      26451 :     result = put_simple_attrib(csa_ptr);
     277                 :            : 
     278                 :            :       // if the write wasn't successful, reset the write flag
     279 [ +  + ][ +  - ]:      26451 :     if (result != CUBIT_SUCCESS) cubit_attrib_ptr->has_written(CUBIT_FALSE);
     280                 :            : 
     281                 :            :   }
     282                 :            :   
     283                 :      55603 :   return result;
     284                 :            : }
     285                 :            :   
     286                 :     178526 : CubitStatus CubitAttribUser::write_cubit_attrib_by_type(int attrib_type)
     287                 :            : {
     288         [ +  - ]:     178526 :   DLIList<CubitAttrib*> attrib_list;
     289         [ +  - ]:     178526 :   find_cubit_attrib_type(attrib_type, attrib_list);
     290 [ +  - ][ +  - ]:     178526 :   CubitStatus write_status = write_cubit_attrib_list(attrib_list);
                 [ +  - ]
     291         [ +  - ]:     178526 :   return write_status;
     292                 :            : }
     293                 :            :   
     294                 :     178526 : CubitStatus CubitAttribUser::write_cubit_attrib_list(DLIList<CubitAttrib*> 
     295                 :            :                                                        attrib_list)
     296                 :            : {
     297                 :     178526 :   CubitStatus write_status = CUBIT_SUCCESS;
     298                 :     178526 :   attrib_list.reset();
     299         [ +  + ]:     210346 :   for(int i = attrib_list.size(); i > 0; i--)
     300                 :            :   {
     301                 :      31820 :     CubitAttrib* cubit_attrib_ptr = attrib_list.get_and_step();
     302         [ -  + ]:      31820 :     if (write_specific_cubit_attrib(cubit_attrib_ptr) == CUBIT_FAILURE)
     303                 :          0 :       write_status = CUBIT_FAILURE;
     304                 :            :   }
     305                 :     178526 :   return write_status;
     306                 :            : }
     307                 :            :   
     308                 :      32396 : CubitStatus CubitAttribUser::write_cubit_attribs()
     309                 :            : {
     310                 :            :     // write the attributes
     311                 :      32396 :   CubitStatus write_status = CUBIT_SUCCESS;
     312         [ +  - ]:      32396 :   DLIList<CubitAttrib*> attrib_list;
     313                 :            :   CubitAttrib *attrib;
     314         [ +  - ]:      32396 :   get_cubit_attrib_list(attrib_list);
     315         [ +  - ]:      32396 :   attrib_list.reset();
     316                 :            :   int i;
     317 [ +  - ][ +  + ]:      51034 :   for(i = attrib_list.size(); i != 0; i--)
     318                 :            :   {
     319         [ +  - ]:      18638 :     attrib = attrib_list.get_and_step();
     320 [ +  - ][ -  + ]:      18638 :     if (write_specific_cubit_attrib(attrib) == CUBIT_FAILURE)
     321                 :          0 :       write_status = CUBIT_FAILURE;
     322                 :            :   }
     323                 :            :   
     324         [ +  - ]:      32396 :   return write_status;
     325                 :            : }
     326                 :            :  
     327                 :          0 : void CubitAttribUser::split_owner(DLIList<CubitSimpleAttrib> &csa_list)
     328                 :            : {
     329                 :            :   
     330                 :            :     //- if owner is to be split, get simple attribs for new entity
     331                 :            : 
     332                 :            :     // first auto create attributes
     333                 :            :   /*CubitStatus success = */
     334 [ #  # ][ #  # ]:          0 :   CGMApp::instance()->attrib_manager()->auto_update_attribs(CAST_TO(this, RefEntity));
         [ #  # ][ #  # ]
     335                 :            : 
     336                 :            :     // call split for each attribute, getting back new csa's
     337         [ #  # ]:          0 :   DLIList<CubitAttrib*> ca_list;
     338         [ #  # ]:          0 :   get_cubit_attrib_list(ca_list);
     339                 :            :   int i;
     340 [ #  # ][ #  # ]:          0 :   for ( i = ca_list.size(); i > 0; i--) {
     341         [ #  # ]:          0 :     CubitAttrib *ca_ptr = ca_list.get_and_step();
     342         [ #  # ]:          0 :     CubitSimpleAttrib csa_ptr = ca_ptr->split_owner();
     343 [ #  # ][ #  # ]:          0 :     if (!csa_ptr.isEmpty())
     344         [ #  # ]:          0 :       csa_list.append(csa_ptr);
     345         [ #  # ]:          0 :   }
     346                 :            : 
     347                 :            :     // now, check delete flag for each ca_ptr, and delete if necessary
     348 [ #  # ][ #  # ]:          0 :   for (i = ca_list.size(); i > 0; i--) {
     349         [ #  # ]:          0 :     CubitAttrib *ca_ptr = ca_list.get_and_step();
     350 [ #  # ][ #  # ]:          0 :     if (ca_ptr->delete_attrib()) {
     351         [ #  # ]:          0 :       remove_cubit_attrib(ca_ptr);
     352 [ #  # ][ #  # ]:          0 :       delete ca_ptr;
     353                 :            :     }
     354         [ #  # ]:          0 :   }
     355                 :            : 
     356                 :            :     // ok, we're done
     357                 :          0 : }
     358                 :            : 
     359                 :          0 : void CubitAttribUser::merge_owner(RefEntity *deletable_entity)
     360                 :            : {
     361                 :            :     //- if owner is to be merged, combine attribs from deletable_entity with this
     362                 :            : 
     363                 :            :     // if no deletable entity, keep the entity name and delete the other
     364                 :            :     // attribs on this entity
     365                 :            :   int i;
     366         [ #  # ]:          0 :   if (deletable_entity == NULL) {
     367         [ #  # ]:          0 :     DLIList<CubitAttrib*> ca_list;
     368         [ #  # ]:          0 :     get_cubit_attrib_list(ca_list);
     369 [ #  # ][ #  # ]:          0 :     for (i = ca_list.size(); i > 0; i--) {
     370         [ #  # ]:          0 :       CubitAttrib *ca_ptr = ca_list.get_and_step();
     371 [ #  # ][ #  # ]:          0 :       if (ca_ptr->int_attrib_type() != CA_ENTITY_NAME &&
                 [ #  # ]
     372 [ #  # ][ #  # ]:          0 :           ca_ptr->int_attrib_type() != CA_ASSEMBLY_DATA &&
                 [ #  # ]
     373         [ #  # ]:          0 :           ca_ptr->int_attrib_type() != CA_MESH_OUTPUT_GROUP)
     374                 :            :       {
     375         [ #  # ]:          0 :         remove_cubit_attrib(ca_ptr);
     376 [ #  # ][ #  # ]:          0 :         delete ca_ptr;
     377                 :            :       }
     378                 :            :     }
     379                 :            : 
     380         [ #  # ]:          0 :     return;
     381                 :            :   }
     382                 :            :     
     383                 :            :     // first auto create attributes
     384                 :            :   /*CubitStatus success = */
     385 [ #  # ][ #  # ]:          0 :   CGMApp::instance()->attrib_manager()->auto_update_attribs(CAST_TO(this, RefEntity));
         [ #  # ][ #  # ]
     386                 :            : 
     387                 :            :     // copy any attr's on deletable_entity but not on this
     388         [ #  # ]:          0 :   auto_create_for_merge(deletable_entity);
     389                 :            : 
     390                 :            :     // call merge for each attribute, passing other as argument
     391 [ #  # ][ #  # ]:          0 :   DLIList<CubitAttrib*> ca_list, deletable_ca_list;
                 [ #  # ]
     392         [ #  # ]:          0 :   get_cubit_attrib_list(ca_list);
     393         [ #  # ]:          0 :   deletable_entity->get_cubit_attrib_list(deletable_ca_list);
     394 [ #  # ][ #  # ]:          0 :   assert(ca_list.size() >= deletable_ca_list.size());
                 [ #  # ]
     395 [ #  # ][ #  # ]:          0 :   for (i = ca_list.size(); i > 0; i--) {
     396         [ #  # ]:          0 :     CubitAttrib *ca_ptr = ca_list.get_and_step();
     397         [ #  # ]:          0 :     deletable_ca_list.reset();
     398                 :          0 :     CubitAttrib *deletable_ca_ptr = NULL;
     399 [ #  # ][ #  # ]:          0 :     if (deletable_ca_list.size() > 0) {
     400         [ #  # ]:          0 :       deletable_ca_ptr = deletable_ca_list.get();
     401                 :            :         // get the corresponding deletable attribute, then extract it from
     402                 :            :         //   the list
     403 [ #  # ][ #  # ]:          0 :       while (ca_ptr->int_attrib_type() != deletable_ca_ptr->int_attrib_type() &&
         [ #  # ][ #  # ]
                 [ #  # ]
     404         [ #  # ]:          0 :              !deletable_ca_list.is_at_end()) {
     405         [ #  # ]:          0 :         deletable_ca_list.step();
     406         [ #  # ]:          0 :         deletable_ca_ptr = deletable_ca_list.get();
     407                 :            :       }
     408 [ #  # ][ #  # ]:          0 :       if (ca_ptr->int_attrib_type() == deletable_ca_ptr->int_attrib_type())
                 [ #  # ]
     409         [ #  # ]:          0 :         deletable_ca_list.extract();
     410                 :          0 :       else deletable_ca_ptr = NULL;
     411                 :            :     }
     412         [ #  # ]:          0 :     ca_ptr->merge_owner(deletable_ca_ptr);
     413                 :            :   }
     414                 :            :   
     415                 :            :     // now, check delete flag for each ca_ptr, and delete if necessary
     416 [ #  # ][ #  # ]:          0 :   for (i = ca_list.size(); i > 0; i--) {
     417         [ #  # ]:          0 :     CubitAttrib *ca_ptr = ca_list.get_and_step();
     418 [ #  # ][ #  # ]:          0 :     if (ca_ptr->delete_attrib()) {
     419         [ #  # ]:          0 :       remove_cubit_attrib(ca_ptr);
     420 [ #  # ][ #  # ]:          0 :       delete ca_ptr;
     421                 :            :     }
     422         [ #  # ]:          0 :   }
     423                 :            : 
     424                 :            :   // ok, we're done
     425                 :            : }
     426                 :            : 
     427                 :          0 : void CubitAttribUser::transf_owner(const CubitVector &matrow1,
     428                 :            :                                    const CubitVector &matrow2,
     429                 :            :                                    const CubitVector &matrow3,
     430                 :            :                                    const CubitVector &translate_vec,
     431                 :            :                                    const double scale_factor)
     432                 :            : {
     433                 :            :   
     434                 :            :     //- called if owner is to be transformed; simply passes information
     435                 :            :     //- to attribs on this entity; does *not* autocreate
     436                 :            :   
     437         [ #  # ]:          0 :   DLIList<CubitAttrib*> ca_list;
     438         [ #  # ]:          0 :   get_cubit_attrib_list(ca_list);
     439 [ #  # ][ #  # ]:          0 :   for (int i = ca_list.size(); i > 0; i--) {
     440         [ #  # ]:          0 :     CubitAttrib *ca_ptr = ca_list.get_and_step();
     441                 :            :     ca_ptr->transf_owner(matrow1, matrow2, matrow3,
     442         [ #  # ]:          0 :                          translate_vec, scale_factor);
     443         [ #  # ]:          0 :   }
     444                 :            : 
     445                 :            :     // ok, we're done
     446                 :          0 : }
     447                 :            : 
     448                 :          0 : void CubitAttribUser::auto_create_for_merge(RefEntity *deletable_entity)
     449                 :            : {
     450                 :            :     // copy any attr's on deletable_entity but not on this
     451         [ #  # ]:          0 :   DLIList<CubitAttrib*> deletable_ca_list;
     452         [ #  # ]:          0 :   deletable_entity->get_cubit_attrib_list(deletable_ca_list);
     453 [ #  # ][ #  # ]:          0 :   if (deletable_ca_list.size() == 0) return;
     454                 :            :   
     455 [ #  # ][ #  # ]:          0 :   DLIList<CubitAttrib*> new_list;
         [ #  # ][ #  # ]
     456         [ #  # ]:          0 :   RefEntity *entity = CAST_TO(this, RefEntity);
     457 [ #  # ][ #  # ]:          0 :   for (int i = deletable_ca_list.size(); i > 0; i--) {
     458         [ #  # ]:          0 :     new_list.clean_out();
     459         [ #  # ]:          0 :     CubitAttrib *deletable_ca_ptr = deletable_ca_list.get_and_step();
     460 [ #  # ][ #  # ]:          0 :     find_cubit_attrib_type(deletable_ca_ptr->int_attrib_type(), new_list);
     461 [ #  # ][ #  # ]:          0 :     if (new_list.size() == 0)
     462                 :            :     {
     463                 :            :       CGMApp::instance()->attrib_manager()->create_cubit_attrib(
     464                 :          0 :                                                 deletable_ca_ptr->int_attrib_type(),
     465 [ #  # ][ #  # ]:          0 :             entity, CubitSimpleAttrib());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     466                 :            :     }
     467                 :          0 :   }
     468                 :            : }
     469                 :            : 
     470                 :          0 : CubitStatus CubitAttribUser::actuate_cubit_attrib (CubitAttrib* cubit_attrib_ptr)
     471                 :            : {
     472                 :          0 :   CubitStatus return_value = CUBIT_FAILURE;
     473         [ #  # ]:          0 :   if (cubit_attrib_ptr != NULL )
     474                 :            :   {
     475   [ #  #  #  # ]:          0 :     if (cubit_attrib_ptr->has_actuated() == CUBIT_TRUE ||
                 [ #  # ]
     476                 :          0 :         cubit_attrib_ptr->delete_attrib() == CUBIT_TRUE) {
     477                 :          0 :       return CUBIT_FAILURE;
     478                 :            :     }
     479                 :            :     
     480                 :          0 :     return_value = cubit_attrib_ptr->actuate();
     481         [ #  # ]:          0 :     if (cubit_attrib_ptr->delete_attrib() == CUBIT_TRUE)
     482                 :            :     {
     483                 :          0 :       return_value = remove_cubit_attrib(cubit_attrib_ptr);
     484         [ #  # ]:          0 :       delete cubit_attrib_ptr;
     485                 :            :     }
     486                 :            :   }
     487                 :          0 :   return return_value;
     488                 :            : }
     489                 :            : 
     490                 :          0 : CubitStatus CubitAttribUser::actuate_cubit_attrib (int attrib_type)
     491                 :            : {
     492         [ #  # ]:          0 :   DLIList<CubitAttrib*> attrib_list;
     493         [ #  # ]:          0 :   find_cubit_attrib_type(attrib_type, attrib_list);
     494 [ #  # ][ #  # ]:          0 :   CubitStatus actuate_status = actuate_cubit_attrib(attrib_list);
                 [ #  # ]
     495         [ #  # ]:          0 :   return actuate_status;
     496                 :            : }
     497                 :            : 
     498                 :          0 : CubitStatus CubitAttribUser::actuate_cubit_attrib(DLIList<CubitAttrib*>
     499                 :            :                                                       attrib_list)
     500                 :            : {
     501                 :          0 :   CubitStatus actuate_status = CUBIT_SUCCESS;
     502                 :          0 :   attrib_list.reset();
     503         [ #  # ]:          0 :   for(int i = 0; i < attrib_list.size(); i++)
     504                 :            :   {
     505                 :          0 :     CubitAttrib* cubit_attrib_ptr = attrib_list.get_and_step();
     506         [ #  # ]:          0 :     if (actuate_cubit_attrib(cubit_attrib_ptr) == CUBIT_FAILURE)
     507                 :          0 :       actuate_status = CUBIT_FAILURE;
     508                 :            :   }
     509                 :          0 :   return actuate_status;
     510                 :            : } 
     511                 :            : 
     512                 :       2820 : CubitStatus CubitAttribUser::actuate_cubit_attrib(DLIList<RefEntity*> refent_list,
     513                 :            :                                                   int attrib_type)
     514                 :            :                                                   
     515                 :            : {
     516                 :       2820 :   CubitStatus actuate_status = CUBIT_SUCCESS;
     517         [ +  - ]:       2820 :   DLIList<CubitAttrib*> attrib_list;
     518                 :            :   RefEntity *ref_ent;
     519 [ +  - ][ +  + ]:      43887 :   for(int i = refent_list.size(); i > 0; i--)
     520                 :            :   {
     521         [ +  - ]:      41163 :     ref_ent = refent_list.get_and_step();
     522         [ -  + ]:      41163 :     TopologyEntity* me_ptr = dynamic_cast<TopologyEntity*>(ref_ent);
     523 [ +  - ][ +  - ]:      41163 :     if( me_ptr && me_ptr->deactivated() )
         [ -  + ][ -  + ]
     524                 :          0 :       continue;
     525         [ +  - ]:      41163 :     ref_ent->find_cubit_attrib_type(attrib_type, attrib_list);
     526 [ +  - ][ +  + ]:      41163 :     if (attrib_list.size() > 0)
     527 [ +  - ][ +  - ]:         96 :       return ((attrib_list.get())->actuate_list(refent_list));
         [ +  - ][ +  - ]
     528                 :            :   }
     529         [ +  - ]:       2820 :   return actuate_status;
     530                 :            : }
     531                 :            : 
     532                 :            : //CubitStatus CubitAttribUser::actuate_cubit_attrib ()
     533                 :            : //{
     534                 :            : //  CubitStatus actuate_status = CUBIT_SUCCESS;
     535                 :            : //  DLIList<CubitAttrib*> attrib_list;
     536                 :            : //  CubitAttrib *attrib;
     537                 :            : //  get_cubit_attrib_list(attrib_list);
     538                 :            : //  attrib_list.reset();
     539                 :            : //
     540                 :            : //  for(int i = attrib_list.size(); i != 0; i--)
     541                 :            : //  {
     542                 :            : //    attrib = attrib_list.get_and_step();
     543                 :            : //      if (attrib->actuate() == CUBIT_FAILURE)
     544                 :            : //      {
     545                 :            : //        actuate_status = CUBIT_FAILURE;
     546                 :            : //      }
     547                 :            : //      if (attrib->delete_attrib() == CUBIT_TRUE)
     548                 :            : //      {
     549                 :            : //        remove_cubit_attrib(attrib);
     550                 :            : //        delete attrib;
     551                 :            : //      }
     552                 :            : //  }
     553                 :            : //  return actuate_status;
     554                 :            : //}
     555                 :            : 
     556                 :     203166 : CubitStatus CubitAttribUser::auto_actuate_cubit_attrib (CubitBoolean from_constructor,
     557                 :            :                                                         CubitBoolean after_geom_changes)
     558                 :            : {
     559                 :     203166 :   CubitStatus actuate_status = CUBIT_SUCCESS;
     560                 :            :   CubitAttrib *attrib;
     561         [ +  - ]:     203166 :   DLIList<CubitAttrib*> attrib_list;
     562         [ +  - ]:     203166 :   get_cubit_attrib_list(attrib_list);
     563         [ +  - ]:     203166 :   attrib_list.reset();
     564                 :            :   int i;
     565 [ +  - ][ +  + ]:     217608 :   for( i = attrib_list.size(); i != 0; i--)
     566                 :            :   {
     567         [ +  - ]:      14442 :     attrib = attrib_list.get_and_step();
     568                 :            :       // check first for deletable attribute; this attribute shouldn't really be here,
     569                 :            :       // but until we figure out why it is...
     570 [ +  - ][ -  + ]:      14442 :     if (attrib->delete_attrib() == CUBIT_TRUE) {
     571 [ #  # ][ #  # ]:          0 :       PRINT_DEBUG_90("Trying to auto actuate deletable attribute - this is bad...\n");
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     572                 :            :     }
     573 [ +  - ][ +  + ]:      43326 :     else if (attrib->auto_actuate_flag() == CUBIT_TRUE &&
                 [ +  + ]
     574 [ +  - ][ +  + ]:      22848 :         !attrib->has_actuated() &&
     575 [ +  - ][ +  - ]:      35493 :         (!from_constructor || attrib->actuate_in_constructor()) &&
         [ +  + ][ +  + ]
     576 [ +  - ][ +  - ]:       6609 :         (after_geom_changes || !attrib->actuate_after_geom_changes()))
     577                 :            :     {
     578                 :            : 
     579 [ +  - ][ +  - ]:       7837 :       PRINT_DEBUG_90("Actuating attribute type %s for %s %d\n",
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     580                 :            :                      attrib->att_internal_name(), attrib->attrib_owner()->class_name(),
     581         [ #  # ]:          0 :                      attrib->attrib_owner()->id());
     582                 :            :       
     583 [ +  - ][ +  + ]:       7837 :       if(attrib->actuate() == CUBIT_FAILURE)
     584                 :            :       {
     585                 :       2992 :         actuate_status = CUBIT_FAILURE;
     586                 :            :       }
     587                 :            : 
     588                 :            :         // need to check again for delete flag, since it might have been set
     589                 :            :         // in actuate function
     590 [ +  - ][ +  + ]:       7837 :       if( attrib->delete_attrib() == CUBIT_TRUE)
     591                 :            :       {
     592         [ +  - ]:        569 :         remove_cubit_attrib(attrib);
     593 [ +  - ][ +  - ]:        569 :         delete attrib;
     594                 :            :       }
     595                 :            :     }
     596                 :            :   }
     597                 :            : 
     598                 :            : //  if (CADeferredAttrib::cleanup_cadas(from_constructor, after_geom_changes) == CUBIT_FAILURE)
     599                 :            : //    actuate_status = CUBIT_FAILURE;
     600                 :            : 
     601         [ +  - ]:     203166 :   return actuate_status;
     602                 :            : }
     603                 :            : 
     604                 :            : //CubitStatus CubitAttribUser::update_cubit_attrib (CubitAttrib* cubit_attrib_ptr)
     605                 :            : //{
     606                 :            : //  if (cubit_attrib_ptr != NULL)
     607                 :            : //      return cubit_attrib_ptr->update();
     608                 :            : //  return CUBIT_FAILURE;
     609                 :            : //}
     610                 :            : 
     611                 :      61768 : CubitStatus CubitAttribUser::update_cubit_attrib (int attrib_type)
     612                 :            : {
     613         [ +  - ]:      61768 :   DLIList<CubitAttrib*> attrib_list;
     614                 :      61768 :   CubitAttrib* new_attrib = NULL;
     615         [ +  - ]:      61768 :   find_cubit_attrib_type(attrib_type, attrib_list);
     616                 :            : 
     617 [ +  - ][ -  + ]:      61768 :   if( attrib_list.size() > 1 )
     618                 :            :   {
     619 [ #  # ][ #  # ]:          0 :     PRINT_WARNING("File contains multiples of the same attrib.\n");
         [ #  # ][ #  # ]
     620 [ #  # ][ #  # ]:          0 :     PRINT_INFO("    Something was not written correctly.\n");
         [ #  # ][ #  # ]
     621                 :            :   }
     622                 :            :   
     623 [ +  - ][ +  + ]:      61768 :   if(attrib_list.size() == 0)
     624         [ +  - ]:      59142 :     new_attrib = get_cubit_attrib(attrib_type);
     625                 :            :   else
     626         [ +  - ]:       2626 :     new_attrib = attrib_list.get();
     627                 :            : 
     628         [ -  + ]:      61768 :   assert(new_attrib != 0);
     629         [ +  - ]:      61768 :   CubitStatus update_status = new_attrib->update();
     630                 :            :   
     631         [ +  - ]:      61768 :   return update_status;
     632                 :            : }
     633                 :            : 
     634                 :            : //CubitStatus CubitAttribUser::update_cubit_attrib(DLIList<CubitAttrib*>
     635                 :            : //                                                      attrib_list)
     636                 :            : //{
     637                 :            : //  CubitStatus update_status = CUBIT_SUCCESS;
     638                 :            : //  attrib_list.reset();
     639                 :            : //  for(int i = attrib_list.size(); i > 0; i--)
     640                 :            : //  {
     641                 :            : //    CubitAttrib* cubit_attrib_ptr = attrib_list.get_and_step();
     642                 :            : //    if (cubit_attrib_ptr->update() == CUBIT_FAILURE)
     643                 :            : //      update_status = CUBIT_FAILURE;
     644                 :            : //  }
     645                 :            : //  return update_status;
     646                 :            : //} 
     647                 :            : 
     648                 :            : //CubitStatus CubitAttribUser::update_cubit_attrib()
     649                 :            : //{
     650                 :            : //  return CUBIT_FAILURE;
     651                 :            : //} 
     652                 :            : 
     653                 :      32396 : CubitStatus CubitAttribUser::auto_update_cubit_attrib ()
     654                 :            : {
     655                 :            : 
     656                 :            :     // for this cau, automatically create and update ca's
     657                 :            : 
     658                 :            :     // first, create ca's for any attribute type which has its auto
     659                 :            :     // update flag set and which isn't present yet on this entity
     660                 :            :   /*CubitStatus success = */
     661 [ -  + ][ +  - ]:      32396 :   CGMApp::instance()->attrib_manager()->auto_update_attribs(CAST_TO(this, RefEntity));
         [ +  - ][ +  - ]
     662                 :            : 
     663                 :            :     // now, update all attributes present on this entity
     664                 :      32396 :   CubitStatus update_status = CUBIT_SUCCESS;
     665         [ +  - ]:      32396 :   DLIList<CubitAttrib*> attrib_list;
     666 [ +  - ][ +  - ]:      64792 :   DLIList<CubitAttrib*> attribs_to_delete;
     667                 :            :   CubitAttrib *attrib;
     668         [ +  - ]:      32396 :   get_cubit_attrib_list(attrib_list);
     669         [ +  - ]:      32396 :   attrib_list.reset();
     670                 :            :   int i;
     671 [ +  - ][ +  + ]:     239546 :   for( i = attrib_list.size(); i != 0; i--)
     672                 :            :   {
     673         [ +  - ]:     207150 :     attrib = attrib_list.get_and_step();
     674 [ +  - ][ +  + ]:     207150 :     if (!attrib->has_updated()) {
     675                 :            :         // if this attribute has written already, reset the information in it
     676                 :            :         // so it gets a "clean" update (otherwise information can be added to
     677                 :            :         // lists on the attrib more than once)
     678 [ +  - ][ +  + ]:     204126 :       if (CUBIT_TRUE == attrib->has_written())
     679         [ +  - ]:         60 :          attrib->reset();
     680                 :            :     
     681                 :            :         // reset the delete flag here, so we don't need to do it in every attribute
     682                 :            :         // (it'll get set back to delete if the update isn't successful)
     683         [ +  - ]:     204126 :       attrib->delete_attrib(CUBIT_FALSE);
     684 [ +  - ][ +  - ]:     204126 :       PRINT_DEBUG_90("Updating attribute type %s for %s %d, delete = ",
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     685                 :            :                      attrib->att_internal_name(), attrib->attrib_owner()->class_name(),
     686         [ #  # ]:          0 :                      attrib->attrib_owner()->id());
     687         [ +  - ]:     204126 :       update_status = attrib->update();
     688                 :            : 
     689 [ +  - ][ +  + ]:     204126 :       if( attrib->delete_attrib() )
     690         [ +  - ]:     188512 :         attribs_to_delete.append( attrib );
     691                 :            : 
     692 [ +  - ][ +  - ]:     204126 :       PRINT_DEBUG_90("%s\n",
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     693         [ #  # ]:          0 :                      (attrib->delete_attrib() == CUBIT_FALSE ? "NO" : "YES"));
     694                 :            : 
     695                 :            :         // if update was successful, reset the written flag (assumes that all
     696                 :            :         // updates are done before writing starts)
     697                 :            :         // (don't reset if it's the entity_name attrib, since this attrib is
     698                 :            :         // written automatically every time it's updated)
     699 [ +  - ][ +  - ]:     204126 :       if (update_status == CUBIT_SUCCESS && attrib->int_attrib_type() != CA_ENTITY_NAME)
         [ +  + ][ +  + ]
     700         [ +  - ]:     171730 :         attrib->has_written(CUBIT_FALSE);
     701                 :            :     }
     702                 :            :         else
     703                 :            :         {
     704 [ +  - ][ +  - ]:       3024 :                 PRINT_DEBUG_90("Not updating attribute type %s for %s %d, delete = ",
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     705                 :            :                      attrib->att_internal_name(), attrib->attrib_owner()->class_name(),
     706         [ #  # ]:          0 :                      attrib->attrib_owner()->id());
     707 [ +  - ][ +  - ]:       3024 :                 PRINT_DEBUG_90("%s\n",
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     708         [ #  # ]:          0 :                      (attrib->delete_attrib() == CUBIT_FALSE ? "NO" : "YES"));
     709                 :            :         }
     710                 :            :   }
     711                 :            :   
     712                 :            :   
     713                 :            :   //remove any attribs that don't need to be there
     714 [ +  - ][ +  - ]:      32396 :   remove_cubit_attrib( attribs_to_delete ); 
                 [ +  - ]
     715                 :            : 
     716                 :            : /*
     717                 :            :   RefEntity* re_ptr;
     718                 :            :   re_ptr = CAST_TO(this, RefEntity);
     719                 :            :   DLIList<RefEntity*> children;
     720                 :            :   re_ptr->get_child_ref_entities( children );
     721                 :            :   for ( i = children.size(); i > 0; i-- )
     722                 :            :   {
     723                 :            :     children.get()->auto_update_cubit_attrib();
     724                 :            :     children.step();
     725                 :            :   }
     726                 :            : */
     727         [ +  - ]:      32396 :   return update_status;
     728                 :            : }
     729                 :            : 
     730                 :        615 : void CubitAttribUser::auto_reset_cubit_attrib (DLIList<RefEntity*> ref_ents)
     731                 :            : {
     732                 :            :     // set the update flag back off for all attribs on these entities and their children
     733 [ +  - ][ +  - ]:       1230 :   DLIList<RefEntity*> children, temp_list;
                 [ +  - ]
     734                 :            :   int i;
     735 [ +  - ][ +  + ]:      33011 :   for (i = ref_ents.size(); i > 0; i--) {
     736         [ +  - ]:      32396 :     temp_list.clean_out();
     737 [ +  - ][ +  - ]:      32396 :     ref_ents.get_and_step()->get_all_child_ref_entities(temp_list);
     738         [ +  - ]:      32396 :     children += temp_list;
     739                 :            :   }
     740         [ +  - ]:        615 :   ref_ents.merge_unique(children);
     741                 :            :   
     742                 :            :     // ok, have a unique'd list if entities; now reset on each of them
     743         [ +  - ]:        615 :   ref_ents.reset();
     744 [ +  - ][ +  + ]:      33011 :   for (i = ref_ents.size(); i > 0; i--) {
     745 [ +  - ][ +  - ]:      32396 :     ref_ents.get()->set_written_flag(CUBIT_FALSE);
     746 [ +  - ][ +  - ]:      32396 :     ref_ents.get_and_step()->set_updated_flag(CUBIT_FALSE);
     747         [ +  - ]:        615 :   }
     748                 :        615 : }
     749                 :            : 
     750                 :            : //void CubitAttribUser::auto_reset_cubit_attrib ()
     751                 :            : //{
     752                 :            : //    // set the update flag back off for all attribs on these entities and their children
     753                 :            : //  DLIList<CubitAttrib*> attrib_list;
     754                 :            : //  CubitAttrib *attrib;
     755                 :            : //  get_cubit_attrib_list(attrib_list);
     756                 :            : //  attrib_list.reset();
     757                 :            : //  int i;
     758                 :            : //  for( i = attrib_list.size(); i != 0; i--)
     759                 :            : //  {
     760                 :            : //    attrib = attrib_list.get_and_step();
     761                 :            : //    if (attrib->has_updated() && attrib->has_written())
     762                 :            : //      attrib->has_updated(CUBIT_FALSE);
     763                 :            : //  }
     764                 :            : //}
     765                 :            : 
     766                 :        615 : CubitStatus CubitAttribUser::auto_update_cubit_attrib (DLIList<RefEntity*> &entity_list,
     767                 :            :                                                        CubitBoolean write_too)
     768                 :            : {
     769                 :            :     //- for entity_list, auto create, update and write ca's
     770                 :            : 
     771                 :            :     // now, reset the update and write flags for these entities
     772                 :            :     // and their children
     773         [ +  - ]:        615 :   auto_reset_cubit_attrib(entity_list);
     774                 :            : 
     775                 :            :     // need to update all then write all in separate loops,
     776                 :            :     // to prevent duplication of attributes
     777                 :            :   int i;
     778         [ +  + ]:      33011 :   for ( i = entity_list.size(); i > 0; i--) 
     779                 :      32396 :      entity_list.get_and_step()->auto_update_cubit_attrib();
     780                 :            : 
     781         [ +  - ]:        615 :   if (write_too) {
     782         [ +  + ]:      33011 :     for (i = entity_list.size(); i > 0; i--) 
     783                 :      32396 :       entity_list.get_and_step()->write_cubit_attribs();
     784                 :            :   }
     785                 :            :   
     786                 :            :   
     787                 :        615 :   return CUBIT_SUCCESS;
     788                 :            : }
     789                 :            : 
     790                 :       1092 : CubitStatus CubitAttribUser::clear_all_simple_attrib( DLIList<RefEntity*>& entity_list )
     791                 :            : {
     792                 :       1092 :   CubitStatus result = CUBIT_SUCCESS;
     793         [ +  + ]:      31976 :   for( int i = entity_list.size(); i--; )
     794         [ -  + ]:      30884 :     if( entity_list.get_and_step()->clear_simple_attribs() != CUBIT_SUCCESS )
     795                 :          0 :       result = CUBIT_FAILURE;
     796                 :       1092 :   return result;
     797                 :            : }
     798                 :            : 
     799                 :        938 : CubitStatus CubitAttribUser::clear_all_simple_attrib_set_to_actuate( DLIList<RefEntity*>& entity_list )
     800                 :            : {
     801                 :        938 :   CubitStatus result = CUBIT_SUCCESS;
     802         [ +  + ]:      59317 :   for( int i = entity_list.size(); i--; )
     803         [ -  + ]:      58379 :     if( entity_list.get_and_step()->clear_simple_attribs_set_to_actuate() != CUBIT_SUCCESS )
     804                 :          0 :       result = CUBIT_FAILURE;
     805                 :        938 :   return result;
     806                 :            : }
     807                 :            : 
     808                 :     809280 : void CubitAttribUser::find_cubit_attrib_type(int type,
     809                 :            :                                              DLIList<CubitAttrib*>& attrib_list) const
     810                 :            : {
     811         [ +  + ]:    2137088 :   for(CubitAttrib* cubit_attrib_ptr = headAttrib;
     812                 :    2137088 :       cubit_attrib_ptr != NULL;
     813         [ +  - ]:    1327808 :       cubit_attrib_ptr = cubit_attrib_ptr->next_attrib())
     814                 :            :   {
     815 [ +  - ][ +  + ]:    1327808 :     if (type == cubit_attrib_ptr->int_attrib_type())
     816         [ +  - ]:     220533 :       attrib_list.append_unique(cubit_attrib_ptr);
     817                 :            :   }
     818                 :     809280 : }
     819                 :            : 
     820                 :      32396 : CubitStatus CubitAttribUser::remove_cubit_attrib(DLIList<CubitAttrib*>
     821                 :            :                                                       attrib_list)
     822                 :            : {
     823                 :      32396 :   CubitStatus remove_status = CUBIT_SUCCESS;
     824                 :      32396 :   attrib_list.reset();
     825         [ +  + ]:     220908 :   for(int i = attrib_list.size(); i != 0; i--)
     826                 :            :   {
     827                 :     188512 :     CubitAttrib* cubit_attrib_ptr = attrib_list.get_and_step();
     828         [ +  + ]:     188512 :     if (remove_cubit_attrib(cubit_attrib_ptr) == CUBIT_FAILURE)
     829                 :      10348 :       remove_status = CUBIT_FAILURE;
     830         [ +  - ]:     188512 :     delete cubit_attrib_ptr;
     831                 :            :   }
     832                 :      32396 :   return remove_status;
     833                 :            : } 
     834                 :            : 
     835                 :          0 : CubitStatus CubitAttribUser::remove_cubit_attrib(int attrib_type)
     836                 :            : {
     837         [ #  # ]:          0 :   DLIList<CubitAttrib*> attrib_list;
     838         [ #  # ]:          0 :   find_cubit_attrib_type(attrib_type, attrib_list);
     839 [ #  # ][ #  # ]:          0 :   CubitStatus remove_status = remove_cubit_attrib(attrib_list);
                 [ #  # ]
     840         [ #  # ]:          0 :   return remove_status;
     841                 :            : } 
     842                 :            : 
     843                 :     201987 : CubitStatus CubitAttribUser::remove_cubit_attrib (CubitAttrib*
     844                 :            :                                                   cubit_attrib_ptr)
     845                 :            : {
     846         [ -  + ]:     201987 :   if (cubit_attrib_ptr == NULL)
     847                 :          0 :     return CUBIT_FAILURE;
     848                 :     201987 :   CubitStatus remove_geom = remove_attrib_geometry_entity(cubit_attrib_ptr);
     849                 :            :   //CubitStatus remove_cubit = CUBIT_FAILURE;
     850                 :     201987 :   CubitBoolean once = CUBIT_FALSE;
     851         [ +  + ]:     201987 :   if (headAttrib == cubit_attrib_ptr) {
     852                 :     113408 :     headAttrib = cubit_attrib_ptr->next_attrib();
     853                 :     113408 :     once = CUBIT_TRUE;
     854                 :            :   }
     855                 :            :   
     856                 :     201987 :   CubitAttrib* temp_cubit_attrib_ptr = headAttrib;
     857         [ +  + ]:    1088767 :   while (temp_cubit_attrib_ptr != NULL) {
     858         [ +  + ]:     886780 :     if (cubit_attrib_ptr == temp_cubit_attrib_ptr->next_attrib()) {
     859         [ -  + ]:      88579 :       if (once) {
     860 [ #  # ][ #  # ]:          0 :         PRINT_DEBUG_90("Removing attribute more than once.\n");
                 [ #  # ]
     861                 :            :       }
     862                 :            :       temp_cubit_attrib_ptr->set_next_attrib(cubit_attrib_ptr->
     863                 :      88579 :                                              next_attrib());
     864                 :      88579 :       once = CUBIT_TRUE;
     865                 :            :     }
     866                 :            :       
     867                 :     886780 :     temp_cubit_attrib_ptr = temp_cubit_attrib_ptr->next_attrib();
     868                 :            :   }
     869                 :            : 
     870                 :     201987 :   return remove_geom;
     871                 :            : }
     872                 :            : 
     873                 :            : //CubitStatus CubitAttribUser::remove_cubit_attrib ()
     874                 :            : //{
     875                 :            : //  CubitAttrib *cubit_attrib_ptr = NULL;
     876                 :            : //  for(cubit_attrib_ptr = headAttrib;
     877                 :            : //      cubit_attrib_ptr != NULL;)
     878                 :            : //  {
     879                 :            : //    headAttrib = cubit_attrib_ptr->next_attrib();
     880                 :            : //    delete cubit_attrib_ptr;
     881                 :            : //    cubit_attrib_ptr = headAttrib;
     882                 :            : //  }
     883                 :            : //  remove_attrib_geometry_entity();
     884                 :            : //  return CUBIT_SUCCESS;
     885                 :            : //}
     886                 :            :   
     887                 :            :   
     888                 :            : 
     889                 :      81342 : CubitStatus CubitAttribUser::auto_read_cubit_attrib()
     890                 :            : {
     891                 :            :     // auto read all simple attributes on this entity & create CA's for them;
     892                 :            :     // checks global and CA-specific auto read flag, and puts CSA's back on
     893                 :            :     // entity if auto read for that type is off
     894                 :            :   
     895                 :      81342 :   CubitStatus cubit_assign_status = CUBIT_FAILURE;
     896                 :            :   
     897                 :            :     // Get the GeometryEntity of this RefEntity (it could be the OSME
     898                 :            :     // if it is a Body) and get its name, if it exists
     899                 :            :   
     900         [ +  - ]:      81342 :   DLIList<CubitSimpleAttrib> csattrib_list;
     901                 :            : 
     902                 :            :     // Deal with a Body entity
     903         [ -  + ]:      81342 :   Body* Body_ptr = CAST_TO(this, Body);
     904         [ -  + ]:      81342 :   BasicTopologyEntity* BTE_ptr = CAST_TO(this, BasicTopologyEntity);
     905         [ +  + ]:      81342 :   if ( Body_ptr != NULL )
     906                 :            :   {
     907         [ +  - ]:       2716 :     BodySM* OSME_ptr = Body_ptr->get_body_sm_ptr();
     908         [ +  - ]:       2716 :     OSME_ptr->get_simple_attribute(csattrib_list);
     909         [ +  - ]:       2716 :     remove_all_simple_attribute(OSME_ptr);
     910                 :            :   }
     911         [ +  - ]:      78626 :   else if ( BTE_ptr != NULL )
     912                 :            :   {
     913         [ +  - ]:      78626 :     GeometryEntity* GE_ptr = BTE_ptr->get_geometry_entity_ptr();
     914         [ +  - ]:      78626 :     GE_ptr->get_simple_attribute(csattrib_list);
     915         [ +  - ]:      78626 :     remove_all_simple_attribute(GE_ptr);
     916                 :            :   }
     917                 :          0 :   else return CUBIT_SUCCESS;
     918                 :            :   
     919         [ +  - ]:      81342 :   csattrib_list.reset();
     920 [ +  - ][ +  + ]:      86647 :   for(int i = csattrib_list.size(); i != 0; i--)
     921                 :            :   {
     922         [ +  - ]:       5305 :     const CubitSimpleAttrib& cubit_simple_attrib_ptr = csattrib_list.get_and_step();
     923 [ +  - ][ +  - ]:       5305 :     int csa_type = CGMApp::instance()->attrib_manager()->attrib_type(cubit_simple_attrib_ptr);
                 [ +  - ]
     924                 :       5305 :     CubitAttrib *new_attrib = NULL;
     925 [ +  - ][ +  - ]:       5305 :     if (CGMApp::instance()->attrib_manager()->auto_read_flag(csa_type))
         [ +  - ][ +  - ]
     926                 :            :         // auto create this CA
     927                 :            :       new_attrib = CGMApp::instance()->attrib_manager()->create_cubit_attrib(csa_type,
     928 [ -  + ][ +  - ]:       5305 :                                                     CAST_TO(this, RefEntity), cubit_simple_attrib_ptr);
         [ +  - ][ +  - ]
     929                 :            :     
     930 [ +  - ][ +  - ]:       5305 :     if (new_attrib != NULL && new_attrib->delete_attrib() == CUBIT_FALSE) 
         [ +  - ][ +  - ]
     931                 :       5305 :       cubit_assign_status = CUBIT_SUCCESS;
     932 [ #  # ][ #  # ]:          0 :     else if (new_attrib != NULL && new_attrib->delete_attrib() == CUBIT_TRUE) {
         [ #  # ][ #  # ]
     933         [ #  # ]:          0 :       remove_cubit_attrib(new_attrib);
     934 [ #  # ][ #  # ]:          0 :       delete new_attrib;
     935                 :            :     }
     936                 :            :     else
     937         [ #  # ]:          0 :       put_simple_attrib(cubit_simple_attrib_ptr);
     938                 :            :   }
     939                 :            :   
     940         [ +  - ]:      81342 :   return cubit_assign_status;
     941                 :            : }
     942                 :            : 
     943                 :          0 : CubitStatus CubitAttribUser::read_cubit_attrib(int attrib_type)
     944                 :            : {
     945                 :            : 
     946                 :            :   CubitStatus read_status;
     947                 :            :   
     948                 :            :     // get all simple attrib's
     949         [ #  # ]:          0 :   DLIList<CubitSimpleAttrib> csattrib_list;
     950                 :            : 
     951                 :            :     // Deal with a Body entity
     952         [ #  # ]:          0 :   Body* Body_ptr = CAST_TO(this, Body);
     953         [ #  # ]:          0 :   BasicTopologyEntity* BTE_ptr = CAST_TO(this, BasicTopologyEntity);
     954         [ #  # ]:          0 :   if ( Body_ptr != NULL )
     955                 :            :   {
     956         [ #  # ]:          0 :     BodySM* OSME_ptr = Body_ptr->get_body_sm_ptr();
     957         [ #  # ]:          0 :     read_status = OSME_ptr->get_simple_attribute(csattrib_list);
     958         [ #  # ]:          0 :     remove_all_simple_attribute(OSME_ptr);
     959                 :            :   }
     960         [ #  # ]:          0 :   else if ( BTE_ptr != NULL )
     961                 :            :   {
     962         [ #  # ]:          0 :     GeometryEntity* GE_ptr = BTE_ptr->get_geometry_entity_ptr();
     963         [ #  # ]:          0 :     read_status = GE_ptr->get_simple_attribute(csattrib_list);
     964         [ #  # ]:          0 :     remove_all_simple_attribute(GE_ptr);
     965                 :            :   }
     966                 :          0 :   else return CUBIT_SUCCESS;
     967                 :            :   
     968         [ #  # ]:          0 :   csattrib_list.reset();
     969 [ #  # ][ #  # ]:          0 :   for(int i = csattrib_list.size(); i != 0; i--)
     970                 :            :   {
     971         [ #  # ]:          0 :     const CubitSimpleAttrib& cubit_simple_attrib_ptr = csattrib_list.get_and_step();
     972 [ #  # ][ #  # ]:          0 :     int csa_type = CGMApp::instance()->attrib_manager()->attrib_type(cubit_simple_attrib_ptr);
                 [ #  # ]
     973 [ #  # ][ #  # ]:          0 :     if (attrib_type == CA_ALL_ATTRIBUTES || csa_type == attrib_type) {
     974                 :            :         // create this CA
     975                 :            : //       CubitAttrib *new_attrib =
     976                 :            :       CGMApp::instance()->attrib_manager()->create_cubit_attrib(csa_type,
     977 [ #  # ][ #  # ]:          0 :                                                                 CAST_TO(this, RefEntity), cubit_simple_attrib_ptr);
         [ #  # ][ #  # ]
     978                 :            :     }
     979                 :            :     else {
     980                 :            :         // otherwise we don't want to read this one; since the get_simple_attribute
     981                 :            :         // took the attribute off, we'll have to put this one back on
     982         [ #  # ]:          0 :       put_simple_attrib(cubit_simple_attrib_ptr);
     983                 :            :     }
     984                 :            :   }
     985                 :            :       
     986         [ #  # ]:          0 :   return read_status;
     987                 :            : }
     988                 :            :   
     989                 :            : //CubitStatus CubitAttribUser::read_cubit_attrib(CubitBoolean read_children)
     990                 :            : //{
     991                 :            : //  CubitStatus read_status = CUBIT_SUCCESS;
     992                 :            : //  if (read_cubit_attrib(CA_ALL_ATTRIBUTES) == CUBIT_FAILURE)
     993                 :            : //      read_status = CUBIT_FAILURE;
     994                 :            : //
     995                 :            : //  if (read_children) {
     996                 :            : //      // now, call read for all children
     997                 :            : //    DLIList<RefEntity*> children;
     998                 :            : //    RefEntity* re_ptr;
     999                 :            : //    re_ptr = CAST_TO(this, RefEntity);
    1000                 :            : //    re_ptr->get_all_child_ref_entities( children );
    1001                 :            : //    CubitStatus temp_status;
    1002                 :            : //    for ( int i = children.size(); i > 0; i-- )
    1003                 :            : //    {
    1004                 :            : //      temp_status = children.get()->read_cubit_attrib(CA_ALL_ATTRIBUTES);
    1005                 :            : //      if (temp_status == CUBIT_FAILURE) read_status = CUBIT_FAILURE;
    1006                 :            : //      children.step();
    1007                 :            : //    }
    1008                 :            : //  }
    1009                 :            : //  
    1010                 :            : //  return read_status;
    1011                 :            : //}
    1012                 :            :  
    1013                 :     422013 : void CubitAttribUser::get_cubit_attrib_list (DLIList<CubitAttrib*>& attrib_list)
    1014                 :            : {
    1015         [ +  + ]:     718079 :   for(CubitAttrib* cubit_attrib_ptr = headAttrib;
    1016                 :     718079 :       cubit_attrib_ptr != NULL;
    1017         [ +  - ]:     296066 :       cubit_attrib_ptr = cubit_attrib_ptr->next_attrib()) {
    1018         [ -  + ]:     296066 :     assert(NULL != cubit_attrib_ptr);
    1019         [ +  - ]:     296066 :     attrib_list.append_unique(cubit_attrib_ptr);
    1020                 :            :   }
    1021                 :     422013 : }
    1022                 :            : 
    1023                 :          0 : int CubitAttribUser::num_cubit_attrib()
    1024                 :            : {
    1025                 :          0 :   int number = 0;
    1026         [ #  # ]:          0 :   for(CubitAttrib* cubit_attrib_ptr = headAttrib;
    1027                 :            :       cubit_attrib_ptr != NULL;
    1028                 :            :       cubit_attrib_ptr = cubit_attrib_ptr->next_attrib())
    1029                 :          0 :     number++;
    1030                 :            : 
    1031                 :          0 :   return number;
    1032                 :            : }
    1033                 :            : 
    1034                 :     204061 : CubitStatus CubitAttribUser::remove_attrib_geometry_entity (CubitAttrib*
    1035                 :            :                                                             cubit_attrib_ptr)
    1036                 :            : {
    1037                 :     204061 :   CubitStatus removed = CUBIT_FAILURE;
    1038                 :            : 
    1039         [ -  + ]:     204061 :   if(cubit_attrib_ptr == NULL)
    1040                 :          0 :     return removed;
    1041                 :            : 
    1042         [ +  - ]:     204061 :   CubitSimpleAttrib csattrib_ptr = cubit_attrib_ptr->cubit_simple_attrib();
    1043 [ +  - ][ +  + ]:     204061 :   if(!csattrib_ptr.isEmpty())
    1044                 :            :   {
    1045 [ +  - ][ +  - ]:     193713 :     if (DEBUG_FLAG(90)) {
                 [ -  + ]
    1046         [ #  # ]:          0 :       RefEntity *ref_entity = CAST_TO(this, RefEntity);
    1047 [ #  # ][ #  # ]:          0 :       PRINT_DEBUG_90( "Removing simple attribute of type %s on"
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1048                 :            :                   " %s %d.\n", csattrib_ptr.character_type().c_str(),
    1049         [ #  # ]:          0 :                   ref_entity->class_name(), ref_entity->id());
    1050                 :            :     }
    1051                 :            :     
    1052         [ -  + ]:     193713 :     TopologyEntity* topo_ptr = CAST_TO(this, TopologyEntity);
    1053 [ +  - ][ +  - ]:     193713 :     if (topo_ptr && topo_ptr->bridge_manager()->topology_bridge())
         [ +  - ][ +  + ]
                 [ +  + ]
    1054                 :            :     {
    1055 [ +  - ][ +  - ]:     193449 :         remove_simple_attribute(topo_ptr->bridge_manager()->topology_bridge(), csattrib_ptr);
                 [ +  - ]
    1056                 :     193713 :       removed = CUBIT_SUCCESS;
    1057                 :            :     }
    1058                 :            :   }
    1059         [ +  - ]:     204061 :   return removed;
    1060                 :            : }
    1061                 :            : 
    1062                 :            : //CubitStatus CubitAttribUser::remove_attrib_geometry_entity ()
    1063                 :            : //{
    1064                 :            : //  CubitStatus removed = CUBIT_FAILURE;
    1065                 :            : //  Body* Body_ptr = CAST_TO(this, Body);
    1066                 :            : //    
    1067                 :            : //  BasicTopologyEntity* BTE_ptr = CAST_TO(this, BasicTopologyEntity);
    1068                 :            : //      //Deal with Bodies
    1069                 :            : //  if ( Body_ptr != NULL )
    1070                 :            : //  {
    1071                 :            : //      // Get the OSME pointer
    1072                 :            : //    BodySM* OSME_ptr = Body_ptr->get_body_sm_ptr();
    1073                 :            : //    remove_all_simple_attribute(OSME_ptr);
    1074                 :            : //    removed = CUBIT_SUCCESS;
    1075                 :            : //  }
    1076                 :            : //  
    1077                 :            : //    // Deal with BasicTopologyEntities
    1078                 :            : //  else if ( BTE_ptr != NULL )
    1079                 :            : //  {
    1080                 :            : //      // Get the GeometryEntity pointer
    1081                 :            : //    GeometryEntity* GE_ptr = 
    1082                 :            : //      BTE_ptr->get_geometry_entity_ptr();
    1083                 :            : //    remove_all_simple_attribute(GE_ptr);
    1084                 :            : //    removed = CUBIT_SUCCESS;
    1085                 :            : //  }
    1086                 :            : //
    1087                 :            : //    // All other Entities
    1088                 :            : //  else
    1089                 :            : //  {
    1090                 :            : //  }
    1091                 :            : //  return removed;
    1092                 :            : //}
    1093                 :            : 
    1094                 :     121659 : void CubitAttribUser::set_written_flag(CubitBoolean flag)
    1095                 :            : {
    1096         [ +  - ]:     121659 :   DLIList<CubitAttrib*> ca_list;
    1097         [ +  - ]:     121659 :   get_cubit_attrib_list(ca_list);
    1098 [ +  - ][ +  + ]:     165487 :   for (int i = ca_list.size(); i > 0; i--) {
    1099 [ +  - ][ +  - ]:      43828 :     if (flag == CUBIT_FALSE && ca_list.get()->has_written() == CUBIT_TRUE)
         [ +  - ][ +  + ]
                 [ +  + ]
    1100 [ +  - ][ +  - ]:       4936 :       ca_list.get()->reset();
    1101 [ +  - ][ +  - ]:      43828 :     ca_list.get_and_step()->has_written(flag);
    1102         [ +  - ]:     121659 :   }
    1103                 :     121659 : }
    1104                 :            : 
    1105                 :      32396 : void CubitAttribUser::set_updated_flag(CubitBoolean flag)
    1106                 :            : {
    1107         [ +  - ]:      32396 :   DLIList<CubitAttrib*> ca_list;
    1108         [ +  - ]:      32396 :   get_cubit_attrib_list(ca_list);
    1109 [ +  - ][ +  + ]:      44404 :   for (int i = ca_list.size(); i > 0; i--)
    1110 [ +  - ][ +  - ]:      44404 :     ca_list.get_and_step()->has_updated(flag);
                 [ +  - ]
    1111                 :      32396 : }
    1112                 :            : 
    1113                 :            : //void CubitAttribUser::print_attribs() 
    1114                 :            : //{
    1115                 :            : //  PRINT_INFO("Attributes on %s %d:\n", 
    1116                 :            : //             CAST_TO(this, RefEntity)->entity_name().c_str(),
    1117                 :            : //             CAST_TO(this, RefEntity)->id());
    1118                 :            : //  DLIList<CubitAttrib*> attrib_list;
    1119                 :            : //  get_cubit_attrib_list(attrib_list);
    1120                 :            : //  int i;
    1121                 :            : //  for (i = attrib_list.size(); i > 0; i--)
    1122                 :            : //    attrib_list.get_and_step()->print();
    1123                 :            : //  
    1124                 :            : //  if (attrib_list.size() == 0) PRINT_INFO("(none)\n");
    1125                 :            : //}
    1126                 :            : 
    1127                 :      26386 : void CubitAttribUser::append_simple_attribute(TopologyBridge *bridge, const CubitSimpleAttrib& attrib_ptr)
    1128                 :            : {
    1129                 :            :     // for merged objects, put attribute on other entities
    1130   [ +  -  +  + ]:      52772 :   if (CubitSimpleAttrib::get_push_attribs() == CUBIT_TRUE ||
                 [ +  + ]
    1131                 :      26386 :     CGMApp::instance()->attrib_manager()->auto_update_flag(CA_MERGE_PARTNER) == CUBIT_TRUE) {
    1132                 :            :   
    1133         [ +  - ]:      15284 :     DLIList<TopologyBridge*> tb_list;
    1134 [ +  - ][ +  - ]:      15284 :     bridge->bridge_manager()->get_bridge_list(tb_list);
    1135                 :            : 
    1136                 :            :       // if this entity is merged, it will have > 1 entity in the bridge
    1137                 :            :       // list
    1138         [ +  - ]:      15284 :     tb_list.reset();
    1139 [ +  - ][ +  - ]:      15284 :     assert(tb_list.size() == 0 || tb_list.get() == bridge);
         [ +  - ][ -  + ]
    1140                 :            : 
    1141                 :            :       // Special handling of MergePartner attribute.  
    1142                 :            :       // Need to store the bridge sense in the attribute, which
    1143                 :            :       // is potentially different for different TopologyBridges.
    1144 [ +  - ][ +  - ]:      15284 :     int type = CGMApp::instance()->attrib_manager()->attrib_type_from_internal_name(attrib_ptr.character_type().c_str());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1145         [ +  + ]:      15284 :     if ( type == CA_MERGE_PARTNER )
    1146                 :            :     {
    1147         [ +  - ]:       1512 :       CubitSimpleAttrib merge_attrib = attrib_ptr;
    1148                 :            :         // now adjust the attrib on each bridge to hold the 
    1149                 :            :         // relative sense for that bridge.
    1150 [ +  - ][ +  + ]:       4536 :       for (int i = tb_list.size(); i > 0; i--) {
    1151         [ +  - ]:       3024 :         TopologyBridge *temp_tb = tb_list.get_and_step();
    1152                 :            : 
    1153 [ +  - ][ +  - ]:       3024 :         CAMergePartner::set_bridge_sense( merge_attrib, temp_tb->bridge_sense() );
    1154                 :            : 
    1155         [ -  + ]:       3024 :         GeometryEntity *geom_ptr = dynamic_cast<GeometryEntity*>(temp_tb);
    1156         [ +  - ]:       3024 :         if (geom_ptr ) 
    1157                 :            :         {
    1158                 :            :           //if we're copying a merged entity, saved id should be zero
    1159 [ +  - ][ +  - ]:       3024 :           if( GeometryModifyTool::instance()->get_copy_entity() ) 
                 [ -  + ]
    1160         [ #  # ]:          0 :             CAMergePartner::set_saved_id( merge_attrib, 0 );
    1161                 :            :           else
    1162 [ +  - ][ +  - ]:       3024 :             CAMergePartner::set_saved_id( merge_attrib, geom_ptr->get_saved_id() );
    1163                 :            : 
    1164                 :            :           //First bridge should be marked as "survivor"
    1165 [ +  - ][ +  + ]:       3024 :           if( i == tb_list.size() )
    1166                 :            :           {
    1167         [ +  - ]:       1512 :             CAMergePartner::set_survivor( merge_attrib, 1 );
    1168                 :            :           }
    1169                 :            :           else
    1170         [ +  - ]:       3024 :             CAMergePartner::set_survivor( merge_attrib, 0 );
    1171                 :            :         }
    1172         [ +  - ]:       3024 :         append_attrib_internal(temp_tb, merge_attrib);
    1173         [ +  - ]:       1512 :       }
    1174                 :            :     }
    1175                 :            :       // For anything other than CAMergePartner, just append the
    1176                 :            :       // unmodified attribute to each bridge.
    1177                 :            :     else
    1178                 :            :     {
    1179 [ +  - ][ +  + ]:      31168 :       for ( int i = tb_list.size(); i--; )
    1180 [ +  - ][ +  - ]:      17396 :         append_attrib_internal( tb_list.get_and_step(), attrib_ptr);
    1181         [ +  - ]:      15284 :     }
    1182                 :            :   }
    1183                 :            :   else
    1184                 :            :   {
    1185                 :            :       // Append this name to the primary bridge
    1186                 :      11102 :     append_attrib_internal(bridge, attrib_ptr);  
    1187                 :            :   }
    1188                 :      26386 : }
    1189                 :            : 
    1190                 :      31522 : void CubitAttribUser::append_attrib_internal(TopologyBridge *bridge, const CubitSimpleAttrib& attrib_ptr)
    1191                 :            : {
    1192         [ +  - ]:      31522 :   DLIList<CubitSimpleAttrib> others;
    1193                 :            :   
    1194                 :            :     // Check for duplicates
    1195 [ +  - ][ +  - ]:      31522 :   if ( attrib_ptr.character_type() != "DEFERRED_ATTRIB" )
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1196                 :            :   {
    1197 [ +  - ][ +  - ]:      31522 :     bridge->get_simple_attribute( attrib_ptr.character_type().c_str(), others );
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1198 [ +  - ][ +  + ]:      45262 :     while ( others.size() )
    1199                 :            :     {
    1200 [ +  - ][ +  - ]:      13740 :       bridge->remove_simple_attribute_virt( others.pop() );
                 [ +  - ]
    1201                 :            :     }
    1202                 :            :   }
    1203                 :            :   else
    1204                 :            :   {
    1205 [ #  # ][ #  # ]:          0 :     CubitString real_name = attrib_ptr.string_data_list()[1];
                 [ #  # ]
    1206 [ #  # ][ #  # ]:          0 :     bridge->get_simple_attribute("DEFERRED_ATTRIB", others);
                 [ #  # ]
    1207 [ #  # ][ #  # ]:          0 :     while ( others.size() )
    1208                 :            :     {
    1209         [ #  # ]:          0 :       CubitSimpleAttrib dup_attrib = others.pop();
    1210 [ #  # ][ #  # ]:          0 :       if ( dup_attrib.string_data_list()[1] == real_name )
         [ #  # ][ #  # ]
    1211         [ #  # ]:          0 :         bridge->remove_simple_attribute_virt(dup_attrib);
    1212 [ #  # ][ #  # ]:          0 :     }
    1213                 :            :   }
    1214                 :            :   
    1215                 :            :     // append attribute
    1216 [ +  - ][ +  - ]:      31522 :   bridge->append_simple_attribute_virt(attrib_ptr);  
    1217                 :      31522 : }
    1218                 :            : 
    1219                 :     170605 : void CubitAttribUser::remove_all_simple_attribute(TopologyBridge* bridge)
    1220                 :            : {
    1221                 :            :     // remove this name from the primary object
    1222                 :     170605 :   bridge->remove_all_simple_attribute_virt();
    1223                 :            : 
    1224                 :            :     // for merged objects, remove all attributes from other entities
    1225   [ +  -  +  + ]:     341210 :   if (CubitSimpleAttrib::get_push_attribs() == CUBIT_TRUE ||
                 [ +  + ]
    1226                 :     170605 :       CGMApp::instance()->attrib_manager()->auto_update_flag(CA_MERGE_PARTNER) == CUBIT_TRUE) {
    1227         [ +  - ]:      90226 :     DLIList<TopologyBridge*> tb_list;
    1228 [ +  - ][ +  - ]:      90226 :     bridge->bridge_manager()->get_bridge_list(tb_list);
    1229         [ +  - ]:      90226 :     tb_list.reset();
    1230 [ +  - ][ +  - ]:      90226 :     assert(tb_list.size() == 0 || tb_list.get() == bridge);
         [ +  - ][ -  + ]
    1231 [ +  - ][ +  + ]:     183080 :     for (int i = tb_list.size(); i > 0; i--) {
    1232         [ +  - ]:      92854 :       TopologyBridge *temp_tb = tb_list.get_and_step();
    1233 [ +  + ][ +  - ]:      92854 :       if (temp_tb != bridge) temp_tb->remove_all_simple_attribute_virt();
    1234         [ +  - ]:      90226 :     }
    1235                 :            :   }
    1236                 :     170605 : }
    1237                 :            : 
    1238                 :     193449 : void CubitAttribUser::remove_simple_attribute(TopologyBridge* bridge, const CubitSimpleAttrib& attrib_ptr)
    1239                 :            : {
    1240                 :            :     // remove this name from the primary object
    1241                 :     193449 :   bridge->remove_simple_attribute_virt(attrib_ptr);
    1242                 :            :   
    1243                 :            :     // for merged objects, remove attribute from other entities
    1244   [ +  -  +  + ]:     386898 :   if (CubitSimpleAttrib::get_push_attribs() == CUBIT_TRUE ||
                 [ +  + ]
    1245                 :     193449 :       CGMApp::instance()->attrib_manager()->auto_update_flag(CA_MERGE_PARTNER) == CUBIT_TRUE) {
    1246         [ +  - ]:     125649 :     DLIList<TopologyBridge*> tb_list;
    1247         [ +  - ]:     125649 :     BridgeManager *bm_ptr = bridge->bridge_manager();
    1248 [ +  - ][ +  - ]:     125649 :     if (bm_ptr != NULL) bm_ptr->get_bridge_list(tb_list);
    1249         [ +  - ]:     125649 :     tb_list.reset();
    1250 [ +  - ][ +  - ]:     125649 :     assert(tb_list.size() == 0 || tb_list.get() == bridge);
         [ +  - ][ -  + ]
    1251 [ +  - ][ +  + ]:     269406 :     for (int i = tb_list.size(); i > 0; i--) {
    1252         [ +  - ]:     143757 :       TopologyBridge *temp_tb = tb_list.get_and_step();
    1253 [ +  + ][ +  - ]:     143757 :       if (temp_tb != bridge) temp_tb->remove_simple_attribute_virt(attrib_ptr);
    1254         [ +  - ]:     125649 :     }
    1255                 :            :   }
    1256 [ +  - ][ +  - ]:     199989 : }
    1257                 :            : 

Generated by: LCOV version 1.11