摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 ) A0 S6 j9 B/ E- { _
一、引言
- h- J2 y+ o }- I0 U/ R 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。 ! \5 i5 P; Y9 e# `& \

& ]; F; l0 Q% P* }二、原理及方法 0 Z. K6 M; d7 S
AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
' C1 x6 `( m. H7 e/ B5 G 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。 2 y2 ~3 @# U) ^, v, c% a
三、程序使用方法 9 E: y ]( Z8 d% Y E
先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。 ( D! ~5 @1 e' v: d+ Z
然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
; q3 @ ~& `$ G) O" u在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。 1 e- }9 E+ G3 w& m' z$ K% k
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。 1 e1 D, d& ?: Z& `9 N
本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均调试通过。
; d; X4 f( T9 g/ Y(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
( ^5 w1 i* V; e' o. s& W- K; 定义错误处理子程序 7 F. t# a* T |1 h
(defun txterr(s)
8 z: `* }/ w. n; J! N(if (and (/= s "console break") . R1 O+ K0 i/ R: o
(/= s "Function cancelled") $ k5 W x8 F( g7 N
(/= s "quit / exit abort")
# B2 ~- U$ m# Y4 P7 d( j; L' y4 @)
0 o9 I5 a3 x& x9 m5 w$ J% h(princ (strcat "\nError:" s)) , c- ^% Z) l4 Q6 M7 x: V
)
, S I/ _, U; s: i+ B* B. e(if olderr (setq *error* olderr)); 恢复原系统设置 % h' w- N0 c- k6 K a9 ?; k, B* Q
(if oldcmd (setvar "cmdecho" oldcmd))
3 z: a% u. {- T: Q/ _7 s6 f$ R( V1 K! Y(princ) 6 H. n" T# d4 C( l/ C) ~4 ?
)
4 q3 i% Y6 k% X! _( f$ d; 对话框显示及驱动程序
- ^8 S9 n+ Q4 e(defun diag ( / i)
3 [" Y& V$ n8 H$ J/ A1 A/ D(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
4 M, O& |' s3 v4 }) |( M(progn % M8 S7 A3 x& i
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框
# L7 l% \, d% F; V/ }1 t: Z(progn start_list "what");将词组显示到列表框内
% z+ G. S; \9 e$ k% `2 z(mapcar 'add_list txt_tb
6 g& N, r, }1 h7 E) f [% a, n) - v. d# A$ R5 w. V" k$ [
(end_list)
8 b2 M0 ~7 @4 }(setq i 1)
) y. e8 S$ C L6 a- h(repeat nn;点取词组分类项后的操作
* f5 S3 U6 d, M& T8 ~(action_tile (strcat "c" (itoa i)) "(wr_txt)") + n2 G: K8 Y, M
(setq i (1+ i))
1 C+ S) C# Q T)
- T% V. P- g8 |4 p) v2 z(action_tile "what" "(setq i (atoi $value));选中词组 ) Z( p; ^; `( \8 ?
(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)" . }8 o* `' `+ y+ \3 k b
) 9 S% n4 l) I0 q" n$ J U) [
(action_tile "sel_ok" "(setq txt $value)") u: Z9 x, H% T
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)") 6 j- R. s7 V. l2 _! A
(action_tile "cancel" "(unload_dialog dcl_id)")
2 F) i) g' j* i- H# \* ^) ~(start_dialog)
% v, `5 s+ T+ @+ Q! M2 o) - x8 k" v" c& c% b7 `. Q
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
9 E1 I/ C7 s2 L/ l/ ^)
0 n- R4 A n0 Z1 W)
5 P3 W& L, ^' U9 p! I. C6 v% E9 F(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!") & {6 S1 f5 O& W! ^7 o- a
) 7 D6 Z6 _$ u/ y7 [+ C9 w! I
) " q; j2 Z7 ?# W( x( E, H
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
% b2 Q, ~" G [9 @(defun init( / fname fp txt1)
' w @5 C0 L% p/ h! `& D(setq fname (findfile "$txt1.dat")) " Y- G: C0 n: u7 w
(if (not fname) 7 P+ K+ Z6 M# o$ b+ t
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出
0 C+ O0 K! C4 g- c- M) 4 H# _; l0 w% H/ H# \
(setq fp (open fname "r")) 1 v; ?* [. }2 B# ?2 A4 ]
(setq txt_tb '())
. R# ?0 a1 d8 f- V(while (setq txt1 (read_line fp)) ! f( }0 c, f/ c
(setq txt_tb (cons txt1 txt_tb)) 7 W% H. d9 Y/ [. p" B- F
) 2 z- R! q; M2 r/ x" c) d$ S! }
(close fp) 9 w2 z: d* U# V
(setq txt_tb (reverse txt_tb))
% r. l+ T* v& f& _# Z(setq old_nn 1);记录索引号 - K2 \4 {! F9 Q. k% `9 O% E" Y
) 3 d$ h A: a( v' y1 w) X1 f5 O! m
; 更换列表框内词组显示内容
/ W0 {' ]1 S% U: c(defun wr_txt ( / fname fname1 fp txt1 i) 5 k- d% z( s0 q
(setq i 1) 6 l0 \9 f- `( k2 Q6 C
(while (<= i nn); 判别哪个词组项被点中
, }1 e$ t& Q" y: h(if (= (get_tile (strcat "c" (itoa i))) "1")
: ]; ?$ T! l# L- y2 s(setq fname1 (strcat "$txt" (itoa i) ".dat") }2 u# H1 [, I1 g
i nn $ q' Y& G; `% v$ n+ ?# b) a
)
- u$ v: r5 u* ?) : U$ O6 r5 q$ `1 f
(setq i (1+ i))
1 B" @# d$ R4 y% C( w9 {, C)
" Y) I/ u3 N" z" | _8 ?(if (setq fname (findfile fname1)); 查找文件是否存在
2 U* k4 x! V* u+ o(progn % ?' i+ V& D( X' k1 I4 K
(setq old_nn (atoi (substr fname1 5)));记录索引号
8 N5 M* u! o) V" _ V(setq fp (open fname "r")) 5 {6 X! i* i% a9 D
(setq txt_tb '())
6 q8 m5 a' p' X+ ?: W( M* ^(while (setq txt1 (read_line fp));依次读出各词组 * D& O2 _1 z2 D/ X- Q) _
(setq txt_tb (cons txt1 txt_tb)) ! t% S W) j/ ~
)
5 U# t& ^5 E1 `4 f(close fp)
! m2 V' e9 F6 I g, P: F1 `(setq txt_tb (reverse txt_tb))
3 Q( a# ] {2 G1 p$ [$ U2 A" T. W# ^# d(start_list "what");在列表框内显示词组内容
6 c6 x/ M! l. M( h(mapcar 'add_list txt_tb)
$ V) \( B6 W# ~2 f(end_list) 2 ?' E5 o! ^9 j9 Y7 S
) ; progn 4 L) C/ g1 W: h! S; E# H0 o
(progn 6 G$ |1 E1 q; w
(alert (strcat "文件" fname1 "不存在!"))
3 w' L! d9 D# A, |: e4 D7 j(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
! [" W8 Q( g7 |3 ?- C)
% q; I( n0 t8 k/ Z" {) ; if . G9 L1 w+ n8 g# u' u
)
1 F: U' ?1 L8 h, G, N$ B; 主程序开始
" n, K+ K6 F' F7 w6 K/ k(setq olderr *error* 8 C6 y1 N4 B0 T( @
*error* txterr
) `+ c; @( s5 Ioldcmd (getvar "cmdecho") 3 ]% _& X- g7 v
)
0 t& t. L0 }' D t8 U& J3 u) I' v(setvar "cmdecho" 0) ; 命令不回显 ' E. y4 [* ^' c" s& I* J
(setq nn 9) ; 词组分类数 : j: Z/ D9 z2 A8 |5 P+ N+ t8 a
(init) ; 初始化 ; b3 N; ~( F. A, [
(diag) ; 驱动对话框
, O# g, v' g- ]% q- r" C(if (and ok txt) - I& H1 p; O, u8 C# G; T. S$ d
(progn
' Z; V" h- i' ]# w* ]7 ^* S1 R(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在 2 k3 x( ^' `3 [" t- b' N
(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值
( }/ y7 e' y8 K/ ?$ L(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ" 8 p+ I% A1 Y2 X: d, V* H1 f
) + K$ i7 U, Z. i2 b7 X
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
/ p6 ~7 B, y3 A)
/ a, e* P8 y" [0 [(initget (+ 2 4));下面的输入值要求大于0 ! b" \9 T3 }5 ?/ j1 V J! W7 K7 Y* I5 Y. }
(setq ht (getreal "\n请输入字高<500>:")) % d$ m! k7 A2 o/ U- P% S
(if (not ht) (setq ht 500)) 3 Q! s% u4 S( _* d+ r- i
(setq pt (getpoint "\n请点取文字起点:"))
! l- i$ t) T0 W* D9 R w(command "text" pt ht 0 txt) " S$ d, G( q# q4 Y% A, [% [! W
) 3 A9 c" z( E3 w) @ z
) 4 X0 e6 \* ]& Y- B, ]# H" s, F( X
(setq *error* olderr);恢复原设置 . r! g, S2 e' P
(setvar "cmdecho" oldcmd) 6 n6 [4 K$ I, g9 n7 `) b: G/ S
(princ)
3 K1 j$ q) P- N)
# P& p4 V1 [# l; @7 W// #txt.dcl j5 N! _$ g# `: u% F. ?8 m
// 供#txt.lsp调用 , l; X3 o0 k& V) ?" c: J
filetext : dialog { // 对话框名称
. X9 F* O( e4 \$ Blabel = "常用词组"; // 对话框标识 T) m" }! e, m5 }
: row {
* ~3 Q. t* ^* c, b o1 i$ S, A: boxed_column {
) }" l v0 m& d( S! W- Klabel = " 索 引 ";
T5 n7 ]* E" T) [; z' z, _: radio_button {
4 m- m9 T2 j+ B$ Y8 A" x) O1 J2 Blabel = "常用术语"; // 多选一按钮
8 r$ V: {; D/ E7 R/ I8 I' Ukey = "c1";
' r, Y6 V- N, Z3 g& O; f' \6 tvalue = "1"; // 初始值为"1", 表示选中
2 p+ k6 a! y9 @} 4 j9 E* F" Y! N5 r
: radio_button {
: Z! Y" j9 S; f2 e) ?/ ilabel = "图纸名称";
; k+ t" ?6 p( z2 o1 wkey = "c2"; - S/ G9 l) S N. v+ Z$ l
} w+ `$ i% @9 g, m$ Q: L i
: radio_button {
3 `; N) p8 F: m/ h0 V8 ~$ o5 [6 Plabel = "房间名称"; - t- |# ^) @7 ]! [( F+ ]( U
key = "c3";
@6 |9 H/ f' w# P} ' h5 T9 n o O9 g! M; V1 U I$ G
: radio_button { + V( y/ g/ f, |7 a: C2 ^7 x
label = "卫生器具"; 9 a4 a( e1 m( h$ ?
key = "c4";
8 n+ ^( b& D4 ]+ M}
' y0 F) \6 e Y$ ?# j# ?: radio_button { 5 J- v- Z/ I r8 }, U6 Q
label = "管材配件"; 9 E# c/ q' B8 N G, ]$ {3 @
key = "c5";
# ]' K: M: t( y8 e. u} 6 _% i+ I, u/ E0 o2 }
: radio_button { ( L; c( v* }: k) M; }) ]; V* f, b
label = "器材仪表"; , |: s. Y. ~" T5 D$ S* w3 _
key = "c6"; ! Y: h; p& U8 x9 @! Q: g
}
' t6 t8 w3 w; \: radio_button { 9 ^( u" P! K; }7 j7 e0 ?5 |8 p
label = "常用设备";
2 P6 ?- e. Z. t! A k( r# Tkey = "c7"; ; X- q/ H: G |# n0 [% L
} 2 q" R9 u9 Z5 j2 ~: V2 T
: radio_button {
! i F" q9 A- j/ N# f6 V1 J; }) A% Xlabel = "构筑物"; * E4 H# y3 M5 A' P: L! Z, Q
key = "c8";
& x4 m1 y4 A k. k E} 5 @+ k H2 f' U) w1 f7 \* a
: radio_button { , v* v, z9 q9 P0 L7 o# _: W
label = "其它";
, P! j5 m8 V" A: f" z% ykey = "c9"; 2 w; O( ?5 F# l3 _7 J/ l
}
; Z. k3 l, l& D. f, v6 k( r} $ h" P" M6 M# u3 v: e$ r
: list_box { ( b5 T4 s l3 N) y: a/ j
label = "词组内容"; c9 s: C5 i1 Q& y5 C% j/ g0 T8 l
key = "what";
" S& o/ L3 M8 T! j: X8 v& o* `height = 15;
$ ^- q: f# h, ` n- z3 `2 pwidth = 26;
8 a, I; A. f* L7 S% o% Iallow_accept = true; // 可双击鼠标选取
: [/ ^. a5 g$ C; m) k8 [} : O" z( b( |! V, M
}
0 F- _) f) s0 y# n0 h8 |: Vspacer_1;
4 f1 {8 _: G W2 K0 c) E [: edit_box {// 编辑框
8 ?$ Q, b) n7 D; u& T4 Y' {label = "所选词组:";
$ b. C$ o4 W1 Y/ p4 ~% t+ okey = "sel_ok"; \5 ?; y6 T. M' O3 x
}
\" v' D ]* w( J- u& nspacer_1;// 增加间距
1 R: M! |; \4 \( Qok_cancel;
& k0 D1 _2 k- D( H4 L, A W} |