diff --git a/src/Mod/Part/App/GeometryDefaultExtension.cpp b/src/Mod/Part/App/GeometryDefaultExtension.cpp index 7e78941a27..b4435d13f7 100644 --- a/src/Mod/Part/App/GeometryDefaultExtension.cpp +++ b/src/Mod/Part/App/GeometryDefaultExtension.cpp @@ -44,36 +44,36 @@ GeometryDefaultExtension::GeometryDefaultExtension(const T& val, std::string setName(name); } -// Persistence implementer + template -void GeometryDefaultExtension::Save(Base::Writer &writer) const +void GeometryDefaultExtension::copyAttributes(Part::GeometryExtension * cpy) const { - - writer.Stream() << writer.ind() << "getTypeId().getName(); - - const std::string name = getName(); - - if(name.size() > 0) - writer.Stream() << "\" name=\"" << name; - - writer.Stream() << "\" value=\"" << value << "\"/>" << std::endl; + Part::GeometryPersistenceExtension::copyAttributes(cpy); + static_cast *>(cpy)->value = this->value; } template -void GeometryDefaultExtension::Restore(Base::XMLReader &reader) +void GeometryDefaultExtension::restoreAttributes(Base::XMLReader &reader) { - restoreNameAttribute(reader); + Part::GeometryPersistenceExtension::restoreAttributes(reader); value = reader.getAttribute("value"); } +template +void GeometryDefaultExtension::saveAttributes(Base::Writer &writer) const +{ + Part::GeometryPersistenceExtension::saveAttributes(writer); + + writer.Stream() << "\" value=\"" << value; +} + template std::unique_ptr GeometryDefaultExtension::copy(void) const { std::unique_ptr> cpy = std::make_unique>(); - cpy->value = this->value; - cpy->setName(this->getName()); + copyAttributes(cpy.get()); #if (defined(__GNUC__) && __GNUC__ < 7 ) || defined(_MSC_VER) return std::move(cpy); // GCC 4.8 and MSC do not support automatic move constructor call if the compiler fails to elide @@ -117,9 +117,9 @@ PyObject * GeometryDefaultExtension::getPyObject(void) } template <> -void GeometryDefaultExtension::Restore(Base::XMLReader &reader) +void GeometryDefaultExtension::restoreAttributes(Base::XMLReader &reader) { - restoreNameAttribute(reader); + Part::GeometryPersistenceExtension::restoreAttributes(reader); value = reader.getAttributeAsInteger("value"); } @@ -143,9 +143,9 @@ PyObject * GeometryDefaultExtension::getPyObject(void) } template <> -void GeometryDefaultExtension::Restore(Base::XMLReader &reader) +void GeometryDefaultExtension::restoreAttributes(Base::XMLReader &reader) { - restoreNameAttribute(reader); + Part::GeometryPersistenceExtension::restoreAttributes(reader); value = (bool)reader.getAttributeAsInteger("value"); } @@ -160,9 +160,9 @@ PyObject * GeometryDefaultExtension::getPyObject(void) } template <> -void GeometryDefaultExtension::Restore(Base::XMLReader &reader) +void GeometryDefaultExtension::restoreAttributes(Base::XMLReader &reader) { - restoreNameAttribute(reader); + Part::GeometryPersistenceExtension::restoreAttributes(reader); value = reader.getAttributeAsFloat("value"); } diff --git a/src/Mod/Part/App/GeometryDefaultExtension.h b/src/Mod/Part/App/GeometryDefaultExtension.h index b4e0817825..246f55d185 100644 --- a/src/Mod/Part/App/GeometryDefaultExtension.h +++ b/src/Mod/Part/App/GeometryDefaultExtension.h @@ -41,14 +41,15 @@ namespace Part { inline void setValue(const T& val) {value = val;}; inline const T &getValue() const {return value;}; - // Persistence implementer --------------------- - 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; + protected: + virtual void copyAttributes(Part::GeometryExtension * cpy) const override; + virtual void restoreAttributes(Base::XMLReader &reader) override; + virtual void saveAttributes(Base::Writer &writer) const override; + private: GeometryDefaultExtension(const GeometryDefaultExtension&) = default; diff --git a/src/Mod/Part/App/GeometryExtension.cpp b/src/Mod/Part/App/GeometryExtension.cpp index fd8c6fad0c..e3b6f8275a 100644 --- a/src/Mod/Part/App/GeometryExtension.cpp +++ b/src/Mod/Part/App/GeometryExtension.cpp @@ -45,12 +45,39 @@ PyObject* GeometryExtension::copyPyObject() const return static_cast(obj.ptr())->copy(tuple.ptr()); } +void GeometryExtension::copyAttributes(Part::GeometryExtension * cpy) const +{ + cpy->setName(this->getName()); // Base Class +} + TYPESYSTEM_SOURCE_ABSTRACT(Part::GeometryPersistenceExtension,Part::GeometryExtension) -void GeometryPersistenceExtension::restoreNameAttribute(Base::XMLReader &reader) +void GeometryPersistenceExtension::restoreAttributes(Base::XMLReader &reader) { if(reader.hasAttribute("name")) { std::string name = reader.getAttribute("name"); setName(name); } } +void GeometryPersistenceExtension::saveAttributes(Base::Writer &writer) const +{ + const std::string name = getName(); + + if(name.size() > 0) + writer.Stream() << "\" name=\"" << name; + +} + +void GeometryPersistenceExtension::Save(Base::Writer &writer) const +{ + writer.Stream() << writer.ind() << "getTypeId().getName(); + + saveAttributes(writer); + + writer.Stream() << "\"/>" << std::endl; +} + +void GeometryPersistenceExtension::Restore(Base::XMLReader &reader) +{ + restoreAttributes(reader); +} diff --git a/src/Mod/Part/App/GeometryExtension.h b/src/Mod/Part/App/GeometryExtension.h index 02119670ab..6879a815c1 100644 --- a/src/Mod/Part/App/GeometryExtension.h +++ b/src/Mod/Part/App/GeometryExtension.h @@ -32,6 +32,8 @@ namespace Part { +class Geometry; + class PartExport GeometryExtension: public Base::BaseClass { TYPESYSTEM_HEADER(); @@ -46,11 +48,17 @@ public: inline void setName(const std::string& str) {name = str;} inline const std::string &getName () const {return name;} + // Default method to notify an extension that it has been attached + // to a given geometry + virtual void notifyAttachment(Part::Geometry *) {} + protected: GeometryExtension(); GeometryExtension(const GeometryExtension &obj) = default; GeometryExtension& operator= (const GeometryExtension &obj) = default; + virtual void copyAttributes(Part::GeometryExtension * cpy) const; + private: std::string name; }; @@ -64,11 +72,13 @@ 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; + void Save(Base::Writer &/*writer*/) const; + void Restore(Base::XMLReader &/*reader*/); protected: - void restoreNameAttribute(Base::XMLReader &/*reader*/); + virtual void restoreAttributes(Base::XMLReader &/*reader*/); + virtual void saveAttributes(Base::Writer &writer) const; + }; } diff --git a/src/Mod/Part/App/GeometryMigrationExtension.cpp b/src/Mod/Part/App/GeometryMigrationExtension.cpp index 813e7f059c..b39c635a96 100644 --- a/src/Mod/Part/App/GeometryMigrationExtension.cpp +++ b/src/Mod/Part/App/GeometryMigrationExtension.cpp @@ -37,14 +37,18 @@ GeometryMigrationExtension::GeometryMigrationExtension():ConstructionState(false } +void GeometryMigrationExtension::copyAttributes(Part::GeometryExtension * cpy) const +{ + Part::GeometryExtension::copyAttributes(cpy); + static_cast(cpy)->ConstructionState = this->ConstructionState; + static_cast(cpy)->GeometryMigrationFlags = this->GeometryMigrationFlags; +} + std::unique_ptr GeometryMigrationExtension::copy(void) const { auto cpy = std::make_unique(); - cpy->ConstructionState = this->ConstructionState; - cpy->GeometryMigrationFlags = this->GeometryMigrationFlags; - - cpy->setName(this->getName()); // Base Class + copyAttributes(cpy.get()); #if defined (__GNUC__) && (__GNUC__ <=4) return std::move(cpy); diff --git a/src/Mod/Part/App/GeometryMigrationExtension.h b/src/Mod/Part/App/GeometryMigrationExtension.h index 28cca0875d..77f03546af 100644 --- a/src/Mod/Part/App/GeometryMigrationExtension.h +++ b/src/Mod/Part/App/GeometryMigrationExtension.h @@ -65,6 +65,8 @@ public: virtual bool testMigrationType(int flag) const { return GeometryMigrationFlags.test((size_t)(flag)); }; virtual void setMigrationType(int flag, bool v=true) { GeometryMigrationFlags.set((size_t)(flag), v); }; +protected: + virtual void copyAttributes(Part::GeometryExtension * cpy) const override; private: GeometryMigrationExtension(const GeometryMigrationExtension&) = default; diff --git a/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp b/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp index 5312e6092f..5beb6ff770 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp +++ b/src/Mod/Sketcher/App/ExternalGeometryExtension.cpp @@ -37,36 +37,35 @@ constexpr std::array External TYPESYSTEM_SOURCE(Sketcher::ExternalGeometryExtension,Part::GeometryPersistenceExtension) -// Persistence implementer -void ExternalGeometryExtension::Save(Base::Writer &writer) const +void ExternalGeometryExtension::copyAttributes(Part::GeometryExtension * cpy) const { - writer.Stream() << writer.ind() << "getTypeId().getName(); + Part::GeometryPersistenceExtension::copyAttributes(cpy); - const std::string name = getName(); - - if(name.size() > 0) - writer.Stream() << "\" name=\"" << name; - - writer.Stream() << "\" Ref=\"" << Ref << "\" Flags=\"" << Flags.to_string() << "\"/>" << std::endl; + static_cast(cpy)->Ref = this->Ref; + static_cast(cpy)->Flags = this->Flags; } -void ExternalGeometryExtension::Restore(Base::XMLReader &reader) +void ExternalGeometryExtension::restoreAttributes(Base::XMLReader &reader) { - restoreNameAttribute(reader); + Part::GeometryPersistenceExtension::restoreAttributes(reader); Ref = reader.getAttribute("Ref"); Flags = FlagType(reader.getAttribute("Flags")); +} +void ExternalGeometryExtension::saveAttributes(Base::Writer &writer) const +{ + Part::GeometryPersistenceExtension::saveAttributes(writer); + + writer.Stream() << "\" Ref=\"" << Ref + << "\" Flags=\"" << Flags.to_string(); } std::unique_ptr ExternalGeometryExtension::copy(void) const { auto cpy = std::make_unique(); - cpy->Ref = this->Ref; - cpy->Flags = this->Flags; - - cpy->setName(this->getName()); // Base Class + copyAttributes(cpy.get()); #if defined (__GNUC__) && (__GNUC__ <=4) return std::move(cpy); diff --git a/src/Mod/Sketcher/App/ExternalGeometryExtension.h b/src/Mod/Sketcher/App/ExternalGeometryExtension.h index e306d9cb3a..e429fb1dec 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryExtension.h +++ b/src/Mod/Sketcher/App/ExternalGeometryExtension.h @@ -67,10 +67,6 @@ public: ExternalGeometryExtension() = default; virtual ~ExternalGeometryExtension() override = default; - // Persistence implementer --------------------- - 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; @@ -88,6 +84,11 @@ public: static bool getFlagsFromName(std::string str, ExternalGeometryExtension::Flag &flag); +protected: + virtual void copyAttributes(Part::GeometryExtension * cpy) const override; + virtual void restoreAttributes(Base::XMLReader &reader) override; + virtual void saveAttributes(Base::Writer &writer) const override; + private: ExternalGeometryExtension(const ExternalGeometryExtension&) = default; diff --git a/src/Mod/Sketcher/App/SketchGeometryExtension.cpp b/src/Mod/Sketcher/App/SketchGeometryExtension.cpp index 3599ba2489..ef1df0c262 100644 --- a/src/Mod/Sketcher/App/SketchGeometryExtension.cpp +++ b/src/Mod/Sketcher/App/SketchGeometryExtension.cpp @@ -51,25 +51,18 @@ SketchGeometryExtension::SketchGeometryExtension(long cid):Id(cid),InternalGeome } -// Persistence implementer -void SketchGeometryExtension::Save(Base::Writer &writer) const +void SketchGeometryExtension::copyAttributes(Part::GeometryExtension * cpy) const { - writer.Stream() << writer.ind() << "getTypeId().getName(); + Part::GeometryPersistenceExtension::copyAttributes(cpy); - const std::string name = getName(); - - if(name.size() > 0) - writer.Stream() << "\" name=\"" << name; - - writer.Stream() // << "\" id=\"" << Id // This is removed as the stored Id is not used and it may interfere with RT's future implementation - << "\" internalGeometryType=\"" << (int) InternalGeometryType - << "\" geometryModeFlags=\"" << GeometryModeFlags.to_string() - << "\"/>" << std::endl; + static_cast(cpy)->Id = this->Id; + static_cast(cpy)->InternalGeometryType = this->InternalGeometryType; + static_cast(cpy)->GeometryModeFlags = this->GeometryModeFlags; } -void SketchGeometryExtension::Restore(Base::XMLReader &reader) +void SketchGeometryExtension::restoreAttributes(Base::XMLReader &reader) { - restoreNameAttribute(reader); + Part::GeometryPersistenceExtension::restoreAttributes(reader); if(reader.hasAttribute("id")) Id = reader.getAttributeAsInteger("id"); @@ -79,15 +72,20 @@ void SketchGeometryExtension::Restore(Base::XMLReader &reader) GeometryModeFlags = GeometryModeFlagType(reader.getAttribute("geometryModeFlags")); } +void SketchGeometryExtension::saveAttributes(Base::Writer &writer) const +{ + Part::GeometryPersistenceExtension::saveAttributes(writer); + + writer.Stream() // << "\" id=\"" << Id // This is removed as the stored Id is not used and it may interfere with RT's future implementation + << "\" internalGeometryType=\"" << (int) InternalGeometryType + << "\" geometryModeFlags=\"" << GeometryModeFlags.to_string(); +} + std::unique_ptr SketchGeometryExtension::copy(void) const { auto cpy = std::make_unique(); - cpy->Id = this->Id; - cpy->InternalGeometryType = this->InternalGeometryType; - cpy->GeometryModeFlags = this->GeometryModeFlags; - - cpy->setName(this->getName()); // Base Class + copyAttributes(cpy.get()); #if defined (__GNUC__) && (__GNUC__ <=4) return std::move(cpy); diff --git a/src/Mod/Sketcher/App/SketchGeometryExtension.h b/src/Mod/Sketcher/App/SketchGeometryExtension.h index dd49341c0b..e51ea8c853 100644 --- a/src/Mod/Sketcher/App/SketchGeometryExtension.h +++ b/src/Mod/Sketcher/App/SketchGeometryExtension.h @@ -82,10 +82,6 @@ public: SketchGeometryExtension(long cid); virtual ~SketchGeometryExtension() override = default; - // Persistence implementer --------------------- - 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; @@ -107,6 +103,11 @@ public: static bool getGeometryModeFromName(std::string str, GeometryMode::GeometryMode &type); +protected: + virtual void copyAttributes(Part::GeometryExtension * cpy) const override; + virtual void restoreAttributes(Base::XMLReader &reader) override; + virtual void saveAttributes(Base::Writer &writer) const override; + private: SketchGeometryExtension(const SketchGeometryExtension&) = default; diff --git a/src/Mod/Sketcher/App/SolverGeometryExtension.cpp b/src/Mod/Sketcher/App/SolverGeometryExtension.cpp index c05cfbe73b..83305eb7eb 100644 --- a/src/Mod/Sketcher/App/SolverGeometryExtension.cpp +++ b/src/Mod/Sketcher/App/SolverGeometryExtension.cpp @@ -41,16 +41,20 @@ SolverGeometryExtension::SolverGeometryExtension(): } +void SolverGeometryExtension::copyAttributes(Part::GeometryExtension * cpy) const +{ + Part::GeometryExtension::copyAttributes(cpy); + static_cast(cpy)->Edge = this->Edge; + static_cast(cpy)->Start = this->Start; + static_cast(cpy)->End = this->End; + static_cast(cpy)->Mid = this->Mid; +} + std::unique_ptr SolverGeometryExtension::copy(void) const { auto cpy = std::make_unique(); - cpy->Edge = this->Edge; - cpy->Start = this->Start; - cpy->End = this->End; - cpy->Mid = this->Mid; - - cpy->setName(this->getName()); // Base Class + copyAttributes(cpy.get()); #if defined (__GNUC__) && (__GNUC__ <=4) return std::move(cpy); diff --git a/src/Mod/Sketcher/App/SolverGeometryExtension.h b/src/Mod/Sketcher/App/SolverGeometryExtension.h index b21e4e1f8d..681c6e8831 100644 --- a/src/Mod/Sketcher/App/SolverGeometryExtension.h +++ b/src/Mod/Sketcher/App/SolverGeometryExtension.h @@ -76,6 +76,9 @@ public: End = status; } +protected: + virtual void copyAttributes(Part::GeometryExtension * cpy) const override; + private: SolverGeometryExtension(const SolverGeometryExtension&) = default; diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp index f4d3ff3b4c..42c491532e 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.cpp @@ -39,13 +39,17 @@ ViewProviderSketchGeometryExtension::ViewProviderSketchGeometryExtension():Repre } +void ViewProviderSketchGeometryExtension::copyAttributes(Part::GeometryExtension * cpy) const +{ + Part::GeometryExtension::copyAttributes(cpy); + static_cast(cpy)->RepresentationFactor = this->RepresentationFactor; +} + std::unique_ptr ViewProviderSketchGeometryExtension::copy(void) const { auto cpy = std::make_unique(); - cpy->RepresentationFactor = this->RepresentationFactor; - - cpy->setName(this->getName()); // Base Class + copyAttributes(cpy.get()); #if defined (__GNUC__) && (__GNUC__ <=4) return std::move(cpy); diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h index 6d5edc1b65..a192cafe3b 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h +++ b/src/Mod/Sketcher/Gui/ViewProviderSketchGeometryExtension.h @@ -50,6 +50,9 @@ public: virtual double getRepresentationFactor() const {return RepresentationFactor;} virtual void setRepresentationFactor(double representationFactor) {RepresentationFactor = representationFactor;} +protected: + virtual void copyAttributes(Part::GeometryExtension * cpy) const override; + private: ViewProviderSketchGeometryExtension(const ViewProviderSketchGeometryExtension&) = default;