找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3902|回复: 7

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

[复制链接]
发表于 2006-8-29 08:47:37 | 显示全部楼层 |阅读模式
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 0 B/ x: n/ ]; O7 ^9 W2 }0 {

一、引言

S* S6 V8 l: U6 ~3 o: m

  汉字的标注在CAD设计制图中是一个重要的部分,也是一个较为繁琐、困难的部分。目前,在AutoCAD内汉字的输入大多采用拼音方式,对拼音不熟悉的人来说汉字的输入就很困难。如果能将设计中常用的文字术语直观地显示出来供设计人员调用,将会极大地提高工作效率。本文就此进行研究,提出了一种用对话框(下图)将常用术语显示并供调用的方法,同时给出了源程序,供大家参考。该程序已应用于我院的实际生产中。

2 l, |* x [2 [" t) `

: d L5 r/ P. k' s# N" Q) W* Q* P

二、原理及方法

' a2 O7 m3 p8 s, v3 @

  AutoCAD对话框结构包含有多种构件,如edit_box(编辑框)、list_box(列表框)、radio_button(多选一按钮)等,利用这些工具,可以开发出界面友好的实用程序。

$ A6 Q1 e5 Y, C& q2 W) ^9 `: R

  左图就是用这种方法实现的。将常用词组分类,分别存于不同的文件中。根据多选一按钮中所驱动的分组号分别打开不同的文件,将文件内容读入并显示于列表框内,供设计人员使用。同时,设有一个编辑框,可将所点取的词组显示于编辑框中,便于用户对词组进行适当的修改,如删除或增加字符等。这种方法有一个优点,用户可十分方便地根据自己需要修改或添加词组内容。对话框文件及驱动程序分别见#CAL.DCL及#CAL.LSP。

- K& Y: E6 f* Q4 v5 J/ D

三、程序使用方法

& R! r7 ?6 ]9 S6 P+ |

先用WPS、EDIT等编辑程序分类建立词组库(注意,需要存成纯文本格式),每个词组占一行。程序要求将"常用术语"、"图纸名称"、"房间名称"等各分类所对应的词组库文件名分别为$TXT1.DAT、$TXT2.DAT、$TXT3.DAT厖。除第一个文件不能少外,其它文件可空缺,但当点取该分类项时,系统会提示有关文件不存在的信息。

. H( X5 g9 I! o& J/ y9 R1 o

然后将所建立的词组库文件及所提供的程序#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以后可直接从菜单中驱动该程序。

- h9 m* U+ B2 t' s) x

在COMMAND:状态下,键入#TXT后,系统弹出一个对话框,根据需要点取所需的词组类别,再从列表框内选择所需词组。所点取的词组会在编辑框[所选词组]中显示。用户可以在此对词组进行必要的修改,点取[OK]后,根据提示输入字高及起点即可把词组写到图中。

& z/ `& M( Z; b: G. d

需要说明的是,本程序中是将文字以"HZ"字型写到图中,要求字体为TXT.SHX及HZTXT.SHX。若您的软件中无这两种字体,可将其它字体改名为该两种字体(要求一个为英文字体,一个为中文字体),或将程序修改为您所具有的字体。但需要注意,也许您的字体在用于设置字型时会多一个选项,询问是否垂直书写文字,此时,可将字型设置一句改为:(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n" "n")即可。

1 F- j/ M" w# ?

本程序在AutoCAD R12.0 For DOS及For WINDOWS版上均调试通过。

- i+ D% o" Y7 @% Z

(defun c:#txt ( / oldcmd olderr ok txt_tb txt dcl_id sty fp nn ht pt txterr diag init wr_txt old_nn)

* m: N% J0 U! m! ?" D0 b

; 定义错误处理子程序

" {" S1 T) ~/ _

(defun txterr(s)

/ o" O% M2 I3 L6 |$ c6 \* o% h& P

(if (and (/= s "console break")

) t4 o3 I8 a+ b) r' x) E

(/= s "Function cancelled")

) X( U {5 C9 j. |. {6 w$ r

(/= s "quit / exit abort")

. z# ~% U* R# q. i) E

)

* v9 X J& K& D0 r0 @- D1 _/ r

(princ (strcat "\nError:" s))

; }2 d; G7 V6 j" A6 j Z

)

2 E2 f, i# D6 X, f( O. l

(if olderr (setq *error* olderr)); 恢复原系统设置

2 V O; a8 F! s1 ], r/ S; O

(if oldcmd (setvar "cmdecho" oldcmd))

1 [$ R8 e$ h- J$ L4 I% U

(princ)

; R$ i( E' G: v1 z8 K

)

2 ^- Y8 Z6 l! S

; 对话框显示及驱动程序

# ?. @4 T. C" j w0 T

(defun diag ( / i)

( L% z% \# j4 o. h% ^9 {

(if (> (setq dcl_id (load_dialog "#txt")) 0);加载对话框文件

) u% F6 |2 F3 T

(progn

' [0 k9 A4 }( l$ {" l) i

(if (new_dialog "filetext" dcl [JX*6]id); 显示对话框

4 p5 R* H- `" P' d4 G0 i+ i

(progn start_list "what");将词组显示到列表框内

+ M% Q7 h5 l6 _' ?$ q8 P

(mapcar 'add_list txt_tb

# X$ i4 g" e& [1 Y

)

% h( X! S% X" e! ]; b

(end_list)

e$ c( e4 {" B

(setq i 1)

5 p% Z$ ?2 C* h

(repeat nn;点取词组分类项后的操作

, D' p$ y7 h4 ]) g4 `

(action_tile (strcat "c" (itoa i)) "(wr_txt)")

9 H1 B1 [5 y( h$ V. \: L

(setq i (1+ i))

! }: t7 d' P3 R; I( q

)

; n- O; J$ g% Z

(action_tile "what" "(setq i (atoi $value));选中词组

$ x( U6 U: Q; n6 O9 F- Z. I' ]

(setq txt (nth i txt_tb))(set_tile \"sel_ok\" txt)"

, }. O8 r/ V8 O; p) k

)

5 a0 w' b: _# u8 p

(action_tile "sel_ok" "(setq txt $value)")

: l- m7 I4 @0 Q

(action_tile "accept" "(setq ok T)(done_dialog 1)(unload_dialog dcl_id)")

; W! ^ T- ^5 P k

(action_tile "cancel" "(unload_dialog dcl_id)")

/ E2 X* z) f/ V$ G! D. }5 a$ D

(start_dialog)

7 ]1 s# ~% z n0 K' Y/ @

)

1 ~3 L! M' N2 T

(prompt "\n无法显示对话框FILETEXT! 请检查对话框内容!")

' `: ~; K* r4 [4 y% y; c

)

* v4 s9 z( w6 _

)

* f- A, m8 c0 d) C+ b" P

(prompt "\n无法加载对话框文件#TXT.DCL! 请检查文件是否存在及路径是否正确!")

6 `. N) G D5 n0 ?

)

+ x0 ?4 [: N: s

)

' z& n! U) J0 f- v: a

; 初始化程序, 把第1个分组项中的词组读入表txt_tb中

, I3 x h+ `- J: Q! I; s

(defun init( / fname fp txt1)

5 @5 r4 o! M. x1 v

(setq fname (findfile "$txt1.dat"))

+ t; L9 Y: A, \% r; }

(if (not fname)

+ n7 s+ R: l3 I2 ?* X

(progn (princ "\n文件 $TXT1.DAT 不存在 !") (exit)) ; 文件不存在, 则退出

# @1 t) M0 A8 x$ F

)

- ^0 \6 b; v' S/ G

(setq fp (open fname "r"))

* C! J2 |8 u( `) G) I* j- `" _1 f# j0 ^

(setq txt_tb '())

, \( D% g N# y1 N, y4 U) d: c/ P7 v

(while (setq txt1 (read_line fp))

b& I+ M2 X7 ^+ w( z

(setq txt_tb (cons txt1 txt_tb))

- i' b! p6 @4 h' g& T

)

. V3 z0 }9 x% N5 A4 m

(close fp)

9 |: L9 U- v& [4 a9 u0 e* R& w+ F

(setq txt_tb (reverse txt_tb))

7 S) f* b$ x6 h

(setq old_nn 1);记录索引号

1 e9 d' ^3 I2 \/ d( I

)

- g, w; T: H/ u/ R! ^) t/ L

; 更换列表框内词组显示内容

! n3 G# h# X8 P: g

(defun wr_txt ( / fname fname1 fp txt1 i)

8 s# K4 F/ r8 u L

(setq i 1)

9 R# r) @ b+ \. }' ^

(while (<= i nn); 判别哪个词组项被点中

5 z" T; s b1 \/ ?; z8 x

(if (= (get_tile (strcat "c" (itoa i))) "1")

2 X2 E! N' E7 P# N

(setq fname1 (strcat "$txt" (itoa i) ".dat")

6 F2 {6 _. J2 ~' d) l$ c

i nn

( r0 ^7 d2 r* N( N- S ?0 G

)

5 C7 r* g2 ]+ f

)

) I6 C, ~2 \& u$ T4 |. I8 B

(setq i (1+ i))

7 K- B6 ?: v; s3 [% Q

)

0 F$ B0 L1 Y7 F, o1 ?( L( C

(if (setq fname (findfile fname1)); 查找文件是否存在

7 {. D7 M$ v, J* p' Z( \5 v$ y

(progn

; u/ A7 h2 R; h" H j0 o

(setq old_nn (atoi (substr fname1 5)));记录索引号

) j" f. Q! \ g3 [

(setq fp (open fname "r"))

( A6 [0 [0 F, X; A$ }) t

(setq txt_tb '())

0 L5 N( c( |; K2 Q/ w) n, V2 O$ A

(while (setq txt1 (read_line fp));依次读出各词组

0 R% B3 M( e9 q! e0 X

(setq txt_tb (cons txt1 txt_tb))

% J2 l# q! A" H

)

$ n) u0 J2 y& e# I M

(close fp)

6 R' ^, r4 Q1 [5 ~

(setq txt_tb (reverse txt_tb))

( t" ?0 Y6 v$ C1 f" B: x& V

(start_list "what");在列表框内显示词组内容

7 o# O8 q$ {3 b4 n) I

(mapcar 'add_list txt_tb)

8 M7 c2 w2 L# `& ~

(end_list)

3 K1 H" l5 c+ v9 ^# c" s+ _

) ; progn

; n& \6 G9 C1 G% k% q

(progn

2 J: ^2 ?* H8 a

(alert (strcat "文件" fname1 "不存在!"))

- d6 d. A, ?+ |) F/ Q0 g3 B: J

(set_tile (strcat "c" (itoa old_nn)) "1");恢复原记录号

! w T! K( s/ T+ V( J

)

: J) L" o0 g3 e0 V

) ; if

) _: s6 \5 ]) y% d" r

)

& u- E3 c" o: |: x; w$ r- {

; 主程序开始

" H; A" y: G' G9 g3 @* {

(setq olderr *error*

* _5 Z) H! F& |" m2 Z

*error* txterr

3 n: x2 V9 e8 \0 R

oldcmd (getvar "cmdecho")

# I# N1 u, y5 N

)

/ N8 T, c0 I# X- B8 y" h

(setvar "cmdecho" 0) ; 命令不回显

$ V6 ^) q% L" L; b

(setq nn 9) ; 词组分类数

" a4 R: `$ h# K( C5 m

(init) ; 初始化

' K* y" g x4 c! V$ ?

(diag) ; 驱动对话框

3 u! `% r, x, S7 c" t8 I

(if (and ok txt)

5 E4 P. [9 Q5 u

(progn

: W& R; h! ?, N

(if (or (= (setq sty (tblsearch "STYLE" "HZ")) nil); "HZ"字型是否存在

( w) H2 C5 {9 F& P$ N! ?+ F

(/= (cdr (assoc 40 sty)) 0) ; 字高是否为定值

3 o- B# H8 T; h8 s% j7 V: f

(/=(getvar "TEXTSTYLE") "HZ"); 当前字型是否为"HZ"

6 D1 D! E8 C9 n4 t4 w) C& Z4 i% c

)

s |. @' |! u) Z

(command "STYLE" "HZ" "txt,hztxt" 0 0.7 0 "n" "n") ; 设置"HZ"字型

8 _: |+ J1 C, T! F; ~$ r

)

! Y' @6 t6 u! c: f! L

(initget (+ 2 4));下面的输入值要求大于0

4 R0 C n5 i8 Q, F

(setq ht (getreal "\n请输入字高<500>:"))

/ i( Z! C0 K" E/ B% |" g

(if (not ht) (setq ht 500))

A l* ?3 h* w; U3 c. K$ x

(setq pt (getpoint "\n请点取文字起点:"))

) R6 h- z; y9 }( W

(command "text" pt ht 0 txt)

0 M n. B* X/ W8 @/ ~

)

6 Y! j$ b x% ~5 j x8 ?

)

" D9 z' p: [ P9 R& F5 A) |

(setq *error* olderr);恢复原设置

- Z3 p' Y0 F# Z6 @; I$ o& y+ V, E

(setvar "cmdecho" oldcmd)

: \, A, X' @9 F7 i' H6 M; G

(princ)

' B& S4 y. y& j! d* ?2 _- J

)

4 a' r0 n! {. u z2 D! W$ X8 u% j$ j

// #txt.dcl

2 ^- T1 g0 J$ T3 e% h

// 供#txt.lsp调用

$ ` x; K; B- U5 N

filetext : dialog { // 对话框名称

9 l- z& N' j. H* S- H k

label = "常用词组"; // 对话框标识

+ V" l4 S4 P, x7 [" U1 L

: row {

( I9 O0 i3 _4 Y# y

: boxed_column {

$ n8 F/ t9 F! a+ E8 v

label = " 索 引 ";

& \6 O' m0 F' w& d2 ?

: radio_button {

9 k3 \4 K( Q0 F% L8 _9 |/ P0 G: P

label = "常用术语"; // 多选一按钮

2 S( O, W) r* ?

key = "c1";

2 |' |* e5 v ~4 W4 j

value = "1"; // 初始值为"1", 表示选中

' F& }$ ^" C |* @% b

}

+ O- A1 t" F# Y; r# x- ^

: radio_button {

6 Y. |# v8 L9 l, ]) L8 Q

label = "图纸名称";

. z! p% B$ a9 ^2 f

key = "c2";

& ~3 s; [6 e8 j, k7 r

}

% B+ n6 B/ r% g2 I2 ^; i- [7 k R7 U

: radio_button {

* o2 m; k% a0 c* Z; p

label = "房间名称";

7 Y( }1 W7 V" |5 k6 r: u

key = "c3";

3 A9 _6 s f+ W6 Z3 ~

}

* e& J' w8 R; N5 s% e; E. z

: radio_button {

+ k; X' \) S2 c$ {% \

label = "卫生器具";

m. U" P( d8 g5 h

key = "c4";

% p- u- `5 D4 _- Q' i

}

2 Z1 d1 U, X" f. [

: radio_button {

' W6 b5 V4 x6 @$ n$ W/ P, v

label = "管材配件";

3 k0 ?0 q7 [' l

key = "c5";

! o. y$ [" R; ~. y' I

}

1 Y! I& J6 ^( G

: radio_button {

& ]: s: d4 P0 s- m) s

label = "器材仪表";

, Q7 Q# ~( B3 }

key = "c6";

+ W! i, s9 C4 t" T0 u8 E. ~

}

# T- ?7 Z+ y) q* J* m

: radio_button {

+ b9 h% H+ R& r

label = "常用设备";

1 r5 P+ P- e( D' W- X

key = "c7";

2 W( x, t# ~/ {

}

* S% J7 Y5 O! U/ e. v& a

: radio_button {

4 ]8 o2 L7 r% U8 I

label = "构筑物";

, h- c# I! V. T: M

key = "c8";

, u0 ] T+ [9 C, w# S9 U

}

' D0 P% f' r( B

: radio_button {

/ w O6 {: K' D; N6 G( D

label = "其它";

5 v: t; A4 A* h3 K5 |

key = "c9";

9 l9 }; E4 j$ d0 ~3 ], f

}

- g C) \9 \# c( s* b9 X3 J

}

$ f' l' q$ q) z* k

: list_box {

7 a2 N, |7 J( y: y+ G

label = "词组内容";

) } ~6 U7 p; V& V8 g, \- K/ o

key = "what";

6 J( ~0 Q% j# ]+ i, p/ i

height = 15;

& F V- Q, K. r' ^" C% }

width = 26;

+ x1 q, m' ]/ h

allow_accept = true; // 可双击鼠标选取

4 B- C% y1 y8 C) C% m- ~3 y5 X

}

+ y0 k6 |+ L( r9 x$ ]/ f& ~, V" u

}

0 l7 i" P& {1 {+ `

spacer_1;

7 ^+ u0 z" Q# Z Z8 [) ~3 b _

: edit_box {// 编辑框

1 F X; T# Q" |2 V4 }4 g, O) T# C

label = "所选词组:";

7 z. b2 A% P }8 M4 ]4 U, [2 p, d

key = "sel_ok";

& ^ ]# D+ Q4 G1 Z

}

4 y6 }* P# P1 w' D2 Q" ?" l

spacer_1;// 增加间距

6 D e: i) B$ r1 i; b

ok_cancel;

$ a; |' @2 H8 a2 o) N! T8 V5 s' k

}

回复

使用道具 举报

发表于 2010-1-22 11:01:09 | 显示全部楼层
就是啊,有点过于专业了,能不能浅显易懂的讲解一下,谢谢
发表于 2010-8-3 19:09:08 | 显示全部楼层
有点过于专业了,能不能浅显易懂的讲解一下
发表于 2010-9-29 10:44:49 | 显示全部楼层
程序设计专用词汇。使用者不用看
发表于 2010-9-29 20:33:09 | 显示全部楼层
这个不太懂,如果解决完,可以共同探讨一下吗?
发表于 2010-9-29 20:59:32 | 显示全部楼层
不太懂啊·············
发表于 2010-10-17 23:45:11 | 显示全部楼层
有对话框,挺高级的,不过这是机械社区,楼主是搞建筑滴
发表于 2012-5-30 11:12:57 | 显示全部楼层
这个很专业啊。。。。谢谢!
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-7-12 17:41 , Processed in 0.070713 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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