IFC to OpenUSD 변환, Qdrant 벡터 DB 속성 관리, 조경 수목 분석 대시보드 구축
BIM 기반 조경 설계에서 IFC 속성정보를 OpenUSD 및 벡터 DB로 관리하고, AI 기반 설계 검증과 자연어 질의를 가능하게 하는 통합 파이프라인을 구축한다.
| Layer | 역할 | 기술 |
|---|---|---|
| Layer 1 | 데이터 소스 | IFC 2x3/4.3, IFC 5 (JSON), Point Cloud, Revit |
| Layer 2 | 파싱 및 변환 | IfcOpenShell, IFC-USD Mapper, Property Embedder |
| Layer 3 | 이중 저장소 | OpenUSD Scene Graph + Qdrant Vector DB |
| Layer 4 | AI 엔진 | RAG Retriever + LLM Multi-Agent + Generative Design |
| Layer 5 | 출력 | USD-IFC Export, 3D Viz, Design Review, Digital Twin |
ifc_guid와 usd_prim_path로 양방향 연결conda create -n bim-ai python=3.12 -y
conda activate bim-ai
pip install usd-core ifcopenshell qdrant-client streamlit plotly pandas
| 패키지 | 버전 | 역할 |
|---|---|---|
| usd-core | 26.3 | OpenUSD Python 바인딩 (pxr) |
| ifcopenshell | 0.8.4 | IFC 파싱, geometry 변환 |
| qdrant-client | latest | Qdrant 벡터 DB 클라이언트 |
| streamlit | latest | 웹 대시보드 |
| plotly | latest | 인터랙티브 차트 |
| pandas | latest | 데이터 테이블 처리 |
docker run -d -p 6334:6333 --name qdrant_bim qdrant/qdrant
기존 qdrant_storage(6333)와 분리하여 6334 포트로 운영.
IFC 파일에서 요소별 geometry를 추출하여 USD Scene Graph로 매핑한다.
처리 흐름:
ifcopenshell.geom.create_shape()으로 geometry를 triangulated mesh로 변환bim: 네임스페이스 커스텀 속성 (ifcClass, guid, propertySets)| IFC 엔티티 | USD 대응 |
|---|---|
| IfcProject | Stage root |
| IfcSite | /BIM/Site Xform |
| IfcBuilding | /BIM/Site/Building Xform |
| IfcBuildingStorey | …/Storey Xform |
| IfcWall, IfcSlab 등 | Mesh + MaterialBinding |
| IfcPropertySet | bim: namespace attribute |
| IfcGlobalId | bim:guid attribute |
USDA 미리보기 출력 시 Windows cp949 인코딩 충돌 발생. 수정:
with open(usd_path, "r", encoding="utf-8") as f:
USDZ는 Apple AR Quick Look용 패키지 포맷. 기존 변환 로직에 PBR 머티리얼과 USDZ 패키징을 추가.
추가 사항:
UsdUtils.CreateNewUsdzPackage()로 USDZ 패키징Vision Pro에서 머티리얼이 적용되지 않는 문제 발생. Apply 호출 필요:
# 수정 전
UsdShade.MaterialBindingAPI(mesh.GetPrim()).Bind(mat)
# 수정 후
binding = UsdShade.MaterialBindingAPI.Apply(mesh.GetPrim())
binding.Bind(mat)
iPad에서 USDZ 열었을 때 흰 화면만 보이는 문제. AR Quick Look은 Y-up, 센티미터 기준:
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y)
UsdGeom.SetStageMetersPerUnit(stage, 0.01)
USDZ는 데스크탑 브라우저에서 직접 렌더링 불가. model-viewer(Google)는 데스크탑에서 GLB만 지원한다. 웹 3D 표준은 GLB/glTF이며, USDZ는 Apple 네이티브 앱 전용으로 분리해서 사용해야 한다.
파일 업로드 + model-viewer 기반 3D 뷰어. 드래그앤드롭 지원.
실행:
python -m http.server 8000
# http://localhost:8000/viewer.html
GLB 파일은 데스크탑에서 렌더링 가능, USDZ는 iOS/Vision Pro에서만 동작.
IFC to GLB 변환 스크립트. trimesh 라이브러리를 사용하여 웹 뷰어용 GLB 파일 생성.
PropertySet 구조를 스캔하여 수치/텍스트 속성 목록 추출.
test_ifc.ifc는 속성 정보가 빈약한 상태:
재내보내기 시 확인 사항:
PropertySet이 부족한 경우를 위해 geometry에서 치수(bbox), 위치(centroid), 볼륨을 역추출하는 심층 스캔.
IFC deep scan 결과를 Qdrant에 멀티벡터 + payload로 저장.
| 벡터 | 차원 | 용도 |
|---|---|---|
| property | 9d | cx, cy, cz, rx, ry, rz, 높이, 볼륨, 정점수 (Euclidean) |
| spatial | 2d | XY 좌표 (근접 검색 특화, Euclidean) |
geometry: centroid(cx,cy,cz), bbox 반경(rx,ry,rz), bbox 치수, 볼륨, min/max 좌표 속성: guid, name, reference, storey, psets 연결: usd_prim_path 분류: species_name, species_code, tier, category, planting, spec_H/W/B/R 추가: canopy_area (수평투영면적)
나무 간격 검토에서 무게중심 거리가 아닌 표면 간 거리(edge-to-edge)를 사용. bbox 반경을 차감하여 실제 수관 사이 간격을 계산한다.
실제 간격 = centroid 거리 - 반경A - 반경B
Voxel 방식은 정밀하지만 메모리 비용 대비 조경 수목 간격 검토에는 과잉. bbox 반경 방식을 기본으로 채택하고, 정밀 간섭이 필요한 구간만 voxel 검증하는 2단계 접근을 설계.
최신 qdrant-client에서 search() 메서드가 query_points()로 변경됨:
# 수정 전
results = client.search(collection_name=COLLECTION, query_vector=("spatial", [x, y]), limit=6)
# 수정 후
results = client.query_points(collection_name=COLLECTION, query=[x, y], using="spatial", limit=6).points
IFC 요소 이름에서 수종명, 규격(H/W/B/R), 식재방식, 카테고리를 파싱하여 Qdrant payload에 직접 업데이트.
L-PL상록교목_스트로브잣나무:H3.0 X W1.5:641072
^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^
category species specs ifc_id
수종명 + 규격 조합이 고유 그룹을 형성. 같은 수종이라도 규격이 다르면 별도 그룹:
| 계층 | 높이 기준 | 수량 |
|---|---|---|
| 교목 | H >= 3.0m | 132주 (19%) |
| 소교목 | 1.5 <= H < 3.0m | 87주 (13%) |
| 관목 | 0.8 <= H < 1.5m | 254주 (37%) |
| 지피 | H < 0.8m | 232주 (34%) |
교목 (12그룹):
소교목 (1그룹):
관목 (6그룹):
지피 (5그룹):
분석에서 species_name != "" 조건으로 자동 제외 처리.
bbox_volume(3D 체적)과 별도로 수평투영면적 필요. bbox_dx x bbox_dy로 계산하여 Qdrant payload에 추가:
canopy_area = bbox_dx * bbox_dy # 단위: m2
691개 포인트 일괄 업데이트 완료.
Qdrant 데이터 대화형 질의 도구.
| 명령 | 기능 |
|---|---|
| stats | 전체 통계 + 볼륨 이상치 |
| species | 수종별 높이/수관폭/볼륨/동종간격 |
| overlap | Z축 분리 겹침 분석 (같은 높이대끼리만 검출) |
| find 키워드 | 특정 수종 상세 + 주변 요소 |
| near x y | XY 좌표 주변 검색 |
streamlit run dashboard.py
| 파일 | 용도 |
|---|---|
| ifc_to_usd.py | IFC to USDA 변환 |
| ifc_to_usdz.py | IFC to USDZ 변환 (Vision Pro) |
| ifc_to_glb.py | IFC to GLB 변환 (웹 뷰어) |
| viewer.html | 웹 3D 뷰어 (파일 업로드, model-viewer) |
| ifc_property_scan.py | IFC PropertySet 구조 스캔 |
| ifc_deep_scan.py | geometry 역추출 심층 스캔 |
| ifc_to_qdrant.py | IFC deep scan + Qdrant 저장 + 간격분석 |
| species_classify.py | 수종 분류 + Qdrant payload 업데이트 |
| bim_query.py | Qdrant 대화형 질의 도구 |
| dashboard.py | Streamlit 조경 대시보드 |
| BIM-AI-Design-Framework.md | 프레임워크 설계 문서 |
| 단계 | 상태 | 내용 |
|---|---|---|
| IFC to USD/USDZ 변환 | 완료 | 691개 요소 변환 |
| Qdrant 속성 저장 | 완료 | 멀티벡터 + payload |
| 수종 분류 | 완료 | 25개 고유 그룹 |
| 간격/수종 분석 | 완료 | edge-to-edge, Z축 분리 |
| Streamlit 대시보드 | 완료 | 필터, 평면도, 차트 |
| Revit 속성 재내보내기 | 미완 | 비료량, CO2, 단가 등 누락 속성 확보 |
| 수종 마스터 보강 | 미완 | 외부 CSV로 유지관리/토심 등 매칭 |
| RAG 질의 (LLM 연동) | 미완 | Claude/GPT API 연동 자연어 검색 |
| Multi-Agent 설계 자동화 | 미완 | LangGraph 기반 설계/검토/실행 에이전트 |
| Digital Twin | 미완 | USD + IoT 실시간 연동 |
buildingSMART International과 Alliance for OpenUSD(AOUSD)가 공식 협력 협정을 체결. IFC 5는 JSON 직렬화를 채택하여 OpenUSD와의 직접 통합 호환성을 높였다. IFC 5는 bottom-up 데이터 구성 방식으로 AEC 산업의 반복적, 협업적 특성에 적합하며, USD의 top-down 접근과 상호 보완적이다.