1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
  
     | 
    
      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
  m4n = int(rp_len/2/(m4h))*2+1
  for i=1 to m4n do {
    line to rvec_(rp_len/m4n/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/m4n/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
    } ')
divert(0)dnl
 
     |