こんにちは、AMDlabの森山です。最近は寒くなってきましたね。事務所によってはキーボードをたたく手が少し辛い時期です。
少し前回の投稿から日が開いてしまいました。前回の続きからやっていきましょう。
今日の目標
今回は前回つくったHelloWorldコマンドにアイコンを追加して、アイコンをクリックしたらそのコマンドが起動するようにしてみましょう。
今回紹介する方法はAutoCADに限らず、アドイン制作するうえではよく使うテクニックです。
アイコンの作成
では、さっそくやっていきましょう。今回はAMDlabのアイコンを使用しようと思います。
まずは前回のようにdllファイルの参照を増やします。AdWindowsにパスを通しておきましょう。
ソリューションエクスプローラーから使用するアイコン画像を追加し、埋め込みリソースに変更しておきます。
少しだけAutoCADの用語を整理しておきます。AutoCADでのリボンとは下の画像を指します。
AutoCADの上の部分ですね。ここから入れ子状に名前が変わっていきます。
ホーム、挿入、注釈などが書いてある部分はタブ
作成、修正、注釈と書いてある部分をパネル
線分、文字、寸法記入などが書いてある部分をボタン
と定義しています。
そして、タブを扱うクラスはRibbonTabクラス、パネルを扱うクラスはRibbonPanel、ボタンを扱うクラスはRibbonButtonクラスとなります
では、コードを書いていきましょう。
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 |
using Autodesk.Windows; using System.Windows.Media.Imaging; using System.Reflection; public class Icon { public void IconButton() { RibbonControl ribbonControl = ComponentManager.Ribbon; RibbonTab Tab = new RibbonTab(); //タブの作成 Tab.Title = "Extra"; Tab.Id = "EXTRA_TAB_ID"; ribbonControl.Tabs.Add(Tab); //パネルの作成 RibbonPanelSource srcPanel = new RibbonPanelSource(); srcPanel.Title = "HelloWorld"; srcPanel.Id = "HelloWorld"; RibbonPanel Panel = new RibbonPanel(); Panel.Source = srcPanel; Tab.Panels.Add(Panel); //ボタンの作成 RibbonButton button = new RibbonButton(); // 埋め込みソースの画像を使う場合には名前空間.画像名とします button.Text = "HelloWorld"; button.Size = RibbonItemSize.Large; button.Image = LoadImage("AMDsample.Logo100.jpg", 32, 32); button.LargeImage = LoadImage("AMDsample.Logo100.jpg", 64, 64); button.ShowText = true; RibbonRowPanel rowPanel = new RibbonRowPanel(); rowPanel.Items.Add(button); rowPanel.Items.Add(new RibbonRowBreak()); srcPanel.Items.Add(rowPanel); RibbonSeparator rsP = new RibbonSeparator(); rsP.SeparatorStyle = RibbonSeparatorStyle.Invisible; srcPanel.Items.Add(rsP); Tab.IsActive = true; } //画像のBitmap化 public BitmapImage LoadImage(string imageName, int Height, int Width) { BitmapImage image = new BitmapImage(); image.BeginInit(); image.StreamSource = Assembly.GetExecutingAssembly().GetManifestResourceStream(imageName); image.DecodePixelHeight = Height; image.DecodePixelWidth = Width; image.EndInit(); return image; } } |
デバッグしてみましょう。このようにアイコンが作成できましたか?以前実装したComannd.csでクラスを使用することを忘れないようにしてください。
ボタンができたら少しうれしいですね。たくさんクリックしてしまいます。
しかしこの状態ではボタンがあるだけで、押しても何も起きません。次はCommandHandlerを作ってみましょう。
コマンドハンドラーの作成
さて、AutoCADにはjavascriptのようなクリックイベントというものはありません。
そこで、アイコンがクリックされたらHelloWorldがコマンドラインに打ち込まれるように作成します。
ちなみにAutoCADはよくみると他のデフォルトアイコンもそのように作られています。
では、コードを書いていきます。
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 |
using System; using Autodesk.Windows; using Autodesk.AutoCAD.ApplicationServices; public class CommandHandler : System.Windows.Input.ICommand { public bool CanExecute(object parameter) { return true; } public event EventHandler CanExecuteChanged; public void Execute(object parameter) { Document doc = Application.DocumentManager.MdiActiveDocument; if (parameter is RibbonButton) { RibbonButton button = parameter as RibbonButton; RibbonCommandItem cmd = parameter as RibbonCommandItem; doc.SendStringToExecute((string)cmd.CommandParameter, true, false, true); doc.Editor.WriteMessage("\nRibbonButton Executed: " + button.Text + "\n"); } } } |
これは割とテンプレ文なように感じます。
アイコンを押したら機能するようにする
さて、ここまで来たら後一息です。先ほどのIconclassをこのようにしましょう。
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 |
public class Icon { public bool _added = false; public void IconButton() { //タブに同じものがない場合は実行されるようにする if (!_added) { RibbonControl ribbonControl = ComponentManager.Ribbon; RibbonTab Tab = null; foreach (RibbonTab tab in ribbonControl.Tabs) { if (tab.AutomationName == "Extra") { Tab = tab; break; } } if (Tab == null) { //タブの作成 Tab = new RibbonTab(); Tab.Title = "Extra"; Tab.Id = "EXTRA_TAB_ID"; ribbonControl.Tabs.Add(Tab); //パネルの作成 RibbonPanelSource srcPanel = new RibbonPanelSource(); srcPanel.Title = "HelloWorld"; srcPanel.Id = "HELLOWORLD_ID"; RibbonPanel Panel = new RibbonPanel(); Panel.Source = srcPanel; Tab.Panels.Add(Panel); //ボタンの作成、コマンドハンドラー実装 RibbonButton button = new RibbonButton(); button.CommandHandler = new CommandHandler(); button.CommandParameter = "._HelloWorld "; // 埋め込みソースの画像を使う場合には名前空間.画像名とします button.Text = "HelloWorld"; button.Size = RibbonItemSize.Large; button.Image = LoadImage("AMDsample.Logo100.jpg", 32, 32); button.LargeImage = LoadImage("AMDsample.Logo100.jpg", 64, 64); button.ShowText = true; RibbonRowPanel ribRowPanel = new RibbonRowPanel(); ribRowPanel.Items.Add(button); ribRowPanel.Items.Add(new RibbonRowBreak()); srcPanel.Items.Add(ribRowPanel); RibbonSeparator rsP = new RibbonSeparator(); rsP.SeparatorStyle = RibbonSeparatorStyle.Invisible; srcPanel.Items.Add(rsP); Tab.IsActive = true; _added = true; } } } |
実は先ほどのままではHelloWorldを打つたびにリボン、タブ、パネル、ボタンが増殖することにお気づきでしょうか?
そこでif文を追加して、リボン内に同じ名前がないかどうかを検索して、もしなければ作る、というようにしています。
では、デバッグしていきましょう。
動きましたか?
このようにするとアイコンをクリックして動くようになります。
次回はCSVファイルを使用して簡単な図面を描けるようなプログラムにしてみましょう。
補足
button.CommandParameter = “._HelloWorld “;部分の最初の._と最後の半角スペースを忘れないようにしてください。AutoCADの作法のようなものです…(2019/12/1追記)
COMMENTS