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
- 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.
- Confrontar
calculate_unit_scalecom 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 inspecioneIfcUnitAssignment. - 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.
- Confirme que você não multiplicou um volume por
length_to_sisó 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
NetVolumedo software A como comparável aGrossVolumedo 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.opendeve 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.