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:
authorsupermerill <merill@free.fr>2022-08-11 04:30:46 +0300
committersupermerill <merill@free.fr>2022-08-11 04:30:46 +0300
commit8c156d6db20d7da7443a5eaa26421264386999bb (patch)
tree7a26b40b1c8c844e7320565ea8c2865984bb0259
parent79bb84d000711382b0531c29de9b8a7049069c39 (diff)
parent99644f0b35c05c149bfacd750aa3e8516a6f1238 (diff)
some fixes & elegoo profiles2.5.59.0master_dev
m---------resources/profiles0
-rw-r--r--src/libslic3r/GCode.cpp68
-rw-r--r--src/libslic3r/PrintObjectSlice.cpp4
-rw-r--r--src/slic3r/GUI/OptionsGroup.cpp7
4 files changed, 54 insertions, 25 deletions
diff --git a/resources/profiles b/resources/profiles
-Subproject 5c71cb3a7c5ec828dba71ebb92f14e2c25d46ae
+Subproject 5559a75b7acb14ae0c8c222b3a9c1fa7239a317
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index 6dfa1fe10..78d251f75 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -3764,12 +3764,15 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
std::cout << "\n";
#endif
+ //useful var
+ const double nozzle_diam = (EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0));
+
//no-seam code path redirect
if (original_loop.role() == ExtrusionRole::erExternalPerimeter && (original_loop.loop_role() & elrVase) != 0 && !this->m_config.spiral_vase
//but not for the first layer
&& this->m_layer->id() > 0
//exclude if min_layer_height * 2 > layer_height (increase from 2 to 3 because it's working but uses in-between)
- && this->m_layer->height >= m_config.min_layer_height.get_abs_value(m_writer.tool()->id(), m_config.nozzle_diameter.get_at(m_writer.tool()->id())) * 2 - EPSILON
+ && this->m_layer->height >= m_config.min_layer_height.get_abs_value(m_writer.tool()->id(), nozzle_diam) * 2 - EPSILON
) {
return extrude_loop_vase(original_loop, description, speed, lower_layer_edge_grid);
}
@@ -3820,23 +3823,34 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
// we discard it in that case
ExtrusionPaths& building_paths = loop_to_seam.paths;
if (m_enable_loop_clipping && m_writer.tool_is_extruder()) {
- coordf_t clip_length = scale_(m_config.seam_gap.get_abs_value(m_writer.tool()->id(), EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
- coordf_t min_clip_length = scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)) * 0.15;
+ coordf_t clip_length = scale_(m_config.seam_gap.get_abs_value(m_writer.tool()->id(), nozzle_diam));
+ coordf_t min_clip_length = scale_(nozzle_diam) * 0.15;
- // get paths
- ExtrusionPaths clipped;
- if (clip_length > min_clip_length) {
- // remove clip_length, like normally, but keep the removed part
- clipped = clip_end(building_paths, clip_length);
- // remove min_clip_length from the removed paths
- clip_end(clipped, min_clip_length);
- // ensure that the removed paths are travels
- for (ExtrusionPath& ep : clipped)
- ep.mm3_per_mm = 0;
- // re-add removed paths as travels.
- append(building_paths, clipped);
- } else {
- clip_end(building_paths, clip_length);
+ if (clip_length > full_loop_length / 4) {
+ //fall back to min_clip_length
+ if (clip_length > full_loop_length / 2) {
+ clip_length = min_clip_length;
+ } else {
+ float percent = (float(clip_length) / (float(full_loop_length) / 4)) - 1;
+ clip_length = clip_length * (1- percent) + min_clip_length * percent;
+ }
+ }
+ if (clip_length < full_loop_length / 4) {
+ // get paths
+ ExtrusionPaths clipped;
+ if (clip_length > min_clip_length) {
+ // remove clip_length, like normally, but keep the removed part
+ clipped = clip_end(building_paths, clip_length);
+ // remove min_clip_length from the removed paths
+ clip_end(clipped, min_clip_length);
+ // ensure that the removed paths are travels
+ for (ExtrusionPath& ep : clipped)
+ ep.mm3_per_mm = 0;
+ // re-add removed paths as travels.
+ append(building_paths, clipped);
+ } else {
+ clip_end(building_paths, clip_length);
+ }
}
}
if (building_paths.empty()) return "";
@@ -3844,8 +3858,8 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
// apply the small perimeter speed
if (speed == -1 && is_perimeter(paths.front().role()) && paths.front().role() != erThinWall) {
- double min_length = scale_d(this->m_config.small_perimeter_min_length.get_abs_value(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
- double max_length = scale_d(this->m_config.small_perimeter_max_length.get_abs_value(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
+ double min_length = scale_d(this->m_config.small_perimeter_min_length.get_abs_value(nozzle_diam));
+ double max_length = scale_d(this->m_config.small_perimeter_max_length.get_abs_value(nozzle_diam));
if (full_loop_length < max_length) {
if (full_loop_length <= min_length) {
speed = SMALL_PERIMETER_SPEED_RATIO_OFFSET;
@@ -3889,7 +3903,6 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
Vec2d next_pos = next_point.cast<double>();
Vec2d vec_dist = next_pos - current_pos;
double vec_norm = vec_dist.norm();
- const double nozzle_diam = (EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0));
const double setting_max_depth = (m_config.wipe_inside_depth.get_abs_value(m_writer.tool()->id(), nozzle_diam));
coordf_t dist = scale_d(nozzle_diam) / 2;
Point pt = (current_pos + vec_dist * (2 * dist / vec_norm)).cast<coord_t>();
@@ -3933,6 +3946,16 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
//wipe for External Perimeter (and not vase)
if (paths.back().role() == erExternalPerimeter && m_layer != NULL && m_config.perimeters.value > 0 && paths.front().size() >= 2 && paths.back().polyline.points.size() >= 2
&& (m_enable_loop_clipping && m_writer.tool_is_extruder()) ) {
+ double dist_wipe_extra_perimeter = EXTRUDER_CONFIG_WITH_DEFAULT(wipe_extra_perimeter, 0);
+
+ //safeguard : if not possible to wipe, abord.
+ if (paths.size() == 1 && paths.front().size() <= 2) {
+ return gcode;
+ }
+ //TODO: abord if the wipe is too big for a mini loop (in a better way)
+ if (paths.size() == 1 && unscaled(paths.front().length()) < EXTRUDER_CONFIG_WITH_DEFAULT(wipe_extra_perimeter, 0) + nozzle_diam) {
+ return gcode;
+ }
//get points for wipe
Point prev_point = *(paths.back().polyline.points.end() - 2); // second to last point
// *(paths.back().polyline.points.end() - 2) this is the same as (or should be) as paths.front().first_point();
@@ -3946,8 +3969,8 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Start) + "\n";
//extra wipe before the little move.
- if (EXTRUDER_CONFIG_WITH_DEFAULT(wipe_extra_perimeter, 0) > 0) {
- coordf_t wipe_dist = scale_(EXTRUDER_CONFIG_WITH_DEFAULT(wipe_extra_perimeter,0));
+ if (dist_wipe_extra_perimeter > 0) {
+ coordf_t wipe_dist = scale_(dist_wipe_extra_perimeter);
ExtrusionPaths paths_wipe;
m_wipe.reset_path();
for (int i = 0; i < paths.size(); i++) {
@@ -4016,7 +4039,6 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
Vec2d next_pos = next_point.cast<double>();
Vec2d vec_dist = next_pos - current_pos;
double vec_norm = vec_dist.norm();
- const double nozzle_diam = (EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0));
const double setting_max_depth = (m_config.wipe_inside_depth.get_abs_value(m_writer.tool()->id(), nozzle_diam));
coordf_t dist = scale_d(nozzle_diam) / 2;
if (nozzle_diam != 0 && setting_max_depth > nozzle_diam * 0.55)
diff --git a/src/libslic3r/PrintObjectSlice.cpp b/src/libslic3r/PrintObjectSlice.cpp
index a135c6569..06d029802 100644
--- a/src/libslic3r/PrintObjectSlice.cpp
+++ b/src/libslic3r/PrintObjectSlice.cpp
@@ -502,7 +502,8 @@ std::string fix_slicing_errors(LayerPtrs &layers, const std::function<void()> &t
while (! layers.empty() && (layers.front()->lslices.empty() || layers.front()->empty())) {
delete layers.front();
layers.erase(layers.begin());
- layers.front()->lower_layer = nullptr;
+ if(!layers.empty())
+ layers.front()->lower_layer = nullptr;
for (size_t i = 0; i < layers.size(); ++ i)
layers[i]->set_id(layers[i]->id() - 1);
}
@@ -697,6 +698,7 @@ ExPolygons PrintObject::_shrink_contour_holes(double contour_delta, double not_c
Polygons contours;
ExPolygons holes;
for (const Polygon& hole : ex_poly.holes) {
+ assert(hole.points.size() >= 3);
//check if convex to reduce it
// check whether first point forms a convex angle
//note: we allow a deviation of 5.7° (0.01rad = 0.57°)
diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp
index cf02df6f8..fa63bd0ad 100644
--- a/src/slic3r/GUI/OptionsGroup.cpp
+++ b/src/slic3r/GUI/OptionsGroup.cpp
@@ -594,7 +594,12 @@ void OptionsGroup::update_script_presets() {
if (key_opt.second.opt.is_script) {
Field* field = get_field(key_opt.first);
if (field) {
- this->set_value(key_opt.first, key_opt.second.script->call_script_function_get_value(key_opt.second.opt));
+ boost::any val = key_opt.second.script->call_script_function_get_value(key_opt.second.opt);
+ if (val.empty()) {
+ MessageDialog(nullptr, "Error, can't find the script to get the value for the widget '" + key_opt.first + "'", _L("Error"), wxOK | wxICON_ERROR).ShowModal();
+ } else {
+ this->set_value(key_opt.first, val);
+ }
} //if not, it will set at ConfigOptionsGroup::reload_config()
}
}