From 6540855ff7fa8a6e26fc42d23ebb1b9c919be131 Mon Sep 17 00:00:00 2001 From: "jianjia.ma" Date: Thu, 18 Apr 2024 16:34:26 +0800 Subject: [PATCH] ENH: Improve CrossHatch transation layers jira: 6701 Change name from Flippingline to CrossHatch. Reduce noise, improve speed by 6.5%. Improve transation layers by gradually increasing rotation angle and overshoot the transation layer while direction changed. Change-Id: I17fcc45b409074d121bf5bb5702e15553d925b51 --- ..._flippingline.svg => param_crosshatch.svg} | 0 src/libslic3r/CMakeLists.txt | 4 +-- src/libslic3r/Fill/FillBase.cpp | 4 +-- ...illFlippingLine.cpp => FillCrossHatch.cpp} | 34 +++++++------------ ...illFlippingLine.hpp => FillCrossHatch.hpp} | 12 +++---- src/libslic3r/PrintConfig.cpp | 6 ++-- src/libslic3r/PrintConfig.hpp | 4 +-- src/libslic3r/PrintObject.cpp | 2 +- 8 files changed, 29 insertions(+), 37 deletions(-) rename resources/images/{param_flippingline.svg => param_crosshatch.svg} (100%) rename src/libslic3r/Fill/{FillFlippingLine.cpp => FillCrossHatch.cpp} (87%) rename src/libslic3r/Fill/{FillFlippingLine.hpp => FillCrossHatch.hpp} (61%) diff --git a/resources/images/param_flippingline.svg b/resources/images/param_crosshatch.svg similarity index 100% rename from resources/images/param_flippingline.svg rename to resources/images/param_crosshatch.svg diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index b63f58ec0..e4d5c0c6f 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -84,8 +84,8 @@ set(lisbslic3r_sources Fill/FillConcentric.hpp Fill/FillConcentricInternal.cpp Fill/FillConcentricInternal.hpp - Fill/FillFlippingLine.cpp - Fill/FillFlippingLine.hpp + Fill/FillCrossHatch.cpp + Fill/FillCrossHatch.hpp Fill/FillHoneycomb.cpp Fill/FillHoneycomb.hpp Fill/FillGyroid.cpp diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 19d535e1e..883b891f8 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -23,7 +23,7 @@ #include "FillLightning.hpp" // BBS: new infill pattern header #include "FillConcentricInternal.hpp" -#include "FillFlippingLine.hpp" +#include "FillCrossHatch.hpp" // #define INFILL_DEBUG_OUTPUT @@ -38,7 +38,7 @@ Fill* Fill::new_from_type(const InfillPattern type) case ipGyroid: return new FillGyroid(); case ipRectilinear: return new FillRectilinear(); case ipAlignedRectilinear: return new FillAlignedRectilinear(); - case ipFlippingLine: return new FillFlippingLine(); + case ipCrossHatch: return new FillCrossHatch(); case ipMonotonic: return new FillMonotonic(); case ipLine: return new FillLine(); case ipGrid: return new FillGrid(); diff --git a/src/libslic3r/Fill/FillFlippingLine.cpp b/src/libslic3r/Fill/FillCrossHatch.cpp similarity index 87% rename from src/libslic3r/Fill/FillFlippingLine.cpp rename to src/libslic3r/Fill/FillCrossHatch.cpp index 4d16215c1..ebac74bf4 100644 --- a/src/libslic3r/Fill/FillFlippingLine.cpp +++ b/src/libslic3r/Fill/FillCrossHatch.cpp @@ -2,14 +2,14 @@ #include "../ShortestPath.hpp" #include "../Surface.hpp" -#include "FillFlippingLine.hpp" +#include "FillCrossHatch.hpp" namespace Slic3r { -// FlipLines Infill: Enhances 3D Printing Speed & Reduces Noise -// FlipLines, as its name hints, alternates line direction by 90 degrees every few layers to improve adhesion. +// CrossHatch Infill: Enhances 3D Printing Speed & Reduces Noise +// CrossHatch, as its name hints, alternates line direction by 90 degrees every few layers to improve adhesion. // It introduces transform layers between direction shifts for better line cohesion, which fixes the weakness of line infill. -// The transform technique is inspired by David Eccles, improved 3D honeycomb but also a more flexible implementation. +// The transform technique is inspired by David Eccles, improved 3D honeycomb but we made a more flexible implementation. // This method notably increases printing speed, meeting the demands of modern high-speed 3D printers, and reduces noise for most layers. // By Bambu Lab @@ -22,15 +22,6 @@ namespace Slic3r { * \ / * o---o * p1 p2 p3 p4 - * - * // X1 = progress * (1/8) * period - * // X2 = ( (1/2 - progress) * (1/8) ) * period - * // X3 = X1 + (1/2) * period - * // X4 = ( (1 - progress) * (1/8) ) * period - * // Y1 = X1 - * // Y2 = X1 - * // Y3 = -X1 - * // Y4 = -X1 */ static Pointfs generate_one_cycle(double progress, coordf_t period) @@ -38,10 +29,10 @@ static Pointfs generate_one_cycle(double progress, coordf_t period) Pointfs out; double offset = progress * 1. / 8. * period; out.reserve(4); - out.push_back(Vec2d(offset, offset)); - out.push_back(Vec2d(0.5 * period - offset, offset)); - out.push_back(Vec2d(0.5 * period + offset, -offset)); - out.push_back(Vec2d(1. * period - offset, -offset)); + out.push_back(Vec2d(0.25 * period - offset, offset)); + out.push_back(Vec2d(0.25 * period + offset, offset)); + out.push_back(Vec2d(0.75 * period - offset, -offset)); + out.push_back(Vec2d(0.75 * period + offset, -offset)); return out; } @@ -154,8 +145,9 @@ static Polylines generate_repeat_pattern(int direction, coordf_t grid_size, coor static Polylines generate_infill_layers(coordf_t z_height, double repeat_ratio, coordf_t grid_size, coordf_t width, coordf_t height) { Polylines result; - coordf_t trans_layer_size = grid_size * 0.3; // upper. + coordf_t trans_layer_size = grid_size * 0.4; // upper. coordf_t repeat_layer_size = grid_size * repeat_ratio; // lower. + z_height += repeat_layer_size / 2; // offset to improve first few layer strength coordf_t period = trans_layer_size + repeat_layer_size; coordf_t remains = z_height - std::floor(z_height / period) * period; coordf_t trans_z = remains - repeat_layer_size; // put repeat layer first. @@ -174,15 +166,15 @@ static Polylines generate_infill_layers(coordf_t z_height, double repeat_ratio, // split the progress to forward and backward, with a opposite direction. if (progress < 0.5) - result = generate_transform_pattern(progress * 2, direction, grid_size, width, height); + result = generate_transform_pattern((progress + 0.1) * 2, direction, grid_size, width, height); // increase overlapping. else - result = generate_transform_pattern((1 - progress) * 2, -1 * direction, grid_size, width, height); + result = generate_transform_pattern((1.1 - progress) * 2, -1 * direction, grid_size, width, height); } return result; } -void FillFlippingLine ::_fill_surface_single( +void FillCrossHatch ::_fill_surface_single( const FillParams ¶ms, unsigned int thickness_layers, const std::pair &direction, ExPolygon expolygon, Polylines &polylines_out) { // rotate angle diff --git a/src/libslic3r/Fill/FillFlippingLine.hpp b/src/libslic3r/Fill/FillCrossHatch.hpp similarity index 61% rename from src/libslic3r/Fill/FillFlippingLine.hpp rename to src/libslic3r/Fill/FillCrossHatch.hpp index 3bf576c14..859d5bd8b 100644 --- a/src/libslic3r/Fill/FillFlippingLine.hpp +++ b/src/libslic3r/Fill/FillCrossHatch.hpp @@ -1,5 +1,5 @@ -#ifndef slic3r_FillFlippingLines_hpp_ -#define slic3r_FillFlippingLines_hpp_ +#ifndef slic3r_FillCrossHatch_hpp_ +#define slic3r_FillCrossHatch_hpp_ #include @@ -9,11 +9,11 @@ namespace Slic3r { -class FillFlippingLine : public Fill +class FillCrossHatch : public Fill { public: - Fill *clone() const override { return new FillFlippingLine(*this); }; - ~FillFlippingLine() override {} + Fill *clone() const override { return new FillCrossHatch(*this); }; + ~FillCrossHatch() override {} protected: void _fill_surface_single( @@ -26,4 +26,4 @@ protected: } // namespace Slic3r -#endif // slic3r_FillFlippingLines_hpp_ +#endif // slic3r_FillCrossHatch_hpp_ diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 95e5753b2..6ab35d860 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -135,7 +135,7 @@ static t_config_enum_values s_keys_map_InfillPattern { { "octagramspiral", ipOctagramSpiral }, { "supportcubic", ipSupportCubic }, { "lightning", ipLightning }, - { "flippingline", ipFlippingLine} + { "crosshatch", ipCrossHatch} }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(InfillPattern) @@ -1603,7 +1603,7 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("octagramspiral"); def->enum_values.push_back("supportcubic"); def->enum_values.push_back("lightning"); - def->enum_values.push_back("flippingline"); + def->enum_values.push_back("crosshatch"); def->enum_labels.push_back(L("Concentric")); def->enum_labels.push_back(L("Rectilinear")); def->enum_labels.push_back(L("Grid")); @@ -1621,7 +1621,7 @@ void PrintConfigDef::init_fff_params() def->enum_labels.push_back(L("Octagram Spiral")); def->enum_labels.push_back(L("Support Cubic")); def->enum_labels.push_back(L("Lightning")); - def->enum_labels.push_back(L("Flipping Line")); + def->enum_labels.push_back(L("Cross Hatch")); def->set_default_value(new ConfigOptionEnum(ipCubic)); def = this->add("top_surface_acceleration", coFloat); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 3010b2ff1..91b21ada7 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -54,8 +54,8 @@ enum AuthorizationType { enum InfillPattern : int { ipConcentric, ipRectilinear, ipGrid, ipLine, ipCubic, ipTriangles, ipStars, ipGyroid, ipHoneycomb, ipAdaptiveCubic, ipMonotonic, ipMonotonicLine, ipAlignedRectilinear, ip3DHoneycomb, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipSupportCubic, ipSupportBase, ipConcentricInternal, - ipLightning, ipFlippingLine, -ipCount, + ipLightning, ipCrossHatch, + ipCount, }; enum class IroningType { diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 3fd616005..9e978d2b8 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -2217,7 +2217,7 @@ void PrintObject::bridge_over_infill() // Check it the infill that require a fixed infill angle. switch (dominant_pattern) { case ip3DHoneycomb: - case ipFlippingLine: + case ipCrossHatch: return (infill_direction + 45.0) * 2.0 * M_PI / 360.; default: break; }