AutoCAD 플러그인에서 리본(Ribbon) 메뉴 구현하기

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에 완전히 통합되는 사용자 정의 리본 메뉴를 만들 수 있습니다.

태그: AutoCAD .NET API Ribbon 메뉴 C# 개발 리본 탭

7월 19일 03:04에 게시됨