LCOV - code coverage report
Current view: top level - geom/virtual - CAVirtualVG.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 27 60 45.0 %
Date: 2020-06-30 00:58:45 Functions: 6 8 75.0 %
Branches: 31 124 25.0 %

           Branch data     Line data    Source code
       1                 :            : // CAVirtualVG class
       2                 :            : 
       3                 :            : #include "CAVirtualVG.hpp"
       4                 :            : #include "CubitSimpleAttrib.hpp"
       5                 :            : #include "TopologyEntity.hpp"
       6                 :            : #include "RefEntity.hpp"
       7                 :            : #include "BasicTopologyEntity.hpp"
       8                 :            : #include "RefEdge.hpp"
       9                 :            : #include "RefVertex.hpp"
      10                 :            : #include "TDUniqueId.hpp"
      11                 :            : #include "CADeferredAttrib.hpp"
      12                 :            : 
      13                 :      10348 : CubitAttrib* CAVirtualVG_creator(RefEntity* entity, const CubitSimpleAttrib &p_csa)
      14                 :            : {
      15         [ +  - ]:      10348 :   return new CAVirtualVG(entity, p_csa);
      16                 :            : }
      17                 :            : 
      18                 :            : 
      19                 :      10348 : CAVirtualVG::CAVirtualVG(RefEntity *owner, const CubitSimpleAttrib &simple_attrib)
      20 [ +  - ][ +  - ]:      10348 :         : CubitAttrib(owner)
                 [ +  - ]
      21                 :            : {
      22                 :      10348 :   numVC = 0;
      23                 :      10348 :   numVV = 0;
      24                 :            : 
      25 [ +  - ][ -  + ]:      10348 :   if(!simple_attrib.isEmpty())
      26                 :            :   {
      27                 :            :      // generate a simple attribute containing the data in this CA
      28         [ #  # ]:          0 :     const std::vector<double> &d_list = simple_attrib.double_data_list();
      29         [ #  # ]:          0 :     const std::vector<int> &i_list = simple_attrib.int_data_list();
      30                 :            : 
      31                 :            :       // (no string)
      32                 :            : 
      33                 :            :       // now the integers
      34                 :            :       // numVV, numVC
      35                 :          0 :     int offset = 0;
      36         [ #  # ]:          0 :     numVV = i_list[offset++];
      37         [ #  # ]:          0 :     numVC = i_list[offset++];
      38                 :            : 
      39                 :            :       // vgUIDs
      40                 :            :     int i;
      41         [ #  # ]:          0 :     for (i = numVV+(3*numVC); i > 0; i--)
      42 [ #  # ][ #  # ]:          0 :       vgUIDs.append(i_list[offset++]);
      43                 :            : 
      44                 :            :       // numVCPoints
      45                 :          0 :     int sum = 0;
      46         [ #  # ]:          0 :     for (i = numVC; i > 0; i--) {
      47         [ #  # ]:          0 :       int temp_int = i_list[offset++];
      48         [ #  # ]:          0 :       numVCPoints.append(temp_int);
      49                 :          0 :       sum += temp_int;
      50                 :            :     }
      51                 :            : 
      52                 :          0 :     offset = 0;
      53                 :            :       // pointUIDList
      54         [ #  # ]:          0 :     for (i = numVV+sum; i > 0; i--) {
      55         [ #  # ]:          0 :       double x = d_list[offset++];
      56         [ #  # ]:          0 :       double y = d_list[offset++];
      57         [ #  # ]:          0 :       double z = d_list[offset++];
      58 [ #  # ][ #  # ]:          0 :       posVector.append(new CubitVector( x, y, z ) );
                 [ #  # ]
      59                 :            :     }
      60                 :            : 
      61                 :            :       // If we are constructing from a CubitSimpleAttrib,
      62                 :            :       // then this attrib is already written
      63         [ #  # ]:          0 :     has_written(CUBIT_TRUE);
      64                 :            :   }
      65                 :      10348 : }
      66                 :            : 
      67                 :      10348 : CubitStatus CAVirtualVG::update()
      68                 :            : {
      69                 :            : 
      70                 :            :     // the owner entity is virtual; put a CAVirtualVG on the underlying entity to represent
      71                 :            :     // this entity
      72                 :            : 
      73         [ -  + ]:      10348 :   if (hasUpdated) return CUBIT_SUCCESS;
      74                 :            : /*  
      75                 :            :   assert(attrib_owner() != 0);
      76                 :            : 
      77                 :            :   TopologyEntity *topo_entity = CAST_TO(attrib_owner(), TopologyEntity);
      78                 :            :   assert(topo_entity != 0);
      79                 :            :   
      80                 :            :   DLIList<VirtualEntity*> ve_list;
      81                 :            :   VirtualGeometryEngine::instance()->get_VEs(topo_entity, ve_list, CUBIT_FALSE, CUBIT_FALSE);
      82                 :            :   
      83                 :            :   for( int i = ve_list.size(); i--; )
      84                 :            :   {
      85                 :            :     ParasiteEntity *vge = dynamic_cast<ParasiteEntity*>(ve_list.get_and_step());
      86                 :            : 
      87                 :            :   if (vge == NULL) {
      88                 :            :       // this entity isn't a virtual entity - if this entity doesn't have any virtual
      89                 :            :       // entities registered, set delete flag, then exit
      90                 :            :     if (numVV == 0 && numVC == 0)
      91                 :            :       delete_attrib(CUBIT_TRUE);
      92                 :            :     else {
      93                 :            :       PRINT_DEBUG_90("Keeping CA_VIRTUAL_VG for %s %d\n",
      94                 :            :                      attrib_owner()->class_name(), attrib_owner()->id());
      95                 :            :       hasUpdated = CUBIT_TRUE;
      96                 :            :     }
      97                 :            :     
      98                 :            :     continue;
      99                 :            :   }
     100                 :            : 
     101                 :            :     // ok, we have a virtual entity; first get the underlying entity, and a CAVVG for that
     102                 :            :     // entity
     103                 :            :   BasicTopologyEntity* bte_ptr = vge->bte_bound_to();
     104                 :            :   
     105                 :            :   if (!bte_ptr) {
     106                 :            :     PRINT_ERROR("Couldn't find underlying BTE for virtual entity %s %d.\n",
     107                 :            :                 attrib_owner()->class_name(), attrib_owner()->id());
     108                 :            :     return CUBIT_FAILURE;
     109                 :            :   }
     110                 :            :   
     111                 :            :   CAVirtualVG *other_CAVVG = (CAVirtualVG *) bte_ptr->get_cubit_attrib(CA_VIRTUAL_VG);
     112                 :            : 
     113                 :            :     // if that other CAPVG's written flag is set, it's an old one from a
     114                 :            :     // previous write and needs to be reset
     115                 :            :   if (other_CAVVG->has_written() == CUBIT_TRUE) {
     116                 :            :     other_CAVVG->reset();
     117                 :            :     other_CAVVG->has_written(CUBIT_FALSE);
     118                 :            :   }
     119                 :            : 
     120                 :            :     // now put virtual geometry-specific data on the attribute
     121                 :            :   ParasitePoint *vvertex = CAST_TO(vge, ParasitePoint);
     122                 :            :   ParasiteCurve *vcurve = CAST_TO(vge, ParasiteCurve);
     123                 :            :   if (vvertex != NULL) {
     124                 :            :       // put uids and position on ca
     125                 :            :     other_CAVVG->add_vvertex(vvertex);
     126                 :            :     other_CAVVG->delete_attrib(CUBIT_FALSE);
     127                 :            :   }
     128                 :            : 
     129                 :            :   else if (vcurve != NULL) {
     130                 :            :     other_CAVVG->add_vcurve(vcurve);
     131                 :            :     other_CAVVG->delete_attrib(CUBIT_FALSE);
     132                 :            :   }
     133                 :            : 
     134                 :            :   else {
     135                 :            :     PRINT_ERROR("Shouldn't get here in CAVirtualVG::update.\n");
     136                 :            :     return CUBIT_FAILURE;
     137                 :            :   }
     138                 :            :   }
     139                 :            : 
     140                 :            :   hasUpdated = CUBIT_TRUE;
     141                 :            :   if (numVV == 0 && numVV == 0) delete_attrib(CUBIT_TRUE);
     142                 :            :   
     143                 :            :   return CUBIT_SUCCESS;
     144                 :            : */ 
     145                 :            : 
     146                 :      10348 :   delete_attrib(CUBIT_TRUE);
     147                 :      10348 :   return CUBIT_SUCCESS;
     148                 :            : }
     149                 :            : 
     150                 :            : 
     151                 :          0 : CubitStatus CAVirtualVG::reset()
     152                 :            : {
     153                 :            :     //- reset info; called from CAU and also from update!
     154                 :          0 :   numVV = 0;
     155                 :          0 :   numVC = 0;
     156                 :            :     //- the number of virtual points and curves contained in this attr
     157                 :            : 
     158                 :          0 :   vgUIDs.clean_out();
     159                 :            :     //- unique ids of virtual points and curves contained in this attr
     160                 :            : 
     161                 :          0 :   posVector.clean_out();
     162                 :            :     //- position vectors for virtual curves
     163                 :            : 
     164                 :          0 :   numVCPoints.clean_out();
     165                 :            :     //- for each virtual curve, the number of virtual points in that curve
     166                 :            : 
     167                 :          0 :   return CUBIT_SUCCESS;
     168                 :            : }
     169                 :            : 
     170                 :      10348 : CubitSimpleAttrib CAVirtualVG::cubit_simple_attrib()
     171                 :            : {
     172                 :            :     // generate a simple attribute containing the data in this CA
     173         [ +  - ]:      10348 :   std::vector<CubitString> cs_list;
     174 [ +  - ][ +  - ]:      20696 :   std::vector<double> d_list;
     175 [ +  - ][ +  - ]:      20696 :   std::vector<int> i_list;
     176                 :            : 
     177                 :            :     // first the string
     178 [ +  - ][ +  - ]:      10348 :   cs_list.push_back(att_internal_name());
         [ +  - ][ +  - ]
     179                 :            : 
     180                 :            :     // now the integers
     181                 :            :     // numVV, numVC
     182         [ +  - ]:      10348 :   i_list.push_back(numVV);
     183         [ +  - ]:      10348 :   i_list.push_back(numVC);
     184                 :            : 
     185                 :            :     // vgUIDs
     186                 :            :   int i;
     187         [ +  - ]:      10348 :   vgUIDs.reset();
     188 [ +  - ][ -  + ]:      10348 :   for (i = vgUIDs.size(); i > 0; i--)
     189 [ #  # ][ #  # ]:          0 :     i_list.push_back(vgUIDs.get_and_step());
     190                 :            : 
     191                 :            :     // numVCPoints
     192         [ +  - ]:      10348 :   numVCPoints.reset();
     193 [ +  - ][ -  + ]:      10348 :   for (i = numVCPoints.size(); i > 0; i--)
     194 [ #  # ][ #  # ]:          0 :     i_list.push_back(numVCPoints.get_and_step());
     195                 :            :   
     196                 :            :     // now the doubles
     197         [ +  - ]:      10348 :   posVector.reset();
     198 [ +  - ][ -  + ]:      10348 :   for (i = posVector.size(); i > 0; i--) {
     199 [ #  # ][ #  # ]:          0 :     d_list.push_back(posVector.get()->x());
                 [ #  # ]
     200 [ #  # ][ #  # ]:          0 :     d_list.push_back(posVector.get()->y());
                 [ #  # ]
     201 [ #  # ][ #  # ]:          0 :     d_list.push_back(posVector.get_and_step()->z());
                 [ #  # ]
     202                 :            :   }
     203                 :            :   
     204 [ +  - ][ +  - ]:      20696 :   return CubitSimpleAttrib(&cs_list, &d_list, &i_list);
     205                 :            : }
     206                 :            : 
     207                 :          0 : CubitStatus CAVirtualVG::actuate()
     208                 :            : {
     209                 :            :     // actuate this CA
     210                 :            : /*
     211                 :            :     // first, actuate the points, with this CA's owner as their owners
     212                 :            :   int i, j;
     213                 :            :   vgUIDs.reset();
     214                 :            :   posVector.reset();
     215                 :            : 
     216                 :            :   DLIList<int> leftover_uids, leftover_vcpoints;
     217                 :            :   DLIList<CubitVector*> leftover_posvector;
     218                 :            :   int leftover_vvs = 0, leftover_vcs = 0;
     219                 :            : 
     220                 :            :   DLIList<ParasitePoint*> vpoint_list;
     221                 :            :   for (i = 0; i < numVV; i++) {
     222                 :            :     CubitVector pos_vec(*posVector.get_and_step());
     223                 :            :       // make the virtual vertex
     224                 :            :     BasicTopologyEntity *bte_ptr = CAST_TO(attrib_owner(), BasicTopologyEntity);
     225                 :            :     RefVertex *new_vertex = 
     226                 :            :       VirtualGeometryEngine::instance()->create_VirtualVertex(pos_vec, bte_ptr);
     227                 :            :       // add a unique id to it, for referencing later
     228                 :            :     TDUniqueId *uid_ptr = new TDUniqueId(new_vertex, vgUIDs.get());
     229                 :            :     CADeferredAttrib::owner_created( new_vertex, vgUIDs.get_and_step() );
     230                 :            : 
     231                 :            :     if (new_vertex == NULL) {
     232                 :            :       PRINT_WARNING("Problems making new vertex with uid = %d.\n", vgUIDs.prev());
     233                 :            :       leftover_uids.append(vgUIDs.prev());
     234                 :            :       leftover_posvector.append(posVector.prev());
     235                 :            :       leftover_vvs++;
     236                 :            :     }
     237                 :            :   }
     238                 :            : 
     239                 :            :     // now actuate CAVVG's on lower order entities
     240                 :            :   DLIList<RefEntity*> children;
     241                 :            :   attrib_owner()->get_child_ref_entities(children);
     242                 :            :   for (i = children.size(); i > 0; i--) {
     243                 :            :     children.get_and_step()->actuate_cubit_attrib(CA_VIRTUAL_VG);
     244                 :            :   }
     245                 :            : 
     246                 :            :     // now handle creating virtual curves
     247                 :            :   numVCPoints.reset();
     248                 :            :   DLIList<RefEdge*> vcurve_list;
     249                 :            :   for (i = 0; i < numVC; i++) {
     250                 :            :       // start by grabbing all the stuff off the attribute's lists
     251                 :            : 
     252                 :            :     int start_uid = vgUIDs.get_and_step(),
     253                 :            :       end_uid = vgUIDs.get_and_step();
     254                 :            : 
     255                 :            :       // now get the intermediate points; these should all be virtual, and should
     256                 :            :       // be in this entity's virtual point list
     257                 :            :     DLIList<CubitVector*> vec_list;
     258                 :            :       // get the number of virtual points in the list
     259                 :            :     int num_points = numVCPoints.get_and_step();
     260                 :            :     for (j = 0; j < num_points; j++)
     261                 :            :       vec_list.append(posVector.get_and_step());
     262                 :            : 
     263                 :            :     int virtual_curve_uid = vgUIDs.get_and_step();
     264                 :            :     
     265                 :            :       // the first two are start and end points, and may not be virtual
     266                 :            :     ToolDataUser *tdu = TDUniqueId::find_td_unique_id(start_uid);
     267                 :            :     RefVertex *start_vertex = CAST_TO(tdu, RefVertex);
     268                 :            :     tdu = TDUniqueId::find_td_unique_id(end_uid);
     269                 :            :     RefVertex *end_vertex = CAST_TO(tdu, RefVertex);
     270                 :            :     
     271                 :            :     if (!start_vertex || !end_vertex) {
     272                 :            :       PRINT_DEBUG_90("Couldn't restore virtual curve with uid = %d.\n",
     273                 :            :                      virtual_curve_uid);
     274                 :            :         // cache leftover data for restoring later
     275                 :            :       leftover_uids.append(start_uid);
     276                 :            :       leftover_uids.append(end_uid);
     277                 :            :       leftover_uids.append(virtual_curve_uid);
     278                 :            :       leftover_vcpoints.append(num_points);
     279                 :            :       leftover_posvector += vec_list;
     280                 :            :       leftover_vcs++;
     281                 :            :       continue;
     282                 :            :     }
     283                 :            :     
     284                 :            :       // make the virtual curve 
     285                 :            :     RefEdge *virtual_edge = 
     286                 :            :       VirtualGeometryEngine::instance()->create_VirtualEdge(start_vertex,
     287                 :            :                                                             end_vertex,
     288                 :            :                                                             vec_list);
     289                 :            :     if (!virtual_edge) {
     290                 :            :       PRINT_DEBUG_90("Couldn't restore virtual curve with uid = %d.\n",
     291                 :            :                      virtual_curve_uid);
     292                 :            :         // cache leftover data for restoring later
     293                 :            :       leftover_uids.append(start_uid);
     294                 :            :       leftover_uids.append(end_uid);
     295                 :            :       leftover_uids.append(virtual_curve_uid);
     296                 :            :       leftover_vcpoints.append(num_points);
     297                 :            :       leftover_posvector += vec_list;
     298                 :            :       leftover_vcs++;
     299                 :            :       continue;
     300                 :            :     }
     301                 :            : 
     302                 :            :     ParasiteEntity* curve = 
     303                 :            :       dynamic_cast<ParasiteEntity*>(virtual_edge->get_geometry_entity_ptr());
     304                 :            :     assert(curve != NULL);
     305                 :            :     curve->bind_to( dynamic_cast<BasicTopologyEntity*>(attrib_owner())
     306                 :            :       ->get_geometry_entity_ptr());
     307                 :            : 
     308                 :            :       // save the curve's unique id
     309                 :            :     TDUniqueId *uid_ptr = new TDUniqueId(virtual_edge, virtual_curve_uid);
     310                 :            :     
     311                 :            :     CADeferredAttrib::owner_created( virtual_edge, virtual_curve_uid );
     312                 :            :     //virtual_edge->actuate_cubit_attrib(CA_VIRTUAL_VG);
     313                 :            :       //virtual_edge->actuate_cubit_attrib(CA_PARTITION_VG);
     314                 :            :   }
     315                 :            : 
     316                 :            :   if (0 == leftover_vvs && 0 == leftover_vcs)
     317                 :            :     hasActuated = CUBIT_TRUE;
     318                 :            :   else {
     319                 :            :       // have some leftover data - reset data in this attribute
     320                 :            :     numVV = leftover_vvs;
     321                 :            :     numVC = leftover_vcs;
     322                 :            :     vgUIDs = leftover_uids;
     323                 :            :     numVCPoints = leftover_vcpoints;
     324                 :            :     posVector = leftover_posvector;
     325                 :            :     hasActuated = CUBIT_FALSE;
     326                 :            : 
     327                 :            :       // now add this attribute to the unactuated list in CADA
     328                 :            :     CADeferredAttrib::add_unactuated_ca(this);
     329                 :            :   }
     330                 :            : 
     331                 :            :    // we're done
     332                 :            :   return (CUBIT_FALSE == hasActuated ?
     333                 :            :           CUBIT_FAILURE : CUBIT_SUCCESS);
     334                 :          0 : */ return CUBIT_FAILURE;
     335 [ +  - ][ +  - ]:       6364 : }
     336                 :            : 
     337                 :            : /*
     338                 :            : void CAVirtualVG::add_vvertex(ParasitePoint *vpoint)
     339                 :            : {
     340                 :            : 
     341                 :            :   TopologyEntity *vpoint_topo_entity = vpoint->topology_entity();
     342                 :            :   RefVertex *owning_vertex = CAST_TO(vpoint_topo_entity, RefVertex);
     343                 :            :   assert(owning_vertex != 0);
     344                 :            :   int vvertex_uid = TDUniqueId::get_unique_id(owning_vertex);
     345                 :            :   
     346                 :            :     //- adds data for this vpoint to this CA
     347                 :            :   numVV++;
     348                 :            :   vgUIDs.insert_first(vvertex_uid);
     349                 :            :   posVector.insert_first(new CubitVector(vpoint->coordinates()));
     350                 :            : }
     351                 :            : */
     352                 :            : /*
     353                 :            : void CAVirtualVG::add_vcurve(ParasiteCurve *vcurve)
     354                 :            : {
     355                 :            :     // need to get list of vpoint uids defining the virtual curve
     356                 :            :     // the owner should be a RefEdge
     357                 :            :   TopologyEntity *vcurve_topo_entity = vcurve->topology_entity();
     358                 :            :   RefEdge *virtual_edge = CAST_TO(vcurve_topo_entity, RefEdge);
     359                 :            :   assert(virtual_edge != 0);
     360                 :            : 
     361                 :            :     // first get start and end points, and their uids
     362                 :            :   DLIList<int> uid_list;
     363                 :            :   RefVertex *temp_vertex = virtual_edge->start_vertex();
     364                 :            :   int start_uid = TDUniqueId::get_unique_id(temp_vertex);
     365                 :            :   vgUIDs.append(start_uid);
     366                 :            :   temp_vertex = virtual_edge->end_vertex();
     367                 :            :   int end_uid = TDUniqueId::get_unique_id(temp_vertex);
     368                 :            :   vgUIDs.append(end_uid);
     369                 :            : 
     370                 :            :     // now get the other points and their uids
     371                 :            :   DLIList<ParasitePoint*> vpoint_list;
     372                 :            :   vcurve->getSegments(vpoint_list);
     373                 :            :   vpoint_list.reset();
     374                 :            : 
     375                 :            :   for (int i = vpoint_list.size(); i > 0; i--) {
     376                 :            :     ParasitePoint *temp_point = vpoint_list.get_and_step();
     377                 :            :     posVector.append(new CubitVector(temp_point->coordinates()));
     378                 :            :   }
     379                 :            : 
     380                 :            :   int owner_uid = TDUniqueId::get_unique_id(virtual_edge);
     381                 :            :   
     382                 :            :     //- adds data for this vcurve to this CA
     383                 :            :   vgUIDs.append(owner_uid);
     384                 :            :   numVCPoints.append(vpoint_list.size());
     385                 :            :   numVC++;
     386                 :            : }
     387                 :            : 
     388                 :            : */
     389                 :            : 

Generated by: LCOV version 1.11