#!/usr/bin/perl -i~ use strict; use warnings; my %lastpos = (X => 10000, Y => 10000, Z => 10000, E => 10000, F => 10000); my %pos = (X => 0, Y => 0, Z => 0, E => 0, F => 0); my $mindist = 0.33; my $mindistz = 0.005; my $mindistsq = $mindist * $mindist; sub dist { my $sq = 0; for (qw/X Y Z E/) { $sq += ($pos{$_} - $lastpos{$_}) ** 2; } return $sq; } while (<>) { if (m#\bG[01]\b#) { while (m#([XYZEF])(\d+(\.\d+)?)#gi) { $pos{uc $1} = $2; } if ( ( /X/ && /Y/ && (dist() >= $mindistsq) ) || (abs($pos{Z} - $lastpos{Z}) > $mindistz) || (!/X/ || !/Y/) ) { print; %lastpos = %pos; } elsif (($pos{F} - $lastpos{F}) != 0) { printf "G1 F%s\n", $pos{F}; $lastpos{F} = $pos{F}; } } else { if (m#\bG92\b#) { while (m#([XYZEF])(\d+(\.\d+)?)#gi) { $lastpos{uc $1} = $2; } } print; } }