#!/usr/bin/env perl use strict; use warnings; use Carp; BEGIN { unshift @INC, '.'; }; use Arcturus; my $layer = 0; # I'm bad at naming things. Listening to the history of the atomic bomb while coding doesn't help my $fatline = 15/155; my $thinline = 4/155; my $gcode = Arcturus->new( linewidth => $fatline, printspeed => 300, movespeed => 600, ); $gcode->begin('arcturus_v3.gcode'); testobject($gcode); $gcode->finish; print "Filtering comments...\n"; $gcode->filtercomments('arcturus_v3.gcode', 'arcturus_v3_filtered.gcode'); print "Done.\n"; # This is a test object for developing crushable structures sub testobject { my $centerx = 110; my $centery = 110; my $angleoffs = 0; my $circlestartoffs = 0; while($gcode->getValue('z') < 20) { # make it 20mm in height $layer = $gcode->newlayer(); print "Generating layer $layer...\n"; if($layer == 2) { # Switch to faster, thinner print, turn on fan after the first layer $gcode->linewidth($thinline); $gcode->printspeed(800); $gcode->movespeed(2400); $gcode->rawcommand('M106 S255 ; Parts cooling fan full speed'); } my $roffs = 0; my $printradials = 1; my $printcircles = 1; if($layer > 2) { $roffs = int($layer / 2) % 8; $angleoffs = $layer % 8; if($layer % 2 == 0) { $printradials = 0; } else { $printcircles = 0; } } # Casing outer diameter $gcode->printcircle($centerx, $centery, 60); # First triangles for(my $angle = 0; $angle < 360; $angle += 20) { { my ($startx, $starty) = $gcode->calcCirclePoint($centerx, $centery, 60, $angle + 0); my ($midx, $midy) = $gcode->calcCirclePoint($centerx, $centery, 55, $angle + 10); my ($endx, $endy) = $gcode->calcCirclePoint($centerx, $centery, 60, $angle + 20); $gcode->printline($startx, $starty, $midx, $midy, 1); # Auto-swap direction if that makes it faster $gcode->printline($midx, $midy, $endx, $endy, 1); # Auto-swap direction if that makes it faster } } # Second triangles for(my $angle = 0; $angle < 360; $angle += 20) { { my ($startx, $starty) = $gcode->calcCirclePoint($centerx, $centery, 60, $angle + 10); my ($midx, $midy) = $gcode->calcCirclePoint($centerx, $centery, 55, $angle + 20); my ($endx, $endy) = $gcode->calcCirclePoint($centerx, $centery, 60, $angle + 30); $gcode->printline($startx, $starty, $midx, $midy, 1); # Auto-swap direction if that makes it faster $gcode->printline($midx, $midy, $endx, $endy, 1); # Auto-swap direction if that makes it faster } } # Radials for(my $angle = 0; $angle < 360; $angle += 10) { my ($startx, $starty) = $gcode->calcCirclePoint($centerx, $centery, 55, $angle); my ($endx, $endy) = $gcode->calcCirclePoint($centerx, $centery, 60, $angle); $gcode->printline($startx, $starty, $endx, $endy, 1); # Auto-swap direction if that makes it faster } # casing inner circle $gcode->printcircle($centerx, $centery, 55); # Spiderweb radials if($printradials) { $circlestartoffs = $angleoffs; for(my $angle = 0; $angle < 180; $angle += 10) { my ($startx, $starty) = $gcode->calcCirclePoint($centerx, $centery, 55, $angle + $angleoffs); my ($endx, $endy) = $gcode->calcCirclePoint($centerx, $centery, 55, 180 + $angle + $angleoffs); $gcode->printline($startx, $starty, $endx, $endy, 1); # Auto-swap direction if that makes it faster } } # spiderweb circles if($printcircles) { for(my $r = 10 + $roffs; $r < 55; $r += 10) { $gcode->printcircle($centerx, $centery, $r, $circlestartoffs); } } } print "Object done!\n"; return; }