From 4018c24b4c0c8402291ebc40d512b0d25a6bcb2f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 7 Jun 2019 17:14:51 +0200 Subject: [PATCH] Split out all the individual steps for getting the edgeDisallowedSize This makes it so much easier to write tests for it --- cura/BuildVolume.py | 133 ++++++++++++++++++++++----------------- tests/TestBuildVolume.py | 41 +++++++++++- 2 files changed, 112 insertions(+), 62 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 2300cb591c..a730694537 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1056,6 +1056,76 @@ class BuildVolume(SceneNode): all_values[i] = 0 return all_values + def _calculateBedAdhesionSize(self, used_extruders): + if self._global_container_stack is None: + return + + container_stack = self._global_container_stack + adhesion_type = container_stack.getProperty("adhesion_type", "value") + skirt_brim_line_width = self._global_container_stack.getProperty("skirt_brim_line_width", "value") + initial_layer_line_width_factor = self._global_container_stack.getProperty("initial_layer_line_width_factor", "value") + # Use brim width if brim is enabled OR the prime tower has a brim. + if adhesion_type == "brim" or (self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and adhesion_type != "raft"): + brim_line_count = self._global_container_stack.getProperty("brim_line_count", "value") + bed_adhesion_size = skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 + + for extruder_stack in used_extruders: + bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 + + # We don't create an additional line for the extruder we're printing the brim with. + bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 + elif adhesion_type == "skirt": # No brim? Also not on prime tower? Then use whatever the adhesion type is saying: Skirt, raft or none. + skirt_distance = self._global_container_stack.getProperty("skirt_gap", "value") + skirt_line_count = self._global_container_stack.getProperty("skirt_line_count", "value") + + bed_adhesion_size = skirt_distance + ( + skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0 + + for extruder_stack in used_extruders: + bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 + + # We don't create an additional line for the extruder we're printing the skirt with. + bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 + elif adhesion_type == "raft": + bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") + elif adhesion_type == "none": + bed_adhesion_size = 0 + else: + raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") + + max_length_available = 0.5 * min( + self._global_container_stack.getProperty("machine_width", "value"), + self._global_container_stack.getProperty("machine_depth", "value") + ) + bed_adhesion_size = min(bed_adhesion_size, max_length_available) + return bed_adhesion_size + + def _calculateFarthestShieldDistance(self, container_stack): + farthest_shield_distance = 0 + if container_stack.getProperty("draft_shield_enabled", "value"): + farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("draft_shield_dist", "value")) + if container_stack.getProperty("ooze_shield_enabled", "value"): + farthest_shield_distance = max(farthest_shield_distance,container_stack.getProperty("ooze_shield_dist", "value")) + return farthest_shield_distance + + def _calculateSupportExpansion(self, container_stack): + support_expansion = 0 + support_enabled = self._global_container_stack.getProperty("support_enable", "value") + support_offset = self._global_container_stack.getProperty("support_offset", "value") + if support_enabled and support_offset: + support_expansion += support_offset + return support_expansion + + def _calculateMoveFromWallRadius(self, used_extruders): + move_from_wall_radius = 0 # Moves that start from outer wall. + move_from_wall_radius = max(move_from_wall_radius, max(self._getSettingFromAllExtruders("infill_wipe_dist"))) + avoid_enabled_per_extruder = [stack.getProperty("travel_avoid_other_parts", "value") for stack in used_extruders] + travel_avoid_distance_per_extruder = [stack.getProperty("travel_avoid_distance", "value") for stack in used_extruders] + for avoid_other_parts_enabled, avoid_distance in zip(avoid_enabled_per_extruder, travel_avoid_distance_per_extruder): # For each extruder (or just global). + if avoid_other_parts_enabled: + move_from_wall_radius = max(move_from_wall_radius, avoid_distance) + return move_from_wall_radius + ## Calculate the disallowed radius around the edge. # # This disallowed radius is to allow for space around the models that is @@ -1072,65 +1142,10 @@ class BuildVolume(SceneNode): if container_stack.getProperty("print_sequence", "value") == "one_at_a_time": return 0.1 # Return a very small value, so we do draw disallowed area's near the edges. - adhesion_type = container_stack.getProperty("adhesion_type", "value") - skirt_brim_line_width = self._global_container_stack.getProperty("skirt_brim_line_width", "value") - initial_layer_line_width_factor = self._global_container_stack.getProperty("initial_layer_line_width_factor", "value") - #Use brim width if brim is enabled OR the prime tower has a brim. - if adhesion_type == "brim" or (self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and - adhesion_type != "raft"): - brim_line_count = self._global_container_stack.getProperty("brim_line_count", "value") - bed_adhesion_size = skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 - - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - - # We don't create an additional line for the extruder we're printing the brim with. - bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 - elif adhesion_type == "skirt": #No brim? Also not on prime tower? Then use whatever the adhesion type is saying: Skirt, raft or none. - skirt_distance = self._global_container_stack.getProperty("skirt_gap", "value") - skirt_line_count = self._global_container_stack.getProperty("skirt_line_count", "value") - - bed_adhesion_size = skirt_distance + (skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0 - - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - - # We don't create an additional line for the extruder we're printing the skirt with. - bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 - elif adhesion_type == "raft": - bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") - - elif adhesion_type == "none": - bed_adhesion_size = 0 - - else: - raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") - - max_length_available = 0.5 * min( - self._global_container_stack.getProperty("machine_width", "value"), - self._global_container_stack.getProperty("machine_depth", "value") - ) - bed_adhesion_size = min(bed_adhesion_size, max_length_available) - - support_expansion = 0 - support_enabled = self._global_container_stack.getProperty("support_enable", "value") - support_offset = self._global_container_stack.getProperty("support_offset", "value") - if support_enabled and support_offset: - support_expansion += support_offset - - farthest_shield_distance = 0 - if container_stack.getProperty("draft_shield_enabled", "value"): - farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("draft_shield_dist", "value")) - if container_stack.getProperty("ooze_shield_enabled", "value"): - farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("ooze_shield_dist", "value")) - - move_from_wall_radius = 0 # Moves that start from outer wall. - move_from_wall_radius = max(move_from_wall_radius, max(self._getSettingFromAllExtruders("infill_wipe_dist"))) - avoid_enabled_per_extruder = [stack.getProperty("travel_avoid_other_parts","value") for stack in used_extruders] - travel_avoid_distance_per_extruder = [stack.getProperty("travel_avoid_distance", "value") for stack in used_extruders] - for avoid_other_parts_enabled, avoid_distance in zip(avoid_enabled_per_extruder, travel_avoid_distance_per_extruder): #For each extruder (or just global). - if avoid_other_parts_enabled: - move_from_wall_radius = max(move_from_wall_radius, avoid_distance) + bed_adhesion_size = self._calculateBedAdhesionSize(used_extruders) + support_expansion = self._calculateSupportExpansion(self._global_container_stack) + farthest_shield_distance = self._calculateFarthestShieldDistance(self._global_container_stack) + move_from_wall_radius = self._calculateMoveFromWallRadius(used_extruders) # Now combine our different pieces of data to get the final border size. # Support expansion is added to the bed adhesion, since the bed adhesion goes around support. diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index 9f067f2c3b..da130e3798 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -201,8 +201,6 @@ class TestRebuild: build_volume.rebuild() assert build_volume.getMeshData() is None - - class TestUpdateMachineSizeProperties: setting_property_dict = {"machine_width": {"value": 50}, "machine_depth": {"value": 100}, @@ -229,4 +227,41 @@ class TestUpdateMachineSizeProperties: assert build_volume._width == 50 assert build_volume._height == 200 assert build_volume._depth == 100 - assert build_volume._shape == "DERP!" \ No newline at end of file + assert build_volume._shape == "DERP!" + + +class TestGetEdgeDisallowedSize: + setting_property_dict = {} + bed_adhesion_size = 1 + + @pytest.fixture() + def build_volume(self, build_volume): + build_volume._calculateBedAdhesionSize = MagicMock(return_value = 1) + return build_volume + + def getPropertySideEffect(*args, **kwargs): + properties = TestGetEdgeDisallowedSize.setting_property_dict.get(args[1]) + if properties: + return properties.get(args[2]) + + def createMockedStack(self): + mocked_global_stack = MagicMock(name="mocked_global_stack") + mocked_global_stack.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + return mocked_global_stack + + def test_noGlobalContainer(self, build_volume: BuildVolume): + assert build_volume.getEdgeDisallowedSize() == 0 + + def test_unknownAdhesion(self, build_volume: BuildVolume): + build_volume._global_container_stack = self.createMockedStack() + with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance"): + with pytest.raises(Exception): + # Since we don't have any adhesion set, this should break. + build_volume.getEdgeDisallowedSize() + + def test_oneAtATime(self, build_volume: BuildVolume): + build_volume._global_container_stack = self.createMockedStack() + with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance"): + with patch.dict(self.setting_property_dict, {"print_sequence": {"value": "one_at_a_time"}}): + assert build_volume.getEdgeDisallowedSize() == 0.1 +