Source : ISO 10303-41
SCHEMA product_property_representation_schema;
REFERENCE FROM
basic_attribute_schema -- ISO 10303-41
(description_attribute,
description_attribute_select,
get_description_value,
get_name_value,
name_attribute,
name_attribute_select);
REFERENCE FROM
material_property_definition_schema -- ISO 10303-45
(property_definition_relationship);
REFERENCE FROM
product_definition_schema -- ISO 10303-41
(product_definition,
product_definition_relationship);
REFERENCE FROM
product_property_definition_schema -- ISO 10303-41
(characterized_object,
characterized_definition,
general_property,
product_definition_shape,
property_definition,
shape_aspect,
shape_aspect_relationship);
REFERENCE FROM
product_structure_schema -- ISO 10303-44
(product_definition_specified_occurrence);
REFERENCE FROM
representation_schema -- ISO 10303-43
(representation,
representation_item,
representation_relationship,
representation_reference,
using_representations,
mapped_item,
representation_context,
representation_map,
list_representation_item,
set_representation_item,
get_representations_for_items);
REFERENCE FROM
support_resource_schema -- ISO 10303-41
(bag_to_set,
label,
text);
TYPE chained_representation_link =
SELECT
(mapped_item,
representation_context,
representation_relationship);
END_TYPE;
TYPE item_identified_representation_usage_definition =
EXTENSIBLE
GENERIC_ENTITY
SELECT
(represented_definition);
END_TYPE;
TYPE item_identified_representation_usage_select =
SELECT
(representation_item,
list_representation_item,
set_representation_item);
END_TYPE;
TYPE pprs_description_attribute_select =
SELECT
BASED_ON
description_attribute_select
WITH
(context_dependent_shape_representation,
property_definition_representation);
END_TYPE;
TYPE pprs_name_attribute_select =
SELECT
BASED_ON
name_attribute_select
WITH
(context_dependent_shape_representation,
property_definition_representation);
END_TYPE;
TYPE represented_definition =
SELECT
(general_property,
property_definition,
property_definition_relationship,
shape_aspect,
shape_aspect_relationship);
END_TYPE;
ENTITY chain_based_item_identified_representation_usage
SUBTYPE OF (item_identified_representation_usage);
nodes : LIST[2:?] OF
UNIQUE
representation;
undirected_link : LIST[1:?] OF chained_representation_link;
DERIVE
root : representation := nodes[1];
SELF\item_identified_representation_usage.used_representation RENAMED leaf : representation := nodes[HIINDEX(nodes)];
directed_link : LIST[1:?] OF representation_relationship := get_directed_link(nodes, undirected_link);
WHERE
WR1: EXISTS(directed_link);
END_ENTITY;
ENTITY characterized_chain_based_item_within_representation
SUBTYPE OF (characterized_item_within_representation);
nodes : LIST[2:?] OF
UNIQUE
representation;
undirected_link : LIST[1:?] OF chained_representation_link;
DERIVE
root : representation := nodes[1];
SELF\characterized_item_within_representation.rep RENAMED leaf : representation := nodes[HIINDEX(nodes)];
directed_link : LIST[1:?] OF representation_relationship := get_directed_link(nodes, undirected_link);
WHERE
WR1: EXISTS(directed_link);
END_ENTITY;
ENTITY characterized_item_within_representation
SUBTYPE OF (characterized_object);
item : representation_item;
rep : representation;
UNIQUE
UR1: item, rep;
WHERE
WR1: rep IN using_representations(item);
END_ENTITY;
ENTITY context_dependent_shape_representation;
representation_relation : shape_representation_relationship;
represented_product_relation : product_definition_shape;
DERIVE
description : text := get_description_value(SELF);
name : label := get_name_value(SELF);
WHERE
WR1: 'PRODUCT_DEFINITION_SCHEMA.PRODUCT_DEFINITION_RELATIONSHIP' IN TYPEOF(represented_product_relation\property_definition.definition);
WR2: SIZEOF(USEDIN(SELF, 'BASIC_ATTRIBUTE_SCHEMA.DESCRIPTION_ATTRIBUTE.DESCRIBED_ITEM')) <= 1;
WR3: SIZEOF(USEDIN(SELF, 'BASIC_ATTRIBUTE_SCHEMA.NAME_ATTRIBUTE.NAMED_ITEM')) <= 1;
END_ENTITY;
ENTITY item_identified_representation_usage;
name : label;
description :
OPTIONAL
text;
definition : item_identified_representation_usage_definition;
used_representation : representation;
identified_item : item_identified_representation_usage_select;
UNIQUE
UR1: used_representation, identified_item;
UR2: used_representation, definition;
WHERE
WR1: valid_identified_item_in_representation(identified_item, used_representation);
END_ENTITY;
ENTITY property_definition_representation;
definition : represented_definition;
used_representation : representation;
DERIVE
description : text := get_description_value(SELF);
name : label := get_name_value(SELF);
WHERE
WR1: SIZEOF(USEDIN(SELF, 'BASIC_ATTRIBUTE_SCHEMA.DESCRIPTION_ATTRIBUTE.DESCRIBED_ITEM')) <= 1;
WR2: SIZEOF(USEDIN(SELF, 'BASIC_ATTRIBUTE_SCHEMA.NAME_ATTRIBUTE.NAMED_ITEM')) <= 1;
END_ENTITY;
ENTITY shape_definition_representation
SUBTYPE OF (property_definition_representation);
SELF\property_definition_representation.definition : property_definition;
SELF\property_definition_representation.used_representation : shape_representation;
WHERE
WR1: ('PRODUCT_PROPERTY_DEFINITION_SCHEMA.PRODUCT_DEFINITION_SHAPE' IN TYPEOF(definition)) OR ('PRODUCT_PROPERTY_DEFINITION_SCHEMA.SHAPE_DEFINITION'
IN TYPEOF(definition\property_definition.definition));
END_ENTITY;
ENTITY shape_representation
SUBTYPE OF (representation);
END_ENTITY;
ENTITY shape_representation_reference
SUBTYPE OF (representation_reference);
END_ENTITY;
ENTITY shape_representation_relationship
SUBTYPE OF (representation_relationship);
WHERE
WR1: SIZEOF(['PRODUCT_PROPERTY_REPRESENTATION_SCHEMA.SHAPE_REPRESENTATION', 'PRODUCT_PROPERTY_REPRESENTATION_SCHEMA.SHAPE_REPRESENTATION_REFERENCE']
* (TYPEOF(SELF\representation_relationship.rep_1) + TYPEOF(SELF\representation_relationship.rep_2))) >= 1;
END_ENTITY;
ENTITY specified_occurrence_context_dependent_shape_representation
SUBTYPE OF (context_dependent_shape_representation);
sub_element : product_definition_specified_occurrence;
WHERE
WR1: 'PRODUCT_DEFINITION_SCHEMA.PRODUCT_DEFINITION_OCCURRENCE' IN TYPEOF(SELF.represented_product_relation.definition.related_product_definition);
WR2: sub_element IN represented_product_relation.definition.related_product_definition.descendant_occurrences;
END_ENTITY;
FUNCTION get_directed_link
(nodes : LIST OF representation; undirected_link : LIST OF chained_representation_link) : LIST OF representation_relationship;
LOCAL
directed_link : LIST OF representation_relationship := [];
END_LOCAL;
IF (SIZEOF(nodes) <> SIZEOF(undirected_link) + 1) OR (VALUE_UNIQUE(nodes) = FALSE)
THEN
RETURN(?);
END_IF;
REPEAT i := 1 TO SIZEOF(undirected_link);
CASE TRUE OF
('REPRESENTATION_SCHEMA.REPRESENTATION_CONTEXT' IN TYPEOF(undirected_link[i])) : BEGIN
IF ((nodes[i]\representation.context_of_items :=:
undirected_link[i]) AND
(nodes[i +
1]\representation.context_of_items :=:
undirected_link[i]))
THEN
INSERT(directed_link,
representation_relationship('',
'',
nodes[i +
1],
nodes[i]),
(i - 1));
ELSE
RETURN(?);
END_IF;
END;
('REPRESENTATION_SCHEMA.REPRESENTATION_RELATIONSHIP' IN TYPEOF(undirected_link[i])) : BEGIN
IF (((nodes[i] :=:
undirected_link[i]\representation_relationship.rep_1) AND
(nodes[i +
1] :=:
undirected_link[i]\representation_relationship.rep_2)) OR
((nodes[i] :=:
undirected_link[i]\representation_relationship.rep_2) AND
(nodes[i +
1] :=:
undirected_link[i]\representation_relationship.rep_1)))
THEN
INSERT(directed_link,
representation_relationship('',
'',
nodes[i +
1],
nodes[i]),
(i - 1));
ELSE
RETURN(?);
END_IF;
END;
('REPRESENTATION_SCHEMA.MAPPED_ITEM' IN TYPEOF(undirected_link[i])) : BEGIN
IF ((nodes[i] IN
using_representations(undirected_link[i])) AND
(nodes[i + 1] :=:
undirected_link[i]\mapped_item.mapping_source\representation_map.mapped_representation))
THEN
INSERT(directed_link,
representation_relationship('',
'',
nodes[i +
1],
nodes[i]),
(i - 1));
ELSE
RETURN(?);
END_IF;
END;
OTHERWISE: RETURN(?);
END_CASE;
END_REPEAT;
IF (VALUE_UNIQUE(directed_link) = FALSE)
THEN
RETURN(?);
END_IF;
RETURN(directed_link);
END_FUNCTION;
FUNCTION get_property_definition_representations
(c_def_instance : characterized_definition) : SET OF property_definition_representation;
LOCAL
pd_set : SET OF property_definition := [];
pdr_set : SET OF property_definition_representation := [];
END_LOCAL;
pd_set := bag_to_set(USEDIN(c_def_instance, 'PRODUCT_PROPERTY_DEFINITION_SCHEMA.PROPERTY_DEFINITION.DEFINITION'));
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_REPRESENTATION_SCHEMA.PROPERTY_DEFINITION_REPRESENTATION.DEFINITION'));
END_REPEAT;
RETURN(pdr_set);
END_FUNCTION;
FUNCTION relatives_of_product_definitions
(definition_set : SET OF product_definition; relation_subtype : STRING) : SET OF product_definition;
FUNCTION local_relatives_of_product_definitions(definition_set : SET OF product_definition;
total_definitions : SET OF product_definition;
relation_subtype : STRING) : SET OF product_definition;
LOCAL
local_def : SET OF product_definition := [];
local_pdr : SET OF product_definition_relationship := [];
local_total : SET OF product_definition := [];
END_LOCAL;
REPEAT i := 1 TO HIINDEX(definition_set);
local_pdr := local_pdr + bag_to_set(USEDIN(definition_set[i], relation_subtype + '.RELATING_PRODUCT_DEFINITION'));
END_REPEAT;
REPEAT i := 1 TO HIINDEX(local_pdr);
local_def := local_def + local_pdr[i].related_product_definition;
END_REPEAT;
IF (SIZEOF(local_def) - SIZEOF(total_definitions)) = 0
THEN
RETURN(local_def);
ELSE
local_total := total_definitions + local_def;
RETURN(local_def +
(local_relatives_of_product_definitions(local_def - total_definitions, local_total, relation_subtype)));
END_IF;
END_FUNCTION;
RETURN(local_relatives_of_product_definitions(definition_set, definition_set, relation_subtype));
END_FUNCTION;
FUNCTION relatives_of_shape_representations
(shape_representation_set : SET OF shape_representation) : SET OF shape_representation;
FUNCTION local_relatives_of_shape_representations(shape_representation_set : SET OF shape_representation;
total_reps : SET OF shape_representation) : SET OF shape_representation;
LOCAL
local_shape_rep : SET OF shape_representation := [];
local_srr : SET OF shape_representation_relationship := [];
local_total : SET OF shape_representation := [];
END_LOCAL;
REPEAT i := 1 TO HIINDEX(shape_representation_set);
local_srr := local_srr +
QUERY(rr
<* bag_to_set(USEDIN(shape_representation_set[i], 'REPRESENTATION_SCHEMA.REPRESENTATION_RELATIONSHIP.REP_1'))
| 'PRODUCT_PROPERTY_REPRESENTATION_SCHEMA.SHAPE_REPRESENTATION_RELATIONSHIP' IN TYPEOF(rr));
END_REPEAT;
REPEAT i := 1 TO HIINDEX(local_srr);
IF 'PRODUCT_PROPERTY_REPRESENTATION_SCHEMA.SHAPE_REPRESENTATION_RELATIONSHIP' IN TYPEOF(local_srr[i])
THEN
local_shape_rep := local_shape_rep + local_srr[i].rep_2;
END_IF;
END_REPEAT;
IF SIZEOF(local_shape_rep - total_reps) = 0
THEN
RETURN(shape_representation_set);
ELSE
local_total := total_reps + local_shape_rep;
RETURN(local_shape_rep + (local_relatives_of_shape_representations(local_shape_rep - total_reps, local_total)));
END_IF;
END_FUNCTION;
RETURN(local_relatives_of_shape_representations(shape_representation_set, shape_representation_set));
END_FUNCTION;
FUNCTION valid_identified_item_in_representation
(identified_item : item_identified_representation_usage_select; used_representation : representation) : BOOLEAN;
LOCAL
i : INTEGER := 1;
END_LOCAL;
IF 'REPRESENTATION_SCHEMA.REPRESENTATION_ITEM' IN TYPEOF(identified_item)
THEN
RETURN(used_representation IN using_representations(identified_item));
END_IF;
IF ('REPRESENTATION_SCHEMA.LIST_REPRESENTATION_ITEM' IN TYPEOF(identified_item)) OR
('REPRESENTATION_SCHEMA.SET_REPRESENTATION_ITEM' IN TYPEOF(identified_item))
THEN
REPEAT WHILE (EXISTS(identified_item[i]));
IF NOT (used_representation IN using_representations(identified_item[i]))
THEN
RETURN(FALSE);
END_IF;
i := i + 1;
END_REPEAT;
RETURN(TRUE);
END_IF;
RETURN(?);
END_FUNCTION;
END_SCHEMA; -- product_property_representation_schema