
RevitBIM자동화개발자
시트 100장 만드는 데 하루 종일? Revit API로 10분 만에 끝내기
MADE IN WORKS·2025. 3. 9.·4분 읽기
개요
설계 프로젝트에서 시트(Sheet)를 만드는 작업은 생각보다 많은 시간을 잡아먹는다. 시트 양식을 로드하고, 뷰를 배치하고, 시트 번호를 부여하고... 50층짜리 건물이면 기본 100장, 상세도까지 포함하면 200장도 우스운 일이 아니다. 수동으로 하루 종일 걸리는 이 작업을 Revit API로 10분 만에 끝내는 세상, 한 번 경험하면 절대 돌아갈 수 없다.
시트 자동 생성이 필요한 순간
- 50장 이상 시트를 만들어야 한다
- 모든 시트의 양식과 번호 체계가 일정해야 한다
- 프로젝트 중간에 시트 구성을 대폭 변경해야 한다
- 템플릿 프로젝트에서 시트 구조를 재사용해야 한다
준비: 시트 패밀리(타이틀 블록)
시트를 자동 생성하려면 먼저 타이틀 블록(Title Block) 패밀리가 프로젝트에 로드되어 있어야 한다. 대부분 A1, A2, A3 등 규격별로 준비한다.
프로젝트에 로드된 타이틀 블록 목록은 다음 코드로 확인할 수 있다.
# 로드된 타이틀 블록 확인
collector = FilteredElementCollector(doc)\
.OfClass(typeof(FamilySymbol))\
.OfCategory(BuiltInCategory.OST_TitleBlocks)
for tb in collector:
print(f"타이틀 블록: {tb.Name} (ID: {tb.Id})")
기본 시트 자동 생성기
가장 기본적인 형태의 시트 자동 생성기다. 여기에 기능을 덧붙여서 실무에서 바로 쓸 수 있는 수준으로 만들 수 있다.
"""선택한 뷰를 선택한 시트에 자동 배치"""
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
uidoc = __revit__.ActiveUIDocument
doc = uidoc.Document
# 사용자로부터 뷰 선택 받기
from Autodesk.Revit.UI.Selection import ObjectType
# 시트에 배치할 뷰들 선택
selection_refs = uidoc.Selection.PickObjects(
ObjectType.Element,
"시트에 배치할 뷰를 선택하세요"
)
# 선택된 뷰 정보 수집
view_list = []
for ref in selection_refs:
view = doc.GetElement(ref.ElementId)
if isinstance(view, View) and not view.IsTemplate:
view_list.append({
'name': view.Name,
'id': view.Id,
'scale': view.Scale
})
# 타이틀 블록 찾기
title_block = FilteredElementCollector(doc)\
.OfClass(typeof(FamilySymbol))\
.OfCategory(BuiltInCategory.OST_TitleBlocks)\
.FirstElement()
# 트랜잭션 시작
t = Transaction(doc, "시트 자동 생성")
t.Start()
sheet_number = 1
viewport_type_id = doc.GetDefaultElementTypeId(
ElementTypeGroup.ViewportType
)
for view_info in view_list:
# 새 시트 생성
sheet = Sheet.Create(doc, title_block.Id)
# 시트 번호와 이름 설정
sheet_number_param = sheet.get_Parameter(
BuiltInParameter.SHEET_NUMBER
)
sheet_name_param = sheet.get_Parameter(
BuiltInParameter.SHEET_NAME
)
if sheet_number_param:
sheet_number_param.Set(f"A-{sheet_number:03d}")
if sheet_name_param:
sheet_name_param.Set(view_info['name'])
# 뷰를 시트에 배치 (위치는 나중에 수동 조정)
try:
Viewport.Create(doc, sheet.Id, view_info['id'], XYZ(0.1, 0.1, 0))
except:
print(f"뷰 배치 실패: {view_info['name']}")
sheet_number += 1
t.Commit()
print(f"총 {len(view_list)}개의 시트 생성 완료")
고급 기능 추가
1. 뷰 자동 정렬
뷰를 시트에 배치할 때 특정 위치에 자동 정렬하는 기능을 추가할 수 있다.
- 평면도: 시트 왼쪽 위에 배치
- 단면도: 시트 오른쪽 아래에 배치
- 상세도: 시트 중앙에 배치
2. 시트 번호 체계 자동화
프로젝트의 시트 번호 체계를 자동으로 생성한다.
A-001~A-050: 건축 평면도
A-051~A-100: 건축 입면도
A-101~A-150: 건축 단면도
S-001~S-050: 구조 평면도
M-001~M-100: MEP 평면도
# 시트 번호 체계 정의
sheet_scheme = {
'건축 평면도': ('A', 1, 50),
'건축 입면도': ('A', 51, 100),
'건축 단면도': ('A', 101, 150),
'구조 평면도': ('S', 1, 50),
'MEP 평면도': ('M', 1, 100),
}
# 뷰 이름에서 카테고리를 판별하고 자동으로 번호 부여
def get_sheet_number(view_name):
if '평면' in view_name and ('1층' in view_name or '2층' in view_name):
return ('A', 1)
# ... 로직 구현
3. 시트 목록(도면 목록) 자동 생성
생성된 모든 시트를 기반으로 도면 목록을 자동으로 생성하고 업데이트하는 기능도 포함할 수 있다.
실무 팁 — 템플릿에 시트 구조를 미리 정의하라프로젝트마다 시트 구조(어떤 분야가 몇 장의 시트를 쓸지)는 다르지만, 시트 양식(타이틀 블록), 도면 목록 양식, 시트 번호 체계는 회사 표준으로 미리 정의해둘 수 있다. 템플릿에 이러한 "시트 뼈대"를 포함해두면 자동 생성 스크립트의 효율이 2배로 올라간다.
FAQ
뷰가 시트에 들어갈 때 위치가 이상하면?시트에 뷰를 자동 배치할 때 위치(XYZ)를 지정할 수 있다. 기본값은 시트의 좌측 하단(0.1, 0.1)이다. 추후 수동으로 미세 조정해야 하지만, 시트를 만드는 시간 자체를 90% 이상 절약해준다.
이미 배치된 뷰가 있으면?Viewport.Create()는 이미 뷰가 시트에 배치되어 있어도 중복 생성하지 않는다. 필요한 경우 기존 뷰포트를 확인하고 건너뛰는 로직을 추가할 수 있다.
시트 생성 후 도면 목록(Schedule)도 자동 업데이트?도면 목록(Sheet Schedule)은 뷰 기반 일람표다. 시트가 생성되면 도면 목록이 자동으로 업데이트된다. 추가 스크립팅이 필요 없다.
마무리
시트 자동 생성기는 BIM 자동화의 "가장 확실한 승리" 중 하나다. 투자 대비 효과가 가장 크고, 모든 규모의 프로젝트에서 활용할 수 있다. 위 코드를 기반으로 자신의 프로젝트에 맞게 커스터마이징하면, 시트 생성 작업에서 수십 시간을 절약할 수 있다.
다음 글에서는 시트보다 더 검증이 중요한 — 모델 검토 자동화: 규칙 위반 요소를 한 번에 찾기를 다룬다.