摘要 [HT5SS]本文提出了一種用對話框實現AutoCAD內常用術語自動標注的方法。用這種方法,可方便地將各種常用術語標注在圖中,為CAD應用提供了方便。 8 |0 v4 v* } s4 o
一、引言 % ~6 g: {6 P* A$ z5 u* O
漢字的標注在CAD設計制圖中是一個重要的部分,也是一個較為繁瑣、困難的部分。目前,在AutoCAD內漢字的輸入大多采用拼音方式,對拼音不熟悉的人來說漢字的輸入就很困難。如果能將設計中常用的文字術語直觀地顯示出來供設計人員調用,將會極大地提高工作效率。本文就此進行研究,提出了一種用對話框(下圖)將常用術語顯示并供調用的方法,同時給出了源程序,供大家參考。該程序已應用于我院的實際生產中。
6 P& Q2 h+ t* Z! y, [! E : }! I. w3 D0 ^! V' o
二、原理及方法
+ C9 S# o. I$ _8 Q) D7 t* S AutoCAD對話框結構包含有多種構件,如edit_box(編輯框)、list_box(列表框)、radio_button(多選一按鈕)等,利用這些工具,可以開發出界面友好的實用程序。
- ]2 H( K, x/ }; x3 b, U 左圖就是用這種方法實現的。將常用詞組分類,分別存于不同的文件中。根據多選一按鈕中所驅動的分組號分別打開不同的文件,將文件內容讀入并顯示于列表框內,供設計人員使用。同時,設有一個編輯框,可將所點取的詞組顯示于編輯框中,便于用戶對詞組進行適當的修改,如刪除或增加字符等。這種方法有一個優點,用戶可十分方便地根據自己需要修改或添加詞組內容。對話框文件及驅動程序分別見#CAL.DCL及#CAL.LSP。
+ |0 q. J* u1 ]+ { q三、程序使用方法 7 t. @. y' j" y2 C; p( d; |8 n3 N
先用WPS、EDIT等編輯程序分類建立詞組庫(注意,需要存成純文本格式),每個詞組占一行。程序要求將"常用術語"、"圖紙名稱"、"房間名稱"等各分類所對應的詞組庫文件名分別為$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一個文件不能少外,其它文件可空缺,但當點取該分類項時,系統會提示有關文件不存在的信息。
! q: w2 m- s, O- e" 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以后可直接從菜單中驅動該程序。
, \2 P5 d% d. U. _: N在COMMAND:狀態下,鍵入#TXT后,系統彈出一個對話框,根據需要點取所需的詞組類別,再從列表框內選擇所需詞組。所點取的詞組會在編輯框[所選詞組]中顯示。用戶可以在此對詞組進行必要的修改,點取[OK]后,根據提示輸入字高及起點即可把詞組寫到圖中。
* F1 P* ~" j. P& r& U& V+ _7 r需要說明的是,本程序中是將文字以"HZ"字型寫到圖中,要求字體為TXT.SHX及HZTXT.SHX。若您的軟件中無這兩種字體,可將其它字體改名為該兩種字體(要求一個為英文字體,一個為中文字體),或將程序修改為您所具有的字體。但需要注意,也許您的字體在用于設置字型時會多一個選項,詢問是否垂直書寫文字,此時,可將字型設置一句改為:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
( f( V3 [- K+ [7 e# Y( w本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均調試通過。 : M. [* {: F" o; |* x) b
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
# H9 w6 V1 L8 H* o2 f) d& Q/ `" Q; 定義錯誤處理子程序 $ g2 K3 v1 o6 t" H' ~
(defun txterr(s)
7 {1 o1 q3 Y# o [(if (and (/= s "console break") + n/ E" {* k$ q1 m6 i0 K
(/= s "Function cancelled") : }3 U9 k/ H+ h9 C# t5 z
(/= s "quit / exit abort")
8 H0 R, k3 Z. x# Y) P( f8 z) 6 u+ K) _8 `8 g( e# z
(princ (strcat "\nError:" s))
8 |& r, t9 u- h' _) X1 L! ]* y( R" l: L) . e- [2 M( ^; h
(if olderr (setq *error* olderr)); 恢復原系統設置
( W8 A" w$ S1 { ](if oldcmd (setvar "cmdecho" oldcmd)) 5 R% j8 H' _% k$ L
(princ) `8 Z! S; L1 M z, s2 _
) 2 J2 `1 p" f h3 [/ p8 }
; 對話框顯示及驅動程序 $ c: r3 H5 S9 y7 c3 k0 B& q; V
(defun diag ( / i) " W7 s& p4 ]7 Q+ u
(if (> (setq dcl_id (load_dialog "#txt")) 0);加載對話框文件
, q( I! D8 h; D+ u0 G(progn
2 g$ {1 D% c, C" R(if (new_dialog "filetext" dcl [JX*6]id); 顯示對話框
4 l2 O L( K5 A$ S7 V; I( U(progn start_list "what");將詞組顯示到列表框內 6 x) p) v& n$ q; u3 O, |4 \" S
(mapcar 'add_list txt_tb
8 n1 @7 e9 y6 f* J, D) Y& e; \4 e: P" t! P
(end_list)
3 p! M( z2 H# S. n+ i. o* o+ K(setq i 1)
. L% a& X; O! q) w s: r(repeat nn;點取詞組分類項后的操作
- N# x4 p* H/ u4 ^: s9 Q9 K6 a(action_tile (strcat "c" (itoa i)) "(wr_txt)") c. K* C5 t# V l3 a3 Z) m
(setq i (1+ i))
5 Z4 J; `8 [$ |)
* z4 ]5 m' Y' ]* ?3 }/ B(action_tile "what" "(setq i (atoi $value));選中詞組 / W2 p9 d5 ^) O" u1 s7 t
(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)" $ Y, Q" w" T; E2 K/ R5 g
)
7 L# m. V9 f8 R- g0 Y5 h(action_tile "sel_ok" "(setq txt $value)") % a3 O8 E( P7 ]4 I; q/ ]+ h& o
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)") , _2 L$ g1 t" R/ _. b4 C! Y! G3 ]
(action_tile "cancel" "(unload_dialog dcl_id)")
# S0 F( @5 i/ U y" }(start_dialog) $ Z" f2 E8 Q% f
)
2 s- r' w8 ]" t(prompt "\n無法顯示對話框FILETEXT! 請檢查對話框內容!")
0 j% A* O8 M8 p5 [8 [)
' b3 }2 P9 X6 b/ e5 v9 b1 T, z5 U)
2 t$ U) b% \! i6 Z5 O( h(prompt "\n無法加載對話框文件#TXT.DCL! 請檢查文件是否存在及路徑是否正確!")
+ o& @! q( p$ C7 x)
( }' L% k; [; T) 0 [9 t b. p9 ~( p7 y
; 初始化程序, 把第1個分組項中的詞組讀入表txt_tb中
/ S# G, o, u+ _5 u. J" ]: @2 m(defun init( / fname fp txt1) ( J/ f! Y' z+ V8 {$ d" X
(setq fname (findfile "$txt1.dat"))
% w% {$ {4 E' H7 N/ A5 q J(if (not fname) 5 ^8 ^( V: S3 T i% z7 ^& D9 S- D
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 則退出 : F( o" P! E! m. V2 E( P
) 7 v. b9 h2 _- t+ p* J* g# {
(setq fp (open fname "r")) ' y2 o6 B [& S# f
(setq txt_tb '()) 9 a7 `9 {" u# Y) A3 ?4 }
(while (setq txt1 (read_line fp)) ; S2 G4 S- j2 C6 W
(setq txt_tb (cons txt1 txt_tb)) - G L0 _0 l X2 [
) + q0 w1 B. E$ @1 [) _! N. A
(close fp)
8 e' G+ ?0 P8 `+ F; e& c) D(setq txt_tb (reverse txt_tb))
4 h, M+ t. S! B: ^. l% T$ v(setq old_nn 1);記錄索引號
3 F- [7 U. h4 N, Y2 H( C5 n)
0 }" o/ j8 G7 R2 ^3 m; 更換列表框內詞組顯示內容
# K8 z. N/ y% v( }0 \5 d(defun wr_txt ( / fname fname1 fp txt1 i) 4 b5 g d- q6 G$ W9 t; }$ s
(setq i 1)
P: @" D" }# L(while (<= i nn); 判別哪個詞組項被點中
! J: t. H1 x! s1 R(if (= (get_tile (strcat "c" (itoa i))) "1") 5 F) j! u! U) Q. \: Z
(setq fname1 (strcat "$txt" (itoa i) ".dat") $ I6 S/ o4 y0 ^/ ~7 o9 Y
i nn
& O& k; k/ V/ h# m)
. ?1 e) v* `* s% ^7 L) ( E' U- V+ w J7 r4 N
(setq i (1+ i))
% h* i7 a$ ]2 A/ F2 ?. y) 0 \: d' d5 P( o3 c. h
(if (setq fname (findfile fname1)); 查找文件是否存在
. ]8 M; T8 W& E* X# k6 ~(progn - v3 I4 b' A4 c* ]: o' r$ |
(setq old_nn (atoi (substr fname1 5)));記錄索引號
! Y% ]; c7 `3 T. p9 J6 B- e- b(setq fp (open fname "r")) ; u/ T7 }+ T+ g6 ]5 Q) Y( y0 e( u ~6 N; z
(setq txt_tb '()) 9 q, K; N/ }( S' k/ J
(while (setq txt1 (read_line fp));依次讀出各詞組
. ~7 U4 C* w* Y(setq txt_tb (cons txt1 txt_tb))
# b5 {$ |+ l* X$ l. ?* S5 Q; N) : H! C0 F- y+ o8 W/ l
(close fp)
* R0 h( _0 i2 j9 @(setq txt_tb (reverse txt_tb)) 1 J- r/ E" _( U2 A8 y8 W8 ]
(start_list "what");在列表框內顯示詞組內容 $ f; I& G. {. ?2 V0 F8 O
(mapcar 'add_list txt_tb)
7 k3 i: l: f9 m7 l(end_list) / ^! g0 c/ Q" e% N+ ~
) ; progn
7 J% r8 u) N- e6 U- ^0 ~5 G(progn
, T- I2 R3 T- Y(alert (strcat "文件" fname1 "不存在!")) # s1 }( B0 V3 ^0 V4 U. c
(set_tile (strcat "c" (itoa old_nn)) "1");恢復原記錄號
% Q) J2 R4 ]$ w7 R- R' A)
+ Y0 g* ]5 w ~) ; if 9 x- o& i+ h' r
) 2 b8 G- A+ S z
; 主程序開始 9 }5 C- l; h- }* E* W
(setq olderr *error*
2 D! f3 [1 n3 X: H# Y$ o1 @1 O6 V*error* txterr
, W/ ^' z) [* C" y! moldcmd (getvar "cmdecho") . L& e2 U8 {# @% {2 b
) . d Z! {& z5 I$ ~ O
(setvar "cmdecho" 0) ; 命令不回顯 ; \; G4 s8 J. m. F; n
(setq nn 9) ; 詞組分類數
9 G$ Z! s( [0 A: v% f(init) ; 初始化
. ~1 Q! }) }+ z6 ]5 p% x(diag) ; 驅動對話框 - a& M- q& m7 k3 r$ \3 S9 z
(if (and ok txt)
0 L5 r- A. r+ G+ h# O(progn
* D. i$ U6 ?7 M- g# X(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
/ p# w5 S, b. J+ I% ~, M(/= (cdr (assoc 40 sty)) 0) ; 字高是否為定值 ! [5 @, C5 t0 Z8 B+ w6 e
(/=(getvar "TEXTSTYLE") "HZ"); 當前字型是否為"HZ"
. n/ _: S& H+ \- l2 v2 O)
, }3 f Y/ z, E/ X D(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 設置"HZ"字型 , M) G9 R' v. j( v
) , ^% w* h$ @, {
(initget (+ 2 4));下面的輸入值要求大于0
! q0 c+ r0 c0 ^ g2 ~(setq ht (getreal "\n請輸入字高<500>:"))
2 y; z2 x- @1 ~) j1 s& N( \! J(if (not ht) (setq ht 500)) , g7 C1 t2 U+ D6 E: c" H
(setq pt (getpoint "\n請點取文字起點:")) 5 \" o2 d }1 ?- z W9 N1 U
(command "text" pt ht 0 txt) 2 _: ]& S1 l4 i* V# W/ E
) + A" ^' F2 J z4 L8 D
) & ^( S) o9 k/ {; r8 q9 t
(setq *error* olderr);恢復原設置 7 c3 V% E9 a/ c4 V
(setvar "cmdecho" oldcmd)
D+ J7 o/ s3 K& J( @1 U(princ) 2 K& S' Q9 @: J
) : S4 R2 r2 n0 z, }9 ^9 p
// #txt.dcl + l/ u/ k& E" C0 Z, C" e3 y) g
// 供#txt.lsp調用 1 f0 l5 }8 Y6 f4 @9 t$ \
filetext : dialog { // 對話框名稱
8 J: F1 z/ X" Z8 p G' o6 ?8 J# z! n) zlabel = "常用詞組"; // 對話框標識
5 o5 F8 A% P: N: row { 9 K1 L$ T- {4 ]- L9 [2 F
: boxed_column {
1 R- u% e! ^8 Klabel = " 索 引 "; ! h& \" X& x5 v0 F. V
: radio_button { 2 m9 @' O+ C2 G: X- j7 r( p
label = "常用術語"; // 多選一按鈕 , r8 W F7 q+ _: a
key = "c1"; ( O" y e& R e" T7 @
value = "1"; // 初始值為"1", 表示選中
9 M) M+ G. \( k* T( c} $ \, B& J% d7 U; z" z2 Z
: radio_button { 1 r9 v" F2 i# P* A" w2 N5 Y
label = "圖紙名稱";
( o# i: n5 }( E8 q$ zkey = "c2";
7 Y, }8 ^) C+ e) m, [6 ]} 4 r1 d# l3 }+ _% w
: radio_button {
9 c$ C+ P% [& ], H3 Z2 a# F9 Glabel = "房間名稱";
7 {% _7 m6 V5 `- t/ B G# Wkey = "c3"; . e6 H, i, r4 v5 G
} 1 r8 j+ {- b- l$ g$ U" Q& O0 D# J
: radio_button { 3 O5 d! @! `* }4 t0 H
label = "衛生器具";
# \3 F3 u* J8 c: D; n$ hkey = "c4";
0 v+ p* b3 d3 z9 J1 [}
( V- l g2 B# G& ~8 E, `' f- R4 @7 w: radio_button {
; G2 {; D* S! klabel = "管材配件"; & E& ~$ M! \$ N
key = "c5"; 7 y2 M* N6 y2 ^1 E" ?! _5 @
} 2 Z" d, q- b( }" X
: radio_button { " e# w( Y q% F' f9 L
label = "器材儀表";
4 X, F8 J- M2 V0 [key = "c6";
: Q, j4 X! E* ~/ l+ H1 X}
; ~! |9 b3 `. H8 s% I& v" R: radio_button { : I* T! \: W/ n* ]+ P, }! H
label = "常用設備";
+ b5 ?8 L0 N( L2 Tkey = "c7"; * T2 r, e) E% J5 Y4 O! @3 L0 I5 r
} 6 T7 t1 p" c& D" W+ S6 A: K/ d
: radio_button {
! \9 _6 Z+ M1 v; j9 r( A3 B/ plabel = "構筑物";
7 a' z7 |8 h/ ?: v l0 Q/ `, Nkey = "c8"; ; t2 E, X3 T( J6 I2 f' T
} 6 S5 w* T+ F( B! N+ p# h
: radio_button {
; Z5 ~5 Q" {+ d4 s, U* H' Ulabel = "其它";
3 J l; p% S. i( {3 J \key = "c9";
$ f1 c7 a+ p7 b# h7 P4 B" p} 5 _ O9 p P+ u ]- c; {8 c
}
8 p$ a) K3 b3 x _ G3 P J+ r* X6 L: list_box { $ \6 D# J6 ?( T( O5 K5 a
label = "詞組內容";
0 W/ c/ ?' p$ F* Q! ^8 Vkey = "what"; # f& i( z4 k: {+ q
height = 15; ' n3 ~! Z: \3 z2 a0 M7 H) j
width = 26; 2 A( t! P% K1 \/ c: ~
allow_accept = true; // 可雙擊鼠標選取
' d- w; S& j) k. d! ~6 @- u. Q}
; A& V5 r1 }! V4 I}
" R; p" C* h: X! c+ nspacer_1;
. t: \3 ?2 I# d% a. G8 Z: edit_box {// 編輯框 + o% n L$ J' A( t5 {' H
label = "所選詞組:"; 0 g; X' A- M% c7 l" ?0 K
key = "sel_ok";
, _8 K, @; f0 |0 G3 Q1 A/ q} . y3 I D* U Q: i7 b e" l
spacer_1;// 增加間距
* }6 K- J, [8 X; o9 Ook_cancel; * L, S9 b% n" W- \
} |