147 lines
4.6 KiB
PostScript
147 lines
4.6 KiB
PostScript
%!
|
|
|
|
<< /PageSize [842 595] >> setpagedevice
|
|
|
|
gsave
|
|
|
|
% Find out if the device space is rotated compared to user space.
|
|
% This turns out to be important!
|
|
% We assume if we have a non-zero in index one, then we're rotated by 90 degrees
|
|
6 array currentmatrix 1 get 0 ne dup
|
|
{ 160 } { 120 } ifelse /YDivisions exch def
|
|
{ 120 } { 160 } ifelse /XDivisions exch def
|
|
|
|
|
|
0 0 itransform % Device origin
|
|
480 add exch 640 add exch % rough grid size
|
|
transform % to device space
|
|
|
|
round cvi YDivisions idiv
|
|
dup /DeviceHPitch exch def
|
|
YDivisions mul /DeviceGridHeight exch def
|
|
round cvi XDivisions idiv
|
|
dup /DeviceVPitch exch def
|
|
XDivisions mul /DeviceGridWidth exch def
|
|
|
|
DeviceGridWidth DeviceGridHeight itransform 0 0 itransform
|
|
exch 3 1 roll
|
|
sub /UserGridHeight exch def
|
|
sub /UserGridWidth exch def
|
|
|
|
842 UserGridWidth sub 2 div
|
|
595 UserGridHeight sub 2 div
|
|
2 copy
|
|
/UserGridBottomLeftY exch def
|
|
/UserGridBottomLeftX exch def
|
|
transform
|
|
round cvi /DeviceGridBottomLeftY exch def
|
|
round cvi /DeviceGridBottomLeftX exch def
|
|
|
|
|
|
[ 1 0 0 1 DeviceGridBottomLeftX DeviceGridBottomLeftY ] setmatrix
|
|
|
|
0 setlinewidth
|
|
|
|
% Should return something like [[2Pitch/5 Pitch/5 Pitch/5 Pitch/5] Pitch/5]
|
|
% Element 0 (Representing the corners) is made to be bigger, and the other values are made to fit
|
|
% I think this will do something broadly sensible for grid pitches > 2 device units
|
|
% The intent is something like + - + - + with the corners intersecting the lines coming the other way
|
|
% but it will fall back to + + if there's no space for a middle stroke, and will just dash lines otherwise.
|
|
/MakeDashPattern {
|
|
[ exch abs dup % ([ pitch pitch)
|
|
[ exch % Bring line pitch (gap to fill) to top of stack. We'll keep it at the top as we go
|
|
dup 5 div ceiling cvi 2 mul % corners - if pitch is =< 2, this will be weird
|
|
dup neg % ( [ pitch [ pitch corners -corners )
|
|
3 2 roll add % Bring gap to fill to the top, and update ( [ pitch [ corners gap)
|
|
% Gap may be =<0
|
|
dup 0 gt { % if
|
|
% Leave a copy of the gap, in case we aren't able to split it
|
|
dup % ( ... corners biggap biggap)
|
|
% If gap is bigish we'll definitely want a centre stroke even if it's an even number
|
|
% so we reserve up to a third of the gap before dividing by two to get space width.
|
|
dup dup 3 div floor cvi sub 2 idiv % (... corners biggap biggap space)
|
|
dup 0 le { % if
|
|
% If we can't split the gap, use the whole gap as space
|
|
pop pop
|
|
} { % else
|
|
% Make a second copy of the space
|
|
dup % ( ... corners biggap biggap space space)
|
|
% Bring the gap to the top, and update, the new value is the centre stroke width
|
|
dup -2 mul 4 3 roll add % (... corners biggap space space centre)
|
|
dup 0 eq { % if
|
|
% Failed to split
|
|
pop pop pop % (... corners biggap)
|
|
} { % else
|
|
% Manipulate stack so that the extra gap goes away, and centre is in the right place
|
|
exch 4 3 roll % (... corners space centre space biggap)
|
|
pop % (... corners space centre space)
|
|
} ifelse
|
|
} ifelse
|
|
} { % else
|
|
pop
|
|
} ifelse
|
|
] %( [ pitch [spacing] )
|
|
exch 5 div ceiling cvi ]
|
|
} def
|
|
|
|
/HMinorTickDash DeviceVPitch MakeDashPattern def
|
|
/VMinorTickDash DeviceHPitch MakeDashPattern def
|
|
|
|
|
|
% Draw horizontal ticks
|
|
1 1 YDivisions 1 sub { % for
|
|
dup 8 mod 0 eq { [] 0 } { HMinorTickDash 0 get HMinorTickDash 1 get } ifelse setdash
|
|
DeviceHPitch mul 0 exch moveto
|
|
DeviceGridWidth 0 rlineto stroke
|
|
} for
|
|
|
|
% Draw vertical ticks
|
|
1 1 XDivisions 1 sub { % for
|
|
dup 8 mod 0 eq { [] 0 } { VMinorTickDash 0 get VMinorTickDash 1 get } ifelse setdash
|
|
DeviceVPitch mul 0 moveto
|
|
0 DeviceGridHeight rlineto stroke
|
|
} for
|
|
|
|
grestore
|
|
|
|
1 setlinewidth 0 setgray
|
|
1 setlinejoin
|
|
|
|
UserGridBottomLeftX UserGridBottomLeftY translate
|
|
0.5 0.5 moveto
|
|
0 UserGridHeight 1 add rlineto
|
|
UserGridWidth 1 add 0 rlineto
|
|
0 -1 UserGridHeight sub rlineto
|
|
closepath stroke
|
|
|
|
/UserPixelHeight UserGridHeight 120 div def
|
|
/UserPixelWidth UserGridWidth 160 div def
|
|
|
|
/Courier findfont
|
|
6 scalefont
|
|
setfont
|
|
|
|
0 8 112 {
|
|
dup -24 exch % x
|
|
UserGridHeight exch 1 add UserPixelHeight mul sub
|
|
moveto
|
|
|
|
8 add ($00xx) dup 3 2 roll
|
|
16 2 string cvrs
|
|
dup length 3 exch sub exch putinterval
|
|
show
|
|
} for
|
|
|
|
-10
|
|
0 8 152 {
|
|
2 copy UserPixelWidth mul exch moveto
|
|
|
|
($xx00) dup 3 2 roll
|
|
16 2 string cvrs
|
|
dup length 5 exch sub exch putinterval
|
|
show
|
|
} for
|
|
pop
|
|
|
|
showpage
|