QualityManagementModel.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. # Copyright (c) 2019 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from PyQt5.QtCore import Qt, pyqtSlot
  4. from UM.Logger import Logger
  5. from UM.Qt.ListModel import ListModel
  6. from cura.Machines.ContainerTree import ContainerTree
  7. #
  8. # This the QML model for the quality management page.
  9. #
  10. class QualityManagementModel(ListModel):
  11. NameRole = Qt.UserRole + 1
  12. IsReadOnlyRole = Qt.UserRole + 2
  13. QualityGroupRole = Qt.UserRole + 3
  14. QualityChangesGroupRole = Qt.UserRole + 4
  15. def __init__(self, parent = None):
  16. super().__init__(parent)
  17. self.addRoleName(self.NameRole, "name")
  18. self.addRoleName(self.IsReadOnlyRole, "is_read_only")
  19. self.addRoleName(self.QualityGroupRole, "quality_group")
  20. self.addRoleName(self.QualityChangesGroupRole, "quality_changes_group")
  21. from cura.CuraApplication import CuraApplication
  22. self._container_registry = CuraApplication.getInstance().getContainerRegistry()
  23. self._machine_manager = CuraApplication.getInstance().getMachineManager()
  24. self._extruder_manager = CuraApplication.getInstance().getExtruderManager()
  25. self._quality_manager = CuraApplication.getInstance().getQualityManager()
  26. self._machine_manager.globalContainerChanged.connect(self._update)
  27. self._quality_manager.qualitiesUpdated.connect(self._update)
  28. self._update()
  29. def _update(self):
  30. Logger.log("d", "Updating {model_class_name}.".format(model_class_name = self.__class__.__name__))
  31. global_stack = self._machine_manager.activeMachine
  32. if not global_stack:
  33. self.setItems([])
  34. return
  35. quality_group_dict = ContainerTree.getInstance().getCurrentQualityGroups()
  36. quality_changes_group_dict = self._quality_manager.getQualityChangesGroups(global_stack)
  37. available_quality_types = set(quality_type for quality_type, quality_group in quality_group_dict.items()
  38. if quality_group.is_available)
  39. if not available_quality_types and not quality_changes_group_dict:
  40. # Nothing to show
  41. self.setItems([])
  42. return
  43. item_list = []
  44. # Create quality group items
  45. for quality_group in quality_group_dict.values():
  46. if not quality_group.is_available:
  47. continue
  48. item = {"name": quality_group.name,
  49. "is_read_only": True,
  50. "quality_group": quality_group,
  51. "quality_changes_group": None}
  52. item_list.append(item)
  53. # Sort by quality names
  54. item_list = sorted(item_list, key = lambda x: x["name"].upper())
  55. # Create quality_changes group items
  56. quality_changes_item_list = []
  57. for quality_changes_group in quality_changes_group_dict.values():
  58. quality_group = quality_group_dict.get(quality_changes_group.quality_type)
  59. item = {"name": quality_changes_group.name,
  60. "is_read_only": False,
  61. "quality_group": quality_group,
  62. "quality_changes_group": quality_changes_group}
  63. quality_changes_item_list.append(item)
  64. # Sort quality_changes items by names and append to the item list
  65. quality_changes_item_list = sorted(quality_changes_item_list, key = lambda x: x["name"].upper())
  66. item_list += quality_changes_item_list
  67. self.setItems(item_list)
  68. # TODO: Duplicated code here from InstanceContainersModel. Refactor and remove this later.
  69. #
  70. ## Gets a list of the possible file filters that the plugins have
  71. # registered they can read or write. The convenience meta-filters
  72. # "All Supported Types" and "All Files" are added when listing
  73. # readers, but not when listing writers.
  74. #
  75. # \param io_type \type{str} name of the needed IO type
  76. # \return A list of strings indicating file name filters for a file
  77. # dialog.
  78. @pyqtSlot(str, result = "QVariantList")
  79. def getFileNameFilters(self, io_type):
  80. from UM.i18n import i18nCatalog
  81. catalog = i18nCatalog("uranium")
  82. #TODO: This function should be in UM.Resources!
  83. filters = []
  84. all_types = []
  85. for plugin_id, meta_data in self._getIOPlugins(io_type):
  86. for io_plugin in meta_data[io_type]:
  87. filters.append(io_plugin["description"] + " (*." + io_plugin["extension"] + ")")
  88. all_types.append("*.{0}".format(io_plugin["extension"]))
  89. if "_reader" in io_type:
  90. # if we're listing readers, add the option to show all supported files as the default option
  91. filters.insert(0, catalog.i18nc("@item:inlistbox", "All Supported Types ({0})", " ".join(all_types)))
  92. filters.append(catalog.i18nc("@item:inlistbox", "All Files (*)")) # Also allow arbitrary files, if the user so prefers.
  93. return filters
  94. ## Gets a list of profile reader or writer plugins
  95. # \return List of tuples of (plugin_id, meta_data).
  96. def _getIOPlugins(self, io_type):
  97. from UM.PluginRegistry import PluginRegistry
  98. pr = PluginRegistry.getInstance()
  99. active_plugin_ids = pr.getActivePlugins()
  100. result = []
  101. for plugin_id in active_plugin_ids:
  102. meta_data = pr.getMetaData(plugin_id)
  103. if io_type in meta_data:
  104. result.append( (plugin_id, meta_data) )
  105. return result