摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 3 c0 @# E8 H( |5 R5 p
一、引言 . N8 ^1 ?( E& a3 t
汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
( H$ [7 k2 T2 }' x( X9 E- d9 q" Y5 w4 j. h, V% D
二、原理及方法
( \, m, U2 F6 i" D% _0 Y AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。 9 e1 z* |% o n+ I$ D
左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
7 p& a* Q4 I8 o3 W& L9 b三、程序使用方法
, E- k* y+ \/ {8 z9 J先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
+ p2 T: W5 `7 t/ D: L3 W然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
$ J3 V8 n! v K0 ]3 u在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
- `! w& R1 ?: a7 t需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。 & [0 y+ e8 j3 x8 y/ [4 P
本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均调试通过。
) s: \& f- R& X- A8 }(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) 9 q" d1 y/ g+ {! `# r9 U
; 定义错误处理子程序
/ l! l0 V( A1 A# D0 t! F(defun txterr(s) * j' q7 k' U! r0 ~: P" l
(if (and (/= s "console break") * L. Q' k$ e$ d2 _5 a- p
(/= s "Function cancelled")
w" p: P4 p1 ]' L- x6 m6 s(/= s "quit / exit abort")
; P3 f% w9 n$ p) 9 i- B) y/ T- {3 t1 D( s" G- P
(princ (strcat "\nError:" s)) - j# n3 }6 M, c( ] v& Y7 w; G& y
) ! ?# k0 {) `: E8 @, ?% t- ~2 G2 Y
(if olderr (setq *error* olderr)); 恢复原系统设置 % a! c M( q5 M( w
(if oldcmd (setvar "cmdecho" oldcmd))
$ Z, e9 T7 G) e0 E! L(princ)
, ~$ q) K% d8 ^. B( G2 B) " S* N+ s3 Q; q$ m# u i4 y. V) X
; 对话框显示及驱动程序
p/ Z/ L8 G1 i) N* m(defun diag ( / i) + W' ?9 Y/ o! c- ~
(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件 : v/ `" y# B( o! c# P2 ]2 n3 Z
(progn / q' I o( {" \- X3 \& d
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框 6 M: e/ b" \, Y$ B" B2 e* M0 X0 ]9 E: L
(progn start_list "what");将词组显示到列表框内 * {- |! c, N+ K% g5 X+ G# x$ ^
(mapcar 'add_list txt_tb
B; f" y9 V: f$ j. `2 W) $ Q) K7 D; ]8 y, F* {2 h
(end_list) . n% W! F2 x6 A7 w" ~- ~, g% ?
(setq i 1) * d% v7 e1 ?* g# C3 [! F
(repeat nn;点取词组分类项后的操作
2 q/ u# f! `* c( n# ~# N% [1 V(action_tile (strcat "c" (itoa i)) "(wr_txt)")
' e3 Y6 y* s9 w( {6 ~5 R(setq i (1+ i)) 9 s" f }5 x2 N: {
) 5 m [, @1 r! f! r; v
(action_tile "what" "(setq i (atoi $value));选中词组
# K1 s8 l& C2 p8 S(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)" 0 x" U. g# m4 ^5 J6 H' |' K
) % p/ |$ w2 B" ~$ L) a% M' Q; f8 Z1 N
(action_tile "sel_ok" "(setq txt $value)") ; u; M( b: i+ s6 c Y
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
8 g* ?6 v1 r! {* l/ e(action_tile "cancel" "(unload_dialog dcl_id)") % T7 j M/ r J# k D
(start_dialog)
+ ]$ T# _5 P: ~' H1 m)
: V' l0 I# j9 T+ r2 B& k+ A(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!") 2 O& C3 L( k7 ~+ v' s8 v
) & Z% d6 f7 J0 A* D# Z
) 4 b% n% N6 l. ] z
(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")
$ c9 [( ?+ |' x$ N" D7 B/ j)
4 z ~8 ]9 p6 e; P! w) M; F) ) ^: u/ I9 X7 n* V
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中 5 j- F, D( d' I% f/ v& r
(defun init( / fname fp txt1)
# N8 X% b3 i/ m g' h(setq fname (findfile "$txt1.dat")) . X; r- p, Q/ B; }2 U" O
(if (not fname)
, }" c7 N5 r3 Y, g0 c+ z(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出
7 c# ?: y0 }' y( ]8 I, N; Y4 y)
F* M0 X+ `; c# ](setq fp (open fname "r"))
6 ?( a, M# \+ D4 Q(setq txt_tb '()) 9 e2 \* e# `4 F! U. X
(while (setq txt1 (read_line fp)) 5 ]- E& U8 D3 [+ X2 n# ]
(setq txt_tb (cons txt1 txt_tb))
$ Q2 F3 q! R" H8 B1 W6 N; x9 K) - `$ K# h. i. H, j
(close fp)
: K) j& ^3 n* B" ^" X(setq txt_tb (reverse txt_tb)) 3 j, M, L& S; [! ]% A, V& ~
(setq old_nn 1);记录索引号 ( {* G4 }/ Y9 ^/ f; t% ]
) ( ` _( i- g" o. Z8 x# R% ~. ^
; 更换列表框内词组显示内容
2 ?3 K: J H, o# ~* a3 Y+ u; z5 W3 d(defun wr_txt ( / fname fname1 fp txt1 i)
6 A" u$ Y2 A! W/ Z(setq i 1) 2 t$ m) i- i- u" _% Z
(while (<= i nn); 判别哪个词组项被点中 % |4 I' }8 V& C: j4 b
(if (= (get_tile (strcat "c" (itoa i))) "1")
4 t) w8 y$ A- W, i* H(setq fname1 (strcat "$txt" (itoa i) ".dat") 9 T# z! ?! R) V! U. o
i nn ' q6 e# I, q9 M0 m$ p I
) 7 R+ A# P* A- L% Y# c3 E m
) 9 v# f2 Z, v k. j! I
(setq i (1+ i)) 7 e3 o, P/ w M. q3 T! d2 t
) $ G0 e( v S3 @* p. m
(if (setq fname (findfile fname1)); 查找文件是否存在 9 `. P# D9 F& b% k# D9 e& g! w( i: t
(progn $ r$ m8 M, y8 K8 Y" s# u+ k5 M
(setq old_nn (atoi (substr fname1 5)));记录索引号 " X5 p0 f p+ B
(setq fp (open fname "r"))
$ T! y( q$ N, s/ M( t9 ~% B(setq txt_tb '())
4 h, w n4 m D1 M& A6 X4 g(while (setq txt1 (read_line fp));依次读出各词组
5 |% v- x; g; A7 p# y2 e& @(setq txt_tb (cons txt1 txt_tb)) # V& |1 z1 J: D$ l
)
# ^ i: o! ^: L2 n, w H" W(close fp)
: H; R% p A+ w; u8 W5 P3 j# X(setq txt_tb (reverse txt_tb))
- C+ z. u' S# Q. ]8 f4 ^) a(start_list "what");在列表框内显示词组内容 # G, A5 T4 x; _- w1 o
(mapcar 'add_list txt_tb) , ~9 V6 |1 A( u
(end_list) : x0 k1 ]! L( R3 p4 Q0 B1 ]
) ; progn
- P& `" s8 F1 }(progn
) F# m ^) O3 W; p% Z, i, [4 x! L(alert (strcat "文件" fname1 "不存在!")) ' I' i- S; s' X1 j
(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号 $ g2 g" S! ~' |# k
)
) ]# K8 g' \. W* q# H: w$ r1 N, i) ; if
% Q" q# Q5 t) H. D' L$ [3 M0 U; r) 8 k$ s7 O- }# S* C# p+ U; B7 o8 Z
; 主程序开始
5 f! `/ `7 X. c8 f9 a/ t(setq olderr *error*
7 b9 N; I: a7 c5 F7 {6 a9 ?*error* txterr 9 ?4 Q- a' K, z. r: |4 C6 c
oldcmd (getvar "cmdecho") + |5 d* N& Z/ m9 D* e# h+ v
)
+ `" H5 `4 h" _+ u(setvar "cmdecho" 0) ; 命令不回显 4 i0 K; v: G! P$ N4 P* j
(setq nn 9) ; 词组分类数 3 S* K2 \8 K# e! S
(init) ; 初始化
+ i3 Q8 k! G8 h% z; v(diag) ; 驱动对话框 # a# }& p& a2 u% x& J
(if (and ok txt)
- B' K h6 |; {0 `. P(progn ) Y/ S9 t' P3 Q$ D/ p0 j7 T" \
(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在 5 ]$ J: w7 g4 x5 O
(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值 , d, c9 _) i4 s" O' A) F
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ" & L- S+ @6 Z# u) X5 z
)
' z+ ]2 W0 U% i9 l8 T(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型 : \! K. X1 _0 P. v
)
; |! g# `8 N: ?+ v/ F9 q' s( A4 F(initget (+ 2 4));下面的输入值要求大于0 ' v" Y" l6 L: v" D. X" S
(setq ht (getreal "\n请输入字高<500>:"))
" y+ w" v5 M8 g- U, e8 H. A(if (not ht) (setq ht 500)) # E ~8 F2 Q# N, g9 g5 S9 ~& K
(setq pt (getpoint "\n请点取文字起点:")) , P: Q$ N( z9 q/ o* P, g% S- t, k
(command "text" pt ht 0 txt)
. H* V- r! Q6 r9 \# N$ N' l) / W7 l s8 z a1 w( h
) 4 o3 @2 [0 N! H' W: S! D& g
(setq *error* olderr);恢复原设置
: ~, A+ B7 G5 B/ W/ V5 B/ |(setvar "cmdecho" oldcmd)
" \- {, ~0 b9 x# B(princ)
; r6 `& S, D' i+ ?. g# Y* [) ) X' v: P. }+ n, L; f) _" _; v
// #txt.dcl
8 {' V' h: j1 @) y+ W! U// 供#txt.lsp调用 8 k p2 e$ I o. d3 \
filetext : dialog { // 对话框名称 . S' H: q' T9 z0 H
label = "常用词组"; // 对话框标识
5 ~8 V d% ^4 {8 h3 @: row {
5 p6 N+ s0 L0 t8 A, y" Z& @$ i: boxed_column { 8 n" v: p! T j3 F( Z. u* E3 g
label = " 索 引 ";
1 E/ L0 Q9 W4 ?: radio_button {
- O! [6 {8 e+ W% |$ r( {label = "常用术语"; // 多选一按钮 8 J5 @4 ^1 {' b: y+ B
key = "c1";
# V* t7 s1 z. {7 j+ rvalue = "1"; // 初始值为"1", 表示选中
. M3 ^# @. |/ t, P$ U}
2 K5 v, C9 ^0 b/ `) o. V: radio_button { 2 T5 d: Q: H G; V1 T- A5 ~; G: }' t
label = "图纸名称"; : V4 ~9 ~& j% _2 a/ L8 ?5 W
key = "c2";
& q+ E. m. O9 X8 `6 }} 3 N6 U1 @' H/ C
: radio_button { + l3 E7 `, S/ z7 h! @8 P
label = "房间名称";
% T" K5 @- s3 N8 b5 Akey = "c3"; ! A1 l( F6 M6 z' ]3 v
}
8 m, s* _0 x( x: radio_button { " o6 e/ y$ z8 W3 c: o3 H& v! T
label = "卫生器具";
" ^. `2 _& F9 |, Q' w* s" `' z- I5 Jkey = "c4";
, N) j" @0 w1 y/ J" [} g8 n* ]4 M* I& |2 K
: radio_button {
2 r; a- t, j, W% h0 flabel = "管材配件";
5 V3 j7 Y1 x2 } @key = "c5"; $ `- ?" t0 b- x, ~# E& X. a g9 u) J
}
9 G4 M% V3 w: j& h: v/ i1 T: radio_button { 8 t) E- n5 o Y7 J# W( ~1 w
label = "器材仪表";
8 j" g' f3 i/ c8 s) Z% Tkey = "c6";
M4 j" p/ V K1 e: ^2 }: [8 ]}
% I7 [) W: m5 x2 R: radio_button {
& Y' s. g: g3 A! }5 @7 {# h# Ylabel = "常用设备"; Y' C1 K& O1 w7 O" p$ Y
key = "c7"; % S [) g7 B; h D
} . J6 d* ]; q8 b8 [
: radio_button {
0 n7 I8 V( b! d- o& I2 Plabel = "构筑物";
' e. f7 G* k) l& [" |key = "c8";
& u( B8 i3 ^3 Z1 A _/ `8 x}
* ^( E( t6 g ^: radio_button { . l7 G6 s" ?! u$ k- q6 U& H6 v
label = "其它"; 7 v9 p7 t3 a' L' B5 D+ i0 l/ j
key = "c9"; % c% _$ c, R- d
} 2 l( @# M! P" m+ y! C* ]: a
} 1 q8 M* n( O, O8 T
: list_box { 1 L! a% \5 q/ `1 |
label = "词组内容"; 0 `& D! I: g0 x1 H/ V1 E" E
key = "what"; " ~. d: C. z; }+ R# W
height = 15;
$ u2 q, p) ]5 e+ F, i5 gwidth = 26;
, ]$ x4 p) J* P( p* U* @& @allow_accept = true; // 可双击鼠标选取 & c! o* n! q# U! I' C, B' ]& _
} 7 n# q, [4 j9 f, c& L
} - E# a. J# L, R: d
spacer_1; : l8 h4 p8 ^5 u
: edit_box {// 编辑框
; S3 R! s0 E4 H O4 z- O# Flabel = "所选词组:";
! c. f* ^& W# c+ N; Tkey = "sel_ok"; & h. w/ Y' F; i2 k2 r6 V8 c9 P
}
1 |. ?; X0 G/ i. Yspacer_1;// 增加间距 - {. f& u/ l( o; Z1 r; Y
ok_cancel;
2 A- R3 ]( L) `} |