diff --git a/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_2_3.ids b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_2_3.ids new file mode 100644 index 0000000..1b2a7d5 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_2_3.ids @@ -0,0 +1,33 @@ + + + + A one sided restriction on a bounded property requires the matching bound 2/3 + Generated via code automation in the Ids Repository on github. + + + + + + + IFCWALL + + + + + + + Foo_Bar + + + Foo + + + + + + + + + + + \ No newline at end of file diff --git a/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_2_3.ifc b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_2_3.ifc new file mode 100644 index 0000000..2349165 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_2_3.ifc @@ -0,0 +1,19 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2026-08-05T00:00:00',(),(),'IfcOpenShell v0.8.0','IfcOpenShell v0.8.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('1FmBKp01LBiACpwVaAschw',$,$,$,$,$,$,$,#6); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,.MILLI.,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,.MILLI.,.CUBIC_METRE.); +#5=IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.); +#6=IFCUNITASSIGNMENT((#5,#4,#2,#3)); +#7=IFCWALL('1hllvgXn57QwBEuxoC9LPl',$,$,$,$,$,$,$,$); +#8=IFCPROPERTYSET('2PwdJaXF581fbt6kTURaVH',$,'Foo_Bar',$,(#10)); +#9=IFCRELDEFINESBYPROPERTIES('3o8fYQECLFrx$lRlXPKtoD',$,$,$,(#7),#8); +#10=IFCPROPERTYBOUNDEDVALUE('Foo',$,IFCLENGTHMEASURE(40000.),$,$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_3_3.ids b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_3_3.ids new file mode 100644 index 0000000..2d7a488 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_3_3.ids @@ -0,0 +1,33 @@ + + + + A one sided restriction on a bounded property requires the matching bound 3/3 + Generated via code automation in the Ids Repository on github. + + + + + + + IFCWALL + + + + + + + Foo_Bar + + + Foo + + + + + + + + + + + \ No newline at end of file diff --git a/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_3_3.ifc b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_3_3.ifc new file mode 100644 index 0000000..f6a609c --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_3_3.ifc @@ -0,0 +1,19 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2026-08-05T00:00:00',(),(),'IfcOpenShell v0.8.0','IfcOpenShell v0.8.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('3O0sv4DyTAAB$5skbLZ$xY',$,$,$,$,$,$,$,#6); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,.MILLI.,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,.MILLI.,.CUBIC_METRE.); +#5=IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.); +#6=IFCUNITASSIGNMENT((#5,#4,#2,#3)); +#7=IFCWALL('0E9xCMduPANAiCLhBW3Lnp',$,$,$,$,$,$,$,$); +#8=IFCPROPERTYSET('3YsK9JUPb7mflgt_hgZmde',$,'Foo_Bar',$,(#10)); +#9=IFCRELDEFINESBYPROPERTIES('2H77sYlnH92PsHk4BbyUXQ',$,$,$,(#7),#8); +#10=IFCPROPERTYBOUNDEDVALUE('Foo',$,$,$,$,IFCLENGTHMEASURE(25000.)); +ENDSEC; +END-ISO-10303-21; diff --git a/Documentation/ImplementersDocumentation/TestCases/property/fail-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_2_3.ids b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_2_3.ids new file mode 100644 index 0000000..23c9895 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_2_3.ids @@ -0,0 +1,34 @@ + + + + A restriction on a bounded property requires both bounds within range 2/3 + Generated via code automation in the Ids Repository on github. + + + + + + + IFCWALL + + + + + + + Foo_Bar + + + Foo + + + + + + + + + + + + \ No newline at end of file diff --git a/Documentation/ImplementersDocumentation/TestCases/property/fail-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_2_3.ifc b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_2_3.ifc new file mode 100644 index 0000000..c60e3c7 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/fail-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_2_3.ifc @@ -0,0 +1,19 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2026-08-05T00:00:00',(),(),'IfcOpenShell v0.8.0','IfcOpenShell v0.8.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('1z7Ch67On8teDImg33F4uf',$,$,$,$,$,$,$,#6); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,.MILLI.,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,.MILLI.,.CUBIC_METRE.); +#5=IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.); +#6=IFCUNITASSIGNMENT((#5,#4,#2,#3)); +#7=IFCWALL('0Nl6oJf2r5DhAqAvk9lDzI',$,$,$,$,$,$,$,$); +#8=IFCPROPERTYSET('035Z2$ojr5Hv04f6le26W9',$,'Foo_Bar',$,(#10)); +#9=IFCRELDEFINESBYPROPERTIES('1LS78BbKj1qu7Rp6_vqATo',$,$,$,(#7),#8); +#10=IFCPROPERTYBOUNDEDVALUE('Foo',$,IFCLENGTHMEASURE(30000.),IFCLENGTHMEASURE(20000.),$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/Documentation/ImplementersDocumentation/TestCases/property/pass-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_1_3.ids b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_1_3.ids new file mode 100644 index 0000000..fb54a00 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_1_3.ids @@ -0,0 +1,33 @@ + + + + A one sided restriction on a bounded property requires the matching bound 1/3 + Generated via code automation in the Ids Repository on github. + + + + + + + IFCWALL + + + + + + + Foo_Bar + + + Foo + + + + + + + + + + + \ No newline at end of file diff --git a/Documentation/ImplementersDocumentation/TestCases/property/pass-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_1_3.ifc b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_1_3.ifc new file mode 100644 index 0000000..3a16163 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_1_3.ifc @@ -0,0 +1,19 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2026-08-05T00:00:00',(),(),'IfcOpenShell v0.8.0','IfcOpenShell v0.8.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('21n1xf2$LE0eQPHILQ4EOB',$,$,$,$,$,$,$,#6); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,.MILLI.,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,.MILLI.,.CUBIC_METRE.); +#5=IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.); +#6=IFCUNITASSIGNMENT((#5,#4,#2,#3)); +#7=IFCWALL('0u6mB2q4H0DQDI$$L1C4zL',$,$,$,$,$,$,$,$); +#8=IFCPROPERTYSET('16$JOcbxT2kO1NGP6PDoRX',$,'Foo_Bar',$,(#10)); +#9=IFCRELDEFINESBYPROPERTIES('2OvTcy5W5E0Aoph4cLPsGG',$,$,$,(#7),#8); +#10=IFCPROPERTYBOUNDEDVALUE('Foo',$,$,IFCLENGTHMEASURE(25000.),$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_1_3.ids b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_1_3.ids new file mode 100644 index 0000000..52aac7e --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_1_3.ids @@ -0,0 +1,34 @@ + + + + A restriction on a bounded property requires both bounds within range 1/3 + Generated via code automation in the Ids Repository on github. + + + + + + + IFCWALL + + + + + + + Foo_Bar + + + Foo + + + + + + + + + + + + \ No newline at end of file diff --git a/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_1_3.ifc b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_1_3.ifc new file mode 100644 index 0000000..79d8c4d --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_1_3.ifc @@ -0,0 +1,19 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2026-08-05T00:00:00',(),(),'IfcOpenShell v0.8.0','IfcOpenShell v0.8.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('3Q_A$GN6j3Cv5CiwXBhwZo',$,$,$,$,$,$,$,#6); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,.MILLI.,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,.MILLI.,.CUBIC_METRE.); +#5=IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.); +#6=IFCUNITASSIGNMENT((#5,#4,#2,#3)); +#7=IFCWALL('30Usig1498rOyRQvqnBfVR',$,$,$,$,$,$,$,$); +#8=IFCPROPERTYSET('1HGx84yxr60RyH5PdDhPy5',$,'Foo_Bar',$,(#10)); +#9=IFCRELDEFINESBYPROPERTIES('0oWwNmtmv0XRz$6qsSkwCW',$,$,$,(#7),#8); +#10=IFCPROPERTYBOUNDEDVALUE('Foo',$,IFCLENGTHMEASURE(35000.),IFCLENGTHMEASURE(25000.),$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_3_3.ids b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_3_3.ids new file mode 100644 index 0000000..a7d3894 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_3_3.ids @@ -0,0 +1,34 @@ + + + + A restriction on a bounded property requires both bounds within range 3/3 + Generated via code automation in the Ids Repository on github. + + + + + + + IFCWALL + + + + + + + Foo_Bar + + + Foo + + + + + + + + + + + + \ No newline at end of file diff --git a/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_3_3.ifc b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_3_3.ifc new file mode 100644 index 0000000..b196989 --- /dev/null +++ b/Documentation/ImplementersDocumentation/TestCases/property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_3_3.ifc @@ -0,0 +1,19 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1'); +FILE_NAME('','2026-08-05T00:00:00',(),(),'IfcOpenShell v0.8.0','IfcOpenShell v0.8.0',''); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('19pSBO1vTBNgzebcXi_wcC',$,$,$,$,$,$,$,#6); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,.MILLI.,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,.MILLI.,.CUBIC_METRE.); +#5=IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.); +#6=IFCUNITASSIGNMENT((#5,#4,#2,#3)); +#7=IFCWALL('2W7hvDehr4HgNrABTNhmZF',$,$,$,$,$,$,$,$); +#8=IFCPROPERTYSET('3DKto$qK15D9xBybBax7WX',$,'Foo_Bar',$,(#10)); +#9=IFCRELDEFINESBYPROPERTIES('2Z1OozacT118eUKavrG1BU',$,$,$,(#7),#8); +#10=IFCPROPERTYBOUNDEDVALUE('Foo',$,IFCLENGTHMEASURE(40000.),IFCLENGTHMEASURE(30000.),$,$); +ENDSEC; +END-ISO-10303-21; diff --git a/Documentation/ImplementersDocumentation/TestCases/scripts.md b/Documentation/ImplementersDocumentation/TestCases/scripts.md index 0a0dd2e..c3bad4e 100644 --- a/Documentation/ImplementersDocumentation/TestCases/scripts.md +++ b/Documentation/ImplementersDocumentation/TestCases/scripts.md @@ -1953,6 +1953,80 @@ Requirements: Property: ''Foo_Bar'',''Foo'',IFCLENGTHMEASURE,''2'' ``` +### A restriction on a bounded property requires both bounds within range 1/3 + +A restriction facet (minInclusive, maxInclusive, minExclusive, maxExclusive) applied to a +property checks an IfcPropertyBoundedValue by its LowerBoundValue and UpperBoundValue. +SetPointValue is not considered, as it does not constrain the range of the property. +Both bounds must lie within the restriction for the specification to pass. + +``` ids property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_1_3.ids +A restriction on a bounded property requires both bounds within range 1/3 +Entity: ''IFCWALL'' +Requirements: +Property: ''Foo_Bar'',''Foo'',IFCLENGTHMEASURE,xs:double MinExclusive(''20'') MaxInclusive(''40'') +``` + +### A restriction on a bounded property requires both bounds within range 2/3 + +The lower bound sits exactly on the excluded end of the restriction, so it fails. + +``` ids property/fail-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_2_3.ids +A restriction on a bounded property requires both bounds within range 2/3 +Entity: ''IFCWALL'' +Requirements: +Property: ''Foo_Bar'',''Foo'',IFCLENGTHMEASURE,xs:double MinExclusive(''20'') MaxInclusive(''40'') +``` + +### A restriction on a bounded property requires both bounds within range 3/3 + +The upper bound sits exactly on the included end of the restriction, so it passes. + +``` ids property/pass-a_restriction_on_a_bounded_property_requires_both_bounds_within_range_3_3.ids +A restriction on a bounded property requires both bounds within range 3/3 +Entity: ''IFCWALL'' +Requirements: +Property: ''Foo_Bar'',''Foo'',IFCLENGTHMEASURE,xs:double MinExclusive(''20'') MaxInclusive(''40'') +``` + +### A one sided restriction on a bounded property requires the matching bound 1/3 + +When a restriction only constrains one end (here minInclusive), only the corresponding +bound of the IfcPropertyBoundedValue needs to be present and within range. The unconstrained +end may be absent. + +``` ids property/pass-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_1_3.ids +A one sided restriction on a bounded property requires the matching bound 1/3 +Entity: ''IFCWALL'' +Requirements: +Property: ''Foo_Bar'',''Foo'',IFCLENGTHMEASURE,xs:double MinInclusive(''20'') +``` + +### A one sided restriction on a bounded property requires the matching bound 2/3 + +The constrained end (LowerBoundValue) is missing, so the specification fails even though an +UpperBoundValue is present. + +``` ids property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_2_3.ids +A one sided restriction on a bounded property requires the matching bound 2/3 +Entity: ''IFCWALL'' +Requirements: +Property: ''Foo_Bar'',''Foo'',IFCLENGTHMEASURE,xs:double MinInclusive(''20'') +``` + +### A one sided restriction on a bounded property requires the matching bound 3/3 + +Only a SetPointValue is present, with neither a LowerBoundValue nor an UpperBoundValue. +SetPointValue is excluded from restriction checking, so this fails even though its value +would otherwise satisfy the restriction. + +``` ids property/fail-a_one_sided_restriction_on_a_bounded_property_requires_the_matching_bound_3_3.ids +A one sided restriction on a bounded property requires the matching bound 3/3 +Entity: ''IFCWALL'' +Requirements: +Property: ''Foo_Bar'',''Foo'',IFCLENGTHMEASURE,xs:double MinInclusive(''20'') +``` + ### Any matching value in a list property will pass 1/3 ``` ids property/pass-any_matching_value_in_a_list_property_will_pass_1_3.ids