zdm860114 发表于 2009-5-3 17:58:00

[以解决]CAD二次开发中遍历的问题(感谢mccad)

想破了头,查了很多资料,都想不出个办法来解决这个遍历问题。
问题就是在我建立了选择集后,用FOR EACH遍历获得实体进行实时操作。 这里有个TEXT数组接受数据。

For i = 0 To Num - 1
    For Each entry In ssetobj
      entHandle = entry.handle
      entry.Highlight (True)
      MsgBox "The handle of this object is " & entHandle, vbInformation, "Handle数值"
      Set entry = acadapp.ActiveDocument.HandleToObject(entHandle)
      entry.TextOverride = Text1(i).Text
    Next
    Next i
这段代码肯定是错误的,我的目的是要通过遍历获得实体,实时进行操作。不知道如何修改,请高手指教,不甚感激!
全代码:
Dim ssetobj As AcadSelectionSet
On Error Resume Next
    '建立选择集
    acadapp.SelectionSets("test1").Delete
    Set ssetobj = acadapp.ActiveDocument.SelectionSets.Add("test1")
    '建立过滤器
AppActivate acadapp.Caption
Dim fType(0) As Integer
Dim fData(0) As Variant
fType(0) = 8
fData(0) = "bz"
Dim FilterType As Variant
Dim FilterData As Variant
FilterType = fType
FilterData = fData
ssetobj.Select acSelectionSetAll, , , fType, fData
AppActivate Form1.Caption
Dim i As Integer
    Dim Num As Integer
    Dim entHandle As String
    Dim entry As AcadEntity
    Num = ssetobj.Count
For i = 0 To Num - 1
    For Each entry In ssetobj
      entHandle = entry.handle
      entry.Highlight (True)
      MsgBox "The handle of this object is " & entHandle, vbInformation, "Handle数值"
      Set entry = acadapp.ActiveDocument.HandleToObject(entHandle)
      entry.TextOverride = Text1(i).Text
    Next
    Next i
       entry.Highlight (False)
       entry.Update
       ssetobj.Delete
end sub

zdm860114 发表于 2009-5-3 18:21:00

高手来帮忙解答下,谢谢!
好几天都没有想出一个好的方法去解决这个问题

sailorcwx 发表于 2009-5-3 18:26:00

不明白你既然已经用for each遍历了,还要For i = 0 To Num - 1循环干嘛

qqfish128 发表于 2009-5-3 21:31:00

For i = 0 To Num - 1
MS如果for 后面的0 to N 如果这个N是一个变量的话会出错(初步测试过这个错误)。
不知道LZ和其它高手有没有解决这个问题;
对于CAD VBA里面对像遍举真的很麻烦,也一直希望能有高手给个教程与在枚举过程当中 对    对像操作的示例。
这个思路,对于新手来说真不好弄。论坛里有一两个示例,但还是不能满足要求。

mccad 发表于 2009-5-3 22:08:00

你用For i = 0 To Num - 1为的是取得Text(i)的值,但你却用了两重循环。
如果一个图元需要对应对话框中一个Text的值,那只需要用里面那层循环,即For Each那一层,然后在循环中使用i=i+1来让i值递增。

zdm860114 发表于 2009-5-4 10:30:00


恩,你的这个思路我也试过,可是就是弄不出来,我的目的是要实现,在遍历获得一个对象的同时将TEXT1(i )里面的值赋给它。也就是遍历一个实体用TEXT赋值一个,一个TEXT对应一个实体。由于遍历获得的Handle值有多个,
恳请大大指教!

zdm860114 发表于 2009-5-4 11:44:00

已经解决
在mccad 大大的指导下,获得了突破性的进展。在此感谢他的不卷教诲!谢谢!
还有谢谢每个热心关注的人!
Dim ssetobj As AcadSelectionSet
On Error Resume Next
    '建立选择集
    acadapp.SelectionSets("test1").Delete
    Set ssetobj = acadapp.ActiveDocument.SelectionSets.Add("test1")
    '建立过滤器
AppActivate acadapp.Caption
Dim fType(0) As Integer
Dim fData(0) As Variant
fType(0) = 8
fData(0) = "bz"
Dim FilterType As Variant
Dim FilterData As Variant
FilterType = fType
FilterData = fData
ssetobj.Select acSelectionSetAll, , , fType, fData
AppActivate Form1.Caption
'获得HANDLE
    Dim i As Integer
    Dim Num As Integer
    Dim entHandle() As String
    Dim entry As AcadEntity
    Num = ssetobj.Count - 1
    ReDim entHandle(Num)
    i = 0
    For Each entry In ssetobj
      entHandle(i) = entry.Handle
      entry.Highlight (True)
      MsgBox "the number is:" & i & ",and the handle of this object is " & entHandle(i), vbInformation, "Handle数值"
      Set entry = acadapp.ActiveDocument.HandleToObject(entHandle(i))
      entry.TextOverride = Text1(i).Text
      i = i + 1
    Next
    entry.Highlight (False)
    entry.Update
    ssetobj.Delete
End Sub
用了数组的办法,再用mccad的办法解决了!

mccad 发表于 2009-5-4 12:24:00

问题是解决了,但感觉你的程序太复杂。
entry.Handle是获取句柄,而HandleToObject(entHandle(i))又按照句柄转成图元,就不知是为什么,直接使用entry不行吗?
把句柄值做成数组也没有必要,因为此值只是用于循环过程中显示一下,数组在后续并不需要再次使用。
中间那段可试着这样改(不要的代码我都用引号注释掉了,还有图元的更新应该放在循环中去,不然就只更新最后一个图元了):
(没有调试过,自己试试吧)
'获得HANDLE
    Dim i As Integer
    'Dim Num As Integer
    'Dim entHandle() As String
    Dim entry As AcadEntity
    'Num = ssetobj.Count - 1
    'ReDim entHandle(Num)
    i = 0
    For Each entry In ssetobj
      'entHandle(i) = entry.Handle
      entry.Highlight (True)
      MsgBox "the number is:" & i & ",and the handle of this object is " & entry.Handle, vbInformation, "Handle数值"
      'Set entry = acadapp.ActiveDocument.HandleToObject(entHandle(i))
      entry.TextOverride = Text1(i).Text
      i = i + 1
      entry.Highlight (False)
      entry.Update
    Next
    ssetobj.Delete

zdm860114 发表于 2009-5-7 17:41:00


十分感谢!!
页: [1]
查看完整版本: [以解决]CAD二次开发中遍历的问题(感谢mccad)