(* $Id: product_property_definition_schema.exp,v 1.35 2021/05/06 16:23:00 kevin Exp $ ISO 10303 TC184/SC4/WG12 N10886 EXPRESS Source: ISO 10303-41 ed7 Fundamentals of product description and support - Product property definition 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 definition schema AND SHOULD NOT BE INTERPRETED AS COMPLYING WITH THAT STANDARD *) SCHEMA product_property_definition_schema '{iso standard 10303 part(41) version(10) object(1) product_property_definition_schema(19)}'; 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 ppds_id_attribute_select = SELECT BASED_ON id_attribute_select WITH ( property_definition, shape_aspect, shape_aspect_relationship); 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 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; 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; 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;