本文提出了一种用对话框实现
AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为
CAD应用提供了方便。
r<$"T i >BQRbU 一、引言
xHlO~:Lc oK2j PP 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
2'}/aL|G fLuOxYQbf 二、原理及方法
Htce<H-P .R&jRtb/E AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
MVp+2@)}s OlX
otp8 左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
TcH7!fUj :MF+`RpL 三、程序使用方法
E> YE3-] 9gETWz(3I 先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
uh3<%9#\k }`_x%]EJ 然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
GAlM:> -'j|U[&N\ 在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
W"5VqN6v KK/siG~O 需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE"
?b?YiK&yz Y-]Ne"+vf "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
H|<Zm:.%$ YDGW]T]i ? 本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。
YvFt*t
Q'Y7PG9m~ (defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
"lKR~Qi [9~6, ;6 ;定义错误处理子程序
=la~D]T*g 1*OZu.NdK (defun txterr(s)
^x}k1F3 4R9y~~+ (if (and (/= s "console break")
;_A?Zl} ,UW!?}@ (/= s "Function cancelled")
6FEIQ#`{ D3C3_
@* (/= s "quit / exit abort")
!Gh*Vtd8- p9~$}!ua )
l
!JTM Pq3|O
Z (princ (strcat "\nError:" s))
o=C'u '-rRD\"q )
U;FJSy %kV #UzL (if olderr (setq *error* olderr));恢复原系统设置
byX)4& )Vpt.4IBd (if oldcmd (setvar "cmdecho" oldcmd))
;~n^/D2. nRheByYm (princ)
'E4}++\ @"/:Omh )
c{})Z= /(DnMHn\ ;对话框显示及驱动程序
|) CfO 4 VB}^&{t)! (defun diag ( / i)
Lwkl* o|y1 m7X (if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
<!derr-K G@o\D-$ (progn
d,0Klew !OMl-:KUzE (if (new_dialog "filetext" dcl [JX*6]id);显示对话框
x]~&4fp 0uJ??4N9 (progn start_list "what");将词组显示到列表框内
Z^#u n Pk&sY' (mapcar 'add_list txt_tb
ria.MCe\! I"HA(
+G )
F??gVa aj [s~6,wz (end_list)
1i@a? 27| 4z,/0 (setq i 1)
F+<Z%KuCu 4,?WNPqo (repeat nn;点取词组分类项后的操作
%(:{TR fY!9i5@' (action_tile (strcat "c" (itoa i)) "(wr_txt)")
* 5(%'3 7
/XfPF (setq i (1+ i))
-b=Aj8h t/h,-x )
Jj~|2Zt 96<0= (action_tile "what" "(setq i (atoi $value));选中词组
D|IS@gWa RSup_4A (setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
fxc?+<P #E#Fk3-ljQ )
u0nIr9 c uHF^l (action_tile "sel_ok" "(setq txt $value)")
jt3=<&*Bm 'q1cc5(ueV (action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
I8{
mk h M[ ON2P; (action_tile "cancel" "(unload_dialog dcl_id)")
K7wU
tg [R<>3}50Y (start_dialog)
>O~ bmO(tQS$5 )
]E#W[6'VtB =4gPoS (prompt "\n无法显示对话框FILETEXT!请检查对话框内容!")
)&qr2Cm* )a<MW66 )
~"r(PCa@ f(T`(pX0V )
\6%`)p 2Mj_wc (prompt "\n无法加载对话框文件#TXT.DCL!请检查文件是否存在及路径是否正确!")
%]N|?9L"= |v_ttJ;+Y )
-Sa-eWP JthU'"K )
vPAL, ,>Dpt< ;初始化程序,把第1个分组项中的词组读入表txt_tb中
@Y!B~ YmLpGqNv (defun init( / fname fp txt1)
&FWz7O>1 Ey{p;;H (setq fname (findfile "$txt1.dat"))
`@{(ijg. se*k56, (if (not fname)
uobQS! #szIYyk (progn (princ "\n文件$TXT1.DAT不存在!") (exit)) ;文件不存在,则退出
FIx|4[&>S \cK# /;a# )
~Gl5O`w( #X2wy$GTG (setq fp (open fname "r"))
8\p"V.o> v
,zD52 (setq txt_tb '())
_%(.OR o $'K}U (while (setq txt1 (read_line fp))
X XxH<E$p *bUOd'vh (setq txt_tb (cons txt1 txt_tb))
L. 8`5<ITw K$O2
Fq@y )
QwL*A `@ v>_83P` (cl
YKzfI9Y 8Yo;oHk7 ose fp)
l[C_vUg O+]'*~a (setq txt_tb (reverse txt_tb))
uZ'(fnZ$ ,P=.x% (setq old_nn 1);记录索引号
?} lqu7S p-H}NQ\ )
9+ |W; NDJP`FI ;更换列表框内词组显示内容
^
4*#QtO uzhTNf (defun wr_txt ( / fname fname1 fp txt1 i)
c )=a;_h \"w+4} (setq i 1)
ElK Md p3e=~{v* (while (<= i nn);判别哪个词组项被点中
POf xN. a)I>Ns) (if (= (get_tile (strcat "c" (itoa i))) "1")
bt Bu[; bz.sWBugR (setq fname1 (strcat "$txt" (itoa i) ".dat")
).-# =sF4H_B i nn
U2CC#,b!( 7spZe" )
N#XC%66qy! A(H2Gt
D )
`G%h=rr^c ?Ezy0>j (setq i (1+ i))
ct<XKqbI AQ,"):ofvT )
C_yNSD QL*RzFAD3 (if (setq fname (findfile fname1));查找文件是否存在
/IF?|71,m tH#t8Tq5x (progn
5rmQ:8_5 j8aH*K-l{ (setq old_nn (atoi (substr fname1 5)));记录索引号
/:"^,i\t 5sNN:m (setq fp (open fname "r"))
+ R~!G ;aD?BD__Z (setq txt_tb '())
mF
UsTb]f f4&;l|R0a (while (setq txt1 (read_line fp));依次读出各词组
?FwHqyFVlQ `g4N]<@z (setq txt_tb (cons txt1 txt_tb))
%e)?Mem Ya(3Z_f+VZ )
&Pc.[k m/,80J8L+f (close fp)
+ej5C:El_} h<8c{RuoZC (setq txt_tb (reverse txt_tb))
J#jFX
F\ ;mC|>wSZ (start_list "what");在列表框内显示词组内容
Y0J:c?, A.h0 H]*Ma (mapcar 'add_list txt_tb)
btC6R>0 (!qfd
Qq# (end_list)
@Ae&1O;Zh _!Pi+l4p/} ) ; progn
J8ScKMUN2 k'+y (progn
$&1D l ;=k{[g 'gv (alert (strcat "文件" fname1 "不存在!"))
'St?nW3 At
!:d3 (set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
.}T- R? W;os4'h$ )
?M6)O?[ dBS_N/ ) ; if
GG-b)64h` Dy8H(_ )
Qwve-[ +5 gX6V\ ;主程序开始
n_k`L(8* `Q#)N0 (setq olderr *error*
Y3s8@0b3 atw*t1)g *error* txterr
j}`ku9S~ WFhppi oldcmd (getvar "cmdecho")
:ln?PT
Ts3!mjn )
@&%/<|4P5 /-t!)_zvw (setvar "cmdecho" 0) ;命令不回显
7I@df.rf6J .o,-a >jL (setq nn 9) ;词组分类数
dLeos9M: m,J
IId%O (init) ;初始化
R0F [ Sw$/Z)1K& (diag) ;驱动对话框
RlbJ4`a
-B!
a
O65^ (if (and ok txt)
B&<5VjZ\ 9_.pLLx (progn
3gD <!WI G2 V$8lh (if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
EwgNd Gcj P}( c0/ (/= (cdr (assoc 40 sty)) 0) ;字高是否为定值
Z;BEUtR
c L/,gD.h^ (/=(getvar "TEXTSTYLE") "HZ");当前字型是否为"HZ"
wZ69W$,p dm40qj )
.IVKgQ
B !q$>6P (command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ;设置"HZ"字型
%++S;#)~ !0UfX{. )
)OucJQ m7RyFnR2 (initget (+ 2 4));下面的输入值要求大于0
cKOXsdH?SL 6}0_o[23 (setq ht (getreal "\n请输入字高<500>:"))
kmo#jITa` (Q
^=^s| (if (not ht) (setq ht 500))
?I:_FT .6y*Z+Zg (setq pt (getpoint "\n请点取文字起点:"))
z4` :n. "}ur"bU1 (command "text" pt ht 0 txt)
g>eWX*Pa| $}5M`p\&C )
xDSiTp=)O $uUyp8F )
E[=&6T4 $G9E=wn (setq *error* olderr);恢复原设置
k>8OxpaWv? +
65<|0 (setvar "cmdecho" oldcmd)
,KF>@3f 2n2,MB (princ)
hkV*UH{ | z_av )
H@ty'z? RdL5VAD // #txt.dcl
&e#pL`N *UJB*r //供#txt.lsp调用
dl |$pm@x ,zH\P+* filetext : dialog { //对话框
]W%rhppC !U(KQ:j 名称
:D>flZi {ehYE ^%N label = "常用词组"; //对话框标识
p)"EenUK eb,QT\/G : row {
;- Vs|X cXN0D\%` : boxed_column {
QfM^J5j.M? W?.xtQEv label = "索引";
mUR[;;l ~7Nqwwx : radio_button {
B>z^W+Unyn F8{T/YhZ label = "常用术语"; //多选一按钮
vp d!|/ {_z6 key = "c1";
'-G,7!.,r% -XkjO$=!= value = "1"; //初始值为"1",表示选中
#>BC|/P} 0tMzVxS }
^{++h?cS) //Xz : radio_button {
qEdY]t F^TOLwix label = "图纸名称";
P>x88M KK-+vq key = "c2";
!}1l8Y Ls.g\Gl3 }
BP4vOZ0$ (>Pz3 7 : radio_button {
a<+Rw{ 5`K'2 label = "房间名称";
XoMgbDC qPhVc9D# key = "c3";
b
Hy<`p0 *S4&V<W> }
Y!|}; P5"B7>L: : radio_button {
soKR*gJ, mcQ\"9 ;pY label = "卫生器具";
i@<w"yNd_ )_kEy>YscZ key = "c4";
*t={9h H-X5A\\5 }
xu;^F ~n/:a : radio_button {
(ijO|%? y92<(ziaX) label = "管材配件";
u/\Ipk/ g)MLgjj key = "c5";
/`O'eH j{zVVT }
^4saB+qm I&x69 : radio_button {
^1--7#H O9{A)b!HB label = "器材仪表";
!W=2ZlzS ({!*&DVu key = "c6";
ab 6D & 2b:I. }
mj y+_ *I9G"R8 : radio_button {
a1weTn* _g"su# label = "常用设备";
6|%HCxWO YeF'r.Y key = "c7";
HlX7A1i/ hDEZq>& }
8[8U49V9( 27H4en; o= : radio_button {
B_.>Q8tK; mOYXd,xd label = "构筑物";
G&7 } m B#4 J![BX key = "c8";
6AmFl< .:, 9Tf }
P~"""3de4 Z?w=- : radio_button {
,k/<Nv; ] m^ECA$ label = "其它";
NW Pd~l+ *P[N.5{ key = "c9";
F=kiYa} `P9%[8`C 9 }
2f -Or/v v8A{q }
P99s 2{#=Ygb0 : list_box {
E`uK7 2j R~BW=Dz,e label = "词组内容";
oga0h' B&H
[z key = "what";
`3F/7$q_ H0mDs7 height = 15;
.s@[-!
p -QP1Se*# width = 26;
kc:2ID& h$fC/Juit allow_accept = true; //可双击鼠标选取
gJBk&SDgtP ,[Z;"wE }
H\e<fi%Q (fWQ?6[ }
q]t^6m&- .w]S!=h spacer_1;
C/pu]%n@4 Z7R+'OC : edit_box {//编辑框
'~'3x4Bo aw/5#(1R label = "所选词组:";
::kpAE] [p_C?hHO key = "sel_ok";
3836Di:{ aA.TlG@zP }
SYTzJK@vZJ L"!BN/i_ spacer_1;//增加间距
D$c4's`5 "A9 c] ok_cancel;
.c.#V:XZ#U 5bKn6O)K }
www.opticsky.cn" >