Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGhostkeeper <rubend@tutanota.com>2017-04-10 11:52:31 +0300
committerGhostkeeper <rubend@tutanota.com>2017-04-10 11:52:31 +0300
commitcb7c25f92fdf2304d53eefcf95b3907235fbd806 (patch)
tree3c752ee200bcb88e7e6b113f6e37cee2471adfdc /cura/BuildVolume.py
parent041481107963232cb58d658a20417d798dd58060 (diff)
parentc94b05e0f45b0af7eb77492dd2aad964dab266f0 (diff)
Merge branch 'master' into feature_support_top_bottom_speed
Diffstat (limited to 'cura/BuildVolume.py')
-rwxr-xr-xcura/BuildVolume.py65
1 files changed, 58 insertions, 7 deletions
diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py
index 35138a5ea7..16a11fbc1c 100755
--- a/cura/BuildVolume.py
+++ b/cura/BuildVolume.py
@@ -23,7 +23,6 @@ from UM.View.GL.OpenGL import OpenGL
catalog = i18nCatalog("cura")
import numpy
-import copy
import math
# Setting for clearance around the prime
@@ -110,10 +109,11 @@ class BuildVolume(SceneNode):
def _onChangeTimerFinished(self):
root = Application.getInstance().getController().getScene().getRoot()
- new_scene_objects = set(node for node in BreadthFirstIterator(root) if node.getMeshData() and type(node) is SceneNode)
+ new_scene_objects = set(node for node in BreadthFirstIterator(root) if node.callDecoration("isSliceable"))
if new_scene_objects != self._scene_objects:
for node in new_scene_objects - self._scene_objects: #Nodes that were added to the scene.
- node.decoratorsChanged.connect(self._onNodeDecoratorChanged)
+ self._updateNodeListeners(node)
+ node.decoratorsChanged.connect(self._updateNodeListeners) # Make sure that decoration changes afterwards also receive the same treatment
for node in self._scene_objects - new_scene_objects: #Nodes that were removed from the scene.
per_mesh_stack = node.callDecoration("getStack")
if per_mesh_stack:
@@ -121,7 +121,7 @@ class BuildVolume(SceneNode):
active_extruder_changed = node.callDecoration("getActiveExtruderChangedSignal")
if active_extruder_changed is not None:
node.callDecoration("getActiveExtruderChangedSignal").disconnect(self._updateDisallowedAreasAndRebuild)
- node.decoratorsChanged.disconnect(self._onNodeDecoratorChanged)
+ node.decoratorsChanged.disconnect(self._updateNodeListeners)
self._scene_objects = new_scene_objects
self._onSettingPropertyChanged("print_sequence", "value") # Create fake event, so right settings are triggered.
@@ -129,7 +129,7 @@ class BuildVolume(SceneNode):
## Updates the listeners that listen for changes in per-mesh stacks.
#
# \param node The node for which the decorators changed.
- def _onNodeDecoratorChanged(self, node):
+ def _updateNodeListeners(self, node):
per_mesh_stack = node.callDecoration("getStack")
if per_mesh_stack:
per_mesh_stack.propertyChanged.connect(self._onSettingPropertyChanged)
@@ -179,6 +179,54 @@ class BuildVolume(SceneNode):
return True
+ ## For every sliceable node, update node._outside_buildarea
+ #
+ def updateNodeBoundaryCheck(self):
+ root = Application.getInstance().getController().getScene().getRoot()
+ nodes = list(BreadthFirstIterator(root))
+ group_nodes = []
+
+ build_volume_bounding_box = self.getBoundingBox()
+ if build_volume_bounding_box:
+ # It's over 9000!
+ build_volume_bounding_box = build_volume_bounding_box.set(bottom=-9001)
+ else:
+ # No bounding box. This is triggered when running Cura from command line with a model for the first time
+ # In that situation there is a model, but no machine (and therefore no build volume.
+ return
+
+ for node in nodes:
+
+ # Need to check group nodes later
+ if node.callDecoration("isGroup"):
+ group_nodes.append(node) # Keep list of affected group_nodes
+
+ if node.callDecoration("isSliceable") or node.callDecoration("isGroup"):
+ node._outside_buildarea = False
+ bbox = node.getBoundingBox()
+
+ # Mark the node as outside the build volume if the bounding box test fails.
+ if build_volume_bounding_box.intersectsBox(bbox) != AxisAlignedBox.IntersectionResult.FullIntersection:
+ node._outside_buildarea = True
+ continue
+
+ convex_hull = node.callDecoration("getConvexHull")
+ if convex_hull:
+ if not convex_hull.isValid():
+ return
+ # Check for collisions between disallowed areas and the object
+ for area in self.getDisallowedAreas():
+ overlap = convex_hull.intersectsPolygon(area)
+ if overlap is None:
+ continue
+ node._outside_buildarea = True
+ continue
+
+ # Group nodes should override the _outside_buildarea property of their children.
+ for group_node in group_nodes:
+ for child_node in group_node.getAllChildren():
+ child_node._outside_buildarea = group_node._outside_buildarea
+
## Recalculates the build volume & disallowed areas.
def rebuild(self):
if not self._width or not self._height or not self._depth:
@@ -362,6 +410,8 @@ class BuildVolume(SceneNode):
Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds
+ self.updateNodeBoundaryCheck()
+
def getBoundingBox(self):
return self._volume_aabb
@@ -629,11 +679,12 @@ class BuildVolume(SceneNode):
if not self._global_container_stack.getProperty("machine_center_is_zero", "value"):
prime_x = prime_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
- prime_y = prime_x + machine_depth / 2
+ prime_y = prime_y + machine_depth / 2
prime_polygon = Polygon.approximatedCircle(PRIME_CLEARANCE)
- prime_polygon = prime_polygon.translate(prime_x, prime_y)
prime_polygon = prime_polygon.getMinkowskiHull(Polygon.approximatedCircle(border_size))
+
+ prime_polygon = prime_polygon.translate(prime_x, prime_y)
result[extruder.getId()] = [prime_polygon]
return result