|
俗话说"熟能生巧",在长期从事AUTOLISP程序设计的实践中,我总结出(当然也参考了其他朋友的经验)了部分编程技巧,仅供大家参考!
6 H, j3 M7 c+ I& z d
; z1 l* E% @; n, p1)加载程序之前应先判断文件是否已经被加载
6 {7 }9 M5 v' _6 x) a. v4 o. g
在调用用户自己定义的函数之前,应先将包含该函数的文件调入内存(LOAD "文件").但如果每次调用前都加载该程序,则会浪费很多时间.因此判别文件是否已经调入内存,则是非常重要的,这种用法在菜单文件十分普遍
: G0 u8 c8 h* [
; Y: ^3 n8 ^7 S3 L..
) `% l: a$ b9 c8 B6 c7 W0 _# r1 K k. D# Q3 a2 ~
[RECTAN]( if (not rectan) (load "les2"));(rectan);% ?. Z* T# Z5 n9 Y
7 _: b! I" Z: v& T..& A7 q9 A- j' Q2 L/ }
) s- b" G3 T g0 ?2 c9 k7 s4 X在文件内同样可以实现同样的检测
# C% w& }/ ~, n: l+ X2 i& i2 _' L0 u2 m8 V8 i' A. D! m
2)抑制函数运行后返回nil, u' H! k8 w) c
* M+ Y- U7 }- }5 ? | s! }在一个Autolisp函数运行结束后,它常会在命令行上返回一个nil,令人遗憾。其实只要我们问在该函数的最后一行加上(PRINC)语句后,即可抑制nil的产生。
9 A- b" M4 W+ a" ~" ^# V1 }
7 l$ k4 Z% y* L d* z! _当然如果对需要一个结果的函数,则不可采用此法。
% R0 e. U) x3 e3 S8 G% i1 L4 A2 V& v
3)几个自动执行函数; e3 ~7 K( ]" u7 P( g: C% D9 v
/ g- p# `, H1 a' g& P
a)加载自动执行函数' D7 N& z u s* q7 k5 ~' ?
7 k9 J% X8 W8 v; a/ k
定义0 _* h$ H" V# s+ a) I8 t
2 U }$ t5 \6 ~
(defun s::startup()
2 ]$ ~5 J) p% E; s9 Y! M4 {. c" ^) o7 \; m7 w# O" ]
...
7 g `6 ]% H4 V4 D6 w
! d7 J, f1 D% E# S: })
- K* R2 I4 C' m1 L
; y ?2 ]( y' f6 |9 I一旦该函数在acad.lsp函数中定义,在autocad启动时,就会自动加载该函数.
) w5 v% Z# J0 f& ^) T9 h% ~1 }6 c6 y4 x8 T0 ]5 m1 I
b)存盘自动执行函数
8 }$ T. A! W7 ~# V# p/ ^, }& W- r1 v
定义
; x6 T$ Q' y( ?: j
, R( E2 e: q( ?: d# _(defun S::save()2 j1 `7 x8 \) |
6 P* u* q" _: i) o
....
* ?; M9 e: q) L0 T. y
1 B& E* |- S. W)
_- R9 _1 C9 {, {2 O8 P( }
! x1 e" g3 I) H4 }0 ]- t3 w该函数与(s::startup)相似,在存储文件时将会被自动执行.例如:在保存文件时,对被保存文件生成备份文件等,就可能需要此功能文件
: F5 b- e/ F" O' J# S9 j ]: A/ ~$ D. X% f$ f) y3 S) R
c)退出时自动执行文件) u }- Y/ K: k: X1 w u
. M1 T- Y( ?$ o
定义
0 y' i0 Y3 }5 l5 w
7 l; i5 I1 x' G(defun s::exit()- R2 e! m0 \. T4 p# v0 c4 r2 `
7 Y/ w* Z3 \( _# l
.../ S5 n7 z2 _; S" v0 f/ Y4 [% e
9 c4 P" n. @8 g" Y; ])
: Y& h C$ |! W5 T' X$ S* h7 W! [9 f. _/ U, R+ e
4)怎样判断两个实数相等3 B$ I% M9 ?- A: i" n8 ?3 y
9 w) E& q# O' V$ G" ^对于计算出来的实数,即使真的相等,但对计算机来说,其往往不是绝对相等(如2.00 与2.000就不等).因此判断其相等就需要采用差值方法
! A% A+ C5 f3 p" m. K5 J5 u v: i
(equal expr1 expr2 [FUZZ]); _ }* R/ W$ e6 }+ @
) g6 k. y% t! P2 @! E% ^% Q- R9 U) \其中任选项FUZZ指定表达式EXPR1 EXPR2 的最大允许差值.即如果实际差值小于FUZZ,则判断结果为真,反之为假.
3 R. b: f" b% m
7 I1 z# M$ Z; ?(if (equal a b 0.001): w' W0 ]/ K7 S; p3 i/ t/ `
' Y, z, B) b2 ~3 `8 x" m
(prompt "These numbers are equal")# M( j# P% W. x
! p5 ~7 Y) U" Y
(prompt "These numbers are not equal")
; @! u: k( \3 z
$ |+ K" |8 b9 M' K# D" G)# L% Q) l$ g: Y$ i' P
- H+ n: b% r' L+ h9 h+ S, ~5)取系统的环境变量
) I4 i) {, |0 Q- m' d, X' w
6 U/ D/ A* W7 u对编制自己的系统来说,最好将自己的所有编制程序集中在自己独立的目录下,如\acad\lisp等.然后在将该目录添加到ACAD环境中.
% @/ h( s ?/ Z- ?7 X( a9 Z% [
在自己编制的程序中,为了确保所要调用函数或文件在AUTOCAD的搜索路径下,就需要判断自己编制的程序目录是否在ACAD环境内.此时就要用(getnev)函数 S h( U$ B' q
8 T3 ]7 a" E) h& Y1 c$ D7 U- D
如(setq nev (getenv "acad")); }6 a. `- P @( ?3 p7 n: X
4 p0 B$ v' z8 k- w1 Q
其将返回ACAD系统环境,如"C:\\ACAD\\SUPPORT;C:\\ACAD\\FONTS;C:\\ACAD\\LISP" |
评分
-
查看全部评分
|