Dynamo로는 안 된다는 벽에 부딪혔다면: Python + Revit API 입문
개요
Dynamo로 자동화를 시작했다면, 언젠가는 "이건 Dynamo로는 너무 복잡하다"는 한계에 부딪힌다. 그때 필요한 것이 Python + Revit API다. Revit API는 Revit의 거의 모든 기능을 코드로 제어할 수 있는 인터페이스다. Dynamo가 비주얼 툴이라면, Revit API는 "어떤 자동화든 가능하다"는 무한한 가능성을 제공한다.
Revit API로 할 수 있는 것들
- 모델 요소 생성·수정·삭제
- 파라미터 읽기/쓰기
- 도면 자동 생성 및 시트 배치
- 간섭 체크 및 모델 검토 자동화
- 외부 데이터베이스 연동
- 완전한 애드인(Add-in) 개발
왜 Python인가?
Revit API의 공식 언어는 C#이지만, Python도 두 가지 경로로 사용할 수 있다.
| 방식 | 장점 | 단점 |
|---|---|---|
| pyRevit | Revit 전용 Python 툴킷, 버튼 UI 자동 생성, 방대한 유틸리티 | pyRevit 설치 필요 |
| Dynamo Python 노드 | Dynamo 환경 안에서 실행, Revit과 Dynamo 데이터 동시 활용 | Dynamo 실행 필요, 독립적 배포 어려움 |
Revit API 입문은 pyRevit으로 시작하라pyRevit은 Revit에 커스텀 버튼을 추가해서 Python 스크립트를 실행할 수 있게 해주는 오픈소스 프레임워크다. 설치하면 Revit 리본 메뉴에 "pyRevit" 탭이 생기고, 여기서 스크립트를 관리·실행할 수 있다. Revit API의 진입 장벽을 크게 낮춰준다.
첫 번째 Python 스크립트 — 선택한 요소의 파라미터 출력
pyRevit 환경에서 실행하는 가장 기본적인 스크립트다.
# 선택한 요소의 모든 파라미터를 출력
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
uidoc = __revit__.ActiveUIDocument
doc = uidoc.Document
# 선택한 요소 가져오기
selection = uidoc.Selection.GetElementIds()
for elem_id in selection:
element = doc.GetElement(elem_id)
print(f"요소 ID: {elem_id}")
print(f"요소 이름: {element.Name}")
# 모든 파라미터 출력
params = element.Parameters
for param in params:
print(f" {param.Definition.Name}: {param.AsValueString()}")
이 스크립트를 실행하면 선택한 요소의 모든 파라미터가 pyRevit 출력창에 표시된다. 어떤 파라미터가 있는지, 값을 어떻게 읽어야 하는지 확인할 때 유용하다.
실전 예제 2선
예제 1: 시트 자동 생성 — 100장을 10분 만에
설계 프로젝트에서 시트를 100장 만드는 것은 기본이다. 수동으로 하나하나 만들면 하루 종일 걸리지만, Revit API로는 10분이면 충분하다.
# 시트 자동 생성 스크립트 (pyRevit)
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
from System.Collections.Generic import List
doc = __revit__.ActiveUIDocument.Document
# A1 시트 패밀리 로드 (미리 로드된 패밀리 타이틀 블록 사용)
collector = FilteredElementCollector(doc)\
.OfClass(typeof(FamilySymbol))\
.OfCategory(BuiltInCategory.OST_TitleBlocks)\
.FirstElement()
title_block = doc.GetElement(collector.Id)
# 시트 생성
sheet_name = "A1-"
for i in range(1, 101): # 100장 생성
new_sheet = Sheet.Create(doc, title_block.Id)
# 시트 이름과 번호 설정
param_name = new_sheet.get_Parameter(BuiltInParameter.SHEET_NAME)
param_number = new_sheet.get_Parameter(BuiltInParameter.SHEET_NUMBER)
if param_name:
param_name.Set(f"{sheet_name}{i}")
if param_number:
param_number.Set(f"{i:03d}")
print(f"시트 100장 생성 완료")
예제 2: 파라미터 일괄 업데이트 — 엑셀 연동
엑셀에 정리된 자재 코드 정보를 Revit 모델에 자동으로 반영한다.
# 엑셀 데이터로 Revit 파라미터 업데이트 (개념 코드)
import csv
# 1. 엑셀 데이터 읽기
with open('material_codes.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
data = list(reader)
# 2. Revit 요소 검색 및 업데이트
for row in data:
elem_id = row['ElementId']
material_code = row['MaterialCode']
element = doc.GetElement(ElementId(int(elem_id)))
if element:
param = element.get_Parameter(
BuiltInParameter.ALL_MODEL_MATERIAL
)
if param and not param.IsReadOnly:
param.Set(material_code)
pyRevit 스크립트 구조 이해하기
pyRevit에서 유용한 스크립트를 만들기 위한 기본 구조다.
"""스크립트 설명 (이 텍스트가 버튼 툴팁으로 표시됨)"""
# -*- coding: utf-8 -*-
# 1. 레퍼런스 추가
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
clr.AddReference('RevitServices')
# 2. 네임스페이스 임포트
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
from RevitServices.Persistence import DocumentManager
# 3. 현재 문서 가져오기
doc = DocumentManager.Instance.CurrentDBDocument
# 4. 트랜잭션 시작 (모델 변경 시 필수)
from Autodesk.Revit.DB import Transaction
t = Transaction(doc, "스크립트 이름")
t.Start()
# 5. 작업 수행
# (코드)
# 6. 트랜잭션 커밋
t.Commit()
트랜잭션(Transaction)을 잊지 마라Revit API로 모델을 변경하려면 반드시 Transaction 안에서 실행해야 한다. 트랜잭션 없이 모델을 변경하면 Revit이 오류를 낸다. 트랜잭션은 "저장한다/취소한다"의 단위라고 생각하면 이해하기 쉽다. 작업을 시작할 때 t.Start(), 끝날 때 t.Commit().
학습 로드맵
- 1단계: Python 기본 문법 학습 (2~4주, 점프 투 파이썬 수준)
- 2단계: pyRevit 설치 → 샘플 스크립트 실행해보기
- 3단계: 공식 Revit API 문서에서 자주 쓰는 클래스 학습 (Element, Parameter, FilteredElementCollector 등)
- 4단계: 간단한 자동화 스크립트 작성 (파라미터 읽기/쓰기)
- 5단계: 실전 애드인 개발 (시트 자동 생성, 일괄 수정 등)
| 추천 학습 리소스 | 설명 |
|---|---|
| pyRevit 공식 문서 | 설치부터 고급 기능까지 |
| Revit API Docs (Autodesk 공식) | 모든 클래스와 메서드 레퍼런스 |
| The Building Coder 블로그 | Revit API 전문가의 블로그, 다양한 예제 |
| StackOverflow (Revit API 태그) | 실무 문제 해결의 보고 |
마무리
Dynamo가 "쉽고 빠른 자동화"라면, Revit API + Python은 "완전한 자동화"다. 처음에는 배우는 데 시간이 걸리지만, 한 번 익숙해지면 Dynamo로는 불가능했던 작업까지 모두 코드로 처리할 수 있다. "이걸 자동화할 수 있을까?"라는 질문에 대한 답은, Revit API 앞에서는 거의 항상 "할 수 있다"다.
다음 글에서는 Revit API의 실전 활용 — Dynamo vs pyRevit, 무엇으로 자동화할까를 비교 분석한다.