Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::Skirt Namespace Reference

Functions

static void skirt_loops_per_extruder_all_printing (const Print &print, const LayerTools &layer_tools, std::map< unsigned int, std::pair< size_t, size_t > > &skirt_loops_per_extruder_out)
 
static std::map< unsigned int, std::pair< size_t, size_t > > make_skirt_loops_per_extruder_1st_layer (const Print &print, const LayerTools &layer_tools, std::vector< coordf_t > &skirt_done)
 
static std::map< unsigned int, std::pair< size_t, size_t > > make_skirt_loops_per_extruder_other_layers (const Print &print, const LayerTools &layer_tools, std::vector< coordf_t > &skirt_done)
 

Function Documentation

◆ make_skirt_loops_per_extruder_1st_layer()

static std::map< unsigned int, std::pair< size_t, size_t > > Slic3r::Skirt::make_skirt_loops_per_extruder_1st_layer ( const Print print,
const LayerTools layer_tools,
std::vector< coordf_t > &  skirt_done 
)
static
2058 {
2059 // Extrude skirt at the print_z of the raft layers and normal object layers
2060 // not at the print_z of the interlaced support material layers.
2061 std::map<unsigned int, std::pair<size_t, size_t>> skirt_loops_per_extruder_out;
2062 //For sequential print, the following test may fail when extruding the 2nd and other objects.
2063 // assert(skirt_done.empty());
2064 if (skirt_done.empty() && print.has_skirt() && ! print.skirt().entities.empty() && layer_tools.has_skirt) {
2065 skirt_loops_per_extruder_all_printing(print, layer_tools, skirt_loops_per_extruder_out);
2066 skirt_done.emplace_back(layer_tools.print_z);
2067 }
2068 return skirt_loops_per_extruder_out;
2069 }
ExtrusionEntitiesPtr entities
Definition ExtrusionEntityCollection.hpp:32
bool has_skirt
Definition ToolOrdering.hpp:99
coordf_t print_z
Definition ToolOrdering.hpp:89
bool has_skirt() const
Definition Print.cpp:375
const ExtrusionEntityCollection & skirt() const
Definition Print.hpp:623
static void skirt_loops_per_extruder_all_printing(const Print &print, const LayerTools &layer_tools, std::map< unsigned int, std::pair< size_t, size_t > > &skirt_loops_per_extruder_out)
Definition GCode.cpp:2043

References Slic3r::ExtrusionEntityCollection::entities, Slic3r::LayerTools::has_skirt, Slic3r::Print::has_skirt(), Slic3r::LayerTools::print_z, Slic3r::Print::skirt(), and skirt_loops_per_extruder_all_printing().

Referenced by Slic3r::GCode::process_layer().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ make_skirt_loops_per_extruder_other_layers()

static std::map< unsigned int, std::pair< size_t, size_t > > Slic3r::Skirt::make_skirt_loops_per_extruder_other_layers ( const Print print,
const LayerTools layer_tools,
std::vector< coordf_t > &  skirt_done 
)
static
2076 {
2077 // Extrude skirt at the print_z of the raft layers and normal object layers
2078 // not at the print_z of the interlaced support material layers.
2079 std::map<unsigned int, std::pair<size_t, size_t>> skirt_loops_per_extruder_out;
2080 if (print.has_skirt() && ! print.skirt().entities.empty() && layer_tools.has_skirt &&
2081 // Not enough skirt layers printed yet.
2082 //FIXME infinite or high skirt does not make sense for sequential print!
2083 (skirt_done.size() < (size_t)print.config().skirt_height.value || print.has_infinite_skirt())) {
2084 bool valid = ! skirt_done.empty() && skirt_done.back() < layer_tools.print_z - EPSILON;
2085 assert(valid);
2086 // This print_z has not been extruded yet (sequential print)
2087 // FIXME: The skirt_done should not be empty at this point. The check is a workaround
2088 // of https://github.com/prusa3d/PrusaSlicer/issues/5652, but it deserves a real fix.
2089 if (valid) {
2090#if 0
2091 // Prime just the first printing extruder. This is original Slic3r's implementation.
2092 skirt_loops_per_extruder_out[layer_tools.extruders.front()] = std::pair<size_t, size_t>(0, print.config().skirts.value);
2093#else
2094 // Prime all extruders planned for this layer, see
2095 // https://github.com/prusa3d/PrusaSlicer/issues/469#issuecomment-322450619
2096 skirt_loops_per_extruder_all_printing(print, layer_tools, skirt_loops_per_extruder_out);
2097#endif
2098 assert(!skirt_done.empty());
2099 skirt_done.emplace_back(layer_tools.print_z);
2100 }
2101 }
2102 return skirt_loops_per_extruder_out;
2103 }
std::vector< unsigned int > extruders
Definition ToolOrdering.hpp:93
bool has_infinite_skirt() const
Definition Print.cpp:370
const PrintConfig & config() const
Definition Print.hpp:597
static constexpr double EPSILON
Definition libslic3r.h:51

References Slic3r::Print::config(), Slic3r::ExtrusionEntityCollection::entities, EPSILON, Slic3r::LayerTools::extruders, Slic3r::Print::has_infinite_skirt(), Slic3r::LayerTools::has_skirt, Slic3r::Print::has_skirt(), Slic3r::LayerTools::print_z, Slic3r::Print::skirt(), and skirt_loops_per_extruder_all_printing().

Referenced by Slic3r::GCode::process_layer().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ skirt_loops_per_extruder_all_printing()

static void Slic3r::Skirt::skirt_loops_per_extruder_all_printing ( const Print print,
const LayerTools layer_tools,
std::map< unsigned int, std::pair< size_t, size_t > > &  skirt_loops_per_extruder_out 
)
static
2044 {
2045 // Prime all extruders printing over the 1st layer over the skirt lines.
2046 size_t n_loops = print.skirt().entities.size();
2047 size_t n_tools = layer_tools.extruders.size();
2048 size_t lines_per_extruder = (n_loops + n_tools - 1) / n_tools;
2049 for (size_t i = 0; i < n_loops; i += lines_per_extruder)
2050 skirt_loops_per_extruder_out[layer_tools.extruders[i / lines_per_extruder]] = std::pair<size_t, size_t>(i, std::min(i + lines_per_extruder, n_loops));
2051 }

References Slic3r::ExtrusionEntityCollection::entities, Slic3r::LayerTools::extruders, and Slic3r::Print::skirt().

Referenced by make_skirt_loops_per_extruder_1st_layer(), and make_skirt_loops_per_extruder_other_layers().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: