|
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
3 ]0 Q5 `( B9 {一、引言 " u F/ U* o* s6 }6 T' R
汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。 i' _( ~9 M! `: J4 w/ p/ Q
二、原理及方法
! I8 f* F, Y: s$ ]+ H AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
/ j' z! M/ [+ N) D2 G% m 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
$ Z9 [4 g9 F/ S {4 c$ M9 Q c7 f三、程序使用方法 0 I6 ~+ s" `/ v2 @7 ^$ l
先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
/ B/ t% X$ T, D6 j3 g$ i! f# m然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
8 w1 O4 `' |; U在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
$ l! X$ o- h* x6 r# v需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。% T% D; g% ]5 ?; g
本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。
5 q" Q S) M) v) R0 w9 q% t M; j2 Y(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) 4 }5 A& ~, j; a& q) Z) n1 z
; 定义错误处理子程序
: h# S/ Z& B; h o2 A(defun txterr(s)
1 l A; X# w# `(if (and (/= s "console break")
$ p1 t3 D7 p9 }" l7 Y5 E(/= s "Function cancelled")! x" x. f% c+ {. f
(/= s "quit / exit abort") 9 T$ b3 p& c/ Z c# x4 ^3 H: q9 L
)
; @: K! v* k/ W9 t; K; ^5 U(princ (strcat "\nError:" s))- u* Z- o+ l4 H; j) W# Q
)* w4 z. [" v$ B- z3 D
(if olderr (setq *error* olderr)); 恢复原系统设置. i$ v4 z' @8 l9 v
(if oldcmd (setvar "cmdecho" oldcmd))3 ^4 l$ i6 {) N4 k
(princ)
) S4 O/ M. {' })
* G0 s% A2 K' a$ r, L% C3 y; |6 q; 对话框显示及驱动程序
- l+ K+ e( L l {" l(defun diag ( / i)% o/ H2 a" a( X5 c" h2 C
(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件2 A' c4 R! i4 s+ K
(progn$ _# K* m& K3 Y$ a$ a
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框
7 N* B$ f7 t" @) Y9 x(progn start_list "what");将词组显示到列表框内 a! K0 |5 m) T3 |
(mapcar 'add_list txt_tb8 @2 Z7 G, C8 }
)4 w0 Q# n2 p- B6 p" t: H" u6 ~) \2 L
(end_list)8 c# H# S- S$ I6 @$ ?5 k1 d) z8 C
(setq i 1)! l8 Y( o* Z8 j% `# [
(repeat nn;点取词组分类项后的操作 {8 J3 n# E* \
(action_tile (strcat "c" (itoa i)) "(wr_txt)")# a; y7 C0 k" O) F+ |$ T
(setq i (1+ i))
) ~7 R( s# V8 n$ @1 b/ z O)3 }% ?, ^5 ^: ~7 }- x- V0 j; b! J' P
(action_tile "what" "(setq i (atoi $value));选中词组
9 A& U' h; Y& B! z: C(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)" x: w# a. M7 b) y/ r
)" I9 N& r# u# y) a$ U
(action_tile "sel_ok" "(setq txt $value)")
* A) u1 H! s- t5 q(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")2 j* U$ \7 P$ S0 Y
(action_tile "cancel" "(unload_dialog dcl_id)")
- b( O. I$ T6 w6 G$ L1 m(start_dialog)( @- ^1 N+ r9 h. U3 d) y) S( r
)
1 j( p- Y' h! K2 }(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
* }$ |& H0 k. F3 \3 t6 a" @)
5 D+ q5 }( w7 P! D' N! R0 i)
" }7 J, A Q/ c) D. X% }; i(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")0 t2 @" m5 w3 q3 Q3 V$ N) d. o
)( V4 d& X4 L. A4 }' {* h
)2 ^+ J# G) R' j! U
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
1 \9 Q2 I# i& \$ {8 q(defun init( / fname fp txt1)
/ Y+ m$ `6 v+ V. ]) l9 Y(setq fname (findfile "$txt1.dat")), Z8 Z Y& t8 I& Z
(if (not fname)2 G0 J, [& S* ]6 a9 U& o$ V+ l
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出2 Q1 j# Z% I% }" L9 X8 X% U" {
)
2 U6 M5 E% m& Y, l(setq fp (open fname "r"))
. j0 `) Y3 |9 x0 I$ T6 X" f(setq txt_tb '()): b o! m P# u: C3 h1 l' {
(while (setq txt1 (read_line fp))8 Q$ o2 q& K! e! p
(setq txt_tb (cons txt1 txt_tb))
: y- t y3 ~5 g0 O)$ Z% O; [3 L4 j3 B
(close fp)/ s# E5 A$ [, ~0 ?- x
(setq txt_tb (reverse txt_tb))$ R+ {9 x. V$ u7 `6 V; Q3 }) G
(setq old_nn 1);记录索引号
7 r; y$ I. h6 T)2 c- l: c( ]1 w' B3 e d& K
; 更换列表框内词组显示内容
. o+ M0 }9 T; B. |(defun wr_txt ( / fname fname1 fp txt1 i)# ]) ]- W& {- R r, o8 {' q
(setq i 1)2 ^, T* P* J( G
(while (<= i nn); 判别哪个词组项被点中
, _, k9 l5 y- S+ |" L(if (= (get_tile (strcat "c" (itoa i))) "1")2 E. f3 T/ J, `! s4 e" j
(setq fname1 (strcat "$txt" (itoa i) ".dat")
; l" C; Q2 D4 z' E1 Pi nn6 v, m0 e" i1 `
): ^& {" V+ h/ d. |3 B
)
# C8 s1 D) L" h7 G) T) {(setq i (1+ i))
) G+ ?" Q2 O+ Z- h. B4 x)
, E9 x2 ]- Z$ `) ~# V& Z9 p% k' U7 I(if (setq fname (findfile fname1)); 查找文件是否存在$ h) m4 S! ?* `$ w- b2 z
(progn$ { b( G6 j/ q
(setq old_nn (atoi (substr fname1 5)));记录索引号
7 }. t5 o# q# \4 r: B( p$ z% c(setq fp (open fname "r"))
% q5 S, b0 E( \, W(setq txt_tb '())3 D' X$ G; \* z
(while (setq txt1 (read_line fp));依次读出各词组
& `+ W, D: J+ D J(setq txt_tb (cons txt1 txt_tb))
4 a8 H* D+ Z$ k$ e)
K1 W- [& H" C(close fp)6 \8 F+ D j9 v5 _3 k% I
(setq txt_tb (reverse txt_tb))- v; [' W# P4 e* o# Q z
(start_list "what");在列表框内显示词组内容
: A* d" H; i" ^. C- s(mapcar 'add_list txt_tb)
2 z) {+ k* L8 u: l* Z& S# z7 d(end_list)8 `, U, ]' S: h$ h
) ; progn" [4 k9 H% k- v6 c5 y
(progn
0 V# |; i! Y) v# k8 v(alert (strcat "文件" fname1 "不存在!"))
2 L% f' r) p/ `" `: [7 ?(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
3 ~" X- a# S: ~: H, i)( e& k9 R% o, N
) ; if
$ K- P4 `$ ^/ ~7 u% i$ c6 k# n: `( l)! \7 m- I2 @8 t4 P( F) G4 d* d$ S
; 主程序开始
; G' `* q( D& O6 y# l6 i* \(setq olderr *error*
) w D) Q8 V( l% V) L*error* txterr
7 R; g0 G$ ~* t6 Holdcmd (getvar "cmdecho") & T/ t3 O5 J- Z$ R' z6 ]3 D
)
; ?" b: B. }1 S8 ~- f(setvar "cmdecho" 0) ; 命令不回显/ g- l# b2 z9 B7 R$ w/ B
(setq nn 9) ; 词组分类数
4 @1 @8 S; s7 d# N5 Z' W(init) ; 初始化; c; z5 [5 p; g5 B- R; ]
(diag) ; 驱动对话框3 b6 D9 E9 [. A* C! D& |" h
(if (and ok txt)
8 c/ h; Q" z6 J, O3 ](progn
6 P8 g; n# c* b' z- ](if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
- C* ~& _- z6 D. h(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值7 |5 e3 V* u) q z- z
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ" 6 I; F y3 @4 q7 n& \( \1 N* U
)
' Z. e5 n0 l4 N(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
" }8 I; b8 A! K)4 u: j1 M8 b, O8 d8 W
(initget (+ 2 4));下面的输入值要求大于0
0 d6 p" I3 x0 C. c8 u(setq ht (getreal "\n请输入字高<500>:")): K+ Y. c7 i' s3 i2 e7 o, j
(if (not ht) (setq ht 500))+ |: f! Z3 y+ @" p- _# O3 ]- q
(setq pt (getpoint "\n请点取文字起点:"))
+ Y6 v- k f& H: t5 I/ H( t(command "text" pt ht 0 txt)8 N; w0 `$ `. m* B; ?! v1 T0 |
)
0 [4 h6 r6 z* l; o" Z* o4 i4 ~)& k9 ?6 ]9 p# I! X7 e' [3 N+ c
(setq *error* olderr);恢复原设置
# L+ I; ^' h7 U% L5 k(setvar "cmdecho" oldcmd)
* { T; X# ?/ `4 ]: R5 P(princ)
6 e. c1 r+ T- l r$ b3 b% N)
# n; q n A5 d5 B! x+ ?* s// #txt.dcl ; p$ o: c }$ _; X
// 供#txt.lsp调用& `# F0 a; y; N
filetext : dialog { // 对话框名称
: s" T$ F; D9 Ilabel = "常用词组"; // 对话框标识 w% H) R* m1 v2 y9 M
: row {
9 p. R! w7 e& c O1 o: boxed_column {0 {% v3 L! H$ H
label = " 索 引 ";& @% d& ~- {; Y& r' c; \) r
: radio_button {
. b5 [$ w7 z9 H8 K) H Ulabel = "常用术语"; // 多选一按钮) k" f& P( i+ F+ I' q& H
key = "c1";! u9 G2 S5 s( [$ j
value = "1"; // 初始值为"1", 表示选中
% \; G+ g, o: A3 F' q! n* s" R}
; [) g; X! p2 D: radio_button {
- a$ r7 Q# ?0 d; R; s0 Q% Wlabel = "图纸名称";; X! o A9 D5 E7 ?5 f9 T
key = "c2";, M( ]1 Q0 L) }: H& ~* a) u+ Z
}/ w. I: V0 u2 k
: radio_button {
% }- N* Q: H) F* X' Slabel = "房间名称";
$ u1 n5 t. |1 [5 Jkey = "c3";6 p' g0 `2 h4 Z' [8 d# t: X
}
& z' ?# o+ U5 r3 O( E1 i* O: radio_button {
) B/ \* ~+ Y$ j/ ^9 T3 xlabel = "卫生器具";
7 j z: ^' L9 n( x, ?( u/ q2 bkey = "c4";
0 }1 z% w7 D8 L! ]2 f! ?}
/ W+ s/ P0 K. Q0 ^5 X. L( _0 }, P- y: radio_button {/ l! s5 {5 V7 W# {& Y4 g
label = "管材配件";4 s2 T: s: W! Y) j ?$ s' o
key = "c5";
4 f9 e7 C$ B/ U$ q1 d$ b: z}8 n' P# k* f' ~9 D' F
: radio_button {! w# N# y5 Y( a8 I& v
label = "器材仪表";
/ r, E+ @. \# D( D1 g& Skey = "c6";
( Q" u: D' m+ Y}
3 ~- Q. c+ L, V: radio_button {7 c! [( C* w# a" D1 ]7 q7 B
label = "常用设备"; x& ~ G# s- D3 |% t; w
key = "c7";
8 J, `; ?/ f9 J2 f}
/ T% _) m& S/ a" H, i: radio_button {
) M6 k. l/ C- V5 ?/ ~& ^label = "构筑物";
2 D4 @/ z; s' r2 X: \7 lkey = "c8";: V& f i- |; u# k
}
4 u- o) ^5 O" T# i5 d: radio_button {+ n& r% z; A( W" ?, t# h2 `
label = "其它";" E* g2 f. R5 p: L4 z% x: W
key = "c9";
: Q: q. H7 x, b+ k2 X" L$ O4 H1 Y}$ S8 w1 I; \$ B- A: `
}, {$ z- T* O5 T1 t4 B' q
: list_box {
+ S3 }1 w0 @* n/ Qlabel = "词组内容";+ k- ~3 y5 ]/ ?4 Z. w
key = "what";
+ @, Q( s2 k" dheight = 15;
; g' R1 D7 w+ x6 twidth = 26;
' w0 g4 m8 w6 j% I* A& A0 ~allow_accept = true; // 可双击鼠标选取 F* T3 I$ U; W( d5 A' |& Q8 V5 a
}
1 y& Z3 q% P4 s/ w% v}
4 {3 ~3 u9 B8 A3 l+ [0 rspacer_1;9 ~6 J8 s% {: B# ]8 Q$ k) S
: edit_box {// 编辑框3 \$ u- y6 ?7 d) ]1 h
label = "所选词组:";
6 ?/ k6 [- X5 J1 f' a! tkey = "sel_ok";% e, @5 D# Q* r: w( ?, @: V6 z U
}
( v, E6 L- I; ^% h! lspacer_1;// 增加间距
1 f' Q8 r; Z: E* L, t6 Eok_cancel;* d9 M: K1 @( G5 p
} |
|