摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
7 h D6 T) n8 ~5 L 一、引言
& b3 l9 H1 `- R6 e 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。 1 }. ~$ i: u% |
9 l* E. n/ x2 V; g& Q二、原理及方法
/ Z( z" M2 E# `9 b; B" N7 u9 @ AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
6 S0 L g6 r( k4 w, p2 t2 Z 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
. S+ s' X, b; ~$ U/ f8 ^8 c三、程序使用方法 3 v) T7 j5 {7 V0 _0 v
先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
% ]" g& f( j& |' [4 J然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。 & ]' W) v7 F+ W" d% S) r# L' r
在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。 , Q+ C" Q, W5 t7 w" ?3 y+ C
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。 ! D5 z4 q& f3 ~8 A- `0 Z/ u. P$ h
本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均调试通过。 0 S% i* Z8 b3 P" @6 V
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) 3 D, H x' f! o: b$ e) J
; 定义错误处理子程序
: M! W; ^/ V4 K% D4 h) B(defun txterr(s)
3 c$ r e# Z' I(if (and (/= s "console break")
% M' i7 j1 S7 n: H$ a( P(/= s "Function cancelled")
# ^* ~' B# h' v; q4 \6 k(/= s "quit / exit abort")
. B5 ?- K3 _6 E; k- n+ [7 d) ; M4 e: N; B1 J) C0 P2 X% j' N
(princ (strcat "\nError:" s))
# g# J/ @" U- B4 x)
" i% C8 M0 l S% l(if olderr (setq *error* olderr)); 恢复原系统设置 ( L6 r1 s9 q0 P( B
(if oldcmd (setvar "cmdecho" oldcmd))
! I2 i/ [: [- J# A" f: |(princ)
7 Z1 P- C2 i8 D; `9 r9 m6 j)
, l* t" X4 ~) l R" U% G+ I" |; 对话框显示及驱动程序
5 A) W+ d U8 p% F. _0 i6 b, `0 b(defun diag ( / i) / N5 X& }) Y9 O$ c0 B' O4 z9 j0 P
(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
0 M- o/ t' w% _ _) u0 J(progn
- c$ { H# ?2 S' u+ O- ^(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框 1 k. _( [5 U) | }" H
(progn start_list "what");将词组显示到列表框内
2 D9 I; M" e6 `(mapcar 'add_list txt_tb
! J! D2 H4 c+ a5 R& P+ N, \)
4 h) i/ M( b) I, m7 u(end_list)
. e$ ~/ p% c. G/ j(setq i 1) ; d8 g) ?* z9 ^' A# L
(repeat nn;点取词组分类项后的操作
7 _* j" p3 S. K$ a(action_tile (strcat "c" (itoa i)) "(wr_txt)") 3 ^5 s$ C. ?+ p2 X
(setq i (1+ i))
7 P ^7 h/ B3 ^7 Q7 x) " B# K! e5 z: m( n. y2 o4 t3 M
(action_tile "what" "(setq i (atoi $value));选中词组
/ ^- |- y) o5 [0 U, J) m, P/ Q(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
& c+ c" R5 p& X+ p+ L)
% O* t$ }8 l7 G2 a7 _5 p4 o$ o" \(action_tile "sel_ok" "(setq txt $value)")
- E* i$ _) m. v. E, r, s' K$ ^(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
) y, D) ` [0 G7 S: f1 l) X2 O# X(action_tile "cancel" "(unload_dialog dcl_id)") , W# t( n$ f' o
(start_dialog)
2 h4 Z F. R- _# m)
$ ~! S/ s4 w9 D# A- @; w9 ?(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
, l' E$ ]8 w! j5 G- Z. _% h)
5 O& T B3 F6 x* e' p) , _% R4 l( E" @4 P" ~& O1 |3 [
(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")
( c) O" ^0 x Q1 ^! y l)
0 l5 P" M" Q3 q) " \1 Y. t) I: v' z6 Q
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中 + B |6 ?: S7 d8 i1 j% c
(defun init( / fname fp txt1) ! ^% y8 ~% C" r1 i0 M! K& l
(setq fname (findfile "$txt1.dat")) ' G9 ]8 j5 Q5 \8 k& t
(if (not fname) 9 i9 t! q' L J) h* a p% z
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出 + [' } x! G8 N1 ^) N. y* V4 C
)
: }# e. S" k: N6 z& w4 v(setq fp (open fname "r")) # q7 i9 t; U! F# {/ {+ a
(setq txt_tb '())
- L5 j3 b( l! ?) W( u% o) U(while (setq txt1 (read_line fp)) 3 v: S3 v; B/ A2 a0 ]. P6 ?
(setq txt_tb (cons txt1 txt_tb)) 6 x+ t3 t8 `8 ?: t7 `' ?$ A
) - d# u$ o- `$ P! M
(close fp) ! Q7 k) o7 w) O2 Y: L) e t
(setq txt_tb (reverse txt_tb))
5 R7 D+ V0 F+ z(setq old_nn 1);记录索引号
/ H. b* e1 P& z1 S, ^)
: ~% ^& I: z+ p. b8 t) ^" W$ M; 更换列表框内词组显示内容 + ]- M( b! T& Y1 ]6 [
(defun wr_txt ( / fname fname1 fp txt1 i)
, F I. |) J+ Q" G6 U( }(setq i 1)
& b, @. e! o. R1 T$ {$ Z( f9 B(while (<= i nn); 判别哪个词组项被点中
" E, h S; q) L! n+ k! @# T& o8 \(if (= (get_tile (strcat "c" (itoa i))) "1") * ~1 f5 \1 f+ ~4 s7 L) ~6 ?% ]9 b
(setq fname1 (strcat "$txt" (itoa i) ".dat") 4 ^% X+ z$ d8 s) Z) c
i nn
% v' }3 Y; p5 \% S( s) ! V1 g& E$ c( T3 j8 |
) 4 o# K7 T; ^# u: A! C4 [
(setq i (1+ i)) ! P J% G3 b9 r1 w: h
) ) X1 T1 C& [, x; Y0 Z' U/ U
(if (setq fname (findfile fname1)); 查找文件是否存在
U9 _# [) Y5 v T9 D7 q o5 G(progn . V/ O6 J8 M3 f% n6 J4 E7 ]# ~
(setq old_nn (atoi (substr fname1 5)));记录索引号 * ~- d$ g' K% ]; N# }! ^$ |
(setq fp (open fname "r")) 5 f) p5 Q) Q' Z3 A
(setq txt_tb '()) ! A) K$ L; W0 }& V/ |( ^* }
(while (setq txt1 (read_line fp));依次读出各词组
$ t o. V, R! k' V P& b5 q(setq txt_tb (cons txt1 txt_tb))
% } R( I7 r1 L) J)
) s, R5 h9 E+ G: V(close fp) 6 A9 K- Y3 d. L- A" _4 B! a
(setq txt_tb (reverse txt_tb))
- q x M8 [% ]' J(start_list "what");在列表框内显示词组内容 * Y9 P# f2 D$ Z9 G
(mapcar 'add_list txt_tb)
! h0 y& v7 T4 z) Q+ g8 V' T(end_list)
8 L% q; Y; _; I& D$ p ~) ; progn
4 ?; _ [; w) Y, O& S(progn & Q; q& W/ @; `% a$ D
(alert (strcat "文件" fname1 "不存在!"))
' r! N9 [/ C4 L+ [" W! w* V(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
0 A l+ T5 _- R; q. K( D)
, @- U& ~# C- G0 R% R) ; if
) d# ~' p; b: ]- O* o)
9 S v6 C' j% H4 b, O; 主程序开始
. W! V1 |; ?2 f" a" X(setq olderr *error*
& D4 W& V* {9 U+ ?9 b+ S*error* txterr ! O1 B0 ~3 g* M3 o) D5 J6 \; S
oldcmd (getvar "cmdecho")
/ U6 r* J. v' N# C0 z* S) 5 d' P6 I& D5 I- C! z3 d, j
(setvar "cmdecho" 0) ; 命令不回显
. I" \" H) I$ Z. r$ F! M(setq nn 9) ; 词组分类数
( F, K+ f& Y5 B7 E0 N(init) ; 初始化 ; z, ?5 K4 \6 n9 G2 `
(diag) ; 驱动对话框 # f z# F# r( O; h5 e2 D
(if (and ok txt)
0 N, f" L+ S* z9 w! ?4 i(progn
2 u( F/ |; w6 W, J1 u; u8 ^(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
: Q* i6 _" q- j, L2 Q7 J$ J1 n* x(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值 0 P8 \ \5 u" v5 F
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ" * N' d g: h7 A% e
) 7 U1 Q ^( z# P& H. p: |
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型 * d9 z' p6 t. O/ o9 h) P. l
)
+ e( w* V8 { i+ {2 K4 ~(initget (+ 2 4));下面的输入值要求大于0
& d/ ?! s6 j8 u g(setq ht (getreal "\n请输入字高<500>:")) 3 p( X$ k4 y5 ^8 Z) v" C
(if (not ht) (setq ht 500))
9 C* u0 @/ B$ |& Z P {& f(setq pt (getpoint "\n请点取文字起点:"))
/ \4 c/ g+ @" T9 P3 o6 Y# q- B(command "text" pt ht 0 txt) + P- G8 s" o' o2 i. `
)
0 R6 m) E \ d7 ^! ^& ])
) U& z% E( z! v1 l" Z(setq *error* olderr);恢复原设置 + A9 q( l! H2 B
(setvar "cmdecho" oldcmd) 8 S# D; r! _! |! z
(princ) s4 ?( W! S: D0 | {6 S/ k/ _
)
7 w9 X3 p5 X) ?! S6 g* Q1 H T: {// #txt.dcl
8 L1 l) K( |$ X: Y8 N// 供#txt.lsp调用
% K1 ?8 l: S y7 ]' }; H" J- }filetext : dialog { // 对话框名称 8 T) T0 r" U4 X P6 P
label = "常用词组"; // 对话框标识
( ^) A/ R2 F% f7 s! O: row {
* w$ e! R3 I* Q; G' g7 R! m: boxed_column { - j, n' M- e, A
label = " 索 引 ";
! j! Q% f. x# M% Z: radio_button { 8 x9 v: I- B# [9 h8 A% |
label = "常用术语"; // 多选一按钮
* L6 ~, ?' I; w/ J0 m3 ukey = "c1";
) E) _ v) M5 a5 l1 Svalue = "1"; // 初始值为"1", 表示选中 - R( n7 D# L, f* q+ C
} 9 ^3 Z- L4 b/ n5 b! P/ d3 ~; k4 T0 F
: radio_button { ( H/ g/ D4 k% J$ F7 e
label = "图纸名称";
; Z# `& F" t4 Zkey = "c2"; * u/ f/ \4 S& d
}
; J- p& g# q% c5 n6 j: radio_button { * Q, J1 M+ N- @, \3 L4 \& }; {1 a5 b' H
label = "房间名称"; * N+ |- h9 L/ A4 O9 E0 ]! m9 {* l# D
key = "c3"; & d# C/ M* O- c$ O6 z% X
}
: ?/ F& v) l4 z- l: radio_button { * [! s1 v2 F$ ^# k6 Q& Z# H- I$ e
label = "卫生器具"; ' A0 E8 _+ [5 F% }3 B
key = "c4";
% Q6 A/ @; t0 x, P/ `$ C# _} ( T Z; l! q8 x1 T
: radio_button {
- v. A: A+ M) X% l0 r$ Rlabel = "管材配件";
4 }, g i: W- p( D9 ?) U# z: wkey = "c5";
/ e/ o9 Y2 N. m3 q; X} # H7 W: P' G4 @% j- I
: radio_button { 7 {8 a! ]8 E- M/ h* J0 ]
label = "器材仪表";
' J+ M# N# e3 Bkey = "c6"; # C4 z! {% A1 H; m. |; q
} ! b% v4 @3 x r `+ ?3 b! N
: radio_button {
8 J+ F+ W) e* E( `label = "常用设备";
* P- g' M* O5 d4 q: b+ s: t; bkey = "c7";
1 b7 \1 U+ i4 s3 [- ?} ; O2 i2 F8 M( d5 G
: radio_button { - V @6 `- P5 X: l, F, g* A
label = "构筑物";
4 T% _ i1 z( b/ v: s5 v+ G; n) z2 nkey = "c8";
+ \7 x v; E& B8 R) l2 o2 Q} ( s# J3 F( ^! I( i+ ]
: radio_button { ' q0 E1 S* o" q: o
label = "其它";
$ X+ W# M4 \6 ]7 H; C1 M1 l9 Ikey = "c9";
, B* H7 _: O8 N: k# R} 4 l# Z$ P* P9 B4 T0 p
} 8 O* \/ L! z7 q3 Z, ?
: list_box {
+ P- o0 O' Y0 ]4 [$ ?label = "词组内容";
/ m- R& ]' P* _. m' akey = "what"; . `8 v2 A$ T$ G
height = 15;
6 _0 J8 W( T6 z0 qwidth = 26; 6 ^2 Z5 m# c3 \$ ~2 _/ s
allow_accept = true; // 可双击鼠标选取
7 ~& S, h5 g- a% l' E& X% w}
9 O7 U2 e( }# ?8 t$ X) H}
0 ]( o' m8 J3 l8 Q6 Y3 W Espacer_1;
8 M/ c* E, d; w5 n* ^: edit_box {// 编辑框
! N( t2 G. c+ Y/ [, |. J1 nlabel = "所选词组:"; 7 d1 O" r* @9 d4 U% D7 d: w6 U: J
key = "sel_ok";
. N2 [$ Z7 z1 m. n( X} : Y, r7 c. I( H% U- v
spacer_1;// 增加间距
7 C9 t2 U; \# Y. d' ^* |% P' Aok_cancel; 2 X! L8 p; I9 g+ \( o
} |