On vous a forcément dit ou vous avez peut-être entendu dire qu’il ne faut pas modifier un fichier IFC sous format texte, j’espère qu’au bout de ce blog, vous serez convaincu du contraire.
Le format IFC (Industry Foundation Classes) est un standard (ISO 16739) cherchant à fournir un modèle de données commun et ouvert pour la représentation numérique des bâtiments et infra structures, d’une façon compréhensible à la fois par les machines que par les humains. Ce dernier peut être sérialisé (écrit) de diverses manières, dont le format STEP (ISO10303-21) , qui n’est rien d’autre qu’un fichier texte. Il s’agit d’une écriture compacte et facilement compréhensible, une fois les bases acquises, et reste la plus communément échangée sous l’extension “.ifc”
À la fin de cette série de blogs, vous saurez “écrire” un modèle IFC, en utilisant n’importe quel éditeur de texte et en s’appuyant sur la documentation officielle de la norme IFC 4 ADD2 TC1.
Nous chercherons étape par étape à décrire, entre autres, les concepts ci-après :
- Définition d’un projet
- Spécification des unités
- Définition d’une arborescence spatiale (site, bâtiment, niveaux ..)
- Création d'une géométrie 3D
- Appartenance spatiale
- Assignation de matériaux
- Spécification de données (paramètres, quantités, classification)
Principes
Un modèle IFC est constitué d'entités. Une entité IFC est le composant de base, porteur d'information, pouvant représenter un élément physique ou virtuel, une relation, un composant abstrait ou tout autre aspect d'une maquette IFC. Dans l'IFC4 il existe 776 entités (liste), dont une grande partie est purement conceptuelle, à l'image de IfcRoot.
Dans un fichier IFC (STEP), chaque ligne représente une entité non conceptuelle, qui commence par # et se termine par ;.
#id = entity(attr1; ?attr2;attr3; ….);
id : numéro unique par ligne (i.e. entité IFC), la numérotation des entités peut être discontinue et désordonnée.
Un attribut peut être :
- Explicite : texte (ex : “Description”), numérique (ex : 0.54 …), ...
- Une autre entité (ex :
#34) - Dérivé : issue d’une formule prédéterminée :
* - Une liste : ayant plusieurs valeurs (valeur_1, valeur_2…), ou faisant référence à une liste d'autres entités
Un attribut peut également être optionnel, nous utiliserons la notation ?+nom_attribut, dans ce cas si sa valeur n’est pas définie := $
Les entités IFC portant un sens sémantique unique (éléments, relations, …) possèdent un attribut GlobalId permettant de les distinguer dans le schéma IFC. Cet identifiant unique global, composé de 22 caractères, permet, entre autres, de suivre une entité donnée tout au long du cycle de vie d’un modèle IFC
Entête
Pour commencer l'écriture du modèle, ouvrez un nouveau fichier texte vierge avec votre éditeur texte préféré (Bloc-notes par exemple sous Windows).
Par la suite, il convient de renseigner un entête avec quelques métadonnées (nom, date, logiciel de provenance ...). Les règles du renseignement des informations figurant dans l’entête sont spécifiées dans le Guide d’implémentation d’entête.
ISO-10303-21;HEADER;FILE_DESCRIPTION((),'2;1');FILE_NAME('Demo_project[1].ifc','2024-12-29T14:57:05+02:00',(),(),'NOTEPAD','NOTEPAD',$);FILE_SCHEMA(('IFC4'));ENDSEC;DATA;#1 =();...ENDSEC;END-ISO-10303-21;
Le projet
Comme point de départ de notre modèle, partons du projet, l'entité IfcProject ayant les attributs ci-après
IFCPROJECT (GlobalId,?OwnerHistory,?Name,?Description,?ObjectType,?LongName,?Phase,?RepresentationContexts,?UnitsInContext)
GlobalId : Identifiant unique global := '0kzsDsvILDb85OYhywTwjS'
?OwnerHistory : peut capturer l’historique du propriétaire (créateur) et la provenance (application) de l’entité := $
?Name : Nom court := '001'
?Description : Information permettant de mieux de décrire l’entité := 'Demo project'
?ObjectType : Typage optionnel := $
?LongName : Nom long permettant une meilleure contextualisation := 'project 001'
?Phase : phase actuelle du projet := $
?RepresentationContexts : liste des contextes (i.e. vues) du projet := (#6)
?UnitsInContext : Définition des unités utilisées dans le projet := #5
Pour créer cette entité, nous allons ajouter la ligne ci-après :
#1=IFCPROJECT('0kzsDsvILDb85OYhywTwjS',$,'001','Demo project',$,'Projet 001',$,(#6),#5);
Unités
Par la suite, il est primordial de définir les unités du projet.
Les unités standards du système international peuvent être définies avec IfcSiUnit
IFCSIUNIT ( Dimensions, UnitType, ?Prefix, Name)
Dimensions *: attribut dérivé *du contexte du projet.
UnitType : Parmi la liste des types d’unité (UnitType) est défini par l’énumération IfcUnitEnum.
Name : Parmi la liste des unités SI, définies par l’énumération IfcSIUnitName
Nous pouvons donc lister les unités utilisées en ajoutant les lignes ci-après :
// Unité de longeur#2=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);// Unité de surface#3=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);// Unité de volume#4=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
L'entité IfcUnitAssignment permet de regrouper les unités attribuables au projet. Il n'est donc pas autorisé d'avoir deux unités d'un même type (définissant la même grandeur, comme la *longueur *ou le *volume *par exemple)
IFCUNITASSIGNMENT((unité1, unité2 …..))
L'ordre des unités n’est pas déterminant.
#5=IFCUNITASSIGNMENT((#2,#3,#4));
Les vues
IfcGeometricRepresentationConrext est le point de départ pour la définition des "vues" IFC. Elle permet de définir le contexte global, en y attachant un système de coordonnées. Dans un modèle IFC, il est obligatoire d’avoir une instance (i.e. entité)
IfcGeometricRepresentationContext
IFCGEOMETRICREPRESENTATIONCONTEXT(?ContextIdentifier,?ContextType,CoordinateSpaceDimension,?Precision,WorldCoordinateSystem,?TrueNorth)
ContextIdentifier : identifiant optionnel du contexte de représentation utilisé dans le projet, suivant l’accord d’implementation := $
ContextType : identifiant optionnel du type de contexte, suivant l’accord d’implementation := 'Model'
CoordinateSpaceDimension : nombre de dimensions de l’espace := 3
Precision : Précision utilisée pour la modélisation := 1.E-05
WorldCoordinateSystem : Origine du système de coordonnées utilisée par le contexte de représentation.
TrueNorth : Orientation du nord géographique, exprimée en IFCDIRECTION [2D], si non spécifiée (i.e. $) := Y : (0., 1.) par défaut.
IfcGeometricRepresentationSubContext permet d’avoir une meilleure granularité en termes de paramétrage de la vue en question (échelle, 2D/3D …), pouvant s’appliquer à certaines représentations d’un objet (vue filaire, élévation, vue en plan 2D ….)
IFCGEOMETRICREPRESENTATIONSUBCONTEXT(?ContextIdentifier,?ContextType,CoordinateSpaceDimension,Precision,WorldCoordinateSystem,TrueNorth ,ParentContext,?TargetScale,TargetView,?UserDefinedTargetView)
?ContextIdentifier := 'body'
?ContextType := 'Model'
CoordinateSpaceDimension := * dérivé du contexte parent
Precision := * dérivé du contexte parent
WorldCoordinateSystem := * dérivé du contexte parent
TrueNorth := * dérivé du contexte parent
ParentContext : Contexte parent
?TargetScale : Échelle := $
TargetView : Type de vue cible utilisé pour les représentations auxquelles ce contexte s’applique, dont la valeur est issue de l’énumération IfcGeometricProjectionEnum := .MODEL_VIEW.
?UserDefinedTargetView : type personnalisé si ?TargetView = .USERDEFINED. := $
#6=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#11,$);#7=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#6,$,.MODEL_VIEW.,$);
Les coordonnées
En IFC, le positionnement d’un élément peut être
- Absolu, dans le repère global projet
- Relatif, par rapport à un autre élément
L’entité IfcAxis2Placement3D permet de décrire une position et une orientation dans l’espace 3D.
IFCAXISTOPLACEMENT3D(Location, ?Axis, ?RefDirection)IFCCARTESIANPOINT ((x))[1D] | ((x,y))[2D] | ((x,y,z)) [3D]IFCDIRECTION ((x,y))[2D] | ((x,y,z)) [3D]
Location : position géométrique symbolisée par un point 3D, avec des coordonnées (X, Y, Z) de type IfcCartesianPoint
Axis : l’axe Z local, implicitement (0. , 0., 1.) si non renseigné ($), il s’agit d’un vecteur de type IfcDirection
RefDirection : l’axe X local, implicitement (1. , 0., 0.) si non renseigné ($), il s’agit d’un vecteur de type IfcDirection
Le 3ᵉ axe (Y) du repère orthonormé est déduit implicitement.
Nous définissons donc l'origine du système de cordonnées du contexte de représentation globale (attribut WorldCoordinateSystem de l'entité #6 = #11), en ajoutant les lignes ci-après.
#8=IFCCARTESIANPOINT((0.,0.,0.));#9=IFCDIRECTION((0.,0.,1.));#10=IFCDIRECTION((1.,0.,0.));#11=IFCAXIS2PLACEMENT3D(#8,#9,#10);
L’entité IfcLocalPlacement permet de définir la position (repère local) d’un élément, dans le repère global du projet, ou relativement au repère local d’un autre élément.
IFCLOCALPLACEMENT(?PlacementRelTo, RelativePlacement)
?PlacementRelTo : Repère de l’élément hôte du type IfcLocalPlacement , si non renseigné (:=$) la cible sera le repère global du projet
RelativePlacement : Positionnement du type IfcAxisToPlacement3D.
Le schéma ci-après illustre les relations avec les entités définies précédemment pour décrire l'emplacement d'un élément.
Structure spatiale
L’IFC utilise une décomposition conceptuelle permettant de mieux repérer les objets en les situant dans une arborescence spatiale
Projet > Site(s) > Bâtiment(s) > Niveau(x) > Espace(s)
Le site
Un site est représenté via une entité IfcSite, ayant la définition ci-après :
IFCSITE(GlobalId,?OwnerHistory,?Name,?Description,?ObjectType,?ObjectPlacement,?Representation,?LongName,?CompositionType,?RefLatitude,?RefLongitude,?RefElevation,?LandTitleNumber,?SiteAddress)
… Voir définitions précédentes
?ObjectPlacement : Repère local de l’élément
?Representation : Définit la géométrie à associer à un élément
?CompositionType : Décrit s’il s’agit d’un élément spatial simple (par défaut) , complexe, ou faisant partie d’un autre élément
?RefLatitude : Longitude du point de référence dans le système WGS84 (GPS)
?RefLongitude : Longitude du point de référence dans le système WGS84 (GPS)
?RefElevation : Altimétrie par rapport au niveau de la mer du point de référence
?LandTitleNumber : Numéro de la parcelle
?SiteAddress : Adresse du Site
En ajoutant les lignes ci-après, nous définissons un site et sa localisation dans l'espace 3D, relativement au système de coordonnées du contexte global.
/* SITE */#12=IFCSITE('3APD6n_1v8iOZcZAM$f460',$,'DEMO SITE',$,$,#17,$,$,$,$,$,$,$,$);/* EMPLACEMENT SITE */#13=IFCCARTESIANPOINT((0.,0.,0.));#14=IFCDIRECTION((0.,0.,1.));#15=IFCDIRECTION((1.,0.,0.));#16=IFCAXIS2PLACEMENT3D(#13,#14,#15);#17=IFCLOCALPLACEMENT($,#16);
Le bâtiment
Un bâtiment est représenté par une entité IfcBuilding, définie ci-après :
IFCBUILDING(GlobalId,?OwnerHistory,?Name,?Description,?ObjectType,?ObjectPlacement,?Representation,?LongName,?CompositionType,?ElevationOfRefHeight,?ElevationOfTerrain,?BuildingAddress)
… voir définitions précédentes
?ElevationOfRefHeight : altimétrie du niveau “zéro” du bâtiment := $
?ElevationOfTerrain : altimétrie du point bas du sol autour du bâtiment := $
?BuildingAddress : adresse postale du bâtiment := $
Nous ajoutons les lignes ci-après pour définir un bâtiment et sa localisation relative au site.
/* BATIMENT */#18=IFCBUILDING('3Os7V4COj8F8hPG9h1Qas0',$,'DEMO BUILDING',$,$,#23,$,$,$,$,$,$);/* EMPLACEMENT BATIMENT */#19=IFCCARTESIANPOINT((0.,0.,0.));#20=IFCDIRECTION((0.,0.,1.));#21=IFCDIRECTION((1.,0.,0.));#22=IFCAXIS2PLACEMENT3D(#19,#20,#21);#23=IFCLOCALPLACEMENT(#17,#22);
Le niveau
Un étage de bâtiment est défini par l'entité IfcBuildingStorey, avec la définition suivante :
IFCBUILDINGSTOREY(GlobalId,?OwnerHistory,?Name,?Description,?ObjectType,?ObjectPlacement,?Representation,?LongName,?CompositionType,?Elevation)
… Attributs similaires définis par les entités précédentes
?Elevation : Altimétrie du niveau
Pour créer deux niveaux, nous ajoutons les lignes ci-après :
/* ETAGE 0 */#24=IFCBUILDINGSTOREY('0JWsMvgRX5dwpWREHcfkr3',$,'Storey_0',$,$,#29,$,$,$,$);/* EMPLACEMENT ETAGE 0 */#25=IFCCARTESIANPOINT((0.,0.,0.));#26=IFCDIRECTION((0.,0.,1.));#27=IFCDIRECTION((1.,0.,0.));#28=IFCAXIS2PLACEMENT3D(#25,#26,#27);#29=IFCLOCALPLACEMENT(#23,#28);/* ETAGE 1 */#30=IFCBUILDINGSTOREY('0JWsMvgRX5dNBDREHcfUi$',$,'Storey_1',$,$,#35,$,$,$,$);/* EMPLACEMENT ETAGE 1 */#31=IFCCARTESIANPOINT((0.,0.,3.));#32=IFCDIRECTION((0.,0.,1.));#33=IFCDIRECTION((1.,0.,0.));#34=IFCAXIS2PLACEMENT3D(#31,#32,#33);#35=IFCLOCALPLACEMENT(#23,#34);
Espace
Les espaces sont définis via l'entité IfcSpace, qui ne sera pas utilisée lors de cette démo (voir documentation pour plus détails).
Agrégation
L’entité IfcRelAggregates est la relation par laquelle un élément physique ou virtuel peut être décomposé en d’autres éléments. Par exemple, un projet est composé d’un ou plusieurs sites, un site est composé d’un ou plusieurs bâtiments…
IFCRELAGGREGATES(GlobalId,?OwnerHistory,?Name,?Description,RelatingObject,RelatedObjects)
… Attributs similaires définis par les entités précédentes
RelatingObject : Élément composé
RelatedObjects : Liste d’éléments composants
Pour construire l'arborescence Projet > Site(s) > Bâtiment(s) > Niveau(x), nous ajoutons les lignes ci-après :
/* PROJET => SITE */#34=IFCRELAGGREGATES('1AT1M9v3T9PwTZRpjoKwki',$,$,$,#1,(#12));/* SITE => BATIMENT */#35=IFCRELAGGREGATES('2H53DqIErDouOZBg0eoE5I',$,$,$,#12,(#18));/* BATIMENT => ETAGES */#36=IFCRELAGGREGATES('0Eil2cDAHAgBBTLQzvjwHO',$,$,$,#18,(#24,#30));
Jusqu’ici le fichier contient un modèle IFC avec une arborescence spatiale.
Pour pouvoir l'ouvrir avec une visionneuse IFC, enregistrez-le sous l'extension .ifc au lieu de .txt.
Si vous avez bien suivi les étapes précédentes, vous devriez aboutir à un résultat identique au fichier joint.
Dans la deuxième partie de cette série de blogs, nous allons ajouter un mur est sa géométrie.