Revit API Study

[Revit API] Ribbon탭 만들고 Form 띄우기

Chanrae.Noh 2022. 4. 24. 12:00

 

<리본탭의 커스텀 패널>

 

<리본메뉴>

리본메뉴에 별도의 탭을 추가하고 패널을 추가하기.

(참고한 자료 : API Develop Guide, YouTube 소주장군님)

 

 

 

<솔루션 탐색기 구성>

 

Application.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.Revit;
using System.Diagnostics;
using System.IO;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.UI.Events;
using System.Drawing;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
 
namespace MyFirstRibbon
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class Application : IExternalApplication
    {
        public Result OnStartup(UIControlledApplication application)
        {
            // 리본탭 생성 // Create a custom ribbon tab
            String tabName = "This Tab Name";
            application.CreateRibbonTab(tabName);
 
            // 리본 패널 생성 // Create a ribbon panel
            RibbonPanel m_projectPanel = application.CreateRibbonPanel(tabName, "This Panel Name");
 
            // 버튼 2개 생성 // Create two push buttons
            PushButtonData button1 = new PushButtonData("Button1""My Button #1",
                @"D:\OneDrive\@C#\Ribbon\MyFirstRibbon\MyFirstRibbon\bin\Debug\MyFirstRibbon.dll""MyFirstRibbon.Command");
            PushButtonData button2 = new PushButtonData("Button2""My Button #2",
                 @"D:\OneDrive\@C#\Ribbon\MyFirstRibbon\MyFirstRibbon\bin\Debug\MyFirstRibbon.dll""MyFirstRibbon.Command2");
 
            // 푸쉬버튼 리스트 패널에 추가 // Add the buttons to the panel
            List<object> projectButtons = new List<object>();
            projectButtons.AddRange(m_projectPanel.AddStackedItems(button1, button2));
 
            //추가로 패널 장착하기
            CreateRibbonPanel(application);
 
            return Result.Succeeded;
 
        }
        public Autodesk.Revit.UI.Result OnShutdown(UIControlledApplication application)
        {
            return Autodesk.Revit.UI.Result.Succeeded;
        }
 
        //패널 추가
        private void CreateRibbonPanel(UIControlledApplication application)
        {
            string tabname = "This Tab Name";
            string panelname = "Hello";
            RibbonPanel panel = application.CreateRibbonPanel(tabname, panelname);
 
            SplitButtonData buttondata = new SplitButtonData("Hi""Hello");
            SplitButton button = panel.AddItem(buttondata) as SplitButton;
 
            PushButton pushbutton = button.AddPushButton(new PushButtonData("Hi",
                "Hey", @"D:\OneDrive\@C#\Ribbon\MyFirstRibbon\MyFirstRibbon\bin\Debug\MyFirstRibbon.dll""MyFirstRibbon.Command"));
 
            pushbutton.LargeImage = convertFromBitmap(MyFirstRibbon.Properties.Resources.Rersource_home);
            pushbutton.Image = convertFromBitmap(MyFirstRibbon.Properties.Resources.Rersource_home);
            pushbutton.ToolTip = "창을 띄웁니다.";
        }
 
        BitmapSource convertFromBitmap(Bitmap bitmap)
        {
            return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                bitmap.GetHbitmap(),
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());
        }
    }
}
 
 
cs


Command.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.ApplicationServices;
 
namespace MyFirstRibbon
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class Command : IExternalCommand
    {
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData,
            ref string message, Autodesk.Revit.DB.ElementSet elements)
        {
            Form1 form = new Form1(commandData);
            form.Show();
            return Autodesk.Revit.UI.Result.Succeeded;
        }
    }
 
 
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class Command2 : IExternalCommand
    {
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData,
            ref string message, Autodesk.Revit.DB.ElementSet elements)
        {
            TaskDialog.Show("Form""Hello Revit");
            return Autodesk.Revit.UI.Result.Succeeded;
        }
    }
}
cs

 

Form1.cs

< WinForm >

 

리소스추가

< 리소스 이미지 추가 >

솔루션 탐색기에서 해당 프로젝트를 우클릭하고 속성창으로 이동 후 리소스에 32x32 아이콘 이미지 추가

 

메니페스트파일(.addin)

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
  <AddIn Type="Application">
    <Name>MyFirstRibbon</Name>
    <Assembly>dll 파일 위치</Assembly>
    <ClientId>GUID</ClientId>
    <FullClassName>네임스페이스.클래스명(MyFirstRibbon.Application)</FullClassName>
    <VendorId>ArchiCode</VendorId>
    <VendorDescription>ArchiCode</VendorDescription>
  </AddIn>
</RevitAddIns>

 

 

추가적으로 알게된 사실은

Transaction 이라는게 있는데 Document내에서 변동사항(수정/삭제/추가 등)이 필요한 경우

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]

코드를 삽입해줘야함.

 

그리고 리본탬에 추가하는 경우 메니페스트 파일의 Addin Type이 Command가 아니라 Application으로 설정해야함.