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;