From 5cd697bdc2c86ccfd03b180b6e1c3a8a53bfcd60 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 16 Feb 2024 08:11:50 +0100 Subject: [PATCH 1/4] Refactor CutID - first part (SPE-2519) --- src/libslic3r/Format/3mf.cpp | 8 ++--- src/libslic3r/Model.cpp | 2 +- src/libslic3r/Model.hpp | 2 +- src/libslic3r/ObjectID.hpp | 59 +++++++++++------------------------- 4 files changed, 24 insertions(+), 47 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 3dc98acf8a..7eea652c0c 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -1191,9 +1191,9 @@ namespace Slic3r { for (const auto& obj_cut_info : object_tree) { if (obj_cut_info.first == "cut_id") { pt::ptree cut_id_tree = obj_cut_info.second; - cut_id = CutObjectBase(ObjectID( cut_id_tree.get(".id")), - cut_id_tree.get(".check_sum"), - cut_id_tree.get(".connectors_cnt")); + cut_id = CutObjectBase(cut_id_tree.get(".id"), + cut_id_tree.get(".check_sum"), + cut_id_tree.get(".connectors_cnt")); } if (obj_cut_info.first == "connectors") { pt::ptree cut_connectors_tree = obj_cut_info.second; @@ -3360,7 +3360,7 @@ namespace Slic3r { pt::ptree& cut_id_tree = obj_tree.add("cut_id", ""); // store cut_id atributes - cut_id_tree.put(".id", object->cut_id.id().id); + cut_id_tree.put(".id", object->cut_id.id()); cut_id_tree.put(".check_sum", object->cut_id.check_sum()); cut_id_tree.put(".connectors_cnt", object->cut_id.connectors_cnt()); diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 3fdfee91be..434f479e61 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -678,7 +678,7 @@ ModelObject& ModelObject::assign_copy(const ModelObject &rhs) this->layer_height_profile = rhs.layer_height_profile; this->printable = rhs.printable; this->origin_translation = rhs.origin_translation; - this->cut_id.copy(rhs.cut_id); + this->cut_id = rhs.cut_id; this->copy_transformation_caches(rhs); this->clear_volumes(); diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 95dc96a36f..2078cd2081 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -506,7 +506,7 @@ public: bool has_negative_volume_mesh() const; // Detect if object has at least one sla drain hole bool has_sla_drain_holes() const { return !sla_drain_holes.empty(); } - bool is_cut() const { return cut_id.id().valid(); } + bool is_cut() const { return cut_id.valid(); } bool has_connectors() const; private: diff --git a/src/libslic3r/ObjectID.hpp b/src/libslic3r/ObjectID.hpp index c225092b9a..77cac44149 100644 --- a/src/libslic3r/ObjectID.hpp +++ b/src/libslic3r/ObjectID.hpp @@ -140,61 +140,38 @@ private: template void serialize(Archive &ar) { ar(m_timestamp); } }; -class CutObjectBase : public ObjectBase +class CutObjectBase { - // check sum of CutParts in initial Object - size_t m_check_sum{ 1 }; - // connectors count - size_t m_connectors_cnt{ 0 }; + size_t m_unique_id; // 0 = invalid + size_t m_check_sum; // check sum of CutParts in initial Object + size_t m_connectors_cnt; // connectors count public: - // Default Constructor to assign an invalid ID - CutObjectBase() : ObjectBase(-1) {} - // Constructor with ignored int parameter to assign an invalid ID, to be replaced - // by an existing ID copied from elsewhere. - CutObjectBase(int) : ObjectBase(-1) {} - // Constructor to initialize full information from 3mf - CutObjectBase(ObjectID id, size_t check_sum, size_t connectors_cnt) : ObjectBase(id), m_check_sum(check_sum), m_connectors_cnt(connectors_cnt) {} - // The class tree will have virtual tables and type information. - virtual ~CutObjectBase() = default; + CutObjectBase() { invalidate(); } + CutObjectBase(size_t id, size_t check_sum, size_t connectors_cnt) : + m_unique_id{ id }, m_check_sum{ check_sum }, m_connectors_cnt{ connectors_cnt } {} - bool operator<(const CutObjectBase& other) const { return other.id() > this->id(); } - bool operator==(const CutObjectBase& other) const { return other.id() == this->id(); } - - void copy(const CutObjectBase& rhs) { - this->copy_id(rhs); - this->m_check_sum = rhs.check_sum(); - this->m_connectors_cnt = rhs.connectors_cnt() ; - } - CutObjectBase& operator=(const CutObjectBase& other) { - this->copy(other); - return *this; - } - - void invalidate() { - set_invalid_id(); + void invalidate() { + m_unique_id = 0; m_check_sum = 1; m_connectors_cnt = 0; } - - void init() { this->set_new_unique_id(); } - bool has_same_id(const CutObjectBase& rhs) { return this->id() == rhs.id(); } - bool is_equal(const CutObjectBase& rhs) { return this->id() == rhs.id() && - this->check_sum() == rhs.check_sum() && - this->connectors_cnt() == rhs.connectors_cnt() ; } - + void init() { m_unique_id = 1 + rand(); } + bool has_same_id(const CutObjectBase& rhs) const { return id() == rhs.id(); } + bool is_equal(const CutObjectBase& rhs) const { return id() == rhs.id() && + check_sum() == rhs.check_sum() && + connectors_cnt() == rhs.connectors_cnt() ; } + size_t id() const { return m_unique_id; } + bool valid() const { return m_unique_id != 0; } size_t check_sum() const { return m_check_sum; } - void set_check_sum(size_t cs) { m_check_sum = cs; } void increase_check_sum(size_t cnt) { m_check_sum += cnt; } size_t connectors_cnt() const { return m_connectors_cnt; } void increase_connectors_cnt(size_t connectors_cnt) { m_connectors_cnt += connectors_cnt; } private: - friend class cereal::access; - template void serialize(Archive& ar) { - ar(cereal::base_class(this)); - ar(m_check_sum, m_connectors_cnt); + template void serialize(Archive &ar) { + ar(m_unique_id, m_check_sum, m_connectors_cnt); } }; From 3913f5c49ed4eb6482b10744d5ccba6c2db779fd Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 16 Feb 2024 12:26:04 +0100 Subject: [PATCH 2/4] Moved into Model.hpp --- src/libslic3r/Model.hpp | 35 ++++++++++++++++++++++++++++++++ src/libslic3r/ObjectID.hpp | 41 -------------------------------------- 2 files changed, 35 insertions(+), 41 deletions(-) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 2078cd2081..346d585235 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -233,6 +233,41 @@ private: friend class ModelObject; }; +class CutObjectBase +{ + size_t m_unique_id; // 0 = invalid + size_t m_check_sum; // check sum of CutParts in initial Object + size_t m_connectors_cnt; // connectors count + +public: + CutObjectBase() { invalidate(); } + CutObjectBase(size_t id, size_t check_sum, size_t connectors_cnt) : + m_unique_id{ id }, m_check_sum{ check_sum }, m_connectors_cnt{ connectors_cnt } {} + + void invalidate() { + m_unique_id = 0; + m_check_sum = 1; + m_connectors_cnt = 0; + } + void init() { m_unique_id = 1 + rand(); } + bool has_same_id(const CutObjectBase& rhs) const { return id() == rhs.id(); } + bool is_equal(const CutObjectBase& rhs) const { return id() == rhs.id() && + check_sum() == rhs.check_sum() && + connectors_cnt() == rhs.connectors_cnt() ; } + size_t id() const { return m_unique_id; } + bool valid() const { return m_unique_id != 0; } + size_t check_sum() const { return m_check_sum; } + void increase_check_sum(size_t cnt) { m_check_sum += cnt; } + + size_t connectors_cnt() const { return m_connectors_cnt; } + void increase_connectors_cnt(size_t connectors_cnt) { m_connectors_cnt += connectors_cnt; } + +private: + template void serialize(Archive &ar) { + ar(m_unique_id, m_check_sum, m_connectors_cnt); + } +}; + enum class CutConnectorType : int { Plug , Dowel diff --git a/src/libslic3r/ObjectID.hpp b/src/libslic3r/ObjectID.hpp index 77cac44149..529538074d 100644 --- a/src/libslic3r/ObjectID.hpp +++ b/src/libslic3r/ObjectID.hpp @@ -6,12 +6,6 @@ #define slic3r_ObjectID_hpp_ #include -#include -#include -#include -#include -#include -#include namespace Slic3r { @@ -140,41 +134,6 @@ private: template void serialize(Archive &ar) { ar(m_timestamp); } }; -class CutObjectBase -{ - size_t m_unique_id; // 0 = invalid - size_t m_check_sum; // check sum of CutParts in initial Object - size_t m_connectors_cnt; // connectors count - -public: - CutObjectBase() { invalidate(); } - CutObjectBase(size_t id, size_t check_sum, size_t connectors_cnt) : - m_unique_id{ id }, m_check_sum{ check_sum }, m_connectors_cnt{ connectors_cnt } {} - - void invalidate() { - m_unique_id = 0; - m_check_sum = 1; - m_connectors_cnt = 0; - } - void init() { m_unique_id = 1 + rand(); } - bool has_same_id(const CutObjectBase& rhs) const { return id() == rhs.id(); } - bool is_equal(const CutObjectBase& rhs) const { return id() == rhs.id() && - check_sum() == rhs.check_sum() && - connectors_cnt() == rhs.connectors_cnt() ; } - size_t id() const { return m_unique_id; } - bool valid() const { return m_unique_id != 0; } - size_t check_sum() const { return m_check_sum; } - void increase_check_sum(size_t cnt) { m_check_sum += cnt; } - - size_t connectors_cnt() const { return m_connectors_cnt; } - void increase_connectors_cnt(size_t connectors_cnt) { m_connectors_cnt += connectors_cnt; } - -private: - template void serialize(Archive &ar) { - ar(m_unique_id, m_check_sum, m_connectors_cnt); - } -}; - // Unique object / instance ID for the wipe tower. extern ObjectID wipe_tower_object_id(); extern ObjectID wipe_tower_instance_id(); From fd0e9b1597410aae43cf964af9a50ab8706ec429 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 16 Feb 2024 12:30:06 +0100 Subject: [PATCH 3/4] Changed the way random numbers are generated --- src/libslic3r/Model.hpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 346d585235..f85470e431 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -35,6 +35,7 @@ #include #include #include +#include namespace cereal { class BinaryInputArchive; @@ -233,6 +234,7 @@ private: friend class ModelObject; }; + class CutObjectBase { size_t m_unique_id; // 0 = invalid @@ -249,7 +251,12 @@ public: m_check_sum = 1; m_connectors_cnt = 0; } - void init() { m_unique_id = 1 + rand(); } + void init() { + std::random_device rd; + std::mt19937_64 mt(rd() + time(NULL)); + std::uniform_int_distribution dist(1, std::numeric_limits::max()); + m_unique_id = dist(mt); + } bool has_same_id(const CutObjectBase& rhs) const { return id() == rhs.id(); } bool is_equal(const CutObjectBase& rhs) const { return id() == rhs.id() && check_sum() == rhs.check_sum() && From a666effea70f53b3e4d43d8e21f9f91df97ced37 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 16 Feb 2024 22:52:42 +0100 Subject: [PATCH 4/4] Compilation fixes, renamed CutObjectBase to CutId --- src/libslic3r/Format/3mf.cpp | 10 ++++----- src/libslic3r/Model.hpp | 33 ++++++++++++++-------------- src/slic3r/GUI/GUI_ObjectList.cpp | 6 ++--- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 12 +++++----- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 7eea652c0c..f6dc10ae82 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -474,7 +474,7 @@ namespace Slic3r { float r_tolerance; float h_tolerance; }; - CutObjectBase id; + CutId id; std::vector connectors; }; @@ -1185,15 +1185,15 @@ namespace Slic3r { continue; } - CutObjectBase cut_id; + CutId cut_id; std::vector connectors; for (const auto& obj_cut_info : object_tree) { if (obj_cut_info.first == "cut_id") { pt::ptree cut_id_tree = obj_cut_info.second; - cut_id = CutObjectBase(cut_id_tree.get(".id"), - cut_id_tree.get(".check_sum"), - cut_id_tree.get(".connectors_cnt")); + cut_id = CutId(cut_id_tree.get(".id"), + cut_id_tree.get(".check_sum"), + cut_id_tree.get(".connectors_cnt")); } if (obj_cut_info.first == "connectors") { pt::ptree cut_connectors_tree = obj_cut_info.second; diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index f85470e431..fe27806b4b 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -235,17 +235,25 @@ private: }; -class CutObjectBase +class CutId { size_t m_unique_id; // 0 = invalid size_t m_check_sum; // check sum of CutParts in initial Object size_t m_connectors_cnt; // connectors count public: - CutObjectBase() { invalidate(); } - CutObjectBase(size_t id, size_t check_sum, size_t connectors_cnt) : + CutId() { invalidate(); } + CutId(size_t id, size_t check_sum, size_t connectors_cnt) : m_unique_id{ id }, m_check_sum{ check_sum }, m_connectors_cnt{ connectors_cnt } {} + bool operator< (const CutId& rhs) const { return this->m_unique_id < rhs.m_unique_id; } + CutId& operator=(const CutId& rhs) { + this->m_unique_id = rhs.id(); + this->m_check_sum = rhs.check_sum(); + this->m_connectors_cnt = rhs.connectors_cnt(); + return *this; + } + void invalidate() { m_unique_id = 0; m_check_sum = 1; @@ -257,10 +265,10 @@ public: std::uniform_int_distribution dist(1, std::numeric_limits::max()); m_unique_id = dist(mt); } - bool has_same_id(const CutObjectBase& rhs) const { return id() == rhs.id(); } - bool is_equal(const CutObjectBase& rhs) const { return id() == rhs.id() && - check_sum() == rhs.check_sum() && - connectors_cnt() == rhs.connectors_cnt() ; } + bool has_same_id(const CutId& rhs) const { return id() == rhs.id(); } + bool is_equal(const CutId& rhs) const { return id() == rhs.id() && + check_sum() == rhs.check_sum() && + connectors_cnt() == rhs.connectors_cnt() ; } size_t id() const { return m_unique_id; } bool valid() const { return m_unique_id != 0; } size_t check_sum() const { return m_check_sum; } @@ -269,7 +277,6 @@ public: size_t connectors_cnt() const { return m_connectors_cnt; } void increase_connectors_cnt(size_t connectors_cnt) { m_connectors_cnt += connectors_cnt; } -private: template void serialize(Archive &ar) { ar(m_unique_id, m_check_sum, m_connectors_cnt); } @@ -313,10 +320,6 @@ struct CutConnectorAttributes CutConnectorAttributes(const CutConnectorAttributes& rhs) : CutConnectorAttributes(rhs.type, rhs.style, rhs.shape) {} - bool operator==(const CutConnectorAttributes& other) const; - - bool operator!=(const CutConnectorAttributes& other) const { return !(other == (*this)); } - bool operator<(const CutConnectorAttributes& other) const { return this->type < other.type || (this->type == other.type && this->style < other.style) || @@ -350,10 +353,6 @@ struct CutConnector CutConnector(const CutConnector& rhs) : CutConnector(rhs.pos, rhs.rotation_m, rhs.radius, rhs.height, rhs.radius_tolerance, rhs.height_tolerance, rhs.z_angle, rhs.attribs) {} - bool operator==(const CutConnector& other) const; - - bool operator!=(const CutConnector& other) const { return !(other == (*this)); } - template inline void serialize(Archive& ar) { ar(pos, rotation_m, radius, height, radius_tolerance, height_tolerance, z_angle, attribs); } @@ -410,7 +409,7 @@ public: // Connectors to be added into the object before cut and are used to create a solid/negative volumes during a cut perform CutConnectors cut_connectors; - CutObjectBase cut_id; + CutId cut_id; /* This vector accumulates the total translation applied to the object by the center_around_origin() method. Callers might want to apply the same translation diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index c8a2106b1f..5fb3a7ca9e 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2529,7 +2529,7 @@ void ObjectList::invalidate_cut_info_for_object(int obj_idx) take_snapshot(_L("Invalidate cut info")); - const CutObjectBase cut_id = init_obj->cut_id; + const CutId cut_id = init_obj->cut_id; // invalidate cut for related objects (which have the same cut_id) for (size_t idx = 0; idx < m_objects->size(); idx++) if (ModelObject* obj = object(int(idx)); obj->cut_id.is_equal(cut_id)) { @@ -2559,7 +2559,7 @@ void ObjectList::delete_all_connectors_for_object(int obj_idx) take_snapshot(_L("Delete all connectors")); - const CutObjectBase cut_id = init_obj->cut_id; + const CutId cut_id = init_obj->cut_id; // Delete all connectors for related objects (which have the same cut_id) Model& model = wxGetApp().plater()->model(); for (int idx = int(m_objects->size())-1; idx >= 0; idx--) @@ -2682,7 +2682,7 @@ void ObjectList::part_selection_changed() disable_ss_manipulation = (*m_objects)[obj_idx]->is_cut(); } else if (selection.is_mixed() || selection.is_multiple_full_object()) { - std::map> cut_objects; + std::map> cut_objects; // find cut objects for (auto item : sels) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index daa03187a6..96e3c46dc1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -3256,7 +3256,7 @@ Transform3d GLGizmoCut3D::get_cut_matrix(const Selection& selection) return translation_transform(cut_center_offset) * m_rotation_m; } -void update_object_cut_id(CutObjectBase& cut_id, ModelObjectCutAttributes attributes, const int dowels_count) +void update_object_cut_id(CutId& cut_id, ModelObjectCutAttributes attributes, const int dowels_count) { // we don't save cut information, if result will not contains all parts of initial object if (!attributes.has(ModelObjectCutAttribute::KeepUpper) || @@ -3264,7 +3264,7 @@ void update_object_cut_id(CutObjectBase& cut_id, ModelObjectCutAttributes attrib attributes.has(ModelObjectCutAttribute::InvalidateCutInfo)) return; - if (cut_id.id().invalid()) + if (! cut_id.valid()) cut_id.init(); // increase check sum, if it's needed { @@ -3377,11 +3377,11 @@ static void check_objects_after_cut(const ModelObjectPtrs& objects) } } -void synchronize_model_after_cut(Model& model, const CutObjectBase& cut_id) +void synchronize_model_after_cut(Model& model, const CutId& cut_id) { for (ModelObject* obj : model.objects) if (obj->is_cut() && obj->cut_id.has_same_id(cut_id) && !obj->cut_id.is_equal(cut_id)) - obj->cut_id.copy(cut_id); + obj->cut_id = cut_id; } void GLGizmoCut3D::perform_cut(const Selection& selection) @@ -3432,7 +3432,7 @@ void GLGizmoCut3D::perform_cut(const Selection& selection) only_if(m_rotate_upper, ModelObjectCutAttribute::FlipUpper) | only_if(m_rotate_lower, ModelObjectCutAttribute::FlipLower) | only_if(dowels_count > 0, ModelObjectCutAttribute::CreateDowels) | - only_if(!has_connectors && !cut_with_groove && cut_mo->cut_id.id().invalid(), ModelObjectCutAttribute::InvalidateCutInfo); + only_if(!has_connectors && !cut_with_groove && ! cut_mo->cut_id.valid(), ModelObjectCutAttribute::InvalidateCutInfo); // update cut_id for the cut object in respect to the attributes update_object_cut_id(cut_mo->cut_id, attributes, dowels_count); @@ -3445,7 +3445,7 @@ void GLGizmoCut3D::perform_cut(const Selection& selection) check_objects_after_cut(new_objects); // save cut_id to post update synchronization - const CutObjectBase cut_id = cut_mo->cut_id; + const CutId cut_id = cut_mo->cut_id; // update cut results on plater and in the model plater->apply_cut_object_to_model(object_idx, new_objects);