ngc_bounds 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #!/usr/bin/perl
  2. #
  3. use strict;
  4. my $fn = ($ARGV[0] || die "provide gcode file");
  5. die "invalid file: $fn" if (!-e $fn);
  6. # default to mm
  7. my $is_mm = 1;
  8. my $have_x = 0;
  9. my $have_y = 0;
  10. my $have_z = 1;
  11. my $x_min_mm;
  12. my $x_max_mm;
  13. my $y_min_mm;
  14. my $y_max_mm;
  15. my $z_min_mm = 0;
  16. my $z_max_mm = 0;
  17. open FIL, $fn;
  18. while (<FIL>)
  19. {
  20. my $l = $_;
  21. $l =~ s/;.*//;
  22. $l =~ s/\([^)]*\)//g;
  23. my $g_line = $l;
  24. while ($g_line =~ /[gG]\s*2([01])/)
  25. {
  26. my $zo = $1;
  27. $is_mm = 0 if ($zo eq "0");
  28. $is_mm = 1 if ($zo eq "1");
  29. $g_line = substr $g_line, (@+[0]);
  30. }
  31. while ($g_line =~ /[xX]\s*(-?\d+(\.\d+)?|-?\.\d+)/)
  32. {
  33. my $x = $1;
  34. my $x_mm = ( $is_mm ? $x : ($x * 25.4) );
  35. if (!$have_x)
  36. {
  37. $x_min_mm = $x_mm;
  38. $x_max_mm = $x_min_mm;
  39. $have_x = 1;
  40. }
  41. else
  42. {
  43. $x_min_mm = $x_mm if ($x_min_mm > $x_mm);
  44. $x_max_mm = $x_mm if ($x_max_mm < $x_mm);
  45. }
  46. $g_line = substr $g_line, (@+[0]);
  47. }
  48. $g_line = $l;
  49. while ($g_line =~ /[yY]\s*(-?\d+(\.\d+)?|-?\.\d+)/)
  50. {
  51. my $y = $1;
  52. my $y_mm = ( $is_mm ? $y : ($y * 25.4) );
  53. if (!$have_y)
  54. {
  55. $y_min_mm = $y_mm;
  56. $y_max_mm = $y_min_mm;
  57. $have_y = 1;
  58. }
  59. else
  60. {
  61. $y_min_mm = $y_mm if ($y_min_mm > $y_mm);
  62. $y_max_mm = $y_mm if ($y_max_mm < $y_mm);
  63. }
  64. $g_line = substr $g_line, (@+[0]);
  65. }
  66. my $g_line = $l;
  67. while ($g_line =~ /[zZ]\s*(-?\d+(\.\d+)?|-?\.\d+)/)
  68. {
  69. my $z = $1;
  70. my $z_mm = ( $is_mm ? $z : ($z * 25.4) );
  71. if (!$have_z)
  72. {
  73. $z_min_mm = $z_mm;
  74. $z_max_mm = $z_min_mm;
  75. $have_z = 1;
  76. }
  77. else
  78. {
  79. $z_min_mm = $z_mm if ($z_min_mm > $z_mm);
  80. $z_max_mm = $z_mm if ($z_max_mm < $z_mm);
  81. }
  82. $g_line = substr $g_line, (@+[0]);
  83. }
  84. }
  85. close FIL;
  86. die "don't have all of x, y, z co-ords" if ( not $have_x or not $have_y or not $have_z );
  87. print "min_x: ", $x_min_mm, " mm, ", ($x_min_mm/25.4), " inch\n";
  88. print "max_x: ", $x_max_mm, " mm, ", ($x_max_mm/25.4), " inch\n";
  89. print "min_y: ", $y_min_mm, " mm, ", ($y_min_mm/25.4), " inch\n";
  90. print "max_y: ", $y_max_mm, " mm, ", ($y_max_mm/25.4), " inch\n";
  91. print "min_z: ", $z_min_mm, " mm, ", ($z_min_mm/25.4), " inch\n";
  92. print "max_z: ", $z_max_mm, " mm, ", ($z_max_mm/25.4), " inch\n";