青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2009-11-16 14:15 | 显示全部楼层 |阅读模式
本帖最后由 luolizhong123 于 2009-11-16 06:17 编辑 ; Q. d- ?- ^+ W  n* x
* `( E$ l' _5 _% G! _& k# R
本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。  
  S' ^# E% `& ^5 X; A& q一、引言  
. d+ e1 a3 s, L$ z  汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。! D6 P  h$ l( {  U7 ^( V9 _' o# T( \
001.jpg 6 \3 n  q  P! q% C4 i) T
二、原理及方法  0 H1 U& z# q% n) `& K0 @
  AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。 % {' }, c+ R' B6 z
  左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
1 |1 j( U% p( Q+ |0 f# Q: X: m. E三、程序使用方法  
# U+ z$ v. `! H$ h- f先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。
# ~' u; ?( V7 n. A然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
& ^5 N# [4 ^: N在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。 % J6 O; V% [7 N( E7 z3 u& b! S
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
5 I+ v6 T) ~# m5 p+ W本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。  
" q( V, V+ T0 k(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)  
$ m& ]6 X' e, i/ S; 定义错误处理子程序 6 P/ G" W" W2 Y/ R; u2 G
(defun txterr(s)
5 ~! W: B" H+ R5 h(if (and (/= s "console break") 1 r& E* E& P0 a2 }" n: I# }8 L8 O
(/= s "Function cancelled")
* m1 ^) P% _) S( ^3 U. \(/= s "quit / exit abort")  . J3 Y/ I% G+ ?: u; Q  d
)
, g9 U8 G- \' x" H. K2 s(princ (strcat "\nError:" s))
! M5 m6 ~* t* z( a3 q& k) : c% p: k: R1 e# f( g5 I
(if olderr (setq *error* olderr)); 恢复原系统设置
& N* V+ ?1 D' z+ w8 s$ f(if oldcmd (setvar "cmdecho" oldcmd))
7 R9 U9 e) Q1 c& N2 Q3 ^(princ) 4 v  ]7 j" A1 x+ q, A9 R, I
) * j# u* {: H5 v
; 对话框显示及驱动程序
; V6 j  i" Y3 _6 S; |3 E(defun diag ( / i)
; E2 X* ^7 w3 m* ~- P(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件
: O; j2 \6 G1 S1 @(progn ; @" d1 r% y5 N# z$ H8 Z
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框 : S$ A. `& `* D# g) \# X
(progn start_list "what");将词组显示到列表框内 - r* a1 H! D% _2 g6 Q6 c$ _; A
(mapcar 'add_list txt_tb
6 i) E; i9 a! E& f7 o) 3 l9 ]3 k% M! A. D: p* U, z8 C
(end_list)
9 z/ t( r# o9 M9 X# p3 J+ r5 ]; O* T(setq i 1)
: o, G( j! i( `3 W(repeat nn;点取词组分类项后的操作
6 p( H& y4 }" i(action_tile (strcat "c" (itoa i)) "(wr_txt)")
( n% J7 z- `" c  i(setq i (1+ i))
1 I5 a; G  M7 K2 X' q)
3 T2 S  \4 _0 H) U: n8 E( ](action_tile "what" "(setq i (atoi $value));选中词组 ' b1 A3 l  |! B0 c5 ^8 m
(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
( n5 X3 s$ Z$ Y7 A6 H) 7 |- ]4 T# x, R$ T9 }% J5 e
(action_tile "sel_ok" "(setq txt $value)")
4 p" q! D: \6 b8 x, Q(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
0 g! P8 t1 M# S( S* B: B(action_tile "cancel" "(unload_dialog dcl_id)")
$ X3 x  V" t! O3 a(start_dialog) ) W* X% m0 C9 }
)   H; g6 T9 E; B1 S
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!") * f( A4 F( I% \, Z, k3 _
) " \' F% a9 r2 Q) f) |
)
) I% e+ {. w4 n. A$ |(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")
& K- P1 ?' W2 J0 S9 O) & _- N2 p; `1 D" }  A1 g7 Y  O
)
+ a4 g5 D; _( T4 k* ]; W6 j; 初始化程序, 把第1个分组项中的词组读入表txt_tb中 - E& ]8 m6 ^( n
(defun init( / fname fp txt1)
7 p, [* U6 T; l8 n1 }" |" z2 Q(setq fname (findfile "$txt1.dat"))
! P. l  p9 R1 m4 C3 Y(if (not fname) 2 I$ ?- Z" x) |9 }5 |4 H# f( g) Y
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出
3 K- V8 [" c5 m9 {" B. H# ]. t# C)
# Q; Y* \! D- l(setq fp (open fname "r"))
# L6 U- L' g4 N6 S(setq txt_tb '())
; }) n7 ?. B3 _% `7 C6 k(while (setq txt1 (read_line fp)) : ^" B, B& h, J. F5 f# C  T( j" g
(setq txt_tb (cons txt1 txt_tb))
+ i$ O, y  {, \0 T& O1 u1 k) & Z" I: r- B0 I6 V8 l
(close fp) , A6 q6 K- P# j: r7 i$ E6 E: W) q% H. n
(setq txt_tb (reverse txt_tb))
1 Q0 ~; p3 n" \6 `, _% ~(setq old_nn 1);记录索引号 5 V4 x+ n7 l# n4 `5 C+ }6 a
) # s1 a5 c" @: o  s$ f' i: [
; 更换列表框内词组显示内容 ( ?2 J3 ]9 t3 Z8 z9 m
(defun wr_txt ( / fname fname1 fp txt1 i) - T/ Y$ q+ N; Y6 h) B' ~/ K1 K
(setq i 1) 4 W: L. d* d$ g6 x. _8 q: a4 v
(while (<= i nn); 判别哪个词组项被点中
9 S3 s" k/ ]: K) x(if (= (get_tile (strcat "c" (itoa i))) "1") 6 p: @+ w% R$ D% r+ x
(setq fname1 (strcat "$txt" (itoa i) ".dat") 7 a0 W% f; j  ^1 V8 ?6 }& O1 D  Z& P
i nn
# H- M" j* M: \& l# p3 x5 [)
2 V) J0 d5 f# f, O* |)
: V! e7 J" c5 H& p# L  F7 r(setq i (1+ i))
& G- I+ y- t) _6 K* w0 T)
/ a4 |( {( c* G* \! g' R(if (setq fname (findfile fname1)); 查找文件是否存在 4 g9 H3 `7 l' p
(progn
7 q  s' I! I5 O) _(setq old_nn (atoi (substr fname1 5)));记录索引号
) K6 d6 r5 o- x% X7 V. ^1 S(setq fp (open fname "r")) 9 A4 e; v4 O1 H, L
(setq txt_tb '()) & B  {; _+ U& v2 L- S
(while (setq txt1 (read_line fp));依次读出各词组 8 \0 Z% ]8 U9 f4 m: J& r  [! G
(setq txt_tb (cons txt1 txt_tb)) . @4 G! j# C! {7 S( _+ h7 Z6 y& r
) 8 p8 r2 J2 m# k% M* y
(close fp) 9 g; E9 r) N4 u, P7 l, J# q" O5 ?* M
(setq txt_tb (reverse txt_tb))   n5 Z  p# f5 S+ f  J! I
(start_list "what");在列表框内显示词组内容 9 q  K. I  v! P4 v- \% g
(mapcar 'add_list txt_tb) ( S; x" O) |& n$ K' {; K! E
(end_list)
7 z" [8 Z( h" m3 E6 W+ X) ; progn ( d8 Q0 M$ [; c: Q! _
(progn
7 ?- P/ J8 [" q( J: W/ g(alert (strcat "文件" fname1 "不存在!")) - h$ z4 v3 I: I; @+ U. Q; N
(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号 $ Q- A9 W% s9 s# R
) ' W% ^( l) k3 Y. a. u9 R, i
) ; if
# R% o' O0 _% c/ F0 ~& o" i; S/ `) * I7 U; c( P' g; t+ `  i. E' y5 U, I+ A
; 主程序开始
: i/ {2 t8 M8 h: y- G! k(setq olderr *error*  
' ~- ?% e7 |5 F. N*error* txterr 1 A3 @2 o; Q- W3 [9 q6 `& n
oldcmd (getvar "cmdecho")  
5 Y$ j, M5 t8 y# t, q* |6 a, [)
+ l  D$ q8 B1 H. }* B7 A9 Z  F(setvar "cmdecho" 0) ; 命令不回显
! C' s( I1 O/ o4 F# V  r" Q(setq nn 9) ; 词组分类数 0 ~, P+ h: N; t$ M& A
(init) ; 初始化
  @" E% Y% W& k' P5 _(diag) ; 驱动对话框
2 |0 x4 H6 z- A" H) k(if (and ok txt)
. \4 w9 }. H" G1 R( h  G, t(progn
! s/ r6 A8 A; l/ P3 ]+ H(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
& m% v9 Z0 K" w6 s1 ^" a(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值
) v8 L: I$ |, d9 v9 j(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"  
3 q) ?8 D# J8 _, M  K1 R0 \) / O! }. C* E6 I% {7 l
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型 - Y0 }) j9 C, B+ L: n3 y6 Z
) 2 F6 L8 s+ `3 n" l% R) I8 T5 O/ ]
(initget (+ 2 4));下面的输入值要求大于0 3 l* J" b2 n. H! |& a
(setq ht (getreal "\n请输入字高<500>:"))
, T$ y0 T) w7 H/ W/ p. ?0 V(if (not ht) (setq ht 500)) - h5 u' Y( r. G. `7 r+ g  X" x# n
(setq pt (getpoint "\n请点取文字起点:")) ( `5 k7 \; t& I3 N! U  H: h
(command "text" pt ht 0 txt)
6 _8 B. F% ?4 R5 k. r; O)
3 ~3 H. C9 o* d% b4 j/ d) " M% Y" g& K7 C: \
(setq *error* olderr);恢复原设置 3 U9 d# Y' J& n5 B
(setvar "cmdecho" oldcmd)
3 _% h% }3 h4 n2 f% ]: |(princ)
8 e+ \# }3 h* i8 N5 p# _3 u+ \)
  u" J9 ^, u& B$ B: K// #txt.dcl  
0 J( X# }8 c) d4 l; f" A1 G// 供#txt.lsp调用 $ ~0 Y6 r0 J- c
filetext : dialog { // 对话框名称
% K6 k* I8 T3 p+ U0 t- mlabel = "常用词组"; // 对话框标识 . P2 b. O2 m: Q) g+ s4 p* ~- _2 U
: row {
' i& W$ b! P! c. p: boxed_column {; d, h( m) E( f* T3 P! [
label = " 索 引 "; % }  J. h5 N$ `" |; s6 N* b
: radio_button {
" Q1 N: U. s1 l# K. |label = "常用术语"; // 多选一按钮 * S- B3 w4 f, g' x
key = "c1";
2 L( d  a* z$ g% [value = "1"; // 初始值为"1", 表示选中 7 m2 M$ y2 i+ \2 x, J& s
} : radio_button {
& m# l/ B7 y: w; F7 Vlabel = "图纸名称";
* @+ w6 G6 |  a7 ~- B* n) M3 ]! X/ h6 \) e
key = "c2"; & g  m" _* ]. z
}
: Y0 o& Z& `# m- W$ G1 s: radio_button {
* ]$ c3 s! d, d) M& G% ^label = "房间名称";
! |* P# M( s# O  v
9 p  A( A$ R3 r% o3 l; U( `9 jkey = "c3";
+ _/ o) b. R) T} : radio_button { 1 r) Z0 V7 S. O' n0 L9 ?
label = "卫生器具";
, D7 L$ D* }2 H9 P: M" s  _& ?+ Tkey = "c4";
/ z: G0 ~" ], J) N+ c
9 u' T. t+ D4 i4 u0 ~} : radio_button {
  w: p3 @# V2 K3 M! Xlabel = "管材配件"; ( A8 t7 H: k3 [6 [- k
key = "c5";
& T6 ~) m  z% @8 k$ [} $ p, ?6 A8 E5 Q2 K! ]
: radio_button { label = "器材仪表"; * S) x; y# j: k) R* C) h4 L
key = "c6";
+ V3 O' h/ ]4 I" `* w  P% c. @; \0 H1 o# h) v& M6 D! W
} : radio_button { label = "常用设备";
) j& |& o0 J* h" W$ w6 xkey = "c7"; } ' H# Y% d# V. Z
: radio_button {
, V& `" p  n1 k. V- H' g$ Z1 z6 clabel = "构筑物"; ; z6 A3 D. o8 s7 P) G) k8 K
key = "c8";   g) f+ Y" T# U" V) N
} 4 w% D, h/ O& v  ?0 D% c
: radio_button { ! V$ ~% W5 @1 o% {; p2 A* _

8 h2 X' F" z- rlabel = "其它"; ' e7 \' l# s* @0 V* u4 n& |
key = "c9"; ; u* l+ B7 U2 M
} * ^: U7 \" k8 f
}
: {  C2 f1 v& S- {8 F: list_box {
: i: m4 W9 h% nlabel = "词组内容";
5 v2 V* j9 n' }! H# M' rkey = "what"; + p, A, ~' a2 H1 Q
height = 15; / s4 ^4 h' I6 y2 Z: T
width = 26;
% {6 V( b. i  H4 P. a+ v% o+ M  g, Pallow_accept = true; // 可双击鼠标选取 ( n. ]7 T) e0 p$ a9 o" R

- a3 _: d) X* n} ! m! N+ e  _; I1 a
} spacer_1;
  g' u3 ~1 D$ A5 W' f: edit_box {// 编辑框
1 ~. H3 J0 b. Y* |4 xlabel = "所选词组:"; & L) K# c# ~4 T9 v" O! b" S4 A& u! |& j, E
key = "sel_ok"; 3 @; d" t% E) _' y2 X

' M$ z1 J6 _/ h" d% u* e+ ]} spacer_1;// 增加间距
8 p0 _& U$ `$ H* r% Cok_cancel;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 04:07 , Processed in 0.053610 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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