(* ISO 10303 TC184/SC4/WG12 N8482 EXPRESS Source: ISO 10303-105 ed2 Kinematics - Kinematic structure schema The following permission notice and disclaimer shall be included in all copies of this EXPRESS schema ("the Schema"), and derivations of the Schema: Copyright ISO 2014 All rights reserved Permission is hereby granted, free of charge in perpetuity, to any person obtaining a copy of the Schema, to use, copy, modify, merge and distribute free of charge, copies of the Schema for the purposes of developing, implementing, installing and using software based on the Schema, and to permit persons to whom the Schema is furnished to do so, subject to the following conditions: THE SCHEMA IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SCHEMA OR THE USE OR OTHER DEALINGS IN THE SCHEMA. In addition, any modified copy of the Schema shall include the following notice: THIS SCHEMA HAS BEEN MODIFIED FROM THE SCHEMA DEFINED IN ISO 10303-105 ed2 Kinematics - Kinematic structure schema AND SHOULD NOT BE INTERPRETED AS COMPLYING WITH THAT STANDARD *) SCHEMA kinematic_structure_schema '{iso standard 10303 part(105) version(4) object(1) kinematic_structure_schema(3)}'; REFERENCE FROM kinematic_topology_schema; REFERENCE FROM geometry_schema (axis2_placement_3d, cartesian_transformation_operator_3d, curve, direction, geometric_representation_context, geometric_representation_item, normalise, point, point_on_curve, point_on_surface, surface, rectangular_trimmed_surface, trimmed_curve); REFERENCE FROM measure_schema (conversion_based_unit, global_unit_assigned_context, length_measure, plane_angle_measure, si_prefix, si_unit, si_unit_name, unit); REFERENCE FROM product_property_definition_schema (characterized_definition, property_definition); REFERENCE FROM product_property_representation_schema (property_definition_representation, shape_representation); REFERENCE FROM representation_schema (definitional_representation_relationship, functionally_defined_transformation, item_defined_transformation, representation, representation_context, representation_item, representation_relationship, representation_relationship_with_transformation, using_representations); REFERENCE FROM support_resource_schema (bag_to_set, label); TYPE rigid_placement = SELECT (axis2_placement_3d, su_parameters); END_TYPE; ENTITY mechanism_representation SUBTYPE OF (representation); SELF\representation.context_of_items : geometric_representation_context; SELF\representation.items : SET[1:?] OF pair_representation_relationship; represented_topology : kinematic_topology_representation_select; DERIVE represented_joints : SET[1:?] OF kinematic_joint := collect_joints(items); WHERE WR1: (('KINEMATIC_TOPOLOGY_SCHEMA.KINEMATIC_TOPOLOGY_STRUCTURE' IN TYPEOF(represented_topology)) AND (represented_joints :=: represented_topology.items)) OR (('KINEMATIC_TOPOLOGY_SCHEMA.KINEMATIC_TOPOLOGY_DIRECTED_STRUCTURE' IN TYPEOF(represented_topology)) AND (represented_joints :=: get_kinematic_joints_from_oriented_joints(represented_topology.items))) OR (('KINEMATIC_TOPOLOGY_SCHEMA.KINEMATIC_TOPOLOGY_NETWORK_STRUCTURE' IN TYPEOF(represented_topology)) AND (represented_joints :=: get_kinematic_joints_from_kinematic_loops(represented_topology.items))); END_ENTITY; ENTITY pair_representation_relationship SUBTYPE OF (geometric_representation_item, representation_relationship_with_transformation); SELF\representation_relationship.rep_1 : kinematic_link_representation; SELF\representation_relationship.rep_2 : kinematic_link_representation; SELF\representation_relationship_with_transformation.transformation_operator : kinematic_pair; WHERE WR1: transformation_operator\item_defined_transformation.transform_item_1 IN rep_1.items; WR2: transformation_operator\item_defined_transformation.transform_item_2 IN rep_2.items; WR3: rep_1\kinematic_link_representation.represented_link = transformation_operator\kinematic_pair.joint.edge_start; WR4: rep_2\kinematic_link_representation.represented_link = transformation_operator\kinematic_pair.joint.edge_end; END_ENTITY; TYPE kinematic_link_representation_items = SELECT ( curve, point, rigid_placement, surface); END_TYPE; ENTITY kinematic_link_representation ABSTRACT SUPERTYPE OF ( ONEOF (linear_flexible_link_representation, rigid_link_representation)) SUBTYPE OF (representation); SELF\representation.context_of_items : geometric_representation_context; SELF\representation.items : SET[1:?] OF kinematic_link_representation_items; represented_link : kinematic_link; INVERSE associated_shape_representation : SET[0:1] OF -- LK kinematic_link_representation_association FOR rep_1; END_ENTITY; ENTITY linear_flexible_link_representation SUBTYPE OF (kinematic_link_representation); END_ENTITY; ENTITY rigid_link_representation SUBTYPE OF (kinematic_link_representation); END_ENTITY; ENTITY kinematic_link_representation_association SUBTYPE OF (representation_relationship); SELF\representation_relationship.rep_1 : kinematic_link_representation; SELF\representation_relationship.rep_2 : shape_representation; WHERE WR1: (SELF\representation_relationship.rep_2.context_of_items :=: SELF\representation_relationship.rep_1.context_of_items) OR ('REPRESENTATION_SCHEMA.REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION' IN TYPEOF(SELF)); END_ENTITY; ENTITY su_parameters SUBTYPE OF (geometric_representation_item); a : length_measure; alpha : plane_angle_measure; b : length_measure; beta : plane_angle_measure; c : length_measure; gamma : plane_angle_measure; WHERE WR1: SELF\geometric_representation_item.dim=3; END_ENTITY; ENTITY kinematic_pair ABSTRACT SUPERTYPE OF( ONEOF ( high_order_kinematic_pair, low_order_kinematic_pair_with_motion_coupling, low_order_kinematic_pair) ANDOR actuated_kinematic_pair) SUBTYPE OF (geometric_representation_item, item_defined_transformation); joint : kinematic_joint; SELF\item_defined_transformation.transform_item_1 : rigid_placement; SELF\item_defined_transformation.transform_item_2 : rigid_placement; DERIVE associated_link_representations_1 : SET[1:?] OF kinematic_link_representation := sort_link_associations(link_representation_associations, TRUE); associated_link_representations_2 : SET[1:?] OF kinematic_link_representation := sort_link_associations(link_representation_associations, FALSE); SELF\item_defined_transformation.name : label := SELF\representation_item.name; INVERSE link_representation_associations : SET[1:?] OF pair_representation_relationship FOR transformation_operator; END_ENTITY; ENTITY high_order_kinematic_pair ABSTRACT SUPERTYPE OF( ONEOF ( linear_flexible_and_planar_curve_pair, point_on_surface_pair, point_on_planar_curve_pair, planar_curve_pair, surface_pair )) SUBTYPE OF (kinematic_pair); WHERE WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_2 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY low_order_kinematic_pair_with_motion_coupling ABSTRACT SUPERTYPE OF( ONEOF ( gear_pair, linear_flexible_and_pinion_pair, rack_and_pinion_pair, screw_pair )) SUBTYPE OF (kinematic_pair); WHERE WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_2 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY low_order_kinematic_pair SUPERTYPE OF( ONEOF ( revolute_pair, cylindrical_pair, spherical_pair, spherical_pair_with_pin, planar_pair, unconstrained_pair, fully_constrained_pair, prismatic_pair, universal_pair, low_order_kinematic_pair_with_range )) SUBTYPE OF (kinematic_pair); t_x : BOOLEAN; t_y : BOOLEAN; t_z : BOOLEAN; r_x : BOOLEAN; r_y : BOOLEAN; r_z : BOOLEAN; WHERE WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; WR2: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_2 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY low_order_kinematic_pair_with_range SUBTYPE OF (low_order_kinematic_pair); lower_limit_actual_rotation_x : OPTIONAL plane_angle_measure; upper_limit_actual_rotation_x : OPTIONAL plane_angle_measure; lower_limit_actual_rotation_y : OPTIONAL plane_angle_measure; upper_limit_actual_rotation_y : OPTIONAL plane_angle_measure; lower_limit_actual_rotation_z : OPTIONAL plane_angle_measure; upper_limit_actual_rotation_z : OPTIONAL plane_angle_measure; lower_limit_actual_translation_x : OPTIONAL length_measure; upper_limit_actual_translation_x : OPTIONAL length_measure; lower_limit_actual_translation_y : OPTIONAL length_measure; upper_limit_actual_translation_y : OPTIONAL length_measure; lower_limit_actual_translation_z : OPTIONAL length_measure; upper_limit_actual_translation_z : OPTIONAL length_measure; END_ENTITY; TYPE actuated_direction = ENUMERATION OF ( bidirectional, positive_only, negative_only, not_actuated); END_TYPE; ENTITY actuated_kinematic_pair SUBTYPE OF (kinematic_pair); t_x : OPTIONAL actuated_direction; t_y : OPTIONAL actuated_direction; t_z : OPTIONAL actuated_direction; r_x : OPTIONAL actuated_direction; r_y : OPTIONAL actuated_direction; r_z : OPTIONAL actuated_direction; END_ENTITY; ENTITY revolute_pair_with_range SUBTYPE OF (revolute_pair); lower_limit_actual_rotation : OPTIONAL plane_angle_measure; upper_limit_actual_rotation : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation); END_ENTITY; ENTITY prismatic_pair_with_range SUBTYPE OF (prismatic_pair); lower_limit_actual_translation : OPTIONAL length_measure; upper_limit_actual_translation : OPTIONAL length_measure; WHERE WR1: (NOT EXISTS(lower_limit_actual_translation) OR NOT EXISTS(upper_limit_actual_translation)) XOR (lower_limit_actual_translation < upper_limit_actual_translation); END_ENTITY; ENTITY revolute_pair SUBTYPE OF (low_order_kinematic_pair); DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE; END_ENTITY; ENTITY prismatic_pair SUBTYPE OF (low_order_kinematic_pair); DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := FALSE; END_ENTITY; ENTITY screw_pair SUBTYPE OF (low_order_kinematic_pair_with_motion_coupling); pitch : length_measure; WHERE WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY screw_pair_with_range SUBTYPE OF (screw_pair); lower_limit_actual_rotation : OPTIONAL plane_angle_measure; upper_limit_actual_rotation : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation); END_ENTITY; ENTITY cylindrical_pair SUBTYPE OF (low_order_kinematic_pair); DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE; END_ENTITY; ENTITY cylindrical_pair_with_range SUBTYPE OF (cylindrical_pair); lower_limit_actual_translation : OPTIONAL length_measure; upper_limit_actual_translation : OPTIONAL length_measure; lower_limit_actual_rotation : OPTIONAL plane_angle_measure; upper_limit_actual_rotation : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_actual_translation) OR NOT EXISTS(upper_limit_actual_translation)) XOR (lower_limit_actual_translation < upper_limit_actual_translation); WR2: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation); END_ENTITY; ENTITY spherical_pair SUBTYPE OF (low_order_kinematic_pair); DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE; END_ENTITY; ENTITY spherical_pair_with_range SUBTYPE OF (spherical_pair); lower_limit_yaw : OPTIONAL plane_angle_measure; upper_limit_yaw : OPTIONAL plane_angle_measure; lower_limit_pitch : OPTIONAL plane_angle_measure; upper_limit_pitch : OPTIONAL plane_angle_measure; lower_limit_roll : OPTIONAL plane_angle_measure; upper_limit_roll : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_yaw) OR NOT EXISTS(upper_limit_yaw)) XOR (lower_limit_yaw < upper_limit_yaw); WR2: (NOT EXISTS(lower_limit_pitch) OR NOT EXISTS(upper_limit_pitch)) XOR (lower_limit_pitch < upper_limit_pitch); WR3: (NOT EXISTS(lower_limit_roll) OR NOT EXISTS(upper_limit_roll)) XOR (lower_limit_roll < upper_limit_roll); END_ENTITY; ENTITY spherical_pair_with_pin SUBTYPE OF (low_order_kinematic_pair); DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE; END_ENTITY; ENTITY spherical_pair_with_pin_and_range SUBTYPE OF (spherical_pair_with_pin); lower_limit_yaw : OPTIONAL plane_angle_measure; upper_limit_yaw : OPTIONAL plane_angle_measure; lower_limit_roll : OPTIONAL plane_angle_measure; upper_limit_roll : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_yaw) OR NOT EXISTS(upper_limit_yaw)) XOR (lower_limit_yaw < upper_limit_yaw); WR2: (NOT EXISTS(lower_limit_roll) OR NOT EXISTS(upper_limit_roll)) XOR (lower_limit_roll < upper_limit_roll); END_ENTITY; ENTITY universal_pair SUBTYPE OF (low_order_kinematic_pair); input_skew_angle : OPTIONAL plane_angle_measure; DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE; skew_angle : plane_angle_measure := NVL (input_skew_angle, 0.0); WHERE WR1: COS (plane_angle_for_pair_in_radian (SELF, skew_angle)) > 0.0; END_ENTITY; ENTITY universal_pair_with_range SUBTYPE OF (universal_pair); lower_limit_first_rotation : OPTIONAL plane_angle_measure; upper_limit_first_rotation : OPTIONAL plane_angle_measure; lower_limit_second_rotation : OPTIONAL plane_angle_measure; upper_limit_second_rotation : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_first_rotation) OR NOT EXISTS(upper_limit_first_rotation)) XOR (lower_limit_first_rotation < upper_limit_first_rotation); WR2: (NOT EXISTS(lower_limit_second_rotation) OR NOT EXISTS(upper_limit_second_rotation)) XOR (lower_limit_second_rotation < upper_limit_second_rotation); END_ENTITY; ENTITY homokinetic_pair SUBTYPE OF (universal_pair); WHERE WR1: NOT EXISTS(SELF.input_skew_angle); END_ENTITY; ENTITY planar_pair SUBTYPE OF (low_order_kinematic_pair); DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE; END_ENTITY; ENTITY planar_pair_with_range SUBTYPE OF (planar_pair); lower_limit_actual_rotation : OPTIONAL plane_angle_measure; upper_limit_actual_rotation : OPTIONAL plane_angle_measure; lower_limit_actual_translation_x : OPTIONAL length_measure; upper_limit_actual_translation_x : OPTIONAL length_measure; lower_limit_actual_translation_y : OPTIONAL length_measure; upper_limit_actual_translation_y : OPTIONAL length_measure; WHERE WR1: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation); WR2: (NOT EXISTS(lower_limit_actual_translation_x) OR NOT EXISTS(upper_limit_actual_translation_x)) XOR (lower_limit_actual_translation_x < upper_limit_actual_translation_x); WR3: (NOT EXISTS(lower_limit_actual_translation_y) OR NOT EXISTS(upper_limit_actual_translation_y)) XOR (lower_limit_actual_translation_y < upper_limit_actual_translation_y); END_ENTITY; ENTITY unconstrained_pair SUBTYPE OF (low_order_kinematic_pair); DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := TRUE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := TRUE; END_ENTITY; ENTITY fully_constrained_pair SUBTYPE OF (low_order_kinematic_pair); DERIVE SELF\low_order_kinematic_pair.t_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.t_z : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_x : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_y : BOOLEAN := FALSE; SELF\low_order_kinematic_pair.r_z : BOOLEAN := FALSE; END_ENTITY; ENTITY point_on_surface_pair SUBTYPE OF (high_order_kinematic_pair); pair_surface : surface; WHERE WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(pair_surface IN r.items))) = 0; WR2: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY point_on_surface_pair_with_range SUBTYPE OF (point_on_surface_pair); range_on_pair_surface : rectangular_trimmed_surface; lower_limit_yaw : OPTIONAL plane_angle_measure; upper_limit_yaw : OPTIONAL plane_angle_measure; lower_limit_pitch : OPTIONAL plane_angle_measure; upper_limit_pitch : OPTIONAL plane_angle_measure; lower_limit_roll : OPTIONAL plane_angle_measure; upper_limit_roll : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_pitch) OR NOT EXISTS(upper_limit_pitch)) XOR (lower_limit_pitch < upper_limit_pitch); WR2: (NOT EXISTS(lower_limit_yaw) OR NOT EXISTS(upper_limit_yaw)) XOR (lower_limit_yaw < upper_limit_yaw); WR3: (NOT EXISTS(lower_limit_roll) OR NOT EXISTS(upper_limit_roll)) XOR (lower_limit_roll < upper_limit_roll); WR4: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(range_on_pair_surface IN r.items))) = 0; END_ENTITY; ENTITY surface_pair ABSTRACT SUPERTYPE OF ( ONEOF (sliding_surface_pair, rolling_surface_pair) ANDOR surface_pair_with_range) SUBTYPE OF (high_order_kinematic_pair); surface_1 : surface; surface_2 : surface; orientation : BOOLEAN; WHERE WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(surface_1 IN r.items))) = 0; WR2: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_2 | NOT(surface_2 IN r.items))) = 0; WR3: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY surface_pair_with_range SUBTYPE OF (surface_pair); range_on_surface_1 : rectangular_trimmed_surface; range_on_surface_2 : rectangular_trimmed_surface; lower_limit_actual_rotation : OPTIONAL plane_angle_measure; upper_limit_actual_rotation : OPTIONAL plane_angle_measure; WHERE WR1: SELF\surface_pair.surface_1 :=: range_on_surface_1.basis_surface; WR2: SELF\surface_pair.surface_2 :=: range_on_surface_2.basis_surface; WR3: (NOT EXISTS(lower_limit_actual_rotation) OR NOT EXISTS(upper_limit_actual_rotation)) XOR (lower_limit_actual_rotation < upper_limit_actual_rotation); WR4: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(range_on_surface_1 IN r.items))) = 0; WR5: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_2 | NOT(range_on_surface_2 IN r.items))) = 0; END_ENTITY; ENTITY sliding_surface_pair SUBTYPE OF (surface_pair); END_ENTITY; ENTITY rolling_surface_pair SUBTYPE OF (surface_pair); END_ENTITY; ENTITY linear_flexible_and_planar_curve_pair SUBTYPE OF (high_order_kinematic_pair); pair_curve : curve; orientation : BOOLEAN; WHERE WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(pair_curve IN r.items))) = 0; WR2: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.LINEAR_FLEXIBLE_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY point_on_planar_curve_pair SUBTYPE OF (high_order_kinematic_pair); pair_curve : curve; orientation : BOOLEAN; WHERE WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(pair_curve IN r.items))) = 0; WR2: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY point_on_planar_curve_pair_with_range SUBTYPE OF (point_on_planar_curve_pair); range_on_pair_curve : trimmed_curve; lower_limit_yaw : OPTIONAL plane_angle_measure; upper_limit_yaw : OPTIONAL plane_angle_measure; lower_limit_pitch : OPTIONAL plane_angle_measure; upper_limit_pitch : OPTIONAL plane_angle_measure; lower_limit_roll : OPTIONAL plane_angle_measure; upper_limit_roll : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_pitch) OR NOT EXISTS(upper_limit_pitch)) XOR (lower_limit_pitch < upper_limit_pitch); WR2: (NOT EXISTS(lower_limit_yaw) OR NOT EXISTS(upper_limit_yaw)) XOR (lower_limit_yaw < upper_limit_yaw); WR3: (NOT EXISTS(lower_limit_roll) OR NOT EXISTS(upper_limit_roll)) XOR (lower_limit_roll < upper_limit_roll); WR4: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(range_on_pair_curve IN r.items))) = 0; END_ENTITY; ENTITY planar_curve_pair SUPERTYPE OF ( ONEOF(sliding_curve_pair, rolling_curve_pair) ANDOR planar_curve_pair_range) SUBTYPE OF (high_order_kinematic_pair); curve_1 : curve; curve_2 : curve; orientation : BOOLEAN; WHERE WR1: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(curve_1 IN r.items))) = 0; WR2: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_2 | NOT(curve_2 IN r.items))) = 0; WR3: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY planar_curve_pair_range SUBTYPE OF (planar_curve_pair); range_on_curve_1 : trimmed_curve; range_on_curve_2 : trimmed_curve; WHERE WR1: SELF\planar_curve_pair.curve_1 :=: range_on_curve_1.basis_curve; WR2: SELF\planar_curve_pair.curve_2 :=: range_on_curve_2.basis_curve; WR3: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_1 | NOT(range_on_curve_1 IN r.items))) = 0; WR4: SIZEOF( QUERY(r <* SELF\kinematic_pair.associated_link_representations_2 | NOT(range_on_curve_2 IN r.items))) = 0; END_ENTITY; ENTITY sliding_curve_pair SUBTYPE OF (planar_curve_pair); END_ENTITY; ENTITY rolling_curve_pair SUBTYPE OF (planar_curve_pair); END_ENTITY; ENTITY gear_pair SUBTYPE OF (low_order_kinematic_pair_with_motion_coupling); radius_first_link : length_measure; radius_second_link : length_measure; bevel : plane_angle_measure; helical_angle : plane_angle_measure; gear_ratio : REAL; WHERE WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY gear_pair_with_range SUBTYPE OF (gear_pair); lower_limit_actual_rotation_1 : OPTIONAL plane_angle_measure; upper_limit_actual_rotation_1 : OPTIONAL plane_angle_measure; WHERE WR1: (NOT EXISTS(lower_limit_actual_rotation_1) OR NOT EXISTS(upper_limit_actual_rotation_1)) XOR (lower_limit_actual_rotation_1 < upper_limit_actual_rotation_1); END_ENTITY; ENTITY rack_and_pinion_pair SUBTYPE OF (low_order_kinematic_pair_with_motion_coupling); pinion_radius : length_measure; WHERE WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.RIGID_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; ENTITY rack_and_pinion_pair_with_range SUBTYPE OF (rack_and_pinion_pair); lower_limit_rack_displacement : OPTIONAL length_measure; upper_limit_rack_displacement : OPTIONAL length_measure; WHERE WR1: (NOT EXISTS(lower_limit_rack_displacement) OR NOT EXISTS(upper_limit_rack_displacement)) XOR (lower_limit_rack_displacement < upper_limit_rack_displacement); END_ENTITY; ENTITY linear_flexible_and_pinion_pair SUBTYPE OF (low_order_kinematic_pair_with_motion_coupling); pinion_radius : length_measure; WHERE WR1: SIZEOF( QUERY(lr <* SELF\kinematic_pair.associated_link_representations_1 | NOT('KINEMATIC_STRUCTURE_SCHEMA.LINEAR_FLEXIBLE_LINK_REPRESENTATION' IN TYPEOF(lr)))) = 0; END_ENTITY; FUNCTION representation_of_link (link : kinematic_link) : kinematic_link_representation; (* LOCAL link_rep_rel : BAG OF kinematic_link_representation_relation; END_LOCAL; link_rep_rel := USEDIN (link, 'KINEMATIC_STRUCTURE_SCHEMA.'+ 'KINEMATIC_LINK_REPRESENTATION_RELATION.'+ 'TOPOLOGICAL_ASPECTS'); IF (SIZEOF (link_rep_rel) = 0) THEN RETURN (?); ELSE RETURN (link_rep_rel[1].geometric_aspects); END_IF; *) RETURN (?); END_FUNCTION; FUNCTION plane_angle_for_pair_in_radian (pair : kinematic_pair; angle : plane_angle_measure) : plane_angle_measure; LOCAL converted_angle : plane_angle_measure := angle; link_rep : kinematic_link_representation := representation_of_link (pair.joint.edge_start); link_cntxt : representation_context; pa_units : SET OF unit := []; pau : unit; END_LOCAL; link_cntxt := link_rep\representation.context_of_items; IF NOT ('MEASURE_SCHEMA.GLOBAL_UNIT_ASSIGNED_CONTEXT' IN TYPEOF (link_cntxt)) THEN RETURN (?); END_IF; pa_units := QUERY (unit <* link_cntxt\global_unit_assigned_context.units | 'MEASURE_SCHEMA.PLANE_ANGLE_UNIT' IN TYPEOF (unit)); IF SIZEOF (pa_units) <> 1 THEN RETURN (?); END_IF; pau := pa_units[1]; IF (NOT ('MEASURE_SCHEMA.SI_UNIT' IN TYPEOF (pau)) AND NOT ('MEASURE_SCHEMA.CONVERSION_BASED_UNIT' IN TYPEOF (pau))) THEN RETURN (?); END_IF; REPEAT WHILE ('MEASURE_SCHEMA.CONVERSION_BASED_UNIT' IN TYPEOF (pau)); converted_angle := converted_angle * pau\conversion_based_unit.conversion_factor. value_component; pau := pau\conversion_based_unit.conversion_factor.unit_component; IF ((NOT ('MEASURE_SCHEMA.SI_UNIT' IN TYPEOF (pau)) AND NOT ('MEASURE_SCHEMA.CONVERSION_BASED_UNIT' IN TYPEOF (pau))) OR (NOT ('MEASURE_SCHEMA.PLANE_ANGLE_UNIT' IN TYPEOF (pau)))) THEN RETURN (?); END_IF; END_REPEAT; IF (pau\si_unit.name <> si_unit_name.radian) THEN RETURN (?); END_IF; CASE pau\si_unit.prefix OF si_prefix.exa : RETURN (1.E18 * converted_angle); si_prefix.peta : RETURN (1.E15 * converted_angle); si_prefix.tera : RETURN (1.E12 * converted_angle); si_prefix.giga : RETURN (1.E9 * converted_angle); si_prefix.mega : RETURN (1.E6 * converted_angle); si_prefix.kilo : RETURN (1.E3 * converted_angle); si_prefix.hecto : RETURN (1.E2 * converted_angle); si_prefix.deca : RETURN (1.E1 * converted_angle); si_prefix.deci : RETURN (1.E-1 * converted_angle); si_prefix.centi : RETURN (1.E-2 * converted_angle); si_prefix.milli : RETURN (1.E-3 * converted_angle); si_prefix.micro : RETURN (1.E-6 * converted_angle); si_prefix.nano : RETURN (1.E-9 * converted_angle); si_prefix.pico : RETURN (1.E-12 * converted_angle); si_prefix.femto : RETURN (1.E-15 * converted_angle); si_prefix.atto : RETURN (1.E-18 * converted_angle); OTHERWISE : RETURN (converted_angle); END_CASE; END_FUNCTION; FUNCTION sort_link_associations (aprr : SET[1:?] OF pair_representation_relationship; one_not_two : boolean) : SET OF kinematic_link_representation; LOCAL result : SET OF kinematic_link_representation := []; END_LOCAL; IF one_not_two THEN REPEAT i := 1 TO HIINDEX(aprr); result := result + aprr[i].rep_1; END_REPEAT; ELSE REPEAT i := 1 TO HIINDEX(aprr); result := result + aprr[i].rep_2; END_REPEAT; END_IF; RETURN(result); END_FUNCTION; FUNCTION collect_joints (items : SET[1:?] OF pair_representation_relationship) : SET OF kinematic_joint; LOCAL result : SET OF kinematic_joint := []; END_LOCAL; REPEAT i := 1 TO HIINDEX(items); result := result + items[i].transformation_operator.joint; END_REPEAT; RETURN(result); END_FUNCTION; SUBTYPE_CONSTRAINT kss_representation_subtypes FOR representation; ONEOF (kinematic_link_representation, kinematic_topology_structure, kinematic_topology_directed_structure, kinematic_topology_network_structure, mechanism_representation, shape_representation); END_SUBTYPE_CONSTRAINT; END_SCHEMA; -- end kinematic_structure_schema