青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

青华模具培训学院
查看: 1733|回复: 1

AutoCAD内常用术语的自动标注方法

[复制链接]
发表于 2010-12-14 09:22 | 显示全部楼层 |阅读模式
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
6 C  t! q: q& h% E一、引言 ; q5 b1 n# r. f6 ]
  汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
3 _; d  g' ?+ ?2 t5 {; e5 M二、原理及方法 + d8 T) Q. a1 G7 l0 n+ I- M
  AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。# E: \% B! h6 n! K
  左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。' u: L1 t) K3 G8 k" F3 x6 p. s
三、程序使用方法 $ a* n6 l3 y6 [4 D+ ?5 ?% z
先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
$ N+ ^: L- {' X0 `0 _! S, W5 T然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
* K+ p+ h- }0 d4 K( t. W! {6 U在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。5 q% X$ A( F3 A$ z% }- p
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
+ g: r2 X9 F7 K1 Q" m) K本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。 8 o' ~! e( o  `
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) 0 g# k# o+ ~4 o- p6 |3 L" Q
; 定义错误处理子程序* n2 K# H. r: v) L( @  a# ?& l( {! j
(defun txterr(s)
3 R+ s. m! P6 x1 Y: s0 P(if (and (/= s "console break")- M, U6 q1 [6 N. `' }8 I$ y$ \
(/= s "Function cancelled")# I9 R; \3 l7 X: O( E7 ^) E( e
(/= s "quit / exit abort")
1 a% [8 F; Z: h* ])
6 ^6 l- A, N+ w4 x, l" [0 e/ _4 ~(princ (strcat "\nError:" s)), G% `% X; M! [- {" R6 ?2 D
)) J! e; i3 M% T: j7 @" N3 ]* K' B
(if olderr (setq *error* olderr)); 恢复原系统设置5 x7 J$ m" R" ~$ z4 A* ]9 K" |
(if oldcmd (setvar "cmdecho" oldcmd))
6 V( y* K6 k9 G! _0 [. U(princ)
- a  ^& G9 ~) y' I  i+ y$ E& r0 H)
$ A" J% R+ g* M" B; X( P$ r; 对话框显示及驱动程序  _9 J3 N$ z2 k$ b7 R% |  c
(defun diag ( / i)
  L6 v/ D: \/ Z' g(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件& v* m: l6 w& G* D7 {
(progn
# I  R( q3 h( ?  |& Y* R& j; U3 p(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框
/ n9 f* X5 R& q/ r3 X(progn start_list "what");将词组显示到列表框内
% I# Q: [) \  ]1 V- _(mapcar 'add_list txt_tb
! k  V( K/ n2 u5 |)
. N  F" K8 Z. r$ }6 B7 T! \1 K(end_list)
* J5 m9 B1 K1 D8 v. G/ z6 \(setq i 1)- o8 G9 @# Z* Y1 T
(repeat nn;点取词组分类项后的操作" o" [4 }) b5 H+ J
(action_tile (strcat "c" (itoa i)) "(wr_txt)")" ~$ z+ R- R1 ^
(setq i (1+ i))
2 B* T/ ~" l' _# E$ @% s, D, c% Z)2 q* m% q% P( W
(action_tile "what" "(setq i (atoi $value));选中词组* R! D9 o, e2 X* j+ {* [
(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
* x( d; k. G* @( J/ `2 A' \)  F* c$ x/ S7 h
(action_tile "sel_ok" "(setq txt $value)")! e/ O' a% A) l
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
7 G1 m: N8 U$ |; `8 R1 Q/ s) y6 j(action_tile "cancel" "(unload_dialog dcl_id)")8 p* ^/ q) V3 m4 ?) d
(start_dialog)
9 a, p( ]/ t) Q$ X1 Q)9 g3 [3 s# N7 F5 {: |" y' T" m
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
! z, `% i; F, c! t- a- v); e. ?$ w* d7 e- i
)
: G. Z+ `0 Y/ j$ g(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")
& x+ w, V8 o  G; N: _4 _# u)  G2 S0 D! q% z$ M. g
)  }2 w( f& f' T( L' G7 }
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
0 N* c# t' b# T+ ?(defun init( / fname fp txt1)
/ T$ ]* T0 I; N2 w  H1 ^% p( M(setq fname (findfile "$txt1.dat"))) L% Z# R( _4 J4 j6 `) E
(if (not fname)
1 b+ Z5 Q% B+ [, u8 @(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出" X* \( t# t( o$ `& X! T9 V
)
4 C( K/ R( x+ J(setq fp (open fname "r"))+ j7 F" V+ {/ D' e* t$ R
(setq txt_tb '())
0 r, q/ [6 J/ l(while (setq txt1 (read_line fp))
+ P8 h5 ~; U5 w! n(setq txt_tb (cons txt1 txt_tb))
6 d' y$ [4 J' \0 l; w)
- h4 ?4 B1 t2 _4 o" j6 l(close fp)( Y  H! Y, Q/ X2 }
(setq txt_tb (reverse txt_tb)); n" k$ z8 F+ y3 l6 x
(setq old_nn 1);记录索引号& J- u0 f; f4 x6 W4 B1 M, {
)6 I  A/ v- m2 N5 g
; 更换列表框内词组显示内容# j9 p5 j6 f& D9 p$ R  j8 A
(defun wr_txt ( / fname fname1 fp txt1 i)
; G2 q6 ~/ n* {(setq i 1)" o1 V% L2 C) r0 ?/ P! W
(while (<= i nn); 判别哪个词组项被点中0 X1 A9 ]% D- O+ d
(if (= (get_tile (strcat "c" (itoa i))) "1")
2 Q8 P/ U5 c) _(setq fname1 (strcat "$txt" (itoa i) ".dat")
. W  y; {! d- }! `7 ], Pi nn% g3 \% L9 [! m" F  H
)
, I$ n; U5 u( y' H- _0 D): E* m" w) o. T/ }3 m
(setq i (1+ i))
" }/ ]  }* V' V$ b, f6 z)
+ O; W4 @* T% m% f(if (setq fname (findfile fname1)); 查找文件是否存在
6 a6 F. D* @* ~+ M(progn4 o8 s2 X  [& k! M! ^
(setq old_nn (atoi (substr fname1 5)));记录索引号; {7 k: A$ H; `; {; I- b! `7 j) S
(setq fp (open fname "r"))$ u+ x) }- x- X
(setq txt_tb '())
3 l# m$ a( E# l1 |1 c8 a5 n& W(while (setq txt1 (read_line fp));依次读出各词组5 ^2 A5 L# k0 J
(setq txt_tb (cons txt1 txt_tb))
5 R4 b1 m% e% j0 C  j)
8 `1 J" n" D+ c( g(close fp)& h1 }6 C  d6 U/ r& R
(setq txt_tb (reverse txt_tb))
5 b1 x$ B5 M9 j(start_list "what");在列表框内显示词组内容2 G. f. d, U) A' {- i- f1 Q
(mapcar 'add_list txt_tb)- U6 {3 I; o: G5 K0 }
(end_list)
( p" b( Z) e" _6 {; `) ; progn
  h3 S" i. y  ](progn
1 K' H' A* z" o5 V* X(alert (strcat "文件" fname1 "不存在!")). a: H8 g$ n& [
(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号) ^1 n9 V# b$ h1 U
)
% b/ V! L0 w6 q9 Y/ K) ; if! h0 E& ]6 g6 F. Z6 v* {' f& P
)
4 d. e, d- h. {, d+ y; 主程序开始4 h5 N2 d! U# v
(setq olderr *error* 5 y( D8 K5 u5 E1 P  f7 d
*error* txterr! l& m# z8 A1 D
oldcmd (getvar "cmdecho")
& [7 @. P2 Q* f' ?9 v)! X7 r) I' X- J2 O3 B/ P. K
(setvar "cmdecho" 0) ; 命令不回显
3 S$ ^  r7 j2 s0 ]2 i' B0 ](setq nn 9) ; 词组分类数
( q  c5 q6 ^: U" t(init) ; 初始化
" T. A% p0 R4 g) ^$ b& E(diag) ; 驱动对话框2 j, v8 `. q3 B5 \0 i
(if (and ok txt)- q1 `7 f/ K0 {  V8 w
(progn" @1 Q2 t% Y9 ?, b7 R
(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
3 d% `# ~6 Z% D3 K(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值
6 c0 R6 v% @" C(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"
4 J$ v: B8 P- B. C- o5 O$ E): @0 v& k1 `- u+ }9 }0 G
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
1 n9 A/ ?4 }7 ?" L6 }0 L)
$ m! ^# r8 f3 h' O% a) d" p  F(initget (+ 2 4));下面的输入值要求大于0
! B3 Q# k: N9 v(setq ht (getreal "\n请输入字高<500>:"))
# l7 K. ^' c4 i+ M5 y(if (not ht) (setq ht 500))
' J2 r! a/ a$ Y" l(setq pt (getpoint "\n请点取文字起点:"))7 a) a# _6 J6 c. ]% R1 F  X
(command "text" pt ht 0 txt)
4 |5 h# v! |3 c# C, Z' v- V)" H, V5 K8 L0 f: H5 h) c
)4 x0 M- Q6 A! u( q( b. v% r$ C! B
(setq *error* olderr);恢复原设置% r' N' Q: W; X! W: T
(setvar "cmdecho" oldcmd)
8 Q+ a. D6 @5 M3 a" _% V% r+ g(princ)9 e0 l! Q( w. G2 }
)! d9 @3 ?9 E) F
// #txt.dcl
* a( s( u; \3 ~7 b// 供#txt.lsp调用; l. }9 U+ {3 ]; q# @
filetext : dialog { // 对话框名称* O& n9 f1 u+ E
label = "常用词组"; // 对话框标识
# J* b  `  z0 M: row {
7 E( x' @! `; F! L, J: boxed_column {
$ R0 Q1 x1 B' r, Z2 Zlabel = " 索 引 ";
; d. o$ N) U) q& Y+ w" n* s" r: radio_button {0 j% i# i2 N0 t7 o# ]4 \( ]
label = "常用术语"; // 多选一按钮, K% Y# j2 G1 w: E+ @, g
key = "c1";
7 I! f; |4 Q5 ^: X+ evalue = "1"; // 初始值为"1", 表示选中
8 _. ^- F3 A3 Q$ {}
6 [6 p" i5 A% i$ N" C9 ~% J: radio_button {( {9 Z4 G- J- k% P' f
label = "图纸名称";- r! S4 K7 x* r% n  U! r5 F
key = "c2";
. {- h  D( ?6 t3 E  e}
" W) b3 X4 B0 T: radio_button {
" B* V$ N) F, f' G  qlabel = "房间名称";
- e- Q9 o* C3 z) S9 Qkey = "c3";
2 O! S1 N' g. L6 r8 l6 a, h! m}
$ x& U7 `5 _1 n9 \8 R$ K, r: radio_button {$ b3 {) _. _1 \
label = "卫生器具";
0 o8 `2 R/ `+ u3 q. M% U, N7 ukey = "c4";
. a9 v3 W/ s$ J, k* K, M7 z}) `) e* e- [% \; n$ E! W" i7 J
: radio_button {
& V. ?7 i9 A- ?$ T6 {" clabel = "管材配件";
# _; [/ f" X( j& L0 M/ d0 Ykey = "c5";
( F, b  q. p* N' w2 C}+ ?: w- X7 h0 V: {9 T$ f7 E) N
: radio_button {
' N: }8 C9 e' `! N$ I2 N/ A. olabel = "器材仪表";
% y. y5 W. w9 f( Pkey = "c6";
& F/ K0 ~- a, Z/ C. y}) {* x0 T6 r. ?: w
: radio_button {
) p' N' l. W6 Y8 X2 U8 {label = "常用设备";+ r! y" M  n. z6 Q# `0 i: q
key = "c7";
- ?, L& a1 L" _}8 m) m% G5 d+ @1 l
: radio_button {& x+ g# p$ e! d: W( ]
label = "构筑物";
5 x* E1 S- T4 Y+ O  v" Rkey = "c8";
0 u5 p1 Q1 q- X% M6 R$ T}
3 r! P, Z9 G+ ?5 q9 s) L: radio_button {
9 i; W/ }0 M$ ^1 v1 C* }label = "其它";. q& O8 o- ^$ E  N3 F) P* z
key = "c9";
- v/ a- S5 Z6 |}! n# N+ [" ]+ T& }+ o
}
% k; `& @8 Z$ ^& e0 a( V: list_box {
# C& R2 M% o3 x" r* i. g( Y0 ylabel = "词组内容";! b7 A. _, u7 B$ r; }4 }
key = "what";
9 K- g& Y* O# Cheight = 15;6 M7 C: g4 z& G# a5 A( b
width = 26;3 i+ i& h1 x! u/ z5 u; `( `
allow_accept = true; // 可双击鼠标选取  }. D3 Z* R+ Y( H3 N) ]
}8 \; H+ Q- Y7 c$ g
}% f, b+ D3 T4 t' E5 l2 ?
spacer_1;
* |7 Z/ x6 Y& F: edit_box {// 编辑框% k" x, N! P; E$ \
label = "所选词组:";) X* D0 G* u6 ]
key = "sel_ok";
- ~' T4 B8 L, D, S2 Z# S( w; L}
+ X! G& ?# ~' F! c9 b5 v0 @5 f" gspacer_1;// 增加间距
0 r6 \0 _0 u& p$ \$ nok_cancel;* e% `% r! Y0 R2 ~; Q1 J
}
发表于 2010-12-14 09:43 | 显示全部楼层
不错,顶一个!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|sitemap|小黑屋|Archiver|手机版|UG网-UG技术论坛-青华数控模具培训学校 ( 粤ICP备15108561号 )

GMT+8, 2025-5-15 09:12 , Processed in 0.789094 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表