Issue
AutoCAD のパレット形式のダイアログ ボックスを作成する手順を教えてください。
Solution
AutoCAD .NET API を利用するアプリケーションは、AutoCAD .NET API クラス ライブラリが提供する Autodesk.AutoCAD.Windows 名前空間で公開されたクラスを利用することでは、AutoCAD 固有のユーザ インタフェースであるパレット ダイアログの機能を提供します。
1. AutoCAD .NET API 用のプロジェクトにユーザー コントロールを追加します。
2. 追加したユーザーコントロールの Name プロパティを確認します。ここでは UserControl1 と仮定します。
3. 必要なコントロールをドラッグ&ドロップでユーザー コントロール上に配置します。この操作で、ユーザ コントロール モジュール(UserControl1.vb) がプロジクトに追加されます。
配置したコントロールは、次のようなコントロール名を持っていると仮定します。
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) 内に、パレット表示用のコマンドを定義します。
正常に実装できれば、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