mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-21 20:25:20 +00:00
fix: use regular slice_z computation in first layer when ZAA enabled (#13766)
Co-authored-by: Aleksandr Dobkin <alex@dobk.in>
This commit is contained in:
committed by
GitHub
parent
9598e1bb9a
commit
1e4a5589b5
@@ -21,6 +21,32 @@ namespace Slic3r {
|
|||||||
bool PrintObject::clip_multipart_objects = true;
|
bool PrintObject::clip_multipart_objects = true;
|
||||||
bool PrintObject::infill_only_where_needed = false;
|
bool PrintObject::infill_only_where_needed = false;
|
||||||
|
|
||||||
|
static coordf_t compute_slice_z(PrintObject* print_object, size_t i_layer, coordf_t lo, coordf_t hi)
|
||||||
|
{
|
||||||
|
bool zaa_active = false;
|
||||||
|
coordf_t z_offset = 0.0;
|
||||||
|
|
||||||
|
size_t num_regions = print_object->num_printing_regions();
|
||||||
|
for (size_t rid = 0; rid < num_regions; ++rid) {
|
||||||
|
const auto& rcfg = print_object->printing_region(rid).config();
|
||||||
|
if (rcfg.zaa_enabled) {
|
||||||
|
if (!zaa_active || rcfg.zaa_min_z < z_offset)
|
||||||
|
z_offset = rcfg.zaa_min_z;
|
||||||
|
zaa_active = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!zaa_active || i_layer == 0) {
|
||||||
|
return 0.5 * (lo + hi);
|
||||||
|
}
|
||||||
|
|
||||||
|
coordf_t slice_z = lo + z_offset;
|
||||||
|
if ((slice_z < lo && !is_approx(slice_z, lo)) || (slice_z > hi && !is_approx(slice_z, hi))) {
|
||||||
|
throw RuntimeError("Bad min Z value");
|
||||||
|
}
|
||||||
|
return slice_z;
|
||||||
|
}
|
||||||
|
|
||||||
LayerPtrs new_layers(
|
LayerPtrs new_layers(
|
||||||
PrintObject *print_object,
|
PrintObject *print_object,
|
||||||
// Object layers (pairs of bottom/top Z coordinate), without the raft.
|
// Object layers (pairs of bottom/top Z coordinate), without the raft.
|
||||||
@@ -34,24 +60,8 @@ LayerPtrs new_layers(
|
|||||||
for (size_t i_layer = 0; i_layer < object_layers.size(); i_layer += 2) {
|
for (size_t i_layer = 0; i_layer < object_layers.size(); i_layer += 2) {
|
||||||
coordf_t lo = object_layers[i_layer];
|
coordf_t lo = object_layers[i_layer];
|
||||||
coordf_t hi = object_layers[i_layer + 1];
|
coordf_t hi = object_layers[i_layer + 1];
|
||||||
coordf_t slice_z = 0.5 * (lo + hi);
|
coordf_t slice_z = compute_slice_z(print_object, i_layer, lo, hi);
|
||||||
bool zaa_active = false;
|
|
||||||
coordf_t z_offset = 0.0;
|
|
||||||
size_t num_regions = print_object->num_printing_regions();
|
|
||||||
for (size_t rid = 0; rid < num_regions; ++rid) {
|
|
||||||
const auto &rcfg = print_object->printing_region(rid).config();
|
|
||||||
if (rcfg.zaa_enabled) {
|
|
||||||
if (!zaa_active || rcfg.zaa_min_z < z_offset)
|
|
||||||
z_offset = rcfg.zaa_min_z;
|
|
||||||
zaa_active = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (zaa_active) {
|
|
||||||
slice_z = lo + z_offset;
|
|
||||||
if ((slice_z < lo && !is_approx(slice_z, lo)) || (slice_z > hi && !is_approx(slice_z, hi))) {
|
|
||||||
throw RuntimeError("Bad min Z value");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Layer *layer = new Layer(id ++, print_object, hi - lo, hi + zmin, slice_z);
|
Layer *layer = new Layer(id ++, print_object, hi - lo, hi + zmin, slice_z);
|
||||||
out.emplace_back(layer);
|
out.emplace_back(layer);
|
||||||
if (prev != nullptr) {
|
if (prev != nullptr) {
|
||||||
|
|||||||
Reference in New Issue
Block a user