明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1313|回复: 10

关于选择集RemoveItems的问题

[复制链接]
发表于 2017-9-1 23:36 | 显示全部楼层 |阅读模式
10明经币
SSet选择集中是一些多段线,现在想移除掉其中面积为0的。
...
For Each ent In SSet
        If ent.area < 0.001 Then
            Call RemoveEntFromSSet(ent, SSet)
        End If
Next
...

其中RemoveEntFromSSet过程如下:
Public Sub RemoveEntFromSSet(ByVal ent As Object, ByRef SSet As Object)
    Dim objCollection(0) As Object ' AcadEntity
    Set objCollection(0) = ent
    SSet.RemoveItems objCollection
End Sub

结果:有一些面积为0的多段线移除掉了,有一些总是移除不掉。具体说来,测试的图中有5条多段线,其中4条面积为0。可是程序只能移除掉2条面积为0的,最终SSet.count为3,但理论上最终SSet.count应该为1啊!

最佳答案

查看完整内容

当你删除后总数会变化,后面的没有执行,外面再套一个循环 如: DO for 选择集循环如果 为0 删除 NEXT LOOP 删除结束退出 只能写一个框架你借鉴一下 DO FLAG=True For Each ent In SSet If ent.area < 0.001 Then Call RemoveEntFromSSet(ent, SSet) '如果删除,则说明还有,退出再循环 FLAG=FALSE EXIT FOR End If Next LOOP UNTIL FLAG'直到没有需要删除的退出 队列删除常 ...
发表于 2017-9-1 23:36 | 显示全部楼层
本帖最后由 vbcad 于 2017-9-2 08:07 编辑

当你删除后总数会变化,后面的没有执行,外面再套一个循环
如:
DO
for 选择集循环如果 为0 删除
NEXT
LOOP 删除结束退出


只能写一个框架你借鉴一下

DO
FLAG=True
For Each ent In SSet
        If ent.area < 0.001 Then
            Call RemoveEntFromSSet(ent, SSet)
'如果删除,则说明还有,退出再循环
FLAG=FALSE
EXIT FOR
        End If
Next
LOOP UNTIL FLAG'直到没有需要删除的退出
队列删除常碰到,一定要有删除动作。
回复

使用道具 举报

 楼主| 发表于 2017-9-1 23:40 | 显示全部楼层
于是我:
For Each ent In SSet
   
        If ent.area < 0.001 Then
            MsgBox "进入"
            Call RemoveEntFromSSet(ent, SSet)
            MsgBox SSet.count
        End If
    Next

我发现只MsgBox了两次"进入"。

于是我直接:
For Each ent In SSet
   
        If ent.area < 0.001 Then
            MsgBox "进入"
        End If
    Next
这样就正常了,MsgBox了4次"进入"。好奇怪,很费解

回复

使用道具 举报

发表于 2017-9-2 09:03 来自手机 | 显示全部楼层
很奇怪,vlisp的foreach和vb的foreach不同吗?同样的代码vlisp就没有问题。
回复

使用道具 举报

 楼主| 发表于 2017-9-2 11:09 | 显示全部楼层
本帖最后由 Zzllvb 于 2017-9-2 11:24 编辑
vbcad 发表于 2017-9-1 23:36
当你删除后总数会变化,后面的没有执行,外面再套一个循环
如:
DO


非常感谢您的回答!明经币奉上。
也就是说,对于集合,如果遍历的时候有删除集合元素的操作,那么就很有可能不能再正常依次遍历下去了。需要退出,对新的集合重新开始遍历。

但是小弟还有一点不太明白:
模型空间 也是一个集合,我貌似常常有遍历ThisDrawing.ModelSpace,删除特定元素的操作,但是好像并没有什么问题啊?
对于这个例子,我:
  For Each ent In ThisDrawing.ModelSpace
            If ent.area < 0.001 Then
                  ent.Delete
            End If
   Next

面积为0的也都正确删除了。

还是有点不解。难道ThisDrawing.ModelSpace和SelectionSet这两个集合有何不同啊??
还望前辈进一步指点。
回复

使用道具 举报

发表于 2017-9-2 13:26 | 显示全部楼层
为什么遍历ThisDrawing.ModelSpace删除没有问题我也不知道,估计应该是与删除动作后数据刷新有关。

以前碰到过类似的问题,我要删除LISTBOX控件中选中的行,如果只选择一行,没有问题,如果选择多行,删除就会出错,后来经过调试代码发现队列中的总数在被删除后就会发生改变,比如有10个,当你删除一个后就会变成9个,从而刷新了队列数据,就又要从头开始。如果行数太多比如一万行以上,要删除多个的时候,每删除一个都从头开始效率是非常低下的,用For Each ...IN就不合适了,就要用FOR i=开始行 到结束行,删除后记下行位置,下次从记录的行开始,而不是从头开始,就可以解决效率低下的问题。
回复

使用道具 举报

发表于 2017-9-7 21:55 来自手机 | 显示全部楼层
for each不可以删除,for循环可以
回复

使用道具 举报

 楼主| 发表于 2017-9-12 14:14 | 显示全部楼层
nslove44202489 发表于 2017-9-7 21:55
for each不可以删除,for循环可以

你好。for循环也不可以。最好的办法是把需要删除的加入一个新选择集,然后删除。
回复

使用道具 举报

发表于 2017-10-7 19:23 | 显示全部楼层
回帖是一种美德!感谢楼主的无私分享 谢谢
回复

使用道具 举报

 楼主| 发表于 2017-10-7 23:01 | 显示全部楼层
pengfei2010 发表于 2017-10-7 19:23
回帖是一种美德!感谢楼主的无私分享 谢谢

共同进步
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 01:35 , Processed in 0.376534 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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