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
This commit is contained in:
Abdullah Tahiri
2020-12-04 14:52:59 +01:00
committed by abdullahtahiriyo
parent 4e199bd23e
commit 11d4d6c18e
14 changed files with 43 additions and 87 deletions

View File

@@ -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();

View File

@@ -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() << "<GeoExtensions count=\"" << extensions.size() << "\">" << 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() << "<GeoExtensions count=\"" << counter << "\">" << std::endl;
writer.incInd();
for(auto att:extensions) {
att->Save(writer);
if(att->isDerivedFrom(Part::GeometryPersistenceExtension::getClassTypeId()))
std::static_pointer_cast<Part::GeometryPersistenceExtension>(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<GeometryExtension>(newE));

View File

@@ -45,12 +45,6 @@ GeometryDefaultExtension<T>::GeometryDefaultExtension(const T& val, std::string
}
// Persistence implementer
template <typename T>
unsigned int GeometryDefaultExtension<T>::getMemSize (void) const
{
return 1;
}
template <typename T>
void GeometryDefaultExtension<T>::Save(Base::Writer &writer) const
{
@@ -114,7 +108,7 @@ namespace Part {
//typedef Part::GeometryStringExtension<std::string> GeometryStringExtension;
// ---------- GeometryIntExtension ----------
TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryIntExtension,Part::GeometryExtension)
TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryIntExtension,Part::GeometryPersistenceExtension)
template <>
PyObject * GeometryDefaultExtension<long>::getPyObject(void)
@@ -131,7 +125,7 @@ void GeometryDefaultExtension<long>::Restore(Base::XMLReader &reader)
}
// ---------- GeometryStringExtension ----------
TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryStringExtension,Part::GeometryExtension)
TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryStringExtension,Part::GeometryPersistenceExtension)
template <>
PyObject * GeometryDefaultExtension<std::string>::getPyObject(void)
@@ -140,7 +134,7 @@ PyObject * GeometryDefaultExtension<std::string>::getPyObject(void)
}
// ---------- GeometryBoolExtension ----------
TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryBoolExtension,Part::GeometryExtension)
TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryBoolExtension,Part::GeometryPersistenceExtension)
template <>
PyObject * GeometryDefaultExtension<bool>::getPyObject(void)
@@ -157,7 +151,7 @@ void GeometryDefaultExtension<bool>::Restore(Base::XMLReader &reader)
}
// ---------- GeometryDoubleExtension ----------
TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryDoubleExtension,Part::GeometryExtension)
TYPESYSTEM_SOURCE_TEMPLATE_T(Part::GeometryDoubleExtension,Part::GeometryPersistenceExtension)
template <>
PyObject * GeometryDefaultExtension<double>::getPyObject(void)

View File

@@ -30,7 +30,7 @@
namespace Part {
template <typename T>
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;

View File

@@ -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");

View File

@@ -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<GeometryExtension> 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

View File

@@ -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<Part::GeometryExtension> GeometryMigrationExtension::copy(void) const
{
auto cpy = std::make_unique<GeometryMigrationExtension>();

View File

@@ -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<Part::GeometryExtension> copy(void) const override;
virtual PyObject *getPyObject(void) override;

View File

@@ -35,14 +35,9 @@ using namespace Sketcher;
constexpr std::array<const char *, ExternalGeometryExtension::NumFlags> 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() << "<GeoExtension type=\"" << this->getTypeId().getName();

View File

@@ -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;

View File

@@ -36,7 +36,7 @@ using namespace Sketcher;
constexpr std::array<const char *, InternalType::NumInternalGeometryType> SketchGeometryExtension::internaltype2str;
constexpr std::array<const char *,GeometryMode::NumGeometryMode> SketchGeometryExtension::geometrymode2str;
TYPESYSTEM_SOURCE(Sketcher::SketchGeometryExtension,Part::GeometryExtension)
TYPESYSTEM_SOURCE(Sketcher::SketchGeometryExtension,Part::GeometryPersistenceExtension)
// scoped within the class, multithread ready
std::atomic<long> 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() << "<GeoExtension type=\"" << this->getTypeId().getName();

View File

@@ -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;

View File

@@ -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<Part::GeometryExtension> ViewProviderSketchGeometryExtension::copy(void) const
{
auto cpy = std::make_unique<ViewProviderSketchGeometryExtension>();

View File

@@ -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<Part::GeometryExtension> copy(void) const override;
virtual PyObject *getPyObject(void) override;