青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2010-12-14 09:22 | 显示全部楼层 |阅读模式
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
! G" |0 l/ t0 M一、引言 7 ?, y) h' A: W$ }0 U
  汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。4 u; ^8 I1 n4 X2 R
二、原理及方法
% {$ f1 _- S5 r- u  AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。
7 B" t2 S5 c  q  左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。( D* q- @& y- k' X" O9 F+ v6 s' ]
三、程序使用方法
  s( h: z) H0 V先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。4 K* i' f8 l- m# j1 D
然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。) V% m. n; }$ Z) J) w  {$ V" b+ q
在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。. t; Q$ \" B1 q8 g
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。
$ E/ F! v% L: F( x8 B! q  d本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。   {3 H% U7 b9 W- ]* S0 a% U
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) 2 E: n" d% |$ p
; 定义错误处理子程序
7 E+ b# t/ r( N* \9 ?9 G(defun txterr(s)
" {3 n; v7 ^  r( C9 s' t6 L7 U(if (and (/= s "console break"): f0 r8 d$ q6 \" a8 _" N( w
(/= s "Function cancelled")
6 F, P4 j1 e- |9 p' r( V(/= s "quit / exit abort")
+ y: N/ G  t, v1 s- c2 l; V)' k  g1 W: e0 d/ B6 W4 c3 ?$ Y
(princ (strcat "\nError:" s))4 Q( i/ C1 M6 a  p
). ^# {& r4 w9 B4 M* r
(if olderr (setq *error* olderr)); 恢复原系统设置
, h* O3 {6 p) W( i5 c1 M(if oldcmd (setvar "cmdecho" oldcmd)), v. M8 S0 h7 b, ~+ L3 T
(princ)8 z5 ]' \9 X4 a5 [/ `; C
)
; ~8 M1 o- d0 n6 |; 对话框显示及驱动程序
+ n' c( Y# D8 ?3 V/ r(defun diag ( / i)
# N  ]6 K7 z* D# B+ A% A; |0 N! a(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件7 j2 R) l* h0 C' b
(progn6 v6 |, q) p6 f0 V
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框& A. l  R# F, Z( t. W
(progn start_list "what");将词组显示到列表框内8 A: `) f/ S, w
(mapcar 'add_list txt_tb3 h3 g) D! p# _+ B) z& Q4 G: o
)3 ]& u" d- o( v+ q; e' B! j" E
(end_list). q5 k  e: v$ D( d8 n
(setq i 1): |2 u0 X: t) c% w. e; s
(repeat nn;点取词组分类项后的操作
4 w! G! @2 f$ d) H(action_tile (strcat "c" (itoa i)) "(wr_txt)")
, ?& d9 r- ^& p5 A* W(setq i (1+ i))
# O6 z4 W" ^  x)
6 r+ A' K- T; U, U; t8 A) @  l$ T(action_tile "what" "(setq i (atoi $value));选中词组. F& R* Y+ p; E2 I/ G
(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"
- F& K, O: T- X% X" L)5 F+ X7 J* j! Z8 |8 o) y4 {: s) M" }
(action_tile "sel_ok" "(setq txt $value)")
) Y! t% i2 J$ u2 j0 x1 f  z  h(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")9 u, c& R4 Q. _- ?: R$ c6 f
(action_tile "cancel" "(unload_dialog dcl_id)")
1 q. u8 }6 u$ \+ V: U+ k(start_dialog)
/ \; ^/ ~" ]/ C9 [6 Q) @& u)7 Y5 h4 G8 z$ W% k
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
1 z) c0 {2 A1 k* s)( l8 A; N# _4 h* \3 z2 D
)# _% ^7 P) Z9 S; |
(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")
% D$ Z" [+ I& |$ C" c)0 f( h2 s  o; d3 I+ p
)$ O& j" r- K( }" q
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中8 |( e( A7 K/ K6 s) g6 l" S
(defun init( / fname fp txt1)
. z3 y1 M' u2 I* N  }- B+ @6 |$ d5 S: D(setq fname (findfile "$txt1.dat"))
) R* t  L$ @. z; l) _* n(if (not fname)
( |2 t- z2 J& w7 c* c(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出
% T! h8 O8 E6 ]5 W7 Z6 c" C; s2 x)8 M5 ]1 R% z" j2 v4 @7 a4 Q9 |
(setq fp (open fname "r")); R# T3 y3 h& C& l2 H$ Z) l8 k
(setq txt_tb '())
) `- g& k" r, D2 n+ u(while (setq txt1 (read_line fp))
; U. L3 o: Q  q1 `1 R$ t5 e5 w% ~(setq txt_tb (cons txt1 txt_tb))7 K. \2 [8 c/ z+ R4 `1 U7 _; b) \0 q
)1 @% j$ s: m; T
(close fp)
9 |4 b" Q4 s& [4 _/ s' @6 [% |; h(setq txt_tb (reverse txt_tb))& I- M. P/ D! `
(setq old_nn 1);记录索引号
% A) c) g; B; B6 z)
; H5 |+ y, i# }" }; |; 更换列表框内词组显示内容
0 h! H6 V1 ^( }7 n6 ^* l8 ^& T" u; [(defun wr_txt ( / fname fname1 fp txt1 i)
1 g9 P, o- k% \& n" k# b(setq i 1)
; z! D( E  ]) J. A1 m* h) t(while (<= i nn); 判别哪个词组项被点中) f* n; b4 g; a. P
(if (= (get_tile (strcat "c" (itoa i))) "1")6 B0 H' V$ [* f) L! r
(setq fname1 (strcat "$txt" (itoa i) ".dat")" y, ~) O' c4 u2 ?- ^
i nn# i! t; \7 i$ X: ^- H- M
)
( B% x( b' ~4 X( L2 w4 u+ E$ V- h)
5 n  V$ Z5 ]; _+ _( O  `* Q" z(setq i (1+ i))
# u0 _9 ]2 r5 w8 O7 u)
% ^1 ]0 i, [+ l3 m( W3 J+ q9 g# z* U(if (setq fname (findfile fname1)); 查找文件是否存在4 f) Q  v7 `6 C$ Y
(progn
& i* T3 q1 `/ x+ L* l  W(setq old_nn (atoi (substr fname1 5)));记录索引号
: U! r( }8 ^  g) D(setq fp (open fname "r"))7 W1 N. R3 U9 M& k& ^! c4 s
(setq txt_tb '())
; N0 S. z: ^& c(while (setq txt1 (read_line fp));依次读出各词组  H, @8 g& g, u6 u( k
(setq txt_tb (cons txt1 txt_tb))  R3 p" Z" P, \  y4 Z- p& x
), }3 P5 i  N1 s8 U6 I! h/ D& I; C
(close fp)
& f) ~( d: K/ u& ?! b  j( c! H4 v(setq txt_tb (reverse txt_tb))
4 Y$ x% M' c+ w8 d(start_list "what");在列表框内显示词组内容, A: m4 h' N1 v) r: l7 e- h- P- u
(mapcar 'add_list txt_tb)3 t! _3 ^1 Z! `3 j  ]
(end_list)2 w! K$ L7 i, ~
) ; progn
$ [4 J$ q7 y. t& F$ m, o, @(progn) R/ A! ^0 r( X8 h' [( q
(alert (strcat "文件" fname1 "不存在!"))
+ {2 w$ K# i( t6 c( K2 `(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号
1 z) _2 h5 V" s6 |8 z0 e)7 Z7 Z& r% n" a( |0 x
) ; if, y  U. K& Z: A
)/ M6 S2 L3 ~/ B. M8 I7 B
; 主程序开始) M7 T. L2 \* y
(setq olderr *error*
8 o1 m# ~( C2 x3 I*error* txterr( L- z' v4 u6 e; C/ x- \% I, a
oldcmd (getvar "cmdecho")
& [5 Z0 {/ j6 r7 P  B6 f); o0 v& _! m3 i1 p" @
(setvar "cmdecho" 0) ; 命令不回显
$ P8 H5 r+ w9 Q9 W! W4 ^+ \(setq nn 9) ; 词组分类数  X' B3 Q# D: w; E2 A5 P9 H6 y! ^% X
(init) ; 初始化5 A2 Z. Q) W" r" z3 L, b
(diag) ; 驱动对话框- V& j# E8 A; ~: \" s
(if (and ok txt)) |# V2 N1 r! N8 u$ y
(progn8 z2 t1 t/ q9 E8 k: S) R. H3 L
(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在
$ l, K2 Y  i; B! ~8 C5 `7 n( S5 Q(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值! r2 a' b2 ^; L. ^8 N8 ]/ `8 c
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"
0 ?) G# \" c7 G$ b1 ~' Y6 f8 y)! H" a2 |1 u, R. H. Z% y
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型
  W8 f7 J4 F# E" `6 \1 w$ m)# F' V( N" g' Q+ ~! H5 p
(initget (+ 2 4));下面的输入值要求大于0
! r& W% @7 d  {( D- ~(setq ht (getreal "\n请输入字高<500>:"))
9 e' O3 J# ~2 r$ ~- J(if (not ht) (setq ht 500))
1 W# E$ I! {) l7 M(setq pt (getpoint "\n请点取文字起点:"))- c3 p4 f5 s$ s' t1 Z/ r) j( A2 {* N
(command "text" pt ht 0 txt)
- }6 E7 O2 }! S6 ?; [6 t! p)! K  z0 S% L( O: q% ^
)
9 J- E! P: L4 Q) q  D, i(setq *error* olderr);恢复原设置
7 h% R& h) R+ B9 v. u% v' ^8 o1 i(setvar "cmdecho" oldcmd)$ E8 _& \0 T* c) E
(princ)
+ S: H3 u0 r8 x; p, p* H)6 h8 a  {9 p" a# G
// #txt.dcl : \; t# _% E$ B
// 供#txt.lsp调用7 Q* u* A7 [* H3 ~
filetext : dialog { // 对话框名称0 o0 P" J  V- e0 h$ B% S+ B
label = "常用词组"; // 对话框标识
( P9 ]) @; v! ?4 S, N, y: row {
1 }, S2 n" }8 W) m7 Y: boxed_column {
5 y; n1 ?. @& E- a4 B+ @# f+ [+ Alabel = " 索 引 ";9 B8 x5 g' ]) `4 O! d$ ]
: radio_button {
$ n  \. Y+ ?" G9 T. t. Ylabel = "常用术语"; // 多选一按钮8 s# `6 Z2 V! l( J. z
key = "c1";9 D) F- t/ m# O" A
value = "1"; // 初始值为"1", 表示选中
* s; @1 a4 K' O" k( o& E}% h3 W) U" q. u) ?: L8 e5 v
: radio_button {
: d" Z/ X; K% u1 {7 plabel = "图纸名称";
7 w1 b; b& q* l  D4 l0 s, ykey = "c2";& j: d) L8 `& K5 R6 ]: J
}
; X( C7 b8 {6 J8 `! w- H" y! \! r: radio_button {
0 v0 b. o6 x* D. n- V, S* T1 [+ B1 Slabel = "房间名称";& N& K3 `& l6 x" k% j1 u6 f5 f4 _( N
key = "c3";8 t) J2 M, `/ |* |' i0 N; h' M! w( m
}
# T( a6 w# l5 b& M$ t: radio_button {6 S  \7 c1 G% A2 B
label = "卫生器具";
4 _. u; k- q, F; J  @* c/ ukey = "c4";
1 G* [; {5 {! w$ o; I0 |' B: d}& G- z! N  q& p% l
: radio_button {
, u; B% m: r) j2 N/ G2 Nlabel = "管材配件";  ~& x5 b, R, y2 q) \2 l. S
key = "c5";
& e* M+ ^; D! j}
) R" K& j- P! y( T) a: radio_button {
" W& j5 C, w0 t- a, Llabel = "器材仪表";
3 d- k3 M2 m( e5 |: y* Jkey = "c6";3 Q; k% ~+ g; B5 Y2 C
}+ L9 {, l$ N, D  e  ]  P
: radio_button {% r, o; D7 f% [3 I
label = "常用设备";$ w6 o: o: i/ k: d: O9 T' c
key = "c7";# W  f5 m+ j8 ?! A! |2 x
}4 c' s6 I3 I# G7 y
: radio_button {5 W+ j$ u0 r1 O6 D
label = "构筑物";* _6 m) G- o) H4 T; P2 J: \
key = "c8";4 k6 J% x5 k2 \' i
}
  _: p/ {5 R0 \1 t: Z: radio_button {
  X. h9 u* ~5 [1 g. a8 i" Llabel = "其它";
& ?' Z+ g# v7 J8 n7 Bkey = "c9";
5 U6 z8 L* k$ o; i  U1 g" `}, k# I9 [8 M+ ~. l7 |1 ~$ `0 x% E
}7 P7 U: x4 z$ c: s5 k3 f
: list_box {
7 q! M$ Z. X- @( v) p0 g* k1 ]" \label = "词组内容";
% S# C4 [. m( k3 ?key = "what";
/ y+ S# Y) W" ?* ~4 ]) Jheight = 15;$ A1 X" F5 ?7 F6 a
width = 26;" g( D( L; V0 b2 }4 _
allow_accept = true; // 可双击鼠标选取* J: h  ^$ F& ]; `6 B) x- B
}- \  p2 K7 S$ D* l; h/ b+ l, Q4 t
}
+ L( [" N! R. u, Xspacer_1;
6 G$ }+ m# \" @7 d8 T" m9 X. \: edit_box {// 编辑框
7 p8 f0 r4 J' x6 I6 s) Xlabel = "所选词组:";
% _, z; b6 A$ s7 xkey = "sel_ok";
1 a0 i: v( m$ D}
/ y$ u" }4 K4 U# B8 ?4 ~1 {% hspacer_1;// 增加间距
2 a: p% t5 k: I* M+ O" z+ g# \ok_cancel;2 ]' u' C  }- }: T$ e
}
发表于 2010-12-14 09:43 | 显示全部楼层
不错,顶一个!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-11 15:52 , Processed in 0.258948 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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