From e768b990a88b394d2cb3e163c3f870765fbb46c5 Mon Sep 17 00:00:00 2001 From: Wang YB <94800665+Gradbb@users.noreply.github.com> Date: Fri, 3 May 2024 15:14:02 +0800 Subject: [PATCH] add ironing_pattern "Concentric" --- src/libslic3r/Fill/Fill.cpp | 52 +++++++++++++++++++++------ src/libslic3r/Preset.cpp | 2 ++ src/libslic3r/PrintConfig.cpp | 12 +++++++ src/libslic3r/PrintConfig.hpp | 2 ++ src/slic3r/GUI/ConfigManipulation.cpp | 3 +- src/slic3r/GUI/Tab.cpp | 2 ++ 6 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index ed4d722..44a698f 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -991,6 +991,8 @@ void Layer::make_ironing() // First classify regions based on the extruder used. struct IroningParams { + //w33 + InfillPattern pattern; int extruder = -1; bool just_infill = false; // Spacing of the ironing lines, also to calculate the extrusion flow from. @@ -1031,7 +1033,9 @@ void Layer::make_ironing() bool operator==(const IroningParams &rhs) const { return this->extruder == rhs.extruder && this->just_infill == rhs.just_infill && this->line_spacing == rhs.line_spacing && this->height == rhs.height && this->speed == rhs.speed && - this->angle == rhs.angle; + this->angle == rhs.angle + //w33 + && this->pattern == rhs.pattern; } LayerRegion *layerm; @@ -1081,27 +1085,46 @@ void Layer::make_ironing() ironing_params.angle = config.fill_angle * M_PI / 180.; ironing_params.layerm = layerm; ironing_params.region_id = region_id; + //w33 + ironing_params.pattern = config.ironing_pattern; by_extruder.emplace_back(ironing_params); } } std::sort(by_extruder.begin(), by_extruder.end()); - FillRectilinear fill; + //w33 + //FillRectilinear fill; FillParams fill_params; - fill.set_bounding_box(this->object()->bounding_box()); + //fill.set_bounding_box(this->object()->bounding_box()); // Layer ID is used for orienting the infill in alternating directions. // Layer::id() returns layer ID including raft layers, subtract them to make the infill direction independent // from raft. //FIXME ironing does not take fill angle into account. Shall it? Does it matter? - fill.layer_id = this->id() - this->object()->get_layer(0)->id(); - fill.z = this->print_z; - fill.overlap = 0; + //fill.layer_id = this->id() - this->object()->get_layer(0)->id(); + //fill.z = this->print_z; + //fill.overlap = 0; fill_params.density = 1.; fill_params.monotonic = true; + InfillPattern f_pattern = ipRectilinear; + std::unique_ptr f = std::unique_ptr(Fill::new_from_type(f_pattern)); + f->set_bounding_box(this->object()->bounding_box()); + f->layer_id = this->id(); + f->z = this->print_z; + f->overlap = 0; for (size_t i = 0; i < by_extruder.size();) { // Find span of regions equivalent to the ironing operation. IroningParams &ironing_params = by_extruder[i]; + //w33 + if (f_pattern != ironing_params.pattern) { + f_pattern = ironing_params.pattern; + f = std::unique_ptr(Fill::new_from_type(f_pattern)); + f->set_bounding_box(this->object()->bounding_box()); + f->layer_id = this->id(); + f->z = this->print_z; + f->overlap = 0; + } + size_t j = i; for (++ j; j < by_extruder.size() && ironing_params == by_extruder[j]; ++ j) ; @@ -1163,10 +1186,15 @@ void Layer::make_ironing() } // Create the filler object. - fill.spacing = ironing_params.line_spacing; - fill.angle = float(ironing_params.angle + 0.25 * M_PI); - fill.link_max_length = (coord_t)scale_(3. * fill.spacing); - double extrusion_height = ironing_params.height * fill.spacing / nozzle_dmr; + //w33 + //fill.spacing = ironing_params.line_spacing; + //fill.angle = float(ironing_params.angle + 0.25 * M_PI); + //fill.link_max_length = (coord_t)scale_(3. * fill.spacing); + //double extrusion_height = ironing_params.height * fill.spacing / nozzle_dmr; + f->spacing = ironing_params.line_spacing; + f->angle = float(ironing_params.angle + 0.25 * M_PI); + f->link_max_length = (coord_t) scale_(3. * f->spacing); + double extrusion_height = ironing_params.height * f->spacing / nozzle_dmr; float extrusion_width = Flow::rounded_rectangle_extrusion_width_from_spacing(float(nozzle_dmr), float(extrusion_height)); double flow_mm3_per_mm = nozzle_dmr * extrusion_height; Surface surface_fill(stTop, ExPolygon()); @@ -1175,7 +1203,9 @@ void Layer::make_ironing() Polylines polylines; try { assert(!fill_params.use_arachne); - polylines = fill.fill_surface(&surface_fill, fill_params); + //w33 + //polylines = fill.fill_surface(&surface_fill, fill_params); + polylines = f->fill_surface(&surface_fill, fill_params); } catch (InfillFailedException &) { } if (! polylines.empty()) { diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 0722f74..3a3f68d 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -495,6 +495,8 @@ static std::vector s_Preset_print_options { ,"top_solid_infill_flow_ratio", "bottom_solid_infill_flow_ratio" //w31 ,"make_overhang_printable", "make_overhang_printable_angle", "make_overhang_printable_hole_size" + //w33 + ,"ironing_pattern" }; static std::vector s_Preset_filament_options { diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 5d4ef16..4d9d5b4 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1898,6 +1898,18 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(IroningType::TopSurfaces)); + //w33 + def = this->add("ironing_pattern", coEnum); + def->label = L("Ironing Pattern"); + def->category = L("Ironing"); + def->tooltip = L("Ironing Type"); + def->set_enum({ + { "concentric", L("Concentric") }, + { "zig-za", L("Rectilinear") } + }); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionEnum(ipRectilinear)); + def = this->add("ironing_flowrate", coPercent); def->label = L("Flow rate"); def->category = L("Ironing"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index a8062df..bf67578 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -650,6 +650,8 @@ PRINT_CONFIG_CLASS_DEFINE( // Ironing options ((ConfigOptionBool, ironing)) ((ConfigOptionEnum, ironing_type)) + //w33 + ((ConfigOptionEnum, ironing_pattern)) ((ConfigOptionPercent, ironing_flowrate)) ((ConfigOptionFloat, ironing_spacing)) ((ConfigOptionFloat, ironing_speed)) diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 6325013..50f74f5 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -342,7 +342,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field(el, have_raft); bool has_ironing = config->opt_bool("ironing"); - for (auto el : { "ironing_type", "ironing_flowrate", "ironing_spacing", "ironing_speed" }) + //w33 + for (auto el : {"ironing_type", "ironing_flowrate", "ironing_spacing", "ironing_speed", "ironing_pattern"}) toggle_field(el, has_ironing); bool have_sequential_printing = config->opt_bool("complete_objects"); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 8d82d27..05bc0f5 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1498,7 +1498,9 @@ void TabPrint::build() optgroup = page->new_optgroup(L("Ironing")); category_path = "ironing_177488#"; optgroup->append_single_option_line("ironing", category_path); + //w33 optgroup->append_single_option_line("ironing_type", category_path + "ironing-type"); + optgroup->append_single_option_line("ironing_pattern", category_path + "ironing_pattern"); optgroup->append_single_option_line("ironing_flowrate", category_path + "flow-rate"); optgroup->append_single_option_line("ironing_spacing", category_path + "spacing-between-ironing-passes");