明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 940|回复: 6

[源码] 图层冻结功能拼凑版

[复制链接]
发表于 2023-9-14 15:34:46 | 显示全部楼层 |阅读模式
使用场景:参照冻结、图块冻结,模型/视口内都可
近期因为图层冻结的事情困扰,只学过一点python,只能百度搜索加上论坛上查阅了好多资料,终于捣鼓出来了一点,个人觉得还不是很完美(ps:点击图块/参照内容的时候需要二次点击确认下)咱先把源码贡献出来,也请大牛看看能不能进一步优化以提升使用体验!
  1. (defun c:k ()
  2.   (if (/= (getvar "clayer") 0)  ;判断当前图层是否为0图层
  3.   (vl-cmdf  "-LAYER" "S" 0 ""))
  4.   (setq dh_kj(getvar "ctab")) ;获取当前所在空间是模型/布局
  5.   (if(/= dh_kj "Model") ;如果当前不是在模型空间,是在布局内
  6.     (while
  7.       (setq Ent(entsel "\n选择对象:"));获取实体(块或者线)
  8.       (setq Ent1(cdr (assoc 0 (entget (car Ent)))))
  9.       (setq Ent_lay (cdr (assoc 8 (entget (car Ent)))));获取实体(块或者线)的图层名
  10.       (if (= Ent1 "INSERT")
  11.         (progn
  12.           (setq ss1 (nentsel "\n选择的是块,需要再点击一次: ")) ;获取实体(线)
  13.           (setq Ltp (cdr (assoc 8 (entget (car ss1)))));获取实体(线)的图层名
  14.           (if (= Ltp "0")
  15.             (if(= Ltp Ent_lay)
  16.               (progn
  17.                 (print "您选择的图块及图元都是")
  18.                 (princ Ent_lay)
  19.                 (prompt "图层,请检查!")
  20.                 )
  21.               (progn
  22.                 (command "vplayer" "F" Ent_lay "C" "")
  23.                 (print "图层 ")
  24.                 (princ Ent_lay)
  25.                 (prompt " 已冻结")
  26.                 )
  27.               )
  28.             (progn
  29.               (command "vplayer" "F" Ltp "C" "")
  30.               (print "图层 ")
  31.               (princ Ltp)
  32.               (prompt " 已冻结")
  33.               )
  34.             )
  35.           )
  36.           (vl-cmdf  "LAYFRZ" "S" "v" "v" Ent "") ;冻结所选对象图层
  37.         )
  38.       )
  39.    (while
  40.       (setq Ent(entsel "\n选择对象:"));获取实体(块或者线)
  41.       (setq Ent1(cdr (assoc 0 (entget (car Ent)))))
  42.       (setq Ent_lay (cdr (assoc 8 (entget (car Ent)))));获取实体(块或者线)的图层名
  43.       (if (= Ent1 "INSERT")
  44.         (progn
  45.           (setq ss1 (nentsel "\n选择的是块,需要再点击一次: ")) ;获取实体(线)
  46.           (setq Ltp (cdr (assoc 8 (entget (car ss1)))));获取实体(线)的图层名
  47.           (if (= Ltp "0")
  48.             (if(= Ltp Ent_lay)
  49.               (progn
  50.                 (print "您选择的图块及图元都是")
  51.                 (princ Ent_lay)
  52.                 (prompt "图层,请检查!")
  53.                 )
  54.               (progn
  55.                 (command "_layer" "F" Ent_lay "")
  56.                 (print "图层 ")
  57.                 (princ Ent_lay)
  58.                 (prompt " 已冻结")
  59.                 )
  60.               )
  61.             (progn
  62.               (command "_layer" "F" Ltp "")
  63.               (print "图层 ")
  64.               (princ Ltp)
  65.               (prompt " 已冻结")
  66.               )
  67.             )
  68.           )
  69.           (vl-cmdf  "LAYFRZ" "S" "B" "B" Ent "") ;冻结所选对象图层
  70.         )
  71.       )
  72.     )
  73.   )


评分

参与人数 2明经币 +2 收起 理由
bssurvey + 1 赞一个!
tigcat + 1 谢谢分享!收藏备用

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-9-14 17:45:47 | 显示全部楼层
感谢大佬分享
发表于 2023-9-14 19:42:41 | 显示全部楼层
感谢大佬分享
发表于 2023-9-14 22:37:01 | 显示全部楼层
要不用穿透选择nentsel函数呢?
 楼主| 发表于 2023-9-14 23:26:09 | 显示全部楼层
tigcat 发表于 2023-9-14 22:37
要不用穿透选择nentsel函数呢?

也结合nentsel穿透用了,因为主要有3种场景,所以结合使用了下,冻结 单一图元、图块内单一图元、图块(块内图元是0图层),目前遇见图块就得需要重复确定点一次,想破脑袋没有想出办法解决,不知道哪位大牛给解决掉!
发表于 2023-9-15 11:06:03 | 显示全部楼层
1. 用 nentselp ,不用再去点击一次。
2. 可以试试Table或vla对象的方式,完全不使用 command 来实现。
 楼主| 发表于 2023-9-15 11:46:07 | 显示全部楼层
e2002 发表于 2023-9-15 11:06
1. 用 nentselp ,不用再去点击一次。
2. 可以试试Table或vla对象的方式,完全不使用 command 来实现。

对于我这种新手,还不会用那些高阶功法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 04:25 , Processed in 0.160409 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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