|
俗话说"熟能生巧",在长期从事AUTOLISP程序设计的实践中,我总结出(当然也参考了其他朋友的经验)了部分编程技巧,仅供大家参考!
" P- D6 A' z9 t
* Q0 t$ } f1 e1)加载程序之前应先判断文件是否已经被加载. W: D* w) [& k
1 j% c: I: n6 \' K8 j+ Y- X% u, x
在调用用户自己定义的函数之前,应先将包含该函数的文件调入内存(LOAD "文件").但如果每次调用前都加载该程序,则会浪费很多时间.因此判别文件是否已经调入内存,则是非常重要的,这种用法在菜单文件十分普遍, U6 p9 {+ A0 Q" b7 Y
8 @' B4 y* y& m../ }& D% `, L. R: \
1 o4 y/ {2 C, a
[RECTAN]( if (not rectan) (load "les2"));(rectan);
# W# V: Z6 o) k; }' J9 o' G$ _! N. ]* j4 ^. C
..
2 m" j( X: Y l# a- d- R1 b$ T x+ ~- V8 ]2 T2 @4 k! ?
在文件内同样可以实现同样的检测
: n, @! H3 e( m, ~5 q/ D3 J& h' D4 \
- R: L2 P% V! J2)抑制函数运行后返回nil
6 p- o; M. b1 U) {. z1 i3 A$ P3 Y/ ?; I3 T& Y0 W# M' O# M [
在一个Autolisp函数运行结束后,它常会在命令行上返回一个nil,令人遗憾。其实只要我们问在该函数的最后一行加上(PRINC)语句后,即可抑制nil的产生。2 d, B# X" p5 |" [( L# E( i9 R* U/ e6 R
9 W5 m5 C' S% @. V0 A9 l4 v
当然如果对需要一个结果的函数,则不可采用此法。
2 h8 t# `% i0 v0 v; O; A2 D: ?- b [, `( h
3)几个自动执行函数" c- a1 a% k. l1 ^" ` C2 e t
" |# e) ^, h# z7 g8 D! ba)加载自动执行函数# I3 @: Q B1 n4 f5 q
8 ?% K1 r& o) Y: ~
定义' @ t3 I- c& {7 d$ \+ f9 s' x# A
$ _. {' |! E# x; V/ h(defun s::startup()/ [4 W5 \, F: p! g" i3 T0 |
, z9 a8 i* N9 {8 L' e- E...
2 t, k- z# u; F& D/ m- t( T3 o- _6 J# \. A( {- k
), p" \. k- h, Q, K1 w. J4 X
% O) Q: }2 i5 Q2 ?1 m. Q" \一旦该函数在acad.lsp函数中定义,在autocad启动时,就会自动加载该函数.
3 W- f: {. _, B- ]' n; ^& d2 K t V: B5 e% Y0 D9 z
b)存盘自动执行函数
3 L! n$ U) d. n2 Z7 x- |
" r. B+ w' Y9 d" x定义7 X9 [1 [7 A9 n- g V
9 {. P1 `5 T% a& |7 T; M
(defun S::save()
0 W- Z' r" q7 R( d& N0 u2 U! \
; \5 q; A: ]5 g# a# P8 T" t4 D8 J....
7 W- I1 I# F* `, h7 }* |
" F, @2 a! b3 R7 i)9 M; S6 l$ V4 d
* i- j/ E5 {) I( k3 w+ I该函数与(s::startup)相似,在存储文件时将会被自动执行.例如:在保存文件时,对被保存文件生成备份文件等,就可能需要此功能文件8 ?* A$ r7 L' T( Z( z. E9 c
7 R# W, n: ^! U( ]
c)退出时自动执行文件- h( ^& T8 W0 B3 A$ q$ i& N
" D$ v. q$ ?+ B: Q: h9 q定义
0 }5 O& [/ i% J( ^
+ v4 b: o* n) z0 J T5 P1 y. c(defun s::exit()$ B7 H, L! l# t
7 R. k: I6 G; K5 k8 N# [...
- I2 `5 q6 A: o2 X2 w, @ v; h" v4 F8 o3 S* J
)
2 @ u( C- R" W9 W0 i) B+ y
. ?# G5 c; o2 [; G$ }4)怎样判断两个实数相等; H j3 v$ b9 _0 ?1 j$ |
: y- B3 W3 S; |+ ?对于计算出来的实数,即使真的相等,但对计算机来说,其往往不是绝对相等(如2.00 与2.000就不等).因此判断其相等就需要采用差值方法% C& N' u. W4 Q; z
$ K& |# E2 X6 e+ I% I. E2 d- G
(equal expr1 expr2 [FUZZ])
+ Y' c" P3 {( q% f
8 F* |: R, m' G3 E# f其中任选项FUZZ指定表达式EXPR1 EXPR2 的最大允许差值.即如果实际差值小于FUZZ,则判断结果为真,反之为假.
9 v( _; \1 G9 Z: v
: n9 \, [. l& W/ P# ~6 a* g(if (equal a b 0.001)1 _* p% Q! q8 u4 z! }1 x# H4 N
$ t/ n6 h! V& I1 \8 s(prompt "These numbers are equal"). S$ y6 Y' K) K) Y2 I9 A$ Y
1 S2 p! p: `; D9 C4 F(prompt "These numbers are not equal")
1 J7 n! ^ b l: A
8 u. F) A- W3 G9 y, {)/ ]* s, N& w, E9 r, g" O) D3 [3 ?9 i
, q S6 ]1 X' f8 L
5)取系统的环境变量2 z& j2 f: H5 d a- J
$ i3 H0 p9 c& `5 Q
对编制自己的系统来说,最好将自己的所有编制程序集中在自己独立的目录下,如\acad\lisp等.然后在将该目录添加到ACAD环境中.
* y/ q( d; ^+ U" G( A* P
' m# I! a7 M/ P, w在自己编制的程序中,为了确保所要调用函数或文件在AUTOCAD的搜索路径下,就需要判断自己编制的程序目录是否在ACAD环境内.此时就要用(getnev)函数+ X4 C. h) M) Y
- U7 |/ p0 V6 ~3 T' L) m3 J如(setq nev (getenv "acad"))
" Y; u+ Z& q% Q3 G& n) w) w* t4 g& F2 \) K6 ]; r
其将返回ACAD系统环境,如"C:\\ACAD\\SUPPORT;C:\\ACAD\\FONTS;C:\\ACAD\\LISP" |
评分
-
查看全部评分
|