1. Introdução
Em conexão com a política do Partido e do Governo , há uma mudança ativa na legislação para introduzir a tecnologia BIM - Modelagem de Informações da Construção. Na continuação da linha Party, consideraremos o formato de apresentação aberta BIM - IFC (Industry Foundation Classes).

A história da IFC começa em 1995 (de fato, no verão de 1993
[1] ), quando a Autodesk Corporation e um grupo de "camaradas" organizaram um acordo de cartel para desenvolver um formato de intercâmbio para vários sistemas CAD para projetos de construção. Um ano depois, os camaradas chegaram a entender que esse formato deveria ser aberto e desenvolvido por uma organização com membros abertos, como a Aliança Internacional para Interoperabilidade apareceu em 1996. Mais tarde, em 2008, a organização foi renomeada para buildingSMART - para maior glamour.
Os desenvolvedores da IFC não tinham uma imaginação rica e não tiveram a oportunidade de aplicá-la - eles tinham prazos muito modestos e a tarefa parecia muito global. Portanto, eles adotaram o formato STEP (Padrão para o intercâmbio de dados do modelo do produto), ou melhor, o Protocolo de Aplicação 225: Elementos de Construção como base. Devo dizer que no STEP uma infraestrutura rica foi criada na forma de várias especificações no status dos padrões ISO. Essa infraestrutura é baseada na linguagem de modelagem de dados EXPRESS e em sua encarnação gráfica EXPRESS-G; essa linguagem foi desenvolvida para a conveniência da geração automática de código em várias linguagens de programação.
O desenvolvimento da IFC começou em setembro de 1995, a IFC 1.0 foi publicada em junho de 1996, a versão final foi em janeiro de 1997. De fato, o objetivo da primeira versão da IFC era demonstrar a possibilidade de atingir a meta, várias empresas apresentaram suas demonstrações de exportação / importação nesse formato.
Em novembro de 1997, a próxima versão foi lançada - 1.5, mas uma tentativa de implementá-la rapidamente revelou muitos erros que exigiam o desenvolvimento de uma versão fixa 1.5.1, que foi introduzida paralelamente ao desenvolvimento da versão 2.0 - lançada em março de 1999.
Todas essas versões agora estão obsoletas.
A versão 2.1 foi lançada em novembro de 2000. Esta é a versão mais antiga para a qual a documentação está disponível. Mais tarde, foi publicado como ISO / PAS 16739: 2005.
Agora a versão mais comum (que a maioria dos programas entende) é IFC 2.3.
De software
Para ler o IFC, é útil um editor de texto com destaque de sintaxe, por exemplo, usei o código n ++ e vs com minhas desajeitadas configurações de sintaxe do IFC.
Mas outra ferramenta necessária será um programa capaz de visualizar gráficos na IFC. Agora, existem muitos espectadores para isso, e mesmo os gratuitos. Pessoalmente, prefiro o
XbimXplorer do projeto
xBIM . Também usei o Revit, mas devo dizer que o Revit puro não é muito amigável com a IFC - ele nem consegue ler o arquivo que criou (sim, o Revit da Autodesk não sabe como trabalhar com o formato inventado pela Autodesk - este é o cartão de visita da Autodesk Mas eles simplesmente não criaram o Revit, mas o compraram - como de costume), mas ele não possui um plug-in ruim para isso -
IFC for Revit (ao escrever o artigo, ele encontrou vários erros, ele precisará ser corrigido quando houver tempo ...)
Devo dizer que o formato IFC é tão confuso que nenhum programa lida com ele corretamente - cada um faz à sua maneira. Portanto, o XbimXplorer ignora gráficos 2D e alguns erros de sintaxe.
Descrição do produto
O formato IFC existe em três formas: IFC-SPF (.ifc), IFC-XML (.ifcXML), IFC-ZIP (.ifcZIP)
IFC-SPF é um formato de texto definido na ISO 10303-21 - na verdade, é um arquivo STEP
IFC-XML é um formato XML definido na ISO 10303-28 ("STEP-XML")
IFC-ZIP - Um arquivo zip que pode conter .ifc ou .ifcXML
A estrutura do arquivo IFC-SPF é descrita na
ISO 10303-21 (existe GOST ISO 10303-21-2002) na notação Wirth. Este é um arquivo de texto que usa apenas caracteres com códigos no intervalo 32-126 (a terceira edição permite o uso de caracteres com códigos 127-255, mas não é recomendado - para compatibilidade)
Comentários de várias linhas são marcados com pares de caracteres / * * /
Existem várias maneiras de escrever caracteres em uma codificação diferente
Registro ISO 8859 :
Diretiva \ S \ - o código de caractere após a diretiva indica o código de caractere na tabela ISO 8859-1
Diretiva \ P * \ - aqui, em vez de *, deve haver uma letra latina maiúscula, indica o número da tabela ISO 8859 usada para a diretiva \ S \, A significa ISO 8859-1, B significa ISO 8859-2, etc.
Registro ISO 10646 :
Diretiva \ X \ - a diretiva é seguida por um número hexadecimal de dois dígitos, indicando um caractere no intervalo de U + 0000 a U + 00FF
Diretivas \ X2 \ * \ X0 \ e \ X4 \ * \ X0 \ - aqui, em vez de *, há uma sequência de números hexadecimais de dois dígitos (X2) ou quatro dígitos (X4) que indicam os caracteres correspondentes
Olá Mundo! => \ X2 \ 041F04400438043204350442 \ X0 \, \ X2 \ 041C04380440 \ X0 \!
Comprimento máximo da sequência bruta - 32769 bytes
Estrutura do arquivo - o arquivo começa com a linha ISO-10303-21; e termina com a linha END-ISO-10303-21; embora ainda possa haver uma seção de assinatura SIGNATURE_SECTION, mas não considerarei essa opção.
Entre essas linhas, deve haver uma seção de cabeçalho HEADER_SECTION, depois que pode haver seções ANCHOR_SECTION e / ou REFERENCE_SECTION, além de uma ou mais DATA_SECTION (na IFC, existe apenas uma)
HEADER_SECTION - A estrutura da seção do cabeçalho IFC permite apenas três elementos nesta seção: FILE_DESCRIPTION, FILE_NAME, FILE_SCHEMA
ENTITY file_description;
description : LIST [1:?] OF STRING (256) ;
implementation_level : STRING (256) ;
END_ENTITY;
Opção mínima:
FILE_DESCRIPTION (('ViewDefinition [CoordinationView_V2.0]'), '2; 1');
O conteúdo da descrição é muito importante para a IFC - lista os complementos ViewDefinition usados, o conteúdo ExchangeRequirement e as opções Option
[2] , mas somente o elemento ViewDefinition é necessário
deployment_level consiste em dois dígitos, o primeiro indica a edição da ISO-10303-21 (há três), o segundo é o modo de compatibilidade (há dois), descrito na cláusula 4.3 da ISO-10303-21. Para a IFC, Implementation_level sempre importa - 2; 1
Outra opção:
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;
Todos os valores podem ser deixados em branco. Nome do arquivo, registro de data e hora, autor, organização, versão do pré-processador, programa de autoria, autorização.
ENTITY file_schema;
schema_identifiers : LIST [1:?] OF UNIQUE schema_name;
END_ENTITY;
O nome do esquema que descreve o conteúdo da seção de dados (consulte a coluna Identificador na tabela acima)
A seção de dados começa com a palavra-chave DATA; e termina com ENDSEC; O conteúdo desta seção é uma sequência de entidades da seguinte sintaxe:
# <índice da entidade> = <nome da entidade> (<lista de atributos>);
As possíveis entidades e seus parâmetros estão descritos no gráfico da IFC.
Arquivo IFC vazio:
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('','',(''),(''),'','','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
ENDSEC;
END-ISO-10303-21;
Seção de dados
O elemento raiz do IFC é o
IfcProject . Aqui é necessário dizer como a lista de atributos é formada, o que é necessário para criar a entidade; em primeiro lugar, a entidade pode ter seus próprios atributos; em segundo lugar, pode herdá-los do ancestral, a ordem dos atributos é especificada - do ancestral ao descendente. Para o IfcProject, a cadeia de herança será a seguinte: IfcRoot => IfcObjectDefinition => IfcObject => IfcProject.
IFCPROJECT(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>, <LongName>,<Phase>, (<RepresentationContexts>),<UnitsInContext>);
Agora, para criar um IfcProject, precisamos definir os valores para todos os atributos. O primeiro atributo herdado de IfcRoot - GlobalId, tem o valor IfcGloballyUniqueId. Este é um tipo simples - uma string com um comprimento de 22 caracteres, você precisa escrever um GUID ou UUID exclusivo, para que um número de 128 bits seja inserido em 22 caracteres - existe um algoritmo especial publicado no site buildingSMART
[3] . O seguinte atributo OwnerHistory está definido como IfcOwnerHistory. Esse elemento responde às perguntas - quem, como e quando criou esse elemento da IFC, de fato, para quase todos os objetos na IFC que seu autor pode ser indicado por esse elemento. Para preencher esse atributo, você pode criar um elemento "no local", mas é melhor fazê-lo em outro local e, no local, basta fazer referência a ele com um registro do formulário # <índice da entidade>. O símbolo $ também significa um valor nulo, o símbolo * será usado se o descendente atribuir o valor ao atributo do ancestral. Os valores do tipo enum são escritos entre dois pontos - .ELEMENT.
Um exemplo de criação de 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.',$,(),());
Os seguintes elementos <Name>, <Description>, <ObjectType>, <LongName>, <Phase> - opcional e texto (IfcLabel, IfcText) - descrição do projeto para uma pessoa
RepresentationContexts é uma lista de espaços / contextos, a ideia era que poderíamos ter vários espaços / contextos, por exemplo: um esboço, um projeto e documentação de trabalho. E objetos diferentes podem ter representações diferentes em contextos diferentes. Por exemplo, a parede no esboço é apenas uma linha, no projeto ela já tem uma espessura e na documentação de trabalho consiste em diferentes camadas. Mas no IFC2x3, o conceito mudou, os contextos de 'Esboço', 'Estrutura de tópicos', 'Design', 'Detalhe' foram cancelados ou foram movidos para IfcGeometricRepresentationSubContext. E a própria classe IfcRepresentationContext tornou-se abstrata, com um único descendente - IfcGeometricRepresentationContext, que pode ser volumétrico ContextType = 'Modelo', CoordinateSpaceDimension = 3, flat ContextType = 'Plan', CoordinateSpaceDimension = 2 e a FIG sabe o que ContextType = 'NotDefined'.
IFCGEOMETRICREPRESENTATIONCONTEXT(<>,<>,< >,< - >,< >,< >)
UnitsInContext - um objeto IfcUnitAssignment que forma uma lista de elementos IfcUnit com uma descrição das unidades do projeto, é necessário para a importação adequada; caso contrário, o software usará suas configurações padrão - no Revit, por exemplo, existem pés (ele armazena tudo em pés).
#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));
No elemento raiz IfcProject, é formada uma árvore de elementos, os descendentes do tipo IfcSpatialStructureElement (IfcBuilding (construção), IfcBuildingStorey (piso), IfcSpace (espaço ou sala), IfcSite (site)). Mas esses elementos não estão conectados diretamente, mas por meio de um elemento especial IfcRelAggregates, em um relacionamento um para muitos.
IFCRELAGGREGATES(<GlobalId>, <OwnerHistory>, <>, <>, < >, (< >));
Esses elementos podem ser conectados apenas na seguinte ordem: IfcSite => IfcBuilding => IfcBuildingStorey => IfcSpace, e elementos do mesmo tipo podem ser conectados, mas seu atributo CompositionType deve ter um valor diferente e apenas em uma certa ordem COMPLEX => ELEMENT => PARTIAL
Estrutura completa do projeto possível:
IfcSite.COMPLEX => IfcSite.ELEMENT => IfcSite.PARTIAL => IfcBuilding.COMPLEX => IfcBuilding.ELEMENT => IfcBuilding.PARTIAL => IfcBuildingStorey.COMPLEX => IfcBuildingStoreyCIAL = PARTIRE> = IfcSpace.ELEMENT => IfcSpace.PARTIAL
arquivo ifcEmbora todos os elementos sejam opcionais, apenas a ordem de herança é necessária
Supõe-se que você esteja descrevendo um edifício, que consiste em andares do andar e em que espaços existem, você precisa mostrar o relevo existente no site no qual entra no edifício
IFCSITE(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<LongName>,<CompositionType>,<RefLatitude>,<RefLongitude>,<RefElevation>,<LandTitleNumber>,<SiteAddress>);
O atributo Representation herdado de IfcProduct aponta para um objeto IfcProductRepresentation, possui dois descendentes IfcProductDefinitionShape para descrever a forma do objeto e IfcMaterialDefinitionRepresentation para descrever o material (estilo de visualização), eles vinculam representações diferentes por meio do atributo Representations.
IfcProductDefinitionShape(<>,<>,(<Representations>))
IfcMaterialDefinitionRepresentation(<>, <>,<Representations>),<RepresentedMaterial>)
IfcMaterialDefinitionRepresentation for Representations aceita apenas IfcStyledRepresentation - descrições de estilo
O atributo RepresentedMaterial fornece uma descrição textual do material do objeto.
O IfcProductDefinitionShape for Representations aceita apenas IfcShapeRepresentation ou IfcTopologyRepresentation (IfcShapeModel)
IfcShapeRepresentation é a classe mais importante no IFC porque é responsável pela representação geométrica de objetos. Tipos de geometria disponíveis: Curve2D (linhas planas), GeometricSet (pontos, linhas, superfícies, 2d e 3d), SurfaceModel (superfícies), SolidModel (corpos), tipos adicionais (BoundingBox, SectionedSpine, MappedRepresentation)
IFCSHAPEREPRESENTATION(<>,<RepresentationIdentifier>,< >,< >);
No centro de qualquer geometria está o elemento IfcCartesianPoint - apenas um ponto.
#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.));
A geometria pode simplesmente consistir em uma lista de pontos ou pode ter uma estrutura complexa com vários parâmetros e filhos.
Considere
IfcExtrudedAreaSolid(<SweptArea>,<Position>,<ExtrudedDirection>,<Depth>)

Esse é o corpo obtido extrudando o contorno planar SweptArea original localizado no espaço Position extrudado na direção de ExtrudedDirection até a profundidade de ExtrudedDirection. O atributo SweptArea é do tipo IfcProfileDef - é uma classe abstrata com um grande número de descendentes "para todas as ocasiões"; nesse caso,
IfcRectangleProfileDef(<ProfileType>,<ProfileName>,<Position>,<XDim>,<YDim>)
ProfileType - valor de enum do tipo de perfil do tipo IfcProfileTypeEnum (Valores: CURVE, AREA). O nome do perfil ProfileName opcional, o posicionamento da posição e o tamanho pelas coordenadas XY são XDim, YDim.

Ou o IfcFacetedBrep mais complexo, consiste em um IfcClosedShell fechado, que por sua vez consiste em uma lista de faces do IfcFace, que consistem em arestas do IfcFaceBound, descritas pelos loops do IfcLoop, que já consistem em pontos IfcCartesianPoint. A representação de limite (brep) determina muitas condições em sua estrutura - descritas em detalhes na documentação e na literatura relacionada.
#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 apareceu no IFC4, cujas bordas podem ser descritas pelas curvas NURBS

Os objetos IfcSpatialStructureElement podem ter sua própria geometria, mas, em geral, os edifícios consistem em outros objetos: paredes, pisos, telhados, janelas, portas etc. No IFC, todos esses objetos são descritos pelos objetos correspondentes: IfcWall, IfcSlab, IfcRoof, IfcWindow, IfcDoor - todos eles são descendentes do IfcProduct. Todos esses objetos podem ser associados ao objeto IfcSpatialStructureElement correspondente, por meio do objeto especial IfcRelContainedInSpatialStructure

IFCRELCONTAINEDINSPATIALSTRUCTURE(<GlobalId>,<OwnerHistory>,<>,<>, (<RelatedElements>),<RelatingStructure>)
Para paredes de espessura constante, é habitual usar o IfcWallStandardCase (considerado obsoleto na IFC4), para outros casos, usamos o IfcWall. No caso do IfcWallStandardCase, você precisa usar o SweptSolid - extrudar o contorno da parede até uma determinada altura
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,$,$);
A porta é descrita pelo objeto IfcDoor, pode ser adicionada ao IfcRelContainedInSpatialStructure, mas esse objeto não faz um "corte" na parede por si só

O objeto especial "IfcOpeningElement" é responsável pelo "corte", associado ao objeto "pai" por meio do IfcRelVoidsElement. No IfcOpeningElement, você pode "inserir" uma porta usando o objeto IfcRelFillsElement. Com IfcOpeningElement, você pode fazer não apenas através de furos, mas também recessos.


IFCDOOR(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<OverallHeight>,<OverallWidth>)
IFCWINDOW(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<OverallHeight>,<OverallWidth>)
O objeto ifcWindow é muito semelhante em uso, ifcDoor, OverallHeight, OverallWidth - dimensões nominais, você não pode especificar -, então esses valores serão obtidos da geometria
Se o objeto ifcRoof está implícito em um objeto complexo - ele deve descrever o telhado inteiro, para conectar todos os filhos a ele - você precisa usar o IfcRelAggregates. Mas, ao mesmo tempo, o IfcRoof pode ter sua própria geometria de representação.
IFCSLAB(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<PredefinedType>);
IFCROOF(<GlobalId>,<OwnerHistory>,<>,<>,<ObjectType>,<ObjectPlacement>,<Representation>,<Tag>,<IfcRoofTypeEnum>);
Escrevendo IFC
Agora, armados com esse conhecimento, tentaremos descrever uma casa simples; para começar, pegaremos um arquivo IFC vazio - cuja descrição eu já dei
arquivo IFC vazioISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('','',(''),(''),'','','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
ENDSEC;
END-ISO-10303-21;
Em seguida, precisamos preencher o conteúdo da seção DADOS. O primeiro objeto necessário deve ser IFCPROJECT (embora possa estar no final do arquivo, mas só precisa estar), também precisamos de IFCUNITASSIGNMENT, se certamente queremos que os programas leiam o modelo nas unidades de medida que temos em mente. Também precisaremos de pelo menos um IFCGEOMETRICREPRESENTATIONCONTEXT - caso contrário, não poderemos adicionar uma descrição da geometria.
PROJETO IFC, PROJETO DE FUNCIONAMENTO DA IFC, CONTEXTO IFCGEOMETRICREPRESENTATION#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.));
Estrutura da casa
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);
Vamos descrever o gênero - 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.));
Quatro paredes#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,$,$);
A porta#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);
Para descrever a porta, usamos IFCFACETEDBREP e usamos para o IFCOPENINGELEMENT no qual nossa porta está inserida. Usando diferentes IFCLOCALPLACEMENTs, podemos inserir a mesma geometria em locais diferentes e representar objetos diferentes - por exemplo, podemos usar o mesmo IFCFACETEDBREP para a janela.
A janela#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);
O telhado#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));
arquivo finalizado

Conclusão
Agora, meu caro leitor, você pode escrever sua casa dos sonhos. Infelizmente, eu não considerei o IfcMaterialDefinitionRepresentation, que foi rejeitado pelo estilo de exibição de objetos, não considerou o IfcTopologyRepresentation - eu realmente não entendo para que serve e não sei como visualizá-lo. Não considerei as opções da IFC e conjuntos adicionais de propriedades. Mas, caso contrário, isso não seria uma breve introdução.
O formato IFC contém um grande número de objetos, que se tornam apenas mais de uma versão para outra. No texto de especificação, existem notas que não são refletidas no esquema EXPRESS, mas que afetam fortemente o processamento do arquivo. Portanto, é difícil implementar esse formato sem ter lido com cuidado toda a documentação, mas isso dificilmente é possível para uma pessoa, pois não existe um programa - que o leia absolutamente corretamente, cada um com suas próprias peculiaridades. E se, no caso de programas de código aberto, sempre houver a oportunidade de corrigir os erros detectados, nos programas proprietários, isso torna impossível o uso completo do formato IFC.
O formato da IFC não é absolutamente adequado para armazenar informações da seção de plano geral, mas atualmente há um trabalho ativo nesta seção, esse trabalho deve ser concluído até o final de abril de 2020 e fazer parte da IFC5. Também agora estão em andamento trabalhos na IFC Road, no IFC Airport e no IFC4precast (pré-fabricado). O IFC Bridge apareceu no IFC4x2, para o qual eles criaram um objeto geométrico especial - IfcSectionedSolidHorizontal

Mudanças recentes no IFC aproximam muito o GML, mesmo o IfcCoordinateReferenceSystem apareceu - uma descrição do sistema de coordenadas geodésicas. Ao mesmo tempo, a IFC se concentra na descrição das estruturas internas do objeto e a GML descreve sua representação externa. Mas a principal diferença entre a IFC é que é possível fazer referência aos mesmos objetos em lugares diferentes - o mesmo ponto pode ser usado na descrição da geometria da parede e da janela. No GML, cada objeto geométrico é completamente independente.
Referências:
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