diff --git a/src/Mod/Material/App/MaterialConfigLoader.cpp b/src/Mod/Material/App/MaterialConfigLoader.cpp index ae87b78b4c..86e7aa6f69 100644 --- a/src/Mod/Material/App/MaterialConfigLoader.cpp +++ b/src/Mod/Material/App/MaterialConfigLoader.cpp @@ -40,6 +40,7 @@ #include "Exceptions.h" #include "MaterialConfigLoader.h" #include "MaterialLoader.h" +#include "MaterialLibrary.h" #include "Model.h" #include "ModelUuids.h" @@ -1056,8 +1057,7 @@ MaterialConfigLoader::getMaterialFromPath(const std::shared_ptr&>(library); + auto baseLibrary = std::static_pointer_cast(library); std::shared_ptr finalModel = std::make_shared(baseLibrary, path, uuid, name); finalModel->setOldFormat(true); diff --git a/src/Mod/Material/App/MaterialLoader.cpp b/src/Mod/Material/App/MaterialLoader.cpp index b09e7f83e8..f24c152588 100644 --- a/src/Mod/Material/App/MaterialLoader.cpp +++ b/src/Mod/Material/App/MaterialLoader.cpp @@ -418,8 +418,8 @@ MaterialLoader::getMaterialFromPath(const std::shared_ptr& const QString& path) const { std::shared_ptr model = nullptr; - auto materialLibrary = - reinterpret_cast&>(library); + + const auto& materialLibrary = library; // Used for debugging std::string pathName = path.toStdString(); @@ -577,8 +577,10 @@ void MaterialLoader::loadLibraries( for (auto& it : *libraryList) { if (it->isLocal()) { auto materialLibrary = - reinterpret_cast&>(it); - loadLibrary(materialLibrary); + std::dynamic_pointer_cast(it); + if (materialLibrary) { + loadLibrary(materialLibrary); + } } } } diff --git a/src/Mod/Material/App/MaterialManager.cpp b/src/Mod/Material/App/MaterialManager.cpp index d2130b63fd..97bec4fbae 100644 --- a/src/Mod/Material/App/MaterialManager.cpp +++ b/src/Mod/Material/App/MaterialManager.cpp @@ -396,9 +396,10 @@ MaterialManager::getMaterialFolders(const std::shared_ptr& libr { if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); - - return _localManager->getMaterialFolders(materialLibrary); + std::dynamic_pointer_cast(library); + if (materialLibrary) { + return _localManager->getMaterialFolders(materialLibrary); + } } return std::make_shared>(); @@ -409,7 +410,7 @@ void MaterialManager::createFolder(const std::shared_ptr& libra { if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); _localManager->createFolder(materialLibrary, path); } @@ -429,9 +430,10 @@ void MaterialManager::renameFolder(const std::shared_ptr& libra { if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); - - _localManager->renameFolder(materialLibrary, oldPath, newPath); + std::dynamic_pointer_cast(library); + if (materialLibrary) { + _localManager->renameFolder(materialLibrary, oldPath, newPath); + } } #if defined(BUILD_MATERIAL_EXTERNAL) else if (_useExternal) { @@ -448,9 +450,10 @@ void MaterialManager::deleteRecursive(const std::shared_ptr& li { if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); - - _localManager->deleteRecursive(materialLibrary, path); + std::dynamic_pointer_cast(library); + if (materialLibrary) { + _localManager->deleteRecursive(materialLibrary, path); + } } #if defined(BUILD_MATERIAL_EXTERNAL) else if (_useExternal) { @@ -573,7 +576,10 @@ void MaterialManager::saveMaterial(const std::shared_ptr& libra bool saveInherited) const { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); + if (!materialLibrary) { + return; + } _localManager ->saveMaterial(materialLibrary, material, path, overwrite, saveAsCopy, saveInherited); } diff --git a/src/Mod/Material/App/MaterialManagerLocal.cpp b/src/Mod/Material/App/MaterialManagerLocal.cpp index f90df995b7..df1ad500f5 100644 --- a/src/Mod/Material/App/MaterialManagerLocal.cpp +++ b/src/Mod/Material/App/MaterialManagerLocal.cpp @@ -161,7 +161,10 @@ void MaterialManagerLocal::renameLibrary(const QString& libraryName, const QStri for (auto& library : *_libraryList) { if (library->isLocal() && library->isName(libraryName)) { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); + if (!materialLibrary) { + throw LibraryNotFound(); + } materialLibrary->setName(newName); return; } @@ -175,7 +178,10 @@ void MaterialManagerLocal::changeIcon(const QString& libraryName, const QByteArr for (auto& library : *_libraryList) { if (library->isLocal() && library->isName(libraryName)) { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); + if (!materialLibrary) { + throw LibraryNotFound(); + } materialLibrary->setIcon(icon); return; } @@ -312,7 +318,10 @@ std::shared_ptr MaterialManagerLocal::getMaterialByPath(const QString& for (auto& library : *_libraryList) { if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); + if (!materialLibrary) { + continue; + } if (cleanPath.startsWith(materialLibrary->getDirectory())) { try { return materialLibrary->getMaterialByPath(cleanPath); @@ -359,7 +368,10 @@ std::shared_ptr MaterialManagerLocal::getMaterialByPath(const QString& auto library = getLibrary(lib); // May throw LibraryNotFound if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); + if (!materialLibrary) { + throw LibraryNotFound(); + } return materialLibrary->getMaterialByPath(path); // May throw MaterialNotFound } @@ -385,11 +397,13 @@ bool MaterialManagerLocal::exists(const MaterialLibrary& library, { try { auto material = getMaterial(uuid); - if (material && material->getLibrary()->isLocal()) { + if (material && material->getLibrary()) { auto materialLibrary = - reinterpret_cast&>( - *(material->getLibrary())); - return (*materialLibrary == library); + std::dynamic_pointer_cast( + material->getLibrary()); + if (materialLibrary) { + return (*materialLibrary == library); + } } } catch (const MaterialNotFound&) { diff --git a/src/Mod/Material/App/MaterialManagerPyImp.cpp b/src/Mod/Material/App/MaterialManagerPyImp.cpp index 695340dc0c..b89dfe3493 100644 --- a/src/Mod/Material/App/MaterialManagerPyImp.cpp +++ b/src/Mod/Material/App/MaterialManagerPyImp.cpp @@ -145,7 +145,10 @@ Py::List MaterialManagerPy::getMaterialLibraries() const Py::Tuple libTuple(3); if (lib->isLocal()) { auto materialLibrary = - reinterpret_cast&>(lib); + std::dynamic_pointer_cast(lib); + if (!materialLibrary) { + continue; + } libTuple.setItem(0, Py::String(materialLibrary->getName().toStdString())); libTuple.setItem(1, Py::String(materialLibrary->getDirectoryPath().toStdString())); libTuple.setItem(2, diff --git a/src/Mod/Material/App/MaterialPyImp.cpp b/src/Mod/Material/App/MaterialPyImp.cpp index 3b5cddbfc4..1376d88d8a 100644 --- a/src/Mod/Material/App/MaterialPyImp.cpp +++ b/src/Mod/Material/App/MaterialPyImp.cpp @@ -71,7 +71,7 @@ Py::String MaterialPy::getLibraryName() const auto library = getMaterialPtr()->getLibrary(); if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); return {materialLibrary ? materialLibrary->getName().toStdString() : ""}; } return ""; @@ -82,7 +82,7 @@ Py::String MaterialPy::getLibraryRoot() const auto library = getMaterialPtr()->getLibrary(); if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); return {materialLibrary ? materialLibrary->getDirectoryPath().toStdString() : ""}; } return ""; @@ -93,7 +93,10 @@ Py::Object MaterialPy::getLibraryIcon() const auto library = getMaterialPtr()->getLibrary(); if (library->isLocal()) { auto materialLibrary = - reinterpret_cast&>(library); + std::dynamic_pointer_cast(library); + if (!materialLibrary) { + return Py::Bytes(); + } auto icon = materialLibrary->getIcon(); if (icon.isNull()) { return Py::Bytes();