UM2UpgradeSelection.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # Copyright (c) 2017 Ultimaker B.V.
  2. # Uranium is released under the terms of the LGPLv3 or higher.
  3. from UM.Settings.ContainerRegistry import ContainerRegistry
  4. from cura.MachineAction import MachineAction
  5. from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty
  6. from UM.i18n import i18nCatalog
  7. from UM.Application import Application
  8. from UM.Util import parseBool
  9. catalog = i18nCatalog("cura")
  10. ## The Ultimaker 2 can have a few revisions & upgrades.
  11. class UM2UpgradeSelection(MachineAction):
  12. def __init__(self):
  13. super().__init__("UM2UpgradeSelection", catalog.i18nc("@action", "Select upgrades"))
  14. self._qml_url = "UM2UpgradeSelectionMachineAction.qml"
  15. self._container_registry = ContainerRegistry.getInstance()
  16. self._current_global_stack = None
  17. from cura.CuraApplication import CuraApplication
  18. CuraApplication.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged)
  19. self._reset()
  20. def _reset(self):
  21. self.hasVariantsChanged.emit()
  22. def _onGlobalStackChanged(self):
  23. if self._current_global_stack:
  24. self._current_global_stack.metaDataChanged.disconnect(self._onGlobalStackMetaDataChanged)
  25. self._current_global_stack = Application.getInstance().getGlobalContainerStack()
  26. if self._current_global_stack:
  27. self._current_global_stack.metaDataChanged.connect(self._onGlobalStackMetaDataChanged)
  28. self._reset()
  29. def _onGlobalStackMetaDataChanged(self):
  30. self._reset()
  31. hasVariantsChanged = pyqtSignal()
  32. def setHasVariants(self, has_variants = True):
  33. global_container_stack = Application.getInstance().getGlobalContainerStack()
  34. if global_container_stack:
  35. variant_container = global_container_stack.extruders["0"].variant
  36. if has_variants:
  37. if "has_variants" in global_container_stack.getMetaData():
  38. global_container_stack.setMetaDataEntry("has_variants", True)
  39. else:
  40. global_container_stack.addMetaDataEntry("has_variants", True)
  41. # Set the variant container to a sane default
  42. empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer()
  43. if type(variant_container) == type(empty_container):
  44. search_criteria = { "type": "variant", "definition": "ultimaker2", "id": "*0.4*" }
  45. containers = self._container_registry.findInstanceContainers(**search_criteria)
  46. if containers:
  47. global_container_stack.extruders["0"].variant = containers[0]
  48. else:
  49. # The metadata entry is stored in an ini, and ini files are parsed as strings only.
  50. # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False.
  51. if "has_variants" in global_container_stack.getMetaData():
  52. global_container_stack.removeMetaDataEntry("has_variants")
  53. # Set the variant container to an empty variant
  54. global_container_stack.extruders["0"].variant = ContainerRegistry.getInstance().getEmptyInstanceContainer()
  55. Application.getInstance().globalContainerStackChanged.emit()
  56. self._reset()
  57. @pyqtProperty(bool, fset = setHasVariants, notify = hasVariantsChanged)
  58. def hasVariants(self):
  59. if self._current_global_stack:
  60. return parseBool(self._current_global_stack.getMetaDataEntry("has_variants", "false"))