mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-24 15:13:58 -06:00
Fixed update of slicing back-end with MMU-painted objects after change
of a printer from MMU to non-MMU (when number of extruders changes). Also slightly optimized in case a MMU-painted object is sliced in single extruder mode.
This commit is contained in:
parent
8ce36fb8f1
commit
2a7f204859
2 changed files with 14 additions and 9 deletions
|
@ -815,7 +815,7 @@ static PrintObjectRegions* generate_print_object_regions(
|
||||||
layer_ranges_regions.push_back({ range.layer_height_range, range.config });
|
layer_ranges_regions.push_back({ range.layer_height_range, range.config });
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool is_mm_painted = std::any_of(model_volumes.cbegin(), model_volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); });
|
const bool is_mm_painted = num_extruders > 1 && std::any_of(model_volumes.cbegin(), model_volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); });
|
||||||
update_volume_bboxes(layer_ranges_regions, out->cached_volume_ids, model_volumes, out->trafo_bboxes, is_mm_painted ? 0.f : std::max(0.f, xy_size_compensation));
|
update_volume_bboxes(layer_ranges_regions, out->cached_volume_ids, model_volumes, out->trafo_bboxes, is_mm_painted ? 0.f : std::max(0.f, xy_size_compensation));
|
||||||
|
|
||||||
std::vector<PrintRegion*> region_set;
|
std::vector<PrintRegion*> region_set;
|
||||||
|
@ -952,8 +952,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
|
||||||
m_default_region_config.apply_only(new_full_config, region_diff, true);
|
m_default_region_config.apply_only(new_full_config, region_diff, true);
|
||||||
m_full_print_config = std::move(new_full_config);
|
m_full_print_config = std::move(new_full_config);
|
||||||
if (num_extruders != m_config.nozzle_diameter.size()) {
|
if (num_extruders != m_config.nozzle_diameter.size()) {
|
||||||
num_extruders = m_config.nozzle_diameter.size();
|
num_extruders = m_config.nozzle_diameter.size();
|
||||||
num_extruders_changed = true;
|
num_extruders_changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1071,7 +1071,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
|
||||||
// Check whether a model part volume was added or removed, their transformations or order changed.
|
// Check whether a model part volume was added or removed, their transformations or order changed.
|
||||||
// Only volume IDs, volume types, transformation matrices and their order are checked, configuration and other parameters are NOT checked.
|
// Only volume IDs, volume types, transformation matrices and their order are checked, configuration and other parameters are NOT checked.
|
||||||
bool solid_or_modifier_differ = model_volume_list_changed(model_object, model_object_new, solid_or_modifier_types) ||
|
bool solid_or_modifier_differ = model_volume_list_changed(model_object, model_object_new, solid_or_modifier_types) ||
|
||||||
model_mmu_segmentation_data_changed(model_object, model_object_new);
|
model_mmu_segmentation_data_changed(model_object, model_object_new) ||
|
||||||
|
(model_object_new.is_mm_painted() && num_extruders_changed);
|
||||||
bool supports_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_BLOCKER) ||
|
bool supports_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_BLOCKER) ||
|
||||||
model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_ENFORCER);
|
model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_ENFORCER);
|
||||||
bool layer_height_ranges_differ = ! layer_height_ranges_equal(model_object.layer_config_ranges, model_object_new.layer_config_ranges, model_object_new.layer_height_profile.empty());
|
bool layer_height_ranges_differ = ! layer_height_ranges_equal(model_object.layer_config_ranges, model_object_new.layer_config_ranges, model_object_new.layer_height_profile.empty());
|
||||||
|
@ -1273,7 +1274,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
|
||||||
print_object_regions->ref_cnt_inc();
|
print_object_regions->ref_cnt_inc();
|
||||||
}
|
}
|
||||||
std::vector<unsigned int> painting_extruders;
|
std::vector<unsigned int> painting_extruders;
|
||||||
if (const auto &volumes = print_object.model_object()->volumes;
|
if (const auto &volumes = print_object.model_object()->volumes;
|
||||||
|
num_extruders > 1 &&
|
||||||
std::find_if(volumes.begin(), volumes.end(), [](const ModelVolume *v) { return ! v->mmu_segmentation_facets.empty(); }) != volumes.end()) {
|
std::find_if(volumes.begin(), volumes.end(), [](const ModelVolume *v) { return ! v->mmu_segmentation_facets.empty(); }) != volumes.end()) {
|
||||||
//FIXME be more specific! Don't enumerate extruders that are not used for painting!
|
//FIXME be more specific! Don't enumerate extruders that are not used for painting!
|
||||||
painting_extruders.assign(num_extruders, 0);
|
painting_extruders.assign(num_extruders, 0);
|
||||||
|
|
|
@ -167,8 +167,9 @@ static std::vector<VolumeSlices> slice_volumes_inner(
|
||||||
|
|
||||||
params_base.mode_below = params_base.mode;
|
params_base.mode_below = params_base.mode;
|
||||||
|
|
||||||
const bool is_mm_painted = std::any_of(model_volumes.cbegin(), model_volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); });
|
const size_t num_extruders = print_config.nozzle_diameter.size();
|
||||||
const auto extra_offset = is_mm_painted ? 0.f : std::max(0.f, float(print_object_config.xy_size_compensation.value));
|
const bool is_mm_painted = num_extruders > 1 && std::any_of(model_volumes.cbegin(), model_volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); });
|
||||||
|
const auto extra_offset = is_mm_painted ? 0.f : std::max(0.f, float(print_object_config.xy_size_compensation.value));
|
||||||
|
|
||||||
for (const ModelVolume *model_volume : model_volumes)
|
for (const ModelVolume *model_volume : model_volumes)
|
||||||
if (model_volume_needs_slicing(*model_volume)) {
|
if (model_volume_needs_slicing(*model_volume)) {
|
||||||
|
@ -723,6 +724,7 @@ void PrintObject::slice_volumes()
|
||||||
|
|
||||||
// Is any ModelVolume MMU painted?
|
// Is any ModelVolume MMU painted?
|
||||||
if (const auto& volumes = this->model_object()->volumes;
|
if (const auto& volumes = this->model_object()->volumes;
|
||||||
|
m_print->config().nozzle_diameter.size() > 1 &&
|
||||||
std::find_if(volumes.begin(), volumes.end(), [](const ModelVolume* v) { return !v->mmu_segmentation_facets.empty(); }) != volumes.end()) {
|
std::find_if(volumes.begin(), volumes.end(), [](const ModelVolume* v) { return !v->mmu_segmentation_facets.empty(); }) != volumes.end()) {
|
||||||
|
|
||||||
// If XY Size compensation is also enabled, notify the user that XY Size compensation
|
// If XY Size compensation is also enabled, notify the user that XY Size compensation
|
||||||
|
@ -743,8 +745,9 @@ void PrintObject::slice_volumes()
|
||||||
BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - make_slices in parallel - begin";
|
BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - make_slices in parallel - begin";
|
||||||
{
|
{
|
||||||
// Compensation value, scaled. Only applying the negative scaling here, as the positive scaling has already been applied during slicing.
|
// Compensation value, scaled. Only applying the negative scaling here, as the positive scaling has already been applied during slicing.
|
||||||
const auto xy_compensation_scaled = this->is_mm_painted() ? scaled<float>(0.f) : scaled<float>(std::min(m_config.xy_size_compensation.value, 0.));
|
const size_t num_extruders = print->config().nozzle_diameter.size();
|
||||||
const float elephant_foot_compensation_scaled = (m_config.raft_layers == 0) ?
|
const auto xy_compensation_scaled = (num_extruders > 1 && this->is_mm_painted()) ? scaled<float>(0.f) : scaled<float>(std::min(m_config.xy_size_compensation.value, 0.));
|
||||||
|
const float elephant_foot_compensation_scaled = (m_config.raft_layers == 0) ?
|
||||||
// Only enable Elephant foot compensation if printing directly on the print bed.
|
// Only enable Elephant foot compensation if printing directly on the print bed.
|
||||||
float(scale_(m_config.elefant_foot_compensation.value)) :
|
float(scale_(m_config.elefant_foot_compensation.value)) :
|
||||||
0.f;
|
0.f;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue