AutoLisp从入门到放弃(七)
本章将介绍如何在AutoLisp代码中通过直接操作实体数据库的方式来新增和删除图元。
一、创建图元
在之前的学习中,我们已经能够知道,AutoCAD中图元的所有数据信息都是可以通过entget方法获取到的,而这个函数获取到的图元的属性信息是通过列表的形式展现的,我们可以通过修改列表中的元素来实现图元的编辑。那么,我们是否可以通过创建一个新的列表的形式来实现在图形中新增图元呢?理论上是没有问题的,但是这就又要引入一个新的函数:
函数名称 | 函数功能 |
---|---|
(entmake) | 在图形中创建一个新图元。 |
entmake函数的具体用法如下:
(entmake [elist]) ;; 这里的elist表示一个图元的属性列表
在上述的代码中,elist中一定要包含要创建的图元的所有必要元素,例如我们要创建一条直线,首先,一定要声明直线这个类型,然后就是直线的必要元素:起点和终点。所以有:
(entmake (list (cons 0 "LINE") (cons 10 (list 0 0 0)) (cons 11 (list 100 0 0))))
在上述的代码中,我们创建了一条起点为(0 0 0),终点为(100 0 0)的直线。
当然,第一次接触到这个方法可能会觉得没有使用command命令那样简单直观,但是一些特殊情况下(捕捉开启),我们使用command绘制图元的结果可能会受到软件运行环境的影响,而且command的运行速度要比entmake慢很多,所以,我们更推荐使用entmake来生成实体。(我知道这对于初学者来说是很难的,但是你如果真的想搞懂AutoLisp的话,是不可能一直使用command来画图的。)
根据以上的讲解,我们可以继续尝试通过entmake来生成一下其他实体:
(entmake (list (cons 0 "CIRCLE") (cons 10 (list 0 0 0)) (cons 40 100.0))) ;; 画圆
(entmake (list (cons 0 "ARC") (cons 10 (list 0 0 0)) (cons 40 50.0) (cons 50 0.0) (cons 51 (* PI 0.5)))) ;; 画圆弧
(entmake (list (cons 0 "TEXT") (cons 1 "AutoLisp从入门到放弃") (cons 10 (list 0 0 0)) (cons 40 10))) ;; 画单行文本
;; 画多段线,这里只生成一条只有两个顶点的多段线,需要生成多个顶点的多段线的情况下继续增加点坐标即可
(entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 2) (cons 10 (list 0 0 0)) (cons 10 (list 100 0 0))))
二、删除图元
在AutoLisp中,删除图元可以使用以下方式:
1、command命令
使用command命令删除图形比较容易理解,直接调用erase命令进行删除即可。
(command "erase" (car(entsel)) "") ;; 删除对象
上述代码可以实现删除指定图元的功能。
2、entdel函数
函数名称 | 函数功能 |
---|---|
(entdel) | 删除对象(图元)或恢复先前删除的对象。 |
该函数具体用法如下:
(entdel ename) ;; 如果由 ename 参数指定的图元当前在图形中,则删除该图元。如果在本次编辑任务中该图元已被删除,entdel 函数将恢复该图元。只有在图形退出图形编辑环境时,被删除的图元才会真正从图形中清除。entdel 函数既可以删除图形对象,又可以删除非图形对象。
实现删除用户选中实体功能:
(entdel(car(entsel)))