레빗(Revit)에서 다이나모 노드 완벽 가이드— 비주얼 코딩의 모든 것

레빗(Revit)에서 다이나모 노드 완벽 가이드
— 비주얼 코딩의 모든 것
다이나모의 핵심 구성 요소인 노드를 처음부터 차근차근 설명합니다. 입력 노드부터 파이썬 스크립트 노드까지, BIM 실무에서 바로 써먹는 비주얼 프로그래밍 완전 정복.
- 레빗에서 비주얼 코딩이란?
- 다이나모 노드의 구조
- 7가지 핵심 노드 타입 완전 해설
- 실전 노드 워크플로우 만들기
- 파이썬 스크립트 노드
- 커스텀 노드와 패키지
- 깔끔하고 빠른 그래프를 위한 실무 팁
- 자주 묻는 질문 (FAQ)
레빗에서 비주얼 코딩이란?
오토데스크 다이나모(Autodesk Dynamo)는 레빗, Civil 3D 등에 직접 연동되는 비주얼 프로그래밍 환경입니다. 텍스트 에디터 대신 캔버스에 노드를 배치하고 와이어로 연결합니다. 데이터는 왼쪽에서 오른쪽으로 흐르며 각 단계마다 변환되어 레빗 모델에 반영됩니다.
프로그래밍 경험이 없어도 수천 개의 요소 이름을 순식간에 바꾸거나, 파라메트릭 곡선을 따라 패밀리를 배치하거나, 룸 데이터를 자동으로 엑셀로 내보내는 스크립트를 만들 수 있습니다.
알아두기: 다이나모는 오픈소스이며 Revit 2014 이상에 기본 탑재됩니다. 별도 라이선스 없이 사용할 수 있고, 레빗 없이 실습할 수 있는 Dynamo Sandbox도 무료로 제공됩니다.
모든 다이나모 프로그램의 기본 단위는 노드(Node)입니다. 노드의 구조, 데이터 흐름, 카테고리별 역할을 이해하는 것이 다이나모 개발에서 가장 중요한 기술입니다.
다이나모 노드의 구조
모든 노드는 왼쪽 입력 포트, 내부 함수, 오른쪽 출력 포트로 구성됩니다. 출력과 입력을 와이어로 이어 붙여 그래프를 만듭니다. 핵심 규칙은 다음과 같습니다:
- 연결되지 않은 입력 포트는 기본값(또는 null)을 사용합니다.
- 업스트림 입력이 바뀌면 노드가 자동으로 재실행됩니다.
- 하나의 출력 포트를 여러 노드에 동시에 연결할 수 있습니다.
- 이중 꺾쇠(>>) 포트는 단일값뿐 아니라 리스트도 받습니다.
레이싱(Lacing)이란: 두 리스트의 길이가 다를 때 항목을 어떻게 짝지을지 결정하는 규칙입니다. Shortest / Longest / Cross Product 중 포트 우클릭으로 선택합니다. 레이싱 설정 오류가 초보자 그래프 오류의 가장 흔한 원인입니다.
7가지 핵심 노드 타입 완전 해설
다이나모 기본 라이브러리에는 500개 이상의 노드가 7개 카테고리로 정리되어 있습니다.
입력 노드
그래프에 원시값 주입. Number Slider, Integer, String, Boolean, File Path.
지오메트리 노드
3D 객체 생성 및 변환. 점·선·곡선·면·솔리드·메시.
리스트 노드
정렬·필터·평탄화·전치·결합·인덱싱 등 모든 리스트 조작.
수학 노드
사칙연산·삼각함수·반올림·범위 매핑·수식 평가.
문자열 노드
연결·분리·치환·정규식·서식 지정.
Revit 노드
레빗 요소·매개변수·패밀리·뷰·시트 조회 및 수정.
Python / 커스텀
CPython 3 스크립트 삽입 또는 커스텀 노드(.dyf)로 패키징.
입력 노드 — 모든 그래프의 시작점
실무 스크립트에서 가장 강력한 입력 노드는 Min / Max / Step을 지정한 Number.Slider입니다. 사용자가 그래프 에디터를 열지 않고도 안전한 범위에서 값을 조절할 수 있습니다. 특정 레빗 객체에 작동해야 할 때는 Select Model Element나 Select Elements by Category를 활용합니다.
지오메트리 노드 — 공간 처리의 핵심
실제 BIM 작업에서 자주 쓰이는 노드:
- Point.ByCoordinates — X, Y, Z 값으로 3D 점 생성
- Line.ByStartPointEndPoint — 두 점 사이 선분 생성
- NurbsCurve.ByPoints — 점 목록을 통과하는 부드러운 곡선
- Surface.ByLoft — 여러 곡선을 로프트해 면 생성
- Solid.ByUnion / ByIntersection — 불리언 솔리드 연산
- Geometry.Translate / Rotate / Scale — 지오메트리 변환
리스트 노드 — 숨겨진 핵심 무기
꼭 익혀야 할 핵심 노드:
- List.Flatten — 중첩 리스트를 단일 레벨로 평탄화
- List.FilterByBoolMask — true/false 리스트로 분리
- List.Transpose — 2D 리스트 행·열 교환
- List.GroupByKey — 공통 속성 기준 그룹화
- List.Chop — 단일 리스트를 고정 길이 서브리스트로 분할
Revit 노드 — BIM 데이터의 다리
조회 노드(Element.GetParameterValueByName)와 액션 노드(Element.SetParameterByName)를 명확히 구분하는 것이 중요합니다. 쓰기 노드를 Freeze된 브랜치 안에 두면 실행되지 않고 조용히 실패합니다.
실전 노드 워크플로우 만들기
파라메트릭 그리드 위에 레빗 패밀리 인스턴스를 배치하는 패턴은 파사드, 구조 그리드, 조명 배치에서 가장 자주 사용됩니다.
1단계: 슬라이더 두 개로 행·열 수를 제어합니다. 값 변경 즉시 하위 그래프 전체가 실시간 업데이트됩니다.
2단계: Point.ByCoordinates에 Cross Product 레이싱을 적용하면 모든 X/Y 조합이 자동으로 생성되어 2D 점 그리드가 만들어집니다.
3단계: Cross Product 결과는 중첩 리스트입니다. 배치 노드 전달 전에 List.Flatten으로 단일 레벨로 평탄화합니다.
4단계: FamilyInstance.ByPoint가 모든 점에 패밀리 인스턴스를 배치합니다. 수백 번의 수동 작업이 이 노드 하나로 대체됩니다.
5단계: Element.SetParameterByName으로 새 인스턴스에 마크 번호나 유형 코멘트를 즉시 자동 부여합니다.
파이썬 스크립트 노드
기본 노드로 해결이 안 되는 경우, Python Script 노드를 추가하면 됩니다. Dynamo 2.13 이상에서 기본 엔진은 CPython 3으로 표준 라이브러리 전체와 pip 패키지를 사용할 수 있습니다. 입력값은 IN[0], IN[1]으로, 결과는 OUT으로 반환합니다.
# IN[0] — 레빗 요소 리스트
# IN[1] — 접두어 문자열 (예: "FAC-")
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import Transaction, BuiltInParameter
elements = IN[0]
prefix = IN[1]
doc = elements[0].Document
results = []
with Transaction(doc, "일괄 이름 변경") as t:
t.Start()
for i, el in enumerate(elements):
new_mark = f"{prefix}{i+1:03d}"
el.get_Parameter(
BuiltInParameter.ELEM_MARK_PARAM
).Set(new_mark)
results.append(new_mark)
t.Commit()
OUT = results
반드시 Transaction을 사용하세요. 기본 Revit 노드는 내부적으로 트랜잭션을 관리하지만 Python Script 노드는 직접 관리해야 합니다. Transaction 없이 .Set()을 호출하면 즉시 예외가 발생합니다.
커스텀 노드와 커뮤니티 패키지
유용한 서브그래프를 완성했다면 우클릭 → Create Custom Node로 .dyf 파일로 저장합니다. 라이브러리에 직접 나타나며 팀 전체와 공유하거나 Package Manager에 게시할 수 있습니다.
깔끔하고 빠른 그래프를 위한 실무 팁
Ctrl+G로 관련 노드를 그룹화하고, 입력=노란색·Revit 액션=초록색·지오메트리=파란색·출력=빨간색으로 일관되게 색상을 부여하면 누구나 한눈에 구조를 파악합니다.
다이나모는 레플리케이션으로 리스트를 네이티브하게 처리합니다. Element.SetParameterByName 하나가 10,000개 요소를 처리합니다. 명령형 흐름이 꼭 필요할 때만 Python을 사용하세요.
노드 우클릭 → Freeze하면 변경마다 재실행되지 않습니다. 한 번만 실행하면 되는 무거운 레빗 조회를 Freeze해 두면 그래프 속도가 크게 향상됩니다.
수학 노드 여러 개를 체이닝하는 대신 Code Block 하나로: width / 2 + offset * Math.Sin(angle);. DesignScript 문법을 지원하며 훨씬 가독성이 좋습니다.
다이나모 쓰기 작업은 저장 후 되돌릴 수 없습니다. 파괴적인 스크립트는 반드시 분리된(Detached) 복사본에서 결과를 확인한 후 실제 모델에 적용하세요.
자주 묻는 질문
지금 바로 다이나모를 시작해 보세요
Dynamo Sandbox를 무료로 다운로드하고 레빗 없이도 노드 실습을 시작할 수 있습니다.