【问题标题】:vb.net autocad get blockreference winformvb.net autocad 获取块引用 winform
【发布时间】:2017-01-08 17:35:34
【问题描述】:

我使用 vb.net 来开发 winform 应用程序。我可以使用块引用,块名称“Tab1”。现在我想获取这个块来编辑块属性,但我不知道该怎么做,我在 gg 上搜索但没有结果。

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

【问题讨论】:

    标签: vb.net winforms autocad


    【解决方案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并将以下COM引用添加到你的VS项目中:

    1. C:\ObjectARX 20..\inc-x64\Autodesk.AutoCAD.Interop.dll
    2. C:\ObjectARX 20..\inc-x64\Autodesk.AutoCAD.Interop.Common.dll

    然后你就可以像这样使用类型化变量了:

    Dim acadApp As AcadApplication = Activator.CreateInstance(acadType)
    

    【讨论】:

    • 嗨 Macxence,我试过你的方法,但重要的是如何从这个块中获取属性,当我运行调试时我看不到任何属性或方法属性。你能告诉我更多关于这个吗?非常感谢你
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 2018-03-15
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多