如何使用AutoLISP语言例程

如何使用AutoLISP语言例程,第1张

AutoLISP语言是AutoCAD的内置的编程语言。 它可以用来创建新的命令或重新定义现有的。AutoLISP语言是一个非常强大的定制工具。本文旨在说明如何加载AutoLISP语言。

你可以复制和粘贴,如下面的例子,或者你可以下载一个*.LSP的文件。开始你需要使用记事本,  因为AutoLISP *.LSP的文件只是普通的文本文件。看其他人的编写的AutoLISP语言代码是一个很好的学习方法,网上有很多提供.LSP的文件下载的。

基本过程是非常简单,如下。 有3个主要步骤(或如果有*.LSP的文件仅仅需要2步),创建lisp文件,加载lisp文件和日常运行lisp程序。

注:AutoLISP语言例程将只在完整版本的AutoCAD运行,他们不会在AutoCAD LT版本运行。

创建lisp文件

复制程序代码并粘贴到Windows中的记事本。

(defun c:zone ( / ss la rv i tv op en)

(while (not ss)

(princ "\nPick any object on the required layer: ")

(setq ss (ssget)))

(initget "Length Area")

(setq rv (getkword "\nWould you like to measure Length/Area <Area>: "))

(and (not rv)

(setq rv "Area"))

(setq la (cdr (assoc 8 (entget (ssname ss 0))))

ss (ssget "X" (list (cons 0 "*POLYLINE")

(cons 8 la)))

i (sslength ss)

tv 0

op 0)

(while (not (minusp (setq i (1- i))))

(setq en (ssname ss i))

(command "_.AREA" "_E" en)

(cond ((= rv "Length")

(setq tv (+ tv (getvar "PERIMETER"))))

(T

(setq tv (+ tv (getvar "AREA")))

(if (/= (logand (cdr (assoc 70 (entget en))) 1) 1)

(setq op (1+ op))))))

(princ (strcat "\nTotal " rv

" for layer " la

" = " (rtos tv 2 2)

" in " (itoa (sslength ss)) " polylines\n"

(if (/= rv "Length")

(strcat (itoa op) " with open polylines") "")))

(prin1))

现在保存文件为zone.lsp,给予它适当的文件名,并确保它有一个.LSP的文件扩展名。

加载lisp文件

打开AutoCAD选择菜单Tools——AutoLISP——Load Application….d出对话框(如下图所示):

load unload apps

使用下面的 *** 作来加载已保存lisp文件:

找到该lisp文件已保存的文件夹。

从列表中选择所需的文件。

单击 Load按钮。如果一切顺利,将出现一条消息说“*.lsp成功载入”。

单击Close按钮关闭对话方块。

运行AutoLISP程序

一旦lisp文件被加载,它可以在命令行运行。在运行时只需输入命令的名称(而不是文件名)。在lisp文件中开始是 (defun c:zone ,所以在命令行输入zone。

计算某直线外一点到直线的最短距离,即为垂线,不判断垂足点是否在直线上

设定命令为mm

(defun c:mm()

(setvar "cmdecho" 0)

(setq pt1 (getpoint "第1点"))

(setq pt2 (getpoint "第2点"))

(setq pt3 (getpoint "第3点"))

(command "line" pt1 pt2 "")

(command "point" pt3 "")

不判断pt1、2、3是否共线,

方法一:

pt4x,pt4y点的确定

分别获取pt1、2、3的坐标值

(setq pt1x (car pt1))

(setq pt1y (cadr pt1))

(setq pt2x (car pt2))

(setq pt2y (cadr pt2))

(setq pt3x (car pt3))

(setq pt3y (cadr pt3))

计算方法:

pt4与pt1 pt2 共线

(pt4x-pt1x)/(pt4y-pt1y)=(pt2x-pt1x)/(pt2y-pt1y)

pt4 pt3的斜率与pt1 pt2的斜率乘积为1

(pt4x-pt3x)/(pt4y-pt3y)*(pt2x-pt1x)/(pt2y-pt1y)=-1

自行解方程计算出pt4x、y的表达式

计算pt3到直线pt1 pt2的最短距离

(setvar dist (sqrt( (pt4x-pt3x)*(pt4x-pt3x)+(pt4y-pt3y)*(pt4y-pt3y) ) ) )

方法二:

使用getdist函数,不计算具体的垂足点的坐标

开启对象捕捉仅为垂足点

(setq dist (getdist pt3 (“选择垂足点”)))

(princ)

)

AutoLISP语言是在普通的LISP语言基础上,又扩充了许多适用于CAD应用的功能而形成的一种程序设计语言。它是一种解释性求值语言,速度较慢,难以保密,可用任何文字编辑软件编辑,用纯文本的格式保存。例如:

(setq

i

1)就是代码i值是1

(command

"CIRCLE"

'(0

0)

100)命令在坐标原点绘制半径100的圆。

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

(setq

pt1

(getpoint

"\n请选择圆心插入点"))

(command

"CIRCLE"

pt1

100)命令这个插入点绘制圆,半径为100

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

例如:一条直线,起点坐标'(0

0),端点坐标'(1000

0),图层为0层,颜色为1【红色】这个是一条直线的一些数据,怎么执行变为程序代码如下:

(entmake

(list

'(0

.

"LINE")

'(8

.

"0")

'(62

.

1)

'(10

0

0)

'(11

1000

0)))

以上可以直观的看数据,也可以粘贴到AutoCAD的命令行,就绘制出以上要求的直线。

AutoLISP语言中程序运行过程就是对函数求值的过程,是在对函数求值的过程中实现函数的功能。在AutoCAD里面,所有的对象可以看成是由无数的点构成,每个点都有自己的坐标,函数的运行就是计算出这些点的数值,根据得到的数值进行判断。

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

(setq

&k1

(entsel))选择对象

(setq

&k1

(car

&k1))提取图元

(setq

#g1

(entget

&k1))取得属性列表

(setq

c0

(cdr

(assoc

0

#g1)))取得图元名称

以上是一个个的写下来,可以写成以下:

(setq

c0

(cdr

(assoc

0

(entget

(car

(entsel))))))简单易懂

由于autolisp简单,容易,所以上手很快。编写程序后,可以大大的提高绘图效率,有名的【天正】插件,就是绘图的好帮手。

autolisp程序也有不足的地方,如提取坐标,这个只能在图元属性里面提取,这样的话会有局限性,法向坐标1与-1的坐标值相同,但是图形的位置不同,造成计算坐标的困难,所以提取坐标值,最好使用VLAX函数来提取。


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

原文地址: http://outofmemory.cn/yw/11089669.html

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

发表评论

登录后才能评论

评论列表(0条)

保存