RevitAPIのプログラムをタブ・リボン・ボタンでアドイン化

RevitAPIのSharpDevelopで開発したプログラムは、マクロマネージャから実行できます。

ですが苦労して開発したプログラム、せっかくなのでカッコよくリボンタブのボタンから実行してみたいですよね^^

RevitAPIアドイン化こんな感じのボタン

ということで、この記事ではSharpDevelopで開発したプログラムをアドイン化する手順を紹介します。

準備|ボタンに表示するアイコン作成

アドイン化のプログラムを書いていく前に、ボタンに載せるアイコンを作成しておきます。

RevitAPIアドイン化アイコン
アイコンはなくてもOKです。不要な方はこの章は読み飛ばしても大丈夫。

次の手順まで読み飛ばす。

アイコンにはicoという拡張子を使用します。

下記のサイトでjpgやpngをicoに変換できるので、これを利用しましょう^^

アイコンコンバータ

アイコン作成手順
  • 変換したいファイルを選択し「変換」ボタンをクリックで変換実行
RevitAPIアドイン化
  • icoとpng形式で変換される。アイコンに使用するサイズは「32 x 32」
RevitAPIアドイン化
  • 「Download」を右クリックして、「名前を付けてリンク先を保存」する
RevitAPIアドイン化

以上でアイコンの準備完了です。

SharpDevelopでアドイン化用プログラムセットの作成

アドインにするためのプログラムはSharpDevelopで作成します。

新規のモジュールを作成

まずは、マクロマネージャから新規モジュールを作成します。

新規モジュールの作成手順が分からない方は下記記事をご覧ください。

RevitAPI始め方
1から分かるRevitAPIのやさしい始め方【初心者大歓迎】RevitAPIの始め方を初心者の方でも分かりやすいように、丁寧にやさしく解説します。RevitAPIを使ってアドイン開発したい人はまずはここからスタート!^^...

ここでは「RevitAPIyasan」という名前で新規作成しました・

「ThisApplication.cs」に下記コードが出来上がります。

/*
 * Created by SharpDevelop.
 * User: **********
 * Date: 2021/02/09
 * Time: 20:58
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;

namespace RevitAPIyasan
{
  [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
  [Autodesk.Revit.DB.Macros.AddInId("4CF966AA-B412-48C4-8FD2-EF3AE0350DA1")]
  public partial class ThisApplication
  {
    private void Module_Startup(object sender, EventArgs e)
    {

    }

    private void Module_Shutdown(object sender, EventArgs e)
    {

    }

    #region Revit Macros generated code
    private void InternalStartup()
    {
      this.Startup += new System.EventHandler(Module_Startup);
      this.Shutdown += new System.EventHandler(Module_Shutdown);
    }
    #endregion
  }
}

「ThisApplication.cs」はこれでOK。

何も書き加える必要はありません。

19行目のIdを後ほど使用します。

ボタンに搭載するプログラムの作成

タブやリボン、ボタンに搭載するプログラムを書いていきます。

これは専用でcsファイルを作っておくのが管理しやすいです。

csファイルの追加手順は下記記事をご覧ください。

SharpDevelopでcs作成
SharpDevelop(シャープデベロップ)のcsファイル追加手順|RevitAPISharpDevelop(シャープデベロップ)にcsファイルを追加する手順を紹介します。メインのソースコードがぐちゃぐちゃになる前に、適切なcsファイルを作って管理しましょう!...

新規csはClassで作成し、ひとまず下記サンプルコードをそのままコピペしてもらえればOKです。

/*
 * Created by SharpDevelop.
 * User: **********
 * Date: 2021/02/09
 * Time: 20:58
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;

using Autodesk.Revit.Attributes;

namespace RevitAPIyasan
{
  /// <summary>
  /// Description of Program.
  /// </summary>
  [Transaction(TransactionMode.Manual)]
  public class Program : IExternalCommand
  {
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
      TaskDialog.Show("Message", "test");
      return Result.Succeeded;
    }
  }
}

ここではクラス名を「Program」として、cs名は「Program.cs」です。

作成したプログラムはサンプルなので、TaskDialogでメッセージを表示する、というシンプルなものです^^

上記で29行目に書いているコードですね。

この部分を書き換えるとそれに応じて、実装したボタンを押したときに起動するプログラムの内容が変わりますよ。

参考
TaskDialogのカスタマイズ
RevitAPIのTaskDialog【実はもりもりカスタマイズできる】RevitAPIでよく使うTaskDialogクラスのあれこれカスタマイズ方法を紹介します。たかがTaskDialogでも色々な表示ができますよ。必要に応じてご利用ください^^...

タブ・リボン・ボタンを実装する

次に、Revitを起動したときにタブ・リボン・ボタンを呼び出すプログラムを書いていきます。

これも専用のcsファイルを作っておきます。

新規csファイルをClassで作成し、ひとまず下記をコピペしてください。

/*
 * Created by SharpDevelop.
 * User: **********
 * Date: 2021/02/09
 * Time: 20:59
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;

using System.Windows.Media.Imaging;

namespace RevitAPIyasan
{
  /// <summary>
  /// Description of Button.
  /// </summary>
  public class Button : IExternalApplication
  {
    public Autodesk.Revit.UI.Result OnShutdown(Autodesk.Revit.UI.UIControlledApplication application)
    {
      return Result.Succeeded;
    }
    public Autodesk.Revit.UI.Result OnStartup(Autodesk.Revit.UI.UIControlledApplication application)
    {
      string program = "RevitAPIyasan.Program";
      string dllPath = @"C:\ProgramData\Autodesk\Revit\Addins\2020\RevitAPIyasan.dll";
      string iconPath = @"C:\ProgramData\Autodesk\Revit\Addins\2020\RevitAPIyasan.ico";
      
      string tabName = "タブ1";
      application.CreateRibbonTab(tabName);
      
      string ribbonName1 = "リボン1";
      RibbonPanel ribbonPanel1 = application.CreateRibbonPanel(tabName, ribbonName1);
      
      string programName1 = "プログラム名1";
      string buttonName1 = "ボタン1";
      PushButton pushButton1 = ribbonPanel1.AddItem(new PushButtonData(programName1, buttonName1, dllPath, program)) as PushButton;
      pushButton1.LargeImage = new BitmapImage(new Uri(iconPath));
      
      ribbonPanel1.AddSeparator();
      
      string programName2 = "プログラム名2";
      string buttonName2 = "ボタン2";
      PushButton pushButton2 = ribbonPanel1.AddItem(new PushButtonData(programName2, buttonName2, dllPath, program)) as PushButton;
      pushButton2.LargeImage = new BitmapImage(new Uri(iconPath));
      
      string ribbonName2 = "リボン2";
      RibbonPanel ribbonPanel2 = application.CreateRibbonPanel(tabName, ribbonName2);
      
      string programName3 = "プログラム名3";
      string buttonName3 = "ボタン3";
      PushButton pushButton3 = ribbonPanel2.AddItem(new PushButtonData(programName3, buttonName3, dllPath, program)) as PushButton;
      pushButton3.LargeImage = new BitmapImage(new Uri(iconPath));
      
      return Result.Succeeded;
    }
  }
}

最初にアイコンを用意していない方は、45,52,60行目をコメントアウトしておいてください。

ここではクラス名を「Button」として、cs名は「Button.cs」です。

ビルドエラーの回避

このプログラムをこのままビルドすると、エラーになると思います。

ビルドエラー
RevitAPIアドイン化

というわけで、下記手順で「References」を追加します。

  • SharpDevelop左側のブロックより「References」を右クリック
  • 「Add References」を選択
RevitAPIアドイン化
  • 「GAC」タブより「PresentationCore」を選択し、ダブルクリック
  • 下の枠に追加されればOK
RevitAPIアドイン化
  • 「GAC」タブより「SystemXaml」を選択し、ダブルクリック
  • 下の枠に追加されればOK
RevitAPIアドイン化
  • 「GAC」タブより「WindowsBase」を選択し、ダブルクリック
  • 下の枠に追加されればOK
RevitAPIアドイン化
  • 下の枠に追加された3つをすべて選択する
  • 「OK」ボタンをクリック
RevitAPIアドイン化

ここで再度ビルドすると、今度はエラーがなくなるはずです。

コードの解説

「Button.cs」で書いたコードをざっくり解説しておきます。

まずは36,37行目、

string tabName = "タブ1";
application.CreateRibbonTab(tabName);

この部分で新しいタブを作成しています。

そして、39,40行目、

string ribbonName1 = "リボン1";
RibbonPanel ribbonPanel1 = application.CreateRibbonPanel(tabName, ribbonName1);

で新しいリボンを作り、42~45行目、

string programName1 = "プログラム名1";
string buttonName1 = "ボタン1";
PushButton pushButton1 = ribbonPanel1.AddItem(new PushButtonData(programName1, buttonName1, dllPath, program)) as PushButton;
pushButton1.LargeImage = new BitmapImage(new Uri(iconPath));

でボタンを実装した、という流れです。

ボタンをクリックしたときに実行されるプログラムは、「namespace名 + class名」で指定するため、ここでは、

string program = "RevitAPIyasan.Program";

としています。

ここでは作成するすべてのボタンで、前節で作成した「TaskDialogを表示するプログラム」を実行します。

ボタンをひとつ実装した後は、

ribbonPanel1.AddSeparator();

で、セパレータを設けて、

string programName2 = "プログラム名2";
string buttonName2 = "ボタン2";
PushButton pushButton2 = ribbonPanel1.AddItem(new PushButtonData(programName2, buttonName2, dllPath, program)) as PushButton;
pushButton2.LargeImage = new BitmapImage(new Uri(iconPath));

これで新しいボタンを作成。

あとは同じ流れで、リボンやボタンを追加していく感じです。

詳しくは出来上がったものと見比べてもらえれば分かりやすいかと思います^^

もっと知りたい方はこちら

RibbonPanel Class

PushButton Class

プログラムを起動するためのファイルを作成

先ほどまでに

  1. ボタン用のモジュール
  2. ボタンに載せるプログラム
  3. ボタンを実装するプログラム

を作成しました。

ここでは、以上のものをRevit起動時に呼び出すためのファイルを作成します。

まずはメモ帳を新規で開き、下記をコピペします。

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
  <AddIn Type="Application">
    <Name>RevitAPI屋さん</Name>
    <Assembly>RevitAPIyasan.dll</Assembly>
    <AddInId>4CF966AA-B412-48C4-8FD2-EF3AE0350DA1</AddInId>
    <FullClassName>RevitAPIyasan.Button</FullClassName>
    <VendorId>RevitAPI屋さん</VendorId>
    <VendorDescription>RevitAPI屋さん, http://revitapiyasan.com</VendorDescription>
  </AddIn>
</RevitAddIns>

ここで6行目のAddInIdは、「ThisApplication.cs」と同じものに書き換えてください。

RevitAPIアドイン化

これを名前を付けて保存します。

保存する拡張子は「.addin」で、名前は最初に作ったモジュール名と同じにしていたほうが分かりやすいです。

ここでは「RevitAPIyasan.addin」って感じですね。

保存先は下記のフォルダです。

C:\ProgramData\Autodesk\Revit\Addins\2020

「2020」はボタンを載せたいRevitのバージョンを指定してください。

このファイルの各行を解説しておくと、こんな感じです。

Name このファイルの名前。どのプログラムを動かすものか分かりやすい名前にしておくと良い。
Assembly 前章で作成したアセンブリ名(後ほど解説)
AddInId 先述のとおり
FullClassName タブ・リボン・ボタン作成のプログラムを記述した場所。「namespace + class」で書く。ここでは「RevitAPIyasan.Button」
VendorId 販売者名。空欄だとエラーになるので該当しなくても何かしら書いておく。
VendorDescription 販売者の説明。「販売者名, 販売者のURL」で書くがこれも空欄だとエラーになる。

タブ・リボン・ボタンの実装

すべてのデータを準備する

ここからは必ずRevitを閉じて作業します。

Revitのインターフェースにタブ・リボン・ボタンを実装するには、

  1. addinファイル
  2. dllファイル
  3. アイコン(必要であれば)

が必要です。

addinファイルは先ほど作成しましたね。

dllファイルは、下記に保存されています。

C:\ProgramData\Autodesk\Revit\Macros\2020\Revit\AppHookup\RevitAPIyasan\AddIn

「2020」はモジュールを作成したRevitのバージョンに置き換えてください。
「RevitAPIyasan」は作成したモジュール名に置き換えてください。

ここにあるdllファイルをコピーします。

RevitAPIアドイン化

そしてaddinファイルを保存した、下記フォルダに保存します。

C:\ProgramData\Autodesk\Revit\Addins\2020

「2020」はボタンを載せたいRevitのバージョンを指定してください。

最初にアイコンを作った方は、同じくこの場所に保存です。

こんな感じになっていればOKですね。

RevitAPIアドイン化

dllファイルとアイコンは、addinファイルと必ずしも同じ場所に置かなくてもOK。

その場合はaddinファイルの「Assembly」でdllファイルのある場所をフルパスで指定します。

「RevitAPIyasan.addin」のAssemblyをフルパスに
<Assembly>RevitAPIyasan.dll</Assembly>

また、「Button.cs」の33,34行目で指定したパスも変更します。

「Button.cs」のパスも変更
string dllPath = @"C:\ProgramData\Autodesk\Revit\Addins\2020\RevitAPIyasan.dll";
string iconPath = @"C:\ProgramData\Autodesk\Revit\Addins\2020\RevitAPIyasan.ico";

SharpDevelopを書換えるたびに、dllファイルの入替えが必要です。

アイコンのファイル名も変更するたびに書換えが必要なので、最初にしっかりと決めておいたほうが良いですよ^^

Revitを起動して、アドイン実行

以上ですべてのデータが揃いました。

Revitを起動してみましょう。

起動したらすぐに下のメッセージが出てくるかと思います。

RevitAPIアドイン化

これはざっくりいうと、

誰が作ったか分からんようなアドインが確認されたけど、どうします?

ってことです。

今まさに作成していたアドインのことですね^^

ここは「常にロード」でOKです。

RevitAPIアドイン化

これで次回以降に確認されることはありません。

エラーがなければ、タブ・リボン・ボタンが作成されているはずです。

RevitAPIアドイン化

どれでもいいので、ボタンを押してみます。

TaskDialogが表示されましたね。

RevitAPIアドイン化
どのボタンを押しても、実行されるプログラムは同じです。

これで世界にひとつだけ、オリジナルアドインの完成です^^

RevitAPI|プログラムのアドイン化|まとめ

以上、Revitのインターフェイスにタブ・リボン・ボタンを実装して、プログラムをアドイン化する手順でした。

いろいろと作業が多くて最初は苦労するかも知れないですが、慣れてくれば簡単です^^

ボタンから実行できるプログラムは見栄えもカッコいいので実践してみてください。

以上です。

RevitAPI独学用教材

最後に教材等を紹介します。

RevitAPIを理解してプログラムを作れるようになるには、C#の知識が必要です。

下記、オススメの参考書です。

プログラムが初心者にオススメのC#教材

イラストでの解説が分かりやすく、初めてのプログラミング学習にピッタリです。

プログラムの基礎知識がある人にオススメのC#教材

少し踏み込んだ内容まで学習でき、C#の知識が深まります。

美しいコードを書きたい人はこちら

個人的には、プログラマーひとり一冊は持っておくべきと思っている名作です^^
スポンサーリンク



Revitアドイン作ります

のんびり学習してる余裕などない!という方にご案内です。

ランサーズにてRevitのアドイン作成を承っております!

スキル、資格等の詳細はプロフィールをご覧ください。

ご質問などもお気軽にメッセージしていただければと思います。

詳しくは下の記事にまとめています。

【開発依頼】あなただけのRevitアドインを真心込めて作ります!RevitAPIを使ったアドイン開発を承ります。1から学習してアドイン作る余裕がない、外注でアドイン作成を依頼したい、という方はご利用をご検討いただければと思います^^...

最後まで読んでいただき、ありがとうございました^^

以上です。