
pyRevit로는 한계를 느꼈다면: C# Revit 애드인 개발 첫걸음
pyRevit로 자동화를 하다 보면 언젠가 벽에 부딪힌다. "이 버튼을 회사 전체에 배포하고 싶은데, pyRevit이 설치 안 된 PC에서도 작동해야 한다"거나, "복잡한 다이얼로그 UI가 필요하다"는 요구가 그것이다. 이 지점이 바로 Revit 애드인(Add-in) — C#으로 직접 개발해서 리본 메뉴에 버튼을 심는 방식 — 이 필요해지는 순간이다.
"pyRevit이면 충분한데, 애드인까지 필요한가요?"규모의 문제다. pyRevit은 개인·소규모 팀의 빠른 자동화에 최적화돼 있다. 하지만 조직 전체에 표준 도구로 배포하거나, **복잡한 UI(설정 창, 마법사 형태 다이얼로그)**가 필요하거나, 최고 수준의 실행 속도가 필요하다면 애드인이 정답이다.
왜 pyRevit은 이 지점에서 한계에 부딪힐까. pyRevit 스크립트는 결국 Python 인터프리터 위에서 매번 새로 해석되며 실행된다. 소규모 자동화에서는 이 오버헤드가 체감되지 않지만, 수천 개 요소를 순회하며 복잡한 연산을 반복하는 작업이라면 네이티브 컴파일된 C# 코드와 속도 차이가 벌어진다. 게다가 pyRevit 자체가 설치되어 있어야 스크립트가 동작하므로, "이 도구가 없는 협력사 PC에서도 똑같이 돌아가야 한다"는 요구 앞에서는 독립적으로 설치 가능한 .dll 형태의 애드인이 유일한 답이 된다.
개발 환경
애드인 개발 스택
- 언어: C# (.NET Framework 4.8, Revit 버전에 따라 다름)
- IDE: Visual Studio 2022 (Community 버전 무료)
- SDK: Revit API — Revit 설치 시 자동으로 함께 설치됨
- 배포:
.addin매니페스트 파일 + 컴파일된.dll
첫 번째 애드인 — Hello World를 넘어서
가장 기본적인 애드인은 버튼을 누르면 메시지 박스를 띄우는 것이다.
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Windows.Forms;
namespace MyFirstAddin
{
[Autodesk.Revit.Attributes.Transaction(
Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class HelloWorldCommand : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
MessageBox.Show("Hello, BIM World!");
return Result.Succeeded;
}
}
}
이것만으로는 아무 의미가 없어 보이지만, IExternalCommand를 구현하는 이 구조 자체가 모든 애드인의 뼈대다. MessageBox.Show(...) 자리에 실제 로직(선택한 요소 파라미터 일괄 변경, 시트 자동 생성 등)을 채워 넣으면 pyRevit으로 만들던 스크립트를 그대로 애드인으로 옮길 수 있다.
[Image: Visual Studio에서 위 HelloWorldCommand 클래스를 작성 중인 코드 편집기 화면]
.addin 매니페스트로 Revit에 등록하기
컴파일한 .dll만으로는 Revit이 애드인을 인식하지 못한다. Revit이 시작할 때 읽어들이는 .addin XML 파일이 필요하다.
<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
<AddIn Type="Command">
<Name>MyFirstAddin</Name>
<Assembly>C:\ProgramData\Autodesk\Revit\Addins\2026\MyFirstAddin.dll</Assembly>
<AddInId>여기에-고유한-GUID-입력</AddInId>
<FullClassName>MyFirstAddin.HelloWorldCommand</FullClassName>
<VendorId>MIW</VendorId>
</AddIn>
</RevitAddIns>
.addin 파일 위치가 배포 방식을 결정한다%ProgramData%\Autodesk\Revit\Addins\{버전}\에 넣으면 그 PC의 모든 사용자에게 적용되고, %AppData%\Autodesk\Revit\Addins\{버전}\에 넣으면 현재 사용자에게만 적용된다. 회사 전체 배포라면 전자를, 개인 테스트라면 후자를 쓰는 게 관리하기 편하다.
pyRevit vs 애드인, 뭐가 다른가
| 항목 | pyRevit | C# 애드인 |
|---|---|---|
| 학습 곡선 | Python만 알면 됨 | C# + .NET + Revit API 구조 이해 필요 |
| 실행 속도 | 빠름 | 가장 빠름 (네이티브 컴파일) |
| UI 복잡도 | 버튼 위주, 제한적 | 완전한 커스텀 다이얼로그·폼 가능 |
| 배포 | 스크립트 폴더 복사 | 설치 프로그램(.msi) 제작 가능 |
| 디버깅 | 비교적 쉬움 | Visual Studio 디버거로 완전한 단계별 추적 |
처음부터 C#으로 시작하지 마라pyRevit로 스크립트를 먼저 만들어보고, "이걸 회사 전체에 배포해야겠다"는 확신이 생겼을 때 C# 애드인으로 포팅하는 순서를 추천한다. 처음부터 애드인으로 시작하면 .NET 환경 설정, 트랜잭션 구조, 디버깅 방법까지 한꺼번에 배워야 해서 진입 장벽이 불필요하게 높아진다.
[Image: Revit 리본 메뉴에 커스텀 애드인 탭과 버튼이 추가된 화면]
마무리
Revit 애드인 개발은 C#과 .NET 학습이 선행돼야 하지만, 한 번 만든 도구는 조직 전체가 리본 메뉴의 버튼 하나로 사용할 수 있다는 확실한 보상이 있다. pyRevit으로 시작해서 필요할 때 C# 애드인으로 전환하는 것이 대부분의 실무자가 걷는 자연스러운 학습 경로다.