一、引言
+ b8 V7 v7 C1 A; A n2 o! W1 I漢字的標注在CAD設計制圖中是一個重要的部分,,也是一個較為繁瑣,、困難的部分,。目前,,在AutoCAD內漢字的輸入大多采用拼音方式,,對拼音不熟悉的人來說漢字的輸入就很困難。如果能將設計中常用的文字術語直觀地顯示出來供設計人員調用,,將會極大地提高工作效率,。本文就此進行研究,提出了一種用對話框(下圖)將常用術語顯示并供調用的方法,,同時給出了源程序,,供大家參考。該程序已應用于我院的實際生產中,。
二,、原理及方法
AutoCAD對話框結構包含有多種構件,如edit_box(編輯框),、list_box(列表框),、radio_button(多選一按鈕)等,利用這些工具,,可以開發(fā)出界面友好的實用程序,。
左圖就是用這種方法實現的。將常用詞組分類,,分別存于不同的文件中,。根據多選一按鈕中所驅動的分組號分別打開不同的文件,將文件內容讀入并顯示于列表框內,,供設計人員使用,。同時,設有一個編輯框,,可將所點取的詞組顯示于編輯框中,,便于用戶對詞組進行適當的修改,如刪除或增加字符等,。這種方法有一個優(yōu)點,,用戶可十分方便地根據自己需要修改或添加詞組內容。對話框文件及驅動程序分別見#CAL.DCL及#CAL.LSP,。
三,、程序使用方法
先用WPS、EDIT等編輯程序分類建立詞組庫(注意,,需要存成純文本格式),,每個詞組占一行。程序要求將"常用術語",、"圖紙名稱",、"房間名稱"等各分類所對應的詞組庫文件名分別為$TXT1.DAT,、$TXT2.DAT、$TXT3.DAT厖,。除第一個文件不能少外,,其它文件可空缺,但當點取該分類項時,,系統會提示有關文件不存在的信息,。
然后將所建立的詞組庫文件及所提供的程序#TXT.LSP和對話框文件#TXT.DCL拷貝到AutoCAD所能找到的目錄(環(huán)境變量ACAD所設置的任一目錄如ACAD\SUPPORT或當前目錄)中,在Command:命令下鍵入(LOAD "#TXT")進行程序的加載,,即可象其它AutoCAD內部命令一樣使用#TXT了,。也可在所使用的菜單文件(如ACAD.MNU)中的下拉式菜單或屏幕菜單部分加上下面一行:[常用詞組]^C^C^P(if (null c:#txt) (load"#txt")) #txt以后可直接從菜單中驅動該程序。
在COMMAND:狀態(tài)下,,鍵入#TXT后,,系統彈出一個對話框,根據需要點取所需的詞組類別,,再從列表框內選擇所需詞組,。所點取的詞組會在編輯框[所選詞組]中顯示。用戶可以在此對詞組進行必要的修改,,點�,。跲K]后,根據提示輸入字高及起點即可把詞組寫到圖中,。
需要說明的是,,本程序中是將文字以"HZ"字型寫到圖中,要求字體為TXT.SHX及HZTXT.SHX,。若您的軟件中無這兩種字體,,可將其它字體改名為該兩種字體(要求一個為英文字體,一個為中文字體),,或將程序修改為您所具有的字體,。但需要注意,也許您的字體在用于設置字型時會多一個選項,,詢問是否垂直書寫文字,,此時,可將字型設置一句改為:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可,。
t1 P' s( |3 U1 w4 [& v0 {本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均調試通過,。
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
1 c8 o; z3 \4 y* m5 k. P* y* d; 定義錯誤處理子程序
( d* ?* q$ M) h9 J(defun txterr(s)
8 r, Y r0 p1 H7 K7 \(if (and (/= s "console break")
! c; M% F* L5 T k(/= s "Function cancelled")
(/= s "quit / exit abort")
)
/ P* g0 p9 @4 P& i(princ (strcat "\nError:" s))
)
# o% G& j7 |: p W9 [(if olderr (setq *error* olderr)); 恢復原系統設置
F) i% H; A- T5 F* c(if oldcmd (setvar "cmdecho" oldcmd))
: E: F" |+ R& `) o6 g. M(princ)
)
; 對話框顯示及驅動程序
3 A1 n$ y j; q9 v+ O(defun diag ( / i)
2 F0 y7 C; Y5 Z) g9 q1 I2 O(if (> (setq dcl_id (load_dialog "#txt")) 0);加載對話框文件
(progn
(if (new_dialog "filetext" dcl [JX*6]id); 顯示對話框
(progn start_list "what"),;將詞組顯示到列表框內
' F+ k, O/ [7 T8 q- a(mapcar 'add_list txt_tb
)
(end_list)
* b& V' W2 v" Y' O% Y% y4 J(setq i 1)
(repeat nn,;點取詞組分類項后的操作
# l9 G$ u* L' S3 `0 t(action_tile (strcat "c" (itoa i)) "(wr_txt)")
(setq i (1+ i))
)
* K8 w( F; q. E9 Y9 Y- u(action_tile "what" "(setq i (atoi $value));選中詞組
" t4 T$ X# K; }7 G# Y(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
3 `& @* Z h" n9 O)
6 n! `: \/ `4 Q' Z/ ]( M(action_tile "sel_ok" "(setq txt $value)")
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
, ?) h! n! n* i1 G(action_tile "cancel" "(unload_dialog dcl_id)")
z/ Y3 M6 B* |/ v(start_dialog)
)
6 Z$ y+ k2 q1 X(prompt "\n無法顯示對話框FILETEXT! 請檢查對話框內容!")
5 k( F4 i$ V. [; m) Q! A% s" P)
)
- x6 b ]/ }9 h! W h2 W3 {(prompt "\n無法加載對話框文件#TXT.DCL! 請檢查文件是否存在及路徑是否正確!")
)
)
7 C6 d2 q0 M" w$ c6 O. O$ u; 初始化程序, 把第1個分組項中的詞組讀入表txt_tb中
2 X' H; B8 e. j: r9 S$ j(defun init( / fname fp txt1)
) c7 A$ o" C5 l% ?(setq fname (findfile "$txt1.dat"))
/ D# o$ Y+ A, t7 D8 r/ i(if (not fname)
+ w! i. R' J2 E1 y3 V& z(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 則退出
8 }$ A/ ~* ~) i s# N9 O) r)
(setq fp (open fname "r"))
(setq txt_tb '())
" g0 n# Z+ V! @- Y(while (setq txt1 (read_line fp))
- K- h3 Z4 D0 R7 g3 @: [(setq txt_tb (cons txt1 txt_tb))
3 q; m3 W1 h% v) G& N8 K" _)
' ?# E' A3 z- {/ a8 t$ Y8 m/ v(close fp)
(setq txt_tb (reverse txt_tb))
( X, E/ r6 }% t6 f4 q" D, F) R(setq old_nn 1),;記錄索引號
)
$ V' x4 ]8 n; v6 T; 更換列表框內詞組顯示內容
4 s' \" A. j' l8 W; N1 K(defun wr_txt ( / fname fname1 fp txt1 i)
& T2 r: `+ P6 R. {5 _! w) N1 k(setq i 1)
: }* `" w& v6 B(while (<= i nn); 判別哪個詞組項被點中
(if (= (get_tile (strcat "c" (itoa i))) "1")
- Y# f2 e6 s( w(setq fname1 (strcat "$txt" (itoa i) ".dat")
i nn
)
0 x1 e* K/ H0 m)
( ^* r* b4 C% v" q(setq i (1+ i))
)
(if (setq fname (findfile fname1)); 查找文件是否存在
(progn
$ I& o- Q+ M+ U; A1 G(setq old_nn (atoi (substr fname1 5))),;記錄索引號
* K* i: M, E3 ?5 T: v(setq fp (open fname "r"))
$ O& G% `! [' Z+ S7 r, }8 y/ n(setq txt_tb '())
7 j8 h' K6 j6 o' V2 D; U(while (setq txt1 (read_line fp));依次讀出各詞組
(setq txt_tb (cons txt1 txt_tb))
8 c4 ~7 u9 s) Q; F- a)
* D7 n! [1 F S" {4 U! B1 ?$ }, _* f(close fp)
% o/ b/ Y% R" g6 {2 M8 `8 g- u+ N% h(setq txt_tb (reverse txt_tb))
* g6 {- J6 D* P9 {(start_list "what"),;在列表框內顯示詞組內容
(mapcar 'add_list txt_tb)
(end_list)
5 b' k! C% K5 J: a- ?+ ~" ?' W) ; progn
(progn
(alert (strcat "文件" fname1 "不存在!"))
(set_tile (strcat "c" (itoa old_nn)) "1"),;恢復原記錄號
)
4 y ^' l/ b: N$ a) ; if
)
; 主程序開始
4 d% w3 g, S7 [! z9 i(setq olderr *error*
*error* txterr
oldcmd (getvar "cmdecho")
6 F$ M1 g* Z0 l4 G+ u)
(setvar "cmdecho" 0) ; 命令不回顯
(setq nn 9) ; 詞組分類數
7 w9 ?# ~. O4 N# ~# s/ [" \+ W9 c(init) ; 初始化
3 h3 ^3 g* t" R9 V5 o2 O- F- T(diag) ; 驅動對話框
(if (and ok txt)
(progn
(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
) F: G$ F: _) H! A(/= (cdr (assoc 40 sty)) 0) ; 字高是否為定值
: w M& T' f7 D. i8 D/ ]: R(/=(getvar "TEXTSTYLE") "HZ"); 當前字型是否為"HZ"
)
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 設置"HZ"字型
)
(initget (+ 2 4));下面的輸入值要求大于0
(setq ht (getreal "\n請輸入字高<500>:"))
7 D" o9 B# {. V9 ~, q* Q( w3 p(if (not ht) (setq ht 500))
1 g) Z$ D, b! O7 u+ [3 x(setq pt (getpoint "\n請點取文字起點:"))
(command "text" pt ht 0 txt)
5 e5 O9 _* b: | S- w)
)
8 ~' H2 B3 [, d7 n5 o(setq *error* olderr),;恢復原設置
(setvar "cmdecho" oldcmd)
(princ)
)
Y9 B7 T! X! _: A6 T( v// #txt.dcl
# l9 i( X! o x// 供#txt.lsp調用
filetext : dialog { // 對話框名稱
label = "常用詞組"; // 對話框標識
: row {
: boxed_column {
4 t4 u6 _. W$ M* W! V. p p; slabel = " 索 引 ";
: radio_button {
) l+ u& {8 C n4 {label = "常用術語"; // 多選一按鈕
key = "c1";
value = "1"; // 初始值為"1", 表示選中
) D1 X, L/ G8 m5 [$ o9 G5 o6 D}
& Y) I2 ^% M! |: k. I! O: X, H8 ]: radio_button {
8 K7 `9 ~ |* m s2 i) F: |label = "圖紙名稱";
key = "c2";
# \1 X( @! v: ?% S& q. h3 q}
0 }8 \7 U; f9 g6 w3 _: radio_button {
2 q Y! _- p2 elabel = "房間名稱";
. s7 z# [3 n0 i$ c: @key = "c3";
}
: radio_button {
9 E C4 S. N& K/ vlabel = "衛(wèi)生器具";
key = "c4";
}
/ S5 T& @3 E( o! _) o: radio_button {
label = "管材配件";
key = "c5";
}
. Z3 p0 s' S# O- Z7 K R# C0 ~: radio_button {
label = "器材儀表";
key = "c6";
}
: radio_button {
' {9 @7 @; K0 X& D! ]6 Nlabel = "常用設備";
* @8 Y9 a' w* q% bkey = "c7";
# ]9 g: o5 ^' T! ]}
" o9 b7 _+ e) }+ f+ m: radio_button {
label = "構筑物";
key = "c8";
+ H' G- a' x: E" w. ?4 I}
: radio_button {
) W( L5 Z( l' O/ y, Llabel = "其它";
, e' S# l; ^/ B' [4 }key = "c9";
}
}
: w+ b s! e6 y2 i( \: list_box {
label = "詞組內容";
key = "what";
( ^) N& \* T7 U% e. N2 ~* bheight = 15;
width = 26;
- r6 N3 x h( v N/ Sallow_accept = true; // 可雙擊鼠標選取
" r) r+ C- V r& g F8 k1 I}
/ T8 M! {8 F$ \0 a B4 A}
spacer_1;
% u' W* U! ]4 W) ~: edit_box {// 編輯框
label = "所選詞組:";
key = "sel_ok";
}
* I# W6 X8 b# [: U" d9 i. Z* l* |spacer_1;// 增加間距
3 U& b. ^2 ?% b( M% i3 J( V7 R) L/ ~ok_cancel;
% H" H9 ~) M' }+ ^; a}
歡迎光臨 機械社區(qū) (http://97307.cn/) | Powered by Discuz! X3.4 |