AutoLISP初学者参考程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;;;此程序注释详细,过程简单易懂,适合初学者用来熟悉AutoLISP编程语言
;;;下载后按下述方法即可直接运行
;;;使用方法如下:
;;;1.下载文件后,用记事本打开,点击“文件”->“另存为”
;;; 在“保存类型”中选择“所有文件”
;;; 在“文件名”中输入:xxx.lsp,点击保存
;;;2.打开AutoCAD,点击“工具”->“AutoLISP”->“加载应用程序”
;;; 选择xxx.lsp,点击“加载”后再点“关闭”
;;; 注意:请在CAD环境下打开线宽,关闭对象捕捉!!!
;;;3.在命令栏输入“go”,再输入“ft”,即可执行程序。
;;; 提示:程序结束后若没看到曲线,则输入“zoom”->“a”缩放窗口即可
;;;【以上为说明,从下文第二行开始为程序主体】
;;;
;;;#初始化#
;;;
(defun C:Go ()
;;;#定义全局变量#
(setq Data nil;;;;;;;全局变量Data,用来保存程序中要使用的数据
Data_sin nil;;;全局变量data_sin,用来保存正弦曲线绘制函数每一步长计算的y坐标值
Data_cos nil;;;全局变量data_cos,用来保存余弦曲线绘制函数每一步长计算的y坐标值
dt (* 0.1 PI);;全局变量dt,用来保存简谐函数自变量的增量值
oce (getvar "cmdecho");;;保存系统变量的原值
)
;;;
;;;改变系统变量,控制程序执行过程中不显示中间过程
;;;
(setvar "cmdecho" 0)
;;;
(princ "\n初始化...\n")
;;;
;;;改变线宽
;;;
(command "layer" "LW" "0.35" "0" "")
;;;
(princ "\n初始化完成!")
(princ "\n输入[Ft]执行程序:\n")
(command)
);;;End defun
;;;
;;;#主函数#
;;;目标方程式:
;;;F(t)=[A1*sin(w1*t)+B1] + [A2*sin(w2*t)+B2] +[A2*cos(w3*t)+B1]...... [t1,t2]
;;;由n个简谐函数(sin或cos)叠加而成。
;;;
;;;该自定义函数定义一个命令:Ft
;;;实现绘制每个简谐函数的波形以及F(t)的波形
;;;
(defun C:Ft (/ Q t1 t2 n r s A w B data_f col)
(setq Q 1 r 0 s 0 col 1 Data_f '())
(while (= Q 1)
(setq t1 (getreal "请输入F(t)的左区间t1:")
t2 (getreal "请输入F(t)的右区间t2:")
)
(princ "\n您输入的区间为[")(princ t1)(princ "π,")(princ t2)(princ "π]\n");;;显示输入区间[t1,t2]
(setq Q (getint "1.修改 2.确认:"))
);;;End while
(setq n (getint "请输入简谐函数个数:"))
(Data_in n);;;调用数据录入函数Data_in
(Data_fix n);;;调用数据修函数Data_fix
(repeat n
(repeat 4
(cond ((= s 0) (setq Q (nth s (nth r Data))))
((= s 1) (setq A (nth s (nth r Data))))
((= s 2) (setq w (nth s (nth r Data))))
((= s 3) (setq B (nth s (nth r Data))))
);;;End cond
(setq s (1+ s))
);;;End repeat 4
(command "color" col)
(cond ((= Q 1) (sin_curve A w B t1 t2);;;调用正弦曲线绘
制函数
(progn
(setq Data_f (cons Data_sin data_f))
)
)
((= Q 2) (cos_curve A w B t1 t2);;;
调用余弦曲线绘制函数
(progn
(setq Data_f (cons Data_cos data_f))
)
)
);;;End cond
(setq r (1+ r) s 0 col (1+ col))
);;;End repeat n
(setq Data_f (reverse Data_f))
(Ft_curve t1 t2)
(command)
(End)
);;;End defun
;;;
;;;#数据录入#
;;;保存每个简谐函数相关参数
;;;
(defun Data_In (n / i j u v Data_i Data_j )
(setq Data nil i n j 4 u 1 v 1
Data_i '() Data_j '();;;创建空表,用来保存录入数据
)
(repeat i
(princ "\n执行输入第")(princ u)(princ "个简谐函数参数\n")
(repeat j
(cond ((= v 1) (setq Data_j (cons (getint "请选择简谐函数<1>sin;<2>cos:") Data_j)))
((= v 2) (setq Data_j (cons (getreal "请输入参数<A>的值:") Data_j)))
((= v 3) (setq Data_j (cons (getreal "请输入参数<w>的值:") Data_j)))
((= v 4) (setq Data_j (cons (getreal "请输入参数<B>的值:") Data_j)))
);;;End cond
(setq v (1+ v))
);;;End repeat j
(setq Data_i (cons (reverse Data_j) Data_i);;;将数据表Data_j转存入数据表Data_i
u (1+ u) v 1
Data_j '();;;将Data_j置空,以备录入下一组数据
)
);;;End repeat i
(setq data (reverse Data_i));;;将数据表Data_i转存入
);;;End defun
;;;
;;;#数据修改#
;;;修改录入的数据
;;;
(defun Data_fix (n / QR i j k)
(setq QR 1)
(while (= QR 1)
(setq i 0 j 0 k 1)
(princ "\n您输入的")(princ n)(princ "个简谐函数的参数为:\n")
(repeat 4
(princ " ")(princ k)
(setq k (1+ k))
);;;End repeat 4
(repeat n
(print (+ i 1))
(repeat 4
(princ " ")(princ (nth j (nth i Data)))
(setq j (1+ j))
);;;End repeat 4
(setq i (1+ i) j 0)
);;;End repeat n
(princ "\n")
(setq QR (getint "是否修改数据 1.是 2.否:"))
(cond ((= QR 1)
(fixer n)
)
((= QR 2)
(princ "\n数据核对完毕,程序继续运行")
)
);;;End cond
);;;End while
);;;End defun
;;;
;;;#fixer#
;;;#数据修正#
;;;实现数据修改的核心
;;;
(defun fixer (n / y x e f g Datemp_old Datemp_new Datemp_f Datemp_b)
(setq y (getint "请输入需要修改的数据的行号")
x (getint "请输入需要修改的数据的列号")
)
(setq e 0 f y g 0
Datemp_old nil Datemp_new '() Datemp_f '() Datemp_b '();;;创建空表,暂时保存数据
)
(repeat (- y 1)
(setq Datemp_f (cons (nth e Data) Datemp_f);;;将包含待修改数据的表之前的所有表存入缓存表Datemp_f
e (1+ e)
)
);;;End repeat
(setq Datemp_old (nth (- y 1) Data));;;将包含待修改数据的表存入缓存表Datemp_old等待修改
(repeat (- n y)
(setq Datemp_b (cons (nth f Data) Datemp_b);;;将包含待修改数据的表之后的所有表存入缓存表Datemp_b
f (1+ f)
)
);;;End repeat
(repeat 4
(if (= g (- x 1))
(setq Datemp_new (cons (getreal "请输
入新值:") Datemp_new));;;将修改后的数据存入缓存表Datemp_new
(setq Datemp_new (cons (nth g Datemp_old) Datemp_new));;;将包含待修改数据的表中的其它数据存入Datemp_new
);;;End if
(setq g (1+ g))
);;;End repeat 4
(setq Datemp_new (reverse Datemp_new));;;数据已被替换,等待将所有缓存表内的内容重新装入Data
;;;;;;;进行将所有缓存表内的内容重新装入Data
(setq e 0 f 0 g 0
Data '();;;置空Data,以便重新存入缓存表内的数据
)
(repeat (- n y)
(setq Data (cons (nth e Datemp_b) Data);;;将缓存表Datemp_b的数据存入Data
e (1+ e)
)
);;;End repeat
(setq Data (cons Datemp_new Data));;;将缓存表Datemp_new的数据存入Data
(repeat (- y 1)
(setq Data (cons (nth f Datemp_f) Data);;;将缓存表Datemp_f的数据存入Data
f (1+ f)
)
);;;End repeat
);;;End defun
;;;
;;;#正弦曲线绘制#
;;;此函数完成绘制 F'(t)=Ain(w*t)+B 函数曲线“t”的定义域[t1,t2]
;;;sin函数内,将A w B表示为:A w B
;;;为避免与AutoLISP内建常量 “T” 同名,用 “tc”代替“t”。
;;;
(defun sin_curve (A w B t1 t2 / tc fs t1s t2s)
(setq t1s (* t1 PI) tc t1s t2s (* t2 PI)
data_sin '();;;创建空表,以备函数计算结果存入
)
(command "pline")
(while (<= tc t2s)
(setq fs (+ B (* A (sin (* w tc))))
Data_sin (cons fs Data_sin);;;将函数计算结果存入表中,以备其它函数使用用
)
(command (list tc fs))
(setq tc (+ tc dt))
);;;End while
(if (/= tc t2s) (command (list t2s (+ B (* A (sin (* w t2s))))))
(progn
(cons (+ B (* A (sin (* w t2s)))) Data_sin)
)
);;;End if
(setq Data_sin (reverse Data_sin))
(command)
);;;End defun
;;;
;;;#余弦曲线绘制#
;;;此函数完成绘制 F'(t)=Aos(w*t)+B 函数曲线“t”的定义域[t1,t2]
;;;为避免与AutoLISP内建常量 “T” 同名,用 “tc”代替“t”。
;;;
(defun cos_curve (A w B t1 t2 / tc fc t1c t2c)
(setq t1c (* t1 PI) tc t1c t2c (* t2 PI)
data_cos '();;;创建空表,以备函数计算结果存入
)
(command "pline")
(while (<= tc t2c)
(setq fc (+ B (* A (cos (* w tc))))
Data_cos (cons fc Data_cos);;;将函数计算结果存入表中,以备其它函数使用用
)
(command (list tc fc))
(setq tc (+ tc dt))
);;;End while
(if (/= tc t2c) (command (list t2c (+ B (* A (cos (* w t2c))))))
(progn
(cons (+ B (* A (cos (* w t2c)))) Data_cos)
)
);;;End if
(setq Data_cos (reverse Data_cos))
(command)
);;;End defun
;;;
;;;#F(t)函数曲线绘制#
;;;绘制n个简谐函数的叠加曲线
;;;
(defun Ft_curve (t1 t2 / f o p tc t1f t2f)
(setq o 0 p 0 col 250
t1f (* t1 PI) tc t1f t2f (* t2 PI)
)
(command "color" col)
(command "pline")
(while (<= tc t2f)
(setq f 0)
(repeat n
(setq f (
+ f (nth p (nth o Data_f)))
o (1+ o)
)
);;;End repeat
(command (list tc f))
(setq tc (+ tc dt)
p (1+ p) o 0
)
);;;End while
(command)
);;;End defun
;;;
;;;#程序结束#
;;;恢复系统变量
;;;
(defun End ()
;;;
;;;清除全局变量
;;;
(setq data nil
data_sin nil
data_cos nil
dt nil
);;;End
(princ "\n程序运行结束\n")
;;;
;;;还原系统变量"cmdevho"
;;;
(setvar "cmdecho" oce)
(setq oce nil)
;;;
);;;End defun
;;;
;;;程序结束