本文提出了一种用对话框实现
AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为
CAD应用提供了方便。
dy'?@Lj; ~:Nyv+g,$ 一、引言
_FgeE`X Czn7,KE8X 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
|+''d :r=_\? 二、原理及方法
F*H}5yBp_: =)LpMTz AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
-t?G8,, @TDcj~oR? 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
,j<"~"]
= ?i"FdpW 三、程序使用方法
f|)t[,c !8].Z"5J 先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
I&c#U+-A' `}l%Am 然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
:SGQ4@BV ){~.jP=-# 在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
4 vphLAm ?0X.Ith^. 需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE"
t=#)3C`Q} 0XNb@ogo "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
:z7!X.* !T)>q%@ai 本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。
DFMWgBL cCIEG e6 (defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
We2=|AB I6_+3}Hm{ ;定义错误处理子程序
4j5 "{ w.\:I[ (defun txterr(s)
ej `$-hBBV -u{:39y{n (if (and (/= s "console break")
;f\0GsA# DQd&:J@? (/= s "Function cancelled")
q6dq@ |rQ;|+. (/= s "quit / exit abort")
9 )qx0 YuZnuI@m9 )
Nnw iH v)06`G (princ (strcat "\nError:" s))
HO>uS>+ aryr )
vEkz5$ ;A_QI>> (if olderr (setq *error* olderr));恢复原系统设置
`/O_6PQ} LCtm@oN (if oldcmd (setvar "cmdecho" oldcmd))
x8[8z^BV?e /+iaw~={" (princ)
be_t;p`3 "F&uk~ b$ )
%Vq@WF R0>L[1o ;对话框显示及驱动程序
6 S8#[b \; ]~K6= (defun diag ( / i)
8Vx'sJ>r4 \)bwdNWI (if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
P;GUGG*W c!c!;( (progn
uv$y"1'g dFlx6H+R!0 (if (new_dialog "filetext" dcl [JX*6]id);显示对话框
P7n~Ui~U iiu\_ a=0b (progn start_list "what");将词组显示到列表框内
Q["}U7j ^t"\PpmK<d (mapcar 'add_list txt_tb
L(L;z'3y L_(|5#IDw )
Cpl\}Qn &Z?uK, 8 (end_list)
?Gb
18m #/aWGx_ (setq i 1)
:mij%nQ>$
d%<Uh(+: (repeat nn;点取词组分类项后的操作
lp6GiF p&7>G-. (action_tile (strcat "c" (itoa i)) "(wr_txt)")
*N 't ; J;qH w[6 (setq i (1+ i))
JSM{|HJxh j=7 ]"% )
/<@oUv (g 8K?Q (action_tile "what" "(setq i (atoi $value));选中词组
[mhY_Hmz] XG0,@Ly (setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
!!9V0[ x`$4 )
E0YXgQa >y1/*)O9~ (action_tile "sel_ok" "(setq txt $value)")
'+$2<Ys DpA)Z?? (action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
{pVD`#Tl[ _vad>-=D*U (action_tile "cancel" "(unload_dialog dcl_id)")
]_-<[0 [hs{{II (start_dialog)
$]O\Ryf6 ex-`+cF )
WHU&9N JV@>dK8 (prompt "\n无法显示对话框FILETEXT!请检查对话框内容!")
[Ga9^e$Zv doG&qXw )
)J0'We fPst<) )
X/?3ifP6I 2lQ'rnqS) (prompt "\n无法加载对话框文件#TXT.DCL!请检查文件是否存在及路径是否正确!")
|XeuqZa Q?vGg{> )
x
ha!.&DO 67d0JQTu )
mWtwp- hd\iW7 ;初始化程序,把第1个分组项中的词组读入表txt_tb中
t.NG]ejZ <jV_J+# (defun init( / fname fp txt1)
't
wMvm Q+S>nL!*#1 (setq fname (findfile "$txt1.dat"))
)5hS;u&b A\WgtM
(if (not fname)
C0'Tua' Jyvc(~x (progn (princ "\n文件$TXT1.DAT不存在!") (exit)) ;文件不存在,则退出
sURHj&:t| V]IS(U( )
[~ fJ/ k)'c$ (setq fp (open fname "r"))
ns@b0'IF] *&LVn)@[` (setq txt_tb '())
k0%4&pU Uc\\..Cf (while (setq txt1 (read_line fp))
i4AmNRs o: TO[ (setq txt_tb (cons txt1 txt_tb))
Kx ';mgG#$ 2Ui)'0 )
a Z
^SK|E JIDE]f (cl
Yk[yG;W ]ZZ7j ose fp)
!qT.D:!@zF <Cm:4)~ (setq txt_tb (reverse txt_tb))
jRzR`>5 &`{%0r[UD# (setq old_nn 1);记录索引号
+\SbrB P T5o9pmD )
3.
fIp5g $f_Brc:n { ;更换列表框内词组显示内容
gZ:)l@ Wu cvi+AZ= (defun wr_txt ( / fname fname1 fp txt1 i)
|0BmEF
!1;DRF (setq i 1)
"@DCQ #NwlKZ- (while (<= i nn);判别哪个词组项被点中
%=%jy 3%>"|Ye}A (if (= (get_tile (strcat "c" (itoa i))) "1")
76(&O yin"+&<T (setq fname1 (strcat "$txt" (itoa i) ".dat")
(yn!~El3 Xfk&{zO-j i nn
D:M0_4S d'J))-*#UO )
-TSn_XE %mg |kb6n )
5,k&^CK} USfOc (setq i (1+ i))
PKty'}KF -(@dMY )
K'7i$bl% Kmk< (if (setq fname (findfile fname1));查找文件是否存在
o0_RU<bWN ^3 F[^#" (progn
&CG3_s<2 rV54-K;`0 (setq old_nn (atoi (substr fname1 5)));记录索引号
FX4](oM +(QGlRd (setq fp (open fname "r"))
bw ' yX -aXV}ZY" (setq txt_tb '())
!zVuO*+ Kw+?Lowp (while (setq txt1 (read_line fp));依次读出各词组
L00,{g6wqb JY~s-jxa (setq txt_tb (cons txt1 txt_tb))
*4dA(N\k" `b+f^6SJn )
\ 2*<Pq rX)PN3TD (close fp)
.YKQ6 `[2nxP>w` (setq txt_tb (reverse txt_tb))
7_?:R2]n D/"[/! (start_list "what");在列表框内显示词组内容
:I1)=8lO (G*--+Gn (mapcar 'add_list txt_tb)
YR=<xn;m. n'U*8ID (end_list)
AM#VRRTU dyC: Mko= ) ; progn
l%oie1g l kzMCI)>" (progn
Z;P[)q !FX;QD@" (alert (strcat "文件" fname1 "不存在!"))
"W?k~.uw Y7zg (set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
eo24I0`N x~?,Wv|cm )
"[q/2vC "@;q! B.qo ) ; if
)0
.gW MMN2XxS )
@(,k%84z hCD0Zel ;主程序开始
;$wS<zp6 !;x (setq olderr *error*
dP=1* @kenv3[Lc *error* txterr
/QZnN?k )O#]Wvr oldcmd (getvar "cmdecho")
Zz'(!h Uy ;XMbjWc )
MMqkNe {OL*E0 (setvar "cmdecho" 0) ;命令不回显
vQ#$.*Cvn O5CIK}A (setq nn 9) ;词组分类数
2l}FOdq ;cH|9m:Y (init) ;初始化
/V+N FVW<F(g` (diag) ;驱动对话框
M`*B/Fh2 >0k7#q}O (if (and ok txt)
y\$B9KX 3ZGU?Z;R (progn
R
rs?I,NV ZSuUmCm (if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
8p,q9Ey mk2T (/= (cdr (assoc 40 sty)) 0) ;字高是否为定值
\rY|l
*]nha1!S (/=(getvar "TEXTSTYLE") "HZ");当前字型是否为"HZ"
0(VH8@h`O `C%,Nj )
%<6oKE bg[k8*.:F (command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ;设置"HZ"字型
*91iFeKj= j0B, \A )
d8`^;T
;}d BG_m}3j (initget (+ 2 4));下面的输入值要求大于0
z6#N f, uc<XdFcu (setq ht (getreal "\n请输入字高<500>:"))
$qYtN`b, ]:(>r&' (if (not ht) (setq ht 500))
FY)v rM*yh Q:&,8h[ (setq pt (getpoint "\n请点取文字起点:"))
D|/Azy.[ <mjH#aSy (command "text" pt ht 0 txt)
[]/=!?5B VI,z7
\ )
yw^t6E %Qgo0 )
4-^|e ~
nNsq(4 (setq *error* olderr);恢复原设置
X+)68 -sm{Hpf_b (setvar "cmdecho" oldcmd)
SL" ;\[uI 58,_ (princ)
5Al59] lBqu}88q0 )
H_sLviYLu mVfg+d( // #txt.dcl
N3g[,BE q{@j$fMt0 //供#txt.lsp调用
pXL_`=3Q M >P-0IC filetext : dialog { //对话框
E@^`B9;Q7 ;Xg6'yxJ 名称
wUHuykF ,LKY?=T$z label = "常用词组"; //对话框标识
1,=U^W.G aF2eGh : row {
X[_w#Hwp- u`dWU}m) : boxed_column {
3C 84b/A ..V6U"/ label = "索引";
EQ1wyKZS2g 8~AO~ : radio_button {
<use+C2 mV^+`GWvo label = "常用术语"; //多选一按钮
dy N`9 fT [JU1 key = "c1";
_;3xG0+
YqX/7b+ value = "1"; //初始值为"1",表示选中
>i7zV`eK U4qp?g+: }
x!fvSoHp EzqYHY+_r : radio_button {
LL|$M;S
pqFgi_2m label = "图纸名称";
EpSVHD:* cJj4qXF key = "c2";
3$[!BPLFO )%Z<9k }
b7Jk{x #u 5BR9f3} : radio_button {
"& 'h\ ]u
4 label = "房间名称";
f?kA,! \&ra&3o key = "c3";
x~C%Hp*# \72(d }
jR`q y< }md[hi J : radio_button {
uq~$HXdc &+;z`A'|8 label = "卫生器具";
wZ/Zc}
. *t.L` G key = "c4";
Jj4!O3\I ' _Ij9{M }
f{MXH&d 1\ pe$"
nUy| : radio_button {
XcB!9AIO {j O:9O@ label = "管材配件";
Wcd;B7OH T(zERWo key = "c5";
vp7J'; B'"(qzE-kM }
udVEOn$ hw]x T5 : radio_button {
:"5'l>la k44sV.G4L label = "器材仪表";
C1_':-4 [F{q.mZj key = "c6";
gBb+Q, :@#'&(#~ }
8$9<z !j[Oyr| : radio_button {
Hh`x>{,|S U;f~ Q6iu label = "常用设备";
HLm6BtE $'Z\'<k[ key = "c7";
s{x{/Bp(KK w:%3]2c }
I?c "\Fe H:byCFN- : radio_button {
at"-X ?`d V9\g?w label = "构筑物";
S_?{<{ 3>;zk#b2 key = "c8";
yop,%Fe 5Y77g[AX2- }
x[l_dmq xQ4 5B`$ : radio_button {
"`<tq#&C1 nP`#z&C label = "其它";
2\Bt~;EIx 1_$ybftS key = "c9";
&,E^y,r ;s{k32e }
z Ic%>?w USBU?WDt }
j"g[qF/* &ru2&Sz : list_box {
>
Q[L,I !Ab4'4f label = "词组内容";
ZH6#(;b x?T.ItW:K key = "what";
vX|i5P0)8 K??(>0Qr}r height = 15;
$&IF#uDf kB~KC-&O width = 26;
eru2.(1 5X"y46i,H allow_accept = true; //可双击鼠标选取
hH Kd+QpI 9?M>Y?4 }
P]V/<8o.53 d@-s_gw }
-jN:~. ,c3gW2E spacer_1;
/;P* ? EPO*{bN7O : edit_box {//编辑框
OJX* :Q PeCU V6 label = "所选词组:";
bWp40&vx `*?8<Vm key = "sel_ok";
\~j6}4XS1. #"PI%& }
"^?|=sQ !{On_>`, spacer_1;//增加间距
@|A
wT IC5[:UZ5] ok_cancel;
.4I"[$?Q s
Yp?V\Y" }
www.opticsky.cn" >