|
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 3 _0 N- v U' U5 a6 a2 O1 H
一、引言
( D1 n1 k0 ]' ^; v0 M( X 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。* p. E' c, t( S6 K% x9 X% e8 a
二、原理及方法
& c r1 Q# S9 N4 U: f% Q+ ~" Z. t# n$ f AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
! z4 _& C7 R; E! H" I5 y6 v2 m 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。1 K. a; j' X; | Q V7 _8 l* x
三、程序使用方法
7 ^5 Q3 \* B! V- Z先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
6 {+ X$ ^7 i+ k0 _然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
J$ ~ M6 A; F# U在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
$ o$ y: D; e/ {. y需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。) P- K& @8 D+ T8 B+ u. T( T3 z
本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。 0 X3 R6 |. x% ]2 o$ _* w5 Y
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) # q, d+ n* w4 e* ^
; 定义错误处理子程序
3 a7 W6 S( Z- b7 R3 N/ ]- I(defun txterr(s)
, Z0 X4 i6 l* o& Y; k(if (and (/= s "console break")
$ ]6 K6 m3 j1 \+ q8 u(/= s "Function cancelled")+ w4 W9 ]9 R: H# ^
(/= s "quit / exit abort") - t; R% J+ B! L, X
)
0 |# i: Y* K: z4 H5 @(princ (strcat "\nError:" s))
6 t/ {4 J( }- a2 h/ L8 l, L I). {9 _+ Z$ \5 l$ b/ p# {, }8 b
(if olderr (setq *error* olderr)); 恢复原系统设置7 Y4 S: D* ^1 t" C
(if oldcmd (setvar "cmdecho" oldcmd)): u/ y; r- l( W# c/ V$ y) ?$ v* [! w
(princ)
/ x& p$ l) W( U# g/ O)# e" K3 s" T; f# c# k$ w; M
; 对话框显示及驱动程序
; f/ `% Q& n. P' y4 [(defun diag ( / i)
+ M' _7 v2 k8 |" W2 i1 b% q(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
. c: J5 T& c. O9 { i7 M(progn8 u$ l, i; J, t1 o% N. |$ M* e' z
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框+ K% I2 c2 o6 ]9 O
(progn start_list "what");将词组显示到列表框内
b9 y+ X: t s. e7 U/ _(mapcar 'add_list txt_tb1 z0 @' i( L9 y, D
)
- V o Z) ^9 w4 |2 w* z+ ?(end_list)
; _2 ?) N( T0 |! H(setq i 1)
+ ?8 Z% K" {! F" t8 o(repeat nn;点取词组分类项后的操作
1 A! Z1 n$ o7 y) p2 x(action_tile (strcat "c" (itoa i)) "(wr_txt)"), Z% p, a, ]* v2 S5 a6 ?6 A
(setq i (1+ i))% m$ [# t+ \" _1 P# T( q* P
)8 R6 w K" u- F2 M3 U) T
(action_tile "what" "(setq i (atoi $value));选中词组
# [+ H+ `( u4 ~. B+ _% r8 D+ }(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
7 L8 t. H5 v, U; S)
4 E3 L5 A1 X$ K(action_tile "sel_ok" "(setq txt $value)")) U3 E2 M8 x' y
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")/ K; C4 z. ~! x" Z% @* P- y
(action_tile "cancel" "(unload_dialog dcl_id)")
3 T* A+ ?! _, l. e( S(start_dialog)
& T; @. v, u* l8 G4 J)
- e+ N. ]5 b6 A(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
% |! W; ]( d/ Z0 B' @; b# _9 ^$ |)
. {* x! N' B3 E) E5 I( n)$ P8 V, I4 _. B) V& l) w. M) d
(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")+ z# j) H# b, }% J( I
), t9 ~: V3 _- @& R3 ~ C
)
. s# `$ N. K# f M# b3 w9 y; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
s8 F$ j+ p+ E* _(defun init( / fname fp txt1)
- k7 J9 y7 b, M' T(setq fname (findfile "$txt1.dat")) T' \& \8 N7 _' ], n2 |
(if (not fname)
( ]: B" y* c9 N(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出
& m/ J. X& Q( Z. f8 b' z2 \): _, K O! t' [' H G, ], _
(setq fp (open fname "r"))
) }. m- c- \: v& N5 \(setq txt_tb '())
6 k, i0 K D1 ^( {(while (setq txt1 (read_line fp))% D8 c9 D, |/ C: B# z0 H6 A4 A
(setq txt_tb (cons txt1 txt_tb)) }' p" M9 J5 H
)7 h& ]9 D9 K* ~6 m2 c
(close fp)
% x; `' ^: W& ~" n5 p& D& j" _(setq txt_tb (reverse txt_tb)); W! m8 A0 S E, S4 l
(setq old_nn 1);记录索引号; a* x- m$ D7 n! S6 l
)7 q6 {' ^7 Q% [$ C
; 更换列表框内词组显示内容
* E/ z3 G7 Z3 }6 Q7 S: P0 L- i$ K(defun wr_txt ( / fname fname1 fp txt1 i)
+ O/ A( ]5 R/ ~+ V9 f(setq i 1)/ I/ U9 E. U* v, Z6 i
(while (<= i nn); 判别哪个词组项被点中8 S3 u: f* g' y7 Z1 }
(if (= (get_tile (strcat "c" (itoa i))) "1")" n* Z% {7 W9 e5 `9 G
(setq fname1 (strcat "$txt" (itoa i) ".dat")
- @: E/ u& ]" g: n0 d/ Pi nn
( g/ O4 z% g* M$ K: Z8 R)& `' P/ b: D. m2 v9 w; T
)0 S1 }6 v' _( x+ B { N7 n/ N
(setq i (1+ i))
# j) d% v, ^/ M/ I1 [)
' E! q! }) X9 z, {- _(if (setq fname (findfile fname1)); 查找文件是否存在5 [# n5 C0 p z
(progn
% c4 |: w6 ?) ^" P9 l(setq old_nn (atoi (substr fname1 5)));记录索引号' z; z1 j) J3 o0 i' s9 W2 O6 z
(setq fp (open fname "r"))- M2 Z% W$ Z# e
(setq txt_tb '())8 B" D/ b; }* a; W- j9 T5 k
(while (setq txt1 (read_line fp));依次读出各词组5 d+ A( O% m+ m$ r ? v
(setq txt_tb (cons txt1 txt_tb))
$ X2 g: X- P' _3 x)2 ? \0 A- i9 G8 m( a' L0 n
(close fp)- x/ R) {) R2 _& J2 C8 ^+ n: t
(setq txt_tb (reverse txt_tb))* k! ^7 w2 R" X, K+ } {
(start_list "what");在列表框内显示词组内容5 a8 B( U1 L) \# J" `2 S
(mapcar 'add_list txt_tb)" H a# `) L) ]8 W, B
(end_list)
5 ?% \( v- @2 t* J8 S) ; progn: F! z3 [' }+ f' `6 i
(progn
8 `% M" A8 Q0 T(alert (strcat "文件" fname1 "不存在!"))1 e5 C( S9 x" H6 _+ b
(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
7 x+ S P" B% G+ g. t)* Y$ @7 u" m& N
) ; if9 p, y5 _* o8 U! N. a+ @
)
6 t! K' S4 ~5 w( K8 Q; 主程序开始
2 B; ~% n" { g(setq olderr *error*
7 W: [2 Y0 J/ b- h9 w. b5 N*error* txterr
& e/ N% U9 P7 e3 p1 ^oldcmd (getvar "cmdecho")
) d" q$ a! c3 z7 P4 A& J)
+ q: v E" D8 e; A+ ?) i(setvar "cmdecho" 0) ; 命令不回显
3 @% G# v) v9 Y& r# g(setq nn 9) ; 词组分类数2 k1 Y. ~% m- v+ N
(init) ; 初始化
* B3 h* ]/ U& l, c0 h: X* v; k. }(diag) ; 驱动对话框9 ]% }0 Z1 Q0 T: s
(if (and ok txt)
" m8 X+ R) r4 n3 a& p9 x8 A1 o(progn% q, q, h1 l, ~+ O7 O5 u
(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在3 t2 q& L# a7 E
(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值: |( B/ w7 E- F8 l) N; P+ t: k. x& y
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ" ' _! V7 k) a4 ~ H3 j
)
, S1 }3 Z# }( T- N(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
2 B. B+ G# f: R7 |3 a- c4 ~7 U)* S/ Y; i; T: C2 t
(initget (+ 2 4));下面的输入值要求大于0
8 |0 V! n. Z, q& U5 W(setq ht (getreal "\n请输入字高<500>:"))0 I: q+ f$ O9 _6 N3 ~
(if (not ht) (setq ht 500))* ?! Q+ J" g3 a4 j
(setq pt (getpoint "\n请点取文字起点:"))
( ]9 H8 P/ O) H4 t0 G" z( F1 U(command "text" pt ht 0 txt)
, C9 ]/ A: l6 C- \)
2 S" g Z4 `, _8 s; L. u# I)
. `5 w& Y' o5 k5 H(setq *error* olderr);恢复原设置& u3 [+ n4 ^: s! ^" a
(setvar "cmdecho" oldcmd)$ ]4 Y. ?& y, m. e$ F
(princ)
O" }8 W1 B; T( q5 r9 x)
3 f6 `1 E* c6 E/ [// #txt.dcl ) p1 a9 g' o& n" s5 g: u: b: {
// 供#txt.lsp调用0 }5 Q# Z, h: \7 K2 ]9 W
filetext : dialog { // 对话框名称: y; h* i& l5 Y
label = "常用词组"; // 对话框标识
* u, w& c$ Y7 v" d# Z9 D [: row {
# f0 N7 Z) b6 H* W; o" K- b7 ]: boxed_column {
7 L& D2 p5 U) u4 [label = " 索 引 ";: S, ~' p* v- Z
: radio_button {7 N; D. [/ N+ M
label = "常用术语"; // 多选一按钮" `4 E$ \; O. b$ C
key = "c1";2 g- F( t# M) l% u) q- r
value = "1"; // 初始值为"1", 表示选中
* u% Z& C4 [ K3 x9 p9 U( K}
/ y) Z( i2 ~0 |+ k! v3 u$ ?, r# i: radio_button {# o8 v% F- [3 V, _. h$ u
label = "图纸名称";$ t& R$ X- P! L! U
key = "c2";0 _8 {5 f# h% I
}& y" g1 q# P" r- `- l
: radio_button {
! H" x- P- o' c' f7 Elabel = "房间名称";- i/ h3 I, }, Q
key = "c3";& Z% i, w5 Q" q$ n2 I, i1 U
}' L( J- ]6 }" c7 W
: radio_button {
& e/ S8 @6 W" o/ @label = "卫生器具";
" f7 V7 z, ^4 M% O7 J% dkey = "c4";
6 N- R: x. U6 q$ O7 K" Z& L$ C: L1 V}0 G. x+ Y: D) ]% O6 e
: radio_button {
. }. b" x( r. u0 a% elabel = "管材配件";
' W2 A6 R9 O0 |3 g8 @- U4 k' d* Mkey = "c5";5 K, T' _$ v, z- g4 \ [& ]
}
0 u0 l$ ]6 D& z: radio_button {( G2 @7 P# e+ Z4 q& y3 n
label = "器材仪表";
4 }% F8 M! H% m9 i, ]- O- d* _. qkey = "c6";
/ p" o1 O8 B- ^) G4 f8 E$ ?8 i2 g}
0 D# N/ D, u* \6 O: }: radio_button {
4 t! f! k/ @% I9 a- r0 Alabel = "常用设备";
. C$ ^! G2 M1 i" P- m+ `% b% _( Hkey = "c7";
$ r: p% M: C. |}! J. B; h1 A5 {2 J) Z
: radio_button {
c- y4 h" {5 L( J: _% \label = "构筑物";3 W9 M9 l' D! L2 q& b% J
key = "c8";
* z2 u, I3 o9 U& P' ~. B" S* B, t}
* ?- G$ b5 W( ^8 u. ~. C4 q: T' p: radio_button {$ ~0 ^: `9 L0 O
label = "其它";* s. C% ^/ l) M4 z: C: J
key = "c9";. c5 ~; u2 w6 t( y/ M
}
) P# m! p; o' d: i) e" E4 C# b}& B% B# f; Q( \( Z% M* q( |
: list_box {$ w% q `5 ^% t
label = "词组内容";7 r- g# L' y1 @) ^2 X4 L
key = "what";
! n" |" U/ p I# U4 V8 T- pheight = 15;9 D% ~- ]: g% {/ v( B
width = 26;
6 D) d- E) g/ Z. Y& uallow_accept = true; // 可双击鼠标选取3 F% U+ X, c0 ~# u) I4 d- o
}
1 X! m$ g- I$ J}
W: ^# q- f7 Z8 q" [% a1 X/ ?* A7 mspacer_1;
8 W5 d, L& {) P: edit_box {// 编辑框; N+ x! m* ?6 g2 \" z2 a
label = "所选词组:";
8 }( ?& p9 I. G4 Okey = "sel_ok";- t3 c# ?1 @9 y
}
8 H) y7 k0 P2 a, r$ E8 R ]spacer_1;// 增加间距: L8 p1 J1 V9 e) F' H( c
ok_cancel;
5 o" [9 `$ ]& D+ q' N2 s! h, S} |
|