青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2010-12-14 09:22 | 显示全部楼层 |阅读模式
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。
* Q& O' @9 N0 A4 A% l+ z一、引言
7 Q' U" H1 a8 R  汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。
& M4 _7 q1 r3 e. |; F9 e二、原理及方法
, D( P  s4 J& R* H1 g0 }8 W( ^  AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。0 l+ d, B, M: `$ {8 n8 p
  左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。, h) `2 @- p& r; D5 o4 e
三、程序使用方法
3 ?$ e* u/ p# u) G先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。8 M4 j0 f  E4 g
然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。
" G7 H0 R0 p8 ~: y: c5 T在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。/ ~) I9 W4 [' P9 y# O! q# D
需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。- g5 j' l- r, g: \. V$ S* A% v* y
本程序在AutoCAD R12.0 FOR DOS及FOR WINDOWS版上均调试通过。 0 q5 u) t# J% R) T$ x7 B6 U# m6 X
(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn) 8 D/ Q$ [( y$ q1 Y3 b- r
; 定义错误处理子程序
6 _# h7 T. `2 c  z/ m(defun txterr(s); f& V# N- j& w, Z9 P
(if (and (/= s "console break")
$ W8 E$ @1 j" R7 k; B: ^7 J(/= s "Function cancelled")0 G) `+ C( q, M  c' M
(/= s "quit / exit abort") $ Y7 `2 c  ~* G/ Q7 }6 M4 D9 V' H
)
- W1 Q* r2 |8 y9 K; s2 Y5 E(princ (strcat "\nError:" s))
6 [7 e- m- {2 P5 |, W2 U); ~+ n& j9 s3 D2 B% Y
(if olderr (setq *error* olderr)); 恢复原系统设置# B& X, u2 Q0 K" `
(if oldcmd (setvar "cmdecho" oldcmd))
0 q# q8 w$ K' i(princ)
' c& o' u# @0 t)
* m9 o( o  w" F# @1 \' m3 B; 对话框显示及驱动程序
8 a% m" w; r5 U2 B/ L7 g! `7 r2 s(defun diag ( / i)
2 i3 [" C) [1 Z6 m+ a8 \(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件4 i0 p# j5 b8 W/ ^+ {% R
(progn, s6 _7 Z' x4 ~. Z) m& d/ R7 `6 q
(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框3 v+ t& h; J0 F1 i+ v
(progn start_list "what");将词组显示到列表框内
0 G; N- \, C& O1 ^! M(mapcar 'add_list txt_tb
1 I1 e9 N# K5 D! `  g. }, d6 L)
# T# ~0 W' `$ g# n/ [) X(end_list)
1 a1 ?1 o) l* {+ U! Z7 Q) A(setq i 1)4 ~2 H9 i6 W3 i+ ^
(repeat nn;点取词组分类项后的操作
3 a- U: P" D( s+ ]! @(action_tile (strcat "c" (itoa i)) "(wr_txt)")+ J. ^" h3 }! L4 `4 z
(setq i (1+ i))
( X: T8 a8 h1 a- T$ X! V( X)+ x8 s3 S3 M) f3 }6 C& g
(action_tile "what" "(setq i (atoi $value));选中词组
- [1 w. J0 M: a  S* W+ o: h(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"+ U; ]2 r  s. C
)9 y$ s# H+ g' P" W2 h
(action_tile "sel_ok" "(setq txt $value)")6 |3 p, C1 m7 y
(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")
' x- O2 R( f- I, v(action_tile "cancel" "(unload_dialog dcl_id)")
; w) A% j  Q" ](start_dialog)
5 h( n0 c! P; p0 f)# G+ c% \, z- u& _0 ?: p
(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")
# r# C/ }+ p  ~& C: h) P)4 m1 u* U; ^" ^5 z
)
4 p0 w. \+ `8 _7 f* s9 Y% o(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")' A  z3 m5 u/ ?
)8 _$ {! _% p; d1 \# E* f
)3 C* e# I' T2 z9 h
; 初始化程序, 把第1个分组项中的词组读入表txt_tb中5 B5 ]% U1 N$ K) {9 Q1 v
(defun init( / fname fp txt1)
' o! u0 ]5 v/ ~$ e2 ?; P* \2 ~- J$ L(setq fname (findfile "$txt1.dat"))
' ~3 }! c  r4 |8 C  n# u(if (not fname): W7 ]! ?$ h2 t  i% e( H
(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出" M" f/ z$ s" t  P4 M7 \' q
)- Y6 T& \2 F* U3 j
(setq fp (open fname "r"))2 M" y9 s: A! r7 b0 P2 N/ H
(setq txt_tb '())
9 {, [. [% U9 k: I0 N(while (setq txt1 (read_line fp))
" \' [# u& x' C: a) w0 p0 [(setq txt_tb (cons txt1 txt_tb))
( m. Q$ ]- Q. f' E5 R1 R! K)
' Q% i* c# p- L4 z6 T(close fp)
4 m  [2 X+ l8 ?2 a(setq txt_tb (reverse txt_tb))
/ _( T: K: @  @  ^$ D(setq old_nn 1);记录索引号
! K% ]6 c- l1 x. Y. U; Z& v- g)7 ^3 e( ]- \- y% s4 Y/ j% u) p/ i
; 更换列表框内词组显示内容4 }0 ~( _  [3 H+ T( _
(defun wr_txt ( / fname fname1 fp txt1 i)
1 y, b( y: M4 a/ n(setq i 1)
  Z! x8 e+ i7 K# e' S(while (<= i nn); 判别哪个词组项被点中6 H+ w/ G# Q: Q3 i0 \" n$ _
(if (= (get_tile (strcat "c" (itoa i))) "1")
# J, x" z2 f4 z! r7 U) a(setq fname1 (strcat "$txt" (itoa i) ".dat")
% j) u0 q. c& \i nn
3 Z, A! Z" `1 Y  q: C6 a# l)
) W) R+ |; |- z9 `& Z+ @' K' d1 B)$ V+ t1 k2 `& j9 E- [
(setq i (1+ i))
, B# x6 n; Y1 E$ I  r)
, q! O3 y! e; w* Y% z(if (setq fname (findfile fname1)); 查找文件是否存在
! d$ r* ?" S' W. I4 o(progn
. P4 v# B3 C  u* l3 \% E(setq old_nn (atoi (substr fname1 5)));记录索引号$ x$ _& W  ]# d: R
(setq fp (open fname "r")); K8 L4 M2 a$ u8 p- y) [
(setq txt_tb '())! |( N1 y! ~: d/ w, C2 x7 M& q
(while (setq txt1 (read_line fp));依次读出各词组( @3 W3 N9 n6 t4 N
(setq txt_tb (cons txt1 txt_tb))& Y! ~- w0 _$ r" t
): ]$ ?9 `3 ?+ W1 [1 X
(close fp)' v& k4 T0 F1 b) b* ?& t
(setq txt_tb (reverse txt_tb))! N! D) z5 [) D/ W5 t* r& D
(start_list "what");在列表框内显示词组内容$ l, r% e9 _7 t6 n
(mapcar 'add_list txt_tb)- }- K# T3 E: l9 K, A9 ?6 `% M
(end_list)
$ L: G- x' Q8 T! q) ; progn0 P( e, t  ?0 o
(progn0 |$ {$ m! H' b9 e; V, b' G
(alert (strcat "文件" fname1 "不存在!"))! B2 B! L7 p2 b' e1 t. {7 X, p$ d- C
(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号8 j* m! y8 l4 W" f! D7 K, S
)
" V. [; a) U* F" g) ; if
1 E1 F: t" p' c( p6 M6 V3 x2 o). w9 W2 W* ^& O7 r( B) w
; 主程序开始
4 n7 k3 D) @8 \(setq olderr *error*
  l* \- E* Y4 V, [7 Y4 ~*error* txterr
  L, v1 I9 Y! D0 B% u3 l' Holdcmd (getvar "cmdecho")
/ W' r- W  V8 O) V+ x" d)
% A* P2 u4 D* R  U" R0 k(setvar "cmdecho" 0) ; 命令不回显
6 u. w/ R/ z3 r(setq nn 9) ; 词组分类数
% |! \3 O4 @& c5 K8 S% I(init) ; 初始化& r$ T/ U8 u& c; M
(diag) ; 驱动对话框/ [4 U  t) I1 z
(if (and ok txt)
4 V1 N+ t) G- t2 c* N9 j* B7 o7 T(progn! K' Z) K; U$ R! s9 Z' ?2 R* K
(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在4 n/ I4 h4 ]. X6 C( c2 \, @( F
(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值( h  _- S9 X# n. r) J$ m
(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"
% q" h- s$ t6 Z)' ^; N' m3 o% Y! s5 X% Z1 m  R( s- A
(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型9 e( o, J, v+ x- u5 d0 [
)
! F+ {* Y, Y1 U# s(initget (+ 2 4));下面的输入值要求大于0
, i3 Y4 R4 V( m+ Z" @(setq ht (getreal "\n请输入字高<500>:"))) H* ~4 R  j, ^5 q1 z
(if (not ht) (setq ht 500))# t6 n0 b( S8 N% H
(setq pt (getpoint "\n请点取文字起点:"))
+ Y+ k: ^; O; ^$ B1 h# P; S(command "text" pt ht 0 txt)
6 f8 p: n/ [2 E# k3 m6 Y5 K- R)) c! I2 m/ B9 n/ q) |
)
) N% `: y( A1 _- n(setq *error* olderr);恢复原设置
, }7 Y% a2 Y- k) Q(setvar "cmdecho" oldcmd)
+ R) u$ K! ~: C; B) ?7 E(princ)
1 _0 Z3 K; T: u3 I2 g) I4 l9 n): _. U5 a6 T8 e5 |  D/ x
// #txt.dcl 2 X+ A# k5 ?! e9 \8 H9 S. O
// 供#txt.lsp调用
# j; d3 z/ K3 ?& `" Gfiletext : dialog { // 对话框名称6 p. Q6 e7 H& K1 T2 T4 w
label = "常用词组"; // 对话框标识: m3 L9 O. n9 e
: row {5 S* f+ n! z/ `
: boxed_column {$ J4 R1 F8 p. E
label = " 索 引 ";, ^! ]! M: O0 J( g& l9 z; T
: radio_button {
/ m! u" ?! t3 A) tlabel = "常用术语"; // 多选一按钮
& b/ Z$ L6 M' i, K* Y! Dkey = "c1";
8 Q( q1 f7 M/ @value = "1"; // 初始值为"1", 表示选中8 W) T. K" t) N7 n/ n3 k
}- o  a3 ?* c! {6 L+ b
: radio_button {
7 j& P4 }  C7 E" ^0 j1 `label = "图纸名称";
7 ]7 D- `1 a( Y4 Q. r+ G$ B" f. M! ckey = "c2";
$ Z7 Y9 X; K0 E% \% I7 W/ J}$ n, z! O. A( Z7 X! }
: radio_button {
7 m. o9 d# M$ P5 Zlabel = "房间名称";# a( w& q" {3 H* m: }
key = "c3";
8 A$ z/ `. d2 V& x5 S}
) l: M; D  ^  X- j" N4 j4 R1 R: radio_button {1 F/ u& U0 }4 a  f3 C
label = "卫生器具";# I$ G; X) |# b( M2 ^5 U+ F2 e
key = "c4";
) f' J: Y# \1 n! u}
# r" a! P* D# K/ B; x: radio_button {
, y% O  E; w/ Z+ Q% z, F. r" olabel = "管材配件";( h7 y! D  d% E. a' A
key = "c5";
( L$ Q5 q  j/ a: \+ J& z( g: ^. Q}
& x; E+ d$ W, E- F4 G3 o* a+ J1 S: radio_button {
0 w- _! h4 n( N* e3 xlabel = "器材仪表";
$ D  G  C& K, a  e- d: U* c  {) Ckey = "c6";- r7 J* y& T; m. |( @0 |4 M
}
7 T9 ~1 ~9 c6 a" B7 F3 a4 c: radio_button {
& ?( v3 v+ z. j& ^6 i, ]label = "常用设备";2 d8 l9 G* q5 i0 m; s/ x2 h
key = "c7";
" N% O/ n- e7 a4 H( k}
2 h" g+ e/ s# r* d: radio_button {  F, s; D9 n! v) |. t8 d
label = "构筑物";. _# h. V( O. {8 R8 N" Y
key = "c8";& E" B& b/ |8 |/ F1 r( [
}
. ^; _) d( C& `% E: radio_button {2 g+ Y3 H7 }4 u& Q, h1 t7 h; b+ `; P
label = "其它";
9 n# A/ O% |2 z3 `5 W% zkey = "c9";2 p7 T. w, {1 S7 d4 d
}1 L4 E6 D+ t8 {+ E6 E( r; A
}
+ z, x  j  k6 b. j: list_box {
. e. I$ P2 \& a% _: ~& Vlabel = "词组内容";5 p8 o5 |, Q6 `
key = "what";
' X; {5 [$ r* W) U$ r& bheight = 15;5 a1 p2 R( I" Q5 S+ C) G- @
width = 26;
0 j. I* F# N' W' v- l8 l) Wallow_accept = true; // 可双击鼠标选取
2 @8 j% C  i/ p' e/ K9 U}
1 q/ o9 `5 R7 [* i" w6 \$ R}7 {8 M0 N7 `  r0 G1 D/ _8 W
spacer_1;2 u0 l6 R6 T' ?6 h7 I9 e% P
: edit_box {// 编辑框
$ c0 {7 T) `' dlabel = "所选词组:";0 ^6 ^4 ~1 J6 t4 @$ m8 S! V
key = "sel_ok";
! l* R2 r. i% E  D0 G}* O4 m) {4 {6 R/ e, ~
spacer_1;// 增加间距
9 Z* ~2 L; p. `2 hok_cancel;
2 ~9 w3 [' C5 u' a  ~}
发表于 2010-12-14 09:43 | 显示全部楼层
不错,顶一个!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-30 04:16 , Processed in 0.191043 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

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