Schema: mechanical_design_schema

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