QualityProfilesModel.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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
  4. from UM.Application import Application
  5. from UM.Logger import Logger
  6. from UM.Qt.ListModel import ListModel
  7. from cura.Machines.QualityManager import QualityGroup
  8. #
  9. # QML Model for all built-in quality profiles.
  10. #
  11. class QualityProfilesModel(ListModel):
  12. IdRole = Qt.UserRole + 1
  13. NameRole = Qt.UserRole + 2
  14. QualityTypeRole = Qt.UserRole + 3
  15. LayerHeightRole = Qt.UserRole + 4
  16. AvailableRole = Qt.UserRole + 5
  17. QualityGroupRole = Qt.UserRole + 6
  18. QualityChangesGroupRole = Qt.UserRole + 7
  19. def __init__(self, parent = None):
  20. super().__init__(parent)
  21. self.addRoleName(self.IdRole, "id")
  22. self.addRoleName(self.NameRole, "name")
  23. self.addRoleName(self.QualityTypeRole, "quality_type")
  24. self.addRoleName(self.LayerHeightRole, "layer_height")
  25. self.addRoleName(self.AvailableRole, "available")
  26. self.addRoleName(self.QualityGroupRole, "quality_group")
  27. self.addRoleName(self.QualityChangesGroupRole, "quality_changes_group")
  28. # connect signals
  29. Application.getInstance().globalContainerStackChanged.connect(self._update)
  30. Application.getInstance().getMachineManager().activeQualityGroupChanged.connect(self._update)
  31. self._quality_manager = Application.getInstance()._quality_manager
  32. self._quality_manager.qualitiesUpdated.connect(self._update)
  33. self._layer_height_unit = "" # This is cached
  34. def _update(self):
  35. Logger.log("d", "Updating quality profile model ...")
  36. active_global_stack = Application.getInstance().getMachineManager()._global_container_stack
  37. if active_global_stack is None:
  38. self.setItems([])
  39. Logger.log("d", "No active GlobalStack, set quality profile model as empty.")
  40. return
  41. quality_group_dict = self._quality_manager.getQualityGroups(active_global_stack)
  42. item_list = []
  43. for key in sorted(quality_group_dict):
  44. quality_group = quality_group_dict[key]
  45. layer_height = self._fetchLayerHeight(quality_group)
  46. item = {"id": "TODO", # TODO: probably will be removed
  47. "name": quality_group.name,
  48. "quality_type": quality_group.quality_type,
  49. "layer_height": layer_height + self._layer_height_unit,
  50. "layer_height_without_unit": layer_height,
  51. "available": quality_group.is_available,
  52. "quality_group": quality_group}
  53. item_list.append(item)
  54. # Sort items based on layer_height
  55. item_list = sorted(item_list, key = lambda x: float(x["layer_height_without_unit"]))
  56. self.setItems(item_list)
  57. def _fetchLayerHeight(self, quality_group: "QualityGroup"):
  58. active_global_stack = Application.getInstance().getMachineManager()._global_container_stack
  59. if not self._layer_height_unit:
  60. unit = active_global_stack.definition.getProperty("layer_height", "unit")
  61. if not unit:
  62. unit = ""
  63. self._layer_height_unit = unit
  64. default_layer_height = active_global_stack.definition.getProperty("layer_height", "value")
  65. # Get layer_height from the quality profile for the GlobalStack
  66. container = quality_group.node_for_global.getContainer()
  67. layer_height = default_layer_height
  68. if container.hasProperty("layer_height", "value"):
  69. layer_height = str(container.getProperty("layer_height", "value"))
  70. else:
  71. # Look for layer_height in the GlobalStack from material -> definition
  72. for idx in range(4):
  73. container = active_global_stack.getContainer(idx)
  74. if container.hasProperty("layer_height", "value"):
  75. layer_height = container.getProperty("layer_height", "value")
  76. break
  77. return str(layer_height)