10 my $current = \@array;
16 next if $l =~ s/\\$//;
19 if (m/^\!(\w+)\s*\(\)\s*\{$/) {
21 die if $current ne \@array;
22 die if exists $procs{$pname};
23 $current = $procs{$pname} = [];
42 defvar('extruderate',0.097200);
43 defvar('feedrate',540);
44 defvar('jerkfeedrate',7800);
45 defvar('retract',4.5);
46 defvar('restart',4.5);
47 defvar('restartfeedrate',1800);
48 defvar('retractfeedrate',1800);
49 defvar('movefeedrate',7800);
55 return sprintf "%.5f", $f;
59 return "X".float_g($coords->[0])." Y".float_g($coords->[1]);
62 sub p ($) { print "$_[0]" or die $!; }
63 sub pl ($) { p("$_[0]\n"); }
76 if (m/^\!(\w+)\s*\(\)$/) {
78 die "$pname ?" unless $procs{$pname};
80 } elsif (m/^\!draw\s+/) {
81 my @coords = split /\s+/, $';
82 my @undefs = grep { !defined $c{$_} } qw(zprint);
83 die "@undefs ?" if @undefs;
87 [ $`, $', !!$jerk ]; # '];
89 my $extrudepos=$c{restart};
91 my $zmove=$c{zprint}+$c{zlift};
92 pl("G1 F$c{movefeedrate} Z$zmove");
93 pl("G1 ".coords_g($coords[0]));
95 pl("G1 F$c{restartfeedrate} E".float_g($extrudepos));
97 foreach (my $ci=1; $ci<@coords; $ci++) {
98 my $g = "G1 ".coords_g($coords[$ci]);
100 if (!$coords[$ci][2]) {
101 $wantfeedrate=$c{feedrate};
103 foreach my $xy (qw(0 1)) {
104 my $dxy = $coords[$ci][$xy] - $coords[$ci-1][$xy];
105 $dist += $dxy * $dxy;
108 $extrudepos += $dist * $c{extruderate};
109 $g .= " E".float_g($extrudepos);
111 $wantfeedrate=$c{jerkfeedrate};
113 if ($wantfeedrate != $lastfeedrate) {
114 $g .= " F$wantfeedrate";
115 $lastfeedrate = $wantfeedrate;
119 $extrudepos -= $c{retract};
120 pl("G1 F$c{retractfeedrate} E".float_g($extrudepos));
121 pl("G1 F$c{movefeedrate} Z$zmove");
123 } elsif (m/^\!(\w+)\=(\S+)$/) {
124 die "$1 ?" unless exists $c{$1};
135 ; -*- fundamental -*-
141 ; perimeter_speed = 30
145 ; nozzle_diameter = 0.59
146 ; filament_diameter = 1.77
147 ; extrusion_multiplier = 1
148 ; single wall width = 0.71mm
149 ; first layer single wall width = 0.60mm
151 M190 S65 ; wait for bed temperature to be reached
152 M104 S215 ; set temperature
154 M109 S215 ; wait for temperature to be reached
155 G90 ; use absolute coordinates
156 G21 ; set units to millimeters
158 M82 ; use absolute distances for extrusion
162 !draw 10,10 100,10 102,12 102,14 100,16 10,16
165 !draw 68.498,79.498 \
185 M104 S210 ; set temperature
186 M140 S60 ; set bed temperature
191 M83 ; extruder relative
192 G1 F1000 ;1000mm/min extrusion
194 G1 F240 ;240mm/min vertical move
196 G28 X0 Y0 ; home X and Y axis
197 M104 S0 ; turn off temperature
198 M140 S0 ; turn off bed