Introdução
No contexto do BIM, a questão do orçamento sempre me despertava alguns questionamentos: Seria possível que o projetista/modelador codificasse os objetos do modelo com base em uma estrutura orçamentária, como o SINAPI? Tal procedimento seria, de fato, benéfico para a elaboração do orçamento posterior? Foi por meio de uma valiosa conversa com um engenheiro de custos que compreendi o fluxo de trabalho dele e obtive a resposta para minhas indagações. Concluí, então, que seria imprudente pensar em realizar tal tarefa durante a etapa de modelagem, pois trata-se de um processo minucioso, complexo e delicado que demanda o trabalho especializado do engenheiro de custos. Este profissional, a partir do modelo, extrai quantidades e realiza a elaboração do orçamento, que, por sua vez, abrange uma ampla gama de atividades, incluindo a composição de custos, a estruturação da EAP e a identificação de oportunidades de redução de despesas por meio de relatórios.
Na minha ótica, a responsabilidade do projetista consiste em classificar o modelo conforme o Plano de Execução BIM, com base em documentos como a NBR15965 ou até mesmo a Omniclass, e, acima de tudo, assegurar a correta atribuição das classes Ifc aos elementos. Desta forma o Modelo chegaria preparado nas mãos do Engenheiro de custos para que ele pudesse extrair os quantitativos para compor o seu orçamento.
Ainda assim, há no mercado diversos softwares de orçamentação que permitem aos engenheiros de custos elaborar orçamentos utilizando informações oriundas de modelos BIM. Entretanto, na maioria das vezes (para não falar todas kkkk) todo esse trabalho, ou vai para uma planilha de Excel ou fica dentro do software de origem não sendo possível ter uma interoperabilidade entre diferentes softwares de orçamento.
É conhecido que o formato IFC é um formato aberto, neutro e amplamente utilizado. Por que não incorporar toda essa informação de forma estruturada dentro do próprio arquivo IFC? Felizmente, o esquema IFC permite tal façanha, com classes específicas para custos, que possibilitam a composição de tabelas e associação de informações aos objetos. Perceba que não se trata apenas de codificação, mas sim de estruturação de informações. É exatamente esse assunto que abordaremos com maior profundidade neste artigo.
Metodologia
Vamos simplificar a demonstração neste artigo com um exemplo em menor escala. Utilizaremos um modelo IFC básico, no qual controlaremos três objetos: as alvenarias (osso), as portas e o contrapiso.
No entanto, elaborei três composições de custos (Genéricas) para esses elementos do modelo, a fim de fornecer um exemplo, conforme ilustrado na tabela a seguir:
A partir desse ponto, vamos estabelecer uma conexão entre a tabela do Excel e o modelo Ifc, permitindo assim a criação das classes IfcCostValue, IfcCostItem e IfcCostSchedule, juntamente com seus relacionamentos.
- IfcCostValue: Uma classe Ifc capaz de armazenar custos relacionados à mão de obra, materiais, serviços, entre outros.
- IfcCostItem: Uma classe Ifc capaz de armazenar um ou vários IfcCostValue, relacionando-se diretamente com as quantidades dos objetos. Essa classe pode ser entendida como o resultado de uma composição.
- IfcCostSchedule: Uma classe que agrupa instâncias de IfcCostItem, funcionando como uma tabela onde todas as composições são armazenadas.
A imagem a seguir ilustra esses conceitos:
Todas essas classes se relacionam entre si e também com objetos como paredes, portas, etc., como ilustrado no diagrama abaixo:
Observe que o objeto (IfcWallStandardCase) está relacionado ao IfcCostItem por meio do objeto de relacionamento IfcRelAssignsToControl. Por outro lado, a relação entre o IfcCostItem e o IfcCostValue é direta, através do atributo CostValues. No entanto, para relacionar as quantidades da parede (área e volume), o caminho é mais longo. Primeiro, precisamos percorrer as propriedades do objeto por meio do IfcRelDefinesByProperties até chegar ao IfcElementQuantity e, em seguida, associá-lo ao IfcCostItem por meio do atributo CostQuantities.
Contudo, para alcançar o melhor resultado possível, adotaremos uma abordagem de modelagem das informações do orçamento e dos filtros do modelo em tabelas relacionadas, semelhante a um banco de dados. Em seguida, utilizaremos o Python em conjunto com as bibliotecas IfcOpenShell (para manipulação do IFC) e pandas (para manipulação de planilhas) para inserir todas as informações de forma estruturada no IFC. Essa combinação nos permitirá processar e integrar os dados de maneira eficiente, garantindo a máxima qualidade e organização.
Desenvolvimento
Filtros do modelo
Ao operar um software de orçamento em BIM, é comum criar filtros com base nas propriedades do modelo para extrair quantitativos e calcular o orçamento. Por exemplo, para calcular o serviço X, precisamos usar a área de todas as paredes com o bloco de 14x19x39. Para isso, deve ser criado um filtro no modelo IFC que seleciona todos os elementos da classe IfcWall com o nome “Parede 14cm” e, dentro desses elementos, utilizaremos a propriedade “NetSideÁrea”.
Na nossa aplicação, seguiremos um processo semelhante, estabelecendo um filtro para cada composição com base nos parâmetros listados na tabela abaixo:
Esses parâmetros podem compor os requisitos de informações dos elementos. Além disso, é fundamental realizar a verificação do modelo para garantir que todos os elementos estejam na classe IFC correta e possuam os parâmetros necessários. Isso assegura a precisão e confiabilidade dos resultados do processo.
Modelagem de Dados
Vamos transformar a tabela de orçamento e os filtros do modelo em uma estrutura semelhante a um banco de dados relacional. Teremos duas tabelas: a tabela de INSUMOS, com as colunas codigo_insumo, descricao_insumo, unidade, preco_unitario e codigo_composicao; e a tabela de COMPOSIÇÕES, com as colunas codigo_composicao, descricao_composicao, unidade, classeifc_associada, ifcname_associado e propriedade associada. Observe que as duas tabelas possuem uma coluna em comum, codigo_composicao, que servirá como chave estrangeira para estabelecer uma conexão entre os dados das duas tabelas. Essa abordagem de banco de dados permitirá uma manipulação mais intuitiva e eficiente dos dados.
Com os dados organizados agora vamos ao Python!
Importando Bibliotecas
Existem diversas abordagens para obter o mesmo resultado usando a biblioteca IfcOpenShell. Entre essas opções, descobri que o caminho mais direto é através do módulo Api. Portanto, vamos importar esse módulo juntamente com a biblioteca pandas para o nosso programa. Para o desenvolvimento do código, irei utilizar a IDE PyCharm. É importante lembrar que as bibliotecas mencionadas devem estar instaladas corretamente.
Criando dicionário de dados
Agora, vamos utilizar o Pandas para ler as abas “INSUMOS” e “COMPOSIÇÕES” de uma planilha de Excel e criar dois DataFrames, denominados df1 e df2.
Para manipular esses dados, vamos utilizar dois recursos do Python: dicionários e listas:
Dicionários: Estruturas de dados que armazenam pares de chave e valor, permitindo acesso eficiente aos valores por meio das chaves.
Listas: Estruturas de dados que armazenam uma sequência ordenada de elementos, permitindo acesso e manipulação flexíveis desses elementos.
Vamos criar dois dicionários de dados. O primeiro dicionário irá armazenar os dados dos insumos e o segundo dicionário irá armazenar as composições e os filtros.
O resultado dos dicionários criados é esse:
Dicionário 01:
Dicionário 02:
Observe que no primeiro dicionário, a descrição dos insumos é utilizada como chave, e o valor correspondente é outro dicionário contendo os atributos código do insumo, preço unitário e composição associada. No segundo dicionário, a chave é a descrição das composições, e o valor também é um dicionário que contém uma lista de insumos, o código da composição, a classe Ifc, o IfcName e a propriedade associada.
Inserindo dados no IFC
Primeiro vamos ler o arquivo IFC:
Utilizando a API, iremos criar o IfcCostSchedule correspondente à tabela de composições no modelo. Além disso, faremos a edição do atributo “Name” para “Tabela de composições”.
Vamos criar o IfcCostItem e, em seguida, o IfcCostValue no modelo. Para isso, abriremos um loop for, percorrendo as chaves do dicionário 02 (composições). Para cada chave, criaremos um IfcCostItem, associando-o ao IfcCostSchedule (Tabela de composições) e vamos editar os atributos “Name” e “Identification” com base nos valores do dicionário 02.
Além disso, para cada insumo presente na lista de insumos, criaremos um IfcCostValue associado ao item e, em seguida, vamos editar os atributos “Name” (descrição do insumo) e “AppliedValue” (Preço unitário) utilizando os valores do dicionário 01.
Por fim, associaremos os objetos do modelo ao IfcCostItem. Faremos uma estrutura condicional (if) em que, se a propriedade associada for igual a “Count” (significando objetos que serão contabilizados por unidade), criaremos uma lista desses objetos e estabeleceremos uma associação (IfcRelAssignsToControl) entre o objeto e o IfcCostItem. Além disso, nesses casos, será necessário adicionar a classe IfcQuantityCount ao atributo CostQuantities para definir uma medida de contagem. Para os demais casos (else), em que utilizaremos propriedades de área dos objetos, criaremos uma lista deles e, em seguida, associaremos ao IfcCostItem, declarando a propriedade associada (área) no atributo CostQuantities. Segue o código:
Obs: Ao declarar as variáveis “parent” e “cost_schedule” dentro da função da API, os objetos de relacionamento são gerados automaticamente, eliminando a necessidade de criar cada um manualmente.
Também é possível adicionar uma tabela ao modelo que contenha todos os insumos e seus preços unitários.
Vamos utilizar outro loop for para percorrer cada chave e valor do dicionário 01. Dessa forma, criaremos o IfcCostItem e o IfcCostValue para cada insumo.
Por fim vamos salvar o modelo com todas as alterações:
Abrindo modelo no Blender
Ao abrir o modelo no Blender BIM, você pode navegar até a aba de propriedades da cena (Scene Properties), em seguida, selecionar “IFC Costing and Schedules” e, por fim, escolher “IFC Cost Schedules”. Essa ação exibirá todas as tabelas criadas no modelo, permitindo que você acesse o conteúdo delas.
Tabela de composições
Ao abrir a tabela de composições, podemos observar as seguintes colunas: código da composição, descrição da composição, quantidade, preço unitário e preço total. É importante destacar que o preço unitário de cada composição já leva em consideração a soma de todos os insumos associados.
Além disso, na aba “IFC Cost Item Quantities”, é possível visualizar todos os objetos do modelo que estão associados à composição selecionada na tabela. Ao clicar na setinha ao lado de cada objeto, é possível selecioná-los no modelo, facilitando a identificação visual
Tabela de insumos
Na tabela de insumos, podemos visualizar as seguintes colunas: Código do insumo, descrição do insumo, quantidade, preço unitário e preço total. No entanto, como optei por criar uma tabela de insumos que armazena apenas o preço unitário, a quantidade será sempre 1. Além disso, nas colunas de preço unitário e preço total, os valores serão sempre iguais, já que não há multiplicação pela quantidade.
Informações extras
Aninhamento de IfcCostItem
Um recurso interessante que o esquema Ifc nos oferece é a capacidade de aninhar IfcCostItem usando o IfcRelNests:
Isso nos permite criar etapas e subetapas dentro do IfcCostSchedule, permitindo uma organização mais detalhada dos elementos de custo. Com o aninhamento de IfcCostItem usando o IfcRelNests, podemos criar uma estrutura hierárquica na qual as etapas principais contêm sub etapas relacionadas. Isso facilita o gerenciamento e a visualização dos custos em diferentes níveis de detalhe, fornecendo uma visão mais precisa e estruturada do orçamento. veja o exemplo a seguir:
Resultado no blender:
Autoria do modelo
Ao lidarmos com a modificação de arquivos IFC, é importante considerar a questão da autoria do modelo. Felizmente, o esquema Ifc já contempla essa necessidade por meio da entidade IfcOwnerHistory. Essa entidade é utilizada para identificar o aplicativo responsável pela criação, a data da última modificação e o usuário que realizou a modificação no objeto associado..
Ao utilizar a API do IfcOpenShell, a entidade IfcOwnerHistory é automaticamente criada para os objetos novos. Podemos observar a presença dos novos IfcOwnerHistory no modelo:
Através do IfcOpenShell, também é possível realizar modificações no IfcOwnerHistory, como adicionar novos usuários e aplicações, permitindo um registro preciso e rastreável das informações de autoria no modelo IFC.
Conclusão
Compreendemos a importância de separar as responsabilidades entre o projetista e o engenheiro de custos. Enquanto o projetista deve classificar o modelo de acordo com os planos de execução BIM e atribuir corretamente as classes Ifc aos elementos, é responsabilidade do engenheiro de custos elaborar o orçamento de forma especializada. Embora existam softwares de orçamentação que permitem utilizar informações de modelos BIM, muitas vezes essa informação é isolada em planilhas ou softwares específicos, dificultando a interoperabilidade entre diferentes sistemas de orçamento.
No entanto, o formato IFC oferece uma solução promissora. Por ser um formato aberto e neutro, é possível incorporar informações estruturadas diretamente no arquivo IFC. O esquema IFC possui classes específicas para custos, permitindo a composição de tabelas e a associação de informações aos objetos. Essa abordagem vai além da simples codificação, proporcionando uma estruturação de informações completa. Com essa possibilidade, podemos integrar e consolidar as informações de custos dentro do próprio arquivo IFC, facilitando a troca de dados e melhorando a colaboração entre diferentes softwares de orçamentação.
Ao unir a modelagem BIM e as informações de custos de forma integrada, podemos obter benefícios significativos, é uma oportunidade de aprimorar a colaboração entre os profissionais envolvidos no processo e impulsionar a evolução do setor da construção rumo a práticas mais eficientes e integradas.
Próximos passos:
- Explorar a implementação em escala maior dessa aplicação, utilizando modelos federados com vários arquivos interconectados.
- Estabelecer uma integração direta com um banco de dados contendo informações orçamentárias atualizadas.
Além disso, vale ressaltar que também é possível incorporar o planejamento dentro do IFC, um tema que pode ser abordado em futuros artigos.