Test.pm 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package Slic3r::Test;
  2. use strict;
  3. use warnings;
  4. require Exporter;
  5. our @ISA = qw(Exporter);
  6. our @EXPORT_OK = qw(_eq);
  7. use IO::Scalar;
  8. use List::Util qw(first);
  9. use Slic3r::Geometry qw(epsilon X Y Z);
  10. my %cuboids = (
  11. '20mm_cube' => [20,20,20],
  12. '2x20x10' => [2, 20,10],
  13. );
  14. sub model {
  15. my ($model_name) = @_;
  16. my ($vertices, $facets);
  17. if ($cuboids{$model_name}) {
  18. my ($x, $y, $z) = @{ $cuboids{$model_name} };
  19. $vertices = [
  20. [$x,$y,0], [$x,0,0], [0,0,0], [0,$y,0], [$x,$y,$z], [0,$y,$z], [0,0,$z], [$x,0,$z],
  21. ];
  22. $facets = [
  23. [0,1,2], [0,2,3], [4,5,6], [4,6,7], [0,4,7], [0,7,1], [1,7,6], [1,6,2], [2,6,5], [2,5,3], [4,0,3], [4,3,5],
  24. ],
  25. }
  26. my $model = Slic3r::Model->new;
  27. my $object = $model->add_object(vertices => $vertices);
  28. $object->add_volume(facets => $facets);
  29. $object->add_instance(offset => [0,0]);
  30. return $model;
  31. }
  32. sub init_print {
  33. my ($model_name, %params) = @_;
  34. my $config = Slic3r::Config->new_from_defaults;
  35. $config->apply($params{config}) if $params{config};
  36. $config->set('gcode_comments', 1) if $ENV{SLIC3R_TESTS_GCODE};
  37. my $print = Slic3r::Print->new(config => $config);
  38. $model_name = [$model_name] if ref($model_name) ne 'ARRAY';
  39. $print->add_model(model($_)) for @$model_name;
  40. $print->validate;
  41. return $print;
  42. }
  43. sub gcode {
  44. my ($print) = @_;
  45. my $fh = IO::Scalar->new(\my $gcode);
  46. $print->export_gcode(output_fh => $fh, quiet => 1);
  47. $fh->close;
  48. return $gcode;
  49. }
  50. sub _eq {
  51. my ($a, $b) = @_;
  52. return abs($a - $b) < epsilon;
  53. }
  54. sub add_facet {
  55. my ($facet, $vertices, $facets) = @_;
  56. push @$facets, [];
  57. for my $i (0..2) {
  58. my $v = first { $vertices->[$_][X] == $facet->[$i][X] && $vertices->[$_][Y] == $facet->[$i][Y] && $vertices->[$_][Z] == $facet->[$i][Z] } 0..$#$vertices;
  59. if (!defined $v) {
  60. push @$vertices, [ @{$facet->[$i]}[X,Y,Z] ];
  61. $v = $#$vertices;
  62. }
  63. $facets->[-1][$i] = $v;
  64. }
  65. }
  66. 1;