明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2380|回复: 8

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

[复制链接]
发表于 2009-5-3 17:58:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-5-4 11:46:55 编辑

想破了头,查了很多资料,都想不出个办法来解决这个遍历问题。

问题就是在我建立了选择集后,用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

 楼主| 发表于 2009-5-3 18:21:00 | 显示全部楼层

高手来帮忙解答下,谢谢!

好几天都没有想出一个好的方法去解决这个问题

发表于 2009-5-3 18:26:00 | 显示全部楼层

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

发表于 2009-5-3 21:31:00 | 显示全部楼层
For i = 0 To Num - 1

MS如果for 后面的0 to N 如果这个N是一个变量的话会出错(初步测试过这个错误)。
不知道LZ和其它高手有没有解决这个问题;

对于CAD VBA里面对像遍举真的很麻烦,也一直希望能有高手给个教程与在枚举过程当中 对    对像操作的示例。

这个思路,对于新手来说真不好弄。论坛里有一两个示例,但还是不能满足要求。



发表于 2009-5-3 22:08:00 | 显示全部楼层

你用For i = 0 To Num - 1为的是取得Text(i)的值,但你却用了两重循环。

如果一个图元需要对应对话框中一个Text的值,那只需要用里面那层循环,即For Each那一层,然后在循环中使用i=i+1来让i值递增。

 楼主| 发表于 2009-5-4 10:30:00 | 显示全部楼层
本帖最后由 作者 于 2009-5-4 11:11:39 编辑

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

恳请大大指教!

 楼主| 发表于 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的办法解决了!

发表于 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

 楼主| 发表于 2009-5-7 17:41:00 | 显示全部楼层
mccad发表于2009-5-4 12:24:00问题是解决了,但感觉你的程序太复杂。entry.Handle是获取句柄,而HandleToObject(entHandle(i))又按照句柄转成图元,就不知是为什么,直接使用entry不行吗?把句柄值做成数组也没有必要,因为

十分感谢!!

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 02:48 , Processed in 0.195046 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表