cgma
|
#include <CompositeCurve.hpp>
Definition at line 26 of file CompositeCurve.hpp.
CompositeCurve::CompositeCurve | ( | Curve * | curve | ) |
Definition at line 34 of file CompositeCurve.cpp.
: HadBridgeRemoved(0), hiddenSet(0), firstCoEdge(0), startPoint(0), endPoint(0), startNext(0), endNext(0), stitchNext(0) { compGeom = new CompositeGeom(1); compGeom->append( curve, CUBIT_FORWARD ); if( curve->owner() ) curve->owner()->swap_bridge( curve, this, false ); curve->owner(this); }
CompositeCurve::CompositeCurve | ( | CompositeGeom * | geometry | ) |
Definition at line 51 of file CompositeCurve.cpp.
: HadBridgeRemoved(0), compGeom( geometry ), hiddenSet( 0 ), firstCoEdge( 0 ), startPoint( 0 ), endPoint( 0 ), startNext( 0 ), endNext( 0 ), stitchNext(0) { for( int i = 0; i < compGeom->num_entities(); i++ ) { GeometryEntity* entity = compGeom->entity(i); assert( !entity->owner() ); entity->owner(this); } }
CompositeCurve::CompositeCurve | ( | CompositePoint * | point | ) |
Definition at line 79 of file CompositeCurve.cpp.
: HadBridgeRemoved(0), hiddenSet(0), firstCoEdge(0), startPoint(0), endPoint(0), startNext(0), endNext(0), stitchNext(0) { compGeom = new CompositeGeom(1); //compGeom->append( point, CUBIT_FORWARD ); start_point(point); end_point(point); }
CompositeCurve::~CompositeCurve | ( | ) | [virtual] |
Definition at line 96 of file CompositeCurve.cpp.
{ while( firstCoEdge ) remove( firstCoEdge ); for( int i = 0; i < num_curves(); i++ ) if( get_curve(i)->owner() == this ) get_curve(i)->owner(0); start_point(0); end_point(0); unstitch_all(); delete hiddenSet; delete compGeom; hiddenSet = (HiddenEntitySet*)0xbdbdbdbd; compGeom = (CompositeGeom*)0xbdbdbdbd; assert(!startNext); assert(!endNext); }
CompositeCurve::CompositeCurve | ( | ) | [protected] |
CompositeCurve::CompositeCurve | ( | const CompositeCurve & | ) | [private] |
CubitStatus CompositeCurve::add | ( | CompositeCoEdge * | coedge | ) |
Definition at line 282 of file CompositeCurve.cpp.
{ if( coedge->myCurve ) { assert(0); return CUBIT_FAILURE; } coedge->myCurve = this; coedge->nextOnCurve = firstCoEdge; firstCoEdge = coedge; return CUBIT_SUCCESS; }
void CompositeCurve::append_simple_attribute_virt | ( | const CubitSimpleAttrib & | csa | ) | [virtual] |
Implements TopologyBridge.
Definition at line 926 of file CompositeCurve.cpp.
{ if(compGeom) compGeom->add_attribute( simple_attrib_ptr ); }
CubitBox CompositeCurve::bounding_box | ( | void | ) | const [virtual] |
Implements GeometryEntity.
Definition at line 326 of file CompositeCurve.cpp.
{ return compGeom->bounding_box(); }
int CompositeCurve::closest_curve | ( | CubitVector const & | location, |
CubitVector * | point = NULL |
||
) | [protected] |
Definition at line 695 of file CompositeCurve.cpp.
{ double shortest_distance_sqr, current_distance_sqr; CubitVector closest_point, current_point; int closest_curve, current_curve; closest_curve = compGeom->closest_box( location ); get_curve( closest_curve )->closest_point_trimmed( location, closest_point ); shortest_distance_sqr = (location - closest_point).length_squared(); while( ( current_curve = compGeom->next_box_within_dist( shortest_distance_sqr ) ) >= 0 ) { get_curve( current_curve )->closest_point_trimmed( location, current_point ); current_distance_sqr = (location - current_point).length_squared(); if( current_distance_sqr < shortest_distance_sqr ) { closest_curve = current_curve; shortest_distance_sqr = current_distance_sqr; closest_point = current_point; } } if( point ) *point = closest_point; return closest_curve; }
CubitStatus CompositeCurve::closest_point | ( | CubitVector const & | location, |
CubitVector & | closest_location, | ||
CubitVector * | tangent_ptr = NULL , |
||
CubitVector * | curvature_ptr = NULL , |
||
double * | param = NULL |
||
) | [virtual] |
Implements Curve.
Definition at line 405 of file CompositeCurve.cpp.
{ if (num_curves() == 0) // point curve { if (!startPoint) return CUBIT_FAILURE; closest = startPoint->coordinates(); if (tangent_ptr) tangent_ptr->set(0.0,0.0,0.0); if (curvature_ptr) curvature_ptr->set(0.0,0.0,0.0); if (param) *param = 0.0; } if( compGeom->num_entities() == 1 ) { CubitStatus result = get_curve(0) ->closest_point( location, closest, tangent_ptr, curvature_ptr, param ); if( tangent_ptr && compGeom->sense(0) == CUBIT_REVERSED ) *tangent_ptr *= -1.0; if( param ) *param = composite_param( 0, *param ); return result; } int index = closest_curve( location, &closest ); Curve* curve = get_curve( index ); if( tangent_ptr || curvature_ptr || param ) { curve->closest_point( location, closest, tangent_ptr, curvature_ptr, param ); if( param ) *param = composite_param( index, *param ); if( tangent_ptr && compGeom->sense(index) == CUBIT_REVERSED ) *tangent_ptr *= -1.0; } return CUBIT_SUCCESS; }
CubitStatus CompositeCurve::closest_point_trimmed | ( | CubitVector const & | from_pt, |
CubitVector & | result_pt | ||
) | [virtual] |
Reimplemented from Curve.
Definition at line 455 of file CompositeCurve.cpp.
{ if (num_curves() == 0) return closest_point( position, closest ); if( compGeom->num_entities() == 1 ) return get_curve(0)->closest_point_trimmed( position, closest ); closest_curve( position, &closest ); return CUBIT_SUCCESS; }
CubitStatus CompositeCurve::combine | ( | CompositeCurve * | curve_ptr, |
bool | prepend | ||
) |
Definition at line 218 of file CompositeCurve.cpp.
{ int start, stop; if ( prepend ) { start = 0; stop = curve->compGeom->num_entities(); } else { start = compGeom->num_entities(); stop = start + curve->compGeom->num_entities(); } compGeom->merge( *(curve->compGeom), prepend ); if( curve->hiddenSet ) hidden_entities().merge( curve->hiddenSet ); for( int i = start; i < stop; i++ ) { TopologyBridge* bridge = compGeom->entity(i); assert( bridge->owner() == curve ); bridge->owner(this); } return CUBIT_SUCCESS; }
CompositePoint * CompositeCurve::common_point | ( | CompositeCurve * | curve | ) |
Definition at line 257 of file CompositeCurve.cpp.
{ CompositePoint* result = 0; CompositePoint* this_sp = start_point(); CompositePoint* this_ep = end_point(); CompositePoint* othr_sp = curve->start_point(); CompositePoint* othr_ep = curve->end_point(); if( this_sp == othr_sp || this_sp == othr_ep ) result = this_sp; else if( this_ep == othr_sp || this_ep == othr_ep ) result = this_ep; return result; }
double CompositeCurve::composite_param | ( | int | index, |
double | param | ||
) | const |
Definition at line 734 of file CompositeCurve.cpp.
{ if( (index < 0) || (index >= compGeom->num_entities()) ) return -1.0; Curve* curve_ptr = get_curve( index ); double sum = lengthUntilI( index ); double u_min, u_max; curve_ptr->get_param_range( u_min, u_max ); CubitSense sense = this->get_sense(index); double root_param = (sense == CUBIT_FORWARD) ? u_min : u_max; double lfu = (root_param < u) ? curve_ptr->length_from_u( root_param, u ) : curve_ptr->length_from_u( u, root_param ); return sum + fabs( lfu ); }
CubitBoolean CompositeCurve::contains_bridge | ( | TopologyBridge * | bridge | ) | const [virtual] |
Reimplemented from TBOwner.
Definition at line 908 of file CompositeCurve.cpp.
{ if (!compGeom) return CUBIT_FALSE; return (CubitBoolean)(compGeom->index_of(bridge) >= 0); }
CubitStatus CompositeCurve::curve_param | ( | double | u_composite, |
double & | u_curve, | ||
int & | index | ||
) | const |
Definition at line 752 of file CompositeCurve.cpp.
{ double sum = 0.0, period; if( const_cast<CompositeCurve*>(this)->is_periodic(period) ) fixup_periodic_param( uc ); int max = compGeom->num_entities(); int min = 0; index = max / 2; sum = lengthUntilI( max - 1); if( uc >= sum ) index = max - 1; else while( min != max ) { sum = lengthUntilI(index); if( sum > uc ) max = index; else if( lengthUntilI(index+1) > uc ) break; else min = index; index = (min + max) / 2; } if( index >= compGeom->num_entities() ) return CUBIT_FAILURE; double start_param, end_param; get_curve(index)->get_param_range( start_param, end_param ); double arc_len = uc - sum; if( get_sense(index) == CUBIT_REVERSED ) arc_len = get_curve(index)->measure() - arc_len; ui = get_curve(index)->u_from_arc_length( start_param, arc_len ); return CUBIT_SUCCESS; }
double CompositeCurve::end_param | ( | ) | [virtual] |
CompositePoint * CompositeCurve::end_point | ( | ) | const [inline] |
Definition at line 260 of file CompositeCurve.hpp.
{ return endPoint; }
Definition at line 130 of file CompositeCurve.cpp.
{ return set_point( false, pt ); }
CompositeCoEdge * CompositeCurve::first_coedge | ( | ) | const [inline] |
Definition at line 251 of file CompositeCurve.hpp.
{ return firstCoEdge; }
void CompositeCurve::fixup_periodic_param | ( | double & | u | ) | const [protected] |
Definition at line 1004 of file CompositeCurve.cpp.
CubitBoolean CompositeCurve::G1_discontinuous | ( | double | param, |
CubitVector * | minus_tangent = NULL , |
||
CubitVector * | plus_tangent = NULL |
||
) | [virtual] |
Reimplemented from Curve.
Definition at line 616 of file CompositeCurve.cpp.
{ if (num_curves() == 0) // point curve return CUBIT_FALSE; const double half_resabs = CUBIT_RESABS / 2.0; double curve_param; int curve_index; CubitStatus s = this->curve_param( param, curve_param, curve_index ); if( ! s ) { PRINT_ERROR("Parameter %f out of range [%f,%f] in " "CompositeCurve::G1_discontinous(..)\n",param,start_param(),end_param()); return CUBIT_FALSE; } CubitVector tan1, tan2, location, cp; CubitBoolean result = CUBIT_FALSE; if( (curve_index > 0) && (fabs(compGeom->measure(curve_index-1) - param) < half_resabs) ) { get_curve( curve_index )->position_from_u( curve_param, location ); get_curve( curve_index-1 )->closest_point( location, cp, &tan1 ); if( get_sense( curve_index-1 ) == CUBIT_REVERSED ) tan1 *= -1.0; get_curve( curve_index )->closest_point( location, cp, &tan2 ); if( get_sense( curve_index ) == CUBIT_REVERSED ) tan2 *= -1.0; double cross = (tan1 * tan2).length_squared(); double sum = (tan1 + tan2).length_squared(); double diff = (tan1 - tan2).length_squared(); if( (cross > CUBIT_RESABS) || (sum < diff) ) { if( minus_tangent ) *minus_tangent = tan1; if( plus_tangent ) *plus_tangent = tan2; result = CUBIT_TRUE; } else result = CUBIT_FALSE; } else if( (curve_index < (compGeom->num_entities()-1)) && (fabs(compGeom->measure(curve_index) - param) < half_resabs) ) { get_curve( curve_index )->position_from_u( curve_param, location ); get_curve( curve_index )->closest_point( location, cp, &tan1 ); if( get_sense( curve_index ) == CUBIT_REVERSED ) tan1 *= -1.0; get_curve( curve_index+1 )->closest_point( location, cp, &tan2 ); if( get_sense( curve_index+1 ) == CUBIT_REVERSED ) tan2 *= -1.0; double cross = (tan1 * tan2).length_squared(); double sum = (tan1 + tan2).length_squared(); double diff = (tan1 - tan2).length_squared(); if( (cross > CUBIT_RESABS) || (sum < diff) ) { if( minus_tangent ) *minus_tangent = tan1; if( plus_tangent ) *plus_tangent = tan2; result = CUBIT_TRUE; } else result = CUBIT_FALSE; } else if( get_sense(curve_index) == CUBIT_FORWARD ) { result = get_curve( curve_index ) ->G1_discontinuous( curve_param, minus_tangent, plus_tangent ); } else { result = get_curve( curve_index ) ->G1_discontinuous( curve_param, plus_tangent, minus_tangent ); if( result ) { if( plus_tangent ) *plus_tangent *= -1.0; if( minus_tangent) *minus_tangent *= -1.0; } } return result; }
GeometryType CompositeCurve::geometry_type | ( | ) | [virtual] |
Reimplemented from Curve.
Definition at line 332 of file CompositeCurve.cpp.
{ switch (num_curves()) { case 0 : return POINT_CURVE_TYPE; case 1 : return get_curve(0)->geometry_type(); default : return UNDEFINED_CURVE_TYPE; } }
CubitStatus CompositeCurve::get_center_radius | ( | CubitVector & | c, |
double & | r | ||
) | [virtual] |
Implements Curve.
Definition at line 594 of file CompositeCurve.cpp.
{ if (num_curves() == 0) // point curve return CUBIT_FAILURE; if (!get_curve(0)->get_center_radius(c,r) ) return CUBIT_FAILURE; for (int i = compGeom->num_entities() - 1; i > 0; i-- ) { CubitVector c2; double r2; if (!get_curve(i)->get_center_radius(c2,r2) || fabs(r - r2) > GEOMETRY_RESABS || (c2 - c).length_squared() > GEOMETRY_RESABS*GEOMETRY_RESABS) { return CUBIT_FAILURE; } } return CUBIT_SUCCESS; }
void CompositeCurve::get_children_virt | ( | DLIList< TopologyBridge * > & | children | ) | [virtual] |
Implements TopologyBridge.
Definition at line 827 of file CompositeCurve.cpp.
{ CompositePoint* sp = start_point(); CompositePoint* ep = end_point(); if( sp ) list.append( sp ); if( ep && ep != sp ) list.append( ep ); }
Curve * CompositeCurve::get_curve | ( | int | index | ) | const [inline] |
Definition at line 229 of file CompositeCurve.hpp.
CubitStatus CompositeCurve::get_ellipse_params | ( | CubitVector & | center, |
CubitVector & | normal, | ||
CubitVector & | major_axis, | ||
double & | radius_ratio | ||
) | const [virtual] |
Implements Curve.
Definition at line 1438 of file CompositeCurve.cpp.
{ PRINT_ERROR("Currently, Cubit is unable to determine ellipse parameters for CompositeCurves.\n"); return CUBIT_FAILURE; }
GeometryQueryEngine * CompositeCurve::get_geometry_query_engine | ( | ) | const [virtual] |
Implements TopologyBridge.
Definition at line 341 of file CompositeCurve.cpp.
{ return VirtualQueryEngine::instance(); }
void CompositeCurve::get_hidden_points | ( | DLIList< TBPoint * > & | points | ) |
Definition at line 1062 of file CompositeCurve.cpp.
{ if( hiddenSet ) { hiddenSet->hidden_points( points ); } }
CubitStatus CompositeCurve::get_interior_extrema | ( | DLIList< CubitVector * > & | interior_points, |
CubitSense & | return_sense | ||
) | [virtual] |
Implements Curve.
Definition at line 550 of file CompositeCurve.cpp.
{ return_sense = CUBIT_FORWARD; if (num_curves() == 0) // point curve return CUBIT_SUCCESS; // Go through each curve in the composite DLIList<CubitVector*> curve_point_list; for (int i = compGeom->num_entities() - 1; i >= 0; i--) { // Get the next curve's extrema Curve* cur_curve = get_curve(i); cur_curve->get_interior_extrema(curve_point_list,return_sense); // See which order to put them into the return list if (return_sense == get_sense(i)) { interior_points += curve_point_list; } else { curve_point_list.last(); for (int j = curve_point_list.size(); j--; ) interior_points.append(curve_point_list.get_and_back()); } // Unless this is the last curve, put in the point // between this and the next curve if (i != 0) { CubitVector* endpoint = new CubitVector(0,0,0); if (get_sense(i) == CUBIT_FORWARD) cur_curve->position_from_u(cur_curve->end_param(), *endpoint); else cur_curve->position_from_u(cur_curve->end_param(), *endpoint); interior_points.append(endpoint); } // clean out the list for the next curve curve_point_list.clean_out(); } return CUBIT_SUCCESS; }
CubitBoolean CompositeCurve::get_param_range | ( | double & | lower, |
double & | upper | ||
) | [virtual] |
Implements Curve.
Definition at line 351 of file CompositeCurve.cpp.
{ lower = 0; upper = measure(); return CUBIT_TRUE; }
void CompositeCurve::get_parents_virt | ( | DLIList< TopologyBridge * > & | parents | ) | [virtual] |
Implements TopologyBridge.
Definition at line 816 of file CompositeCurve.cpp.
{ for( CompositeCoEdge* coedge = firstCoEdge; coedge != 0; coedge = coedge->nextOnCurve ) if (!dynamic_cast<HiddenEntitySet*>(coedge->owner())) list.append( coedge ); if (stitchNext) stitchNext->get_parents_virt(list); }
CubitStatus CompositeCurve::get_point_direction | ( | CubitVector & | origin, |
CubitVector & | direction | ||
) | [virtual] |
Reimplemented from Curve.
Definition at line 502 of file CompositeCurve.cpp.
{ if (num_curves() == 0) // point curve return CUBIT_FAILURE; if( compGeom->num_entities() == 1 ) return get_curve(0)->get_point_direction( origin, direction ); int count = compGeom->num_entities(); CubitVector* vect_list = new CubitVector[count]; double RESABS_SQUARED = CUBIT_RESABS * CUBIT_RESABS; direction.set(0,0,0); for( int i = 0; i < count; i++ ) { if( ! get_curve(i)->get_point_direction(origin,vect_list[i]) || (vect_list[i].length_squared() < RESABS_SQUARED) ) { delete [] vect_list; return CUBIT_FAILURE; } if( get_sense(i) == CUBIT_REVERSED ) vect_list[i] *= -1; direction += vect_list[i]; } //If we reach this point, then all of the underlying curves are linear. //Next check if they are colinear. if( direction.length_squared() < RESABS_SQUARED ) { delete [] vect_list; return CUBIT_FAILURE; } CubitVector mean = ~direction; for( int j = 0; j < count; j++ ) { if( fabs( 1 - (mean % ~vect_list[j]) ) > CUBIT_RESABS ) { delete [] vect_list; return CUBIT_FAILURE; } } delete [] vect_list; get_curve(0)->get_point_direction(origin,direction); direction = mean; return CUBIT_SUCCESS; }
CubitSense CompositeCurve::get_sense | ( | int | index | ) | const [inline] |
Definition at line 232 of file CompositeCurve.hpp.
CubitStatus CompositeCurve::get_simple_attribute | ( | DLIList< CubitSimpleAttrib > & | csa_list | ) | [virtual] |
Implements TopologyBridge.
Definition at line 975 of file CompositeCurve.cpp.
{ if(!compGeom) return CUBIT_FAILURE; compGeom->get_attributes( attrib_list ); return CUBIT_SUCCESS; }
CubitStatus CompositeCurve::get_simple_attribute | ( | const CubitString & | name, |
DLIList< CubitSimpleAttrib > & | attrib_list | ||
) | [virtual] |
Implements TopologyBridge.
Definition at line 995 of file CompositeCurve.cpp.
{ if(!compGeom) return CUBIT_FAILURE; compGeom->get_attributes( name.c_str(), attrib_list ); return CUBIT_SUCCESS; }
CubitStatus CompositeCurve::get_spline_params | ( | bool & | rational, |
int & | degree, | ||
DLIList< CubitVector > & | cntrl_pts, | ||
DLIList< double > & | cntrl_pt_weights, | ||
DLIList< double > & | knots, | ||
bool & | spline_is_reversed | ||
) | const [virtual] |
Implements Curve.
Definition at line 1424 of file CompositeCurve.cpp.
{ PRINT_ERROR("Currently, Cubit is unable to determine spline parameters for CompositeCurves.\n"); return CUBIT_FAILURE; }
void CompositeCurve::get_stitched | ( | DLIList< CompositeCurve * > & | list | ) |
Definition at line 1272 of file CompositeCurve.cpp.
{ for (CompositeCurve* curve = primary_stitched_curve(); curve; curve = curve->stitchNext) list.append( curve ); }
bool CompositeCurve::has_parent_composite_surface | ( | ) | const |
Definition at line 243 of file CompositeCurve.cpp.
{ CompositeCoEdge* coedge; for( coedge = first_coedge(); coedge; coedge = next_coedge(coedge) ) if( coedge->get_loop() ) return true; return false; }
HiddenEntitySet & CompositeCurve::hidden_entities | ( | ) | [inline] |
Definition at line 265 of file CompositeCurve.hpp.
{ if( !hiddenSet ) hiddenSet = new HiddenEntitySet(this); return *hiddenSet; }
int CompositeCurve::index_of | ( | Curve * | curve_ptr | ) | const [inline] |
Definition at line 238 of file CompositeCurve.hpp.
CubitBoolean CompositeCurve::is_periodic | ( | double & | period | ) | [virtual] |
Implements Curve.
Definition at line 358 of file CompositeCurve.cpp.
{ if (geometry_type() == POINT_CURVE_TYPE) return CUBIT_FALSE; if( startPoint == endPoint && num_curves() > 0 ) { period = measure(); return CUBIT_TRUE; } else { period = 0; return CUBIT_FALSE; } }
CubitBoolean CompositeCurve::is_position_on | ( | const CubitVector & | test_position | ) | [virtual] |
Implements Curve.
Definition at line 469 of file CompositeCurve.cpp.
{ // point curve if (num_curves() == 0) { CompositePoint* point = start_point(); double lensqr = (position - point->coordinates()).length_squared(); return lensqr <= (GEOMETRY_RESABS*GEOMETRY_RESABS); } if( compGeom->num_entities() == 1 ) return get_curve(0)->is_position_on( position ); int index = closest_curve( position ); return get_curve(index)->is_position_on( position ); }
bool CompositeCurve::is_stitched | ( | ) |
Definition at line 1258 of file CompositeCurve.cpp.
{ return stitchNext || dynamic_cast<CompositeCurve*>(owner()); }
int CompositeCurve::layer | ( | ) | const [inline, virtual] |
Reimplemented from TopologyBridge.
Definition at line 88 of file CompositeCurve.hpp.
{ return COMPOSITE_LAYER; }
double CompositeCurve::length_from_u | ( | double | parameter1, |
double | parameter2 | ||
) | [virtual] |
double CompositeCurve::lengthUntilI | ( | int | index | ) | const [protected] |
Definition at line 801 of file CompositeCurve.cpp.
double CompositeCurve::measure | ( | ) | [virtual] |
Implements GeometryEntity.
Definition at line 329 of file CompositeCurve.cpp.
CompositeCurve * CompositeCurve::next | ( | const CompositePoint * | around_this | ) |
Definition at line 119 of file CompositeCurve.cpp.
{ return around == startPoint ? startNext : around == endPoint ? endNext : 0; }
CompositeCoEdge * CompositeCurve::next_coedge | ( | CompositeCoEdge * | after_this | ) | const [inline] |
Definition at line 254 of file CompositeCurve.hpp.
{ return !coedge ? firstCoEdge : coedge->myCurve == this ? coedge->nextOnCurve : 0; }
void CompositeCurve::notify_reversed | ( | TopologyBridge * | bridge | ) | [virtual] |
Implements TBOwner.
Definition at line 1168 of file CompositeCurve.cpp.
{ int index = compGeom->index_of(bridge); if( index >= 0 ) compGeom->reverse_sense(index); }
void CompositeCurve::notify_split | ( | TopologyBridge * | new_bridge, |
TopologyBridge * | split_from | ||
) | [virtual] |
Reimplemented from TBOwner.
Definition at line 1312 of file CompositeCurve.cpp.
{ Curve* old_curve = dynamic_cast<Curve*>(old_bridge); Curve* new_curve = dynamic_cast<Curve*>(new_bridge); assert( old_curve && new_curve && index_of(old_curve) >= 0 ); // get start and end points DLIList<TopologyBridge*> bridges; old_curve->get_children(bridges,true,old_curve->layer()); bridges.reset(); TBPoint* old_start = dynamic_cast<TBPoint*>(bridges.get()); TBPoint* old_end = dynamic_cast<TBPoint*>(bridges.next()); bridges.clean_out(); new_curve->get_children(bridges,true,new_curve->layer()); TBPoint* new_start = dynamic_cast<TBPoint*>(bridges.get()); TBPoint* new_end = dynamic_cast<TBPoint*>(bridges.next()); bridges.clean_out(); // find new point bool sp = (new_start == old_start || new_start == old_end); #ifndef NDEBUG bool ep = (new_end == old_start || new_end == old_end); assert( ep != sp ); // one must be true and one must be false #endif TBPoint* new_pt = sp ? new_start : new_end; // find relative sense of curves int old_index = index_of(old_curve); bool is_start = (old_start == new_pt); bool is_forward = (get_sense(old_index) == CUBIT_FORWARD); bool prepend = (is_start == is_forward); is_start = (new_start == new_pt); assert( is_start || new_pt == new_end ); bool reversed = (is_start == prepend); CompositePoint* new_cpt = new CompositePoint(new_pt); hidden_entities().hide(new_cpt); CubitSense new_sense = reversed ? CUBIT_REVERSED : CUBIT_FORWARD; int insert_index = old_index; if( !prepend ) insert_index++; if( ! compGeom->insert( insert_index, new_curve, new_sense ) ) { assert(0); delete new_cpt; return; } new_curve->owner(this); DLIList<CoEdgeSM*> new_coedges, old_coedges; bridges.clean_out(); new_curve->get_parents_virt( bridges ); CAST_LIST( bridges, new_coedges, CoEdgeSM ); assert(bridges.size() == new_coedges.size()); bridges.clean_out(); old_curve->get_parents_virt( bridges ); CAST_LIST( bridges, old_coedges, CoEdgeSM ); assert(bridges.size() == old_coedges.size()); for( CompositeCoEdge* coedge = first_coedge(); coedge; coedge = next_coedge(coedge) ) { // for each coedge of the old curve int i; CoEdgeSM* old_coedge = 0; for( i = 0; i < coedge->num_coedges(); i++ ) { old_coedge = coedge->get_coedge(i); if( old_coedges.is_in_list(old_coedge) ) break; } assert(i < coedge->num_coedges() && old_coedge); bridges.clean_out(); old_coedge->get_parents_virt(bridges); assert(bridges.size() == 1); LoopSM* loopsm = dynamic_cast<LoopSM*>(bridges.get()); assert(0 != loopsm); bridges.clean_out(); loopsm->get_children(bridges, true, old_curve->layer()); bridges.move_to(old_coedge); assert(bridges.get() == old_coedge); // Determine if new_coedge (the one we are looking for) // should occur before or after old_coedge in the loop. // If new_curve is after old_curve (old_end == new_pt), // then the we want the coedge after old_coedge iff the // sense of old_coedge is forward, otherwise the one before. // Invert that if new_curve is before old_curve (old_start // == new_pt). bool coe_reversed = (old_coedge->sense() == CUBIT_REVERSED); bool curve_prepend = (old_start == new_pt); bool previous = coe_reversed != curve_prepend; CoEdgeSM* new_coedge = dynamic_cast<CoEdgeSM*>(previous ? bridges.prev() : bridges.next()); assert(new_coedges.is_in_list(new_coedge)); CubitStatus s = coedge->insert_coedge(insert_index, new_coedge); assert(s); if (CUBIT_SUCCESS != s) { PRINT_ERROR("Failed to insert a new coedge.\n"); return; } } }
int CompositeCurve::num_curves | ( | ) | const [inline] |
Definition at line 235 of file CompositeCurve.hpp.
{ return compGeom->num_entities(); }
CompositeCurve& CompositeCurve::operator= | ( | const CompositeCurve & | ) | [private] |
Definition at line 194 of file CompositeCurve.cpp.
{ CompositePoint* sp = start_point(); CompositePoint* ep = end_point(); return (pt == sp) ? ep : (pt == ep) ? sp : 0; }
CubitPointContainment CompositeCurve::point_containment | ( | const CubitVector & | point | ) | [virtual] |
Implements Curve.
Definition at line 486 of file CompositeCurve.cpp.
{ int index; if (num_curves() == 0) return is_position_on(point) ? CUBIT_PNT_ON : CUBIT_PNT_OFF; for( index = 0; index < compGeom->num_entities(); index++ ) { if( get_curve(index)->point_containment( point ) == CUBIT_PNT_ON ) return CUBIT_PNT_ON; } return CUBIT_PNT_OFF; //not on any Curve }
CubitStatus CompositeCurve::position_from_u | ( | double | u_value, |
CubitVector & | pos | ||
) | [virtual] |
Implements Curve.
Definition at line 375 of file CompositeCurve.cpp.
{ int index; double ui; if (num_curves() == 0) // point curve return CUBIT_FAILURE; if( ! curve_param( u, ui, index ) || index < 0 ) return CUBIT_FAILURE; Curve* curve_ptr = get_curve( index ); return curve_ptr ? curve_ptr->position_from_u( ui, position ) : CUBIT_FAILURE; }
Definition at line 1243 of file CompositeCurve.cpp.
{ CompositeCurve* result = dynamic_cast<CompositeCurve*>(owner()); return result ? result : this; }
void CompositeCurve::print_debug_info | ( | const char * | prefix = 0 , |
bool | brief = false |
||
) | const |
Definition at line 1072 of file CompositeCurve.cpp.
{ if( prefix == 0 ) prefix = ""; if ( brief ) { #ifdef TOPOLOGY_BRIDGE_IDS PRINT_INFO("%sCompositeCurve %d : points (%d,%d) ", prefix, get_id(), startPoint ? startPoint->get_id() : -1, endPoint ? endPoint->get_id() : -1 ); if ( num_curves() == 1 ) PRINT_INFO(": %s %d\n", fix_type_name(typeid(*get_curve(0)).name()), get_curve(0)->get_id()); else PRINT_INFO(": %d curves.\n", num_curves() ); #else PRINT_INFO("%sCompositeCurve %p : points (%p,%p) ", prefix, (void*)this, (void*)startPoint, (void*)endPoint ); if ( num_curves() == 1 ) PRINT_INFO(": %s %p\n", fix_type_name(typeid(*get_curve(0)).name()), (void*)get_curve(0)); else PRINT_INFO(": %d curves.\n", num_curves() ); #endif return; } char* new_prefix = new char[strlen(prefix)+3]; strcpy( new_prefix, prefix ); strcat( new_prefix, " "); #ifdef TOPOLOGY_BRIDGE_IDS PRINT_INFO("%sCompositeCurve %d\n", prefix, get_id() ); #else PRINT_INFO("%sCompositeCurve %p\n", prefix, (void*)this ); #endif compGeom->print_debug_info( new_prefix ); if( hiddenSet ) hiddenSet->print_debug_info( new_prefix ); else PRINT_INFO("%s No Hidden Entities.\n", prefix ); CompositeCoEdge* coedge = first_coedge(); DLIList<TopologyBridge*> loops(1), surface_list(1); while( coedge ) { TopologyBridge* surf_ptr = 0; loops.clean_out(); surface_list.clean_out(); coedge->get_parents_virt(loops); if ( loops.size() == 1 ) { loops.get()->get_parents_virt(surface_list); if( surface_list.size() == 1 ) surf_ptr = surface_list.get(); } #ifdef TOPOLOGY_BRIDGE_IDS PRINT_INFO("%s %s on Surface %d\n", prefix, coedge->sense() == CUBIT_FORWARD ? "FORWARD" : coedge->sense() == CUBIT_REVERSED ? "REVERSE" : "UNKNOWN", surf_ptr->get_id() ); #else PRINT_INFO("%s %s on Surface %p\n", prefix, coedge->sense() == CUBIT_FORWARD ? "FORWARD" : coedge->sense() == CUBIT_REVERSED ? "REVERSE" : "UNKNOWN", (void*)surf_ptr ); #endif if (!coedge->get_loop()) coedge->print_debug_info( new_prefix, true ); coedge = next_coedge(coedge); } if ( !start_point() ) PRINT_INFO("%s NULL START POINT\n", prefix ); else start_point()->print_debug_info( new_prefix, true ); if ( !end_point() ) PRINT_INFO("%s NULL END POINT\n", prefix ); else if ( end_point() == start_point() ) PRINT_INFO("%s end point SAME as start point\n", prefix ); else end_point()->print_debug_info( new_prefix, true ); delete [] new_prefix; }
void CompositeCurve::read_attributes | ( | ) |
Definition at line 1047 of file CompositeCurve.cpp.
{ if (num_curves()) // not a point-curve { compGeom->read_attributes(); } else { CompositePoint* point = start_point(); assert(point == end_point()); compGeom->read_attributes(point); } }
CubitStatus CompositeCurve::remove | ( | CompositeCoEdge * | coedge | ) |
Definition at line 297 of file CompositeCurve.cpp.
{ if( coedge->myCurve != this ) return CUBIT_FAILURE; if( coedge == firstCoEdge ) { firstCoEdge = coedge->nextOnCurve; } else { CompositeCoEdge *prev = firstCoEdge, *next = firstCoEdge->nextOnCurve; while( next != coedge ) { assert(next != NULL); prev = next; next = next->nextOnCurve; } prev->nextOnCurve = next->nextOnCurve; } coedge->nextOnCurve = 0; coedge->myCurve = 0; return CUBIT_SUCCESS; }
void CompositeCurve::remove_all_simple_attribute_virt | ( | ) | [virtual] |
Implements TopologyBridge.
Definition at line 959 of file CompositeCurve.cpp.
{ if(compGeom) compGeom->rem_all_attributes( ); }
CubitStatus CompositeCurve::remove_bridge | ( | TopologyBridge * | bridge | ) | [virtual] |
Implements TBOwner.
Definition at line 847 of file CompositeCurve.cpp.
{ int i = compGeom->index_of(bridge); if ( i >= 0 ) { bridge->owner(0); if ( !compGeom->remove(i,true) ) return CUBIT_FAILURE; if (compGeom->num_entities() == 0) CompositeEngine::instance().notify_deactivated(this); HadBridgeRemoved = 1; return CUBIT_SUCCESS; } else { for (CompositeCurve* ptr = this; ptr->stitchNext; ptr = ptr->stitchNext) { if (ptr->stitchNext == bridge) { ptr->stitchNext = ((CompositeCurve*)bridge)->stitchNext; HadBridgeRemoved = 1; return CUBIT_SUCCESS; } } } return CUBIT_FAILURE; }
Curve * CompositeCurve::remove_curve | ( | int | index | ) |
void CompositeCurve::remove_simple_attribute_virt | ( | const CubitSimpleAttrib & | csa | ) | [virtual] |
Implements TopologyBridge.
Definition at line 942 of file CompositeCurve.cpp.
{ if(compGeom) compGeom->rem_attribute( simple_attrib_ptr ); }
void CompositeCurve::reverse | ( | ) |
Definition at line 252 of file CompositeCurve.cpp.
CubitStatus CompositeCurve::set_point | ( | bool | set_start_point, |
CompositePoint * | point | ||
) | [protected] |
Definition at line 135 of file CompositeCurve.cpp.
{ CompositePoint*& my_point = start ? startPoint : endPoint; CompositeCurve*& next_crv = start ? startNext : endNext; if( pt == my_point ) return CUBIT_SUCCESS; if( my_point && startPoint != endPoint ) { CompositeCurve* prev = my_point->firstCurve; assert( prev != NULL ); if( prev == this ) { my_point->firstCurve = next_crv; } else { CompositeCurve* curve = prev->next(my_point); while( curve != this ) { prev = curve; curve = prev->next(my_point); } if( prev->startPoint == my_point ) { assert(prev->startNext == this); prev->startNext = next_crv; } if( prev->endPoint == my_point ) { assert(prev->endNext == this); prev->endNext = next_crv; } } } my_point = pt; if (!pt) { next_crv = 0; } else if (startPoint == endPoint) { next_crv = start ? endNext : startNext; } else { next_crv = pt->firstCurve; pt->firstCurve = this; } return CUBIT_SUCCESS; }
CompositeCurve * CompositeCurve::split | ( | Curve * | curve_ptr | ) |
Definition at line 201 of file CompositeCurve.cpp.
{ int index = index_of( curve ); if( (index < 0) || (index == (num_curves()-1)) ) return 0; CompositeGeom* new_geom = compGeom->split( index ); if( !new_geom ) return 0; for( int i = 0; i < new_geom->num_entities(); i++ ) new_geom->entity(i)->owner( 0 ); return new CompositeCurve( new_geom ); }
double CompositeCurve::start_param | ( | ) | [virtual] |
CompositePoint * CompositeCurve::start_point | ( | ) | const [inline] |
Definition at line 257 of file CompositeCurve.hpp.
{ return startPoint; }
Definition at line 125 of file CompositeCurve.cpp.
{ return set_point( true, pt ); }
CubitStatus CompositeCurve::stitch | ( | CompositeCurve * | merge_with | ) |
Definition at line 1184 of file CompositeCurve.cpp.
{ // check to make sure end points are already stitched. bool reversed; if( dead->start_point() == this->start_point() ) reversed = false; else if( dead->end_point() == this->start_point() ) reversed = true; else return CUBIT_FAILURE; if( ( reversed && (dead->start_point() != this->end_point())) || (!reversed && (dead->end_point() != this->end_point())) ) return CUBIT_FAILURE; // shouldn't be merging hidden curves if( dynamic_cast<CompositeCurve*>(this->owner()) || dynamic_cast<CompositeCurve*>(dead->owner()) ) { assert(0); return CUBIT_FAILURE; } // DAG / next level up should already be merged if( dead->owner() != this->owner() ) { assert(0); return CUBIT_FAILURE; } // update owner if( dead->owner() ) dead->owner()->notify_merged( dead, this ); assert( !dead->owner() ); dead->owner( this ); // merge lists CompositeCurve* end = dead; while (end->stitchNext) { end->stitchNext->owner( this ); end = end->stitchNext; } end->stitchNext = stitchNext; stitchNext = end; return CUBIT_SUCCESS; }
CubitStatus CompositeCurve::swap_bridge | ( | TopologyBridge * | old, |
TopologyBridge * | neww, | ||
bool | reversed | ||
) | [virtual] |
Implements TBOwner.
Definition at line 888 of file CompositeCurve.cpp.
{ int i = compGeom->index_of(o); GeometryEntity* ge = dynamic_cast<GeometryEntity*>(n); if( i >= 0 && ge != 0 ) { o->owner(0); n->owner(this); if ( ! compGeom->swap( i, ge ) ) return CUBIT_FAILURE; if (reversed) compGeom->reverse_sense(i); return CUBIT_SUCCESS; } else return CUBIT_FAILURE; }
double CompositeCurve::u_from_arc_length | ( | double | root_param, |
double | arc_length | ||
) | [virtual] |
double CompositeCurve::u_from_position | ( | const CubitVector & | input_position | ) | [virtual] |
Implements Curve.
Definition at line 390 of file CompositeCurve.cpp.
{ if (num_curves() == 0) // point curve return 0.0; int index = closest_curve(position ); double param = get_curve( index )->u_from_position( position ); return composite_param( index, param ); }
void CompositeCurve::unstitch_all | ( | ) |
Definition at line 1288 of file CompositeCurve.cpp.
{ // should only call on visible curve assert (this == primary_stitched_curve()); while (stitchNext) { stitchNext->owner(0); if (owner()) owner()->notify_copied( stitchNext, this ); stitchNext = stitchNext->stitchNext; } }
void CompositeCurve::update | ( | ) | [inline] |
Definition at line 241 of file CompositeCurve.hpp.
{ compGeom->update_cached_data();}
void CompositeCurve::write_attributes | ( | ) |
Definition at line 1024 of file CompositeCurve.cpp.
{ if (num_curves()) // not a point-curve { compGeom->write_attributes(); } else { CompositePoint* point = start_point(); assert(point == end_point()); compGeom->write_attributes(point); } }
CompositeGeom* CompositeCurve::compGeom [private] |
Definition at line 214 of file CompositeCurve.hpp.
CompositeCurve* CompositeCurve::endNext [private] |
Definition at line 224 of file CompositeCurve.hpp.
CompositePoint* CompositeCurve::endPoint [private] |
Definition at line 221 of file CompositeCurve.hpp.
CompositeCoEdge* CompositeCurve::firstCoEdge [private] |
Definition at line 218 of file CompositeCurve.hpp.
Definition at line 31 of file CompositeCurve.hpp.
HiddenEntitySet* CompositeCurve::hiddenSet [private] |
Definition at line 216 of file CompositeCurve.hpp.
CompositeCurve* CompositeCurve::startNext [private] |
Definition at line 223 of file CompositeCurve.hpp.
CompositePoint* CompositeCurve::startPoint [private] |
Definition at line 220 of file CompositeCurve.hpp.
CompositeCurve* CompositeCurve::stitchNext [private] |
Definition at line 226 of file CompositeCurve.hpp.