LayerView.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # Copyright (c) 2015 Ultimaker B.V.
  2. # Cura is released under the terms of the AGPLv3 or higher.
  3. from UM.View.View import View
  4. from UM.View.Renderer import Renderer
  5. from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
  6. from UM.Resources import Resources
  7. from UM.Event import Event, KeyEvent
  8. from UM.Signal import Signal
  9. from UM.Scene.Selection import Selection
  10. from UM.Math.Color import Color
  11. from . import LayerViewProxy
  12. ## View used to display g-code paths.
  13. class LayerView(View):
  14. def __init__(self):
  15. super().__init__()
  16. self._material = None
  17. self._num_layers = 0
  18. self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100)
  19. self._proxy = LayerViewProxy.LayerViewProxy()
  20. self._controller.getScene().sceneChanged.connect(self._onSceneChanged)
  21. self._max_layers = 10
  22. self._current_layer_num = 10
  23. def getCurrentLayer(self):
  24. return self._current_layer_num
  25. def _onSceneChanged(self, node):
  26. self.calculateMaxLayers()
  27. def getMaxLayers(self):
  28. return self._max_layers
  29. def beginRendering(self):
  30. scene = self.getController().getScene()
  31. renderer = self.getRenderer()
  32. renderer.setRenderSelection(False)
  33. if not self._material:
  34. self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "vertexcolor.frag"))
  35. self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0])
  36. self._selection_material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "color.frag"))
  37. self._selection_material.setUniformValue("u_color", Color(35, 35, 35, 128))
  38. for node in DepthFirstIterator(scene.getRoot()):
  39. if not node.render(renderer):
  40. if node.getMeshData() and node.isVisible():
  41. if Selection.isSelected(node):
  42. renderer.queueNode(node, material = self._selection_material, transparent = True)
  43. try:
  44. layer_data = node.getMeshData().layerData
  45. except AttributeError:
  46. continue
  47. start = 0
  48. end = 0
  49. element_counts = layer_data.getElementCounts()
  50. for layer, counts in element_counts.items():
  51. end += sum(counts)
  52. ## Hack to ensure the end is correct. Not quite sure what causes this
  53. end += 2 * len(counts)
  54. if layer >= self._current_layer_num:
  55. break
  56. renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end)
  57. def setLayer(self, value):
  58. if self._current_layer_num != value:
  59. self._current_layer_num = value
  60. if self._current_layer_num < 0:
  61. self._current_layer_num = 0
  62. if self._current_layer_num > self._max_layers:
  63. self._current_layer_num = self._max_layers
  64. self.currentLayerNumChanged.emit()
  65. currentLayerNumChanged = Signal()
  66. def calculateMaxLayers(self):
  67. scene = self.getController().getScene()
  68. renderer = self.getRenderer()
  69. if renderer and self._material:
  70. renderer.setRenderSelection(False)
  71. self._old_max_layers = self._max_layers
  72. ## Recalculate num max layers
  73. new_max_layers = 0
  74. for node in DepthFirstIterator(scene.getRoot()):
  75. if not node.render(renderer):
  76. if node.getMeshData() and node.isVisible():
  77. try:
  78. layer_data = node.getMeshData().layerData
  79. except AttributeError:
  80. continue
  81. if new_max_layers < len(layer_data.getLayers()):
  82. new_max_layers = len(layer_data.getLayers())
  83. if new_max_layers > 0 and new_max_layers != self._old_max_layers:
  84. self._max_layers = new_max_layers
  85. self.maxLayersChanged.emit()
  86. # This makes sure we update the current layer
  87. self.setLayer(int(self._max_layers * (self._current_layer_num / self._old_max_layers)))
  88. maxLayersChanged = Signal()
  89. ## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created
  90. # as this caused some issues.
  91. def getProxy(self, engine, script_engine):
  92. return self._proxy
  93. def endRendering(self):
  94. pass
  95. def event(self, event):
  96. if event.type == Event.KeyPressEvent:
  97. if event.key == KeyEvent.UpKey:
  98. self.setLayer(self._current_layer_num + 1)
  99. if event.key == KeyEvent.DownKey:
  100. self.setLayer(self._current_layer_num - 1)