Arizona 发表于 2007-4-2 09:31:33

遍历整个图形

在下面的示例中,我遇到了一点困难,我在模型空间中循环,并用图形中的块引用填充列表框。但是,我不知道如何在同一时间遍历整个图形(图纸和模型空间)
谢谢
马克
For Each Obj In ThisDrawing.ModelSpace
If TypeOf Obj Is AcadBlockReference Then
ListBox1.AddItem (Obj.Name)
End If

下一个Obj
**** Hidden Message *****

Jeff_M 发表于 2007-4-2 10:19:46

您正在使用选择集吗?或者你考虑过吗
Set objSelCol = objDoc.SelectionSets
For Each objSelSet In objSelCol
    If objSelSet.Name = "blk_out" Then
      objSelSet.Delete
      Exit For
    End If
Next objSelSet
Set objSelSet = objSelCol.Add("blk_out")
intType(0) = 0
varData(0) = "INSERT"
objSelSet.Select 5, filtertype:=intType, _
filterdata:=varData
For Each objEnt In objSelSet

Jeff_M 发表于 2007-4-2 11:09:52

如果您不想使用选择集(使用ObjectDBX时会出现这种情况),则需要遍历Layouts集合,然后遍历它们的每个块。
For Each oLayout in Doc
   For Each oEnt in oLayout.Block
.....

DaveW 发表于 2007-4-3 10:52:52


酷。两种方法都有意义。
谢谢

Arizona 发表于 2007-4-3 10:55:22


实际上,我不认为您可以通过布局访问块集合
标记

Arizona 发表于 2007-4-3 12:18:43

我不认为
这是杰夫的意思。
布局对象的“Block”属性是访问表示该布局的块表记录的方式。

Arizona 发表于 2007-4-3 12:51:23

没错,查克。
现在,如果我无意中在oLayout.Block中添加了一个s,那么就会像马克所想的那样出现错误......但是我确实尽量不犯那种打字错误

DaveW 发表于 2007-4-3 13:15:51


哦,我明白了,这将返回布局的名称(我想)
不,我要找的是插入到纸张中的块引用。
上面的选择集方法可以很好地工作。
谢谢你
马克

Jeff_M 发表于 2007-4-4 08:31:10

Mark -
将此代码放入窗体上的命令按钮中,看看会发生什么:
Dim Doc As AcadDocument
Dim oLayout As AcadLayout
Dim oEnt As AcadEntity
Set Doc = ThisDrawing
For Each oLayout In Doc.Layouts
   For Each oEnt In oLayout.Block
      If TypeOf oEnt Is AcadBlockReference Then
         ListBox1.AddItem (oEnt.Name)
      End If
   Next oEnt
Next oLayout

这将遍历图形中的每个布局,并将任何块引用添加到列表框中。
这就是Jeff和Chuck试图引导您的地方。事实上,图形中的每个布局都是一个可以包含对象的块。您可以循环访问块并查找块中包含的对象,就像循环访问模型空间或图纸空间一样。高温

Arizona 发表于 2007-4-4 10:12:36

这是很好的信息。我终于有点明白了。如果我没弄错的话,这和. NET中的方法非常相似。如果我错了,请有人纠正我。理解这一点是件好事,尽管它看起来有点复杂,因为如果你想最终转向VB.NET,你必须对使用这种方法有一个坚定的理解。
页: [1] 2
查看完整版本: 遍历整个图形