| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | #include "Exceptions.h" |
| | #include "MaterialFilter.h" |
| | #include "MaterialFilterPy.h" |
| | #include "MaterialManager.h" |
| | #include "MaterialManagerPy.h" |
| | #include "MaterialPy.h" |
| | #include "Materials.h" |
| |
|
| | #include "MaterialManagerPy.cpp" |
| |
|
| | #include <Base/PyWrapParseTupleAndKeywords.h> |
| |
|
| | using namespace Materials; |
| |
|
| | |
| | std::string MaterialManagerPy::representation() const |
| | { |
| | std::stringstream str; |
| | str << "<MaterialManager object at " << getMaterialManagerPtr() << ">"; |
| |
|
| | return str.str(); |
| | } |
| |
|
| | PyObject* MaterialManagerPy::PyMake(struct _typeobject*, PyObject*, PyObject*) |
| | { |
| | |
| | return new MaterialManagerPy(&(MaterialManager::getManager())); |
| | } |
| |
|
| | |
| | int MaterialManagerPy::PyInit(PyObject* , PyObject* ) |
| | { |
| | return 0; |
| | } |
| |
|
| | PyObject* MaterialManagerPy::getMaterial(PyObject* args) |
| | { |
| | char* uuid {}; |
| | if (!PyArg_ParseTuple(args, "s", &uuid)) { |
| | return nullptr; |
| | } |
| |
|
| | try { |
| | auto material = getMaterialManagerPtr()->getMaterial(QString::fromStdString(uuid)); |
| | return new MaterialPy(new Material(*material)); |
| | } |
| | catch (const MaterialNotFound&) { |
| | PyErr_SetString(PyExc_LookupError, "Material not found"); |
| | return nullptr; |
| | } |
| | } |
| |
|
| | PyObject* MaterialManagerPy::getMaterialByPath(PyObject* args) |
| | { |
| | char* path {}; |
| | const char* lib = ""; |
| | if (!PyArg_ParseTuple(args, "et|s", "utf-8", &path, &lib)) { |
| | return nullptr; |
| | } |
| |
|
| | std::string utf8Path = std::string(path); |
| | PyMem_Free(path); |
| |
|
| | QString libPath(QString::fromStdString(lib)); |
| | if (!libPath.isEmpty()) { |
| | try { |
| | auto material = |
| | getMaterialManagerPtr()->getMaterialByPath(QString::fromUtf8(utf8Path.c_str()), |
| | libPath); |
| | return new MaterialPy(new Material(*material)); |
| | } |
| | catch (const MaterialNotFound&) { |
| | PyErr_SetString(PyExc_LookupError, "Material not found"); |
| | return nullptr; |
| | } |
| | catch (const LibraryNotFound&) { |
| | PyErr_SetString(PyExc_LookupError, "Library not found"); |
| | return nullptr; |
| | } |
| | } |
| |
|
| | try { |
| | auto material = |
| | getMaterialManagerPtr()->getMaterialByPath(QString::fromUtf8(utf8Path.c_str())); |
| | return new MaterialPy(new Material(*material)); |
| | } |
| | catch (const MaterialNotFound&) { |
| | PyErr_SetString(PyExc_LookupError, "Material not found"); |
| | return nullptr; |
| | } |
| | } |
| |
|
| | PyObject* MaterialManagerPy::inheritMaterial(PyObject* args) |
| | { |
| | char* uuid {}; |
| | if (!PyArg_ParseTuple(args, "s", &uuid)) { |
| | return nullptr; |
| | } |
| |
|
| | try { |
| | auto parent = getMaterialManagerPtr()->getMaterial(QString::fromStdString(uuid)); |
| |
|
| | |
| | auto material = new Material(); |
| | material->setParentUUID(QString::fromLatin1(uuid)); |
| | return new MaterialPy(material); |
| | } |
| | catch (const MaterialNotFound&) { |
| | PyErr_SetString(PyExc_LookupError, "Material not found"); |
| | return nullptr; |
| | } |
| | } |
| |
|
| | Py::List MaterialManagerPy::getMaterialLibraries() const |
| | { |
| | auto libraries = getMaterialManagerPtr()->getLibraries(); |
| | Py::List list; |
| |
|
| | for (auto it = libraries->begin(); it != libraries->end(); it++) { |
| | auto lib = *it; |
| | Py::Tuple libTuple(3); |
| | if (lib->isLocal()) { |
| | auto materialLibrary = |
| | reinterpret_cast<const std::shared_ptr<Materials::MaterialLibraryLocal>&>(lib); |
| | libTuple.setItem(0, Py::String(materialLibrary->getName().toStdString())); |
| | libTuple.setItem(1, Py::String(materialLibrary->getDirectoryPath().toStdString())); |
| | libTuple.setItem(2, |
| | Py::Bytes(Py::Bytes(materialLibrary->getIcon().data(), |
| | materialLibrary->getIcon().size()))); |
| | } |
| | else |
| | { |
| | libTuple.setItem(0, Py::String()); |
| | libTuple.setItem(1, Py::String()); |
| | libTuple.setItem(2, Py::Bytes()); |
| | } |
| |
|
| | list.append(libTuple); |
| | } |
| |
|
| | return list; |
| | } |
| |
|
| | Py::Dict MaterialManagerPy::getMaterials() const |
| | { |
| | Py::Dict dict; |
| |
|
| | auto materials = getMaterialManagerPtr()->getLocalMaterials(); |
| |
|
| | for (auto it = materials->begin(); it != materials->end(); it++) { |
| | QString key = it->first; |
| | auto material = it->second; |
| |
|
| | PyObject* materialPy = new MaterialPy(new Material(*material)); |
| | dict.setItem(Py::String(key.toStdString()), Py::Object(materialPy, true)); |
| | } |
| |
|
| | |
| | return dict; |
| | } |
| |
|
| | PyObject* MaterialManagerPy::getCustomAttributes(const char* ) const |
| | { |
| | return nullptr; |
| | } |
| |
|
| | int MaterialManagerPy::setCustomAttributes(const char* , PyObject* ) |
| | { |
| | return 0; |
| | } |
| |
|
| | PyObject* MaterialManagerPy::materialsWithModel(PyObject* args) |
| | { |
| | char* uuid {}; |
| | if (!PyArg_ParseTuple(args, "s", &uuid)) { |
| | return nullptr; |
| | } |
| |
|
| | auto materials = getMaterialManagerPtr()->materialsWithModel(QString::fromStdString(uuid)); |
| | Py::Dict dict; |
| |
|
| | for (auto it = materials->begin(); it != materials->end(); it++) { |
| | QString key = it->first; |
| | auto material = it->second; |
| |
|
| | PyObject* materialPy = new MaterialPy(new Material(*material)); |
| | dict.setItem(key.toStdString(), Py::asObject(materialPy)); |
| | } |
| |
|
| | return Py::new_reference_to(dict); |
| | } |
| |
|
| | PyObject* MaterialManagerPy::materialsWithModelComplete(PyObject* args) |
| | { |
| | char* uuid {}; |
| | if (!PyArg_ParseTuple(args, "s", &uuid)) { |
| | return nullptr; |
| | } |
| |
|
| | auto materials = |
| | getMaterialManagerPtr()->materialsWithModelComplete(QString::fromStdString(uuid)); |
| | Py::Dict dict; |
| |
|
| | for (auto it = materials->begin(); it != materials->end(); it++) { |
| | QString key = it->first; |
| | auto material = it->second; |
| |
|
| | PyObject* materialPy = new MaterialPy(new Material(*material)); |
| | dict.setItem(key.toStdString(), Py::asObject(materialPy)); |
| | } |
| |
|
| | return Py::new_reference_to(dict); |
| | } |
| |
|
| | PyObject* MaterialManagerPy::save(PyObject* args, PyObject* kwds) |
| | { |
| | char* libraryName {}; |
| | PyObject* obj {}; |
| | char* path {}; |
| | PyObject* overwrite = Py_False; |
| | PyObject* saveAsCopy = Py_False; |
| | PyObject* saveInherited = Py_False; |
| | static const std::array<const char *, 7> kwlist { "library", "material", "path", "overwrite", "saveAsCopy", "saveInherited", nullptr }; |
| | if (!Base::Wrapped_ParseTupleAndKeywords(args, |
| | kwds, |
| | "etOet|O!O!O!", |
| | kwlist, |
| | "utf-8", &libraryName, |
| | &obj, |
| | "utf-8", &path, |
| | &PyBool_Type, &overwrite, |
| | &PyBool_Type, &saveAsCopy, |
| | &PyBool_Type, &saveInherited)) { |
| | return nullptr; |
| | } |
| |
|
| | Base::Console().log("library name %s\n", libraryName); |
| | Base::Console().log("path %s\n", path); |
| |
|
| | MaterialPy* material; |
| | if (QLatin1String(obj->ob_type->tp_name) == QLatin1String("Materials.Material")) { |
| | material = static_cast<MaterialPy*>(obj); |
| | } |
| | else { |
| | PyErr_Format(PyExc_TypeError, "Material expected not '%s'", obj->ob_type->tp_name); |
| | return nullptr; |
| | } |
| | if (!material) { |
| | PyErr_SetString(PyExc_TypeError, "Invalid material object"); |
| | return nullptr; |
| | } |
| | auto sharedMaterial = std::make_shared<Material>(*(material->getMaterialPtr())); |
| |
|
| | std::shared_ptr<MaterialLibrary> library; |
| | try { |
| | library = getMaterialManagerPtr()->getLibrary(QString::fromUtf8(libraryName)); |
| | } |
| | catch (const LibraryNotFound&) { |
| | PyErr_SetString(PyExc_LookupError, "Unknown library"); |
| | return nullptr; |
| | } |
| |
|
| |
|
| | getMaterialManagerPtr()->saveMaterial(library, |
| | sharedMaterial, |
| | QString::fromUtf8(path), |
| | PyObject_IsTrue(overwrite), |
| | PyObject_IsTrue(saveAsCopy), |
| | PyObject_IsTrue(saveInherited)); |
| | material->getMaterialPtr()->setUUID(sharedMaterial->getUUID()); |
| |
|
| | Py_INCREF(Py_None); |
| | return Py_None; |
| | } |
| |
|
| | void addMaterials(MaterialManager *manager, |
| | Py::List& list, |
| | const std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>>& tree) |
| | { |
| | for (auto& node : *tree) { |
| | if (node.second->getType() == MaterialTreeNode::NodeType::DataNode) { |
| | auto uuid = node.second->getUUID(); |
| | auto material = manager->getMaterial(uuid); |
| | PyObject* materialPy = new MaterialPy(new Material(*material)); |
| | list.append(Py::Object(materialPy, true)); |
| | } |
| | else { |
| | addMaterials(manager, list, node.second->getFolder()); |
| | } |
| | } |
| | } |
| |
|
| | PyObject* MaterialManagerPy::filterMaterials(PyObject* args, PyObject* kwds) |
| | { |
| | PyObject* filterPy {}; |
| | PyObject* includeLegacy = Py_False; |
| | static const std::array<const char*, 3> kwds_save{ "filter", |
| | "includeLegacy", |
| | nullptr }; |
| | if (!Base::Wrapped_ParseTupleAndKeywords(args, |
| | kwds, |
| | |
| | "O!|O!", |
| | kwds_save, |
| | &MaterialFilterPy::Type, |
| | &filterPy, |
| | &PyBool_Type, |
| | &includeLegacy)) { |
| | return nullptr; |
| | } |
| |
|
| | MaterialFilterOptions options; |
| | options.setIncludeFavorites(false); |
| | options.setIncludeRecent(false); |
| | options.setIncludeEmptyFolders(false); |
| | options.setIncludeEmptyLibraries(false); |
| | options.setIncludeLegacy(PyObject_IsTrue(includeLegacy)); |
| |
|
| | auto filter = std::make_shared<MaterialFilter>(*(static_cast<MaterialFilterPy*>(filterPy)->getMaterialFilterPtr())); |
| |
|
| | auto libraries = getMaterialManagerPtr()->getLibraries(); |
| | Py::List list; |
| |
|
| | for (auto lib : *libraries) { |
| | auto tree = getMaterialManagerPtr()->getMaterialTree(*lib, *filter, options); |
| | if (tree->size() > 0) { |
| | addMaterials(getMaterialManagerPtr(), list, tree); |
| | } |
| | } |
| |
|
| | Py_INCREF(*list); |
| | return *list; |
| | } |
| |
|
| | PyObject* MaterialManagerPy::refresh(PyObject* ) |
| | { |
| | getMaterialManagerPtr()->refresh(); |
| |
|
| | Py_INCREF(Py_None); |
| | return Py_None; |
| | } |
| |
|