|
俗话说"熟能生巧",在长期从事AUTOLISP程序设计的实践中,我总结出(当然也参考了其他朋友的经验)了部分编程技巧,仅供大家参考!5 @' u$ u/ G5 G$ T- [& N/ Z9 r& L
9 f i# Q! G9 D( S$ b2 m1)加载程序之前应先判断文件是否已经被加载) F& Q7 A% X# m7 [' l4 K) J
" u* D. S; T& T' f
在调用用户自己定义的函数之前,应先将包含该函数的文件调入内存(LOAD "文件").但如果每次调用前都加载该程序,则会浪费很多时间.因此判别文件是否已经调入内存,则是非常重要的,这种用法在菜单文件十分普遍
& n8 \7 O) Q; g1 X5 f j4 G
0 ?' s( F3 i1 D9 V0 q! p2 p$ i9 _..
7 T5 M) A! F! u' a; q% J; ?
4 h6 N+ K% J1 i[RECTAN]( if (not rectan) (load "les2"));(rectan);
* ~" K7 R, U# v: V# Q C' [# j
; _$ W9 t! Q/ k0 Y..
7 F% |0 H9 C8 C+ O) Y ?# q. x. E7 }' r! f
在文件内同样可以实现同样的检测! U* y/ S4 X1 B- y' x
5 ~' u+ i( A8 D2)抑制函数运行后返回nil
2 [0 N$ C2 M4 U- d& X
2 P1 E$ t: Z+ g6 T, H4 F在一个Autolisp函数运行结束后,它常会在命令行上返回一个nil,令人遗憾。其实只要我们问在该函数的最后一行加上(PRINC)语句后,即可抑制nil的产生。* Y% n( O6 h) r! `" W! c
, s. ~3 L& z6 L4 e# C2 d1 b9 y
当然如果对需要一个结果的函数,则不可采用此法。
3 H# Q1 R: ~9 L* f) E4 S
! E' J; G. g. ^ b6 V, P8 L3)几个自动执行函数
+ b5 I4 J- y( c- N. M2 p
% [( b' @5 C g" U5 za)加载自动执行函数
/ F' i1 m' [, \& W9 N% Q! _9 g. V) ]; O+ `2 R2 O
定义
- `7 ?/ E" J* J [0 a& ^
8 r+ z# b# b" C* }3 Y3 E7 z4 z8 v ~(defun s::startup()
5 R0 n8 z) T8 ]
9 t. [( ^) Z7 K; `% g...: V' S; e7 s3 p0 [: p% U! ^7 V) T
+ C2 S' }3 I6 ?/ I7 k' n1 G1 [): R& S2 i( H5 Q0 H( q
; ~8 M: V; H4 X一旦该函数在acad.lsp函数中定义,在autocad启动时,就会自动加载该函数.
+ S+ C+ X4 o, o) q# ?
B! O0 i& p) g2 a8 db)存盘自动执行函数
* s4 [) d8 W+ d6 O& B7 P
7 T) [* f; r. S. r定义
% Q0 h7 f6 r; q0 J2 l6 j0 J! w7 B9 L/ l8 w
(defun S::save()
" y: h, \% y o6 A$ q7 G' L/ q( v0 L2 q9 R& f; h5 @* N5 h
....
1 t, h/ A4 O1 }/ S, h/ i1 i# i% x4 U: N+ r$ F& _. a( g% D
)5 v' X8 y9 e5 ~. F! ^) F% A
% K A& m5 x7 U) g5 S7 t
该函数与(s::startup)相似,在存储文件时将会被自动执行.例如:在保存文件时,对被保存文件生成备份文件等,就可能需要此功能文件6 Z3 ^. E) ^ a1 c1 ^1 z
- d2 I8 q+ J2 Xc)退出时自动执行文件& O0 s$ n# Y$ ]: ?- n
: u/ @4 Z' h0 r& s5 L定义
9 c3 n f7 i" g" |2 K" P4 @# [7 b
5 w% V) d* C: N& p(defun s::exit()
: S* x$ `7 U& ^8 [4 R5 C" p9 \* q: k7 X0 a$ i
...
' |7 a. c& i$ h; c! z% n8 }7 w, V1 w
)
$ i& `2 v8 f x; g7 U4 g
4 \$ k* Z0 W8 t0 q' o; ~4)怎样判断两个实数相等
. E: n$ R$ @( A$ F! r) ^0 N
_+ [& m" a1 @+ s' f4 X/ d- [对于计算出来的实数,即使真的相等,但对计算机来说,其往往不是绝对相等(如2.00 与2.000就不等).因此判断其相等就需要采用差值方法- O$ j9 B+ U( }8 T4 Y# |& L1 A T
% P/ q' L6 `2 t. D. l0 M' p(equal expr1 expr2 [FUZZ])
/ a4 I. x6 K7 i1 W
: G6 u1 l0 g, |0 D: P ?" d其中任选项FUZZ指定表达式EXPR1 EXPR2 的最大允许差值.即如果实际差值小于FUZZ,则判断结果为真,反之为假.! |; K+ H) v6 D3 j; q
6 V% D6 M& r5 B) x& I(if (equal a b 0.001)
3 K- h) b; A2 d# c) @, l' X$ C% m% X) n
(prompt "These numbers are equal")
) }" n* V7 }. {+ q' p3 [6 q, U! z! y& y7 W; ^- \( K
(prompt "These numbers are not equal")! U7 {5 j# J- w
( I9 f; v/ u+ z. _)0 A9 p6 U# [) j1 E6 x3 f
) r. y _$ [( h7 R& |( [5 h, ^
5)取系统的环境变量" D7 `" \; X5 i1 @" p
- `8 d6 |" @' m% o: y: H0 _& F对编制自己的系统来说,最好将自己的所有编制程序集中在自己独立的目录下,如\acad\lisp等.然后在将该目录添加到ACAD环境中.6 i2 F; ]% R! l* W8 e! w1 q
1 y( m, ~5 A! ~' B' v在自己编制的程序中,为了确保所要调用函数或文件在AUTOCAD的搜索路径下,就需要判断自己编制的程序目录是否在ACAD环境内.此时就要用(getnev)函数( k6 i K+ K7 s) z! C/ H5 [' l
M7 D0 S( n& X) M9 E如(setq nev (getenv "acad"))* |0 C x/ U S5 `- ^0 M% Q5 \
: E" v) i6 S+ S( I7 K其将返回ACAD系统环境,如"C:\\ACAD\\SUPPORT;C:\\ACAD\\FONTS;C:\\ACAD\\LISP" |
评分
-
查看全部评分
|