Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
@IFC
@version4
@version5
@implementer-agreement
@disabled
Feature: IFC105 - Resource entities need to be referenced by rooted entity

The rule verifies that resource entities are directly or indirectly related to at least one rooted entity instance by means of forward or a small curated set of inverse attributes.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
@IFC
@version1
@industry-practice
Feature: IFC106 - Resource entities should be referenced by rooted entity

The rule verifies that resource entities are directly or indirectly related to at least one rooted entity instance by means of forward or a small curated set of inverse attributes.
Resource entities are the schema classes that do not inherit from IfcRoot, typically defined in the resource layer of the schema (e.g Geometry Resource).
The inverse attributes that are followed are:
StyledByItem HasCoordinateOperation LayerAssignments LayerAssignment HasSubContexts
HasProperties (material and profile def) HasRepresentation (material) HasColours HasTextures (tessellated face sets) HasShapeAspects (representation map and product definition shape)
WellKnownText (coordinate reference system)

Scenario: Resource entities need to be referenced by rooted entity

Given a traversal over the full model originating from subtypes of .IfcRoot.
Given an .entity instance.
Given [its entity type] ^is not^ 'IfcRoot' ^including subtypes^
Then it must be referenced by an entity instance inheriting from IfcRoot directly or indirectly
2 changes: 1 addition & 1 deletion test/files/IFC/ifc105/fail-ifc105-resource-level.ifc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition[ReferenceView_V1.2]'),'2;1');
FILE_NAME('fail-ifc105-resource-level.ifc','2026-02-25T17:01:03',('redacted'),('redacted'),'redacted','redacted - redacted - 3.1459','none');
FILE_NAME('fail-ifc105-resource-level.ifc','2026-02-25T17:01:06',('redacted'),('redacted'),'redacted','redacted - redacted - 3.14159','none');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
Expand Down
6 changes: 3 additions & 3 deletions test/files/IFC/ifc105/pass-ifc105-wellknowntext.ifc
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ DATA;
#5= IFCLOCALPLACEMENT($,#4);
#6= IFCSITE('1rCoPVn0H6DuEJSJO7MNDD',$,'UnknownName',$,$,#5,$,$,$,(45,31,15,199499),(-122,-40,-2,-807779),$,$,$);
#9= IFCPROJECT('10s6LwE7v8TQv5VgA46786',#13,'Unknown',$,$,$,$,(#26),#51);
#10= IFCPERSON('mirtscj',$,$,$,$,$,$,$);
#11= IFCORGANIZATION($,'ADS',$,$,$);
#10= IFCPERSON('',$,$,$,$,$,$,$);
#11= IFCORGANIZATION($,'',$,$,$);
#12= IFCPERSONANDORGANIZATION(#10,#11,$);
#13= IFCOWNERHISTORY(#12,#2,$,.ADDED.,1770870801,$,$,1770870801);
#14= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#15= IFCMEASUREWITHUNIT(IFCLENGTHMEASURE(0.3048006096),#14);
#16= IFCCONVERSIONBASEDUNIT(#17,.LENGTHUNIT.,'us survey foot',#15);
#16= IFCCONVERSIONBASEDUNIT(#17,.LENGTHUNIT.,'US survey foot',#15);
#17= IFCDIMENSIONALEXPONENTS(1,0,0,0,0,0,0);
#18= IFCPROPERTYSINGLEVALUE('Coordinate Reference System ID',$,IFCLABEL('HARN/WO.OR-NF'),$);
#19= IFCPROPERTYSINGLEVALUE('Coordinate Reference System Description',$,IFCLABEL('HARN/WO Oregon State Planes, North Zone, US Foot'),$);
Expand Down
72 changes: 72 additions & 0 deletions test/files/IFC/ifc106/fail-ifc106-product_representation.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('fail-ifc106-product_representation.ifc','2022-11-08T16:54:40',(''),(''),'','redacted - redacted - 3.14159','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'v0.7.0-fa6bbf2d','IfcOpenShell-v0.7.0-fa6bbf2d','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1667926480);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.,0.));
#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('3KwPrT3OP4Gg7qpalgQO1_',#5,'',$,$,$,$,(#11),#19);
#21=IFCCARTESIANPOINT((0.,0.,0.));
#22=IFCDIRECTION((0.,0.,1.));
#23=IFCDIRECTION((1.,0.,0.));
#24=IFCAXIS2PLACEMENT3D(#21,#22,#23);
#25=IFCLOCALPLACEMENT($,#24);
#26=IFCSITE('098$knNuOHxPTbB6t11Jwi',#5,'Site',$,$,#25,$,$,.ELEMENT.,$,$,$,$,$);
#27=IFCCARTESIANPOINT((0.,0.,0.));
#28=IFCDIRECTION((0.,0.,1.));
#29=IFCDIRECTION((1.,0.,0.));
#30=IFCAXIS2PLACEMENT3D(#27,#28,#29);
#31=IFCLOCALPLACEMENT(#25,#30);
#32=IFCBUILDING('098$koNuOHxPGoB6t11Jwi',#5,'Building',$,$,#31,$,$,.ELEMENT.,$,$,$);
#33=IFCCARTESIANPOINT((0.,0.,0.));
#34=IFCDIRECTION((0.,0.,1.));
#35=IFCDIRECTION((1.,0.,0.));
#36=IFCAXIS2PLACEMENT3D(#33,#34,#35);
#37=IFCLOCALPLACEMENT(#31,#36);
#38=IFCBUILDINGSTOREY('098$kpNuOHxQvuB6t11Jwi',#5,'Storey',$,$,#37,$,$,.ELEMENT.,0.);
#39=IFCRELAGGREGATES('098$kqNuOHxRbKB6t11Jwi',#5,'Building Container',$,#32,(#38));
#40=IFCRELAGGREGATES('098$krNuOHxQdqB6t11Jwi',#5,'Site Container',$,#26,(#32));
#41=IFCRELAGGREGATES('098$ksNuOHxO9OB6t11Jwi',#5,'Project Container',$,#20,(#26));
#42=IFCCARTESIANPOINT((0.,0.,0.));
#43=IFCDIRECTION((0.,0.,1.));
#44=IFCDIRECTION((1.,0.,0.));
#45=IFCAXIS2PLACEMENT3D(#42,#43,#44);
#47=IFCCARTESIANPOINT((0.,0.,0.));
#48=IFCCARTESIANPOINT((5.,0.,0.));
#49=IFCPOLYLINE((#47,#48));
#50=IFCCARTESIANPOINT((0.,0.,0.));
#51=IFCDIRECTION((0.,0.,1.));
#52=IFCDIRECTION((1.,0.,0.));
#53=IFCAXIS2PLACEMENT3D(#50,#51,#52);
#54=IFCCARTESIANPOINT((0.,-0.1));
#55=IFCCARTESIANPOINT((5.,-0.1));
#56=IFCCARTESIANPOINT((10.,0.1));
#57=IFCCARTESIANPOINT((0.,0.1));
#58=IFCCARTESIANPOINT((0.,-0.1));
#59=IFCPOLYLINE((#54,#55,#56,#57,#58));
#60=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#59);
#61=IFCDIRECTION((0.,0.,1.));
#62=IFCEXTRUDEDAREASOLID(#60,#53,#61,3.);
#63=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#62));
#64=IFCREPRESENTATIONMAP(#53,#63);
ENDSEC;
END-ISO-10303-21;
33 changes: 33 additions & 0 deletions test/files/IFC/ifc106/fail-ifc106-resource-level.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition[ReferenceView_V1.2]'),'2;1');
FILE_NAME('fail-ifc106-resource-level.ifc','2026-02-25T17:01:03',('redacted'),('redacted'),'redacted','redacted - redacted - 3.1459','none');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON('id','user','user',$,$,$,$,$);
#2=IFCORGANIZATION($,'org',$,$,$);
#3=IFCORGANIZATION($,'org',$,$,$);
#4=IFCPERSONANDORGANIZATION(#1,#2,$);
#5=IFCAPPLICATION(#3,'0.0','IFCTester','IFCT');
#6=IFCOWNERHISTORY(#4,#5,$,$,$,$,$,1772049663);
#7=IFCCARTESIANPOINT((0.,0.,0.));
#8=IFCAXIS2PLACEMENT3D(#7,$,$);
#9=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,$,#8,$);
#10=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#9,$,.MODEL_VIEW.,$);
#11=IFCPROJECT('3a_MKonSn43fs5Hd6JdOIQ',#6,'Project ID',$,$,'Project long name',$,(#9),#15);
#12=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
#13=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#14=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#15=IFCUNITASSIGNMENT((#13,#14,#12));
#16=IFCSITE('0cYo0Jtbn3RBB4K4dL5rd$',#6,'Site','Description of the site','GenericSite',$,$,$,$,$,$,$,$,$);
#17=IFCRELAGGREGATES('2_fRqqoqP6YPLyyPStWt$U',#6,'IfcProject decomposition relationship','Relationship of the IfcProject instance and its decomposed parts.',#11,(#16));
#18=IFCBUILDINGELEMENTPROXY('2Vdodf$jz6QQ_B3pKROlap',#6,'Test element',$,'TestElement',$,$,$,$);
#19=IFCRELCONTAINEDINSPATIALSTRUCTURE('2EBBgP4BfCWh7goz7Zerya',#6,'Containment relationship','',(#18),#16);
#20=IFCPROPERTYSINGLEVALUE('Property 1',$,IFCTEXT('Value property 1'),$);
#21=IFCPROPERTYSINGLEVALUE('Property 2',$,IFCTEXT('Value property 2'),$);
#22=IFCPROPERTYSET('16pZVJu3jEbRfblNvt4JlK',#6,'Property set','Example property set',(#20));
#23=IFCRELDEFINESBYPROPERTIES('0raIUSVGj1pAre5kdt5RD$',#6,'Properties relationship','',(#18),#22);
#24=IFCPROPERTYDEPENDENCYRELATIONSHIP('Property dependency','Property dependency of two properties of the same property set',#20,#21,$);
ENDSEC;
END-ISO-10303-21;
60 changes: 60 additions & 0 deletions test/files/IFC/ifc106/pass-ifc106-geographic_referencing_gk.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [ReferenceView]'),'2;1');
FILE_NAME('pass-ifc106-geographic_referencing_gk.ifc','2017-07-10T15:03:00',('redacted'),('redacted'),'redacted','redacted - redacted - 3.1459','none');
FILE_SCHEMA(('IFC4X3_ADD2'));
ENDSEC;
DATA;
/* Geographic reference*/
#1= IFCPROJECTEDCRS('EPSG:31467','DHDN / 3-Degree Gauss-Krueger Zone 3','ETRS89',$,'Gaus-Krueger','3',#3);
#2= IFCMAPCONVERSION(#100011,#1,3458715.92,5439966.65,113.7,0.270600445976,0.962691746426,$);
#3= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);


/* BuildingElementProxy */
#149= IFCBUILDINGELEMENTPROXY('0rBru4syGxGOZb$M8kVJuS',#100005,'Geographic Position',$,$,#121,#5037,$,$);
#121= IFCLOCALPLACEMENT(#5044,#243);
#243= IFCAXIS2PLACEMENT3D(#173,#217,#218);
#173= IFCCARTESIANPOINT((0.,0.,0.));
#217= IFCDIRECTION((0.,0.,1.));
#218= IFCDIRECTION((1.,0.,0.));
#5037= IFCPRODUCTDEFINITIONSHAPE('',$,(#5038));
#5038= IFCSHAPEREPRESENTATION(#100011,'Body','Tessellation',(#5000));
/* Tesselated geometry */
#5000= IFCTRIANGULATEDFACESET(#5001,$,.T.,((1,3,2),(1,4,3),(1,5,4),(1,2,5),/*(2,3,4),(4,5,2),*/(2,3,6),(3,7,6),(3,4,7),(4,8,7),(4,5,8),(5,9,8),(5,2,9),(2,6,9),(6,7,8),(6,8,9)),$);
#5001= IFCCARTESIANPOINTLIST3D(((0.0,0.0,0.0),(-500.0,-500.0,2000.0),(500.0,-500.0,2000.0),(500.0,500.0,2000.0),(-500.0,500.0,2000.0),(-500.0,-500.0,4000.0),(500.0,-500.0,4000.0),(500.0,500.0,4000.0),(-500.0,500.0,4000.0)),$);
/* BuildingStorey */
#5043= IFCBUILDINGSTOREY('3_fv_WeK63IPclwapZa9MD',#100005,'Storey 1',$,$,#5044,$,$,.ELEMENT.,-1.6);
#5044= IFCLOCALPLACEMENT(#100025,#100040);
#5045= IFCRELCONTAINEDINSPATIALSTRUCTURE('2lLFgu3KhSGw4jMC3$Ak50',#100005,'Storey 1',$,(#149),#5043);
#5046= IFCRELAGGREGATES('3INy2PAPGPJ8Dpwhrq610o',#100005,'All stories',$,#100023,(#5043));
/* Person, Org, App, Project */

#100001= IFCPERSON($,'redacted',$,$,$,$,$,$);
#100002= IFCORGANIZATION($,'redacted',$,$,$);
#100003= IFCPERSONANDORGANIZATION(#100001,#100002,$);
#100004= IFCAPPLICATION(#100002,'redacted','redacted','redacted');
#100005= IFCOWNERHISTORY(#100003,#100004,$,.NOTDEFINED.,$,$,$,1122650864);
#100010= IFCPROJECT('01JwSt5ycUHvKFlMZUleKS',#100005,'Notch',$,$,$,$,(#100011),#100060);
#100011= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.0E-5,#100040,$);
/* Site */
#100020= IFCSITE('1BPCQAtTW7GhKrUF$Sytrr',#100005,'Site',$,$,#100022,$,$,.ELEMENT.,(49,5,43,983700),(8,26,1,247300),113.7,$,$);
#100021= IFCRELAGGREGATES('2vOmTZNmbvJAJRbSGMMNrC',#100005,$,$,#100010,(#100020));
#100022= IFCLOCALPLACEMENT($,#100040);
/* Building */
#100023= IFCBUILDING('0cVTYHAI3nGeTXA2X4Gxyo',#100005,'Building',$,$,#100025,$,$,.ELEMENT.,$,$,$);
#100024= IFCRELAGGREGATES('1F_GRhxz1GJgGgcJgzjvKX',#100005,$,$,#100020,(#100023));
#100025= IFCLOCALPLACEMENT(#100022,#100040);
/* Placement */
#100040= IFCAXIS2PLACEMENT3D(#100041,#100044,#100042);
#100041= IFCCARTESIANPOINT((0.,0.,0.));
#100042= IFCDIRECTION((1.,0.,0.));
#100044= IFCDIRECTION((0.,0.,1.));
/* Units */
#100060= IFCUNITASSIGNMENT((#100061,#100062,#100063,#100064));
#100061= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
#100062= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#100063= IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#100064= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
ENDSEC;
END-ISO-10303-21;
Loading
Loading