pline加点lisp_用Autolisp 在AutoCAD中实现多种曲线的绘制
用Autolisp 在AutoCAD中實現多種曲線的繪制
一、引言:
AutoCAD自1982年由Autodesk公司推出以來,經歷了20年的發展更新,目前,已深入到包括機械、建筑、服裝、航天航空、地質氣象等等的眾多領域中。AutoCAD已成為眾多工程設計人員的首選設計軟件,其格式也逐漸成為各CAD系統間的交換標準。
AutoCAD之所以有如此廣泛的應用,除了其功能強大、易學易用外,還在于它是一個開放的交互軟件,自85年推出的2.17版中,AutoCAD就內嵌了Autolisp語言,方便用戶對其進行二次開發。自此,便有無數的工程技術人員成為Autodesk公司的編外程序員。隨著AutoCAD版本的不斷升級,它所支持的開發環境也不斷增加,如:ADS、ARX、Diesel、DCL、
VBA等等。但由于方便和易學易用,Autolisp始終是技術人員在開發AutoCAD時運用最多的編程語言。同時也有更多的工程技術人員投入到Autolisp的學習之中來。但是,畢竟Autolisp也是一種編程語言,學習起來遠不如學習AutoCAD的操作來得簡單。故也有部分技術人員在學習過程中有危難情緒,針對這一情況,本人在此通過一種方法、三個例子來闡述Autolisp編程的一般過程,希望能對Autolisp初學者有所幫助。
二、Autolisp的二次開發:
(一)
問題提出:
盡管AutoCAD在各個領域中有著廣泛的應用,但總不會面面俱到,在機械行業中,經常要畫一些復雜曲線,如:三角函數曲線、漸開線、螺旋線等等。這些曲線在AutoCAD中沒有專門的命令,難以用一般的方法繪制,盡管機械制圖國家標準中有用圓弧近似替代漸開線和螺旋線的畫法,但它們一不準確,不能通過裝配干涉,二不方便,需要取很多位置點才能畫出。而用Autolisp編程繪制,卻能快速準確的得到所需圖形。
(二)
曲線繪制:
1、
獲取曲線的數學模型:
正弦曲線:x = a
y = sin a
漸開線:x = br * (cos a + a sin a)
y = br * (sin a + a cos a)
圓柱螺旋線:
x = r cos a
y = r sin a
z = s * a /
(2π)
(s取正值為右旋、取負值為左旋)
2、
設計程序框圖:
3、
程序代碼如下:
;畫正弦曲:x=a , y=sin a ;
(defun
c:zxqx(/ da bp Ai lpt bp1 bp2)
(initget 1)
(setq bp (getpoint
"\n 起始點?:"))
(initget 7)
(setq da (getangle
"\n 角度增量?:"))
(setq Ai 0 Ae (* pi 2.0)
bp1 (car bp) bp2 (car (cdr bp)))
(while (< Ai
Ae)
(setq lpt (append lpt (list (list (+ bp1 Ai) (+ bp2 (sin
Ai))))))
(setq Ai (+ Ai da))
)
(setq lpt (append lpt (list
(list (+ bp1 Ae) (+ bp2 (sin Ae))))))
(setvar "cmdecho"
0)
(command
"pline")
(foreach pt lpt (command
pt))
(command ^c)
(command "pedit" "l"
"f")
(command ^c)
(setvar "cmdecho"
1)
)
;漸開線畫法x=br*(cos(a)+a*sin(a))
y=br*(sin(a)-a*cos(a));
(defun
c:jkx(/ ti lpt ae pt bp1 bp2)
(initget 1)
(setq bp (getpoint
"\n 起始點?:"))
(initget 7)
(setq br (getreal
"\n 基圓半徑?:"))
(initget 5)
(setq ai (getangle
"\n 起始角度?:"))
(initget 7)
(setq ae (getangle
"\n 終止角度?:"))
(initget 7)
(setq da (getangle
"\n 角度增量?:"))
(setq bp1 (car bp) bp2 (car
(cdr bp)))
(while (< ai
ae)
(setq lpt (append lpt (list (list (+ bp1 (* br (+ (cos ai) (* ai
(sin ai))))) (+ bp2 (* br (- (sin ai) (* ai (cos
ai)))))))))
(setq ai (+ ai da))
)
(setq lpt (append lpt (list
(list (+ bp1 (* br (+ (cos ae) (* ae (sin ae))))) (+ bp2 (* br (-
(sin ae) (* ae (cos ae)))))))))
(setvar "cmdecho"
0)
(command
"pline")
(foreach pt lpt (command
pt))
(command ^c)
(command "pedit" "l"
"f")
(command ^c)
(setvar "cmdecho"
1)
)
;螺旋線畫法:x=r*cos(2pi/k) , y=r*sin(2pi/k) , z=(+/-)s/k
.
;
s:導程(+=右旋,-=左旋),k:每圈等分數。
(defun
c:yzlxx(/ bp r a s k n bp1 bp2 bp3 dmax di da pt lpt)
(initget 17)
(setq bp (getpoint
"\n 螺旋線中心:"))
(initget 7)
(setq r (getdist bp
"\n 螺旋線半徑:"))
(initget 3)
(setq s (getreal "\n
導程:(+/右旋,-/左旋)"))
(initget 7)
(setq n (getreal "\n
圈數:"))
(initget 6)
(setq k (getint "\n
每圈等分數<36>:(宜取36的整倍數)"))
(if (not k) (setq k
36))
(setq bp1 (car bp) bp2
(cadr bp) bp3 (caddr bp))
(setq dmax (fix(* k
n)))
(setq da (/(* 2 pi)
k))
(setq a 0)
(setq di 0)
(while (<=
di dmax)
(setq lpt (append lpt (list (list (+ bp1 (* r (cos a))) (+ bp2 (* r
(sin a))) (+ bp3 (* (/ s k) di))))))
(setq di (+ di 1))
(setq a (+ da a))
)
(setvar "cmdecho"
0)
(command
"3dpoly")
(foreach pt lpt (command
pt))
(command ^c)
(setvar "cmdecho"
1)
)
4、幾點說明:
(1)、以上三個程序編程思路是一樣的,若需要繪制其它曲線,只要將其數學模型適當變換后代入程序中,即可實現所需功能。
(2)、該漸開線只能繪基圓上正東方向象限點上的漸開線,如要獲取其他方向上的漸開線,可以在AutoCAD中修改獲得。
(3)、繪制螺旋線的程序較2001年第6期上郭克希副教授的程序有所改進,原程序因為圈數n作為循環記數,只能是整數,使螺旋線圈數只能為整數,而該程序中圈數n可以為實數。
(4)、建議將lpt等參數設為局部變量,以減少內存占用率。
(5)、最后一個程序繪制螺旋線后未用f擬合曲線,是因為3dpoly繪制的曲線擬合后就不能作為實體的拉伸路徑了。
5、
編入菜單:
(1)、編入下拉菜單:在acad.mnu文件中的
***POP7
**DRAW后的
ID_Pline
[&Polyline]^C^C_pline 下面加入以下語句即可
ID_jkx
[&Jkx]^C^C_jkx
ID_yzlxx
[y&Zlxx]^C^C_yzlxx
ID_3dpoly
[&3D
Polyline]^C^C_3dpoly
(2)、編入工具條:可直接在工具條上右鍵進行定制,在此不做贅述。
三、應用:
總結
以上是生活随笔為你收集整理的pline加点lisp_用Autolisp 在AutoCAD中实现多种曲线的绘制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爱奇艺被指苹果和安卓清晰度双标:其实是手
- 下一篇: 西门子主程序调用子程序_S7200Sma