青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2010-12-14 09:22 | 显示全部楼层 |阅读模式
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 4 [, G; I2 T/ d" }4 P7 b3 a
一、引言 6 T/ E( A6 b+ S+ G6 d
  汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。! ~: S# Q8 `$ @. D; h; M
二、原理及方法 - ?  _, b- L) V2 R
  AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
( x/ G/ n! C9 K1 h. ?7 e* t9 ^: a3 }  左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。
3 [0 z6 s( N5 t3 I- f三、程序使用方法
: a" ?9 e4 g8 b先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。% G% m9 t) I' \. ?8 L
然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。+ {: t4 C" I% e# e
在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。- t7 H9 |* ?) _- T; L5 u7 p
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。' s" _0 U* y$ K* d
本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。
7 a, `- q# U. D: k7 v0 j0 [(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)
7 S& m# Z: M8 m, w: b! p; 定义错误处理子程序
/ ]# E% P3 Q1 ?6 |! q(defun txterr(s)
9 T% e- O, U" d4 K2 S3 S(if (and (/= s "console break")
; \, O, ]$ D$ s0 D(/= s "Function cancelled")9 E+ }/ O$ g3 o  C( K; P( U/ J
(/= s "quit / exit abort") ) P  S+ i% W2 Y+ {. p
)
% b. n1 N* P; @2 G(princ (strcat "\nError:" s))
; u# B9 N- e& R- n)- R0 H3 [5 B6 k% Q; ?: z
(if olderr (setq *error* olderr)); 恢复原系统设置
& Q7 g/ S. W# x  Y9 {(if oldcmd (setvar "cmdecho" oldcmd))$ Y1 g1 j' c/ q# ]
(princ): y' z9 z. F, [* U
)
* l1 b# V8 k  V  y/ a8 t* x/ V; 对话框显示及驱动程序8 Q3 l" R4 c# Z
(defun diag ( / i)
' l3 Z* l+ a, _: ^(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件, w2 U1 e+ X9 J3 I* E% {0 t
(progn
/ p9 A: u! M4 T(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框/ u9 E$ k. S! G# h1 r2 B
(progn start_list "what");将词组显示到列表框内
7 r5 o& o; i: V4 T$ i(mapcar 'add_list txt_tb5 a. o, p9 m9 k
)
# t/ I) i  `' f9 N(end_list), ~! L6 S# e/ a2 M- E
(setq i 1)
. G# y2 M% @0 X! a+ u  z, }(repeat nn;点取词组分类项后的操作$ p: q! x$ ^/ }
(action_tile (strcat "c" (itoa i)) "(wr_txt)")
1 ~5 A9 e* w  j! a& n; f(setq i (1+ i))6 N2 L8 R3 \. \* L+ I. y
)+ B$ O. x! j; A
(action_tile "what" "(setq i (atoi $value));选中词组
0 i1 G" \; a* @(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
  q& X- F: [1 T3 D, G; _6 d)
/ V" D' a6 Y8 |6 m(action_tile "sel_ok" "(setq txt $value)")8 j) R* \+ h" T: D& l
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
, i$ y% X& Q" V- K# S* @(action_tile "cancel" "(unload_dialog dcl_id)")
  l  T  d2 ^" i2 I* C, U; l0 y(start_dialog). l7 c4 L& j9 V: z; {5 @
)
# ?4 m/ q5 @; b9 G& q, }5 O(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")1 E( i; w5 g. Z% V" s- H' C
)  X' O' u, \. @( {
)
6 ]/ C2 T9 W) I0 ^! i* K0 s(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")0 p. d( J; o% O4 B% ?' C
)" `* m' {: }) N! R: l' A
)
  |5 _5 N- j1 h; 初始化程序, 把第1个分组项中的词组读入表txt_tb中6 f  q& e: C- v, j1 k% q
(defun init( / fname fp txt1)( H, G4 ~0 s. M- X4 e; k$ M
(setq fname (findfile "$txt1.dat"))9 C& g" A/ v: S' f- O
(if (not fname)6 t9 h8 P( m2 l; j) o( O
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出; O+ B) V- P( ^, s
)
2 d1 S# t9 ~( h4 [' q  D" N(setq fp (open fname "r"))
& {, U* x0 ?4 m( l(setq txt_tb '())
5 Y5 X2 D2 V: Z( ~(while (setq txt1 (read_line fp))
1 m+ }  J2 O' {! V, B& ^6 b(setq txt_tb (cons txt1 txt_tb))% R9 J# ^* i  i
)
0 ]4 C* u+ _: h  ?7 k(close fp)
. q% S4 ]! W3 d(setq txt_tb (reverse txt_tb))) ^  J# r# S# T) E, ^
(setq old_nn 1);记录索引号
( M0 C. U1 m7 `+ F5 l$ z)+ H% o8 j0 L" i; b: t" W
; 更换列表框内词组显示内容) ]: F% P7 N, u) _
(defun wr_txt ( / fname fname1 fp txt1 i)  J5 ^: |- |6 t$ K" H
(setq i 1)! H. Q9 H4 A- G( Z0 g
(while (<= i nn); 判别哪个词组项被点中- i# H! j; O- |/ I3 L
(if (= (get_tile (strcat "c" (itoa i))) "1")$ x) P: _2 ^& [3 P7 v
(setq fname1 (strcat "$txt" (itoa i) ".dat")
* m1 V- S+ D" p( Z8 g2 zi nn/ z! T0 T1 ~  K) _9 |9 n/ X
)$ }9 C  ]( b4 a
)
; S( Y8 h0 _/ [! R(setq i (1+ i))+ J  B; d2 x; K% j
)  I0 D8 p/ P0 y# k; w1 m
(if (setq fname (findfile fname1)); 查找文件是否存在
+ F& {0 ?: k+ a, ]+ Q4 `+ D" U(progn5 [! n7 \) K! m$ {6 p1 ^% \9 m% ?
(setq old_nn (atoi (substr fname1 5)));记录索引号
- V1 ~" b0 f; j$ N5 C$ b* E8 A(setq fp (open fname "r")), v% ]# f6 F, L. T3 m
(setq txt_tb '())
/ X' M2 I- U; x# X! t(while (setq txt1 (read_line fp));依次读出各词组
# z% J  J# @$ W$ J/ K4 b; i(setq txt_tb (cons txt1 txt_tb))
& U, H6 B6 f$ P0 L" ~9 v& @)6 T* E! d2 n# l2 w7 [  g
(close fp)
- D8 s: G+ b9 c& ^5 b1 K- H(setq txt_tb (reverse txt_tb))$ x, p6 L7 @% {
(start_list "what");在列表框内显示词组内容* M9 N) p! D" a4 `) s5 L7 f
(mapcar 'add_list txt_tb)
: D4 o4 P3 |* U% Q# z(end_list)
  r' g- P# u( ]) O) ; progn- G: d' W7 E9 r+ W4 E
(progn
5 a" p; Q" B6 @* e% a9 y5 k( ~$ b(alert (strcat "文件" fname1 "不存在!"))
" h3 m$ z+ M3 p) x6 i. f(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
" V# G, f9 s8 n1 g% Q)) y  b) I" v% ~8 i7 }
) ; if' }; L, J  y; P7 J4 v( F
)
6 O0 v5 w. a6 p' ^: p) D% p3 W. Y' y; 主程序开始
/ M/ u6 M0 A+ f: _(setq olderr *error*
/ P' A* Y% y) g% o# |*error* txterr
% C- Z- i  r: x9 t$ s5 g' f5 f5 woldcmd (getvar "cmdecho")
% W* \8 Y  n: r0 L7 J) O)  t: }% \( F8 L" k
(setvar "cmdecho" 0) ; 命令不回显' O" h4 \$ ^" B- u: R5 W9 u5 Q
(setq nn 9) ; 词组分类数
& R4 O5 E' P7 f(init) ; 初始化* A' a1 D4 e( L& f" a3 i+ F" s$ P
(diag) ; 驱动对话框
+ _" l# J3 x: S$ W& a4 `8 g: h(if (and ok txt)* [! L$ y2 x( [  e. N
(progn5 j' T; Q8 `! Y( h' W. K# ^6 e; f
(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在1 k3 z5 u( w) H; D- ^* s; X. M
(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值0 o* B- A' ?% j' W4 ?: z( X5 k
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ" / H  O$ K  `4 h" P
)6 S/ P& ?' {+ g' H! g
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
4 \, `  l+ i; R% ?8 G, z& D% K)
5 s0 k* l: i; B9 H4 _(initget (+ 2 4));下面的输入值要求大于0" P$ Y' L+ _( t& ~/ ?
(setq ht (getreal "\n请输入字高<500>:"))1 L( @. {" n) q/ H; I
(if (not ht) (setq ht 500))# t7 S# `; n; E( P7 y
(setq pt (getpoint "\n请点取文字起点:"))- K9 E4 T1 i9 M  h: Y2 N3 G
(command "text" pt ht 0 txt)
4 \7 U7 P; }0 g4 ]! ~. s+ `" I)
" Q+ @3 i3 Z5 v; T' F# {. a)2 m% e4 e3 b% c# P8 c; Y0 d) [
(setq *error* olderr);恢复原设置3 @5 @& n- t3 D: p9 s/ y
(setvar "cmdecho" oldcmd)
. ]4 q& T+ K. I& y0 F" h  O* |(princ)
' _0 v- I# c2 \% z$ e) M' b" {% ^)
' j& G+ h* `7 ^. R/ ?* Y4 w; }// #txt.dcl
0 B1 x% M1 w  ~# I6 z! V// 供#txt.lsp调用
% `8 e8 v! n5 q3 k- ?4 vfiletext : dialog { // 对话框名称
$ `- M- t* l+ {1 m- l, @label = "常用词组"; // 对话框标识, x, G& d3 ~# I
: row {/ z+ P1 R2 E/ u( b% ~
: boxed_column {( `1 z  \% H9 e0 F! J" ?0 g6 I% x
label = " 索 引 ";- d* Y0 [. l0 J$ h7 q
: radio_button {8 q+ C) I( x' z
label = "常用术语"; // 多选一按钮
& v7 W7 x+ r9 n' i3 V& a  p0 Xkey = "c1";! N0 n$ v9 n! y, F
value = "1"; // 初始值为"1", 表示选中/ J. \+ z0 e7 \+ K: H
}7 P  l( m+ o( o
: radio_button {
1 B  y0 H) X9 u4 D& Glabel = "图纸名称";
" j" h1 Y8 R$ ^0 v+ T+ O. C5 Ukey = "c2";" D8 K) ^6 r% h
}2 F- z' t& _; Z" W6 R3 J2 q! r0 v
: radio_button {3 B# y8 y/ K( W* q4 ?
label = "房间名称";8 K3 z0 M8 f3 U# J) ^
key = "c3";3 L: y3 T+ s- m+ ^+ N
}' g/ w4 C% O2 i. ~& d+ y, i7 U- L
: radio_button {% q' |5 ~8 [7 D, P$ g
label = "卫生器具";; k. |  T3 z9 C
key = "c4";
! _  i. m" @; Y2 Q}
) _% C$ @4 }0 |$ `: radio_button {
4 E3 e, W- W5 @9 `0 @0 i$ r- h7 [label = "管材配件";) [1 ?& w! d/ B4 y# w
key = "c5";
: s/ {7 G0 i- Y}
5 U5 ?* H' F$ e  O: radio_button {
- D) {6 H7 l  U1 \+ N. `label = "器材仪表";; @1 y; P  Q4 m. J
key = "c6";
5 J) n" P5 b. U}0 M0 G7 F  n' b
: radio_button {9 b7 c' e+ m% N9 C
label = "常用设备";
8 h7 I; t0 f) V7 ~  }9 nkey = "c7";% B7 k( Q( K1 O/ e& @; m$ |
}
4 J1 ]' R. b* h  Y4 U3 u) Z+ @: radio_button {
! @  u- D- R" M* i/ {label = "构筑物";6 z3 \9 W8 n5 f% z# T
key = "c8";
0 M2 S8 x  e' w% k/ }9 c}
3 w+ u* Y: r# Y( e' I* R  ?: radio_button {; o0 z1 @) Y( u% y
label = "其它";
3 f- U) y2 J4 {key = "c9";
0 I+ |: ~1 t7 c% f. W" u- z$ Z}
9 m1 u' A& N) {; m}
: S2 A/ O/ \- E6 N: list_box {) O/ J9 ^+ `' b4 O6 w
label = "词组内容";
5 ]/ {4 [7 C8 ~( @. D6 j) }key = "what";$ X, h  \$ X' }2 r  J: _
height = 15;& l( D) L! g2 ^( P6 E* n! N2 {4 ?/ }+ g6 T
width = 26;( S7 m1 g; e5 [7 u; V5 p
allow_accept = true; // 可双击鼠标选取
4 E! w" W9 v; Z4 ~! P}
  s) H& U! f5 K* K$ ]5 k. K/ `# D}
. R2 ^4 W0 o& D! A7 n! l" s/ zspacer_1;% q0 b% t: _6 x6 K
: edit_box {// 编辑框
( W; ~$ u" C. y) a0 P4 ilabel = "所选词组:";" ?: K9 a! H) @$ @7 o$ ^
key = "sel_ok";
5 ^) h5 X4 U* R1 b9 k}7 i% ]! u7 N/ q
spacer_1;// 增加间距" r) z7 d5 O, Y. o6 X- n: A. t3 U
ok_cancel;1 D8 c. O. Y, y3 M% o% M8 }& `; o
}
发表于 2010-12-14 09:43 | 显示全部楼层
不错,顶一个!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-13 00:44 , Processed in 0.308365 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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