本文提出了一种用对话框实现
AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为
CAD应用提供了方便。
G-?y;V 1 XD>(M{~ 一、引言
Ra%" += Lw EI 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
7Ddo^Gtx 8.9TWsZ 二、原理及方法
9/N=7<$ }F'B!8n AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
A|!u`^p s>8;At- 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
iXl6XwWT%8 5(F @KeH> 三、程序使用方法
]oy>kRnb { z:C
VzK, 先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
fh rS7f'Zd /ekeU+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以后可直接从菜单中驱动该程序。
gWcl@|I;\ s&-m!|P 在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
a#i;*J mx`C6G5 需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE"
HFV4S]U= V[&4Km9C "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
(7 i@@ D@:w/W 本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。
NE Br)~ 9|19ia@[\ (defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
)%e`SGmp l#!p?l ;定义错误处理子程序
p-d2HXo L`>uO1O (defun txterr(s)
[UqJ3@> Rlvb@aXgy (if (and (/= s "console break")
VFUuG3p) |)4Fe/!cJ (/= s "Function cancelled")
{%Mt-Gm'd iwJeV J (/= s "quit / exit abort")
f|eUpf%) 2%0J/]n\A" )
o[C,fh,$ #:E}Eby/6I (princ (strcat "\nError:" s))
~";GH20 G$b*N4yR )
@f<q&K%FJ ^HpUbZpat) (if olderr (setq *error* olderr));恢复原系统设置
{9(#X]' pwq a/Yi (if oldcmd (setvar "cmdecho" oldcmd))
G&P[n8Z$ n)]]g3y2 (princ)
!L..I2' RzPqtN )
&j4 1<A >fCz,.L ;对话框显示及驱动程序
5[^pU$Y ivy+e-) (defun diag ( / i)
t[L0kF9en \F_~?$ (if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
eC+S'Jgf r*e<`Is (progn
@m*^v\q<u R*m=V{iu` (if (new_dialog "filetext" dcl [JX*6]id);显示对话框
Yxe%: N@Ie VF (progn start_list "what");将词组显示到列表框内
[ArPoJt )?@X{AN& (mapcar 'add_list txt_tb
/,G -1E 9~AAdD )
.<GU2&;! &~ =q1? (end_list)
?OW! zE: Z_Tu*
F (setq i 1)
7#\\Ava$T K x7'm1 (repeat nn;点取词组分类项后的操作
tvh)N{j ?V3kIb (action_tile (strcat "c" (itoa i)) "(wr_txt)")
y _Mte K,pQ11J (setq i (1+ i))
Fu@2gd &<Gs@UX~w )
8Ja't8 6rBXC <Z (action_tile "what" "(setq i (atoi $value));选中词组
|&O7F;/_ 3`V#ImV> (setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
b:OQ/ Ne6]?\Z )
6gUcoDD hrLPyV: (action_tile "sel_ok" "(setq txt $value)")
:BIgrz"Jz f$\gm+&hXE (action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
dd $}FlT xPuuG{Sm (action_tile "cancel" "(unload_dialog dcl_id)")
=D 1%-ym Z?IwR (start_dialog)
hj~nLgpN a!n |/9
6 )
S"*M9*8 .fZ*N/ (prompt "\n无法显示对话框FILETEXT!请检查对话框内容!")
=3~u.iq$ #!a}ZhIt )
VR/*h% xy/B<.M1 )
wOhiC$E46 :E$<!q (prompt "\n无法加载对话框文件#TXT.DCL!请检查文件是否存在及路径是否正确!")
Sdk:-Zuv WfnBWSA2T )
u0Nag=cU v5aHe_?lp )
$)V_oQSqn G)vq+L5% ;初始化程序,把第1个分组项中的词组读入表txt_tb中
h x_,>\@ ?3X(`:KB (defun init( / fname fp txt1)
.Xq4QR . 3,Dc}$t (setq fname (findfile "$txt1.dat"))
ZS@ Gt ncF|wz (if (not fname)
:P!"'&gCL #osP"~{
(progn (princ "\n文件$TXT1.DAT不存在!") (exit)) ;文件不存在,则退出
5)IJ|"]y ( !K?^si )
Xm#E9 9 tEj-c@`"x- (setq fp (open fname "r"))
tC4:cX FCk4[qOp7 (setq txt_tb '())
i4',d# J.R|Xd (while (setq txt1 (read_line fp))
9>@@W#TK~ &zGf`Zi6*% (setq txt_tb (cons txt1 txt_tb))
dZMOgZ.!yr Y?1
3_~
K )
2HxT+|~d6 |zJxR_) (cl
}D/O cp~o \.@fAgv ose fp)
;q8tOvQ G`a,(<kT; (setq txt_tb (reverse txt_tb))
W.B>"u P|:*OM
p (setq old_nn 1);记录索引号
Aqc
Cb[1r GT -(r+u )
Ezvm5~< #_A <C+[ ;更换列表框内词组显示内容
S:\a&+og j@j%)CCM (defun wr_txt ( / fname fname1 fp txt1 i)
R')D~JJ<8a 72YL
(setq i 1)
W(C\lSE0 tHvc*D (while (<= i nn);判别哪个词组项被点中
p1-bq: )yHJc$OlMx (if (= (get_tile (strcat "c" (itoa i))) "1")
V_>)m3zsL stb)Tl^ (setq fname1 (strcat "$txt" (itoa i) ".dat")
gK`o;` ^ Usa i nn
dG}.T_l |GDf<\ )
-T
s8y (c'=jJX )
`u. /2]n #[4Mw M3 (setq i (1+ i))
fs43\m4=m ?8j#gYx2 )
UL46%MFQ\ FXAP]iqo (if (setq fname (findfile fname1));查找文件是否存在
SP&Y|I$: nJdO~0}3 (progn
3eq VY0q yf KJpy (setq old_nn (atoi (substr fname1 5)));记录索引号
2u(v hJ
F5 &TpzJcd" (setq fp (open fname "r"))
(>E}{{>2r 7 Q`'1oE? (setq txt_tb '())
__FhuP P \:ELO[(#|{ (while (setq txt1 (read_line fp));依次读出各词组
FY^#%0~ +cDz`)N,, (setq txt_tb (cons txt1 txt_tb))
S.!0~KR:U .^?^QH3 )
d1MVhE $'9b,- e (close fp)
,%|$#
g 0 [lSQ? (setq txt_tb (reverse txt_tb))
,u^RZ[} ][ ,NNXrc& (start_list "what");在列表框内显示词组内容
Gk.;<d F(-1m A&- (mapcar 'add_list txt_tb)
Xv`c@n) !'-|]xx( (end_list)
]^>#?yEA3 :6^8Q,C1@ ) ; progn
dIOj]5H3F Jkc1ih`^ (progn
NwK(<dzG $WOiXLyCk (alert (strcat "文件" fname1 "不存在!"))
xaiA? U 0$?:C+? (set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
v{R:F Rwy<#9R[x )
|_Y[931< JG2)-x;9 ) ; if
U9om}WKO jY]hMQ/H )
~[J&n-bJU IT`r&;5 ;主程序开始
{
.z6J)?J2 ;'\{T#5) (setq olderr *error*
N"i'[!H% #-QQ_ *error* txterr
;K'1dsA 2|fN*Wm oldcmd (getvar "cmdecho")
u6~|].j R :Kc}R)6 )
`.0QY<; t/6t{*-w (setvar "cmdecho" 0) ;命令不回显
n9J.]+@J Z/z(P8#U\ (setq nn 9) ;词组分类数
$X.X_ E57J).x-BP (init) ;初始化
_&/FO{ F@m Ib)>M`J (diag) ;驱动对话框
MTKd:.J6 29+p|n (if (and ok txt)
-3M6[`/ N XwQvm;q (progn
:Fm{U0;" kEM5eY (if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
9d7$Fz# ^#H%LLt (/= (cdr (assoc 40 sty)) 0) ;字高是否为定值
w$JG:y# sW#}QYd (/=(getvar "TEXTSTYLE") "HZ");当前字型是否为"HZ"
J!Kk7!^| k^|P8v+"D )
I2@pkVv3z NqsIMCl (command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ;设置"HZ"字型
/4\!zPPj. QyJ2P{z )
y<|vcg8x S`LS/) (initget (+ 2 4));下面的输入值要求大于0
KrQ8//Ih wIW]uo/= (setq ht (getreal "\n请输入字高<500>:"))
3{mu 77 c'=p4Fcm (if (not ht) (setq ht 500))
`+~@VZ3m @"jV^2oY1 (setq pt (getpoint "\n请点取文字起点:"))
kfF.Ctr1a :)GtPTD (command "text" pt ht 0 txt)
OUY65K +U(m b )
*/B-%*#I. JW!SrM xF )
Fe(qf>E
1*_wJ (setq *error* olderr);恢复原设置
m6P!#=a:l< :/H fMJ (setvar "cmdecho" oldcmd)
\R>!HY |w(@a:2kw (princ)
:Mss"L820 D`=hP(y^ )
Ybr&z7# 2 s=lkK/ [ // #txt.dcl
Z3K~C_0Cnu o0:[,ock //供#txt.lsp调用
O!!Ne'I tlU&p' filetext : dialog { //对话框
ER:)Fk>_ lY5a=mwHU 名称
$ctY#:;pV{ /cBQE=]6 label = "常用词组"; //对话框标识
f#:7$:{F1 W&[}-E8<Y : row {
56Q9RU(M @g*=xwve=~ : boxed_column {
'l$<DcBj ?`Oh]2n)6 label = "索引";
X!0s__IOc A*ImruV : radio_button {
v*Qr(4 i"uAT$x e label = "常用术语"; //多选一按钮
w,
u`06 Xp]tL3-p key = "c1";
4'pg>;*. |C9qM value = "1"; //初始值为"1",表示选中
|qS<{WZ!h iVM{ L }
iP1u u bdiyS.a- : radio_button {
<$s G]l!\ 1]r+$L3 label = "图纸名称";
B9;-Blh /8baJ+D"4\ key = "c2";
oLcOp.8h[ F{cKCqI? }
a_5 `9B L JHN35a+ : radio_button {
8phcekh+ ``o:N` label = "房间名称";
~y{(&7sM 'z\K0 key = "c3";
^+:_S9qst gP*:>[lR }
5-|fp(Ww_W n$ye:p>`- : radio_button {
NfcQB;0 {#CyO
b4 label = "卫生器具";
&$fe%1# ,,r%Y&:`6 key = "c4";
KYY~ YP Sk@~} }
S86%o,Saq\ UO}Kk* : radio_button {
@RKw1$BA IMzhEm label = "管材配件";
2s,wC!', 3`4g*wO key = "c5";
}5^j08 hQrO8T?2 }
GYot5iLg _Tyj4t0ElV : radio_button {
WF<0QH V ^=o@I label = "器材仪表";
}2M2R}D $~4ZuV% key = "c6";
{{M?+]p,^ =
wNul" }
8%Zl;;W 0Ha1pqR : radio_button {
O&]Y.Z9,A u79.`,Ad& label = "常用设备";
$53I%. Dq+rEt key = "c7";
X\\WQxj 6l IFxc }
eFvw9B+ LjjE(Yrv{ : radio_button {
uYiM~^0 "2(4?P label = "构筑物";
68R[Lc9q5 oQ@X}6B%S key = "c8";
!<}<HR^) &ZFsK c# }
rixNz@p'% <pRb#G" : radio_button {
+2`RvQN ihKnZcI$i label = "其它";
5#+!|S[PK j&)+qTV key = "c9";
"y/GK1C a9}cpfG=) }
(Ac
'}O G_=`&i"4 }
:<Y,^V( 9)s=%dL : list_box {
UceZWtYa HgE^#qD? label = "词组内容";
9f;\fe hf>JW[>Xo key = "what";
(4n 8[ =dUeQ?>t= height = 15;
hT9fqH Lm"a3Nb width = 26;
U,Nf&g "zR+} allow_accept = true; //可双击鼠标选取
~oz8B^7i; 8$-(% }
OT{wqNI "CBe$b4 }
>Rs:Fw|jro CHv~H.kh' spacer_1;
^rjICF e [Hy0j* : edit_box {//编辑框
>}GtmnF &V$_u#< label = "所选词组:";
yb56nd Ki{&,:@ key = "sel_ok";
{e0cc1Up} ` *x;&.&v }
0Pu$1Fp 4 StiYfae spacer_1;//增加间距
,95Nj h xRq|W4ay ok_cancel;
0sto9n3 NMM0'tY~ }
www.opticsky.cn" >