明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1281|回复: 26

[提问] 帮忙修改下程序,选物单开图层并将此物图层置为当前

[复制链接]
发表于 2024-1-28 14:10 | 显示全部楼层 |阅读模式


各位大佬,以下程序为选物单开图层,但是选中物体的图层不能置为当前,请帮忙修改下将选中物体的图层置为当前,谢谢!

(defun c:1 (/ n1 n2 n3 n4 n5 n ent)

(setvar "cmdecho" 0)
(setq n1 (ssget))
(setq n2 (sslength n1))
(command "layer" "off" "*" "y" "")
(setq n 0)
(while (> n2 n)
     (setq ent (ssname n1 n))
     (setq n3 (assoc 8 (setq n4 (entget ent))))
     (setq n5 (cdr n3))
     (command "layer" "on" n5 "")
     (setq n (+ 1 n))))

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-1-28 14:28 | 显示全部楼层
本帖最后由 kucha007 于 2024-1-29 11:05 编辑

试试这个
  1. ;关闭其它图层并将目标图层置为当前

  2. (defun c:TT (/ DOC LayLst SS i obj Lay LayOpen en TgtLay)
  3.   (if (null vlax-dump-object) (vl-load-com));;将Visual LISP扩展功能加载到AutoLISP
  4.   (setq DOC    (vla-get-activedocument (vlax-get-acad-object))
  5.         LayLst (vla-get-layers DOC)
  6.   )
  7.   (defun *error* (Msg)
  8.     (vla-endundomark DOC)
  9.   )
  10.   (while (eq 8 (logand 8 (getvar 'undoctl)))
  11.     (vla-endundomark DOC)
  12.   ) ;关闭以前的编组
  13.   (vla-startundomark DOC) ;记录编组
  14.     (if
  15.       (and
  16.           (princ "\n——★★★ 请选择需要保留图层的对象 ★★★——\n")
  17.           (setq SS (ssget))
  18.       )
  19.       (progn
  20.         (vlax-for XX LayLst (vla-put-layeron XX :vlax-false)) ;图层全关
  21.         (repeat (setq i (sslength SS))
  22.           (setq obj (vlax-ename->vla-object (ssname SS (setq i (1- i))))
  23.                 Lay (vla-get-Layer obj)
  24.           )
  25.           (if (not (vl-position Lay LayOpen))
  26.             (progn
  27.               (vla-put-layeron (vla-item LayLst Lay) :vlax-true) ;打开目标图层
  28.               (setq LayOpen (cons Lay LayOpen))
  29.             )
  30.           )
  31.         );关闭其它
  32.         (princ "\n——★★★ 已关闭除所选对象以外的其它图层 ★★★——\n")
  33.         (if (setq en (car (entsel "\n→请点选目标图层的对象:")))
  34.             (progn
  35.               (setq TgtLay (Vlax-Get (Vlax-Ename->Vla-Object en) 'Layer)) ;获取目标图层
  36.               (setvar "CLAYER" TgtLay) ;图层置为当前
  37.                (princ (strcat "\n——★★★ 目标图层<" TgtLay ">已置为当前 ★★★——\n"))
  38.             )
  39.         )
  40.       )
  41.     )
  42.   (vla-endundomark DOC) ;结束编组
  43.   (command "redraw")
  44.   (princ)
  45. )

评分

参与人数 1明经币 +1 收起 理由
cj52000 + 1 谢谢热心!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2024-1-29 20:47 | 显示全部楼层
试试这个

(Defun C:y (/ ss ct cl la old)


(setvar "cmdecho" 0)


(setq ss (ssget))


(setq ct 0

len (sslength ss)

cl (cdr (assoc 8 (entget (ssname ss 0))))

)


(setvar "clayer" cl)


(while (< ct len)


(setq la (cdr (assoc 8 (entget (ssname ss ct)))))


(if (= old nil)


(setq OLD la)


(setq OLD (strcat OLD "," la))

)


(setq ct (1+ ct))

)


(command ".layer" "off" "*" "n" "")


(command ".layer" "on" old "")


(setvar "CECOLOR" (itoa (cdr (assoc 62 (tblsearch "layer" (getvar "CLAYER"))))))

(princ)

)

回复 支持 1 反对 0

使用道具 举报

发表于 2024-1-28 21:50 | 显示全部楼层
本帖最后由 vitalgg 于 2024-1-28 21:51 编辑

源码:
https://gitee.com/atlisp/packages/blob/main/at-layer/at-layer.lsp




  1. (@:add-menus '("图层"
  2.          ("关闭其它" "(@layer:off-other)")
  3.          ("冻结其它" "(@layer:frozen-other)")
  4.          ("锁定其它" "(@layer:lock-other)")
  5.          ("解锁全部" "(@layer:unlock-all)")
  6.          ("解冻全部" "(@layer:thaw-all)")
  7.          ("图层全开" "layon")
  8.          ("图层恢复" "layerp")
  9.          ("特性随层" "laycur")
  10.          ("合并图层" "laymgr")
  11.          ("删除图层" "laydel")
  12.          ("图层漫游" "laywalk")
  13.          ("选图进层" "(@layer:ent-to-clayer)")

  14.          ))
  15. ;; (@:add-menu "图层" "常用命令" "(@layer:ent-to-clayer)")

  16. (defun @layer:get-layers-by-ss(ss / layer ti% ename e)
  17.   "根据所选对象生成图层表"
  18.   (setq layer nil )
  19.   (setq ti% 0)
  20.   (if (/= ss nil)
  21.       (progn
  22.         (while
  23.             (<= ti% (- (sslength ss) 1))
  24.           (setq ename (ssname ss ti%))
  25.           (setq e (entget ename ))
  26.           (if (=  (member (cdr (assoc 8 e)) layer) nil)
  27.               (progn
  28.                 (if (= layer nil)
  29.                     (setq layer (list (cdr (assoc 8 e))))
  30.                   (setq layer (append layer (list (cdr (assoc 8 e)))))
  31.                   )
  32.                 )
  33.             )
  34.           (setq ti%(+ 1 ti%))
  35.           )))
  36.   layer
  37.   )
  38. (defun @layer:off-other( /  ss  layer  lay-act-list )
  39.   "关闭其它图层"
  40.   (setq lay-act-list "")
  41.   (setq ss (ssget ))
  42.   (foreach layer (layer:list)
  43.            ;;; 如果当前图层不在 所选对象中,设当前层为第一个当前对象层
  44.            (if (= (member (getvar "clayer")  (@layer:get-layers-by-ss ss)) nil)
  45.                (setvar "clayer" (car  (@layer:get-layers-by-ss ss)) )
  46.              )
  47.            (if (= (member layer (@layer:get-layers-by-ss ss)) nil)
  48.                (if (= lay-act-list "")
  49.                    (setq lay-act-list layer)
  50.                  (setq lay-act-list (strcat lay-act-list "," layer)
  51.              )
  52.            )))
  53.   (command "-layer" "off" lay-act-list "")
  54.   )

  55. (defun @layer:frozen-other( /  ss  layer  lay-act-list )
  56.   "冻结其它图层"
  57.   (setq lay-act-list "")
  58.   (setq ss (ssget ))
  59.   (foreach layer (layer:list)
  60.            ;;; 如果当前图层不在 所选对象中,设当前层为第一个当前对象层
  61.            (if (= (member (getvar "clayer")  (@layer:get-layers-by-ss ss)) nil)
  62.                (setvar "clayer" (car  (@layer:get-layers-by-ss ss)) )
  63.              )
  64.            (if (= (member layer (@layer:get-layers-by-ss ss)) nil)
  65.                (if (= lay-act-list "")
  66.                    (setq lay-act-list layer)
  67.                  (setq lay-act-list (strcat lay-act-list "," layer)
  68.              )
  69.            )))
  70.   (command "-layer" "f" lay-act-list "")
  71.   )

  72. (defun @layer:lock-other( /  ss  layer  lay-act-list )
  73.   "锁定其它图层"
  74.   (setq lay-act-list "")
  75.   (setq ss (ssget ))
  76.   (foreach layer (layer:list)
  77.            ;;; 如果当前图层不在 所选对象中,设当前层为第一个当前对象层
  78.            (if (= (member (getvar "clayer")  (@layer:get-layers-by-ss ss)) nil)
  79.                (setvar "clayer" (car  (@layer:get-layers-by-ss ss)) )
  80.              )
  81.            (if (= (member layer (@layer:get-layers-by-ss ss)) nil)
  82.                (if (= lay-act-list "")
  83.                    (setq lay-act-list layer)
  84.                  (setq lay-act-list (strcat lay-act-list "," layer)
  85.              )
  86.            )))
  87.   (command "-layer" "lo" lay-act-list "")
  88.   )

  89. (defun @layer:unlock-all( /  ss  layer  lay-act-list )
  90.    "解锁全部图层"
  91.   (setq lay-act-list "")
  92.   (foreach layer (layer:list)
  93.            (if (= lay-act-list "")
  94.                    (setq lay-act-list layer)
  95.                  (setq lay-act-list (strcat lay-act-list "," layer)
  96.              )
  97.            ))
  98.   (command "-layer" "u" lay-act-list "")
  99.   )

  100. (defun @layer:thaw-all( /  layer  lay-act-list )
  101.   "解冻全部图层"
  102.   (setq lay-act-list "")
  103.   (foreach layer (layer:list)
  104.            (if (= lay-act-list "")
  105.                    (setq lay-act-list layer)
  106.                  (setq lay-act-list (strcat lay-act-list "," layer)
  107.              )
  108.            ))
  109.   (command "-layer" "t" lay-act-list "")
  110.   )

  111. (defun @layer:ent-to-clayer ()
  112.   (if (null layer:list)(require 'layer:*))
  113.   (if curr-layer
  114.       (cond
  115.        ((= 'int (type curr-layer))
  116.   (setvar "clayer" (itoa curr-layer)))
  117.        ((= 'str (type curr-layer))
  118.   (if (null (member curr-layer (layer:list)))
  119.       (layer:make curr-layer nil nil nil))
  120.   (setvar "clayer" curr-layer))
  121.        ((atom curr-layer)
  122.   (if (null (member (vl-symbol-name curr-layer) (layer:list)))
  123.       (layer:make (vl-symbol-name curr-layer) nil nil nil))
  124.   (setvar "clayer" (vl-symbol-name curr-layer)))))
  125.   (@:help (list
  126.      (strcat "选择对象到" (getvar "clayer") "层")))
  127.   (if (setq ss-curr (cadr (ssgetfirst)))
  128.       (foreach ent (pickset:to-list ss-curr)
  129.          (entity:putdxf ent 8 (getvar "clayer"))
  130.          (entity:deldxf ent 6 )
  131.          (entity:deldxf ent 48)
  132.          (entity:deldxf ent 62)
  133.          )
  134.     (while (setq ent (car (entsel)))
  135.       (entity:putdxf ent 8 (getvar "clayer"))
  136.       (entity:deldxf ent 6 )
  137.       (entity:deldxf ent 48)
  138.       (entity:deldxf ent 62)
  139.       ))
  140.   (setq curr-layer nil)
  141.   )
  142. (defun c:ent2clayer ()
  143.   (@layer:ent-to-clayer))


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2024-1-28 15:29 | 显示全部楼层

大佬,工作需要这个能不能多选呢,烦请帮忙看看
发表于 2024-1-28 17:19 来自手机 | 显示全部楼层
CAD自带啦,在工具条
发表于 2024-1-28 22:22 | 显示全部楼层

(defun c:kkk (/ ee  nk n1 n2 n3 n4 n5 n ent)
   (setvar "cmdecho" 0)
   (setq ee (car (entsel " 选择保留单个层,关闭其他层 ")))
   (setq nk (cdr(assoc 8 (entget ee))))
   (setq n1 (ssget "X"))
   (setq n2 (sslength n1))
   (command "layer" "off" "*" "y" "")
   (setq n 0)
   (while (> n2 n)
     (setq ent (ssname n1 n))
     (setq n3 (assoc 8 (entget ent)))
     (setq n5 (cdr n3))
        (if (equal nk n5)
              (command "layer" "on" n5   "")
        )
     (setq n (+ 1 n))
         (princ)
   )
)
发表于 2024-1-28 22:24 | 显示全部楼层
本帖最后由 弥勒 于 2024-1-28 22:52 编辑

和尚我懂你!我佛慈悲
 楼主| 发表于 2024-1-29 07:51 | 显示全部楼层
弥勒 发表于 2024-1-28 22:24
和尚我懂你!我佛慈悲

大慈大悲,大佬你这个还是只能开单个,而且选中后运行很卡顿,再帮忙看看
发表于 2024-1-29 11:06 | 显示全部楼层
cj52000 发表于 2024-1-28 15:29
大佬,工作需要这个能不能多选呢,烦请帮忙看看

已改写,再看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 01:43 , Processed in 0.270706 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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