图层冻结功能拼凑版
使用场景:参照冻结、图块冻结,模型/视口内都可近期因为图层冻结的事情困扰,只学过一点python,只能百度搜索加上论坛上查阅了好多资料,终于捣鼓出来了一点,个人觉得还不是很完美(ps:点击图块/参照内容的时候需要二次点击确认下)咱先把源码贡献出来,也请大牛看看能不能进一步优化以提升使用体验!
(defun c:k ()
(if (/= (getvar "clayer") 0);判断当前图层是否为0图层
(vl-cmdf"-LAYER" "S" 0 ""))
(setq dh_kj(getvar "ctab")) ;获取当前所在空间是模型/布局
(if(/= dh_kj "Model") ;如果当前不是在模型空间,是在布局内
(while
(setq Ent(entsel "\n选择对象:"));获取实体(块或者线)
(setq Ent1(cdr (assoc 0 (entget (car Ent)))))
(setq Ent_lay (cdr (assoc 8 (entget (car Ent)))));获取实体(块或者线)的图层名
(if (= Ent1 "INSERT")
(progn
(setq ss1 (nentsel "\n选择的是块,需要再点击一次: ")) ;获取实体(线)
(setq Ltp (cdr (assoc 8 (entget (car ss1)))));获取实体(线)的图层名
(if (= Ltp "0")
(if(= Ltp Ent_lay)
(progn
(print "您选择的图块及图元都是")
(princ Ent_lay)
(prompt "图层,请检查!")
)
(progn
(command "vplayer" "F" Ent_lay "C" "")
(print "图层 ")
(princ Ent_lay)
(prompt " 已冻结")
)
)
(progn
(command "vplayer" "F" Ltp "C" "")
(print "图层 ")
(princ Ltp)
(prompt " 已冻结")
)
)
)
(vl-cmdf"LAYFRZ" "S" "v" "v" Ent "") ;冻结所选对象图层
)
)
(while
(setq Ent(entsel "\n选择对象:"));获取实体(块或者线)
(setq Ent1(cdr (assoc 0 (entget (car Ent)))))
(setq Ent_lay (cdr (assoc 8 (entget (car Ent)))));获取实体(块或者线)的图层名
(if (= Ent1 "INSERT")
(progn
(setq ss1 (nentsel "\n选择的是块,需要再点击一次: ")) ;获取实体(线)
(setq Ltp (cdr (assoc 8 (entget (car ss1)))));获取实体(线)的图层名
(if (= Ltp "0")
(if(= Ltp Ent_lay)
(progn
(print "您选择的图块及图元都是")
(princ Ent_lay)
(prompt "图层,请检查!")
)
(progn
(command "_layer" "F" Ent_lay "")
(print "图层 ")
(princ Ent_lay)
(prompt " 已冻结")
)
)
(progn
(command "_layer" "F" Ltp "")
(print "图层 ")
(princ Ltp)
(prompt " 已冻结")
)
)
)
(vl-cmdf"LAYFRZ" "S" "B" "B" Ent "") ;冻结所选对象图层
)
)
)
)
感谢大佬分享 感谢大佬分享 要不用穿透选择nentsel函数呢? tigcat 发表于 2023-9-14 22:37
要不用穿透选择nentsel函数呢?
也结合nentsel穿透用了,因为主要有3种场景,所以结合使用了下,冻结 单一图元、图块内单一图元、图块(块内图元是0图层),目前遇见图块就得需要重复确定点一次,想破脑袋没有想出办法解决,不知道哪位大牛给解决掉! 1. 用 nentselp ,不用再去点击一次。
2. 可以试试Table或vla对象的方式,完全不使用 command 来实现。
e2002 发表于 2023-9-15 11:06
1. 用 nentselp ,不用再去点击一次。
2. 可以试试Table或vla对象的方式,完全不使用 command 来实现。
对于我这种新手,还不会用那些高阶功法:dizzy:
页:
[1]