From f362b12e725bc89ad8556beef5f59d2df58eb61f Mon Sep 17 00:00:00 2001 From: igiannakas <59056762+igiannakas@users.noreply.github.com> Date: Tue, 12 Sep 2023 14:46:56 +0100 Subject: [PATCH] Ported ExtrusionRole from Prusa Slicer 2.6.1 --- src/libslic3r/CMakeLists.txt | 6 +- src/libslic3r/ExtrusionRole.cpp | 95 ++++++++++++++++++++++ src/libslic3r/ExtrusionRole.hpp | 139 ++++++++++++++++++++++++++++++++ 3 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 src/libslic3r/ExtrusionRole.cpp create mode 100644 src/libslic3r/ExtrusionRole.hpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 76b6c3061c..efa0f2eb33 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -62,6 +62,8 @@ set(lisbslic3r_sources ExtrusionEntity.hpp ExtrusionEntityCollection.cpp ExtrusionEntityCollection.hpp + ExtrusionRole.cpp + ExtrusionRole.hpp ExtrusionSimulator.cpp ExtrusionSimulator.hpp FileParserError.hpp @@ -128,8 +130,8 @@ set(lisbslic3r_sources GCode/FanMover.hpp GCode/PostProcessor.cpp GCode/PostProcessor.hpp -# GCode/PressureEqualizer.cpp -# GCode/PressureEqualizer.hpp + GCode/PressureEqualizer.cpp + GCode/PressureEqualizer.hpp GCode/PrintExtents.cpp GCode/PrintExtents.hpp GCode/RetractWhenCrossingPerimeters.cpp diff --git a/src/libslic3r/ExtrusionRole.cpp b/src/libslic3r/ExtrusionRole.cpp new file mode 100644 index 0000000000..09052e0e19 --- /dev/null +++ b/src/libslic3r/ExtrusionRole.cpp @@ -0,0 +1,95 @@ +///|/ Copyright (c) Prusa Research 2023 Pavel Mikuš @Godrak, Oleksandra Iushchenko @YuSanka, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "ExtrusionRole.hpp" +#include "I18N.hpp" + +#include +#include +#include + + +namespace Slic3r { + +// Convert a rich bitmask based ExtrusionRole to a less expressive ordinal GCodeExtrusionRole. +// GCodeExtrusionRole is to be serialized into G-code and deserialized by G-code viewer, +GCodeExtrusionRole extrusion_role_to_gcode_extrusion_role(ExtrusionRole role) +{ + if (role == ExtrusionRole::None) return GCodeExtrusionRole::None; + if (role.is_perimeter()) { + return role.is_bridge() ? GCodeExtrusionRole::OverhangPerimeter : + role.is_external() ? GCodeExtrusionRole::ExternalPerimeter : GCodeExtrusionRole::Perimeter; + } + if (role == ExtrusionRole::InternalInfill) return GCodeExtrusionRole::InternalInfill; + if (role == ExtrusionRole::SolidInfill) return GCodeExtrusionRole::SolidInfill; + if (role == ExtrusionRole::TopSolidInfill) return GCodeExtrusionRole::TopSolidInfill; + if (role == ExtrusionRole::Ironing) return GCodeExtrusionRole::Ironing; + if (role == ExtrusionRole::BridgeInfill) return GCodeExtrusionRole::BridgeInfill; + if (role == ExtrusionRole::GapFill) return GCodeExtrusionRole::GapFill; + if (role == ExtrusionRole::Skirt) return GCodeExtrusionRole::Skirt; + if (role == ExtrusionRole::SupportMaterial) return GCodeExtrusionRole::SupportMaterial; + if (role == ExtrusionRole::SupportMaterialInterface) return GCodeExtrusionRole::SupportMaterialInterface; + if (role == ExtrusionRole::WipeTower) return GCodeExtrusionRole::WipeTower; + assert(false); + return GCodeExtrusionRole::None; +} + +std::string gcode_extrusion_role_to_string(GCodeExtrusionRole role) +{ + switch (role) { + case GCodeExtrusionRole::None : return L("Unknown"); + case GCodeExtrusionRole::Perimeter : return L("Perimeter"); + case GCodeExtrusionRole::ExternalPerimeter : return L("External perimeter"); + case GCodeExtrusionRole::OverhangPerimeter : return L("Overhang perimeter"); + case GCodeExtrusionRole::InternalInfill : return L("Internal infill"); + case GCodeExtrusionRole::SolidInfill : return L("Solid infill"); + case GCodeExtrusionRole::TopSolidInfill : return L("Top solid infill"); + case GCodeExtrusionRole::Ironing : return L("Ironing"); + case GCodeExtrusionRole::BridgeInfill : return L("Bridge infill"); + case GCodeExtrusionRole::GapFill : return L("Gap fill"); + case GCodeExtrusionRole::Skirt : return L("Skirt/Brim"); + case GCodeExtrusionRole::SupportMaterial : return L("Support material"); + case GCodeExtrusionRole::SupportMaterialInterface : return L("Support material interface"); + case GCodeExtrusionRole::WipeTower : return L("Wipe tower"); + case GCodeExtrusionRole::Custom : return L("Custom"); + default : assert(false); + } + return {}; +} + +GCodeExtrusionRole string_to_gcode_extrusion_role(const std::string_view role) +{ + if (role == L("Perimeter")) + return GCodeExtrusionRole::Perimeter; + else if (role == L("External perimeter")) + return GCodeExtrusionRole::ExternalPerimeter; + else if (role == L("Overhang perimeter")) + return GCodeExtrusionRole::OverhangPerimeter; + else if (role == L("Internal infill")) + return GCodeExtrusionRole::InternalInfill; + else if (role == L("Solid infill")) + return GCodeExtrusionRole::SolidInfill; + else if (role == L("Top solid infill")) + return GCodeExtrusionRole::TopSolidInfill; + else if (role == L("Ironing")) + return GCodeExtrusionRole::Ironing; + else if (role == L("Bridge infill")) + return GCodeExtrusionRole::BridgeInfill; + else if (role == L("Gap fill")) + return GCodeExtrusionRole::GapFill; + else if (role == L("Skirt") || role == L("Skirt/Brim")) // "Skirt" is for backward compatibility with 2.3.1 and earlier + return GCodeExtrusionRole::Skirt; + else if (role == L("Support material")) + return GCodeExtrusionRole::SupportMaterial; + else if (role == L("Support material interface")) + return GCodeExtrusionRole::SupportMaterialInterface; + else if (role == L("Wipe tower")) + return GCodeExtrusionRole::WipeTower; + else if (role == L("Custom")) + return GCodeExtrusionRole::Custom; + else + return GCodeExtrusionRole::None; +} + +} diff --git a/src/libslic3r/ExtrusionRole.hpp b/src/libslic3r/ExtrusionRole.hpp new file mode 100644 index 0000000000..d092a95691 --- /dev/null +++ b/src/libslic3r/ExtrusionRole.hpp @@ -0,0 +1,139 @@ +///|/ Copyright (c) 2023 Robert Schiele @schiele +///|/ Copyright (c) Prusa Research 2023 Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_ExtrusionRole_hpp_ +#define slic3r_ExtrusionRole_hpp_ + +#include "enum_bitmask.hpp" + +#include +#include +#include + +namespace Slic3r { + +enum class ExtrusionRoleModifier : uint16_t { +// 1) Extrusion types + // Perimeter (external, inner, ...) + Perimeter, + // Infill (top / bottom / solid inner / sparse inner / bridging inner ...) + Infill, + // Variable width extrusion + Thin, + // Support material extrusion + Support, + Skirt, + Wipe, +// 2) Extrusion modifiers + External, + Solid, + Ironing, + Bridge, +// 3) Special types + // Indicator that the extrusion role was mixed from multiple differing extrusion roles, + // for example from Support and SupportInterface. + Mixed, + // Stopper, there should be maximum 16 modifiers defined for uint16_t bit mask. + Count +}; +// There should be maximum 16 modifiers defined for uint16_t bit mask. +static_assert(int(ExtrusionRoleModifier::Count) <= 16, "ExtrusionRoleModifier: there must be maximum 16 modifiers defined to fit a 16 bit bitmask"); + +using ExtrusionRoleModifiers = enum_bitmask; +ENABLE_ENUM_BITMASK_OPERATORS(ExtrusionRoleModifier); + +struct ExtrusionRole : public ExtrusionRoleModifiers +{ + constexpr ExtrusionRole(const ExtrusionRoleModifier bit) : ExtrusionRoleModifiers(bit) {} + constexpr ExtrusionRole(const ExtrusionRoleModifiers bits) : ExtrusionRoleModifiers(bits) {} + + static constexpr const ExtrusionRoleModifiers None{}; + // Internal perimeter, not bridging. + static constexpr const ExtrusionRoleModifiers Perimeter{ ExtrusionRoleModifier::Perimeter }; + // External perimeter, not bridging. + static constexpr const ExtrusionRoleModifiers ExternalPerimeter{ ExtrusionRoleModifier::Perimeter | ExtrusionRoleModifier::External }; + // Perimeter, bridging. To be or'ed with ExtrusionRoleModifier::External for external bridging perimeter. + static constexpr const ExtrusionRoleModifiers OverhangPerimeter{ ExtrusionRoleModifier::Perimeter | ExtrusionRoleModifier::Bridge }; + // Sparse internal infill. + static constexpr const ExtrusionRoleModifiers InternalInfill{ ExtrusionRoleModifier::Infill }; + // Solid internal infill. + static constexpr const ExtrusionRoleModifiers SolidInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid }; + // Top solid infill (visible). + //FIXME why there is no bottom solid infill type? + static constexpr const ExtrusionRoleModifiers TopSolidInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::External }; + // Ironing infill at the top surfaces. + static constexpr const ExtrusionRoleModifiers Ironing{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::Ironing | ExtrusionRoleModifier::External }; + // Visible bridging infill at the bottom of an object. + static constexpr const ExtrusionRoleModifiers BridgeInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::Bridge | ExtrusionRoleModifier::External }; +// static constexpr const ExtrusionRoleModifiers InternalBridgeInfill{ ExtrusionRoleModifier::Infill | ExtrusionRoleModifier::Solid | ExtrusionRoleModifier::Bridge }; + // Gap fill extrusion, currently used for any variable width extrusion: Thin walls outside of the outer extrusion, + // gap fill in between perimeters, gap fill between the inner perimeter and infill. + //FIXME revise GapFill and ThinWall types, split Gap Fill to Gap Fill and ThinWall. + static constexpr const ExtrusionRoleModifiers GapFill{ ExtrusionRoleModifier::Thin }; // | ExtrusionRoleModifier::External }; +// static constexpr const ExtrusionRoleModifiers ThinWall{ ExtrusionRoleModifier::Thin }; + static constexpr const ExtrusionRoleModifiers Skirt{ ExtrusionRoleModifier::Skirt }; + // Support base material, printed with non-soluble plastic. + static constexpr const ExtrusionRoleModifiers SupportMaterial{ ExtrusionRoleModifier::Support }; + // Support interface material, printed with soluble plastic. + static constexpr const ExtrusionRoleModifiers SupportMaterialInterface{ ExtrusionRoleModifier::Support | ExtrusionRoleModifier::External }; + // Wipe tower material. + static constexpr const ExtrusionRoleModifiers WipeTower{ ExtrusionRoleModifier::Wipe }; + // Extrusion role for a collection with multiple extrusion roles. + static constexpr const ExtrusionRoleModifiers Mixed{ ExtrusionRoleModifier::Mixed }; + + bool is_perimeter() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Perimeter); } + bool is_external_perimeter() const { return this->is_perimeter() && this->is_external(); } + bool is_infill() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Infill); } + bool is_solid_infill() const { return this->is_infill() && this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Solid); } + bool is_external() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::External); } + bool is_bridge() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Bridge); } + + bool is_support() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Support); } + bool is_support_base() const { return this->is_support() && ! this->is_external(); } + bool is_support_interface() const { return this->is_support() && this->is_external(); } + bool is_mixed() const { return this->ExtrusionRoleModifiers::has(ExtrusionRoleModifier::Mixed); } +}; + +// Special flags describing loop +enum ExtrusionLoopRole { + elrDefault, + elrContourInternalPerimeter, + elrSkirt, +}; + +// Be careful when editing this list as many parts of the code depend +// on the values of these ordinars, for example +// GCodeViewer::Extrusion_Role_Colors +enum class GCodeExtrusionRole : uint8_t { + None, + Perimeter, + ExternalPerimeter, + OverhangPerimeter, + InternalInfill, + SolidInfill, + TopSolidInfill, + Ironing, + BridgeInfill, + GapFill, + Skirt, + SupportMaterial, + SupportMaterialInterface, + WipeTower, + // Custom (user defined) G-code block, for example start / end G-code. + Custom, + // Stopper to count number of enums. + Count +}; + +// Convert a rich bitmask based ExtrusionRole to a less expressive ordinal GCodeExtrusionRole. +// GCodeExtrusionRole is to be serialized into G-code and deserialized by G-code viewer, +GCodeExtrusionRole extrusion_role_to_gcode_extrusion_role(ExtrusionRole role); + +std::string gcode_extrusion_role_to_string(GCodeExtrusionRole role); +GCodeExtrusionRole string_to_gcode_extrusion_role(const std::string_view role); + +} + +#endif // slic3r_ExtrusionRole_hpp_