获取 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
我有一个属性制表符分隔的文本文件,我想将其应用到多个绘图。为了让 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