|
用AutoCAD进行机械设计时,标注尺寸公差是设计人员经常遇到的一个问题。用Text命令手工标注,不仅速度慢,而且容易出错;通过对话框设定参数进行标注,每个不同的公差值都要设定一次。这些方法在标注时都需要翻阅手册,给设计者带来很大的不便。曾有一些标注公差的程序,使用效果并不很理想。笔者利用Autolisp语言编写了一个尺寸公差自动标注的程序。使用该程序进行公差标注不必翻阅手册,只需选择基本尺寸和公差带代号即可自动标注尺寸公差,可大大提高标注公差的速度。 , n2 _$ [7 l: a$ J. u
* o4 h+ J" T* Q# |9 @$ e一、公差值数据存贮
+ T% {/ w0 B8 z4 i0 I/ X) @
* s7 d2 E: Q& H- I8 b在标注公差过程中,对于一定的基本尺寸而言,能否根据基本尺寸大小、公差等级和基本偏差代号迅速查询出上、下偏差值,是实现公差自动标注的关键。为此,可将国标中常用的极限偏差以Data·txt为文件名保存在数据文件中。数据文件格式如下:
1 J% P% `! |4 _! v) ~+ j" o, m9 d
; K( o' C# O O( H+ F: t Q5 t5 e+ o5 h f6 g6 h6 h7 4 i2 ` Z: j7 {. g+ ?, l
…… 1 d% _& v) G, R, H# m
(… -0.025 -0.041 -0.009 -0.025 0 -0.016 0 -0.025 …);dimt40~50mm (… -0.030 -0.049 -0.010 -0.029 0 -0.019 0 -0.030 …);dimt50~65mm # q5 W: E' r% P9 u* l
(… -0.030 -0.049 -0.010 -0.029 0 -0.019 0 -0.030 …);dimt65~80mm (… -0.036 -0.058 -0.012 -0.034 0 -0.022 0 -0.035 …);dimt80~100mm & m5 u- v/ f9 O5 o
…… 9 l0 M1 J- @4 c( T. l
& b3 o9 @; m: z
第一行为公差带代号,实际文件中没有。若公差带代号为g6,基本尺寸为45mm,则其上偏差为-0.009mm,下偏差为-0.025mm。因查询函数是以字符位置获取上、下偏差的,所以公差数值表应整齐,否则获取的公差值将出错。
+ l5 \0 m4 y; s, g- f0 J" U4 b2 `3 R5 V
二、基本尺寸的获取
! [- V) }4 h: w% S7 B1 C' P: a8 I
) J# P$ y( ^% X$ d! K7 z3 k用Entget、Substr函数获取基本尺寸dimt、字高Txth及旋转角Angd,便于在标注公差时确定公差的字高、角度等参数。这里要注意,在尺寸标注前Dimaso应设定为off,否则取不到尺寸。对于基本尺寸前有R、r、Φ等符号时,应作特殊处理。对用“Text”命令标注的尺寸和用“Dimension”命令标注的尺寸,处理方法略有不同,详见源程序。
5 w4 ]! J/ Y) L4 _. k: X6 x/ o! w. s, [; f# o. k; H: }
三、公差数值的查询
0 B& {* n+ S8 v. k& j* W
# t" g4 w( |& ]- x X5 q为自动查询出所需的公差数值,我们高设定了两个函数:首先用Record()函数检索出数据文件中符合基本尺寸(dimt)范围的数据行,用Read()函数将该行中所有公差值赋给相应的变量hi,以便将相应的公差值设置为上、下偏差。例如,当获取的基本尺寸为40mm、输入的公差带代号为h7时,Record()得到的数据行号为8,用Read()将该行上的公差数值全部赋给hi,则h29为上偏差,h30为下偏差值。相应的程序如下:
) H: X& @: v0 h' ?% j* h
$ i& X& y( n7 T: s. ` (defun read (record fname)
5 j9 L! x4 ~' _) _) S" K (setq fp (open fname "r"))
2 a: l0 {! }' E% f: T: v8 g/ f0 d% ? (if (= fp nil)
" h1 }( j8 ^. G8 o: t3 I (alert "not open datatxt!") - ]% V6 B0 R: G5 z6 J; i
(progn
+ U. B+ i$ \, S$ f (repeat record (setq h (read (read-line fp)))) % f4 o0 `4 O3 D" p$ T( v1 x
(setq n (length h)) $ [, R, m9 [$ g* }! @ P
(setq b '() i 1)
; O3 x# m D' c R* w (while (<= i n) 3 n8 T( {2 `' M2 |; D
(setq b (append b (list (read (strcat "h" (itoa i))))))
, A! j4 r" t Y3 G (setq i (1+ i))
$ w7 r9 N) I# g1 e$ O ) 0 _, N# x5 H1 f" A1 q7 {
(setq i 0) 1 O7 e* @; y. T' Q8 [7 n5 Y
(while (< i n) % g6 ?1 R, g' u" x& l2 C% f/ n8 S2 c: ]
(setq name (nth i b) 8 e9 y4 a9 m) W2 H9 B8 ]; U! z
value (nth i h) 8 h+ t% _; N2 f) @ t" x: N a
) & w! Z5 M( I2 D" y7 X
(set name value) * I- G3 d3 p) K$ W% B
(setq i (1+ i)) V& i$ L8 c7 |: P& U9 c# a* }
)
$ Y2 w$ n( q( y* F& T3 [ (close fp)
( u9 l: k2 C4 X3 O' j; d3 [ )) / r; V* p# y% E9 e3 T% O+ r" Q% a
)
, n6 Y% O/ ^( ] ********************* / L% \ u/ V" d9 a: Z. ?
(defun record (dimt) 2 W; R( [- x7 d! |
(cond ((<= dimt 3) 1) ((and (> dimt 3) (<= dimt 6)) 2) ((and (> dimt 6) (<= dimt 10)) 3) ((and (> dimt 10) (<= dimt 14)) 4) ;dimt为获取的基本尺寸 …… ;因篇幅所限,以下数行略。
( Q4 a* e; {$ U& f* A ) ) " ]( }) E" _0 b/ g
$ f7 N2 g! T' K7 l
四、自动标注公差 % \7 e2 O1 k2 B; X
: O4 X9 } z5 @3 W; [$ ?
为使标注的尺寸公差与基本尺寸协调,在标注前先根据基本尺寸的字高、旋转角等确定出公差的字高和旋转角,并计算出上、下偏差的标注位置,然后用“Text”命令标注公差。程序在设计中,考虑到了只知道上、下偏差值而不知道公差等级和公差代号的情况(此时可不输入公差等级和代号,而直接输入上、下偏差),同时也考虑到了某些特殊情形,如±0.01等等。
. j' {1 t3 h! m
" n7 p& b* D+ h Z# y3 ^源程序(文件名为gcbz..lsp)如下: / ^7 v+ |% b/ M7 r# A Y# j
7 G4 c! j) U4 Q7 s" O# p& d) t
(defun c:gcbz() (setq ss (entget (car (entsel)))) (setq gcdh (getstring "\n 输入公差带代号:")) (setq p (getpoint "\n 输入插入点:")) - n! U" O/ J8 Z# ?
(setq dim (cdr (assoc 1 ss))) - q q/ [+ T, i" Z
(setq dim1 dim)
; c, U1 U, `, F4 F( y" i, E (progn
( y3 F6 X2 v/ G8 T2 k (if (= (substr dim 1 1) "R") (setq dim1 (substr dim 2)))
8 K& {. k6 L/ K' o4 e4 s (if (= (substr dim 1 1) "r") (setq dim1 (substr dim 2))) 5 v. q- @1 y/ e8 z. S+ d. x$ ~
(if (= (substr dim 1 3) "%%c") (setq dim1 (substr dim 4)))
& [: O: d z/ P/ Q, { (if (= (substr dim 1 4) "\\A1;") (setq dim1 (substr dim 5)))
) z6 \ }$ s: B6 M (if (or (= (substr dim 1 5) "\\A1;R") (= (substr dim 1 5) "\\A1;r")) (setq
+ t2 F( o6 `& K* Q1 \+ e dim1 (substr dim 6)))
8 K, [ x E+ X+ I (if (= (substr dim 1 7) "\\A1;\\U+") (setq dim1 (substr dim 12))) ; n9 O/ P# |% `( [9 T& G
);获取各类尺寸的尺寸数值
8 C' H7 G$ a- n (setq dimt (atof dim1)) - W8 g" Q+ n) M
(setq k (record dimt));调用函数,获取数据行号 $ B8 P0 D, Q- ~ Y5 a/ S
(read k "d:/data.txt");读取数据 (if (= gcdh "") (setq gc11 (getreal "\n 输入上偏差:") gc22 (getreal "\n 输入下偏差:")) L2 p$ |+ A9 K5 A' C* p
)
- R- Z# i6 A$ d* W8 m (if (= gcdh "f6") (setq gc11 h2 gc22 h3))
6 W+ u; ]& Z" x# [9 Y) \ (if (= gcdh "h7") (setq gc11 h1 gc22 h4)) ;取得上、下偏差值 …… ; 以下数行从略 (setq gc1 (rtos gc11 2 4) gc2 (rtos gc22 2 4))
. G- h7 l, J% b2 M (setq txth (cdr (assoc 40 ss))); 7 G. ^* H! m2 W! z! c
(setq angr (cdr (assoc 50 ss)))
# a. |9 c1 c* e- a+ h5 H% y (setq hi (* txth 0.5)) 0 c( r! h4 _/ e/ y+ \/ D) P
(setq angd (* (/ angr pi) 180))
7 o0 U5 e ]$ o0 {- |: ~- o (setq p1 (polar p (+ (/ pi 2) angr) 0.2))
, I* Y! U7 o( H" E/ r; \: L4 G! l" f1 F (setq p2 (polar p1 (+ (* pi 1.5) angr) (+ hi 0.8))) 7 }! [0 E; g0 U0 i8 t3 t: A
(setq p3 (polar p1 angr 1.8))
4 i2 e9 x! @7 h- P# _! A$ e' g (setq tole (strcat "%%p" gc1)) ; w/ N- z" ^( x* m* X" X+ [- A
(if (> gc11 0) (setq gc1 (strcat "+" gc1)))
7 w& V# Z: A3 c7 d+ L8 v (if (> gc22 0) (setq gc2 (strcat "+" gc2)))
/ B5 c' z2 q8 m) I5 v (if (= (abs gc11) (abs gc22)) (command "text" p2 txth angd tole ""))
7 P& u6 o+ `( |0 E- |. ^) l) p (if (/= (abs gc11) (abs gc22)) " @4 p& ~# B, R$ ~) c$ W( ?
(progn
}0 L3 i2 h; g6 ~6 ~7 ^6 Y# l (command "text" p1 hi angd gc1 "")
( @& J# M: L7 ^9 o' } (command "text" p2 hi angd gc2 "")
8 E- A; O: b7 D4 a )
% {4 A, O' [' W4 `1 p% D' @ ) ' ~2 c0 i. E: w
)
/ J& S+ m* U \' ]5 a/ A) e% q( o( v$ n
五、程序运行及菜单定制
3 N3 V) F5 P2 [7 a( a. w, z; n- S+ S" f) c0 y* ?
将程序放在Support\子目录下,在AutoCAD环境下用load函数将程序装入;也可用tools/application装入;或者直接将文件放在ACADR14.LSP文件中。这样,在运行AutoCAD时可直接将该程序装入。为方便标注,可在下拉菜单Dimension段增加尺寸公差标注项,具体方法如下:打开菜单文件ACAD.MNU,在**DIMENSION下增加[尺寸公差标注]^C^CGCBZ即可。
- q4 T6 _9 X% m4 E4 h" _% r$ ~& g* I
六、结束语 ; t0 S0 N& Z" R }6 z
5 O- s4 }# g2 p本程序已在AutoCAD R14、AutoCAD2000上调试通过,可函盖全部机械设计中的公差标注类型,可大大提高标注尺寸公差的速度。
% z9 ~, F% k2 l% O
7 J! [% w6 t! Y; r% i7 N( L将常用的公差数值以数据文件形式存贮,利用Autolisp语言编程,自动检索尺寸公差数值来实现尺寸公差的自动标注,是一种很好的手段。 |
|