Einführung
Im Zusammenhang mit der Politik der Partei und der Regierung gibt es eine aktive Änderung der Gesetzgebung, um die BIM-Technologie einzuführen - Building Information Modeling. In Fortsetzung der Parteilinie werden wir das offene Präsentationsformat BIM - IFC (Industry Foundation Classes) betrachten.

Die Geschichte der IFC beginnt 1995 (tatsächlich im Sommer 1993
[1] ), als die Autodesk Corporation und eine Gruppe von "Genossen" eine Kartellvereinbarung zur Entwicklung eines Austauschformats für verschiedene CAD-Systeme für die Gebäudeplanung organisierten. Ein Jahr später kamen die Genossen zu dem Schluss, dass dieses Format offen sein und von einer Organisation mit offener Mitgliedschaft entwickelt werden sollte, wie die Internationale Allianz für Interoperabilität 1996 erschien. Später, im Jahr 2008, wurde die Organisation in buildingSMART umbenannt - für mehr Glamour.
IFC-Entwickler hatten keine reiche Vorstellungskraft und hatten keine Gelegenheit, sie anzuwenden - ihnen wurden sehr bescheidene Fristen gesetzt, und die Aufgabe sah sehr global aus. Daher wurde das STEP-Format (Standard für den Austausch von Produktmodelldaten) bzw. das Anwendungsprotokoll 225: Building Elements zugrunde gelegt. Ich muss sagen, dass rund um STEP eine reichhaltige Infrastruktur in Form einer Reihe von Spezifikationen im Status von ISO-Standards geschaffen wurde. Diese Infrastruktur basiert auf der EXPRESS-Datenmodellierungssprache und ihrer grafischen Inkarnation EXPRESS-G. Diese Sprache wurde entwickelt, um Code in verschiedenen Programmiersprachen automatisch zu generieren.
Die Entwicklung von IFC begann im September 1995, IFC 1.0 wurde im Juni 1996 veröffentlicht, die endgültige Version war im Januar 1997. Tatsächlich bestand das Ziel der ersten Version von IFC darin, die Möglichkeit der Verwirklichung des Ziels zu demonstrieren. Verschiedene Unternehmen präsentierten ihre Export- / Importdemonstrationen in diesem Format.
Im November 1997 wurde die nächste Version veröffentlicht - 1.5, aber ein Versuch, sie schnell zu implementieren, ergab viele Fehler, die die Entwicklung einer festen Version 1.5.1 erforderten, die parallel zur Entwicklung der Version 2.0 eingeführt wurde - die im März 1999 eingeführt wurde.
Alle diese Versionen sind jetzt veraltet.
Version 2.1 wurde im November 2000 veröffentlicht. Dies ist die älteste Version, für die Dokumentation verfügbar ist. Es wurde später als ISO / PAS 16739: 2005 veröffentlicht.
Jetzt ist die häufigste Version (die die meisten Programme verstehen) IFC 2.3.
Software
Zum Lesen von IFC ist ein Texteditor mit Syntaxhervorhebung hilfreich. Beispielsweise habe ich mit meinen ungeschickten IFC-Syntaxeinstellungen n ++ und vs-Code verwendet.
Ein weiteres notwendiges Werkzeug wird ein Programm sein, das Grafiken in IFC visualisieren kann. Jetzt gibt es viele Zuschauer dafür und sogar kostenlose, persönlich bevorzuge ich
XbimXplorer aus dem
xBIM- Projekt. Ich habe auch Revit verwendet, aber ich muss sagen, dass reines Revit nicht sehr freundlich zu IFC ist - es kann nicht einmal die von ihm erstellte Datei lesen (ja, Autodesks Revit weiß nicht, wie man mit dem von Autodesk erfundenen Format arbeitet - dies ist die Visitenkarte von Autodesk Aber sie haben sich Revit nicht ausgedacht, sondern es gekauft - wie üblich), aber er hat kein schlechtes Plugin dafür -
IFC für Revit (beim Schreiben des Artikels hat er mehrere Fehler gefunden, es muss behoben werden, wenn Zeit ist ...)
Ich muss sagen, dass das IFC-Format so verwirrend ist, dass kein Programm es richtig handhabt - jedes macht es auf seine eigene Weise. Daher ignoriert XbimXplorer 2D-Grafiken und einige Syntaxfehler.
Beschreibung
Das IFC-Format gibt es in drei Formen: IFC-SPF (.ifc), IFC-XML (.ifcXML), IFC-ZIP (.ifcZIP)
IFC-SPF ist ein in ISO 10303-21 definiertes Textformat - tatsächlich handelt es sich um eine STEP-Datei
IFC-XML ist ein XML-Format, das in ISO 10303-28 ("STEP-XML") definiert ist.
IFC-ZIP - Ein Zip-Archiv, das .ifc oder .ifcXML enthalten kann
Die Struktur der IFC-SPF-Datei ist in
ISO 10303-21 (es gibt GOST ISO 10303-21-2002) in Wirth-Notation beschrieben. Dies ist eine Textdatei, die nur Zeichen mit Codes im Bereich von 32 bis 126 verwendet (die dritte Ausgabe erlaubt die Verwendung von Zeichen mit den Codes 127 bis 255, wird jedoch aus Kompatibilitätsgründen nicht empfohlen).
Mehrzeilige Kommentare sind mit Zeichenpaaren / * * / gekennzeichnet
Es gibt verschiedene Möglichkeiten, Zeichen in einer anderen Codierung zu schreiben
ISO 8859 aufzeichnen :
Direktive \ S \ - Der Zeichencode nach der Direktive gibt den Zeichencode in Tabelle ISO 8859-1 an
Direktive \ P * \ - hier muss anstelle von * ein lateinischer Großbuchstabe stehen, der die Nummer der ISO 8859-Tabelle angibt, die für die \ S \ -Richtlinie verwendet wird. A bedeutet ISO 8859-1, B bedeutet ISO 8859-2 usw.
ISO 10646 aufzeichnen :
Direktive \ X \ - Auf die Direktive folgt eine zweistellige Hexadezimalzahl, die ein Zeichen im Bereich von U + 0000 bis U + 00FF angibt
Direktiven \ X2 \ * \ X0 \ und \ X4 \ * \ X0 \ - hier gibt es anstelle von * eine Folge von zweistelligen (X2) oder vierstelligen (X4) Hexadezimalzahlen, die die entsprechenden Zeichen bezeichnen
Hallo Welt! => \ X2 \ 041F04400438043204350442 \ X0 \, \ X2 \ 041C04380440 \ X0 \!
Maximale Länge der Rohzeichenfolge - 32769 Byte
Dateistruktur - Die Datei beginnt mit der Zeile ISO-10303-21. und endet mit der Zeile END-ISO-10303-21; Möglicherweise gibt es noch einen SIGNATURE_SECTION-Signaturabschnitt, aber ich werde diese Option nicht berücksichtigen.
Zwischen diesen Zeilen sollte sich ein HEADER_SECTION-Header-Abschnitt befinden, danach können sich ANCHOR_SECTION- und / oder REFERENCE_SECTION-Abschnitte sowie ein oder mehrere DATA_SECTION-Abschnitte befinden (in IFC gibt es nur einen).
HEADER_SECTION - Die Struktur des IFC-Header-Abschnitts erlaubt nur drei Elemente in diesem Abschnitt: FILE_DESCRIPTION, FILE_NAME, FILE_SCHEMA
ENTITY file_description;
description : LIST [1:?] OF STRING (256) ;
implementation_level : STRING (256) ;
END_ENTITY;
Mindestoption:
FILE_DESCRIPTION (('ViewDefinition [CoordinationView_V2.0]'), '2; 1');
Der Beschreibungsinhalt ist für IFC sehr wichtig. Er listet die verwendeten ViewDefinition-Add-Ons, den ExchangeRequirement-Inhalt und die Option
[2] auf , es ist jedoch nur das ViewDefinition-Element erforderlich
Implementation_level besteht aus zwei Ziffern, die erste gibt die Ausgabe von ISO-10303-21 an (es gibt drei davon), die zweite ist der Kompatibilitätsmodus (es gibt zwei davon), der in Abschnitt 4.3 von ISO-10303-21 beschrieben ist. Für IFC ist Implementation_level immer wichtig - 2; 1
Eine weitere 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;
Alle Werte können leer gelassen werden. Dateiname, Zeitstempel, Autor, Organisation, Präprozessorversion, Authoring-Programm, Autorisierung.
ENTITY file_schema;
schema_identifiers : LIST [1:?] OF UNIQUE schema_name;
END_ENTITY;
Der Name des Schemas, das den Inhalt des Datenabschnitts beschreibt (siehe Spalte Bezeichner in der obigen Tabelle).
Der Datenabschnitt beginnt mit dem Schlüsselwort DATA. und endet mit ENDSEC; Der Inhalt dieses Abschnitts besteht aus einer Folge von Entitäten mit der folgenden Syntax:
# <Entitätsindex> = <Entitätsname> (<Liste der Attribute>);
Mögliche Entitäten und ihre Parameter sind im IFC-Diagramm beschrieben.
Leere IFC-Datei:
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('','',(''),(''),'','','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
ENDSEC;
END-ISO-10303-21;
Datenabschnitt
Das
Stammelement von IFC ist
IfcProject . Hier muss angegeben werden, wie die Liste der Attribute gebildet wird, die zum Erstellen der Entität erforderlich ist. Erstens kann die Entität ihre eigenen Attribute haben, und zweitens kann sie diese vom Vorfahren erben, wobei die Reihenfolge der Attribute angegeben wird - vom Vorfahren bis zum Nachkommen. Für IfcProject lautet die Vererbungskette wie folgt: IfcRoot => IfcObjectDefinition => IfcObject => IfcProject.
IFCPROJECT(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>, <LongName>,<Phase>, (<RepresentationContexts>),<UnitsInContext>);
Um ein IfcProject zu erstellen, müssen wir die Werte für alle Attribute festlegen. Das erste von IfcRoot - GlobalId geerbte Attribut hat den Wert IfcGloballyUniqueId. Dies ist ein einfacher Typ - eine Zeichenfolge mit einer Länge von 22 Zeichen, in die Sie eine eindeutige GUID oder UUID schreiben müssen, damit eine 128-Bit-Zahl in 22 Zeichen verschoben wird. Auf der buildingSMART-Website wird ein spezieller Algorithmus veröffentlicht
[3] . Das folgende OwnerHistory-Attribut ist auf IfcOwnerHistory festgelegt. Dieses Element beantwortet die Fragen - wer, wie und wann dieses IFC-Element tatsächlich für fast jedes Objekt in IFC erstellt wurde, dessen Autor durch dieses Element angegeben werden kann. Um dieses Attribut zu füllen, können Sie ein Element "an Ort und Stelle" erstellen. Es ist jedoch besser, es an einer anderen Stelle auszuführen und an Ort und Stelle einfach mit einem Datensatz der Form # <Entitätsindex> darauf zu verweisen. Das $ -Symbol bedeutet auch einen Nullwert. Das * -Symbol wird verwendet, wenn der Nachkomme den Wert dem Attribut des Vorfahren zuweist. Werte vom Typ enum werden zwischen zwei Punkten geschrieben - .ELEMENT.
Ein Beispiel für die Erstellung von 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.',$,(),());
Die folgenden Elemente <Name>, <Beschreibung>, <Objekttyp>, <LangerName>, <Phase> - optional und Text (IfcLabel, IfcText) - Beschreibung des Projekts für eine Person
RepresentationContexts ist eine Liste von Räumen / Kontexten. Die Idee war, dass wir mehrere Räume / Kontexte haben könnten, zum Beispiel: eine Skizze, ein Projekt und eine Arbeitsdokumentation. Und verschiedene Objekte können in verschiedenen Kontexten unterschiedliche Darstellungen haben. Zum Beispiel ist die Wand in der Skizze nur eine Linie, im Projekt hat sie bereits eine Dicke und in der Arbeitsdokumentation besteht sie aus verschiedenen Ebenen. In IFC2x3 hat sich das Konzept jedoch geändert. Die Kontexte von 'Sketch', 'Outline', 'Design', 'Detail' wurden entweder abgebrochen oder in IfcGeometricRepresentationSubContext verschoben. Und die Klasse IfcRepresentationContext selbst wurde abstrakt, mit einem einzigen Nachkommen - IfcGeometricRepresentationContext, der volumetrisch sein kann. ContextType = 'Model', CoordinateSpaceDimension = 3, flat ContextType = 'Plan', CoordinateSpaceDimension = 2 und figs weiß, was ContextType = 'NotDefined'.
IFCGEOMETRICREPRESENTATIONCONTEXT(<>,<>,< >,< - >,< >,< >)
UnitsInContext - ein IfcUnitAssignment-Objekt, das eine Liste von IfcUnit-Elementen mit einer Beschreibung der Einheiten des Projekts bildet. Es ist für den ordnungsgemäßen Import erforderlich. Andernfalls verwendet die Software ihre Standardeinstellungen. In Revit gibt es beispielsweise Füße (es speichert alles in Fuß).
#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));
Aus dem Root-IfcProject-Element wird ein Baum von Elementen gebildet, die Nachkommen des IfcSpatialStructureElement-Typs (IfcBuilding (Gebäude), IfcBuildingStorey (Etage), IfcSpace (Raum oder Raum), IfcSite (Site)). Diese Elemente sind jedoch nicht direkt miteinander verbunden, sondern über ein spezielles IfcRelAggregates-Element in einer Eins-zu-Viele-Beziehung.
IFCRELAGGREGATES(<GlobalId>, <OwnerHistory>, <>, <>, < >, (< >));
Diese Elemente können nur in der folgenden Reihenfolge verbunden werden: IfcSite => IfcBuilding => IfcBuildingStorey => IfcSpace, und Elemente desselben Typs können verbunden werden, aber dann muss ihr CompositionType-Attribut einen anderen Wert haben und nur in einer bestimmten Reihenfolge COMPLEX => ELEMENT => PARTIAL
Vollständige mögliche Projektstruktur:
IfcSite.COMPLEX => IfcSite.ELEMENT => IfcSite.PARTIAL => IfcBuilding.COMPLEX => IfcBuilding.ELEMENT => IfcBuilding.PARTIAL => IfcBuildingStorey.COMPLEX => IfcBuildingStoreyCIAL = PARTIRE = IfcSpace.ELEMENT => IfcSpace.PARTIAL
ifc-DateiObwohl alle Elemente optional sind, ist nur die Vererbungsreihenfolge erforderlich
Es wird davon ausgegangen, dass Sie ein Gebäude beschreiben, das aus Stockwerken besteht und in dem Räume vorhanden sind. Sie müssen das vorhandene Standortrelief anzeigen, in das Sie Ihr Gebäude betreten
IFCSITE(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<LongName>,<CompositionType>,<RefLatitude>,<RefLongitude>,<RefElevation>,<LandTitleNumber>,<SiteAddress>);
Das von IfcProduct geerbte Representation-Attribut verweist auf ein IfcProductRepresentation-Objekt. Es enthält zwei IfcProductDefinitionShape-Nachkommen, um die Form des Objekts zu beschreiben, und IfcMaterialDefinitionRepresentation, um das Material zu beschreiben (Visualisierungsstil). Sie verknüpfen verschiedene Darstellungen über das Representations-Attribut.
IfcProductDefinitionShape(<>,<>,(<Representations>))
IfcMaterialDefinitionRepresentation(<>, <>,<Representations>),<RepresentedMaterial>)
IfcMaterialDefinitionRepresentation for Representations akzeptiert nur IfcStyledRepresentation - Stilbeschreibungen
Das RepresentedMaterial-Attribut bietet eine Textbeschreibung des Materials des Objekts.
IfcProductDefinitionShape for Representations akzeptiert nur IfcShapeRepresentation oder IfcTopologyRepresentation (IfcShapeModel)
IfcShapeRepresentation ist die wichtigste Klasse in IFC, da sie für die geometrische Darstellung von Objekten verantwortlich ist. Verfügbare Geometrietypen: Curve2D (flache Linien), GeometricSet (Punkte, Linien, Flächen, 2d und 3d), SurfaceModel (Flächen), SolidModel (Körper), zusätzliche Typen (BoundingBox, SectionedSpine, MappedRepresentation)
IFCSHAPEREPRESENTATION(<>,<RepresentationIdentifier>,< >,< >);
Das Herzstück jeder Geometrie ist das IfcCartesianPoint-Element - nur ein Punkt.
#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.));
Die Geometrie kann einfach aus einer Liste von Punkten bestehen oder eine komplexe Struktur mit einer Reihe von Parametern und untergeordneten Elementen aufweisen.
Betrachten Sie
IfcExtrudedAreaSolid(<SweptArea>,<Position>,<ExtrudedDirection>,<Depth>)

Dies ist der Körper, der durch Extrudieren der ursprünglichen planaren SweptArea-Kontur erhalten wird, die sich im Positionsraum befindet, der in Richtung der extrudierten Richtung bis zur Tiefe der extrudierten Richtung extrudiert wurde. Das SweptArea-Attribut ist vom Typ IfcProfileDef - dies ist eine abstrakte Klasse mit einer großen Anzahl von Nachkommen "für alle Gelegenheiten". In diesem Fall wird
IfcRectangleProfileDef(<ProfileType>,<ProfileName>,<Position>,<XDim>,<YDim>)
ProfileType - Profiltyp-Aufzählungswert vom Typ IfcProfileTypeEnum (Werte: CURVE, AREA). Der optionale Profilname Profilname, Positionspositionierung und Größe nach XY-Koordinaten sind XDim, YDim.

Oder das komplexere IfcFacetedBrep besteht aus einer geschlossenen IfcClosedShell, die wiederum aus einer Liste von IfcFace-Flächen besteht, die aus IfcFaceBound-Kanten bestehen, die durch IfcLoop-Schleifen beschrieben werden, die bereits aus IfcCartesianPoint-Punkten bestehen. Die Grenzdarstellung (brep) bestimmt viele Bedingungen für ihre Struktur - ausführlich beschrieben in der Dokumentation und der dazugehörigen Literatur.
#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 wurde in IFC4 angezeigt, dessen Kanten durch NURBS-Kurven beschrieben werden können

IfcSpatialStructureElement-Objekte können ihre eigene Geometrie haben, aber im Allgemeinen bestehen Gebäude aus anderen Objekten: Wänden, Böden, Dächern, Fenstern, Türen usw. In IFC werden alle diese Objekte durch die entsprechenden Objekte beschrieben: IfcWall, IfcSlab, IfcRoof, IfcWindow, IfcDoor - all Sie sind Nachkommen von IfcProduct. Alle diese Objekte können über das spezielle IfcRelContainedInSpatialStructure-Objekt dem entsprechenden IfcSpatialStructureElement-Objekt zugeordnet werden

IFCRELCONTAINEDINSPATIALSTRUCTURE(<GlobalId>,<OwnerHistory>,<>,<>, (<RelatedElements>),<RelatingStructure>)
Für Wände mit konstanter Dicke ist es üblich, IfcWallStandardCase (in IFC4 als veraltet angesehen) zu verwenden, in anderen Fällen verwenden wir IfcWall. Im Fall von IfcWallStandardCase müssen Sie SweptSolid verwenden - die Wandkontur auf eine bestimmte Höhe extrudieren
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,$,$);
Die Tür wird vom IfcDoor-Objekt beschrieben. Sie kann zu IfcRelContainedInSpatialStructure hinzugefügt werden, aber dieses Objekt macht keinen „Schnitt“ in die Wand für sich

Für den "Schnitt" steht das spezielle Objekt IfcOpeningElement, das über IfcRelVoidsElement dem "übergeordneten" Objekt zugeordnet ist. In IfcOpeningElement können Sie eine Tür mit dem IfcRelFillsElement-Objekt „einfügen“. Mit IfcOpeningElement können Sie nicht nur Durchgangslöcher, sondern auch Aussparungen herstellen.


IFCDOOR(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<OverallHeight>,<OverallWidth>)
IFCWINDOW(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<OverallHeight>,<OverallWidth>)
Wenn das Objekt cWindow sehr ähnlich verwendet wird, ifcDoor, OverallHeight, OverallWidth - Nennabmessungen, die Sie nicht angeben können - werden diese Werte aus der Geometrie übernommen
IfcRoof-Objekt wird von einem komplexen Objekt impliziert - es muss das gesamte Dach beschreiben, um alle untergeordneten Objekte damit zu verbinden - Sie müssen IfcRelAggregates verwenden. Gleichzeitig kann IfcRoof eine eigene Darstellungsgeometrie haben.
IFCSLAB(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<PredefinedType>);
IFCROOF(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<IfcRoofTypeEnum>);
IFC schreiben
Mit diesem Wissen werden wir nun versuchen, ein einfaches Haus zu beschreiben. Zunächst nehmen wir eine leere IFC-Datei, deren Beschreibung ich bereits gegeben habe
leere IFC-DateiISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('','',(''),(''),'','','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
ENDSEC;
END-ISO-10303-21;
Als nächstes müssen wir den Inhalt des DATA-Abschnitts füllen. Das erste erforderliche Objekt muss IFCPROJECT sein (obwohl es sich am Ende der Datei befinden kann, aber es muss nur sein). Wir benötigen auch IFCUNITASSIGNMENT, wenn die Programme das Modell in den von uns beabsichtigten Maßeinheiten lesen sollen. Wir benötigen außerdem mindestens einen IFCGEOMETRICREPRESENTATIONCONTEXT - andernfalls können wir keine Beschreibung der Geometrie hinzufügen.
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.));
Hausstruktur
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);
Beschreiben wir das Geschlecht - 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.));
Vier Wände#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,$,$);
Die Tür#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);
Um die Tür zu beschreiben, verwenden wir IFCFACETEDBREP und verwenden es für das IFCOPENINGELEMENT, in das unsere Tür eingesetzt wird. Mit verschiedenen IFCLOCALPLACEMENTs können wir dieselbe Geometrie an verschiedenen Stellen einfügen und verschiedene Objekte darstellen. Beispielsweise können wir dasselbe IFCFACETEDBREP für das Fenster verwenden.
Das Fenster#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);
Das Dach#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));
fertige Datei

Fazit
Nun, mein lieber Leser, können Sie Ihr Traumhaus schreiben. Leider habe ich IfcMaterialDefinitionRepresentation, das für die Art der Anzeige von Objekten abgelehnt wurde, nicht berücksichtigt. IfcTopologyRepresentation wurde nicht berücksichtigt. Ich verstehe nicht wirklich, wofür es gedacht ist, und weiß nicht, wie ich es visualisieren soll. Ich habe die IFC-Optionen und zusätzlichen Eigenschaften nicht berücksichtigt. Andernfalls wäre dies keine kurze Einführung.
Das IFC-Format enthält eine große Anzahl von Objekten, die von Version zu Version immer mehr werden. Im Spezifikationstext gibt es Hinweise, die nicht im EXPRESS-Schema enthalten sind, aber die Dateiverarbeitung stark beeinflussen. Daher ist es schwierig, dieses Format zu implementieren, ohne die gesamte Dokumentation sorgfältig gelesen zu haben, aber dies ist für eine Person kaum möglich, daher gibt es kein Programm - das es absolut korrekt liest, jedes hat seine eigenen Besonderheiten. Und wenn bei Open-Source-Programmen immer die Möglichkeit besteht, die erkannten Fehler zu korrigieren, ist es für proprietäre Programme unmöglich, das IFC-Format vollständig zu nutzen.
Das IFC-Format ist absolut nicht zum Speichern von Informationen des allgemeinen Planabschnitts geeignet. Derzeit wird jedoch aktiv an diesem Abschnitt gearbeitet. Diese Arbeiten sollten bis Ende April 2020 abgeschlossen sein und Teil der IFC5 sein. Derzeit werden auch Arbeiten an der IFC Road, dem IFC Airport und IFC4precast (Fertigteil) durchgeführt. IFC Bridge erschien in IFC4x2, für das ein spezielles geometrisches Objekt entwickelt wurde - IfcSectionedSolidHorizontal

Jüngste Änderungen in IFC bringen es sehr nahe an GML, sogar IfcCoordinateReferenceSystem ist erschienen - eine Beschreibung des geodätischen Koordinatensystems. Gleichzeitig konzentriert sich IFC auf die Beschreibung der internen Strukturen des Objekts und GML beschreibt dessen externe Darstellung. Der Hauptunterschied zwischen IFC besteht jedoch darin, dass an verschiedenen Stellen auf dieselben Objekte verwiesen werden kann - derselbe Punkt kann für die Beschreibung der Geometrie von Wand und Fenster verwendet werden. In GML ist jedes geometrische Objekt völlig unabhängig.
Referenzen:
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