Skip to content

Commit

Permalink
Part: make PropertyGeometryList more permissive
Browse files Browse the repository at this point in the history
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
  • Loading branch information
wwmayer committed Mar 27, 2023
1 parent 3e1528a commit ca935a4
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
26 changes: 24 additions & 2 deletions src/Mod/Part/App/PropertyGeometryList.cpp
Expand Up @@ -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;
Expand All @@ -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;
}
Expand All @@ -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());
Expand Down
4 changes: 4 additions & 0 deletions src/Mod/Part/App/PropertyGeometryList.h
Expand Up @@ -86,6 +86,10 @@ class PartExport PropertyGeometryList: public App::PropertyLists

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;
};
Expand Down

0 comments on commit ca935a4

Please sign in to comment.