|
本帖最后由 luolizhong123 于 2009-11-16 06:17 编辑
% u3 Y3 w3 o6 o3 w- S( D$ E" ?( w' j9 _5 v! m
本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
0 y4 }" y/ o8 ]3 x一、引言 3 y/ E1 I& X2 L2 Z( H6 x
汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。/ T3 v- [9 g7 U7 _: l5 A
* Q9 z' y3 H1 C, x# M二、原理及方法
1 ~ t2 H; }3 T! N) B AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
0 T7 f ^, W. ^% J! B4 B 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
- {% i; }" B/ z1 E: L9 d三、程序使用方法
5 F9 P2 v; E5 V" A8 X) F+ L先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
8 d$ e- ]# Y" B7 w0 f6 ?+ p& K然后将所建立的词组库文件及所提供的程序#TXT.LSP和对话框文件#TXT.DCL拷贝到AutoCAD所能找到的目录(环境变量ACAD所设置的任一目录如ACAD\SUPPORT或当前目录)中,在Command:命令下键入(LOAD "#TXT")进行程序的加载,即可象其它AutoCAD内部命令一样使用#TXT了。也可在所使用的菜单文件(如ACAD.MNU)中的下拉式菜单或屏幕菜单部分加上下面一行:[常用词组]^C^C^P(if (null c:#txt) (load"#txt")) #txt以后可直接从菜单中驱动该程序。
@/ d) m5 W6 _" \; J在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
: e9 a$ O, Y" T+ A! P需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。 y& M, L* U' ?. B, o, U
本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。
* Z* p0 n: M3 T8 u$ w(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) $ K- P( h! P3 r6 R# y, {; M1 ]
; 定义错误处理子程序 # ` u. A f* ?5 @ {" D# g0 y
(defun txterr(s) + R; _; h2 S( D- V+ Z
(if (and (/= s "console break") 4 h% k0 ~! @6 ~# N0 G
(/= s "Function cancelled")
% y- M3 ?9 M/ D* j1 T) e7 v) _(/= s "quit / exit abort") 1 B9 u1 E9 g8 @
)
& U9 V k4 K& `! L' J1 f$ c(princ (strcat "\nError:" s)) 1 o. \( Z9 E9 Q, v. w. X7 X
)
3 {" i" r) I! T7 V) X% s1 _(if olderr (setq *error* olderr)); 恢复原系统设置
9 h2 v2 m$ G9 v(if oldcmd (setvar "cmdecho" oldcmd))
8 |+ v, O' P6 w( P(princ) : V+ V2 N5 Z2 c6 a! y5 d: x$ ^
) 8 Z5 Y6 D( _8 x# p: k8 Y2 u; l
; 对话框显示及驱动程序 / b; p5 q: K% T0 |: d/ M! g6 v
(defun diag ( / i) * F2 ^' x! d$ R8 T
(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件 7 [+ y" C6 y- [$ M: {, v/ B% u
(progn $ L i' O" r h0 H, i$ W9 X
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框 " h# r6 ^- y8 O, ] V& [9 K4 B4 }
(progn start_list "what");将词组显示到列表框内 . Z1 I: O+ v7 B f
(mapcar 'add_list txt_tb 6 a: b2 F' E! R, l' q& x& [4 i& |
) / G+ @6 o& h$ b
(end_list)
( H0 q% U& e" x(setq i 1) ( ^% e7 D+ ^ h% u% H
(repeat nn;点取词组分类项后的操作 # L& m8 @$ A9 z0 E' ]5 c+ z
(action_tile (strcat "c" (itoa i)) "(wr_txt)")
: X9 p1 s* |4 F ?(setq i (1+ i)) + w2 C; t$ B5 b: k' ]3 `, c
) " b# r. J x4 D/ V1 V
(action_tile "what" "(setq i (atoi $value));选中词组
* I6 n7 U+ Q" K) R0 N' ]" u5 S(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
2 w& e( P( n3 a* ]; m) ) J' ^# d. k" |/ D! o) y% T
(action_tile "sel_ok" "(setq txt $value)") 8 q% S' n2 e! B
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)") , I/ ^1 J9 F; {& v1 Z# c) P0 C" N( N
(action_tile "cancel" "(unload_dialog dcl_id)") # M, ?# D3 K5 T6 `+ O
(start_dialog) ( _5 }2 @$ S* q. Z3 J
) ' e0 r$ M: N7 E8 Z7 a2 l% L* U
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!") h' _6 @, J& R. E! @. t9 n5 R
) ) i9 }& L, u# J: ], p8 n- _
) + I6 A# j- _) L
(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!") 2 S$ n3 [: ~# _6 \
) % J) _3 i/ f- y- b
) ! T0 {$ H. ?& r: w1 Z
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
; @! v8 L( V, V2 ](defun init( / fname fp txt1)
- E7 [4 M. A4 O4 I3 n+ N; A7 d(setq fname (findfile "$txt1.dat"))
$ `+ W/ y) i# H* |(if (not fname)
( ?5 K% p) s; {/ {7 k6 b2 |! u(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出 # T: b' P& i( F+ V, `8 ^2 |/ \$ f
)
$ D# X. z8 w, B, C0 J' U* Q0 E4 H(setq fp (open fname "r"))
, V, m) U( G0 P' v) T(setq txt_tb '())
# V z9 }1 \, n$ C6 L(while (setq txt1 (read_line fp)) 4 g1 @/ D8 F- ^8 N. R- f( r ~
(setq txt_tb (cons txt1 txt_tb))
4 N6 r! ]( @/ Z# |9 t)
5 a K" T: T' @; B0 S* w; u(close fp)
* X6 U/ C9 A7 a s I- r$ K5 m$ o(setq txt_tb (reverse txt_tb)) ( K A: G T* F
(setq old_nn 1);记录索引号 6 `: x4 P# V! E
)
1 j8 e, V1 V6 S0 d3 E; A" M; 更换列表框内词组显示内容
6 e: X, X& W* l9 x* C5 `; M7 D(defun wr_txt ( / fname fname1 fp txt1 i)
3 ~5 N. V: X2 N) _1 I3 G( t3 s- T4 T(setq i 1) . Z; N" m8 a) w
(while (<= i nn); 判别哪个词组项被点中 # X7 O0 C. t# I* f: J/ w
(if (= (get_tile (strcat "c" (itoa i))) "1")
( {% ~( u) \" ^: V+ S(setq fname1 (strcat "$txt" (itoa i) ".dat")
5 W* k0 U& U0 i: Q2 ?2 }i nn
/ S$ L& m2 Q$ b, X/ P)
" u8 e7 L' @: [6 M1 D4 ?)
: O0 f0 N% N; F: v1 u(setq i (1+ i))
, w6 O |( q, C; q1 I. g" g)
* @! W9 ?4 Q4 \- `. n: e3 L(if (setq fname (findfile fname1)); 查找文件是否存在 ( {& V8 y/ t! U+ B8 m
(progn
& x4 _* T' x$ R. a(setq old_nn (atoi (substr fname1 5)));记录索引号 8 Y9 W5 Z9 _0 N/ }
(setq fp (open fname "r")) " A* P g( W; V* w. ?( z1 L) m0 T
(setq txt_tb '())
7 g3 j0 p! h% ^; `1 y(while (setq txt1 (read_line fp));依次读出各词组
3 L w/ ]* u8 T, Q. ^1 u(setq txt_tb (cons txt1 txt_tb))
4 Q) `! A4 z" m! x) & E4 d/ |) K9 F K8 V" w* E! @/ e
(close fp)
4 }- Q$ J- x0 W9 p(setq txt_tb (reverse txt_tb)) 9 N# d+ x7 r. h( r. q0 @4 j
(start_list "what");在列表框内显示词组内容 0 L! S! t+ z. A/ |' J/ d
(mapcar 'add_list txt_tb) 3 V& k+ w) S9 H. }4 J6 U
(end_list) 8 v* W. ^. Q' p! C
) ; progn
1 |" L6 O! R# k- |(progn
1 ?5 p# C8 s" {# @( `(alert (strcat "文件" fname1 "不存在!"))
; L6 n6 Q; M# ~3 I# `0 ?& I(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
[ {5 y. q+ ?)
7 c, _+ N: g: V0 w5 H( m) ; if
" c5 n- X8 d0 h3 s1 C1 C: P( H)
t& ^" ~" P" `' ^$ i6 T7 T1 }9 ~; 主程序开始 A+ F+ u, @" ]
(setq olderr *error*
( A) a" F. Q9 G2 m- o*error* txterr - q' T5 b L9 V9 V) H9 _4 c" M
oldcmd (getvar "cmdecho") - T& O* G W' m2 L
)
% F/ a" X6 P- K3 C. b4 B3 R/ k(setvar "cmdecho" 0) ; 命令不回显 ( R2 X T' n* {+ D) U) d' {; N
(setq nn 9) ; 词组分类数 6 @) `: C5 D' S$ Z' \2 `
(init) ; 初始化 $ b* P2 Z _& C: P7 a" c
(diag) ; 驱动对话框 , }: \3 O( k8 J9 I
(if (and ok txt)
+ k5 @4 H5 P4 Q( d% h, Q(progn
$ [: i# x7 T% k(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在 ) G; K# ?/ v) r J8 e' C
(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值 5 a/ @; }" l+ J, a F1 m T
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"
( |. e, B' E. s# j2 O: w) ( v# B) h6 W$ w0 \- ?
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型 ' ^4 O# |2 E( @8 [% K* x( J& ]& [ Q
) " K8 n A% N: ^8 R: j+ s5 M
(initget (+ 2 4));下面的输入值要求大于0 , l/ U: c$ Z9 G7 s0 J* X
(setq ht (getreal "\n请输入字高<500>:")) 1 `! S4 g. l6 T
(if (not ht) (setq ht 500))
7 V. Y# D, J' O, s7 ?: I& q(setq pt (getpoint "\n请点取文字起点:"))
3 ^6 ^" w: v! w4 q0 k$ a; B3 l(command "text" pt ht 0 txt) * `) K' o/ Z; T
)
' n0 q( [. a, Z) 2 D1 E6 r! W0 b3 ~9 j! \: }
(setq *error* olderr);恢复原设置 $ ~9 b5 q. C o" I# g5 _
(setvar "cmdecho" oldcmd) * l( Q$ R* r I, E" t
(princ)
& c3 t) r0 \: H( ^4 n)
+ t9 a5 x! I) v0 p/ d: }% y9 R// #txt.dcl
$ D/ l6 r( z. V; v2 U' C$ f// 供#txt.lsp调用 ' Q6 d4 H* H/ g
filetext : dialog { // 对话框名称 / q8 G) e4 W/ s. r
label = "常用词组"; // 对话框标识 7 U! G/ r6 s% m$ U' C5 X( n2 N
: row {
' X( m2 X! c2 u0 k. z: boxed_column {) B$ v. l7 N6 \. u2 S/ z1 L+ O
label = " 索 引 "; 0 s* D/ [) F& I
: radio_button { % x, {$ r9 g" N' b2 o
label = "常用术语"; // 多选一按钮 4 X/ s: T Y& p# k, I
key = "c1";
4 U/ R* F$ B1 |3 B/ N5 xvalue = "1"; // 初始值为"1", 表示选中 0 u9 n& I# `! r
} : radio_button {
, c) r2 e" G9 f: q/ c; \6 f9 G6 e6 |label = "图纸名称"; ( w# m8 i$ ^6 Z0 j1 s1 h
6 E+ h4 B6 F9 f! B7 Skey = "c2"; # Q+ F9 s0 ^" X& |
} 1 z. c( x; F6 x3 ?4 X& o1 @. o8 R
: radio_button {
8 \ _) q% M4 ? vlabel = "房间名称"; & |" H6 W. o0 [4 k8 s4 j
, d, I/ p7 s( U; H0 H; M7 K
key = "c3"; ; F; w" [8 l0 m: `3 n6 \
} : radio_button {
* a2 l1 t* ^: Klabel = "卫生器具"; 3 G) f# n q6 `% {
key = "c4";
" L2 G" H3 w: |, j' Y9 X! z
5 s7 }* _& {$ i( K3 b} : radio_button { 8 I7 A# ?- |9 o+ Y6 f
label = "管材配件"; 5 b* ^1 o" `! C9 i+ O
key = "c5"; ! \/ V3 i8 f9 b0 j, T
} 3 V% G: t) P5 R4 G* w6 P/ w, U( E& Q
: radio_button { label = "器材仪表";
* L+ ? l9 E; k( ~$ hkey = "c6";
5 k% J$ j! V; | y/ g E. `9 W0 ?6 C9 L) b9 z
} : radio_button { label = "常用设备";
+ a/ ~1 D! T. _$ \. o j2 P1 A9 U" fkey = "c7"; }
( r: }# `5 l6 n' A4 `+ A: radio_button {
4 \/ K% z* P" \! `9 n! klabel = "构筑物"; 1 @7 |( A& @0 q
key = "c8";
& A* o5 A) Y* o3 {( R% c5 T( Y5 x}
& f/ @0 v. @0 \5 T/ e3 Z: radio_button {
' Z7 t2 t ?0 b. {, f, X! I0 |! l
. U& w! \9 d2 f# C$ Dlabel = "其它";
}5 `% W% d* g6 vkey = "c9";
/ _! ?, B! v) a# `8 G& m) _} 3 q2 F) w" G; d/ ]9 v! d3 g
} x- c) Q6 N2 m- |- D* t( t( f
: list_box { ( R2 ]& R [7 f2 a5 ~6 k& @
label = "词组内容";
S+ N. a- g# @% H! l' u3 z- akey = "what"; 0 G! \3 z( I( ]- T
height = 15;
, ~4 c8 h$ K {- T- |& Ewidth = 26;
. J% J3 _* L& ~0 d1 Y8 v; Lallow_accept = true; // 可双击鼠标选取 ' w% I9 }( e% m
2 s; H& }' R! M7 K4 t! }}
' R0 w9 K9 N6 ~* }" n' {, \} spacer_1;
& g7 n+ T, e2 V, v k2 z+ ~: edit_box {// 编辑框
8 ^( R# S' B& C/ \; x. k; q; Llabel = "所选词组:";
# U2 r$ Y& \8 o# U0 k- s' N% }key = "sel_ok";
$ p! d; r- a. m' V7 I5 c: [* w0 x W7 r
} spacer_1;// 增加间距 ' Z! E3 o/ y. n
ok_cancel; |
|