简述autolisp使用的七种数据类型

简述autolisp使用的七种数据类型,第1张

一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。

除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP却生存下来,并且已经成为人工智能(AI)的首选程序序言。AutoLISP解释程序位于AutoCAD软件包中,然而AutoCAD R217及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R218及更高版本才可以使用AutoLISP语言。

开发软件编辑

AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令未被提供。例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。

现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。

在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。同时,本章还假定读者并无编程方面的知识。如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数,请参阅Autodesk公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。

数学运算编辑

任何编程语言都提供数学函数。在AutoLISP中,同样提供了编程以及数学计算所需的大部分数学函数,你可以使用AutoLISP对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP还可以进行许多其他计算。这一节主要讨论AutoLISP程序语言支持的常用数学函数。

加法

格式(+ num1 num2 num3)

此函数(+)计算加号(+)右边所有数字的和(+ num1 num2 num3)。这些数字可以是整数或实数。如果均为整数,则和为整数;如果均为实数,则和为实数。但是如果既有整数又有实数,则和为实数。如下所示,在前两个例子中,所有数字均为整数,所以结果是整数。在第三个例子中,一个是实数(500),故结果为实数。

示例

Command:(+2 5)返回 7

Command:(+2 30 4 50)返回86

Command:(+2 30 4 500)返回 860

减法

格式(- num1 num2 num3)

此函数(-)从第一个数中减去第二个数(num1-num2)。如果多于两个数,就用第一个数字减去其后所有数字的和[num1-(num2+num3)]。在下面的第一个例子中,28减去14后返回14。因为两个数均为整数,结果亦为整数。在第三个例子中20与100相加,并用50减去两数的和(300),返回一个实数200。

示例:

Command:(- 28 14) 返回14

Command:(- 25 7 11)返回7

Command:(- 50 20 100)返回200

Command:(- 20 30)返回-10

Command:(- 200 300)返回-100

乘法

格式( num1 num2 num3…)

此函数()计算乘号右边所有数字的乘积( num1×num2×num3)。若均为整数,它们的乘积亦为整数;若其中含有一个实数,乘积即为实数。

示例:

Command:( 2 5) 返回10

Command:( 2 5 3) 返回30

Command:( 25 3 20) 返回1500

Command: ( 2 -55) 返回-110

Command: ( 20 -55 -2) 返回220

除法

格式( / num1 num2 num3…)

此函数(/)用第一个数除以第二个数。如果多于两个数,就用第一个数除以其后所有数的乘积[num1/(num2 × num3 ×)]。在下面的第四个例子中,用200除以50与4的乘积[200/(50×4)]。

示例:

Command:(/ 30)返回 30

Command:(/ 3 2)返回1

Command:(/30 2) 返回 15

Command:(/ 2000 50 4)返回 100

Command:(/ 200 -5)返回-40

Command:(/ -200 -50)返回400

增量数字编辑

格式(1+ number)

此函数(l+)使数字与1(整数)相加,返回一个增加1的数。在下面的第二个例子中,1与-105相加返回-95。

示例:

(1+ 20)返回 21

(1+ -105)返回-95

减量数字编辑

格式(1- number)

此函数(1-)从数字中减去1(整数),并返回一个减去1的数。在下面的第二个例子中-105减去1返回-115。

示例:

(1- 10)返回9

(1- -105)返回-115

绝对数字编辑

格式(abs num)

abs函数返回一个数的绝对值。该数可以是整数或者实数。在下面的第二个例子中,由于-20的绝对值为20,故函数返回20。

(abs 20)返回 20

(abs -20)返回20

(abs -205)返回205

三角函数编辑

sin函数

格式( sin angle)

sin函数计算一个角(以弧度表示)的正弦值。在下面的第二个例子中,sin函数计算Pi(180度)的正弦值并返回0。

示例:

Command:(sin 0)返回00

Command:(sin Pi)返回00

Command:(sin 10472)返回0866027

cos函数

格式(cos angle)

cos函数计算一个角(以弧度表示)的余弦值。在下面的第三个例子中,cos函数计算Pi(180度)的余弦值并返回-10。

示例:

Command:(cos 0)返回l0

Command:(cos 00)返回10

Command:(cos Pi)返回-10

Command:(cos 10)返回0540302

atan函数

格式( atan num1)

atan函数计算数的反正切值,返回角度以弧度表示。下面的第二个atan函数计算10的反正切值并返回0785398(弧度)。

示例:

Command:(atan 05)返回0463648

Command:(atan 10)返回0785398

Command:(atan -10)返回-0785398

两个参数的atan函数

格式( atan num1 num2)

还可以在atan函数中再指定一个数。若指定了第二个数,函数将以弧度形式返回(num1/num2)的反正切值。在下面的第一个例子中,第一个数(05)除以第二个数(10),atan函数计算商(05/1=05)的反正切值。

示例:

Command:(atan 05 10)返回0463648弧度

Command:(atan 20 30)返回0588003弧度

Command:(atan 20 -30)返回255359弧度

Command:(atan -20 300)返回-05880033弧度

Command:(atan -20 -30)返回-255359弧度

Command:(atan 10 00)返回15708弧度

Command:(atan -05 00)返回-15708弧度

angtos函数

格式(angtos angle[made[precision]])

angtos函数以字符串格式返回以弧度表示的角度值。字符串格式由made和 precision的设置决定。

示例:

Command:(angtos 0588003 0 4)返回“336901"

Command:(angtos 255359 0 4)返回“1453099"

Command:(angtos 15708 0 4)返回“900000"

Command:(angtos -15708 0 2)返回“27000"

注意 在(angtos angle[mode[precision]])中:

angle是以弧度表示的角度值。

mode是与AutoCAD系统变量AUNITS相对应的angtos模式。

AutoCAD中可用模式如下:

ANGTOS模式 编辑格式

0 十进制角度

1 度/分/秒

2 梯度

3 弧度

4 测量单位

precision是一个整数,用于控制小数的位数,与AutoCAD系统变量AUPREC相对应。 其最小值为0,最大值为4。

在上面的第一个例子中,angle为0588003弧度,mode为0(十进制角度),precision为4(小数点后有四位)。函数返回336901。

表达式编辑

在程序中,通常都需要测试某些特定的条件。若条件为真,程序执行某些功能,若不为真,执行另外一些功能。例如,条件表达式(if(< X 5)),若变量x的值小于5,测试结果为真。编程过程中经常要用到这种类型的测试条件。本节讨论在AutoLISP编程中要用到的各种关系表达式。

等于

格式(= atom1 atom2…)

该函数(=)检查两个元素是否相等。若相等,条件为真,函数返回T。同样,若指定的元素不相等,条件为假,函数返回nil。

示例:

(= 5 5)返回T

(= 5 49)返回nil

(= 55 55 55)返回T

(= "yes"“yes”)返回T

(=“yes" "yes" “no”)返回nil

不等于

格式(/= atom1 atom2…)

该函数(/=)检查两个元素是否不相等。若不相等,条件为真,函数返回T。同样,若指定的元素相等,条件为假,函数返回nil。

示例:

(/=50 4)返回T

(/= 50 50)返回nil

(/= 50 -50)返回T

(/= “yes” “no”)返回T

小于

格式(<atom1 atom2…)

该函数(<)检查第一个元素(atoml)是否小于第H个元素(atomZ)。若为真,函数返回T,否则返回nil。

示例:

(< 3 5)返回T

(< 5 3 4)返回nil

(< “x” “y”)返回T

小于等于

格式(<= atom1 atom2)

该函数(<=)检查第一个元素(atom1)是否小于等于第二个元素(atom2),若是,函数返回T,否则返回nil。

示例:

(<= 10 15)返回T

(<=“c”“b”)返回nil

(<= 20 0)返回T

大于

格式(> atom1 atom2…)

该函数(>)检查第一个元素(atom1) 是否大于第二个元素(atom2)。若是,函数返回T,否则返回nil。在下面第一个例子中,15大于10,因此,关系表达式为真,且函数返回T。在第二个例子中,10大于9,但9并不大于其后的9,因此函数返回nil。

示例:

(> 15 10)返回T

(>10 9 9)返回nil

(>“c”“b”)返回T

大于等于

格式(>= atom1 atom2…)

该函数(>=)检查第一个元素(atom1)的值是否大于等于第二个元素(atom2)。若是,函数返回T,否则返回nil。在下面第一个例子中,78大于但木等于50,因此,函数返回T。

示例:

(>= 78 50) 返回T

(>= "x"“y") 返回nil

abs 返回参数的绝对值

(abs number)

参数 number

返回值 参数的绝对值

示例 (abs 100) 返回100

(abs -3) 返回3

8acad_colordlg

显示标准的AutoCAD颜色选择对话框

(acad_colordlg colornum [flag])

参数

colornum

整数,其取值范围是 0-256 (包括 0 和 256),它用于指定颜色对话框的缺省的颜色代码。

flag

如可选参数 flag 设为 nil,禁用“随层”和“随块”按钮;省略 flag 参数或将其设为非 nil 值,则可启用“随层”和“随块”按钮。

colornum 为 0 时代表 BYBLOCK(随块),为 256 时代表 BYLAYER(随层)。

返回值

用户所选择的颜色代码,如果用户取消该对话框则返回 nil。

示例

下列代码提示用户选择一种颜色,如果不选则指定绿色为缺省颜色:

(acad_colordlg 3)

9acad-pop-dbmod

恢复 DBMOD 系统变量的值到最近用 acad-push-dbmod 保存的值

(acad-pop-dbmod) 该函数使用 acad-push-dbmod 控制 DBMOD 系统变量。DBMOD 系统变量跟踪图形的修改状态和触发保存图形请求。

返回值

如果成功时返回 T;否则,如果堆栈为空时,返回 nil。

10  acad-push-dbmod

储存 DBMOD 系统变量的当前值

(acad-push-dbmod)

该函数使用 acad-pop-dbmod 来控制 DBMOD 系统变量。用户可使用该函数来更改图形而保持 DBMOD 系统变量不变。DBMOD 系统变量跟踪图形的修改状态和触发保存图形请求。

该函数在 acapparx 中实现,acapparx 默认状态下是加载的。该函数可将 DBMOD 系统变量的当前值转到内部堆栈。要使用 acad-push-dbmod 和 acad-pop-dbmod,必须先进行 acad-push-dbmod  *** 作,再使用 acad-pop-dbmod 来恢复 DBMOD 系统变量的初始状态。

返回值

总是返回 T。

示例

以下例子显示了怎样储存图形的修改状态,接着对图形进行修改,最后恢复初始状态。

(acad-push-dbmod)(setqnew_line '((0  "LINE") (100  "AcDbEntity") (8  "0") (100  "AcDbLine") (10 10 20 00) (11 20 10 00) (210 00 00 10)))(entmake new_line) ; DBMOD 被设置标志 1(command "_color" "2") ; DBMOD 被设置标志 4(command "_-vports" "_SI") ; DBMOD 被设置标志 8(command "_vpoint" "0,0,1") ; DBMOD 被设置标志 16(acad-pop-dbmod) ; DBMOD 被设置回初始值

嵌入目的编辑

AUTOLISP嵌入AutoCAD的目的使用户充分利用AutoCAD进行二次开发;实现直接增加、修改AutoCAD的命令,随意扩大图形编辑功能,建立图形库和数据库并对当前图形进行直接访问和修改,开发CAD软件包等。

数据类型编辑

符号 (SYM)

字符串 (STR)

表  (LIST)

文件描述符  (FILE)

AutoLISP的内部函数  (SUBP)

AutoCAD的选择集 (PICKSET)

AutoCAD的实体名 (ENAME)

函数分页表 (PAGETB)

典型应用编辑

一、实现参数化绘图程序设计,包括尺寸驱动程序、鼠标拖动程序等。到目前为止,大多数参数化程序都是针对二维平面图形编制的。实际上,立体图同样可以实现参数化绘图,AutoCAD中编制实体的立体图参数化程序比其三维视图程序更简单,而且立体图生成后,可以很方便地生成三视图、剖面图和轴测图。

二、构成DCL文件创建自己的对话框。驱动利用AutoCAD提供的PDB模块构成DCL文件创建自己的对话框。

命令特点编辑

可以直接调用AutoCAD中的全部命令;

具备一般高级语言的基本结构和功能;

具有强大的图形处理功能。

功能编辑

1AutoLISP语言是在普通的LISP语言基础上,扩充了许多适用于CAD应用的特殊功能而形成的,一种仅能以解释方式运行于AutoCAD内部的解释性程序设计语言。

2AutoLISP语言中的一切成分都是以函数的形式给出的,它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数,再调用其他函数。

3AutoLISP把数据和程序统一表达为表结构,即S-表达式处理,故也可把程序当作数据来处理,也可把数据当作程序来执行。

4AutoLISP语言中的程序运行过程就是对函数求值过程,是在对函数求值过程中实现函数功能。

5AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂。

主要工具编辑

文本编辑器、格式编排器、语法检查器、源代码调试器、检验和监视工具、文件编译器、工程程序系统、上下文相关帮助与自动匹配功能和智能化控制平台。

(getdist [pt] [prompt])

这是getdist函数语法,如果后面有个pt那么只需用户选取一点就行了(或输入值),后面的[prompt]是提示语,这个是字符串,你的str_rr

(setq str_rr (strcat "\n新直径<"(rtos ( old_rr 2) 2)">:")) 这句返回的是"新直径<100>:"

后面一句是:(setq rr (getdist str_rr))

那么运行的结果是:

命令: 新直径<100>:

这里getdist后面没有带PT,那么要求用户输选两点或直接输入值,后面的str_rr是提示

多看看语法就行了

写好的Autolisp程序存为lsp文件,再用ap命令就可以调入cad使用,但在cad的界面里是没有图标的,只能用命令直接调用,但你可以自己定义图标,并把它定义调用你的Autolsp程序命令

一些提示吧,得到直线 用的是ssget,它建立一个选择集,然后在选择集中分别取各实体

(sslength xzj)获得选择集中对象的个数n

以下几行供参考

(setq en (ssget (list '(0 "spline,arc,line,ellipse,LWPOLYLINE"))))

(repeat (sslength en)

(setq ss (ssname en i))

(setq line (entget ss))

(setq x (cdr (assoc 11 line)))

(setq y (cdr (assoc 10 line)))

在程序开始的时候,加一句话:

(setvar "dimzin" 0);这样就可以保留小数点后的数据

把坐标转换为字串符:

(setq x1 (car &p1));取得X坐标

(setq x1 (rtos x1 2 4));转换为字串符,保留小数点后4位就可以实现你的数据

矩阵计算的话,还不懂。

(setq n (- nn 1))错误,应当修改为(setq nn (- nn 1))这样的数值才会变化。

同时,所有的n代码修改为nn代码,就可以循环处理对象了。

(while (setq ent0 (ssname ss 0));提取第一个对象

(setq ss (ssdel ent0 ss));排除这个对象

);这个方法也可以批量处理图元,这个方法的好处是可以处理任何数量的图元,也可以删除图元不影响循环 *** 作。

以上就是关于简述autolisp使用的七种数据类型全部的内容,包括:简述autolisp使用的七种数据类型、【AutoLISP】请教:(getdist str_rr))是什么意思、autolisp问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9650577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存