M76 发表于 2022-7-6 12:00:36

超过最大sel数

如何避开这个问题?
 
我总是将未使用的选择集的变量设置为零,但这似乎解决不了任何问题。
 
是否有明确的方法永久清除选择集?
 
我不明白为什么在可用选择集的数量如此有限(128)的情况下,没有关于这个主题的可用信息。

SteveK 发表于 2022-7-6 12:07:19

它发生在什么情况下?当我在循环中使用选择集时,将选择集变量设置为nil或下一个ss(如ssget中的帮助文件所述)总是适用于我。
或者,如果是vla对象,可以在ss上使用vla delete。

M76 发表于 2022-7-6 12:13:05

我在循环中使用它,我试图使用图形清理从闭合多段线中删除自交点,这就是我得到错误的地方。因此,选择集是由图形清理例程创建的,我无法控制它。
 
以下是导致问题的代码部分:
 

(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层上运行的已保存清理例程。

SteveK 发表于 2022-7-6 12:19:12

保持这种想法。。。

SteveK 发表于 2022-7-6 12:25:04

那么这个呢:
(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)))
   )
   )
)
 
我还没有测试过这个,但我认为你可能正在用其他代码制作一个有点混乱的网络。

M76 发表于 2022-7-6 12:30:22

但是“图形清理”会将原始对象分解为多个对象,这段代码不是只会将其中一个对象设置回原始图层吗?
 
编辑:这给了我一个想法,图形清理可以选择在另一个图层上创建修改过的对象,这样我就不必从代码中放回它们。我试试看,然后回来汇报。

M76 发表于 2022-7-6 12:34:06

这不起作用,错误仍然存在,我已使用“图形清理”命令转储,并使用内部函数进行清理,但唯一的区别是,当它用完128个选择集时,会出现访问冲突错误。
 
因此,问题仍然是如何在没有痕迹的情况下清除选择集。

SteveK 发表于 2022-7-6 12:41:21

很抱歉没有回复你(现在又是早上了)。我在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)))
   )
   )
)

M76 发表于 2022-7-6 12:48:26

 
不,因为重要的是,清理是在对象上逐个运行的,否则它将检测到它们之间的交点,而不仅仅是自交点。结果充其量也只是一场闹剧。
 
在我看来,只有两种可能的解决方案。或者在每100个对象之后中断代码。或者创建一个例程,该例程可以检测和修复自相交,而无需创建额外的选择集。

VovKa 发表于 2022-7-6 12:53:45

试试这个

(ade_ssfree lof)
页: [1] 2
查看完整版本: 超过最大sel数