Código

Ler uma quantidade simples de um arquivo IFC

Use o IfcOpenShell para ler uma quantidade já armazenada num elemento — e para detectar quando o arquivo não tem nenhum conjunto de quantidades. O quantitativo derivado de geometria é outro problema.

O IFC pode carregar quantidades que alguém já armazenou num elemento (IfcElementQuantity / conjuntos Qto). Isso não é o mesmo que calcular um quantitativo a partir da geometria, e não substitui um orçamento de quantidades assinado no escritório. Este tutorial lê o que está no arquivo, converte valores relacionados a comprimento com a unidade do projeto e falha em voz alta quando a quantidade falta.

Não cole esquema EXPRESS nem tabelas com copyright da buildingSMART num notebook. Use a biblioteca e a documentação do esquema na fonte.

Detecte primeiro

O IfcOpenShell é um projeto independente de código aberto. Instale-o no seu ambiente. Este site não o empacota.

def require_ifcopenshell():
    try:
        import ifcopenshell
        import ifcopenshell.util.element as element_util
        import ifcopenshell.util.unit as unit_util
    except ImportError as exc:
        raise SystemExit(
            "IfcOpenShell is not importable in this interpreter. "
            "Install ifcopenshell in the same environment you use for BIM scripts. "
            "This tutorial does not bundle IFC tooling."
        ) from exc
    return ifcopenshell, element_util, unit_util

Pré-requisitos

  • Python 3 e IfcOpenShell importável (passo de detecção)
  • Um arquivo IFC que você exportou (este artigo não envia um modelo)
  • O hábito de conversão de unidades: um real cru de IFC não é «metros» até você aplicar a unidade do projeto

O que «uma quantidade simples» significa aqui

Lemos quantidades ligadas pelas relações habituais do IFC e expostas por ifcopenshell.util.element.get_psets(..., qtos_only=True). Nomes típicos que você pode ver em exportações IFC4 incluem conjuntos como quantidades-base de viga — se o exportador as escreveu. Muitos arquivos têm mapas Qto vazios. Isso é um resultado válido, não um bug da biblioteca.

Não fazemos:

  • triangular o sólido e integrar o volume como «a» quantidade
  • copiar tabelas de classificação nem trechos de esquema
  • inventar um volume quando o Qto falta

Implementação

Passe o caminho na linha de comando. Imprima a escala de comprimento para metros SI e depois liste cada IfcBeam (cai para IfcWall se o arquivo não tiver vigas) com seus conjuntos de quantidades.

import sys

ifcopenshell, element_util, unit_util = require_ifcopenshell()

if len(sys.argv) < 2:
    raise SystemExit("usage: python read_qto.py path/to/model.ifc")

path = sys.argv[1]
model = ifcopenshell.open(path)

length_to_si = unit_util.calculate_unit_scale(model)
print(f"project length unit → metres, scale = {length_to_si}")

products = model.by_type("IfcBeam") or model.by_type("IfcWall")
if not products:
    raise SystemExit("no IfcBeam or IfcWall in this file")

missing_qto = 0
for product in products[:20]:
    name = product.Name or "(unnamed)"
    gid = product.GlobalId
    qtos = element_util.get_psets(product, qtos_only=True) or {}
    print(f"{gid}  {name}")
    if not qtos:
        missing_qto += 1
        print("  (no quantity sets)")
        continue
    for qset_name, values in qtos.items():
        print(f"  {qset_name}:")
        for key, raw in values.items():
            if key == "id":
                continue
            print(f"    {key} = {raw!r}")

print(f"elements inspected = {min(len(products), 20)}")
print(f"elements with no Qto = {missing_qto}")

Se você precisa de um comprimento em metros e o valor está armazenado como um real de comprimento do projeto, multiplique por length_to_si. Área e volume precisam da escala à segunda e terceira potência. Aplicar a escala de comprimento uma só vez a um volume é um erro de unidades — a mesma família de misturar mm e m num script de viga.

get_psets também devolve conjuntos de propriedades que não são quantidades. Este script pede qtos_only=True para você não tratar um IfcPropertySingleValue com nome de quantidade como um Qto.

Validação

  1. Rode o script num arquivo que você sabe que tem Qto (sua própria exportação com quantidades ativadas) e num que não tem. A segunda corrida deveria reportar Qto faltando, não um número fabricado.
  2. Confrontar calculate_unit_scale com a unidade de comprimento do projeto que você definiu na ferramenta de autoria (metros versus milímetros é a bifurcação habitual). Se a ferramenta disse milímetros e a escala não é 1e-3, pare e inspecione IfcUnitAssignment.
  3. Escolha um elemento. Compare o volume ou o comprimento impressos com a mesma quantidade na interface nativa BIM. Se discordarem, não acredite em nenhum às cegas: os exportadores remapear nomes, omitem Qto ou guardam valores derivados de geometria sob outro conjunto.
  4. Confirme que você não multiplicou um volume por length_to_si só uma vez. Um descompasso de 1e3 ou 1e9 é quase sempre o expoente da escala de unidades.

Erros comuns

  • Assumir que todo arquivo IFC4 tem Qto_*BaseQuantities. Muitos modelos de coordenação as omitem.
  • Tratar NetVolume do software A como comparável a GrossVolume do software B sem ler os dois nomes.
  • Usar o volume da caixa envolvente de geometria como substituto quando o Qto falta, e depois rotulá-lo como quantidade IFC.
  • Abrir o arquivo com um IfcOpenShell diferente do que você testou — os helpers de esquema mudam entre versões maiores.

Limitações

  • Isto é uma leitura de quantidades armazenadas. Não é um motor de quantitativo, não é uma cascata de custos e não é uma afirmação de que a quantidade IFC coincida com as regras de medição de obra.
  • Unidades de área e volume devem seguir as dimensões da unidade do projeto. Alguns arquivos misturam comprimento SI com área não SI; inspecione as unidades em vez de assumir uma só escala.
  • Tipos de elemento, nomes Qto e diferenças IFC2x3 versus IFC4 são maiores do que esta página. A documentação oficial do esquema está na buildingSMART. Não extraia texto de esquema com copyright para o artigo.
  • ifcopenshell.open deve receber um caminho que você tem permissão de ler. Este tutorial não baixa modelos.

Contexto profissional

Uma quantidade no IFC é evidência do que o exportador escreveu, não do que foi construído. Para medição contratual, as regras vigentes, o método de medição e o registro assinado vivem fora do arquivo. Use este script para ver a carga útil, e depois valide contra o modelo nativo e o procedimento do escritório.

Referências

  • Documentação do IfcOpenShell e helpers util.element / util.unit. https://docs.ifcopenshell.org/
  • buildingSMART International. Documentação de esquema IFC e de conjuntos de quantidades (leia na fonte; não reproduza tabelas aqui).
  • Armadilhas de escala de unidades: o tutorial companheiro unit-conversion-pitfalls-civil-scripts.