From 0883d0f4ebc56425280868ba2d77c09657c13907 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Wed, 1 Jan 2014 17:29:15 +0100 Subject: [PATCH] More work here and there --- lib/Slic3r/Print.pm | 35 +++++++++++++++++++------------ lib/Slic3r/Print/Object.pm | 10 +-------- lib/Slic3r/Print/Region.pm | 2 +- xs/src/Config.cpp | 22 +++++++++++++++++++ xs/src/Config.hpp | 1 + xs/src/PrintConfig.hpp | 4 ++-- xs/xsp/Config.xsp | 43 +++++++++++++++++++++++++++++++------- 7 files changed, 85 insertions(+), 32 deletions(-) diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index 98060342be..4c9b9d79e9 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -12,13 +12,14 @@ use Slic3r::Geometry::Clipper qw(diff_ex union_ex union_pt intersection_ex inter offset2 union union_pt_chained JT_ROUND JT_SQUARE); use Slic3r::Print::State ':steps'; -has 'config' => (is => 'rw', default => sub { Slic3r::Config->new_from_defaults }, trigger => \&init_config); +has 'config' => (is => 'rw', default => sub { Slic3r::Config::Print->new }, trigger => \&init_config); +has 'default_object_config' => (is => 'rw', default => sub { Slic3r::Config::PrintObject->new }); +has 'default_region_config' => (is => 'rw', default => sub { Slic3r::Config::PrintRegion->new }); has 'extra_variables' => (is => 'rw', default => sub {{}}); has 'objects' => (is => 'rw', default => sub {[]}); has 'status_cb' => (is => 'rw'); has 'extruders' => (is => 'rw', default => sub {[]}); has 'regions' => (is => 'rw', default => sub {[]}); -has 'has_support_material' => (is => 'lazy'); has '_state' => (is => 'ro', default => sub { Slic3r::Print::State->new }); # ordered collection of extrusion paths to build skirt loops @@ -70,11 +71,12 @@ sub apply_config { my ($self, $config) = @_; $self->config->apply($config); + $self->default_object_config->apply($config); + $self->default_region_config->apply($config); $self->init_config; - $_->init_config for @{$self->objects}; } -sub _build_has_support_material { +sub has_support_material { my $self = shift; return (first { $_->config->support_material } @{$self->objects}) || (first { $_->config->raft_layers > 0 } @{$self->objects}) @@ -91,13 +93,15 @@ sub add_model_object { foreach my $volume_id (0..$#{$object->volumes}) { my $volume = $object->volumes->[$volume_id]; - # get the config applied to this volume - my $config; + # get the config applied to this volume: start from our global defaults + my $config = Slic3r::Config::RegionConfig->new; + $config->apply($self->default_region_config); + + # override the defaults with per-object config and then with per-material config + $config->apply($object->config); if (defined $volume->material_id) { - my $config = $object->model->materials->{ $volume->material_id }->config; - } else { - $config = Slic3r::Config->new; - $config->set('extruder', 0); + my $material_config = $object->model->materials->{ $volume->material_id }->config; + $config->apply($material_config); } # find an existing print region with the same config @@ -112,10 +116,10 @@ sub add_model_object { # if no region exists with the same config, create a new one if (!defined $region_id) { - push @{$self->regions}, Slic3r::Print::Region->new( + push @{$self->regions}, my $r = Slic3r::Print::Region->new( print => $self, - config => $config->clone, ); + $r->config->apply($config); $region_id = $#{$self->regions}; } @@ -130,9 +134,14 @@ sub add_model_object { model_object => $object, region_volumes => [ map $volumes{$_}, 0..$#{$self->regions} ], copies => [ map Slic3r::Point->new_scale(@{ $_->offset }), @{ $object->instances } ], - config_overrides => $object->config, layer_height_ranges => $object->layer_height_ranges, ); + + # apply config to print object + $o->config->apply($self->default_object_config); + $o->config->apply($object->config); + + # store print object at the given position if (defined $obj_idx) { splice @{$self->objects}, $obj_idx, 0, $o; } else { diff --git a/lib/Slic3r/Print/Object.pm b/lib/Slic3r/Print/Object.pm index b1ef32fadc..2e9f3dfe0a 100644 --- a/lib/Slic3r/Print/Object.pm +++ b/lib/Slic3r/Print/Object.pm @@ -13,8 +13,7 @@ has 'print' => (is => 'ro', weak_ref => 1, required => 1); has 'model_object' => (is => 'ro', required => 1); has 'region_volumes' => (is => 'rw', default => sub { [] }); # by region_id has 'copies' => (is => 'ro'); # Slic3r::Point objects in scaled G-code coordinates -has 'config_overrides' => (is => 'rw', default => sub { Slic3r::Config->new }); -has 'config' => (is => 'rw'); +has 'config' => (is => 'rw', required => 1); # Slic3r::Config::PrintObject has 'layer_height_ranges' => (is => 'rw', default => sub { [] }); # [ z_min, z_max, layer_height ] has 'size' => (is => 'rw'); # XYZ in scaled coordinates @@ -28,8 +27,6 @@ has '_state' => (is => 'ro', default => sub { Slic3r::Print::State->n sub BUILD { my $self = shift; - $self->init_config; - # translate meshes so that we work with smaller coordinates { # compute the bounding box of the supplied meshes @@ -97,11 +94,6 @@ sub delete_all_copies { $self->_trigger_copies; } -sub init_config { - my $self = shift; - $self->config(Slic3r::Config->merge($self->print->config, $self->config_overrides)); -} - sub layer_count { my $self = shift; return scalar @{ $self->layers }; diff --git a/lib/Slic3r/Print/Region.pm b/lib/Slic3r/Print/Region.pm index 559fce3c5b..2b5d445de9 100644 --- a/lib/Slic3r/Print/Region.pm +++ b/lib/Slic3r/Print/Region.pm @@ -8,7 +8,7 @@ use Slic3r::Flow ':roles'; # sharing the same config (including the same assigned extruder(s)) has 'print' => (is => 'ro', required => 1, weak_ref => 1); -has 'config' => (is => 'ro', required => 1); +has 'config' => (is => 'ro', required => 1); # Slic3r::Config::RegionConfig sub flow { my ($self, $role, $layer_height, $bridge, $first_layer, $width) = @_; diff --git a/xs/src/Config.cpp b/xs/src/Config.cpp index 828795c0c9..58c9343e21 100644 --- a/xs/src/Config.cpp +++ b/xs/src/Config.cpp @@ -35,6 +35,14 @@ ConfigBase::serialize(const t_config_option_key opt_key) { void ConfigBase::set_deserialize(const t_config_option_key opt_key, std::string str) { + if (this->def->count(opt_key) == 0) throw "Calling set_deserialize() on unknown option"; + ConfigOptionDef* optdef = &(*this->def)[opt_key]; + if (!optdef->shortcut.empty()) { + for (std::vector::iterator it = optdef->shortcut.begin(); it != optdef->shortcut.end(); ++it) + this->set_deserialize(*it, str); + return; + } + ConfigOption* opt = this->option(opt_key, true); assert(opt != NULL); opt->deserialize(str); @@ -61,6 +69,20 @@ ConfigBase::get_abs_value(const t_config_option_key opt_key) { } } +double +ConfigBase::get_abs_value(const t_config_option_key opt_key, double ratio_over) { + // get stored option value + ConfigOptionFloatOrPercent* opt = dynamic_cast(this->option(opt_key)); + assert(opt != NULL); + + // compute absolute value + if (opt->percent) { + return ratio_over * opt->value / 100; + } else { + return opt->value; + } +} + #ifdef SLIC3RXS SV* ConfigBase::as_hash() { diff --git a/xs/src/Config.hpp b/xs/src/Config.hpp index e222651c8e..9b9a7bf957 100644 --- a/xs/src/Config.hpp +++ b/xs/src/Config.hpp @@ -393,6 +393,7 @@ class ConfigBase std::string serialize(const t_config_option_key opt_key); void set_deserialize(const t_config_option_key opt_key, std::string str); double get_abs_value(const t_config_option_key opt_key); + double get_abs_value(const t_config_option_key opt_key, double ratio_over); #ifdef SLIC3RXS SV* as_hash(); diff --git a/xs/src/PrintConfig.hpp b/xs/src/PrintConfig.hpp index 38eb09ba13..0c96782061 100644 --- a/xs/src/PrintConfig.hpp +++ b/xs/src/PrintConfig.hpp @@ -986,7 +986,7 @@ class PrintRegionConfig : public virtual StaticConfig ConfigOptionFloatOrPercent top_infill_extrusion_width; ConfigOptionInt top_solid_layers; - PrintObjectConfig() { + PrintRegionConfig() { this->def = &PrintConfigDef::def; this->bottom_solid_layers.value = 3; @@ -1135,7 +1135,7 @@ class PrintConfig : public virtual StaticConfig ConfigOptionFloat z_offset; PrintConfig() { - this->def = &PrintConfig::PrintConfigDef; + this->def = &PrintConfigDef::def; this->avoid_crossing_perimeters.value = false; this->bed_size.point = Pointf(200,200); diff --git a/xs/xsp/Config.xsp b/xs/xsp/Config.xsp index 3f053061d9..80b00c116d 100644 --- a/xs/xsp/Config.xsp +++ b/xs/xsp/Config.xsp @@ -15,15 +15,13 @@ void set_deserialize(t_config_option_key opt_key, std::string str); std::string serialize(t_config_option_key opt_key); double get_abs_value(t_config_option_key opt_key); + double get_abs_value(t_config_option_key opt_key, double ratio_over); void apply(DynamicPrintConfig* other) %code{% THIS->apply(*other, true); %}; void apply_static(PrintConfig* other) %code{% THIS->apply(*other, true); %}; std::vector get_keys() %code{% THIS->keys(&RETVAL); %}; -%{ - -%} }; %name{Slic3r::Config::Print} class PrintConfig { @@ -36,13 +34,45 @@ void set_deserialize(t_config_option_key opt_key, std::string str); std::string serialize(t_config_option_key opt_key); double get_abs_value(t_config_option_key opt_key); + double get_abs_value(t_config_option_key opt_key, double ratio_over); void apply_dynamic(DynamicPrintConfig* other) %code{% THIS->apply(*other, true); %}; std::vector get_keys() %code{% THIS->keys(&RETVAL); %}; -%{ +}; -%} +%name{Slic3r::Config::Print} class PrintConfig { + PrintConfig(); + ~PrintConfig(); + bool has(t_config_option_key opt_key); + SV* as_hash(); + SV* get(t_config_option_key opt_key); + void set(t_config_option_key opt_key, SV* value); + void set_deserialize(t_config_option_key opt_key, std::string str); + std::string serialize(t_config_option_key opt_key); + double get_abs_value(t_config_option_key opt_key); + double get_abs_value(t_config_option_key opt_key, double ratio_over); + void apply_dynamic(DynamicPrintConfig* other) + %code{% THIS->apply(*other, true); %}; + std::vector get_keys() + %code{% THIS->keys(&RETVAL); %}; +}; + +%name{Slic3r::Config::Print} class PrintConfig { + PrintConfig(); + ~PrintConfig(); + bool has(t_config_option_key opt_key); + SV* as_hash(); + SV* get(t_config_option_key opt_key); + void set(t_config_option_key opt_key, SV* value); + void set_deserialize(t_config_option_key opt_key, std::string str); + std::string serialize(t_config_option_key opt_key); + double get_abs_value(t_config_option_key opt_key); + double get_abs_value(t_config_option_key opt_key, double ratio_over); + void apply_dynamic(DynamicPrintConfig* other) + %code{% THIS->apply(*other, true); %}; + std::vector get_keys() + %code{% THIS->keys(&RETVAL); %}; }; %package{Slic3r::Config}; @@ -53,8 +83,7 @@ PROTOTYPES: DISABLE SV* print_config_def() CODE: - PrintConfig config; - t_optiondef_map* def = config.def; + t_optiondef_map* def = &PrintConfigDef::def; HV* options_hv = newHV(); for (t_optiondef_map::iterator oit = def->begin(); oit != def->end(); ++oit) {