Skip to content

Commit ca935a4

Browse files
committed
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
1 parent 3e1528a commit ca935a4

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/Mod/Part/App/PropertyGeometryList.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,28 @@ void PropertyGeometryList::setPyObject(PyObject *value)
164164
}
165165
}
166166

167+
void PropertyGeometryList::trySaveGeometry(Geometry * geom, Base::Writer &writer) const
168+
{
169+
// Not all geometry classes implement Save() and throw an exception instead
170+
try {
171+
geom->Save(writer);
172+
}
173+
catch (const Base::NotImplementedError& e) {
174+
Base::Console().Warning(std::string("PropertyGeometryList"), "Not yet implemented: %s\n", e.what());
175+
}
176+
}
177+
178+
void PropertyGeometryList::tryRestoreGeometry(Geometry * geom, Base::XMLReader &reader)
179+
{
180+
// Not all geometry classes implement Restore() and throw an exception instead
181+
try {
182+
geom->Restore(reader);
183+
}
184+
catch (const Base::NotImplementedError& e) {
185+
Base::Console().Warning(std::string("PropertyGeometryList"), "Not yet implemented: %s\n", e.what());
186+
}
187+
}
188+
167189
void PropertyGeometryList::Save(Writer &writer) const
168190
{
169191
writer.Stream() << writer.ind() << "<GeometryList count=\"" << getSize() <<"\">" << endl;
@@ -172,7 +194,7 @@ void PropertyGeometryList::Save(Writer &writer) const
172194
writer.Stream() << writer.ind() << "<Geometry type=\""
173195
<< _lValueList[i]->getTypeId().getName() << "\">" << endl;;
174196
writer.incInd();
175-
_lValueList[i]->Save(writer);
197+
trySaveGeometry(_lValueList[i], writer);
176198
writer.decInd();
177199
writer.Stream() << writer.ind() << "</Geometry>" << endl;
178200
}
@@ -193,7 +215,7 @@ void PropertyGeometryList::Restore(Base::XMLReader &reader)
193215
reader.readElement("Geometry");
194216
const char* TypeName = reader.getAttribute("type");
195217
Geometry *newG = static_cast<Geometry *>(Base::Type::fromName(TypeName).createInstance());
196-
newG->Restore(reader);
218+
tryRestoreGeometry(newG, reader);
197219

198220
if(reader.testStatus(Base::XMLReader::ReaderStatus::PartialRestoreInObject)) {
199221
Base::Console().Error("Geometry \"%s\" within a PropertyGeometryList was subject to a partial restore.\n",reader.localName());

src/Mod/Part/App/PropertyGeometryList.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ class PartExport PropertyGeometryList: public App::PropertyLists
8686

8787
unsigned int getMemSize() const override;
8888

89+
private:
90+
void trySaveGeometry(Geometry * geom, Base::Writer &writer) const;
91+
void tryRestoreGeometry(Geometry * geom, Base::XMLReader &reader);
92+
8993
private:
9094
std::vector<Geometry*> _lValueList;
9195
};

0 commit comments

Comments
 (0)