mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-15 10:47:50 -06:00
New feature: Recommended object thin wall thickness hint.
This commit is contained in:
parent
011281df86
commit
696d420dc8
5 changed files with 67 additions and 0 deletions
|
@ -586,6 +586,15 @@ sub build {
|
||||||
my $optgroup = $page->new_optgroup('Vertical shells');
|
my $optgroup = $page->new_optgroup('Vertical shells');
|
||||||
$optgroup->append_single_option_line('perimeters');
|
$optgroup->append_single_option_line('perimeters');
|
||||||
$optgroup->append_single_option_line('spiral_vase');
|
$optgroup->append_single_option_line('spiral_vase');
|
||||||
|
my $line = Slic3r::GUI::OptionsGroup::Line->new(
|
||||||
|
label => '',
|
||||||
|
full_width => 1,
|
||||||
|
widget => sub {
|
||||||
|
my ($parent) = @_;
|
||||||
|
return $self->{recommended_thin_wall_thickness_description_line} = Slic3r::GUI::OptionsGroup::StaticText->new($parent);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
$optgroup->append_line($line);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
my $optgroup = $page->new_optgroup('Horizontal shells');
|
my $optgroup = $page->new_optgroup('Horizontal shells');
|
||||||
|
@ -1055,9 +1064,20 @@ sub _update {
|
||||||
$self->get_field($_)->toggle($have_wipe_tower)
|
$self->get_field($_)->toggle($have_wipe_tower)
|
||||||
for qw(wipe_tower_x wipe_tower_y wipe_tower_width wipe_tower_per_color_wipe);
|
for qw(wipe_tower_x wipe_tower_y wipe_tower_width wipe_tower_per_color_wipe);
|
||||||
|
|
||||||
|
$self->{recommended_thin_wall_thickness_description_line}->SetText(
|
||||||
|
Slic3r::GUI::PresetHints::recommended_thin_wall_thickness(wxTheApp->{preset_bundle}));
|
||||||
|
|
||||||
$self->Thaw;
|
$self->Thaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Update on activation to recalculate the estimates if the nozzle diameter changed
|
||||||
|
# and the extrusion width values were left to zero (automatic, nozzle dependent).
|
||||||
|
sub OnActivate {
|
||||||
|
my ($self) = @_;
|
||||||
|
$self->{recommended_thin_wall_thickness_description_line}->SetText(
|
||||||
|
Slic3r::GUI::PresetHints::recommended_thin_wall_thickness(wxTheApp->{preset_bundle}));
|
||||||
|
}
|
||||||
|
|
||||||
package Slic3r::GUI::Tab::Filament;
|
package Slic3r::GUI::Tab::Filament;
|
||||||
use base 'Slic3r::GUI::Tab';
|
use base 'Slic3r::GUI::Tab';
|
||||||
use Wx qw(wxTheApp);
|
use Wx qw(wxTheApp);
|
||||||
|
|
|
@ -1161,6 +1161,8 @@ public:
|
||||||
const ConfigDef* def() const override { return nullptr; };
|
const ConfigDef* def() const override { return nullptr; };
|
||||||
template<class T> T* opt(const t_config_option_key &opt_key, bool create = false)
|
template<class T> T* opt(const t_config_option_key &opt_key, bool create = false)
|
||||||
{ return dynamic_cast<T*>(this->option(opt_key, create)); }
|
{ return dynamic_cast<T*>(this->option(opt_key, create)); }
|
||||||
|
template<class T> const T* opt(const t_config_option_key &opt_key) const
|
||||||
|
{ return dynamic_cast<const T*>(this->option(opt_key)); }
|
||||||
// Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name.
|
// Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name.
|
||||||
ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) override;
|
ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) override;
|
||||||
// Overrides ConfigBase::keys(). Collect names of all configuration values maintained by this configuration store.
|
// Overrides ConfigBase::keys(). Collect names of all configuration values maintained by this configuration store.
|
||||||
|
|
|
@ -228,4 +228,42 @@ std::string PresetHints::maximum_volumetric_flow_description(const PresetBundle
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle &preset_bundle)
|
||||||
|
{
|
||||||
|
const DynamicPrintConfig &print_config = preset_bundle.prints .get_edited_preset().config;
|
||||||
|
const DynamicPrintConfig &printer_config = preset_bundle.printers .get_edited_preset().config;
|
||||||
|
|
||||||
|
float layer_height = float(print_config.opt_float("layer_height"));
|
||||||
|
int num_perimeters = print_config.opt_int("perimeters");
|
||||||
|
bool thin_walls = print_config.opt_bool("thin_walls");
|
||||||
|
float nozzle_diameter = float(printer_config.opt_float("nozzle_diameter", 0));
|
||||||
|
|
||||||
|
Flow external_perimeter_flow = Flow::new_from_config_width(
|
||||||
|
frExternalPerimeter,
|
||||||
|
*print_config.opt<ConfigOptionFloatOrPercent>("external_perimeter_extrusion_width"),
|
||||||
|
nozzle_diameter, layer_height, false);
|
||||||
|
Flow perimeter_flow = Flow::new_from_config_width(
|
||||||
|
frPerimeter,
|
||||||
|
*print_config.opt<ConfigOptionFloatOrPercent>("perimeter_extrusion_width"),
|
||||||
|
nozzle_diameter, layer_height, false);
|
||||||
|
|
||||||
|
std::string out;
|
||||||
|
if (num_perimeters > 0) {
|
||||||
|
int num_lines = std::min(num_perimeters * 2, 10);
|
||||||
|
char buf[256];
|
||||||
|
sprintf(buf, "Recommended object thin wall thickness for layer height %.2f and ", layer_height);
|
||||||
|
out += buf;
|
||||||
|
// Start with the width of two closely spaced
|
||||||
|
double width = external_perimeter_flow.width + external_perimeter_flow.spacing();
|
||||||
|
for (int i = 2; i <= num_lines; thin_walls ? ++ i : i += 2) {
|
||||||
|
if (i > 2)
|
||||||
|
out += ", ";
|
||||||
|
sprintf(buf, "%d lines: %.2lf mm", i, width);
|
||||||
|
out += buf;
|
||||||
|
width += perimeter_flow.spacing() * (thin_walls ? 1.f : 2.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
}; // namespace Slic3r
|
}; // namespace Slic3r
|
||||||
|
|
|
@ -13,11 +13,16 @@ class PresetHints
|
||||||
public:
|
public:
|
||||||
// Produce a textual description of the cooling logic of a currently active filament.
|
// Produce a textual description of the cooling logic of a currently active filament.
|
||||||
static std::string cooling_description(const Preset &preset);
|
static std::string cooling_description(const Preset &preset);
|
||||||
|
|
||||||
// Produce a textual description of the maximum flow achived for the current configuration
|
// Produce a textual description of the maximum flow achived for the current configuration
|
||||||
// (the current printer, filament and print settigns).
|
// (the current printer, filament and print settigns).
|
||||||
// This description will be useful for getting a gut feeling for the maximum volumetric
|
// This description will be useful for getting a gut feeling for the maximum volumetric
|
||||||
// print speed achievable with the extruder.
|
// print speed achievable with the extruder.
|
||||||
static std::string maximum_volumetric_flow_description(const PresetBundle &preset_bundle);
|
static std::string maximum_volumetric_flow_description(const PresetBundle &preset_bundle);
|
||||||
|
|
||||||
|
// Produce a textual description of a recommended thin wall thickness
|
||||||
|
// from the provided number of perimeters and the external / internal perimeter width.
|
||||||
|
static std::string recommended_thin_wall_thickness(const PresetBundle &preset_bundle);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Slic3r
|
} // namespace Slic3r
|
||||||
|
|
|
@ -184,4 +184,6 @@ PresetCollection::arrayref()
|
||||||
%code%{ RETVAL = PresetHints::cooling_description(*preset); %};
|
%code%{ RETVAL = PresetHints::cooling_description(*preset); %};
|
||||||
static std::string maximum_volumetric_flow_description(PresetBundle *preset)
|
static std::string maximum_volumetric_flow_description(PresetBundle *preset)
|
||||||
%code%{ RETVAL = PresetHints::maximum_volumetric_flow_description(*preset); %};
|
%code%{ RETVAL = PresetHints::maximum_volumetric_flow_description(*preset); %};
|
||||||
|
static std::string recommended_thin_wall_thickness(PresetBundle *preset)
|
||||||
|
%code%{ RETVAL = PresetHints::recommended_thin_wall_thickness(*preset); %};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue