setting to decide from what the skirt is drawned (objects or brim)

supermerill/SuperSlicer#747
This commit is contained in:
supermerill 2021-08-21 20:02:48 +02:00
parent 1c3ad9de01
commit a2a2f38d41
7 changed files with 44 additions and 11 deletions

View File

@ -174,7 +174,10 @@ group:title_width$19:Ironing post-process (This will go on top of infills and pe
page:Skirt & Brim:skirt+brim
group:Skirt
setting:skirts
setting:skirt_distance
line:Distance
setting:skirt_distance
setting:label$from brim:sidetext$else from object:skirt_distance_from_brim
end_line
setting:skirt_height
setting:draft_shield
setting:skirt_brim

View File

@ -527,7 +527,10 @@ 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",

View File

@ -202,6 +202,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
|| 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"
@ -327,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;
@ -1645,13 +1648,19 @@ BoundingBox Print::total_bounding_box() const
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)
@ -1934,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;
@ -1983,7 +1998,8 @@ void Print::_make_skirt(const PrintObjectPtrs &objects, ExtrusionEntityCollectio
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);

View File

@ -3298,6 +3298,14 @@ 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;
@ -5539,6 +5547,7 @@ void PrintConfigDef::to_prusa(t_config_option_key& opt_key, std::string& value,
"seam_angle_cost",
"seam_travel_cost",
"skirt_brim",
"skirt_distance_from_brim",
"skirt_extrusion_width",
"small_perimeter_min_length",
"small_perimeter_max_length",

View File

@ -1331,6 +1331,7 @@ public:
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;
@ -1429,6 +1430,7 @@ protected:
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);

View File

@ -440,7 +440,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
bool have_skirt = config->opt_int("skirts") > 0;
toggle_field("skirt_height", have_skirt && !config->opt_bool("draft_shield"));
toggle_field("skirt_width", have_skirt);
for (auto el : { "skirt_distance", "skirt_brim", "draft_shield", "min_skirt_length" })
for (auto el : { "skirt_brim", "skirt_distance", "skirt_distance_from_brim", "draft_shield", "min_skirt_length" })
toggle_field(el, have_skirt);
bool have_brim = config->opt_float("brim_width") > 0 || config->opt_float("brim_width_interior") > 0;

View File

@ -1984,7 +1984,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
"first_layer_extrusion_width",
"perimeter_extrusion_width",
"extrusion_width",
"skirts", "skirt_brim", "skirt_distance", "skirt_height", "draft_shield",
"skirts", "skirt_brim", "skirt_distance", "skirt_distance_from_brim", "skirt_height", "draft_shield",
"brim_width", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material",
"wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle",
"wipe_tower_brim",