超过最大sel数
如何避开这个问题?我总是将未使用的选择集的变量设置为零,但这似乎解决不了任何问题。
是否有明确的方法永久清除选择集?
我不明白为什么在可用选择集的数量如此有限(128)的情况下,没有关于这个主题的可用信息。 它发生在什么情况下?当我在循环中使用选择集时,将选择集变量设置为nil或下一个ss(如ssget中的帮助文件所述)总是适用于我。
或者,如果是vla对象,可以在ss上使用vla delete。 我在循环中使用它,我试图使用图形清理从闭合多段线中删除自交点,这就是我得到错误的地方。因此,选择集是由图形清理例程创建的,我无法控制它。
以下是导致问题的代码部分:
(setq lof (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "_lay"))))
(if lof
(progn
(setq ssn (sslength lof))
(setq i 0)
(repeat ssn
(setq entx (ssname lof i))
(command "_change" entx "" "_p" "_la" "tmp" "")
(command "_-mapclean" "lead.dpf")
(setq lef (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "tmp"))))
(setq sen (sslength lef))
(setq j 0)
(repeat sen
(setq enty (ssname lef j))
(command "_change" enty "" "_p" "_la" "_lay" "")
(setq j (1+ j))
)
(setq lef nil)
(gc)
(setq i (1+ i))
)
))
即使在循环中添加gc也没有帮助。
领导dpf是在tmp层上运行的已保存清理例程。 保持这种想法。。。 那么这个呢:
(setq lof (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "_lay"))))
(if lof
(progn
(setq i -1)
(while (setq entx (ssname lof (setq i (1+ i))))
;(command "_change" entx "" "_p" "_la" "tmp" "")
(entmod (subst (cons 8 "tmp") (assoc 8 (entget entx)) (entget entx)))
)
(command "_-mapclean" "lead.dpf")
(setq i -1)
(while (setq entx (ssname lof (setq i (1+ i))))
;(command "_change" enty "" "_p" "_la" "_lay" "")
(entmod (subst (cons 8 "_lay") (assoc 8 (entget entx)) (entget entx)))
)
)
)
我还没有测试过这个,但我认为你可能正在用其他代码制作一个有点混乱的网络。 但是“图形清理”会将原始对象分解为多个对象,这段代码不是只会将其中一个对象设置回原始图层吗?
编辑:这给了我一个想法,图形清理可以选择在另一个图层上创建修改过的对象,这样我就不必从代码中放回它们。我试试看,然后回来汇报。 这不起作用,错误仍然存在,我已使用“图形清理”命令转储,并使用内部函数进行清理,但唯一的区别是,当它用完128个选择集时,会出现访问冲突错误。
因此,问题仍然是如何在没有痕迹的情况下清除选择集。 很抱歉没有回复你(现在又是早上了)。我在autocad中没有该命令,所以我只是猜测。因此它将其分解为多个对象。然后你能在命令之间做两个循环吗?
如
(setq lof (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "_lay"))))
(if lof
(progn
(setq i -1)
(while (setq entx (ssname lof (setq i (1+ i))))
;(command "_change" entx "" "_p" "_la" "tmp" "")
(entmod (subst (cons 8 "tmp") (assoc 8 (entget entx)) (entget entx)))
)
)
)
(command "_-mapclean" "lead.dpf")
(setq lof (ssget "_X" (list (cons 0 "LWPOLYLINE") (cons 8 "tmp"))))
(if lof
(progn
(setq i -1)
(while (setq entx (ssname lof (setq i (1+ i))))
;(command "_change" entx "" "_p" "_la" "tmp" "")
(entmod (subst (cons 8 "_lay") (assoc 8 (entget entx)) (entget entx)))
)
)
)
不,因为重要的是,清理是在对象上逐个运行的,否则它将检测到它们之间的交点,而不仅仅是自交点。结果充其量也只是一场闹剧。
在我看来,只有两种可能的解决方案。或者在每100个对象之后中断代码。或者创建一个例程,该例程可以检测和修复自相交,而无需创建额外的选择集。 试试这个
(ade_ssfree lof)
页:
[1]
2