明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 998|回复: 10

[提问] 锁定已知图层名的几个图层,不用Command命令怎么写?

[复制链接]
发表于 2019-8-15 10:51 | 显示全部楼层 |阅读模式
已知图层名,比如"BG1" "BG2""BG3"的3个图层,我想锁定它们,不要在图纸里面选择相应的图层,不用lisp的Command命令该怎么写?
(主要当锁定的图层较多的时候,command写的执行慢)


发表于 2019-8-15 11:13 | 显示全部楼层
  1. [code=lisp];图层锁定解锁  by:孤帆
  2. (defun c:layerlock( / layer layername layernames layers obj sset);<图层锁定解锁>
  3.   (setq Layers(vla-get-Layers AcadDocument))
  4.   (if (and (ssget)
  5.      (setq sset (vla-get-ActiveSelectionSet AcadDocument))
  6.      )
  7.     (progn
  8.       (setq layernames '())
  9.       (vlax-for obj sset
  10.   (if (not (member (setq layername (vla-get-layer obj)) layernames))
  11.      (setq layernames (cons layername layernames))))
  12.       (vlax-for layer Layers
  13.   (if (member (vla-get-name layer)layernames)
  14.     (vla-put-Lock layer :vlax-true)
  15.     ;(vla-put-Lock layer :vlax-false)
  16.     )
  17.   )
  18.       )
  19.     (vlax-for layer Layers
  20.       (vla-put-Lock layer :vlax-false))
  21.     )
  22. (princ)
  23. )
[/code]

发表于 2019-8-15 14:26 | 显示全部楼层

http://bbs.mjtd.com/thread-107231-2-1.html
请问一下,指定图层对象随层,这个代码是哪里有问题呀,能否帮忙看一下
 楼主| 发表于 2019-9-3 20:49 | 显示全部楼层

参考你的member命令,经过半个月的学习,终于会了。
(defun C:laylock1 ( / acaddocument acadobject layersobj lay_list obj)
  (setq AcadObject (vlax-get-acad-object)
        AcadDocument (vla-get-ActiveDocument AcadObject)
        LayersObj (vla-get-layers AcadDocument)
  );end setq
   
(setq lay_list (list "bg1" "bg2" "bg3" "bg4" “bg5”));不需要锁定的图层列表,锁定这些以外的图层
      (vlax-for obj LayersObj
      (if (member (vla-get-name obj) lay_list)
        (vla-put-lock obj :vlax-false)
        (vla-put-lock obj :vlax-true)
        ));end vlax-for  endif
   

  (princ)
);;锁基础图层

点评

这个如何支持图层通配符  发表于 2021-7-13 07:39
发表于 2019-9-6 10:19 | 显示全部楼层
talentzf 发表于 2019-9-3 20:49
参考你的member命令,经过半个月的学习,终于会了。
(defun C:laylock1 ( / acaddocument acadobject la ...

恭喜恭喜!
发表于 2019-9-8 09:14 | 显示全部楼层
不错,不错,下载学习~~
发表于 2023-5-15 11:10 | 显示全部楼层
如果是"BG1""BG2"开头的图层,该如何表示呢?
发表于 2023-5-15 13:35 | 显示全部楼层
liner122 发表于 2023-5-15 11:10
如果是"BG1""BG2"开头的图层,该如何表示呢?

这是比较笨的办法,*就是通配符,自己改一下

;;;图层改打印图层
(defun c:rqp ()
  (command "-layer" "p" "p" "202*" "")
(princ)
)

;;;图层改不打印图层
(defun c:rqn ()
  (command "-layer" "p" "n" "202*" "")
(princ)
)


;;;冻结日期图层
(defun c:rqf ()
   (command "-layer" "off" "202*" "p" "n" "202*" "")
(princ)
)

;;;显示日期图层
(defun c:rqt ()
   (command "-layer" "on" "202*" "")
(princ)
)
发表于 2023-5-15 14:05 | 显示全部楼层
alexmai 发表于 2023-5-15 13:35
这是比较笨的办法,*就是通配符,自己改一下

;;;图层改打印图层

多谢。这个用command命令编写的lsp文件,当图层比较多时在高版本上执行有点慢。所有想用vla编写的lsp文件,本人测试过,四楼楼主的那个就可以用。想在那个的基础上指定的已知图层支持通配符。
下面是四楼楼主的代码
(defun C:laylock1 ( / acaddocument acadobject layersobj lay_list obj)
  (setq AcadObject (vlax-get-acad-object)
        AcadDocument (vla-get-ActiveDocument AcadObject)
        LayersObj (vla-get-layers AcadDocument)
  );end setq
   
(setq lay_list (list "bg1" "bg2" "bg3" "bg4" “bg5”));不需要锁定的图层列表,锁定这些以外的图层
      (vlax-for obj LayersObj
      (if (member (vla-get-name obj) lay_list)
        (vla-put-lock obj :vlax-false)
        (vla-put-lock obj :vlax-true)
        ));end vlax-for  endif
   

  (princ)
);;锁基础图层
发表于 2024-2-21 12:53 | 显示全部楼层
autocad只要锁定图层要求变灰,什么程序执行速度都一样。
如果只锁定图层用vla,如果锁定图变灰还是用layer方便。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 01:23 , Processed in 0.185524 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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