获取 AutoCAD 块句柄 - 带有 Attout 的不同结果 VB.NET

Get AutoCAD Block Handle - Differing Results w/ Attout VB.NET

我有一个属性制表符分隔的文本文件,我想将其应用到多个绘图。为了让 AutoCAD 不弹出并说 "One or more blocks could not be found, do you want to select the data interactively?" ,我必须使用块的 HANDLE 属性 。在给定的绘图上,如果我使用 ATTOUT 查看我的块的句柄,我会得到一个值,例如 '8B3F。将 ATTIN 与该 Handle 一起使用是可行的。将此应用于具有不同句柄的多个图形,如果每个图形,我必须获取每个块的句柄。这是我的代码 - 将句柄写入 excel 文档。

            xlbook = xlapp.Workbooks.Open(attInText,, False)
            xlsheet = xlbook.Worksheets(dwgName)

            Dim Handle As String = ""
            'get the handle to the CHS11x17TB title block
            For Each blk As AutoCAD.AcadBlock In cadDOC.Blocks
                If blk.Name.ToUpper = "CHS11X17TB" Then
                    Handle = blk.Handle
                    xlsheet.Cells(2, "A").value = Handle
                    Exit For
                End If
            Next

现在,问题是句柄与使用 ATTOUT 生成的句柄不同 - 我将使用代码得到类似 '75B0 的东西。为什么你认为 ATTOUT 给我的处理方式与循环遍历绘图块不同?我会注意到我的块在图纸空间中,如果这有什么不同的话。如果无法回答该问题,我对获取块句柄的任何替代解决方案感兴趣。

您似乎混淆了包含在块 table (Blocks) 中的块定义 (Block) 和插入到 ModelSpace 或 PaperSpace 中的块引用 (BlockReference)。 这是一个未经测试的片段,其中 serac 用于模型 space 中的块引用(您可以将 ModelSpace 替换为 PaperSpace 以搜索活动论文 space.

        xlbook = xlapp.Workbooks.Open(attInText,, False)
        xlsheet = xlbook.Worksheets(dwgName)

        Dim Handle As String = ""
        'get the handle to the CHS11x17TB title block
        For Each obj As AutoCAD.AcadObject In cadDOC.ModelSpace
            If obj.ObjectName = "AcDbBlockReference" Then
                If obj.EffectiveName.ToUpper = "CHS11X17TB" Then
                    Handle = obj.Handle
                    xlsheet.Cells(2, "A").value = Handle
                    Exit For
                End If
            End If
        Next

以下是我为让它发挥作用所做的工作。我想要的块引用在图纸空间中。请注意,EntityType 7 是一个 AcadBlockReference。

      Dim Handle As String = ""
            Dim count As Integer
            count = cadDOC.PaperSpace.Count

            Dim newObjs(count) As AutoCAD.AcadEntity
            Dim index As Integer

            For index = 0 To count - 1
                newObjs(index) = cadDOC.PaperSpace.Item(index)
            Next

            For i = 0 To count - 1
                Try
                    If newObjs(i).EntityType = 7 Then
                        Dim blk As AutoCAD.AcadBlockReference = newObjs(i)
                        If blk.Name.ToUpper = "CHS11X17TB" Then
                            Handle = "'" & blk.Handle
                        End If

                    End If
                Catch ex As Exception

                End Try


            Next