广告投放

AutoLISP从入门到精通初级教程(新手必备)

seo靠我 2023-09-11 13:45:45

单元五:轻松快速的掌握AutoLISP设计技巧

一、AutoLISP 程序设计的四个步骤:

1.第一步骤:产生写程序的动机、预期目标

2.第二步骤:构思程序流程、所需之LISP功能函数、相关变量订定&提示讯息 3.第三步骤:利用文书软件 (如记事本) 撰写xxx.lsp程序

4.第四步骤:回到AutoCAD下,加载AutoLISP程序以 (load\主檔名\或 (load \主檔名\5.第五步骤:执行新的 AutoLISP 指令 二、透过简单范例全程演练AutoLISP: 1.第一步骤:动机、预期目标

2.第二步骤:构思程序相关变量订定 定出程序名为 pbox.lsp

构思程序流程、相关变量:变量名称可自行设定(如 pa、ww、hh、pb、pc、pd、mp1、mp2、mp3、mp4),掌握三个原则: *不可重复

*好记不会混淆

*适时的以分号『;』加上批注 (defun c:pbox()

;以下 pa、ww、hh 值须由使用者输入 (setq pa (请求输入左下角点))

(setq ww (请求输入矩形宽度实数值)) (setq hh (请求输入矩形高度实数值))

;以下pb、pc、pd值须由程序依据pa、ww、hh求出 (setq pb (依据相对极坐标法求出pb点坐标值)) (setq pc (依据相对极坐标法求出pc点坐标值)) (setq pd (依据相对极坐标法求出pd点坐标值)) ;以下依据 pa、pb、pc、pd 点画矩形 (以pline指令画出矩形)

;以下mp1、mp2、mp3、mp4值须由程序依据pa、ww、hh ;& pb、pc、pd 值求出

(setq mp1 (求出 mp1 点坐标值)) (setq mp3 (求出 mp3 点坐标值)) (setq mp2 (求出 mp2 点坐标值)) (setq mp4 (求出 mp4 点坐标值))

;以下依据 mp1、mp2、mp3、mp4 点画出二条线 (以 line 指令画出 mp1 到 mp3 的线) (以 line 指令画出 mp2 到 mp4 的线) )

本程序所需的 AutoLISP功能函数及其用法 (getpoint [基点] [提示]) <-- 请求输入一个点坐标 (getreal [提示]) <-- 请求输入一实数

(polar 基点 弧度 距离) <-- 依极坐标法取得另一坐标点 其中『弪度值』之转换为:

十进制角度 弪度值 十进制转弪度公式 0度 0 0

90度 1/2π (/ pi 2) 或 (* pi 0.5) 180度 π pi

270度 2/3π (* pi 1.5) N度 π*N/180 (* pi (/ n 180))

(command \指令\呼叫执行 AutoCAD 指令 注意: 指令及其副选项皆要用双引号处理

假设 pa、pb、pc、pd 皆为变量,其值为点坐标 正确: (command \错误: (command pline pa pb pc pd c)

原因: 指令 pline 及其副选项 c 皆没用双引号括住 错误: (command \

原因: 副选项c (代表 close) 没用双引号括住,会被误认为是 AutoLISP的变量名,但事实又没有 c 这个变数 错误:(command \原因:变数 pa、pb、pc、pd 不须用双引号括住

注意:副选项中,若使用 \连续二个双引号,代表按 [ENTER] 键 若想画一条 pa 到 pc 的 LINE & 一条 pb 到 pd 的 LINE 正确: (command \(command \

错误: (command \(command \

其它相关接近的功能函数...

(getdist [基点] [提示])?请求输入一段距离 (getint [提示]) ?请求输入一整数值

(getcorner 基点 [提示]) ?请求输入另一矩框对角点坐标 (car 串行) ?传回:串行中的第一个元素通常用来求x坐标 (cadr 串行) ?传回:串行中的第二个元素通常用来求 y 坐标 (caddr 串行) ?传回:串行中的第三个元素通常用来求z坐标

3.第三步骤:利用 PE2、CE 或记事本,撰写 PBOX.LSP 程序并储存到 C:\\LISPTOOL 目录下!!! (defun c:pbox()

;以下 pa、ww、hh 值须由使用者输入 (setq pa (getpoint \(setq ww (getreal \(setq hh (getreal \

;以下pb、pc、pd值须由程序依据pa、ww、hh求出 (setq pb (polar pa 0 ww)) (setq pc (polar pb (/ pi 2) hh)) (setq pd (polar pc pi ww))

;以下依据 pa、pb、pc、pd 点画矩形 (command \

;以下mp1、mp2、mp3、mp4值须由程序依据pa、ww、hh

;& pb、pc、pd 值求出

(setq mp1 (polar pa 0 (/ ww 2))) (setq mp2 (polar pb (/ pi 2) (/ hh 2))) (setq mp3 (polar pd 0 (/ ww 2))) (setq mp4 (polar pa (/ pi 2) (/ hh 2)))

;以下依据 mp1、mp2、mp3、mp4 点画出二条线 (command \(command \)

4.第四步骤:回到 AutoCAD 下,加载 AutoLISP 程序 若您的AutoCAD『环境设定』中『支持文件搜寻路径』有加上 c:\\lisptool,则您可轻松载入 pbox.lsp 程序

指令:(load\传回:c:pbox 或 指令:(load \传回:c:pbox 或 指令:(load \传回:c:pbox

若您的AutoCAD『环境设定』中『支持文件搜寻路径』并未加上 c:\\lisptool, 则您载入 pbox.lsp 程序时,须包含程序所在路径: 错误的加载:指令:(load \

会出现:无法开启「pbox.lsp」做输入 错误: 加载失败 (LOAD \*取消

正确的加载方式:

指令:(load \传回:c:pbox

或:指令:(load \传回:c:pbox 5.第五步骤:执行新的 AutoLISP 指令

指令:pbox <-- 成功加载后,直接键入 pbox 指令 Enter Left/Low Point: <-- 请给一左下角点 Width: <-- 给一实数当宽度,例如100 Hieght: <-- 给一实数当高度,例如50 指令:nil 指令

三、PBOX.LSP 程序产生的问题 & 改良

1. 原程序虽是成功的加载执行了,但却有以下几点小问题:

问题1:给完左下角点后,『Width:』及『Height:』提示却在同一行出现,应该一个提示各别一行才好???

ANS:很简单,只要做如下的改变,加入『\\n』即可!!! (setq ww (getreal \ (setq ww (getreal \(setq hh (getreal \ (setq hh (getreal \

问题2:希望给宽度及高度时,也能直接在屏幕上拉一段距离代替??? ANS:很简单,只要做以下的函数变动即可!!! 将 (setq ww (getreal \

改成 (setq ww (getdist pa \为参考基准点

将 (setq hh (getreal \

改成 (setq hh (getdist pa \为参考基准点

问题3:给完宽度及高度值后,开始画出所要的图形,可是指令操作过程却也跟着在『指令:』下一一配合出现着,不但影响速度,也没有实质的意义,如何改善? ANS:很简单,只要在程序一开始加入如下一行即可改善: (setvar \设定变量cmdecho=0关闭指令响应

问题4:画完所要的图形过程中,画面出现了小十字点,还得用redraw指令清除,该如何使其不出现,但又不影响正常绘图设定呢??? (R14环境blipmode内定值为0)

ANS:很简单,只要在程序一开始加入 (setvar \即可有效压抑小十字虚点出现!但须在程序结束前恢复设定 (setvar \才不会影响正常绘图设定

问题5:全部过程执行完后,在『指令:』后却出现了空响应 nil,如何消除呢??? 指令:pbox

Enter Left/Low Point: Width: Hieght:

指令:nil ? 就是这一行 指令

ANS:很简单,只要在程序结束前,加入一行 (prin1) 即可

问题6:程序确认无误后,想将所有变量均处理成『区域变量』,以免占据内存 ANS:很简单,只要做如下的改变即可将 (defun c:pbox() 改成 (defun c:pbox(/ pa pb pc pd ww hh mp1 mp2 mp3 mp4)

问题7:希望在 (load \程序的响应讯息能有更多样的变化 ANS:很简单,原回应是 c:pbox,请在程序结束后,再加入二列: (prompt \(prin1)

2. 改良后完整 PBOX.LSP 程序的全貌:

(defun c:pbox(/ pa pb pc pd ww hh mp1 mp2 mp3 mp4) (setvar \(setvar \

;以下 pa、ww、hh 值须由使用者输入 (setq pa (getpoint \(setq ww (getdist pa \(setq hh (getdist pa \

;以下pb、pc、pd值须由程序依据pa、ww、hh求出 (setq pb (polar pa 0 ww)) (setq pc (polar pb (/ pi 2) hh)) (setq pd (polar pc pi ww))

;以下依据 pa、pb、pc、pd 点画矩形 (指令 \

;以下mp1、mp2、mp3、mp4值须由程序依据pa、ww、hh ;& pb、pc、pd 值求出

(setq mp1 (polar pa 0 (/ ww 2))) (setq mp2 (polar pb (/ pi 2) (/ hh 2))) (setq mp3 (polar pd 0 (/ ww 2)))

(setq mp4 (polar pa (/ pi 2) (/ hh 2)))

;以下依据 mp1、mp2、mp3、mp4 点画出二条线 (指令 \(指令 \(prin1) )

(prompt \(prin1)

四、本章结语:

经由简单的 PBOX.LSP 程序设计全程演练,从『产生动机、预期目标』à 『构思程序流程、相关变量订定』à 『撰写程序』à 『加载程序』à 『执行PBOX指令』à『改良 PBOX.LSP』

相信您已能更了解 AutoLISP 是怎么回事了,短短的十几行,能做的事却不少,一路循序渐进练习下来,您应该觉得一点儿也不吃力、『游刃有余』才对,果真如此,那恭喜您,『好戏还在后头』,还有体力的话,就继续『征服下一章』吧!!!

若您仍觉得有点『迷迷糊糊』,那就休息一下,配合复习第二章『学好AutoLISP的关键、基本结构与语法』再好好的把第四章『看』&『做』个明白,相信有心成为AutoCAD高手的您,一定不会那么容易就『被十几行打败』的!!!

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2