青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

青华模具培训学院
查看: 7666|回复: 0

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

[复制链接]
发表于 2009-11-16 14:15 | 显示全部楼层 |阅读模式
本帖最后由 luolizhong123 于 2009-11-16 06:17 编辑
3 z% I0 f) m( N  U0 M1 N0 ~' l" @7 C$ t8 f! {
本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。  
, z3 O" l+ U' _% q$ g% t+ k: S( r一、引言  
  W2 L* }: ~( W8 K# t  汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
6 b$ L  r$ a. U, _( H( J% a+ m1 q
001.jpg
  q0 P8 `( o1 }% o/ P- v' v! {1 G% G二、原理及方法  
( w2 y1 A* P& K% S2 t  AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
1 i% ]) b7 ^! n8 X  左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
; Y( A: d$ V( _: w; ]. H三、程序使用方法  
( w, J, E8 l8 k6 w( C先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
9 M) h& [' N* U- b- z6 z然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。 0 c2 r# i9 _  i( V
在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。
4 K' [) s; Q3 M( H+ j# e+ G: g) x0 |需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
4 C: e) T8 X: E& Q* M本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。  
& s9 S7 F( l( Y6 O% J8 U3 B(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)  0 P  G( F7 y* v# r. z, s% \
; 定义错误处理子程序
5 y0 U3 C9 O, Z+ X(defun txterr(s)
# E( c  |7 G, A! g(if (and (/= s "console break") - \4 W4 m1 X) }1 S: F% h
(/= s "Function cancelled") : @1 j' C0 A2 }2 ]
(/= s "quit / exit abort")  
# m# G- `" p  x* q0 G5 M- N/ n# s4 `) : Z' x* f  X( ]2 Y: p: |
(princ (strcat "\nError:" s)) - h, \8 A. Z, ~) ]) }: O' T/ M3 \8 B
)
' m( L( E: y# @(if olderr (setq *error* olderr)); 恢复原系统设置
4 l: P4 s3 ]8 W3 M(if oldcmd (setvar "cmdecho" oldcmd))   H# t8 u9 g& }. L
(princ) 9 c7 p( K6 j* L# T& Y3 m5 P: o( P
) / u9 Z: X! e1 b! Z1 r, m; s  v
; 对话框显示及驱动程序
6 V$ d3 ^8 ^! O) V: l: f(defun diag ( / i) 1 U; Q1 j. }, t% i6 {, K
(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
& o) N& g, T$ U. A& Z(progn
( {  @8 A/ z: ]9 z: ]" Y) w(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框
2 u5 i8 O/ l# y4 I(progn start_list "what");将词组显示到列表框内
: r% p1 Y: w0 B) q" [( O& v5 R' }(mapcar 'add_list txt_tb 7 \: |$ Z% @% b: @, m
) ) m0 @% t3 L9 h3 i: [4 e/ ~, A
(end_list)
6 E- f! A7 U9 A(setq i 1)   H" g7 R4 }( I% M
(repeat nn;点取词组分类项后的操作 ) x* j# p1 J; J) h/ A  x: V# |
(action_tile (strcat "c" (itoa i)) "(wr_txt)")
& \# s& C2 ^2 v; U4 K2 F(setq i (1+ i)) - C- b: r! M& }1 S
)
4 `3 d8 X. Y/ L" G, s- T(action_tile "what" "(setq i (atoi $value));选中词组
) ]: w& G# C9 f* {1 f# }(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
' S* f( P$ v# }" x( r/ r) & v2 [* t, p! w$ P; i. `
(action_tile "sel_ok" "(setq txt $value)") + c# C, Q+ [9 H* i2 ^# B9 Y
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
* z3 X* F* L3 a( J* K( [. R(action_tile "cancel" "(unload_dialog dcl_id)")
% d, }0 H: o' L/ p& K4 l1 q(start_dialog) 4 m5 N4 y. x  a
) # J7 F$ c7 k1 _/ i7 u. n* ]: _
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!") ; d* o$ Y& \3 t& i' g4 e
) 8 i6 k% c6 x1 t3 t8 E% x7 y
)
4 m3 q. T- n2 o(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!") ; t. k4 T0 H* h9 B
)
* n: {9 Y$ M) y/ I' z3 M! U0 q) + C; z8 R. }8 {
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
* C  n8 _9 [, ?) F(defun init( / fname fp txt1)
7 C. ]! `4 v: T6 F(setq fname (findfile "$txt1.dat"))
! J, \  B7 Y6 E3 d4 J% ^8 q(if (not fname)
+ {: R; s) E6 V. a4 I" I0 a4 a) u(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出
2 U: ~2 |% V3 y" w# `/ F)
) y( X- b& s: e. U7 p* c3 K7 C: K(setq fp (open fname "r")) % X# z8 W' A2 @( H: ^! p* z
(setq txt_tb '())
1 r! K" i" z: u(while (setq txt1 (read_line fp))
4 m1 X+ ^: A+ |# ^9 ^2 Q; ?/ f(setq txt_tb (cons txt1 txt_tb))
; M* V, X2 @$ H& h6 Z: y8 C) 0 @, J% j: n6 O) n
(close fp)
' }& s, i8 v8 a(setq txt_tb (reverse txt_tb)) - b1 A- A% r- ?7 y
(setq old_nn 1);记录索引号 5 V" q. X6 J7 l  ]) \- {+ i4 K
) 4 K5 z% e9 l& N) g
; 更换列表框内词组显示内容 * I% U5 y2 t! h4 l
(defun wr_txt ( / fname fname1 fp txt1 i)
  q* u2 k  S7 w; }(setq i 1)
/ g1 f' f, n% @. r(while (<= i nn); 判别哪个词组项被点中 ! `, I: t& q7 |
(if (= (get_tile (strcat "c" (itoa i))) "1") : q# W3 g5 M" Y
(setq fname1 (strcat "$txt" (itoa i) ".dat")
- I( G( y  E; t1 M4 Ui nn 7 v* ?7 j8 D9 ~& s9 F" ^* F
)
( L4 o/ p5 j! J, U1 g6 u7 k)
& J9 Y, [4 A6 A(setq i (1+ i)) 9 ?, `% F) N( c* y* \* {
)
6 Y% x& g2 I' P& `2 q4 k5 ]9 q(if (setq fname (findfile fname1)); 查找文件是否存在
5 C+ G5 u/ ^1 L! M( a) L- i/ F(progn
1 ?" B6 f8 m3 d) @: z(setq old_nn (atoi (substr fname1 5)));记录索引号
/ u. u& ]& a0 m0 q4 @(setq fp (open fname "r")) 4 ?) C" p/ ?1 P6 K  Y
(setq txt_tb '())
7 J9 Z, T, L4 j. S. Z1 b3 r- Q(while (setq txt1 (read_line fp));依次读出各词组
' e5 n7 ]( F5 g$ y* x(setq txt_tb (cons txt1 txt_tb)) 6 ~9 R* A3 g, }, s4 @2 g- R
)
3 `; Z* a% |- m6 \$ d(close fp)
; D/ ]7 u* B: ]4 b& R3 h- ~(setq txt_tb (reverse txt_tb)) 4 W$ U) T: t6 ~" N3 x
(start_list "what");在列表框内显示词组内容 . M# G0 A) Q: H: X
(mapcar 'add_list txt_tb)
5 u5 E8 i, k$ x0 q) F9 n- O(end_list)
/ K; X2 P1 o2 x  _) ; progn   g+ d9 E+ U* t2 [, h
(progn
& }% J( ]+ T9 G# a) Y* E0 r(alert (strcat "文件" fname1 "不存在!")) 0 z/ @* }% X( ~5 F
(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号 ( t9 J, d2 M" [: O. |$ x6 ]( H  I
) % a( f: B! y* q% ]1 a8 `
) ; if / M% ?  S1 W+ O& z* U
)
$ u* [7 C  q+ M; 主程序开始 9 a9 k* h: |7 W+ d
(setq olderr *error*  & }" ?. A' a( o  f2 V
*error* txterr % }3 S! K* A4 G5 V$ y& S
oldcmd (getvar "cmdecho")  9 r0 X0 L9 O# ]7 ?  y
)
, N  l1 g! E+ y' x+ Z(setvar "cmdecho" 0) ; 命令不回显
, x2 }3 E* D, {(setq nn 9) ; 词组分类数
2 v9 H# t1 A0 B7 ~- F* R(init) ; 初始化 1 p5 l5 E. S% ]+ R8 V
(diag) ; 驱动对话框
+ v5 @2 Q  m! m5 N% v* z9 |$ `(if (and ok txt)
2 u/ _, L/ ~4 [* c, F(progn
0 W& \* x+ i3 }) q, Y: d2 e8 S(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
1 k7 {3 q1 X$ n) w- X4 z6 |7 z: o. c(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值 % I7 L0 x; C4 z$ r
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"  
& g* L+ c% b0 ], T)
( A- Z9 {* r: d+ e& o2 T(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型 : U  m" s  y( T. B: l) ~) C
)
- Y% u& J. i8 f3 }0 g8 g(initget (+ 2 4));下面的输入值要求大于0
6 F! x) {1 l) ?/ ?& Y3 N(setq ht (getreal "\n请输入字高<500>:"))
) n/ C/ r, @+ O# l1 V0 Q2 w2 [9 |(if (not ht) (setq ht 500))
( l) k  x/ G! F4 g(setq pt (getpoint "\n请点取文字起点:")) - C2 A  X, [6 y% C' i' |
(command "text" pt ht 0 txt) 1 U% S/ m; C! }3 w% ~3 n, j* `4 a
) % g3 m$ b3 K8 R% f2 I9 o; p
)
6 O" U  B. ~; y1 _% W4 C8 o(setq *error* olderr);恢复原设置 ' f( p+ x4 Q0 N
(setvar "cmdecho" oldcmd) / A+ [: }2 z6 K$ r
(princ)
9 k) {7 [4 X7 q% q; K) ) Z. z9 S( F7 Y$ j" l6 C
// #txt.dcl  1 Y  m: ]. u; A5 Y
// 供#txt.lsp调用 0 E2 x2 U; C0 j
filetext : dialog { // 对话框名称 4 V- N! x7 s: {* j) d" a/ J
label = "常用词组"; // 对话框标识
3 H& h* r+ {, C  W( z, |( L: row { & I9 l! j: r, V& D; \% \, E
: boxed_column {
/ N# o6 V( `5 vlabel = " 索 引 ";
- b1 ^9 E" j# `# u4 ]. o: radio_button {
: o4 o, q( \4 t4 y& w: n# f( Slabel = "常用术语"; // 多选一按钮
  i: w$ \" e5 A# I. o3 }& Dkey = "c1"; + V" G: g- p1 q9 `: I- ?8 G# s
value = "1"; // 初始值为"1", 表示选中
0 d% k+ v  c/ y( a+ O1 T} : radio_button {
! }% L" ?5 G5 ilabel = "图纸名称";
/ [: T2 s8 o& E; r
+ ?, N. }; C+ @key = "c2"; $ N4 t, Q9 y8 n0 L4 D7 d
} 5 B: e; @8 I2 r, g, {% [) |
: radio_button { ( l% S7 L4 A3 a4 l
label = "房间名称";
! _6 P% {' i# Y; B1 a3 ~4 O: m7 z9 x
key = "c3";
0 N$ Y( v+ _, Z/ F9 n} : radio_button {
- d" D0 |# A3 ]/ T5 Olabel = "卫生器具"; 7 ]# m; ^) t& w- s$ F' Q* X
key = "c4"; 0 H: V9 B( c- D# y

" i/ F" r, q+ {- v} : radio_button {
  r' v; I- _* K. ]$ O( N& P  klabel = "管材配件";
2 K  v# w3 I- E4 ~( U# hkey = "c5"; 3 w( G: E: U, V/ K* X  L/ ?) ?; T) w+ c
} 2 P+ A- u5 _! t0 c# i
: radio_button { label = "器材仪表";
  h, `- [1 g$ Skey = "c6";
/ ]; q* i, o" t5 S" x9 [/ z6 e) \3 E6 q
} : radio_button { label = "常用设备";
  R/ l5 Z. E/ e# D0 \1 ^key = "c7"; } # s" i/ H% a) k/ r, K0 {; c
: radio_button {
# t/ n" L% q) y" H9 x( Blabel = "构筑物";
) F6 J4 j3 W2 Skey = "c8";
, ]0 C- ?  U4 j4 V% @  F}
* H9 `) `( R8 F8 m( j: radio_button { 8 f7 z5 V/ e, ?3 b2 i* _
- s5 o( {: Y  J, T+ q
label = "其它";
8 W6 @  \0 M% ~/ O2 U5 w" _* B% \4 nkey = "c9"; . t  w& o9 s" ^9 q/ ?# L
} 4 ^4 A% y9 V$ d- l
}
) C* f; W8 G4 v! m: r( ~; Y% f: list_box { % D+ ]2 K; ~! ~8 E2 \4 c0 v
label = "词组内容";
- |3 ~9 }( [9 k8 }5 W1 {key = "what"; 9 }4 Q6 Z$ U, B! d+ i7 r
height = 15;
# W3 g( i9 S6 w  g7 U3 J0 o. ^" Twidth = 26;
2 k+ i' v7 m( m' t0 {& \3 m  gallow_accept = true; // 可双击鼠标选取
7 A! e# _; C7 r& _! ~  A& _  p) w" z! G& w& r1 s( i2 q
}
1 Z2 v% k" B6 ?: r# Z5 u% N} spacer_1; 8 ~. o/ j; p: t; \# i7 d
: edit_box {// 编辑框 ) B) p. ^) K: o3 g$ t
label = "所选词组:";
; j4 y6 i( W  g) t! E% Kkey = "sel_ok"; ) }% Y0 ?# a; |& p) M+ j6 p1 C
. |  Q' [* o3 Y/ X
} spacer_1;// 增加间距 " z9 |! @0 v1 O1 I6 j
ok_cancel;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-12 08:53 , Processed in 0.213837 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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