VB.NETでAutoCADに連携する方法で困っています。
起動中のAutoCADに複数のドキュメント(ファイル)が開いているとします。
ファイルタブが複数あって、これをクリックして切り替えるたびに発生する
イベントを捉えてリストボックスにレイヤーのリストを表示させたいです。
ファイルタブの切り替えを捉えるのにどの様に記述すればよいか困っています。
コードの40行目あたりの
Dim docManager As DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager
AddHandler docManager.DocumentActivated, AddressOf Me.DocumentActivated
ここで引っ掛かってしまいます。
現在のコード
Imports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Microsoft.VisualBasic
Public Class Form1
Private acadApp As AcadApplication
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
' 新しいAutoCADアプリケーションを作成
acadApp = New AcadApplication()
acadApp.Visible = True
Catch ex As System.Runtime.InteropServices.COMException
MessageBox.Show("AutoCADのインスタンスを作成できませんでした: " & ex.Message)
Return
Catch ex As Exception
MessageBox.Show("予期しないエラーが発生しました: " & ex.Message)
Return
End Try
If acadApp Is Nothing Then
MessageBox.Show("AutoCADアプリケーションを初期化できませんでした。")
Return
End If
' AutoCADのウィンドウをForm1の指定位置に埋め込む
Dim acadHandle As IntPtr = New IntPtr(acadApp.HWND)
SetParent(acadHandle, Me.Handle)
' 初期位置とサイズを設定
ResizeAutoCADWindow()
' Form1のリサイズイベントにハンドラを追加
AddHandler Me.Resize, AddressOf Form1_Resize
' 初回のレイヤーリストを取得して表示
PopulateLayerList()
' ドキュメントアクティベートイベントの追加
Dim docManager As DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager
AddHandler docManager.DocumentActivated, AddressOf Me.DocumentActivated
End Sub
Private Sub Form1_Resize(sender As Object, e As EventArgs)
' AutoCADウィンドウをForm1の新しいサイズに合わせてリサイズ
ResizeAutoCADWindow()
End Sub
Private Sub ResizeAutoCADWindow()
Dim acadHandle As IntPtr = New IntPtr(acadApp.HWND)
' panelControlsの右側にAutoCADウィンドウを表示する
Dim leftPosition As Integer = panelControls.Width
Dim topPosition As Integer = 0
Dim width As Integer = Me.ClientSize.Width - panelControls.Width
Dim height As Integer = Me.ClientSize.Height
MoveWindow(acadHandle, leftPosition, topPosition, width, height, True)
End Sub
Private Sub PopulateLayerList()
Try
' Layer_LBをクリア
If Layer_LB Is Nothing Then
MessageBox.Show("Layer_LBが初期化されていません。")
Return
End If
Layer_LB.Items.Clear()
' AutoCADの現在のドキュメントを取得
Dim activeDoc As AcadDocument = acadApp.ActiveDocument
' レイヤーを取得してリストボックスに追加
For Each layer As AcadLayer In activeDoc.Layers
Layer_LB.Items.Add(layer.Name)
Next
Catch ex As Exception
MessageBox.Show("レイヤーリストの取得中にエラーが発生しました: " & ex.Message)
End Try
End Sub
' ドキュメントがアクティブになったときにレイヤーリストを更新する
Private Sub DocumentActivated(sender As Object, e As DocumentCollectionEventArgs)
PopulateLayerList()
End Sub
' WinAPI関数の宣言
<System.Runtime.InteropServices.DllImport("user32.dll")>
Private Shared Function SetParent(hWndChild As IntPtr, hWndNewParent As IntPtr) As IntPtr
End Function
<System.Runtime.InteropServices.DllImport("user32.dll")>
Private Shared Function MoveWindow(hWnd As IntPtr, x As Integer, y As Integer, nWidth As Integer, nHeight As Integer, bRepaint As Boolean) As Boolean
End Function
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
' AutoCADアプリケーションをクリーンアップ
If acadApp IsNot Nothing Then
Try
acadApp.Quit()
Catch ex As Exception
' 例外が発生しても続行
Finally
' COMオブジェクトの解放
Marshal.ReleaseComObject(acadApp)
acadApp = Nothing
End Try
End If
' ドキュメントアクティベートイベントの削除
Dim docManager As DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager
RemoveHandler docManager.DocumentActivated, AddressOf Me.DocumentActivated
End Sub
End Class
ここまでフォーム上にAutoCADを埋め込み表示させるまでできましたが
肝心のAutoCADの変化を捉える部分でうまくいきません。
よろしくお願いします。