123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- from UM.Math.Color import Color
- import numpy
- class LayerPolygon:
- NoneType = 0
- Inset0Type = 1
- InsetXType = 2
- SkinType = 3
- SupportType = 4
- SkirtType = 5
- InfillType = 6
- SupportInfillType = 7
- MoveCombingType = 8
- MoveRetractionType = 9
-
- __jump_map = numpy.logical_or( numpy.arange(10) == NoneType, numpy.arange(10) >= MoveCombingType )
-
- def __init__(self, mesh, line_types, data, line_widths):
- self._mesh = mesh
- self._types = line_types
- self._data = data
- self._line_widths = line_widths / 1000
-
- self._vertex_begin = 0
- self._vertex_end = 0
- self._index_begin = 0
- self._index_end = 0
-
- self._jump_mask = self.__jump_map[self._types]
- self._jump_count = numpy.sum(self._jump_mask)
- self._mesh_line_count = len(self._types)-self._jump_count
- self._vertex_count = self._mesh_line_count + numpy.sum( self._types[1:] == self._types[:-1])
-
-
- self._colors = self.__color_map[self._types]
- self._color_map = self.__color_map
-
-
-
- self._isInfillOrSkinTypeMap = numpy.array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0], dtype=numpy.bool)
-
- self._build_cache_line_mesh_mask = None
- self._build_cache_needed_points = None
-
- def buildCache(self):
-
- self._build_cache_line_mesh_mask = numpy.logical_not(numpy.logical_or(self._jump_mask, self._types == LayerPolygon.InfillType ))
- mesh_line_count = numpy.sum(self._build_cache_line_mesh_mask)
- self._index_begin = 0
- self._index_end = mesh_line_count
-
- self._build_cache_needed_points = numpy.ones((len(self._types), 2), dtype=numpy.bool)
-
- self._build_cache_needed_points[1:, 0][:, numpy.newaxis] = self._types[1:] != self._types[:-1]
-
- numpy.logical_and(self._build_cache_needed_points, self._build_cache_line_mesh_mask, self._build_cache_needed_points )
-
- self._vertex_begin = 0
- self._vertex_end = numpy.sum( self._build_cache_needed_points )
-
- def build(self, vertex_offset, index_offset, vertices, colors, indices):
- if (self._build_cache_line_mesh_mask == None) or (self._build_cache_needed_points == None ):
- self.buildCache()
-
- line_mesh_mask = self._build_cache_line_mesh_mask
- needed_points_list = self._build_cache_needed_points
-
-
-
-
- index_list = ( numpy.arange(len(self._types)).reshape((-1, 1)) + numpy.array([[0, 1]]) ).reshape((-1, 1))[needed_points_list.reshape((-1, 1))]
-
-
- self._vertex_begin += vertex_offset
- self._vertex_end += vertex_offset
-
-
- vertices[self._vertex_begin:self._vertex_end, :] = self._data[index_list, :]
-
- colors[self._vertex_begin:self._vertex_end, :] = numpy.tile(self._colors, (1, 2)).reshape((-1, 4))[needed_points_list.ravel()]
- colors[self._vertex_begin:self._vertex_end, :] *= numpy.array([[0.5, 0.5, 0.5, 1.0]], numpy.float32)
-
- self._index_begin += index_offset
- self._index_end += index_offset
-
- indices[self._index_begin:self._index_end, :] = numpy.arange(self._index_end-self._index_begin, dtype=numpy.int32).reshape((-1, 1))
-
- indices[self._index_begin:self._index_end, :] += numpy.cumsum(needed_points_list[line_mesh_mask.ravel(), 0], dtype=numpy.int32).reshape((-1, 1))
-
-
- indices[self._index_begin:self._index_end, :] += numpy.array([self._vertex_begin - 1, self._vertex_begin])
-
- self._build_cache_line_mesh_mask = None
- self._build_cache_needed_points = None
- def getColors(self):
- return self._colors
- def mapLineTypeToColor(self, line_types):
- return self._color_map[line_types]
- def isInfillOrSkinType(self, line_types):
- return self._isInfillOrSkinTypeMap[line_types]
- def lineMeshVertexCount(self):
- return (self._vertex_end - self._vertex_begin)
- def lineMeshElementCount(self):
- return (self._index_end - self._index_begin)
- @property
- def types(self):
- return self._types
- @property
- def data(self):
- return self._data
- @property
- def elementCount(self):
- return (self._index_end - self._index_begin) * 2
- @property
- def lineWidths(self):
- return self._line_widths
-
- @property
- def jumpMask(self):
- return self._jump_mask
- @property
- def meshLineCount(self):
- return self._mesh_line_count
- @property
- def jumpCount(self):
- return self._jump_count
-
- def getNormals(self):
- normals = numpy.copy(self._data)
- normals[:, 1] = 0.0
-
-
-
-
-
- normals = numpy.diff(normals, 1, 0)
-
- lengths = numpy.sqrt(normals[:, 0] ** 2 + normals[:, 2] ** 2)
-
-
- normals[:, [0, 2]] = normals[:, [2, 0]]
- normals[:, 0] *= -1
-
- normals[:, 0] /= lengths
- normals[:, 2] /= lengths
- return normals
- __color_mapping = {
- NoneType: Color(1.0, 1.0, 1.0, 1.0),
- Inset0Type: Color(1.0, 0.0, 0.0, 1.0),
- InsetXType: Color(0.0, 1.0, 0.0, 1.0),
- SkinType: Color(1.0, 1.0, 0.0, 1.0),
- SupportType: Color(0.0, 1.0, 1.0, 1.0),
- SkirtType: Color(0.0, 1.0, 1.0, 1.0),
- InfillType: Color(1.0, 0.74, 0.0, 1.0),
- SupportInfillType: Color(0.0, 1.0, 1.0, 1.0),
- MoveCombingType: Color(0.0, 0.0, 1.0, 1.0),
- MoveRetractionType: Color(0.5, 0.5, 1.0, 1.0),
- }
-
- __color_map = numpy.array([
- [1.0, 1.0, 1.0, 1.0],
- [1.0, 0.0, 0.0, 1.0],
- [0.0, 1.0, 0.0, 1.0],
- [1.0, 1.0, 0.0, 1.0],
- [0.0, 1.0, 1.0, 1.0],
- [0.0, 1.0, 1.0, 1.0],
- [1.0, 0.74, 0.0, 1.0],
- [0.0, 1.0, 1.0, 1.0],
- [0.0, 0.0, 1.0, 1.0],
- [0.5, 0.5, 1.0, 1.0]
- ])
|