#! /usr/bin/perl -w use strict; use warnings; use Math::Trig; # for pi (not $pi) # assumes $r1 and $r2 are positive integers sub ring { my ($p, $r1, $r2, $fill) = @_; my @pos = @$p; print STDOUT < EoF } # assumes $r1 and $r2 are positive integers sub cog { my ($p, $r1, $r2, $phase, $fill) = @_; my @pos = @$p; print STDOUT < EoF my $nt = 36; # number of teeth my $da = 360/$nt/2; # size of tooth = size of spacer my $deg = pi/180; my ($xa1, $ya1, $xb1, $yb1, $xa2, $ya2, $xb2, $yb2); for (my $thx = 0; $thx < 360; $thx += 2*$da) { my $theta = $thx + 2*$phase*$da; $xa1 = $r1 * cos($deg * ($theta)); $ya1 = $r1 * sin($deg * ($theta)); $xb1 = $r1 * cos($deg * ($theta + $da)); $yb1 = $r1 * sin($deg * ($theta + $da)); $xa2 = $r2 * cos($deg * ($theta)); $ya2 = $r2 * sin($deg * ($theta)); $xb2 = $r2 * cos($deg * ($theta + $da)); $yb2 = $r2 * sin($deg * ($theta + $da)); print STDOUT < EoF } print STDOUT < EoF } sub disk{ my ($p, $rrr, $fill) = @_; my @pos = @$p; # rotate so that if you put text on the path, the text is at 12:00 print STDOUT < EoF } #xx sizes suitable for some other machine: #xx my $d1 = 2245; #xx my $d2 = 2365; #xx my $d3 = 2625; # sizes suitable for vidaXL badge machine: my $d1 = 2283; my $rim = 100; # approximate size of rim my $d2 = $d1 + 2*$rim; my $d3 = 2756; # 70 mm cover disk sub maxdisk{ my ($p) = @_; disk($p, $d3, "gray"); } sub mindisk{ my ($p) = @_; disk($p, $d1, "gray"); } sub userdisk{ my ($p) = @_; disk($p, $d3, "blue"); } sub rimring { my ($p) = @_; ring($p, $d1, $d2, "yellow"); } sub backring { my ($p) = @_; ring($p, $d2, $d3, "green"); } sub backrimring { my ($p) = @_; ring($p, $d1, $d3, "white"); } sub cutring { my ($p) = @_; cog($p, $d3, $d3+100, 0, "red"); cog($p, $d3, $d3+100, 0.5, "blue"); } sub layout_layer{ my ($ID, $content) = @_; print STDOUT < EoF my $x1; $x1 = 1750; # layout looks good with no grid $x1 = 1700; # aligns better with grid my $x2 = $x1 + 2500; my $x3 = $x2 + 2500; my $dy = 3000; # should be even multiple of grid size my $y1 = 1800; my $y2 = $y1 + $dy; my $y3 = $y2 + $dy; my $yo = $dy/2; for my $pos ( [$x1,$y1], [$x2,$y1+$yo], [$x3,$y1], [$x1,$y2], [$x2,$y2+$yo], [$x3,$y2], [$x1,$y3], [$x2,$y3+$yo], [$x3,$y3], ) { $content->($pos); } print STDOUT < EoF } sub margin_layer{ my $ID = 'margins'; my $mmm = 250; my $wbig = 8500; my $woff = $wbig - $mmm; my $hbig = 11000; my $hoff = $hbig - $mmm; print STDOUT < EoF } # a square, to check the dimensional accuracy # of the printing process sub ref_layer{ my $ID = 'reference-square'; print STDOUT < EoF } sub all_layers{ # in order, from back to front: layout_layer('maxdisk', \&maxdisk); layout_layer('mindisk', \&mindisk); layout_layer('user-artwork', \&userdisk); ref_layer(); layout_layer('cut', \&cutring); layout_layer('rim', \&rimring); layout_layer('back', \&backring); layout_layer('backrim', \&backrimring); margin_layer(); } sub svg { # user units are milli-inches: print STDOUT < EoF all_layers(); print STDOUT < EoF } main: { svg(); }