机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3582|回复: 7
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2006-8-29 08:47:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 3 c0 @# E8 H( |5 R5 p

一、引言

. N8 ^1 ?( E& a3 t

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

( H$ [7 k2 T2 }

' x( X9 E- d9 q" Y5 w4 j. h, V% D

二、原理及方法

( \, m, U2 F6 i" D% _0 Y

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

9 e1 z* |% o n+ I$ D

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

7 p& a* Q4 I8 o3 W& L9 b

三、程序使用方法

, E- k* y+ \/ {8 z9 J

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

+ p2 T: W5 `7 t/ D: L3 W

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

$ J3 V8 n! v K0 ]3 u

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

- `! w& R1 ?: a7 t

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

& [0 y+ e8 j3 x8 y/ [4 P

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

) s: \& f- R& X- A8 }

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

9 q" d1 y/ g+ {! `# r9 U

; 定义错误处理子程序

/ l! l0 V( A1 A# D0 t! F

(defun txterr(s)

* j' q7 k' U! r0 ~: P" l

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

* L. Q' k$ e$ d2 _5 a- p

(/= s "Function cancelled")

w" p: P4 p1 ]' L- x6 m6 s

(/= s "quit / exit abort")

; P3 f% w9 n$ p

)

9 i- B) y/ T- {3 t1 D( s" G- P

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

- j# n3 }6 M, c( ] v& Y7 w; G& y

)

! ?# k0 {) `: E8 @, ?% t- ~2 G2 Y

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

% a! c M( q5 M( w

(if oldcmd (setvar "cmdecho" oldcmd))

$ Z, e9 T7 G) e0 E! L

(princ)

, ~$ q) K% d8 ^. B( G2 B

)

" S* N+ s3 Q; q$ m# u i4 y. V) X

; 对话框显示及驱动程序

p/ Z/ L8 G1 i) N* m

(defun diag ( / i)

+ W' ?9 Y/ o! c- ~

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

: v/ `" y# B( o! c# P2 ]2 n3 Z

(progn

/ q' I o( {" \- X3 \& d

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

6 M: e/ b" \, Y$ B" B2 e* M0 X0 ]9 E: L

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

* {- |! c, N+ K% g5 X+ G# x$ ^

(mapcar 'add_list txt_tb

B; f" y9 V: f$ j. `2 W

)

$ Q) K7 D; ]8 y, F* {2 h

(end_list)

. n% W! F2 x6 A7 w" ~- ~, g% ?

(setq i 1)

* d% v7 e1 ?* g# C3 [! F

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

2 q/ u# f! `* c( n# ~# N% [1 V

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

' e3 Y6 y* s9 w( {6 ~5 R

(setq i (1+ i))

9 s" f }5 x2 N: {

)

5 m [, @1 r! f! r; v

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

# K1 s8 l& C2 p8 S

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

0 x" U. g# m4 ^5 J6 H' |' K

)

% p/ |$ w2 B" ~$ L) a% M' Q; f8 Z1 N

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

; u; M( b: i+ s6 c Y

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

8 g* ?6 v1 r! {* l/ e

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

% T7 j M/ r J# k D

(start_dialog)

+ ]$ T# _5 P: ~' H1 m

)

: V' l0 I# j9 T+ r2 B& k+ A

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

2 O& C3 L( k7 ~+ v' s8 v

)

& Z% d6 f7 J0 A* D# Z

)

4 b% n% N6 l. ] z

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

$ c9 [( ?+ |' x$ N" D7 B/ j

)

4 z ~8 ]9 p6 e; P! w) M; F

)

) ^: u/ I9 X7 n* V

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

5 j- F, D( d' I% f/ v& r

(defun init( / fname fp txt1)

# N8 X% b3 i/ m g' h

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

. X; r- p, Q/ B; }2 U" O

(if (not fname)

, }" c7 N5 r3 Y, g0 c+ z

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

7 c# ?: y0 }' y( ]8 I, N; Y4 y

)

F* M0 X+ `; c# ]

(setq fp (open fname "r"))

6 ?( a, M# \+ D4 Q

(setq txt_tb '())

9 e2 \* e# `4 F! U. X

(while (setq txt1 (read_line fp))

5 ]- E& U8 D3 [+ X2 n# ]

(setq txt_tb (cons txt1 txt_tb))

$ Q2 F3 q! R" H8 B1 W6 N; x9 K

)

- `$ K# h. i. H, j

(close fp)

: K) j& ^3 n* B" ^" X

(setq txt_tb (reverse txt_tb))

3 j, M, L& S; [! ]% A, V& ~

(setq old_nn 1);记录索引号

( {* G4 }/ Y9 ^/ f; t% ]

)

( ` _( i- g" o. Z8 x# R% ~. ^

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

2 ?3 K: J H, o# ~* a3 Y+ u; z5 W3 d

(defun wr_txt ( / fname fname1 fp txt1 i)

6 A" u$ Y2 A! W/ Z

(setq i 1)

2 t$ m) i- i- u" _% Z

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

% |4 I' }8 V& C: j4 b

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

4 t) w8 y$ A- W, i* H

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

9 T# z! ?! R) V! U. o

i nn

' q6 e# I, q9 M0 m$ p I

)

7 R+ A# P* A- L% Y# c3 E m

)

9 v# f2 Z, v k. j! I

(setq i (1+ i))

7 e3 o, P/ w M. q3 T! d2 t

)

$ G0 e( v S3 @* p. m

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

9 `. P# D9 F& b% k# D9 e& g! w( i: t

(progn

$ r$ m8 M, y8 K8 Y" s# u+ k5 M

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

" X5 p0 f p+ B

(setq fp (open fname "r"))

$ T! y( q$ N, s/ M( t9 ~% B

(setq txt_tb '())

4 h, w n4 m D1 M& A6 X4 g

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

5 |% v- x; g; A7 p# y2 e& @

(setq txt_tb (cons txt1 txt_tb))

# V& |1 z1 J: D$ l

)

# ^ i: o! ^: L2 n, w H" W

(close fp)

: H; R% p A+ w; u8 W5 P3 j# X

(setq txt_tb (reverse txt_tb))

- C+ z. u' S# Q. ]8 f4 ^) a

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

# G, A5 T4 x; _- w1 o

(mapcar 'add_list txt_tb)

, ~9 V6 |1 A( u

(end_list)

: x0 k1 ]! L( R3 p4 Q0 B1 ]

) ; progn

- P& `" s8 F1 }

(progn

) F# m ^) O3 W; p% Z, i, [4 x! L

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

' I' i- S; s' X1 j

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

$ g2 g" S! ~' |# k

)

) ]# K8 g' \. W* q# H: w$ r1 N, i

) ; if

% Q" q# Q5 t) H. D' L$ [3 M0 U; r

)

8 k$ s7 O- }# S* C# p+ U; B7 o8 Z

; 主程序开始

5 f! `/ `7 X. c8 f9 a/ t

(setq olderr *error*

7 b9 N; I: a7 c5 F7 {6 a9 ?

*error* txterr

9 ?4 Q- a' K, z. r: |4 C6 c

oldcmd (getvar "cmdecho")

+ |5 d* N& Z/ m9 D* e# h+ v

)

+ `" H5 `4 h" _+ u

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

4 i0 K; v: G! P$ N4 P* j

(setq nn 9) ; 词组分类数

3 S* K2 \8 K# e! S

(init) ; 初始化

+ i3 Q8 k! G8 h% z; v

(diag) ; 驱动对话框

# a# }& p& a2 u% x& J

(if (and ok txt)

- B' K h6 |; {0 `. P

(progn

) Y/ S9 t' P3 Q$ D/ p0 j7 T" \

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

5 ]$ J: w7 g4 x5 O

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

, d, c9 _) i4 s" O' A) F

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

& L- S+ @6 Z# u) X5 z

)

' z+ ]2 W0 U% i9 l8 T

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

: \! K. X1 _0 P. v

)

; |! g# `8 N: ?+ v/ F9 q' s( A4 F

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

' v" Y" l6 L: v" D. X" S

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

" y+ w" v5 M8 g- U, e8 H. A

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

# E ~8 F2 Q# N, g9 g5 S9 ~& K

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

, P: Q$ N( z9 q/ o* P, g% S- t, k

(command "text" pt ht 0 txt)

. H* V- r! Q6 r9 \# N$ N' l

)

/ W7 l s8 z a1 w( h

)

4 o3 @2 [0 N! H' W: S! D& g

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

: ~, A+ B7 G5 B/ W/ V5 B/ |

(setvar "cmdecho" oldcmd)

" \- {, ~0 b9 x# B

(princ)

; r6 `& S, D' i+ ?. g# Y* [

)

) X' v: P. }+ n, L; f) _" _; v

// #txt.dcl

8 {' V' h: j1 @) y+ W! U

// 供#txt.lsp调用

8 k p2 e$ I o. d3 \

filetext : dialog { // 对话框名称

. S' H: q' T9 z0 H

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

5 ~8 V d% ^4 {8 h3 @

: row {

5 p6 N+ s0 L0 t8 A, y" Z& @$ i

: boxed_column {

8 n" v: p! T j3 F( Z. u* E3 g

label = " 索 引 ";

1 E/ L0 Q9 W4 ?

: radio_button {

- O! [6 {8 e+ W% |$ r( {

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

8 J5 @4 ^1 {' b: y+ B

key = "c1";

# V* t7 s1 z. {7 j+ r

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

. M3 ^# @. |/ t, P$ U

}

2 K5 v, C9 ^0 b/ `) o. V

: radio_button {

2 T5 d: Q: H G; V1 T- A5 ~; G: }' t

label = "图纸名称";

: V4 ~9 ~& j% _2 a/ L8 ?5 W

key = "c2";

& q+ E. m. O9 X8 `6 }

}

3 N6 U1 @' H/ C

: radio_button {

+ l3 E7 `, S/ z7 h! @8 P

label = "房间名称";

% T" K5 @- s3 N8 b5 A

key = "c3";

! A1 l( F6 M6 z' ]3 v

}

8 m, s* _0 x( x

: radio_button {

" o6 e/ y$ z8 W3 c: o3 H& v! T

label = "卫生器具";

" ^. `2 _& F9 |, Q' w* s" `' z- I5 J

key = "c4";

, N) j" @0 w1 y/ J" [

}

g8 n* ]4 M* I& |2 K

: radio_button {

2 r; a- t, j, W% h0 f

label = "管材配件";

5 V3 j7 Y1 x2 } @

key = "c5";

$ `- ?" t0 b- x, ~# E& X. a g9 u) J

}

9 G4 M% V3 w: j& h: v/ i1 T

: radio_button {

8 t) E- n5 o Y7 J# W( ~1 w

label = "器材仪表";

8 j" g' f3 i/ c8 s) Z% T

key = "c6";

M4 j" p/ V K1 e: ^2 }: [8 ]

}

% I7 [) W: m5 x2 R

: radio_button {

& Y' s. g: g3 A! }5 @7 {# h# Y

label = "常用设备";

Y' C1 K& O1 w7 O" p$ Y

key = "c7";

% S [) g7 B; h D

}

. J6 d* ]; q8 b8 [

: radio_button {

0 n7 I8 V( b! d- o& I2 P

label = "构筑物";

' e. f7 G* k) l& [" |

key = "c8";

& u( B8 i3 ^3 Z1 A _/ `8 x

}

* ^( E( t6 g ^

: radio_button {

. l7 G6 s" ?! u$ k- q6 U& H6 v

label = "其它";

7 v9 p7 t3 a' L' B5 D+ i0 l/ j

key = "c9";

% c% _$ c, R- d

}

2 l( @# M! P" m+ y! C* ]: a

}

1 q8 M* n( O, O8 T

: list_box {

1 L! a% \5 q/ `1 |

label = "词组内容";

0 `& D! I: g0 x1 H/ V1 E" E

key = "what";

" ~. d: C. z; }+ R# W

height = 15;

$ u2 q, p) ]5 e+ F, i5 g

width = 26;

, ]$ x4 p) J* P( p* U* @& @

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

& c! o* n! q# U! I' C, B' ]& _

}

7 n# q, [4 j9 f, c& L

}

- E# a. J# L, R: d

spacer_1;

: l8 h4 p8 ^5 u

: edit_box {// 编辑框

; S3 R! s0 E4 H O4 z- O# F

label = "所选词组:";

! c. f* ^& W# c+ N; T

key = "sel_ok";

& h. w/ Y' F; i2 k2 r6 V8 c9 P

}

1 |. ?; X0 G/ i. Y

spacer_1;// 增加间距

- {. f& u/ l( o; Z1 r; Y

ok_cancel;

2 A- R3 ]( L) `

}

回复

使用道具 举报

2#
发表于 2010-1-22 11:01:09 | 只看该作者
就是啊,有点过于专业了,能不能浅显易懂的讲解一下,谢谢
回复 支持 反对

使用道具 举报

3#
发表于 2010-8-3 19:09:08 | 只看该作者
有点过于专业了,能不能浅显易懂的讲解一下
回复 支持 反对

使用道具 举报

4#
发表于 2010-9-29 10:44:49 | 只看该作者
程序设计专用词汇。使用者不用看
回复 支持 反对

使用道具 举报

5#
发表于 2010-9-29 20:33:09 | 只看该作者
这个不太懂,如果解决完,可以共同探讨一下吗?
回复 支持 反对

使用道具 举报

6#
发表于 2010-9-29 20:59:32 | 只看该作者
不太懂啊·············
回复 支持 反对

使用道具 举报

7#
发表于 2010-10-17 23:45:11 | 只看该作者
有对话框,挺高级的,不过这是机械必威体育网址,楼主是搞建筑滴
回复 支持 反对

使用道具 举报

8#
发表于 2012-5-30 11:12:57 | 只看该作者
这个很专业啊。。。。谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-12-20 01:04 , Processed in 0.056844 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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