From:www.autocad.com.tw(经Google翻译为简体)单元八: 新手上路-参数设计的关键技巧一、参数设计的重要性:您可知参数化的设计可大大的提身原有的绘图效率,将原本繁琐的过程化身成程式自动化产生没错参数化可以让效率提升至少十倍以上,让复杂图形在瞬间完成,有如变魔术一般的神奇,让AutoCAD新手也能在用你的程式操作下,画出有模有样的图形来但是 AutoLISP参数设计要做的好,除了搭配下册的DCL交谈框为程式漂亮门面外,仍得具备几项关键技巧与常识,才能游刃有余的设计各种不同的参数模组图形?别急深呼吸,放松心情,保持最清楚的思绪!!!请注意 书后有相当多的精选范例 , 参考并熟读之 , 您一定能掌握其中的精髓 !!二、重要关键-熟知三角函数关系熟记毕氏定理 -直角三角形二股平方和等于写边平方A*A+B*B=C*C熟记三角形内外角关系1. 任意三角形内角和等于180度2. 直角三角形另二角和等于90度3. 正三角形的3内角街等于60度4. 等腰三角形必有二个相同的内角5. 三角形外角等于二个远内角和熟记基本三角函数: 三角函数Sin θ表示式A / C重要等级熟记AutoLISP支援YesCos θTan θCot θSec θCsc θ
B / CA / BB / AC/BC/A
熟记熟记
YesNONONONO
熟记三角函数之间的诀窍:
诀窍一:对边关系->对边三角函数相乘等于1 (互为倒数)
Sin θ *Csc θ =1Cos θ *Sec θ =1Tan θ *Cot θ =1
诀窍二: 邻边关系->二边函数相乘等于中间函数
Sin θ = Tan θ *Cos θ
Tan θ = Sin θ *Sec θ =
Sin θ *1/Cos θ =Sin θ /Cos θ
诀窍三: 平方关系->斜线区三角形,上二顶点平方和等于下顶点平方
Sin θ平方 +Cos θ平方 =1 à Sin θ ^2+Cos θ ^2=1Tan θ平方 +1= Sec θ平方 à Tan θ ^2+1= Sec θ ^21+Cot θ平方 = Csc θ平方 à 1+ Cot θ ^2= Csc θ ^2
诀窍四: 反三角函数关系
三角函数Sin θCos θTan θCot θSec θCsc θ
表示式A / CB / CA / BB / AC/BC/A
反求角度
θθθθθθ
反三角函数ASIN(A/C)ASIN(B/C)ASIN(A/B)ASIN(B/A)ASIN(C/B)ASIN(C/A)
熟记重要等级
AutoLISP支援
NONOYesNONONO
三、 AutoLISP 三角函数 & 转换相关函数
1. (sin径度角) 传回:该径度角的SIN正弦数值2. (cos径度角) 传回:该径度角的COS余弦数值
3. (atan数值1 [数值2]) 传回:该数值的反正切径度值4. (sqrt数值) 传回:该数值的开平方根5. (abs数值) 传回:该数值的绝对正值6. (strcat字串字串… ) 传回:字串结合
7. (rtos数值[精确度] ) 传回:实数转换字串&控制小数点精确度8. (angle点1点2) 传回:点1至点2的径度值
9. (angtof字串<模式> ) 传回:将十进位度字串转为径度数值
10. (angtos径度数值<模式> <精确度> ) 传回:将径度数值依模式&精确度转为数值字串
四、精选三角函数应用技巧范例一:
预期目标: 如图 ,希望能在输入左下角点后,只给直角三角形的底边&斜边长后,自动绘出该直角三角形
步骤一:定出程式名称为5test1.lsp步骤二:构思程式流程、相关变数:
变数名称设定
为 pa 、 pb 、 pc 、 ww 、 kk 、 hh 、 ang_pb 、 ang_pc
(defun c:5test1()
; 以下 pa 、 ww 、 kk 值须由使用者输入(setq pa ( 请求输入左下角点 ))
(setq ww ( 请求输入直角三角形底边长度 ))(setq kk ( 请求输入直角三角形斜边长度 ))
; 以下 pb 、 pc 、 hh 值须由程式依据 pa 、 ww 、 kk 求出(setq pb ( 依据相对极座标法求出右下角 pb 点座标 ))(setq hh ( 依据 ww&kk 值 , 以毕氏定理求出 hh 值 ))(setq pc ( 依据相对极座标法求出左上角 pc 点座标值 )); 以下依据 pa 、 pb 、 pc 点画出直角三角形( 将 hh 的结果回应在指令区 )( 画出直角三角形 )
; 以下将三角形二夹角自动求出 , 并显示在指令区(setq ang_pb ( 依据反正切求 pb 夹角弪度值 ))(setq ang_pb ( 将 ang_pb 改推算成十进位角度值 ))
(setq ang_pc ( 依据 90 度减去 ang_pb 求得 ang_pc 夹角 ))( 将 PB 的夹角回应在指令区 )( 将 PC 的夹角回应在指令区 )(prin1)
)
步骤三:撰写5test1.lsp并储存到C:\\LISPTOOL资料夹内
(defun c:5test1()
; 以下 pa 、 ww 、 kk 值须由使用者输入
(setq pa (getpoint “请输入直角三角形左下角点 : ” ))(setq ww (getreal ” \\n 请输入直角三角形底边长度 : ” ))(setq kk (getreal ” \\n 请输入直角三角形斜边长度 : ” )); 以下 pb 、 pc 、 hh 值须由程式依据 pa 、 ww 、 kk 求出(setq pb (polar pa 0 ww))
(setq hh (sqrt (- (* kk kk) (* ww ww))))(setq pc (polar pa (/ pi 2) hh))
; 以下依据 pa 、 pb 、 pc 点画出直角三角形(princ \"\\n 另一边 hh 的长度 =\")(princ hh)
(command “ line ” pa pb pc “ c ” ) ;;; 用 PLINE 也可以; 以下将三角形二夹角自动求出 , 并显示在指令区(setq ang_pb (atan (/ hh ww)))(setq ang_pb (* ang_pb (/ 180 pi)))(setq ang_pc (- 90 ang_pb))
(princ \"\\nPB 的夹角 =\")(princ ang_pb)(princ \" 度 \")(princ \"\\nPC 的夹角 =\")(princ ang_pc)(princ \" 度 \")(prin1)
)
(prompt “ \\n << 5TEST1>> 自动直角三角形绘制” )(prin1)
步骤四:执行程式5test1.lsp
指令: (load \"5test1\") <--载入程式
<< 5TEST1>>自动直角三角形绘制<-- 传回之讯息指令: 5test1
请输入直角三角形左下角点: <--请给一左下角点请输入直角三角形底边长度: <--请给一实数80请输入直角三角形斜边长度: <--请给一实数95
< 除自动画出该直角三角形外 , 又传回以下三项讯息 >
另一边hh的长度=51.2348PB的夹角=32.6369度PC的夹角=57.3631度执行结果:
步骤四: 程式改良 & 注意重点
重点1. AutoLISP中,并无ASIN反正弦& ACOS反余弦函数,所以无法透过kk & ww求出ang_pb反正弦角也无法透过kk & hh求出ang_pc反余弦角
重点 2. (setq ang_pb (atan (/ hh ww)))可改写成(setq ang_pb (atan hhww))结果一样
重点 3. (princ \"\\nPB的夹角=\")(princ ang_pb)(princ \"度\")
(princ \"\\nPC的夹角=\")(princ ang_pc)(princ \"度\")可用strcat函数结合成同一字串,改写如下(princ (strcat \"\\nPB的夹角=\" (rtosang_pb) “度” ))
(princ (strcat \"\\nPC的夹角=\" (rtosang_pc) “度” ))
但需特别留意 ,strcat 只接受字串格式的结合而 princ 却可回应任意型态的变数
五、精选三角函数应用技巧范例二:
预期目标:如图,希望能自动画出多个等半径圆相切,执行顺序如下:
输入基准点baspt输入小圆半径rad
输入欲相切的等圆数量num自动绘出多个等半径圆相切
步骤一:定出程式名称为5test2.lsp步骤二:构思程式流程、相关变数:
变数名称设定
为baspt 、 rad 、 num 、 midpt 、 cenpt 、 kk 、 ang1 、 ang2
(defun c:5test2()
; 以下 baspt 、 rad 、 num 值须由使用者输入(setq baspt ( 请求输入基准点 ))(setq rad ( 请求输入小圆半径 ))(setq num ( 请求输入欲相切的小圆数量 ))
; 只要能求得 cenpt 点 , 再以 array 指令配合就万事 OK 了
; 以下 ang1 、 kk 、 cenpt 值须由程式依据 baspt 、 rad 、 num 求出(setq ang1 ( 依据全圆周除以 num 等分 , 再除以 2 求得 ))(setq kk ( 依据 rad & sin 相除求得该值 ))(setq ang2 ( 依据 pi/2 减去 ang1 求得 ))(setq cenpt ( 依据相对极座标法 ang2 & kk 求出座标值 )); 以下依据 cenpt 、 num 配合环形 array 画出多圆相切( 自动画出多圆相切 )(prin1)
)
步骤三:撰写5test2.lsp并储存到C:\\LISPTOOL资料夹内(defun c:5test2()
; 以下 baspt 、 rad 、 num 值须由使用者输入(setq baspt (getpoint “请求输入基准点 : ” ))
(setq rad (getdist baspt “ \\n 请求输入小圆半径 : ” ))(setq num (getint “ \\n 请求输入欲相切的小圆数量 : ” )); 只要能求得 cenpt 点 , 再以 array 指令配合就万事 OK 了
; 以下 ang1 、 kk 、 cenpt 值须由程式依据 baspt 、 rad 、 num 求出(setq ang1 (/ (* pi 2) (* num 2)))(setq kk (/ rad (sin ang1)))(setq ang2 (- (/ pi 2) ang1))(setq cenpt (polar baspt ang2 kk))
; 以下依据 cenpt 、 num 配合环形 array 画出多圆相切
(command “ circle ” baspt rad) ;; 先画一个圆 , 才能 array
(command “ array ” (entlast) “” “ p ” cenpt num 360 “ Y ” )(prin1)
)
(prompt “ \\ n << 5TEST2>> 自动等圆相切绘制 ” )(prin1)
步骤四:执行程式5test2.lsp
指令: (load \"5test2\") <--载入程式<< 5TEST2>>自动等圆相切绘制<-- 传回之讯息指令: 5test2
请求输入基准点: <--请给小圆基准点请求输入小圆半径: <--请给一实数30
请求输入欲相切的小圆数量: <--请给一整数8个执行结果:
步骤五:程式改良&注意重点
重点1. (setq ang1 (/ (* pi 2) (* num 2)))亦可直接写为(setq
ang1 (/ pi num))
重点2. (setq kk (/ rad (sin ang1)))来由推算方式如下
因为Sin(ang1) =对边/斜边= rad / kk所以kk = rad / Sin(ang1)
改成LISP表示式->(setq kk (/ rad (sinang1)))
重点 3. 因为ang1 + ang2 = pi / 2来由推算
所以(setq ang2 (- (/ pi 2) ang1))或(setq ang2 (- (* pi 0.5) ang1))
重点 4. 因为rad的取得,乃以getdist方式所以在问半径时,亦可由萤幕中给一段距离当半径
重点 5. Array指令后的七个运算子引数必须配合正常执行之顺序给与, 是相当严谨而不是乱凑的!!!
指令: ARRAY
选取物件: (entlast)找到1个<-前一个动作,刚画的小圆
选取物件: <-[Enter]结束选取
矩形阵列(R)/环形阵列(P)
: P <-环形阵列选项
基准(B)/<指定阵列的中心点>:<-给阵列的中心基准点
5.项目个数: <-给一整数
6.要布满的角度(+=逆时钟, -=顺时钟) <360>:<-内定360度
7.复制时旋转物件? <-是否旋转,内定Yes所以才有以command函数呼叫AutoCAD指令产生(command \"array\" (entlast) \"\" \"p\" cenptnum 360 \"Y\")或改写成(command \"array\" \"L\" \"\" \"p\" cenpt num \"\"\"\")
指令一定要加双引号,如\"array\"复选项一定要加双引号,如\"L\" 、 \"P\" 、 \"Y\"
用内定值,务必要加上连续二个双引号,如\"\"
(entlast)是AutoLISP标准函数,可抓取图面中最后完成的体元是很好用的技巧,请多加注意
七、本章结语:
以AutoLISP作参数设计是相当重要的入门课题,让原本辛辛苦苦画半天的图,经由您的AutoLISP妙手,短短几十行LISP程式,竟在瞬间完成,那种喜悦与成就感相当令人感动的,当然对提升设计及绘图效率更是显而卓著的至于离记忆 中很久久以前的三角函数,您当然得再重新呼唤回来,相信经过本章的诀窍分析,您
将不再害怕面对三角函数了,甚至将因三角函数在您程式中的发威,而使您开始喜欢三角函数了,果真如此,相信尔后其他再多再复杂的参数设计图形也难不倒您了,笔者在此先恭喜您参数设计若要有专业的水准,务必要配合DCL交谈框设计,有一个漂亮且容易输入各种资料的交谈界面,此部份请参考【 AutoLISP& DCL精华宝典下册】中有详细的技巧解说希望您在进入下一章之前,务必务必把第六单元的二题举一反三作完确定完全没问题后再向下一关挑战,否则基础没打稳,眼高手低,或光看不练,那到时您的AutoLISP功力一定是花拳绣腿,不堪一击!!!