青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2010-12-14 09:22 | 显示全部楼层 |阅读模式
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
0 m* A3 D1 L9 A' n. D) D" a8 f一、引言
3 B* ]5 _# s9 R! P2 i, F6 v! l  汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
" U! g4 f9 {5 Q# g4 o1 y二、原理及方法 , @+ p% m8 p9 f3 m. b/ ?
  AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
3 K: w) O2 o7 j2 f, c  左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
4 c2 W+ x2 _! q9 t. t三、程序使用方法
2 b1 m# I8 M! r# R- B  L: k先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
4 V0 g7 R, B" d# C% G) X& {然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
/ L# e( P! p- D7 V2 [9 V2 T% [2 P在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。1 y$ N  O' a# I( k5 b$ F9 x
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
( Q% G( _" n, K9 Q: l& \本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。 4 j: {" K4 @: K- o, t  ?% V2 _' D* k7 _
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
, D/ q$ [# p! Q+ d, f; 定义错误处理子程序# ?6 v; h' Z9 y' ]9 e9 }- A7 E( g/ t
(defun txterr(s)
$ r4 ?" U% |* T# T8 c(if (and (/= s "console break")
1 v+ ^! W( x  C: [7 {(/= s "Function cancelled")2 x' r* K9 R7 n' |# c% R& [
(/= s "quit / exit abort")
8 @# g, b# T$ T, R)0 ~/ M1 I8 C! W$ Q: P
(princ (strcat "\nError:" s))
' k4 w; O+ r8 {% @4 {7 g)
" K* J3 b; w' s" I* `1 I* I(if olderr (setq *error* olderr)); 恢复原系统设置
. h2 d/ s5 b7 `$ l3 a1 E; }7 d, L(if oldcmd (setvar "cmdecho" oldcmd))9 S: K6 j1 x& y, t( j" H
(princ)5 j& N/ N9 P  K8 D$ R* N
)0 d$ k0 R4 p8 y# c
; 对话框显示及驱动程序, i6 i# M1 }: r- |" k5 K0 _! ~
(defun diag ( / i)
  @! ?9 ~- H8 _/ [( W- z(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件& z- `2 Z# y1 R+ c# f$ ]
(progn
$ X3 g4 f; @% U(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框/ O8 J" U; }. }+ m( Q5 H: r7 e+ k7 E
(progn start_list "what");将词组显示到列表框内, N  o; Z8 {; d! b9 R) c
(mapcar 'add_list txt_tb
9 i. G2 _; J( K8 w$ m4 y* C# w)
+ {$ K+ G* M- W* i. U(end_list)4 s! H. }/ x/ Q! e* Z7 O( m
(setq i 1); q7 a- {( C) ]
(repeat nn;点取词组分类项后的操作
8 ]5 E) B. r  P% P5 I" P9 s2 S(action_tile (strcat "c" (itoa i)) "(wr_txt)"); q  J- Q3 `# d! l
(setq i (1+ i))
/ _- i8 E* h* o( C+ {)
( U" G% S& |+ Y; [* S5 h1 H(action_tile "what" "(setq i (atoi $value));选中词组  H/ ?+ D; N% L2 h' U0 W
(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"2 m5 L9 ~  D$ H' i' ], G: V7 H8 r
)/ ?! _$ [( C! I3 L& z4 B% O
(action_tile "sel_ok" "(setq txt $value)")
- L' |# E9 I- P+ z6 E. Z(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
* T! C1 }  _: a+ w& |(action_tile "cancel" "(unload_dialog dcl_id)")
' H) S/ j# b5 g8 F& p, b: P(start_dialog)
+ o) {( p$ U' g: i)
! p7 y/ l+ `% j1 y(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
5 ^. X5 C1 v+ c1 J. [)3 N7 u, {) `+ E8 W. U  p' l0 R& |6 A
)1 m1 ]- ~+ b" ]3 s% @) a
(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")
+ Y  p+ ~& |3 })
1 i. Q4 [2 e( `' n4 I)* L& i! R$ l  S2 X* s, q
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中
7 V& H, k/ [: G( M+ v(defun init( / fname fp txt1)  Q$ c3 S* d- R' d
(setq fname (findfile "$txt1.dat")); V6 s! n- ?/ Y8 W  x( E
(if (not fname)
* {# W6 M5 ]; k2 @# ]- y(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出' W' c8 D1 i& g7 |* e& L8 }% x
)0 Q3 L; N% B$ c' D
(setq fp (open fname "r"))9 G2 ^9 h3 e, u, M
(setq txt_tb '())5 ^7 G. Q6 t* G  N# C. k( t2 b
(while (setq txt1 (read_line fp))+ k/ h; ?; x% l+ f2 Y
(setq txt_tb (cons txt1 txt_tb))6 v% l1 K6 H2 }1 \5 f) u
)
  D$ `7 U  E7 F; i% G" h+ j(close fp)% I5 Y: D+ t; g1 g( C7 A
(setq txt_tb (reverse txt_tb))
  T- i1 A7 D& Y, r( u  s! m& N, n(setq old_nn 1);记录索引号$ L) K) `9 }) D4 T! P2 I1 C
)# I% D- d  G1 k  z1 R8 ^
; 更换列表框内词组显示内容
- n8 `  N. F! b(defun wr_txt ( / fname fname1 fp txt1 i)2 t4 t: ~% c6 T: k7 N# j- `
(setq i 1)
3 Z- [. M; V1 v) P4 ^* ~+ f(while (<= i nn); 判别哪个词组项被点中8 _; F- z; [' j1 E
(if (= (get_tile (strcat "c" (itoa i))) "1")( d+ h+ N$ o9 u6 J
(setq fname1 (strcat "$txt" (itoa i) ".dat")& e4 l0 W7 E" s5 U" k
i nn
) \8 Y! @# `) N3 @1 q) t)
6 o4 w2 ], F4 O$ t$ Z* I)0 ^( d- X- n  ]1 p+ m# e
(setq i (1+ i))
0 P( P- _% y+ k( H: z)
3 U3 M6 i! q: m8 u( M(if (setq fname (findfile fname1)); 查找文件是否存在
! g# h( [* m: T(progn
. N% u: A3 t: [3 g(setq old_nn (atoi (substr fname1 5)));记录索引号
) L5 ]. n( F: I8 S(setq fp (open fname "r"))' ]/ i7 s# ?! M
(setq txt_tb '())( d3 u) v9 G; y1 R: H' P
(while (setq txt1 (read_line fp));依次读出各词组
; O2 Y+ N; H8 v, X0 a(setq txt_tb (cons txt1 txt_tb)): C( a' y6 d, ^
)% Y/ `. E' @1 O* ^" V3 ^+ a! N. [# K: g
(close fp)
; p, ^2 i+ E) f$ X0 y1 N(setq txt_tb (reverse txt_tb))
+ [6 a: f* t7 \(start_list "what");在列表框内显示词组内容1 X; y) A8 Y4 t9 y- B  E& m2 M$ f
(mapcar 'add_list txt_tb)3 A. S- O4 \, {1 z; H# C
(end_list)
) }; I; ~: a' D, {1 d  E) ; progn' T$ W& B0 X- [6 G9 {: k  |
(progn% r* C) l* v" p' ~) V
(alert (strcat "文件" fname1 "不存在!"))6 [3 s1 r/ W8 q6 X
(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
; l. M. f" ~  O4 R)
6 J4 c, P& q' \# [# X  z  l/ j! A) ; if
& {* q5 N1 ]8 J)  w4 B- c# K4 A3 [8 Q
; 主程序开始0 P3 \* H2 J4 l+ h
(setq olderr *error* . q1 T/ T2 B) W4 u: K- Z5 `
*error* txterr
% q- r9 Z+ Y! i4 }0 p8 g# u3 |oldcmd (getvar "cmdecho") ! n$ f: n# k% A
): L( O8 W% J: ?* r) j5 z; [
(setvar "cmdecho" 0) ; 命令不回显; n9 K; z9 r+ L9 @+ G% ?
(setq nn 9) ; 词组分类数  N6 n" C0 l/ \( d: X4 {* v
(init) ; 初始化* t$ s* E9 k' }7 L' K
(diag) ; 驱动对话框
0 o9 _- V, H& B* m) s& M, y(if (and ok txt)9 Z/ g8 J) S0 H" x/ E: u
(progn
0 F+ D) P) I5 R% t(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在) F0 B- \7 n; D  j" g
(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值9 J3 p- Q% K' ]. N4 {- ~8 q
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ" ' t$ D6 O+ k2 O4 ]! s
)
: y1 a7 o( G3 j+ ^(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型7 D8 d/ X# z0 L. Y0 Y
)' P7 r, x+ u$ U: W
(initget (+ 2 4));下面的输入值要求大于06 u) A) J7 u5 N6 u+ B: h
(setq ht (getreal "\n请输入字高<500>:")). E2 x9 A7 D. {
(if (not ht) (setq ht 500))
9 |- _- F- |* G! r# e# Z(setq pt (getpoint "\n请点取文字起点:"))& @9 X, `% ^  F
(command "text" pt ht 0 txt)7 H2 `# L- j, h" m) B! K
)
0 G2 |) b" F1 l6 E8 {)
. h- V" M! b) l- a(setq *error* olderr);恢复原设置1 Q) |) d8 Q8 g" t
(setvar "cmdecho" oldcmd)$ p1 V' M5 L- `
(princ)
8 S) Q# n( W1 k9 k3 j) M: n8 Y)0 N% h! h5 Q% b
// #txt.dcl : y, l+ e2 \( ~. g
// 供#txt.lsp调用0 l) Y3 I# z# y# @( M, Q; ~7 U: W
filetext : dialog { // 对话框名称
4 g2 o( b% G" x! h% f3 ?' alabel = "常用词组"; // 对话框标识
* v0 r# D& ~9 ~! v: row {  r/ a. Z- j# g" f8 K9 ^
: boxed_column {9 B/ T8 F9 b8 g- f6 q+ h2 p- ^# f
label = " 索 引 ";$ U+ E+ m# `5 u! |2 D/ j
: radio_button {9 z4 V' C( H; a- t0 V
label = "常用术语"; // 多选一按钮
9 \4 }0 {$ |/ D  j( t6 v  ?key = "c1";1 w/ R1 z4 I2 ?+ G9 w$ i1 O
value = "1"; // 初始值为"1", 表示选中- H3 M1 s* N+ n8 f& q& F: F. V
}( H9 A- f) U9 M& U$ S  d) J
: radio_button {
- \; O. }& G' J9 F5 d+ ?label = "图纸名称";
8 h0 h  Q+ I) W; ^: K* r! ~& Ikey = "c2";# G. ^0 C) T: X8 d) ?
}, n  e( s+ e) z  N8 W0 B; `
: radio_button {% @' j* m' t3 \" S
label = "房间名称";
- _; q+ W2 J' O/ ~9 i0 xkey = "c3";& _+ ]" x) T' b8 R% t
}
. `2 n, u# v+ e8 J) T  J3 T9 }, C: radio_button {
6 `  I, r# b; S) P! T3 `label = "卫生器具";
* f0 T9 q5 S. K) [key = "c4";
/ j; B5 ?: w6 Q. B, n0 z9 L}! X. e. i; ^+ o+ \1 h. T
: radio_button {
% V+ s, X; }5 Blabel = "管材配件";
: P6 J1 B: O6 d: m' j9 p+ j3 ]7 jkey = "c5";
% |! Q9 ]# a9 }" o+ u: C8 [}
) Q: V2 A" H- e! @0 B: radio_button {" h3 F9 e: X' q, v% O0 S3 C' i
label = "器材仪表";! W, o+ k: s$ W# U; F* j
key = "c6";; A! L+ D) a" D% C: N
}
" `. D% m6 l) P1 u' j2 Y3 K  f: radio_button {9 Q* D3 |, X4 r1 m  p
label = "常用设备";
6 L1 W" T5 x1 z* hkey = "c7";
$ k% K# l! M% I- @4 y}
8 t8 H" G5 A3 d: f: radio_button {
% |# y0 }' z7 I5 s5 `+ ilabel = "构筑物";5 `: L7 g) V0 x% ^4 c
key = "c8";; U! [( \7 m* [+ u( v0 P
}9 M6 V* I1 u, W" m; g3 d+ k
: radio_button {
6 c1 L( E% c. B3 b# alabel = "其它";$ X" p8 f+ a# V( g( w$ x* w3 A. N. ^1 E
key = "c9";1 [) v, y& [7 T4 `9 O
}
' S1 D. Z. [; j& r+ p8 |% I}
: k0 ^' I/ h% K: list_box {
$ H$ B! m* q: W) T5 s3 g) @% Clabel = "词组内容";" a3 @/ h& j0 s9 \4 r) r
key = "what";
+ ?2 B; A) k% {: B7 I! E9 t( iheight = 15;
4 m1 r1 b; x9 ?' A( Z: x1 \4 S, wwidth = 26;% N4 F* w# R  h( @7 i% q
allow_accept = true; // 可双击鼠标选取
3 z* h0 L, Z7 B, v/ q}
/ D$ c8 r2 i. O# ]2 O}. w" |3 `& J# w+ K7 Z3 c# L; L
spacer_1;
  t# y5 v! L3 ~. p. z% M: edit_box {// 编辑框0 J6 ]' u: v- K1 f5 N+ o
label = "所选词组:";
2 R' c+ w" r) V4 m% h  V9 s6 M4 jkey = "sel_ok";, t5 f) l& u- c2 m* U# n& U" B% D2 }
}- o! d3 ?' u" K$ }) B* ]
spacer_1;// 增加间距6 L7 n: w! k& n3 v" E# d
ok_cancel;; R  V. n0 G+ {0 f
}
发表于 2010-12-14 09:43 | 显示全部楼层
不错,顶一个!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 08:12 , Processed in 0.560742 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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