Referencing bSDD in IDS and IFC
Referencing bSDD in IFC and IDS
To associate a class from an external reference (such as bSDD) to objects in an IFC model, the following documentation shall be used.
The main IFC concept template to be used is: Classification Association
The main entities involved are:
– IfcClassification
– IfcClassificationReference
– IfcRelAssociatesClassification
The next section indicates the mapping rules between the bSDD data model and IFC concepts used for class. To support this, snippets (βοΈ) of IFC files and bSDD dictionary files are reported as examples, click to open them.
openBIM workflows
The buildingSMART Data Dictionary is a key component in many openBIM workflows. Among other things, it allows to:
– access various kinds of standards to enrich an openBIM model
– check data for compliance
– provide concepts for Information Delivery Specifications (IDS)
– extend the IFC standard
– and much more, which you can read at: bSDD website
bSDD – IFC mapping
Mapping rules are defined for the following concepts:
1. bSDD dictionary
In bSDD, a dictionary (a.k.a., class system) is a standardised collection of object definitions, properties, and materials owned and maintained by one organisation. One organisation can own one or more dictionaries.
In IFC, dictionary information are captured using IfcClassification. Below are the mapping rules for different IFC versions.
bSDD | IFC4x3_ADD2 | IFC4 | IFC2x3 | IDS1.0 | |
---|---|---|---|---|---|
Dictionary name | DictionaryName | IfcClassification.Name | IfcClassification.Name | IfcClassification.Name | ids:classification.system / (uri)* |
Dictionary source | uri of the dictionary | IfcClassification.Specification | IfcClassification.Location | β (IfcClassification.Source can be used as a workaround) | uri |
Dictionary version | DictionaryVersion | IfcClassification.Edition | IfcClassification.Edition | IfcClassification.Edition | (uri)* |
Dictionary owner | OrganizationCode | IfcClassification.Source | IfcClassification.Source | IfcClassification.Source | (uri)* |
Dictionary date | ReleaseDate | IfcClassification.EditionDate | IfcClassification.EditionDate | IfcClassification.EditionDate | (uri)* |
* IDS references bSDD using URI, instead of copying its content. Thanks to that, the information is still accessible by following the URI link. Note that the URI include many of those information: uri=”http://identifier.buildingsmart.org/uri/<OrganizationCode>/<DictionaryCode>/<DictionaryVersion>/...
.”
Snippets
βοΈ bSDD
{
"OrganizationCode": "text",
"DictionaryCode": "text",
"DictionaryVersion": "text",
"DictionaryName": "text",
"ReleaseDate": null,
"Status": "text",
"MoreInfoUrl": "text",
"UseOwnUri": false,
"DictionaryUri": "text",
"LanguageIsoCode": "text",
"LanguageOnly": false,
"License": "text",
"LicenseUrl": "text",
"QualityAssuranceProcedure": "text",
"QualityAssuranceProcedureUrl": "text",
"Classes": [],
"Properties": []
}
βοΈ IFC4x3_ADD2 (IfcClassification)
/* Source, Edition, EditionDate, Name, Description, Specification, ReferenceTokens */
#1=IFCCLASSIFICATION('Molio', '1.0', '2023-08-27', 'CCI Construction', 'List of codes...', 'https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0', ('.'));
βοΈ IFC4 (IfcClassification)
/* Source, Edition, EditionDate, Name, Description, Location, ReferenceTokens */
#1=IFCCLASSIFICATION('Molio', '1.0', '2023-08-27', 'CCI Construction', 'List of codes...', 'https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0', ('.'));
βοΈ IFC2x3 (IfcClassification)
/* Source, Edition, EditionDate, Name */
#1=IFCCLASSIFICATION('Molio', '1.0', '2023-08-27', 'CCI Construction');
2. bSDD class (objects)
In bSDD, a class can be any (abstract) object (e.g. IfcWall), abstract concept (e.g. Costing) or process (e.g. Installationβ.
In IFC, class information is captured using IfcClassificationReference. Below are the mapping rules, for different IFC versions.
bSDD | IFC4x3_ADD2 & IFC4 | IFC2x3 | IDS1.0 | |
---|---|---|---|---|
Class name | name of the class | IfcClassificationReference.Name | IfcClassificationReference.Name | (uri)* |
Class code | code of the class | IfcClassificationReference.Identification | IfcClassificationReference.ItemReference | (uri)* |
Class identifier | uri of the class | IfcClassificationReference.Location | IfcClassificationReference.Location | uri |
* IDS references bSDD using URI, instead of copying its content. Thanks to that, the information is still accessible by following the URI link. Note that the URI include many of those information: uri=”http://identifier.buildingsmart.org/uri/<OrganizationCode>/<DictionaryCode>/<DictionaryVersion>/class/<ClassCode>
.”
Snippets
βοΈ bSDD class
{
"Code": "text",
"Uid": "text",
"OwnedUri": "text",
"Name": "text",
"Definition": "text",
"Status": "text",
"ActivationDateUtc": "2022-05-12T00:00:00+02:00",
"RevisionDateUtc": null,
"VersionDateUtc": "2022-05-12T00:00:00+02:00",
"DeActivationDateUtc": null,
"VersionNumber": null,
"RevisionNumber": null,
"ReplacedObjectCodes": [],
"ReplacingObjectCodes": [],
"DeprecationExplanation": "text",
"CreatorLanguageIsoCode": "text",
"VisualRepresentationUri": "text",
"CountriesOfUse": [],
"SubdivisionsOfUse": [],
"CountryOfOrigin": "text",
"DocumentReference": "text",
"Synonyms": [],
"ReferenceCode": "text",
"ClassRelations": [
{
"RelationType": "text",
"RelatedClassUri": "text",
"RelatedClassName": "text",
"Fraction": null
}
],
"ClassType": "text",
"ParentClassCode": "text",
"RelatedIfcEntityNamesList": [],
"ClassProperties": [
{
"AllowedValues": [
{
"Uri": "text",
"Code": "text",
"Value": "text",
"Description": "text",
"SortNumber": null
}
],
"Code": "text",
"Description": "text",
"IsRequired": null,
"IsWritable": null,
"MaxExclusive": null,
"MaxInclusive": null,
"MinExclusive": null,
"MinInclusive": null,
"Pattern": "text",
"PredefinedValue": "text",
"PropertyCode": "text",
"PropertyUri": "text",
"PropertySet": "text",
"PropertyType": "text",
"SortNumber": null,
"Symbol": "text",
"Unit": "text"
}
]
}
βοΈ IFC4x3_ADD2 & IFC4
/* Source, Edition, EditionDate, Name, Description, Specification, ReferenceTokens */
#1=IFCCLASSIFICATION('Molio', '1.0', '2023-08-27', 'CCI Construction', 'List of codes...', 'https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0', ('.'));
/* Location, Identification, Name, ReferencedSource, Description, Sort */
#2=IFCCLASSIFICATIONREFERENCE('https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0/class/L-BD', 'L-BD', 'Wall structure', #1, 'structural system...', $);
/* GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag, PredefinedType */
#3=IFCWALL('3t3TDZl_D9NOIWB0BSjzJI', $, $, $, $, $, $, $, $);
/* GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingClassification */
#4=IFCRELASSOCIATESCLASSIFICATION('2t3TDZl_D9NOIWB0BSjzJI', $, $, $, (#3), #2);
βοΈ IFC2x3
/* Source, Edition, EditionDate, Name */
#1=IFCCLASSIFICATION('Molio', '1.0', '2023-08-27', 'CCI Construction');
/* Location, ItemReference, Name, ReferencedSource */
#2=IFCCLASSIFICATIONREFERENCE('https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0/class/L-BD', 'L-BD', 'Wall structure', #1);
/* GlobalId, OwnerHistory, Name, Description, ObjectType, ObjectPlacement, Representation, Tag */
#3=IFCWALL('3t3TDZl_D9NOIWB0BSjzJI', $, $, $, $, $, $, $);
/* GlobalId, OwnerHistory, Name, Description, RelatedObjects, RelatingClassification */
#4=IFCRELASSOCIATESCLASSIFICATION('2t3TDZl_D9NOIWB0BSjzJI', $, $, $, (#3), #2);
βοΈ IDS1.0
<ids:classification uri="https://identifier.buildingsmart.org/uri/bs-agri/fruitvegs/1.1/class/apple" cardinality="required" instructions="Those objects must be classified as apples.">
<ids:value>
<ids:simpleValue>apple</ids:simpleValue>
</ids:value>
<ids:system>
<ids:simpleValue>fruitvegs</ids:simpleValue>
</ids:system>
</ids:classification>
3. bSDD materials
In bSDD, a material is defined with a class of type ‘Material’. The main difference is in the mapping rules for IFC models. The bSDD class of type ‘Material’ should be linked to the IfcMaterial, which is then linked to various IfcObject.
In IFC, IfcMaterial are associated with objects through IfcRelAssociatesMaterial relation. However, when more than one material is associated with an element, there are many possible ways to define this relation through layer sets, profiles or constituents (% of content). Read more about: Material Association, in particular: Material Constituent Set, Material Layer Set Usage, Material Profile Set Usage, Material Set, Material Single.
Below are the mapping rules for different IFC versions.
bSDD | IFC4x3_ADD2 & IFC4 | IFC2x3 | IDS1.0 | |
---|---|---|---|---|
Material name | Class(Material).Name | IfcMaterial.Name & IfcExternalReferenceRelationship.RelatingReference.IfcClassificationReference.Name | IfcMaterial.Name | (uri)* |
Material code | Class(Material).Code | IfcExternalReferenceRelationship.RelatingReference.IfcClassificationReference.Identification | IfcMaterialClassificationRelationship.IfcClassificationReference.ItemReference | (uri)* |
Material identifier | Class(Material).Uri | IfcExternalReferenceRelationship.RelatingReference.IfcClassificationReference.Location | IfcMaterialClassificationRelationship.IfcClassificationReference.Location | uri |
* IDS references bSDD using URI, instead of copying its content. Thanks to that, the information is still accessible by following the URI link. Note that the URI include many of those information: uri=”http://identifier.buildingsmart.org/uri/<OrganizationCode>/<DictionaryCode>/<DictionaryVersion>/class/<MaterialCode>
.”
Snippets
For the bSDD snippet, look at the bSDD classes (objects)
βοΈ IFC4x3_ADD2 & IFC4
/* Source, Edition, EditionDate, Name, Description, Specification, ReferenceTokens */
#1=IFCCLASSIFICATION('bs-agri', '1.1', '2022-12-26', 'Fruit and vegetables', 'Demonstration dictionary', 'https://identifier.buildingsmart.org/uri/bs-agri/fruitvegs/1.1', ('.'));
/* Location, Identification, Name, ReferencedSource, Description, Sort */
#2=IFCCLASSIFICATIONREFERENCE('https://identifier.buildingsmart.org/uri/sbe/swedishmaterials/1/class/CE--', 'CE--', 'Betong', #1, 'kompositmaterial...', $);
/* Name, Description, Category */
#3=IFCMATERIAL('Betong','kompositmaterial...','concrete');
/* Name, Description, RelatingReference, RelatedResourceObjects */
#4=IFCEXTERNALREFERENCERELATIONSHIP('Betong', 'kompositmaterial...', #2, (#3));
βοΈ IFC2x3
/* Source, Edition, EditionDate, Name */
#1=IFCCLASSIFICATION('bs-agri', '1.1', '2022-12-26', 'Fruit and vegetables');
/* Location, ItemReference, Name, ReferencedSource */
#2=IFCCLASSIFICATIONREFERENCE('https://identifier.buildingsmart.org/uri/bs-agri/fruitvegs/1.1/class/fiber', 'fiber', 'Fiber', #1);
IfcClassificationReference( $,**ItemReference**,$,$)
/* Name */
#3=IFCMATERIAL('Fiber');
/* MaterialClassifications, ClassifiedMaterial */
#4=IFCMATERIALCLASSIFICATIONRELATIONSHIP(#2, #3);
βοΈ IDS1.0
<ids:material uri="https://identifier.buildingsmart.org/uri/bs-agri/fruitvegs/1.1/class/fiber" cardinality="required" instructions="The material should be called fiber.">
<ids:value>
<ids:simpleValue>fiber</ids:simpleValue>
</ids:value>
</ids:material>
4. bSDD properties
In bSDD, a class (object) can have multiple properties, and a property can be part of many classes (objects).
In IFC, properties information are captured using IfcProperty (and grouped using IfcPropertySet). IfcProperty is an abstract definition, meaning it can not be instantiated. Instead, there are many forms it might take, with the most common being IfcPropertySingleValue.
Below are the mapping rules for different IFC versions.
bSDD | IFC4x3_ADD2 | IFC4 & IFC2x3 | IDS1.0 | |
---|---|---|---|---|
Property name | PropertyCode (of ClassProperty) | IfcPropertySingleValue.Name | IfcPropertySingleValue.Name | (uri)* |
Property identifier | uri (of ClassProperty) | IfcPropertySingleValue.Specification | IfcPropertySingleValue.Description | uri |
Property predefined value (single value) | PredefinedValue (of ClassProperty) | IfcPropertySingleValue.NominalValue | IfcPropertySingleValue.NominalValue | (uri)* |
Property unit (single value or from enumeration) | PredefinedValue (of Property or ClassProperty) | IfcPropertySingleValue.Unit | IfcPropertySingleValue.Unit | (uri)* |
Property allowed values (from enumeration) | AllowedValues (of Property or ClassProperty) | IfcPropertyEnumeratedValue .EnumerationValues | IfcPropertyEnumeratedValue .EnumerationValues | (uri)* |
PropertySet name | PropertySet (of ClassProperty) | IfcPropertySet.Name | IfcPropertySet.Name | (uri)* |
* IDS references bSDD using URI, instead of copying its content. Thanks to that, the information is still accessible by following the URI link. Note that the URI include many of those information: uri=”http://identifier.buildingsmart.org/uri/<OrganizationCode>/<DictionaryCode>/<DictionaryVersion>/prop/<PropertyCode>
.”
β οΈ IMPORTANT
In bSDD, properties exist independently of the class (object) they might be assigned to. Therefore:
- The
AllowedValues
of aProperty
are defined at the level of each property. - The
PredefinedValues
of aProperty
is defined at the level of each class (object). - The relationship between a property and its property set is defined at the level of each class (object).
AllowedValue
s can be defined also at the level of each class (object). When this happens, theAllowedValue
defined at the level of theProperty
is overwritten.
The human-readable and translatable Name that exists in bSDD has no reflection in IFC. That is why it is important to remember that the Code will be used in IFC datasets, and Name will only be displayed by software capable of reading the names from bSDD. The reason for this is that we need the datasets to follow consistent terms, regardless of the language displayed to the user.
Snippets
βοΈ bSDD property
{
"Code": "text",
"Uid": "text",
"OwnedUri": "text",
"Name": "text",
"Definition": "text",
"Status": "text",
"ActivationDateUtc": "2022-05-12T00:00:00+02:00",
"RevisionDateUtc": null,
"VersionDateUtc": "2022-05-12T00:00:00+02:00",
"DeActivationDateUtc": null,
"VersionNumber": null,
"RevisionNumber": null,
"ReplacedObjectCodes": [],
"ReplacingObjectCodes": [],
"DeprecationExplanation": "text",
"CreatorLanguageIsoCode": "text",
"VisualRepresentationUri": "text",
"CountriesOfUse": [],
"SubdivisionsOfUse": [],
"CountryOfOrigin": "text",
"DocumentReference": "text",
"Description": "text",
"Example": "text",
"ConnectedPropertyCodes": [],
"PhysicalQuantity": "text",
"Dimension": "text",
"DimensionLength": null,
"DimensionMass": null,
"DimensionTime": null,
"DimensionElectricCurrent": null,
"DimensionThermodynamicTemperature": null,
"DimensionAmountOfSubstance": null,
"DimensionLuminousIntensity": null,
"MethodOfMeasurement": "text",
"DataType": "text",
"PropertyValueKind": "text",
"MinInclusive": null,
"MaxInclusive": null,
"MinExclusive": null,
"MaxExclusive": null,
"Pattern": "text",
"IsDynamic": false,
"DynamicParameterPropertyCodes": [],
"Units": [],
"AllowedValues": [
{
"Uri": "text",
"Code": "text",
"Value": "text",
"Description": "text",
"SortNumber": null
}
],
"TextFormat": "text",
"PropertyRelations": [
{
"RelationType": "text",
"RelatedPropertyUri": "text",
"RelatedPropertyName": "text"
}
]
}
βοΈ IFC2x3
/* Name, Description, NominalValue, Unit */
#1=IFCPROPERTYSINGLEVALUE("EF021146", "https://identifier.buildingsmart.org/uri/etim/etim/9.0/prop/EF021146", $, $);
βοΈ IFC4x3_ADD2
/* Name, Specification, NominalValue, Unit */
#1=IFCPROPERTYSINGLEVALUE("EF021146", "https://identifier.buildingsmart.org/uri/etim/etim/9.0/prop/EF021146", $, $);
βοΈ IDS1.0
<ids:property dataType="IFCLABEL" uri="http://identifier.buildingsmart.org/uri/buildingsmart/ifc/4.3/prop/manufacturer" cardinality="required" instructions="One of the two manufacturers must be specified.">
<ids:propertySet>
<ids:simpleValue>Pset_ManufacturerTypeInformation</ids:simpleValue>
</ids:propertySet>
<ids:baseName>
<ids:simpleValue>Manufacturer</ids:simpleValue>
</ids:baseName>
<ids:value>
<xs:restriction base="xs:string">
<xs:enumeration value="Manufacturer 1" />
<xs:enumeration value="Manufacturer 2" />
</xs:restriction>
</ids:value>
</ids:property>
Imported from MarkDown source file