(* $Id: product_property_representation_schema.exp,v 1.65 2021/05/06 16:23:00 kevin Exp $ ISO 10303 TC184/SC4/WG12 N10355 EXPRESS Source: ISO 10303-41 ed7 Fundamentals of product description and support - Product property representation schema The following permission notice and disclaimer shall be included in all copies of this EXPRESS schema ("the Schema"), and derivations of the Schema: Copyright ISO 2021 All rights reserved Permission is hereby granted, free of charge in perpetuity, to any person obtaining a copy of the Schema, to use, copy, modify, merge and distribute free of charge, copies of the Schema for the purposes of developing, implementing, installing and using software based on the Schema, and to permit persons to whom the Schema is furnished to do so, subject to the following conditions: THE SCHEMA IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SCHEMA OR THE USE OR OTHER DEALINGS IN THE SCHEMA. In addition, any modified copy of the Schema shall include the following notice: THIS SCHEMA HAS BEEN MODIFIED FROM THE SCHEMA DEFINED IN ISO 10303-41 ed7 Fundamentals of product description and support - Product property representation schema AND SHOULD NOT BE INTERPRETED AS COMPLYING WITH THAT STANDARD *) SCHEMA product_property_representation_schema '{iso standard 10303 part(41) version(10) object(1) product_property_representation_schema(20)}'; 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 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 chained_representation_link = SELECT (mapped_item, representation_context, representation_relationship); END_TYPE; TYPE represented_definition = SELECT ( general_property, property_definition, property_definition_relationship, shape_aspect, shape_aspect_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; 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 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 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 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;