PerObjectSettingsModel.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # Copyright (c) 2015 Ultimaker B.V.
  2. # Uranium is released under the terms of the AGPLv3 or higher.
  3. from PyQt5.QtCore import Qt, pyqtSlot, QUrl
  4. from UM.Application import Application
  5. from UM.Qt.ListModel import ListModel
  6. from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
  7. from UM.Scene.SceneNode import SceneNode
  8. from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator
  9. from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator
  10. from . import SettingOverrideModel
  11. class PerObjectSettingsModel(ListModel):
  12. IdRole = Qt.UserRole + 1
  13. XRole = Qt.UserRole + 2
  14. YRole = Qt.UserRole + 3
  15. MaterialRole = Qt.UserRole + 4
  16. ProfileRole = Qt.UserRole + 5
  17. SettingsRole = Qt.UserRole + 6
  18. def __init__(self, parent = None):
  19. super().__init__(parent)
  20. self._scene = Application.getInstance().getController().getScene()
  21. self._root = self._scene.getRoot()
  22. self.addRoleName(self.IdRole,"id")
  23. self.addRoleName(self.MaterialRole, "material")
  24. self.addRoleName(self.ProfileRole, "profile")
  25. self.addRoleName(self.SettingsRole, "settings")
  26. self._updateModel()
  27. @pyqtSlot("quint64", str)
  28. def setObjectProfile(self, object_id, profile_name):
  29. self.setProperty(self.find("id", object_id), "profile", profile_name)
  30. profile = None
  31. if profile_name != "global":
  32. profile = Application.getInstance().getMachineManager().findProfile(profile_name)
  33. node = self._scene.findObject(object_id)
  34. if profile:
  35. if not node.getDecorator(ProfileOverrideDecorator):
  36. node.addDecorator(ProfileOverrideDecorator())
  37. node.callDecoration("setProfile", profile)
  38. else:
  39. if node.getDecorator(ProfileOverrideDecorator):
  40. node.removeDecorator(ProfileOverrideDecorator)
  41. @pyqtSlot("quint64", str)
  42. def addSettingOverride(self, object_id, key):
  43. machine = Application.getInstance().getMachineManager().getActiveMachineInstance()
  44. if not machine:
  45. return
  46. node = self._scene.findObject(object_id)
  47. if not node.getDecorator(SettingOverrideDecorator):
  48. node.addDecorator(SettingOverrideDecorator())
  49. node.callDecoration("addSetting", key)
  50. @pyqtSlot("quint64", str)
  51. def removeSettingOverride(self, object_id, key):
  52. node = self._scene.findObject(object_id)
  53. node.callDecoration("removeSetting", key)
  54. if len(node.callDecoration("getAllSettings")) == 0:
  55. node.removeDecorator(SettingOverrideDecorator)
  56. def _updateModel(self):
  57. self.clear()
  58. for node in BreadthFirstIterator(self._root):
  59. if type(node) is not SceneNode or not node.isSelectable():
  60. continue
  61. node_profile = node.callDecoration("getProfile")
  62. if not node_profile:
  63. node_profile = "global"
  64. else:
  65. node_profile = node_profile.getName()
  66. self.appendItem({
  67. "id": id(node),
  68. "material": "",
  69. "profile": node_profile,
  70. "settings": SettingOverrideModel.SettingOverrideModel(node)
  71. })