jlogan02 发表于 2022-8-11 17:20:41

Enter使例程在最后选中的具有意外结果的项目上运行。

在我运行该程序后,我点击回车键再次运行该程序并拾取其他对象,但它不允许我拾取另一个实体,而是在第一组实体上再次运行该例程,并将它们推回原始层减去-F.
(defun c:futlyr ( / i lyrname s x )
(prompt "\nSelect Object to Set to -F Construction Layer")
   (setq s (ssget ":L" '((8 . "S*"))))
      (repeat (setq i (sslength s))
      (setq x (entget (ssname s (setq i (1- i))))
            lyrname (cdr (assoc 8 x))
            n (strcat (substr lyrname 1 (- (strlen lyrname) 0)) "-F") ;;(strlen old_suffix)))))
      )
            (if (not (tblsearch "layer" n))
            (progn (setq e (entget (tblobjname "layer" lyrname)))
               (entmake (subst (cons 2 n) (assoc 2 e) (subst '(62 . 1) (assoc 62 e) e)))
            )
            )
            (entmod (subst (cons 8 n) (assoc 8 x) x))
          )

(prompt "\nAll objects have been moved to -F construction layer")
(princ)
)

(c:futlyr)
**** Hidden Message *****

mhupp 发表于 2022-8-11 19:37:18

它们在代码中没有任何东西可以将它们推回(错误处理?)。所有这些你都可以多次选择。以“layername-F-F-F”等图层结尾<br>添加了一个检查,以排除以“-F”结尾的图层上的项目<br>并给出了更改图层的数量。<br>(defun c:futlyr (/ s layname x n i)
(prompt "\nSelect Object to Set to -F Construction Layer")
(setq i 0)
(setq s (ssget ":L" '((8 . "S*"))))
(foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
    (if (and (setq layname (cdr (assoc 8 (setq x (entget ent))))) (/= (substr layname (- (strlen layname) 1)) "-F"))
      (progn
      (if (not (tblsearch "layer" (setq n (strcat layname "-F"))))
          (progn
            (setq e (entget (tblobjname "layer" layname)))
            (entmake (subst (cons 2 n) (assoc 2 e) (subst '(62 . 1) (assoc 62 e) e)))
          )
      )
      (entmod (subst (cons 8 n) (assoc 8 x) x))
      (setq i (1+ i))
      )
    )
)
(prompt (strcat "\n" (itoa i) " objects moved to -F construction layer"))
(princ)
)

jlogan02 发表于 2022-8-12 16:07:23

伙计,我的整个帖子都不靠谱。我写过一次关于多重f的问题。然后决定试着删除entmake部分作为测试,因为我不需要它把颜色改成红色。当我删除它,我得到了进入问题。
我之前忘记从帖子中删除该部分了。
(if (not (tblsearch "layer" n))
            (progn (setq e (entget (tblobjname "layer" lyrname)))
               (entmake (subst (cons 2 n) (assoc 2 e) (subst '(62 . 1) (assoc 62 e) e)))
            )
            )
感谢您添加支票。那天早些时候我也有过这种想法,但没有完成。

ronjonp 发表于 2022-8-12 17:16:28

您也可以像这样直接过滤掉项目:
(defun c:futlyr (/ e i layname n s x)
(prompt "\nSelect Object to Set to -F Construction Layer")
(setq i 0)
;; Direct filter for layer that starts with S and does not end in -F
(if (setq s (ssget ":L" '((8 . "S*,") (8 . "~*-F"))))
    (progn
      (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
      (if (setq layname (cdr (assoc 8 (setq x (entget ent)))))
          (progn (if (not (tblsearch "layer" (setq n (strcat layname "-F"))))
                   (progn (setq e (entget (tblobjname "layer" layname)))
                        (entmake (subst (cons 2 n) (assoc 2 e) (subst '(62 . 1) (assoc 62 e) e)))
                   )
               )
               (entmod (subst (cons 8 n) (assoc 8 x) x))
               (setq i (1+ i))
          )
      )
      )
      (prompt (strcat "\n" (itoa i) " objects moved to -F construction layer"))
    )
)
(princ)
)
页: [1]
查看完整版本: Enter使例程在最后选中的具有意外结果的项目上运行。