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