IFC e a Interoperabilidade de Custos
44
0

IFC e a Interoperabilidade de Custos

#0027: Quantas horas e milhões são gastos em integrações de sistemas de ERP, base de custos e soluções complexas para que o custo de mudança posterior seja tão grande que se torna inviável adotar novas tecnologias e lidar com o legado de base?

Tiago Ricotta
9 min
44
0

#0027: Quantas horas e milhões são gastos em integrações de sistemas de ERP, base de custos e soluções complexas para que o custo de mudança posterior seja tão grande que se torna inviável adotar novas tecnologias e lidar com o legado de base?

Show me the Money (1/7)

Aviso de antemão que este será o artigo mais técnico já escrito neste canal, aparentemente este tipo de conteúdo está agradando bastante, então vamos produzir mais.

Depois de ver tanta coisa nessa vida diria que, ao fundar uma construtora, uma das decisões mais importantes da vida da empresa é escolher o que vai ser utilizado para fazer os orçamentos, afinal, isso faz parte da alma da empresa e pelo vamos que vamos do mercado a coisa começa em um Excel e termina em um emaranhado de soluções ao sabor do time de orçamentistas de empresa.

Se for para lidar com legado de orçamentos e transferir bases de custos de um sistema para o outro é melhor nem modernizar as coisas pois o custo de mudança e o risco são altos demais para isto.

Contudo, e se fosse possível fazer essas migrações de uma forma mais suave? E se fosse possível usar um padrão neutro como o IFC para isto, seria possível?

Diante disso, o que me intrigou nas últimas semanas foi a imagem da BuildingSMART dentro da classe IfcCostItem em que seria possível escrever dentro do IFC um orçamento de maneira bem completa, a saber:

A imagem diz respeito a uma composição de custo simples de concretagem de alguma coisa que vou chamar de Pilar, a composição total é feita da soma entre o custo de material e mão de obra para a forma e a mesma coisa para o concreto, como nem no IFC a gente deixa de pagar imposto, esta lá o imposto também para incidir no coitado do exemplo.

Tentando buscar por exemplos e ver como isso funcionaria a coisa foi um pouco ingrata basicamente porque não existem exemplos, material ou um IFC para abrir e analisar o que está sendo proposto.

Sendo assim, como não estava entendendo o que a BuildingSMART estava dizendo e tão pouco estava respondendo ao meu questionamento de usar o IFC para trocar informações entre soluções de orçamento, bom... já sabem.. na falta de um exemplo vamos criar um, uai.

A princípio a coisa era para ser bem simples, a documentação fala bastante sobre como tudo deveria funcionar, mas é intrigante, para dizer o mínimo, que ao final do exercício tenha-se que fazer um processo que dependa de um software imaginário para completar o quebra-cabeças e ir dormir tranquilo no travesseiro.

Vamos construir então uma base de custo no IFC novamente na mão usando um notepad.

IfcCostItem (2/7)

Um IfcCostItem descreve um custo ou valor financeiro junto com informações descritivas que descrevem seu contexto de uma forma que permite que seja usado dentro de uma programação de custos. Um IfcCostItem pode ser usado para representar o custo de bens e serviços, a execução de obras por processo, o custo do ciclo de vida e muito mais.

O IfcCostItem é quem vai fazer o trabalho sujo de guardar o resultado de uma composição de custo, ou seja, o custo de mão de obra, de materiais e um dado muito, mas muito importante para o entendimento do processo: a quantidade.

Particularmente a forma que usei para entender como redigir um código que seguisse a imagem da BuildingSMART foi decompor a imagem em linhas de STEP, sendo assim, a imagem fala que existe um IfcCostItem chamado ‘Total’  tem aninhado outros dois IfcCostItem chamados ‘Forms’ e ‘Concrete’.

No meu exercício eu criei um cubo no SketchUp e exportei para o IFC 4 e fui adicionando a informação que precisava. Sendo assim, o código começou a tomar forma:

#104= IFCCOSTITEM('3lO5555MHCcfnaGSxZBGm9',#5,'Total','Total Value',$,'2-1-10',$,(#105),$);
#106= IFCRELNESTS('3lO6666MHCcfnaGSxZBGm9',#5,$,$,#104,(#107,#111));
#117= IFCRELASSIGNSTOCONTROL('1A45555MHCasnaGSxZ1245',#5,'Composicao de custo','Composicao de custo de paredes',(#69,#84),$,#104);
#107= IFCCOSTITEM('3l15555MHC58naGSxZ1245',#5,'Forms','Forms to Concrete',$,'2-1-10-01',$,(#109,#110),#126);
#111= IFCCOSTITEM('3lO5555MHCasnaGSxZ1245',#5,'Concrete','Material Concrete',$,'2-1-10-02',$,(#113,#114),#128);

Para acompanharem o raciocínio, visualmente foi isto o que fiz:

Fonte: editado pelo autor (yay)
Fonte: editado pelo autor (yay)

O problema disto tudo é que são só linhas sem nenhuma informação, é como se tivesse criado uma coluna de total* para composição no Excel, mas precisamos criar as colunas de quantidade, mão de obra e material.

*no final do dia o IfcCostItem vai armazenar o valor do IfcCostValue e as quantidades, você pode criar as linhas e ir aninhando os IfcCostItem para chegar na composição que você quer, neste asterisco eu entendo que ele funciona como uma coluna de total, mas nem sempre vai ser este o caso.

IfcCostValue (3/7)

IfcCostValue é uma quantia em dinheiro ou um valor que afeta uma quantia em dinheiro. Cada instância de IfcCostValue também pode ter uma categoria. Existem muitos tipos possíveis de valor de custo que podem ser identificados.

Esse menininho chamado IfcCostValue é quem vai armazenar as informações de valores referentes aos custos de material, mão de obra ou qualquer outra coisa que venha a fazer parte da sua composição, exatamente como colunas em um Excel de composição de custos e assim como uma coluna na composição de custos teremos a informação como ela é (o custo de algo) e uma coluna que vem a ser o resultado de uma operação aritmética, ou seja, uma soma, multiplicação ou uma fórmula mais complexa.

Então o que precisamos fazer para gerar o exemplo da BuildingSMART é declarar os valores de material e mão de obra:

#109= IFCCOSTVALUE('Material Forma','Descricao do material Forma',IFCREAL(3.),$,$,$,'Material',$,$,$);
#110= IFCCOSTVALUE('Mao de Obra Forma','Descricao da Mao de Obra Forma',IFCREAL(2),$,$,$,'Labor',$,$,$);
#113= IFCCOSTVALUE('Material Concreto','Descricao do material Concreto',IFCREAL(118),$,$,$,'Material',$,$,$);
#114= IFCCOSTVALUE('Mao de Obra Concreto','Descricao da Mao de Obra Concreto',IFCREAL(2),$,$,$,'Labor',$,$,$);

Visualmente foi isto que acrescentamos aos IfcCostItem originais:

Fonte: editado pelo autor (ha!)
Fonte: editado pelo autor (ha!)

Reparem nos valores IFCREAL dentro das linhas de código, eles são os valores correspondentes ao material da forma (IFCREAL(3)), material de concreto (IFCREAL(118)), mão de obra de forma (IFCREAL(2)) e mão de obra de concreto (IFCREAL(2)). Esses valores são a terceira informação do IfcCostValue, o IfcAppliedValueSelect, é o valor de fato da mão de obra, do material, etc.

Dito isto, da onde vem a quantidade?

IfcElementQuantity (4/7)

Confesso que a parte mais legal de fazer esse exercício foi quando me deparei com a descoberta do local no qual estariam armazenadas as quantidades dos elementos e aqui entra uma importância absurda dos softwares de modelagem exportarem essa informação da maneira correta.

Na estrutura do IFC esta classe IfcElementQuantity define um conjunto de medidas derivadas da propriedade física de um elemento, esta classe vai agrupar as informações provenientes dos BaseQuantities da vida como de uma porta. (https://standards.buildingsmart.org/IFC/RELEASE/IFC4/ADD2/HTML/)

Ao cair a ficha deste entendimento ficou fácil de escrever as coisas depois, pois a lógica na programação é a de escrever um PropertySet normal e criar a relação de propriedade entre o PropertySet e o objeto, assim ó:

#69= IFCWALL('2oQqckgNXEz8lpIMpTCH1P',#5,'Parede 1',$,$,#35,#68,$,.NOTDEFINED.);
#84= IFCWALL('3oQqckgNXEz8lpIMpTCH14',#5,'Parede',$,$,#85,#68,$,.NOTDEFINED.);
#118= IFCRELDEFINESBYPROPERTIES('1mCM2CLk1234561A4f3Au7',#5,$,$,(#69,#84),#119);
#119= IFCELEMENTQUANTITY('3lONcXOMHCcfnaGSxZBGm9',#5,'Qto_WallBaseQuantities',$,$,(#121,#122,#123,#124,#125,#126,#127,#128,#129,#130,#131));
#121= IFCQUANTITYLENGTH('Length',$,$,IFCLENGTHMEASURE(50),$);
#122= IFCQUANTITYLENGTH('Width',$,$,IFCLENGTHMEASURE(50),$);
#123= IFCQUANTITYLENGTH('Height',$,$,IFCLENGTHMEASURE(50),$);
#124= IFCQUANTITYAREA('GrossFootprintArea',$,$,IFCAREAMEASURE(3000),$);
#125= IFCQUANTITYAREA('NetFootprintArea',$,$,IFCAREAMEASURE(3000),$);
#126= IFCQUANTITYAREA('GrossSideArea',$,$,IFCAREAMEASURE(3000),$);
#127= IFCQUANTITYAREA('NetSideArea',$,$,IFCAREAMEASURE(3000),$);
#128= IFCQUANTITYVOLUME('GrossVolume',$,$,IFCVOLUMEMEASURE(100),$);
#129= IFCQUANTITYVOLUME('NetVolume',$,$,IFCVOLUMEMEASURE(100),$);
#130= IFCQUANTITYWEIGHT('GrossWeight',$,$,IFCMASSMEASURE(100),$);
#131= IFCQUANTITYWEIGHT('NetWeight',$,$,IFCMASSMEASURE(100),$);

Os BaseQuantities são formados pelos IfcQuanity da vida como o ifcQuantityWeight, IfcQuantityArea, IfcQuantityVolume, etc, logo, não adianta muito o software de modelagem exportar essa informação através de um IfcPropertySet e colocar os valores todos como IfcPropertySingleValue, ao fazer isto está fora da documentação.

Pode parecer um preciosismo, mas isto é uma questão de conseguir ler ou não aquela informação que você está passando para frente.

Visualmente o resultado foi este acréscimo de informação:

Fonte: editado pelo autor
Fonte: editado pelo autor

IfcCostValue calculado (5/7)

Uma coluna que vem a ser o resultado de uma operação aritmética, ou seja, uma soma, multiplicação ou uma fórmula mais complexa.

Lembram desse detalhe? Ele pode ter passado desapercebido, mas quem faz a mágica da multiplicação (e outras operações matemáticas) é o IfcCostValue, o IfcCostItem vai simplesmente mostrar o valor calculado do IfcCostValue.

Sendo assim, como a coisa funciona? Cara, aqui tem que acompanhar o raciocínio com calma para não se perder. Lembram que declaramos os valores de custo de mão de obra e custo de material?

#109= IFCCOSTVALUE('Material Forma','Descricao do material Forma',IFCREAL(3.),$,$,$,'Material',$,$,$);
#110= IFCCOSTVALUE('Mao de Obra Forma','Descricao da Mao de Obra Forma',IFCREAL(2),$,$,$,'Labor',$,$,$);
#113= IFCCOSTVALUE('Material Concreto','Descricao do material Concreto',IFCREAL(118),$,$,$,'Material',$,$,$);
#114= IFCCOSTVALUE('Mao de Obra Concreto','Descricao da Mao de Obra Concreto',IFCREAL(2),$,$,$,'Labor',$,$,$);

Lembram do IfcAppliedValueSelect da vida? Então, com os valores contidos neles podemos fazer outro IfcCostValue que terá o IfcAppliedValueSelect resultante do cálculo de outros IfcCostValue, a operação aritmética vem da nona informação da classe e é dita pelo IfcArithmeticOperatorEnum (ADD, DIVIDE, MULTIPLY, SUBTRACT).

Para calcular o custo (soma mão de obra + material):

#109= IFCCOSTVALUE('Material Forma','Descricao do material Forma',IFCREAL(3.),$,$,$,'Material',$,$,$);
#110= IFCCOSTVALUE('Mao de Obra Forma','Descricao da Mao de Obra Forma',IFCREAL(2),$,$,$,'Labor',$,$,$);
#132= IFCCOSTVALUE('Custo Forma','Custo Forma',IFCREAL(5),$,$,$,'Material',$,.ADD.,(#109,#110));
#113= IFCCOSTVALUE('Material Concreto','Descricao do material Concreto',IFCREAL(118),$,$,$,'Material',$,$,$);
#114= IFCCOSTVALUE('Mao de Obra Concreto','Descricao da Mao de Obra Concreto',IFCREAL(2),$,$,$,'Labor',$,$,$);
#133= IFCCOSTVALUE('Custo Concreto','Sub Concreto',IFCREAL(120),$,$,$,'Material',$,.ADD.,(#113,#114));

Agora que temos o custo de material + mão de obra bastaria multiplicar pela quantidade, certo? Pois bem, aqui foi o ponto que eu não dormi uns dias: a quantidade está no IfcQuantityArea / IfcQuantityVolume que está lá parede e aí entra um problema na minha lógica.

O problema está no fato de que eu não consigo armazenar um IfcQuantityArea / IfcQuantityVolume em um IfcCostValue para fazer o cálculo, em termos de rastreabilidade das coisas eu gostaria que isso fosse possível. Qual a solução então? Criar um IfcCostValue que armazena a informação do IfcQuantityArea / IfcQuantityVolume e registra essa informação na descrição.

Erro do IfcQuantityArea sendo aplicado como IfcAppliedValueSelect
Erro do IfcQuantityArea sendo aplicado como IfcAppliedValueSelect

Lendo a descrição do IfcAppliedValueSelect (The extent or quantity or amount of an applied value) não está de todo o mal, mas o melhor mesmo seria poder referenciar a informação diretamente do elemento e não ter que fazer uma manobra para tal fato.

Pode ser que exista outra forma de fazer e não encontrei? Pode sim, com certeza, mas vamos desta forma e estou dormindo tranquilo assim. Enfim, a coisa funciona, vamos seguir:

#140= IFCCOSTVALUE('Area da Forma','Valor do IfcQuantityVolume #128',IFCREAL(3000),$,$,$,'Material',$,$,$);
#141= IFCCOSTVALUE('Volume de Concreto','Valor do IfcQuantityVolume #128',IFCREAL(100),$,$,$,'Material',$,$,$);
#134= IFCCOSTVALUE('Subtotal Concreto','Custo Concreto',IFCREAL(12000),$,$,$,'Material',$,.Multiply.,(#133,#141));
#135= IFCCOSTVALUE('Subtotal Forma','Sub forma',IFCREAL(15000),$,$,$,'Material',$,.Multiply.,(#132,#140));

Visualmente, foi isto o que acrescentamos:

Fonte: editado pelo autor
Fonte: editado pelo autor

Ok, temos quase tudo pronto, como fechamos o custo total com impostos?

Imposto é roubo (6/7)

Seguindo a lógica da coisa, agora basta criar um IfcCostValue que vai armazenar o imposto, outro que vai ser a soma dos custos de material de forma e outro de concreto (somar os dois depois), multiplicar o IfcCostValue da taxa do imposto com o IfcCostValue do total do custo de material resultando em um novo IfcCostValue com o valor do imposto e assim somar com o IfcCostValue resultante do subtotal de custo de forma e de concreto antes das taxas e tudo certo.

Ufa. Vamos lá:

#109= IFCCOSTVALUE('Material Forma','Descricao do material Forma',IFCREAL(3.),$,$,$,'Material',$,$,$);
#140= IFCCOSTVALUE('Area da Forma','Valor do IfcQuantityVolume #128',IFCREAL(3000),$,$,$,'Material',$,$,$);
#136= IFCCOSTVALUE('Material Forma','Custo Material Concreto',IFCREAL(9000),$,$,$,'Material',$,.Multiply.,(#109,#140));
#113= IFCCOSTVALUE('Material Concreto','Descricao do material Concreto',IFCREAL(118),$,$,$,'Material',$,$,$);
#141= IFCCOSTVALUE('Volume de Concreto','Valor do IfcQuantityVolume #128',IFCREAL(100),$,$,$,'Material',$,$,$);
#137= IFCCOSTVALUE('Material Concreto','Custo Material forma',IFCREAL(11800),$,$,$,'Material',$,.Multiply.,(#113,#141));
#116= IFCCOSTVALUE('Tax de Material','Descricao do Tax do material Concreto',IFCREAL(0.1),$,$,$,'Null',$,$,$);
#115= IFCCOSTVALUE('Subtotal de Material','Descricao do subtotal do material Concreto',IFCREAL(20800),$,$,$,'Material',$,.ADD.,(#136,#137));
#139= IFCCOSTVALUE('Tax','Total de Imposto',IFCREAL(2080),$,$,$,'Imposto',$,.Multiply.,(#115,#116));
#138= IFCCOSTVALUE('Total before tax','Total before tax',IFCREAL(27000),$,$,$,'Servico',$,.ADD.,(#134,#135));
#105= IFCCOSTVALUE('Valor Total','Representacao do valor total',IFCREAL(29080),$,$,$,'Purchase',$,.ADD.,(#138,#139));
#104= IFCCOSTITEM('3lO5555MHCcfnaGSxZBGm9',#5,'Total','Total Value',$,'2-1-10',$,(#105),$);

Com tudo isto feito, chegamos ao final do exercício, visualmente completamos tudo:

Claro que existem ainda outras coisas que poderiam ser exploradas como o IfcCostSchedule ou brincar de cotação de dólar com o IfcCurrencyRelationship, mas para fins didáticos e de aprendizado já foi um puta exercício.

Processo de Aprendizagem (7/7)

Algum dia na minha vida eu vou utilizar este conhecimento em algum fluxo de trabalho? Espero que sim, mas só de exercitar e ver esta possibilidade na prática já abre milhões de ideias na cabeça.

Até para facilitar o entendimento, criei o seguinte modelo que creio fica um pouco melhor para entender os relacionamentos:

Fonte: Autor
Fonte: Autor

Se a imagem ficar muito pequena ela pode ser acessada aqui ou me pinguem que envio ela para vocês estudarem e entenderem o que fizemos.

Espero que tenham gostado da publicação, se este for o caso peço um call to action de vocês, registrem-se no canal para não perder o material futuro e compartilhem este conteúdo para continuarmos a boa conversa que temos tido 😊

Seguir meu Canal
Compartilhar conteúdo

Obrigado,

Abs.

Tiago Ricotta

Publicado em 20 de Outubro de 2021 às 15:18