DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン ユーザーフォームに埋め込んだAutoCADの変化を捉える /SASAYAN (24/07/21(Sun) 17:46) #35623


親記事 / 返信無し
■35623 / 親階層)  ユーザーフォームに埋め込んだAutoCADの変化を捉える
□投稿者/ SASAYAN 一般人(1回)-(2024/07/21(Sun) 17:46:55)
  • アイコン環境/言語:[VB.NET FrameWork4.8] 
    分類:[.NET] 

    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の変化を捉える部分でうまくいきません。
    よろしくお願いします。

違反を報告
[ □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -