
IFC 파일은 형상만 담는 그릇이 아니다. 벽 한 장의 면적, 슬래브의 부피, 문의 개수 같은 수량 정보가 요소마다 함께 들어 있다. 이 값을 읽어내면 Revit이나 ArchiCAD 같은 상용 저작도구를 띄우지 않고도, 파일 하나만으로 물량표를 만들고 납품된 모델을 교차 검증할 수 있다. 이 과정을 자동화하는 표준 도구가 파이썬 라이브러리 IfcOpenShell이다. 여기서는 설치부터 요소 순회, 수량 추출, Pandas 집계, CSV 저장까지 실제 코드로 이어서 다룬다. 기준은 2025년 기준 안정 버전인 IfcOpenShell 0.8 계열이다.
■ 설치와 첫 실행
0.7 시절에는 conda나 수동 바이너리 배치가 필요했지만, 0.8부터는 pip 휠(wheel)이 배포되어 설치가 간단해졌다. 파이썬 3.9 이상 환경에서 다음 한 줄이면 된다.
pip install ifcopenshell pandas
설치가 끝나면 파일을 열고 종류별로 요소를 뽑는 것이 모든 작업의 출발점이다. open()으로 모델을 읽고, by_type()으로 원하는 클래스의 인스턴스를 리스트로 받는다.
import ifcopenshell
model = ifcopenshell.open("sample.ifc")
print("스키마:", model.schema) # IFC2X3 / IFC4 / IFC4X3
walls = model.by_type("IfcWall")
print("벽 개수:", len(walls))
■ 수량이 저장되는 구조
IFC에서 수량은 IfcElementQuantity라는 수량세트(Quantity Set) 안에 담긴다. 각 요소는 IsDefinedBy 관계를 따라 이 수량세트와 연결되고, 그 안에 아래 여섯 종류의 수량 항목이 들어간다. 어떤 값이 어느 항목으로 저장되는지 알아야 코드에서 정확한 키를 집을 수 있다.
| 수량 항목 | 의미 | 대표 예시 |
|---|---|---|
| IfcQuantityLength | 길이 | 벽 높이, 보 길이 |
| IfcQuantityArea | 면적 | 벽 측면적(NetSideArea), 슬래브 상부면적 |
| IfcQuantityVolume | 부피 | 콘크리트 물량(NetVolume) |
| IfcQuantityWeight | 무게 | 철골 중량 |
| IfcQuantityCount | 개수 | 문, 창, 기둥 수량 |
| IfcQuantityTime | 시간 | 공정 소요 시간 |
표준 수량세트의 이름은 요소 종류마다 정해져 있다. 벽은 Qto_WallBaseQuantities, 슬래브는 Qto_SlabBaseQuantities, 기둥은 Qto_ColumnBaseQuantities 식이다. 이 이름을 알아두면 원하는 값에 곧장 접근할 수 있다.
■ get_psets로 한 번에 꺼내기
관계를 손으로 따라가는 대신, ifcopenshell.util.element 모듈의 헬퍼를 쓰면 속성세트와 수량세트를 딕셔너리로 한 번에 받는다. qtos_only=True를 주면 수량만 걸러준다.
import ifcopenshell.util.element as ue
w = walls[0]
qtos = ue.get_psets(w, qtos_only=True)
# {'Qto_WallBaseQuantities': {'Length': 4000.0, 'NetVolume': 0.96,
# 'NetSideArea': 9.6, 'Height': 2800.0, ...}}
# 특정 값만 바로 집기
vol = ue.get_pset(w, "Qto_WallBaseQuantities", "NetVolume")
print("벽 부피(m³):", vol)
■ 수량이 없을 때 — 형상에서 직접 계산
내보내는 쪽에서 수량 내보내기를 켜지 않았다면 IfcElementQuantity 자체가 비어 있다. 이때는 형상을 직접 처리해 부피와 면적을 계산할 수 있다. ifcopenshell.geom으로 삼각망을 만든 뒤 ifcopenshell.util.shape의 함수를 쓴다.
import ifcopenshell.geom
import ifcopenshell.util.shape as ush
settings = ifcopenshell.geom.settings()
shape = ifcopenshell.geom.create_shape(settings, walls[0])
geom = shape.geometry
print("부피(m³):", ush.get_volume(geom))
print("표면적(m²):", ush.get_area(geom))
주의할 점은 이렇게 계산한 값은 형상 그대로의 값이라, 개구부를 뺀 순수량과 다를 수 있다는 것이다. 저작도구가 넣어준 Qto_ 값이 있으면 그쪽을 우선하고, 없을 때만 형상 계산으로 보완하는 것이 실무 순서다.

■ Pandas로 집계하고 CSV로 내보내기
요소를 순회하며 값을 리스트에 모은 뒤 DataFrame으로 만들면, 종류별 합계·평균 같은 집계가 한 줄로 끝난다. 아래는 벽 전체를 돌며 부피와 면적을 모아 층별로 집계하고 CSV로 저장하는 전체 흐름이다.
import ifcopenshell
import ifcopenshell.util.element as ue
import pandas as pd
model = ifcopenshell.open("sample.ifc")
rows = []
for w in model.by_type("IfcWall"):
q = ue.get_psets(w, qtos_only=True).get("Qto_WallBaseQuantities", {})
storey = ue.get_container(w) # 소속 층
rows.append({
"GlobalId": w.GlobalId,
"Name": w.Name,
"Storey": storey.Name if storey else None,
"Volume_m3": q.get("NetVolume"),
"Area_m2": q.get("NetSideArea"),
})
df = pd.DataFrame(rows)
# 층별 콘크리트 물량 집계
summary = df.groupby("Storey")["Volume_m3"].sum().round(2)
print(summary)
df.to_csv("wall_quantities.csv", index=False, encoding="utf-8-sig")
encoding="utf-8-sig"를 지정하면 한글이 깨지지 않고 엑셀에서 바로 열린다. 이 스크립트 하나로 상용 물량 산출 프로그램의 기본 기능을 대체할 수 있고, 대량의 모델을 반복 처리할 때 특히 강력하다.

■ 눈여겨볼 것
IFC의 수량은 표준이 정확성을 보장해 주지 않는다. 값 자체는 원본 소프트웨어가 계산해 그대로 옮긴 것이라, 개구부를 뺀 순면적인지 총면적인지 같은 산출 기준이 파일마다 다를 수 있다. 따라서 물량 검증 업무라면 모델을 받기 전에 내보내기 설정(기본 수량 포함 여부, 개구부 처리 기준)을 발주자와 합의해 두는 것이 코드보다 먼저다. 성능 측면에서는 by_type()을 반복 호출하지 말고 한 번 읽어 리스트로 담아 재사용하는 것이 수만 개 요소 모델에서 큰 차이를 만든다.
■ 이런 분께 도움이 됩니다
- BIM 물량 산출 담당자 — 상용 툴 없이 받은 모델의 수량을 교차 검증하고 CSV로 뽑아 견적에 바로 쓸 수 있다
- 파이썬을 쓰는 건설 엔지니어 — IFC는 파이썬으로 다루기 가장 쉬운 건설 데이터 포맷이고, 반복 물량 작업을 스크립트로 자동화할 수 있다
- 발주처 검수 담당자 — 납품된 IFC가 요구한 수량 정보를 실제로 담고 있는지 파일만으로 확인할 수 있다
■ 참고
공식 문서는 docs.ifcopenshell.org의 util.element·util.shape API 페이지에서 확인할 수 있다. 수량세트 이름과 항목 키는 IFC 스키마 버전(IFC2X3 vs IFC4)에 따라 조금씩 다르므로, 스크립트 첫머리에서 model.schema를 찍어 확인한 뒤 키를 맞추는 습관이 안전하다.
공식 참고 자료 및 적용 범위
이 글은 IfcOpenShell을 이용한 IFC 물량 추출의 기본 흐름을 설명합니다. 추출 대상·단위·수량 값은 IFC 스키마, 작성 모델의 속성 품질, 도구 버전 및 산출 규칙에 따라 달라질 수 있습니다.
아래 자료는 확인일 기준의 제조사·표준기구 또는 공공기관 공식 문서입니다. 제품 기능·표준·정책은 개정될 수 있으므로 실제 프로젝트 적용 전에는 사용 중인 버전의 최신 원문과 프로젝트 기준을 확인하세요.
확인일: 2026-08-15




