AutoCAD Autolisp语言

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Command :(load “plus32”)
Plus32
5 加载程序用load函数 (load 文件名[失败时的返回值]) 文件名是一个字符串参数,指定要加载的文件名,可以 包括磁盘符号和目录路径,目录分隔号可以用正斜线“/” 或者双反斜线“\\”表示,扩展名“.lsp”可写可不写。 例如(load “d:\\lisp\\plus32”)
首要应掌握的简单基本函数
(+ <数> <数>…) (- <数> <数>…) (* <数> <数>…) (/ <数1> <数2> … ) (1+ <数>) (1- <数>) (abs <数>) (sin <角度>) (cos <角度>)
(= <原子><原子>…) (/= <原子> <原子>…)
(< <原子><原子>…) (> <原子><原子>…)
(open<文件名><方式>) (close<文件描述符>)
建立第一个LISP程序
(defun c:plus32(/ ans) (setq ans (+ 3 2)))
加载与执行
自定义的函数调用与系统函数调用一样,通过一个标 准表调用,第一个元素为用户自定义的函数名,其余 为实参。其格式如下:
(函数名 <实参1> <实参2> <实参3>…) 函数定义与调用时应注意的问题: 实参与形参在数量、类型和顺序上必须完全一致。 用defun定义的函数名不能与先前定义的函数名同名 ,特别不能与系统函数同名,否则将使原定义的函数 或系统内部函数失效。 在defun的定义中不允许再出现defun,即defun不能嵌 套,所有defun定义的函数在结构上是并行的。 允许函数定义中对函数本身调用,即允许递归调用。
"circle" pt_cen r);command (princ) );defun
(defun c:r5() (setvar "cmdecho" 0) (setvar "osmode" 0) (setq pc (getpoint "\n输入图形 中心: ") ra (getdist "\n输入大圆半径: ") rd (* pi -0.5) coun 1) ;;程序主体 (command "circle" pc ra) (r5b pc ra coun rd) (command "circle" pc rm ) ;;恢复环境 (setvar "cmdecho" 1) (setvar "osmode" 4337) (princ) );结束defun
(strcase <字符串><模式>) (strlen <字符串>)
(polar<点><角度><距离>) (angle<点1><点2>)
(osnap <点> <方式>
(while<条件> [<标准表>…])
(repeat<数><表达式>)
(if<条件><表达式1><表达式2>) (cond(<条件1><表达式1>)
编写AutoLISP程序时,应添加必要的注 释,以说明程序的功能、编写时间、作者 、某些程序代码的具体含义等信息,这些 信息将有助于程序的编写与修改。
规则3:“前缀表示法”。
AutoLISP语言的结构与常用高级结构有所区 别。像BASIC、PASCAL、C等语言均采用“ 中缀表示法”。当给变量a赋值12.0时,通常为 下面的形式:a=12.0; 即赋值运算符“=”位于 中间
(/ pi 2) (/ width 2.0));polar );setq
(setq str(strcat "圆的半径过大,应小于" (rtos (/ width 2) 2 2)));setq
(while (>= r (/ width 2)) (alert str) (setq r (getreal "\n请输入圆的半径:")) );while (command "line" pt_base pt1 pt2 pt3 "close"
(load “d:/lisp/plus32”)
一个lisp程序内可以定义多个函数 (defun c:plus32(/ ans)
(setq ans (+ 3 2))) (defun c:sub32(/ ans)
(setq ans (- 3 2))) (defun c:multi32(/ ans)
(setq ans (* 3 2))) (defun c:div32(/ ans)
例:绘制下图的长方形和圆。已知长方 形的长和宽,圆的半径。要求圆在长方 形内。
分析:绘制该图首先应有一个绘图基点 pt_base。长方形的绘制可用line、pline和 rectang命令绘制。
程序设计小技巧:将问题分散解决,逐 步完善程序的功能。
本例中先编制绘制长方形和圆,将“要 求圆在长方形内”条件及中心线绘制一个 一个地解决,将问题分散解决。
… (<条件n><表达式n>))
(car<表>) (cdr<表>) (last<表>) (nth<n><表>) (list<表达式>…)
(getint<提示>) (getreal<提示>) (getstring<提示>) (getpoint<提示>)
(getcorner<点><提示>) (getangle<提示>)
(setq r 50)
;;; 得到半径
(command “circle” pt r) ;;; 绘制圆
)
关闭和显示CAD提示
(defun c:mycircle() (setq oce (getvar “cmdecho”));保存旧的CMDECHO值 (setvar “cmdecho” 0);关掉命令响应 (setq mycen (getpoint “\n输入圆心位置:”) Myrad(getreal “\输入半径:”)) (command “circle” mycen myrad) (setvar “cmdecho” oce);恢复旧的CMDECHO值 (princ) ) 如果cmdecho的值为1,则cad的会显示命令提示
(and<表达式>…) (or<表达式>…) (not<项>)
(itoa <整型数>) (atoi <字符串>)
(atof <字符串>) (fix <数>) (float<数>)
(itoa <整型数>) (atoi <字符串>)
(atof <字符串>) (fix <数>) (float<数>)
(strcat <字符串1> <字符串2>…) (substr <字符串><开始><长度>)
AutoLISP语法规则
规则1:以括号组成表达式,左右括号“( ”&“)”一定要配对。
表达式是AutoLISP的基本语句,所有表 达式都具有以下形式:
(函数 [参数表]) 即由一个函数名和调用这个函数所需的 参数表组成。参数表中的参数也可以是表 达式,即AutoLISP的表达式可以嵌套。
规则2:注释以分号“;”开头,它可以单 独位于一行,也可以位于某一程序语句的 后面。
局部Biblioteka Baidu量
如果不想计算结果保留下来,可以申明 局部变量 (defun x3(x/yy) (setq yy (* x x x)) ) 执行之后会出现yy这个全局变量,一直 存在于内存之中。可以用!yy查询
自定义一个绘制圆的函数
(defun c:My-circle()
(setq pt (list 100 100)) ;;; 得到圆心坐标
(defun c:cr1(/ pt_base len width r pt1 pt2 pt3 pt_cen)
(setq pt_base (getpoint "\n 请输入绘图基点:")
len(getdist ":\n 请输入 长方形的长度")
width(getdist ":\n请输入 长方形的宽度")
(/ pi 2)
(/ width 2.0));polar
);setq
(command "line" pt_base pt1 pt2 pt3 "close"
"circle" pt_cen r);command
(princ)
);defun
程序设计的核心是算法设计,算法的特 性之一是:健壮性,即程序的容错处理 技术。
r(getreal "请输入圆的半 径")
);setq
(setq pt1(polar pt_base 0 len)
pt2(polar pt1 (/ pi 2) width)
pt3(polar pt_base (/ pi 2) width)
pt_cen(polar (polar pt_base 0 (/ len 2.0))
(setq ans (/ 3 2)) )
建立一个小程序用于计算平方 X2.lsp (defun x2(x)
(* x x) ) X是一个参数
全局变量
如果想要计算结果保留下来,可以将上 面这个程序改一下 (defun x2(x) (setq yy (* x x)) ) 执行之后会出现yy这个全局变量,一直 存在于内存之中。可以用!yy查询
AutoLISP则采用,即把运算符放在参数表的 第一个元素的位置,后面为其参数。 例如,通 常用到的表达式X=(A+B)×C在AutoLISP中表 示为:(setq X (* (+ A B) C))
规则4:运算顺序“由内而外、由左而右 ”
在AutoLISP表达式中,函数参数表对表 达式的执行过程是从最内层表开始逐步到 最外层表,每个表达式都会返回一个值, 该值可以被变量或外层表达式引用。如果 没被引用,返回值会显示在AutoCAD的命 令窗口。
从文件内读取计算结果,并在AutoCAD 绘图窗口绘制出正弦函数曲线。
EX 绘制一个正弦函数图像
((setq fp (open "d:/lisp/data.txt" “w") x 0) (while (<= x (* 6 pi)) ( princ (* x 100) fp) (setq y (* 100 (sin x))) (princ "," fp) (princ y fp) (princ “\n“ fp) (setq x (+ x (/ (* 6 pi )100)))) (setq fp (open "d:/lisp/data.txt" "r")) (setq pt_old (read-line fp)) (while (setq pt_new(read-line fp)) (command "line" pt_old pt_new "") (setq pt_old pt_new))
AutoLISP语言
程序代码 \\ \″ \e \n \r \t
字符代码表
功能 \ ″
Esc 换行 回车
TAB(制表位)
用ASCII码表示 \114 \042 \033 \012 \015 \011
综合练习文件的读取、变量的赋值、循 环、Command……
通过计算将0~6pi的区间等分为100份,将 对应的正弦函数值写入一个指定的文件
运行出错时显示如下
(defun c:cr1(/ pt_base len width r pt1 pt2 pt3 pt_cen) (setq pt_base (getpoint "\n请输入绘图基点:")
len(getdist ":\n 请输入长方形的长度") width(getdist ":\n请输入长方形的宽度") r(getreal "请输入圆的半径") );setq (setq pt1(polar pt_base 0 len) pt2(polar pt1 (/ pi 2) width) pt3(polar pt_base (/ pi 2) width) pt_cen(polar (polar pt_base 0 (/ len 2.0))
规则5:程序书写格式十分灵活。
在AutoLISP程序中,最简单的程序可以是只 有一个表达式的程序。一个表达工可以分写在多 行,也可以将多个表达式合写在一行。
在AutoLISP程序中,除注释外,其他所有成 分均以表达式的形式给出,而各表达式一般通过 调用函数来执行。所以,执行AutoLISP程序就 是执行一些函数,再调用其他函数,而 AutoLISP程序的运行过程就是对函数求值的过 程。
(defun r5b(pc ra coun rd) (setq p1 (polar pc (* pi 1.0) ra) p2 (polar pc (* pi 0.6) ra) p3 (polar pc (* pi 0.2) ra) p4 (polar pc (* pi 1.8) ra) p5 (polar pc (* pi 1.4) ra)) (command "pline" p1 p2 p3 p4 p5 "c") (command "rotate" "last" "" pc rd) (setq coun (1+ coun) ) (if (<= coun 4) (progn (setq ra (* ra ( / (sin(* pi 0.3)) (sin(* pi 0.6))))) (setq rd (- rd (* pi 0.5))) (setq rm ra) (r5b pc ra coun rd) );结束progn函数 );结束if函数 (setq rm (* rm (cos(* pi 0.1)))) );结束defun
相关文档
最新文档