找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 4079|回复: 7

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

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

一、引言

- h- J2 y+ o }- I0 U/ R

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

! \5 i5 P; Y9 e# `& \

& ]; F; l0 Q% P* }

二、原理及方法

0 Z. K6 M; d7 S

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

' C1 x6 `( m. H7 e/ B5 G

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

2 y2 ~3 @# U) ^, v, c% a

三、程序使用方法

9 E: y ]( Z8 d% Y E

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

( D! ~5 @1 e' v: d+ Z

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

; q3 @ ~& `$ G) O" u

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

1 e- }9 E+ G3 w& m' z$ K% k

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

1 e1 D, d& ?: Z& `9 N

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

; d; X4 f( T9 g/ Y

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

( ^5 w1 i* V; e' o. s& W- K

; 定义错误处理子程序

7 F. t# a* T |1 h

(defun txterr(s)

8 z: `* }/ w. n; J! N

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

. R1 O+ K0 i/ R: o

(/= s "Function cancelled")

$ k5 W x8 F( g7 N

(/= s "quit / exit abort")

# B2 ~- U$ m# Y4 P7 d( j; L' y4 @

)

0 o9 I5 a3 x& x9 m5 w$ J% h

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

, c- ^% Z) l4 Q6 M7 x: V

)

, S I/ _, U; s: i+ B* B. e

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

% h' w- N0 c- k6 K a9 ?; k, B* Q

(if oldcmd (setvar "cmdecho" oldcmd))

3 z: a% u. {- T: Q/ _7 s6 f$ R( V1 K! Y

(princ)

6 H. n" T# d4 C( l/ C) ~4 ?

)

4 q3 i% Y6 k% X! _( f$ d

; 对话框显示及驱动程序

- ^8 S9 n+ Q4 e

(defun diag ( / i)

3 [" Y& V$ n8 H$ J/ A1 A/ D

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

4 M, O& |' s3 v4 }) |( M

(progn

% M8 S7 A3 x& i

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

# L7 l% \, d% F; V/ }1 t: Z

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

% z+ G. S; \9 e$ k% `2 z

(mapcar 'add_list txt_tb

6 g& N, r, }1 h7 E) f [% a, n

)

- v. d# A$ R5 w. V" k$ [

(end_list)

8 b2 M0 ~7 @4 }

(setq i 1)

) y. e8 S$ C L6 a- h

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

* f5 S3 U6 d, M& T8 ~

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

+ n2 G: K8 Y, M

(setq i (1+ i))

1 C+ S) C# Q T

)

- T% V. P- g8 |4 p) v2 z

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

) Z( p; ^; `( \8 ?

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

. }8 o* `' `+ y+ \3 k b

)

9 S% n4 l) I0 q" n$ J U) [

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

u: Z9 x, H% T

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

6 j- R. s7 V. l2 _! A

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

2 F) i) g' j* i- H# \* ^) ~

(start_dialog)

% v, `5 s+ T+ @+ Q! M2 o

)

- x8 k" v" c& c% b7 `. Q

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

9 E1 I/ C7 s2 L/ l/ ^

)

0 n- R4 A n0 Z1 W

)

5 P3 W& L, ^' U9 p! I. C6 v% E9 F

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

& {6 S1 f5 O& W! ^7 o- a

)

7 D6 Z6 _$ u/ y7 [+ C9 w! I

)

" q; j2 Z7 ?# W( x( E, H

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

% b2 Q, ~" G [9 @

(defun init( / fname fp txt1)

' w @5 C0 L% p/ h! `& D

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

" Y- G: C0 n: u7 w

(if (not fname)

7 P+ K+ Z6 M# o$ b+ t

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

0 C+ O0 K! C4 g- c- M

)

4 H# _; l0 w% H/ H# \

(setq fp (open fname "r"))

1 v; ?* [. }2 B# ?2 A4 ]

(setq txt_tb '())

. R# ?0 a1 d8 f- V

(while (setq txt1 (read_line fp))

! f( }0 c, f/ c

(setq txt_tb (cons txt1 txt_tb))

7 W% H. d9 Y/ [. p" B- F

)

2 z- R! q; M2 r/ x" c) d$ S! }

(close fp)

9 w2 z: d* U# V

(setq txt_tb (reverse txt_tb))

% r. l+ T* v& f& _# Z

(setq old_nn 1);记录索引号

- K2 \4 {! F9 Q. k% `9 O% E" Y

)

3 d$ h A: a( v' y1 w) X1 f5 O! m

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

/ W0 {' ]1 S% U: c

(defun wr_txt ( / fname fname1 fp txt1 i)

5 k- d% z( s0 q

(setq i 1)

6 l0 \9 f- `( k2 Q6 C

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

, }1 e$ t& Q" y: h

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

: ]; ?$ T! l# L- y2 s

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

}2 u# H1 [, I1 g

i nn

$ q' Y& G; `% v$ n+ ?# b) a

)

- u$ v: r5 u* ?

)

: U$ O6 r5 q$ `1 f

(setq i (1+ i))

1 B" @# d$ R4 y% C( w9 {, C

)

" Y) I/ u3 N" z" | _8 ?

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

2 U* k4 x! V* u+ o

(progn

% ?' i+ V& D( X' k1 I4 K

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

8 N5 M* u! o) V" _ V

(setq fp (open fname "r"))

5 {6 X! i* i% a9 D

(setq txt_tb '())

6 q8 m5 a' p' X+ ?: W( M* ^

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

* D& O2 _1 z2 D/ X- Q) _

(setq txt_tb (cons txt1 txt_tb))

! t% S W) j/ ~

)

5 U# t& ^5 E1 `4 f

(close fp)

! m2 V' e9 F6 I g, P: F1 `

(setq txt_tb (reverse txt_tb))

3 Q( a# ] {2 G1 p$ [$ U2 A" T. W# ^# d

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

6 c6 x/ M! l. M( h

(mapcar 'add_list txt_tb)

$ V) \( B6 W# ~2 f

(end_list)

2 ?' E5 o! ^9 j9 Y7 S

) ; progn

4 L) C/ g1 W: h! S; E# H0 o

(progn

6 G$ |1 E1 q; w

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

3 w' L! d9 D# A, |: e4 D7 j

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

! [" W8 Q( g7 |3 ?- C

)

% q; I( n0 t8 k/ Z" {

) ; if

. G9 L1 w+ n8 g# u' u

)

1 F: U' ?1 L8 h, G, N$ B

; 主程序开始

" n, K+ K6 F' F7 w6 K/ k

(setq olderr *error*

8 C6 y1 N4 B0 T( @

*error* txterr

) `+ c; @( s5 I

oldcmd (getvar "cmdecho")

3 ]% _& X- g7 v

)

0 t& t. L0 }' D t8 U& J3 u) I' v

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

' E. y4 [* ^' c" s& I* J

(setq nn 9) ; 词组分类数

: j: Z/ D9 z2 A8 |5 P+ N+ t8 a

(init) ; 初始化

; b3 N; ~( F. A, [

(diag) ; 驱动对话框

, O# g, v' g- ]% q- r" C

(if (and ok txt)

- I& H1 p; O, u8 C# G; T. S$ d

(progn

' Z; V" h- i' ]# w* ]7 ^* S1 R

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

2 k3 x( ^' `3 [" t- b' N

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

( }/ y7 e' y8 K/ ?$ L

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

8 p+ I% A1 Y2 X: d, V* H1 f

)

+ K$ i7 U, Z. i2 b7 X

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

/ p6 ~7 B, y3 A

)

/ a, e* P8 y" [0 [

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

! b" \9 T3 }5 ?/ j1 V J! W7 K7 Y* I5 Y. }

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

% d$ m! k7 A2 o/ U- P% S

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

3 Q! s% u4 S( _* d+ r- i

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

! l- i$ t) T0 W* D9 R w

(command "text" pt ht 0 txt)

" S$ d, G( q# q4 Y% A, [% [! W

)

3 A9 c" z( E3 w) @ z

)

4 X0 e6 \* ]& Y- B, ]# H" s, F( X

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

. r! g, S2 e' P

(setvar "cmdecho" oldcmd)

6 n6 [4 K$ I, g9 n7 `) b: G/ S

(princ)

3 K1 j$ q) P- N

)

# P& p4 V1 [# l; @7 W

// #txt.dcl

j5 N! _$ g# `: u% F. ?8 m

// 供#txt.lsp调用

, l; X3 o0 k& V) ?" c: J

filetext : dialog { // 对话框名称

. X9 F* O( e4 \$ B

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

T) m" }! e, m5 }

: row {

* ~3 Q. t* ^* c, b o1 i$ S, A

: boxed_column {

) }" l v0 m& d( S! W- K

label = " 索 引 ";

T5 n7 ]* E" T) [; z' z, _

: radio_button {

4 m- m9 T2 j+ B$ Y8 A" x) O1 J2 B

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

8 r$ V: {; D/ E7 R/ I8 I' U

key = "c1";

' r, Y6 V- N, Z3 g& O; f' \6 t

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

2 p+ k6 a! y9 @

}

4 j9 E* F" Y! N5 r

: radio_button {

: Z! Y" j9 S; f2 e) ?/ i

label = "图纸名称";

; k+ t" ?6 p( z2 o1 w

key = "c2";

- S/ G9 l) S N. v+ Z$ l

}

w+ `$ i% @9 g, m$ Q: L i

: radio_button {

3 `; N) p8 F: m/ h0 V8 ~$ o5 [6 P

label = "房间名称";

- t- |# ^) @7 ]! [( F+ ]( U

key = "c3";

@6 |9 H/ f' w# P

}

' h5 T9 n o O9 g! M; V1 U I$ G

: radio_button {

+ V( y/ g/ f, |7 a: C2 ^7 x

label = "卫生器具";

9 a4 a( e1 m( h$ ?

key = "c4";

8 n+ ^( b& D4 ]+ M

}

' y0 F) \6 e Y$ ?# j# ?

: radio_button {

5 J- v- Z/ I r8 }, U6 Q

label = "管材配件";

9 E# c/ q' B8 N G, ]$ {3 @

key = "c5";

# ]' K: M: t( y8 e. u

}

6 _% i+ I, u/ E0 o2 }

: radio_button {

( L; c( v* }: k) M; }) ]; V* f, b

label = "器材仪表";

, |: s. Y. ~" T5 D$ S* w3 _

key = "c6";

! Y: h; p& U8 x9 @! Q: g

}

' t6 t8 w3 w; \

: radio_button {

9 ^( u" P! K; }7 j7 e0 ?5 |8 p

label = "常用设备";

2 P6 ?- e. Z. t! A k( r# T

key = "c7";

; X- q/ H: G |# n0 [% L

}

2 q" R9 u9 Z5 j2 ~: V2 T

: radio_button {

! i F" q9 A- j/ N# f6 V1 J; }) A% X

label = "构筑物";

* E4 H# y3 M5 A' P: L! Z, Q

key = "c8";

& x4 m1 y4 A k. k E

}

5 @+ k H2 f' U) w1 f7 \* a

: radio_button {

, v* v, z9 q9 P0 L7 o# _: W

label = "其它";

, P! j5 m8 V" A: f" z% y

key = "c9";

2 w; O( ?5 F# l3 _7 J/ l

}

; Z. k3 l, l& D. f, v6 k( r

}

$ h" P" M6 M# u3 v: e$ r

: list_box {

( b5 T4 s l3 N) y: a/ j

label = "词组内容";

c9 s: C5 i1 Q& y5 C% j/ g0 T8 l

key = "what";

" S& o/ L3 M8 T! j: X8 v& o* `

height = 15;

$ ^- q: f# h, ` n- z3 `2 p

width = 26;

8 a, I; A. f* L7 S% o% I

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

: [/ ^. a5 g$ C; m) k8 [

}

: O" z( b( |! V, M

}

0 F- _) f) s0 y# n0 h8 |: V

spacer_1;

4 f1 {8 _: G W2 K0 c) E [

: edit_box {// 编辑框

8 ?$ Q, b) n7 D; u& T4 Y' {

label = "所选词组:";

$ b. C$ o4 W1 Y/ p4 ~% t+ o

key = "sel_ok";

\5 ?; y6 T. M' O3 x

}

\" v' D ]* w( J- u& n

spacer_1;// 增加间距

1 R: M! |; \4 \( Q

ok_cancel;

& k0 D1 _2 k- D( H4 L, A W

}

回复

使用道具 举报

发表于 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-10-14 16:05 , Processed in 0.065122 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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