diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index aa7c15e28b..36e6c2631f 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1254,7 +1254,11 @@ class MachineManager(QObject): return Logger.log("i", "Attempting to switch the printer type to [%s]", machine_name) # Get the definition id corresponding to this machine name - machine_definition_id = CuraContainerRegistry.getInstance().findDefinitionContainers(name = machine_name)[0].getId() + definitions = CuraContainerRegistry.getInstance().findDefinitionContainers(name=machine_name) + if not definitions: + Logger.log("e", "Unable to switch printer type since it could not be found!") + return + machine_definition_id = definitions[0].getId() # Try to find a machine with the same network key metadata_filter = {"group_id": self._global_container_stack.getMetaDataEntry("group_id")} new_machine = self.getMachine(machine_definition_id, metadata_filter = metadata_filter) diff --git a/plugins/PostProcessingPlugin/scripts/RetractContinue.py b/plugins/PostProcessingPlugin/scripts/RetractContinue.py index b0af9cd95e..076d55df3b 100644 --- a/plugins/PostProcessingPlugin/scripts/RetractContinue.py +++ b/plugins/PostProcessingPlugin/scripts/RetractContinue.py @@ -38,36 +38,38 @@ class RetractContinue(Script): current_x = self.getValue(line, "X", current_x) current_y = self.getValue(line, "Y", current_y) if self.getValue(line, "G") == 1: - if self.getValue(line, "E"): - new_e = self.getValue(line, "E") - if new_e >= current_e: # Not a retraction. - continue - # A retracted travel move may consist of multiple commands, due to combing. - # This continues retracting over all of these moves and only unretracts at the end. - delta_line = 1 - dx = current_x # Track the difference in X for this move only to compute the length of the travel. - dy = current_y - while line_number + delta_line < len(lines) and self.getValue(lines[line_number + delta_line], "G") != 1: - travel_move = lines[line_number + delta_line] - if self.getValue(travel_move, "G") != 0: - delta_line += 1 - continue - travel_x = self.getValue(travel_move, "X", dx) - travel_y = self.getValue(travel_move, "Y", dy) - f = self.getValue(travel_move, "F", "no f") - length = math.sqrt((travel_x - dx) * (travel_x - dx) + (travel_y - dy) * (travel_y - dy)) # Length of the travel move. - new_e -= length * extra_retraction_speed # New retraction is by ratio of this travel move. - if f == "no f": - new_travel_move = "G1 X{travel_x} Y{travel_y} E{new_e}".format(travel_x = travel_x, travel_y = travel_y, new_e = new_e) - else: - new_travel_move = "G1 F{f} X{travel_x} Y{travel_y} E{new_e}".format(f = f, travel_x = travel_x, travel_y = travel_y, new_e = new_e) - lines[line_number + delta_line] = new_travel_move - - delta_line += 1 - dx = travel_x - dy = travel_y - + if not self.getValue(line, "E"): # Either None or 0: Not a retraction then. + continue + new_e = self.getValue(line, "E") + if new_e - current_e >= -0.0001: # Not a retraction. Account for floating point rounding errors. current_e = new_e + continue + # A retracted travel move may consist of multiple commands, due to combing. + # This continues retracting over all of these moves and only unretracts at the end. + delta_line = 1 + dx = current_x # Track the difference in X for this move only to compute the length of the travel. + dy = current_y + while line_number + delta_line < len(lines) and self.getValue(lines[line_number + delta_line], "G") != 1: + travel_move = lines[line_number + delta_line] + if self.getValue(travel_move, "G") != 0: + delta_line += 1 + continue + travel_x = self.getValue(travel_move, "X", dx) + travel_y = self.getValue(travel_move, "Y", dy) + f = self.getValue(travel_move, "F", "no f") + length = math.sqrt((travel_x - dx) * (travel_x - dx) + (travel_y - dy) * (travel_y - dy)) # Length of the travel move. + new_e -= length * extra_retraction_speed # New retraction is by ratio of this travel move. + if f == "no f": + new_travel_move = "G1 X{travel_x} Y{travel_y} E{new_e}".format(travel_x = travel_x, travel_y = travel_y, new_e = new_e) + else: + new_travel_move = "G1 F{f} X{travel_x} Y{travel_y} E{new_e}".format(f = f, travel_x = travel_x, travel_y = travel_y, new_e = new_e) + lines[line_number + delta_line] = new_travel_move + + delta_line += 1 + dx = travel_x + dy = travel_y + + current_e = new_e new_layer = "\n".join(lines) data[layer_number] = new_layer