|
俗话说"熟能生巧",在长期从事AUTOLISP程序设计的实践中,我总结出(当然也参考了其他朋友的经验)了部分编程技巧,仅供大家参考!" Y4 c1 ]5 w8 T4 e- H$ Y
2 E3 } ^0 E6 _/ a
1)加载程序之前应先判断文件是否已经被加载/ i4 G7 c8 p7 ^% \4 M: Y
' P6 k) Y: b; K% [在调用用户自己定义的函数之前,应先将包含该函数的文件调入内存(LOAD "文件").但如果每次调用前都加载该程序,则会浪费很多时间.因此判别文件是否已经调入内存,则是非常重要的,这种用法在菜单文件十分普遍& o* g3 v7 N& Y' X* r! L7 D
' C" x9 B+ z2 B1 | o# X5 E..# e) L7 a; W; D/ F% N2 s$ z1 s5 S1 e
4 u3 x6 {% n5 D' ~1 {
[RECTAN]( if (not rectan) (load "les2"));(rectan);7 {4 A) w, a, S6 o9 W
6 n. N k2 T h: s/ Q" H8 D..
5 @- o6 C, I5 P0 y& t$ m" ]8 q6 f; J! \+ x) k- |: j8 G
在文件内同样可以实现同样的检测
5 z, d9 z7 T+ y. p+ c3 X4 M; {& s$ T. P0 {) l
2)抑制函数运行后返回nil
: ^1 O3 s. Q" T( M- S% l4 P
- ?0 A4 Y7 [4 a在一个Autolisp函数运行结束后,它常会在命令行上返回一个nil,令人遗憾。其实只要我们问在该函数的最后一行加上(PRINC)语句后,即可抑制nil的产生。2 X* C- \# i ~9 a1 a& O% T
1 p3 J6 p# E/ k0 X4 z当然如果对需要一个结果的函数,则不可采用此法。
! ~& C0 J* W! O1 W8 _8 s! C/ M" h2 U8 G6 K$ L* G
3)几个自动执行函数
: H7 Z# f6 W: q0 z, }- t) {4 E. h2 I( s1 d2 F+ |. Y# K
a)加载自动执行函数
0 \& ^% } p$ }& Y$ u' L- k( C7 K% d
Y; |2 {0 ]8 L8 b1 L定义9 I7 u3 E5 @3 e9 R5 I
0 b+ c$ ^1 I# O+ ^% }9 W; M6 F
(defun s::startup()% H7 Q4 f/ h+ S( s
- [; ]7 `; V' z& z3 g
...4 p* V0 A- U, s8 b
4 @$ ~! J3 f- U9 p5 R0 e)6 j8 h. T$ c8 A! C( V @
9 v! m# Q$ Y9 B. \/ G+ K# F/ w一旦该函数在acad.lsp函数中定义,在autocad启动时,就会自动加载该函数.
' g6 M2 G$ a0 T3 A0 c
0 ]& ^ `3 v" T0 @1 |3 E5 T% db)存盘自动执行函数
$ _. \& V, k0 ^0 j3 s9 a$ V- w, j: G- J q0 M
定义
+ L4 M9 X* Y5 ^; f! v
3 p; T X6 N, ^: i/ M* B(defun S::save()* d" f6 ]) S7 ^; Z7 U
) {3 H( \% W3 L& A- G) J, _6 n6 u9 W* R....' D( [4 p' h& ?
$ D5 f, ^; J+ r: S, S9 `' G/ k- g)* o* X' K7 k$ W- r+ c/ S! O
' Z1 m3 b/ s4 |/ V
该函数与(s::startup)相似,在存储文件时将会被自动执行.例如:在保存文件时,对被保存文件生成备份文件等,就可能需要此功能文件# l/ c' R; M" ?
0 b9 E8 C7 k G* U! lc)退出时自动执行文件, {8 `# l7 f H3 Y6 W$ d' Y
9 K5 V+ S/ [3 t F# h
定义6 P( r$ T- H" D) q- @6 T
3 F, A' r* }- n W8 @1 A/ d0 q% r- d
(defun s::exit()# n* {) g+ a; l
# b' D7 t8 {& c+ G...( t. h9 b: r% X* u$ ~
+ s) S; r3 C, M9 x; u' O)
$ H/ S5 h4 I/ l* O# C* U* c3 C( ^) s
4)怎样判断两个实数相等
- I O( [$ M& F% r/ J9 R' P6 l9 z8 P( Y; ~
对于计算出来的实数,即使真的相等,但对计算机来说,其往往不是绝对相等(如2.00 与2.000就不等).因此判断其相等就需要采用差值方法
( l* J9 K) g* `
, b) E4 {& i8 F4 y(equal expr1 expr2 [FUZZ])
G! G& d$ ]+ _
) u0 ?1 g! d H0 f2 R6 j其中任选项FUZZ指定表达式EXPR1 EXPR2 的最大允许差值.即如果实际差值小于FUZZ,则判断结果为真,反之为假.3 C: w3 d* M D: Z5 L/ O# B
u% Y. z5 m. I# z- v(if (equal a b 0.001)) L% e" s* u! K; g
! j9 U- }( A' k i# ^+ j
(prompt "These numbers are equal")
% |) }; d1 v- M1 ^. | q5 H* i0 h: P! ~$ M' A
(prompt "These numbers are not equal")
: ]; H5 o3 h/ }& s8 B
" \- t% @3 W7 h) d0 s" w* f+ ~3 q)$ ~$ b& g* a z5 D$ ^
% t, E4 I& @) }6 j5)取系统的环境变量
: q, @5 } @2 |- M: b% k- b( E) s* ^) G
对编制自己的系统来说,最好将自己的所有编制程序集中在自己独立的目录下,如\acad\lisp等.然后在将该目录添加到ACAD环境中.5 j, X+ j* n% j* u) J) b- G. N
; U9 Z. \' r( D! Z
在自己编制的程序中,为了确保所要调用函数或文件在AUTOCAD的搜索路径下,就需要判断自己编制的程序目录是否在ACAD环境内.此时就要用(getnev)函数, C) e1 F0 m* o6 U7 t
8 }( b ~8 E; T) c& I如(setq nev (getenv "acad"))
6 k' w1 q: ]9 L/ W5 o# H0 d- F' Y" p/ B: H
其将返回ACAD系统环境,如"C:\\ACAD\\SUPPORT;C:\\ACAD\\FONTS;C:\\ACAD\\LISP" |
评分
-
查看全部评分
|