mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-03 20:35:11 +08:00
Custom supports data change forces invalidation of supports step
This commit is contained in:
parent
8d95345ede
commit
d74b5cb1da
@ -1948,6 +1948,16 @@ bool model_volume_list_changed(const ModelObject &model_object_old, const ModelO
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool model_custom_supports_data_changed(const ModelObject& mo, const ModelObject& mo_new) {
|
||||||
|
assert(! model_volume_list_changed(mo, mo_new, ModelVolumeType::MODEL_PART));
|
||||||
|
assert(mo.volumes.size() == mo_new.volumes.size());
|
||||||
|
for (size_t i=0; i<mo.volumes.size(); ++i) {
|
||||||
|
if (! mo_new.volumes[i]->m_supported_facets.is_same_as(mo.volumes[i]->m_supported_facets))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
extern bool model_has_multi_part_objects(const Model &model)
|
extern bool model_has_multi_part_objects(const Model &model)
|
||||||
{
|
{
|
||||||
for (const ModelObject *model_object : model.objects)
|
for (const ModelObject *model_object : model.objects)
|
||||||
|
@ -215,8 +215,8 @@ public:
|
|||||||
when user expects that. */
|
when user expects that. */
|
||||||
Vec3d origin_translation;
|
Vec3d origin_translation;
|
||||||
|
|
||||||
Model* get_model() { return m_model; };
|
Model* get_model() { return m_model; }
|
||||||
const Model* get_model() const { return m_model; };
|
const Model* get_model() const { return m_model; }
|
||||||
|
|
||||||
ModelVolume* add_volume(const TriangleMesh &mesh);
|
ModelVolume* add_volume(const TriangleMesh &mesh);
|
||||||
ModelVolume* add_volume(TriangleMesh &&mesh);
|
ModelVolume* add_volume(TriangleMesh &&mesh);
|
||||||
@ -402,14 +402,13 @@ class FacetsAnnotation {
|
|||||||
public:
|
public:
|
||||||
using ClockType = std::chrono::steady_clock;
|
using ClockType = std::chrono::steady_clock;
|
||||||
|
|
||||||
|
|
||||||
std::vector<int> get_facets(FacetSupportType type) const;
|
std::vector<int> get_facets(FacetSupportType type) const;
|
||||||
void set_facet(int idx, FacetSupportType type);
|
void set_facet(int idx, FacetSupportType type);
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
ClockType::time_point get_timestamp() const { return timestamp; }
|
ClockType::time_point get_timestamp() const { return timestamp; }
|
||||||
bool is_newer_than(const FacetsAnnotation& other) const {
|
bool is_same_as(const FacetsAnnotation& other) const {
|
||||||
return timestamp > other.get_timestamp();
|
return timestamp == other.get_timestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -455,7 +454,7 @@ public:
|
|||||||
FacetsAnnotation m_supported_facets;
|
FacetsAnnotation m_supported_facets;
|
||||||
|
|
||||||
// A parent object owning this modifier volume.
|
// A parent object owning this modifier volume.
|
||||||
ModelObject* get_object() const { return this->object; };
|
ModelObject* get_object() const { return this->object; }
|
||||||
ModelVolumeType type() const { return m_type; }
|
ModelVolumeType type() const { return m_type; }
|
||||||
void set_type(const ModelVolumeType t) { m_type = t; }
|
void set_type(const ModelVolumeType t) { m_type = t; }
|
||||||
bool is_model_part() const { return m_type == ModelVolumeType::MODEL_PART; }
|
bool is_model_part() const { return m_type == ModelVolumeType::MODEL_PART; }
|
||||||
@ -859,7 +858,7 @@ public:
|
|||||||
std::string propose_export_file_name_and_path(const std::string &new_extension) const;
|
std::string propose_export_file_name_and_path(const std::string &new_extension) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit Model(int) : ObjectBase(-1) { assert(this->id().invalid()); };
|
explicit Model(int) : ObjectBase(-1) { assert(this->id().invalid()); }
|
||||||
void assign_new_unique_ids_recursive();
|
void assign_new_unique_ids_recursive();
|
||||||
void update_links_bottom_up_recursive();
|
void update_links_bottom_up_recursive();
|
||||||
|
|
||||||
@ -886,6 +885,10 @@ extern bool model_object_list_extended(const Model &model_old, const Model &mode
|
|||||||
// than the old ModelObject.
|
// than the old ModelObject.
|
||||||
extern bool model_volume_list_changed(const ModelObject &model_object_old, const ModelObject &model_object_new, const ModelVolumeType type);
|
extern bool model_volume_list_changed(const ModelObject &model_object_old, const ModelObject &model_object_new, const ModelVolumeType type);
|
||||||
|
|
||||||
|
// Test whether the now ModelObject has newer custom supports data than the old one.
|
||||||
|
// The function assumes that volumes list is synchronized.
|
||||||
|
extern bool model_custom_supports_data_changed(const ModelObject& mo, const ModelObject& mo_new);
|
||||||
|
|
||||||
// If the model has multi-part objects, then it is currently not supported by the SLA mode.
|
// If the model has multi-part objects, then it is currently not supported by the SLA mode.
|
||||||
// Either the model cannot be loaded, or a SLA printer has to be activated.
|
// Either the model cannot be loaded, or a SLA printer has to be activated.
|
||||||
extern bool model_has_multi_part_objects(const Model &model);
|
extern bool model_has_multi_part_objects(const Model &model);
|
||||||
|
@ -855,7 +855,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
|
|||||||
}
|
}
|
||||||
// Copy content of the ModelObject including its ID, do not change the parent.
|
// Copy content of the ModelObject including its ID, do not change the parent.
|
||||||
model_object.assign_copy(model_object_new);
|
model_object.assign_copy(model_object_new);
|
||||||
} else if (support_blockers_differ || support_enforcers_differ) {
|
} else if (support_blockers_differ || support_enforcers_differ || model_custom_supports_data_changed(model_object, model_object_new)) {
|
||||||
// First stop background processing before shuffling or deleting the ModelVolumes in the ModelObject's list.
|
// First stop background processing before shuffling or deleting the ModelVolumes in the ModelObject's list.
|
||||||
this->call_cancel_callback();
|
this->call_cancel_callback();
|
||||||
update_apply_status(false);
|
update_apply_status(false);
|
||||||
@ -863,9 +863,11 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
|
|||||||
auto range = print_object_status.equal_range(PrintObjectStatus(model_object.id()));
|
auto range = print_object_status.equal_range(PrintObjectStatus(model_object.id()));
|
||||||
for (auto it = range.first; it != range.second; ++ it)
|
for (auto it = range.first; it != range.second; ++ it)
|
||||||
update_apply_status(it->print_object->invalidate_step(posSupportMaterial));
|
update_apply_status(it->print_object->invalidate_step(posSupportMaterial));
|
||||||
|
if (support_enforcers_differ || support_blockers_differ) {
|
||||||
// Copy just the support volumes.
|
// Copy just the support volumes.
|
||||||
model_volume_list_update_supports(model_object, model_object_new);
|
model_volume_list_update_supports(model_object, model_object_new);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (! model_parts_differ && ! modifiers_differ) {
|
if (! model_parts_differ && ! modifiers_differ) {
|
||||||
// Synchronize Object's config.
|
// Synchronize Object's config.
|
||||||
bool object_config_changed = model_object.config != model_object_new.config;
|
bool object_config_changed = model_object.config != model_object_new.config;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user