chiark / gitweb /
f3bfbd1126a4a57a6ea0fc74ce0adfc8ca0e7572
[reprap-play.git] / size-tests.m-g
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 our @array;
6 our %procs;
7
8 sub readdata () {
9     my $l = '';
10     my $current = \@array;
11     while (<DATA>) {
12         chomp or die;
13         s/\s+$//;
14         s/^\!\s*/!/;
15         $l .= $_;
16         next if $l =~ s/\\$//;
17
18         $_=$l; $l='';
19         if (m/^\!(\w+)\s*\(\)\s*\{$/) {
20             my $pname=$1;
21             die if $current ne \@array;
22             die if exists $procs{$pname};
23             $current = $procs{$pname} = [];
24             next;
25         }
26         if (m/^\!\}$/) {
27             $current = \@array;
28             next;
29         }
30         push @$current, $_;
31     }
32 }
33 readdata();
34
35 our %c;
36
37 sub defvar ($;$) {
38     my ($cv,$v) = @_;
39     $c{$cv} = $v;
40 }
41
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);
50 defvar('zlift',0.1);
51 defvar('zprint');
52
53 sub float_g ($) {
54     my ($f) = @_;
55     return sprintf "%.5f", $f;
56 }
57 sub coords_g ($) {
58     my ($coords) = @_;
59     return "X".float_g($coords->[0])." Y".float_g($coords->[1]);
60 }
61
62 sub p ($) { print "$_[0]" or die $!; }
63 sub pl ($) { p("$_[0]\n"); }
64
65 sub proc ($);
66
67 sub proc ($) {
68     my ($aref) = @_;
69     local ($_);
70     foreach (@$aref) {
71         if (!m/^\!/) {
72             pl($_);
73             next;
74         }
75         pl(";$_");
76         if (m/^\!(\w+)\s*\(\)$/) {
77             my $pname = $1;
78             die "$pname ?" unless $procs{$pname};
79             proc($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;
84             @coords = map {
85                 my $jerk = s/^\*//;
86                 m/\,/ or die $!;
87                 [ $`, $', !!$jerk ]; # '];
88             } @coords;
89             my $extrudepos=$c{restart};
90             pl("G92 E0");
91             my $zmove=$c{zprint}+$c{zlift};
92             pl("G1 F$c{movefeedrate} Z$zmove");
93             pl("G1 ".coords_g($coords[0]));
94             pl("G1 Z$c{zprint}");
95             pl("G1 F$c{restartfeedrate} E".float_g($extrudepos));
96             my $lastfeedrate=-1;
97             foreach (my $ci=1; $ci<@coords; $ci++) {
98                 my $g = "G1 ".coords_g($coords[$ci]);
99                 my $wantfeedrate;
100                 if (!$coords[$ci][2]) {
101                     $wantfeedrate=$c{feedrate};
102                     my $dist = 0;
103                     foreach my $xy (qw(0 1)) {
104                         my $dxy = $coords[$ci][$xy] - $coords[$ci-1][$xy];
105                         $dist += $dxy * $dxy;
106                     }
107                     $dist = sqrt($dist);
108                     $extrudepos += $dist * $c{extruderate};
109                     $g .= " E".float_g($extrudepos);
110                 } else {
111                     $wantfeedrate=$c{jerkfeedrate};
112                 }
113                 if ($wantfeedrate != $lastfeedrate) {
114                     $g .= " F$wantfeedrate";
115                     $lastfeedrate = $wantfeedrate;
116                 }
117                 pl($g);
118             }
119             $extrudepos -= $c{retract};
120             pl("G1 F$c{retractfeedrate} E".float_g($extrudepos));
121             pl("G1 F$c{movefeedrate} Z$zmove");
122             next;
123         } elsif (m/^\!(\w+)\=(\S+)$/) {
124             die "$1 ?" unless exists $c{$1};
125             $c{$1} = $2;
126         } else {
127             die "$_ ?";
128         }
129     }
130 }
131
132 proc(\@array);
133
134 __DATA__
135 ; -*- fundamental -*-
136
137 ; layer_height = 0.4
138 ; perimeters = 3
139 ; solid_layers = 3
140 ; fill_density = 0.4
141 ; perimeter_speed = 30
142 ; infill_speed = 60
143 ; travel_speed = 130
144 ; scale = 1
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
150
151 M190 S65 ; wait for bed temperature to be reached
152 M104 S215 ; set temperature
153 G28 ; home all axes
154 M109 S215 ; wait for temperature to be reached
155 G90 ; use absolute coordinates
156 G21 ; set units to millimeters
157 G92 E0
158 M82 ; use absolute distances for extrusion
159
160 !zprint=0.4
161
162 !draw 10,10 100,10 102,12 102,14 100,16 10,16
163
164 !layer(){
165 !draw 68.498,79.498 \
166 71.502,79.498 \
167 71.502,82.502 \
168 68.498,82.502 \
169 68.498,79.588 \
170 *67.899,78.899 \
171 72.101,78.899 \
172 72.101,83.101 \
173 67.899,83.101 \
174 67.899,78.989 \
175 *67.300,78.300 \
176 72.700,78.300 \
177 72.700,83.700 \
178 67.300,83.700 \
179 67.300,78.390 \
180
181 !}
182
183 !layer()
184
185 M104 S210 ; set temperature
186 M140 S60 ; set bed temperature
187
188 !zprint=0.8
189 !layer()
190
191 M83 ; extruder relative
192 G1 F1000 ;1000mm/min extrusion
193 G1 E-10; retract
194 G1 F240 ;240mm/min vertical move
195 G1 Z70
196 G28 X0 Y0 ; home X and Y axis
197 M104 S0 ; turn off temperature
198 M140 S0 ; turn off bed
199 M84     ; disable motors