ConvexHullNode.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # Copyright (c) 2015 Ultimaker B.V.
  2. # Cura is released under the terms of the AGPLv3 or higher.
  3. from UM.Scene.SceneNode import SceneNode
  4. from UM.Resources import Resources
  5. from UM.Math.Color import Color
  6. from UM.Math.Vector import Vector
  7. from UM.Mesh.MeshData import MeshData
  8. import numpy
  9. class ConvexHullNode(SceneNode):
  10. def __init__(self, node, hull, parent = None):
  11. super().__init__(parent)
  12. self.setCalculateBoundingBox(False)
  13. self._material = None
  14. self._original_parent = parent
  15. self._inherit_orientation = False
  16. self._inherit_scale = False
  17. self._node = node
  18. self._node.transformationChanged.connect(self._onNodePositionChanged)
  19. self._node.parentChanged.connect(self._onNodeParentChanged)
  20. #self._onNodePositionChanged(self._node)
  21. self._hull = hull
  22. hull_points = self._hull.getPoints()
  23. mesh = MeshData()
  24. if len(hull_points) > 3:
  25. center = (hull_points.min(0) + hull_points.max(0)) / 2.0
  26. mesh.addVertex(center[0], 0.1, center[1])
  27. else: #Hull has not enough points
  28. return
  29. for point in hull_points:
  30. mesh.addVertex(point[0], 0.1, point[1])
  31. indices = []
  32. for i in range(len(hull_points) - 1):
  33. indices.append([0, i + 1, i + 2])
  34. indices.append([0, mesh.getVertexCount() - 1, 1])
  35. mesh.addIndices(numpy.array(indices, numpy.int32))
  36. self.setMeshData(mesh)
  37. def getWatchedNode(self):
  38. return self._node
  39. def render(self, renderer):
  40. if not self._material:
  41. self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "color.frag"))
  42. self._material.setUniformValue("u_color", Color(35, 35, 35, 128))
  43. if self.getParent():
  44. renderer.queueNode(self, material = self._material, transparent = True)
  45. return True
  46. def _onNodePositionChanged(self, node):
  47. #self.setPosition(node.getWorldPosition())
  48. if node.callDecoration("getConvexHull"):
  49. node.callDecoration("setConvexHull", None)
  50. node.callDecoration("setConvexHullNode", None)
  51. self.setParent(None)
  52. #self._node.transformationChanged.disconnect(self._onNodePositionChanged)
  53. #self._node.parentChanged.disconnect(self._onNodeParentChanged)
  54. def _onNodeParentChanged(self, node):
  55. if node.getParent():
  56. self.setParent(self._original_parent)
  57. else:
  58. self.setParent(None)