Code:
%!PS-Adobe-2.0 %%Title: Postscript Quadrature Encoder Disk %%Creator: (C) Ricardo Seixas - rseixas@pobox.com %%CreationDate: May 12 2000 %%Title: Quadrature Encoder Disk %---------------------------------------------------------- %%Changed to create the A & B for a quadrature encoder %%By Douwe Jippes - d.jippes@hccnet.nl %%Date Sept 10 2006 %%EndComments %%Changed to create "trace_width_a & b in the middle of the line. %%Date Sept 14 2006 %%Major Change to orginate all lines from the centre. %%Thanks to the great help from "Teun" swfb@tunnissen.eu %%Date sept 16 2006 %----------------------------------------------------------- % You can freely distribute and use this file as long as you maintain the original copyright % This file is provided as is and there's NO WARRANTY % Use it at your own risk /bd {bind def} bind def /ed {exch def} bd /df {def} bd /mm {2.8346 mul} bd /pi 3.1415926536 df %Here you can change the encoder characteristics /slots 45 df /nrOfRings 2 df /diameter_step 14 mm df /external_diameter 50 mm df /internal_diameter external_diameter diameter_step nrOfRings mul sub df /text ( HI5-HI6_simulator d.jippes@hccnet.nl ) df % don't remove the parentheses when you change text!!! /text_diameter internal_diameter 2 mm sub df %/text_diameter 20 mm df /font_size internal_diameter 10 div df %/font_size 6 df /font_type (Courier) df % %Look at the end of the file for positioning /center_hole { gsave % to restore linewidth % change by tune: setlinewidth is needed only once 0.2 setlinewidth %Cross -7 mm 0 moveto 14 mm 0 rlineto stroke 0 -7 mm moveto 0 14 mm rlineto stroke %Bulls Eye 8 mm 0 0 8 mm 2 div 0 360 arc stroke %Bulls Eye 14 mm 0 0 16 mm 2 div 0 360 arc stroke grestore } bd %Don't mess around here unless you know what you're doing /iR internal_diameter 2 div df /sR diameter_step 2 div df /DrawSegments { % Ri Ro nrOfSlots -> _ %/--in-- pstack == gsave 360 1 index 2 mul div exch % Ri Ro angle nrOfSlots -> _ { % repeat % fill one slice of a ring from zero to angle degrees % with origin (0, 0), inner radius Ri and outer radius Ro % and rotate the user space 2*angle degrees % Ri Ro angle -> Ri Ro angle 2 index 0 moveto 0 0 3 index 0 4 index arc 0 0 4 index 3 index 0 arcn fill %/--i-- pstack == dup 2 mul rotate } repeat grestore pop pop pop } bd /DrawDiscs { % nrOfRings nrOfSlots Ri Rstep -> % example to debug stack: %/--ins-- pstack == 3 dict begin % local dict /sR ed % R step /iR ed % R inner /#S ed % nrOfSlots % nrOfRings gsave 0.05 setlinewidth % draw inner circle { % repeat 0 0 iR 0 360 arc stroke iR iR sR add #S DrawSegments /iR iR sR add df % rotate angle degrees for next ring 360 #S 4 mul div rotate % shift outer segments by 1/4 segment } repeat % draw outer circle 0 0 iR 0 360 arc stroke grestore end % local dict %/--outs--- pstack == center_hole } bd % Text routine borrowed from Adobe Blue Book Program 10, on page 167 /insidecircletext { circtextdict begin /radius exch def /centerangle exch def /ptsize exch def /str exch def /xradius radius ptsize 3 div sub def gsave centerangle str findhalfangle sub rotate str { /charcode exch def ( ) dup 0 charcode put insideplacechar } forall grestore end } def /circtextdict 16 dict def circtextdict begin /findhalfangle { stringwidth pop 2 div 2 xradius mul pi mul div 360 mul } def /insideplacechar { /char exch def /halfangle char findhalfangle def gsave halfangle rotate radius 0 translate 90 rotate char stringwidth pop 2 div neg 0 moveto char show grestore halfangle 2 mul rotate } def end /font_type findfont font_size scalefont setfont /Encoder_Text { text 18 -90 text_diameter 2 div insidecircletext } def /Draw_Encoder { % nrOfRings nrOfSlots Ri Rstep -> nrOfRings slots iR sR DrawDiscs %Comment next line to remove text Encoder_Text } def %manual placement, you can put more than one encoder on the same sheet %30 mm 30 mm translate Draw_Encoder %52 mm 0 mm translate Draw_Encoder % Fil a sheet with discs % /pageSizeX 210 mm df % A4 /pageSizeY 297 mm df % A4 /topMargin 15 mm df /bottomMargin 15 mm df /leftMargin 10 mm df /rightMargin 10 mm df /spaceX 10 mm df % horizontal space between images /spaceY 10 mm df % vertical space between images /dX external_diameter spaceX add df /dY external_diameter spaceY add df /#x pageSizeX leftMargin sub rightMargin sub spaceX add external_diameter spaceX add div cvi df /#y pageSizeY bottomMargin sub topMargin sub spaceY add external_diameter spaceY add div cvi df bottomMargin leftMargin translate external_diameter 2 div dup translate #y { %repeat gsave #x { %repeat Draw_Encoder dX 0 translate } repeat grestore 0 dY translate } repeat showpage