摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
0 B/ x: n/ ]; O7 ^9 W2 }0 { 一、引言
S* S6 V8 l: U6 ~3 o: m 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
2 l, |* x [2 [" t) `
: d L5 r/ P. k' s# N" Q) W* Q* P二、原理及方法 ' a2 O7 m3 p8 s, v3 @
AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。 $ A6 Q1 e5 Y, C& q2 W) ^9 `: R
左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。 - K& Y: E6 f* Q4 v5 J/ D
三、程序使用方法
& R! r7 ?6 ]9 S6 P+ |先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
. H( X5 g9 I! o& J/ y9 R1 o然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
- h9 m* U+ B2 t' s) x在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。 & z/ `& M( Z; b: G. d
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。 1 F- j/ M" w# ?
本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均调试通过。
- i+ D% o" Y7 @% Z(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
* m: N% J0 U! m! ?" D0 b; 定义错误处理子程序 " {" S1 T) ~/ _
(defun txterr(s)
/ o" O% M2 I3 L6 |$ c6 \* o% h& P(if (and (/= s "console break") ) t4 o3 I8 a+ b) r' x) E
(/= s "Function cancelled")
) X( U {5 C9 j. |. {6 w$ r(/= s "quit / exit abort")
. z# ~% U* R# q. i) E) * v9 X J& K& D0 r0 @- D1 _/ r
(princ (strcat "\nError:" s)) ; }2 d; G7 V6 j" A6 j Z
) 2 E2 f, i# D6 X, f( O. l
(if olderr (setq *error* olderr)); 恢复原系统设置
2 V O; a8 F! s1 ], r/ S; O(if oldcmd (setvar "cmdecho" oldcmd)) 1 [$ R8 e$ h- J$ L4 I% U
(princ) ; R$ i( E' G: v1 z8 K
) 2 ^- Y8 Z6 l! S
; 对话框显示及驱动程序
# ?. @4 T. C" j w0 T(defun diag ( / i) ( L% z% \# j4 o. h% ^9 {
(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
) u% F6 |2 F3 T(progn ' [0 k9 A4 }( l$ {" l) i
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框 4 p5 R* H- `" P' d4 G0 i+ i
(progn start_list "what");将词组显示到列表框内 + M% Q7 h5 l6 _' ?$ q8 P
(mapcar 'add_list txt_tb
# X$ i4 g" e& [1 Y) % h( X! S% X" e! ]; b
(end_list) e$ c( e4 {" B
(setq i 1)
5 p% Z$ ?2 C* h(repeat nn;点取词组分类项后的操作 , D' p$ y7 h4 ]) g4 `
(action_tile (strcat "c" (itoa i)) "(wr_txt)")
9 H1 B1 [5 y( h$ V. \: L(setq i (1+ i)) ! }: t7 d' P3 R; I( q
) ; n- O; J$ g% Z
(action_tile "what" "(setq i (atoi $value));选中词组
$ x( U6 U: Q; n6 O9 F- Z. I' ](setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
, }. O8 r/ V8 O; p) k)
5 a0 w' b: _# u8 p(action_tile "sel_ok" "(setq txt $value)") : l- m7 I4 @0 Q
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
; W! ^ T- ^5 P k(action_tile "cancel" "(unload_dialog dcl_id)") / E2 X* z) f/ V$ G! D. }5 a$ D
(start_dialog) 7 ]1 s# ~% z n0 K' Y/ @
) 1 ~3 L! M' N2 T
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
' `: ~; K* r4 [4 y% y; c)
* v4 s9 z( w6 _) * f- A, m8 c0 d) C+ b" P
(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")
6 `. N) G D5 n0 ?) + x0 ?4 [: N: s
) ' z& n! U) J0 f- v: a
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
, I3 x h+ `- J: Q! I; s(defun init( / fname fp txt1) 5 @5 r4 o! M. x1 v
(setq fname (findfile "$txt1.dat"))
+ t; L9 Y: A, \% r; }(if (not fname) + n7 s+ R: l3 I2 ?* X
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出 # @1 t) M0 A8 x$ F
) - ^0 \6 b; v' S/ G
(setq fp (open fname "r"))
* C! J2 |8 u( `) G) I* j- `" _1 f# j0 ^(setq txt_tb '()) , \( D% g N# y1 N, y4 U) d: c/ P7 v
(while (setq txt1 (read_line fp))
b& I+ M2 X7 ^+ w( z(setq txt_tb (cons txt1 txt_tb))
- i' b! p6 @4 h' g& T) . V3 z0 }9 x% N5 A4 m
(close fp) 9 |: L9 U- v& [4 a9 u0 e* R& w+ F
(setq txt_tb (reverse txt_tb)) 7 S) f* b$ x6 h
(setq old_nn 1);记录索引号
1 e9 d' ^3 I2 \/ d( I) - g, w; T: H/ u/ R! ^) t/ L
; 更换列表框内词组显示内容
! n3 G# h# X8 P: g(defun wr_txt ( / fname fname1 fp txt1 i)
8 s# K4 F/ r8 u L(setq i 1)
9 R# r) @ b+ \. }' ^(while (<= i nn); 判别哪个词组项被点中 5 z" T; s b1 \/ ?; z8 x
(if (= (get_tile (strcat "c" (itoa i))) "1")
2 X2 E! N' E7 P# N(setq fname1 (strcat "$txt" (itoa i) ".dat")
6 F2 {6 _. J2 ~' d) l$ ci nn
( r0 ^7 d2 r* N( N- S ?0 G) 5 C7 r* g2 ]+ f
)
) I6 C, ~2 \& u$ T4 |. I8 B(setq i (1+ i))
7 K- B6 ?: v; s3 [% Q)
0 F$ B0 L1 Y7 F, o1 ?( L( C(if (setq fname (findfile fname1)); 查找文件是否存在
7 {. D7 M$ v, J* p' Z( \5 v$ y(progn
; u/ A7 h2 R; h" H j0 o(setq old_nn (atoi (substr fname1 5)));记录索引号 ) j" f. Q! \ g3 [
(setq fp (open fname "r")) ( A6 [0 [0 F, X; A$ }) t
(setq txt_tb '()) 0 L5 N( c( |; K2 Q/ w) n, V2 O$ A
(while (setq txt1 (read_line fp));依次读出各词组
0 R% B3 M( e9 q! e0 X(setq txt_tb (cons txt1 txt_tb)) % J2 l# q! A" H
) $ n) u0 J2 y& e# I M
(close fp)
6 R' ^, r4 Q1 [5 ~(setq txt_tb (reverse txt_tb)) ( t" ?0 Y6 v$ C1 f" B: x& V
(start_list "what");在列表框内显示词组内容
7 o# O8 q$ {3 b4 n) I(mapcar 'add_list txt_tb)
8 M7 c2 w2 L# `& ~(end_list) 3 K1 H" l5 c+ v9 ^# c" s+ _
) ; progn ; n& \6 G9 C1 G% k% q
(progn
2 J: ^2 ?* H8 a(alert (strcat "文件" fname1 "不存在!"))
- d6 d. A, ?+ |) F/ Q0 g3 B: J(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号 ! w T! K( s/ T+ V( J
) : J) L" o0 g3 e0 V
) ; if ) _: s6 \5 ]) y% d" r
)
& u- E3 c" o: |: x; w$ r- {; 主程序开始 " H; A" y: G' G9 g3 @* {
(setq olderr *error* * _5 Z) H! F& |" m2 Z
*error* txterr
3 n: x2 V9 e8 \0 Roldcmd (getvar "cmdecho")
# I# N1 u, y5 N)
/ N8 T, c0 I# X- B8 y" h(setvar "cmdecho" 0) ; 命令不回显
$ V6 ^) q% L" L; b(setq nn 9) ; 词组分类数 " a4 R: `$ h# K( C5 m
(init) ; 初始化
' K* y" g x4 c! V$ ?(diag) ; 驱动对话框 3 u! `% r, x, S7 c" t8 I
(if (and ok txt)
5 E4 P. [9 Q5 u(progn
: W& R; h! ?, N(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
( w) H2 C5 {9 F& P$ N! ?+ F(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值
3 o- B# H8 T; h8 s% j7 V: f(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"
6 D1 D! E8 C9 n4 t4 w) C& Z4 i% c)
s |. @' |! u) Z(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
8 _: |+ J1 C, T! F; ~$ r)
! Y' @6 t6 u! c: f! L(initget (+ 2 4));下面的输入值要求大于0
4 R0 C n5 i8 Q, F(setq ht (getreal "\n请输入字高<500>:")) / i( Z! C0 K" E/ B% |" g
(if (not ht) (setq ht 500)) A l* ?3 h* w; U3 c. K$ x
(setq pt (getpoint "\n请点取文字起点:"))
) R6 h- z; y9 }( W(command "text" pt ht 0 txt) 0 M n. B* X/ W8 @/ ~
)
6 Y! j$ b x% ~5 j x8 ?)
" D9 z' p: [ P9 R& F5 A) |(setq *error* olderr);恢复原设置 - Z3 p' Y0 F# Z6 @; I$ o& y+ V, E
(setvar "cmdecho" oldcmd)
: \, A, X' @9 F7 i' H6 M; G(princ)
' B& S4 y. y& j! d* ?2 _- J)
4 a' r0 n! {. u z2 D! W$ X8 u% j$ j// #txt.dcl 2 ^- T1 g0 J$ T3 e% h
// 供#txt.lsp调用 $ ` x; K; B- U5 N
filetext : dialog { // 对话框名称 9 l- z& N' j. H* S- H k
label = "常用词组"; // 对话框标识
+ V" l4 S4 P, x7 [" U1 L: row {
( I9 O0 i3 _4 Y# y: boxed_column { $ n8 F/ t9 F! a+ E8 v
label = " 索 引 "; & \6 O' m0 F' w& d2 ?
: radio_button {
9 k3 \4 K( Q0 F% L8 _9 |/ P0 G: Plabel = "常用术语"; // 多选一按钮 2 S( O, W) r* ?
key = "c1"; 2 |' |* e5 v ~4 W4 j
value = "1"; // 初始值为"1", 表示选中 ' F& }$ ^" C |* @% b
} + O- A1 t" F# Y; r# x- ^
: radio_button {
6 Y. |# v8 L9 l, ]) L8 Qlabel = "图纸名称"; . z! p% B$ a9 ^2 f
key = "c2"; & ~3 s; [6 e8 j, k7 r
}
% B+ n6 B/ r% g2 I2 ^; i- [7 k R7 U: radio_button {
* o2 m; k% a0 c* Z; plabel = "房间名称"; 7 Y( }1 W7 V" |5 k6 r: u
key = "c3";
3 A9 _6 s f+ W6 Z3 ~} * e& J' w8 R; N5 s% e; E. z
: radio_button {
+ k; X' \) S2 c$ {% \label = "卫生器具";
m. U" P( d8 g5 hkey = "c4"; % p- u- `5 D4 _- Q' i
}
2 Z1 d1 U, X" f. [: radio_button { ' W6 b5 V4 x6 @$ n$ W/ P, v
label = "管材配件";
3 k0 ?0 q7 [' lkey = "c5"; ! o. y$ [" R; ~. y' I
} 1 Y! I& J6 ^( G
: radio_button {
& ]: s: d4 P0 s- m) slabel = "器材仪表"; , Q7 Q# ~( B3 }
key = "c6";
+ W! i, s9 C4 t" T0 u8 E. ~}
# T- ?7 Z+ y) q* J* m: radio_button {
+ b9 h% H+ R& rlabel = "常用设备";
1 r5 P+ P- e( D' W- Xkey = "c7";
2 W( x, t# ~/ {} * S% J7 Y5 O! U/ e. v& a
: radio_button { 4 ]8 o2 L7 r% U8 I
label = "构筑物";
, h- c# I! V. T: Mkey = "c8";
, u0 ] T+ [9 C, w# S9 U} ' D0 P% f' r( B
: radio_button {
/ w O6 {: K' D; N6 G( Dlabel = "其它"; 5 v: t; A4 A* h3 K5 |
key = "c9";
9 l9 }; E4 j$ d0 ~3 ], f} - g C) \9 \# c( s* b9 X3 J
}
$ f' l' q$ q) z* k: list_box {
7 a2 N, |7 J( y: y+ Glabel = "词组内容";
) } ~6 U7 p; V& V8 g, \- K/ okey = "what";
6 J( ~0 Q% j# ]+ i, p/ iheight = 15;
& F V- Q, K. r' ^" C% }width = 26;
+ x1 q, m' ]/ hallow_accept = true; // 可双击鼠标选取
4 B- C% y1 y8 C) C% m- ~3 y5 X}
+ y0 k6 |+ L( r9 x$ ]/ f& ~, V" u} 0 l7 i" P& {1 {+ `
spacer_1;
7 ^+ u0 z" Q# Z Z8 [) ~3 b _: edit_box {// 编辑框 1 F X; T# Q" |2 V4 }4 g, O) T# C
label = "所选词组:";
7 z. b2 A% P }8 M4 ]4 U, [2 p, dkey = "sel_ok";
& ^ ]# D+ Q4 G1 Z} 4 y6 }* P# P1 w' D2 Q" ?" l
spacer_1;// 增加间距 6 D e: i) B$ r1 i; b
ok_cancel;
$ a; |' @2 H8 a2 o) N! T8 V5 s' k} |