LCOV - code coverage report
Current view: top level - geom/virtual - SubCurve.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1 298 0.3 %
Date: 2020-06-30 00:58:45 Functions: 2 33 6.1 %
Branches: 2 596 0.3 %

           Branch data     Line data    Source code
       1                 :            : #include "SubCurve.hpp"
       2                 :            : #include "GMem.hpp"
       3                 :            : #include "GeometryQueryEngine.hpp"
       4                 :            : 
       5                 :          0 : PartitionCurve* SubCurve::split( double param )
       6                 :            : {
       7         [ #  # ]:          0 :   if( startParam <= endParam )
       8                 :            :   {
       9 [ #  # ][ #  # ]:          0 :     if( (param <= startParam) || (param >= endParam) )
      10                 :          0 :       return 0;
      11                 :            :   }
      12 [ #  # ][ #  # ]:          0 :   else if( (param >= startParam) || (param <= endParam) )
      13                 :          0 :     return 0;
      14                 :            :     
      15         [ #  # ]:          0 :   return new SubCurve( this, param );
      16                 :            : }
      17                 :            : 
      18                 :          0 : CubitStatus SubCurve::combine( PartitionCurve* dead_curve )
      19                 :            : {
      20         [ #  # ]:          0 :   SubCurve* curve = dynamic_cast<SubCurve*>(dead_curve);
      21 [ #  # ][ #  # ]:          0 :   if( !curve || curve->real_curve() != this->real_curve() )
                 [ #  # ]
      22                 :          0 :     return CUBIT_FAILURE;
      23                 :            :   
      24                 :          0 :   double dse = fabs(start_param() - dead_curve->end_param());
      25                 :          0 :   double des = fabs(end_param() - dead_curve->start_param());
      26                 :            :   
      27         [ #  # ]:          0 :   if( des <= dse )
      28                 :          0 :     endParam = curve->endParam;
      29                 :            :   else 
      30                 :          0 :     startParam = curve->startParam;
      31                 :            :   
      32                 :          0 :   return CUBIT_SUCCESS;
      33                 :            : }
      34                 :            :   
      35                 :            :   
      36                 :            :        
      37                 :            : 
      38                 :          0 : SubCurve::SubCurve( Curve* curve_ptr ) 
      39                 :            : {
      40 [ #  # ][ #  # ]:          0 :   assert( dynamic_cast<SubEntitySet*>(curve_ptr->owner()) == 0 );
                 [ #  # ]
      41 [ #  # ][ #  # ]:          0 :   new SubEntitySet( curve_ptr, this );
      42                 :            :   
      43                 :            :   
      44         [ #  # ]:          0 :   startParam = curve_ptr->start_param();
      45         [ #  # ]:          0 :   endParam = curve_ptr->end_param();
      46                 :            :   
      47                 :            :   double period;
      48         [ #  # ]:          0 :   if( fabs( startParam - endParam ) < CUBIT_RESABS )
      49                 :            :   {
      50 [ #  # ][ #  # ]:          0 :     if( ! curve_ptr->is_periodic( period ) )
      51                 :            :     {
      52                 :          0 :       assert( 0 );
      53                 :            :     }
      54                 :          0 :     endParam = startParam + period ;
      55                 :            :   }
      56                 :            :   
      57 [ #  # ][ #  # ]:          0 :   if( curve_ptr->bridge_sense() != this->bridge_sense() )
                 [ #  # ]
      58         [ #  # ]:          0 :     reverse_bridge_sense();
      59                 :          0 : }
      60                 :            : 
      61                 :          0 : SubCurve::SubCurve( SubCurve* split_from, double start )
      62                 :            : {
      63 [ #  # ][ #  # ]:          0 :   split_from->sub_entity_set().add_partition( this, split_from );
                 [ #  # ]
      64                 :            :   
      65                 :          0 :   endParam = split_from->endParam;
      66                 :          0 :   startParam = split_from->endParam = start;
      67                 :            : 
      68 [ #  # ][ #  # ]:          0 :   if( CUBIT_REVERSED == split_from->bridge_sense() )
      69         [ #  # ]:          0 :     this->reverse_bridge_sense();
      70                 :          0 : }
      71                 :            : 
      72                 :          0 : SubCurve::~SubCurve()
      73                 :            : {
      74         [ #  # ]:          0 : }
      75                 :            : 
      76                 :          0 : int SubCurve::num_partitions() const
      77                 :            : {
      78         [ #  # ]:          0 :   DLIList<TopologyBridge*> tmp;
      79         [ #  # ]:          0 :   get_all_partitions( tmp );
      80 [ #  # ][ #  # ]:          0 :   return tmp.size();
      81                 :            : }
      82                 :            : 
      83                 :          0 : void SubCurve::get_all_partitions( DLIList<TopologyBridge*>& curves ) const
      84                 :            : {
      85                 :          0 :   sub_entity_set().get_owners(curves);
      86                 :          0 : }
      87                 :            : 
      88                 :          0 : CubitBox SubCurve::bounding_box() const
      89                 :            : {
      90                 :            : /*
      91                 :            :   CubitVector start, end;
      92                 :            :   SubCurve* me = (SubCurve*)this;
      93                 :            :   me->position_from_u( me->start_param(), start );
      94                 :            :   me->position_from_u( me->  end_param(),   end );
      95                 :            :   CubitBox box( start, end );
      96                 :            :   
      97                 :            :   DLIList<CubitVector*> extrema;
      98                 :            :   CubitSense sense;
      99                 :            :   me->get_interior_extrema( extrema, sense );
     100                 :            :   if( sense == CUBIT_REVERSED )
     101                 :            :     extrema.reverse();
     102                 :            :   while( extrema.size() )
     103                 :            :   {
     104                 :            :     CubitVector* v = extrema.pop();
     105                 :            :     box |= *v;
     106                 :            :     delete v;
     107                 :            :   }
     108                 :            : */  
     109         [ #  # ]:          0 :   return dynamic_cast<Curve*>(partitioned_entity())->bounding_box();
     110                 :            : }
     111                 :            : 
     112                 :          0 : double SubCurve::measure()
     113                 :            : {
     114                 :          0 :   return fabs(real_curve()->length_from_u( startParam, endParam ));
     115                 :            : }
     116                 :            : 
     117                 :          0 : GeometryType SubCurve::geometry_type()
     118                 :            : {
     119                 :          0 :   return real_curve()->geometry_type();
     120                 :            : }
     121                 :            : 
     122                 :          0 : CubitStatus SubCurve::closest_point( const CubitVector& from, 
     123                 :            :                                      CubitVector& closest,
     124                 :            :                                      CubitVector* tangent,
     125                 :            :                                      CubitVector* curvature,
     126                 :            :                                      double* param )
     127                 :            : {
     128                 :            :   double u;
     129                 :            :   CubitStatus result =
     130 [ #  # ][ #  # ]:          0 :      real_curve()->closest_point( from, closest, tangent, curvature, &u );
     131         [ #  # ]:          0 :   if( param )
     132                 :          0 :     *param = u;
     133                 :            : 
     134                 :            :   // Snap position to the ends of the SubCurve if
     135                 :            :   // necessary.
     136         [ #  # ]:          0 :   if(result)
     137                 :            :   {
     138                 :            :     double lower, upper;
     139                 :            :     double period;
     140                 :            : 
     141                 :            :     // If curve is periodic we first need to see if our location
     142                 :            :     // can be mapped to the subcurve range just by adding or
     143                 :            :     // subtracting multiples of the period.  If no then we
     144                 :            :     // will snap it to one of the ends.
     145         [ #  # ]:          0 :     int is_per = is_periodic(period);
     146                 :            : 
     147                 :            :     // Get the param range of the SubCurve (will probably 
     148                 :            :     // be different from that of the underlying real curve).
     149         [ #  # ]:          0 :     get_ordered_param_range(lower, upper);
     150                 :            : 
     151                 :            :     // If we are past the low end...
     152         [ #  # ]:          0 :     if(u < lower)
     153                 :            :     {
     154                 :            :       // Adjust for periodic curve.
     155         [ #  # ]:          0 :       if(is_per)
     156                 :            :       {
     157                 :          0 :         double tmp_u = u;
     158         [ #  # ]:          0 :         while(tmp_u < upper + GEOMETRY_RESABS)
     159                 :            :         {
     160                 :          0 :           tmp_u += period;
     161 [ #  # ][ #  # ]:          0 :           if(tmp_u > lower - GEOMETRY_RESABS &&
     162                 :          0 :             tmp_u < upper + GEOMETRY_RESABS)
     163                 :            :           {
     164                 :          0 :             u = tmp_u;
     165                 :            :           }
     166                 :            :         }
     167                 :            :       }
     168                 :            :       // If the value of u was not adjusted because
     169                 :            :       // of a periodic curve go ahead and snap to
     170                 :            :       // the lower bound.
     171         [ #  # ]:          0 :       if(u < lower)
     172                 :            :       {
     173                 :          0 :         u = lower;
     174                 :            :       }
     175                 :            :       // Update the position we will return.
     176         [ #  # ]:          0 :       position_from_u(u, closest);
     177                 :            :     }
     178                 :            :     // If we are past the high end...
     179         [ #  # ]:          0 :     else if(u > upper)
     180                 :            :     {
     181                 :            :       // Adjust for periodic curve.
     182         [ #  # ]:          0 :       if(is_per)
     183                 :            :       {
     184                 :          0 :         double tmp_u = u;
     185         [ #  # ]:          0 :         while(tmp_u > upper - GEOMETRY_RESABS)
     186                 :            :         {
     187                 :          0 :           tmp_u -= period;
     188 [ #  # ][ #  # ]:          0 :           if(tmp_u > lower - GEOMETRY_RESABS &&
     189                 :          0 :             tmp_u < upper + GEOMETRY_RESABS)
     190                 :            :           {
     191                 :          0 :             u = tmp_u;
     192                 :            :           }
     193                 :            :         }
     194                 :            :       }
     195                 :            :       // If the value of u was not adjusted because
     196                 :            :       // of a periodic curve go ahead and snap to
     197                 :            :       // the upper bound.
     198         [ #  # ]:          0 :       if(u > upper)
     199                 :            :       {
     200                 :          0 :         u = upper;
     201                 :            :       }
     202                 :            :       // Update the position we will return.
     203         [ #  # ]:          0 :       position_from_u(u, closest);
     204                 :            :     }
     205                 :            :   }
     206                 :            : 
     207 [ #  # ][ #  # ]:          0 :   if( result && tangent )
     208                 :            :   {
     209 [ #  # ][ #  # ]:          0 :     CubitVector start, end;
     210 [ #  # ][ #  # ]:          0 :     if( !position_from_u( start_param(), start ) ||
         [ #  # ][ #  # ]
                 [ #  # ]
     211 [ #  # ][ #  # ]:          0 :         !position_from_u( end_param(), end ) )
     212                 :          0 :       return CUBIT_FAILURE;
     213                 :            :       
     214 [ #  # ][ #  # ]:          0 :     double ds = (start - from).length_squared();
     215 [ #  # ][ #  # ]:          0 :     double de = (end   - from).length_squared();
     216                 :          0 :     const double rsq = GEOMETRY_RESABS * GEOMETRY_RESABS;
     217 [ #  # ][ #  # ]:          0 :     if( ds < rsq && G1_discontinuous( u, &end, &start ) )
         [ #  # ][ #  # ]
     218         [ #  # ]:          0 :       *tangent = start;
     219 [ #  # ][ #  # ]:          0 :     else if( de < rsq && G1_discontinuous( u, &end, &start ) )
         [ #  # ][ #  # ]
     220         [ #  # ]:          0 :       *tangent = end;
     221                 :            :   }
     222                 :            :   
     223                 :          0 :   return result;
     224                 :            : }
     225                 :            : 
     226                 :          0 : CubitPointContainment SubCurve::point_containment( const CubitVector& point )
     227                 :            : {
     228                 :          0 :   CubitPointContainment cpc = real_curve()->point_containment( point );
     229 [ #  # ][ #  # ]:          0 :   if( (cpc == CUBIT_PNT_INSIDE) || (cpc == CUBIT_PNT_ON) ||
                 [ #  # ]
     230                 :            :       (cpc == CUBIT_PNT_BOUNDARY) )
     231                 :            :   {
     232 [ #  # ][ #  # ]:          0 :     double u = real_curve()->u_from_position( point );
     233                 :            :     double lower, upper;
     234         [ #  # ]:          0 :     get_ordered_param_range( lower, upper );
     235 [ #  # ][ #  # ]:          0 :     if( u < lower || u > upper )
     236                 :          0 :       cpc = CUBIT_PNT_OFF;
     237                 :            :   }
     238                 :            : 
     239 [ #  # ][ #  # ]:          0 :   if( (cpc == CUBIT_PNT_INSIDE) || (cpc == CUBIT_PNT_ON) )
     240                 :            :   {
     241 [ #  # ][ #  # ]:          0 :     CubitVector start, end;
     242 [ #  # ][ #  # ]:          0 :     position_from_u( start_param(), start );
     243 [ #  # ][ #  # ]:          0 :     position_from_u( end_param(), end );
     244 [ #  # ][ #  # ]:          0 :     if( (point-start).length_squared() < GEOMETRY_RESABS*GEOMETRY_RESABS ||
         [ #  # ][ #  # ]
                 [ #  # ]
           [ #  #  #  # ]
     245 [ #  # ][ #  # ]:          0 :         (point-end  ).length_squared() < GEOMETRY_RESABS*GEOMETRY_RESABS )
         [ #  # ][ #  # ]
     246                 :            :     {
     247                 :          0 :       cpc = CUBIT_PNT_BOUNDARY;
     248                 :            :     }
     249                 :            :   }
     250                 :            :   
     251                 :          0 :   return cpc;
     252                 :            : }
     253                 :            : 
     254                 :          0 : CubitBoolean SubCurve::is_position_on( const CubitVector& position )
     255                 :            : {
     256                 :          0 :   return real_curve()->is_position_on( position );
     257                 :            : }
     258                 :            : 
     259                 :          0 : CubitBoolean SubCurve::G1_discontinuous( double param, 
     260                 :            :                                          CubitVector* minus_tan,
     261                 :            :                                          CubitVector* plus_tan )
     262                 :            : {
     263                 :            :   double lower, upper;
     264         [ #  # ]:          0 :   get_ordered_param_range( lower, upper );
     265 [ #  # ][ #  # ]:          0 :   if( param <= lower || param >= upper )
     266                 :          0 :     return CUBIT_FALSE;
     267                 :            :   
     268 [ #  # ][ #  # ]:          0 :   CubitVector pos, start, end;
                 [ #  # ]
     269 [ #  # ][ #  # ]:          0 :   if( !position_from_u( lower, start ) ||
                 [ #  # ]
     270 [ #  # ][ #  # ]:          0 :       !position_from_u( upper, end   ) ||
                 [ #  # ]
     271         [ #  # ]:          0 :       !position_from_u( param, pos   ) )
     272                 :          0 :     assert(0);
     273                 :            :   
     274 [ #  # ][ #  # ]:          0 :   double ds = (pos - start).length_squared();
     275 [ #  # ][ #  # ]:          0 :   double de = (pos - end  ).length_squared();
     276                 :          0 :   const double grs = GEOMETRY_RESABS * GEOMETRY_RESABS;
     277 [ #  # ][ #  # ]:          0 :   if( ds < grs || de < grs )
     278                 :          0 :     return CUBIT_FALSE;
     279                 :            :   
     280 [ #  # ][ #  # ]:          0 :   return real_curve()->G1_discontinuous( param, minus_tan, plus_tan );
     281                 :            : }
     282                 :            : 
     283                 :          0 : CubitStatus SubCurve::get_interior_extrema( DLIList<CubitVector*>& points, 
     284                 :            :                                             CubitSense& sense )
     285                 :            : {
     286 [ #  # ][ #  # ]:          0 :   assert( !points.size() );
     287                 :            :   
     288                 :            :   double lower, upper;
     289         [ #  # ]:          0 :   get_ordered_param_range( lower, upper );
     290                 :            :   
     291 [ #  # ][ #  # ]:          0 :   CubitVector start, end;
     292 [ #  # ][ #  # ]:          0 :   if( ! real_curve()->position_from_u( lower, start ) ||
         [ #  # ][ #  # ]
                 [ #  # ]
     293 [ #  # ][ #  # ]:          0 :       ! real_curve()->position_from_u( upper, end ) )
     294                 :          0 :     return CUBIT_FAILURE;
     295                 :            :   
     296         [ #  # ]:          0 :   DLIList<CubitVector*> list;
     297 [ #  # ][ #  # ]:          0 :   if( ! real_curve()->get_interior_extrema( list, sense ) ) 
                 [ #  # ]
     298                 :          0 :     return CUBIT_FAILURE;
     299 [ #  # ][ #  # ]:          0 :   if( list.size() == 0 )
     300                 :          0 :     return CUBIT_SUCCESS;
     301                 :            :   
     302         [ #  # ]:          0 :   list.last();
     303 [ #  # ][ #  # ]:          0 :   double param = real_curve()->u_from_position( *list.get() );
                 [ #  # ]
     304 [ #  # ][ #  # ]:          0 :   while( (param <= lower) || (param >= upper) )
     305                 :            :   {
     306         [ #  # ]:          0 :     delete list.pop();
     307 [ #  # ][ #  # ]:          0 :     if( list.size() == 0 )
     308                 :          0 :       return CUBIT_SUCCESS;
     309         [ #  # ]:          0 :     list.last();
     310 [ #  # ][ #  # ]:          0 :     param = real_curve()->u_from_position( *list.get() );
                 [ #  # ]
     311                 :            :   }
     312                 :            :   
     313 [ #  # ][ #  # ]:          0 :   double ds = (*list.get() - start).length_squared();
                 [ #  # ]
     314 [ #  # ][ #  # ]:          0 :   double de = (*list.get() = end  ).length_squared();
                 [ #  # ]
     315                 :          0 :   const double grs = GEOMETRY_RESABS * GEOMETRY_RESABS;
     316 [ #  # ][ #  # ]:          0 :   if( ds < grs || de < grs )
     317                 :            :   {
     318         [ #  # ]:          0 :     delete list.pop();
     319 [ #  # ][ #  # ]:          0 :     if( list.size() == 0 )
     320                 :          0 :       return CUBIT_SUCCESS;
     321         [ #  # ]:          0 :     list.last();
     322 [ #  # ][ #  # ]:          0 :     param = real_curve()->u_from_position( *list.get() );
                 [ #  # ]
     323                 :            :   }
     324                 :            :   
     325 [ #  # ][ #  # ]:          0 :   while( (param > lower) && (param < upper) )
     326                 :            :   {
     327 [ #  # ][ #  # ]:          0 :     points.append( list.pop() );
     328 [ #  # ][ #  # ]:          0 :     if( list.size() == 0 )
     329                 :          0 :       break;
     330         [ #  # ]:          0 :     list.last();
     331 [ #  # ][ #  # ]:          0 :     param = real_curve()->u_from_position( *list.get() );
                 [ #  # ]
     332                 :            :   }
     333                 :            :   
     334 [ #  # ][ #  # ]:          0 :   while( list.size() )
     335         [ #  # ]:          0 :     delete list.pop();
     336                 :            :   
     337         [ #  # ]:          0 :   if( sense == CUBIT_FORWARD )
     338                 :          0 :     sense = CUBIT_REVERSED;
     339         [ #  # ]:          0 :   else if( sense == CUBIT_REVERSED )
     340                 :          0 :     sense = CUBIT_FORWARD;
     341                 :            :   
     342         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     343                 :            : }
     344                 :            : 
     345                 :          0 : CubitStatus SubCurve::get_center_radius( CubitVector& center, double& radius )
     346                 :          0 :   { return real_curve()->get_center_radius(center,radius); }
     347                 :            : 
     348                 :            : 
     349                 :          0 : CubitBoolean SubCurve::get_param_range( double& lower, double& upper )
     350                 :            : {
     351                 :          0 :   lower = startParam;
     352                 :          0 :   upper = endParam;
     353                 :          0 :   return CUBIT_TRUE;
     354                 :            : }
     355                 :            : 
     356                 :          0 : CubitBoolean SubCurve::get_ordered_param_range( double& lower, double& upper )
     357                 :            : {
     358         [ #  # ]:          0 :   if( startParam < endParam )
     359                 :            :   {
     360                 :          0 :     lower = startParam;
     361                 :          0 :     upper = endParam;
     362                 :            :   }
     363                 :            :   else
     364                 :            :   {
     365                 :          0 :     lower = endParam;
     366                 :          0 :     upper = startParam;
     367                 :            :   }
     368                 :          0 :   return CUBIT_TRUE;
     369                 :            : }
     370                 :            : 
     371                 :          0 : double SubCurve::start_param()
     372                 :          0 :   { return startParam; }
     373                 :          0 : double SubCurve::end_param()
     374                 :          0 :   { return endParam; }
     375                 :            : 
     376                 :          0 : CubitBoolean SubCurve::is_periodic( double& period )
     377                 :            : {
     378                 :          0 :   return real_curve()->is_periodic( period );
     379                 :            : }
     380                 :            : 
     381                 :          0 : double SubCurve::length_from_u( double u1, double u2 )
     382                 :            : {
     383                 :          0 :   return real_curve()->length_from_u( u1, u2 );
     384                 :            : }
     385                 :            : 
     386                 :          0 : double SubCurve::u_from_position( const CubitVector& p )
     387                 :            : {
     388 [ #  # ][ #  # ]:          0 :   double result = real_curve()->u_from_position( p );
     389         [ #  # ]:          0 :   fixup_periodic_param(result);
     390                 :          0 :   return result;
     391                 :            : }
     392                 :            : 
     393                 :          0 : CubitStatus SubCurve::position_from_u( double u, CubitVector& p )
     394                 :            : {
     395                 :          0 :   return real_curve()->position_from_u( u, p );
     396                 :            : }
     397                 :            : 
     398                 :          0 : double SubCurve::u_from_arc_length( double root, double length )
     399                 :            : {
     400                 :          0 :   return real_curve()->u_from_arc_length( root, length );
     401                 :            : }
     402                 :            : 
     403                 :          0 : void SubCurve::fixup_periodic_param( double& param ) const
     404                 :            : {
     405                 :            :   double period;
     406 [ #  # ][ #  # ]:          0 :   if( ! real_curve()->is_periodic(period) )
                 [ #  # ]
     407                 :          0 :     return;
     408                 :            :   
     409         [ #  # ]:          0 :   assert(period > GEOMETRY_RESABS);
     410                 :            :   double start, end;
     411         [ #  # ]:          0 :   if ( startParam < endParam ) {
     412                 :          0 :     start = startParam;
     413                 :          0 :     end = endParam;
     414                 :            :   } else {
     415                 :          0 :     start = endParam;
     416                 :          0 :     end = startParam;
     417                 :            :   }
     418                 :            :   
     419         [ #  # ]:          0 :   if( fabs( start-param ) < GEOMETRY_RESABS )
     420                 :          0 :     param = start;
     421         [ #  # ]:          0 :   if( fabs( end-param ) < GEOMETRY_RESABS )
     422                 :          0 :     param = end;
     423                 :            : 
     424         [ #  # ]:          0 :   while ( param > end )
     425                 :          0 :     param -= period;
     426         [ #  # ]:          0 :   while ( param < start )
     427                 :          0 :     param += period;
     428                 :            : }
     429                 :            : 
     430                 :          0 : CubitStatus SubCurve::get_graphics( GMem& result,
     431                 :            :                             double angle_tolerance,
     432                 :            :                             double distance_tolerance,
     433                 :            :                             double max_edge_length )
     434                 :            : {
     435 [ #  # ][ #  # ]:          0 :   if (POINT_CURVE_TYPE == this->geometry_type())
     436                 :            :   {
     437                 :          0 :     result.pointListCount = 0;
     438                 :          0 :     return CUBIT_SUCCESS;
     439                 :            :   }
     440                 :            : 
     441                 :            :   int i;
     442 [ #  # ][ #  # ]:          0 :   if( !real_curve()->get_geometry_query_engine()->
                 [ #  # ]
     443 [ #  # ][ #  # ]:          0 :     get_graphics( real_curve(), &result, angle_tolerance, distance_tolerance, max_edge_length ) )
     444                 :          0 :     return CUBIT_FAILURE;
     445                 :            : 
     446         [ #  # ]:          0 :   if (0 == result.pointListCount)
     447                 :          0 :     return CUBIT_FAILURE;
     448                 :            :   
     449                 :            :   double lo, hi, start_param, end_param;
     450         [ #  # ]:          0 :   get_ordered_param_range( lo, hi );
     451         [ #  # ]:          0 :   get_param_range(start_param, end_param);
     452         [ #  # ]:          0 :   DLIList<double> param_list( result.pointListCount );
     453                 :            : 
     454                 :            :   // don't use first and last points -- this avoids projection
     455                 :            :   // close to a seam on a periodic curve.  The projection can
     456                 :            :   // jump the seam and cause endpoints of the curve to incorrectly
     457                 :            :   // fall inside the parameter range causing extra segments to be drawn
     458         [ #  # ]:          0 :   for( i = 1; i < result.pointListCount-1; i++ )
     459                 :            :   {
     460         [ #  # ]:          0 :     CubitVector v( result.point_list()[i].x, 
     461         [ #  # ]:          0 :                    result.point_list()[i].y,
     462 [ #  # ][ #  # ]:          0 :                    result.point_list()[i].z );
     463 [ #  # ][ #  # ]:          0 :     double u = real_curve()->u_from_position( v );
     464 [ #  # ][ #  # ]:          0 :     if( (u >= lo) && (u <= hi) ) 
     465         [ #  # ]:          0 :       param_list.append( u );
     466                 :            :   }
     467                 :            :   
     468 [ #  # ][ #  # ]:          0 :   CubitVector start_pt, end_pt;
     469         [ #  # ]:          0 :   position_from_u( start_param, start_pt );
     470         [ #  # ]:          0 :   position_from_u( end_param, end_pt );
     471                 :            :   
     472                 :          0 :   bool append_start = true, append_end = true;
     473 [ #  # ][ #  # ]:          0 :   if( param_list.size() > 0 )
     474                 :            :   {
     475 [ #  # ][ #  # ]:          0 :     CubitVector first_pt, last_pt;
     476         [ #  # ]:          0 :     param_list.last();
     477 [ #  # ][ #  # ]:          0 :     position_from_u( param_list.get(), last_pt );
     478         [ #  # ]:          0 :     param_list.reset();
     479 [ #  # ][ #  # ]:          0 :     position_from_u( param_list.get(), first_pt );
     480                 :            :   
     481 [ #  # ][ #  # ]:          0 :     double d1 = (start_pt - first_pt).length_squared();
     482 [ #  # ][ #  # ]:          0 :     double d2 = (start_pt - last_pt ).length_squared();
     483 [ #  # ][ #  # ]:          0 :     double d4 = (  end_pt - first_pt).length_squared();
     484 [ #  # ][ #  # ]:          0 :     double d3 = (  end_pt - last_pt ).length_squared();
     485                 :          0 :     double forward = d1 + d3;
     486                 :          0 :     double reverse = d2 + d4;
     487         [ #  # ]:          0 :     if( reverse < forward )
     488                 :            :     {
     489         [ #  # ]:          0 :       CubitVector tmp( start_pt );
     490         [ #  # ]:          0 :       start_pt = end_pt;
     491         [ #  # ]:          0 :       end_pt = tmp;
     492                 :          0 :       d1 = d2;
     493                 :          0 :       d3 = d4;
     494                 :            :     }
     495                 :            :     
     496         [ #  # ]:          0 :     if( d1 < (GEOMETRY_RESABS*GEOMETRY_RESABS) )
     497                 :          0 :       append_start = false;
     498         [ #  # ]:          0 :     if( d3 < (GEOMETRY_RESABS*GEOMETRY_RESABS) )
     499                 :          0 :       append_end = false;
     500                 :            :   }
     501                 :            :       
     502                 :          0 :   int index = 0;
     503 [ #  # ][ #  # ]:          0 :   result.allocate_polylines( param_list.size() + 1 );
     504                 :            : 
     505         [ #  # ]:          0 :   if( append_start )
     506                 :            :   {
     507 [ #  # ][ #  # ]:          0 :     result.point_list()[index].x = (float)(start_pt.x());
     508 [ #  # ][ #  # ]:          0 :     result.point_list()[index].y = (float)(start_pt.y());
     509 [ #  # ][ #  # ]:          0 :     result.point_list()[index].z = (float)(start_pt.z());
     510                 :          0 :     index++;
     511                 :            :   }
     512                 :            :   
     513         [ #  # ]:          0 :   param_list.reset();
     514         [ #  # ]:          0 :   CubitVector position;
     515 [ #  # ][ #  # ]:          0 :   for( i = param_list.size(); i--; )
     516                 :            :   {
     517 [ #  # ][ #  # ]:          0 :     position_from_u( param_list.get_and_step(), position );
     518 [ #  # ][ #  # ]:          0 :     result.point_list()[index].x = (float)(position.x());
     519 [ #  # ][ #  # ]:          0 :     result.point_list()[index].y = (float)(position.y());
     520 [ #  # ][ #  # ]:          0 :     result.point_list()[index].z = (float)(position.z());
     521                 :          0 :     index++;
     522                 :            :   }
     523                 :            : 
     524         [ #  # ]:          0 :   if( append_end )
     525                 :            :   {
     526 [ #  # ][ #  # ]:          0 :     result.point_list()[index].x = (float)(end_pt.x());
     527 [ #  # ][ #  # ]:          0 :     result.point_list()[index].y = (float)(end_pt.y());
     528 [ #  # ][ #  # ]:          0 :     result.point_list()[index].z = (float)(end_pt.z());
     529                 :          0 :     index++;
     530                 :            :   }
     531                 :            :   
     532                 :          0 :   result.pointListCount = index;
     533         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     534                 :            : }
     535                 :            : 
     536                 :            :   
     537                 :          0 : void SubCurve::reverse_sense()
     538                 :            : {
     539                 :          0 :   reverse_point_order();
     540         [ #  # ]:          0 :   if( owner() )
     541                 :          0 :     owner()->notify_reversed(this);
     542                 :          0 : }
     543                 :            : 
     544                 :          0 : CubitStatus SubCurve::save( CubitSimpleAttrib& attrib )
     545                 :            : {
     546 [ #  # ][ #  # ]:          0 :   int id = sub_entity_set().get_id(this);
     547         [ #  # ]:          0 :   if( id <= 0 ) return CUBIT_FAILURE;
     548                 :            :   
     549         [ #  # ]:          0 :   DLIList<int> end_points(4);
     550         [ #  # ]:          0 :   get_save_topology(end_points);
     551                 :            : 
     552 [ #  # ][ #  # ]:          0 :   return sub_entity_set().save_geometry( id, 1, 0, 0, &end_points, 0, attrib );
                 [ #  # ]
     553                 :            : }
     554                 :            : 
     555                 :          0 : CubitStatus SubCurve::get_spline_params
     556                 :            : (
     557                 :            :   bool &rational,    // return true/false
     558                 :            :   int &degree,       // the degree of this spline
     559                 :            :   DLIList<CubitVector> &cntrl_pts,  // xyz position of controlpoints
     560                 :            :   DLIList<double> &cntrl_pt_weights, // if rational, a weight for each cntrl point.
     561                 :            :   DLIList<double> &knots,   // There should be order+cntrl_pts.size()-2 knots
     562                 :            :   bool &spline_is_reversed
     563                 :            : ) const
     564                 :            : {
     565 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("Currently, Cubit is unable to determine spline parameters for SubCurves.\n");
     566                 :          0 :   return CUBIT_FAILURE;
     567                 :            : }
     568                 :            : 
     569                 :          0 : CubitStatus SubCurve::get_ellipse_params
     570                 :            : (
     571                 :            :   CubitVector &center_vec,
     572                 :            :   CubitVector &normal,
     573                 :            :   CubitVector &major_axis,
     574                 :            :   double &radius_ratio
     575                 :            : ) const
     576                 :            : {
     577 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("Currently, Cubit is unable to determine ellipse parameters for SubCurves.\n");
     578                 :          0 :   return CUBIT_FAILURE;
     579 [ +  - ][ +  - ]:       6364 : }

Generated by: LCOV version 1.11