LCOV - code coverage report
Current view: top level - geom/virtual - PartitionCurve.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1 472 0.2 %
Date: 2020-06-30 00:58:45 Functions: 2 38 5.3 %
Branches: 2 1050 0.2 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : PartitionCurve-new.cpp
       3                 :            : //
       4                 :            : // Purpose       : 
       5                 :            : //
       6                 :            : // Special Notes : 
       7                 :            : //
       8                 :            : // Creator       : Jason Kraftcheck
       9                 :            : //
      10                 :            : // Creation Date : 04/10/02
      11                 :            : //-------------------------------------------------------------------------
      12                 :            : 
      13                 :            : #include "PartitionCurve.hpp"
      14                 :            : #include "PartitionPoint.hpp"
      15                 :            : #include "PartitionCoEdge.hpp"
      16                 :            : #include "PartitionSurface.hpp"
      17                 :            : #include "VirtualQueryEngine.hpp"
      18                 :            : #include "PartSurfFacetTool.hpp"
      19                 :            : 
      20                 :            : #include "TDVGFacetOwner.hpp"
      21                 :            : #include "CubitFacetEdgeData.hpp"
      22                 :            : #include "CubitPointData.hpp"
      23                 :            : #include "CubitFacetData.hpp"
      24                 :            : #include "CubitTransformMatrix.hpp"
      25                 :            : #include "Surface.hpp"
      26                 :            : 
      27                 :            : #include "GfxDebug.hpp"
      28                 :            : #include "GMem.hpp"
      29                 :            : 
      30                 :            : /*
      31                 :            : void print_point_list( PartitionPoint* point )
      32                 :            : {
      33                 :            :   PRINT_INFO("  Point %p: (%d curves)\n", point, point ? point->num_curves() : 0 );
      34                 :            :   if(!point) { PRINT_INFO("\n\n"); return; }
      35                 :            :   
      36                 :            :   PartitionCurve* curve = 0;
      37                 :            :   while( curve = point->next_curve(curve) )
      38                 :            :     PRINT_INFO("%10p",curve);
      39                 :            :   PRINT_INFO("\n");
      40                 :            :   curve = 0;
      41                 :            : 
      42                 :            :   while( curve = point->next_curve(curve) )
      43                 :            :     PRINT_INFO("%10s",
      44                 :            :       curve->start_point() == point && curve->end_point() == point ? "(both)" :
      45                 :            :       curve->start_point() == point ? "(start)" :
      46                 :            :       curve->end_point() == point ? "(end)" : "(none)" );
      47                 :            :   PRINT_INFO("\n");
      48                 :            : }
      49                 :            : */
      50                 :            : 
      51                 :          0 : PartitionCurve::PartitionCurve( )
      52                 :            :   : firstCoEdge(0),
      53                 :            :     startPoint(0), 
      54                 :            :     endPoint(0), 
      55                 :            :     startNext(0), 
      56 [ #  # ][ #  # ]:          0 :     endNext(0)
      57                 :            : { 
      58                 :          0 : }
      59                 :            : 
      60 [ #  # ][ #  # ]:          0 : PartitionCurve::~PartitionCurve()
      61                 :            : {
      62         [ #  # ]:          0 :   start_point(0);
      63         [ #  # ]:          0 :   end_point(0);
      64                 :            :   
      65         [ #  # ]:          0 :   remove_all_coedges();
      66         [ #  # ]:          0 :   remove_facet_data();
      67         [ #  # ]:          0 : }
      68                 :            : 
      69                 :          0 : CubitStatus PartitionCurve::add( PartitionCoEdge* coedge )
      70                 :            : {
      71         [ #  # ]:          0 :   if( coedge->myCurve )
      72                 :          0 :     return CUBIT_FAILURE;
      73                 :            :   
      74                 :          0 :   coedge->curveNext = firstCoEdge;
      75                 :          0 :   firstCoEdge = coedge;
      76                 :          0 :   coedge->myCurve = this;
      77                 :          0 :   return CUBIT_SUCCESS;
      78                 :            : }
      79                 :            : 
      80                 :          0 : CubitStatus PartitionCurve::remove( PartitionCoEdge* coedge )
      81                 :            : {
      82         [ #  # ]:          0 :   if( coedge->myCurve != this )
      83                 :          0 :     return CUBIT_FAILURE;
      84                 :            :   
      85         [ #  # ]:          0 :   if( firstCoEdge == coedge )
      86                 :            :   {
      87                 :          0 :     firstCoEdge = coedge->curveNext;
      88                 :            :   }
      89                 :            :   else
      90                 :            :   {
      91                 :          0 :     PartitionCoEdge* prev = firstCoEdge;
      92 [ #  # ][ #  # ]:          0 :     while( prev && prev->curveNext != coedge )
      93                 :          0 :       prev = prev->curveNext;
      94                 :            :     
      95         [ #  # ]:          0 :     if( !prev )
      96                 :            :     {
      97                 :          0 :       assert(0);
      98                 :            :       return CUBIT_FAILURE;
      99                 :            :     }
     100                 :            :     
     101                 :          0 :     prev->curveNext = coedge->curveNext;
     102                 :            :   }
     103                 :            :   
     104                 :          0 :   coedge->curveNext = 0;
     105                 :          0 :   coedge->myCurve = 0;
     106                 :          0 :   return CUBIT_SUCCESS;
     107                 :            : }
     108                 :            : 
     109                 :          0 : int PartitionCurve::num_coedges() const
     110                 :            : {
     111                 :          0 :   int count = 0;
     112         [ #  # ]:          0 :   for( PartitionCoEdge* coe = firstCoEdge; coe; coe = coe->curveNext )
     113                 :          0 :     count++;
     114                 :          0 :   return count;
     115                 :            : }
     116                 :            : 
     117                 :          0 : void PartitionCurve::remove_all_coedges( )
     118                 :            : {
     119 [ #  # ][ #  # ]:          0 :   while( firstCoEdge && remove(firstCoEdge) ) {;}
                 [ #  # ]
     120         [ #  # ]:          0 :   assert( !firstCoEdge );
     121                 :          0 : }
     122                 :            : 
     123                 :          0 : CubitStatus PartitionCurve::start_point( PartitionPoint* point )
     124                 :            : {
     125         [ #  # ]:          0 :   if( point == startPoint )
     126                 :          0 :     return CUBIT_SUCCESS;
     127                 :            :   
     128         [ #  # ]:          0 :   if( !remove_start_point() )
     129                 :          0 :     { assert(0); return CUBIT_FAILURE; }
     130                 :            : 
     131         [ #  # ]:          0 :   if( !point )
     132                 :          0 :     return CUBIT_SUCCESS;
     133                 :            :   
     134                 :          0 :   startPoint = point;
     135         [ #  # ]:          0 :   if( point == endPoint )
     136                 :            :   {
     137                 :          0 :     startNext = endNext;
     138                 :          0 :     endNext = 0;
     139                 :            :   }
     140                 :            :   else
     141                 :            :   {
     142                 :          0 :     startNext = point->firstCurve;
     143                 :          0 :     point->firstCurve = this;
     144                 :          0 :     point->curveCount++;
     145                 :            :   }
     146                 :            : 
     147                 :          0 :   return CUBIT_SUCCESS;
     148                 :            : }
     149                 :            : 
     150                 :          0 : CubitStatus PartitionCurve::end_point( PartitionPoint* point )
     151                 :            : {
     152         [ #  # ]:          0 :   if( point == endPoint )
     153                 :          0 :     return CUBIT_SUCCESS;
     154                 :            :   
     155         [ #  # ]:          0 :   if( !remove_end_point() )
     156                 :          0 :     { assert(0); return CUBIT_FAILURE; }
     157                 :            :   
     158         [ #  # ]:          0 :   if( !point )
     159                 :          0 :     return CUBIT_SUCCESS;
     160                 :            : 
     161                 :          0 :   endPoint = point;
     162         [ #  # ]:          0 :   if( point != startPoint )
     163                 :            :   {
     164                 :          0 :     endNext = point->firstCurve;
     165                 :          0 :     point->firstCurve = this;
     166                 :          0 :     point->curveCount++;
     167                 :            :   }
     168                 :            : 
     169                 :          0 :   return CUBIT_SUCCESS;
     170                 :            : }
     171                 :            : 
     172                 :          0 : CubitStatus PartitionCurve::remove_start_point()
     173                 :            : {
     174         [ #  # ]:          0 :   if( startPoint == endPoint )
     175                 :          0 :     endNext = startNext;
     176 [ #  # ][ #  # ]:          0 :   else if( startPoint && !remove_from_point( startPoint, startNext ) )
                 [ #  # ]
     177                 :          0 :     return CUBIT_FAILURE;
     178                 :            : 
     179                 :          0 :   startPoint = 0;
     180                 :          0 :   startNext = 0;
     181                 :            : 
     182                 :          0 :   return CUBIT_SUCCESS;
     183                 :            : }
     184                 :            : 
     185                 :          0 : CubitStatus PartitionCurve::remove_end_point()
     186                 :            : {
     187 [ #  # ][ #  # ]:          0 :   assert( startPoint != endPoint || !endNext );
     188                 :            :     // endNext should be null if points are the same
     189                 :            : 
     190         [ #  # ]:          0 :   if( endPoint && endPoint != startPoint &&
           [ #  #  #  # ]
                 [ #  # ]
     191                 :          0 :       !remove_from_point( endPoint, endNext ) )
     192                 :          0 :     return CUBIT_FAILURE;
     193                 :            :   
     194                 :          0 :   endPoint = 0;
     195                 :          0 :   endNext = 0;
     196                 :            : 
     197                 :          0 :   return CUBIT_SUCCESS;
     198                 :            : }
     199                 :            : 
     200                 :          0 : CubitStatus PartitionCurve::remove_from_point( PartitionPoint* point, 
     201                 :            :                                                PartitionCurve* next )
     202                 :            : {
     203                 :          0 :   point->curveCount--;
     204         [ #  # ]:          0 :   if( point->firstCurve == this )
     205                 :            :   {
     206                 :          0 :     point->firstCurve = next;
     207                 :            :   }
     208                 :            :   else
     209                 :            :   {
     210                 :          0 :     PartitionCurve* prev = point->firstCurve; 
     211         [ #  # ]:          0 :     while( prev )
     212                 :            :     {
     213                 :          0 :       PartitionCurve* temp = prev->next_curve(point);
     214         [ #  # ]:          0 :       if( temp == this )
     215                 :          0 :         break;
     216                 :          0 :       prev = temp;
     217                 :            :     }
     218                 :            :     
     219         [ #  # ]:          0 :     if( !prev )
     220                 :            :     {
     221                 :          0 :       assert(0);
     222                 :            :       return CUBIT_FAILURE;
     223                 :            :     }
     224                 :            :     
     225         [ #  # ]:          0 :     if( prev->startPoint == point )
     226                 :          0 :       prev->startNext = next;
     227         [ #  # ]:          0 :     else if( prev->endPoint == point )
     228                 :          0 :       prev->endNext = next;
     229                 :            :     else
     230                 :          0 :       assert(0);
     231                 :            :   }
     232                 :            :   
     233                 :          0 :   return CUBIT_SUCCESS;
     234                 :            : }
     235                 :            :     
     236                 :            :     
     237                 :            :     
     238                 :            : 
     239                 :          0 : bool PartitionCurve::is_nonmanifold( const PartitionSurface* surf ) const
     240                 :            : {
     241                 :          0 :   int count = 0;
     242                 :          0 :   PartitionCoEdge* coedge = 0;
     243         [ #  # ]:          0 :   while ( (coedge = next_coedge(coedge)) )
     244 [ #  # ][ #  # ]:          0 :     if ( coedge->get_loop() && coedge->get_loop()->get_surface() == surf )
                 [ #  # ]
     245                 :          0 :       count++;
     246                 :          0 :   return count > 1;
     247                 :            : }
     248                 :            : 
     249                 :          0 : bool PartitionCurve::is_in_surface( const PartitionSurface* surf,
     250                 :            :                                     bool manifold_only ) const
     251                 :            : {
     252                 :          0 :   int count = 0;
     253                 :          0 :   PartitionCoEdge* coedge = 0;
     254         [ #  # ]:          0 :   while ( (coedge = next_coedge(coedge)) )
     255 [ #  # ][ #  # ]:          0 :     if ( coedge->get_loop() && coedge->get_loop()->get_surface() == surf )
                 [ #  # ]
     256                 :          0 :       count++;
     257                 :            :   
     258         [ #  # ]:          0 :   if (manifold_only)
     259                 :          0 :     return count == 1;
     260                 :            :   else 
     261                 :          0 :     return count > 0;
     262                 :            : }
     263                 :            :   
     264                 :            : 
     265                 :          0 : CubitStatus PartitionCurve::move_to_geometry( CubitVector& position )
     266                 :            : {
     267         [ #  # ]:          0 :   const CubitVector copy(position);
     268         [ #  # ]:          0 :   return closest_point( copy, position );
     269                 :            : }
     270                 :            : 
     271                 :          0 : void PartitionCurve::get_parents_virt( DLIList<TopologyBridge*>& result )
     272                 :            : {
     273         [ #  # ]:          0 :   for( PartitionCoEdge* coe = firstCoEdge; coe; coe = coe->curveNext )
     274         [ #  # ]:          0 :     result.append( coe );
     275                 :          0 : }
     276                 :            : 
     277                 :          0 : void PartitionCurve::get_children_virt( DLIList<TopologyBridge*>& result )
     278                 :            : {
     279         [ #  # ]:          0 :   result.append( startPoint );
     280         [ #  # ]:          0 :   if( startPoint != endPoint )
     281         [ #  # ]:          0 :     result.append( endPoint );
     282                 :          0 : }
     283                 :            : 
     284                 :          0 : GeometryQueryEngine* PartitionCurve::get_geometry_query_engine() const
     285                 :            : {
     286                 :          0 :   return VirtualQueryEngine::instance();
     287                 :            : }
     288                 :            : 
     289                 :          0 : void PartitionCurve::print_debug_info( const char* prefix,
     290                 :            :                                        bool entset ) const
     291                 :            : {
     292                 :          0 :   const bool print_children = true;
     293                 :            :   
     294         [ #  # ]:          0 :   if( prefix == 0 ) prefix = "";
     295         [ #  # ]:          0 :   char* new_prefix = new char[strlen(prefix)+3];
     296                 :          0 :   strcpy( new_prefix, prefix );
     297                 :          0 :   strcat( new_prefix, "  ");
     298 [ #  # ][ #  # ]:          0 :   PRINT_INFO("%sPartitionCurve %p\n", prefix, (void*)this );
         [ #  # ][ #  # ]
     299                 :            :   
     300         [ #  # ]:          0 :   if(entset)
     301 [ #  # ][ #  # ]:          0 :     sub_entity_set().print_debug_info( new_prefix );
     302                 :            :   else
     303         [ #  # ]:          0 :     print_partitioned_entity();
     304                 :            :   
     305                 :          0 :   PartitionCoEdge* coedge = 0;
     306         [ #  # ]:          0 :   DLIList<Surface*> surface_list(1);
     307 [ #  # ][ #  # ]:          0 :   while( (coedge = next_coedge(coedge)) )
     308                 :            :   {
     309         [ #  # ]:          0 :     surface_list.clean_out();
     310         [ #  # ]:          0 :     coedge->surfaces(surface_list);
     311 [ #  # ][ #  # ]:          0 :     Surface* surf_ptr = surface_list.size() == 1 ? surface_list.get() : 0;
                 [ #  # ]
     312 [ #  # ][ #  # ]:          0 :     PRINT_INFO("%s  %s on Surface %p\n", prefix, 
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     313                 :            :       coedge->sense() == CUBIT_FORWARD ? "FORWARD" :
     314                 :            :       coedge->sense() == CUBIT_REVERSED ? "REVERSE" : "UNKNOWN",
     315         [ #  # ]:          0 :       (void*)surf_ptr );
     316                 :            :   }
     317                 :            :   
     318 [ #  # ][ #  # ]:          0 :   PRINT_INFO("%s  start point: %p\n", prefix, (void*)start_point() );
         [ #  # ][ #  # ]
                 [ #  # ]
     319 [ #  # ][ #  # ]:          0 :   if( start_point() && print_children )
                 [ #  # ]
     320 [ #  # ][ #  # ]:          0 :     start_point()->print_debug_info( new_prefix, false );
     321                 :            :   
     322 [ #  # ][ #  # ]:          0 :   if( end_point() && end_point() == start_point() )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     323 [ #  # ][ #  # ]:          0 :     PRINT_INFO("%s  end point SAME as start point\n", prefix ); 
         [ #  # ][ #  # ]
     324                 :            :   else
     325 [ #  # ][ #  # ]:          0 :     PRINT_INFO("%s  end point: %p\n", prefix, (void*)end_point() );
         [ #  # ][ #  # ]
                 [ #  # ]
     326 [ #  # ][ #  # ]:          0 :   if( end_point() && end_point() != start_point() && print_children )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     327 [ #  # ][ #  # ]:          0 :     end_point()->print_debug_info( new_prefix, false );
     328                 :            :   
     329 [ #  # ][ #  # ]:          0 :   delete [] new_prefix;
     330                 :          0 : }
     331                 :            : 
     332                 :          0 : void PartitionCurve::append_simple_attribute_virt(const CubitSimpleAttrib& csa)
     333                 :          0 :   { sub_entity_set().add_attribute( this, csa ); }
     334                 :          0 : void PartitionCurve::remove_simple_attribute_virt(const CubitSimpleAttrib& csa)
     335                 :          0 :   { sub_entity_set().rem_attribute( this, csa ); }
     336                 :          0 : void PartitionCurve::remove_all_simple_attribute_virt()
     337                 :          0 :   { sub_entity_set().rem_all_attrib( this ); }
     338                 :          0 : CubitStatus PartitionCurve::get_simple_attribute(DLIList<CubitSimpleAttrib>& list)
     339                 :            : { 
     340                 :          0 :   sub_entity_set().get_attributes( this, list ); 
     341                 :          0 :   return CUBIT_SUCCESS;
     342                 :            : }
     343                 :          0 : CubitStatus PartitionCurve::get_simple_attribute(const CubitString& name,
     344                 :            :                                        DLIList<CubitSimpleAttrib>& list)
     345                 :            : { 
     346                 :          0 :   sub_entity_set().get_attributes( this, name.c_str(), list ); 
     347                 :          0 :   return CUBIT_SUCCESS;
     348                 :            : }
     349                 :            : 
     350                 :          0 : void PartitionCurve::reverse_point_order()
     351                 :            : {
     352         [ #  # ]:          0 :   if( startPoint != endPoint )
     353                 :            :   {
     354                 :          0 :     PartitionPoint* tmp_pt = startPoint;
     355                 :          0 :     startPoint = endPoint;
     356                 :          0 :     endPoint = tmp_pt;
     357                 :            :     
     358                 :          0 :     PartitionCurve* tmp_cv = startNext;
     359                 :          0 :     startNext = endNext;
     360                 :          0 :     endNext = tmp_cv;
     361                 :            :   }
     362                 :          0 : }
     363                 :            : 
     364                 :          0 : void PartitionCurve::get_facet_data( DLIList<CubitFacetEdgeData*>& result_list ) const
     365                 :          0 :   { result_list = facetEdges; }
     366                 :            :   
     367                 :          0 : void PartitionCurve::set_facet_data( const DLIList<CubitFacetEdgeData*>& new_list )
     368                 :            : {
     369                 :          0 :   remove_facet_data();
     370                 :          0 :   facetEdges = new_list;
     371         [ #  # ]:          0 :   for( int i = facetEdges.size(); i--; )
     372                 :          0 :     TDVGFacetOwner::set( facetEdges.step_and_get(), this );
     373                 :          0 : }
     374                 :            : 
     375                 :          0 : void PartitionCurve::remove_facet_data( )
     376                 :            : {
     377         [ #  # ]:          0 :   while( facetEdges.size() )
     378                 :          0 :     TDVGFacetOwner::remove( facetEdges.pop() );
     379                 :          0 : }  
     380                 :            : 
     381                 :            : 
     382                 :          0 : void PartitionCurve::notify_split( FacetEntity* old_entity, FacetEntity* new_entity )
     383                 :            : {
     384         [ #  # ]:          0 :   CubitFacetEdgeData* old_ptr = dynamic_cast<CubitFacetEdgeData*>(old_entity);
     385         [ #  # ]:          0 :   CubitFacetEdgeData* new_ptr = dynamic_cast<CubitFacetEdgeData*>(new_entity);
     386 [ #  # ][ #  # ]:          0 :   assert(TDVGFacetOwner::get(old_entity) == this);
     387 [ #  # ][ #  # ]:          0 :   assert(TDVGFacetOwner::get(new_entity) == 0);
     388 [ #  # ][ #  # ]:          0 :   assert(old_ptr && new_ptr);
     389                 :            :   
     390         [ #  # ]:          0 :   facetEdges.reset();
     391 [ #  # ][ #  # ]:          0 :   if (facetEdges.get() == old_ptr)
     392                 :            :   {
     393 [ #  # ][ #  # ]:          0 :     if (new_ptr->contains(start_point()->facet_point()))
         [ #  # ][ #  # ]
     394         [ #  # ]:          0 :       facetEdges.insert_first(new_ptr);
     395                 :            :     else
     396         [ #  # ]:          0 :       facetEdges.insert(new_ptr);
     397                 :            :   }
     398 [ #  # ][ #  # ]:          0 :   else if (facetEdges.move_to(old_ptr))
     399                 :            :   {
     400         [ #  # ]:          0 :     CubitFacetEdgeData* prev = facetEdges.prev();
     401 [ #  # ][ #  # ]:          0 :     if (prev->shared_point(new_ptr))
     402         [ #  # ]:          0 :       facetEdges.back();
     403         [ #  # ]:          0 :     facetEdges.insert(new_ptr);
     404                 :            :   }
     405                 :            :   else
     406                 :            :   {
     407                 :          0 :     assert( 0 /*old_entity not in list*/);
     408                 :            :   }
     409                 :            : 
     410         [ #  # ]:          0 :   facetEdges.reset();
     411         [ #  # ]:          0 :   TDVGFacetOwner::set( new_ptr, this );
     412                 :          0 : }
     413                 :            : 
     414                 :            : 
     415                 :          0 : CubitStatus PartitionCurve::fix_facet_data( PartitionCurve* new_curve )
     416                 :            : {
     417 [ #  # ][ #  # ]:          0 :   if ( !facetEdges.size() )
     418                 :          0 :     return CUBIT_SUCCESS;
     419                 :            :     
     420                 :            :     
     421         [ #  # ]:          0 :   DLIList<CubitFacetEdgeData*> my_edges(facetEdges);
     422 [ #  # ][ #  # ]:          0 :   assert( end_point() == new_curve->start_point() );
                 [ #  # ]
     423 [ #  # ][ #  # ]:          0 :   CubitVector pos( end_point()->coordinates() );
     424                 :            :   
     425                 :          0 :   double min_edge_len_sqr = CUBIT_DBL_MAX;
     426                 :          0 :   double min_edge_dst_sqr = CUBIT_DBL_MAX;
     427                 :          0 :   CubitFacetEdgeData* closest_edge = 0;
     428 [ #  # ][ #  # ]:          0 :   CubitVector point, vect, edge_pos;
                 [ #  # ]
     429                 :            :   int i;
     430                 :            :   
     431 [ #  # ][ #  # ]:          0 :   for ( i = my_edges.size(); i--; ) {
     432         [ #  # ]:          0 :     CubitFacetEdgeData* edge = my_edges.step_and_get();
     433 [ #  # ][ #  # ]:          0 :     point = edge->point(0)->coordinates();
                 [ #  # ]
     434 [ #  # ][ #  # ]:          0 :     vect = edge->point(1)->coordinates() - point;
         [ #  # ][ #  # ]
     435                 :            :     
     436         [ #  # ]:          0 :     double len_sqr = vect.length_squared();
     437         [ #  # ]:          0 :     if ( len_sqr < min_edge_len_sqr )
     438                 :          0 :       min_edge_len_sqr = len_sqr;
     439                 :            :     
     440         [ #  # ]:          0 :     point -= pos;  
     441 [ #  # ][ #  # ]:          0 :     double t = (vect % -point) / len_sqr;
     442         [ #  # ]:          0 :     if ( t < 0.0 ) t = 0.0;
     443         [ #  # ]:          0 :     else if( t > 1.0 ) t = 1.0;
     444 [ #  # ][ #  # ]:          0 :     double dst_sqr = (point + t * vect).length_squared();
                 [ #  # ]
     445                 :            : 
     446         [ #  # ]:          0 :     if ( dst_sqr < min_edge_dst_sqr ) {
     447                 :          0 :       min_edge_dst_sqr = dst_sqr;
     448                 :          0 :       closest_edge = edge;
     449 [ #  # ][ #  # ]:          0 :       edge_pos = edge->point(0)->coordinates() + t * vect;
         [ #  # ][ #  # ]
                 [ #  # ]
     450                 :            :     }
     451                 :            :   }
     452                 :            :   
     453         [ #  # ]:          0 :   my_edges.reset();
     454 [ #  # ][ #  # ]:          0 :   DLIList<CubitFacetEdgeData*> new_curve_edges;
     455         [ #  # ]:          0 :   my_edges.last();
     456 [ #  # ][ #  # ]:          0 :   while( my_edges.get() != closest_edge ) {
     457 [ #  # ][ #  # ]:          0 :     new_curve_edges.append( my_edges.pop() );
     458         [ #  # ]:          0 :     my_edges.last();
     459                 :            :   }
     460                 :            :   
     461                 :          0 :   min_edge_len_sqr *= 0.2;
     462         [ #  # ]:          0 :   double dst_tol_sqr = CUBIT_MAX( min_edge_len_sqr, GEOMETRY_RESABS*GEOMETRY_RESABS );
     463                 :            :   
     464                 :          0 :   bool edge_reversed = false;
     465 [ #  # ][ #  # ]:          0 :   if ( my_edges.size() > 1 )
     466                 :            :   {
     467         [ #  # ]:          0 :     my_edges.last();
     468         [ #  # ]:          0 :     CubitFacetEdgeData* other = my_edges.prev();
     469 [ #  # ][ #  # ]:          0 :     edge_reversed = other->contains( closest_edge->point(1) );
     470                 :            :   }
     471 [ #  # ][ #  # ]:          0 :   else if( new_curve_edges.size() > 1 )
     472                 :            :   {
     473         [ #  # ]:          0 :     new_curve_edges.last();
     474         [ #  # ]:          0 :     CubitFacetEdgeData* other = new_curve_edges.get();
     475 [ #  # ][ #  # ]:          0 :     edge_reversed = other->contains( closest_edge->point(0) );
     476                 :            :   }
     477                 :            :   else
     478                 :            :   {
     479 [ #  # ][ #  # ]:          0 :     edge_reversed = (start_point()->facet_point() == closest_edge->point(1));
                 [ #  # ]
     480 [ #  # ][ #  # ]:          0 :     assert(edge_reversed || start_point()->facet_point() == closest_edge->point(0));
         [ #  # ][ #  # ]
                 [ #  # ]
     481                 :            :   }
     482                 :            :   
     483                 :            :   
     484                 :          0 :   CubitPoint* new_point = 0;
     485 [ #  # ][ #  # ]:          0 :   double d1 = (pos - closest_edge->point(0)->coordinates()).length_squared();
         [ #  # ][ #  # ]
     486 [ #  # ][ #  # ]:          0 :   double d2 = (pos - closest_edge->point(1)->coordinates()).length_squared();
         [ #  # ][ #  # ]
     487 [ #  # ][ #  # ]:          0 :   if ( (!TDVGFacetOwner::get(closest_edge->point(0)) && d1 < dst_tol_sqr) ||
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     488                 :            :        (d1 < GEOMETRY_RESABS*GEOMETRY_RESABS) )
     489                 :            :   {
     490         [ #  # ]:          0 :     if ( !edge_reversed )
     491 [ #  # ][ #  # ]:          0 :       new_curve_edges.append( my_edges.pop() );
     492         [ #  # ]:          0 :     new_point = closest_edge->point(0);
     493                 :            :   }
     494 [ #  # ][ #  # ]:          0 :   else if( (!TDVGFacetOwner::get(closest_edge->point(1)) && d2 < dst_tol_sqr) ||
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     495                 :            :       (d2 < GEOMETRY_RESABS*GEOMETRY_RESABS) )
     496                 :            :   {
     497         [ #  # ]:          0 :     if( edge_reversed )
     498 [ #  # ][ #  # ]:          0 :       new_curve_edges.append( my_edges.pop() );
     499         [ #  # ]:          0 :     new_point = closest_edge->point(1);
     500                 :            :   }
     501                 :            :   else
     502                 :            :   {
     503                 :            :     CubitFacetEdge* new_edge;
     504                 :            :     CubitFacet* new_facet;
     505         [ #  # ]:          0 :     TDVGFacetOwner::remove(closest_edge);
     506         [ #  # ]:          0 :     PartSurfFacetTool::split_edge(closest_edge, edge_pos, 0, new_point, new_edge, new_facet );
     507         [ #  # ]:          0 :     TDVGFacetOwner::set(closest_edge, this);
     508                 :            : 
     509         [ #  # ]:          0 :     if ( edge_reversed ) {
     510 [ #  # ][ #  # ]:          0 :       new_curve_edges.append( my_edges.pop() );
     511 [ #  # ][ #  # ]:          0 :       my_edges.append( dynamic_cast<CubitFacetEdgeData*>(new_edge) );
     512                 :            :     } else {
     513 [ #  # ][ #  # ]:          0 :       new_curve_edges.append( dynamic_cast<CubitFacetEdgeData*>(new_edge) );
     514                 :            :       //TDVGFacetOwner::remove(new_edge);
     515                 :            :     }
     516                 :            :   }
     517                 :            : 
     518         [ #  # ]:          0 :   CubitPointData* new_point_d = dynamic_cast<CubitPointData*>(new_point);
     519 [ #  # ][ #  # ]:          0 :   new_point_d->set(end_point()->coordinates());
                 [ #  # ]
     520 [ #  # ][ #  # ]:          0 :   end_point()->facet_point( new_point_d );
     521         [ #  # ]:          0 :   set_facet_data(my_edges);
     522         [ #  # ]:          0 :   new_curve_edges.reverse();
     523         [ #  # ]:          0 :   new_curve->set_facet_data(new_curve_edges);
     524                 :            :   
     525                 :          0 :   PartitionCoEdge* coedge = 0;
     526 [ #  # ][ #  # ]:          0 :   while ((coedge = next_coedge(coedge)) != NULL )
     527                 :            :   {
     528         [ #  # ]:          0 :     PartitionLoop* loop = coedge->get_loop();
     529         [ #  # ]:          0 :     if (!loop) continue;
     530                 :            :     
     531         [ #  # ]:          0 :     PartitionSurface* surf = loop->get_surface();
     532 [ #  # ][ #  # ]:          0 :     if (!surf->notify_moving_point( new_point, pos ))
     533                 :          0 :       return CUBIT_FAILURE;
     534                 :            :   }
     535                 :            : 
     536         [ #  # ]:          0 :   new_point->set(pos);
     537         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     538                 :            : }
     539                 :            : 
     540                 :          0 : void PartitionCurve::remove_dead_facet( CubitFacetEdgeData* edge )
     541                 :            : {
     542                 :          0 :   facetEdges.remove(edge);
     543                 :          0 : }
     544                 :            :   
     545                 :          0 : CubitStatus PartitionCurve::get_save_topology( DLIList<int>& end_points )
     546                 :            : {
     547         [ #  # ]:          0 :   for( int i = 0; i < 2; i++ )
     548                 :            :   {
     549 [ #  # ][ #  # ]:          0 :     PartitionPoint* point = i ? end_point() : start_point();
                 [ #  # ]
     550                 :            :     int set_id, pt_id;
     551 [ #  # ][ #  # ]:          0 :     if( &(point->sub_entity_set()) == &sub_entity_set() )
                 [ #  # ]
     552                 :          0 :       set_id = 0;
     553                 :            :     else 
     554 [ #  # ][ #  # ]:          0 :       set_id = point->sub_entity_set().get_unique_id();
     555 [ #  # ][ #  # ]:          0 :     pt_id = point->sub_entity_set().get_id(point);
                 [ #  # ]
     556         [ #  # ]:          0 :     end_points.append(set_id);
     557         [ #  # ]:          0 :     end_points.append(pt_id);
     558                 :            :   }
     559                 :          0 :   return CUBIT_SUCCESS;
     560                 :            : }
     561                 :            : 
     562                 :            : 
     563                 :            : 
     564                 :          0 : void PartitionCurve::transform(const CubitTransformMatrix& xform)
     565                 :            : {
     566                 :            :   int i;
     567                 :            :   
     568 [ #  # ][ #  # ]:          0 :   DLIList<CubitPoint*> points(facetEdges.size());
     569 [ #  # ][ #  # ]:          0 :   for ( i = facetEdges.size(); i--; )
     570                 :            :   {
     571         [ #  # ]:          0 :     CubitFacetEdgeData* edge = facetEdges.step_and_get();
     572 [ #  # ][ #  # ]:          0 :     edge->point(0)->marked(1);
     573 [ #  # ][ #  # ]:          0 :     edge->point(1)->marked(1);
     574                 :            :   }
     575 [ #  # ][ #  # ]:          0 :   for ( i = facetEdges.size(); i--; )
     576                 :            :   {
     577         [ #  # ]:          0 :     CubitFacetEdgeData* edge = facetEdges.step_and_get();
     578         [ #  # ]:          0 :     for ( int j = 0; j < 2; j++ )
     579                 :            :     {
     580         [ #  # ]:          0 :       CubitPoint* pt = edge->point(j);
     581 [ #  # ][ #  # ]:          0 :       if( pt->marked() )
     582                 :            :       {
     583         [ #  # ]:          0 :         pt->marked(0);
     584                 :            :       
     585 [ #  # ][ #  # ]:          0 :         if( TDVGFacetOwner::get(pt) == 0 )
     586         [ #  # ]:          0 :           points.append(pt);
     587                 :            :       }
     588                 :            :     }
     589                 :            :   }
     590                 :            :    
     591 [ #  # ][ #  # ]:          0 :   for( i = points.size(); i--; )
     592                 :            :   {
     593         [ #  # ]:          0 :     CubitPoint* pt = points.get_and_step();
     594 [ #  # ][ #  # ]:          0 :     pt->set( xform * pt->coordinates() );
                 [ #  # ]
     595         [ #  # ]:          0 :   }   
     596                 :          0 : }
     597                 :            : 
     598                 :          0 : void PartitionCurve::replace_facet(CubitFacetEdgeData* dead_facet,
     599                 :            :                                    DLIList<CubitFacetEdgeData*> &new_facets)
     600                 :            : {
     601 [ #  # ][ #  # ]:          0 :   assert(new_facets.size() > 1); // doesn't make sense to replace 1 to 1
     602                 :            : 
     603         [ #  # ]:          0 :   DLIList<CubitFacetEdgeData*> new_copy = new_facets;
     604                 :            : 
     605         [ #  # ]:          0 :   new_facets.reset();
     606         [ #  # ]:          0 :   facetEdges.reset();
     607         [ #  # ]:          0 :   int dead_index = facetEdges.where_is_item(dead_facet);
     608         [ #  # ]:          0 :   assert(-1 != dead_index);
     609                 :            : 
     610                 :            :   // special case for a single facet on the edge
     611                 :            :   // -  use curve endpoints to determine order
     612 [ #  # ][ #  # ]:          0 :   if (facetEdges.size() == 1)
     613                 :            :   {
     614         [ #  # ]:          0 :     facetEdges.clean_out();
     615                 :            : 
     616         [ #  # ]:          0 :     new_copy.last();
     617 [ #  # ][ #  # ]:          0 :     if (new_copy.get()->contains(start_point()->facet_point()) )
         [ #  # ][ #  # ]
                 [ #  # ]
     618         [ #  # ]:          0 :       new_copy.reverse();
     619                 :            : 
     620         [ #  # ]:          0 :     new_copy.reset();
     621 [ #  # ][ #  # ]:          0 :     assert( new_copy.get()->contains(start_point()->facet_point()) );
         [ #  # ][ #  # ]
                 [ #  # ]
     622         [ #  # ]:          0 :     new_copy.last();
     623 [ #  # ][ #  # ]:          0 :     assert( new_copy.get()->contains(end_point()->facet_point()) );
         [ #  # ][ #  # ]
                 [ #  # ]
     624                 :            : 
     625         [ #  # ]:          0 :     facetEdges = new_copy;
     626                 :            :   }
     627                 :            :   else
     628                 :            :   {
     629         [ #  # ]:          0 :     DLIList<CubitFacetEdgeData*> ordered_edges;
     630                 :            :     int i;
     631                 :            : 
     632                 :            :     // copy the edges before the dead edge into a new list
     633         [ #  # ]:          0 :     for (i=0; i< dead_index; i++)
     634 [ #  # ][ #  # ]:          0 :       ordered_edges.append(facetEdges.next(i));
     635                 :            : 
     636                 :            :     // if there are edges before the new edges, find out whether the first or last
     637                 :            :     // new edge is adjacent to the one before the dead edge
     638                 :          0 :     CubitFacetEdgeData *prev = NULL;
     639                 :          0 :     CubitFacetEdgeData *next = NULL;
     640                 :          0 :     CubitPoint *new_start_pt = NULL;
     641                 :          0 :     CubitPoint *new_end_pt = NULL;
     642         [ #  # ]:          0 :     if (dead_index > 0)
     643                 :            :     {
     644         [ #  # ]:          0 :       prev = facetEdges.next(dead_index-1);
     645         [ #  # ]:          0 :       new_start_pt = prev->shared_point(dead_facet);
     646         [ #  # ]:          0 :       assert(new_start_pt != NULL);
     647                 :            :     }
     648                 :            : 
     649 [ #  # ][ #  # ]:          0 :     if (dead_index < (facetEdges.size() - 1) )
     650                 :            :     {
     651         [ #  # ]:          0 :       next = facetEdges.next(dead_index+1);
     652         [ #  # ]:          0 :       new_end_pt = next->shared_point(dead_facet);
     653         [ #  # ]:          0 :       assert(new_end_pt != NULL);
     654                 :            :     }
     655                 :            : 
     656         [ #  # ]:          0 :     if (prev)
     657                 :            :     {
     658         [ #  # ]:          0 :       new_copy.last();
     659 [ #  # ][ #  # ]:          0 :       if (new_copy.get()->contains(new_start_pt))
                 [ #  # ]
     660         [ #  # ]:          0 :         new_copy.reverse();
     661                 :            :     }
     662                 :            :     else
     663                 :            :     {
     664                 :            :       // use the edge after the dead edge to find out whether to reverse the new
     665                 :            :       // edges or not
     666         [ #  # ]:          0 :       assert(next != NULL);
     667         [ #  # ]:          0 :       new_copy.reset();
     668 [ #  # ][ #  # ]:          0 :       if (new_copy.get()->contains(new_end_pt))
                 [ #  # ]
     669         [ #  # ]:          0 :         new_copy.reverse();
     670                 :            :     }
     671                 :            : 
     672         [ #  # ]:          0 :     if (prev)
     673                 :            :     {
     674         [ #  # ]:          0 :       new_copy.reset();
     675 [ #  # ][ #  # ]:          0 :       assert( prev->shared_point(new_copy.get()) != NULL);
                 [ #  # ]
     676                 :            :     }
     677         [ #  # ]:          0 :     if (next)
     678                 :            :     {
     679         [ #  # ]:          0 :       new_copy.last();
     680 [ #  # ][ #  # ]:          0 :       assert( next->shared_point(new_copy.get()) != NULL);
                 [ #  # ]
     681                 :            :     }
     682                 :            : 
     683                 :            :     // copy the new edges into place in the ordered list
     684         [ #  # ]:          0 :     new_copy.reset();
     685 [ #  # ][ #  # ]:          0 :     for (i=new_copy.size(); i>0; i--)
     686 [ #  # ][ #  # ]:          0 :       ordered_edges.append(new_copy.get_and_step());
     687                 :            : 
     688                 :            :     // add the rest of the edges to the list
     689         [ #  # ]:          0 :     facetEdges.reset();
     690 [ #  # ][ #  # ]:          0 :     for (i=dead_index+1; i<facetEdges.size(); i++)
     691 [ #  # ][ #  # ]:          0 :       ordered_edges.append(facetEdges.next(i));
     692                 :            : 
     693                 :            : 
     694         [ #  # ]:          0 :     facetEdges.clean_out();
     695 [ #  # ][ #  # ]:          0 :     facetEdges = ordered_edges;
     696                 :            :   }
     697                 :            : 
     698         [ #  # ]:          0 :   TDVGFacetOwner::remove(dead_facet);
     699 [ #  # ][ #  # ]:          0 :   for( int j = 0; j < new_facets.size(); j++ )
     700 [ #  # ][ #  # ]:          0 :     TDVGFacetOwner::set(new_facets.step_and_get(),this);
                 [ #  # ]
     701                 :            : 
     702                 :            :   // TODO - memory management - where should the facets get deleted
     703                 :          0 : }
     704                 :            : 
     705                 :          0 : void PartitionCurve::draw_facets( int color)
     706                 :            : {
     707 [ #  # ][ #  # ]:          0 :   if( !facetEdges.size() )
     708                 :            :   {
     709 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("No facet data.\n");
         [ #  # ][ #  # ]
     710                 :          0 :     return ;
     711                 :            :   }
     712                 :            :   
     713                 :            :   int i;
     714 [ #  # ][ #  # ]:          0 :   GPoint* pts = new GPoint[facetEdges.size() + 1];
                 [ #  # ]
     715                 :            :   
     716         [ #  # ]:          0 :   facetEdges.reset();
     717                 :          0 :   CubitPoint* pt = 0;
     718 [ #  # ][ #  # ]:          0 :   if( facetEdges.size() == 1 )
     719                 :            :   {
     720 [ #  # ][ #  # ]:          0 :     pt = facetEdges.get()->point(0);
     721                 :            :   }
     722                 :            :   else
     723                 :            :   {
     724 [ #  # ][ #  # ]:          0 :     pt = facetEdges.get()->shared_point(facetEdges.next());
                 [ #  # ]
     725 [ #  # ][ #  # ]:          0 :     pt = facetEdges.get()->other_point(pt);
     726                 :            :   }
     727                 :            :   
     728         [ #  # ]:          0 :   CubitVector v = pt->coordinates();
     729         [ #  # ]:          0 :   pts[0].x = (float)v.x();
     730         [ #  # ]:          0 :   pts[0].y = (float)v.y();
     731         [ #  # ]:          0 :   pts[0].z = (float)v.z();
     732                 :            : 
     733 [ #  # ][ #  # ]:          0 :   for( i = 1; i <= facetEdges.size(); i++ )
     734                 :            :   {
     735 [ #  # ][ #  # ]:          0 :     pt = facetEdges.get_and_step()->other_point(pt);
     736         [ #  # ]:          0 :     CubitVector v = pt->coordinates();
     737         [ #  # ]:          0 :     pts[i].x = (float)v.x();
     738         [ #  # ]:          0 :     pts[i].y = (float)v.y();
     739         [ #  # ]:          0 :     pts[i].z = (float)v.z();
     740                 :            :   }
     741                 :            :   
     742 [ #  # ][ #  # ]:          0 :   GfxDebug::draw_polyline( pts, facetEdges.size() + 1, color );
     743 [ #  # ][ #  # ]:          0 :   for ( i = 0; i <= facetEdges.size(); i++ )
     744                 :            :   {
     745         [ #  # ]:          0 :     GfxDebug::draw_point( pts[i].x, pts[i].y, pts[i].z, color );
     746                 :            :   }
     747                 :            :   
     748         [ #  # ]:          0 :   facetEdges.reset();
     749 [ #  # ][ #  # ]:          0 :   for ( i = 0; i < facetEdges.size(); i++ )
     750                 :            :   {
     751         [ #  # ]:          0 :     CubitFacetEdge* edge = facetEdges.get_and_step();
     752 [ #  # ][ #  # ]:          0 :     CubitVector mid = 0.5*(edge->point(0)->coordinates()+edge->point(1)->coordinates());
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     753 [ #  # ][ #  # ]:          0 :     GfxDebug::draw_label( i, (float)mid.x(), (float)mid.y(), (float)mid.z(), color );
         [ #  # ][ #  # ]
     754                 :            :   }
     755         [ #  # ]:          0 :   GfxDebug::flush();
     756                 :            :   
     757         [ #  # ]:          0 :   delete [] pts;
     758                 :            : }
     759                 :            : 
     760                 :          0 : void PartitionCurve::do_facet_cleanup()
     761                 :            : {
     762                 :            :   int i;
     763                 :          0 :   const double tol = 10.0 * GEOMETRY_RESABS;
     764                 :          0 :   const double tol_sqr = tol * tol;
     765                 :            :   
     766         [ #  # ]:          0 :   DLIList<CubitFacetEdgeData*> edge_list(facetEdges);
     767                 :          0 :   CubitFacetEdgeData* prev_edge = 0;
     768         [ #  # ]:          0 :   edge_list.reset();
     769                 :            :   
     770 [ #  # ][ #  # ]:          0 :   for ( i = edge_list.size(); i--; )
     771                 :            :   {
     772         [ #  # ]:          0 :     CubitFacetEdgeData* edge = edge_list.get_and_step();
     773 [ #  # ][ #  # ]:          0 :     PartitionEntity* start_pt = TDVGFacetOwner::get(edge->point(0));
     774 [ #  # ][ #  # ]:          0 :     PartitionEntity* end_pt = TDVGFacetOwner::get(edge->point(1));
     775 [ #  # ][ #  # ]:          0 :     if ( start_pt && end_pt )
     776                 :            :     {
     777                 :          0 :       prev_edge = edge;
     778                 :          0 :       continue;
     779                 :            :     }
     780                 :            :     
     781 [ #  # ][ #  # ]:          0 :     CubitVector edge_vect(edge->point(1)->coordinates());
     782 [ #  # ][ #  # ]:          0 :     edge_vect -= edge->point(0)->coordinates();
                 [ #  # ]
     783 [ #  # ][ #  # ]:          0 :     if ( edge_vect.length_squared() > tol_sqr )
     784                 :            :     {
     785                 :          0 :       prev_edge = edge;
     786                 :          0 :       continue;
     787                 :            :     }
     788                 :            :     
     789                 :            :     CubitPoint *keep, *dead;
     790         [ #  # ]:          0 :     if ( start_pt ) 
     791                 :            :     {
     792         [ #  # ]:          0 :       keep = edge->point(0);
     793         [ #  # ]:          0 :       dead = edge->point(1);
     794                 :            :     }
     795         [ #  # ]:          0 :     else if ( end_pt )
     796                 :            :     {
     797         [ #  # ]:          0 :       keep = edge->point(1);
     798         [ #  # ]:          0 :       dead = edge->point(0);
     799                 :            :     }
     800                 :            :     else
     801                 :            :     {
     802 [ #  # ][ #  # ]:          0 :       double prev = (prev_edge->point(0)->coordinates() -
         [ #  # ][ #  # ]
     803 [ #  # ][ #  # ]:          0 :         prev_edge->point(1)->coordinates()).length_squared();
     804 [ #  # ][ #  # ]:          0 :       double next = (edge_list.get()->point(0)->coordinates() -
         [ #  # ][ #  # ]
                 [ #  # ]
     805 [ #  # ][ #  # ]:          0 :         edge_list.get()->point(1)->coordinates()).length_squared();
                 [ #  # ]
     806         [ #  # ]:          0 :       if ( prev < next )
     807                 :            :       {
     808         [ #  # ]:          0 :         dead = prev_edge->shared_point(edge);
     809 [ #  # ][ #  # ]:          0 :         keep = edge_list.get()->shared_point(edge);
     810                 :            :       }
     811                 :            :       else
     812                 :            :       {
     813 [ #  # ][ #  # ]:          0 :         dead = edge_list.get()->shared_point(edge);
     814         [ #  # ]:          0 :         keep = prev_edge->shared_point(edge);
     815                 :            :       }
     816 [ #  # ][ #  # ]:          0 :       assert( dead && keep );
     817                 :            :     }
     818                 :            :     
     819 [ #  # ][ #  # ]:          0 :     if ( PartSurfFacetTool::collapse_edge( keep, dead ) ) 
     820                 :            :     {
     821                 :            :       ;
     822                 :            :     }
     823                 :            :     else
     824                 :            :     {
     825                 :          0 :       prev_edge = edge;
     826                 :            :     }
     827         [ #  # ]:          0 :   }
     828                 :          0 : }
     829                 :            : 
     830                 :            : 
     831                 :          0 : CubitStatus PartitionCurve::move_to_geometry( CubitPoint* point )
     832                 :            : {
     833         [ #  # ]:          0 :   CubitVector new_pos;
     834 [ #  # ][ #  # ]:          0 :   if (!closest_point( point->coordinates(), new_pos ))
                 [ #  # ]
     835                 :          0 :     return CUBIT_FAILURE;
     836                 :            :     
     837         [ #  # ]:          0 :   point->set(new_pos);
     838                 :            :   
     839         [ #  # ]:          0 :   DLIList<PartitionSurface*> surfaces;
     840                 :          0 :   PartitionCoEdge* coedge = 0;
     841 [ #  # ][ #  # ]:          0 :   while ((coedge = next_coedge(coedge)) != NULL )
     842                 :            :   {
     843         [ #  # ]:          0 :     PartitionLoop* loop = coedge->get_loop();
     844         [ #  # ]:          0 :     if (!loop)
     845                 :          0 :       continue;
     846                 :            :     
     847         [ #  # ]:          0 :     PartitionSurface* surf = loop->get_surface();
     848         [ #  # ]:          0 :     surfaces.append_unique(surf);
     849                 :            :     
     850         [ #  # ]:          0 :     coedge = coedge->next();
     851                 :            :   }
     852                 :            :   
     853                 :            :   int i;
     854         [ #  # ]:          0 :   surfaces.reset();
     855 [ #  # ][ #  # ]:          0 :   for ( i = 0; i < surfaces.size(); i++ )
     856 [ #  # ][ #  # ]:          0 :     if (!surfaces.get_and_step()->notify_moving_point( point, new_pos ))
                 [ #  # ]
     857                 :          0 :       break;
     858                 :            :       
     859 [ #  # ][ #  # ]:          0 :   if (i < surfaces.size()) 
     860                 :          0 :     return CUBIT_FAILURE;
     861                 :            :   
     862         [ #  # ]:          0 :   point->set(new_pos);
     863         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     864 [ +  - ][ +  - ]:       6364 : }

Generated by: LCOV version 1.11