LayerView.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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.Scene.Selection import Selection
  8. from UM.Math.Color import Color
  9. ## View used to display g-code paths.
  10. class LayerView(View):
  11. def __init__(self):
  12. super().__init__()
  13. self._material = None
  14. self._num_layers = 0
  15. self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100)
  16. def beginRendering(self):
  17. scene = self.getController().getScene()
  18. renderer = self.getRenderer()
  19. renderer.setRenderSelection(False)
  20. if not self._material:
  21. self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "vertexcolor.frag"))
  22. self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0])
  23. self._selection_material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "color.frag"))
  24. self._selection_material.setUniformValue("u_color", Color(35, 35, 35, 128))
  25. for node in DepthFirstIterator(scene.getRoot()):
  26. if not node.render(renderer):
  27. if node.getMeshData() and node.isVisible():
  28. if Selection.isSelected(node):
  29. renderer.queueNode(node, material = self._selection_material, transparent = True)
  30. try:
  31. layer_data = node.getMeshData().layerData
  32. except AttributeError:
  33. continue
  34. if self._layer_percentage < 100:
  35. start = 0
  36. end_layer = round(len(layer_data.getLayers()) * (self._layer_percentage / 100))
  37. end = 0
  38. element_counts = layer_data.getElementCounts()
  39. for layer, counts in element_counts.items():
  40. end += sum(counts)
  41. ## Hack to ensure the end is correct. Not quite sure what causes this
  42. end += 2 * len(counts)
  43. if layer >= end_layer:
  44. break
  45. renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end, overlay = True)
  46. else:
  47. renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, overlay = True)
  48. def setLayer(self, value):
  49. self._layer_percentage = value
  50. def endRendering(self):
  51. pass