Lista de quantidades a partir do IFC

Eu geralmente encorajo os profissionais de BIM a aprender programação. Primeiro porque é uma ótima maneira de desenvolver várias habilidades, como a capacidade de abstração, criatividade, raciocínio lógico, etc. Segundo porque trabalhamos com informação modelada.

Existe um aspecto na modelagem da informação que trata da estruturação dos dados. A capacidade de consumir informação através de dados estruturados é o que garante a vantagem de trabalhar com BIM. A maioria de nós só consegue acessar estes dados através de ferramentas proprietárias e não proprietárias que existem no mercado. Mas existe a possibilidade de acessar estes dados através de programação, o que dá uma grande vantagem no processo de levantar informações a partir de um modelo de dados, como é o caso do modelo BIM.

Por que programar?

A grande vantagem de criar seus próprios programas é ter a liberdade de capturar os dados e gerar informação de uma forma mais flexível e autônoma. É claro que criar programas, além de exigir tempo e aprendizado, também exige a manutenção dos aplicativos elaborados para garantir seu funcionamento, principalmente se for através de plugins APIs. Mas existe uma outra forma, amplamente utilizada por cientistas de dados, que muitas vezes precisam pesquisar dados de uma forma personalizada e gerar relatórios customizados para um fim específico. Um exemplo desta prática é a utilização de scripts elaborados em linguagem Python que são interpretados em tempo real e geram planilhas e gráficos de forma muito prática e eficiente.

A criação de plugin ou AddOn é uma excelente maneira de automatizar tarefas repetitivas dentro de uma linha de processos, seja de modelagem, análise ou extração de resultados. No entanto ela está associada a uma ferramenta específica, que libera sua API com o intuito de auxiliar seus clientes a fim de resolver problemas que nem sempre podem ser previstos pelos desenvolvedores destas ferramentas. O problema é quando você precisa sair da ferramenta, quando a interoperabilidade entra em jogo.

Trabalhar com dados estruturados num formato padrão e aberto é, a meu ver, muito mais dinâmico, fácil e te dá muito mais poder sobre as informações que você é capaz de extrair. Basta que você compreenda como estes dados estão estruturados e de que forma pode acessá-los. É claro que os dados precisam estar bem estruturados, mas isso também é requisito de qualquer ferramenta com que você trabalhe.

O exemplo da lista de quantidades

Viajar através dos dados e manipulá-los a fim de transformar tudo isso em informação pode ser fascinante, mas é preciso viabilizar isso. Vamos utilizar um exemplo prático. Neste artigo, vou mostrar que é possível gerar uma lista de quantidades a partir de um modelo em formato IFC. Para isso vou utilizar o jupyter notebook e a linguagem Python com a blibioteca IfcOpenShell que permite o acesso aos dados de um modelo IFC.

Python é uma linguagem muito amigável e poderosa. Recomendo fortemente a quem quer aprender a programar que comece por esta linguagem. Além de ser mais fácil de aprender que outras linguagens como C#C++ e Java, possui uma comunidade muito grande e ativa, além de uma vasta biblioteca que permite fazer quase tudo! Todas as ferramentas utilizadas neste artigo são gratuitas.

Relações de propriedades no IFC

Primeiro vamos entender como funciona a relação entre os objetos e suas propriedades no padrão de um arquivo IFC. Num arquivo IFC, objetos representam todos os elementos modelados e não modelados, bem como os tipos, materiais, etc. E também os seus relacionamentos. Existe uma classe específica de objetos, chamada IfcRelDefinesByProperties que relaciona um ou mais objetos (S[1:?]) a um conjunto de propriedades chamados de PropertySets. Estes também são objetos, da classe IfcPropertySet, que possuem vínculo com um ou mais propriedades que, entre outras coisas, podem ser objetos da classe IfcPropertySingleValue.

O que nós vamos fazer é capturar os objetos que queremos quantificar e percorrer as suas propriedades a fim de classificar e agrupar estes objetos e suas propriedades de forma a somar as instâncias que nos interessam. Para isso vamos criar um arquivo em formato JSON, contendo os dados que queremos capturar e esclarecendo de que forma vamos arupá-los:

Nele estabelecemos os seguintes parâmetros:

  1. Classe : para indicar qual a classe dos elementos que queremos quantificar. Neste exemplo eu indico que quero quantificar os elementos da classe IfcFlowSegment (Tubulações) e IfcFlowFitting (Conexões);
  2. Grupo : O nome da propriedade que vai agrupar os elementos. Aqui eu utilizo a propriedade ‘Sistema’ porque quero quantificar as tubulações e conexões separados por seus sistemas (água fria, esgoto, etc.);
  3. Unidade : a unidade de medida para a medição;
  4. Parametro_Valor : Indica o nome da propriedade que contém o valor que eu quero quantificar. No exemplo, quero quantificar o total do comprimento das tubulações. Para as conexões, como eu quero quantificar as ocorrências de cada elemento, eu simplesmente omito este valor com uma string vazia (“”);
  5. PropertySet : O nome da PropertySet que contém as propriedades;
  6. Parametros_Desc : Uma lista com o nome dos parâmetros ou propriedades que descrevem os elementos que desejo quantificar. Este elemento é muito importante porque ele indica de que forma vamos agrupar as instâncias que queremos quantificar. Estes parâmetros vão formar a descrição do elemento.

Feito isso, vamos ao código propriamente dito. Não vou entrar no mérito de explicar detalhadamente cada linha do código, mas vou indicar qual foi o caminho percorrido. A seguir apresento parte do código contendo a função que vai percorrer as propriedades dos objetos de determinada classe, procurar nos PropertySets indicados as propriedades que nos interessam e retornar uma lista com esta informação:

 

O script propriamente dito, começa abrindo o arquivo IFC e o arquivo JSON e pegando as informações que necessitamos, passando isso para a função acima a fim de capturar a lista (lst) com os dados desejados. Faço isso para cada classe IFC indicada pelos objetos no arquivo JSON e jogo o resultado acumulado para uma segunda lista (lista):

Então imprimo esta lista agrupando os dados por Sistema, descrição e unidade, somando o valor obtido de cada elemento indicado na propriedade Parametro_Valor:

Se o arquivo IFC estiver bem modelado e com seus dados estruturados, então a sua lista estará precisa. É bom lembrar que esta lista corresponde exatamente aos elementos modelados e as suas informações.

Não quero, com este artigo, indicar que esta é a melhor forma de extrair listas de quantidades de um modelo BIM, existem diversas ferramentas que fazem isso com maestria. A intenção é utilizar um exemplo para demonstrar a capacidade que temos de extrair informação precisa do modelo sem precisar de ferramentas específicas, desde que você saiba o que está fazendo e tenha uma boa compreensão de como os dados estão estruturados no modelo. Neste caso, é muito mais fácil fazer esta pesquisa num modelo estruturado num formato padrão, como o IFC, por ser um esquema normatizado internacionalmente e aberto para compreensão de todos, o que não acontece com os formatos proprietários, mesmo aqueles que liberam sua API, porque estabelecem certos limites à compreensão de como estes dados estão estruturados.

O script e o arquivo JSON utilizados neste artigo estão disponíveis no link abaixo, para que você possa fazer testes com seus próprios modelos. Vale lembrar que este é apenas um objeto de estudo, não estando preparado para o tratamento de erros e portanto não vale para uma utilização real. O script ainda pode ser aperfeiçoado, pode permitir a exportação da lista final para uma planilha, por exemplo.

Link dos arquivos:

https://www.linkedin.com/embeds/publishingEmbed.html?articleId=8809241846515286954

Em se tratando de programação, os limites dependem somente da sua criatividade e habilidade em codificar!