AUTOLISP编程
基本指南:两数求和
在命令行输入:(+ 2 3) (- 2 3) (* 2 3) (/ 2 3)
如果直接输入(/ 2 3)则会显示0 因为2和3是整型所以AutoLisp把这些数字译为整型(AutoLisp进行了四舍五入)所以输入(setq x (/2.0 3))就可得到0.666667六位小数
在命令行输入:!p则会显示p这个变量的值
SETQ和变量
Setq是来保存计算的结果的,相当于给一个变量赋值例: (setq x (/2.0 3)) 这边x是变量就是把2.0/3的值赋给x Setq能完成多项“设置相等”例如:
(setq x 1.0 y 2.0 z 3.0) 就是分别赋给x y z 赋值
AutoLISP函数
1. 数学函数
(min 7 3 5 11) 就是取7 3 5 11这四个数的最小值 (setq minbr (min 7 3 5 11)) (sin minbr) 数学函数 功能 + 加 - 减 * 乘 / 除 1+ 自增1 1- 自减1 FLX 截取实数的整数部分 FLOAT 整数变为实数 REM 返回除法的余数 EXPT 指数 SIN 求弧度角的正弦 COS 求弧度角的余弦 ATAN 求两个数字的反正切 注意:AutoLISP的角是弧度值而不是角度值。例如:45度的角的正弦值 (setq rad (*(/ 45 180.0)pi)) 2.几何函数
(setq p1 '(1.3 5.7)) ‘表示指定2个(3个)的坐标值,这样AutoLISP就不会计算这些值了
(setq p2 '(7.5 3.1)) (setq p3 '(9 4)) (setq p4 '(0.1 2.5)) (distance p1 p2)
1
(angle p1 p2)
(inters p1 p2 p3 p4) (osnap p1 \
TEXTBOX(查找一行文字的矩形外框)POLAR(指定距离和角度返回一个3D点) 几何函数 功能 X轴和由2个点定义的直线间的(弧度)夹角 2点之间的3D距离 在某一个(弧度)角度上的3D点 对某一个点应用对象捕捉模式后的3D点 4个点定义的3D交叉点 Angle Distance Polar Osnap Inters 2.条件函数 例:在一个绘制楼梯间的AutoLISP例程中,一部分程序检查层高是否大于8英寸:如果大于,就绘制出14级台阶,如果小于就绘制13级台阶。 (if (>height 96) (setq steps 14) (setq steps 13)) 条件函数 = /= < <= > >= If Cond Repeat While ForEach 等于 不等于 小于 小于或等于 大于 大于或等于 如果——那么——否则 查找真的表达式 重复n次表达式 重复验证表达式直到假命题出现 计算表达式中所有数值的表达式值 注释 3.字符串和转换函数 (strlen “Using AutoCAD”)
STRLEN函数将报告Using AutoCAD为13个字符,计算空格。可以看到Using AutoCAD被引号括起来表明它是字符串。如果输入(strlen Using AutoCAD),AutoLISP会试图查询变量Using和AutoCAD所包含字符串的长度。 (strlen autocad “A software package”) (strlen using “the planet Earth”)
(strlen using autocad)返回34
STRCAT函数通过混合变量和文字将字符串连接在一起并创建返回信息。
(strcat autocad “used all over” using) 返回“A software package used all over the planet Earth ” 字符串函数 功能 StrCase StrCat StrLen SubStr WcMatch
把所有的文字转换成大写或小写 连接所有的字符串 返回字符串中的字符数 返回字符串的一部分 在字符串中匹配通配符 2
如何把45度37分11秒即AutoCAD表示的45d37’11’’呢?这就要用到一个名称为ANGTOF的转换函数。它把包含格式化的角度的字符串转换为弧度(实数),如下例:
(angtof “45d37’11\\’’”1)返回0.796214 d表示度‘表示分 \\’’表示秒之所以这样用是为了不至于与后引号(”)混淆,后引号表示字符串的结束。
ANGTOF函数能完成几种AutoCAD支持的单位之间的转换,而用状态值来表示转换的类型,本例中的1是状态值。几个用到模式值的AutoLISP函数如表:
模式 说明 0 1 2 3 4 十进制度 度-分-秒 分度 弧度 测绘单位 示例 45.3711 45d37’11’’ 100.1234 0.3964 N45d37’11’’E 模式数值与AUNITS系统变量的数值一致。当您不知道单位的设置时,可以用该系统变量求得模式的数值。
(angtof “45d37’11\\’’” (getvar “aunits”)) 返回0.796214 GETVAR函数可获取系统变量的数值。 转换函数 字符串转换 AtoF AtoI RtoS ItoA Ascii Chr 数值转换 CvUnit 字符串转换为实数 字符串转换为整数 数字转换为字符串 整数转换为字符串 把首字符转换为ASCII 把ASCII码转换为字符 基于acad.nut数值的单位转换 功能 4.命令和系统变量 任何在命令提示行中完成的操作都可以很轻松地用COMMAND函数来完成。例如:(command “circle”“2,2”“D”“1.5” ) 该命令行的意思是创建以一个圆心坐标为(2,2)直径为1.5的圆其实这表示的意思都是我们平常画圆操作的顺序。 我们可以看到所有的文字都用引号括起来,所有的内容都被认为是字符串,即使是数字也是如此。
(command“text”“5,10”“1.5”“”“Using AutoCAD”) 其中那个红色引号的意思是旋转文字属性按enter键结束就是不旋转文字的意思。另一方面通常代表ENTER来退出TEXT命令会以闭括号结束。然而,对于那些自动回复的命令如LINE命令, “”是需要的。
(command “line “1,2”“3,4”“”) 当您最后忘记””时候,AutoCAD会留下下一点的信息不会结束命令。
要高效地应用CAMMAND函数,你必须知道AutoCAD的300条命提示顺序。可以看下“参考书”
注意的是“任何在COMMAND函数提示下输入信息可用于CAOMMAND。”注意“输入”这个词。该函数不能对对话框和工具栏宏起作用。用对话框的命令不能用在COMMAND中。 获取系统变量
3
AutoLSIP提供了2个更直接的函数:GETVAR(获取一个系统变量的值)和SETVAR(设置或者修改这个值)
系统变量SPLFRAME用于确定样条多段线控制框是否显示。默认值是0意思是不显示。(getvar “splframe”) 返回值为0
(setvar “splframe” 1) 就是设置splframe显示控制框 Get函数
GETSTRING函数提示用户输入文字,并把它保存在txtstr
在命令行输入:(setq txstr (getstring T “What do you want to write?”) ) 在命令行出现:What do you want to write?然后输入Using AutoCAD 返回Using AutoCAD
注意这里附加的AutoLISP标识符T,它是一个AutoLISP操作,可允许GETSTRING中的字符串的包含空格。如果省去T,GETSTRING只会接纳首空格之前的文字,在COMMAND:提示下也是同样的情况(结尾只有Using 而没有AutoCAD) GETREAL函数提示用户输入一个高度值。例如:
(setq txtHt(getreal “How big do you want the letter?”) 在命令行出现:How big do you want the letter?输入2 在命令行返回2.0
GETREAL函数会自动把2(整数)转化为实数2.0,你也可以不用输入数值,直接在工作窗口单击2点让AutoLISP自动读取2个点的距离。如果你误输入了文字,AutoCAD会重新叫你输入。
(setq TxtAng(getangle “Tilt the text by how much?”)
GETANGLE函数提示用户输入一个角度,并把它转换成弧度值。与上面函数一样可以在工作窗口单机2点。
(setq TxtIns (getpoint “Where do you want the text to start?”)) 在命令行出现:Where do you want the text to start? 这时你就选取一个点假如我选取的是(27,30,20)
GETPOINT函数提示用户输入文字的起点坐标:可以输入一个值,一个二维坐标或者三维的,或者在制作窗口单击一点。若只输入一个值则认为是0,0点到当前点的极轴距离。若输入文字则会返回错误信息。 通过以上的变量参数可以执行TEXT命令: (command“text” TxtIns TxtHt TxtStr) 会出现Using AutoCAD
AutoLISP所有GET函数如下表: GET函数 功能 字符串、数值、角度 GetAngle 用户选取的(弧度)角 GetOrient 独立于ANGBASE和ANGDIR的角(弧度) GetString 用户输入的文字 GetInt 用户输入的整型值 GetReal 用户输入的实型值 InitGet 限制用户输入数据 GetK Word 基于INITGET限制获取输入数据 选取的点 GetPoint 用户输入或单击点的x,y,z坐标 4
GetCorner 矩形的第二个角点 GetDist 两点之间的距离 5.选择集函数 AutoCAD的SELECT命令一次只可对一个选择集进行操作,但是AutoLISP的 SSxxx命令却可对最多128个选择集操作。 AutoLISP创建和检验选择集函数如下表: SS函数 功能 SsGet 选择图形中的对象 SsAdd 将对象添加到选择集 SsDel 从选择集中删除对象 SsLength 报告选择集中对象的数目 SsMemb 检查一个对象是否在选择集中 SsName 报告选择集中第n个对象的名称 对象操作函数 大部分对象操作函数以ent开头,是entity的简写,是AutoCAD对象的原名。 要创建并操作对象,ENT函数要作用于DXF格式的变体。该变体被称为“点对”。比如,作用于一个名为RightOfWay的层,就要用以下的格式、
“2 .RightOfWay”引号表明数据的开始与结束。中间的点(.)用于分隔两个值:2是层名的DXF代码:而RightOfWay是层名。要应用对象操作函数就需要对DXF格式有较好的理解。
AutoLISP的对象操作函数如表: Ent函数 功能 EntMake 新建对象 EntGet 获取描述对象数据 TblObjName 从符号表中获取对象名 HandEnt 返回对象的识别码(id) EntNext 获取数据库中的下一个对象 EntLast 获取新建对象 EntSel 提示用户选择一个对象 NEntSel 提示用户选择一个对象并返回选取点的坐标 EntMod 修改对象 EntUpd 对象修改后刷新屏幕 EntDel 删除对象 高级AutoLISP函数 AutoDesk公司提供了差不多4打函数来控制AutoCAD图形中的对象与外部数据库中的记录之间的ASE(AutoCAD结构化查询语言扩展名)连接。这些函数不难定位:他们都以Ase_开头,如ASE_LSUNITE和ASE_DOCMP
还有2打AutoLISP函数用来载入和控制对话框。如LOAD_DIALOGUE和NEW_DIALOGUE.有一组5个函数用来进行内存管理。但它们用途很小,所以Autodesk公司建议不必使用。 6.编写AutoLISP函数
指南:步骤1——选取点
在COMMAND函数中用ID命令,如(command “id”);
5