小毛草 发表于 2025-9-20 23:10:38

打开/关闭特定图层,支持通配符

;;;;;;;;;;;;;;;;关闭图层

(defun c:xf () (bb_layon&off_multiple '("dote*" "DOTE*")) (princ "关闭/打开:轴线图层") (princ));;;关闭轴线图层

(defun c:xff () (bb_layon&off_multiple '("0-PM-固定家具")) (princ "关闭/打开:0-PM-固定家具") (princ));;;0-PM-固定家具

(defun c:xdd () (bb_layon&off_multiple '("0-TF*" "0-DM*")) (princ "关闭/打开:天花图层,地面图层") (princ));;;天花图层,地面图层

(defun c:xxf () (bb_layon&off_multiple '("0-PM-建筑面积计算" "面积全算" "面积半算" "面积扣除")) (princ "关闭/打开:0-PM-建筑面积计算,面积全算,面积半算,面积扣除图层") (princ));;;0-PM-建筑面积计算

(defun c:sd () (bb_layon&off_multiple '("Defpoints" "PUB_VWPRT" "layer3")) (princ "关闭/打开:Defpoints,PUB_VWPRT图层") (princ));;;0-PM-建筑面积计算

;;; 新函数:支持多个图层和通配符
(defun bb_layon&off_multiple (patterns / doc layers layer layname matched)
(vl-load-com)
(setvar "cmdecho" 0)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq layers (vla-get-layers doc))

;; 遍历所有图层
(vlax-for layer layers
    (setq layname (vla-get-name layer))
    (setq matched nil)
   
    ;; 检查图层是否匹配任一模式
    (foreach pattern patterns
      (if (wcmatch layname pattern)
      (setq matched t)
      )
    )
   
    ;; 如果匹配,则切换图层状态
    (if matched
      (if (= (vla-get-layeron layer) :vlax-true)
      (command "_.layer" "_off" layname "")
      (command "_.layer" "_on" layname "")
      )
    )
)
(setvar "cmdecho" 1)
(princ)
)

;;; 保留原函数以便向后兼容
(defun bb_layon&off (pattern)
(bb_layon&off_multiple (list pattern))
)


tigcat 发表于 2025-9-21 00:09:50

谢谢分享,顶楼主。

magicheno 发表于 2025-9-21 02:38:43

感谢大佬分享

qifeifei 发表于 2025-9-21 09:58:13


感谢大佬分享

zhoupeng220 发表于 2025-9-21 12:20:09


感谢大佬分享

不一样地设计 发表于 2025-9-22 01:42:33


感谢大佬无私奉献

qazxswk 发表于 2025-9-22 02:14:58

代码写的不错,但系统自带三个命令也不错的
"layiso";孤立图层
"layoff" ;隐藏选择定图层   
"layon" ;显示所有图层

tranque 发表于 2025-9-22 09:42:55

感谢大佬的分享

pxt2001 发表于 2025-9-23 07:21:20

本帖最后由 pxt2001 于 2025-9-23 07:22 编辑

把图层写死了,不灵活。可能用图层组过滤器,属性过滤器,图层状态过滤器更好。当然可以用lisp而不是纯CAD来处理。
页: [1]
查看完整版本: 打开/关闭特定图层,支持通配符