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:
committed by
abdullahtahiriyo
parent
4e199bd23e
commit
11d4d6c18e
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user