Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/libslic3r')
-rw-r--r--src/libslic3r/GCode.cpp23
-rw-r--r--src/libslic3r/Layer.cpp1
-rw-r--r--src/libslic3r/PerimeterGenerator.cpp2
-rw-r--r--src/libslic3r/Preset.cpp7
-rw-r--r--src/libslic3r/Print.cpp57
-rw-r--r--src/libslic3r/Print.hpp6
-rw-r--r--src/libslic3r/PrintConfig.cpp56
-rw-r--r--src/libslic3r/PrintConfig.hpp6
-rw-r--r--src/libslic3r/PrintObject.cpp1
-rw-r--r--src/libslic3r/libslic3r.h2
10 files changed, 125 insertions, 36 deletions
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index 48a60af38..8121e3f43 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -833,6 +833,8 @@ namespace DoExport {
}
if (compute_min_mm3_per_mm.is_compatible({ erSkirt })) {
mm3_per_mm.push_back(compute_min_mm3_per_mm.reset_use_get(print.skirt()));
+ if(print.skirt_first_layer())
+ mm3_per_mm.push_back(compute_min_mm3_per_mm.reset_use_get(*print.skirt_first_layer()));
mm3_per_mm.push_back(compute_min_mm3_per_mm.reset_use_get(print.brim()));
}
// filter out 0-width segments
@@ -2082,7 +2084,14 @@ namespace Skirt {
// not at the print_z of the interlaced support material layers.
std::map<uint16_t, std::pair<size_t, size_t>> skirt_loops_per_extruder_out;
if (skirt_done.empty() && print.has_skirt() && ! print.skirt().entities.empty()) {
- skirt_loops_per_extruder_all_printing(print, layer_tools, skirt_loops_per_extruder_out);
+ if (print.skirt_first_layer()) {
+ size_t n_loops = print.skirt_first_layer()->entities.size();
+ size_t n_tools = layer_tools.extruders.size();
+ size_t lines_per_extruder = (n_loops + n_tools - 1) / n_tools;
+ for (size_t i = 0; i < n_loops; i += lines_per_extruder)
+ 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));
+ } else
+ skirt_loops_per_extruder_all_printing(print, layer_tools, skirt_loops_per_extruder_out);
skirt_done.emplace_back(layer_tools.print_z);
}
return skirt_loops_per_extruder_out;
@@ -2443,9 +2452,10 @@ void GCode::process_layer(
Flow layer_skirt_flow(print.skirt_flow(extruder_id));
layer_skirt_flow.height = float(m_skirt_done.back() - (m_skirt_done.size() == 1 ? 0. : m_skirt_done[m_skirt_done.size() - 2]));
double mm3_per_mm = layer_skirt_flow.mm3_per_mm();
+ const ExtrusionEntityCollection& coll = first_layer && print.skirt_first_layer() ? *print.skirt_first_layer() : print.skirt();
for (size_t i = loops.first; i < loops.second; ++i) {
// Adjust flow according to this layer's layer height.
- ExtrusionLoop loop = *dynamic_cast<const ExtrusionLoop*>(print.skirt().entities[i]);
+ ExtrusionLoop loop = *dynamic_cast<const ExtrusionLoop*>(coll.entities[i]);
for (ExtrusionPath &path : loop.paths) {
assert(layer_skirt_flow.height == layer_skirt_flow.height);
assert(mm3_per_mm == mm3_per_mm);
@@ -2475,6 +2485,7 @@ void GCode::process_layer(
m_avoid_crossing_perimeters.disable_once();
}
//extrude object-only skirt
+ //TODO: use it also for wiping like the other one (as they are exlusiev)
if (single_object_instance_idx != size_t(-1) && !layers.front().object()->skirt().empty()
&& extruder_id == layer_tools.extruders.front()) {
//if first layer, ask for a bigger lift for travel to object, to be on the safe side
@@ -2483,8 +2494,12 @@ void GCode::process_layer(
const PrintObject *print_object = layers.front().object();
this->set_origin(unscale(print_object->instances()[single_object_instance_idx].shift));
if (this->m_layer != nullptr && (this->m_layer->id() < m_config.skirt_height || print.has_infinite_skirt() )) {
- for (const ExtrusionEntity *ee : print_object->skirt().entities)
- gcode += this->extrude_entity(*ee, "", m_config.support_material_speed.value);
+ if(first_layer && print.skirt_first_layer())
+ for (const ExtrusionEntity* ee : print_object->skirt_first_layer()->entities)
+ gcode += this->extrude_entity(*ee, "", m_config.support_material_speed.value);
+ else
+ for (const ExtrusionEntity *ee : print_object->skirt().entities)
+ gcode += this->extrude_entity(*ee, "", m_config.support_material_speed.value);
}
}
//extrude object-only brim
diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp
index 905d97fcc..eb58b81a4 100644
--- a/src/libslic3r/Layer.cpp
+++ b/src/libslic3r/Layer.cpp
@@ -158,6 +158,7 @@ void Layer::make_perimeters()
&& config.extra_perimeters_odd_layers == other_config.extra_perimeters_odd_layers
&& config.extra_perimeters_overhangs == other_config.extra_perimeters_overhangs
&& config.gap_fill == other_config.gap_fill
+ && config.gap_fill_last == other_config.gap_fill_last
&& config.gap_fill_min_area == other_config.gap_fill_min_area
&& config.gap_fill_overlap == other_config.gap_fill_overlap
&& config.gap_fill_speed == other_config.gap_fill_speed
diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp
index ece14427c..d01ef6ed2 100644
--- a/src/libslic3r/PerimeterGenerator.cpp
+++ b/src/libslic3r/PerimeterGenerator.cpp
@@ -638,7 +638,7 @@ void PerimeterGenerator::process()
// look for gaps
if (this->config->gap_fill
//check if we are going to have an other perimeter
- && (i <= loop_number || has_overhang || next_onion.empty()))
+ && (i <= loop_number || has_overhang || next_onion.empty() || (this->config->gap_fill_last.value && i == loop_number+1)))
// not using safety offset here would "detect" very narrow gaps
// (but still long enough to escape the area threshold) that gap fill
// won't be able to fill but we'd still remove from infill area
diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp
index be21b8b89..482cdc43d 100644
--- a/src/libslic3r/Preset.cpp
+++ b/src/libslic3r/Preset.cpp
@@ -515,6 +515,7 @@ const std::vector<std::string>& Preset::print_options()
"travel_speed", "travel_speed_z",
// gapfill
"gap_fill",
+ "gap_fill_last",
"gap_fill_min_area",
"gap_fill_overlap",
"gap_fill_speed",
@@ -526,7 +527,11 @@ const std::vector<std::string>& Preset::print_options()
"perimeter_acceleration",
"travel_acceleration",
// skirt
- "skirts", "skirt_distance", "skirt_height",
+ "skirts",
+ "skirt_distance",
+ "skirt_distance_from_brim",
+ "skirt_height",
+ "skirt_brim",
"skirt_extrusion_width",
"min_skirt_length",
"draft_shield",
diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp
index 38883733d..6b5008893 100644
--- a/src/libslic3r/Print.cpp
+++ b/src/libslic3r/Print.cpp
@@ -200,7 +200,9 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
opt_key == "skirts"
|| opt_key == "skirt_height"
|| opt_key == "draft_shield"
+ || opt_key == "skirt_brim"
|| opt_key == "skirt_distance"
+ || opt_key == "skirt_distance_from_brim"
|| opt_key == "min_skirt_length"
|| opt_key == "complete_objects_one_skirt"
|| opt_key == "complete_objects_one_brim"
@@ -326,7 +328,9 @@ bool Print::invalidate_step(PrintStep step)
bool invalidated = Inherited::invalidate_step(step);
// Propagate to dependent steps.
if (step == psSkirt)
- invalidated |= Inherited::invalidate_step(psBrim);
+ invalidated |= Inherited::invalidate_step(psBrim);
+ if (step == psBrim) // this one only if skirt_distance_from_brim
+ invalidated |= Inherited::invalidate_step(psSkirt);
if (step != psGCodeExport)
invalidated |= Inherited::invalidate_step(psGCodeExport);
return invalidated;
@@ -1641,16 +1645,22 @@ BoundingBox Print::total_bounding_box() const
extra = std::max(extra, m_config.brim_width.value + brim_flow.width/2);
}
if (this->has_skirt()) {
- int skirts = m_config.skirts.value;
+ int skirts = m_config.skirts.value + m_config.skirt_brim.value;
if (skirts == 0 && this->has_infinite_skirt()) skirts = 1;
Flow skirt_flow = this->skirt_flow();
- extra = std::max(
- extra,
- m_config.brim_width.value
+ if (m_config.skirt_distance_from_brim)
+ extra += m_config.brim_width.value
+ m_config.skirt_distance.value
+ skirts * skirt_flow.spacing()
- + skirt_flow.width/2
- );
+ + skirt_flow.width / 2;
+ else
+ extra = std::max(
+ extra,
+ m_config.brim_width.value
+ + m_config.skirt_distance.value
+ + skirts * skirt_flow.spacing()
+ + skirt_flow.width/2
+ );
}
if (extra > 0)
@@ -1748,11 +1758,13 @@ void Print::process()
}
if (this->set_started(psSkirt)) {
m_skirt.clear();
+ m_skirt_first_layer.reset();
m_skirt_convex_hull.clear();
m_first_layer_convex_hull.points.clear();
for (PrintObject *obj : m_objects) {
obj->m_skirt.clear();
+ obj->m_skirt_first_layer.reset();
}
if (this->has_skirt()) {
this->set_status(88, L("Generating skirt"));
@@ -1762,11 +1774,11 @@ void Print::process()
const std::vector<PrintInstance> copies{ obj->instances() };
obj->m_instances.clear();
obj->m_instances.emplace_back();
- this->_make_skirt({ obj }, obj->m_skirt);
+ this->_make_skirt({ obj }, obj->m_skirt, obj->m_skirt_first_layer);
obj->m_instances = copies;
}
} else {
- this->_make_skirt(m_objects, m_skirt);
+ this->_make_skirt(m_objects, m_skirt, m_skirt_first_layer);
}
}
this->set_done(psSkirt);
@@ -1888,7 +1900,7 @@ std::string Print::export_gcode(const std::string& path_template, GCodeProcessor
return path.c_str();
}
-void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollection &out)
+void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollection &out, std::optional<ExtrusionEntityCollection>& out_first_layer)
{
// First off we need to decide how tall the skirt must be.
// The skirt_height option from config is expressed in layers, but our
@@ -1931,6 +1943,12 @@ void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollectio
append(object_points, polyline.points);
}
}
+ // Include the brim.
+ if (config().skirt_distance_from_brim) {
+ for (const ExPolygon& expoly : object->m_layers[0]->lslices)
+ for (const Polygon& poly : offset(expoly.contour, scale_(object->config().brim_width)))
+ append(object_points, poly.points);
+ }
// Repeat points for each object copy.
for (const PrintInstance &instance : object->instances()) {
Points copy_points = object_points;
@@ -1973,12 +1991,15 @@ void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollectio
// Number of skirt loops per skirt layer.
size_t n_skirts = m_config.skirts.value;
+ size_t n_skirts_first_layer = n_skirts + m_config.skirt_brim.value;
if (this->has_infinite_skirt() && n_skirts == 0)
n_skirts = 1;
-
+ if (m_config.skirt_brim.value > 0)
+ out_first_layer.emplace();
// Initial offset of the brim inner edge from the object (possible with a support & raft).
// The skirt will touch the brim if the brim is extruded.
- auto distance = float(scale_(m_config.skirt_distance.value) - this->skirt_flow(extruders[extruders.size()-1]).spacing()/2.);
+ float distance = float(scale_(m_config.skirt_distance.value) - this->skirt_flow(extruders[extruders.size() - 1]).spacing() / 2.);
+
size_t lines_per_extruder = (n_skirts + extruders.size() - 1) / extruders.size();
size_t current_lines_per_extruder = n_skirts - lines_per_extruder * (extruders.size() - 1);
@@ -1986,7 +2007,8 @@ void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollectio
// Draw outlines from outside to inside.
// Loop while we have less skirts than required or any extruder hasn't reached the min length if any.
std::vector<coordf_t> extruded_length(extruders.size(), 0.);
- for (size_t i = n_skirts, extruder_idx = 0, nb_skirts = 1; i > 0; -- i) {
+ for (size_t i = std::max(n_skirts, n_skirts_first_layer), extruder_idx = 0, nb_skirts = 1; i > 0; -- i) {
+ bool first_layer_only = i <= (n_skirts_first_layer - n_skirts);
Flow flow = this->skirt_flow(extruders[extruders.size() - (1+ extruder_idx)]);
float spacing = flow.spacing();
double mm3_per_mm = flow.mm3_per_mm();
@@ -2016,8 +2038,11 @@ void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollectio
eloop.paths.back().polyline = loop.split_at_first_point();
//we make it clowkwise, but as it will be reversed, it will be ccw
eloop.make_clockwise();
- out.append(eloop);
- if (m_config.min_skirt_length.value > 0) {
+ if(!first_layer_only)
+ out.append(eloop);
+ if(out_first_layer)
+ out_first_layer->append(eloop);
+ if (m_config.min_skirt_length.value > 0 && !first_layer_only) {
// The skirt length is limited. Sum the total amount of filament length extruded, in mm.
extruded_length[extruder_idx] += unscale<double>(loop.length()) * extruders_e_per_mm[extruder_idx];
if (extruded_length[extruder_idx] < m_config.min_skirt_length.value) {
@@ -2043,6 +2068,8 @@ void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollectio
}
// Brims were generated inside out, reverse to print the outmost contour first.
out.reverse();
+ if (out_first_layer)
+ out_first_layer->reverse();
// Remember the outer edge of the last skirt line extruded as m_skirt_convex_hull.
for (Polygon &poly : offset(convex_hull, distance + 0.5f * float(this->skirt_flow(extruders[extruders.size() - 1]).scaled_spacing()), ClipperLib::jtRound, float(scale_(0.1))))
diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp
index ba79a4db5..300029d02 100644
--- a/src/libslic3r/Print.hpp
+++ b/src/libslic3r/Print.hpp
@@ -202,6 +202,7 @@ public:
void project_and_append_custom_facets(bool seam, EnforcerBlockerType type, std::vector<ExPolygons>& expolys) const;
/// skirts if done per copy and not per platter
+ const std::optional<ExtrusionEntityCollection>& skirt_first_layer() const { return m_skirt_first_layer; }
const ExtrusionEntityCollection& skirt() const { return m_skirt; }
const ExtrusionEntityCollection& brim() const { return m_brim; }
@@ -271,6 +272,7 @@ private:
// Ordered collections of extrusion paths to build skirt loops and brim.
// have to be duplicated per copy
+ std::optional<ExtrusionEntityCollection> m_skirt_first_layer;
ExtrusionEntityCollection m_skirt;
ExtrusionEntityCollection m_brim;
@@ -460,6 +462,7 @@ public:
// If zero, then the print is empty and the print shall not be executed.
uint16_t num_object_instances() const;
+ const std::optional<ExtrusionEntityCollection>& skirt_first_layer() const { return m_skirt_first_layer; }
const ExtrusionEntityCollection& skirt() const { return m_skirt; }
const ExtrusionEntityCollection& brim() const { return m_brim; }
// Convex hull of the 1st layer extrusions, for bed leveling and placing the initial purge line.
@@ -501,7 +504,7 @@ private:
t_config_option_keys &full_config_diff,
DynamicPrintConfig &filament_overrides) const;
- void _make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollection &out);
+ void _make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollection &out, std::optional<ExtrusionEntityCollection> &out_first_layer);
void _make_brim(const Flow &flow, const PrintObjectPtrs &objects, ExPolygons &unbrimmable, ExtrusionEntityCollection &out);
void _make_brim_ears(const Flow &flow, const PrintObjectPtrs &objects, ExPolygons &unbrimmable, ExtrusionEntityCollection &out);
void _make_brim_interior(const Flow &flow, const PrintObjectPtrs &objects, ExPolygons &unbrimmable, ExtrusionEntityCollection &out);
@@ -525,6 +528,7 @@ private:
PrintRegionPtrs m_regions;
// Ordered collections of extrusion paths to build skirt loops and brim.
+ std::optional<ExtrusionEntityCollection> m_skirt_first_layer;
ExtrusionEntityCollection m_skirt;
ExtrusionEntityCollection m_brim;
// Convex hull of the 1st layer extrusions.
diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index 7fc8f40b5..1f7a633d0 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -674,6 +674,13 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionBool(true));
+ def = this->add("draft_shield", coBool);
+ def->label = L("Draft shield");
+ def->tooltip = L("If enabled, the skirt will be as tall as a highest printed object. "
+ "This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft.");
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionBool(false));
+
def = this->add("duplicate_distance", coFloat);
def->label = L("Distance between objects");
def->category = OptionCategory::output;
@@ -1876,6 +1883,14 @@ void PrintConfigDef::init_fff_params()
def->mode = comExpert;
def->set_default_value(new ConfigOptionBool(true));
+ def = this->add("gap_fill_last", coBool);
+ def->label = L("after last perimeter");
+ def->full_label = L("Gapfill after last perimeter");
+ def->category = OptionCategory::perimeter;
+ def->tooltip = L("All gaps between the alst periemter and the infill which are thinner than a perimeter will be filled by gapfill.");
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionBool{true });
+
def = this->add("gap_fill_min_area", coFloatOrPercent);
def->label = L("Min surface");
def->full_label = L("Min gap-fill surface");
@@ -1884,7 +1899,7 @@ void PrintConfigDef::init_fff_params()
def->ratio_over = "perimeter_width_square";
def->min = 0;
def->mode = comExpert;
- def->set_default_value(new ConfigOptionFloatOrPercent{ 100,true });
+ def->set_default_value(new ConfigOptionFloatOrPercent{100, true });
def = this->add("gap_fill_overlap", coPercent);
def->label = L("Gap fill overlap");
@@ -3264,6 +3279,14 @@ void PrintConfigDef::init_fff_params()
def->set_default_value(new ConfigOptionFloat(30);
def->set_default_value(new ConfigOptionFloat(30));
#endif
+ def = this->add("skirt_brim", coInt);
+ def->label = L("Brim");
+ def->full_label = L("Skirt brim");
+ def->category = OptionCategory::skirtBrim;
+ def->tooltip = L("Extra skirt lines on the first layer.");
+ def->sidetext = L("lines");
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionInt(0));
def = this->add("skirt_distance", coFloat);
def->label = L("Distance from object");
@@ -3275,11 +3298,19 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(6));
+ def = this->add("skirt_distance_from_brim", coBool);
+ def->label = L("from brim");
+ def->full_label = L("Skirt distance from brim");
+ def->category = OptionCategory::skirtBrim;
+ def->tooltip = L("The distance is computed from the brim and not from the objects");
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionBool(true));
+
def = this->add("skirt_height", coInt);
def->label = L("Skirt height");
def->category = OptionCategory::skirtBrim;
def->tooltip = L("Height of skirt expressed in layers. Set this to a tall value to use skirt "
- "as a shield against drafts.");
+ "as a shield against drafts.");
def->sidetext = L("layers");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionInt(1));
@@ -3298,13 +3329,6 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
- def = this->add("draft_shield", coBool);
- def->label = L("Draft shield");
- def->tooltip = L("If enabled, the skirt will be as tall as a highest printed object. "
- "This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft.");
- def->mode = comAdvanced;
- def->set_default_value(new ConfigOptionBool(false));
-
def = this->add("skirts", coInt);
def->label = L("Loops (minimum)");
def->full_label = L("Skirt Loops");
@@ -4405,7 +4429,7 @@ void PrintConfigDef::init_fff_params()
"\nAs cylinders are often exported as triangles of varying size, points may not be on the circle circumference."
" This setting allows you some leway to broaden the detection."
"\nIn mm or in % of the radius.");
- def->sidetext = L("mm²");
+ def->sidetext = L("mm or %");
def->mode = comExpert;
def->set_default_value(new ConfigOptionFloatOrPercent(0.01, false));
@@ -5494,6 +5518,7 @@ void PrintConfigDef::to_prusa(t_config_option_key& opt_key, std::string& value,
"gap_fill",
"gap_fill_min_area",
"gap_fill_overlap",
+"gap_fill_infill",
"infill_dense",
"infill_connection",
"infill_dense_algo",
@@ -5521,6 +5546,8 @@ void PrintConfigDef::to_prusa(t_config_option_key& opt_key, std::string& value,
"retract_lift_top",
"seam_angle_cost",
"seam_travel_cost",
+"skirt_brim",
+"skirt_distance_from_brim",
"skirt_extrusion_width",
"small_perimeter_min_length",
"small_perimeter_max_length",
@@ -5745,7 +5772,10 @@ double PrintConfig::min_object_distance(const ConfigBase *config, double ref_hei
const double first_layer_height = config->get_abs_value("first_layer_height");
//add the skirt
- if (config->option("skirts")->getInt() > 0 && config->option("skirt_height")->getInt() >= 1 && !config->option("complete_objects_one_skirt")->getBool()) {
+ int skirts = config->option("skirts")->getInt();
+ if (skirts > 0 && ref_height == 0)
+ skirts += config->option("skirt_brim")->getInt();
+ if (skirts > 0 && config->option("skirt_height")->getInt() >= 1 && !config->option("complete_objects_one_skirt")->getBool()) {
if (ref_height == 0) {
skirt_dist = config->option("skirt_distance")->getFloat();
Flow skirt_flow = Flow::new_from_config_width(
@@ -5754,7 +5784,7 @@ double PrintConfig::min_object_distance(const ConfigBase *config, double ref_hei
(float)max_nozzle_diam,
(float)first_layer_height
);
- skirt_dist += skirt_flow.width + (skirt_flow.spacing() * ((double)config->option("skirts")->getInt() - 1));
+ skirt_dist += skirt_flow.width + (skirt_flow.spacing() * ((double)skirts - 1));
base_dist = std::max(base_dist, skirt_dist + 1);
//set to 0 becasue it's incorporated into the base_dist, so we don't want to be added in to it again.
skirt_dist = 0;
@@ -5768,7 +5798,7 @@ double PrintConfig::min_object_distance(const ConfigBase *config, double ref_hei
(float)max_nozzle_diam,
(float)first_layer_height
);
- skirt_dist += skirt_flow.width + (skirt_flow.spacing() * ((double)config->option("skirts")->getInt() - 1));
+ skirt_dist += skirt_flow.width + (skirt_flow.spacing() * ((double)skirts - 1));
}
}
}
diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp
index d6b165be9..8175e11a5 100644
--- a/src/libslic3r/PrintConfig.hpp
+++ b/src/libslic3r/PrintConfig.hpp
@@ -790,6 +790,7 @@ public:
ConfigOptionPercent fill_smooth_distribution;
ConfigOptionFloatOrPercent fill_smooth_width;
ConfigOptionBool gap_fill;
+ ConfigOptionBool gap_fill_last;
ConfigOptionFloatOrPercent gap_fill_min_area;
ConfigOptionPercent gap_fill_overlap;
ConfigOptionFloat gap_fill_speed;
@@ -905,6 +906,7 @@ protected:
OPT_PTR(fill_smooth_distribution);
OPT_PTR(fill_smooth_width);
OPT_PTR(gap_fill);
+ OPT_PTR(gap_fill_last);
OPT_PTR(gap_fill_min_area);
OPT_PTR(gap_fill_overlap);
OPT_PTR(gap_fill_speed);
@@ -1327,7 +1329,9 @@ public:
ConfigOptionFloat resolution;
ConfigOptionFloats retract_before_travel;
ConfigOptionBools retract_layer_change;
+ ConfigOptionInt skirt_brim;
ConfigOptionFloat skirt_distance;
+ ConfigOptionBool skirt_distance_from_brim;
ConfigOptionInt skirt_height;
ConfigOptionFloatOrPercent skirt_extrusion_width;
ConfigOptionBool draft_shield;
@@ -1424,7 +1428,9 @@ protected:
OPT_PTR(resolution);
OPT_PTR(retract_before_travel);
OPT_PTR(retract_layer_change);
+ OPT_PTR(skirt_brim);
OPT_PTR(skirt_distance);
+ OPT_PTR(skirt_distance_from_brim);
OPT_PTR(skirt_extrusion_width);
OPT_PTR(skirt_height);
OPT_PTR(draft_shield);
diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp
index 02c3d5057..457931b7b 100644
--- a/src/libslic3r/PrintObject.cpp
+++ b/src/libslic3r/PrintObject.cpp
@@ -678,6 +678,7 @@ namespace Slic3r {
for (const t_config_option_key& opt_key : opt_keys) {
if (
opt_key == "gap_fill"
+ || opt_key == "gap_fill_last"
|| opt_key == "gap_fill_min_area"
|| opt_key == "only_one_perimeter_top"
|| opt_key == "only_one_perimeter_top_other_algo"
diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h
index a5e8f98dd..71103513b 100644
--- a/src/libslic3r/libslic3r.h
+++ b/src/libslic3r/libslic3r.h
@@ -57,7 +57,7 @@ static constexpr coordf_t RESOLUTION = 0.0125;
#ifdef __linux__
static constexpr coord_t SCALED_RESOLUTION = 12500;
#else
-static constexpr coord_t SCALED_RESOLUTION = 0.0125 * UNSCALING_FACTOR;
+static constexpr coord_t SCALED_RESOLUTION = coord_t(0.0125 * UNSCALING_FACTOR);
#endif
//for creating circles (for brim_ear)
#define POLY_SIDES 24