摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 $ d, S- \2 h. b' g1 s+ K
一、引言
. A$ W" c' a( h) D: ~0 B6 I 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
2 G4 J ~: x; M4 g" o s+ v' P 2 V( ~2 u. \' s3 ?: J% w/ K
二、原理及方法
4 y- p- c( c' a" a6 W AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。 I6 a# y$ M+ _( a* Z4 `
左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
* S* W9 E4 |1 t9 b三、程序使用方法
" _+ [, [- s/ S6 F9 |# Z先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。 ! }1 a9 `& _. \9 @; q: I
然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
. {5 a$ Q5 C* e2 n1 A% A1 j7 U y在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
5 d* `% q3 i9 [" C' d需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
1 V7 K9 l) |. l3 H* h本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均调试通过。
j* s( s2 J' X% ] G2 e(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) ! Y! a2 i& q K8 R/ d
; 定义错误处理子程序 + b* V' n( [: s2 p& O
(defun txterr(s)
! q) Q! L1 C5 J9 C(if (and (/= s "console break")
8 }: w7 ]) S3 Y(/= s "Function cancelled") 8 J! p" R7 n! R) P
(/= s "quit / exit abort")
5 n# I8 |( G$ h3 u; Z) ! z9 c2 b1 F' B8 H/ ?3 |) p7 m
(princ (strcat "\nError:" s)) ; [& W1 [8 J% _8 U
)
6 D4 k0 B& l# ^ R' V: f ~) ^(if olderr (setq *error* olderr)); 恢复原系统设置 1 y. a4 l# C# ^1 I! q3 X; R" N; w
(if oldcmd (setvar "cmdecho" oldcmd)) 9 q( `5 h& R% r3 w4 `
(princ)
5 r$ o; ]& V2 E/ }) # I/ v: K5 c4 O
; 对话框显示及驱动程序 # A+ S% D" V1 c4 i; D
(defun diag ( / i) 2 D5 k7 }: \: P/ d- Y: w8 l) D& \
(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件 Q$ d9 h8 p1 J
(progn
/ i9 G. X1 j5 {4 W7 N$ e(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框
, R# ]& Y: L1 ]$ N) w(progn start_list "what");将词组显示到列表框内
9 d/ }) L5 c4 J$ ]1 N; h2 s(mapcar 'add_list txt_tb
, ?: W% v/ V( V4 a) ! R& e3 D. Y4 C& k/ ~
(end_list) $ d. \& p; O B* i9 ]3 e8 {# @
(setq i 1)
: H! e& k2 h% n" I$ m(repeat nn;点取词组分类项后的操作
$ c/ [: F+ F- G, R4 t7 N. N6 Z(action_tile (strcat "c" (itoa i)) "(wr_txt)") 0 b$ E8 t4 M2 P) l- G/ ?
(setq i (1+ i)) ) G9 ?/ j9 x! @; r2 B0 U
)
8 T# v. _) o$ [# ]- f! t; E; n3 w4 G(action_tile "what" "(setq i (atoi $value));选中词组
# y/ h9 C6 R- D$ x$ R% J(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)" ; F2 b% W2 f1 n5 I5 ?
) ! s. C/ b( f9 J5 o
(action_tile "sel_ok" "(setq txt $value)") 6 g% l9 i. [3 e% `/ m& `( P* T
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)") 5 A1 g5 L1 M1 b$ x
(action_tile "cancel" "(unload_dialog dcl_id)") - ^3 _5 a. s s/ j( {
(start_dialog) {0 D* P; X. i m8 o
)
* m& C/ Q3 p4 o# n3 {0 R! {(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!") + U- `1 n3 J' X4 j1 [
)
; x& W4 H1 d8 _3 f/ j& g, @. w)
; I; X7 k( |) X. I: b(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!") , D Y0 a# c( C" j, r9 d. C9 c
)
8 {1 b6 q- T4 I$ p0 v3 U) ) F9 c: a H) a5 q
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中 & ~6 b2 s# Y0 G
(defun init( / fname fp txt1)
3 J N; c2 N1 b, A0 O' S# P* j1 N% q) d, F(setq fname (findfile "$txt1.dat")) 6 @( Y4 W0 k" n+ Q4 w) O- i! d
(if (not fname)
' T+ f' w. ?. y" {(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出 9 [# c1 o& B8 f A9 w$ q
)
6 A1 i! _1 f( F% {(setq fp (open fname "r"))
1 u4 g+ d, D* p$ @(setq txt_tb '())
4 }& _0 ^' b5 |' k( Q(while (setq txt1 (read_line fp))
/ O' k) ]$ u5 F+ l4 B- P6 s(setq txt_tb (cons txt1 txt_tb))
" l; f. y5 v5 @) x2 w/ o. A1 Z) - l1 j* Q% e j. T0 ]. ~5 f: l
(close fp) A( W2 y5 ~ d% ?/ G4 V7 `
(setq txt_tb (reverse txt_tb)) 9 }: W4 R9 E5 V+ @! L/ n" f- X
(setq old_nn 1);记录索引号 : q- X' n: ?0 W" W8 @$ r
)
# j1 m% R6 S0 p2 `9 O2 L; 更换列表框内词组显示内容 ' F7 ^0 s5 f% o5 o; u
(defun wr_txt ( / fname fname1 fp txt1 i) & }$ a( k. W2 K t1 L) v
(setq i 1)
. g& C4 Y" k5 r* X4 ]; v3 X- V(while (<= i nn); 判别哪个词组项被点中 ! U7 y2 c3 A7 y+ |+ N
(if (= (get_tile (strcat "c" (itoa i))) "1")
3 U5 t3 P3 ?4 F" Q- U(setq fname1 (strcat "$txt" (itoa i) ".dat") 7 A) S" |4 ~8 _# O2 N& s6 S" A
i nn
5 M) y8 O. d' {8 m)
0 F" P' k7 k( Z# E+ G7 \$ @2 R) ' T; H/ j$ V! g/ J) v- w+ L5 P
(setq i (1+ i)) % k9 `* v, K4 P4 Q+ r# H
) 4 v: k0 G% Z( C5 S0 U4 h; H; e
(if (setq fname (findfile fname1)); 查找文件是否存在
$ }( Y1 o" I7 P) V0 ~% Y(progn
$ [+ ?9 d( ?9 k$ F- \$ e(setq old_nn (atoi (substr fname1 5)));记录索引号 2 e1 J; \8 |, v: o
(setq fp (open fname "r")) 7 @2 N: z5 u1 ?' X0 B; f9 c( `
(setq txt_tb '())
2 h3 L9 @% t- q3 x(while (setq txt1 (read_line fp));依次读出各词组
! v9 r1 _- c8 Y- y8 g8 z: c9 c: l- O(setq txt_tb (cons txt1 txt_tb)) & r" n+ p3 x) F/ G, Q3 B% }9 x
)
9 R6 m4 e) t: g* r(close fp)
9 z2 j% @ e% f4 B(setq txt_tb (reverse txt_tb))
1 V% f% b8 r4 I. S(start_list "what");在列表框内显示词组内容 1 v+ H8 {- T* p
(mapcar 'add_list txt_tb) 8 a, W0 P/ c8 e3 ~
(end_list) # m4 i0 C" }& }: W
) ; progn ^8 l! I: ] p+ D
(progn 3 w( o7 H. ~ ^- J3 o
(alert (strcat "文件" fname1 "不存在!"))
; o0 E# K, x& x5 c8 Z. E. ]3 H+ Y(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号 # |( _' _) B0 S
)
! p; T2 P! _. [! a) ; if
$ t; b) }0 X* D d( N$ }: M)
6 W* w9 {& l5 x1 N: G7 p' m" \0 `; 主程序开始 ) h: ^9 V0 V, {, b2 a5 R+ l
(setq olderr *error*
& P" ~+ w8 s5 C ^& B& Z5 }*error* txterr ( H2 p. G7 p" r% I% k
oldcmd (getvar "cmdecho")
% y- p( { [$ K/ d, P1 ]7 \. D$ s) 9 ~. r9 ~5 w* i. n- R3 W- U
(setvar "cmdecho" 0) ; 命令不回显 6 Y+ |/ s, z* \0 Z9 B) x9 N2 {
(setq nn 9) ; 词组分类数 6 W8 W/ f4 \- j# |; T# _! a
(init) ; 初始化
) i3 S8 }% ~ d7 T$ h9 G) p(diag) ; 驱动对话框
; r* E- K& Y- b) V; s" k; ` ?(if (and ok txt)
/ [: i# ~, `- d6 {# s7 d' [(progn
S2 v1 Y0 t* B- I(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
: ]% H8 ]+ e! n8 B(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值
. b* c+ P) g5 Q(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"
4 j. j- c W( k4 A W0 s) ' L$ q3 i& u4 w0 M- C
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型 ' \" l& l6 F( C# N; [' Z7 ?; P
) : @3 z& g5 ~ G* _1 w* ?: @
(initget (+ 2 4));下面的输入值要求大于0
& z1 c; |9 |; @4 r u2 `(setq ht (getreal "\n请输入字高<500>:"))
. A' G: M5 u, o. a( ^(if (not ht) (setq ht 500))
* p! @8 C2 E1 D6 G) V/ |; J(setq pt (getpoint "\n请点取文字起点:")) ; g. K- i& }! |: s ^1 P& b% O
(command "text" pt ht 0 txt) 3 A1 v) A- `6 @* w- O
) # O7 ^4 e( L `$ q+ R7 }) I9 J* h
) & d m1 }; _$ {$ ^* U
(setq *error* olderr);恢复原设置
2 D3 p- q. d9 T% t: @! g) \2 z(setvar "cmdecho" oldcmd) 3 c5 r; r, V% h- y/ X8 D
(princ)
$ j5 s1 G9 @" u* S3 b5 E! O( j- z D6 {)
& ?2 x2 l- l: @// #txt.dcl
8 f% o/ F) B" Q! L/ @( K, k/ \// 供#txt.lsp调用 9 {- W& g4 ~5 L/ v5 `' a* q) }( x
filetext : dialog { // 对话框名称 ( \ Y# C. m6 k: e# ~* c* {, \
label = "常用词组"; // 对话框标识
4 W0 t4 R. E; v. E) M3 ?. V: row { # [: ?7 j- v2 L' ]( j( v0 f1 b& ~ R
: boxed_column {
; O4 ?0 K7 T ^label = " 索 引 "; $ Q. N) V5 h+ D; h0 s6 |
: radio_button {
3 y- }8 u4 P5 X& Wlabel = "常用术语"; // 多选一按钮
6 u* _2 \; _) t$ Ckey = "c1"; ; i' k" q4 q% i
value = "1"; // 初始值为"1", 表示选中
& A5 b* K3 ]0 s/ ]% a7 I7 g; L }0 p}
* q# D% x1 O9 `) x9 ]! k" y: s( P: radio_button {
0 W0 Z4 g# f5 M; v4 K7 \: `& Vlabel = "图纸名称";
7 h) t' \' `1 d) fkey = "c2";
' T* |: p: \1 `6 t; _; W3 s} 3 b' D' b8 ^, e* C, ]
: radio_button {
2 w8 F. z9 d) W+ z1 s6 c/ wlabel = "房间名称";
: z$ O! h8 L' }3 N7 I. ckey = "c3"; {' h- w$ X/ n8 Z. C6 M
} " u3 |0 j4 [* ] E: b7 T
: radio_button {
7 g& o ~7 I) [ _$ D$ mlabel = "卫生器具";
" j# P/ v* }- S# `3 n& f+ X$ v# m8 m% Akey = "c4"; + A; G* l' m/ f; u s
}
V0 {, d3 ~3 m" M8 g3 n6 `% s: radio_button { 5 |: b/ \3 b9 X! s0 n. a5 [( X
label = "管材配件";
- e4 A/ @8 J" U) q4 l( Rkey = "c5"; " ~: m. i5 X2 E1 Y+ s/ S% [
} 9 u( @( G% N" t5 t8 H, w
: radio_button { ) H. T2 @# V) G* r
label = "器材仪表";
- G* G! [2 k2 f) E1 N0 }# I- B7 kkey = "c6"; 2 i' ]1 U" u% M7 J
}
8 q6 f$ h" o" T% L! F: radio_button {
! w0 d7 L `( G; E5 plabel = "常用设备"; * k1 n6 J+ k" P* `, _
key = "c7"; / G) n, s- K, ]3 E2 q w
} 4 A0 K" R" z& c) O: U
: radio_button { " l$ E5 `* L N g. ^4 E6 ~5 p2 V
label = "构筑物"; # E. ?1 ]: L6 v" r/ U* f' j
key = "c8"; / v8 U+ j# I( y# v+ E/ A( t/ S
} . ]& w7 M0 l) g; s7 A+ y
: radio_button { ( S" |& m$ V d
label = "其它";
8 K, f9 Q, w; e: Ckey = "c9";
( o* `0 {. t6 q0 _: ?: l} 7 p4 h. l5 R# j2 k: _$ |2 s: u+ q
} 9 W$ c' I% c) C& m' C+ S
: list_box { 3 r' q8 z9 G8 @. m9 Z; E/ I
label = "词组内容"; 5 R8 N, \9 d7 m ~0 z* ~
key = "what";
" H! |0 o) X4 P( a( a3 Nheight = 15; * B( [6 I* L o0 a" g" L' N
width = 26;
2 A1 Q3 G% B# T) Gallow_accept = true; // 可双击鼠标选取 2 P% }% n! K3 L0 u% V0 w/ N
} * F4 T% Z! ]5 e; N+ S
} ( ?1 g+ e: z% T( ?5 q5 S$ ~! Y
spacer_1;
* M A$ X" U$ s# a: edit_box {// 编辑框 7 z0 j2 x- {# t# b2 X
label = "所选词组:"; 3 y! u1 Z# D" Y9 |" Q9 X
key = "sel_ok"; ) B7 a$ K" O' U1 P: q0 K8 }
} 1 Z. x. m2 S/ M; H# V7 G( k
spacer_1;// 增加间距
( c C! G4 [4 x0 l4 P/ b4 M/ ]ok_cancel;
9 _/ r; J1 ?* C/ R- z8 C4 ?- I# Z} |