机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3797|回复: 7

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

[复制链接]
发表于 2006-8-29 08:47:37 | 显示全部楼层 |阅读模式
摘要 [HT5SS]本文提出了一种用对话框实现AutoCAD内常用术语自动标注的方法。用这种方法,可方便地将各种常用术语标注在图中,为CAD应用提供了方便。 $ d, S- \2 h. b' g1 s+ K

一、引言

. A$ W" c' a( h) D: ~0 B6 I

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

2 G4 J ~: x; M4 g" o s+ v' P

2 V( ~2 u. \' s3 ?: J% w/ K

二、原理及方法

4 y- p- c( c' a" a6 W

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

I6 a# y$ M+ _( a* Z4 `

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

* S* W9 E4 |1 t9 b

三、程序使用方法

" _+ [, [- s/ S6 F9 |# Z

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

! }1 a9 `& _. \9 @; q: I

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

. {5 a$ Q5 C* e2 n1 A% A1 j7 U y

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

5 d* `% q3 i9 [" C' d

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

1 V7 K9 l) |. l3 H* h

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

j* s( s2 J' X% ] G2 e

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

! Y! a2 i& q K8 R/ d

; 定义错误处理子程序

+ b* V' n( [: s2 p& O

(defun txterr(s)

! q) Q! L1 C5 J9 C

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

8 }: w7 ]) S3 Y

(/= s "Function cancelled")

8 J! p" R7 n! R) P

(/= s "quit / exit abort")

5 n# I8 |( G$ h3 u; Z

)

! z9 c2 b1 F' B8 H/ ?3 |) p7 m

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

; [& W1 [8 J% _8 U

)

6 D4 k0 B& l# ^ R' V: f ~) ^

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

1 y. a4 l# C# ^1 I! q3 X; R" N; w

(if oldcmd (setvar "cmdecho" oldcmd))

9 q( `5 h& R% r3 w4 `

(princ)

5 r$ o; ]& V2 E/ }

)

# I/ v: K5 c4 O

; 对话框显示及驱动程序

# A+ S% D" V1 c4 i; D

(defun diag ( / i)

2 D5 k7 }: \: P/ d- Y: w8 l) D& \

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

Q$ d9 h8 p1 J

(progn

/ i9 G. X1 j5 {4 W7 N$ e

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

, R# ]& Y: L1 ]$ N) w

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

9 d/ }) L5 c4 J$ ]1 N; h2 s

(mapcar 'add_list txt_tb

, ?: W% v/ V( V4 a

)

! R& e3 D. Y4 C& k/ ~

(end_list)

$ d. \& p; O B* i9 ]3 e8 {# @

(setq i 1)

: H! e& k2 h% n" I$ m

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

$ c/ [: F+ F- G, R4 t7 N. N6 Z

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

0 b$ E8 t4 M2 P) l- G/ ?

(setq i (1+ i))

) G9 ?/ j9 x! @; r2 B0 U

)

8 T# v. _) o$ [# ]- f! t; E; n3 w4 G

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

# y/ h9 C6 R- D$ x$ R% J

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

; F2 b% W2 f1 n5 I5 ?

)

! s. C/ b( f9 J5 o

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

6 g% l9 i. [3 e% `/ m& `( P* T

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

5 A1 g5 L1 M1 b$ x

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

- ^3 _5 a. s s/ j( {

(start_dialog)

{0 D* P; X. i m8 o

)

* m& C/ Q3 p4 o# n3 {0 R! {

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

+ U- `1 n3 J' X4 j1 [

)

; x& W4 H1 d8 _3 f/ j& g, @. w

)

; I; X7 k( |) X. I: b

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

, D Y0 a# c( C" j, r9 d. C9 c

)

8 {1 b6 q- T4 I$ p0 v3 U

)

) F9 c: a H) a5 q

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

& ~6 b2 s# Y0 G

(defun init( / fname fp txt1)

3 J N; c2 N1 b, A0 O' S# P* j1 N% q) d, F

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

6 @( Y4 W0 k" n+ Q4 w) O- i! d

(if (not fname)

' T+ f' w. ?. y" {

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

9 [# c1 o& B8 f A9 w$ q

)

6 A1 i! _1 f( F% {

(setq fp (open fname "r"))

1 u4 g+ d, D* p$ @

(setq txt_tb '())

4 }& _0 ^' b5 |' k( Q

(while (setq txt1 (read_line fp))

/ O' k) ]$ u5 F+ l4 B- P6 s

(setq txt_tb (cons txt1 txt_tb))

" l; f. y5 v5 @) x2 w/ o. A1 Z

)

- l1 j* Q% e j. T0 ]. ~5 f: l

(close fp)

A( W2 y5 ~ d% ?/ G4 V7 `

(setq txt_tb (reverse txt_tb))

9 }: W4 R9 E5 V+ @! L/ n" f- X

(setq old_nn 1);记录索引号

: q- X' n: ?0 W" W8 @$ r

)

# j1 m% R6 S0 p2 `9 O2 L

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

' F7 ^0 s5 f% o5 o; u

(defun wr_txt ( / fname fname1 fp txt1 i)

& }$ a( k. W2 K t1 L) v

(setq i 1)

. g& C4 Y" k5 r* X4 ]; v3 X- V

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

! U7 y2 c3 A7 y+ |+ N

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

3 U5 t3 P3 ?4 F" Q- U

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

7 A) S" |4 ~8 _# O2 N& s6 S" A

i nn

5 M) y8 O. d' {8 m

)

0 F" P' k7 k( Z# E+ G7 \$ @2 R

)

' T; H/ j$ V! g/ J) v- w+ L5 P

(setq i (1+ i))

% k9 `* v, K4 P4 Q+ r# H

)

4 v: k0 G% Z( C5 S0 U4 h; H; e

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

$ }( Y1 o" I7 P) V0 ~% Y

(progn

$ [+ ?9 d( ?9 k$ F- \$ e

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

2 e1 J; \8 |, v: o

(setq fp (open fname "r"))

7 @2 N: z5 u1 ?' X0 B; f9 c( `

(setq txt_tb '())

2 h3 L9 @% t- q3 x

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

! v9 r1 _- c8 Y- y8 g8 z: c9 c: l- O

(setq txt_tb (cons txt1 txt_tb))

& r" n+ p3 x) F/ G, Q3 B% }9 x

)

9 R6 m4 e) t: g* r

(close fp)

9 z2 j% @ e% f4 B

(setq txt_tb (reverse txt_tb))

1 V% f% b8 r4 I. S

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

1 v+ H8 {- T* p

(mapcar 'add_list txt_tb)

8 a, W0 P/ c8 e3 ~

(end_list)

# m4 i0 C" }& }: W

) ; progn

^8 l! I: ] p+ D

(progn

3 w( o7 H. ~ ^- J3 o

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

; o0 E# K, x& x5 c8 Z. E. ]3 H+ Y

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

# |( _' _) B0 S

)

! p; T2 P! _. [! a

) ; if

$ t; b) }0 X* D d( N$ }: M

)

6 W* w9 {& l5 x1 N: G7 p' m" \0 `

; 主程序开始

) h: ^9 V0 V, {, b2 a5 R+ l

(setq olderr *error*

& P" ~+ w8 s5 C ^& B& Z5 }

*error* txterr

( H2 p. G7 p" r% I% k

oldcmd (getvar "cmdecho")

% y- p( { [$ K/ d, P1 ]7 \. D$ s

)

9 ~. r9 ~5 w* i. n- R3 W- U

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

6 Y+ |/ s, z* \0 Z9 B) x9 N2 {

(setq nn 9) ; 词组分类数

6 W8 W/ f4 \- j# |; T# _! a

(init) ; 初始化

) i3 S8 }% ~ d7 T$ h9 G) p

(diag) ; 驱动对话框

; r* E- K& Y- b) V; s" k; ` ?

(if (and ok txt)

/ [: i# ~, `- d6 {# s7 d' [

(progn

S2 v1 Y0 t* B- I

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

: ]% H8 ]+ e! n8 B

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

. b* c+ P) g5 Q

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

4 j. j- c W( k4 A W0 s

)

' L$ q3 i& u4 w0 M- C

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

' \" l& l6 F( C# N; [' Z7 ?; P

)

: @3 z& g5 ~ G* _1 w* ?: @

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

& z1 c; |9 |; @4 r u2 `

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

. A' G: M5 u, o. a( ^

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

* p! @8 C2 E1 D6 G) V/ |; J

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

; g. K- i& }! |: s ^1 P& b% O

(command "text" pt ht 0 txt)

3 A1 v) A- `6 @* w- O

)

# O7 ^4 e( L `$ q+ R7 }) I9 J* h

)

& d m1 }; _$ {$ ^* U

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

2 D3 p- q. d9 T% t: @! g) \2 z

(setvar "cmdecho" oldcmd)

3 c5 r; r, V% h- y/ X8 D

(princ)

$ j5 s1 G9 @" u* S3 b5 E! O( j- z D6 {

)

& ?2 x2 l- l: @

// #txt.dcl

8 f% o/ F) B" Q! L/ @( K, k/ \

// 供#txt.lsp调用

9 {- W& g4 ~5 L/ v5 `' a* q) }( x

filetext : dialog { // 对话框名称

( \ Y# C. m6 k: e# ~* c* {, \

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

4 W0 t4 R. E; v. E) M3 ?. V

: row {

# [: ?7 j- v2 L' ]( j( v0 f1 b& ~ R

: boxed_column {

; O4 ?0 K7 T ^

label = " 索 引 ";

$ Q. N) V5 h+ D; h0 s6 |

: radio_button {

3 y- }8 u4 P5 X& W

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

6 u* _2 \; _) t$ C

key = "c1";

; i' k" q4 q% i

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

& A5 b* K3 ]0 s/ ]% a7 I7 g; L }0 p

}

* q# D% x1 O9 `) x9 ]! k" y: s( P

: radio_button {

0 W0 Z4 g# f5 M; v4 K7 \: `& V

label = "图纸名称";

7 h) t' \' `1 d) f

key = "c2";

' T* |: p: \1 `6 t; _; W3 s

}

3 b' D' b8 ^, e* C, ]

: radio_button {

2 w8 F. z9 d) W+ z1 s6 c/ w

label = "房间名称";

: z$ O! h8 L' }3 N7 I. c

key = "c3";

{' h- w$ X/ n8 Z. C6 M

}

" u3 |0 j4 [* ] E: b7 T

: radio_button {

7 g& o ~7 I) [ _$ D$ m

label = "卫生器具";

" j# P/ v* }- S# `3 n& f+ X$ v# m8 m% A

key = "c4";

+ A; G* l' m/ f; u s

}

V0 {, d3 ~3 m" M8 g3 n6 `% s

: radio_button {

5 |: b/ \3 b9 X! s0 n. a5 [( X

label = "管材配件";

- e4 A/ @8 J" U) q4 l( R

key = "c5";

" ~: m. i5 X2 E1 Y+ s/ S% [

}

9 u( @( G% N" t5 t8 H, w

: radio_button {

) H. T2 @# V) G* r

label = "器材仪表";

- G* G! [2 k2 f) E1 N0 }# I- B7 k

key = "c6";

2 i' ]1 U" u% M7 J

}

8 q6 f$ h" o" T% L! F

: radio_button {

! w0 d7 L `( G; E5 p

label = "常用设备";

* k1 n6 J+ k" P* `, _

key = "c7";

/ G) n, s- K, ]3 E2 q w

}

4 A0 K" R" z& c) O: U

: radio_button {

" l$ E5 `* L N g. ^4 E6 ~5 p2 V

label = "构筑物";

# E. ?1 ]: L6 v" r/ U* f' j

key = "c8";

/ v8 U+ j# I( y# v+ E/ A( t/ S

}

. ]& w7 M0 l) g; s7 A+ y

: radio_button {

( S" |& m$ V d

label = "其它";

8 K, f9 Q, w; e: C

key = "c9";

( o* `0 {. t6 q0 _: ?: l

}

7 p4 h. l5 R# j2 k: _$ |2 s: u+ q

}

9 W$ c' I% c) C& m' C+ S

: list_box {

3 r' q8 z9 G8 @. m9 Z; E/ I

label = "词组内容";

5 R8 N, \9 d7 m ~0 z* ~

key = "what";

" H! |0 o) X4 P( a( a3 N

height = 15;

* B( [6 I* L o0 a" g" L' N

width = 26;

2 A1 Q3 G% B# T) G

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

2 P% }% n! K3 L0 u% V0 w/ N

}

* F4 T% Z! ]5 e; N+ S

}

( ?1 g+ e: z% T( ?5 q5 S$ ~! Y

spacer_1;

* M A$ X" U$ s# a

: edit_box {// 编辑框

7 z0 j2 x- {# t# b2 X

label = "所选词组:";

3 y! u1 Z# D" Y9 |" Q9 X

key = "sel_ok";

) B7 a$ K" O' U1 P: q0 K8 }

}

1 Z. x. m2 S/ M; H# V7 G( k

spacer_1;// 增加间距

( c C! G4 [4 x0 l4 P/ b4 M/ ]

ok_cancel;

9 _/ r; J1 ?* C/ R- z8 C4 ?- I# Z

}

回复

使用道具 举报

发表于 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-5-3 06:54 , Processed in 0.061111 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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