本章将介绍如何使用AutoLisp操作图元的图层、颜色。
一、修改图元图层
使用lisp代码修改图层本质上也是对图元数据列表的修改,但是在正式开始介绍如何修改图层之前,我们应该需要了解如何通过AutoLisp新建和删除图层。
1、新建图层
在这一部分我们介绍两种创建图层的方法,首先来看第一种,使用command命令新建图层:
(setq #strNewLayer "NewTestLayer")
(command "-layer" "n" #strNewLayer "c" "1" #strNewLayer "")
执行上述代码可以新建一个名为NewTestLayer的图层。使用command命令创建图层较为简单,这里不做过多赘述,我们直接来看如何通过实体数据库新建图层。
在这里我们要接触到一个新的函数:
函数名称 | 函数功能 |
---|---|
(entmakeX) | 创建一个新对象或图元,赋给它一个句柄和图元名(但不指定所有者),并返回新图元的名称。 |
此函数的用法与entmake类似:
(entmakeX (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) (cons 2 "NewLayerFromLisp")))
这样,我们就成功创建了一个名为NewLayerFromLisp的图层。
2、删除图层
删除图层的方法这里不做重点介绍,直接通过command命令删除即可:
(command "-layer" "del" "NewLayerFromLisp" "")
但需要注意,在使用command命令删除图层时,不能删除0层、当前层以及存在实体的图层。
3、更改实体图层
之前已经提到过,更改实体涂层的操作实际也是对列表的操作,这里不再讲解原理,直接展示代码:
(defun c:ModifyEntityLayer(/ #eName #eData #strNewLayer #oldLayer #newLayer)
(setq #strNewLayer "NewTestLayer")
(command "-layer" "m" #strNewLayer "c" "1" #strNewLayer "") ;; 生成一个新图层并设置为当前层,如果该图层已经存在,则只是将其设置为当前层
;; 循环选中实体,修改实体图层,鼠标右键结束
(while (setq #eName (entsel))
(setq #eData (entget (car #eName)))
(setq #oldLayer (assoc 8 #eData))
(setq #newLayer (cons 8 #strNewLayer))
(setq #eData (subst #newLayer #oldLayer #eData))
(entmod #eData)
);while
)
二、修改图元颜色
更改图元颜色的方法和更改图层一致,只不过是修改了不同的列表元素而已,所以直接展示代码:
(defun c:ModifyEntityColor(/ #eName #eData #oldColor #newColor)
;; 循环选中实体,修改实体颜色,鼠标右键结束
(while (setq #eName (entsel))
(setq #eData (entget (car #eName)))
(setq #newColor (cons 62 3)) ;; 更改为绿色
(if (setq #oldColor (assoc 62 #eData))
(setq #eData (subst #newColor #oldColor #eData))
(setq #eData (append #eData (list #newColor)))
)
(entmod #eData)
)
)