Source : ISO 10303-113
SCHEMA mechanical_design_schema;
         REFERENCE FROM 
         draughting_element_schema   -- ISO 10303-101
  (draughting_callout,
           
         draughting_callout_element,
           
         draughting_model_item_association,
           
         draughting_model_item_definition,
           
         draughting_model);
         
         REFERENCE FROM 
         geometry_schema   -- ISO 10303-42
  (cartesian_point,
           
         geometric_representation_item,
           
         placement,
           
         point,
           
         point_on_curve,
           
         point_on_surface);
         
         REFERENCE FROM 
         geometric_model_schema   -- ISO 10303-42
  (geometric_set,
           
         geometric_set_select);
         
         REFERENCE FROM 
         measure_schema   -- ISO 10303-41
  (positive_length_measure);
         
         REFERENCE FROM 
         presentation_appearance_schema   -- ISO 10303-46
  (styled_item);
         
         REFERENCE FROM 
         presentation_definition_schema   -- ISO 10303-46
  (annotation_curve_occurrence,
           
         annotation_fill_area_occurrence,
           
         annotation_occurrence,
           
         annotation_point_occurrence,
           
         annotation_symbol_occurrence,
           
         annotation_text_occurrence,
           
         annotation_text);
         
         REFERENCE FROM 
         presentation_resource_schema   -- ISO 10303-46
  (planar_box);
         
         REFERENCE FROM 
         product_definition_schema   -- ISO 10303-41
  (product_definition);
         
         REFERENCE FROM 
         product_property_definition_schema   -- ISO 10303-41
  (characterized_object,
           
         property_definition,
           
         product_definition_shape,
           
         shape_aspect,
           
         shape_aspect_relationship);
         
         REFERENCE FROM 
         product_property_representation_schema   -- ISO 10303-41
  (item_identified_representation_usage,
           
         property_definition_representation);
         
         REFERENCE FROM 
         representation_schema   -- ISO 10303-43
  (get_representations_for_items,
           
         representation,
           
         representation_item);
         
         REFERENCE FROM 
         shape_aspect_definition_schema   -- ISO 10303-47
  (datum,
           
         datum_target);
         
         REFERENCE FROM 
         shape_dimension_schema   -- ISO 10303-47
  (angular_location,
           
         dimensional_size,
           
         dimensional_location);
         
         REFERENCE FROM 
         shape_tolerance_schema   -- ISO 10303-47
  (angularity_tolerance,
           
         circular_runout_tolerance,
           
         coaxiality_tolerance,
           
         concentricity_tolerance,
           
         cylindricity_tolerance,
           
         flatness_tolerance,
           
         geometric_tolerance,
           
         line_profile_tolerance,
           
         parallelism_tolerance,
           
         perpendicularity_tolerance,
           
         position_tolerance,
           
         roundness_tolerance,
           
         surface_profile_tolerance,
           
         straightness_tolerance,
           
         symmetry_tolerance,
           
         total_runout_tolerance);
         
         REFERENCE FROM 
         support_resource_schema   -- ISO 10303-41
  (bag_to_set,
           
         identifier);
         
         REFERENCE FROM 
         topology_schema   -- ISO 10303-42
  (topological_representation_item,
           
         get_tri_in_representations,
           
         valid_tri_ids);
         
TYPE annotation_placeholder_occurrence_role =
         
         ENUMERATION
         
         OF
         
            
         (annotation_text,
    gps_data);
         END_TYPE; 
         
TYPE md_draughting_callout_element =
         
         EXTENSIBLE
         
         GENERIC_ENTITY
         
         
         SELECT
         BASED_ON
         draughting_callout_element
         WITH 
         
            (annotation_placeholder_occurrence);
         END_TYPE; 
         
TYPE md_geometric_set_select =
         
         
         SELECT
         BASED_ON
         geometric_set_select
         WITH 
         
            (annotation_text, 
    placement, 
    planar_box);
         END_TYPE; 
         
ENTITY annotation_placeholder_occurrence
           SUBTYPE OF (annotation_occurrence, geometric_representation_item);
           SELF\styled_item.item : geometric_set;
           role : annotation_placeholder_occurrence_role;
           line_spacing : positive_length_measure;
INVERSE
           the_callout : draughting_callout FOR contents;
           the_draughting_model_item_association_with_placeholders : SET[0:1] OF draughting_model_item_association_with_placeholder FOR annotation_placeholder;
WHERE
           WR1: md_valid_content_in_geometric_set_for_placeholder(item);
           WR2: NOT (role = annotation_placeholder_occurrence_role.gps_data) OR
            ((SIZEOF(the_draughting_model_item_association_with_placeholders) = 1) AND
            md_pmi_name_and_type_correlation(SELF));
         
         END_ENTITY;
ENTITY draughting_model_item_association_with_placeholder
           SUBTYPE OF (draughting_model_item_association);
           SELF\draughting_model_item_association.used_representation : draughting_model;
           SELF\item_identified_representation_usage.identified_item : draughting_callout;
           annotation_placeholder : annotation_placeholder_occurrence;
         
         END_ENTITY;
ENTITY pmi_requirement_item_association
           SUBTYPE OF (item_identified_representation_usage);
           requirement : characterized_object;
         
         END_ENTITY;
RULE tri_identification_within_product_definition FOR 
         (product_definition, topological_representation_item, representation);
LOCAL
   associated_representations : SET [1:?] OF representation := [];
   items          : SET [1:?] OF topological_representation_item := [];
   pd_items       : SET [1:?] OF topological_representation_item := [];
   pass : BOOLEAN := TRUE;
  END_LOCAL;
REPEAT i := LOINDEX(product_definition) TO HIINDEX(product_definition) WHILE pass;
  pd_items := get_tri_for_pd(product_definition[i]);
  associated_representations := get_representations_for_items(pd_items);
  items := get_tri_in_representations(associated_representations) + pd_items;
  IF (SIZEOF(items) > 0) THEN
        IF (SIZEOF(QUERY(ai <* items | 
         NOT(EXISTS(ai\topological_representation_item.permanent_id) OR
          EXISTS(ai\topological_representation_item.permanent_aggregate_id)) 
              )) > 0 )
        THEN
         pass := valid_tri_ids(items);
        END_IF;
  END_IF;  
END_REPEAT;WHERE
           WR1: pass;
         END_RULE;
         
FUNCTION get_tri_for_pd
 (def_instance : product_definition) : SET[0:?] OF topological_representation_item;
         LOCAL
      pd1_set  : SET OF property_definition := bag_to_set(USEDIN(def_instance, 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PROPERTY_DEFINITION.DEFINITION'));
      pd2_set  : SET OF property_definition := [];
      pdr_set : SET OF property_definition_representation := [];
      pds_set  : SET OF product_definition_shape := [];
       r_set   : SET OF representation := [];
        sa_set : SET OF shape_aspect := [];
       tri_set : SET OF topological_representation_item := [];
    END_LOCAL;
    IF (SIZEOF(pd1_set) < 1) THEN
      RETURN (?);
    END_IF;
    REPEAT i := LOINDEX(pd1_set) TO HIINDEX(pd1_set);
      pdr_set := pdr_set + bag_to_set(USEDIN(pd1_set[i], 'PRODUCT_PROPERTY_REPRESENTATION_SCHEMA.PROPERTY_DEFINITION_REPRESENTATION.DEFINITION'));
      IF 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PRODUCT_DEFINITION_SHAPE' IN TYPEOF(pd1_set[i]) THEN
        pds_set := pds_set + pd1_set[i];
      END_IF;
    END_REPEAT;
    REPEAT i := LOINDEX(pds_set) TO HIINDEX(pds_set);
      sa_set := sa_set + bag_to_set(USEDIN(pds_set[i], 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.SHAPE_ASPECT.OF_SHAPE'));
    END_REPEAT;
    REPEAT i := LOINDEX(sa_set) TO HIINDEX(sa_set);
      pd2_set := pd2_set + bag_to_set(USEDIN(sa_set[i], 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PROPERTY_DEFINITION.DEFINITION'));
    END_REPEAT;
   IF (SIZEOF(pd2_set) > 0) THEN
     BEGIN
      REPEAT i := LOINDEX(pd2_set) TO HIINDEX(pd2_set);
        pdr_set := pdr_set + bag_to_set(USEDIN(pd2_set[i], 'PRODUCT_PROPERTY_REPRESENTATION_SCHEMA.PROPERTY_DEFINITION_REPRESENTATION.DEFINITION'));
      END_REPEAT;
     END;
   END_IF;
    
    IF (SIZEOF(pdr_set) < 1) THEN
      RETURN (?);
    END_IF;
    REPEAT i := LOINDEX(pdr_set) TO HIINDEX(pdr_set);
      r_set := r_set + pdr_set[i]\property_definition_representation.used_representation;
    END_REPEAT;
    IF (SIZEOF(r_set) < 1) THEN
      RETURN (?);
    END_IF;
    REPEAT i := LOINDEX(r_set) TO HIINDEX(r_set);
      REPEAT j := LOINDEX(r_set[i]\representation.items) to HIINDEX(r_set[i]\representation.items);
       IF('TOPOLOGY_SCHEMA.TOPOLOGICAL_REPRESENTATION_ITEM' IN TYPEOF (r_set[i]\representation.items[j])) THEN
         tri_set := tri_set + r_set[i]\representation.items[j];
       END_IF;
      END_REPEAT;
    END_REPEAT;
    
  RETURN (tri_set);
         END_FUNCTION;
         
FUNCTION md_pmi_name_and_type_correlation
 (input : annotation_placeholder_occurrence) : BOOLEAN;
         LOCAL
      pmi_role : STRING := input\annotation_placeholder_occurrence.item\representation_item.name;
      dmiawps : SET OF draughting_model_item_association_with_placeholder := 
                input\annotation_placeholder_occurrence.the_draughting_model_item_association_with_placeholders;
      v : SET OF STRING := [];
    END_LOCAL;
      
     IF (SIZEOF(dmiawps) = 1) THEN
       v:= TYPEOF(dmiawps[1]\draughting_model_item_association.definition);
     ELSE
       RETURN(FALSE);
     END_IF;
    IF NOT(pmi_role IN
          ['angular dimension',
           'angularity',
           'circular runout',
           'circularity',
           'coaxiality',
           'concentricity',
           'curve dimension',
           'cylindricity',
           'datum',
           'datum target',
           'diameter dimension',
           'flatness',
           'general dimension',
           'general note',
           'general tolerance',
           'label',
           'linear dimension',
           'note',
           'ordinate dimension',
           'parallelism',
           'perpendicularity',
           'position',
           'profile of line',
           'profile of surface',
           'radial dimension',
           'roundness',
           'runout',
           'straightness',
           'surface roughness',
           'symmetry',
           'total runout']) THEN
    RETURN(?);
    END_IF;
    CASE pmi_role OF
      'angular dimension'      : IF 'SHAPE_DIMENSION_SCHEMA.ANGULAR_LOCATION' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'angularity'      : IF 'SHAPE_TOLERANCE_SCHEMA.ANGULARITY_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'circular runout'      : IF 'SHAPE_TOLERANCE_SCHEMA.CIRCULAR_RUNOUT_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'circularity'      : IF 'SHAPE_TOLERANCE_SCHEMA.ROUNDNESS_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'coaxiality'      : IF 'SHAPE_TOLERANCE_SCHEMA.COAXIALITY_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'concentricity'      : IF 'SHAPE_TOLERANCE_SCHEMA.CONCENTRICITY_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'curve dimension'      : IF 'SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'cylindricity'      : IF 'SHAPE_TOLERANCE_SCHEMA.CYLINDRICITY_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'datum'      : IF 'SHAPE_ASPECT_DEFINITION_SCHEMA.DATUM' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'datum target'      : IF 'SHAPE_ASPECT_DEFINITION_SCHEMA.DATUM_TARGET' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'diameter dimension'      : IF 'SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'flatness'      : IF 'SHAPE_TOLERANCE_SCHEMA.FLATNESS_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'general dimension'      : IF (SIZEOF(['SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE',
                                             'SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_LOCATION'] * v) = 1) THEN
                          RETURN(TRUE);
                        END_IF;
      'general note'      : IF 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PROPERTY_DEFINITION' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'general tolerance'  : IF 'SHAPE_TOLERANCE_SCHEMA.GEOMETRIC_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'label'      : IF 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PROPERTY_DEFINITION' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'linear dimension'      : IF 'SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'note'      		: IF 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PROPERTY_DEFINITION' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'ordinate dimension'      : IF 'SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE' IN v THEN
                          RETURN(TRUE);
                        END_IF;   
      'parallelism'      : IF 'SHAPE_TOLERANCE_SCHEMA.PARALLELISM_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'perpendicularity'      : IF 'SHAPE_TOLERANCE_SCHEMA.PERPENDICULARITY_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'position'      : IF 'SHAPE_TOLERANCE_SCHEMA.POSITION_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'profile of line'      : IF 'SHAPE_TOLERANCE_SCHEMA.LINE_PROFILE_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'profile of surface'      : IF 'SHAPE_TOLERANCE_SCHEMA.SURFACE_PROFILE_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'radial dimension'      : IF 'SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'roundness'      : IF 'SHAPE_TOLERANCE_SCHEMA.ROUNDNESS_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
                        
      'runout'      : IF 'SHAPE_TOLERANCE_SCHEMA.TOTAL_RUNOUT_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'straightness'      : IF 'SHAPE_TOLERANCE_SCHEMA.STRAIGHTNESS_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'surface roughness'      : IF 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PROPERTY_DEFINITION' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'symmetry'      : IF 'SHAPE_TOLERANCE_SCHEMA.SYMMETRY_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
      'total runout'      : IF 'SHAPE_TOLERANCE_SCHEMA.TOTAL_RUNOUT_TOLERANCE' IN v THEN
                          RETURN(TRUE);
                        END_IF;
    OTHERWISE : RETURN(FALSE);
  END_CASE;
         END_FUNCTION;
         
FUNCTION md_valid_content_in_geometric_set_for_placeholder
 (input : geometric_set) : BOOLEAN;
         LOCAL
pass : BOOLEAN := TRUE;
boxes : BAG OF planar_box := [];
texts : BAG OF annotation_text := [];
placements : BAG OF placement := [];
points : BAG OF point := [];
END_LOCAL;
--Iterate over the input, ensuring the points that are in the set are the subtypes we want.
REPEAT i := LOINDEX(input\geometric_set.elements) TO HIINDEX(input\geometric_set.elements);
  IF ('GEOMETRY_SCHEMA.POINT' IN TYPEOF (input\geometric_set.elements[i])) AND NOT
          (SIZEOF(['GEOMETRY_SCHEMA.CARTESIAN_POINT',
                   'GEOMETRY_SCHEMA.POINT_ON_CURVE',
                   'GEOMETRY_SCHEMA.POINT_ON_SURFACE'] * TYPEOF(input\geometric_set.elements[i])) = 1) THEN
 pass := FALSE;
 ELSE
  points := points + input\geometric_set.elements[i];
END_IF;
 IF 'PRESENTATION_RESOURCE_SCHEMA.PLANAR_BOX' IN TYPEOF(input\geometric_set.elements[i]) THEN
      boxes := boxes + input\geometric_set.elements[i];
  END_IF;
 IF 'PRESENTATION_DEFINITION_SCHEMA.ANNOTATION_TEXT' IN TYPEOF(input\geometric_set.elements[i]) THEN
      texts := texts + input\geometric_set.elements[i];
  END_IF;
 IF 'GEOMETRY_SCHEMA.PLACEMENT' IN TYPEOF(input\geometric_set.elements[i]) THEN
      placements := placements + input\geometric_set.elements[i];
  END_IF;
END_REPEAT;
IF SIZEOF(boxes) > 1 THEN
 Pass := FALSE;
 END_IF;
IF SIZEOF(texts) > 1 THEN
 Pass := FALSE;
 END_IF;
IF SIZEOF(placements) <> 1 THEN
 Pass := FALSE;
 END_IF;
RETURN(pass);
         END_FUNCTION;
         
         END_SCHEMA;  -- mechanical_design_schema