Voltar ao blog de BIM e IFC
Ferramentas e comparativos · 2026-06-03 · 8 min
Como ler conjuntos de propriedades IFC em Python com o IfcOpenShell
Você precisa extrair dados de propriedade de um IFC — quantidades, classificações, Psets personalizados — e colocá-los em uma planilha, um banco de dados ou uma verificação de QA. O IfcOpenShell faz isso em poucas linhas de Python. Aqui está o guia prático, incluindo o atalho get_psets que todo mundo gostaria de ter encontrado primeiro.
Como ler conjuntos de propriedades IFC em Python com o IfcOpenShell — IFC Viewer Online article cover
Mais cedo ou mais tarde, todo desenvolvedor que trabalha perto do BIM precisa extrair dados de um IFC: quantidades de elementos para um levantamento, classificações para um registro, conjuntos de propriedades personalizados para uma regra de QA. O IfcOpenShell é a biblioteca de código aberto que torna isso viável em Python. Este é o caminho prático — o jeito manual, para entender a estrutura, e o atalho de uma linha, para quando você só precisa dos dados.
Abra o arquivo e encontre os elementos
import ifcopenshell
model = ifcopenshell.open("model.ifc")
# All walls in the file
walls = model.by_type("IfcWall")
print(f"{len(walls)} walls")
# A single element by its GlobalId
el = model.by_guid("3LYa_FRDj3zhLfyYoQv6Jr")
O jeito manual (entendendo a estrutura)
Conjuntos de propriedades não ficam armazenados diretamente no elemento — eles ficam pendurados nele através de um relacionamento. O IsDefinedBy de um elemento contém relações IfcRelDefinesByProperties, cada uma apontando para um conjunto de propriedades (o RelatingPropertyDefinition). Dentro do conjunto, HasProperties lista as propriedades individuais, a maioria das quais são IfcPropertySingleValue, com um Name e um NominalValue.
wall = walls[0]
for rel in wall.IsDefinedBy:
if rel.is_a("IfcRelDefinesByProperties"):
pset = rel.RelatingPropertyDefinition
if pset.is_a("IfcPropertySet"):
print(pset.Name) # e.g. "Pset_WallCommon"
for prop in pset.HasProperties:
if prop.is_a("IfcPropertySingleValue") and prop.NominalValue:
print(f" {prop.Name} = {prop.NominalValue.wrappedValue}")
O atalho: get_psets()
Vale a pena entender a travessia manual uma vez, mas para trabalho de verdade use o utilitário: ifcopenshell.util.element.get_psets() devolve todos os conjuntos de propriedades de um elemento como um dicionário simples — os nomes dos Psets como chaves, os dicionários de propriedades como valores. É bem menos sujeito a erros do que percorrer os relacionamentos você mesmo.
import ifcopenshell.util.element as ue
psets = ue.get_psets(wall)
# {'Pset_WallCommon': {'IsExternal': True, 'FireRating': 'REI 60', 'id': 1234}, ...}
fire_rating = psets.get("Pset_WallCommon", {}).get("FireRating")
# Quantities only (areas, volumes, lengths)
qtos = ue.get_psets(wall, qtos_only=True)
Exporte todos os elementos para uma tabela
import csv
import ifcopenshell.util.element as ue
with open("elements.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["GlobalId", "Class", "Name", "Pset", "Property", "Value"])
for el in model.by_type("IfcBuildingElement"):
for pset_name, props in ue.get_psets(el).items():
for key, value in props.items():
if key == "id":
continue
writer.writerow([el.GlobalId, el.is_a(), el.Name, pset_name, key, value])
Onde a leitura termina e a visualização começa
O Python é ideal para extração em lote e QA automatizado em um pipeline. Mas quando você quer dar uma olhada rápida nos conjuntos de propriedades de um elemento específico — ou passar o arquivo para alguém que não escreve código —, um visualizador que mostra os Psets de cada elemento ao clicar é o caminho mais rápido. Os dois se complementam: automatize as verificações em massa por script, inspecione os casos de borda visualmente.
Inspecione os Psets visualmente
Abra o duplex e clique em qualquer elemento para ver seus conjuntos de propriedades completos — os mesmos dados que get_psets() devolve, sem escrever nenhum código.
IFC2x3 · 2.4 MB
Abrir o visualizador IFC interativo
Como ler conjuntos de propriedades IFC em Python com o IfcOpenShell