STEPcomplex * Geometric_Context( Registry * registry, InstMgr * instance_list, const LenEnum & len, const AngEnum & angle, const char * tolstr ) { int instance_cnt = 0; STEPattribute * attr; STEPcomplex * stepcomplex; SdaiDimensional_exponents * dimensional_exp = new SdaiDimensional_exponents(); dimensional_exp->length_exponent_( 0.0 ); dimensional_exp->mass_exponent_( 0.0 ); dimensional_exp->time_exponent_( 0.0 ); dimensional_exp->electric_current_exponent_( 0.0 ); dimensional_exp->thermodynamic_temperature_exponent_( 0.0 ); dimensional_exp->amount_of_substance_exponent_( 0.0 ); dimensional_exp->luminous_intensity_exponent_( 0.0 ); instance_list->Append( ( SDAI_Application_instance * ) dimensional_exp, completeSE ); instance_cnt++; STEPcomplex * ua_length; // First set up metric units if appropriate. Default to mm. // If imperial units, set up mm to be used as base to define imperial units. Si_prefix pfx = Si_prefix__milli; switch( len ) { case CM: pfx = Si_prefix__centi; break; case M: pfx = Si_prefix_unset; break; } const char * ua_length_types[4] = { "length_unit", "named_unit", "si_unit", "*" }; ua_length = new STEPcomplex( registry, ( const char ** ) ua_length_types, instance_cnt ); stepcomplex = ua_length->head; while( stepcomplex ) { if( !strcmp( stepcomplex->EntityName(), "Si_Unit" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "prefix" ) ) { attr->Enum( new SdaiSi_prefix_var( pfx ) ); } if( !strcmp( attr->Name(), "name" ) ) { attr->Enum( new SdaiSi_unit_name_var( Si_unit_name__metre ) ); } } } stepcomplex = stepcomplex->sc; } instance_list->Append( ( SDAI_Application_instance * ) ua_length, completeSE ); instance_cnt++; // If imperial, create conversion based unit. if( len >= IN ) { STEPcomplex * len_mm = ua_length; char lenname[10]; double lenconv; switch( len ) { case IN: strcat( lenname, "'INCH'\0" ); lenconv = 25.4; break; case FT: strcat( lenname, "'FOOT'\0" ); lenconv = 25.4 * 12.0; break; case YD: strcat( lenname, "'YARD'\0" ); lenconv = 25.4 * 36.0; break; } SdaiUnit * len_unit = new SdaiUnit( ( SdaiNamed_unit * ) len_mm ); SdaiMeasure_value * len_measure_value = new SdaiMeasure_value( lenconv, config_control_design::t_measure_value ); len_measure_value->SetUnderlyingType( config_control_design::t_length_measure ); SdaiLength_measure_with_unit * len_measure_with_unit = new SdaiLength_measure_with_unit(); len_measure_with_unit->value_component_( len_measure_value ); len_measure_with_unit->unit_component_( len_unit ); instance_list->Append( ( SDAI_Application_instance * ) len_measure_with_unit, completeSE ); instance_cnt++; SdaiDimensional_exponents * dimensional_exp_len = new SdaiDimensional_exponents(); dimensional_exp_len->length_exponent_( 1.0 ); dimensional_exp_len->mass_exponent_( 0.0 ); dimensional_exp_len->time_exponent_( 0.0 ); dimensional_exp_len->electric_current_exponent_( 0.0 ); dimensional_exp_len->thermodynamic_temperature_exponent_( 0.0 ); dimensional_exp_len->amount_of_substance_exponent_( 0.0 ); dimensional_exp_len->luminous_intensity_exponent_( 0.0 ); instance_list->Append( ( SDAI_Application_instance * ) dimensional_exp_len, completeSE ); instance_cnt++; const char * ua_conv_len_types[4] = { "conversion_based_unit", "named_unit", "length_unit", "*" }; ua_length = new STEPcomplex( registry, ( const char ** ) ua_conv_len_types, instance_cnt ); stepcomplex = ua_length->head; while( stepcomplex ) { if( !strcmp( stepcomplex->EntityName(), "Conversion_Based_Unit" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "name" ) ) { attr->StrToVal( lenname ); } if( !strcmp( attr->Name(), "conversion_factor" ) ) { attr->Entity( ( STEPentity * )( len_measure_with_unit ) ); } } } if( !strcmp( stepcomplex->EntityName(), "Named_Unit" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "dimensions" ) ) { attr->Entity( ( STEPentity * )( dimensional_exp_len ) ); } } } stepcomplex = stepcomplex->sc; } instance_list->Append( ( SDAI_Application_instance * ) ua_length, completeSE ); instance_cnt++; } SdaiUncertainty_measure_with_unit * uncertainty = ( SdaiUncertainty_measure_with_unit * )registry->ObjCreate( "UNCERTAINTY_MEASURE_WITH_UNIT" ); uncertainty->name_( "'DISTANCE_ACCURACY_VALUE'" ); uncertainty->description_( "'Threshold below which geometry imperfections (such as overlaps) are not considered errors.'" ); SdaiUnit * tol_unit = new SdaiUnit( ( SdaiNamed_unit * ) ua_length ); uncertainty->ResetAttributes(); { while( ( attr = uncertainty->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "unit_component" ) ) { attr->Select( tol_unit ); } if( !strcmp( attr->Name(), "value_component" ) ) { attr->StrToVal( tolstr ); } } } instance_list->Append( ( SDAI_Application_instance * ) uncertainty, completeSE ); instance_cnt++; // First set up radians as base angle unit. const char * ua_plane_angle_types[4] = { "named_unit", "plane_angle_unit", "si_unit", "*" }; STEPcomplex * ua_plane_angle = new STEPcomplex( registry, ( const char ** ) ua_plane_angle_types, instance_cnt ); stepcomplex = ua_plane_angle->head; while( stepcomplex ) { if( !strcmp( stepcomplex->EntityName(), "Si_Unit" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "name" ) ) { attr->Enum( new SdaiSi_unit_name_var( Si_unit_name__radian ) ); } } } stepcomplex = stepcomplex->sc; } instance_list->Append( ( SDAI_Application_instance * ) ua_plane_angle, completeSE ); instance_cnt++; // If degrees, create conversion based unit. if( angle == DEG ) { STEPcomplex * ang_rad = ua_plane_angle; const double angconv = ( 3.14159265358979323846264338327950 / 180.0 ); SdaiUnit * p_ang_unit = new SdaiUnit( ( SdaiNamed_unit * ) ang_rad ); SdaiMeasure_value * p_ang_measure_value = new SdaiMeasure_value( angconv, config_control_design::t_measure_value ); p_ang_measure_value->SetUnderlyingType( config_control_design::t_plane_angle_measure ); SdaiPlane_angle_measure_with_unit * p_ang_measure_with_unit = new SdaiPlane_angle_measure_with_unit(); p_ang_measure_with_unit->value_component_( p_ang_measure_value ); p_ang_measure_with_unit->unit_component_( p_ang_unit ); instance_list->Append( ( SDAI_Application_instance * ) p_ang_measure_with_unit, completeSE ); instance_cnt++; const char * ua_conv_angle_types[4] = { "conversion_based_unit", "named_unit", "plane_angle_unit", "*" }; ua_plane_angle = new STEPcomplex( registry, ( const char ** ) ua_conv_angle_types, instance_cnt ); stepcomplex = ua_plane_angle->head; while( stepcomplex ) { if( !strcmp( stepcomplex->EntityName(), "Conversion_Based_Unit" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "name" ) ) { attr->StrToVal( "'DEGREES'" ); } if( !strcmp( attr->Name(), "conversion_factor" ) ) { attr->Entity( ( STEPentity * )( p_ang_measure_with_unit ) ); } } } if( !strcmp( stepcomplex->EntityName(), "Named_Unit" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "dimensions" ) ) { attr->Entity( ( STEPentity * )( dimensional_exp ) ); } } } stepcomplex = stepcomplex->sc; } instance_list->Append( ( SDAI_Application_instance * ) ua_plane_angle, completeSE ); instance_cnt++; } const char * ua_solid_angle_types[4] = { "named_unit", "si_unit", "solid_angle_unit", "*" }; STEPcomplex * ua_solid_angle = new STEPcomplex( registry, ( const char ** ) ua_solid_angle_types, instance_cnt ); stepcomplex = ua_solid_angle->head; while( stepcomplex ) { if( !strcmp( stepcomplex->EntityName(), "Si_Unit" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "name" ) ) { attr->Enum( new SdaiSi_unit_name_var( Si_unit_name__steradian ) ); } } } stepcomplex = stepcomplex->sc; } instance_list->Append( ( SDAI_Application_instance * ) ua_solid_angle, completeSE ); instance_cnt++; // All units set up, stored in: ua_length, ua_plane_angle, ua_solid_angle const char * entNmArr[5] = { "geometric_representation_context", "global_uncertainty_assigned_context", "global_unit_assigned_context", "representation_context", "*" }; STEPcomplex * complex_entity = new STEPcomplex( registry, ( const char ** ) entNmArr, instance_cnt ); stepcomplex = complex_entity->head; while( stepcomplex ) { if( !strcmp( stepcomplex->EntityName(), "Geometric_Representation_Context" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "coordinate_space_dimension" ) ) { attr->StrToVal( "3" ); } } } if( !strcmp( stepcomplex->EntityName(), "Global_Uncertainty_Assigned_Context" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "uncertainty" ) ) { EntityAggregate * unc_agg = new EntityAggregate(); unc_agg->AddNode( new EntityNode( ( SDAI_Application_instance * ) uncertainty ) ); attr->Aggregate( unc_agg ); } } } if( !strcmp( stepcomplex->EntityName(), "Global_Unit_Assigned_Context" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { std::string attrval; if( !strcmp( attr->Name(), "units" ) ) { EntityAggregate * unit_assigned_agg = new EntityAggregate(); unit_assigned_agg->AddNode( new EntityNode( ( SDAI_Application_instance * ) ua_length ) ); unit_assigned_agg->AddNode( new EntityNode( ( SDAI_Application_instance * ) ua_plane_angle ) ); unit_assigned_agg->AddNode( new EntityNode( ( SDAI_Application_instance * ) ua_solid_angle ) ); attr->Aggregate( unit_assigned_agg ); } } } if( !strcmp( stepcomplex->EntityName(), "Representation_Context" ) ) { stepcomplex->ResetAttributes(); while( ( attr = stepcomplex->NextAttribute() ) != NULL ) { if( !strcmp( attr->Name(), "context_identifier" ) ) { attr->StrToVal( "'STANDARD'" ); } if( !strcmp( attr->Name(), "context_type" ) ) { attr->StrToVal( "'3D'" ); } } } stepcomplex = stepcomplex->sc; } instance_list->Append( ( SDAI_Application_instance * ) complex_entity, completeSE ); instance_cnt++; return complex_entity; }