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:
parent
af4a5c3f8a
commit
99ff6763a1
1 changed files with 41 additions and 24 deletions
|
@ -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"
|
||||||
else
|
"without violating the minimum layer height."));
|
||||||
ret = _(L("End of current range is bigger then next one."));
|
} 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
|
||||||
|
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,
|
||||||
|
|
Loading…
Reference in a new issue