Schema: product_property_definition_schema

Source : ISO 10303-41



SCHEMA product_property_definition_schema;

REFERENCE FROM basic_attribute_schema   -- ISO 10303-41
  (get_id_value,
   id_attribute,
   id_attribute_select);

REFERENCE FROM process_property_schema   -- ISO 10303-49
  (action_property,
   resource_property);

REFERENCE FROM product_definition_schema   -- ISO 10303-41
  (product_definition,
   product_definition_relationship,
   product_definition_relationship_relationship);

REFERENCE FROM product_property_representation_schema   -- ISO 10303-41
  (item_identified_representation_usage);

REFERENCE FROM product_structure_schema   -- ISO 10303-44
  (assembly_component_usage,
   multi_level_reference_designator,
   next_assembly_usage_occurrence,
   product_definition_occurrence);

REFERENCE FROM shape_dimension_schema   -- ISO 10303-47
  (dimensional_location,
   dimensional_size);

REFERENCE FROM shape_tolerance_schema   -- ISO 10303-47
  (geometric_tolerance);

REFERENCE FROM support_resource_schema   -- ISO 10303-41
  (bag_to_set,
   identifier,
   label,
   text);


TYPE characterized_definition = SELECT
   (characterized_item,
    characterized_object,
    characterized_product_definition,
    shape_definition);
END_TYPE;

TYPE characterized_item = SELECT
   (item_identified_representation_usage,
    dimensional_size,
    geometric_tolerance);
END_TYPE;

TYPE characterized_product_definition = SELECT
   (product_definition,
    product_definition_occurrence,
    product_definition_relationship,
    product_definition_relationship_relationship);
END_TYPE;

TYPE derived_property_select = SELECT
   (property_definition,
    action_property,
    resource_property,
    dimensional_location,
    dimensional_size,
    geometric_tolerance);
END_TYPE;

TYPE internal_or_reflected_shape_aspect = SELECT
   (shape_aspect,
    identifier);
END_TYPE;

TYPE multi_or_next_assembly_usage_occurrence = SELECT
   (multi_level_reference_designator,
    next_assembly_usage_occurrence);
END_TYPE;

TYPE ppds_id_attribute_select = SELECT BASED_ON id_attribute_select WITH
   (property_definition,
    shape_aspect,
    shape_aspect_relationship);
END_TYPE;

TYPE shape_aspect_or_characterized_object = SELECT
   (shape_aspect,
    characterized_object);
END_TYPE;

TYPE shape_definition = SELECT
   (product_definition_shape,
    shape_aspect,
    shape_aspect_relationship);
END_TYPE;

ENTITY characterized_object;
  name : label;
  description : OPTIONAL text;
END_ENTITY;

ENTITY characterized_object_relationship;
  name : label;
  description : OPTIONAL text;
  relating_object : characterized_object;
  related_object : characterized_object;
END_ENTITY;

ENTITY component_path_shape_aspect
  SUBTYPE OF (shape_aspect);
  location : multi_or_next_assembly_usage_occurrence;
  component_shape_aspect : internal_or_reflected_shape_aspect;
UNIQUE
  UR1: location, component_shape_aspect;
END_ENTITY;

ENTITY constituent_shape_aspect
  SUBTYPE OF (shape_aspect);
  parent : shape_aspect;
DERIVE
  SELF\shape_aspect.of_shape : product_definition_shape := get_product_definition_shape(SELF);
END_ENTITY;

ENTITY general_property;
  id : identifier;
  name : label;
  description : OPTIONAL text;
END_ENTITY;

ENTITY general_property_association;
  name : label;
  description : OPTIONAL text;
  base_definition : general_property;
  derived_definition : derived_property_select;
WHERE
  WR1: (SIZEOF(['SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_LOCATION', 'SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE', 'SHAPE_TOLERANCE_SCHEMA.GEOMETRIC_TOLERANCE'] * TYPEOF(derived_definition)) > 0) OR (SIZEOF(USEDIN(derived_definition, 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.GENERAL_PROPERTY_ASSOCIATION.DERIVED_DEFINITION')) = 1);
  WR2: (SIZEOF(['SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_LOCATION', 'SHAPE_DIMENSION_SCHEMA.DIMENSIONAL_SIZE', 'SHAPE_TOLERANCE_SCHEMA.GEOMETRIC_TOLERANCE'] * TYPEOF(derived_definition)) > 0) OR (derived_definition.name = base_definition.name);
END_ENTITY;

ENTITY general_property_relationship;
  name : label;
  description : OPTIONAL text;
  relating_property : general_property;
  related_property : general_property;
END_ENTITY;

ENTITY product_definition_shape
  SUBTYPE OF (property_definition);
UNIQUE
  UR1: SELF\property_definition.definition;
WHERE
  WR1: SIZEOF(['PRODUCT_PROPERTY_DEFINITION_SCHEMA.CHARACTERIZED_PRODUCT_DEFINITION', 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.CHARACTERIZED_OBJECT'] * TYPEOF(SELF\property_definition.definition)) > 0;
END_ENTITY;

ENTITY property_definition;
  name : label;
  description : OPTIONAL text;
  definition : characterized_definition;
DERIVE
  id : identifier := get_id_value(SELF);
WHERE
  WR1: SIZEOF(USEDIN(SELF, 'BASIC_ATTRIBUTE_SCHEMA.ID_ATTRIBUTE.IDENTIFIED_ITEM')) <= 1;
END_ENTITY;

ENTITY shape_aspect
  SUPERTYPE OF (ONEOF (shape_aspect_occurrence,
                       component_path_shape_aspect)
               ANDOR constituent_shape_aspect);
  name : label;
  description : OPTIONAL text;
  of_shape : product_definition_shape;
  product_definitional : LOGICAL;
DERIVE
  id : identifier := get_id_value(SELF);
UNIQUE
  UR1: id, of_shape;
WHERE
  WR1: SIZEOF(USEDIN(SELF, 'BASIC_ATTRIBUTE_SCHEMA.ID_ATTRIBUTE.IDENTIFIED_ITEM')) <= 1;
END_ENTITY;

ENTITY shape_aspect_occurrence
  SUBTYPE OF (shape_aspect);
  definition : shape_aspect_or_characterized_object;
WHERE
  WR1: acyclic_shape_aspect_occurrence(SELF, definition);
END_ENTITY;

ENTITY shape_aspect_relationship;
  name : label;
  description : OPTIONAL text;
  relating_shape_aspect : shape_aspect;
  related_shape_aspect : shape_aspect;
DERIVE
  id : identifier := get_id_value(SELF);
WHERE
  WR1: SIZEOF(USEDIN(SELF, 'BASIC_ATTRIBUTE_SCHEMA.ID_ATTRIBUTE.IDENTIFIED_ITEM')) <= 1;
END_ENTITY;

FUNCTION acyclic_characterized_object_relationship
 (relation : characterized_object_relationship; relatives : SET[1:?] OF characterized_object; specific_relation : STRING) : BOOLEAN;
  LOCAL
  x : SET OF characterized_object_relationship;
    END_LOCAL;
      IF relation.relating_object IN relatives
  THEN
    RETURN(FALSE);
  END_IF;
      x := QUERY(ca
                 <* bag_to_set(USEDIN(relation.relating_object, 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.CHARACTERIZED_OBJECT_RELATIONSHIP.RELATED_OBJECT'))
                 | specific_relation IN TYPEOF(ca));
      REPEAT i := 1 TO HIINDEX(x);
    IF NOT acyclic_characterized_object_relationship(x[i], relatives + relation.relating_object, specific_relation)
    THEN
      RETURN(FALSE);
    END_IF;
  END_REPEAT;
      RETURN(TRUE);
END_FUNCTION;

FUNCTION acyclic_general_property_relationship
 (relation : general_property_relationship; relatives : SET[1:?] OF general_property; specific_relation : STRING) : BOOLEAN;
  LOCAL
  x : SET OF general_property_relationship;
    END_LOCAL;
      IF relation.relating_property IN relatives
  THEN
    RETURN(FALSE);
  END_IF;
      x := QUERY(genp
                 <* bag_to_set(USEDIN(relation.relating_property, 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.GENERAL_PROPERTY_RELATIONSHIP.RELATED_PROPERTY'))
                 | specific_relation IN TYPEOF(genp));
      REPEAT i := 1 TO HIINDEX(x);
    IF NOT acyclic_general_property_relationship(x[i], relatives + relation.relating_property, specific_relation)
    THEN
      RETURN(FALSE);
    END_IF;
  END_REPEAT;
      RETURN(TRUE);
END_FUNCTION;

FUNCTION acyclic_shape_aspect_occurrence
 (sao : shape_aspect_occurrence; definition : shape_aspect_or_characterized_object) : BOOLEAN;
    IF NOT (('PRODUCT_PROPERTY_DEFINITION_SCHEMA.SHAPE_ASPECT_OCCURRENCE') IN TYPEOF(definition))
  THEN
    RETURN(TRUE);
  END_IF;
      IF (definition :=: sao)
  THEN
    RETURN(FALSE);
  ELSE
    RETURN(acyclic_shape_aspect_occurrence(sao, definition\shape_aspect_occurrence.definition));
  END_IF;
END_FUNCTION;

FUNCTION acyclic_shape_aspect_relationship
 (relation : shape_aspect_relationship; relatives : SET[1:?] OF shape_aspect; specific_relation : STRING) : BOOLEAN;
  LOCAL
  x : SET OF shape_aspect_relationship;
    END_LOCAL;
      IF relation.relating_shape_aspect IN relatives
  THEN
    RETURN(FALSE);
  END_IF;
      x := QUERY(sa
                 <* bag_to_set(USEDIN(relation.relating_shape_aspect, 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.SHAPE_ASPECT_RELATIONSHIP.RELATED_SHAPE_ASPECT'))
                 | specific_relation IN TYPEOF(sa));
      REPEAT i := 1 TO HIINDEX(x);
    IF NOT acyclic_shape_aspect_relationship(x[i], relatives + relation.relating_shape_aspect, specific_relation)
    THEN
      RETURN(FALSE);
    END_IF;
  END_REPEAT;
      RETURN(TRUE);
END_FUNCTION;

FUNCTION get_product_definition_shape
 (current : constituent_shape_aspect) : product_definition_shape;
    REPEAT WHILE ('PRODUCT_DEFINITION_SCHEMA.CONSTITUENT_SHAPE_ASPECT' IN TYPEOF(current.parent));
    current := current.parent;
  END_REPEAT;
      RETURN(current.parent\shape_aspect.of_shape);
END_FUNCTION;

FUNCTION get_shape_aspects
 (c_def_instance : characterized_definition) : SET OF shape_aspect;
  LOCAL
  pd_set : SET OF product_definition_shape := [];
  pdr_set : SET OF shape_aspect := [];
    END_LOCAL;
      pd_set := bag_to_set(QUERY(pd
                                 <* USEDIN(c_def_instance, 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PROPERTY_DEFINITION.DEFINITION')
                                 | 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PRODUCT_DEFINITION_SHAPE' IN TYPEOF(pd)));
      IF (SIZEOF(pd_set) < 1)
  THEN
    RETURN(pdr_set);
  END_IF;
      REPEAT i := 1 TO HIINDEX(pd_set);
    pdr_set := pdr_set + bag_to_set(USEDIN(pd_set[i], 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.SHAPE_ASPECT.OF_SHAPE'));
  END_REPEAT;
      RETURN(pdr_set);
END_FUNCTION;

END_SCHEMA;  -- product_property_definition_schema