업데이트 2026년 10월 15일읽는 시간 약 6분

IFC 파일은 형상만 담는 그릇이 아니다. 벽 한 장의 면적, 슬래브의 부피, 문의 개수 같은 수량 정보가 요소마다 함께 들어 있다. 이 값을 읽어내면 Revit이나 ArchiCAD 같은 상용 저작도구를 띄우지 않고도, 파일 하나만으로 물량표를 만들고 납품된 모델을 교차 검증할 수 있다. 이 과정을 자동화하는 표준 도구가 파이썬 라이브러리 IfcOpenShell이다. 예제 코드는 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에 담긴 수량은 원본 소프트웨어가 계산한 값을 옮긴 것이어서, 개구부를 뺀 순면적인지 총면적인지 같은 기준이 파일마다 다를 수 있다. 물량 검증이 목적이라면 모델을 받기 전에 내보내기 설정(기본 수량 포함 여부, 개구부 처리 기준)을 발주자와 합의해 두어야 한다. 수량세트 이름과 항목 키도 IFC2X3와 IFC4에서 다르므로 model.schema를 먼저 확인하고 키를 맞춘다.
요소 수만 개 규모의 모델에서는 by_type()을 반복 호출하지 말고 한 번 읽은 리스트를 재사용해야 처리 시간이 줄어든다. API는 docs.ifcopenshell.org의 util.element·util.shape 페이지에서 확인할 수 있다.
참고 문헌
자주 묻는 질문
IFC 파일만으로 물량을 뽑을 수 있나요?
뽑을 수 있습니다. IFC에는 벽 면적, 슬래브 부피, 문 개수 같은 수량 정보가 요소마다 들어 있어, IfcOpenShell로 읽으면 Revit이나 ArchiCAD를 띄우지 않고도 물량표를 만들고 납품된 모델을 교차 검증할 수 있습니다.
IFC에서 수량 정보는 어디에 저장되나요?
IfcElementQuantity라는 수량세트 안에 담깁니다. 각 요소는 IsDefinedBy 관계로 수량세트와 연결되며, 표준 수량세트 이름은 벽이 Qto_WallBaseQuantities, 슬래브가 Qto_SlabBaseQuantities 식으로 요소 종류마다 정해져 있습니다.
IFC에 수량 값이 비어 있으면 어떻게 해야 하나요?
형상에서 직접 계산할 수 있습니다. ifcopenshell.geom으로 삼각망을 만든 뒤 ifcopenshell.util.shape의 함수로 부피와 면적을 구합니다. 다만 형상 그대로의 값이라 개구부를 뺀 순수량과 다를 수 있어, Qto_ 값이 있으면 그쪽을 우선합니다.
CSV로 내보낼 때 한글이 깨지지 않게 하려면 어떻게 하나요?
encoding을 utf-8-sig로 지정하면 됩니다. 요소를 순회하며 모은 값을 Pandas DataFrame으로 만든 뒤 to_csv로 저장할 때 이 옵션을 주면 한글이 깨지지 않고 엑셀에서 바로 열립니다.







