diff options
author | bubnikv <bubnikv@gmail.com> | 2018-01-04 17:38:06 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2018-01-04 17:38:06 +0300 |
commit | 696d420dc8017422b4a7b5b1c3c1b34f408c887d (patch) | |
tree | 4eab40fd363c10f1de5fc4f397d92527bee0a416 /xs | |
parent | 011281df86212cb2adf84f9229a78d31617d250d (diff) |
New feature: Recommended object thin wall thickness hint.
Diffstat (limited to 'xs')
-rw-r--r-- | xs/src/libslic3r/Config.hpp | 2 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/PresetHints.cpp | 38 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/PresetHints.hpp | 5 | ||||
-rw-r--r-- | xs/xsp/GUI_Preset.xsp | 2 |
4 files changed, 47 insertions, 0 deletions
diff --git a/xs/src/libslic3r/Config.hpp b/xs/src/libslic3r/Config.hpp index c203f3be2..e04f4df82 100644 --- a/xs/src/libslic3r/Config.hpp +++ b/xs/src/libslic3r/Config.hpp @@ -1161,6 +1161,8 @@ public: const ConfigDef* def() const override { return nullptr; }; template<class T> T* opt(const t_config_option_key &opt_key, bool create = false) { 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. 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. diff --git a/xs/src/slic3r/GUI/PresetHints.cpp b/xs/src/slic3r/GUI/PresetHints.cpp index 8e23a5c49..36f574329 100644 --- a/xs/src/slic3r/GUI/PresetHints.cpp +++ b/xs/src/slic3r/GUI/PresetHints.cpp @@ -228,4 +228,42 @@ std::string PresetHints::maximum_volumetric_flow_description(const PresetBundle 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 diff --git a/xs/src/slic3r/GUI/PresetHints.hpp b/xs/src/slic3r/GUI/PresetHints.hpp index 589cc2f98..39bf0b100 100644 --- a/xs/src/slic3r/GUI/PresetHints.hpp +++ b/xs/src/slic3r/GUI/PresetHints.hpp @@ -13,11 +13,16 @@ class PresetHints public: // Produce a textual description of the cooling logic of a currently active filament. static std::string cooling_description(const Preset &preset); + // Produce a textual description of the maximum flow achived for the current configuration // (the current printer, filament and print settigns). // This description will be useful for getting a gut feeling for the maximum volumetric // print speed achievable with the extruder. 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 diff --git a/xs/xsp/GUI_Preset.xsp b/xs/xsp/GUI_Preset.xsp index 0e6b1504b..67e1d5fc6 100644 --- a/xs/xsp/GUI_Preset.xsp +++ b/xs/xsp/GUI_Preset.xsp @@ -184,4 +184,6 @@ PresetCollection::arrayref() %code%{ RETVAL = PresetHints::cooling_description(*preset); %}; static std::string maximum_volumetric_flow_description(PresetBundle *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); %}; }; |