Nests
Overview
Describes a whole/part relationship in which the parent object (the whole) is aggregated from a set of child objects (the parts) by nesting. Nesting is a particular form of aggregation in which the parent object is formed by aggregating a set of child objects of the same type (class)
Concept: Nest objects
The concept of nesting objects is used in a number of situations within the IFC model, allowing objects to be broken down into their constituent parts whilst retaining information about both the whole and the individual parts.
In a nest, the whole is referred to as the 'relating object' whilst the parts are referred to as the 'related objects'. There is always exactly one relating object and there may be one or many related objects.
The nesting relationship is described at a high level in the IFC model as between occurrences of IfcObject. Practically, the relationship will be between instances of a subtype of IfcObject and these inherit the relationship.
To ensure that there is clarity about entities that are participating in a nest, reference to this functional part within the IDM will indicate parameters for the aggregation as:
fp_nests[object]
Results
Declares the existence of a specific nesting relationship
| Description | Entity/Pset/Functional Part | MAN | REC | OPT |
|---|---|---|---|---|
| Assert general attributes of the relationship | ||||
|
IfcRelNests.GlobalId ::IfcGloballyUniqueId | |||
|
IfcRelNests.OwnerHistory::fp_apply_owner_history | |||
| Establish the relationship entity | ||||
|
IfcObject <parent subtype> | |||
|
IfcObject <child subtypes> | |||
|
IfcRelNests.RelatingObject::IfcObject <parent> | |||
|
IfcRelNests.RelatedObjects::IfcObject <child> | |||
|
IfcRelNests.Name::IfcLabel | |
||
|
IfcRelNests.Description::IfcText | |
IFC Entities Required
- IfcObject
- IfcRelationsip
- IfcRelDecomposes
- IfcRelNests
- IfcRoot
IFC Datatypes Required
- IfcGloballyUniqueId
- IfcLabel
- IfcText
IFC Functions Required
- -
IFC Property Sets Required
- -
IDM Functional Parts Required
- fp_apply_owner_history
EXPRESS Schema
SCHEMA FP_NESTS;
TYPE IfcGloballyUniqueId = STRING (22) FIXED;
END_TYPE;
TYPE IfcLabel = STRING;
END_TYPE;
TYPE IfcText = STRING;
END_TYPE;
ENTITY IfcObject
ABSTRACT SUPERTYPE
SUBTYPE OF(IfcRoot);
ObjectType : OPTIONAL IfcLabel;
INVERSE
Decomposes : SET [0:1] OF IfcRelDecomposes FOR RelatedObjects;
IsDecomposedBy : SET OF IfcRelDecomposes FOR RelatingObject;
WHERE
WR1 : SIZEOF(QUERY(temp <* IsDefinedBy | 'IFC2X2_FINAL.IFCRELDEFINESBYTYPE' IN TYPEOF(temp))) <= 1;
END_ENTITY;
ENTITY IfcRoot
ABSTRACT SUPERTYPE OF (ONEOF(IfcObject, IfcRelationship));
GlobalId : IfcGloballyUniqueId;
Name : OPTIONAL IfcLabel;
Description : OPTIONAL IfcText;
OwnerHistory : fp_apply_owner_history;
UNIQUE
UR1 : GlobalId;
END_ENTITY;
ENTITY IfcRelationship
ABSTRACT SUPERTYPE
SUBTYPE OF(IfcRoot);
END_ENTITY;
ENTITY IfcRelDecomposes
ABSTRACT SUPERTYPE
SUBTYPE OF(IfcRelationship);
RelatingObject : IfcObject;
RelatedObjects : SET [1:?] OF IfcObject;
WHERE
WR1 : SIZEOF(QUERY(Temp <* RelatedObjects | RelatingObject :=: Temp)) = 0;
END_ENTITY;
ENTITY IfcRelNests
SUBTYPE OF(IfcRelDecomposes);
WHERE
WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelDecomposes.RelatedObjects |
NOT(TYPEOF(SELF\IfcRelDecomposes.RelatingObject) = TYPEOF(Temp)))) = 0;
END_ENTITY;
ENTITY fp_apply_owner_history;
END_ENTITY;
END_SCHEMA;
Examples of Nesting Objects
Example 1: Nesting Compartmentalized Tanks
Tanks may be provided so that fluid storage is in one compartment (the whole tank) or in multiple, separated compartments. The latter will be particularly the case with large tanks.
A compartment is an IfcFlowStorageDevice specified as a partial element through the occurrence level property set Pset_FlowStorageDeviceTank by setting the TankComposition value to PARTIAL
A tank is an IfcFlowStorageDevice specified as a complete element through the occurrence level property set Pset_FlowStorageDeviceTank by setting the TankComposition value to ELEMENT
Multiple tanks acting together through interconnection are an instance of IfcTankType specified as a complex element through the occurrence level property set Pset_FlowStorageDeviceTank by setting the TankComposition value to COMPLEX
IfcRelNests is used to connect compartments to tanks (since both are instances of IfcTank)
/* TYPE LEVEL PROPERTY SETS AT #100, #200 NOT SHOWN IN THIS EXAMPLE */
/* REPRESENTATION MAP AT #1011 NOT SHOWN IN THIS EXAMPLE */
/* definition of individual compartments by tank type -no geometry shown- */
#1= IFCTANKTYPE('abcdefghijklmnopqrst11', #2, 'Tank_Part', $, 'IfcFlowStorageDevice', (#100,#200), (#1011), $, $, .PREFORMED.);
#2=IFCOWNERHISTORY(...);
/* relating the occurrences to the type */
#10=IFCRELDEFINESBYTYPE('abcdefghijklmnopqrst10', #2, $, $, (#20,#21,#22,#23,#24,#25,#26,#27), #1);
/* definition of the occurrences - placement references given but no geometry shown- */
#20=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst20',#2,$,$,$,#10020,#10002,$);
#21=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst21',#2,$,$,$,#10021,#10002,$);
#22=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst22',#2,$,$,$,#10022,#10002,$);
#23=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst23',#2,$,$,$,#10023,#10002,$);
#24=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst24',#2,$,$,$,#10024,#10002,$);
#25=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst25',#2,$,$,$,#10025,#10002,$);
#26=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst26',#2,$,$,$,#10026,#10002,$);
#27=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst27',#2,$,$,$,#10027,#10002,$);
#28=IFCFLOWSTORAGEDEVICE('abcdefghijklmnopqrst28',#2,$,$,$,#10028,#10003,$);
/* placing the partial tanks into the elemental tank */
#30=IFCRELNESTS('abcdefghijklmnopqrst30', #2, $, 'Compartmentalized tank nesting', #28, (#20,#21,#22,#23,#24,#25,#26,#27));
/* relating a property set to the occurrences */
#50=IFCRELDEFINESBYPROPERTIES('abcdefghijklmnopqrst50', #2, $, $, (#20,#21,#22,#23,#24,#25,#26,#27), #300);
#51=IFCRELDEFINESBYPROPERTIES('abcdefghijklmnopqrst51', #2, $, $, (#28), #301);
/* definition of occurrence property sets */
#300=IFCPROPERTYSET('abcdefghijklmnopqrst300', #2, 'Pset_FlowStorageDeviceTank', $, (#310,#321,#322));
#301=IFCPROPERTYSET('abcdefghijklmnopqrst301', #2, 'Pset_FlowStorageDeviceTank', $, (#311,#321,#322));
/* definition of specific properties for a preformed tank */
#310=IFCPROPERTYENUMERATEDVALUE('TankComposition', $, ('PARTIAL'), #351);
#311=IFCPROPERTYENUMERATEDVALUE('TankComposition', $, ('ELEMENT'), #351);
#321=IFCPROPERTYSINGLEVALUE('HasLadder', $, IFCBOOLEAN(.F.), $);
#322=IFCPROPERTYSINGLEVALUE('HasVisualIndicator', $, IFCBOOLEAN(.F.), $);
/* definition of property enumerations used in specific type property set */
#351=IFCPROPERTYENUMERATION('PEnum_TankComposition', ('COMPLEX', 'ELEMENT', 'PARTIAL', 'NOTKNOWN', 'UNSET'), $);
Example 2: Nested Cost Schedules
In this example, the estimate for hot water services (described in the examples for fp_model_cost_schedule including instances of organization, person and date) is one cost schedule in a set that is combined to produce a total estimate for all services on a proposal that is name 'New Munkerud'. To obtain the complete estimate, the domestic cold water services and the waste water estimates are also included.
/* ownership information*/
#2=IFCOWNERHISTORY(...);
/* define the cost schedule */
#2000=IFCCOSTSCHEDULE('abcdefghijklmnopqrst2000',#2,'New Mumkerud','All Services',$,#3001,#3002,#4001,'ISSUED',$,#4001,'S20050630-0',.ESTIMATE.);
#2001=IFCCOSTSCHEDULE('abcdefghijklmnopqrst2001',#2,'Domestic Hot Water','Pipework only',$,#3001,#3002,#4001,'ISSUED',$,#4001,'S20050630-1',.ESTIMATE.);
#2002=IFCCOSTSCHEDULE('abcdefghijklmnopqrst2002',#2,'Domestic Cold Water','Pipework only',$,#3001,#3002,#4001,'ISSUED',$,#4001,'S20050630-2',.ESTIMATE.);