O IFC - como funciona
- William Formigoni
- 12 de out. de 2024
- 4 min de leitura
Atualizado: 12 de dez. de 2024
Quando fui começar a estudar a fundo a especificação IFC, me deparei com cursos e os detalhes disponíveis no site da buildingsmart. Por mais que os cursos que fiz sejam bons, acredito que uma boa parte da assimilação que tive com as bases e lógicas da especificação vieram do fato de eu ter algumas habilidades de programação. Ora mas por que isso viria a ser algo relevante no BIM?
Nesse artigo pretendo expor isso, explicar como analogias de programação facilitaram meu entendimento e mesmo que pessoas que não sabem programação podem usar essas analogias para entender a estrutura de dados IFC e posteriormente manipular ela assim como manipulamos desenhos num CAD e modelos 3D num Revit.
O IFC é escrito no padrão Step Physical File Format (ISO 10303-21:2002) usando a linguagem EXPRESS. Ok isso não quer dizer muita coisa. Basicamente é um meio de codificação dos dados em formato de texto em que cada instância das entidades é escrita de forma que os atributos são estabelecidos em ordem sequenciais sem valores nomeados, ou seja, uma linha com ID e os respectivos atributos separados por vírgula, muito similar a um CSV.
Experimente abrir um IFC com o bloco de notas no seu computador e veja o que encontra.
Veja abaixo um exemplo de IFC fornecido publicamente pela Buildingsmart:


Note que cada objeto está numa linha.
Cada linha tem um ID no início #123.
Depois do sinal = aparecem os dados.
O primeiro dado é o nome da Classe do objeto.
Falaremos de classe mais adiante nesse post e mais profundamente em outro post.
Oa dados do objeto são delimitados pelos parênteses #123- IFCSITE(Dados,Aqui,Separados,Por,Vírgula)
Pronto. Isso é a estrutura de qualquer objeto num arquivo IFC. Todas palavras começam com a primeira letra em maiúsculo. O nome desse padrão é CamelCase.
No IFC tudo é objeto. Tudo.
Todo objeto tem uma classe.
Cada objeto pode ou não ter instâncias dele.
As instâncias são entidades que representam elementos do mundo real e toda instância sempre terá uma classe.
Vou dar um exemplo com animais e espécies que foi uma das formas que usei para entender classes em programação e me ajudou muito aqui também.
(espécie) Classe: IFCCao
A espécie cão tem a seguinte estrutura de dados (características padrões):
#1=IFCCao(
Cauda: verdadeiro [verdadeiro ou falso],
Patas: 4 [número inteiro],
Sexo: macho | fêmea [uma de duas opções],
Nome: qualquer nome [texto qualquer]
)
Em colchetes coloquei o tipo de dado. (Datatype do atributo ou propriedade)
Uma instância da classe IfcCao seria o cachorro Bob. Bob terá a seguinte estrutura de dados.
#123=IFCCao(
Cauda: verdadeiro,
Patas: 4,
Sexo: macho,
Nome: Bob
)
Agora do Rex:
#12345=IFCCao(
Cauda: falso - rex não tem cauda,
Patas: 4,
Sexo: macho,
Nome: Rex
)
Percebam que, ambos os cachorros são da classe IFCCao (espécie), mas são indivíduos (entidades) diferentes da mesma espécie. Todo indivíduo tem uma espécie (toda instância tem uma classe). Ambos, espécie e indivíduos, são objetos sob a ótica de dados IFC. Tudo é objeto. Classe e instâncias são ambas objetos.
A espécie (classe) IFCCao é instanciavel pois permite existir instâncias (indivíduos) com essa espécie.
Uma classe não instanciavel seria por exemplo a chuva. Não existe “uma” chuva. Chuva é usado para descrever um fenômeno.
Agora vejam, nas propriedades e atributos da classe IFCCao poderíamos incluir o atributo:
Dono [texto qualquer, opcional].
Isso faria todos os cães terem esse atributo, pois seria algo de todas as classes. Mas o que diria se o cão tem dono ou não, seria as condições específicas daquela instância (indivíduo).
Como no IFC tudo é objeto, até mesmo as relações entre objetos são objetos também. Imagine que para relacionar um IfcCao e um IfcPessoa você precise relacionar eles com outro objeto. Seria o IfcColeira por exemplo. Se atualizarmos a estrutura de dados do IfcCao para essa lógica ficaria assim:
IFCCao: (
Cauda: verdadeiro [verdadeiro ou falso],
Patas: 4 [número inteiro],
Sexo: macho | fêmea [uma de duas opções],
Nome: qualquer nome [texto qualquer],
Dono: qualquer nome [texto qualquer, opcional],
Coleira: #123456 [id do objeto do tipo IfcColeira, máximo de 1 coleira]
)
Agora veja que o atributo Coleira na classe IfcCao pede um dado que obrigatoriamente deve ser um valor que represente um objeto da classe IfcColeira, ou seja, não é permitido escrever o tipo de dado que quisermos nesse atributo, somente o id de um objeto IfcColeira.
Já o objeto IfcColeira teria uma estrutura de dados conforme o seguinte:
#123456=IfcColeira(
Cão: #123 [id de um objeto do tipo IfcCao],
Pessoa: #456 [id de um objeto do tipo IfcPessoa],
Tipo: pano | couro [somente um dos dois tipos]
)
A pessoa teria a seguinte estrutura de dados:
#456=IfcPessoa(
Nome: qualquer nome [texto qualquer],
Coleira: #123456 [id de objeto do tipo IfcColeira],
Idade: número [número positivo],
Sexo: masculino | feminino [uma de duas opções]
)
Agora veja como a relação acontece. Ambos os objetos IfcCao e IfcPessoa podem possuir instâncias e para que os dois estejam relacionados eles dependem de um objeto de relação, no caso, é o papel do objeto IfcColeira fornece essa relação. No atributo da relação, tanto cão quanto pessoa tem por obrigação ter o valor que aponte para o id de um objeto do tipo IfcColeira.
Essa é uma das melhores analogias que encontrei para compreender estruturas de dados na programação e também no IFC, que no fundo tem as bases de linguagem de programação.
Nos próximos artigos pretendo trazer mais detalhes de como o IFC funciona e facilitar a compreensão dos seus conceitos.
Comments