本文提出了一种用对话框实现
AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为
CAD应用提供了方便。
~|O; Sdo= $%"hhju 一、引言
'Q :%s ty"L&$bf 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
jXALL8[c -qaO$M^Q 二、原理及方法
]cS(2hP7 *c/V('D/ AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
ji\LC%U- F!u)8>s+z{ 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
FGyrDRDwC S (xs;tZ 三、程序使用方法
Z8Y&#cB zx2`0%Q 先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
Jj=N+,km eZ[Qhrc 然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
Db*b"/] (}>)X] 在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
<\Y(+?+uZ 1hi,&h 需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE"
d-e/0F! H'/V<% "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
[f lK G/},lUzLg 本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。
F
{L# Q(yg bT (defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
F*Hovxez I ZLCwaW ;定义错误处理子程序
pKj:)6t" Te?PYV- (defun txterr(s)
F02TM#Zi >#;;g2UV (if (and (/= s "console break")
c!wRq4 ~J+
qIZge (/= s "Function cancelled")
j#P4& Vh?vD:| (/= s "quit / exit abort")
=1R
2`H\ rKslgZhQ )
qM26:kB{ : fYfXm (princ (strcat "\nError:" s))
,P`G IGvkA ts@$* )
2W_[|.;' .-&
=\}^2l (if olderr (setq *error* olderr));恢复原系统设置
PHIc7*_ aBY&]6^- (if oldcmd (setvar "cmdecho" oldcmd))
{cLWum[SY 2
V \hG?< (princ)
$E^sA|KcT c1+z(NQ3 )
U"Bge\6x= y&8`NS#_p? ;对话框显示及驱动程序
V/"RCqY4 eX"Ecl{ (defun diag ( / i)
7SYe:^Dx |4j6}g\ (if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
#<m2Xo?d] . a @7 (progn
#Y-_kQV* l?J[K (if (new_dialog "filetext" dcl [JX*6]id);显示对话框
DaHbOs_< S["r
@< (progn start_list "what");将词组显示到列表框内
V3VTbgF t4:/qy (mapcar 'add_list txt_tb
5?
Y(FhnIC l,b,U/3R. )
/=9dX;
# s%Ph (end_list)
)t-P o'RW Xg_l4!T_l (setq i 1)
IV':sNV &{a#8sbf#c (repeat nn;点取词组分类项后的操作
$qZ6i ZK'WKC (action_tile (strcat "c" (itoa i)) "(wr_txt)")
KOXG=P0 f8r7SFwUv (setq i (1+ i))
`<<9A\Y-f &X`
lh P )
G}NqVbZ9] &c&TQkx (action_tile "what" "(setq i (atoi $value));选中词组
c>/7E-T saQ
~v@ (setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
ks%;_~b $;=?[Cn )
xmC5uT6L3M |)%H_TXTy (action_tile "sel_ok" "(setq txt $value)")
-}oH],C :cXN
Fu\C (action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
:-hVbS0I Rh
]XJM (action_tile "cancel" "(unload_dialog dcl_id)")
y>u|3:z E1Q#@*rX> (start_dialog)
*tR'K#:&g! 3bo
[34 )
awQGu,<N })(robBkA (prompt "\n无法显示对话框FILETEXT!请检查对话框内容!")
7)RvBcM b~)2`l )
Ks(l :oUB yn(bW\ )
+`B^D ]uh/ !\ (prompt "\n无法加载对话框文件#TXT.DCL!请检查文件是否存在及路径是否正确!")
IFa~`Gf [ M80O;0N%A )
6iEg]FI !>Q\Y`a,* )
^4\0,> oGg<s3;UND ;初始化程序,把第1个分组项中的词组读入表txt_tb中
MMD=4;X [Ran/D\. (defun init( / fname fp txt1)
Tl]yl$ P;'ZdZ(SLu (setq fname (findfile "$txt1.dat"))
D97 vfC &l_}yf"v (if (not fname)
0blbf@XA .i|nn[H & (progn (princ "\n文件$TXT1.DAT不存在!") (exit)) ;文件不存在,则退出
N0\<B-8+,> ? `kZ 6$ )
TA:#K "<)Jso| (setq fp (open fname "r"))
{'{9B '`W6U]7> (setq txt_tb '())
c_.Fe'E Clap3E|a (while (setq txt1 (read_line fp))
2 1+[9 Qr6PkHU (setq txt_tb (cons txt1 txt_tb))
-'*<;]P+. plJUQk )
4mX?PKvbn ;7H^;+P (cl
3%Q9521 fuF{8-ua ose fp)
]TcQGW@' ^%LyT!y (setq txt_tb (reverse txt_tb))
:c8d([)$ itc\wn (setq old_nn 1);记录索引号
6P,uy;PJ %yl17:h# )
M&Ln'BC <viC~=k; ;更换列表框内词组显示内容
S9%,{y +~y>22Zfg (defun wr_txt ( / fname fname1 fp txt1 i)
=1
S%E 91q (setq i 1)
d:#tN4y7( ! gfd!R (while (<= i nn);判别哪个词组项被点中
DpT$19Q+ F=#V/ #ia (if (= (get_tile (strcat "c" (itoa i))) "1")
-g|ji. 0bIgOLP (setq fname1 (strcat "$txt" (itoa i) ".dat")
k6o8'6wN yg~@}_C2_ i nn
H?xYS|
n 2\T\p<_20 )
~$"2,& "J+4 )
CHD.b%_| _G25$%/LU (setq i (1+ i))
39F
e#u P$*Ngt )
%&V%=-O_7 j4]3}t0q (if (setq fname (findfile fname1));查找文件是否存在
Y#=MN~##t -R\dg S3 (progn
l~DIV$>,Z Cz9MXb]B (setq old_nn (atoi (substr fname1 5)));记录索引号
'!,(G3 wArfnB& (setq fp (open fname "r"))
AS;qJ)JfzQ ijzwct#. (setq txt_tb '())
C4|OsC7J wp>
z04
(while (setq txt1 (read_line fp));依次读出各词组
~<_WYSzS 'U0W (setq txt_tb (cons txt1 txt_tb))
RU~ku{8? *yjnC )
={N1j<%fh g]`YI5 (close fp)
v'S5F@ln jI H^ (setq txt_tb (reverse txt_tb))
p?4[nS-, dh&>E (start_list "what");在列表框内显示词组内容
VYO1qj oVPr`] (mapcar 'add_list txt_tb)
U/|JAg# Qf}.= ( (end_list)
xk7Dx} _:p-\Oo. ) ; progn
i*@PywT"i3 L/]
(pXEp (progn
%2g<zdab _nxH;Za (alert (strcat "文件" fname1 "不存在!"))
Q[K)Yd H6|eUU[& (set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
x-%RRm<V VY+P c/b )
d%-/U!z? w-LENdw ) ; if
Ot:}Ncq^\O SPt/$uYJ )
PJe_qP )7o?}"I ;主程序开始
@h!Z0}dX( Qr4 D (setq olderr *error*
&);P|v`8 NVsaV;u *error* txterr
u'>94Gm} 5r~jo7 oldcmd (getvar "cmdecho")
!jSgpIp 6pbCQ
q )
E]GbLU;TH b.@4yW (setvar "cmdecho" 0) ;命令不回显
ms&1P 5\#I4\ (setq nn 9) ;词组分类数
dIYf}7 P #RaqNu (init) ;初始化
K%x]:|,>M 2.b,8wT/ (diag) ;驱动对话框
}zQgS8PQH QeuM',6R (if (and ok txt)
o.0tD Bdb}4X rL (progn
ThI}~$Y "#E<Leh' (if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
LR>s2zu- f pq|mY (/= (cdr (assoc 40 sty)) 0) ;字高是否为定值
ftR& 5!Wm G:tY1'5 (/=(getvar "TEXTSTYLE") "HZ");当前字型是否为"HZ"
%N fpEo %'2.9dB )
W.jXO"pN Y_+#|]=$B (command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ;设置"HZ"字型
"V26\ UF#!6"C@ )
2HN*j~>i~ igk<]AwxS (initget (+ 2 4));下面的输入值要求大于0
P@vUQ BOG.[?yx (setq ht (getreal "\n请输入字高<500>:"))
$Vq5U9- M.- {-> (if (not ht) (setq ht 500))
TaBya0- _
s3d$C?B (setq pt (getpoint "\n请点取文字起点:"))
&|#[.ti1 ?<C(ga (command "text" pt ht 0 txt)
oYZ
4F E(|A"=\ )
fPUr O j7kX"nz )
il@>b qfE0J;e (setq *error* olderr);恢复原设置
u*)/e9C i:0v6d (setvar "cmdecho" oldcmd)
K8X7IE J~]@#=,v (princ)
=N\; ?eF( hoqZb<: )
xS/W}-dPv /#M1J:SV // #txt.dcl
D~ Y6%9 U,EoCAm> //供#txt.lsp调用
{&IB[Y6 #[{{&sN filetext : dialog { //对话框
QTi@yT: pS ](Emn`. 名称
=IsmPQKi 06f%{mAZS label = "常用词组"; //对话框标识
?`Yu~a{
w_Slg&S : row {
z0<E3t O?Bf (y : boxed_column {
Bc"MOSV0 `K.C>68 label = "索引";
B&6NjLV 2MRd : radio_button {
b},2A'X 9efey? z label = "常用术语"; //多选一按钮
jL\j$'KC L?d?O key = "c1";
:kR>wX iv~R4;;) value = "1"; //初始值为"1",表示选中
j*?8w(! ^:{8z;w!( }
nD
BWm`kN //2O#Fg{/ : radio_button {
lfHN_fE>Mq \DQu!l@1U label = "图纸名称";
{fACfSW6 2j%=o?me^p key = "c2";
o{,IO!q hi!A9T3%}M }
z1Ieva] u>fMO9X}2 : radio_button {
HRyFjAR\? 6^LXctW. label = "房间名称";
&>Ve4!i
q UXBWCo;- key = "c3";
metn& W:RjWn @< }
B<SE|~\2 e^O:I : radio_button {
LRu,_2" >k\pSV[ label = "卫生器具";
'r]6 GC8Z$ DH?n~qKpC key = "c4";
Nz2V aZ MT~^wI0a }
p [C
9g 5VTVx1P[8 : radio_button {
e' l9 TxPFl7,r label = "管材配件";
9?,i+\)qK@ `#ruZM066 key = "c5";
GfELL`yz wPM>-F }
]%A> swCpn 1- s(v)cxh : radio_button {
+;~o R_p p$\>3\ label = "器材仪表";
~6i'V?> }"T Q\v$ key = "c6";
i4|R0>b AaYH(2m- }
-fPiHKJ @6'~RD. : radio_button {
({j8|{)+ IADHe\. label = "常用设备";
&K0b3AWc Qz[^J key = "c7";
Li6|c*K' z='%NZY }
r"2lcNE Mm@G{J\\ : radio_button {
Z|E9}Il] v>wN
O label = "构筑物";
kAEq +{h I*N"_uKU key = "c8";
!0@4*>n FB?~:7+' }
MG vz-E1e Hnt*,C.0 : radio_button {
$b|LZE\bU. 6HK1? label = "其它";
s0' haU {d[Nc,AMb key = "c9";
^Ye(b7Gd sg7h&<Xx }
d2UidDU5qa ?\8aT"o }
SQ,-45@W (O+d6oT=Z2 : list_box {
$L= Dky7 !=:>y WQ label = "词组内容";
Ts
!g=F 44*#qLN key = "what";
3l?|+sU>O 1]:,Xa+|S height = 15;
>"2jCR$/ zTcz+3x width = 26;
&"%Ws{Qn] t?>}0\1 allow_accept = true; //可双击鼠标选取
#$BFTlm| X0
|U?Ib? }
Vbv^@Kp B9NUafK= }
0FcDO5ia ="$w8iRU spacer_1;
,CyX*k8o <CVX[R]U : edit_box {//编辑框
mj'~-$5T 5&s6(?,Eu label = "所选词组:";
<)TIj6 +=J$:/&U key = "sel_ok";
x 4v:67_^ @}4>:\es }
~Yd[&vpQ XDCm spacer_1;//增加间距
SEI0G_wk$ >`03EsU ok_cancel;
*}89.kCBF V|
Fo@ }
www.opticsky.cn" >