Escrevendo um IFC do absoluto zero
15
2

Escrevendo um IFC do absoluto zero

#0026: Com base na grande audiência do texto ‘O futuro é Open’ me animei a evoluir o entendimento do IFC de uma maneira pouca ortodoxa: escrevendo um arquivo do absoluto zero. Eis os resultados até o momento.

Tiago Ricotta
8 min
15
2

#0026: Com base na grande audiência do texto ‘O futuro é Open’ me animei a evoluir o entendimento do IFC de uma maneira pouca ortodoxa: escrevendo um arquivo do absoluto zero. Eis os resultados até o momento.

Notepad + xBIM (1/7)

It is born!
It is born!

Uma forma que gosto muito de fazer para entender um conceito é ir para prática e a imagem acima é resultado desta curiosidade, sim pequeno leitor, tudo o que você vê na imagem foi escrito em um notepad do zero, inclusive a geometria.

Na esteira do curso do Carlos Dias (alô! ainda tem vagas na turma da próxima semana) resolvi partir para um desafio pessoal que estou achando bem interessante e já está ajudando horrores no dia a dia de trabalho: escrever um IFC do absoluto zero em um notepad.

Rapaz.. por quê Notepad? Eu sei que minimamente um Notepad++ já ajudaria horrores, mas assim como na vida, um perrengue ajuda no dia a dia do aprendizado e até o momento tenho atingido o meu objetivo.

Com uma ideia na cabeça de reconstruir a casa dos meus pais no IFC, a forma ajuda porque meu pai era engenheiro e só tem linha reta por lá (malz awe CREA), consigo aplicar todos os conceitos de estruturação e construção que queria fazer.

Como começar? Essa é muito fácil, você precisa disso:

  • Notepad;
  • Obstinação de entender algo do zero;

Com isso em mente a primeira porrada vem logo ao abrir o Notepad, afinal, qual é a primeira linha que preciso escrever? Existe uma ordem? Preciso declarar variáveis e chamar classes como em outras linguagens de programação?

Talvez o segundo melhor professor deste tema, atrás do Carlos claro, seja o xBIM, e por qual razão? Basicamente você pode ir criando o seu arquivo e compilando ele no progama e através do log de erros ir aprendendo com o adubo orgânico que se estava preparando.

O xBIM até o momento tem sido um bom auxiliar pelo simples fato dele já ter todo o schema compilado dentro dele, pode até existir uma coisa ou outra que não funciona direito, mas ainda não me deparei com este tipo de problema.

Por motivos óbvios vou comparando o que estava desenvolvendo no Trimble Connect para saber se uma solução de mercado conseguiria entender o meu pensamento e fiquei bem feliz de saber que tudo correu bem até o momento.

Bom, no Notepad basicamente o que você precisa é de um cabeçalho e declarar o seu projeto, algumas soluções nem colocam o IfcProject de cara, fazem uma série de declarações primeiro para tentar deixar o código mais organizado e isso no desenvolvimento das coisas você vai aprendendo que faz bastante sentido, com toda a certeza já seria uma melhor prática de programação.

Como minha melhor prática era nula comecei pelo IfcProject mesmo, afinal era o que fazia sentido pra mim, logo, a criança nasceu assim:

ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('Projeto teste escrevendo do zero um IFC', 'ExchangeRequirement [Any]'),'2;1');
FILE_NAME('Projeto Beta.ifc','2021-10-09T15:40:32',('tiagoricotta'),('Yolo'),'MySelf','MySelf','IFC4 model');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1= IFCPROJECT('0000000000000000000001',#2,'Projeto Beta','Yolo','Beta','ProjetoBETA2021','v00',(#21),#10);

Yeap... GUID gerado na mão não é legal, mas funcionou. (existem código de geração de GUID automático).

E na sequência?

IfcOwnerHistory (2/7)

Acessando a documentação do IfcProject a segunda informação que precisaria declarar era o IfcOwnerhistory, só nisso, puxando um pelo veio um urso, só nessa brincadeira já da para entender muito bem o conceito de orientação a objeto, vamos ver.

A documentação fala o seguinte do IfcOwnerHistory:

IfcOwnerHistory define todas as informações de histórico e identificação relacionadas. A fim de fornecer acesso rápido, ele é anexado diretamente a todos os objetos, relacionamentos e propriedades independentes.

IfcOwnerHistory é usado para identificar o aplicativo de criação e proprietário e o usuário para o objeto associado, bem como capturar o último aplicativo de modificação e usuário.

Da para fazer muita coisa porque a quarta informação do IfcOwnerHistory é o IfcChangeActionEnum que tem as seguintes opções: .NOCHANGE. / .MODIFIED. / . ADDED. /  .DELETED. / .NOTDEFINED., desta forma havendo uma gestão legal da modelagem a cada exportação os elementos conseguiriam ter o seu status controlado de maneira bem eficiente, ou seja, saber o que foi alterado / acrescentado / deletado do projeto seria bem tranquilo.

Com esse Inisght em mente, que em algum momento devo utilizar em um exemplo prático, evoluímos o código de uma linha para mais oito linhas, fiz questão de preencher as informações do maluco e da empresa que estão trabalhando neste projeto, ficando assim (dados fictícios):

#2= IFCOWNERHISTORY(#3,#9,.READWRITE.,.NOCHANGE.,$,$,$,$);
#3= IFCPERSONANDORGANIZATION(#4,#7,$);
#4= IFCPERSON('Responsavel','Ricotta','Tiago','Marcal','Mr.','MSc.',#5,#6);
#5= IFCACTORROLE(.SUPPLIER.,'Pensador','Quem esta tendo esta ideia maluca');
#6= IFCPOSTALADDRESS(.OFFICE.,'Escritorio','Local de Entrega','Portaria','Avenida Dr. Jorge Zarur','12200-000','Sao Jose dos Campos','Sao Paulo','12200-000','Brasil');
#7= IFCORGANIZATION('Empresa','Yolo','Matriz',#8,#6);
#8= IFCACTORROLE(.MANUFACTURER.,'Financiadora','Quem esta financiando o projeto');
#9= IFCAPPLICATION(#7,'2021','MySelf','TMR');

Ok... mas o que mais?

IfcUnitAssigment (3/7)

Por vias tortas acabei fazendo algo útil, ao escrever na primeira linha o IfcProject ele já me pediu várias informações e uma das mais importantes é a questão da declaração das unidades do projeto e isto é feito pelo IfcUnitAssigment e é a última informação que o IfcProject acaba pedindo.

A documentação fala o seguinte:

IfcUnitAssignment indica um conjunto de unidades que podem ser atribuídas. Dentro de um IfcUnitAssigment, cada definição de unidade deve ser única; ou seja, não deve haver definições de unidade redundantes para o mesmo tipo de unidade, como unidade de comprimento ou unidade de área. Para moedas, deve haver apenas um único IfcMonetaryUnit dentro de um IfcUnitAssignment.

Sinceramente uma dica para entender melhor isto é ir atrás do próprio exemplo que a BuildingSMART dá para declaração das unidades e verificar os comentários que lá estão, foi copiando o código de declaração de variáveis e entendendo como ele faz conversões que a coisa foi para frente.

No fim, a coisa ficou assim simplificando:

#10= IFCUNITASSIGNMENT ((#11, #12, #13, #14));
#11= IFCSIUNIT (*, .LENGTHUNIT., .MILLI., .METRE.);
#12= IFCSIUNIT (*, .AREAUNIT., $, .SQUARE_METRE.);
#13= IFCSIUNIT (*, .VOLUMEUNIT., $, .CUBIC_METRE.);
#14= IFCSIUNIT (*, .TIMEUNIT., $, .SECOND.);

What is next?

IfcRelAggregates (4/7)

Tudo no final do dia é uma questão de relacionamento ou ‘REL’, se você criou um objeto e quer que ele se relacione com o pavimento vai ter um ‘REL’ te esperando no caminho. Isso pode ser HELL também dependendo da complexidade do que você quer fazer.

Dito isto, ao escrever o IfcSite tive que aprender a fazer o meu primeiro relacionamento não romântico do projeto e utilizando o IfcRelAggregates coloquei o Site para conversar com o Projeto, bem como a imagem da BuildingSMART mostra

O que mais gostei da imagem da BuildingSMART foi o conceito de que o terreno é o IfcGeographicElement, classe que nem imaginava que existia até umas semanas atrás uma turma de Design de Interiores questionou sobre como classificar alguns itens de paisagismo, mas disto falamos depois.

#1= IFCPROJECT('0000000000000000000001',$,'Projeto Beta','Yolo','Beta','ProjetoBETA2021','v00',(#21),#10);
#15= IFCSITE('0000000000000000000002',#2,'IfcSite','Site do Custo',$,#25,$,$,.ELEMENT.,(-23,17,91),(-45,88,72),593,$,#17);
#16= IFCRELAGGREGATES('0000000000000000000003',#2,'Project to Site',$,#1,(#15));
#17= IFCPOSTALADDRESS(.SITE.,'Terreno do Projeto','Obra','Portaria','Avenida Ouro Fino','12300-000','Sao Jose dos Campos','Sao Paulo','12300-000','Brasil');

Um ponto importante para ir acompanhando o raciocínio é verificar que até o momento estamos construindo algo no éter da Helena Blavatsky, ou traduzindo, no meio do nada e hospedado na luz astral.

E justamente ao me deparar com o IfcObjectPlacement, que vem a ser a sexta informação a ser informada no IfcSite, que percebi isso.

Vamos a ela então.

IfcLocalPlacement (5/7)

Como pequeno padawan escrevendo as coisas eu não me atrevi a desvendar a questão de coordenadas geográficas e conceitos mais profundos de GIS (mesmo que até tenha colocado as infos de latitude e longitude no IfcSite), eu só queria mesmo ter um 0,0,0 para trabalhar e isso me foi entregue pelo IfcLocalPlacement.

Existe uma questão bem profunda sobre este tema que o Carlos explica bem a fundo no curso dele que é a relação de posicionamento dos objetos entre si, não vou entrar nesse detalhe, mas a imagem abaixo detalha um pouco o conceito:

Fonte: A Common Approach to Geo-Referencing Building Models in Industry Foundation Classes for BIM/GIS Integration - Scientific Figure on ResearchGate. Available from: https://www.researchgate.net/figure/The-placement-hierarchy-in-IFC_fig5_351907369 [accessed 13 Oct, 2021]
Fonte: A Common Approach to Geo-Referencing Building Models in Industry Foundation Classes for BIM/GIS Integration - Scientific Figure on ResearchGate. Available from: https://www.researchgate.net/figure/The-placement-hierarchy-in-IFC_fig5_351907369 [accessed 13 Oct, 2021]

Com toda a certeza, na evolução do projeto e construção das coisas, o problema de entendimento não fica no posicionamento das coordenadas, mas sim em que direção elas precisam ir para construir os objetos em três dimensões e coloca-las em contexto com outros objetos relacionados.

Para rotacionar uma simples porta acho que investi umas duas horas de massa encefálica trabalhando na máxima capacidade para executar a tarefa, é algo que ainda não é tão natural de identificar de cara qual a informação e em qual IfcDirection (aonde as coisas são rotacionadas no eixo X, Y e Z), mas uma hora a gente acerta.

Evoluindo então, e a geometria?

IfcGeometricRepresentationContext (6/7)

Confesso que o momento mais legal do exercício foi o de escrever uma geometria no bloco de notas, só de fazer isso parece que deu um estalo no cérebro e tudo se tornou mais claro.

Novamente, no curso do Carlos ele vai bem a fundo em todos os tipos e possibilidades de construção de geometrias, o que faz você até questionar porque determinadas soluções escolhem um tipo de construção em detrimento de outras (aqui não é uma crítica, é simplesmente uma curiosidade mesmo).

Uma belíssima forma de conseguir entender tudo o que tem na documentação da BuildingSMART em relação a geometria é abrir os arquivos de exemplos de extrusão e ler os comentários do Thomas Liebich explicando pacientemente o que cada linha de código faz.

Obviamente ir pelo caminho do extrusion me pareceu bem mais simples do que outros caminhos e segui a vida com ele para elementos simples como as lajes (fazer a primeira porta escolhi o caminho da polyline).

Se você copiar o código abaixo em um Notepad simples e renomear o arquivo para qualquer coisa com extensão final .ifc deve conseguir um resultado como o da próxima imagem:

ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('Projeto teste escrevendo do zero um IFC', 'ExchangeRequirement [Any]'),'2;1');
FILE_NAME('Projeto Beta.ifc','2021-10-09T15:40:32',('tiagoricotta'),('Yolo'),'MySelf','MySelf','IFC4 model');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1= IFCPROJECT('0000000000000000000001',$,'Projeto Beta','Yolo','Beta','ProjetoBETA2021','v00',(#21),#10);
#2= IFCOWNERHISTORY(#3,#9,.READWRITE.,.NOCHANGE.,$,$,$,$);
#3= IFCPERSONANDORGANIZATION(#4,#7,$);
#4= IFCPERSON('Responsavel','Ricotta','Tiago','Marcal','Mr.','MSc.',#5,#6);
#5= IFCACTORROLE(.SUPPLIER.,'Pensador','Quem esta tendo esta ideia maluca');
#6= IFCPOSTALADDRESS(.OFFICE.,'Escritorio','Local de Entrega','Portaria','Avenida Dr. Jorge Zarur','12200-000','Sao Jose dos Campos','Sao Paulo','12200-000','Brasil');
#7= IFCORGANIZATION('Empresa','Yolo','Matriz',#8,#6);
#8= IFCACTORROLE(.MANUFACTURER.,'Financiadora','Quem esta financiando o projeto');
#9= IFCAPPLICATION(#7,'2021','MySelf','TMR');
#10= IFCUNITASSIGNMENT ((#11, #12, #13, #14));
#11= IFCSIUNIT (*, .LENGTHUNIT., .MILLI., .METRE.);
#12= IFCSIUNIT (*, .AREAUNIT., $, .SQUARE_METRE.);
#13= IFCSIUNIT (*, .VOLUMEUNIT., $, .CUBIC_METRE.);
#14= IFCSIUNIT (*, .TIMEUNIT., $, .SECOND.);
#15= IFCSITE('0000000000000000000002',#2,'IfcSite','Site do Custo',$,#25,$,$,.ELEMENT.,(-23,17,91),(-45,88,72),593,$,#17);
#16= IFCRELAGGREGATES('0000000000000000000003',#2,'Project to Site',$,#1,(#15));
#17= IFCPOSTALADDRESS(.SITE.,'Terreno do Projeto','Obra','Portaria','Avenida Ouro Fino','12300-000','Sao Jose dos Campos','Sao Paulo','12300-000','Brasil');
#18= IFCBUILDING('0000000000000000000004',#2,'IfcBuilding','Edificio em questao',$,#76,$,$,.ELEMENT.,0,593,#17);
#19= IFCRELAGGREGATES('0000000000000000000005',#2,'Site to Building',$,#15,(#18));
#20= IFCRELCONTAINEDINSPATIALSTRUCTURE('0000000000000000000006',#2,'Site to Terreno',$,(#26),#15);
#21= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.0E-5,#23,$);
#22= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#21,$,.MODEL_VIEW.,$);
#23= IFCAXIS2PLACEMENT3D(#24,$,$);
#24= IFCCARTESIANPOINT((0.,0.,0.));
#25= IFCLOCALPLACEMENT($,#23);
#26= IFCGEOGRAPHICELEMENT('0000000000000000000007',#2,'Terreno','Terreno do Projeto Beta',$,#27,#30,$,$);
#27= IFCLOCALPLACEMENT(#25,#28);
#28= IFCAXIS2PLACEMENT3D(#29,$,$);
#29= IFCCARTESIANPOINT((0.,0.,-100.));
#30= IFCPRODUCTDEFINITIONSHAPE($,$,(#31));
#31= IFCSHAPEREPRESENTATION(#22,'Body','SweptSolid',(#32));
#32= IFCEXTRUDEDAREASOLID(#33,$,#34,100.);
#33= IFCRECTANGLEPROFILEDEF(.AREA.,'25m x 10m rectangle',$,25000.,10000.);
#34= IFCDIRECTION((0,0,1));
ENDSEC;
END-ISO-10303-21;
Ma first ever geometry
Ma first ever geometry

Aprendizado (7/7)

Atualmente o projeto que estou escrevendo já tem mais de trezentas linhas de conseguimos criar aberturas nas paredes, selecionar a cor do RGB que vai dentro da forma que esta sendo criada, separar as camadas das paredes, imputar dados de layer e por aí vai.

Este conteúdo vai virar uma série e vamos escrevendo mais sobre os relacionamentos e o imput de informações, foi um exercício muito legal de fazer.

Se gostaram do conteúdo peço um call to action aqui, o primeiro para nos seguir:

Seguir meu Canal

O segundo para compartilhar o conteúdo:

Compartilhar conteúdo

Nos vemos na próxima,

Obrigado,

Abs.

Tiago Ricotta

Publicado em 13 de Outubro de 2021 às 17:24