本文目录一览:
- 1、简述autolisp使用的七种数据类型
- 2、autolisp 组码后面的值怎么引用变量?
- 3、autolisp 错误: DXF 组不正确:
- 4、请求帮忙用autolisp或者vlisp写一句代码
- 5、求此AUTOlisp代码的错误之处...
- 6、跪求快速绘制一个图形的autolisp的源代码
简述autolisp使用的七种数据类型
第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。
除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP却生存下来,并且已经成为人工智能(AI)的首选程序序言。AutoLISP解释程序位于AutoCAD软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R2.18及更高版本才可以使用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...)。这些数字可以是整数或实数。如果均为整数,则和为整数;如果均为实数,则和为实数。但是如果既有整数又有实数,则和为实数。如下所示,在前两个例子中,所有数字均为整数,所以结果是整数。在第三个例子中,一个是实数(50.0),故结果为实数。
示例:
Command:(+2 5)返回 7
Command:(+2 30 4 50)返回86
Command:(+2 30 4 50.0)返回 86.0
减法
格式(- num1 num2 num3...)
此函数(-)从第一个数中减去第二个数(num1-num2)。如果多于两个数,就用第一个数字减去其后所有数字的和[num1-(num2+num3...)]。在下面的第一个例子中,28减去14后返回14。因为两个数均为整数,结果亦为整数。在第三个例子中20与10.0相加,并用50减去两数的和(30.0),返回一个实数20.0。
示例:
Command:(- 28 14) 返回14
Command:(- 25 7 11)返回7
Command:(- 50 20 10.0)返回20.0
Command:(- 20 30)返回-10
Command:(- 20.0 30.0)返回-10.0
乘法
格式(* num1 num2 num3…)
此函数(*)计算乘号右边所有数字的乘积( num1×num2×num3...)。若均为整数,它们的乘积亦为整数;若其中含有一个实数,乘积即为实数。
示例:
Command:(* 2 5) 返回10
Command:(* 2 5 3) 返回30
Command:(* 25 3 2.0) 返回150.0
Command: (* 2 -5.5) 返回-11.0
Command: (* 2.0 -5.5 -2) 返回22.0
除法
格式( / num1 num2 num3…)
此函数(/)用第一个数除以第二个数。如果多于两个数,就用第一个数除以其后所有数的乘积[num1/(num2 × num3 ×...)]。在下面的第四个例子中,用200除以5.0与4的乘积[200/(5.0×4)]。
示例:
Command:(/ 30)返回 30
Command:(/ 3 2)返回1
Command:(/3.0 2) 返回 1.5
Command:(/ 200.0 5.0 4)返回 10.0
Command:(/ 200 -5)返回-40
Command:(/ -200 -5.0)返回40.0
增量数字编辑
格式(1+ number)
此函数(l+)使数字与1(整数)相加,返回一个增加1的数。在下面的第二个例子中,1与-10.5相加返回-9.5。
示例:
(1+ 20)返回 21
(1+ -10.5)返回-9.5
减量数字编辑
格式(1- number)
此函数(1-)从数字中减去1(整数),并返回一个减去1的数。在下面的第二个例子中-10.5减去1返回-11.5。
示例:
(1- 10)返回9
(1- -10.5)返回-11.5
绝对数字编辑
格式(abs num)
abs函数返回一个数的绝对值。该数可以是整数或者实数。在下面的第二个例子中,由于-20的绝对值为20,故函数返回20。
(abs 20)返回 20
(abs -20)返回20
(abs -20.5)返回20.5
三角函数编辑
sin函数
格式( sin angle)
sin函数计算一个角(以弧度表示)的正弦值。在下面的第二个例子中,sin函数计算Pi(180度)的正弦值并返回0。
示例:
Command:(sin 0)返回0.0
Command:(sin Pi)返回0.0
Command:(sin 1.0472)返回0.866027
cos函数
格式(cos angle)
cos函数计算一个角(以弧度表示)的余弦值。在下面的第三个例子中,cos函数计算Pi(180度)的余弦值并返回-1.0。
示例:
Command:(cos 0)返回l.0
Command:(cos 0.0)返回1.0
Command:(cos Pi)返回-1.0
Command:(cos 1.0)返回0.540302
atan函数
格式( atan num1)
atan函数计算数的反正切值,返回角度以弧度表示。下面的第二个atan函数计算1.0的反正切值并返回0.785398(弧度)。
示例:
Command:(atan 0.5)返回0.463648
Command:(atan 1.0)返回0.785398
Command:(atan -1.0)返回-0.785398
两个参数的atan函数
格式( atan num1 num2)
还可以在atan函数中再指定一个数。若指定了第二个数,函数将以弧度形式返回(num1/num2)的反正切值。在下面的第一个例子中,第一个数(0.5)除以第二个数(1.0),atan函数计算商(0.5/1=0.5)的反正切值。
示例:
Command:(atan 0.5 1.0)返回0.463648弧度
Command:(atan 20 3.0)返回0.588003弧度
Command:(atan 2.0 -3.0)返回2.55359弧度
Command:(atan -2.0 3.00)返回-0.5880033弧度
Command:(atan -2.0 -3.0)返回-2.55359弧度
Command:(atan 1.0 0.0)返回1.5708弧度
Command:(atan -0.5 0.0)返回-1.5708弧度
angtos函数
格式(angtos angle[made[precision]])
angtos函数以字符串格式返回以弧度表示的角度值。字符串格式由made和 precision的设置决定。
示例:
Command:(angtos 0.588003 0 4)返回“33.6901"
Command:(angtos 2.55359 0 4)返回“145.3099"
Command:(angtos 1.5708 0 4)返回“90.0000"
Command:(angtos -1.5708 0 2)返回“270.00"
注意 在(angtos angle[mode[precision]])中:
angle是以弧度表示的角度值。
mode是与AutoCAD系统变量AUNITS相对应的angtos模式。
AutoCAD中可用模式如下:
ANGTOS模式 编辑格式
0 十进制角度
1 度/分/秒
2 梯度
3 弧度
4 测量单位
precision是一个整数,用于控制小数的位数,与AutoCAD系统变量AUPREC相对应。 其最小值为0,最大值为4。
在上面的第一个例子中,angle为0.588003弧度,mode为0(十进制角度),precision为4(小数点后有四位)。函数返回33.6901。
表达式编辑
在程序中,通常都需要测试某些特定的条件。若条件为真,程序执行某些功能,若不为真,执行另外一些功能。例如,条件表达式(if( X 5)),若变量x的值小于5,测试结果为真。编程过程中经常要用到这种类型的测试条件。本节讨论在AutoLISP编程中要用到的各种关系表达式。
等于
格式(= atom1 atom2…)
该函数(=)检查两个元素是否相等。若相等,条件为真,函数返回T。同样,若指定的元素不相等,条件为假,函数返回nil。
示例:
(= 5 5)返回T
(= 5 49)返回nil
(= 5.5 5.5 5.5)返回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
(= 2.0 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
8.acad_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)
9.acad-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 系统变量跟踪图形的修改状态和触发保存图形请求。
该函数在 acapp.arx 中实现,acapp.arx 默认状态下是加载的。该函数可将 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 1.0 2.0 0.0) (11 2.0 1.0 0.0) (210 0.0 0.0 1.0)))(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中的全部命令;
具备一般高级语言的基本结构和功能;
具有强大的图形处理功能。
功能编辑
1.AutoLISP语言是在普通的LISP语言基础上,扩充了许多适用于CAD应用的特殊功能而形成的,一种仅能以解释方式运行于AutoCAD内部的解释性程序设计语言。
2.AutoLISP语言中的一切成分都是以函数的形式给出的,它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数,再调用其他函数。
3.AutoLISP把数据和程序统一表达为表结构,即S-表达式处理,故也可把程序当作数据来处理,也可把数据当作程序来执行。
4.AutoLISP语言中的程序运行过程就是对函数求值过程,是在对函数求值过程中实现函数功能。
5.AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂。
主要工具编辑
文本编辑器、格式编排器、语法检查器、源代码调试器、检验和监视工具、文件编译器、工程程序系统、上下文相关帮助与自动匹配功能和智能化控制平台。
autolisp 组码后面的值怎么引用变量?
ssget语句的格式不对。
格式:(ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])
sel-method 字符串,指定对象选择方法。
filter-list 关联表,指定对象的特性。
例:
创建一个选择集,该选择集由 pt_list 所定义的多边形包含的所有蓝色线段组成:
命令: (ssget "_WP" pt_list '((0 .
"LINE") (62 . 5)))
Selection set: 8
autolisp 错误: DXF 组不正确:
组码40和62需要的都是数字,dcl读取出来的都是字符串,只要将这些字符串转换成数字就可以了,可以用函数atof和atoi转换。
请求帮忙用autolisp或者vlisp写一句代码
(defun c:QS (/ DICEN)
(setq DICEN (namedobjdict))
(if (dictsearch DICEN "AcadDim")
(dictremove DICEN "AcadDim")
)
(dictadd DICEN
"AcadDim"
(entmakex '((0 . "XRECORD")
(100 . "AcDbXrecord")
(280 . 1)
(90 . 990106)
(3 . "");;-----引线和箭头-〉箭头[用户箭头的缺省块名,""则表示未设置]
(60 . 2);;-----注释-〉注释类型[0,1,2,3,4]
(61 . 0);;-----注释-〉重复使用注释[0,1,2]
(62 . 1);;-----附着-〉文字在右边[0,1,2,3,4]
(63 . 1);;-----附着-〉文字在左边[0,1,2,3,4]
(64 . 0);;-----附着-〉最后一行加下划线[0,1]
(65 . 0);;-----引线和箭头-〉引线[0,1]
(66 . 0);;-----引线和箭头-〉点数-〉无限制[0,1]
(67 . 3);;-----引线和箭头-〉点数[任意正整数]
(68 . 1);;-----注释-〉多行文字选项-〉提示输入宽度[0,1]
(69 . 0);;-----注释-〉多行文字选项-〉始终左对齐[0,1]
(70 . 0);;-----引线和箭头-〉角度约束-第一段[0,1,2,3,4,5]
(71 . 0);;-----引线和箭头-〉角度约束-第二段[0,1,2,3,4,5]
(72 . 0);;-----注释-〉多行文字选项-〉文字边框[0,1]
(40 . 0.0)
(170 . 2);;----控制“引线设置”对话框的缺省选项卡[0,1,2]
;; (340 . 图元名)
;;-----当DXF组码60的值为3,且已经设定了块参照的块名,则340组码才会出现
;;-----格式为(340 . 上次使用块参照作为注释对象,实际插入的块实例的图元名)
)
)
)
(command "Qleader")
)
设置一次之后,以后使用Qleader都不用再设置了。你也可以每次都使用QS命令。
求此AUTOlisp代码的错误之处...
服了你了。
1、VISUAL lisp有调试器,单步跟踪、设置断点、变量监视,很容易找到错误。
2、如果提问的话,把错误提示信息贴上来,这样大家少浪费点时间!!!
跪求快速绘制一个图形的autolisp的源代码
(defun C:tes ( / dis1 dis2 dis3 p1 p2 p3 p4 p5 p6 p7 p8 ss1 tc1 tc2 x)
(if (and (setq tc1 (entsel "\n请选择中心线参考图层"))
(setq tc2 (entsel "\n请选择圆的参考图层"))
(setq p1 (getpoint "\n请输入第一点"))
( (setq dis1 (getdist p1 "\n请输入长度")) 4)
( (setq dis2 (getdist p1 "\n请输入高度")) 4)
( (setq dis3 (getdist p1 "\n请输入圆半径")) 0)
)
(progn
(setq ss1 '() tc1 (assoc 8 (entget (car tc1))) tc2 (assoc 8 (entget (car tc2))))
(setq p2 (polar p1 0 2) ss1 (cons p2 ss1) p2 (polar p2 0 (- dis1 4)) ss1 (cons p2 ss1)
p2 (polar p2 (* pi 0.25) (* 2 (expt 2 0.5))) ss1 (cons p2 ss1)
p2 (polar p2 (* pi 0.5) (- dis2 4)) ss1 (cons p2 ss1)
p2 (polar p2 (* pi 0.75) (* 2 (expt 2 0.5))) ss1 (cons p2 ss1)
p2 (polar p2 pi (- dis1 4)) ss1 (cons p2 ss1)
p2 (polar p1 (* pi 0.5) (- dis2 2)) ss1 (cons p2 ss1)
p2 (polar p1 (* pi 0.5) 2) ss1 (cons p2 ss1);多段线点集合
p2 (polar p1 0 (* dis1 0.25)) p2 (polar p2 (* pi 0.5) (* dis2 0.5));圆心1
p1 (polar p2 0 (* dis1 0.5));圆心2
p3 (polar p2 pi (* dis1 0.5)) p4 (polar p1 0 (* dis1 0.5));中心线
p5 (polar p2 (* pi 0.5) (* dis2 0.75)) p6 (polar p2 (* pi 1.5) (* dis2 0.75))
p7 (polar p5 0 (* dis1 0.5)) p8 (polar p6 0 (* dis1 0.5))
)
(entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length ss1)) '(70 . 1)) (mapcar '(lambda (x)(cons 10 x)) ss1 )));多段线绘制
(entmake (list '(0 . "CIRCLE") tc2 (cons 10 p2) (cons 40 dis3)));圆绘制
(entmake (list '(0 . "CIRCLE") tc2 (cons 10 p1) (cons 40 dis3)))
(entmake (list '(0 . "LINE") tc1 (cons 10 p3) (cons 11 p4)));直线绘制
(entmake (list '(0 . "LINE") tc1 (cons 10 p5) (cons 11 p6)))
(entmake (list '(0 . "LINE") tc1 (cons 10 p7) (cons 11 p8)))
)
)
(prin1)
);复制到记事本,以【.lsp】为后缀命名,autolisp加载后,命令为【TES】
;1.没有明确给出中心线图层;2.没有给出圆图层;3.没有给出圆半径