~ubuntu-branches/ubuntu/utopic/slic3r/utopic

« back to all changes in this revision

Viewing changes to lib/Slic3r/Fill/Base.pm

  • Committer: Package Import Robot
  • Author(s): Chow Loong Jin
  • Date: 2014-06-17 01:27:26 UTC
  • Revision ID: package-import@ubuntu.com-20140617012726-2wrs4zdo251nr4vg
Tags: upstream-1.1.4+dfsg
Import upstream version 1.1.4+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package Slic3r::Fill::Base;
 
2
use Moo;
 
3
 
 
4
use Slic3r::Geometry qw(PI rad2deg);
 
5
 
 
6
has 'layer_id'            => (is => 'rw');
 
7
has 'angle'               => (is => 'rw'); # in radians, ccw, 0 = East
 
8
has 'bounding_box'        => (is => 'ro', required => 0);  # Slic3r::Geometry::BoundingBox object
 
9
 
 
10
sub angles () { [0, PI/2] }
 
11
 
 
12
sub infill_direction {
 
13
    my $self = shift;
 
14
    my ($surface) = @_;
 
15
    
 
16
    if (!defined $self->angle) {
 
17
        warn "Using undefined infill angle";
 
18
        $self->angle(0);
 
19
    }
 
20
    
 
21
    # set infill angle
 
22
    my (@rotate);
 
23
    $rotate[0] = $self->angle;
 
24
    $rotate[1] = $self->bounding_box
 
25
        ? $self->bounding_box->center
 
26
        : $surface->expolygon->bounding_box->center;
 
27
    my $shift = $rotate[1]->clone;
 
28
    
 
29
    if (defined $self->layer_id) {
 
30
        # alternate fill direction
 
31
        my $layer_num = $self->layer_id / $surface->thickness_layers;
 
32
        my $angle = $self->angles->[$layer_num % @{$self->angles}];
 
33
        $rotate[0] = $self->angle + $angle if $angle;
 
34
    }
 
35
        
 
36
    # use bridge angle
 
37
    if ($surface->bridge_angle >= 0) {
 
38
        Slic3r::debugf "Filling bridge with angle %d\n", rad2deg($surface->bridge_angle);
 
39
        $rotate[0] = $surface->bridge_angle;
 
40
    }
 
41
    
 
42
    $rotate[0] += PI/2;
 
43
    $shift->rotate(@rotate);
 
44
    return [\@rotate, $shift];
 
45
}
 
46
 
 
47
# this method accepts any object that implements rotate() and translate()
 
48
sub rotate_points {
 
49
    my $self = shift;
 
50
    my ($expolygon, $rotate_vector) = @_;
 
51
    
 
52
    # rotate points
 
53
    my ($rotate, $shift) = @$rotate_vector;
 
54
    $rotate = [ -$rotate->[0], $rotate->[1] ];
 
55
    $expolygon->rotate(@$rotate);
 
56
    $expolygon->translate(@$shift);
 
57
}
 
58
 
 
59
sub rotate_points_back {
 
60
    my $self = shift;
 
61
    my ($paths, $rotate_vector) = @_;
 
62
    
 
63
    my ($rotate, $shift) = @$rotate_vector;
 
64
    $shift = [ map -$_, @$shift ];
 
65
    
 
66
    $_->translate(@$shift) for @$paths;
 
67
    $_->rotate(@$rotate) for @$paths;
 
68
}
 
69
 
 
70
sub adjust_solid_spacing {
 
71
    my $self = shift;
 
72
    my %params = @_;
 
73
    
 
74
    my $number_of_lines = int($params{width} / $params{distance}) + 1;
 
75
    return $params{distance} if $number_of_lines <= 1;
 
76
    
 
77
    my $extra_space = $params{width} % $params{distance};
 
78
    return $params{distance} + $extra_space / ($number_of_lines - 1);
 
79
}
 
80
 
 
81
1;