+#!/usr/bin/perl -w
+
+use strict;
+
+our @array = <DATA>;
+
+our $height;
+
+sub coords_g ($) {
+ my ($coords) = @_;
+ return "X$coords->[0] Y$coords->[1]";
+}
+
+sub proc ($$) {
+ my ($start,$end) = @_;
+ foreach my $lno ($start..$end) {
+ $_ = $array[$lno];
+ if (s/^\!draw\s+//) {
+ my @coords = split /\s+/, $_;
+ my @coords = map {
+ my $jerk = s/^\*//;
+ m/\,/ or die $!;
+ [ $`, $', !!$jerk ]; # '];
+ } @coords;
+ pl("G92 E0");
+ pl("G1 F$movefeedrate Z$zmove");
+ pl("G1 ".coords_g($coords[0]));
+ pl("G1 Z$zprint");
+ pl("G1 F$restartfeedrate E$restart");
+ my $lastfeedrate=-1;
+ my $extrudepos=0;
+ foreach (my $ci=1; $ci<@coords; $ci++) {
+ my $g = "G1 ".coords_g($coords[$ci]);
+ my $wantfeedrate;
+ if (!$coords[$ci][3]) {
+ $wantfeedrate=$feedrate;
+ my $dist = 0;
+ foreach my $xy (qw(0 1)) {
+ my $dxy = $coords[$ci][$xy] - $coords[$ci-1][$xy];
+ $dist += $dxy + $dxy;
+ }
+ $dist = sqrt($dist);
+ $extrudepos += $dist * $extruderate;
+ $g .= " E$extrudepos";
+ } else {
+ $wantfeedrate=$jerkfeedrate;
+ }
+ if ($wantfeedrate != $lastfeedrate) {
+ $g .= " F$wantfeedrate";
+ $lastfeedrate = $wantfeedrate;
+ }
+ pl($g);
+ }
+ $extrudepos -= $retract;
+ pl("G1 F$retractfeedrate E$extrudepos");
+ pl("G1 F$movefeedrate Z$zmove");
+ }
+ print or die $!;
+ }
+}
+
+proc(0, scalar @array);
+
+__DATA__
; -*- fundamental -*-
; layer_height = 0.4
G92 E0
M82 ; use absolute distances for extrusion
-G1 Z0.400 F7800.000
+! $extruderate=0.97200
+! $feedrate=540
+! $jerkfeedrate=7800
+! $retract=4.5
+! $restart=4.5
+! $restartfeedrate=1800
+! $retractfeedrate=1800
+! $movefeedrate=7800
+! $zprint=0.4
+! $zmove=0.5
+
!draw 10,10 100,10