LayerDataBuilder.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # Copyright (c) 2015 Ultimaker B.V.
  2. # Cura is released under the terms of the AGPLv3 or higher.
  3. from .Layer import Layer
  4. from .LayerPolygon import LayerPolygon
  5. from UM.Mesh.MeshBuilder import MeshBuilder
  6. from .LayerData import LayerData
  7. import numpy
  8. ## Builder class for constructing a LayerData object
  9. class LayerDataBuilder(MeshBuilder):
  10. def __init__(self):
  11. super().__init__()
  12. self._layers = {}
  13. self._element_counts = {}
  14. def addLayer(self, layer):
  15. if layer not in self._layers:
  16. self._layers[layer] = Layer(layer)
  17. def addPolygon(self, layer, polygon_type, data, line_width):
  18. if layer not in self._layers:
  19. self.addLayer(layer)
  20. p = LayerPolygon(self, polygon_type, data, line_width)
  21. self._layers[layer].polygons.append(p)
  22. def getLayer(self, layer):
  23. if layer in self._layers:
  24. return self._layers[layer]
  25. def getLayers(self):
  26. return self._layers
  27. def getElementCounts(self):
  28. return self._element_counts
  29. def setLayerHeight(self, layer, height):
  30. if layer not in self._layers:
  31. self.addLayer(layer)
  32. self._layers[layer].setHeight(height)
  33. def setLayerThickness(self, layer, thickness):
  34. if layer not in self._layers:
  35. self.addLayer(layer)
  36. self._layers[layer].setThickness(thickness)
  37. def build(self):
  38. vertex_count = 0
  39. index_count = 0
  40. for layer, data in self._layers.items():
  41. vertex_count += data.lineMeshVertexCount()
  42. index_count += data.lineMeshElementCount()
  43. vertices = numpy.empty((vertex_count, 3), numpy.float32)
  44. colors = numpy.empty((vertex_count, 4), numpy.float32)
  45. indices = numpy.empty((index_count, 2), numpy.int32)
  46. vertex_offset = 0
  47. index_offset = 0
  48. for layer, data in self._layers.items():
  49. ( vertex_offset, index_offset ) = data.build( vertex_offset, index_offset, vertices, colors, indices)
  50. self._element_counts[layer] = data.elementCount
  51. self.addVertices(vertices)
  52. self.addColors(colors)
  53. self.addIndices(indices.flatten())
  54. return LayerData(vertices=self.getVertices(), normals=self.getNormals(), indices=self.getIndices(),
  55. colors=self.getColors(), uvs=self.getUVCoordinates(), file_name=self.getFileName(),
  56. center_position=self.getCenterPosition(), layers=self._layers,
  57. element_counts=self._element_counts)