Cet article est la deuxième partie d’une série de blogs sur l'écriture d'un IFC sous format texte en s'appuyant sur la norme IFC4.
La première partie explique les bases pour écrire un fichier IFC à l’aide d’un éditeur de texte. Pour suivre, il est fortement conseillé d’avoir lu cette dernière, dans laquelle nous avons défini un projet, des unités, ainsi qu’une hiérarchie spatiale.
Dans cette partie, nous allons définir un élément physique (un mur) et lui associer une géométrie simple.
Mur
Pour représenter un mur, nous pouvons faire appel à l'entité IfcWall, ayant la définition suivante :
IFCWALL(GlobalId,?OwnerHistory,?Name,?Description,?ObjectType,?ObjectPlacement,?Representation,?Tag,?PredefinedType)
GlobalId : Identifiant global unique := '0I8UD4qB9DjwVCwE644OEQ'
?OwnerHistory : Peut capturer l’historique du créateur et l’origine (application) := $
?Name : Nom court := 'Wall'
?Description : Fournit des informations supplémentaires sur l’entité := $
?ObjectType : *Type *optionnel := $
?ObjectPlacement : Positionnement de l’élément dans l’espace de type IfcLocalPlacement.
?Representation : Définit la géométrie associée à un élément, de type IfcProductDefinitionShape.
?Tag : Étiquette ou identifiant de l’instance.
?PredefinedType : Type générique prédéfini pour un mur spécifié dans l’énumération IfcWallTypeEnum.
Pour ajouter le mur nouvellement défini à notre modèle IFC, nous allons ajouter la ligne suivante au fichier :
/* MUR */#39=IFCWALL('0I8UD4qB9DjwVCwE644OEQ',$,'Wall',$,$,$,$,$,$);
La plupart des attributs optionnels sont laissés vides (i.e. $) pour simplifier la lecture et la compréhension.
Jusqu’ici, l’entité IfcWall a été créée, mais elle n’est pas encore associée à une géométrie 3D (i.e. ?Representation) ou à une position dans l’espace 3D (?ObjectPlacement).
Appartenance spatiale
Pour placer un élément physique dans la structure spatiale, définie dans la partie 1, nous utilisons l'entité IfcRelContainedInSpatialStructure. Un objet ne peut être placé que dans un seul conteneur spatial.
IFCRELCONTAINEDINSPATIALSTRUCTURE(GlobalId,?OwnerHistory,?Name,?Description,RelatedElements,RelatingStructure)
... Voir définitions précédentes.
RelatedElements : Listes d'objets à placer.
RelatingStructure : Conteneur spatial (IfcSite / IfcBuilding / IfcBuildingStorey / IfcSpace)
Nous utiliserons cette relation pour placer le mur (#39) dans l'étage Storey_0 (#24).
Le graphique ci-après illustre les connections de cette relation :
Pour que la relation soit effective, nous ajoutons la ligne ci-dessous à notre fichier.
/* MUR => ETAGE */#40=IFCRELCONTAINEDINSPATIALSTRUCTURE('0xWnzyvcL7NvvRiK_Y1BdR',$,$,$,(#39),#24);
Positionnement 3D
Le positionnement du mur sera défini à l’aide de l’entité IfcLocalPlacement, et sera relatif à l’étage le contenant, voir la partie 1 pour une explication détaillée des mécanismes de positionnement en IFC.
..../* MUR ↓ */#39=IFCWALL('0I8UD4qB9DjwVCwE644OEQ',$,'Wall',$,$,#47,$,$,$);..../* POSITIONNEMENT MUR*/#43=IFCCARTESIANPOINT((0.,0.,0.));#44=IFCDIRECTION((0.,0.,1.));#45=IFCDIRECTION((1.,0.,0.));#46=IFCAXIS2PLACEMENT3D(#43,#44,#45);#47=IFCLOCALPLACEMENT(#29,#46);
Pour positionner le mur dans l’espace 3D, l’attribut ?ObjectPlacement doit être défini := #47.
Cela signifie que le mur sera placé à l’origine et que ses axes locaux seront alignés à ceux de son conteneur (i.e. étage du bâtiment).
Géométrie
La définition d'une géométrique en IFC est principalement implicite. Comme tout le reste, des entités sont utilisées pour décrire diverses opérations géométriques. Les logiciels interprètent ensuite ces entités, suivant la norme IFC, pour dessiner la géométrie appropriée. Cette approche est idéale pour exprimer des géométries paramétriques, facilement modifiables par la suite.
Pour cette démonstration, nous allons créer une géométrie simple d'un mur ayant les dimensions suivantes :
Longueur = 5m** Largeur = 0.1m Hauteur = 3m.**
Le schéma IFC prend en charge une large gamme de typologies de représentations géométriques 3D (voir la documentation IfcShapeRepresentation).
Pour créer notre géométrie, nous utiliserons une extrusion le long de l’axe Z.
Le schéma ci-dessous décrit la liste des entités et connexions nécessaires pour créer la géométrie souhaitée :
En le parcourant de haut en bas :
Définit une collection ordonnée de points 2D.
#48=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,0.1),(5.,0.1),(5.,0.),(0.,0.)));
CoordList Liste des points 2D. Notez que le dernier point est identique au premier pour fermer la boucle. La longueur et la largeur peuvent être dérivées implicitement.
Crée une courbe délimitée en reliant les points 2D définis précédemment.
#49=IFCINDEXEDPOLYCURVE(#48,$,.F.);
Points : Liste des points := #48
?Segments : Liste des segments, inutilisée dans notre exemple := $
?SelfIntersect : Indication si la courbe s’auto-intersecte ou non. Cela est à titre purement indicatif := .F. (Faux)
Définit un profil bidimensionnel arbitraire pour être utilisé dans la géométrie de surface balayée.
#50=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#49);
ProfileType Type de géométrie utilisé, à partir de l’énumération IfcProfileTypeEnum. Dans notre cas := .AREA.
?ProfileName : Nom lisible du profil := $
OuterCurve : Courbe délimitée définissant les contours extérieurs du profil := #49
Définit une extrusion en balayant une section transversale (profil).
#51=IFCEXTRUDEDAREASOLID(#50,#52,#56,3.);
SweptArea : Surface définissant la zone à balayer := #50
Position : Position de la surface, placée à l’origine du placement du mur := #52
ExtrudedDirection : Direction dans laquelle la surface est balayée := #56 (Axe Z)
Depth : Distance de balayage de la surface dans la direction ExtrudedDirection, exprimant la hauteur du mur := 3.
Définit la représentation d’un élément physique ou de l’une de ses parties dans un contexte géométrique spécifique.
#57=IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#51));
ContextOfItems : Contexte pour lequel cette représentation est destinée := #57 (voir partie 1)
RepresentationIdentifier : Identifiant de la représentation := 'Body'
RepresentationType : Description du type de représentation := 'SweptSolid'
Items : Liste d’éléments de représentation géométrique définis pour cette représentation := #51
Définit toutes les informations de forme pertinentes pour un élément physique. Permet plusieurs représentations géométriques pour le même produit (3D, 2D, annotations...).
Les lignes résultantes à ajouter sont les suivantes :
..../* MUR ↓ */#39=IFCWALL('0I8UD4qB9DjwVCwE644OEQ',$,'Wall',$,$,#47,#58,$,$);..../* GEOMETRIE MUR */#48=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,0.1),(5.,0.1),(5.,0.),(0.,0.)));#49=IFCINDEXEDPOLYCURVE(#48,$,.F.);#50=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#49);#51=IFCEXTRUDEDAREASOLID(#50,#52,#56,3.);#52=IFCAXIS2PLACEMENT3D(#53,#54,#55);#53=IFCCARTESIANPOINT((0.,0.,0.));#54=IFCDIRECTION((0.,0.,1.));#55=IFCDIRECTION((1.,0.,0.));#56=IFCDIRECTION((0.,0.,1.));#57=IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#51));#58=IFCPRODUCTDEFINITIONSHAPE($,$,(#57));
Pour affecter la géométrie au mur, l’attribut ?Representation doit être défini à #58
À ce stade, nous avons écrit un modèle IFC avec un mur et sa géométrie, contenu dans une hiérarchie spatiale.
Dans la troisième partie de cette série de blogs, nous ajouterons des données (matériaux, quantités, propriétés, classification…).