divert(-1) # `datumarrow(linespec,wid,ht)' define(`datumarrow',`line `$1' M4_E: last line.end datum_ht = ifelse(`$3',,`textht',`$3') M4_P: vperp(last line,(datum_ht*2/sqrt(3))) M4_X: datum_ht/lin_leng(last line) between M4_E and last line.start {ifsvg(,`m4fshade(m4fill,')line from M4_E to M4_E+M4_P/2 dnl then to M4_X then to M4_E-M4_P/2 then to M4_E ifsvg(`fill_(0)',`)')}') # `Y14_frame( arg1, arg2, ... ) Each arg is a ;-separated sequence of 1 or more of "string"[ wid val], "(letter)", or tolerance symbol. The term "(letter)" expands to the circled letter. The frame contains as many boxes as arguments.' `Symbol definitions from ASME Y14.5 Appendix C' define(`Y14_frameht',`textht*2') define(`Y14_defaultwid',`textht*2') # define(`Y14_frame',`[ tmpthick = linethick; thicklines_ right_; B:[ Y14_fram_($@) ] box wid B.wid ht Y14_frameht at B linethick = tmpthick ]') define(`Y14_fram_',`ifelse(`$1',,, `stacksplit_(`Y14',`$1',;) stackreverse_(`Y14') Bx: [stackdo_(`Y14', `[ifelse(index(Y14,`"('),0, `circle diam textht*5/3 patsubst(Y14,`"(\(.\))"',`"\1"') ht textht*0.8 at last circle', index(Y14,`"'),0, `Y14 ifinstr(Y14,`wid ',,`wid textht*2/3*(len(Y14)-2)')', `Y14')] move right max(last [].wid+textht/2,Y14_defaultwid) with .c at last []; ')] ifelse(`$2',,,`{ line up Y14_frameht with .c at Here }') Y14_fram_(shift($@))') ') # Each symbol definition has an abbreviated version define(`Y14_straightness', `line right textht*2 ') define(`Y14_str_',`Y14_straightness($@)') define(`Y14_flatness', `line right textht*3/4 then down textht left textht/2 \ then left textht*3/2 then up textht right textht/2 \ then right textht*3/4 ') define(`Y14_fla_',`Y14_flatness($@)') define(`Y14_circularity',`circle diam textht*3/2 ') define(`Y14_cir_',`Y14_circularity($@)') define(`Y14_cylindricity', `circle diam textht Y14_C: last circle Y14_R: (Rect_(last circle.rad,-30)) Y14_A: (Rect_(textht,60)) line from Y14_C+Y14_R+Y14_A to Y14_C+Y14_R-Y14_A/2 line from Y14_C-Y14_R-Y14_A to Y14_C-Y14_R+Y14_A/2 ') define(`Y14_cyl_',`Y14_cylindricity($@)') define(`Y14_lineprofile',`arc from (textht,0) to (-textht,0) with .c at Here ') define(`Y14_lin_',`Y14_lineprofile($@)') define(`Y14_surfaceprofile', `arc from (textht,0) to (-textht,0) with .c at Here line from last arc.start to last arc.end ') define(`Y14_sur_',`Y14_surfaceprofile($@)') define(`Y14_perpendicularity', `line from (-textht,0) to (textht,0) line from (0,0) to (0,textht*3/2) ') define(`Y14_per_',`Y14_perpendicularity($@)') define(`Y14_angularity', `line from (textht*3/2,0) to (0,0) then to (textht*3/2,textht*sqrt(3)/2) ') define(`Y14_ang_',`Y14_angularity($@)') define(`Y14_parallelism', `line up textht*3/2*sqrt(3)/2 right textht*3/4 move right textht*0.6 line down textht*3/2*sqrt(3)/2 left textht*3/4 ') define(`Y14_par_',`Y14_parallelism($@)') define(`Y14_symmetry', dnl obsolete! `line from (-textht/2,0) to (textht/2,0) line from (-textht/3,textht/4) to (textht/3,textht/4) line from (-textht/3,-textht/4) to (textht/3,-textht/4) ') define(`Y14_sym_',`Y14_symmetry($@)') define(`Y14_position', `circle diam textht line up textht*3/2 with .c at last circle line right textht*3/2 with .c at last circle ') define(`Y14_pos_',`Y14_position($@)') define(`Y14_concentricity', dnl obsolete! `circle diam textht circle diam textht/2 at last circle ') define(`Y14_con_',`Y14_concentricity($@)') define(`Y14_circularrunout', `arrow ht textht*0.8 wid textht*0.6 up textht*3/2 right textht*3/2 ') define(`Y14_cir_',`Y14_circularrunout($@)') define(`Y14_totalrunout', `arrow <-> ht textht*0.8 wid textht*0.6 \ down textht*3/2 left textht*3/2 then right textht*1.1 \ then up textht*3/2 right textht*3/2 ') define(`Y14_tot_',`Y14_totalrunout($@)') define(`Y14_diameter', `circle diam textht line up textht*3/2 right textht*3/4 with .c at last circle') define(`Y14_dia_',`Y14_diameter($@)') # The following are not Y14.5 but go well with them: `r_box(angle,pos,string) Rotated text on a white background (requires pstricks)' define(`r_box', `ifpstricks(`M4tmp: ifelse(`$2',,Here,`$2') command sprintf("\rput{%g}(%g,%g){",`$1',crl(M4tmp.x),crl(M4tmp.y)) f_box(`$3') at Orig command "}%"')') define(`crl',`int(`($1)'/scale*1000000)/1000000') `r_dimen(linespec,offset,label,tic offset,<->,pos) dimension_ with rotated text on white background' define(`r_dimen', `M4tmp: dimension_(`$1',`$2',,,`$4',`$5') r_box(rp_ang*rtod_,ifelse(`$6',,M4tmp+vec_(0,`$2'),`$6'),`$3')') `ctrline(linespec,cycle len) Centerline' define(`cdashl',0.1*scale) define(`cgapl',0.03*scale) define(`ctrline',`rpoint_(ifelse(`$1',,`to rvec_(linewid,0)',`$1')) define(`m4h',ifelse(`$2',,1*scale,`$2'))dnl m4xn = int(rp_len/2/(m4h))*2+1 for i=1 to m4xn do { line to rvec_(rp_len/m4xn/2-cdashl/2-cgapl,0) move to rvec_(cgapl,0); line to rvec_(cdashl,0); move to rvec_(cgapl,0) line to rvec_(rp_len/m4xn/2-cdashl/2-cgapl,0) } ') `ctrarcr(pos,radius,startang,endang,len) Arc cr centerline' define(`ctrarcr',`dnl define(`m5h',ifelse(`$5',,1*scale,`$5'))dnl rp_len = abs((`$2')*(`$4'-(`$3'))) m5n = int(rp_len/2/(m5h))*2+1 m5a = (rp_len/m5n/2-cdashl/2-cgapl)/(`$2') m5s = cdashl/(`$2') m5sa = `$3' for m4irr=1 to m5n do { arc from `$1'+(rect_(`$2',m5sa)) to `$1'+(rect_(`$2',m5sa+m5a)) \ with .c at `$1' m5sa = m5sa+m5a+cgapl/(`$2') arc from `$1'+(rect_(`$2',m5sa)) to `$1'+(rect_(`$2',m5sa+m5s)) \ with .c at `$1' m5sa = m5sa+m5s+cgapl/(`$2') arc from `$1'+(rect_(`$2',m5sa)) to `$1'+(rect_(`$2',m5sa+m5a)) \ with .c at `$1' m5sa = m5sa+m5a } ') define(`ASME_Y14-5_') divert(0)dnl