diff --git a/src/Mod/Material/App/AppMaterial.cpp b/src/Mod/Material/App/AppMaterial.cpp
index 6b4b137c9c..99ec73f60f 100644
--- a/src/Mod/Material/App/AppMaterial.cpp
+++ b/src/Mod/Material/App/AppMaterial.cpp
@@ -27,7 +27,10 @@
#include
#include
+#include
+
#include "MaterialFilterPy.h"
+#include "MaterialLoader.h"
#include "MaterialManagerPy.h"
#include "MaterialPy.h"
#include "ModelManagerPy.h"
@@ -61,6 +64,12 @@ PyObject* initModule()
PyMOD_INIT_FUNC(Materials)
{
+#ifdef FC_DEBUG
+ App::CleanupProcess::registerCleanup([](){
+ Materials::MaterialManager::cleanup();
+ Materials::ModelManager::cleanup();
+ });
+#endif
PyObject* module = Materials::initModule();
Base::Console().Log("Loading Material module... done\n");
diff --git a/src/Mod/Material/App/MaterialManager.cpp b/src/Mod/Material/App/MaterialManager.cpp
index afb0c9024b..74ccb970ec 100644
--- a/src/Mod/Material/App/MaterialManager.cpp
+++ b/src/Mod/Material/App/MaterialManager.cpp
@@ -77,6 +77,21 @@ void MaterialManager::initLibraries()
}
}
+void MaterialManager::cleanup()
+{
+ if (_libraryList) {
+ _libraryList->clear();
+ }
+
+ if (_materialMap) {
+ for (auto& it : *_materialMap) {
+ // This is needed to resolve cyclic dependencies
+ it.second->setLibrary(nullptr);
+ }
+ _materialMap->clear();
+ }
+}
+
void MaterialManager::saveMaterial(const std::shared_ptr& library,
const std::shared_ptr& material,
const QString& path,
diff --git a/src/Mod/Material/App/MaterialManager.h b/src/Mod/Material/App/MaterialManager.h
index e8c1c5b13f..34e762789d 100644
--- a/src/Mod/Material/App/MaterialManager.h
+++ b/src/Mod/Material/App/MaterialManager.h
@@ -54,6 +54,7 @@ public:
MaterialManager();
~MaterialManager() override = default;
+ static void cleanup();
static std::shared_ptr defaultMaterial();
static QString defaultMaterialUUID();
diff --git a/src/Mod/Material/App/ModelManager.cpp b/src/Mod/Material/App/ModelManager.cpp
index 23be586253..dad296fb36 100644
--- a/src/Mod/Material/App/ModelManager.cpp
+++ b/src/Mod/Material/App/ModelManager.cpp
@@ -72,6 +72,21 @@ bool ModelManager::isModel(const QString& file)
return false;
}
+void ModelManager::cleanup()
+{
+ if (_libraryList) {
+ _libraryList->clear();
+ }
+
+ if (_modelMap) {
+ for (auto& it : *_modelMap) {
+ // This is needed to resolve cyclic dependencies
+ it.second->setLibrary(nullptr);
+ }
+ _modelMap->clear();
+ }
+}
+
void ModelManager::refresh()
{
_modelMap->clear();
diff --git a/src/Mod/Material/App/ModelManager.h b/src/Mod/Material/App/ModelManager.h
index 9ded3b3c78..15b433930d 100644
--- a/src/Mod/Material/App/ModelManager.h
+++ b/src/Mod/Material/App/ModelManager.h
@@ -44,6 +44,7 @@ public:
ModelManager();
~ModelManager() override = default;
+ static void cleanup();
void refresh();
std::shared_ptr>> getModelLibraries()