Part: make PropertyGeometryList more permissive

Since not all Geometry sub-classes fully implement Save() / Restore() raising an exception instead may invalidate a project. To avoid this
PropertyGeometryList now explicitly handles NotImplementedError exceptions.

See also: https://forum.freecad.org/viewtopic.php?t=77148
This commit is contained in:
wmayer
2023-03-27 15:37:31 +02:00
committed by wwmayer
parent 06a9bd229c
commit 4ca33e35aa
2 changed files with 28 additions and 2 deletions

View File

@@ -164,6 +164,28 @@ void PropertyGeometryList::setPyObject(PyObject *value)
}
}
void PropertyGeometryList::trySaveGeometry(Geometry * geom, Base::Writer &writer) const
{
// Not all geometry classes implement Save() and throw an exception instead
try {
geom->Save(writer);
}
catch (const Base::NotImplementedError& e) {
Base::Console().Warning(std::string("PropertyGeometryList"), "Not yet implemented: %s\n", e.what());
}
}
void PropertyGeometryList::tryRestoreGeometry(Geometry * geom, Base::XMLReader &reader)
{
// Not all geometry classes implement Restore() and throw an exception instead
try {
geom->Restore(reader);
}
catch (const Base::NotImplementedError& e) {
Base::Console().Warning(std::string("PropertyGeometryList"), "Not yet implemented: %s\n", e.what());
}
}
void PropertyGeometryList::Save(Writer &writer) const
{
writer.Stream() << writer.ind() << "<GeometryList count=\"" << getSize() <<"\">" << endl;
@@ -172,7 +194,7 @@ void PropertyGeometryList::Save(Writer &writer) const
writer.Stream() << writer.ind() << "<Geometry type=\""
<< _lValueList[i]->getTypeId().getName() << "\">" << endl;;
writer.incInd();
_lValueList[i]->Save(writer);
trySaveGeometry(_lValueList[i], writer);
writer.decInd();
writer.Stream() << writer.ind() << "</Geometry>" << endl;
}
@@ -193,7 +215,7 @@ void PropertyGeometryList::Restore(Base::XMLReader &reader)
reader.readElement("Geometry");
const char* TypeName = reader.getAttribute("type");
Geometry *newG = static_cast<Geometry *>(Base::Type::fromName(TypeName).createInstance());
newG->Restore(reader);
tryRestoreGeometry(newG, reader);
if(reader.testStatus(Base::XMLReader::ReaderStatus::PartialRestoreInObject)) {
Base::Console().Error("Geometry \"%s\" within a PropertyGeometryList was subject to a partial restore.\n",reader.localName());

View File

@@ -86,6 +86,10 @@ public:
unsigned int getMemSize() const override;
private:
void trySaveGeometry(Geometry * geom, Base::Writer &writer) const;
void tryRestoreGeometry(Geometry * geom, Base::XMLReader &reader);
private:
std::vector<Geometry*> _lValueList;
};