乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 122|回复: 8

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

[复制链接]

3

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
24
发表于 2009-5-3 17:58:00 | 显示全部楼层 |阅读模式
想破了头,查了很多资料,都想不出个办法来解决这个遍历问题。
问题就是在我建立了选择集后,用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
回复

使用道具 举报

3

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
24
发表于 2009-5-3 18:21:00 | 显示全部楼层
高手来帮忙解答下,谢谢!
好几天都没有想出一个好的方法去解决这个问题
回复

使用道具 举报

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2009-5-3 18:26:00 | 显示全部楼层
不明白你既然已经用for each遍历了,还要For i = 0 To Num - 1循环干嘛
回复

使用道具 举报

1

主题

3

帖子

3

银币

初来乍到

Rank: 1

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

回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2009-5-3 22:08:00 | 显示全部楼层
你用For i = 0 To Num - 1为的是取得Text(i)的值,但你却用了两重循环。
如果一个图元需要对应对话框中一个Text的值,那只需要用里面那层循环,即For Each那一层,然后在循环中使用i=i+1来让i值递增。
回复

使用道具 举报

3

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
24
发表于 2009-5-4 10:30:00 | 显示全部楼层

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

使用道具 举报

3

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
24
发表于 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的办法解决了!
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 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
回复

使用道具 举报

3

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
24
发表于 2009-5-7 17:41:00 | 显示全部楼层

十分感谢!!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-2 05:26 , Processed in 2.082574 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表