Cura/cura/ConvexHullJob.py
Jaime van Kessel 49cb12bda1 Revert "Forced hull calculation of parent should now always occur"
This reverts commit c501d0a37c792b11a77cc48ac1d573d8aa7cffb5.
2015-07-15 15:42:56 +02:00

63 lines
2.7 KiB
Python

# Copyright (c) 2015 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from UM.Job import Job
from UM.Application import Application
from UM.Math.Polygon import Polygon
import numpy
from . import ConvexHullNode
class ConvexHullJob(Job):
def __init__(self, node):
super().__init__()
self._node = node
def run(self):
if not self._node:
return
## If the scene node is a group, use the hull of the children to calculate its hull.
if self._node.callDecoration("isGroup"):
hull = Polygon(numpy.zeros((0, 2), dtype=numpy.int32))
for child in self._node.getChildren():
child_hull = child.callDecoration("getConvexHull")
if child_hull:
hull.setPoints(numpy.append(hull.getPoints(), child_hull.getPoints(), axis = 0))
if hull.getPoints().size < 3:
self._node.callDecoration("setConvexHull", None)
self._node.callDecoration("setConvexHullJob", None)
return
else:
if not self._node.getMeshData():
return
mesh = self._node.getMeshData()
vertex_data = mesh.getTransformed(self._node.getWorldTransformation()).getVertices()
hull = Polygon(numpy.rint(vertex_data[:, [0, 2]]).astype(int))
# First, calculate the normal convex hull around the points
hull = hull.getConvexHull()
#print("hull: " , self._node.callDecoration("isGroup"), " " , hull.getPoints())
# Then, do a Minkowski hull with a simple 1x1 quad to outset and round the normal convex hull.
hull = hull.getMinkowskiHull(Polygon(numpy.array([[-1, -1], [-1, 1], [1, 1], [1, -1]], numpy.float32)))
hull_node = ConvexHullNode.ConvexHullNode(self._node, hull, Application.getInstance().getController().getScene().getRoot())
self._node.callDecoration("setConvexHullNode", hull_node)
self._node.callDecoration("setConvexHull", hull)
self._node.callDecoration("setConvexHullJob", None)
#if self._node.getParent().callDecoration("isGroup"):
# if self._node.getParent().callDecoration("getConvexHull"):
# self._node.getParent().callDecoration("getConvexHullNode").setParent(None)
# self._node.getParent().callDecoration("setConvexHull", None)
# self._node.getParent().callDecoration("setConvexHullJob", None)
#if hasattr(self._node.getParent(), "_convex_hull"):
# convex_hull = getattr(self._node.getParent(), "_convex_hull")
#delattr(self._node.getParent(), "_convex_hull")