Arjen Hiemstra ad88506325 Use the new layer message properties to properly create layers
Now we use the height as provided by the engine to render the layer at.

Contributes to #52
2015-06-16 13:20:22 +02:00

150 lines
3.8 KiB
Python

# Copyright (c) 2015 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from UM.Mesh.MeshData import MeshData
from UM.Mesh.MeshBuilder import MeshBuilder
from UM.Math.Color import Color
from UM.Math.Vector import Vector
import numpy
import math
class LayerData(MeshData):
def __init__(self):
super().__init__()
self._layers = {}
self._element_counts = {}
def addLayer(self, layer):
if layer not in self._layers:
self._layers[layer] = Layer(layer)
def addPolygon(self, layer, type, data, line_width):
if layer not in self._layers:
self.addLayer(layer)
p = Polygon(self, type, data, line_width)
self._layers[layer].polygons.append(p)
def getLayer(self, layer):
return self._layers[layer]
def getLayers(self):
return self._layers
def getElementCounts(self):
return self._element_counts
def setLayerHeight(self, layer, height):
if layer not in self._layers:
self.addLayer(layer)
self._layers[layer].setHeight(height)
def setLayerThickness(self, layer, thickness):
if layer not in self._layers:
self.addLayer(layer)
self._layers[layer].setThickness(thickness)
def build(self):
for layer, data in self._layers.items():
data.build()
self._element_counts[layer] = data.elementCount
class Layer():
def __init__(self, id):
self._id = id
self._height = 0.0
self._thickness = 0.0
self._polygons = []
self._element_count = 0
@property
def height(self):
return self._height
@property
def thickness(self):
return self._thickness
@property
def polygons(self):
return self._polygons
@property
def elementCount(self):
return self._element_count
def setHeight(self, height):
self._height = height
def setThickness(self, thickness):
self._thickness = thickness
def build(self):
for polygon in self._polygons:
if polygon._type == Polygon.InfillType or polygon._type == Polygon.SupportInfillType:
continue
polygon.build()
self._element_count += polygon.elementCount
class Polygon():
NoneType = 0
Inset0Type = 1
InsetXType = 2
SkinType = 3
SupportType = 4
SkirtType = 5
def __init__(self, mesh, type, data):
super().__init__()
self._mesh = mesh
self._type = type
self._data = data
def build(self):
self._begin = self._mesh._vertex_count
self._mesh.addVertices(self._data)
self._end = self._begin + len(self._data) - 1
color = None
if self._type == self.Inset0Type:
color = [1, 0, 0, 1]
elif self._type == self.InsetXType:
color = [0, 1, 0, 1]
elif self._type == self.SkinType:
color = [1, 1, 0, 1]
elif self._type == self.SupportType:
color = [0, 1, 1, 1]
elif self._type == self.SkirtType:
color = [0, 1, 1, 1]
else:
color = [1, 1, 1, 1]
colors = [color for i in range(len(self._data))]
self._mesh.addColors(numpy.array(colors, dtype=numpy.float32))
indices = []
for i in range(self._begin, self._end):
indices.append(i)
indices.append(i + 1)
indices.append(self._end)
indices.append(self._begin)
self._mesh.addIndices(numpy.array(indices, dtype=numpy.int32))
@property
def type(self):
return self._type
@property
def data(self):
return self._data
@property
def elementCount(self):
return (self._end - self._begin) * 2 #The range of vertices multiplied by 2 since each vertex is used twice