matlab第三版课后答案【entmake函数在AutoLisp程序设计中的应用研究】
摘要:主要介绍了AutoLisp二次开发AutoCAD过程中entmake函数的功能、性能以及使用方法。 关键词:AutoCAD;AutoLisp;entmak
中图分类号:TP312文献标识码:A文章编号:16727800(2012)008003402
作者简介:郎建山(1979-),男,国电南京自动化股份有限公司/南京南自科林系统工程有限公司工程师,研究方向为发电厂水处理技术。
0引言
AutoLisp 是 Autodesk 公司集成在 Autocad 软件内部的二次开发编程语言,其易学、易用,即使是初学者也能在较短时间内编写出精彩程序,与Autocad软件自身又具有完美的兼容性,因此受到广大工程师的青睐,用其撰写了无数工程实用工具,大大提高了工作效率。在 AutoCAD 二次开发过程中,entmake 作为 AutoLisp 功能函数之一,发挥着重要作用。
1entmake函数的功能
在图形中创建一个新图元:(entmake \[elist\])
参数elist:图元定义数据表,其格式与 entget 函数返回表的格式相似。elist 参数必须包含创建图元的全部必要数据,如果省略了任何一个必须的定义数据,该函数就会返回 nil 并拒绝创建该图元。如果省略了可选的定义数据(如图层),entmake 使用缺省值。
2entmake函数的性能
在 AutoCAD 二次开发过程中,“entmake”并不是唯一在图形中创建一个新图元的方法,也可采用“command”函数调用AutoCAD 内部命名的方法在图形中创建一个新图元。下面以实例分析两者性能的优缺点。
例子:在 AutoCAD 中以pt1和pt2为端点绘制一条直线
command方法:(command "line" pt1 pt2 "")
entmake方法:(entmake (list "(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
上例中,command方法在编程结构上比较简洁,操作习惯符合常规的CAD命令使用。但在如“捕捉”等环境因素影响下,有时候可能得不到正确的图元,同时command运行速度较慢。entmake方法不受环境因素影响,在运行速度上大约是command方法的300倍,实践证明在创建大量图元时使用entmake对提高程序的效率具有积极的意义。初学者通常喜欢采用command方法,对于有经验的工程技术人员,在等同的条件下,会优先使用entmake。
3entmake函数的使用方法
在实际编程过程中,entmake 所需的elist参数——图元定义数据表结构非常复杂,不同图元的数据表不同,相同图元的必要数据和可选的定义数据的组合又非常多。如果缺少必要数据,entmake则无法创建图元,如果定义数据过多又会使得程序冗长,初学者很难灵活掌握。因此,熟悉各种图元的必要数据是正确使用entmake的关键。
下面总结了entmake创建各种图元的必要数据,省略了如图层、颜色等可选的定义数据。编程人员可根据实际情况灵活添加可选的定义数据。
直线
(entmake (list "(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))
两顶点多段线(多顶点类似)
(entmake (list "(0 . "LWPOLYLINE") "(100 . "AcDbEntity") "(100 . "AcDbPolyline") (cons 90 2) (cons 10 pt1) (cons 10 pt2)))
点表生成多段线
(entmake (append(list "(0 . "LWPOLYLINE") "(100 . "AcDbEntity") "(100 . "AcDbPolyline") (cons 90 (length lst)))(mapcar "(lambda(pt)(cons 10 pt )) lst )))
圆
(entmake (list "(0 . "CIRCLE") (cons 10 pt) (cons 40 r)))
圆弧
(entmake (list "(0 . "ARC") (cons 10 pt) (cons 40 r) (cons 50 ang1) (cons 51 ang2)))
单行文本
(entmake (list "(0 . "TEXT") (cons 1 str) (cons 10 pt) (cons 40 5)))
多行文本
(entmake (list "(0 . "MTEXT") "(100 . "AcDbEntity") "(100 . "AcDbMText") "(7 . "Standard") (cons 1 str) (cons 10 pt)))
半径标注
(entmake (list "(0 . "DIMENSION") "(100 . "AcDbEntity") "(100 . "AcDbDimension") (cons 10 pt) "(70 . 36) "(100 . "AcDbRadialDimension" ) (cons 15 pt1)))
直径标注
(entmake (list "(0 . "DIMENSION") "(100 . "AcDbEntity") "(100 . "AcDbDimension") (cons 10 pt1) (cons 11 pt2) "(70 . 163) "(100 . "AcDbDiametricDimension") (cons 15 pt3)))
