#!/usr/bin/perl $PI = atan2(1, 1)*4; $d = 25.4/1000*35; $r = $d/2-0.1; # compensate deflection of board $steps = 24; sub orig { $x0 = $_[0]; $y0 = $_[1]; } sub mil { return $_[0]/1000*25.4; } sub cut { if (defined $x) { if ($x == $_[0]+$x0 && $y == $_[1]+$y0) { shift @_; shift @_; } else { print "\n"; } } while (@_) { $x = shift @_; $y = shift @_; # ($x, $y) = (-$y, $x); $x += $x0; $y += $y0; print "$x $y $z\n"; } } # 0 is at "noon", rotating counter-clockwise sub arc { local ($xc, $yc, $d, $a0, $a1) = @_; local ($rr) = $d/2; local $n = int(abs($a1-$a0)/360*$steps+0.5); $rr = 0 if $rr < 0; for ($i = 0; $i <= $n; $i++) { my $a = ($a0+($a1-$a0)/$n*$i)*$PI/180; $x = $x0+$xc-$rr*sin($a); $y = $y0+$yc+$rr*cos($a); print "$x $y $z\n"; } } sub circ { local ($xc, $yc, $d) = @_; print "\n"; &arc($xc, $yc, $d, 0, 360); &circ($xc, $yc, $d-$r*2) if $d > $r*2; } sub hhole { local ($xc0, $xc1, $yc, $d) = @_; local ($rr) = $d/2; &cut($xc0, $yc+$rr, $xc1, $yc+$rr); &arc($xc1, $yc, $d, 0, -180); undef $x; &cut($xc1, $yc-$rr, $xc0, $yc-$rr); &arc($xc0, $yc, $d, 180, 0); } sub pcb { &cut( &mil( 0), &mil( 0), &mil(1080), &mil( 0), &mil(1080), &mil( 620), &mil( 0), &mil( 620), &mil( 0), &mil( 0)); } sub holes { # x-x0, y0-y, diameter &circ(&mil(3130-3020), &mil(3520-3122), &mil(43)); &circ(&mil(3130-3020), &mil(3520-3298), &mil(43)); &hhole(&mil(3100-3020), &mil(3159-3020), &mil(3520-2986), &mil(39)); &hhole(&mil(3100-3020), &mil(3159-3020), &mil(3520-3434), &mil(39)); } $z = -0.8; # full thickness of board # x: corner offset, compensation for rotation, array position # y: corner offet &orig(34*2+3, 3); $r = $d/2; # no compensation. don't wanna risk making holes too big. &holes; $r = $d/2-0.1; # compensate deflection of board &pcb;