chiark / gitweb /
size-tests - wip - movement generator seems to work a bit
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Aug 2012 16:12:15 +0000 (17:12 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Aug 2012 16:12:15 +0000 (17:12 +0100)
size-tests.m-g

index 3f3b38f..36cabf8 100755 (executable)
@@ -4,46 +4,76 @@ use strict;
 
 our @array = <DATA>;
 
-our $height;
+our %c;
 
+sub defvar ($;$) {
+    my ($cv,$v) = @_;
+    $c{$cv} = $v;
+}
+
+defvar('extruderate',0.97200);
+defvar('feedrate',540);
+defvar('jerkfeedrate',7800);
+defvar('retract',4.5);
+defvar('restart',4.5);
+defvar('restartfeedrate',1800);
+defvar('retractfeedrate',1800);
+defvar('movefeedrate',7800);
+defvar('zprint');
+defvar('zmove');
+
+sub float_g ($) {
+    my ($f) = @_;
+    return sprintf "%.5f", $f;
+}
 sub coords_g ($) {
     my ($coords) = @_;
-    return "X$coords->[0] Y$coords->[1]";
+    return "X".float_g($coords->[0])." Y".float_g($coords->[1]);
 }
 
+sub p ($) { print "$_[0]" or die $!; }
+sub pl ($) { p("$_[0]\n"); }
+
 sub proc ($$) {
     my ($start,$end) = @_;
     foreach my $lno ($start..$end) {
        $_ = $array[$lno];
+       if (!m/^\!/) {
+           p($_);
+           next;
+       }
+       p(";$_");
        if (s/^\!draw\s+//) {
+           my @undefs = grep { !defined $c{$_} } qw(zprint zmove);
+           die "@undefs ?" if @undefs;
            my @coords = split /\s+/, $_;
-           my @coords = map {
+           @coords = map {
                my $jerk = s/^\*//;
                m/\,/ or die $!;
                [ $`, $', !!$jerk ]; # '];
            } @coords;
            pl("G92 E0");
-           pl("G1 F$movefeedrate Z$zmove");
+           pl("G1 F$c{movefeedrate} Z$c{zmove}");
            pl("G1 ".coords_g($coords[0]));
-           pl("G1 Z$zprint");
-           pl("G1 F$restartfeedrate E$restart");
+           pl("G1 Z$c{zprint}");
+           pl("G1 F$c{restartfeedrate} E$c{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;
+                   $wantfeedrate=$c{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";
+                   $extrudepos += $dist * $c{extruderate};
+                   $g .= " E".float_g($extrudepos);
                } else {
-                   $wantfeedrate=$jerkfeedrate;
+                   $wantfeedrate=$c{jerkfeedrate};
                }
                if ($wantfeedrate != $lastfeedrate) {
                    $g .= " F$wantfeedrate";
@@ -51,11 +81,16 @@ sub proc ($$) {
                }
                pl($g);
            }
-           $extrudepos -= $retract;
-           pl("G1 F$retractfeedrate E$extrudepos");
-           pl("G1 F$movefeedrate Z$zmove");
+           $extrudepos -= $c{retract};
+           pl("G1 F$c{retractfeedrate} E$extrudepos");
+           pl("G1 F$c{movefeedrate} Z$c{zmove}");
+           next;
+       } elsif (m/^\!(\w+)\=(\S+)$/) {
+           die "$1 ?" unless exists $c{$1};
+           $c{$1} = $2;
+       } else {
+           die "$_ ?";
        }
-       print or die $!;
     }
 }
 
@@ -87,16 +122,8 @@ G21 ; set units to millimeters
 G92 E0
 M82 ; use absolute distances for extrusion
 
-! $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
+!zprint=0.4
+!zmove=0.5
 
 !draw 10,10 100,10