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
当你删除后总数会变化,后面的没有执行,外面再套一个循环
如:
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'直到没有需要删除的退出
队列删除常 ...
当你删除后总数会变化,后面的没有执行,外面再套一个循环
如:
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'直到没有需要删除的退出
队列删除常碰到,一定要有删除动作。
但是小弟还有一点不太明白:
模型空间 也是一个集合,我貌似常常有遍历ThisDrawing.ModelSpace,删除特定元素的操作,但是好像并没有什么问题啊?
对于这个例子,我:
For Each ent In ThisDrawing.ModelSpace
If ent.area < 0.001 Then
ent.Delete
End If
Next
以前碰到过类似的问题,我要删除LISTBOX控件中选中的行,如果只选择一行,没有问题,如果选择多行,删除就会出错,后来经过调试代码发现队列中的总数在被删除后就会发生改变,比如有10个,当你删除一个后就会变成9个,从而刷新了队列数据,就又要从头开始。如果行数太多比如一万行以上,要删除多个的时候,每删除一个都从头开始效率是非常低下的,用For Each ...IN就不合适了,就要用FOR i=开始行 到结束行,删除后记下行位置,下次从记录的行开始,而不是从头开始,就可以解决效率低下的问题。