Source : ISO 10303-47
SCHEMA shape_tolerance_schema;
REFERENCE FROM
basic_attribute_schema -- ISO 10303-41
(get_id_value,
id_attribute,
id_attribute_select);
REFERENCE FROM
measure_schema -- ISO 10303-41
(derive_dimensional_exponents,
dimensional_exponents,
length_measure_with_unit,
measure_with_unit,
measure_value,
plane_angle_measure_with_unit);
REFERENCE FROM
product_property_definition_schema -- ISO 10303-41
(product_definition_shape,
shape_aspect,
shape_aspect_relationship);
REFERENCE FROM
product_property_representation_schema -- ISO 10303-41
(item_identified_representation_usage_definition);
REFERENCE FROM
qualified_measure_schema -- ISO 10303-45
(measure_representation_item);
REFERENCE FROM
representation_schema -- ISO 10303-43
(representation);
REFERENCE FROM
shape_aspect_definition_schema -- ISO 10303-47
(datum_reference,
datum_system,
limit_condition,
general_datum_reference);
REFERENCE FROM
shape_dimension_schema -- ISO 10303-47
(dimensional_characteristic,
dimensional_location,
dimensional_size);
REFERENCE FROM
support_resource_schema -- ISO 10303-41
(bag_to_set,
identifier,
label,
text,
type_check_function);
TYPE area_unit_type =
EXTENSIBLE
ENUMERATION
OF
(circular,
square,
rectangular,
cylindrical,
spherical);
END_TYPE;
TYPE datum_system_or_reference =
SELECT
(datum_reference,
datum_system);
END_TYPE;
TYPE directed_tolerance_zone_type =
ENUMERATION
OF
(perpendicular,
parallel,
including);
END_TYPE;
TYPE geometric_tolerance_auxiliary_classification_enum =
ENUMERATION
OF
(all_over,
unless_otherwise_specified);
END_TYPE;
TYPE geometric_tolerance_modifier =
EXTENSIBLE
ENUMERATION
OF
(circle_a,
maximum_material_requirement,
least_material_requirement,
reciprocity_requirement,
any_cross_section,
free_state,
common_zone,
minor_diameter,
major_diameter,
pitch_diameter,
line_element,
not_convex,
statistical_tolerance,
tangent_plane,
each_radial_element,
separate_requirement,
united_feature,
associated_minmax_feature,
associated_least_square_feature,
associated_minimum_inscribed_feature,
associated_tangent_feature,
associated_maximum_inscribed_feature,
reference_minimax_feature_without_constraint,
reference_minimax_feature_with_external_material_constraint,
reference_minimax_feature_with_internal_material_constraint,
reference_least_square_feature_without_constraint,
reference_least_square_feature_with_external_material_constraint,
reference_least_square_feature_with_internal_material_constraint,
reference_minimum_circumscribed_feature,
reference_maximum_inscribed_feature,
total_range_deviations,
peak_height,
valley_depth,
standard_deviation);
END_TYPE;
TYPE geometric_tolerance_target =
SELECT
(dimensional_location,
dimensional_size,
product_definition_shape,
shape_aspect);
END_TYPE;
TYPE gps_filtration_specification_target =
EXTENSIBLE
GENERIC_ENTITY
SELECT
(geometric_tolerance);
END_TYPE;
TYPE gps_filtration_type =
EXTENSIBLE
SELECT
(geometric_tolerance_modifier);
END_TYPE;
TYPE length_or_plane_angle_measure_with_unit_select =
SELECT
(length_measure_with_unit,
plane_angle_measure_with_unit);
END_TYPE;
TYPE oriented_tolerance_zone_type =
ENUMERATION
OF
(perpendicular,
parallel,
angular);
END_TYPE;
TYPE shape_tolerance_select =
SELECT
(geometric_tolerance,
plus_minus_tolerance);
END_TYPE;
TYPE st_id_attribute_select =
SELECT
BASED_ON
id_attribute_select
WITH
(geometric_tolerance);
END_TYPE;
TYPE sts_item_identified_representation_usage_definition =
EXTENSIBLE
GENERIC_ENTITY
SELECT
BASED_ON
item_identified_representation_usage_definition
WITH
(geometric_tolerance);
END_TYPE;
TYPE tolerance_method_definition =
SELECT
(limits_and_fits,
tolerance_value);
END_TYPE;
TYPE tolerance_zone_target =
SELECT
(dimensional_location,
dimensional_size,
geometric_tolerance,
general_datum_reference);
END_TYPE;
ENTITY angularity_tolerance
SUBTYPE OF (geometric_tolerance_with_datum_reference);
END_ENTITY;
ENTITY circular_runout_tolerance
SUBTYPE OF (geometric_tolerance_with_datum_reference);
END_ENTITY;
ENTITY coaxiality_tolerance
SUBTYPE OF (geometric_tolerance_with_datum_reference);
END_ENTITY;
ENTITY concentricity_tolerance
SUBTYPE OF (geometric_tolerance_with_datum_reference);
END_ENTITY;
ENTITY cylindricity_tolerance
SUBTYPE OF (geometric_tolerance);
WHERE
WR1: NOT ('SHAPE_TOLERANCE_SCHEMA.' + 'GEOMETRIC_TOLERANCE_WITH_DATUM_REFERENCE' IN TYPEOF (SELF));
END_ENTITY;
ENTITY dimension_related_tolerance_zone_element;
related_dimension : dimensional_location;
related_element : tolerance_zone_definition;
END_ENTITY;
ENTITY directed_tolerance_zone
SUBTYPE OF (tolerance_zone_with_datum);
direction : directed_tolerance_zone_type;
END_ENTITY;
ENTITY flatness_tolerance
SUBTYPE OF (geometric_tolerance);
WHERE
WR1: NOT ('SHAPE_TOLERANCE_SCHEMA.' + 'GEOMETRIC_TOLERANCE_WITH_DATUM_REFERENCE' IN TYPEOF (SELF));
END_ENTITY;
ENTITY geometric_tolerance
ABSTRACT SUPERTYPE
OF (geometric_tolerance_with_datum_reference
ANDOR geometric_tolerance_with_defined_unit
ANDOR ONEOF (geometric_tolerance_with_modifiers,
modified_geometric_tolerance)
ANDOR unequally_disposed_geometric_tolerance
ANDOR ONEOF (cylindricity_tolerance,
flatness_tolerance,
line_profile_tolerance,
position_tolerance,
roundness_tolerance,
straightness_tolerance,
surface_profile_tolerance));
name : label;
description :
OPTIONAL
text;
magnitude :
OPTIONAL
length_measure_with_unit;
toleranced_shape_aspect : geometric_tolerance_target;
DERIVE
controlling_shape : product_definition_shape := sts_get_product_definition_shape(toleranced_shape_aspect);
id : identifier := get_id_value(SELF);
INVERSE
auxiliary_classification : SET[0:?] OF geometric_tolerance_auxiliary_classification FOR described_item;
tolerance_relationship : SET[0:?] OF geometric_tolerance_relationship FOR relating_geometric_tolerance;
UNIQUE
UR1: id, controlling_shape;
WHERE
WR1: magnitude\measure_with_unit.value_component >= 0.0;
WR2: EXISTS(controlling_shape);
WR3: NOT ('PRODUCT_PROPERTY_DEFINITION_SCHEMA.SHAPE_ASPECT_RELATIONSHIP' IN TYPEOF(toleranced_shape_aspect))
OR (toleranced_shape_aspect\shape_aspect_relationship.relating_shape_aspect.of_shape :=:
toleranced_shape_aspect\shape_aspect_relationship.related_shape_aspect.of_shape);
WR4: SIZEOF(USEDIN(SELF, 'BASIC_ATTRIBUTE_SCHEMA.' + 'ID_ATTRIBUTE.IDENTIFIED_ITEM')) <= 1;
WR5: SIZEOF(QUERY( tr <* tolerance_relationship | tr.name = 'composite tolerance')) <= 1;
END_ENTITY;
ENTITY geometric_tolerance_auxiliary_classification;
attribute_value : geometric_tolerance_auxiliary_classification_enum;
described_item : geometric_tolerance;
END_ENTITY;
ENTITY geometric_tolerance_relationship;
name : label;
description : text;
relating_geometric_tolerance : geometric_tolerance;
related_geometric_tolerance : geometric_tolerance;
WHERE
WR1: NOT(name = 'composite tolerance') OR
(('SHAPE_TOLERANCE_SCHEMA.POSITION_TOLERANCE' IN TYPEOF(relating_geometric_tolerance)) AND
('SHAPE_TOLERANCE_SCHEMA.POSITION_TOLERANCE' IN TYPEOF(related_geometric_tolerance))) OR
(('SHAPE_TOLERANCE_SCHEMA.LINE_PROFILE_TOLERANCE' IN TYPEOF(relating_geometric_tolerance)) AND
('SHAPE_TOLERANCE_SCHEMA.LINE_PROFILE_TOLERANCE' IN TYPEOF(related_geometric_tolerance))) OR
(('SHAPE_TOLERANCE_SCHEMA.SURFACE_PROFILE_TOLERANCE' IN TYPEOF(relating_geometric_tolerance)) AND
('SHAPE_TOLERANCE_SCHEMA.SURFACE_PROFILE_TOLERANCE' IN TYPEOF(related_geometric_tolerance)));
WR2: NOT(name = 'composite tolerance') OR
(relating_geometric_tolerance\geometric_tolerance.toleranced_shape_aspect :=:
related_geometric_tolerance\geometric_tolerance.toleranced_shape_aspect);
WR3: acyclic_geometric_tolerance_relationship(SELF, [related_geometric_tolerance],
'SHAPE_TOLERANCE_SCHEMA.GEOMETRIC_TOLERANCE');
END_ENTITY;
ENTITY geometric_tolerance_with_datum_reference
SUPERTYPE OF
(ONEOF (angularity_tolerance,
circular_runout_tolerance,
coaxiality_tolerance,
concentricity_tolerance,
parallelism_tolerance,
perpendicularity_tolerance,
symmetry_tolerance,
total_runout_tolerance))
SUBTYPE OF (geometric_tolerance);
datum_system : SET[1:?] OF datum_system_or_reference;
WHERE
WR1: (SIZEOF(QUERY(ds <* datum_system | 'SHAPE_TOLERANCE_SCHEMA.' + 'DATUM_SYSTEM' in TYPEOF(ds)))=0) OR (SIZEOF(datum_system)=1);
END_ENTITY;
ENTITY geometric_tolerance_with_defined_area_unit
SUBTYPE OF (geometric_tolerance_with_defined_unit);
area_type : area_unit_type;
second_unit_size :
OPTIONAL
length_or_plane_angle_measure_with_unit_select;
WHERE
WR1: NOT (EXISTS(second_unit_size) XOR (area_type IN [area_unit_type.rectangular, area_unit_type.cylindrical, area_unit_type.spherical]));
WR2: NOT(area_type = area_unit_type.cylindrical)
OR ('MEASURE_SCHEMA.LENGTH_MEASURE_WITH_UNIT' IN TYPEOF(unit_size))
AND ('MEASURE_SCHEMA.PLANE_ANGLE_MEASURE_WITH_UNIT' IN TYPEOF(second_unit_size));
WR3: NOT (area_type = area_unit_type.rectangular)
OR ('MEASURE_SCHEMA.LENGTH_MEASURE_WITH_UNIT' IN TYPEOF(unit_size))
AND ('MEASURE_SCHEMA.LENGTH_MEASURE_WITH_UNIT' IN TYPEOF(second_unit_size));
WR4: NOT(area_type = area_unit_type.spherical)
OR ('MEASURE_SCHEMA.PLANE_ANGLE_MEASURE_WITH_UNIT' IN TYPEOF(unit_size))
AND ('MEASURE_SCHEMA.PLANE_ANGLE_MEASURE_WITH_UNIT' IN TYPEOF(second_unit_size));
WR5: NOT(area_type = area_unit_type.spherical)
OR (SIZEOF(QUERY (tz <* USEDIN(SELF,'SHAPE_TOLERANCE_SCHEMA.TOLERANCE_ZONE.DEFINING_TOLERANCE') |
('SHAPE_TOLERANCE_SCHEMA.ORIENTED_TOLERANCE_ZONE' IN TYPEOF(tz))
)) <> 0 );
END_ENTITY;
ENTITY geometric_tolerance_with_defined_unit
SUBTYPE OF (geometric_tolerance);
unit_size : length_or_plane_angle_measure_with_unit_select;
WHERE
WR1: ('NUMBER' IN TYPEOF (unit_size\measure_with_unit.value_component)) AND (unit_size\measure_with_unit.value_component >
0.0);
END_ENTITY;
ENTITY geometric_tolerance_with_maximum_tolerance
SUBTYPE OF (geometric_tolerance_with_modifiers);
maximum_upper_tolerance : length_measure_with_unit;
WHERE
WR1: (geometric_tolerance_modifier.maximum_material_requirement IN SELF\geometric_tolerance_with_modifiers.modifiers) OR (geometric_tolerance_modifier.least_material_requirement
IN SELF\geometric_tolerance_with_modifiers.modifiers);
WR2: (maximum_upper_tolerance\measure_with_unit.unit_component = SELF\geometric_tolerance.magnitude\measure_with_unit.unit_component)
AND (maximum_upper_tolerance\measure_with_unit.value_component > SELF\geometric_tolerance.magnitude\measure_with_unit.value_component);
END_ENTITY;
ENTITY geometric_tolerance_with_modifiers
SUBTYPE OF (geometric_tolerance);
modifiers : SET[1:?] OF geometric_tolerance_modifier;
WHERE
WR1: NOT (geometric_tolerance_modifier.circle_a IN modifiers) OR
(('PRODUCT_PROPERTY_DEFINITION_SCHEMA.SHAPE_ASPECT' IN
TYPEOF(SELF\geometric_tolerance.toleranced_shape_aspect)) AND
(SELF\geometric_tolerance.toleranced_shape_aspect\shape_aspect.product_definitional =
TRUE) OR
('SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE' IN
TYPEOF(SELF\geometric_tolerance.toleranced_shape_aspect)));
END_ENTITY;
ENTITY gps_filter;
filter_type : gps_filtration_type;
filter_data : LIST[1:?] OF measure_with_unit;
INVERSE
owner : gps_filtration_specification FOR filter_data;
WHERE
WR1: NOT ('SHAPE_TOLERANCE_SCHEMA.GEOMETRIC_TOLERANCE_WITH_MODIFIERS' IN TYPEOF(owner\gps_filtration_specification.base_target))
OR
(SIZEOF([
geometric_tolerance_modifier.reference_minimax_feature_without_constraint,
geometric_tolerance_modifier.reference_minimax_feature_with_external_material_constraint,
geometric_tolerance_modifier.reference_minimax_feature_with_internal_material_constraint,
geometric_tolerance_modifier.reference_least_square_feature_without_constraint,
geometric_tolerance_modifier.reference_least_square_feature_with_external_material_constraint,
geometric_tolerance_modifier.reference_least_square_feature_with_internal_material_constraint,
geometric_tolerance_modifier.reference_minimum_circumscribed_feature,
geometric_tolerance_modifier.reference_maximum_inscribed_feature,
geometric_tolerance_modifier.total_range_deviations,
geometric_tolerance_modifier.peak_height,
geometric_tolerance_modifier.valley_depth,
geometric_tolerance_modifier.standard_deviation ] *
owner\gps_filtration_specification.base_target\geometric_tolerance_with_modifiers.modifiers) <> 0 );
END_ENTITY;
ENTITY gps_filtration_specification;
base_target : gps_filtration_specification_target;
filter_data : LIST[1:?] OF gps_filter;
END_ENTITY;
ENTITY limits_and_fits;
form_variance : label;
zone_variance : label;
grade : label;
source : text;
END_ENTITY;
ENTITY line_profile_tolerance
SUBTYPE OF (geometric_tolerance);
END_ENTITY;
ENTITY modified_geometric_tolerance
SUBTYPE OF (geometric_tolerance);
modifier : limit_condition;
END_ENTITY;
ENTITY non_uniform_zone_definition
SUBTYPE OF (tolerance_zone_definition);
END_ENTITY;
ENTITY oriented_tolerance_zone
SUBTYPE OF (tolerance_zone_with_datum);
orientation : oriented_tolerance_zone_type;
angle :
OPTIONAL
plane_angle_measure_with_unit;
WHERE
WR1: (orientation <> oriented_tolerance_zone_type.angular) XOR EXISTS(angle);
END_ENTITY;
ENTITY parallelism_tolerance
SUBTYPE OF (geometric_tolerance_with_datum_reference);
END_ENTITY;
ENTITY perpendicularity_tolerance
SUBTYPE OF (geometric_tolerance_with_datum_reference);
END_ENTITY;
ENTITY plus_minus_tolerance;
range : tolerance_method_definition;
toleranced_dimension : dimensional_characteristic;
UNIQUE
UR1: toleranced_dimension;
END_ENTITY;
ENTITY position_tolerance
SUBTYPE OF (geometric_tolerance);
END_ENTITY;
ENTITY projected_zone_definition
SUBTYPE OF (tolerance_zone_definition);
projection_end : shape_aspect;
projected_length : length_measure_with_unit;
WHERE
WR1: ('NUMBER' IN TYPEOF (projected_length\measure_with_unit.value_component)) AND (projected_length\measure_with_unit.value_component
> 0.0);
WR2: (derive_dimensional_exponents (projected_length\measure_with_unit.unit_component)= dimensional_exponents(1,0,0,0,0,0,0));
END_ENTITY;
ENTITY projected_zone_definition_with_offset
SUBTYPE OF (projected_zone_definition);
offset : length_measure_with_unit;
END_ENTITY;
ENTITY roundness_tolerance
SUBTYPE OF (geometric_tolerance);
WHERE
WR1: NOT ('SHAPE_TOLERANCE_SCHEMA.' + 'GEOMETRIC_TOLERANCE_WITH_DATUM_REFERENCE' IN TYPEOF (SELF));
END_ENTITY;
ENTITY runout_zone_definition
SUBTYPE OF (tolerance_zone_definition);
orientation : runout_zone_orientation;
END_ENTITY;
ENTITY runout_zone_orientation;
angle : plane_angle_measure_with_unit;
END_ENTITY;
ENTITY runout_zone_orientation_reference_direction
SUBTYPE OF (runout_zone_orientation);
orientation_defining_relationship : shape_aspect_relationship;
END_ENTITY;
ENTITY statistical_distribution_for_tolerance
SUBTYPE OF (representation);
WHERE
WR1: SIZEOF (QUERY (item <* SELF\representation.items | NOT ('QUALIFIED_MEASURE_SCHEMA.MEASURE_REPRESENTATION_ITEM' IN TYPEOF
(item)))) = 0;
END_ENTITY;
ENTITY straightness_tolerance
SUBTYPE OF (geometric_tolerance);
WHERE
WR1: NOT ('SHAPE_TOLERANCE_SCHEMA.' + 'GEOMETRIC_TOLERANCE_WITH_DATUM_REFERENCE' IN TYPEOF (SELF));
END_ENTITY;
ENTITY surface_profile_tolerance
SUBTYPE OF (geometric_tolerance);
END_ENTITY;
ENTITY symmetry_tolerance
SUBTYPE OF (geometric_tolerance_with_datum_reference);
END_ENTITY;
ENTITY tolerance_value;
lower_bound : measure_with_unit;
upper_bound : measure_with_unit;
DERIVE
ubvc : REAL := upper_bound\measure_with_unit.value_component;
lbvc : REAL := lower_bound\measure_with_unit.value_component;
WHERE
WR1: ubvc > lbvc;
WR2: upper_bound\measure_with_unit.unit_component = lower_bound\measure_with_unit.unit_component;
END_ENTITY;
ENTITY tolerance_with_statistical_distribution;
associated_tolerance : shape_tolerance_select;
tolerance_allocation : statistical_distribution_for_tolerance;
END_ENTITY;
ENTITY tolerance_zone
SUBTYPE OF (shape_aspect);
defining_tolerance : SET[1:?] OF tolerance_zone_target;
form : tolerance_zone_form;
END_ENTITY;
ENTITY tolerance_zone_definition
SUPERTYPE OF
(ONEOF (projected_zone_definition,
non_uniform_zone_definition,
runout_zone_definition));
zone : tolerance_zone;
boundaries : SET[0:?] OF shape_aspect;
END_ENTITY;
ENTITY tolerance_zone_form;
name : label;
END_ENTITY;
ENTITY tolerance_zone_with_datum
SUPERTYPE OF
(ONEOF (directed_tolerance_zone,
oriented_tolerance_zone))
SUBTYPE OF (tolerance_zone);
datum_reference : datum_system;
END_ENTITY;
ENTITY total_runout_tolerance
SUBTYPE OF (geometric_tolerance_with_datum_reference);
END_ENTITY;
ENTITY unequally_disposed_geometric_tolerance
SUBTYPE OF (geometric_tolerance);
displacement : length_measure_with_unit;
WHERE
WR1: 'NUMBER' IN TYPEOF(displacement\measure_with_unit.value_component);
END_ENTITY;
RULE subtype_exclusiveness_geometric_tolerance FOR
(geometric_tolerance);
WHERE
WR1: SIZEOF(QUERY (gt <* geometric_tolerance | NOT (type_check_function(gt, ['SHAPE_TOLERANCE_SCHEMA.ANGULARITY_TOLERANCE',
'SHAPE_TOLERANCE_SCHEMA.CIRCULAR_RUNOUT_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.COAXIALITY_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.CONCENTRICITY_TOLERANCE',
'SHAPE_TOLERANCE_SCHEMA.CYLINDRICITY_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.FLATNESS_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.LINE_PROFILE_TOLERANCE',
'SHAPE_TOLERANCE_SCHEMA.PARALLELISM_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.PERPENDICULARITY_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.POSITION_TOLERANCE',
'SHAPE_TOLERANCE_SCHEMA.ROUNDNESS_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.STRAIGHTNESS_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.SURFACE_PROFILE_TOLERANCE',
'SHAPE_TOLERANCE_SCHEMA.SYMMETRY_TOLERANCE', 'SHAPE_TOLERANCE_SCHEMA.TOTAL_RUNOUT_TOLERANCE'] , 2 ) ))) = 0;
END_RULE;
FUNCTION acyclic_geometric_tolerance_relationship
(relation : geometric_tolerance_relationship; relatives : SET[1:?] OF geometric_tolerance; specific_relation : STRING) : BOOLEAN;
LOCAL x : SET OF geometric_tolerance_relationship; END_LOCAL; IF relation.relating_geometric_tolerance IN relatives THEN RETURN (FALSE); END_IF; x := QUERY(geotol <* bag_to_set( USEDIN(relation.relating_geometric_tolerance, 'SHAPE_TOLERANCE_SCHEMA.' + 'GEOMETRIC_TOLERANCE_RELATIONSHIP.' + 'RELATED_GEOMETRIC_TOLERANCE')) | specific_relation IN TYPEOF(geotol)); REPEAT i := 1 TO HIINDEX(x); IF NOT acyclic_geometric_tolerance_relationship(x[i], relatives + relation.relating_geometric_tolerance, specific_relation) THEN RETURN (FALSE); END_IF; END_REPEAT; RETURN (TRUE);
END_FUNCTION;
FUNCTION sts_get_product_definition_shape
(input : geometric_tolerance_target) : product_definition_shape;
CASE TRUE OF ('SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_LOCATION' IN TYPEOF(input)) : RETURN(input\shape_aspect_relationship.relating_shape_aspect\shape_aspect.of_shape); ('SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE' IN TYPEOF(input)) : RETURN(input\dimensional_size.applies_to\shape_aspect.of_shape); ('PRODUCT_PROPERTY_DEFINITION_SCHEMA.PRODUCT_DEFINITION_SHAPE' IN TYPEOF(input)) : RETURN(input); ('PRODUCT_PROPERTY_DEFINITION_SCHEMA.SHAPE_ASPECT' IN TYPEOF(input)) : RETURN(input\shape_aspect.of_shape); OTHERWISE : RETURN(?); END_CASE;
END_FUNCTION;
END_SCHEMA; -- shape_tolerance_schema