|
本帖最后由 luolizhong123 于 2009-11-16 06:17 编辑
% k' M! x/ f! |0 [& n5 n/ c& X9 q, v" @( A4 x" z1 I: i6 a. p
本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 ! F0 F/ ?! Z8 J6 J
一、引言
+ K. }/ i5 g7 ^ 汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。1 T' Q4 `& ?3 f a& C
+ I5 T% m# S3 u# e# y
二、原理及方法
, ]# C/ E& f, V6 r/ W. m* B# m AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。 " ?2 m% [) I9 U6 i7 s+ |
左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。 7 h- f, u% _+ d8 P# Q0 ~- E8 Y3 r
三、程序使用方法 6 y9 W8 o4 r6 K& `. r' ^* y
先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。 2 v3 r, p" E7 J( |# N# D
然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。 % i/ i% t+ Q: \
在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。 5 v0 f# f6 }& ~
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
8 Y2 h& O5 R2 ~本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。
1 f9 `' ~6 n, E(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) - ^6 t, o* Y& E) q
; 定义错误处理子程序 / S. T" \3 t0 C! O. Y) @3 g
(defun txterr(s) : l3 P/ m* {2 g+ H& O7 }+ f/ Q. B
(if (and (/= s "console break")
8 T2 o1 B. m) \0 ?- X. Z! w: q) R(/= s "Function cancelled")
! A( O" z* H4 E4 _# Q0 ~& G/ t; O(/= s "quit / exit abort") " ]1 m6 L& J$ X0 N. ~% E
)
8 m& x' a* c3 y/ U# z7 E(princ (strcat "\nError:" s))
4 H" z# m0 q9 p4 {; m) 6 ?: I7 l% U: F/ k
(if olderr (setq *error* olderr)); 恢复原系统设置
1 ?, f# B& Q3 V3 R7 L(if oldcmd (setvar "cmdecho" oldcmd)) 6 q8 y0 ^! S. {6 A( r/ d$ r
(princ) * E0 T% A% C$ o: U. y- Y2 U! x N
) 6 I5 U) N4 @- z
; 对话框显示及驱动程序
. O' ~6 T5 d+ d0 ~' ](defun diag ( / i)
/ m; x7 A, p# N8 D! K4 o+ Y(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件 5 F' F3 d6 j6 {: J
(progn
# B( F) v( V0 ~ _2 C5 |(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框 5 H7 m" k6 b# m3 Z# w7 o R
(progn start_list "what");将词组显示到列表框内
" b: Y) O, n w- o! \" i% X0 [0 i& f(mapcar 'add_list txt_tb
! K1 V* j) w) C! S4 f) 8 O8 x6 k- b+ o" r* k, Q
(end_list) , s3 F; v: ^6 r8 |# h
(setq i 1) 9 d% h% [7 {6 S! u" Z, I
(repeat nn;点取词组分类项后的操作 " H% K" ^5 @5 L
(action_tile (strcat "c" (itoa i)) "(wr_txt)") * Y5 S6 S+ ]( f: n! o0 @& \$ E
(setq i (1+ i)) % P; W/ h2 h2 q2 z( u% S4 A. Y2 a& t
) 6 P5 L, _" W$ O
(action_tile "what" "(setq i (atoi $value));选中词组
^2 w5 G/ |' y+ W, k+ x/ d: F$ P' o! S c(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)" % b0 y/ Y. X& e' P# h& A; B
) ^3 X# [- Q; ]8 t k7 [1 {
(action_tile "sel_ok" "(setq txt $value)") 2 H0 y# C1 A; t* m/ H+ ~: R7 \
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)") 5 V& k9 l& ]; P& _0 J/ o4 V `# }
(action_tile "cancel" "(unload_dialog dcl_id)") ; s& x1 a% F. E! @
(start_dialog)
& M. G; Z" O0 M* i( K( o) Y)
9 X9 O% `( w( n2 m0 f! f(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!") ' M4 S6 W* K/ A( _4 I8 u" {
)
, I* j7 w" B) r, t K1 i) 4 O+ f7 S# M+ N0 @* N1 w# e) \4 A' V
(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!") : x: b/ o* O, x
)
/ j; t2 D9 r: A& e) i) 5 B1 m7 F" z6 a$ a
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中 7 Q8 C8 i- s8 B( ?7 }* @ _1 v
(defun init( / fname fp txt1) ( w( I8 j% Z( }7 [ B) F) p8 R* D
(setq fname (findfile "$txt1.dat")) # s. l0 V5 Z& ~
(if (not fname) & V# L, z% t2 s3 w( a) E1 i5 y
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出 + X+ h; H' Z: z c' @5 J
) ; T8 p, g# Y- z# e8 ~2 c* E) F
(setq fp (open fname "r"))
v5 N# V5 @5 i: w! i(setq txt_tb '())
" v! H3 ?( v; V6 `(while (setq txt1 (read_line fp)) - B' I4 z2 A; Y
(setq txt_tb (cons txt1 txt_tb)) & @$ J1 a2 `2 f
) 0 H8 v2 F5 G) g% x! n/ u
(close fp) , Q! y8 G6 f8 ~1 f
(setq txt_tb (reverse txt_tb)) ; C7 N, f0 O9 Q: b, S5 }5 e7 D+ V
(setq old_nn 1);记录索引号 % g7 ?- A$ e- o
)
; k; M* Z/ [9 ~/ P# h* O; 更换列表框内词组显示内容
7 q( q) o n& y) Z& D(defun wr_txt ( / fname fname1 fp txt1 i) $ z: S' V8 V& r# [0 U
(setq i 1)
7 s7 }+ W, k7 }' P(while (<= i nn); 判别哪个词组项被点中 R3 [! S: p+ v, z. r/ T
(if (= (get_tile (strcat "c" (itoa i))) "1") ) K( \( ^1 b$ l# L
(setq fname1 (strcat "$txt" (itoa i) ".dat")
: H' v1 j K8 Ri nn
4 v% j0 Z0 m& i. l0 R. q4 c" {) _)
9 ~9 r$ R1 C7 b' ~! V)
* X& [. w2 n( ^6 ~8 O- e5 W7 U7 j K(setq i (1+ i))
3 u' S* Q9 ^4 `$ ~$ B) 0 @1 q7 f: m% S
(if (setq fname (findfile fname1)); 查找文件是否存在 & j( Q6 K# b' j2 V
(progn " B: S3 @: e, y
(setq old_nn (atoi (substr fname1 5)));记录索引号 ( a' f, s/ o2 x' q% d" W: ]
(setq fp (open fname "r")) 1 k( V4 }% C# [" w, e3 u
(setq txt_tb '())
! u! z" c! P* x$ d- |+ W(while (setq txt1 (read_line fp));依次读出各词组
) D9 N; J' V p: }; c(setq txt_tb (cons txt1 txt_tb)) 1 r' q: e! L8 X! d
)
( G$ g5 S7 f9 X' B(close fp)
2 P- m: L" m* o8 w0 j! r+ f* `$ h(setq txt_tb (reverse txt_tb))
9 z# q) V1 |+ _' Z" `(start_list "what");在列表框内显示词组内容 & y F8 e' R' ^8 D7 ]" o; F! E
(mapcar 'add_list txt_tb)
& _: m$ f7 f. R(end_list)
0 M( W4 d! u6 T( L. n0 Q3 }- v) ; progn O: a. \/ K s% f% I7 T, U
(progn
& X6 k. E" T8 Q5 W$ Q(alert (strcat "文件" fname1 "不存在!")) 7 `) ^% T: t- n3 R
(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
# t# d1 n7 O2 L4 [7 f6 u- J" _) # w- u9 K8 Z+ c
) ; if / j8 ~, n" Z1 I, I+ J
) ) J& A1 q1 q6 Y/ Z) N% a
; 主程序开始
" d: q; D! l0 W( b P(setq olderr *error*
; P p4 j6 X d: `2 w*error* txterr / R! C( O5 y7 L: ?
oldcmd (getvar "cmdecho")
4 ~% c! y E4 j" Q; E3 l* e)
V2 Y3 d+ [. X: z0 a(setvar "cmdecho" 0) ; 命令不回显 5 r0 L# {2 u; B; F
(setq nn 9) ; 词组分类数
* ?" t$ w9 D: B3 o/ Z(init) ; 初始化 5 D9 o( R# @& N" H9 t/ F/ b1 j2 p% x
(diag) ; 驱动对话框
5 U; Q0 L: I, d: ](if (and ok txt)
4 q2 j$ E, m" ]: X5 g(progn " k/ s, d: [3 H) s8 }# {; z
(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在 $ I0 F( n! ~+ `3 i4 `
(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值
% b J5 o, I+ o5 h: b- J3 w6 K(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ" ( V V& x' e8 m" L6 e
) " I- e/ E V1 Q( S! u' ?% L
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
/ T0 d3 |) A* D! p) ' j! t) \5 W; y0 o" Z. j) u
(initget (+ 2 4));下面的输入值要求大于0 1 i, G. c5 j; R4 `; e9 X8 H! J
(setq ht (getreal "\n请输入字高<500>:"))
" O! V1 h+ V B( {3 O5 i; U A! X(if (not ht) (setq ht 500)) 6 w3 V2 J% C8 }8 A4 Y
(setq pt (getpoint "\n请点取文字起点:")) 8 J0 o- y/ G. Z. o
(command "text" pt ht 0 txt) 2 j9 Z& B9 x; M7 }0 `
) $ n3 Y# R( j% M6 \3 n+ {
) , Z2 C4 A$ M0 c
(setq *error* olderr);恢复原设置
7 ~8 K- d: ^3 y* D(setvar "cmdecho" oldcmd) 2 T) x5 x7 x2 g5 u
(princ) ) o6 X2 X7 s( w2 r0 k9 q! B
) ' s* Z& g! k8 b/ U9 D
// #txt.dcl
" F7 X' d, k, {// 供#txt.lsp调用
( i" C& w0 o$ ]+ d5 K; L6 tfiletext : dialog { // 对话框名称
( d. k) {0 ]8 Blabel = "常用词组"; // 对话框标识 $ ~$ O3 _5 _, n1 ?+ Z+ b
: row { ; l) j4 b5 Z9 d* v
: boxed_column {% L9 J9 d4 A( v- B. Y7 G$ P
label = " 索 引 "; 0 m0 Y* u [$ O. L$ {% u
: radio_button { ) u% }, F8 k a- e Z# {) r# W
label = "常用术语"; // 多选一按钮 v; v* @7 N- L, G- |
key = "c1"; 2 o1 u2 ^0 B, h8 S
value = "1"; // 初始值为"1", 表示选中 2 H0 G3 N/ J# i/ M4 g
} : radio_button { , |4 h5 j$ x. t* x- |: ]
label = "图纸名称"; / W( n5 q6 v, L" T; o+ c9 g* i
+ T+ I# p; ~4 _) f+ a, s0 L' u( ?8 N
key = "c2";
7 T0 c7 `+ I* |9 C) |) w! ^' I}
0 m! g- S9 r: r- P" J+ s; s9 B: radio_button {
/ F" }% t+ z5 u, U* E" r- u- g9 m: }label = "房间名称"; ) k- q% f! }8 E* y, s* _
8 D0 u! U6 `+ Q! O
key = "c3"; / \. |( d7 S1 A7 J8 |& u
} : radio_button {
) _* B) C9 X# C1 z/ {4 d ylabel = "卫生器具";
! @. L1 ~/ x& [. gkey = "c4"; . n; O+ v, A* S; F( _4 R- {
" ~( a/ V) _- e$ j8 O- W, q1 q
} : radio_button {
; g: r& F) J: Y9 ^label = "管材配件"; ) J1 ~, ]+ {8 p
key = "c5";
7 o, k! O3 H& q0 r' U} / L/ s) c# K3 D( E: Q+ L
: radio_button { label = "器材仪表";
! F% O7 z+ V2 v E0 A9 Hkey = "c6";
u# G& y8 ~( _7 s, }8 Z
8 T: L4 N: {& w& q5 m9 o} : radio_button { label = "常用设备"; * z( X+ \: |6 m5 c* z) c+ f7 V
key = "c7"; }
. t. H7 e, U! B* c: B( g F& b. e5 _: radio_button { + W4 Y+ G3 H5 ^) J7 h3 ]$ P
label = "构筑物"; 8 b! p+ N9 g! ?
key = "c8";
# `: _$ A: L% X* p8 u6 q}
+ F$ F. A6 \1 x% h9 M b. k: radio_button {
) v, l* i6 t# a3 A6 J/ {+ ?# i0 P A; l- ` @, x& P
label = "其它"; # O7 ~! s' @7 ]: F7 Z
key = "c9";
( y# q, k! @! R} 1 V: v0 L9 \+ `
} ; ]# G$ _# w6 @! X0 L; `* x
: list_box {
0 W& B9 f0 t% R% ~/ e# o9 Zlabel = "词组内容"; / n3 S% z, b0 N& e; R: c6 \. c: q
key = "what"; 4 @5 w9 [9 ~$ e
height = 15;
! D0 T. u$ d8 ]% J2 h u* uwidth = 26; ! u9 b. k+ l f% n: e
allow_accept = true; // 可双击鼠标选取
" u$ x1 }0 X. P2 u
' p7 m" @/ z* B} / j% b1 A; G6 B$ d$ m9 o. Z- A
} spacer_1; ( q# I& j. Q& C- e7 v( A
: edit_box {// 编辑框
: A* I7 C* o! `5 e; I ?3 ulabel = "所选词组:"; 9 r6 _' S* A( w9 y' K8 S8 G+ [4 n
key = "sel_ok"; & s/ P# C9 Q f8 k; h6 W% g, w+ F1 I
: I2 }( E$ m ]} spacer_1;// 增加间距
( @; O2 [$ g# @- D7 \ aok_cancel; |
|