Présentation
Dans le cadre de la politique du Parti et du gouvernement , il y a un changement actif dans la législation afin d'introduire la technologie BIM - Building Information Modeling. Dans la continuité de la ligne Party, nous considérerons le format de présentation ouvert BIM - IFC (Industry Foundation Classes).

L'histoire d'IFC commence en 1995 (en fait, à l'été 1993
[1] ), lorsque Autodesk Corporation et un groupe de "camarades" ont organisé un accord de cartel pour développer un format d'échange pour divers systèmes de CAO pour la conception de bâtiments. Un an plus tard, les camarades ont compris que ce format devait être ouvert et développé par une organisation à adhésion ouverte, comme l'International Alliance for Interoperability est apparue en 1996. Plus tard, en 2008, l'organisation a été renommée buildingSMART - pour plus de glamour.
Les développeurs d'IFC n'avaient pas une imagination riche et n'avaient pas eu l'occasion de l'appliquer - ils avaient des délais très modestes et la tâche semblait très globale. Par conséquent, ils ont pris comme base le format STEP (Standard for the Exchange of Product model data), ou plutôt le protocole d'application 225: Building Elements. Je dois dire que autour de STEP, une infrastructure riche a été créée sous la forme d'un ensemble de spécifications à l'état de normes ISO. Cette infrastructure est basée sur le langage de modélisation de données EXPRESS et son incarnation graphique EXPRESS-G; ce langage a été développé pour la commodité de la génération automatique de code dans divers langages de programmation.
Le développement d'IFC a commencé en septembre 1995, IFC 1.0 a été publié en juin 1996, la version finale était en janvier 1997. En fait, l'objectif de la première version d'IFC était de démontrer la possibilité même de réaliser l'objectif, diverses sociétés ont présenté leurs démonstrations d'exportation / importation dans ce format.
En novembre 1997, la prochaine version est sortie - 1.5, mais une tentative d'implémentation a rapidement révélé de nombreuses erreurs qui ont nécessité le développement d'une version fixe 1.5.1, qui a été introduite en parallèle avec le développement de la version 2.0 - qui a été introduite en mars 1999.
Toutes ces versions sont désormais obsolètes.
La version 2.1 est sortie en novembre 2000. Il s'agit de la version la plus ancienne pour laquelle la documentation est disponible. Il a ensuite été publié sous la référence ISO / PAS 16739: 2005.
Maintenant, la version la plus courante (que la plupart des programmes comprennent) est IFC 2.3.
Logiciels
Pour lire IFC, un éditeur de texte avec mise en évidence de la syntaxe est utile, par exemple, j'ai utilisé du code n ++ et vs avec mes paramètres de syntaxe IFC maladroits.
Mais un autre outil nécessaire sera un programme capable de visualiser des graphiques dans IFC. Maintenant, il y a beaucoup de téléspectateurs pour cela et même des gratuits; personnellement, je préfère
XbimXplorer du projet
xBIM . J'ai également utilisé Revit, mais je dois dire que Revit pur n'est pas très convivial avec IFC - il n'est même pas capable de lire le fichier qu'il a créé (oui, Revit d'Autodesk ne sait pas comment travailler avec le format inventé par Autodesk - c'est la carte de visite d'Autodesk Mais ils n'ont tout simplement pas trouvé Revit, mais l'ont acheté - comme d'habitude), mais il n'a pas de mauvais plugin pour cela -
IFC pour Revit (lors de l'écriture de l'article, il a trouvé plusieurs erreurs, il devra être corrigé quand il y aura du temps ...)
Je dois dire que le format IFC est tellement déroutant qu'aucun programme ne le gère correctement - chacun le fait à sa manière. XbimXplorer ignore donc les graphiques 2D et certaines erreurs de syntaxe.
La description
Le format IFC existe sous trois formes: IFC-SPF (.ifc), IFC-XML (.ifcXML), IFC-ZIP (.ifcZIP)
IFC-SPF est un format de texte défini dans ISO 10303-21 - en fait c'est un fichier STEP
IFC-XML est un format XML défini dans ISO 10303-28 ("STEP-XML")
IFC-ZIP - Une archive zip qui peut contenir .ifc ou .ifcXML
La structure du fichier IFC-SPF est décrite dans
ISO 10303-21 (il existe GOST ISO 10303-21-2002) en notation Wirth. Il s'agit d'un fichier texte qui n'utilise que des caractères avec des codes compris entre 32 et 126 (la troisième édition permet l'utilisation de caractères avec des codes 127 à 255, mais n'est pas recommandée - pour des raisons de compatibilité)
Les commentaires sur plusieurs lignes sont marqués par des paires de caractères / * * /
Il existe plusieurs façons d'écrire des caractères dans un codage différent
Enregistrement ISO 8859 :
Directive \ S \ - le code de caractère après la directive indique le code de caractère dans le tableau ISO 8859-1
Directive \ P * \ - ici, au lieu de *, il doit y avoir une majuscule latine, elle indique le numéro du tableau ISO 8859 utilisé pour la directive \ S \, A signifie ISO 8859-1, B signifie ISO 8859-2, etc.
Enregistrement ISO 10646 :
Directive \ X \ - la directive est suivie d'un nombre hexadécimal à deux chiffres indiquant un caractère compris entre U + 0000 et U + 00FF
Directives \ X2 \ * \ X0 \ et \ X4 \ * \ X0 \ - ici au lieu de * il y a une séquence de nombres hexadécimaux à deux chiffres (X2) ou à quatre chiffres (X4) qui indiquent les caractères correspondants
Bonjour tout le monde! => \ X2 \ 041F04400438043204350442 \ X0 \, \ X2 \ 041C04380440 \ X0 \!
Longueur de chaîne brute maximale - 32 769 octets
Structure du fichier - le fichier commence par la ligne ISO-10303-21; et se termine par la ligne END-ISO-10303-21; bien qu'il puisse toujours y avoir une section de signature SIGNATURE_SECTION, mais je ne considérerai pas cette option.
Entre ces lignes, il devrait y avoir une section d'en-tête HEADER_SECTION, après quoi il peut y avoir des sections ANCHOR_SECTION et / ou REFERENCE_SECTION, ainsi qu'une ou plusieurs DATA_SECTION (dans IFC il n'y en a qu'une)
HEADER_SECTION - La structure de la section d'en-tête IFC n'autorise que trois éléments dans cette section: FILE_DESCRIPTION, FILE_NAME, FILE_SCHEMA
ENTITY file_description;
description : LIST [1:?] OF STRING (256) ;
implementation_level : STRING (256) ;
END_ENTITY;
Option minimum:
FILE_DESCRIPTION (('ViewDefinition [CoordinationView_V2.0]'), '2; 1');
Le contenu de la description est très important pour IFC - il répertorie les modules complémentaires ViewDefinition utilisés, le contenu ExchangeRequirement et les options Option
[2] , mais seul l'élément ViewDefinition est requis
implementation_level se compose de deux chiffres, le premier indique l'édition de l'ISO-10303-21 (il y en a trois), le second est le mode de compatibilité (il y en a deux), décrit dans la clause 4.3 de l'ISO-10303-21. Pour IFC, le niveau d'implémentation est toujours important - 2; 1
Une autre option:
FILE_DESCRIPTION (('ViewDefinition [CoordinationView_V2.0, QuantityTakeOffAddOnView]', 'ExchangeRequirement [Structural]'), '2; 1');
ENTITY file_name;
name : STRING (256) ;
time_stamp : time_stamp_text ;
author : LIST [ 1 : ? ] OF STRING (256) ;
organization : LIST [ 1 : ? ] OF STRING (256) ;
preprocessor_version : STRING (256) ;
originating_system : STRING (256) ;
authorization : STRING (256) ;
END_ENTITY;
Toutes les valeurs peuvent être laissées en blanc. Nom de fichier, horodatage, auteur, organisation, version du préprocesseur, programme de création, autorisation.
ENTITY file_schema;
schema_identifiers : LIST [1:?] OF UNIQUE schema_name;
END_ENTITY;
Le nom du schéma qui décrit le contenu de la section de données (voir la colonne Identifiant dans le tableau ci-dessus)
La section des données commence par le mot-clé DATA; et se termine par ENDSEC;. Le contenu de cette section est une séquence d'entités de la syntaxe suivante:
# <index d'entité> = <nom d'entité> (<liste d'attributs>);
Les entités possibles et leurs paramètres sont décrits dans le diagramme IFC.
Fichier IFC vide:
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('','',(''),(''),'','','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
ENDSEC;
END-ISO-10303-21;
Section des données
L'élément racine d'IFC est
IfcProject . Ici, il est nécessaire de dire comment la liste d'attributs est formée, ce qui est nécessaire pour créer l'entité, d'une part, l'entité peut avoir ses propres attributs, et d'autre part, elle peut les hériter de l'ancêtre, l'ordre des attributs est spécifié - de l'ancêtre au descendant. Pour IfcProject, la chaîne d'héritage sera la suivante: IfcRoot => IfcObjectDefinition => IfcObject => IfcProject.
IFCPROJECT(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>, <LongName>,<Phase>, (<RepresentationContexts>),<UnitsInContext>);
Maintenant, pour créer un IfcProject, nous devons définir les valeurs de tous les attributs. Le premier attribut hérité de IfcRoot - GlobalId, a la valeur IfcGloballyUniqueId. Il s'agit d'un type simple - une chaîne de 22 caractères, vous devez y écrire un GUID ou un UUID unique, afin qu'un nombre de 128 bits soit poussé en 22 caractères - un algorithme spécial est publié sur le site Web de buildingSMART
[3] . L'attribut OwnerHistory suivant est défini sur IfcOwnerHistory. Cet élément répond aux questions - qui, comment et quand a créé cet élément IFC, en fait, pour presque tous les objets dans IFC son auteur peut être indiqué par cet élément. Pour remplir cet attribut, vous pouvez créer un élément "sur place", mais il vaut mieux le faire à un autre endroit, et sur place il suffit de s'y référer avec un enregistrement de la forme # <index d'entité>. De plus, le symbole $ signifie une valeur nulle, le symbole * est utilisé si le descendant attribue la valeur à l'attribut de l'ancêtre. Les valeurs de type enum sont écrites entre deux points - .ELEMENT.
Un exemple de création d'IfcProject:
#1=IFCPROJECT('abcdefghijklmnopqrs101', #2, 'sample project', $, $, '','',$,$);
#2=IFCOWNERHISTORY(#3,#6,.READWRITE.,.ADDED.,87763554,#3,#6,87763554);
#3=IFCPERSONANDORGANIZATION(#4,#5,());
#4=IFCPERSON('Public','Jane','Q.',(),(),(),(),());
#5=IFCORGANIZATION($,'Architecture by Jane Q. Public, Inc.',$,(),());
#6=IFCAPPLICATION(#7,'Version 1.0','Building Architecture Toolkit','BAT1.0');
#7=IFCORGANIZATION($,'Creating Instance Software, Inc.',$,(),());
Les éléments suivants <Nom>, <Description>, <ObjectType>, <LongName>, <Phase> - facultatif et texte (IfcLabel, IfcText) - description du projet pour une personne
RepresentationContexts est une liste d'espaces / contextes, l'idée était que nous pouvions avoir plusieurs espaces / contextes, par exemple: un croquis, un projet et une documentation de travail. Et différents objets peuvent avoir des représentations différentes dans des contextes différents. Par exemple, le mur dans l'esquisse n'est qu'une ligne, dans le projet il a déjà une épaisseur et dans la documentation de travail, il se compose de différentes couches. Mais dans IFC2x3, le concept a changé, les contextes de «Sketch», «Outline», «Design», «Detail» ont été soit annulés, soit déplacés vers IfcGeometricRepresentationSubContext. Et la classe IfcRepresentationContext elle-même est devenue abstraite, avec un seul descendant - IfcGeometricRepresentationContext, qui peut être volumétrique ContextType = 'Model', CoordinateSpaceDimension = 3, flat ContextType = 'Plan', CoordinateSpaceDimension = 2 et FIG sait quel ContextType = 'NotDefined'.
IFCGEOMETRICREPRESENTATIONCONTEXT(<>,<>,< >,< - >,< >,< >)
UnitsInContext - un objet IfcUnitAssignment qui forme une liste d'éléments IfcUnit avec une description des unités du projet, il est nécessaire pour une importation appropriée, sinon le logiciel utilisera ses paramètres par défaut - dans Revit, par exemple, il y a des pieds (il stocke tout en pieds).
#2= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
#3= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#4= IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#5= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#6= IFCUNITASSIGNMENT((#2,#3,#4,#5));
À partir de l'élément IfcProject racine, une arborescence d'éléments est formée, les descendants du type IfcSpatialStructureElement (IfcBuilding (bâtiment), IfcBuildingStorey (étage), IfcSpace (espace ou salle), IfcSite (site)). Mais ces éléments ne sont pas connectés directement, mais via un élément spécial IfcRelAggregates, dans une relation un-à-plusieurs.
IFCRELAGGREGATES(<GlobalId>, <OwnerHistory>, <>, <>, < >, (< >));
Ces éléments ne peuvent être connectés que dans l'ordre suivant: IfcSite => IfcBuilding => IfcBuildingStorey => IfcSpace, et des éléments du même type peuvent être connectés, mais leur attribut CompositionType doit avoir une valeur différente et uniquement dans un certain ordre COMPLEX => ELEMENT => PARTIAL
Structure complète du projet possible:
IfcSite.COMPLEX => IfcSite.ELEMENT => IfcSite.PARTIAL => IfcBuilding.COMPLEX => IfcBuilding.ELEMENT => IfcBuilding.PARTIAL => IfcBuildingStorey.COMPLEX => IfcBuildingStoreyCIAL = PARTIRE> = IfcSpace.ELEMENT => IfcSpace.PARTIAL
fichier ifcBien que tous les éléments soient facultatifs, seul l'ordre d'héritage est requis
Il est supposé que vous décrivez un bâtiment, qui se compose d'étages d'étages et dans lequel des espaces existent, vous devez montrer le relief du site existant dans lequel vous entrez dans votre bâtiment
IFCSITE(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<LongName>,<CompositionType>,<RefLatitude>,<RefLongitude>,<RefElevation>,<LandTitleNumber>,<SiteAddress>);
L'attribut Representation hérité de IfcProduct pointe vers un objet IfcProductRepresentation, a deux descendants IfcProductDefinitionShape pour décrire la forme de l'objet et IfcMaterialDefinitionRepresentation pour décrire le matériau (style de visualisation), ils lient différentes représentations via l'attribut Representations.
IfcProductDefinitionShape(<>,<>,(<Representations>))
IfcMaterialDefinitionRepresentation(<>, <>,<Representations>),<RepresentedMaterial>)
IfcMaterialDefinitionRepresentation for Representations accepte uniquement IfcStyledRepresentation - descriptions de style
L'attribut RepresentedMaterial fournit une description textuelle du matériau de l'objet.
IfcProductDefinitionShape for Representations accepte uniquement IfcShapeRepresentation ou IfcTopologyRepresentation (IfcShapeModel)
IfcShapeRepresentation est la classe la plus importante dans IFC car elle est responsable de la représentation géométrique des objets. Types de géométrie disponibles: Curve2D (lignes plates), GeometricSet (points, lignes, surfaces, 2D et 3D), SurfaceModel (surfaces), SolidModel (corps), types supplémentaires (BoundingBox, SectionedSpine, MappedReprésentation)
IFCSHAPEREPRESENTATION(<>,<RepresentationIdentifier>,< >,< >);
L'élément IfcCartesianPoint est au cœur de toute géométrie - juste un point.
#13= IFCCARTESIANPOINT((0.,0.,0.));
#16= IFCCARTESIANPOINT((1.,0.,0.));
#22= IFCPOLYLINE((#13, #16));
#510= IFCBSPLINECURVEWITHKNOTS(3,(#511,#512,#513,#514,#511,#512,#513),.UNSPECIFIED.,.T.,.T.,(1,1,1,1,1,1,1,1,1,1,1),(-7.0,-6.0,-5.0,-4.0,-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0),.UNSPECIFIED.);
#511= IFCCARTESIANPOINT((239.758213537139,192.193559404919,-83.9999999999991));
#512= IFCCARTESIANPOINT((0.0,275.591853484122,-83.9999999999991));
#513= IFCCARTESIANPOINT((-239.75821353295,192.193559404918,-83.9999999999991));
#514= IFCCARTESIANPOINT((0.0,-108.13323051355,-83.9999999999991));
#34= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#35));
#35= IFCEXTRUDEDAREASOLID(#36,#8,#37,0.5);
#36= IFCRECTANGLEPROFILEDEF(.AREA.,$,#38,0.5,0.5);
#37= IFCDIRECTION((0.,0.,1.));
#38= IFCAXIS2PLACEMENT2D(#39,#9);
#7= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.01,#8,#9);
#8= IFCAXIS2PLACEMENT3D(#10,$,$);
#9= IFCDIRECTION((0.,1.));
#39= IFCCARTESIANPOINT((0.,0.));
La géométrie peut simplement consister en une liste de points, ou elle peut avoir une structure complexe avec un tas de paramètres et d'enfants.
Considérez
IfcExtrudedAreaSolid(<SweptArea>,<Position>,<ExtrudedDirection>,<Depth>)

Il s'agit du corps obtenu en extrudant le contour plat d'origine de SweptArea situé dans l'espace Position extrudé dans la direction de ExtrudedDirection jusqu'à la profondeur de ExtrudedDirection. L'attribut SweptArea est de type IfcProfileDef - il s'agit d'une classe abstraite avec un grand nombre de descendants "pour toutes les occasions", dans ce cas
IfcRectangleProfileDef(<ProfileType>,<ProfileName>,<Position>,<XDim>,<YDim>)
ProfileType - valeur d'énumération du type de profil de type IfcProfileTypeEnum (valeurs: CURVE, AREA). Le nom de profil facultatif ProfileName, le positionnement de la position et la taille par les coordonnées XY sont XDim, YDim.

Ou le IfcFacetedBrep plus complexe, il se compose d'un IfcClosedShell fermé, qui à son tour se compose d'une liste de faces IfcFace, qui se composent d'arêtes IfcFaceBound, qui sont décrites par les boucles IfcLoop, qui sont déjà constituées de points IfcCartesianPoint. La représentation des limites (brep) dicte de nombreuses conditions sur sa structure - décrites en détail dans la documentation et la littérature connexe.
#57= IFCSHAPEREPRESENTATION(#7, 'Body', 'Brep', (#58));
#58= IFCFACETEDBREP(#59);
#59= IFCCLOSEDSHELL((#80, #81, #82, #83, #84, #85));
#60 = IFCCARTESIANPOINT((0.,0.,0.));
#61 = IFCCARTESIANPOINT((1.,0.,0.));
#62 = IFCCARTESIANPOINT((1.,1.,0.));
#63 = IFCCARTESIANPOINT((0.,1.,0.));
#64 = IFCCARTESIANPOINT((0.,0.,1.));
#65 = IFCCARTESIANPOINT((1.,0.,1.));
#66 = IFCCARTESIANPOINT((1.,1.,1.));
#67 = IFCCARTESIANPOINT((0.,1.,1.));
#68= IFCPOLYLOOP((#60, #61, #62, #63));
#69= IFCPOLYLOOP((#64, #65, #66, #67));
#70= IFCPOLYLOOP((#60, #61, #65, #64));
#71= IFCPOLYLOOP((#61, #62, #66, #65));
#72= IFCPOLYLOOP((#62, #63, #67, #66));
#73= IFCPOLYLOOP((#63, #60, #64, #67));
#74= IFCFACEOUTERBOUND(#68, .T.);
#75= IFCFACEOUTERBOUND(#69, .T.);
#76= IFCFACEOUTERBOUND(#70, .T.);
#77= IFCFACEOUTERBOUND(#71, .T.);
#78= IFCFACEOUTERBOUND(#72, .T.);
#79= IFCFACEOUTERBOUND(#73, .T.);
#80= IFCFACE((#74));
#81= IFCFACE((#75));
#82= IFCFACE((#76));
#83= IFCFACE((#77));
#84= IFCFACE((#78));
#85= IFCFACE((#79));

IfcAdvancedBrep est apparu dans IFC4, dont les bords peuvent être décrits par des courbes NURBS

Les objets IfcSpatialStructureElement peuvent avoir leur propre géométrie, mais en général, les bâtiments sont constitués d'autres objets: murs, sols, toits, fenêtres, portes, etc. Dans IFC, tous ces objets sont décrits par les objets correspondants: IfcWall, IfcSlab, IfcRoof, IfcWindow, IfcDoor - tous ce sont des descendants de IfcProduct. Tous ces objets peuvent être associés à l'objet IfcSpatialStructureElement correspondant, via l'objet spécial IfcRelContainedInSpatialStructure

IFCRELCONTAINEDINSPATIALSTRUCTURE(<GlobalId>,<OwnerHistory>,<>,<>, (<RelatedElements>),<RelatingStructure>)
Pour les murs d'épaisseur constante, il est habituel d'utiliser IfcWallStandardCase (considéré comme obsolète dans IFC4), pour d'autres cas, nous utilisons IfcWall. Dans le cas de IfcWallStandardCase, vous devez utiliser SweptSolid - extruder le contour du mur à une hauteur donnée
IFCWALLSTANDARDCASE(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>);
#8= IFCAXIS2PLACEMENT3D(#10,$,$);
#10= IFCCARTESIANPOINT((0.,0.,0.));
#13= IFCLOCALPLACEMENT($,#8);
#22= IFCDIRECTION((0.,0.,1.));
#23= IFCAXIS2PLACEMENT2D(#24,#25);
#24= IFCCARTESIANPOINT((0.,0.));
#25= IFCDIRECTION((1.,0.));
#26= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs107',$,'wall1',$,'',#13,#27,'');
#27= IFCPRODUCTDEFINITIONSHAPE($,$,(#28));
#28= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#29));
#29= IFCEXTRUDEDAREASOLID(#30,#32,#22,1000.);
#30= IFCRECTANGLEPROFILEDEF(.AREA.,$,#23,100.,1000.);
#31= IFCCARTESIANPOINT((500.,0.,100.));
#32= IFCAXIS2PLACEMENT3D(#31,$,$);
La porte est décrite par l'objet IfcDoor, elle peut être ajoutée à IfcRelContainedInSpatialStructure, mais cet objet ne fait pas de «coupe» dans le mur pour lui-même

L'objet spécial «IfcOpeningElement» est responsable de la «coupe», qui est associée à l'objet «parent» via IfcRelVoidsElement. Dans IfcOpeningElement, vous pouvez «insérer» une porte à l'aide de l'objet IfcRelFillsElement. Avec IfcOpeningElement, vous pouvez faire non seulement des trous, mais aussi des évidements.


IFCDOOR(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<OverallHeight>,<OverallWidth>)
IFCWINDOW(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<OverallHeight>,<OverallWidth>)
Si l'objet IfcWindow est très similaire à l'utilisation, ifcDoor, OverallHeight, OverallWidth - dimensions nominales, vous ne pouvez pas spécifier - alors ces valeurs seront prises à partir de la géométrie
Si un objet IfcRoof est impliqué par un objet complexe - il doit décrire le toit entier, pour connecter tous les enfants avec lui - vous devez utiliser IfcRelAggregates. Mais en même temps, IfcRoof peut avoir sa propre géométrie de représentation.
IFCSLAB(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<PredefinedType>);
IFCROOF(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<IfcRoofTypeEnum>);
Écriture IFC
Maintenant, armés de ces connaissances, nous allons essayer de décrire une maison simple, pour commencer, nous prendrons un fichier IFC vide - dont j'ai déjà donné la description
fichier IFC videISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('','',(''),(''),'','','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
ENDSEC;
END-ISO-10303-21;
Ensuite, nous devons remplir le contenu de la section DATA. Le premier objet requis doit être IFCPROJECT (bien qu'il puisse être à la fin du fichier, mais il doit juste l'être), nous avons également besoin d'IFCUNITASSIGNMENT, si nous voulons certainement que les programmes lisent le modèle dans les unités de mesure que nous avons en tête. Nous aurons également besoin d'au moins un CONTEXTE IFCGEOMETRICREPRESENTATION - sinon nous ne pourrons pas ajouter une description de la géométrie.
IFCPROJECT, IFCUNITASSIGNMENT, IFCGEOMETRICREPRESENTATIONCONTEXT#1=IFCPROJECT('abcdefghijklmnopqrs101', $, 'Project #1', $, $, '','', (#7), #6);
/* */
#2= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
#3= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#4= IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#5= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#6= IFCUNITASSIGNMENT((#2,#3,#4,#5));
/* */
#7= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.01,#8,#9);
#8= IFCAXIS2PLACEMENT3D(#10,$,$);
#9= IFCDIRECTION((0.,1.));
#10= IFCCARTESIANPOINT((0.,0.,0.));
Structure de la maison
IFCBUILDING => IFCBUILDINGSTOREY => IFCRELCONTAINEDINSPATIALSTRUCTURE/* */
#11= IFCBUILDING('abcdefghijklmnopqrs102', $, $, $, $, #13, $, $, .ELEMENT., $, $, $);
#12= IFCRELAGGREGATES('abcdefghijklmnopqrs103', $, $, $, #1, (#11));
#13= IFCLOCALPLACEMENT($,#8);
/* */
#14= IFCBUILDINGSTOREY('abcdefghijklmnopqrs104',$,'level1',$,'',#13,$,'',.ELEMENT.,0.);
#15= IFCRELAGGREGATES('abcdefghijklmnopqrs103', $, $, $, #11, (#14));
#16= IFCRELCONTAINEDINSPATIALSTRUCTURE('abcdefghijklmnopqrs105',$,$,$,(#17, #26, #33, #39, #46, #57, #94, #101),#14);
Décrivons le genre - IFCSLAB#17= IFCSLAB('abcdefghijklmnopqrs106',$,'slab',$,'',#13,#18,'',.BASESLAB.);
#18= IFCPRODUCTDEFINITIONSHAPE($,$,(#19));
#19= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#20));
#20= IFCEXTRUDEDAREASOLID(#21,#8,#22,100.);
#21= IFCRECTANGLEPROFILEDEF(.AREA.,$,#23,1000.,1000.);
#22= IFCDIRECTION((0.,0.,1.));
#23= IFCAXIS2PLACEMENT2D(#24,#25);
#24= IFCCARTESIANPOINT((0.,0.));
#25= IFCDIRECTION((1.,0.));
Quatre murs#26= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs107',$,'wall1',$,'',#13,#27,'');
#27= IFCPRODUCTDEFINITIONSHAPE($,$,(#28));
#28= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#29));
#29= IFCEXTRUDEDAREASOLID(#30,#32,#22,1000.);
#30= IFCRECTANGLEPROFILEDEF(.AREA.,$,#23,100.,1000.);
#31= IFCCARTESIANPOINT((500.,0.,100.));
#32= IFCAXIS2PLACEMENT3D(#31,$,$);
#33= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs108',$,'wall2',$,'',#13,#34,'');
#34= IFCPRODUCTDEFINITIONSHAPE($,$,(#35));
#35= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#36));
#36= IFCEXTRUDEDAREASOLID(#30,#38,#22,1000.);
#37= IFCCARTESIANPOINT((-500.,0.,100.));
#38= IFCAXIS2PLACEMENT3D(#37,$,$);
#39= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs110',$,'wall3',$,'',#13,#40,'');
#40= IFCPRODUCTDEFINITIONSHAPE($,$,(#41));
#41= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#42));
#42= IFCEXTRUDEDAREASOLID(#43,#45,#22,1000.);
#43= IFCRECTANGLEPROFILEDEF(.AREA.,$,#23,1000.,100.);
#44= IFCCARTESIANPOINT((0.,-500.,100.));
#45= IFCAXIS2PLACEMENT3D(#44,$,$);
#46= IFCWALLSTANDARDCASE('abcdefghijklmnopqrs109',$,'wall4',$,'',#13,#47,'');
#47= IFCPRODUCTDEFINITIONSHAPE($,$,(#48));
#48= IFCSHAPEREPRESENTATION(#7,'Body','SweptSolid',(#49));
#49= IFCEXTRUDEDAREASOLID(#50,#52,#22,1000.);
#50= IFCRECTANGLEPROFILEDEF(.AREA.,$,#23,1000.,100.);
#51= IFCCARTESIANPOINT((0.,500.,100.));
#52= IFCAXIS2PLACEMENT3D(#51,$,$);
La porte#57= IFCDOOR('abcdefghijklmnopqrs111',$,'door',$,'',#88,#86,'',$,$);
#86= IFCPRODUCTDEFINITIONSHAPE($,$,(#87));
#87= IFCSHAPEREPRESENTATION(#7,'Body','Brep',(#58));
#58= IFCFACETEDBREP(#59);
#59= IFCCLOSEDSHELL((#80, #81, #82, #83, #84, #85));
#60 = IFCCARTESIANPOINT((0.,0.,0.));
#61 = IFCCARTESIANPOINT((200.,0.,0.));
#62 = IFCCARTESIANPOINT((200.,200.,0.));
#63 = IFCCARTESIANPOINT((0.,200.,0.));
#64 = IFCCARTESIANPOINT((0.,0.,500.));
#65 = IFCCARTESIANPOINT((200.,0.,500.));
#66 = IFCCARTESIANPOINT((200.,200.,500.));
#67 = IFCCARTESIANPOINT((0.,200.,500.));
#68= IFCPOLYLOOP((#60, #61, #62, #63));
#69= IFCPOLYLOOP((#64, #65, #66, #67));
#70= IFCPOLYLOOP((#60, #61, #65, #64));
#71= IFCPOLYLOOP((#61, #62, #66, #65));
#72= IFCPOLYLOOP((#62, #63, #67, #66));
#73= IFCPOLYLOOP((#63, #60, #64, #67));
#74= IFCFACEOUTERBOUND(#68, .T.);
#75= IFCFACEOUTERBOUND(#69, .T.);
#76= IFCFACEOUTERBOUND(#70, .T.);
#77= IFCFACEOUTERBOUND(#71, .T.);
#78= IFCFACEOUTERBOUND(#72, .T.);
#79= IFCFACEOUTERBOUND(#73, .T.);
#80= IFCFACE((#74));
#81= IFCFACE((#75));
#82= IFCFACE((#76));
#83= IFCFACE((#77));
#84= IFCFACE((#78));
#85= IFCFACE((#79));
#88= IFCLOCALPLACEMENT($,#89);
#89= IFCAXIS2PLACEMENT3D(#90,$,$);
#90= IFCCARTESIANPOINT((-100.,400.,100.));
#91= IFCRELVOIDSELEMENT('abcdefghijklmnopqrs112',$,$,$,#46,#92);
#92= IFCOPENINGELEMENT('abcdefghijklmnopqrs113',$,$,$,'Opening',#88,#86,$);
#93= IFCRELFILLSELEMENT('abcdefghijklmnopqrs114',$,$,$,#92,#57);
Pour décrire la porte, nous utilisons IFCFACETEDBREP et nous l'utilisons pour l'IFCOPENINGELEMENT dans lequel notre porte est insérée. En utilisant différents IFCLOCALPLACEMENTS, nous pouvons insérer la même géométrie à différents endroits et représenter différents objets - par exemple, nous pouvons utiliser le même IFCFACETEDBREP pour la fenêtre.
La fenêtre#94= IFCWINDOW('abcdefghijklmnopqrs115',$,$,$,$,#95,#86,$,$,$);
#95= IFCLOCALPLACEMENT($,#96);
#96= IFCAXIS2PLACEMENT3D(#97,$,$);
#97= IFCCARTESIANPOINT((-100.,-600.,400.));
#98= IFCRELVOIDSELEMENT('abcdefghijklmnopqrs116',$,$,$,#39,#99);
#99= IFCOPENINGELEMENT('abcdefghijklmnopqrs117',$,$,$,'Opening',#95,#86,$);
#100= IFCRELFILLSELEMENT('abcdefghijklmnopqrs118',$,$,$,#99,#94);
Le toit#101= IFCROOF('abcdefghijklmnopqrs119',$,$,$,$,#105,$,$,.FLAT_ROOF.);
#102= IFCSLAB('abcdefghijklmnopqrs120',$,'roof',$,'',#105,#18,'',.ROOF.);
#103= IFCAXIS2PLACEMENT3D(#104,$,$);
#104= IFCCARTESIANPOINT((0.,0.,1100.));
#105= IFCLOCALPLACEMENT(#13,#103);
#106= IFCRELAGGREGATES('abcdefghijklmnopqrs121',$,$,$,#101,(#102));
fichier terminé

Conclusion
Maintenant, mon cher lecteur, vous pouvez écrire la maison de vos rêves. Malheureusement, je n'ai pas considéré IfcMaterialDefinitionRepresentation, qui a été rejeté pour le style d'affichage des objets, je n'ai pas considéré IfcTopologyRepresentation - je ne comprends pas vraiment à quoi il sert et je ne sais pas comment le visualiser. Je n'ai pas considéré les options IFC et les ensembles de propriétés supplémentaires. Mais sinon, ce ne serait pas une brève introduction.
Le format IFC contient un grand nombre d'objets, qui ne deviennent que plus d'une version à l'autre. Dans le texte de spécification, il y a des notes qui ne sont pas reflétées dans le schéma EXPRESS, mais qui affectent fortement le traitement des fichiers. Par conséquent, il est difficile de mettre en œuvre ce format sans avoir lu attentivement toute la documentation, mais cela n'est guère possible pour une personne, donc il n'y a pas de programme - qui le lit absolument correctement, chacun a ses propres particularités. Et si dans le cas des programmes open source il y a toujours la possibilité de corriger les erreurs détectées, pour les programmes propriétaires cela rend impossible l'utilisation complète du format IFC.
Le format IFC n'est absolument pas adapté pour stocker des informations de la section du plan général, mais actuellement il y a un travail actif sur cette section, ce travail devrait être terminé d'ici fin avril 2020 et faire partie de IFC5. De plus, des travaux sont en cours sur IFC Road, IFC Airport et IFC4precast (préfabriqué). IFC Bridge est apparu dans IFC4x2, pour lequel ils ont créé un objet géométrique spécial - IfcSectionedSolidHorizontal

Des changements récents dans IFC le rapprochent très près de GML, même IfcCoordinateReferenceSystem est apparu - une description du système de coordonnées géodésiques. Dans le même temps, IFC se concentre sur la description des structures internes de l'objet et GML décrit sa représentation externe. Mais la principale différence entre IFC est qu'il est possible de se référer aux mêmes objets à différents endroits - le même point peut être utilisé dans la description de la géométrie du mur et de la fenêtre. En GML, chaque objet géométrique est complètement indépendant.
Références:
1. www.ibpsa.org/proceedings/BS1997/BS97_P125.pdf2. standards.buildingsmart.org/documents/Implementation/ImplementationGuide_IFCHeaderData_Version_1.0.2.pdf3. technical.buildingsmart.org/resources/ifcimplementationguidance/ifc-guid