获取AutoCAD Block Handle - 使用VB.NET实现不同的结果

时间:2017-11-20 17:22:06

标签: vb.net autocad autocad-plugin

我有一个属性制表符分隔文本文件,我想将其应用于多个绘图。为了不弹出AutoCAD并说“#34;找不到一个或多个块,是否要以交互方式选择数据?" ,我必须使用块的HANDLE属性。在给定的图纸上,如果我使用ATTOUT查看我的块的句柄,我会得到一个诸如' 8B3F之类的值。使用ATTIN与Handle一起工作。将此应用于具有不同手柄的多个绘图,如果每个绘图,我必须获取每个块的句柄。这是我的代码 - 将句柄写入excel doc。

            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

现在,问题是Handle与使用ATTOUT生成的句柄不同 - 我会使用代码获得类似于' 75B0的内容。为什么你认为ATTOUT给我一个不同的句柄而不是循环绘制图块?我会注意到我的块是在纸空间,如果这有任何区别。如果这个问题无法回答,我对任何替代解决方案感兴趣,以获得我的块的句柄。

2 个答案:

答案 0 :(得分:3)

看起来你混淆了块表(Blocks)中包含的块定义(Block)和插入ModelSpace或PaperSpace中的块引用(BlockReference)。 这是一个未经测试的片段,其中包含模型空间中块参考的serac(您可以使用PaperSpace替换ModelSpace以搜索活动图纸空间。

        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

答案 1 :(得分:0)

这就是我为使其发挥作用所做的一切。我想要的块引用是在paperpace中。请注意,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