Layer height editing: Fixed to satisfy the minimum layer heigth,

improved wording of the tooltips indicating why a new layer height range
cannot be inserted.
This commit is contained in:
bubnikv 2020-03-14 09:43:55 +01:00
parent af4a5c3f8a
commit 99ff6763a1

View file

@ -2872,13 +2872,13 @@ void ObjectList::del_layer_range(const t_layer_height_range& range)
static double get_min_layer_height(const int extruder_idx) static double get_min_layer_height(const int extruder_idx)
{ {
const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config; const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config;
return config.opt_float("min_layer_height", extruder_idx <= 0 ? 0 : extruder_idx-1); return config.opt_float("min_layer_height", std::max(0, extruder_idx - 1));
} }
static double get_max_layer_height(const int extruder_idx) static double get_max_layer_height(const int extruder_idx)
{ {
const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config; const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config;
int extruder_idx_zero_based = extruder_idx <= 0 ? 0 : extruder_idx-1; int extruder_idx_zero_based = std::max(0, extruder_idx - 1);
double max_layer_height = config.opt_float("max_layer_height", extruder_idx_zero_based); double max_layer_height = config.opt_float("max_layer_height", extruder_idx_zero_based);
// In case max_layer_height is set to zero, it should default to 75 % of nozzle diameter: // In case max_layer_height is set to zero, it should default to 75 % of nozzle diameter:
@ -2888,9 +2888,11 @@ static double get_max_layer_height(const int extruder_idx)
return max_layer_height; return max_layer_height;
} }
// When editing this function, please synchronize the conditions with can_add_new_range_after_current().
void ObjectList::add_layer_range_after_current(const t_layer_height_range current_range) void ObjectList::add_layer_range_after_current(const t_layer_height_range current_range)
{ {
const int obj_idx = get_selected_obj_idx(); const int obj_idx = get_selected_obj_idx();
assert(obj_idx >= 0);
if (obj_idx < 0) if (obj_idx < 0)
// This should not happen. // This should not happen.
return; return;
@ -2924,12 +2926,18 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
{ {
if (current_range.second == next_range.first) if (current_range.second == next_range.first)
{ {
// Splitting the currnet layer heigth range to two. // Splitting the next layer height range to two.
const auto old_config = ranges.at(next_range); const auto old_config = ranges.at(next_range);
const coordf_t delta = (next_range.second - next_range.first); const coordf_t delta = next_range.second - next_range.first;
if (delta >= get_min_layer_height(old_config.opt_int("extruder"))/*0.05f*/) { // Layer height of the current layer.
const coordf_t midl_layer = next_range.first + 0.5 * delta; const coordf_t old_min_layer_height = get_min_layer_height(old_config.opt_int("extruder"));
t_layer_height_range new_range = { midl_layer, next_range.second }; // Layer height of the layer to be inserted.
const coordf_t new_min_layer_height = get_min_layer_height(0);
if (delta >= old_min_layer_height + new_min_layer_height - EPSILON) {
const coordf_t middle_layer_z = (new_min_layer_height > 0.5 * delta) ?
next_range.second - new_min_layer_height :
next_range.first + std::max(old_min_layer_height, 0.5 * delta);
t_layer_height_range new_range = { middle_layer_z, next_range.second };
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add Height Range"))); Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add Height Range")));
changed = true; changed = true;
@ -2943,12 +2951,12 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
ranges[new_range] = old_config; ranges[new_range] = old_config;
add_layer_item(new_range, layers_item, layer_idx); add_layer_item(new_range, layers_item, layer_idx);
new_range = { current_range.second, midl_layer }; new_range = { current_range.second, middle_layer_z };
ranges[new_range] = get_default_layer_config(obj_idx); ranges[new_range] = get_default_layer_config(obj_idx);
add_layer_item(new_range, layers_item, layer_idx); add_layer_item(new_range, layers_item, layer_idx);
} }
} }
else else if (next_range.first - current_range.second >= get_min_layer_height(0) - EPSILON)
{ {
// Filling in a gap between the current and a new layer height range with a new one. // Filling in a gap between the current and a new layer height range with a new one.
take_snapshot(_(L("Add Height Range"))); take_snapshot(_(L("Add Height Range")));
@ -2970,38 +2978,47 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
select_item(layers_item); select_item(layers_item);
} }
// Returning an empty string means that the layer could be added after the current layer.
// Otherwise an error tooltip is returned.
// When editing this function, please synchronize the conditions with add_layer_range_after_current().
wxString ObjectList::can_add_new_range_after_current(const t_layer_height_range current_range) wxString ObjectList::can_add_new_range_after_current(const t_layer_height_range current_range)
{ {
wxString ret;
const int obj_idx = get_selected_obj_idx(); const int obj_idx = get_selected_obj_idx();
assert(obj_idx >= 0);
if (obj_idx < 0) if (obj_idx < 0)
// This should not happen. // This should not happen.
return ret; return "ObjectList assert";
t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges; t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
auto it_range = ranges.find(current_range); auto it_range = ranges.find(current_range);
assert(it_range != ranges.end()); assert(it_range != ranges.end());
if (it_range == ranges.end()) if (it_range == ranges.end())
// This shoudl not happen. // This shoudl not happen.
return ret; return "ObjectList assert";
auto it_next_range = it_range; auto it_next_range = it_range;
if (++ it_next_range == ranges.end()) if (++ it_next_range == ranges.end())
return ret; // Adding a layer after the last layer is always possible.
return "";
if (const std::pair<coordf_t, coordf_t>& next_range = it_next_range->first; current_range.second <= next_range.first) if (const std::pair<coordf_t, coordf_t>& next_range = it_next_range->first; current_range.second <= next_range.first)
{ {
if (current_range.second == next_range.first && if (current_range.second == next_range.first) {
next_range.second - next_range.first < get_min_layer_height(ranges.at(next_range).opt_int("extruder"))) if (next_range.second - next_range.first < get_min_layer_height(it_next_range->second.opt_int("extruder")) + get_min_layer_height(0) - EPSILON)
ret = _(L("A difference between ranges is a less than minimum layer height.")); return _(L("Cannot insert a new layer range after the current layer range.\n"
"The next layer range is too thin to be split to two\n"
"without violating the minimum layer height."));
} else if (next_range.first - current_range.second < get_min_layer_height(0) - EPSILON) {
return _(L("Cannot insert a new layer range between the current and the next layer range.\n"
"The gap between the current layer range and the next layer range\n"
"is thinner than the minimum layer height allowed."));
} }
else } else
ret = _(L("End of current range is bigger then next one.")); return _(L("Cannot insert a new layer range after the current layer range.\n"
"Current layer range overlaps with the next layer range."));
if (!ret.IsEmpty()) // All right, new layer height range could be inserted.
ret += "\n" + _(L("New range between them couldn't be added.")); return "";
return ret;
} }
void ObjectList::add_layer_item(const t_layer_height_range& range, void ObjectList::add_layer_item(const t_layer_height_range& range,