摘要 [HT5SS]本文提出了一種用對話框實現AutoCAD內常用術語自動標注的方法。用這種方法,可方便地將各種常用術語標注在圖中,為CAD應用提供了方便。
, U$ [. [. `0 Q9 p, a 一、引言 - ] {. ~- C6 s# V F0 r
漢字的標注在CAD設計制圖中是一個重要的部分,也是一個較為繁瑣、困難的部分。目前,在AutoCAD內漢字的輸入大多采用拼音方式,對拼音不熟悉的人來說漢字的輸入就很困難。如果能將設計中常用的文字術語直觀地顯示出來供設計人員調用,將會極大地提高工作效率。本文就此進行研究,提出了一種用對話框(下圖)將常用術語顯示并供調用的方法,同時給出了源程序,供大家參考。該程序已應用于我院的實際生產中。 ; d K8 v' x+ J+ x

# B1 P" j( K+ T) r% V! e# K1 g二、原理及方法
" u) }1 I: j; K, T) g) Z AutoCAD對話框結構包含有多種構件,如edit_box(編輯框)、list_box(列表框)、radio_button(多選一按鈕)等,利用這些工具,可以開發出界面友好的實用程序。
- A& l* l" d' a5 K3 Q$ `( | 左圖就是用這種方法實現的。將常用詞組分類,分別存于不同的文件中。根據多選一按鈕中所驅動的分組號分別打開不同的文件,將文件內容讀入并顯示于列表框內,供設計人員使用。同時,設有一個編輯框,可將所點取的詞組顯示于編輯框中,便于用戶對詞組進行適當的修改,如刪除或增加字符等。這種方法有一個優點,用戶可十分方便地根據自己需要修改或添加詞組內容。對話框文件及驅動程序分別見#CAL.DCL及#CAL.LSP。 # f' L/ q, K4 D6 ?% m+ h6 [
三、程序使用方法 5 z2 G" h2 i+ K5 X; ?* I5 x( W
先用WPS、EDIT等編輯程序分類建立詞組庫(注意,需要存成純文本格式),每個詞組占一行。程序要求將"常用術語"、"圖紙名稱"、"房間名稱"等各分類所對應的詞組庫文件名分別為$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一個文件不能少外,其它文件可空缺,但當點取該分類項時,系統會提示有關文件不存在的信息。 + [, w, u- {+ Q9 q
然后將所建立的詞組庫文件及所提供的程序#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以后可直接從菜單中驅動該程序。 8 \( ?0 A, q; H
在COMMAND:狀態下,鍵入#TXT后,系統彈出一個對話框,根據需要點取所需的詞組類別,再從列表框內選擇所需詞組。所點取的詞組會在編輯框[所選詞組]中顯示。用戶可以在此對詞組進行必要的修改,點取[OK]后,根據提示輸入字高及起點即可把詞組寫到圖中。
. C V. w- q4 v) J7 c需要說明的是,本程序中是將文字以"HZ"字型寫到圖中,要求字體為TXT.SHX及HZTXT.SHX。若您的軟件中無這兩種字體,可將其它字體改名為該兩種字體(要求一個為英文字體,一個為中文字體),或將程序修改為您所具有的字體。但需要注意,也許您的字體在用于設置字型時會多一個選項,詢問是否垂直書寫文字,此時,可將字型設置一句改為:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
6 T& N# H1 }9 k( ], e本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均調試通過。 ) {+ W( z8 h! A. u7 E# ]( s
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) $ H% b; j/ J! u" h8 q# e! Q- ~
; 定義錯誤處理子程序 - e( n) d3 w& U4 A3 v. ~' }7 ]5 M2 y
(defun txterr(s)
0 N6 `: ^# w v) N; O: T' z' h(if (and (/= s "console break")
9 x# `3 n2 L! e+ C0 h% t; y(/= s "Function cancelled")
( S6 g$ T# W" k(/= s "quit / exit abort") 6 J/ W8 l: _, }. N- \9 i
) 5 x9 ?- k, t9 c# Q+ r s
(princ (strcat "\nError:" s))
4 I8 @1 c2 F0 C" X3 |# D)
" U; H( p+ Y7 `% Y. V8 m(if olderr (setq *error* olderr)); 恢復原系統設置 2 U3 {' R6 l$ o0 v# [+ A
(if oldcmd (setvar "cmdecho" oldcmd)) 0 N4 b3 \) r$ P1 v8 o* Z3 x
(princ)
4 Z% v) o' Z0 j) w; d( r) 7 T" r" _4 z" N" {* R3 }3 s
; 對話框顯示及驅動程序 " L" }8 a) C$ h$ n
(defun diag ( / i)
( |4 ~( o8 Z- O0 Q- j/ T* Q) c(if (> (setq dcl_id (load_dialog "#txt")) 0);加載對話框文件
' S' l; G1 {$ u& }! N(progn
8 v' O# c& L& [* a; C+ O3 b(if (new_dialog "filetext" dcl [JX*6]id); 顯示對話框 5 v" b6 t6 @+ D) W
(progn start_list "what");將詞組顯示到列表框內
8 g: r3 Y- b3 H' u" f) n(mapcar 'add_list txt_tb
( B) {% O" t' e5 a- l4 \) 4 y; G. E! A+ o' a
(end_list) 7 t; i' v# R1 F0 x8 v
(setq i 1) # N; n$ C0 a- K$ b4 q5 i
(repeat nn;點取詞組分類項后的操作
# @% o0 J1 Z8 `9 W* ^' r: Q(action_tile (strcat "c" (itoa i)) "(wr_txt)") h/ K2 x/ I' y: I4 _* r
(setq i (1+ i)) # S s8 e G! c2 R; `9 S
)
% }4 ?' k9 L" u(action_tile "what" "(setq i (atoi $value));選中詞組
& G g! `8 j# n7 n" b' G( X(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
* M4 K9 b& x$ t9 o+ T) * {9 m v- D" g
(action_tile "sel_ok" "(setq txt $value)")
' m" _2 u9 `8 V) J(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)") 7 `4 |2 X! T; A" i3 C( ?
(action_tile "cancel" "(unload_dialog dcl_id)") 9 a5 B" D- D$ r. O% B5 P2 a
(start_dialog) ) x$ I. o$ k- O6 W
)
/ s' E2 N# i; c. P) H; I- ^" F d(prompt "\n無法顯示對話框FILETEXT! 請檢查對話框內容!") ( b, ], i4 F, w- E" Y: Y2 h
)
! r( C4 }& n) C: T- h! f+ ^' \- [$ \) # G- H$ C- l: e% X* w6 d. B. ]* V
(prompt "\n無法加載對話框文件#TXT.DCL! 請檢查文件是否存在及路徑是否正確!")
2 a" Y0 E9 \0 F0 { Q9 g' L- r. V) 2 X( q: `0 _0 y8 h8 {
) 7 H; \1 A+ `( m" [, p$ E4 E; s
; 初始化程序, 把第1個分組項中的詞組讀入表txt_tb中
! [' V3 V0 ~9 q1 L1 b8 g% B: L(defun init( / fname fp txt1) 4 M$ r' \; C7 Y/ v! U
(setq fname (findfile "$txt1.dat"))
* i, s2 _6 j1 `/ |(if (not fname) K: S$ g7 @- o% r
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 則退出 4 C5 u, Y; x3 }7 P
)
( }: ^( S$ q9 g(setq fp (open fname "r"))
! X% j- ^& ` |* `(setq txt_tb '()) 8 F' ~+ a, n7 ~; t% \
(while (setq txt1 (read_line fp)) 6 X3 Q( K' T+ e. A8 j+ T' R# l7 ~
(setq txt_tb (cons txt1 txt_tb))
! y, g6 B+ U/ \2 D) & Q+ B x4 u2 t: Z
(close fp)
5 P0 s/ V: K# I! l6 q(setq txt_tb (reverse txt_tb)) + z& Y6 P; g# i2 g% J6 r$ n
(setq old_nn 1);記錄索引號
: o2 G+ b3 }* ?6 r& `6 t& [) 4 o4 {: I) G- q8 K+ O
; 更換列表框內詞組顯示內容 . k! R4 G5 ^6 Q6 T9 C+ {
(defun wr_txt ( / fname fname1 fp txt1 i)
& n# T9 T; l( d& }4 G(setq i 1)
' P- }2 g0 ?* B(while (<= i nn); 判別哪個詞組項被點中
6 i5 L$ O% E) m. z& D: E! v(if (= (get_tile (strcat "c" (itoa i))) "1")
2 }+ P0 r6 R+ U4 R4 l4 l(setq fname1 (strcat "$txt" (itoa i) ".dat")
$ Q: p1 d$ m1 a+ b- z, }1 `i nn 7 O* z5 b: S9 N/ ~) T
) ) d3 R- ?1 R! S
)
1 g/ t) j T5 }. f- \/ ^" L& g(setq i (1+ i))
4 @8 p3 C+ s+ M4 r% p) W- W: })
- Q- i) V8 }) m$ y3 Y2 F' k(if (setq fname (findfile fname1)); 查找文件是否存在 ( x6 ]) @2 s1 X; H5 x3 L
(progn 5 v% p) P F1 b: r s* o! {
(setq old_nn (atoi (substr fname1 5)));記錄索引號
: N* ^$ \1 g& e$ E+ ~( v; M# l(setq fp (open fname "r")) 7 j5 K( \. b9 G9 T; p- y
(setq txt_tb '())
G5 c k2 t' K(while (setq txt1 (read_line fp));依次讀出各詞組 2 c+ \8 \: ^: C6 s1 I2 S, o
(setq txt_tb (cons txt1 txt_tb)) / f0 G5 K- |) [, O1 N6 x1 p8 T t
) N! G2 [$ L3 a3 D. b2 ^! [( M. `
(close fp)
* S! W) p. ]' G& t4 {(setq txt_tb (reverse txt_tb))
4 W" h; X& e& l0 A* n% @(start_list "what");在列表框內顯示詞組內容
5 N) {4 F- R7 S; B8 V/ M(mapcar 'add_list txt_tb) " [7 v3 G0 `6 I* w; _
(end_list) 4 D6 ?9 j, _! k; A/ ?
) ; progn 6 K0 U& K. E7 C
(progn 6 X% c A7 q0 J* {: S/ Y3 p
(alert (strcat "文件" fname1 "不存在!"))
2 C F* h" C2 U( t8 l% m) R% j( Z(set_tile (strcat "c" (itoa old_nn)) "1");恢復原記錄號
2 Y9 a% c% }6 G, [$ r)
* ?+ v- v0 `. @! F6 F6 a) ; if ) r. a6 @+ n: O: v
) + O5 ~% x) z! ]8 J. e
; 主程序開始 / i4 x& F1 b8 j5 ?4 Q( z8 y
(setq olderr *error* $ F, q" g4 y* r+ {" j# n& D
*error* txterr
p$ e1 w8 U$ Q5 w, m" Ooldcmd (getvar "cmdecho") ; S, E/ V' p2 M& Y
) ! [, z/ d2 y, D, S5 k
(setvar "cmdecho" 0) ; 命令不回顯 2 c y9 Q% ?# e- x- ]5 e
(setq nn 9) ; 詞組分類數 9 m5 b* {0 i. \3 |8 x) ?
(init) ; 初始化
) x0 ]- @) w' N0 b( L(diag) ; 驅動對話框
$ h) ] A4 r: S8 H( U+ t7 ?5 ?6 l! R(if (and ok txt)
; D8 i, r7 i% [4 q. G(progn
& X3 g# l5 q1 x# h# _, O0 n( A, A3 i(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在 7 S4 x. H& `. c+ l* X1 \
(/= (cdr (assoc 40 sty)) 0) ; 字高是否為定值
" v$ Z) j8 s1 e0 H! j' t(/=(getvar "TEXTSTYLE") "HZ"); 當前字型是否為"HZ"
1 | G4 C9 w: ]$ V/ a3 \$ K) 6 F s! [. E5 r4 `
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 設置"HZ"字型
# L0 o$ B: J7 [0 ?' a) Z$ }) ( u! ^3 x/ V' h( C+ K1 Y
(initget (+ 2 4));下面的輸入值要求大于0
6 W* j5 ~ r7 ]! E' c% A: I(setq ht (getreal "\n請輸入字高<500>:")) 8 @% ^8 O7 z- U- I2 j6 d
(if (not ht) (setq ht 500)) ! L* K" ^8 T+ _1 \/ k, P2 U( S
(setq pt (getpoint "\n請點取文字起點:"))
8 x; Y7 }" B+ B- Y; C: d(command "text" pt ht 0 txt) 2 e2 B% R* [) K& v
) : S1 o# o& p7 x9 h: G7 X
)
5 n3 b P. k/ n6 ^& C7 B4 w(setq *error* olderr);恢復原設置 7 N7 G- X$ B! g: s8 F
(setvar "cmdecho" oldcmd)
( Z M- z- J& B- ~; f(princ)
' E( H1 a) O: V) M" \; n+ n7 h. H. q" G) 1 Y( x5 h2 U" f& z: M1 C
// #txt.dcl 4 r% ^ |/ `. Q( A% w0 t$ b9 ^3 J
// 供#txt.lsp調用 ; n! m6 b+ @3 t2 a' d6 l* z
filetext : dialog { // 對話框名稱
: y2 d; K: i8 L) M2 Jlabel = "常用詞組"; // 對話框標識 ' E8 `7 _6 u4 w$ }( i
: row { " {1 m& w8 i* Q( K
: boxed_column { ! p1 _ A$ `- B$ G6 C+ G5 z( A
label = " 索 引 "; 9 `' @" ~, B+ _& I" p: w( p
: radio_button {
4 Y9 a, r* @: M) m wlabel = "常用術語"; // 多選一按鈕 : Z% c/ P3 s9 E0 y
key = "c1"; % u7 {6 g0 ?% ^& v
value = "1"; // 初始值為"1", 表示選中
1 p3 |3 b, r9 g' R( B}
9 F' H" o) @- p4 v9 v+ a: radio_button {
8 I/ }* O7 ] h1 B8 Flabel = "圖紙名稱"; . C; J4 \" m9 c4 R
key = "c2"; * _2 ]' @3 U4 O
} 8 }- h4 H/ a; }& x
: radio_button {
# p6 v9 j$ M1 G5 W0 P Hlabel = "房間名稱"; 7 Q; c4 L* I" o3 G: U% ~( s \
key = "c3";
8 @) G, Y( L4 w( Y8 b! H E0 x} ) b" V6 P( F" }$ v' D. m& a, n, L
: radio_button {
# Y" {4 u S2 k7 b8 vlabel = "衛生器具";
# G) [( ^/ q; @2 _3 Tkey = "c4"; 3 A" M! l* E R+ ?0 j/ B) H i7 G5 m
} ; t- ?* V# m, m% X+ C
: radio_button {
3 h" z- c3 h$ h! Alabel = "管材配件"; ' M, N- R# ~! N% \1 F
key = "c5"; $ G/ b6 H2 E7 C4 v5 S" S
}
* j' I: e' o9 _+ G: n: radio_button {
- r: B! c" |. P7 l- B4 Zlabel = "器材儀表"; - B( e P" T! A1 [( o
key = "c6";
; f, @) ?( N$ M: _+ A, i! J& y( ?}
9 |; w a, q: i( Z' k7 O: radio_button { 1 h7 a' N% U4 c* ~7 R; ?/ q
label = "常用設備";
: Q% n9 H: c5 _0 mkey = "c7"; ! n1 q" `) I2 {0 @
} * f& S; ?' m) r' ?0 q1 l3 z
: radio_button {
. o5 ^* c a- V& ~; `; B1 |: Llabel = "構筑物";
8 ~+ P' R q. l1 {0 v0 Okey = "c8";
! C( }$ h" b9 q. F3 R} - J/ k! Z3 _" q+ o( G
: radio_button { " q) l3 s* i- @/ ?
label = "其它";
/ p! K! ?# l6 _key = "c9";
7 |1 Y: _8 {( S$ ], K8 G* p/ T" s} ! Z9 \1 T' F0 k5 N" l2 M
} 1 H, u5 Z ^& S5 Z- N) v
: list_box {
$ p& O$ j. @: [, _+ e9 ~label = "詞組內容"; 8 r" O: }. _0 m1 S( @( X
key = "what";
/ i5 U8 v G) ^% w6 jheight = 15; 7 I2 q. k* ?# m, R9 b! n9 V
width = 26; . d' \1 i. s# N) w
allow_accept = true; // 可雙擊鼠標選取 , U6 e z% y6 y
} 8 I' n- R! v2 L! e# O" q4 w
}
, l! T7 H' O+ y5 d( a! A! ispacer_1; 3 h; Y$ L' Q6 p. ~+ a* [7 {9 I5 ~8 u
: edit_box {// 編輯框
" B: u4 r p/ a8 S8 u+ Olabel = "所選詞組:"; 2 h4 Y3 @. Y6 j Y& `* }( u
key = "sel_ok"; % I7 [5 ? n2 ~& F
}
0 Z+ N( O% e4 ~+ B9 f0 Q/ U: rspacer_1;// 增加間距
6 \5 _! P6 ^) O4 T8 K) ]: H# ^ok_cancel;
4 }- s4 g6 [! h5 ~% @+ h+ J} |