Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoCAD .NET API:パレット ダイアログを作成する方法

Issue

AutoCAD のパレット形式のダイアログ ボックスを作成する手順を教えてください。

 

Solution

AutoCAD .NET API を利用するアプリケーションは、AutoCAD .NET API クラス ライブラリが提供する Autodesk.AutoCAD.Windows 名前空間で公開されたクラスを利用することでは、AutoCAD 固有のユーザ インタフェースであるパレット ダイアログの機能を提供します。 

 
1.    AutoCAD .NET API 用のプロジェクトにユーザー コントロールを追加します。    

       

ToshiakiIsezaki_0-1786265182033.png

 

 2.    追加したユーザーコントロールの Name プロパティを確認します。ここでは UserControl1 と仮定します。

 

ToshiakiIsezaki_1-1786265180066.png

 

           
3.    必要なコントロールをドラッグ&ドロップでユーザー コントロール上に配置します。この操作で、ユーザ コントロール モジュール(UserControl1.vb) がプロジクトに追加されます。
     

ToshiakiIsezaki_2-1786265180030.png


配置したコントロールは、次のようなコントロール名を持っていると仮定します。
     

ToshiakiIsezaki_3-1786265179995.png

 


4.    ユーザーコントロールのコード ウィンドウに Imports を追記します。これは、コマンド定義モジュール Class1.vb とは別モジュールでフォーム モジュールが挿入されているためです。

 

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Windows

Public Class UserControl1
                           :     

 

5.    文字スタイル作成 ボタン(Button1) のプロシージャを記述します。

 

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click

    Dim oDb As Database = HostApplicationServices.WorkingDatabase
    Dim oTr As Transaction = oDb.TransactionManager.StartTransaction

    Try

        Dim oDocLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument

        Dim oTt As TextStyleTable = oTr.GetObject(oDb.TextStyleTableId, OpenMode.ForWrite)
        Dim oTtr As TextStyleTableRecord
        If Not oTt.Has(TextBox1.Text) Then
            oTtr = New TextStyleTableRecord
            oTtr.Name = TextBox1.Text
            oTtr.FileName = "romans.shx"
            oTtr.BigFontFileName = "extfont2.shx"
            oTt.Add(oTtr)
            oTr.AddNewlyCreatedDBObject(oTtr, True)
        Else
            MsgBox("既に文字スタイルが存在しています")
        End If

        oTr.Commit()

        oDocLock.Dispose()

    Catch oEx As Exception
        MsgBox(oEx.ToString())
    Finally
        oTr.Dispose()
    End Try

End Sub

 

AutoCAD のコマンドは、実行時に表示されている図面ウィンドウ(ドキュメント) に依存しています。コマンド実行時に一番手前に表示されている図面に実行結果が適用されるのはこのためです。Windows フォームの作成手順 で紹介したダイアログ ボックスはモーダル ダイアログ ボックスと言われるもので、ダイアログ ボックス表示中にマウス操作で図面ウィンドウを切り替えることができません。つまり、コマンドの実行対象となるドキュメントを変更できません。

 

ところが、パレット ダイアログは、ダイアログ表示中に図面ウィンドウを切り換えてしまうことができます。これは、パレット ダイアログがモードレス ダイアログ ボックスであるためです。このため、どのドキュメントにコマンドを適用するか、対象ドキュメントを特定をしなければなりません。この操作が、下線で示した ドキュメント ロックの作業です。モードレス ダイアログからの直接操作時にドキュメント ロックを怠ると、AutoCAD のが異常終了の原因になります。
      
6.    コマンド呼び出し時に使用するパレットセットとパレット用の変数を、コマンド定義モジュール(Class1.vb) 内で宣言します。

 

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Colors
Imports Autodesk.AutoCAD.Windows
 
Public Class Class1
 
    ' パレットセットとパレット用変数の宣言
    Public Shared oP As UserControl1 = Nothing
    Public Shared oPs As Autodesk.AutoCAD.Windows.PaletteSet = Nothing
                           :

 

7. コマンド定義モジュール(Class1.vb) 内に、パレット表示用のコマンドを定義します。

 

  • このコマンドは、Shared キーワードを使ったスタティック コマンドとして宣言されています。この方法で宣言したコマンドは、Shared キーワードを使わずに宣言したインスタンス コマンドとは異なり、ドキュメント毎にインスタンス化されません。これにより、ドキュメント毎にパレット ダイアログが表示されてしまうことを抑止できます。 
  • ビルド時に PaletteSet クラスの使用箇所で「実装されたインターフェイス 'System.Windows.Interop.IWin32Window' を含むアセンブリ 'PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' への参照が必要です。参照をプロジェクトに追加してください。」のビルドエラーが表示される場合には、PresentationCore.dll アセンブリをプロジェクトの参照設定に加えてください。      

正常に実装できれば、ShowPalette コマンドで次のようなパレット ボックスが表示されて、入力した文字スタイル名で文字スタイルが作成されます。

 

<CommandMethod("ShowPalette")> _
Public Shared Sub MyPalette()

    ' パレットセットの作成
    If oPs Is Nothing Then
        oPs = New Autodesk.AutoCAD.Windows.PaletteSet(“文字スタイル")
        oPs.Style = PaletteSetStyles.ShowPropertiesMenu Or _
                    PaletteSetStyles.ShowAutoHideButton Or _
                    PaletteSetStyles.ShowCloseButton Or _
                    PaletteSetStyles.Snappable
       oPs.MinimumSize = New System.Drawing.Size(300, 200)
       oPs.Visible = True
    Else
       oPs.Visible = True
    End If

    ' パレットの作成
    If oPs.Count = 0 Then
        oP = New UserControl1
        oPs.Add(“文字スタイル作成", oP)
    End If

    oPs.Dock = DockSides.None
    oPs.Size = New System.drawing.Size(300, 200)

End Sub

 

ToshiakiIsezaki_4-1786265180944.png