Skip to content

Commit e5a6c40

Browse files
authored
IVS-22 / BLT002 - Correct use of partitioning type attributes for windows (#283)
1 parent 84a140c commit e5a6c40

9 files changed

+279
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
@implementer-agreement
2+
@BLT
3+
@version1
4+
@E00020
5+
6+
Feature: BLT002 - Correct use of partitioning type attributes for windows
7+
8+
The rule verifies that attribute UserDefinedPartitioningType is provided only when
9+
the value of the attribute PartitioningType is set to USERDEFINED.
10+
11+
Scenario Outline: Correct values for PartitioningType and UserDefinedPartitioningType
12+
13+
Given an <entity>
14+
Given UserDefinedPartitioningType = not empty
15+
Given IsTypedBy = empty
16+
17+
Then PartitioningType = 'USERDEFINED'
18+
19+
Examples:
20+
| entity |
21+
| IfcWindow |
22+
| IfcWindowType |
23+
24+
25+
Scenario: Correct IfcPartitioningType with relating type object
26+
27+
Given an IfcWindow
28+
Given a relationship IfcRelDefinesByType to IfcWindow from IfcWindowType
29+
30+
Then PartitioningType is empty

test/files/blt002/README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
| File name | Expected result | Description |
2+
| --- | --- | --- |
3+
| pass-blt002-scenario01\_correct\_partitioning\_type.ifc | pass | NaN |
4+
| pass-blt002-scenario01-no\_user\_defined\_partitioning\_type.ifc | pass | NaN |
5+
| pass-blt002-scenario02-window\_type\_no\_own\_partitioning\_type.ifc | pass | NaN |
6+
| fail-blt002-scenario01-operation\_type\_double\_panel\_horizontal.ifc | fail | Result 1: {'Instance\_id': '', 'Expected': ' value : USERDEFINED ', 'Observed': ' value : SINGLE\_SWING\_RIGHT '} |
7+
| fail-blt002-scenario01-operation\_type\_swing\_fixed\_right.ifc | fail | Result 1: {'Instance\_id': '', 'Expected': ' value : USERDEFINED ', 'Observed': ' value : SWING\_FIXED\_RIGHT '} |
8+
| fail-blt002-scenario01-operation\_type\_single\_swing\_window\_type.ifc | fail | Result 1: {'Instance\_id': '', 'Expected': ' value : USERDEFINED ', 'Observed': ' value : () '} |
9+
| fail-blt002-scenario02-window\_type\_own\_partitioning\_type.ifc | fail | Result 1: {'Instance\_id': '', 'Expected': ' value : () ', 'Observed': ' value : SLIDING\_TO\_RIGHT '} |
10+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
4+
FILE_NAME('','2024-09-19T11:00:11',(''),(''),'IfcOpenShell-0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
5+
FILE_SCHEMA(('IFC4X3_ADD2'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON($,$,'',$,$,$,$,$);
9+
#2=IFCORGANIZATION($,'',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCAPPLICATION(#2,'0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
12+
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1726743611);
13+
#6=IFCDIRECTION((1.,0.,0.));
14+
#7=IFCDIRECTION((0.,0.,1.));
15+
#8=IFCCARTESIANPOINT((0.,0.,0.));
16+
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
17+
#10=IFCDIRECTION((0.,1.));
18+
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
19+
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
20+
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
21+
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
22+
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
23+
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
24+
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
25+
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
26+
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
27+
#20=IFCPROJECT('074N600Dn9QwY6$fLMt361',#5,'',$,$,$,$,(#11),#19);
28+
#21=IFCWINDOW('2jah$TSoDE9vDvOZazKvLS',$,$,$,$,$,$,$,$,$,$,.DOUBLE_PANEL_HORIZONTAL.,'TestWindow');
29+
#22=IFCWINDOW('2gSVSjv5vBi92jXULhiXhm',#21,$,$,$,$,$,$,$,$,$,$,$);
30+
ENDSEC;
31+
END-ISO-10303-21;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
4+
FILE_NAME('','2024-09-19T11:00:11',(''),(''),'IfcOpenShell-0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
5+
FILE_SCHEMA(('IFC4X3_ADD2'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON($,$,'',$,$,$,$,$);
9+
#2=IFCORGANIZATION($,'',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCAPPLICATION(#2,'0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
12+
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1726743611);
13+
#6=IFCDIRECTION((1.,0.,0.));
14+
#7=IFCDIRECTION((0.,0.,1.));
15+
#8=IFCCARTESIANPOINT((0.,0.,0.));
16+
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
17+
#10=IFCDIRECTION((0.,1.));
18+
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
19+
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
20+
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
21+
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
22+
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
23+
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
24+
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
25+
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
26+
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
27+
#20=IFCPROJECT('3u_1aYxET9xvnzA5rk8EYW',#5,'',$,$,$,$,(#11),#19);
28+
#21=IFCWINDOW('1qKmj1$5b0ZBl7cAad7$oX',$,$,$,$,$,$,$,$,$,$,.TRIPLE_PANEL_LEFT.,'TestWindow');
29+
#22=IFCWINDOW('0dOxcBMr55T8Bwp4O7lkh3',#21,$,$,$,$,$,$,$,$,$,$,$);
30+
ENDSEC;
31+
END-ISO-10303-21;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
4+
FILE_NAME('','2024-09-19T11:00:11',(''),(''),'IfcOpenShell-0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
5+
FILE_SCHEMA(('IFC4X3_ADD2'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON($,$,'',$,$,$,$,$);
9+
#2=IFCORGANIZATION($,'',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCAPPLICATION(#2,'0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
12+
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1726743611);
13+
#6=IFCDIRECTION((1.,0.,0.));
14+
#7=IFCDIRECTION((0.,0.,1.));
15+
#8=IFCCARTESIANPOINT((0.,0.,0.));
16+
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
17+
#10=IFCDIRECTION((0.,1.));
18+
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
19+
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
20+
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
21+
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
22+
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
23+
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
24+
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
25+
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
26+
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
27+
#20=IFCPROJECT('2ztGNB5ufECgc8ppEQGFiy',#5,'',$,$,$,$,(#11),#19);
28+
#21=IFCWINDOWTYPE('3S1V3jwfH8t8sDIt$LQ7nX',$,$,$,$,$,$,$,$,$,$,$,$);
29+
#22=IFCWINDOW('23k9bTXorFLu$A3B3ZF2ou',$,$,$,$,$,$,$,$,$,$,.TRIPLE_PANEL_VERTICAL.,$);
30+
#23=IFCRELDEFINESBYTYPE('3$MxPhyzX4WvFEF_PWfEyG',$,$,$,(#22),#21);
31+
ENDSEC;
32+
END-ISO-10303-21;

test/files/blt002/generate.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import ifcopenshell
2+
import ifcopenshell.template
3+
4+
5+
file = ifcopenshell.template.create(schema_identifier='IFC4X3_ADD2')
6+
7+
file.createIfcWindow(ifcopenshell.guid.new())
8+
9+
file.write('na-blt002-scenario01-no_user_defined_Partitioning_type.ifc')
10+
11+
file = ifcopenshell.template.create(schema_identifier='IFC4X3_ADD2')
12+
13+
file.createIfcWindow(ifcopenshell.guid.new(),
14+
UserDefinedPartitioningType = 'TestWindow',
15+
PartitioningType = 'USERDEFINED')
16+
17+
file.write('pass-blt002-scenario01_correct_Partitioning_type.ifc')
18+
19+
20+
for i in ['double_panel_horizontal', 'triple_panel_left']:
21+
file = ifcopenshell.template.create(schema_identifier='IFC4X3_ADD2')
22+
file.createIfcWindow(ifcopenshell.guid.new(),
23+
file.createIfcWindow(ifcopenshell.guid.new(),
24+
UserDefinedPartitioningType = 'TestWindow',
25+
PartitioningType = i.upper()))
26+
file.write(f'fail-blt002-scenario01-Partitioning_type_{i}.ifc')
27+
28+
29+
30+
file = ifcopenshell.template.create(schema_identifier='IFC4X3_ADD2')
31+
32+
file.createIfcRelDefinesByType(
33+
ifcopenshell.guid.new(),
34+
RelatingType = file.createIfcWindowType(ifcopenshell.guid.new()),
35+
RelatedObjects = [file.createIfcWindow(
36+
ifcopenshell.guid.new(),
37+
)]
38+
)
39+
40+
file.write('pass-blt002-scenario02-window_type_no_own_Partitioning_type.ifc')
41+
42+
file = ifcopenshell.template.create(schema_identifier='IFC4X3_ADD2')
43+
44+
file.createIfcRelDefinesByType(
45+
ifcopenshell.guid.new(),
46+
RelatingType = file.createIfcWindowType(ifcopenshell.guid.new()),
47+
RelatedObjects = [file.createIfcWindow(
48+
ifcopenshell.guid.new(),
49+
PartitioningType = 'TRIPLE_PANEL_VERTICAL'
50+
)]
51+
)
52+
53+
file.write('fail-blt002-scenario02-Window_type_own_Partitioning_type.ifc')
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
4+
FILE_NAME('','2024-09-19T11:00:11',(''),(''),'IfcOpenShell-0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
5+
FILE_SCHEMA(('IFC4X3_ADD2'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON($,$,'',$,$,$,$,$);
9+
#2=IFCORGANIZATION($,'',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCAPPLICATION(#2,'0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
12+
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1726743611);
13+
#6=IFCDIRECTION((1.,0.,0.));
14+
#7=IFCDIRECTION((0.,0.,1.));
15+
#8=IFCCARTESIANPOINT((0.,0.,0.));
16+
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
17+
#10=IFCDIRECTION((0.,1.));
18+
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
19+
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
20+
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
21+
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
22+
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
23+
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
24+
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
25+
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
26+
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
27+
#20=IFCPROJECT('0Q8pOUdKb29xDobY3RQKzF',#5,'',$,$,$,$,(#11),#19);
28+
#21=IFCWINDOW('2IISuX895AFgBDiw2Sjl8y',$,$,$,$,$,$,$,$,$,$,$,$);
29+
ENDSEC;
30+
END-ISO-10303-21;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
4+
FILE_NAME('','2024-09-19T11:00:11',(''),(''),'IfcOpenShell-0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
5+
FILE_SCHEMA(('IFC4X3_ADD2'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON($,$,'',$,$,$,$,$);
9+
#2=IFCORGANIZATION($,'',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCAPPLICATION(#2,'0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
12+
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1726743611);
13+
#6=IFCDIRECTION((1.,0.,0.));
14+
#7=IFCDIRECTION((0.,0.,1.));
15+
#8=IFCCARTESIANPOINT((0.,0.,0.));
16+
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
17+
#10=IFCDIRECTION((0.,1.));
18+
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
19+
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
20+
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
21+
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
22+
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
23+
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
24+
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
25+
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
26+
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
27+
#20=IFCPROJECT('1YznUD7Pz3UPf_MEx_FesK',#5,'',$,$,$,$,(#11),#19);
28+
#21=IFCWINDOW('0kurpAVMX08uHZ_W$1mWtw',$,$,$,$,$,$,$,$,$,$,.USERDEFINED.,'TestWindow');
29+
ENDSEC;
30+
END-ISO-10303-21;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
ISO-10303-21;
2+
HEADER;
3+
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
4+
FILE_NAME('','2024-09-19T11:00:11',(''),(''),'IfcOpenShell-0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
5+
FILE_SCHEMA(('IFC4X3_ADD2'));
6+
ENDSEC;
7+
DATA;
8+
#1=IFCPERSON($,$,'',$,$,$,$,$);
9+
#2=IFCORGANIZATION($,'',$,$,$);
10+
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
11+
#4=IFCAPPLICATION(#2,'0.7.11-d51fa2c5f','IfcOpenShell-0.7.11-d51fa2c5f','');
12+
#5=IFCOWNERHISTORY(#3,#4,$,.NOTDEFINED.,$,#3,#4,1726743611);
13+
#6=IFCDIRECTION((1.,0.,0.));
14+
#7=IFCDIRECTION((0.,0.,1.));
15+
#8=IFCCARTESIANPOINT((0.,0.,0.));
16+
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
17+
#10=IFCDIRECTION((0.,1.));
18+
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
19+
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
20+
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
21+
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
22+
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
23+
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
24+
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
25+
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
26+
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
27+
#20=IFCPROJECT('0qVrR3PRb3AQ5hCvtE3V2L',#5,'',$,$,$,$,(#11),#19);
28+
#21=IFCWINDOWTYPE('3FrDa8hwLFreay2Xx50KkI',$,$,$,$,$,$,$,$,$,$,$,$);
29+
#22=IFCWINDOW('0SWASAndz4xxZ5wxBCt9FH',$,$,$,$,$,$,$,$,$,$,$,$);
30+
#23=IFCRELDEFINESBYTYPE('2el_5DDKb8uA7IbR6pIgIB',$,$,$,(#22),#21);
31+
ENDSEC;
32+
END-ISO-10303-21;

0 commit comments

Comments
 (0)