我有一个属性制表符分隔文本文件,我想将其应用于多个绘图。为了不弹出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给我一个不同的句柄而不是循环绘制图块?我会注意到我的块是在纸空间,如果这有任何区别。如果这个问题无法回答,我对任何替代解决方案感兴趣,以获得我的块的句柄。
答案 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