From 2fcab52f86a40e37d7a9546d31f09a3e92c4a4b6 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 5 Nov 2021 17:19:57 +0100 Subject: [PATCH] Added "Color" parameter for SLA material --- src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 7 +++++ src/slic3r/GUI/3DScene.cpp | 54 +++++++++++++++++++++++------------ src/slic3r/GUI/Plater.cpp | 11 ++++++- src/slic3r/GUI/Tab.cpp | 7 +++++ 5 files changed, 60 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 09cd38468..0487ddaec 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -534,6 +534,7 @@ static std::vector s_Preset_sla_print_options { }; static std::vector s_Preset_sla_material_options { + "material_colour", "material_type", "initial_layer_height", "bottle_cost", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 232e724e7..e165c731f 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3163,6 +3163,13 @@ void PrintConfigDef::init_sla_params() // SLA Material settings. + + def = this->add("material_colour", coStrings); + def->label = L("Color"); + def->tooltip = L("This is only used in the Slic3r interface as a visual help."); + def->gui_type = ConfigOptionDef::GUIType::color; + def->set_default_value(new ConfigOptionStrings{ "#29B2B2" }); + def = this->add("material_type", coString); def->label = L("SLA material type"); def->tooltip = L("SLA material type"); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index ee28fd718..6e7174baf 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1131,29 +1131,45 @@ void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig* con if (config == nullptr) return; - const ConfigOptionStrings* extruders_opt = dynamic_cast(config->option("extruder_colour")); - if (extruders_opt == nullptr) - return; - - const ConfigOptionStrings* filamemts_opt = dynamic_cast(config->option("filament_colour")); - if (filamemts_opt == nullptr) - return; - - unsigned int colors_count = std::max((unsigned int)extruders_opt->values.size(), (unsigned int)filamemts_opt->values.size()); - if (colors_count == 0) - return; - - std::vector colors(colors_count); - unsigned char rgb[3]; - for (unsigned int i = 0; i < colors_count; ++i) { - const std::string& txt_color = config->opt_string("extruder_colour", i); + std::vector colors; + + if (static_cast(config->opt_int("printer_technology")) == ptSLA) + { + const ConfigOptionStrings* resin_clr = dynamic_cast(config->option("material_colour")); + if (resin_clr == nullptr) + return; + assert(resin_clr->values.size() == 1); + colors.resize(1); + + const std::string& txt_color = config->opt_string("material_colour", 0); if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) - colors[i].set(txt_color, rgb); - else { - const std::string& txt_color = config->opt_string("filament_colour", i); + colors[0].set(txt_color, rgb); + } + else + { + const ConfigOptionStrings* extruders_opt = dynamic_cast(config->option("extruder_colour")); + if (extruders_opt == nullptr) + return; + + const ConfigOptionStrings* filamemts_opt = dynamic_cast(config->option("filament_colour")); + if (filamemts_opt == nullptr) + return; + + unsigned int colors_count = std::max((unsigned int)extruders_opt->values.size(), (unsigned int)filamemts_opt->values.size()); + if (colors_count == 0) + return; + colors.resize(colors_count); + + for (unsigned int i = 0; i < colors_count; ++i) { + const std::string& txt_color = config->opt_string("extruder_colour", i); if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) colors[i].set(txt_color, rgb); + else { + const std::string& txt_color = config->opt_string("filament_colour", i); + if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) + colors[i].set(txt_color, rgb); + } } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 2567ca52f..fe8c72fea 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1920,7 +1920,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) "bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance", "brim_width", "brim_separation", "brim_type", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material", "wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", - "extruder_colour", "filament_colour", "max_print_height", "printer_model", "printer_technology", + "extruder_colour", "filament_colour", "material_colour", "max_print_height", "printer_model", "printer_technology", // These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor. "layer_height", "first_layer_height", "min_layer_height", "max_layer_height", "brim_width", "perimeters", "perimeter_extruder", "fill_density", "infill_extruder", "top_solid_layers", @@ -6222,6 +6222,15 @@ void Plater::on_config_change(const DynamicPrintConfig &config) } } + if (opt_key == "material_colour") { + update_scheduled = true; // update should be scheduled (for update 3DScene) + + // update material color in full config + std::vector material_colors = { config.opt_string("material_colour", (unsigned)0) }; + p->config->option("material_colour")->values = material_colors; + continue; + } + p->config->set_key_value(opt_key, config.option(opt_key)->clone()); if (opt_key == "printer_technology") { this->set_printer_technology(config.opt_enum(opt_key)); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 1a96f4baf..4880a3b7a 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -4157,6 +4157,7 @@ void TabSLAMaterial::build() auto page = add_options_page(L("Material"), "resin"); auto optgroup = page->new_optgroup(L("Material")); + optgroup->append_single_option_line("material_colour"); optgroup->append_single_option_line("bottle_cost"); optgroup->append_single_option_line("bottle_volume"); optgroup->append_single_option_line("bottle_weight"); @@ -4164,6 +4165,12 @@ void TabSLAMaterial::build() optgroup->m_on_change = [this, optgroup](t_config_option_key opt_key, boost::any value) { + if (opt_key == "material_colour") { + update_dirty(); + on_value_change(opt_key, value); + return; + } + DynamicPrintConfig new_conf = *m_config; if (opt_key == "bottle_volume") {