Skip to content

Commit 39b3c6f

Browse files
authored
Merge pull request #376 from buildingSMART/IVS-401-SPS007-Exception-Annotation-As-Hosted-Element
IVS-401 - Add SPS007 exception for hosted annotations
2 parents 0773fa5 + 7c99948 commit 39b3c6f

13 files changed

+313
-21
lines changed

Diff for: features/rules/SPS/SPS007_Spatial-containment.feature

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
@implementer-agreement
22
@SPS
3-
@version4
3+
@version5
44
@E00040
55

66
Feature: SPS007 - Spatial Containment
77
The rule verifies that spatial containment via IfcRelContainedInSpatialStructure is utilised in accordance with Concept Template for Spatial Containment
88

9-
Scenario Outline: Instances of IfcAnnotation and IfcGrid must be contained within a spatial structure
109

11-
Given an .<entity>.
12-
Then a *required* relationship IfcRelContainedInSpatialStructure to IfcElement from IfcSpatialElement
10+
Scenario: Instances of IfcGrid must be contained within a spatial structure
11+
12+
Given an .IfcGrid.
13+
Then a relationship IfcRelContainedInSpatialStructure must exist to IfcGrid from IfcSpatialElement
14+
15+
16+
Scenario: Instances of IfcAnnotation must be contained within a spatial structure, except when the annotation is already a hosted eleent
17+
18+
Given an .IfcAnnotation.
19+
Given A relationship IfcRelNests does not exist to IfcAnnotation from IfcAnnotation
1320

14-
Examples:
15-
| entity |
16-
| IfcGrid |
17-
| IfcAnnotation |
21+
Then a relationship IfcRelContainedInSpatialStructure must exist to IfcAnnotation from IfcSpatialElement
1822

1923

2024
Scenario: Instances of IfcElement must be part of a spatial structure, with certain exceptions

Diff for: features/steps/givens/relationships.py

+11-12
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@
66

77

88
@gherkin_ifc.step('A relationship {relationship} {dir1:from_to} {entity} {dir2:from_to} {other_entity}')
9-
@gherkin_ifc.step('A relationship {relationship} exists {dir1:from_to} {entity} {dir2:from_to} {other_entity}')
10-
@gherkin_ifc.step('A relationship {relationship} must exist {dir1:from_to} {entity} {dir2:from_to} {other_entity}')
9+
@gherkin_ifc.step('A relationship {relationship} {exist_or_not_exist:exist_or_not_exist} {dir1:from_to} {entity} {dir2:from_to} {other_entity}')
10+
@gherkin_ifc.step('A relationship {relationship} {exist_or_not_exist:exist_or_not_exist} {dir1:from_to} {entity} {dir2:from_to} {other_entity}')
11+
@gherkin_ifc.step('A relationship {relationship} {exist_or_not_exist:exist_or_not_exist} {dir1:from_to} {entity} {dir2:from_to} {other_entity}')
1112
@gherkin_ifc.step('A relationship {relationship} {dir1:from_to} {entity} {dir2:from_to} {other_entity} {tail:maybe_and_following_that}')
1213
@gherkin_ifc.step('A *{required}* relationship {relationship} {dir1:from_to} {entity} {dir2:from_to} {other_entity}')
1314
@gherkin_ifc.step('A *{required}* relationship {relationship} {dir1:from_to} {entity} {dir2:from_to} {other_entity} {tail:maybe_and_following_that}')
14-
def step_impl(context, inst, relationship, dir1, entity, dir2, other_entity, tail=" ", required=False):
15+
def step_impl(context, inst, relationship, dir1, entity, dir2, other_entity, tail=False, exist_or_not_exist='exists', required=False):
1516
"""""
1617
Reference to tfk ALB999 rule https://github.com/buildingSMART/ifc-gherkin-rules/pull/37
1718
"""
1819
assert dir1 != dir2
19-
20-
if 'must exist' in context.step.name: # Fitting better with 'Then' statements
21-
required=True
22-
tail=1 # output the other entity
20+
21+
required = exist_or_not_exist != "does not exist"
22+
if exist_or_not_exist == 'must exist':
23+
tail=True # output the other entity
2324

2425
instances = []
2526
filename_related_attr_matrix = system.get_abs_path(f"resources/**/related_entity_attributes.csv")
@@ -54,16 +55,14 @@ def make_aggregate(val):
5455
yield ValidationOutcome(instance_id=inst, severity=OutcomeSeverity.ERROR)
5556

5657
if rel_attribute_name == attr_to_entity:
57-
if str(tail).strip():
58+
if tail:
5859
instances.extend(to_other)
5960
else:
6061
instances.append(inst)
6162

63+
severity = OutcomeSeverity.PASSED if bool(instances) == required else OutcomeSeverity.ERROR
64+
yield ValidationOutcome(instance_id=instances if instances else inst, severity=severity)
6265

63-
if instances:
64-
yield ValidationOutcome(instance_id=instances, severity=OutcomeSeverity.PASSED)
65-
if not instances and required:
66-
yield ValidationOutcome(instance_id=inst, severity=OutcomeSeverity.ERROR)
6766

6867

6968

Diff for: features/steps/registered_type_definitions.json

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"value_or_type": ["value", "type"],
44
"values_or_types": ["values", "types"],
55
"from_to": ["from", "to"],
6+
"exist_or_not_exist": ["exists", "must exist", "does not exist"],
67
"include_or_exclude_subtypes": ["including subtypes", "excluding subtypes"],
78
"first_or_final": ["first", "final"],
89
"absence_or_presence": ["absence", "presence"],

Diff for: features/steps/validation_handling.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def handle_given(context, fn, **kwargs):
135135
pass # (1) -> context.applicable is set within the function ; replace this with a simple True/False and set applicability here?
136136
else:
137137
context._push('attribute') # for attribute stacking
138-
depth = next(map(int, re.findall('at depth (\d+)$', context.step.name)), 0)
138+
depth = next(map(int, re.findall(r'at depth (\d+)$', context.step.name)), 0)
139139
if depth:
140140
context.instances = list(filter(None, map_given_state(context.instances, fn, context, depth=depth, **kwargs)))
141141
else:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition[Ifc4x3NotAssigned]'),'2;1');
4+
FILE_NAME('testfile.ifc','2022-09-16T10:35:07',('John Smith'),('buildingSMART Int.'),'MyToolboxName Version 1.0','Acme Inc. - TNT BIM 2025 - 25.1.0.0','');
5+
FILE_SCHEMA(('IFC4X3_ADD2'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPROJECT('2LJesmETv6W9jWXnI$q1Aj',#2,'sOhp2Q','aVY0hE',$,$,$,(#12),#7);
9+
#2=IFCOWNERHISTORY(#3,#6,$,.NOCHANGE.,$,$,$,1736381325);
10+
#3=IFCPERSONANDORGANIZATION(#4,#5,$);
11+
#4=IFCPERSON($,'nuvnTe','2i2zIDMqly',$,$,$,$,$);
12+
#5=IFCORGANIZATION($,'Ejm7vQJXZ','h5GCeytk',$,$);
13+
#6=IFCAPPLICATION(#5,'15.0C1r [DEVELOP] Pre RC3','QTOQcV','6WjUdPqnCj');
14+
#7=IFCUNITASSIGNMENT((#8,#9,#10,#11));
15+
#8=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
16+
#9=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
17+
#10=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
18+
#11=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
19+
#12=IFCGEOMETRICREPRESENTATIONCONTEXT('3D','Model',3,1.E-06,#14,#18);
20+
#13=IFCLOCALPLACEMENT($,#14);
21+
#14=IFCAXIS2PLACEMENT3D(#15,#16,#17);
22+
#15=IFCCARTESIANPOINT((0.,0.,0.));
23+
#16=IFCDIRECTION((0.,0.,1.));
24+
#17=IFCDIRECTION((1.,0.,0.));
25+
#18=IFCDIRECTION((0.,1.));
26+
#19=IFCPROJECTEDCRS('n7rJmd','7yPIU9FJik','EPSG:7844','EPSG:5711','UTM','56',$);
27+
#20=IFCRIGIDOPERATION(#12,#19,0.,0.,0.);
28+
#21=IFCRELDECLARES('1wYK6WxCrEVuvIYx98krR$',#2,'vofFGYo','nDwErbk4bU',#1,(#22));
29+
#22=IFCACTOR('2mtFEuUsjAZvsYlSxLubX3',$,'XA5xdjh','m4g56gsA7B',$,#4);
30+
#23=IFCSITE('2G0ATHGhj5T8pYNNtAHW7K',#2,'qfpeGrpS','oF7Hjskd4',$,#13,$,$,.ELEMENT.,$,$,$,$,$);
31+
#24=IFCRELAGGREGATES('23F9xPv0L64BRir8Qemk5E',#2,'cq5acgJ','HRnXa7z',#1,(#23));
32+
#25=IFCFACILITY('1ImCI2aTD1DQ6ZcsL4wZU1',#2,'JlsLnx4','7oXx5GP7',$,#13,$,$,.ELEMENT.);
33+
#26=IFCRELAGGREGATES('2AnbcmI2r3HwhOaiFhHKMQ',#2,'JXZia1evi','VmSXvwm',#23,(#25));
34+
#27=IFCRELCONTAINEDINSPATIALSTRUCTURE('0y1pwwXIn9pwEP14uHse4P',#2,'Pa5r3Notr','vinelT',(#28),#25);
35+
#28=IFCANNOTATION('1GFw8fpSrCkwvlQELfbWOr',#2,'DCIXihc','DPi7Q1','Super',#13,$,.NOTDEFINED.);
36+
#29=IFCRELNESTS('1LQgC7nKPDjQAfw0DmWNY0',#2,'uL3uYt2eDQ','sWLGqD',#28,(#30,#56,#66));
37+
#30=IFCANNOTATION('1fkj9EL0v0eff8iKEOidbs',#2,'S8m2vSYM0','RFFqR3','Segment',#13,#31,.USERDEFINED.);
38+
#31=IFCPRODUCTDEFINITIONSHAPE('BbyZY4c','NP70F1c',(#32));
39+
#32=IFCSHAPEREPRESENTATION(#12,'Body','GeometricCurveSet',(#33));
40+
#33=IFCPOLYLINE((#34,#35));
41+
#34=IFCCARTESIANPOINT((256566.71394629,7411793.56535756,4.));
42+
#35=IFCCARTESIANPOINT((256594.45838039,7411770.44499658,4.));
43+
#36=IFCSURFACESTYLE('1nJ6XDkl',.POSITIVE.,(#37));
44+
#37=IFCSURFACESTYLERENDERING(#38,$,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.00390625),IFCSPECULAREXPONENT(10.),.NOTDEFINED.);
45+
#38=IFCCOLOURRGB('gRAhS5YdgC',0.,1.,1.);
46+
#39=IFCSTYLEDITEM(#33,(#36),'v8vJ7temNI');
47+
#40=IFCPROPERTYSET('0Ol2Jgfgr72OB3UwHJ3bJB',#2,'BYVKY8Smp','lLHExc',(#41));
48+
#41=IFCPROPERTYSINGLEVALUE('BCJr2bIKDG',$,IFCLABEL('QL_A'),$);
49+
#42=IFCRELDEFINESBYPROPERTIES('3vmuznZv162uPNM8KgB_XH',#2,'zDtQKPX6','P8NIkhl',(#30),#40);
50+
#43=IFCANNOTATION('3vdRugGU98pRy1KqQywEzE',#2,'uWZAyYcg','IdxaCcH','Segment',#13,#44,.USERDEFINED.);
51+
#44=IFCPRODUCTDEFINITIONSHAPE('ea8Vx5oAfz','oCkVkL6s',(#45));
52+
#45=IFCSHAPEREPRESENTATION(#12,'Body','GeometricCurveSet',(#46));
53+
#46=IFCPOLYLINE((#47,#48));
54+
#47=IFCCARTESIANPOINT((256594.45838039,7411770.44499658,4.));
55+
#48=IFCCARTESIANPOINT((256616.91816057,7411739.72794533,4.));
56+
#49=IFCSURFACESTYLE('2uSTnr3',.POSITIVE.,(#50));
57+
#50=IFCSURFACESTYLERENDERING(#51,$,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.00390625),IFCSPECULAREXPONENT(10.),.NOTDEFINED.);
58+
#51=IFCCOLOURRGB('dwYq5EzxB',1.,1.,0.);
59+
#52=IFCSTYLEDITEM(#46,(#49),'VK7ipU');
60+
#53=IFCPROPERTYSET('3kjduZ0CH6Th0tJi2JEbQW',#2,'fZyw4sd','GTdd8v',(#54));
61+
#54=IFCPROPERTYSINGLEVALUE('56CfvUYo',$,IFCLABEL('QL_B'),$);
62+
#55=IFCRELDEFINESBYPROPERTIES('1leKxrLELB9xu1rg3NCo31',#2,'jYw449ddDk','UVWSVs',(#43),#53);
63+
#56=IFCANNOTATION('27OpW74FDBKf4JI77HL1Qm',#2,'A9QiRUl','REAUVs','Segment',#13,#57,.USERDEFINED.);
64+
#57=IFCPRODUCTDEFINITIONSHAPE('ztMkL2b5','tQ8rwFLy',(#58));
65+
#58=IFCSHAPEREPRESENTATION(#12,'Body','GeometricCurveSet',(#59));
66+
#59=IFCPOLYLINE((#60,#61));
67+
#60=IFCCARTESIANPOINT((256616.91816057,7411739.72794533,4.));
68+
#61=IFCCARTESIANPOINT((256634.42357754,7411711.65322103,4.));
69+
#62=IFCSTYLEDITEM(#59,(#36),'ZMoD6aJ');
70+
#63=IFCPROPERTYSET('1cr8N58aXD0xSGTS5Vpzyc',#2,'bG0qWvjYvP','Jro32SquT',(#64));
71+
#64=IFCPROPERTYSINGLEVALUE('4LXS7JRjJ',$,IFCLABEL('QL_C'),$);
72+
#65=IFCRELDEFINESBYPROPERTIES('1X0Kp3$5bFn8LORUfIGEBK',#2,'RrOjaXJ','YHVya264',(#56),#63);
73+
#66=IFCANNOTATION('3faBgEd6H56Php6WY7iw5h',#2,'qgRe0LIfno','LFJDvojA','Segment',#13,#67,.USERDEFINED.);
74+
#67=IFCPRODUCTDEFINITIONSHAPE('EqvOS9','fOy1es',(#68));
75+
#68=IFCSHAPEREPRESENTATION(#12,'Body','GeometricCurveSet',(#69));
76+
#69=IFCPOLYLINE((#70,#71));
77+
#70=IFCCARTESIANPOINT((256634.42357754,7411711.65322103,4.));
78+
#71=IFCCARTESIANPOINT((256656.55306694,7411674.6606431,4.));
79+
#72=IFCSURFACESTYLE('iNXRHzrrQ',.POSITIVE.,(#73));
80+
#73=IFCSURFACESTYLERENDERING(#74,$,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.00390625),IFCSPECULAREXPONENT(10.),.NOTDEFINED.);
81+
#74=IFCCOLOURRGB('IL2bo26V',1.,0.,0.);
82+
#75=IFCSTYLEDITEM(#69,(#72),'qkvQh1B7S');
83+
#76=IFCPROPERTYSET('1mt3aV4eP3VuIo9W82VES_',#2,'ApsqlqrmR','ZXnEkynkQv',(#77));
84+
#77=IFCPROPERTYSINGLEVALUE('gEtzOQvuD',$,IFCLABEL('QL_D'),$);
85+
#78=IFCRELDEFINESBYPROPERTIES('36fQaoxJD5mu8W2K4gj2xW',#2,'NHZNyMZ','eJInZV',(#66),#76);
86+
#79=IFCRELNESTS('0HYv8wihb3uhAgacmz7eF1',#2,'CkdLqdjDA','8y1WrUIGKP',#28,(#80,#90,#100,#110,#120));
87+
#80=IFCANNOTATION('35uBkMP4n1kgZtxTnSoXze',#2,'bdgZ4Wk0','ciKQ2otYNC','Point',#13,#81,.USERDEFINED.);
88+
#81=IFCPRODUCTDEFINITIONSHAPE('8BCMiieVa','YJG7aeSbhL',(#82));
89+
#82=IFCSHAPEREPRESENTATION(#12,'Body','Point',(#83));
90+
#83=IFCCARTESIANPOINT((256566.71394629,7411793.56535756,4.));
91+
#84=IFCPROPERTYSET('2LbsCjtnP8fQ9uZh2WjxBL',#2,'CDmsl8YE','x9iFRjbP',(#85));
92+
#85=IFCPROPERTYSINGLEVALUE('mN6TgTzYZ',$,IFCLABEL('QL_1'),$);
93+
#86=IFCRELDEFINESBYPROPERTIES('2Vk_TWIr99T9gUyXh4AYfg',#2,'j83eMO','TcAGbLPEbd',(#80),#84);
94+
#87=IFCPROPERTYSET('0rn3K_g2r7jwAMrJu01tOv',#2,'ha566J','XYG1QM1',(#88));
95+
#88=IFCPROPERTYSINGLEVALUE('FWtJI5',$,IFCLABEL('42'),$);
96+
#89=IFCRELDEFINESBYPROPERTIES('0NwBLt_tP6uO7sjeQjUf4X',#2,'5X0t8m','b11NgAH',(#80),#87);
97+
#90=IFCANNOTATION('24FZ$6a5n4RPFT$$ZTbhjW',#2,'Vkrn3JRzwC','aUzFV3jYRl','Point',#13,#91,.USERDEFINED.);
98+
#91=IFCPRODUCTDEFINITIONSHAPE('jOGGcoCPi','rodt3Xu',(#92));
99+
#92=IFCSHAPEREPRESENTATION(#12,'Body','Point',(#93));
100+
#93=IFCCARTESIANPOINT((256594.45838039,7411770.44499658,4.));
101+
#94=IFCPROPERTYSET('2qxaELxGb9ceD18spndbJ5',#2,'q0swvBEn','Psr6a7n',(#95));
102+
#95=IFCPROPERTYSINGLEVALUE('ux44Z8',$,IFCLABEL('QL_2'),$);
103+
#96=IFCRELDEFINESBYPROPERTIES('0fsLl6fvn5$v6sCaaw6Smo',#2,'mLHV09I','P9ot3RM',(#90),#94);
104+
#97=IFCPROPERTYSET('1pNXa9_S97SADIbIwlhgy_',#2,'okJxSY','LPaFpwA',(#98));
105+
#98=IFCPROPERTYSINGLEVALUE('CdVdQvm',$,IFCLABEL('43'),$);
106+
#99=IFCRELDEFINESBYPROPERTIES('31AZAk_DX2CB23jFe_jgpc',#2,'rrNU04OuW','Lm22EKFi',(#90),#97);
107+
#100=IFCANNOTATION('0UfxIZhmb3ggEWn$T$IzG9',#2,'ulzwcS','YLEbwbnrZb','Point',#13,#101,.USERDEFINED.);
108+
#101=IFCPRODUCTDEFINITIONSHAPE('xg0VXEEa','pxcNuId',(#102));
109+
#102=IFCSHAPEREPRESENTATION(#12,'Body','Point',(#103));
110+
#103=IFCCARTESIANPOINT((256616.91816057,7411739.72794533,4.));
111+
#104=IFCPROPERTYSET('3I_Lg4OV5AEALi6tviBDAV',#2,'zFIorV','3HZkF5In',(#105));
112+
#105=IFCPROPERTYSINGLEVALUE('tWt3rI',$,IFCLABEL('QL_3'),$);
113+
#106=IFCRELDEFINESBYPROPERTIES('00o0RSxur7$ACZMfkRUVle',#2,'oI7Qtw','hY5uK5tffg',(#100),#104);
114+
#107=IFCPROPERTYSET('3wZSDPCpv6Rw0EYzPBxEw_',#2,'gxDeu4','ppVaP7w',(#108));
115+
#108=IFCPROPERTYSINGLEVALUE('d5ZqoP44fn',$,IFCLABEL('44'),$);
116+
#109=IFCRELDEFINESBYPROPERTIES('0jheQJrUnEsBFf3UgrLlBO',#2,'vMMWM4W','IBJpQR9B',(#100),#107);
117+
#110=IFCANNOTATION('0mviqeoEj8OB2mgkv3bw2_',#2,'ymBJcqX','nHo3t1CW','Point',#13,#111,.USERDEFINED.);
118+
#111=IFCPRODUCTDEFINITIONSHAPE('p5Q3nI7zJ','zzA9N7b',(#112));
119+
#112=IFCSHAPEREPRESENTATION(#12,'Body','Point',(#113));
120+
#113=IFCCARTESIANPOINT((256634.42357754,7411711.65322103,4.));
121+
#114=IFCPROPERTYSET('0TrAZmLGnE5OSFgWg84rNI',#2,'O6KepO','8vlMLH9KNI',(#115));
122+
#115=IFCPROPERTYSINGLEVALUE('ZdTCmHTe7',$,IFCLABEL('QL_4'),$);
123+
#116=IFCRELDEFINESBYPROPERTIES('3n6_AAO_X6Tuakpbm8G5QY',#2,'GZVPucBO','bBfxoljRKq',(#110),#114);
124+
#117=IFCPROPERTYSET('3czVUhqKjFNQutWg_yP6KE',#2,'O1lfwXZLp','mzsv2v',(#118));
125+
#118=IFCPROPERTYSINGLEVALUE('ao2VOn8T5',$,IFCLABEL('45'),$);
126+
#119=IFCRELDEFINESBYPROPERTIES('3KW_pJdt19zu1QPeB0N1ul',#2,'dQ6LWVLCqU','7bamiTTPvs',(#110),#117);
127+
#120=IFCANNOTATION('1q8684DOj0HQZgQBsuUqHw',#2,'kx9nLje','6L1A8cKmMy','Point',#13,#121,.USERDEFINED.);
128+
#121=IFCPRODUCTDEFINITIONSHAPE('yFMTWxuwz','0kzi20MpMn',(#122));
129+
#122=IFCSHAPEREPRESENTATION(#12,'Body','Point',(#123));
130+
#123=IFCCARTESIANPOINT((256656.55306694,7411674.6606431,4.));
131+
#124=IFCPROPERTYSET('2EVrySCDb6HO8Y4LjSig21',#2,'kJ1rAE','a6NUDURo',(#125));
132+
#125=IFCPROPERTYSINGLEVALUE('NVXDEtV4w5',$,IFCLABEL('QL_5'),$);
133+
#126=IFCRELDEFINESBYPROPERTIES('3mF418nNzFbw04582d6A2U',#2,'KtZH0djJdM','MvfHilTj',(#120),#124);
134+
#127=IFCPROPERTYSET('0PhZ4Sd1PFyxjyry$m$4ek',#2,'6fxm0w','bUw7smV',(#128));
135+
#128=IFCPROPERTYSINGLEVALUE('Q0XJzclJ',$,IFCLABEL('46'),$);
136+
#129=IFCRELDEFINESBYPROPERTIES('2rv44v$CD0mBpD61uUbitb',#2,'vVjFNaeT0U','DuJh5qah',(#120),#127);
137+
#130=IFCPROPERTYSET('3QjtlWQVT1cOJ2v7QwzMaA',#2,'q8yVeGp','dSMOKq',(#131,#132,#133));
138+
#131=IFCPROPERTYSINGLEVALUE('ehs7fj1Xc',$,IFCLABEL('RCP'),$);
139+
#132=IFCPROPERTYSINGLEVALUE('PQFRZULuF',$,IFCLABEL('diameter'),$);
140+
#133=IFCPROPERTYSINGLEVALUE('TT2BxwG',$,IFCREAL(2.4),$);
141+
#134=IFCRELDEFINESBYPROPERTIES('3J$EmzzEb0ng9aZ8mUhlNb',#2,'9KH9Gp5ZJ','NB5GVVJ2k',(#28),#130);
142+
#135=IFCPRESENTATIONLAYERASSIGNMENT('oxCf02','XWvirOuyuu',(#32,#45,#58,#68,#82,#92,#102,#112,#122),'');
143+
ENDSEC;
144+
END-ISO-10303-21;

0 commit comments

Comments
 (0)