QualityManagementModel.py 5.3 KB

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