Análise do IFC com IfcOpenShell

Algumas pessoas me perguntam por que eu estudo o formato IFC tão a fundo. Imaginam que seja perda de tempo já que existem várias ferramentas proprietárias e abertas que fazem leitura destes arquivos. Sim, é verdade. O formato padrão aberto do modelo BIM permite que qualquer desenvolvedor possa criar um software capaz de ler um modelo e até editá-lo.

Bom, desde criança eu desmontava meus brinquedos para entender como eles funcionavam, e naquela época não existia internet para buscar estas informações. Lembro de mais tarde montar e desmontar meus computadores, numa época em que isso fazia sentido. Com o IFC não foi diferente, precisei entender como ele funciona para fazer um bom uso dos modelos que desenvolvo e recebo.

No entanto, me sinto como na infância, porque apesar de haver internet e youtube, ainda é difícil encontrar informação sobre o formato. Tive que aprender a desmontar mais um brinquedo. Mas, mesmo sendo pouco, existem materiais muito bons de gente muito boa fazendo estudos fantásticos com IFC. A comunidade de openBIM parece muito ativa na Europa e na Ásia, no Brasil os esforços ainda são tímidos. E é pensando em trocar mais informações sobre este assunto que trago este artigo com algumas das peças que tenho desmontado do meu mais novo quebra-cabeça.

Objetos

O arquivo IFC é orientado a objetos, e não são só os elementos modelados representados por objetos, mas toda a informação presente no modelo. Na verdade, aquilo que vemos em 3D é apenas uma representação virtual destes objetos, e neste caso, tanto o elemento quanto a sua representação gráfica são objetos que se relacionam. E este relacionamento tem um papel muito importante no esquema.

Como exemplo, vamos pegar um modelo simples, com paredes, janelas e uma porta que dá acesso a duas salas:

Vamos entender os relacionamentos entre os objetos construídos e os espaços, que chamaremos de ‘Sala1’ e ‘Sala2’. Quem já está acostumado com a modelagem BIM sabe que os espaços são objetos que compõe o modelo. No Revit são chamados de ‘rooms’, aqui chamaremos de ‘spaces’, pois esta é a nomenclatura utilizada pelo IFC.

Algumas ferramentas ajudam muito o estudo. Eu utilizo o visualizador de IFC chamado Xbim Xplorer da Xbim Team, gratuito e aberto. Ele pode ser encontrado na página: https://docs.xbim.net/downloads/xbimxplorer.html.

Sua grande vantagem é que ele traz uma janela de propriedades mostrando o ‘label’ , uma espécio de identificador de cada objeto e todos os seus relacionamentos, tornando as informações mais próximas às utilizada no formato nativo (STEP) do arquivo IFC.

IfcOpenShell

Mais uma vez vão dizer que sou maluco! mas por que não utilizar uma ferramenta onde as propriedades e os relacionamentos estão melhor visualizados? Calma, estamos desmontando o brinquedo, ok?

E desmontar brinquedos nesta área significa trabalhar um pouco com programação. Mas não se preocupe, se você não está muito habituado a linguagens de programação, quando se entende os esquemas, é bem mais fácil trabalhar com programação em BIM do que você imagina!

Existem várias bibliotecas utilizadas para abrir e manipular arquivos no formato IFC. A própria xBim Team possui o Xbim Tools, um conjunto de bibliotecas em C# para construir programas que manipulem arquivos neste formato. No entanto, existe uma blibioteca chamada IfcOpenShell para C++ e Python, e nós vamos ficar com esta última, por ser mais fácil de manipular. Por ser uma linguagem interpretada, programas em Python não exigem que sejam compilados, necessitando somente de um interpretador. A linguagem Python é muito utilizada para analisar grandes quantidades de dados. Como interpretador utilizaremos o Jupyter Notebook, também gratuito.

O esquema

Agora vamos analisar mais profundamente como funciona o relacionamento entre os objetos de espaços, portas e janelas. No caso do nosso exemplo temos duas janelas, cada uma numa sala e uma porta que liga os dois espaços. O esquema dos objetos e seus relacionamentos em EXPRESS-G seria mais ou menos este:

Cada retângulo representa um objeto, e repare que os relacionamentos utilizados para ligar os objetos construídos com os espaços também são objetos, neste caso da classe IfcRelSpaceBoundary. Coloquei os identificadores das instâncias para melhorar o entendimento, eles estão identificados com um #. Se você abrir o arquivo IFC num editor de texto verá estes identificadores no início de cada linha que representa um objeto:

Na figura anterior podemos ver os espaços, a porta e uma janela com seus atributos. na próxima figura veremos o restante dos objetos, a outra janela e os relacionamentos:

Cada um destes objetos está representado no esquema apresentado anteriormente:

Observe que os objetos que representam os relacionamentos indicam que objetos construídos estão relacionados com cada espaço.

Uma vez entendendo melhor como as coisas funcionam dentro do esquema, podemos fazer investigações utilizando o IfcOpenShell. Utilizando poucas linhas de comandos podemos obter informações do nosso modelo.

Primeiro importamos a biblioteca, depois abrimos o arquivo e atribuímos uma variável para ele (ifc_file). Depois atribuímos todos os objetos do tipo IfcSpace para a variável spaces. Como spaces é uma lista de todos os espaços no modelo, pegamos o primeiro espaço e obtemos as informações dele.

O interessante do IfcOpenShell é que os atributos dos objetos tem o mesmo nome que os atributos do esquema padrão definido pela BuildingSmart para o formato IFC. Por isso o entendimento do esquema é tão importante para manipular as informações aqui. Por exemplo, podemos imprimir o valor do atributo Name do espaço com o nome do atributo ou simplesmente indicando a ordem que ele aparece na classe do objeto:

Sabendo que todos os relacionamentos vinculados ao espaço encontra-se numa lista atribuída ao atributo BounderyBy, obtemos facilmente esta informação. Também podemos pegas as informações da janela relacionada com este espaço e obter, por exemplo a área dela, manipulando de seus atributos:

Também podemos obter o objeto porta, descobrir seus relacionamentos e quais espaços ela separa. Neste caso, utilizamos o atributo RelatingSpace para obter esta informação:

Podemos fazer isso de uma forma mais formal, com poucas linhas, imprimindo a porta e os espaços a que ela dá acesso:

Montando o quebra-cabeças

Este são exemplos bobos, eu diria, da manipulação de modelos IFC. É possível fazer coisas muito mais interessantes que estas, depende apenas da sua criatividade e capacidade de criar algoritmos para isso. Outras bibliotecas da linguagem, junto com esta podem ajudar a emitir relatórios mais complexos, como planilhas de quantidades, dashboardscheck models e até orçamentos complexos, bastando apenas que você cruze as informações do modelo com as de outras planilhas, de custo, por exemplo.

O que eu queria deixar claro é que basta conhecer o esquema da linguagem de modelagem de dados do IFC e um pouco de programação, sem necessitar comprar softwares caros para fazer análises automáticas e obter relatórios de conformidade bem apurados.

Me diga o que você achou do assunto, vamos debater. Precisamos conversar mais sobe openBIM no nosso país. Que tipo de iniciativas você gostaria de ver acontecendo em relação ao BIM? Quero propor um debate, vamos começar a montar este quebra-cabeças juntos!