2011年1月31日月曜日

CUIx ファイルを使わずにリボンにボタンを追加する(AutoCAD 2011)


いろいろググッてみたりして、リボンにボタンを追加できないかやってみました。


通常の操作では、CUI[ユーザ インタフェースをカスタマイズ] コマンドを実行して、CUIx ファイルをカスタマイズすると思うんですが、今回は CUIx ファイルを使わずに .NET でボタンの設定ができないかやってみました。


試してみたコードはこんな感じです。


' ------------------------------------------------------------
Imports System
Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Media.Imaging
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.Windows
Imports Autodesk.AutoCAD.Ribbon.RibbonServices

' This line is not mandatory, but improves loading performances
<Assembly: CommandClass(GetType(AVDO_RibbonSample.MyCommands))>

Namespace AVDO_RibbonSample

    Public Class MyCommands

        <CommandMethod("AVDO_RibbonSample", "AVDO_RibbonSample", "AVDO_RibbonSample", CommandFlags.Modal)> _
        Public Sub AVDO_RibbonSample()
            Dim ribCtrl As RibbonControl = RibbonPaletteSet.RibbonControl

            ' リボンにタブを追加
            Dim ribTab As New RibbonTab
            ribTab.Title = "テスト"
            ribTab.Id = "ID_TEST"       ' ID を設定しないと、AutoCAD を終了するときにエラーが発生してしまう。
            ribCtrl.Tabs.Add(ribTab)

            ' パネルを作成
            Dim ribSourcePanel As New Autodesk.Windows.RibbonPanelSource
            ribSourcePanel.Title = "テスト パネル"
            Dim ribPanel As New RibbonPanel
            ribPanel.Source = ribSourcePanel
            ribTab.Panels.Add(ribPanel)

            ' ボタン1を作成
            Dim ribButton1 As New RibbonButton

            Dim bi1 As New BitmapImage()
            bi1.BeginInit()
            bi1.UriSource = New Uri("c:/temp/acadvideo16.jpg", UriKind.RelativeOrAbsolute)
            bi1.EndInit()
            ribButton1.Image = bi1

            ribButton1.Text = "テスト 線分"
            ribButton1.ShowText = True
            ribButton1.Description = "テスト用のボタンのひとつ目です"
            ribButton1.CommandParameter = Chr(27) & Chr(27) & "_LINE "
            ribButton1.CommandHandler = New AdskCommandHandler

            ' ボタン2を作成
            Dim ribButton2 As New RibbonButton

            Dim bi2 As New BitmapImage()
            bi2.BeginInit()
            bi2.UriSource = New Uri("c:/temp/acadvideo32.jpg", UriKind.RelativeOrAbsolute)
            bi2.EndInit()
            ribButton2.LargeImage = bi2
            ribButton2.Size = RibbonItemSize.Large

            ribButton2.Text = "テスト 円"
            ribButton2.ShowText = True
            ribButton2.Description = "テスト用のボタンのふたつ目です"
            ribButton2.CommandParameter = Chr(27) & Chr(27) & "_CIRCLE "
            ribButton2.CommandHandler = New AdskCommandHandler

            ' ボタンを追加
            ribSourcePanel.Items.Add(ribButton1)
            ribSourcePanel.Items.Add(New RibbonRowBreak())
            ribSourcePanel.Items.Add(ribButton2)

        End Sub

        Public Class AdskCommandHandler
            Implements System.Windows.Input.ICommand

            Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
                Return True
            End Function

            Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As System.EventArgs) Implements System.Windows.Input.ICommand.CanExecuteChanged

            Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute
                'is from a Ribbon Button?
                Dim ribBtn As RibbonButton = TryCast(parameter, RibbonButton)
                If ribBtn IsNot Nothing Then
                    Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute(DirectCast(ribBtn.CommandParameter, [String]), True, False, True)
                End If

                'is from s Ribbon Textbox?
                Dim ribTxt As RibbonTextBox = TryCast(parameter, RibbonTextBox)
                If ribTxt IsNot Nothing Then
                    MsgBox(ribTxt.TextValue)
                End If
            End Sub
        End Class

    End Class

End Namespace
' ------------------------------------------------------------

AVDO_RibbonSample コマンドを実行すると、リボンに[テスト]が追加されて、その中に[テスト パネル]ができて、[テスト 線分]と[テスト 円]というボタンが追加されました。

※ c:/temp フォルダに、16X16 のイメージファイル acadvideo16.jpg と 32x32 のイメージファイル acadvideo32.jpg を置いています。

0 件のコメント:

コメントを投稿