AutoCAD의 .NET API를 활용하면 사용자 정의 리본(Ribbon) 메뉴를 손쉽게 만들 수 있습니다. 아래는 그 과정을 상세히 설명합니다.
Visual Studio에서 AutoCAD .NET Plugin 프로젝트를 생성합니다. myPlugin 클래스의 Initialize() 메서드 내부에 리본 관련 코드를 작성하면, 플러그인이 로드될 때 자동으로 리본이 추가됩니다. myCommands 클래스에서는 명령어 처리만 담당합니다.
1. 리본 탭(Tab) 선언
Autodesk.Windows.ComponentManager.Ribbon을 통해 현재 리본 컨트롤을 가져와 새 탭을 추가합니다.
using Autodesk.Windows;
// ...
RibbonControl ribbon = ComponentManager.Ribbon;
RibbonTab layerTab = new RibbonTab
{
Title = "레이어 권한 관리",
Id = "RibbonSample_TAB_ID"
};
ribbon.Tabs.Add(layerTab);
2. 패널(Panel) 생성 및 추가
각 탭 내에 하나 이상의 RibbonPanelSource를 포함하는 RibbonPanel을 추가합니다.
RibbonPanelSource panelSource = new RibbonPanelSource { Title = "레이어 관리" };
RibbonPanel panel = new RibbonPanel { Source = panelSource };
layerTab.Panels.Add(panel);
3. 버튼(Button) 추가
버튼을 생성할 때 CommandParameter에 명령어 문자열을 전달합니다. 주의할 점은 명령어 뒤에 공백을 포함해야 명령이 즉시 실행된다는 것입니다. 공백이 없으면 명령만 입력되고 Enter가 필요합니다.
RibbonButton btnAddLayer = CreateRibbonButton("레이어 추가", "ADDLAYER ",
Resource1.AddLayer16x16, Resource1.AddLayer32x32);
RibbonButton btnEraseLayer = CreateRibbonButton("내보내기 허용", "DELETEOBJECTS ",
Resource1.AddLayer16x16, Resource1.AddLayer32x32);
// 버튼을 행(Row) 패널에 배치
RibbonRowPanel rowPanel = new RibbonRowPanel();
rowPanel.Items.Add(btnEraseLayer);
rowPanel.Items.Add(new RibbonRowBreak());
panelSource.Items.Add(btnAddLayer);
panelSource.Items.Add(rowPanel);
4. ICommand 인터페이스 구현 (명령 핸들러)
System.Windows.Input.ICommand를 구현하는 클래스에서 Execute 메서드가 호출될 때, 버튼의 CommandParameter에 있는 명령을 AutoCAD 명령줄로 전달합니다.
using System;
using Autodesk.Windows;
public class RibbonCommandHandler : System.Windows.Input.ICommand
{
public bool CanExecute(object parameter) => true;
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
if (parameter is RibbonButton ribBtn && ribBtn.CommandParameter is string cmd)
{
Autodesk.AutoCAD.ApplicationServices.Application
.DocumentManager.MdiActiveDocument
.SendStringToExecute(cmd, true, false, true);
}
}
}
5. 버튼 생성 헬퍼 메서드
이 메서드는 반복되는 버튼 속성 설정을 간소화합니다. 매개변수로 텍스트, 명령어, 작은 아이콘, 큰 아이콘을 받습니다.
private static RibbonButton CreateRibbonButton(string text, string cmd,
System.Drawing.Bitmap smallImage, System.Drawing.Bitmap largeImage)
{
RibbonButton btn = new RibbonButton
{
Text = text,
ShowText = true,
Image = ConvertBitmapToImageSource(smallImage),
LargeImage = ConvertBitmapToImageSource(largeImage),
ShowImage = true,
Size = RibbonItemSize.Large,
Orientation = System.Windows.Controls.Orientation.Vertical,
CommandHandler = new RibbonCommandHandler(),
CommandParameter = cmd
};
return btn;
}
6. 아이콘 이미지 추가 및 변환
프로젝트에 리소스 파일을 추가하고 16x16, 32x32 크기의 PNG 이미지를 드래그하여 포함시킵니다. 아래 함수는 System.Drawing.Bitmap을 WPF의 ImageSource로 변환합니다.
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
public static System.Windows.Media.ImageSource ConvertBitmapToImageSource(System.Drawing.Bitmap bmp)
{
IntPtr hBitmap = bmp.GetHbitmap();
try
{
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap, IntPtr.Zero, System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(hBitmap);
}
}
7. 테스트 및 로드
프로젝트를 빌드하여 .dll 파일을 생성합니다. AutoCAD를 실행한 후, 명령창에 NETLOAD를 입력하고 해당 DLL을 선택하여 로드합니다. 리본 탭이 곧바로 나타납니다.
이 방법으로 AutoCAD에 완전히 통합되는 사용자 정의 리본 메뉴를 만들 수 있습니다.