mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-05-05 06:44:56 +08:00
Merge pull request #1968 from sapir/extrudercpp
Translate Extruder class to C++
This commit is contained in:
commit
4c330b6c59
@ -140,6 +140,7 @@ sub thread_cleanup {
|
|||||||
*Slic3r::Config::PrintRegion::DESTROY = sub {};
|
*Slic3r::Config::PrintRegion::DESTROY = sub {};
|
||||||
*Slic3r::ExPolygon::DESTROY = sub {};
|
*Slic3r::ExPolygon::DESTROY = sub {};
|
||||||
*Slic3r::ExPolygon::Collection::DESTROY = sub {};
|
*Slic3r::ExPolygon::Collection::DESTROY = sub {};
|
||||||
|
*Slic3r::Extruder::DESTROY = sub {};
|
||||||
*Slic3r::ExtrusionLoop::DESTROY = sub {};
|
*Slic3r::ExtrusionLoop::DESTROY = sub {};
|
||||||
*Slic3r::ExtrusionPath::DESTROY = sub {};
|
*Slic3r::ExtrusionPath::DESTROY = sub {};
|
||||||
*Slic3r::ExtrusionPath::Collection::DESTROY = sub {};
|
*Slic3r::ExtrusionPath::Collection::DESTROY = sub {};
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package Slic3r::Extruder;
|
package Slic3r::Extruder;
|
||||||
use Moo;
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
require Exporter;
|
require Exporter;
|
||||||
our @ISA = qw(Exporter);
|
our @ISA = qw(Exporter);
|
||||||
@ -9,61 +10,25 @@ our %EXPORT_TAGS = (roles => \@EXPORT_OK);
|
|||||||
|
|
||||||
use Slic3r::Geometry qw(PI scale);
|
use Slic3r::Geometry qw(PI scale);
|
||||||
|
|
||||||
use constant OPTIONS => [qw(
|
# has 'e_per_mm3' => (is => 'lazy');
|
||||||
extruder_offset
|
# has 'retract_speed_mm_min' => (is => 'lazy');
|
||||||
nozzle_diameter filament_diameter extrusion_multiplier temperature first_layer_temperature
|
|
||||||
retract_length retract_lift retract_speed retract_restart_extra retract_before_travel
|
|
||||||
retract_layer_change retract_length_toolchange retract_restart_extra_toolchange wipe
|
|
||||||
)];
|
|
||||||
|
|
||||||
has 'id' => (is => 'rw', required => 1);
|
|
||||||
has $_ => (is => 'ro', required => 1) for @{&OPTIONS};
|
|
||||||
has 'use_relative_e_distances' => (is => 'ro', default => sub {0});
|
|
||||||
|
|
||||||
has 'E' => (is => 'rw', default => sub {0} );
|
|
||||||
has 'absolute_E' => (is => 'rw', default => sub {0} );
|
|
||||||
has 'retracted' => (is => 'rw', default => sub {0} );
|
|
||||||
has 'restart_extra' => (is => 'rw', default => sub {0} );
|
|
||||||
has 'e_per_mm3' => (is => 'lazy');
|
|
||||||
has 'retract_speed_mm_min' => (is => 'lazy');
|
|
||||||
|
|
||||||
use constant EXTRUDER_ROLE_PERIMETER => 1;
|
use constant EXTRUDER_ROLE_PERIMETER => 1;
|
||||||
use constant EXTRUDER_ROLE_INFILL => 2;
|
use constant EXTRUDER_ROLE_INFILL => 2;
|
||||||
use constant EXTRUDER_ROLE_SUPPORT_MATERIAL => 3;
|
use constant EXTRUDER_ROLE_SUPPORT_MATERIAL => 3;
|
||||||
use constant EXTRUDER_ROLE_SUPPORT_MATERIAL_INTERFACE => 4;
|
use constant EXTRUDER_ROLE_SUPPORT_MATERIAL_INTERFACE => 4;
|
||||||
|
|
||||||
sub new_from_config {
|
|
||||||
my ($class, $config, $extruder_id) = @_;
|
|
||||||
|
|
||||||
my %conf = (
|
|
||||||
id => $extruder_id,
|
|
||||||
use_relative_e_distances => $config->use_relative_e_distances,
|
|
||||||
);
|
|
||||||
foreach my $opt_key (@{&OPTIONS}) {
|
|
||||||
$conf{$opt_key} = $config->get_at($opt_key, $extruder_id);
|
|
||||||
}
|
|
||||||
return $class->new(%conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub _build_e_per_mm3 {
|
sub e_per_mm3 {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
return $self->extrusion_multiplier * (4 / (($self->filament_diameter ** 2) * PI));
|
return $self->extrusion_multiplier * (4 / (($self->filament_diameter ** 2) * PI));
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _build_retract_speed_mm_min {
|
sub retract_speed_mm_min {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
return $self->retract_speed * 60;
|
return $self->retract_speed * 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub reset {
|
|
||||||
my ($self) = @_;
|
|
||||||
|
|
||||||
$self->E(0);
|
|
||||||
$self->absolute_E(0);
|
|
||||||
$self->retracted(0);
|
|
||||||
$self->restart_extra(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub scaled_wipe_distance {
|
sub scaled_wipe_distance {
|
||||||
my ($self, $travel_speed) = @_;
|
my ($self, $travel_speed) = @_;
|
||||||
|
|
||||||
@ -74,14 +39,6 @@ sub scaled_wipe_distance {
|
|||||||
return scale($self->retract_length / $self->retract_speed * $travel_speed * 0.8);
|
return scale($self->retract_length / $self->retract_speed * $travel_speed * 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub extrude {
|
|
||||||
my ($self, $E) = @_;
|
|
||||||
|
|
||||||
$self->E(0) if $self->use_relative_e_distances;
|
|
||||||
$self->absolute_E($self->absolute_E + $E);
|
|
||||||
return $self->E($self->E + $E);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub extruded_volume {
|
sub extruded_volume {
|
||||||
my ($self, $E) = @_;
|
my ($self, $E) = @_;
|
||||||
return $E * ($self->filament_diameter**2) * PI/4;
|
return $E * ($self->filament_diameter**2) * PI/4;
|
||||||
|
@ -53,7 +53,7 @@ sub set_extruders {
|
|||||||
my ($self, $extruder_ids) = @_;
|
my ($self, $extruder_ids) = @_;
|
||||||
|
|
||||||
foreach my $i (@$extruder_ids) {
|
foreach my $i (@$extruder_ids) {
|
||||||
$self->extruders->{$i} = my $e = Slic3r::Extruder->new_from_config($self->print_config, $i);
|
$self->extruders->{$i} = my $e = Slic3r::Extruder->new($i, $self->print_config);
|
||||||
$self->enable_wipe(1) if $e->wipe;
|
$self->enable_wipe(1) if $e->wipe;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,8 +508,8 @@ sub retract {
|
|||||||
$gcode .= $self->G1(@$lift);
|
$gcode .= $self->G1(@$lift);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$self->extruder->retracted($self->extruder->retracted + $length);
|
$self->extruder->set_retracted($self->extruder->retracted + $length);
|
||||||
$self->extruder->restart_extra($restart_extra);
|
$self->extruder->set_restart_extra($restart_extra);
|
||||||
$self->lifted($self->_retract_lift) if $lift;
|
$self->lifted($self->_retract_lift) if $lift;
|
||||||
|
|
||||||
# reset extrusion distance during retracts
|
# reset extrusion distance during retracts
|
||||||
@ -547,8 +547,8 @@ sub unretract {
|
|||||||
$gcode .= " ; compensate retraction" if $self->print_config->gcode_comments;
|
$gcode .= " ; compensate retraction" if $self->print_config->gcode_comments;
|
||||||
$gcode .= "\n";
|
$gcode .= "\n";
|
||||||
}
|
}
|
||||||
$self->extruder->retracted(0);
|
$self->extruder->set_retracted(0);
|
||||||
$self->extruder->restart_extra(0);
|
$self->extruder->set_restart_extra(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $gcode;
|
return $gcode;
|
||||||
@ -558,7 +558,7 @@ sub reset_e {
|
|||||||
my ($self) = @_;
|
my ($self) = @_;
|
||||||
return "" if $self->print_config->gcode_flavor =~ /^(?:mach3|makerware|sailfish)$/;
|
return "" if $self->print_config->gcode_flavor =~ /^(?:mach3|makerware|sailfish)$/;
|
||||||
|
|
||||||
$self->extruder->E(0) if $self->extruder;
|
$self->extruder->set_E(0) if $self->extruder;
|
||||||
return sprintf "G92 %s0%s\n", $self->_extrusion_axis, ($self->print_config->gcode_comments ? ' ; reset extrusion distance' : '')
|
return sprintf "G92 %s0%s\n", $self->_extrusion_axis, ($self->print_config->gcode_comments ? ' ; reset extrusion distance' : '')
|
||||||
if $self->_extrusion_axis && !$self->print_config->use_relative_e_distances;
|
if $self->_extrusion_axis && !$self->print_config->use_relative_e_distances;
|
||||||
}
|
}
|
||||||
@ -587,7 +587,7 @@ sub _G0_G1 {
|
|||||||
|
|
||||||
if ($point) {
|
if ($point) {
|
||||||
$gcode .= sprintf " X%.3f Y%.3f",
|
$gcode .= sprintf " X%.3f Y%.3f",
|
||||||
($point->x * &Slic3r::SCALING_FACTOR) + $self->shift_x - $self->extruder->extruder_offset->[X],
|
($point->x * &Slic3r::SCALING_FACTOR) + $self->shift_x - $self->extruder->extruder_offset->[X],
|
||||||
($point->y * &Slic3r::SCALING_FACTOR) + $self->shift_y - $self->extruder->extruder_offset->[Y]; #**
|
($point->y * &Slic3r::SCALING_FACTOR) + $self->shift_y - $self->extruder->extruder_offset->[Y]; #**
|
||||||
$self->last_pos($point->clone);
|
$self->last_pos($point->clone);
|
||||||
}
|
}
|
||||||
|
@ -714,7 +714,7 @@ sub make_skirt {
|
|||||||
if ($self->config->min_skirt_length > 0) {
|
if ($self->config->min_skirt_length > 0) {
|
||||||
$extruded_length[$extruder_idx] ||= 0;
|
$extruded_length[$extruder_idx] ||= 0;
|
||||||
if (!$extruders_e_per_mm[$extruder_idx]) {
|
if (!$extruders_e_per_mm[$extruder_idx]) {
|
||||||
my $extruder = Slic3r::Extruder->new_from_config($self->config, $extruder_idx);
|
my $extruder = Slic3r::Extruder->new($extruder_idx, $self->config);
|
||||||
$extruders_e_per_mm[$extruder_idx] = $extruder->e_per_mm($mm3_per_mm);
|
$extruders_e_per_mm[$extruder_idx] = $extruder->e_per_mm($mm3_per_mm);
|
||||||
}
|
}
|
||||||
$extruded_length[$extruder_idx] += unscale $loop->length * $extruders_e_per_mm[$extruder_idx];
|
$extruded_length[$extruder_idx] += unscale $loop->length * $extruders_e_per_mm[$extruder_idx];
|
||||||
|
@ -1660,6 +1660,8 @@ src/ExPolygon.cpp
|
|||||||
src/ExPolygon.hpp
|
src/ExPolygon.hpp
|
||||||
src/ExPolygonCollection.cpp
|
src/ExPolygonCollection.cpp
|
||||||
src/ExPolygonCollection.hpp
|
src/ExPolygonCollection.hpp
|
||||||
|
src/Extruder.cpp
|
||||||
|
src/Extruder.hpp
|
||||||
src/ExtrusionEntity.cpp
|
src/ExtrusionEntity.cpp
|
||||||
src/ExtrusionEntity.hpp
|
src/ExtrusionEntity.hpp
|
||||||
src/ExtrusionEntityCollection.cpp
|
src/ExtrusionEntityCollection.cpp
|
||||||
@ -1721,6 +1723,7 @@ xsp/Clipper.xsp
|
|||||||
xsp/Config.xsp
|
xsp/Config.xsp
|
||||||
xsp/ExPolygon.xsp
|
xsp/ExPolygon.xsp
|
||||||
xsp/ExPolygonCollection.xsp
|
xsp/ExPolygonCollection.xsp
|
||||||
|
xsp/Extruder.xsp
|
||||||
xsp/ExtrusionEntityCollection.xsp
|
xsp/ExtrusionEntityCollection.xsp
|
||||||
xsp/ExtrusionLoop.xsp
|
xsp/ExtrusionLoop.xsp
|
||||||
xsp/ExtrusionPath.xsp
|
xsp/ExtrusionPath.xsp
|
||||||
|
@ -28,6 +28,11 @@ our @ISA = 'Slic3r::Point';
|
|||||||
|
|
||||||
sub DESTROY {}
|
sub DESTROY {}
|
||||||
|
|
||||||
|
package Slic3r::Pointf;
|
||||||
|
use overload
|
||||||
|
'@{}' => sub { [ $_[0]->x, $_[0]->y ] }, #,
|
||||||
|
'fallback' => 1;
|
||||||
|
|
||||||
package Slic3r::Pointf3;
|
package Slic3r::Pointf3;
|
||||||
use overload
|
use overload
|
||||||
'@{}' => sub { [ $_[0]->x, $_[0]->y, $_[0]->z ] }, #,
|
'@{}' => sub { [ $_[0]->x, $_[0]->y, $_[0]->z ] }, #,
|
||||||
@ -221,4 +226,9 @@ use overload
|
|||||||
'@{}' => sub { $_[0]->arrayref },
|
'@{}' => sub { $_[0]->arrayref },
|
||||||
'fallback' => 1;
|
'fallback' => 1;
|
||||||
|
|
||||||
|
package Slic3r::Config::Print::Ref;
|
||||||
|
our @ISA = 'Slic3r::Config::Print';
|
||||||
|
|
||||||
|
sub DESTROY {}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -33,7 +33,7 @@ class ConfigOptionVector
|
|||||||
virtual ~ConfigOptionVector() {};
|
virtual ~ConfigOptionVector() {};
|
||||||
std::vector<T> values;
|
std::vector<T> values;
|
||||||
|
|
||||||
T get_at(size_t i) {
|
T get_at(size_t i) const {
|
||||||
try {
|
try {
|
||||||
return this->values.at(i);
|
return this->values.at(i);
|
||||||
} catch (const std::out_of_range& oor) {
|
} catch (const std::out_of_range& oor) {
|
||||||
|
153
xs/src/Extruder.cpp
Normal file
153
xs/src/Extruder.cpp
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
#include "Extruder.hpp"
|
||||||
|
#ifdef SLIC3RXS
|
||||||
|
#include "perlglue.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
Extruder::Extruder(int id, PrintConfig *config)
|
||||||
|
: id(id),
|
||||||
|
config(config)
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Extruder::reset()
|
||||||
|
{
|
||||||
|
this->E = 0;
|
||||||
|
this->absolute_E = 0;
|
||||||
|
this->retracted = 0;
|
||||||
|
this->restart_extra = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::extrude(double dE)
|
||||||
|
{
|
||||||
|
if (this->use_relative_e_distances()) {
|
||||||
|
this->E = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->E += dE;
|
||||||
|
this->absolute_E += dE;
|
||||||
|
return this->E;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Val, class OptType> Val
|
||||||
|
Extruder::get_config(const char *name) const
|
||||||
|
{
|
||||||
|
// TODO: figure out way to avoid static_cast to access hidden const method
|
||||||
|
const ConfigOption *opt = static_cast<const ConfigBase*>(this->config)
|
||||||
|
->option(name);
|
||||||
|
return dynamic_cast<const OptType *>(opt)->get_at(this->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Extruder::use_relative_e_distances() const
|
||||||
|
{
|
||||||
|
// not using get_config because use_relative_e_distances is global
|
||||||
|
// for all extruders
|
||||||
|
|
||||||
|
// TODO: figure out way to avoid static_cast to access hidden const method
|
||||||
|
const ConfigOption *opt = static_cast<const ConfigBase*>(this->config)
|
||||||
|
->option("use_relative_e_distances");
|
||||||
|
return *static_cast<const ConfigOptionBool*>(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
Pointf
|
||||||
|
Extruder::extruder_offset() const
|
||||||
|
{
|
||||||
|
return get_config<Pointf, ConfigOptionPoints>("extruder_offset");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::nozzle_diameter() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>("nozzle_diameter");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::filament_diameter() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>("filament_diameter");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::extrusion_multiplier() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>("extrusion_multiplier");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Extruder::temperature() const
|
||||||
|
{
|
||||||
|
return get_config<int, ConfigOptionInts>("temperature");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Extruder::first_layer_temperature() const
|
||||||
|
{
|
||||||
|
return get_config<int, ConfigOptionInts>("first_layer_temperature");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::retract_length() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>("retract_length");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::retract_lift() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>("retract_lift");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Extruder::retract_speed() const
|
||||||
|
{
|
||||||
|
return get_config<int, ConfigOptionInts>("retract_speed");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::retract_restart_extra() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>("retract_restart_extra");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::retract_before_travel() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>("retract_before_travel");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Extruder::retract_layer_change() const
|
||||||
|
{
|
||||||
|
return get_config<bool, ConfigOptionBools>("retract_layer_change");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::retract_length_toolchange() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>("retract_length_toolchange");
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
Extruder::retract_restart_extra_toolchange() const
|
||||||
|
{
|
||||||
|
return get_config<double, ConfigOptionFloats>(
|
||||||
|
"retract_restart_extra_toolchange");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Extruder::wipe() const
|
||||||
|
{
|
||||||
|
return get_config<bool, ConfigOptionBools>("wipe");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SLIC3RXS
|
||||||
|
REGISTER_CLASS(Extruder, "Extruder");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
54
xs/src/Extruder.hpp
Normal file
54
xs/src/Extruder.hpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#ifndef slic3r_Extruder_hpp_
|
||||||
|
#define slic3r_Extruder_hpp_
|
||||||
|
|
||||||
|
#include <myinit.h>
|
||||||
|
#include "Point.hpp"
|
||||||
|
#include "PrintConfig.hpp"
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
class Extruder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Extruder(int id, PrintConfig *config);
|
||||||
|
virtual ~Extruder() {}
|
||||||
|
void reset();
|
||||||
|
double extrude(double dE);
|
||||||
|
|
||||||
|
|
||||||
|
bool use_relative_e_distances() const;
|
||||||
|
Pointf extruder_offset() const;
|
||||||
|
double nozzle_diameter() const;
|
||||||
|
double filament_diameter() const;
|
||||||
|
double extrusion_multiplier() const;
|
||||||
|
int temperature() const;
|
||||||
|
int first_layer_temperature() const;
|
||||||
|
double retract_length() const;
|
||||||
|
double retract_lift() const;
|
||||||
|
int retract_speed() const;
|
||||||
|
double retract_restart_extra() const;
|
||||||
|
double retract_before_travel() const;
|
||||||
|
bool retract_layer_change() const;
|
||||||
|
double retract_length_toolchange() const;
|
||||||
|
double retract_restart_extra_toolchange() const;
|
||||||
|
bool wipe() const;
|
||||||
|
|
||||||
|
int id;
|
||||||
|
double E;
|
||||||
|
double absolute_E;
|
||||||
|
double retracted;
|
||||||
|
double restart_extra;
|
||||||
|
|
||||||
|
PrintConfig *config;
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// get value from a ConfigOptionVector subtype, indexed by extruder id
|
||||||
|
template <typename Val, class OptType>
|
||||||
|
Val get_config(const char *name) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -2,6 +2,7 @@
|
|||||||
#include "ExtrusionEntityCollection.hpp"
|
#include "ExtrusionEntityCollection.hpp"
|
||||||
#include "ExPolygonCollection.hpp"
|
#include "ExPolygonCollection.hpp"
|
||||||
#include "ClipperUtils.hpp"
|
#include "ClipperUtils.hpp"
|
||||||
|
#include "Extruder.hpp"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#ifdef SLIC3RXS
|
#ifdef SLIC3RXS
|
||||||
#include "perlglue.hpp"
|
#include "perlglue.hpp"
|
||||||
@ -109,7 +110,7 @@ ExtrusionPath::_inflate_collection(const Polylines &polylines, ExtrusionEntityCo
|
|||||||
REGISTER_CLASS(ExtrusionPath, "ExtrusionPath");
|
REGISTER_CLASS(ExtrusionPath, "ExtrusionPath");
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
ExtrusionPath::gcode(SV* extruder, double e, double F,
|
ExtrusionPath::gcode(Extruder* extruder, double e, double F,
|
||||||
double xofs, double yofs, std::string extrusion_axis,
|
double xofs, double yofs, std::string extrusion_axis,
|
||||||
std::string gcode_line_suffix) const
|
std::string gcode_line_suffix) const
|
||||||
{
|
{
|
||||||
@ -127,19 +128,7 @@ ExtrusionPath::gcode(SV* extruder, double e, double F,
|
|||||||
const double line_length = line_it->length() * SCALING_FACTOR;
|
const double line_length = line_it->length() * SCALING_FACTOR;
|
||||||
|
|
||||||
// calculate extrusion length for this line
|
// calculate extrusion length for this line
|
||||||
double E = 0;
|
double E = (e == 0) ? 0 : extruder->extrude(e * line_length);
|
||||||
if (e != 0) {
|
|
||||||
PUSHMARK(SP);
|
|
||||||
XPUSHs(extruder);
|
|
||||||
XPUSHs(sv_2mortal(newSVnv(e * line_length)));
|
|
||||||
PUTBACK;
|
|
||||||
|
|
||||||
const int count = call_method("extrude", G_SCALAR);
|
|
||||||
SPAGAIN;
|
|
||||||
|
|
||||||
// TODO: check that count is 1
|
|
||||||
E = POPn;
|
|
||||||
}
|
|
||||||
|
|
||||||
// compose G-code line
|
// compose G-code line
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ namespace Slic3r {
|
|||||||
|
|
||||||
class ExPolygonCollection;
|
class ExPolygonCollection;
|
||||||
class ExtrusionEntityCollection;
|
class ExtrusionEntityCollection;
|
||||||
|
class Extruder;
|
||||||
|
|
||||||
enum ExtrusionRole {
|
enum ExtrusionRole {
|
||||||
erPerimeter,
|
erPerimeter,
|
||||||
@ -57,7 +58,7 @@ class ExtrusionPath : public ExtrusionEntity
|
|||||||
double length() const;
|
double length() const;
|
||||||
|
|
||||||
#ifdef SLIC3RXS
|
#ifdef SLIC3RXS
|
||||||
std::string gcode(SV* extruder, double e, double F,
|
std::string gcode(Extruder* extruder, double e, double F,
|
||||||
double xofs, double yofs, std::string extrusion_axis,
|
double xofs, double yofs, std::string extrusion_axis,
|
||||||
std::string gcode_line_suffix) const;
|
std::string gcode_line_suffix) const;
|
||||||
#endif
|
#endif
|
||||||
|
51
xs/xsp/Extruder.xsp
Normal file
51
xs/xsp/Extruder.xsp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
%module{Slic3r::XS};
|
||||||
|
|
||||||
|
%{
|
||||||
|
#include <myinit.h>
|
||||||
|
#include "Extruder.hpp"
|
||||||
|
%}
|
||||||
|
|
||||||
|
%name{Slic3r::Extruder} class Extruder {
|
||||||
|
Extruder(int id, PrintConfig *config);
|
||||||
|
|
||||||
|
~Extruder();
|
||||||
|
void reset();
|
||||||
|
double extrude(double dE);
|
||||||
|
|
||||||
|
int id() const
|
||||||
|
%code%{ RETVAL = THIS->id; %};
|
||||||
|
|
||||||
|
|
||||||
|
double E() const
|
||||||
|
%code%{ RETVAL = THIS->E; %};
|
||||||
|
double set_E(double val) const
|
||||||
|
%code%{ RETVAL = THIS->E = val; %};
|
||||||
|
double absolute_E() const
|
||||||
|
%code%{ RETVAL = THIS->absolute_E; %};
|
||||||
|
double set_absolute_E(double val) const
|
||||||
|
%code%{ RETVAL = THIS->absolute_E = val; %};
|
||||||
|
double retracted() const
|
||||||
|
%code%{ RETVAL = THIS->retracted; %};
|
||||||
|
double set_retracted(double val) const
|
||||||
|
%code%{ RETVAL = THIS->retracted = val; %};
|
||||||
|
double restart_extra() const
|
||||||
|
%code%{ RETVAL = THIS->restart_extra; %};
|
||||||
|
double set_restart_extra(double val) const
|
||||||
|
%code%{ RETVAL = THIS->restart_extra = val; %};
|
||||||
|
|
||||||
|
Clone<Pointf> extruder_offset() const;
|
||||||
|
double nozzle_diameter() const;
|
||||||
|
double filament_diameter() const;
|
||||||
|
double extrusion_multiplier() const;
|
||||||
|
int temperature() const;
|
||||||
|
int first_layer_temperature() const;
|
||||||
|
double retract_length() const;
|
||||||
|
double retract_lift() const;
|
||||||
|
int retract_speed() const;
|
||||||
|
double retract_restart_extra() const;
|
||||||
|
double retract_before_travel() const;
|
||||||
|
bool retract_layer_change() const;
|
||||||
|
double retract_length_toolchange() const;
|
||||||
|
double retract_restart_extra_toolchange() const;
|
||||||
|
bool wipe() const;
|
||||||
|
};
|
@ -25,7 +25,7 @@
|
|||||||
bool is_perimeter();
|
bool is_perimeter();
|
||||||
bool is_fill();
|
bool is_fill();
|
||||||
bool is_bridge();
|
bool is_bridge();
|
||||||
std::string gcode(SV* extruder, double e, double F,
|
std::string gcode(Extruder* extruder, double e, double F,
|
||||||
double xofs, double yofs, std::string extrusion_axis,
|
double xofs, double yofs, std::string extrusion_axis,
|
||||||
std::string gcode_line_suffix);
|
std::string gcode_line_suffix);
|
||||||
%{
|
%{
|
||||||
|
@ -56,6 +56,17 @@ Point::coincides_with(point_sv)
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
%name{Slic3r::Pointf} class Pointf {
|
||||||
|
Pointf(double _x = 0, double _y = 0);
|
||||||
|
~Pointf();
|
||||||
|
Clone<Pointf> clone()
|
||||||
|
%code{% RETVAL = THIS; %};
|
||||||
|
double x()
|
||||||
|
%code{% RETVAL = THIS->x; %};
|
||||||
|
double y()
|
||||||
|
%code{% RETVAL = THIS->y; %};
|
||||||
|
};
|
||||||
|
|
||||||
%name{Slic3r::Pointf3} class Pointf3 {
|
%name{Slic3r::Pointf3} class Pointf3 {
|
||||||
Pointf3(double _x = 0, double _y = 0, double _z = 0);
|
Pointf3(double _x = 0, double _y = 0, double _z = 0);
|
||||||
~Pointf3();
|
~Pointf3();
|
||||||
|
@ -25,6 +25,10 @@ Point* O_OBJECT_SLIC3R
|
|||||||
Ref<Point> O_OBJECT_SLIC3R_T
|
Ref<Point> O_OBJECT_SLIC3R_T
|
||||||
Clone<Point> O_OBJECT_SLIC3R_T
|
Clone<Point> O_OBJECT_SLIC3R_T
|
||||||
|
|
||||||
|
Pointf* O_OBJECT_SLIC3R
|
||||||
|
Ref<Pointf> O_OBJECT_SLIC3R_T
|
||||||
|
Clone<Pointf> O_OBJECT_SLIC3R_T
|
||||||
|
|
||||||
Pointf3* O_OBJECT_SLIC3R
|
Pointf3* O_OBJECT_SLIC3R
|
||||||
Ref<Pointf3> O_OBJECT_SLIC3R_T
|
Ref<Pointf3> O_OBJECT_SLIC3R_T
|
||||||
Clone<Pointf3> O_OBJECT_SLIC3R_T
|
Clone<Pointf3> O_OBJECT_SLIC3R_T
|
||||||
@ -77,6 +81,8 @@ Clone<Surface> O_OBJECT_SLIC3R_T
|
|||||||
|
|
||||||
SurfaceCollection* O_OBJECT_SLIC3R
|
SurfaceCollection* O_OBJECT_SLIC3R
|
||||||
|
|
||||||
|
Extruder* O_OBJECT_SLIC3R
|
||||||
|
|
||||||
ExtrusionRole T_UV
|
ExtrusionRole T_UV
|
||||||
FlowRole T_UV
|
FlowRole T_UV
|
||||||
PrintStep T_UV
|
PrintStep T_UV
|
||||||
|
@ -12,6 +12,9 @@
|
|||||||
%typemap{Point*};
|
%typemap{Point*};
|
||||||
%typemap{Ref<Point>}{simple};
|
%typemap{Ref<Point>}{simple};
|
||||||
%typemap{Clone<Point>}{simple};
|
%typemap{Clone<Point>}{simple};
|
||||||
|
%typemap{Pointf*};
|
||||||
|
%typemap{Ref<Pointf>}{simple};
|
||||||
|
%typemap{Clone<Pointf>}{simple};
|
||||||
%typemap{Pointf3*};
|
%typemap{Pointf3*};
|
||||||
%typemap{Ref<Pointf3>}{simple};
|
%typemap{Ref<Pointf3>}{simple};
|
||||||
%typemap{Clone<Pointf3>}{simple};
|
%typemap{Clone<Pointf3>}{simple};
|
||||||
@ -70,6 +73,7 @@
|
|||||||
%typemap{Surfaces};
|
%typemap{Surfaces};
|
||||||
%typemap{Polygons*};
|
%typemap{Polygons*};
|
||||||
%typemap{TriangleMeshPtrs};
|
%typemap{TriangleMeshPtrs};
|
||||||
|
%typemap{Extruder*};
|
||||||
|
|
||||||
%typemap{SurfaceType}{parsed}{
|
%typemap{SurfaceType}{parsed}{
|
||||||
%cpp_type{SurfaceType};
|
%cpp_type{SurfaceType};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user