diff options
author | Ghostkeeper <rubend@tutanota.com> | 2017-04-10 11:52:31 +0300 |
---|---|---|
committer | Ghostkeeper <rubend@tutanota.com> | 2017-04-10 11:52:31 +0300 |
commit | cb7c25f92fdf2304d53eefcf95b3907235fbd806 (patch) | |
tree | 3c752ee200bcb88e7e6b113f6e37cee2471adfdc /cura/BuildVolume.py | |
parent | 041481107963232cb58d658a20417d798dd58060 (diff) | |
parent | c94b05e0f45b0af7eb77492dd2aad964dab266f0 (diff) |
Merge branch 'master' into feature_support_top_bottom_speed
Diffstat (limited to 'cura/BuildVolume.py')
-rwxr-xr-x | cura/BuildVolume.py | 65 |
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 |