tryhi 发表于 2020-8-8 18:00:13

常用的图层函数

本帖最后由 tryhi 于 2020-8-8 18:06 编辑

;try-Layer-ojb-name 返回所有图层对应的对象名
;try-Layer-allname 返回所有图层的名称(字符串表)
;try-Layer-Info 返回所有图层的信息
;try-Layer-ent 获取指定图层的图元名
;try-Layer-On 关闭图层
;try-Layer-Off 打开图层
;try-Layer-Plot 设置指定图层(列表)不打印
;try-layer-make 创建一个图层


(setq
      ;;常用VLA对象、集合
      *ACAD*(vlax-get-acad-object)
      *DOC*   (vla-get-ActiveDocument *ACAD*)
      *DOCS*(vla-get-Documents *ACAD*)
      *MS*    (vla-get-modelSpace *DOC*)
      *PS*    (vla-get-paperSpace *DOC*)
      *BLKS*(vla-get-Blocks *DOC*)
      *LAYS*(vla-get-Layers *DOC*)
      *LTS*   (vla-get-Linetypes *DOC*)
      *STS*   (vla-get-TextStyles *DOC*)
      *GRPS*(vla-get-groups *DOC*)
      *DIMS*(vla-get-DimStyles *DOC*)
      *LOUTS* (vla-get-Layouts *DOC*)
      *VPS*   (vla-get-Viewports *DOC*)
      *VS*    (vla-get-Views *DOC*)
      *DICS*(vla-get-Dictionaries *DOC*)
      *Layouts* (vla-get-Layouts *doc*)
)


;;返回所有图层对应的对象名(大写)
;;返回:((图层名1 对象名1) (图层名2 对象名2)……)
(defun try-Layer-obj-name (/ ob)
      (vlax-for each (vla-get-Layers *DOC*)
                (setq ob(cons(list (vla-get-name each)each)ob))
      )
      ob
)


;;返回所有图层的名称(字符串表)
(defun try-Layer-allname(/ out)
      (vlax-for obj *LAYS*
                (setq out (cons (vlax-get-property obj 'Name) out))
      )
      (reverse out)
)

;|
返回所有图层的信息
(("层名" 状态 颜色 "线型")……)
状态:1冻结图层 2新视口冻结图层 4锁定…(其他看帮助)
颜色:负值为隐藏图层
|;
(defun try-Layer-Info (/ lst d e1 e2)
      (while (setq d (tblnext "layer" (null d)))
                (setq   lst (cons (mapcar 'cdr (cdr d)) lst)    )
      )
      (vl-sort lst '(lambda (e1 e2) (< (car e1) (car e2))))
)

;;获取指定图层的图元名
;;(try-Layer-ent "0") --> <图元名: -64cb388>
(defun try-Layer-ent (name)(tblobjname "layer" name))


;;打开关闭图层
;;参数:图层名称表
(defun try-Layer-On (LayList)
      (setq LayList(mapcar 'strcase LayList))
      (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                              (vla-put-LayerOn each :vlax-True)
                        )
                )
                (vlax-release-object each)
      )
)


;;关闭图层
;;参数:图层名称表
(defun try-Layer-Off (LayList)
      (setq LayList(mapcar 'strcase LayList))
      (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                              (vla-put-LayerOn each :vlax-False)
                        )
                )
                (vlax-release-object each)
      )
)

;;设置指定图层(列表)不打印
;;参数1、图层列表
;;参数2、是否打印(T打印/nil不打印)
(defun try-Layer-Plot (LayList On-Off)
      (vlax-for each (vla-get-Layers *DOC*)
                (if (member (strcase (vla-get-name each)) (mapcar 'strcase LayList))
                        (if (vlax-write-enabled-p each)
                              (if On-Off
                                        (vla-put-Plottable each :vlax-True)
                                        (vla-put-Plottable each :vlax-False)
                              )
                        )
                )
                (vlax-release-object each)
      )
)
;;;创建一个图层
;;;参    数1:name:图层名称
;;;参    数2:colour:颜色默认nil(7)
;;;参    数3:xianxin:线型默认nil(Continuous)
;;;参    数4:n70:标志位,默认nil(0)(详见函数内注释)
;;;示    例: (try-make-layer "abc" nil nil nil)
(defun try-layer-make (name colour xianxin n70)
      (or n70 (setq n70 0))
      ;标准标记(按位编码值):
      ;1 = 冻结图层,否则解冻图层
      ;2 = 默认情况下在新视口中冻结图层
      ;4 = 锁定图层
      ;16 = 如果设置了此位,则表条目外部依赖于外部参照
      ;32 = 如果同时设置了此位和位 16,则表明已成功融入了外部依赖的外部参照
      ;64 = 如果设置了此位,则表明在上次编辑图形时,图形中至少有一个图元参照了表条目。(此标志适用于 AutoCAD 命令。大多数读取 DXF 文件的程序都可以忽略它,并且无需由写入 DXF 文件的程序对其进行设置)
      (or colour (setq colour 7))
      (or xianxin (setq xianxin "Continuous"))
      (entmakex
                (list
                        '(0 . "LAYER")
                        '(100 . "AcDbSymbolTableRecord")
                        '(100 . "AcDbLayerTableRecord")
                        (cons 2name)
                        (cons 70 n70)
                        (cons 62colour)
                        (cons 6xianxin)
                ))
)

有没有人有补充的



llsheng_73 发表于 2020-8-13 11:10:44

暂时没得补充
(defun Makelay(lst);;lst图层名、颜色、线型、标准标记(一般只需设置0,1,2,4,后边的位新建图层不需要)、打印标志(0不打印)、线宽,可依次缺省
(entmakex(mapcar'cons'(0 100 100 2 62 6 70 290 370)(vl-list*"LAYER""AcDbSymbolTableRecord""AcDbLayerTableRecord"lst))))

magicheno 发表于 2020-9-10 15:21:15

大侠,我增加了图层锁定,但是对于视口图层的冻结不知道该怎么弄的
比如下面这个,如何不用command表达呢
;; 冻结排水层
(defun c:55pp()
(setvar "cmdecho" 0)
(command "_.vplayer" "F" "WP_P,WP_P_*,WP_S,WP_S_*,WP_Y,WP_Y_*,WP_YP,WP_YP_*,WP_YY,WP_YY_*,WP_YF,WP_YF_*,WP_W2,WP_W2_*,WP_YT,WP_YT_*,WP_KTN,WP_KTN_*" )
(command "" ""))

;;锁定图层
;;参数:图层名称表
(defun try-Layer-Lock (LayList)
      (setq LayList(mapcar 'strcase LayList))
      (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                              (vla-put-lock each :vlax-True)
                        )
                )
                (vlax-release-object each)
      )
)


;;解锁图层
;;参数:图层名称表
(defun try-Layer-UnLock (LayList)
      (setq LayList(mapcar 'strcase LayList))
      (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                              (vla-put-lock each :vlax-False)
                        )
                )
                (vlax-release-object each)
      )
)


;;锁定图层
;;参数:字符串,支持通配符
(defun try-Layer-Lock-2 (layer)
         (try-Layer-Lock(vl-remove-if-not '(lambda(x)(wcmatch x layer))(try-Layer-allname)))
)

;;解锁图层
;;参数:字符串,支持通配符
(defun try-Layer-Unlock-2 (layer)
         (try-Layer-Unlock(vl-remove-if-not '(lambda(x)(wcmatch x layer))(try-Layer-allname)))
)
(defun c:sf1()
      (try-Layer-Lock-2 "*")
      (try-Layer-Unlock-2 "WP_*,DN_*,LGBH_*,TXT_*,EV_*,W-DIM,W_DIM,WW_*,WX-*,SB,SB_*,PUB_TABLE,PUB_W-DIM,0,WX_J")
      (try-Layer-On-2 "*")
      (command "regen")
)

magicheno 发表于 2020-8-12 00:28:55

大侠下面是我网上找的常用的框选关闭和打开所选图层的,如果用你的函数该怎么写的

;; 关闭未选
(DEFUN C:11 (/ ES EN EL A)
(princ "请选择对象,未被选中的对象所在的层将被关闭")
(setq ES (ssget) A 0 EN "" EL nil FL nil)
(while (/= EN nil)
(setq EN (ssname ES A) EL (cons EN EL) A (1+ A)))
(setq EL (cdr EL) FL (cdr (assoc ' 8 (entget (car EL)))) EL (cdr EL))
(repeat (- A 2)
(setq EN (cdr (assoc ' 8 (entget (car EL))))
FL (strcat EN "," FL) EL (cdr EL)) )
(command "LAYER" "off" "*" "y" "on" (eval FL) "")
(princ))


;关闭对象所在层
(defun c:33 (/ ss c en lay)
(if (setq ss (ssget))
    (progn;;;关闭
      (setq c 0)
      (while (< c (sslength ss))
      (setq en (ssname ss c))
      (setq lay (cdr (assoc 8 (entget en))))
      (if (not (member lay laylst))
          (setq laylst (cons lay laylst))
      )
      (if (= lay (getvar "clayer"))
          (command "-layer" "off" lay "y" "")
          (command "-layer" "off" lay "")
      )
      (setq c (+ 1 c))
      )
    )
    (progn;;;开启
      (setq c 0)
      (repeat (length laylst)
      (command "-layer" "on" (nth c laylst) "")
      (setq c (1+ c))
      )
    )
)
(princ)
)

Bao_lai 发表于 2020-8-8 19:32:44

海哥多发点try字头的函数

xvjiex 发表于 2020-8-8 19:33:04

图层函数,很常用,感谢高手整理。

hhh454 发表于 2020-8-8 20:53:41

很给力,

start4444 发表于 2020-8-8 21:15:42

谢谢海神分享源码!

669423907 发表于 2020-8-8 21:54:16

本帖最后由 669423907 于 2020-8-8 21:57 编辑

感谢大海分享好源码
(cons 290 dy) ;1打印,0不打印(cons 370 xiankuan) ;线宽

magicheno 发表于 2020-8-8 21:55:12

大侠牛逼,给力啊

999999 发表于 2020-8-9 08:39:18

支持支持,适合我们学习

yoyoho 发表于 2020-8-9 09:37:37

谢谢! 大海分享源码!!!!!

qinleilei 发表于 2020-8-9 14:55:55

本帖最后由 qinleilei 于 2020-8-9 15:42 编辑

作者已删除!
页: [1] 2 3 4
查看完整版本: 常用的图层函数