机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

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

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

一、引言

# e% R9 C! ] `' i

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

1 e$ L7 e3 _, Y& {. i/ p# P

+ F- P; t7 j% \7 \

二、原理及方法

7 g; E* Z+ g8 p% g# e

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

2 e2 c! o0 Z$ ^. O6 \

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

$ _' e* E9 w) d% h6 b8 a

三、程序使用方法

/ H, p5 t5 c7 O! m ^

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

/ ^% T3 t) z; M3 O- B7 k

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

6 H, H6 r* _. l) \

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

5 `; k0 H/ x5 ^! n% K4 ~' H% Y

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

7 F1 n/ ?( q- u3 `

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

, y# X7 v1 n! u6 P9 h E s5 e

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

' d4 g6 ^7 X( M* y; d7 k

; 定义错误处理子程序

1 v# j( Z; X! v0 y Y( M$ Q7 F

(defun txterr(s)

7 L* Q* {. d( X# p- E6 j

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

6 K4 b9 m* I* o+ [* t7 N

(/= s "Function cancelled")

; C" j8 j' I# S) a- E& w9 f" p) q

(/= s "quit / exit abort")

* t. l# {' V. a2 d1 H/ N4 y

)

8 z. K6 h! T, \. D- x$ {# P

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

5 s2 k3 n. K# y8 b5 @* h+ y

)

* x: G# o; R+ h1 q/ A: J9 b* E

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

J0 H3 n% m& d: f' ?1 `$ s" q

(if oldcmd (setvar "cmdecho" oldcmd))

" q/ k# M# G4 u/ M

(princ)

7 `) l+ }! l3 ?' d

)

# ?" f6 v0 o: N1 n, W4 e5 T

; 对话框显示及驱动程序

' i- N4 x3 ?& J. _, s! Q& s

(defun diag ( / i)

" i( G# B6 Q R @! ?

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

& w) g* O }4 c

(progn

8 |' q$ h9 J+ l* c7 s9 g

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

& F% x* d1 ?. x5 T+ S1 a! g7 ~7 @

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

/ y# e0 z' h" N1 ^0 u) R

(mapcar 'add_list txt_tb

, ~' |9 ~9 A5 n" a; V Y! ^

)

: x- Q3 R, r- ?* Q- P

(end_list)

* i/ u/ b- @0 e: I4 v

(setq i 1)

0 h: T: X9 W9 y; \. U0 @

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

2 Z# _$ z( ?7 V5 [7 E' I

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

; H! Q: F k- r2 f9 e

(setq i (1+ i))

' e3 P; Q. v z9 V

)

/ K) M4 M" v2 x& _5 q

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

% Y5 {1 o- S: m" y, Q

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

8 q1 i7 ~. M4 I% p, W2 ^

)

4 W/ \, F6 I$ t& F! L

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

% m2 J, I: G8 p3 k! A

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

q c! d% v4 X) A" c

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

- @; s3 L$ z7 X) U4 S8 a# N

(start_dialog)

9 E7 n. i9 V5 g* y

)

) a* e; U5 a! L1 L3 ]- }

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

) B1 Y# N3 }" t$ r0 h' A" S

)

7 c- j1 l S, ?. Y

)

3 D- K: H3 Z. n8 ?8 W

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

0 K" V1 J, b+ Z6 W$ [

)

$ {' G5 k+ p: P V* k

)

" I0 o |# u- j# B) `) c; k3 l' `' d

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

9 d7 \1 G1 x( ^* J+ d7 ~/ F7 F

(defun init( / fname fp txt1)

, J% w! R+ y0 [4 j( j

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

, U1 p0 Z9 `5 y! P1 b

(if (not fname)

; M5 N$ Y" p8 _9 I, F' k2 s, M

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

; a+ M8 Y+ e/ ]8 P% v

)

+ j+ f. q2 \' J7 W, W8 ~4 h" ?

(setq fp (open fname "r"))

2 U- M- [( \$ H+ v; i, r

(setq txt_tb '())

( ^; a# v4 l, }* Z

(while (setq txt1 (read_line fp))

+ {& [5 v8 _9 x2 ~: Y4 \. a: f

(setq txt_tb (cons txt1 txt_tb))

4 g( \1 u1 u# D& u

)

) R& P4 k: U* D/ J

(close fp)

! b# G! {- {: U- k# Q5 `) |$ U

(setq txt_tb (reverse txt_tb))

0 }. R3 {0 d$ {! B: |; j, d1 l! `

(setq old_nn 1);记录索引号

7 d# q/ [* j( w4 |' A. l

)

1 H4 P/ [' C( d$ }8 w3 o! |9 D4 d

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

" N0 ]1 m9 u9 ^

(defun wr_txt ( / fname fname1 fp txt1 i)

, n8 `4 W# b# z# y/ @

(setq i 1)

- m1 U0 U, j7 h% Z- g' H) [

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

3 ?, z# L# i0 |; t" c4 Z

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

& X' W. A. m( Z f, f8 Q7 q

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

7 N$ M C$ m8 |0 Y- P+ G. q$ m

i nn

4 \9 W. H! k1 |& ~4 H

)

* h! T4 C4 K, g# `$ c2 P6 m

)

. I- _0 ?% E8 j6 {* m4 A

(setq i (1+ i))

& u. F6 p2 \6 i6 C6 I; Q- e+ ?

)

; u! B9 I' t2 H+ u9 U" L

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

+ I6 D, D/ r( Q4 I

(progn

: `* r4 I9 p! ~4 e$ W k9 i8 [( n

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

2 r( Q) c4 ?3 u" |, p+ s0 {+ U

(setq fp (open fname "r"))

# n% C0 w, \% Z) ^+ w' ]4 {2 c- m

(setq txt_tb '())

/ w- D: l9 Z- S0 a

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

3 I# K- I6 @- X

(setq txt_tb (cons txt1 txt_tb))

5 ]' Y! B; k# F5 c; j& \6 z0 I n7 q8 {

)

B* x# m# m& n. @) j3 J4 G& M' P

(close fp)

4 G! \9 p! @, Y n1 l! t, P* D) G! ]

(setq txt_tb (reverse txt_tb))

0 u7 ]/ v! z- h

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

+ x5 ]9 P4 I; ?

(mapcar 'add_list txt_tb)

4 c6 S5 {5 S7 y8 S

(end_list)

/ ~) d- _" i2 p3 C. S' w o2 H

) ; progn

2 M h% ]: M6 j# S

(progn

" ~: U& u# y! h X4 N

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

- {/ \" I) O: x5 _

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

" [* T% p4 Q3 t6 w! B( h: `$ p. Z* j

)

1 {7 ^4 l9 [" j8 H

) ; if

* v8 M6 ]8 {$ C2 @) r6 N9 v

)

, i/ t/ d5 |; \$ P6 l/ Z. R3 Z% G, h

; 主程序开始

) a2 G7 u7 j) x6 @* A2 n

(setq olderr *error*

7 T6 r( T6 ?2 E

*error* txterr

+ b6 C" y" _9 j! ]4 q8 q

oldcmd (getvar "cmdecho")

, s8 {$ I% E2 y3 v

)

V" Z& N: k8 W

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

& ` `5 B8 R4 D; Z

(setq nn 9) ; 词组分类数

1 J- X$ v+ Y- s' E7 ~! g$ K

(init) ; 初始化

$ I1 K" Z3 s; j! R

(diag) ; 驱动对话框

, U7 z. G( t- C5 g

(if (and ok txt)

7 J6 n/ f. a& B) K2 w

(progn

0 ~, b* u8 c5 w0 o

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

) M- `- z, F6 S; i5 ]

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

, f0 u7 W& X" O4 K1 m

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

3 ~. \6 A5 j5 B: d

)

1 d$ j. T4 `9 b7 i

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

B3 S# ^* a* g9 E j h, R3 Q

)

/ z+ g) X+ R6 s' i* E* r

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

8 o( O j5 I7 P4 z

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

. d# j0 ?( E# Q4 D& F4 E' w) n1 ]- {

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

9 R; G" Y) m3 e& ?2 R% X

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

" ]+ M* u5 ?- n+ T/ I

(command "text" pt ht 0 txt)

9 _, `$ {/ V# p& b2 S. `4 @; N+ w

)

2 \ v4 I( v3 t& b

)

2 {4 u: x4 E3 k; s5 g. W2 s

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

, x/ Q6 y0 E5 X* M) s

(setvar "cmdecho" oldcmd)

- F0 v! g* x& J. [3 Q# G

(princ)

3 y% A& W& T. a/ N1 G6 H

)

# c6 J: B; H, T) m! H2 D$ y

// #txt.dcl

% P! g1 c* u0 R l

// 供#txt.lsp调用

& V# r! t1 F1 `# h" n7 f6 @6 p

filetext : dialog { // 对话框名称

- F9 p- j# o" q! f; c3 @( R

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

5 f2 s9 J8 l0 a* d5 V1 |

: row {

. T: o% X: }" `3 I$ C

: boxed_column {

7 l# x- k6 A" Z9 \9 B. F6 ^

label = " 索 引 ";

5 i, H _- p5 R; [. f

: radio_button {

! H" w2 U. \! A/ z3 Z M

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

. w% a- J0 [4 T- `, i6 k* B s

key = "c1";

7 h0 U6 A, d1 v4 v& w/ m/ t

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

$ e1 A* ] Z% d2 E+ ?5 P

}

1 I, N `+ m6 M7 }/ e+ ^ ]' n

: radio_button {

; _: B; b) v+ T. ]

label = "图纸名称";

( L% ?* v- Q1 E

key = "c2";

" B% w& T& @. K) w9 M

}

; L' p" `0 w) K# I$ V9 |

: radio_button {

7 G5 Q' z# {2 G7 s( [; X7 x

label = "房间名称";

; v3 P8 { x4 E

key = "c3";

' }# t W; N) u6 l9 L- D

}

% m3 l& ]; d: |8 I6 O, G0 p

: radio_button {

7 q; q. G; @; `/ F2 c

label = "卫生器具";

s9 G/ g7 u8 ^$ y, ?" O" e. L. i

key = "c4";

. ?0 W8 o' i5 l8 l9 w- |! b/ r3 K

}

! i2 a! M, q0 m/ _

: radio_button {

) h5 o# P" c, M7 Q

label = "管材配件";

* i8 u$ R9 o& A: r% X8 p

key = "c5";

+ i1 M, x; F4 l5 i- H- L; s# |; U4 [

}

' ? z1 n& o4 j

: radio_button {

9 I7 u; Y1 @9 i# y* K" ~/ Q, F

label = "器材仪表";

2 P8 E# C3 e: s t& S" P9 o8 F( O e5 q

key = "c6";

! Y V* d4 ]7 K

}

; H( \7 j: G9 x" Q" U

: radio_button {

7 ]3 O' X- m1 j/ l v; N; R( L

label = "常用设备";

/ Y+ A; R) ]$ L$ _1 o) |

key = "c7";

' P6 r8 h8 `, J( ?5 u

}

1 h' b- }- w# V6 S- R# T9 v' b

: radio_button {

9 f- r, Z7 k- P1 s

label = "构筑物";

! q T/ ?6 ~0 e" t% t

key = "c8";

, ?+ ^4 D/ S8 ~0 n6 i+ d

}

- e& ~8 U3 z! A5 q5 e# @: f: }

: radio_button {

( u! k, Y- t5 T# }5 f# v4 `

label = "其它";

0 S0 g/ H0 X' B8 M1 o

key = "c9";

- F) U; q3 q" f4 P

}

3 g' [ Z w* h4 C% ^

}

& _5 I, D) }5 S# ], U

: list_box {

, y: [) t; |: V" s- Z! K

label = "词组内容";

! V% r1 i& Y# j* r, l" B

key = "what";

\4 _8 _+ V1 F! ?0 v- ~5 R9 O0 j

height = 15;

1 N5 E# p# g0 k

width = 26;

5 `1 l6 ]1 \6 Y/ {5 |- x' o: r

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

* S: O5 [8 R& |+ f; K

}

3 r3 W1 d: X2 W

}

+ Q$ E" q* e; \. w" E; v

spacer_1;

; q' m& |+ N9 t h3 V3 q- Q

: edit_box {// 编辑框

5 U1 I! `8 J Z4 k) }: b: \

label = "所选词组:";

2 v& }" a' O" d+ K

key = "sel_ok";

% a, B2 \9 A& ? ], F2 d: i$ J

}

9 | w g& H$ {

spacer_1;// 增加间距

; S- @" t1 m2 ^! w& O9 x( D

ok_cancel;

7 W8 Q, K2 q X Z, n& G+ @( `* L8 C

}

回复

使用道具 举报

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, 2025-2-19 07:02 , Processed in 0.088609 second(s), 13 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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