找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 898|回复: 12

[每日一码] 打开锁定冻结图层

[复制链接]
发表于 2017-5-25 19:04:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
今天发现有些图纸里面我的图层命令不能用了!   

用VLISP重新编了下。 对VLISP不熟悉,不知道编的对不对,但是能用!

;;选层关闭
(defun c:t1 nil (prompt "\n选层关闭")(yylayset 1))
;;非选层关闭
(defun c:t11 nil (prompt "\n非选层关闭")(yylaysetf 1))
;;打开所有
(defun c:t111 nil (prompt "\n打开所有")(yylaysetall 1))
;;选层锁定
(defun c:t2 nil (prompt "\n选层锁定")(yylayset 2))
;;非选层锁定
(defun c:t22 nil (prompt "\n非选层锁定")(yylaysetf 2))
;;解锁所有
(defun c:t222 nil (prompt "\n解锁所有")(yylaysetall 2))
;;选层冻结
(defun c:t3 nil (prompt "\n选层冻结")(yylayset 3))
;;---图层函数定义------------------------
(defun yylaysel (/ ss en i la oldla)
    (setq ss (ssget) i 0)
    (if ss
        (while (setq en (ssname ss i))
            (setq la (cdr(assoc 8 (entget en))) i(1+ i))
            (if oldla (setq oldla (strcat la "," oldla))(setq oldla la))
        )
    )
    oldla
)
;;所有图层(打开 解锁)
(defun yylaysetall (key)
    (vlax-for tem (vla-get-layers(yy:doc))
        (cond
            ((= key 1) (vla-put-layeron tem :vlax-true))
            ((= key 2) (vla-put-lock tem :vlax-false))
        )
    )
    (princ)
)
;;选层(关闭 锁定 冻结)
(defun yylayset (key / la)
    (setq la (yylays))
    (if la
        (vlax-for tem (vla-get-layers(yy:doc))
            (if (wcmatch (vla-get-name tem) la)
                (cond
                    ((= key 1) (vla-put-layeron tem :vlax-false))
                    ((= key 2) (vla-put-lock tem :vlax-true))
                    ((= key 3) (vla-put-freeze tem :vlax-true))
                )
            )
        )
    )
    (princ)
)
;;非选层(关闭 锁定)
(defun yylaysetf (key / la)
    (setq la (yylays))
    (if la
        (vlax-for tem (vla-get-layers(yy:doc))
            (if (wcmatch (vla-get-name tem) la)
                (cond
                    ((= key 1) (vla-put-layeron tem :vlax-true))
                    ((= key 2) (vla-put-lock tem :vlax-false))
                )
                (cond
                    ((= key 1) (vla-put-layeron tem :vlax-false))
                    ((= key 2) (vla-put-lock tem :vlax-true))
                )
            )
        )
    )
    (princ)
)

评分

参与人数 1D豆 +5 收起 理由
newer + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2017-5-25 23:07:49 | 显示全部楼层

忍不住,在家完善了下。
;;--------------------------[图层函数定义]------------------------;;
;;(yy:doc)-->返回:当前激活文档对象
(defun yy:doc nil
    (eval
        (list 'defun
            'yy:doc
            'nil
            (vla-get-activedocument (vlax-get-acad-object))
        )
    )
    (yy:doc)
)
;;汇总选层函数
(defun yylaysel (/ ss en i la oldla)
    (setq ss (ssget) i 0)
    (if ss
        (while (setq en (ssname ss i))
            (setq la (cdr(assoc 8 (entget en))) i(1+ i))
            (if oldla (setq oldla (strcat la "," oldla))(setq oldla la))
        )
    )
    oldla
)
;;所有图层(打开 解锁 解冻)函数
(defun yylaysetall (key)
    (vlax-for tem (vla-get-layers(yy:doc))
        (cond
            ((= key 1) (vla-put-layeron tem :vlax-true))
            ((= key 2) (vla-put-lock tem :vlax-false))
            ((= key 3) (vl-catch-all-apply 'vla-put-freeze (list tem :vlax-false)))
        )
    )
    (princ)
)
;;选层(关闭 锁定 冻结)函数
(defun yylayset (key / la)
    (setq la (yylaysel))
    (if la
        (vlax-for tem (vla-get-layers(yy:doc))
            (if (wcmatch (vla-get-name tem) la)
                (cond
                    ((= key 1) (vla-put-layeron tem :vlax-false))
                    ((= key 2) (vla-put-lock tem :vlax-true))
                    ((= key 3)
                        (if (= (vla-get-name tem) (getvar "clayer"))
                            (princ(strcat "\n无法冻结当前图层 " (getvar "clayer")))
                            (vla-put-freeze tem :vlax-true)
                        )
                    )
                )
            )
        )
    )
    (princ)
)
;;非选层(关闭 锁定 冻结)函数
(defun yylaysetf (key / la)
    (setq la (yylaysel))
    (if la
        (vlax-for tem (vla-get-layers(yy:doc))
            (if (wcmatch (vla-get-name tem) la)
                (cond
                    ((= key 1) (vla-put-layeron tem :vlax-true))
                    ((= key 2) (vla-put-lock tem :vlax-false))
                    ((= key 3) (vl-catch-all-apply 'vla-put-freeze (list tem :vlax-false)))
                )
                (cond
                    ((= key 1) (vla-put-layeron tem :vlax-false))
                    ((= key 2) (vla-put-lock tem :vlax-true))
                    ((= key 3)
                        (if (= (vla-get-name tem) (getvar "clayer"))
                            (princ(strcat "\n无法冻结当前图层 " (getvar "clayer")))
                            (vla-put-freeze tem :vlax-true)
                        )
                    )
                )
            )
        )
    )
    (princ)
)
;;;---------------------------[选层关闭]--------------------------
(defun c:t1 nil (prompt "\n选层关闭")(yylayset 1))
;;;---------------------------[非选层关闭]--------------------------
(defun c:t11 nil (prompt "\n非选层关闭")(yylaysetf 1))
;;;---------------------------[打开所有层]--------------------------
(defun c:t111 nil (prompt "\n打开所有")(yylaysetall 1))
;;;---------------------------[选层锁定]--------------------------
(defun c:t2 nil (prompt "\n选层锁定")(yylayset 2))
;;;---------------------------[非选层锁定]--------------------------
(defun c:t22 nil (prompt "\n非选层锁定")(yylaysetf 2))
;;;---------------------------[解锁所有层]--------------------------
(defun c:t222 nil (prompt "\n解锁所有层")(yylaysetall 2))
;;;---------------------------[选层冻结]--------------------------
(defun c:t3 nil (prompt "\n选层冻结")(yylayset 3))
;;;---------------------------[非选层冻结]--------------------------
(defun c:t33 nil (prompt "\n非选层冻结")(yylaysetf 3))
;;;---------------------------[解冻所有层]--------------------------
(defun c:t333 nil (prompt "\n解冻所有层")(yylaysetall 3)(vla-Regen (yy:doc) acActiveViewport)(princ))

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-5-25 19:31:17 | 显示全部楼层
多写VLISP代码,你就会喜欢她的。

很多,容器--提取单个---对单个操作, 符号表,块都这样,能写一大堆功能各异的工具了。

VLISP比LISP看着更结构化。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-5-25 19:33:50 | 显示全部楼层
缺 yylays 函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 19:44:52 来自手机 | 显示全部楼层
yylays就是yylaysel手欠改了个名字。好像缺yy:doc。明天去公司再补充
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 19:49:18 来自手机 | 显示全部楼层
本人及本专业对程序要求都不高。所以我的程序都只管能用即可。今天看了下90左右的命令有三百多个command。希望cad别瞎改就好。不然都得重写
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-5-25 20:21:52 | 显示全部楼层
不知道冻结的时候是否判断了不对当前层操作,否则会错误退出的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 20:32:05 | 显示全部楼层

没判断。
本来冻结也写进代码了。不过发现有问题就删了,反正冻结用的不多。
如果只是对当前层不能操作还容易判断些。
明天再测试完善下吧



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-5-25 20:58:35 | 显示全部楼层

VLISP屏蔽错误,继续执行是很方便的

冻结的代码改成

(vl-catch-all-apply '(lambda nil (vla-put-freeze tem :vlax-true)))


就行了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 22:27:25 | 显示全部楼层

很巧妙的办法。不过我觉的简单的话还是给用户提示下比较好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-5-25 22:49:33 | 显示全部楼层

其实没必要提示,你目的是冻结选择的层。
如果想提示
那就:
  1. (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda nil (vla-put-freeze tem :vlax-true)))))
  2.    (princ "\n不能冻结当前层.")
  3. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

发表于 2018-3-20 10:27:24 | 显示全部楼层
大师,能否将锁定的图层颜色显淡
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-7-26 12:49:32 | 显示全部楼层
谢谢版主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-14 20:20 , Processed in 0.193148 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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