From c6b5fe05e49e4249adc45d130cc8858688331882 Mon Sep 17 00:00:00 2001 From: tamasmeszaros <meszaros.q@gmail.com> Date: Wed, 3 Apr 2019 17:34:46 +0200 Subject: [PATCH] Scaling correction parameters in material and print conf. Scaling is applied in sla_trafo but no effect unless set before model import. --- src/libslic3r/PrintConfig.cpp | 13 ++++------- src/libslic3r/PrintConfig.hpp | 6 ++--- src/libslic3r/SLAPrint.cpp | 41 +++++++++++++++++++++++++---------- src/slic3r/GUI/Preset.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 2 +- 5 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 630dbfb5f..210c26f83 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2296,16 +2296,11 @@ void PrintConfigDef::init_sla_params() def->min = 0; def->default_value = new ConfigOptionFloat(15); - def = this->add("material_correction_printing", coFloats); - def->full_label = L("Correction for expansion when printing"); - def->tooltip = L("Correction for expansion when printing"); - def->min = 0; - def->default_value = new ConfigOptionFloats( { 1. , 1., 1. } ); - - def = this->add("material_correction_curing", coFloats); - def->full_label = L("Correction for expansion after curing"); - def->tooltip = L("Correction for expansion after curing"); + def = this->add("material_correction", coFloats); + def->full_label = L("Correction for expansion"); + def->tooltip = L("Correction for expansion"); def->min = 0; + def->mode = comExpert; def->default_value = new ConfigOptionFloats( { 1. , 1., 1. } ); def = this->add("material_notes", coString); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index c5585326b..14b6087de 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1056,16 +1056,14 @@ public: ConfigOptionFloat initial_layer_height; ConfigOptionFloat exposure_time; ConfigOptionFloat initial_exposure_time; - ConfigOptionFloats material_correction_printing; - ConfigOptionFloats material_correction_curing; + ConfigOptionFloats material_correction; protected: void initialize(StaticCacheBase &cache, const char *base_ptr) { OPT_PTR(initial_layer_height); OPT_PTR(exposure_time); OPT_PTR(initial_exposure_time); - OPT_PTR(material_correction_printing); - OPT_PTR(material_correction_curing); + OPT_PTR(material_correction); } }; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 809b32d90..6744b4503 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -85,17 +85,33 @@ void SLAPrint::clear() } // Transformation without rotation around Z and without a shift by X and Y. -static Transform3d sla_trafo(const ModelObject &model_object) +static Transform3d sla_trafo(const ModelObject &model_object, const SLAPrinterConfig& pconf, const SLAMaterialConfig& mconf) { + + Vec3d corr(1., 1., 1.); + + if(pconf.printer_correction.values.size() == 3) { + corr(X) = pconf.printer_correction.values[X]; + corr(Y) = pconf.printer_correction.values[Y]; + corr(Z) = pconf.printer_correction.values[Z]; + } + + if(mconf.material_correction.values.size() == 3) { + corr(X) *= mconf.material_correction.values[X]; + corr(Y) *= mconf.material_correction.values[Y]; + corr(Z) *= mconf.material_correction.values[Z]; + } + ModelInstance &model_instance = *model_object.instances.front(); Vec3d offset = model_instance.get_offset(); Vec3d rotation = model_instance.get_rotation(); offset(0) = 0.; offset(1) = 0.; rotation(2) = 0.; - Transform3d trafo = Geometry::assemble_transform(offset, rotation, model_instance.get_scaling_factor(), model_instance.get_mirror()); - if (model_instance.is_left_handed()) - trafo = Eigen::Scaling(Vec3d(-1., 1., 1.)) * trafo; + Transform3d trafo = Geometry::assemble_transform(offset, rotation, model_instance.get_scaling_factor().cwiseProduct(corr), model_instance.get_mirror()); + if (model_instance.is_left_handed()) + trafo = Eigen::Scaling(Vec3d(-1., 1., 1.)) * trafo; + return trafo; } @@ -320,7 +336,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf bool sla_trafo_differs = model_object.instances.empty() != model_object_new.instances.empty() || (! model_object.instances.empty() && - (! sla_trafo(model_object).isApprox(sla_trafo(model_object_new)) || + (! sla_trafo(model_object, m_printer_config, m_material_config).isApprox(sla_trafo(model_object_new, m_printer_config, m_material_config)) || model_object.instances.front()->is_left_handed() != model_object_new.instances.front()->is_left_handed())); if (model_parts_differ || sla_trafo_differs) { // The very first step (the slicing step) is invalidated. One may freely remove all associated PrintObjects. @@ -405,7 +421,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf // FIXME: this invalidates the transformed mesh in SLAPrintObject // which is expensive to calculate (especially the raw_mesh() call) - print_object->set_trafo(sla_trafo(model_object), model_object.instances.front()->is_left_handed()); + print_object->set_trafo(sla_trafo(model_object, m_printer_config, m_material_config), model_object.instances.front()->is_left_handed()); print_object->set_instances(std::move(new_instances)); print_object->config_apply(config, true); @@ -1423,19 +1439,22 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector<t_config_opt if (opt_keys.empty()) return false; + static std::unordered_set<std::string> steps_full = { + "initial_layer_height", + "material_correction", + "printer_correction" + }; + // Cache the plenty of parameters, which influence the final rasterization only, // or they are only notes not influencing the rasterization step. static std::unordered_set<std::string> steps_rasterize = { "exposure_time", "initial_exposure_time", - "material_correction_printing", - "material_correction_curing", "display_width", "display_height", "display_pixels_x", "display_pixels_y", - "display_orientation", - "printer_correction" + "display_orientation" }; static std::unordered_set<std::string> steps_ignore = { @@ -1459,7 +1478,7 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector<t_config_opt steps.emplace_back(slapsMergeSlicesAndEval); } else if (steps_ignore.find(opt_key) != steps_ignore.end()) { // These steps have no influence on the output. Just ignore them. - } else if (opt_key == "initial_layer_height") { + } else if (steps_full.find(opt_key) != steps_full.end()) { steps.emplace_back(slapsMergeSlicesAndEval); osteps.emplace_back(slaposObjectSlice); } else { diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 82223b15c..74e40c15f 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -485,7 +485,7 @@ const std::vector<std::string>& Preset::sla_material_options() s_opts = { "initial_layer_height", "exposure_time", "initial_exposure_time", - "material_correction_printing", "material_correction_curing", + "material_correction", "material_notes", "default_sla_material_profile", "compatible_prints", "compatible_prints_condition", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 631050f29..5fb0a9558 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3233,7 +3233,7 @@ void TabSLAMaterial::build() optgroup = page->new_optgroup(_(L("Corrections"))); optgroup->label_width = 19 * m_em_unit;//190; - std::vector<std::string> corrections = { "material_correction_printing", "material_correction_curing" }; + std::vector<std::string> corrections = {"material_correction"}; std::vector<std::string> axes{ "X", "Y", "Z" }; for (auto& opt_key : corrections) { auto line = Line{ m_config->def()->get(opt_key)->full_label, "" };