Skip to content

Commit

Permalink
GEM005 / RI-71
Browse files Browse the repository at this point in the history
  • Loading branch information
aothms committed Sep 20, 2023
1 parent 66b8b8e commit 652d72a
Show file tree
Hide file tree
Showing 8 changed files with 307 additions and 1 deletion.
12 changes: 12 additions & 0 deletions features/GEM005_Geometry-of-surrounding-buildings.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
@implementer-agreement
@ALS
Feature: Building shape representation
Scenario: Agreement on empty IfcBuilding using correct representation

Given A file with Schema Identifier "IFC2X3" or "IFC4" or "IFC4X3_TC1" or "IFC4X3_ADD1" or "IFC4X3"
And An IfcBuilding
And ContainsElements = empty
And IsDecomposedBy = empty
And Its attribute Representation
And Its attribute Representations
Then The value of attribute RepresentationIdentifier must be Body
5 changes: 4 additions & 1 deletion features/steps/givens/attributes.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@

@given("{attribute} = {value}")
def step_impl(context, attribute, value):
value = ast.literal_eval(value)
if value == 'empty':
value = ()
else:
value = ast.literal_eval(value)
context.instances = list(
filter(lambda inst: getattr(inst, attribute, True) == value, context.instances)
)
Expand Down
40 changes: 40 additions & 0 deletions test/files/gem005/fail-gem005-scenario01-footprint.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2023-09-20T19:11:03',(''),(''),'IfcOpenShell-v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1695237063);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('3HL8sL$Tr3pRQA3zwpuLfv',#5,'',$,$,$,$,(#11),#19);
#21=IFCSITE('2ev$aeuI94vPDkJSXmp_bL',#5,$,$,$,$,$,$,.ELEMENT.,$,$,$,$,$);
#22=IFCRELAGGREGATES('20W3cY$bH0AeVhHWQpGWgS',#5,$,$,#20,(#21));
#23=IFCBUILDING('0iVIRmQ2r96BYx0mRDkIpv',#5,$,$,$,$,#31,$,.ELEMENT.,$,$,$);
#24=IFCRELAGGREGATES('3cCBNhB1j0nfGqIz2vKfqs',#5,$,$,#21,(#23));
#25=IFCCARTESIANPOINT((0.,0.));
#26=IFCCARTESIANPOINT((20.,0.));
#27=IFCCARTESIANPOINT((20.,20.));
#28=IFCCARTESIANPOINT((0.,20.));
#29=IFCPOLYLINE((#25,#26,#27,#28,#28));
#30=IFCSHAPEREPRESENTATION(#11,'FootPrint','Axis2D',(#29));
#31=IFCPRODUCTDEFINITIONSHAPE($,$,(#30));
ENDSEC;
END-ISO-10303-21;
33 changes: 33 additions & 0 deletions test/files/gem005/fail-gem005-scenario01-no_representation.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2023-09-20T19:11:03',(''),(''),'IfcOpenShell-v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1695237063);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('2jYHPIYljDhgGg9eoN2Xor',#5,'',$,$,$,$,(#11),#19);
#21=IFCSITE('2e4KKIKvz2mviaIzPKSL7Y',#5,$,$,$,$,$,$,.ELEMENT.,$,$,$,$,$);
#22=IFCRELAGGREGATES('07yQLhcYH3K8T1kD3qUsJi',#5,$,$,#20,(#21));
#23=IFCBUILDING('3$1ujW6An5cgazzmmx2rkS',#5,$,$,$,$,$,$,.ELEMENT.,$,$,$);
#24=IFCRELAGGREGATES('1stRKPw6X8_BVdHzxPJRyN',#5,$,$,#21,(#23));
ENDSEC;
END-ISO-10303-21;
106 changes: 106 additions & 0 deletions test/files/gem005/generate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import ifcopenshell
import ifcopenshell.template

for validity, case in [
("pass", "body"),
("pass", "contain"),
("pass", "aggregate"),
("fail", "no-representation"),
("fail", "footprint"),
]:

f = ifcopenshell.template.create(schema_identifier="IFC2X3")
building_parent = proj = f.by_type("IfcProject")[0]
owner = f.by_type("IfcOwnerHistory")[0]
owner.ChangeAction = "ADDED"

site = f.createIfcSite(
ifcopenshell.guid.new(),
owner,
CompositionType="ELEMENT",
)

f.createIfcRelAggregates(
ifcopenshell.guid.new(), owner, RelatingObject=proj, RelatedObjects=[site]
)

building = f.createIfcBuilding(
ifcopenshell.guid.new(),
owner,
CompositionType="ELEMENT",
)

f.createIfcRelAggregates(
ifcopenshell.guid.new(), owner, RelatingObject=site, RelatedObjects=[building]
)

if case == "body":
building.Representation = f.createIfcProductDefinitionShape(
Representations=[
f.createIfcShapeRepresentation(
f.by_type("IfcGeometricRepresentationContext")[0],
"Body",
"SweptSolid",
[
f.createIfcExtrudedAreaSolid(
f.createIfcRectangleProfileDef(
"AREA",
None,
f.createIfcAxis2Placement2D(
f.createIfcCartesianPoint((0.0, 0.0))
),
20000.0,
20000.0,
),
f.createIfcAxis2Placement3D(
f.createIfcCartesianPoint((0.0, 0.0, 0.0))
),
f.createIfcDirection((0.0, 0.0, 1.0)),
20000.0,
)
],
)
]
)
elif case == "footprint":
poly = f.createIfcPolyline(
(
f.createIfcCartesianPoint((0.0, 0.0)),
f.createIfcCartesianPoint((20.0, 0.0)),
f.createIfcCartesianPoint((20.0, 20.0)),
f.createIfcCartesianPoint((0.0, 20.0)),
)
)
poly[0] += (poly[0][-1],)
building.Representation = f.createIfcProductDefinitionShape(
Representations=[
f.createIfcShapeRepresentation(
f.by_type("IfcGeometricRepresentationContext")[0],
"FootPrint",
"Axis2D",
[poly],
)
]
)
elif case == "contain":
beam = f.createIfcBeam(ifcopenshell.guid.new(), owner)
f.createIfcRelContainedInSpatialStructure(
ifcopenshell.guid.new(), owner, None, None, [beam], building
)
elif case == "aggregate":
storey = f.createIfcBuildingStorey(
ifcopenshell.guid.new(),
owner,
CompositionType="ELEMENT",
)
f.createIfcRelAggregates(
ifcopenshell.guid.new(),
owner,
RelatingObject=building,
RelatedObjects=[storey],
)

failing_scenario = ""
if validity == "fail":
failing_scenario = "scenario01-"
f.write(f"{validity}-gem005-{failing_scenario}{case.replace('-', '_')}.ifc")
35 changes: 35 additions & 0 deletions test/files/gem005/pass-gem005-aggregate.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2023-09-20T19:11:03',(''),(''),'IfcOpenShell-v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1695237063);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('1ub2BiUrX47Ph8An4_oNjl',#5,'',$,$,$,$,(#11),#19);
#21=IFCSITE('3FPPxnSv5C08ZVvBGcA9IW',#5,$,$,$,$,$,$,.ELEMENT.,$,$,$,$,$);
#22=IFCRELAGGREGATES('0J93SG7u57x9isBUAs8x0f',#5,$,$,#20,(#21));
#23=IFCBUILDING('0ytUojdGX73fLDFVxSuc$8',#5,$,$,$,$,$,$,.ELEMENT.,$,$,$);
#24=IFCRELAGGREGATES('3ALm77R2H8VRvXFtrvyiXo',#5,$,$,#21,(#23));
#25=IFCBUILDINGSTOREY('3ze$6Xr5LEwAkcB6VuPxAr',#5,$,$,$,$,$,$,.ELEMENT.,$);
#26=IFCRELAGGREGATES('2x92EoU5P1nPfcaJYJDGoc',#5,$,$,#23,(#25));
ENDSEC;
END-ISO-10303-21;
42 changes: 42 additions & 0 deletions test/files/gem005/pass-gem005-body.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2023-09-20T19:11:03',(''),(''),'IfcOpenShell-v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1695237063);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('20LlEYg5D1ERA7Bh_53DI_',#5,'',$,$,$,$,(#11),#19);
#21=IFCSITE('0ie$bpOszCUgyIh5OXWXsG',#5,$,$,$,$,$,$,.ELEMENT.,$,$,$,$,$);
#22=IFCRELAGGREGATES('2JPb$q1dPCpBGLb2SYvRVr',#5,$,$,#20,(#21));
#23=IFCBUILDING('3qEEBpFm16UBTLeLB$yPTY',#5,$,$,$,$,#33,$,.ELEMENT.,$,$,$);
#24=IFCRELAGGREGATES('3N6QCZZqr4xBkcDTiNPpEs',#5,$,$,#21,(#23));
#25=IFCCARTESIANPOINT((0.,0.));
#26=IFCAXIS2PLACEMENT2D(#25,$);
#27=IFCRECTANGLEPROFILEDEF(.AREA.,$,#26,20000.,20000.);
#28=IFCCARTESIANPOINT((0.,0.,0.));
#29=IFCAXIS2PLACEMENT3D(#28,$,$);
#30=IFCDIRECTION((0.,0.,1.));
#31=IFCEXTRUDEDAREASOLID(#27,#29,#30,20000.);
#32=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#31));
#33=IFCPRODUCTDEFINITIONSHAPE($,$,(#32));
ENDSEC;
END-ISO-10303-21;
35 changes: 35 additions & 0 deletions test/files/gem005/pass-gem005-contain.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2023-09-20T19:11:03',(''),(''),'IfcOpenShell-v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'v0.7.0-64d98f129','IfcOpenShell-v0.7.0-64d98f129','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1695237063);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('2rHCjlXu5BLPQy1801R7qY',#5,'',$,$,$,$,(#11),#19);
#21=IFCSITE('00gZeZJ3T46OIHYIJfI4y6',#5,$,$,$,$,$,$,.ELEMENT.,$,$,$,$,$);
#22=IFCRELAGGREGATES('2dSNVxkyTCVBgpJIAjWCWe',#5,$,$,#20,(#21));
#23=IFCBUILDING('0lTyQdQJ1EAPMwA2lfog$t',#5,$,$,$,$,$,$,.ELEMENT.,$,$,$);
#24=IFCRELAGGREGATES('1LBvgWU1D38BJBvmmMM4MT',#5,$,$,#21,(#23));
#25=IFCBEAM('2fTXsg43LD2vdsN8UYcrZY',#5,$,$,$,$,$,$);
#26=IFCRELCONTAINEDINSPATIALSTRUCTURE('3P4Z3tTSn4KQxaiql9FTnk',#5,$,$,(#25),#23);
ENDSEC;
END-ISO-10303-21;

0 comments on commit 652d72a

Please sign in to comment.