From 11d4d6c18e2f16278e3a4ea0a71b657c0de86191 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Fri, 4 Dec 2020 14:52:59 +0100 Subject: [PATCH] Part/Sketcher: GeometryExtension/GeometryPersistentExtension split ================================================================== GeometryExtension was originally designed to be serializable (save/restore). However, GeometryMigrationExtension and ViewProviderSketchGeometryExtension have demonstrated the usefulness of runtime-only GeometryExtensions. The problem with runtime-only extensions being of a serializable type (GeometryExtension before this commit) arises when Part::Geometry is to serialize the extensions and serialise the number of extensions the geometry has. If runtime-only GeometryExtensions do not save a tag, then the restore mechanism will expect more extensions that are actually in the XML file. This commit makes GeometryExtension by default not serializable and deriving directly from Base::BaseClass. A new class GeometryPersistentExtension is created, deriving from GeometryExtension to provide serialisation. All Extensions requiring serialization derive from GeometryPersistentExtension and those not requiring it from GeometryExtension directly. This commit adapts all extensions to the new situation: Part: GeometryDefaultExtension Part: GeometryMigrationExtension Sketcher: ViewProvierSketchGeometryExtension Sketcher: SketchGeometryExtension and ExternalGeometryExtension --- src/Mod/Part/App/AppPart.cpp | 1 + src/Mod/Part/App/Geometry.cpp | 15 ++++++++--- src/Mod/Part/App/GeometryDefaultExtension.cpp | 14 +++-------- src/Mod/Part/App/GeometryDefaultExtension.h | 3 +-- src/Mod/Part/App/GeometryExtension.cpp | 6 +++-- src/Mod/Part/App/GeometryExtension.h | 25 +++++++++++++------ .../Part/App/GeometryMigrationExtension.cpp | 17 ------------- src/Mod/Part/App/GeometryMigrationExtension.h | 5 ---- .../App/ExternalGeometryExtension.cpp | 7 +----- .../Sketcher/App/ExternalGeometryExtension.h | 3 +-- .../Sketcher/App/SketchGeometryExtension.cpp | 7 +----- .../Sketcher/App/SketchGeometryExtension.h | 3 +-- .../ViewProviderSketchGeometryExtension.cpp | 19 -------------- .../Gui/ViewProviderSketchGeometryExtension.h | 5 ---- 14 files changed, 43 insertions(+), 87 deletions(-) diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index 4b1de3fbc1..8fe6ca350b 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -406,6 +406,7 @@ PyMOD_INIT_FUNC(Part) // Geometry types Part::GeometryExtension ::init(); + Part::GeometryPersistenceExtension ::init(); Part::GeometryIntExtension ::init(); Part::GeometryStringExtension ::init(); Part::GeometryBoolExtension ::init(); diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 5f764ad0c4..9c3ba11ce2 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -208,12 +208,21 @@ unsigned int Geometry::getMemSize (void) const void Geometry::Save(Base::Writer &writer) const { // We always store an extension array even if empty, so that restoring is consistent. - writer.Stream() << writer.ind() << "" << std::endl; + + // Get the number of persistent extensions + int counter = 0; + for(auto att:extensions) { + if(att->isDerivedFrom(Part::GeometryPersistenceExtension::getClassTypeId())) + counter++; + } + + writer.Stream() << writer.ind() << "" << std::endl; writer.incInd(); for(auto att:extensions) { - att->Save(writer); + if(att->isDerivedFrom(Part::GeometryPersistenceExtension::getClassTypeId())) + std::static_pointer_cast(att)->Save(writer); } writer.decInd(); @@ -234,7 +243,7 @@ void Geometry::Restore(Base::XMLReader &reader) reader.readElement("GeoExtension"); const char* TypeName = reader.getAttribute("type"); Base::Type type = Base::Type::fromName(TypeName); - GeometryExtension *newE = (GeometryExtension *)type.createInstance(); + GeometryPersistenceExtension *newE = (GeometryPersistenceExtension *)type.createInstance(); newE->Restore(reader); extensions.push_back(std::shared_ptr(newE)); diff --git a/src/Mod/Part/App/GeometryDefaultExtension.cpp b/src/Mod/Part/App/GeometryDefaultExtension.cpp index 1a4e79ded0..7e78941a27 100644 --- a/src/Mod/Part/App/GeometryDefaultExtension.cpp +++ b/src/Mod/Part/App/GeometryDefaultExtension.cpp @@ -45,12 +45,6 @@ GeometryDefaultExtension::GeometryDefaultExtension(const T& val, std::string } // Persistence implementer -template -unsigned int GeometryDefaultExtension::getMemSize (void) const -{ - return 1; -} - template void GeometryDefaultExtension::Save(Base::Writer &writer) const { @@ -114,7 +108,7 @@ namespace Part { //typedef Part::GeometryStringExtension GeometryStringExtension; // ---------- GeometryIntExtension ---------- -TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryIntExtension,Part::GeometryExtension) +TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryIntExtension,Part::GeometryPersistenceExtension) template <> PyObject * GeometryDefaultExtension::getPyObject(void) @@ -131,7 +125,7 @@ void GeometryDefaultExtension::Restore(Base::XMLReader &reader) } // ---------- GeometryStringExtension ---------- -TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryStringExtension,Part::GeometryExtension) +TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryStringExtension,Part::GeometryPersistenceExtension) template <> PyObject * GeometryDefaultExtension::getPyObject(void) @@ -140,7 +134,7 @@ PyObject * GeometryDefaultExtension::getPyObject(void) } // ---------- GeometryBoolExtension ---------- -TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryBoolExtension,Part::GeometryExtension) +TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryBoolExtension,Part::GeometryPersistenceExtension) template <> PyObject * GeometryDefaultExtension::getPyObject(void) @@ -157,7 +151,7 @@ void GeometryDefaultExtension::Restore(Base::XMLReader &reader) } // ---------- GeometryDoubleExtension ---------- -TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryDoubleExtension,Part::GeometryExtension) +TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryDoubleExtension,Part::GeometryPersistenceExtension) template <> PyObject * GeometryDefaultExtension::getPyObject(void) diff --git a/src/Mod/Part/App/GeometryDefaultExtension.h b/src/Mod/Part/App/GeometryDefaultExtension.h index 629e133f2b..b4e0817825 100644 --- a/src/Mod/Part/App/GeometryDefaultExtension.h +++ b/src/Mod/Part/App/GeometryDefaultExtension.h @@ -30,7 +30,7 @@ namespace Part { template - class PartExport GeometryDefaultExtension: public Part::GeometryExtension + class PartExport GeometryDefaultExtension: public Part::GeometryPersistenceExtension { TYPESYSTEM_HEADER_WITH_OVERRIDE(); public: @@ -42,7 +42,6 @@ namespace Part { inline const T &getValue() const {return value;}; // Persistence implementer --------------------- - virtual unsigned int getMemSize(void) const override; virtual void Save(Base::Writer &/*writer*/) const override; virtual void Restore(Base::XMLReader &/*reader*/) override; diff --git a/src/Mod/Part/App/GeometryExtension.cpp b/src/Mod/Part/App/GeometryExtension.cpp index a7f9296441..6177062098 100644 --- a/src/Mod/Part/App/GeometryExtension.cpp +++ b/src/Mod/Part/App/GeometryExtension.cpp @@ -31,13 +31,15 @@ using namespace Part; -TYPESYSTEM_SOURCE_ABSTRACT(Part::GeometryExtension,Base::Persistence) +TYPESYSTEM_SOURCE_ABSTRACT(Part::GeometryExtension,Base::BaseClass) GeometryExtension::GeometryExtension() { } -void GeometryExtension::restoreNameAttribute(Base::XMLReader &reader) +TYPESYSTEM_SOURCE_ABSTRACT(Part::GeometryPersistenceExtension,Part::GeometryExtension) + +void GeometryPersistenceExtension::restoreNameAttribute(Base::XMLReader &reader) { if(reader.hasAttribute("name")) { std::string name = reader.getAttribute("name"); diff --git a/src/Mod/Part/App/GeometryExtension.h b/src/Mod/Part/App/GeometryExtension.h index 552f1239b0..d4541f2595 100644 --- a/src/Mod/Part/App/GeometryExtension.h +++ b/src/Mod/Part/App/GeometryExtension.h @@ -32,17 +32,12 @@ namespace Part { -class PartExport GeometryExtension: public Base::Persistence +class PartExport GeometryExtension: public Base::BaseClass { TYPESYSTEM_HEADER(); public: virtual ~GeometryExtension() = default; - // Persistence implementer --------------------- - virtual unsigned int getMemSize(void) const = 0; - virtual void Save(Base::Writer &/*writer*/) const = 0; - virtual void Restore(Base::XMLReader &/*reader*/) = 0; - virtual std::unique_ptr copy(void) const = 0; virtual PyObject *getPyObject(void) = 0; @@ -55,12 +50,26 @@ protected: GeometryExtension(const GeometryExtension &obj) = default; GeometryExtension& operator= (const GeometryExtension &obj) = default; - void restoreNameAttribute(Base::XMLReader &/*reader*/); - private: std::string name; }; + + +class PartExport GeometryPersistenceExtension : public Part::GeometryExtension +{ + TYPESYSTEM_HEADER(); +public: + virtual ~GeometryPersistenceExtension() = default; + + // Own Persistence implementer - Not Base::Persistence - managed by Part::Geometry + virtual void Save(Base::Writer &/*writer*/) const = 0; + virtual void Restore(Base::XMLReader &/*reader*/) = 0; + +protected: + void restoreNameAttribute(Base::XMLReader &/*reader*/); +}; + } #endif // PART_GEOMETRYEXTENSION_H diff --git a/src/Mod/Part/App/GeometryMigrationExtension.cpp b/src/Mod/Part/App/GeometryMigrationExtension.cpp index 70ba98fff8..813e7f059c 100644 --- a/src/Mod/Part/App/GeometryMigrationExtension.cpp +++ b/src/Mod/Part/App/GeometryMigrationExtension.cpp @@ -37,23 +37,6 @@ GeometryMigrationExtension::GeometryMigrationExtension():ConstructionState(false } - -// Persistence implementer -unsigned int GeometryMigrationExtension::getMemSize (void) const -{ - return sizeof(long int); -} - -void GeometryMigrationExtension::Save(Base::Writer &writer) const -{ - (void) writer; -} - -void GeometryMigrationExtension::Restore(Base::XMLReader &reader) -{ - (void) reader; -} - std::unique_ptr GeometryMigrationExtension::copy(void) const { auto cpy = std::make_unique(); diff --git a/src/Mod/Part/App/GeometryMigrationExtension.h b/src/Mod/Part/App/GeometryMigrationExtension.h index 7940ddc11e..28cca0875d 100644 --- a/src/Mod/Part/App/GeometryMigrationExtension.h +++ b/src/Mod/Part/App/GeometryMigrationExtension.h @@ -54,11 +54,6 @@ public: GeometryMigrationExtension(); virtual ~GeometryMigrationExtension() override = default; - // Persistence implementer --------------------- - virtual unsigned int getMemSize(void) const override; - virtual void Save(Base::Writer &/*writer*/) const override; - virtual void Restore(Base::XMLReader &/*reader*/) override; - virtual std::unique_ptr copy(void) const override; virtual PyObject *getPyObject(void) override; diff --git a/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp b/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp index 754f02cc25..5312e6092f 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp +++ b/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp @@ -35,14 +35,9 @@ using namespace Sketcher; constexpr std::array ExternalGeometryExtension::flag2str; -TYPESYSTEM_SOURCE(Sketcher::ExternalGeometryExtension,Part::GeometryExtension) +TYPESYSTEM_SOURCE(Sketcher::ExternalGeometryExtension,Part::GeometryPersistenceExtension) // Persistence implementer -unsigned int ExternalGeometryExtension::getMemSize (void) const -{ - return sizeof(long int); -} - void ExternalGeometryExtension::Save(Base::Writer &writer) const { writer.Stream() << writer.ind() << "getTypeId().getName(); diff --git a/src/Mod/Sketcher/App/ExternalGeometryExtension.h b/src/Mod/Sketcher/App/ExternalGeometryExtension.h index 1877579fac..e306d9cb3a 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryExtension.h +++ b/src/Mod/Sketcher/App/ExternalGeometryExtension.h @@ -46,7 +46,7 @@ public: virtual void setRef(const std::string & ref) = 0; }; -class SketcherExport ExternalGeometryExtension : public Part::GeometryExtension, private ISketchExternalGeometryExtension +class SketcherExport ExternalGeometryExtension : public Part::GeometryPersistenceExtension, private ISketchExternalGeometryExtension { TYPESYSTEM_HEADER_WITH_OVERRIDE(); public: @@ -68,7 +68,6 @@ public: virtual ~ExternalGeometryExtension() override = default; // Persistence implementer --------------------- - virtual unsigned int getMemSize(void) const override; virtual void Save(Base::Writer &/*writer*/) const override; virtual void Restore(Base::XMLReader &/*reader*/) override; diff --git a/src/Mod/Sketcher/App/SketchGeometryExtension.cpp b/src/Mod/Sketcher/App/SketchGeometryExtension.cpp index f75be5983d..0f42c13c00 100644 --- a/src/Mod/Sketcher/App/SketchGeometryExtension.cpp +++ b/src/Mod/Sketcher/App/SketchGeometryExtension.cpp @@ -36,7 +36,7 @@ using namespace Sketcher; constexpr std::array SketchGeometryExtension::internaltype2str; constexpr std::array SketchGeometryExtension::geometrymode2str; -TYPESYSTEM_SOURCE(Sketcher::SketchGeometryExtension,Part::GeometryExtension) +TYPESYSTEM_SOURCE(Sketcher::SketchGeometryExtension,Part::GeometryPersistenceExtension) // scoped within the class, multithread ready std::atomic SketchGeometryExtension::_GeometryID; @@ -52,11 +52,6 @@ SketchGeometryExtension::SketchGeometryExtension(long cid):Id(cid),InternalGeome } // Persistence implementer -unsigned int SketchGeometryExtension::getMemSize (void) const -{ - return sizeof(long int); -} - void SketchGeometryExtension::Save(Base::Writer &writer) const { writer.Stream() << writer.ind() << "getTypeId().getName(); diff --git a/src/Mod/Sketcher/App/SketchGeometryExtension.h b/src/Mod/Sketcher/App/SketchGeometryExtension.h index 68c05b96da..dd49341c0b 100644 --- a/src/Mod/Sketcher/App/SketchGeometryExtension.h +++ b/src/Mod/Sketcher/App/SketchGeometryExtension.h @@ -73,7 +73,7 @@ public: virtual void setGeometryMode(int flag, bool v=true) = 0; }; -class SketcherExport SketchGeometryExtension : public Part::GeometryExtension, private ISketchGeometryExtension +class SketcherExport SketchGeometryExtension : public Part::GeometryPersistenceExtension, private ISketchGeometryExtension { TYPESYSTEM_HEADER_WITH_OVERRIDE(); public: @@ -83,7 +83,6 @@ public: virtual ~SketchGeometryExtension() override = default; // Persistence implementer --------------------- - virtual unsigned int getMemSize(void) const override; virtual void Save(Base::Writer &/*writer*/) const override; virtual void Restore(Base::XMLReader &/*reader*/) override; diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp index e11c4db0a5..f4d3ff3b4c 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp @@ -39,25 +39,6 @@ ViewProviderSketchGeometryExtension::ViewProviderSketchGeometryExtension():Repre } - -// Persistence implementer -unsigned int ViewProviderSketchGeometryExtension::getMemSize (void) const -{ - return sizeof(double); -} - -void ViewProviderSketchGeometryExtension::Save(Base::Writer &writer) const -{ - (void) writer; - // So far only intended for runtime -} - -void ViewProviderSketchGeometryExtension::Restore(Base::XMLReader &reader) -{ - (void) reader; - // So far only intended for runtime -} - std::unique_ptr ViewProviderSketchGeometryExtension::copy(void) const { auto cpy = std::make_unique(); diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h index 21e91a7fd7..6d5edc1b65 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h +++ b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h @@ -35,11 +35,6 @@ public: ViewProviderSketchGeometryExtension(); virtual ~ViewProviderSketchGeometryExtension() override = default; - // Persistence implementer --------------------- - virtual unsigned int getMemSize(void) const override; - virtual void Save(Base::Writer &/*writer*/) const override; - virtual void Restore(Base::XMLReader &/*reader*/) override; - virtual std::unique_ptr copy(void) const override; virtual PyObject *getPyObject(void) override;