摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
I5 s, U' F% S( E, v5 w 一、引言 # e% R9 C! ] `' i
汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。 1 e$ L7 e3 _, Y& {. i/ p# P
![](http://www.cadx.cn/data/uploadfile/200608/20060827235741769.jpg) + F- P; t7 j% \7 \
二、原理及方法 7 g; E* Z+ g8 p% g# e
AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。 2 e2 c! o0 Z$ ^. O6 \
左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。 $ _' e* E9 w) d% h6 b8 a
三、程序使用方法
/ H, p5 t5 c7 O! m ^先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
/ ^% T3 t) z; M3 O- B7 k然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
6 H, H6 r* _. l) \在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。 5 `; k0 H/ x5 ^! n% K4 ~' H% Y
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
7 F1 n/ ?( q- u3 `本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均调试通过。 , y# X7 v1 n! u6 P9 h E s5 e
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) ' d4 g6 ^7 X( M* y; d7 k
; 定义错误处理子程序 1 v# j( Z; X! v0 y Y( M$ Q7 F
(defun txterr(s)
7 L* Q* {. d( X# p- E6 j(if (and (/= s "console break")
6 K4 b9 m* I* o+ [* t7 N(/= s "Function cancelled") ; C" j8 j' I# S) a- E& w9 f" p) q
(/= s "quit / exit abort") * t. l# {' V. a2 d1 H/ N4 y
) 8 z. K6 h! T, \. D- x$ {# P
(princ (strcat "\nError:" s))
5 s2 k3 n. K# y8 b5 @* h+ y) * x: G# o; R+ h1 q/ A: J9 b* E
(if olderr (setq *error* olderr)); 恢复原系统设置 J0 H3 n% m& d: f' ?1 `$ s" q
(if oldcmd (setvar "cmdecho" oldcmd))
" q/ k# M# G4 u/ M(princ) 7 `) l+ }! l3 ?' d
) # ?" f6 v0 o: N1 n, W4 e5 T
; 对话框显示及驱动程序
' i- N4 x3 ?& J. _, s! Q& s(defun diag ( / i)
" i( G# B6 Q R @! ?(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
& w) g* O }4 c(progn
8 |' q$ h9 J+ l* c7 s9 g(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框 & F% x* d1 ?. x5 T+ S1 a! g7 ~7 @
(progn start_list "what");将词组显示到列表框内 / y# e0 z' h" N1 ^0 u) R
(mapcar 'add_list txt_tb , ~' |9 ~9 A5 n" a; V Y! ^
) : x- Q3 R, r- ?* Q- P
(end_list)
* i/ u/ b- @0 e: I4 v(setq i 1)
0 h: T: X9 W9 y; \. U0 @(repeat nn;点取词组分类项后的操作
2 Z# _$ z( ?7 V5 [7 E' I(action_tile (strcat "c" (itoa i)) "(wr_txt)")
; H! Q: F k- r2 f9 e(setq i (1+ i))
' e3 P; Q. v z9 V) / K) M4 M" v2 x& _5 q
(action_tile "what" "(setq i (atoi $value));选中词组 % Y5 {1 o- S: m" y, Q
(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)" 8 q1 i7 ~. M4 I% p, W2 ^
) 4 W/ \, F6 I$ t& F! L
(action_tile "sel_ok" "(setq txt $value)")
% m2 J, I: G8 p3 k! A(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
q c! d% v4 X) A" c(action_tile "cancel" "(unload_dialog dcl_id)")
- @; s3 L$ z7 X) U4 S8 a# N(start_dialog) 9 E7 n. i9 V5 g* y
) ) a* e; U5 a! L1 L3 ]- }
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!") ) B1 Y# N3 }" t$ r0 h' A" S
) 7 c- j1 l S, ?. Y
)
3 D- K: H3 Z. n8 ?8 W(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")
0 K" V1 J, b+ Z6 W$ [)
$ {' G5 k+ p: P V* k) " I0 o |# u- j# B) `) c; k3 l' `' d
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
9 d7 \1 G1 x( ^* J+ d7 ~/ F7 F(defun init( / fname fp txt1) , J% w! R+ y0 [4 j( j
(setq fname (findfile "$txt1.dat"))
, U1 p0 Z9 `5 y! P1 b(if (not fname)
; M5 N$ Y" p8 _9 I, F' k2 s, M(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出 ; a+ M8 Y+ e/ ]8 P% v
)
+ j+ f. q2 \' J7 W, W8 ~4 h" ?(setq fp (open fname "r"))
2 U- M- [( \$ H+ v; i, r(setq txt_tb '())
( ^; a# v4 l, }* Z(while (setq txt1 (read_line fp))
+ {& [5 v8 _9 x2 ~: Y4 \. a: f(setq txt_tb (cons txt1 txt_tb)) 4 g( \1 u1 u# D& u
)
) R& P4 k: U* D/ J(close fp) ! b# G! {- {: U- k# Q5 `) |$ U
(setq txt_tb (reverse txt_tb)) 0 }. R3 {0 d$ {! B: |; j, d1 l! `
(setq old_nn 1);记录索引号
7 d# q/ [* j( w4 |' A. l) 1 H4 P/ [' C( d$ }8 w3 o! |9 D4 d
; 更换列表框内词组显示内容 " N0 ]1 m9 u9 ^
(defun wr_txt ( / fname fname1 fp txt1 i) , n8 `4 W# b# z# y/ @
(setq i 1) - m1 U0 U, j7 h% Z- g' H) [
(while (<= i nn); 判别哪个词组项被点中
3 ?, z# L# i0 |; t" c4 Z(if (= (get_tile (strcat "c" (itoa i))) "1") & X' W. A. m( Z f, f8 Q7 q
(setq fname1 (strcat "$txt" (itoa i) ".dat") 7 N$ M C$ m8 |0 Y- P+ G. q$ m
i nn 4 \9 W. H! k1 |& ~4 H
)
* h! T4 C4 K, g# `$ c2 P6 m)
. I- _0 ?% E8 j6 {* m4 A(setq i (1+ i)) & u. F6 p2 \6 i6 C6 I; Q- e+ ?
)
; u! B9 I' t2 H+ u9 U" L(if (setq fname (findfile fname1)); 查找文件是否存在 + I6 D, D/ r( Q4 I
(progn
: `* r4 I9 p! ~4 e$ W k9 i8 [( n(setq old_nn (atoi (substr fname1 5)));记录索引号 2 r( Q) c4 ?3 u" |, p+ s0 {+ U
(setq fp (open fname "r")) # n% C0 w, \% Z) ^+ w' ]4 {2 c- m
(setq txt_tb '())
/ w- D: l9 Z- S0 a(while (setq txt1 (read_line fp));依次读出各词组 3 I# K- I6 @- X
(setq txt_tb (cons txt1 txt_tb))
5 ]' Y! B; k# F5 c; j& \6 z0 I n7 q8 {) B* x# m# m& n. @) j3 J4 G& M' P
(close fp) 4 G! \9 p! @, Y n1 l! t, P* D) G! ]
(setq txt_tb (reverse txt_tb)) 0 u7 ]/ v! z- h
(start_list "what");在列表框内显示词组内容 + x5 ]9 P4 I; ?
(mapcar 'add_list txt_tb) 4 c6 S5 {5 S7 y8 S
(end_list)
/ ~) d- _" i2 p3 C. S' w o2 H) ; progn 2 M h% ]: M6 j# S
(progn
" ~: U& u# y! h X4 N(alert (strcat "文件" fname1 "不存在!"))
- {/ \" I) O: x5 _(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
" [* T% p4 Q3 t6 w! B( h: `$ p. Z* j)
1 {7 ^4 l9 [" j8 H) ; if * v8 M6 ]8 {$ C2 @) r6 N9 v
)
, i/ t/ d5 |; \$ P6 l/ Z. R3 Z% G, h; 主程序开始 ) a2 G7 u7 j) x6 @* A2 n
(setq olderr *error*
7 T6 r( T6 ?2 E*error* txterr + b6 C" y" _9 j! ]4 q8 q
oldcmd (getvar "cmdecho") , s8 {$ I% E2 y3 v
) V" Z& N: k8 W
(setvar "cmdecho" 0) ; 命令不回显 & ` `5 B8 R4 D; Z
(setq nn 9) ; 词组分类数
1 J- X$ v+ Y- s' E7 ~! g$ K(init) ; 初始化 $ I1 K" Z3 s; j! R
(diag) ; 驱动对话框 , U7 z. G( t- C5 g
(if (and ok txt) 7 J6 n/ f. a& B) K2 w
(progn
0 ~, b* u8 c5 w0 o(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
) M- `- z, F6 S; i5 ](/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值 , f0 u7 W& X" O4 K1 m
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"
3 ~. \6 A5 j5 B: d) 1 d$ j. T4 `9 b7 i
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
B3 S# ^* a* g9 E j h, R3 Q) / z+ g) X+ R6 s' i* E* r
(initget (+ 2 4));下面的输入值要求大于0 8 o( O j5 I7 P4 z
(setq ht (getreal "\n请输入字高<500>:")) . d# j0 ?( E# Q4 D& F4 E' w) n1 ]- {
(if (not ht) (setq ht 500))
9 R; G" Y) m3 e& ?2 R% X(setq pt (getpoint "\n请点取文字起点:")) " ]+ M* u5 ?- n+ T/ I
(command "text" pt ht 0 txt) 9 _, `$ {/ V# p& b2 S. `4 @; N+ w
) 2 \ v4 I( v3 t& b
)
2 {4 u: x4 E3 k; s5 g. W2 s(setq *error* olderr);恢复原设置
, x/ Q6 y0 E5 X* M) s(setvar "cmdecho" oldcmd) - F0 v! g* x& J. [3 Q# G
(princ)
3 y% A& W& T. a/ N1 G6 H)
# c6 J: B; H, T) m! H2 D$ y// #txt.dcl
% P! g1 c* u0 R l// 供#txt.lsp调用 & V# r! t1 F1 `# h" n7 f6 @6 p
filetext : dialog { // 对话框名称
- F9 p- j# o" q! f; c3 @( Rlabel = "常用词组"; // 对话框标识
5 f2 s9 J8 l0 a* d5 V1 |: row {
. T: o% X: }" `3 I$ C: boxed_column { 7 l# x- k6 A" Z9 \9 B. F6 ^
label = " 索 引 "; 5 i, H _- p5 R; [. f
: radio_button { ! H" w2 U. \! A/ z3 Z M
label = "常用术语"; // 多选一按钮 . w% a- J0 [4 T- `, i6 k* B s
key = "c1";
7 h0 U6 A, d1 v4 v& w/ m/ tvalue = "1"; // 初始值为"1", 表示选中
$ e1 A* ] Z% d2 E+ ?5 P} 1 I, N `+ m6 M7 }/ e+ ^ ]' n
: radio_button { ; _: B; b) v+ T. ]
label = "图纸名称";
( L% ?* v- Q1 Ekey = "c2";
" B% w& T& @. K) w9 M} ; L' p" `0 w) K# I$ V9 |
: radio_button { 7 G5 Q' z# {2 G7 s( [; X7 x
label = "房间名称";
; v3 P8 { x4 Ekey = "c3"; ' }# t W; N) u6 l9 L- D
} % m3 l& ]; d: |8 I6 O, G0 p
: radio_button {
7 q; q. G; @; `/ F2 clabel = "卫生器具";
s9 G/ g7 u8 ^$ y, ?" O" e. L. ikey = "c4";
. ?0 W8 o' i5 l8 l9 w- |! b/ r3 K}
! i2 a! M, q0 m/ _: radio_button {
) h5 o# P" c, M7 Qlabel = "管材配件";
* i8 u$ R9 o& A: r% X8 pkey = "c5";
+ i1 M, x; F4 l5 i- H- L; s# |; U4 [}
' ? z1 n& o4 j: radio_button {
9 I7 u; Y1 @9 i# y* K" ~/ Q, Flabel = "器材仪表"; 2 P8 E# C3 e: s t& S" P9 o8 F( O e5 q
key = "c6"; ! Y V* d4 ]7 K
}
; H( \7 j: G9 x" Q" U: radio_button { 7 ]3 O' X- m1 j/ l v; N; R( L
label = "常用设备";
/ Y+ A; R) ]$ L$ _1 o) |key = "c7";
' P6 r8 h8 `, J( ?5 u}
1 h' b- }- w# V6 S- R# T9 v' b: radio_button {
9 f- r, Z7 k- P1 slabel = "构筑物";
! q T/ ?6 ~0 e" t% tkey = "c8";
, ?+ ^4 D/ S8 ~0 n6 i+ d}
- e& ~8 U3 z! A5 q5 e# @: f: }: radio_button {
( u! k, Y- t5 T# }5 f# v4 `label = "其它"; 0 S0 g/ H0 X' B8 M1 o
key = "c9"; - F) U; q3 q" f4 P
}
3 g' [ Z w* h4 C% ^} & _5 I, D) }5 S# ], U
: list_box { , y: [) t; |: V" s- Z! K
label = "词组内容"; ! V% r1 i& Y# j* r, l" B
key = "what"; \4 _8 _+ V1 F! ?0 v- ~5 R9 O0 j
height = 15; 1 N5 E# p# g0 k
width = 26;
5 `1 l6 ]1 \6 Y/ {5 |- x' o: rallow_accept = true; // 可双击鼠标选取
* S: O5 [8 R& |+ f; K}
3 r3 W1 d: X2 W}
+ Q$ E" q* e; \. w" E; vspacer_1;
; q' m& |+ N9 t h3 V3 q- Q: edit_box {// 编辑框 5 U1 I! `8 J Z4 k) }: b: \
label = "所选词组:"; 2 v& }" a' O" d+ K
key = "sel_ok";
% a, B2 \9 A& ? ], F2 d: i$ J}
9 | w g& H$ {spacer_1;// 增加间距
; S- @" t1 m2 ^! w& O9 x( Dok_cancel;
7 W8 Q, K2 q X Z, n& G+ @( `* L8 C} |