2017-01-02 67 views
0

私はvb.netを使用しています。私はblockreference、ブロック名 "Tab1"を取ることができます。今私はこのブロックを取得するブロックの属性を編集するには、私はそれを行う方法がわからないが、私はggで検索しますが、結果はありません。vb.netのautocadがブロック参照を取得するwinform

Dim appProgID As String = "Autocad.Application" 
Dim fname As String = "C:\Users\Kid\Downloads\IDEA FOR TOOL\TEST\TABLE ATTRIBUTE.dwg" 

Dim AcadType As Type = Type.GetTypeFromProgID(appProgID) 


Dim AcadApp As Object = Activator.CreateInstance(AcadType) 
Dim visargs() As Object = New Object(0) {} 
visargs(0) = False 
AcadApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, Nothing, AcadApp, visargs, Nothing) 
Dim AcadDocs As Object = AcadApp.GetType().InvokeMember(
"Documents", BindingFlags.GetProperty, Nothing, AcadApp, Nothing) 


Dim args() As Object = New Object(1) {} 
args(0) = fname 
args(1) = False 

Dim AcDoc As Object = AcadDocs.GetType.InvokeMember(
    "Open", BindingFlags.InvokeMethod, Nothing, AcadDocs, args, Nothing) 

AcadApp.GetType.InvokeMember(
    "ActiveDocument", BindingFlags.GetProperty, Nothing, AcadApp, Nothing, Nothing) 

AcDoc = AcadApp.GetType.InvokeMember(
"ActiveDocument", BindingFlags.GetProperty, Nothing, AcadApp, Nothing, Nothing) 


Dim AcadModel As Object = AcDoc.GetType.InvokeMember("modelspace", BindingFlags.GetProperty, Nothing, AcDoc, Nothing) 
Dim entity As Object 
For Each entity In AcadModel 
If TypeName(entity) = "IAcadBlockReference" Then 
'here i want to take this block has name "tab1"  
End If 
Next 

enter image description here

答えて

1

あなたはInvokeMemberを使用する必要はありません、VB.NETは、遅延バインディングをサポートしています。

Dim acadType As Type = Type.GetTypeFromProgID("AutoCAD.Application") 
Dim acadApp = Activator.CreateInstance(acadType) 
acadApp.Visible = true 
Dim doc = acadApp.Documents.Open("C:\Users\Kid\Downloads\IDEA FOR TOOL\TEST\TABLE ATTRIBUTE.dwg") 
Dim entity 
For Each entity In doc.ModelSpace 
    If entity.ObjectName = "AcDbBlockReference" AndAlso _ 
    String.Equals(entity.Name, "Tab1", StringComparison.OrdinalIgnoreCase) Then 
    Dim att 
    For Each att In entity.GetAttributes() 
     If att.TagString = "A" Then 
     att.TextString = "Your value" 
     End If 
    Next   
    End If 
Next 

あなたは自動補完を持っているしたい場合は、ObjectARX SDKをダウンロードし、お使いのVSプロジェクトに次のCOM参照を追加する必要があります。

  1. C:\のObjectARX 20 .. \ INC-x64の\オートデスク.AutoCAD.Interop.dll
  2. C:\のObjectARX 20 .. \ INC-x64の\ Autodesk.AutoCAD.Interop.Common.dllその後

あなたはこのように型指定された変数を使用することができるようになります:

Dim acadApp As AcadApplication = Activator.CreateInstance(acadType) 
+0

感謝@maxence、私はハイテクMacxenceを – Kid2611

+0

しようと、私はあなたの方法を試してみましたが、私は、デバッグを実行するときに重要なのは、このブロックから属性を取得する方法ですが、私は任意のプロパティやメソッドの属性を見ることができません。これについてもっと教えていただけますか?どうもありがとうございました – Kid2611

+0

私は自分の答えを – Maxence

関連する問題