From 5cd697bdc2c86ccfd03b180b6e1c3a8a53bfcd60 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 16 Feb 2024 08:11:50 +0100 Subject: [PATCH] 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); } };