diff --git a/gcode_file.py b/gcode_file.py index d4e01d4..e2a332d 100644 --- a/gcode_file.py +++ b/gcode_file.py @@ -42,6 +42,9 @@ def __init__(self, logger, hw_config): self.tools = [0] + self.travel_xy_speed = None + self.travel_z_speed = None + def parse_header(self): """ Parse header of gcode file, if any. @@ -167,7 +170,8 @@ def add_switch_raft(self): """ # TODO: check for retraction index = self.layers[0].start_gcode_end + 1 - for cmd, comment in self.switch_tower.get_raft_lines(self.extruders[0], False): + for cmd, comment in self.switch_tower.get_raft_lines(self.extruders[0], False, + self.travel_xy_speed, self.travel_z_speed): self.layers[0].insert_line(index, cmd, comment) index += 1 self.layers[0].start_gcode_end = index @@ -208,7 +212,9 @@ def update_retract_position(pos, new_pos): # add infill if not a tool change layer if not has_tool_changes and index == 0 and layer.num != 1 and tower_needed: # update purge tower with sparse infill - for cmd, comment in self.switch_tower.get_infill_lines(layer, e_pos, active_e, z_hop, z_speed): + for cmd, comment in self.switch_tower.get_infill_lines(layer, e_pos, active_e, z_hop, + self.travel_z_speed, + self.travel_xy_speed): layer.insert_line(index, cmd, comment) index += 1 @@ -230,7 +236,8 @@ def update_retract_position(pos, new_pos): new_e = self.extruders[gcode.last_match] layer.delete_line(index) for cmd, comment in self.switch_tower.get_tower_lines(layer, e_pos, active_e, - new_e, z_hop, z_speed): + new_e, z_hop, self.travel_z_speed, + self.travel_xy_speed): layer.insert_line(index, cmd, comment) index += 1 prime_needed = True diff --git a/slicer_simplify3d.py b/slicer_simplify3d.py index 54972f9..6d2684b 100644 --- a/slicer_simplify3d.py +++ b/slicer_simplify3d.py @@ -31,6 +31,8 @@ def __init__(self, logger, hw_config): self.retract_while_wiping = False self.version = None + self.default_speed = None + def process(self, gcode_file): super().process(gcode_file) self.fix_retract_during_wipe() @@ -87,6 +89,12 @@ def parse_header(self): self.relative_e = comment.split(b",")[-1] == b"1" elif b"retractWhileWiping" in comment: self.retract_while_wiping = comment.split(b",")[-1] == b"1" + elif b"defaultSpeed" in comment: + self.default_speed = int(comment.split(b",")[-1]) + elif b"rapidXYspeed" in comment: + self.travel_xy_speed = int(comment.split(b",")[-1]) + elif b"rapidZspeed" in comment: + self.travel_z_speed = int(comment.split(b",")[-1]) if not self.relative_e: raise ValueError("Relative E distances not enabled! Filaswitch won't work without relative E distances") diff --git a/switch_tower.py b/switch_tower.py index a6ce8b2..cd505d6 100644 --- a/switch_tower.py +++ b/switch_tower.py @@ -187,7 +187,7 @@ def init_post_switch_gcode(self): self.post_switch_lines.append((("G1 X%.3f E%.4f F900" % (-self.width, primetrail_length)).encode(), b" prime trail")) self.prepurge_sign = -1 - def get_raft_lines(self, first_extruder, retract): + def get_raft_lines(self, first_extruder, retract, xy_speed, z_speed): """ G-code lines for the raft :param first_extruder: first extruder object @@ -197,9 +197,9 @@ def get_raft_lines(self, first_extruder, retract): yield None, b" TOWER RAFT START" if first_extruder.z_hop: z_hop = 0.2 + first_extruder.z_hop - yield ("G1 Z%.3f F2000" % z_hop).encode(), b" z-hop" - yield ("G1 X%.3f Y%.3f F9000" % (self.raft_pos_x, self.raft_pos_y)).encode(), b" move to purge zone" - yield b"G1 Z0.2 F1500", b" move z close" + yield ("G1 Z%.3f F%s" % (z_hop, z_speed)).encode(), b" z-hop" + yield ("G1 X%.3f Y%.3f F%d" % (self.raft_pos_x, self.raft_pos_y, xy_speed)).encode(), b" move to purge zone" + yield ("G1 Z0.2 F%d" % z_speed).encode(), b" move z close" yield b"G91", b" relative positioning" # box @@ -208,7 +208,7 @@ def get_raft_lines(self, first_extruder, retract): yield ("G1 X%.3f E%.4f F2000" % (-self.raft_width, first_extruder.get_feed_length(self.raft_width))).encode(), b" purge wall" yield ("G1 Y%.3f E%.4f F2000" % (-(self.raft_height-0.3), first_extruder.get_feed_length(self.raft_height-0.3))).encode(), b" Y shift" - yield b"G1 X0.2 Y-0.4 F2000", None + yield ("G1 X0.2 Y-0.4 F%d" % xy_speed).encode(), None raft_feed = first_extruder.get_feed_length(self.raft_height) * 1.3 for _ in range(int(self.raft_width/2)): @@ -252,7 +252,7 @@ def _get_retraction(self, e_pos, extruder): retraction = extruder.retract return ("G1 E%.4f F%.1f" % (-retraction, extruder.retract_speed)).encode(), b" tower retract" - def get_tower_lines(self, layer, e_pos, old_e, new_e, z_hop, z_speed): + def get_tower_lines(self, layer, e_pos, old_e, new_e, z_hop, z_speed, xy_speed): """ G-code for switch tower :param layer: current layer @@ -278,9 +278,9 @@ def get_tower_lines(self, layer, e_pos, old_e, new_e, z_hop, z_speed): self.last_tower_z = self.last_tower_z + layer.height if self.flipflop_purge: - yield ("G1 X%.3f Y%.3f F9000" % (self.start_pos_x-0.6, self.start_pos_y+0.2)).encode(), b" move to purge zone" + yield ("G1 X%.3f Y%.3f F%d" % (self.start_pos_x-0.6, self.start_pos_y+0.2, xy_speed)).encode(), b" move to purge zone" else: - yield ("G1 X%.3f Y%.3f F9000" % (self.start_pos_x+0.6, self.start_pos_y)).encode(), b" move to purge zone" + yield ("G1 X%.3f Y%.3f F%d" % (self.start_pos_x+0.6, self.start_pos_y, xy_speed)).encode(), b" move to purge zone" yield ("G1 Z%.3f F%.1f" % (self.last_tower_z, z_speed)).encode(), b" move z close" yield b"G91", b" relative positioning" yield old_e.get_prime_gcode(change=-0.1) @@ -304,14 +304,14 @@ def get_tower_lines(self, layer, e_pos, old_e, new_e, z_hop, z_speed): for _ in range(purge_lines): if self.flipflop_purge: yield b"G1 Y0.6 F3000", b" Y shift" - yield ("G1 X%.3f E%.4f F3000" % (-purge_line_length, purge_x_feed)).encode(), b" purge trail" + yield ("G1 X%.3f E%.4f F2400" % (-purge_line_length, purge_x_feed)).encode(), b" purge trail" yield b"G1 Y0.9 F3000", b" Y shift" - yield ("G1 X%.3f E%.4f F3000" % (purge_line_length, purge_x_feed)).encode(), b" purge trail" + yield ("G1 X%.3f E%.4f F2400" % (purge_line_length, purge_x_feed)).encode(), b" purge trail" else: yield b"G1 Y0.9 F3000", b" Y shift" - yield ("G1 X%.3f E%.4f F3000" % (-purge_line_length, purge_x_feed)).encode(), b" purge trail" + yield ("G1 X%.3f E%.4f F2400" % (-purge_line_length, purge_x_feed)).encode(), b" purge trail" yield b"G1 Y0.6 F3000", b" Y shift" - yield ("G1 X%.3f E%.4f F3000" % (purge_line_length, purge_x_feed)).encode(), b" purge trail" + yield ("G1 X%.3f E%.4f F2400" % (purge_line_length, purge_x_feed)).encode(), b" purge trail" # wipe line. also switch direction wipe_line_length = purge_line_length - self.prepurge_sign * 0.4 @@ -320,11 +320,11 @@ def get_tower_lines(self, layer, e_pos, old_e, new_e, z_hop, z_speed): yield b"G0.5 Y1 F3000", b" Y shift" else: yield b"G1 Y1 F3000", b" Y shift" - yield ("G1 X%.3f E%.4f F3000" % (-wipe_line_length, new_e.get_feed_length(wipe_line_length))).encode(), b" purge trail" + yield ("G1 X%.3f E%.4f F900" % (-wipe_line_length, new_e.get_feed_length(wipe_line_length))).encode(), b" purge trail" yield b"G1 X-0.2 F3000", b" wipe" yield new_e.get_retract_gcode() yield b"G1 X-0.2 F3000", b" wipe" - yield b"G1 X4 F3000", b" wipe" + yield b"G1 X4 F2000", b" wipe" yield b"G90", b" absolute positioning" yield b"G92 E0", b" reset extruder position" @@ -335,7 +335,7 @@ def get_tower_lines(self, layer, e_pos, old_e, new_e, z_hop, z_speed): self.flipflop_purge = not self.flipflop_purge - def get_infill_lines(self, layer, e_pos, extruder, z_hop, z_speed): + def get_infill_lines(self, layer, e_pos, extruder, z_hop, z_speed, xy_speed): """ G-code for switch tower infill :param layer: current layer @@ -360,9 +360,9 @@ def get_infill_lines(self, layer, e_pos, extruder, z_hop, z_speed): self.last_tower_z = self.last_tower_z + layer.height if self.flipflop_infill: - yield ("G1 X%.3f Y%.3f F9000" % (self.start_pos_x, self.start_pos_y)).encode(), b" move to purge zone" + yield ("G1 X%.3f Y%.3f F%d" % (self.start_pos_x, self.start_pos_y, xy_speed)).encode(), b" move to purge zone" else: - yield ("G1 X%.3f Y%.3f F9000" % (self.start_pos_x, self.start_pos_y+self.height)).encode(), b" move to purge zone" + yield ("G1 X%.3f Y%.3f F%d" % (self.start_pos_x, self.start_pos_y+self.height, xy_speed)).encode(), b" move to purge zone" yield ("G1 Z%.3f F%.1f" % (self.last_tower_z, z_speed)).encode(), b" move z close" yield b"G91", b" relative positioning" yield extruder.get_prime_gcode() @@ -374,36 +374,30 @@ def get_infill_lines(self, layer, e_pos, extruder, z_hop, z_speed): infill_length = extruder.get_feed_length(infill_path_length) if self.flipflop_infill: - yield ("G1 X%.3f E%.4f F3000" % (self.width, extruder.get_feed_length(self.width))).encode(), b" purge wall" - yield ("G1 Y%.3f E%.4f F3000" % (self.height, extruder.get_feed_length(self.height))).encode(), b" Y shift" - yield ("G1 X%.3f E%.4f F3000" % (-self.width, extruder.get_feed_length(self.width))).encode(), b" purge wall" - yield ("G1 Y%.3f E%.4f F3000" % (-infill_y, extruder.get_feed_length(infill_y))).encode(), b" Y shift" + yield ("G1 X%.3f E%.4f F2400" % (self.width, extruder.get_feed_length(self.width))).encode(), b" purge wall" + yield ("G1 Y%.3f E%.4f F2400" % (self.height, extruder.get_feed_length(self.height))).encode(), b" Y shift" + yield ("G1 X%.3f E%.4f F2400" % (-self.width, extruder.get_feed_length(self.width))).encode(), b" purge wall" + yield ("G1 Y%.3f E%.4f F2400" % (-infill_y, extruder.get_feed_length(infill_y))).encode(), b" Y shift" flip = True else: - yield ("G1 X%.3f E%.4f F3000" % (self.width, extruder.get_feed_length(self.width))).encode(), b" purge wall" - yield ("G1 Y%.3f E%.4f F3000" % (-self.height, extruder.get_feed_length(self.height))).encode(), b" Y shift" - yield ("G1 X%.3f E%.4f F3000" % (-self.width, extruder.get_feed_length(self.width))).encode(), b" purge wall" - yield ("G1 Y%.3f E%.4f F3000" % (infill_y, extruder.get_feed_length(infill_y))).encode(), b" Y shift" + yield ("G1 X%.3f E%.4f F2400" % (self.width, extruder.get_feed_length(self.width))).encode(), b" purge wall" + yield ("G1 Y%.3f E%.4f F2400" % (-self.height, extruder.get_feed_length(self.height))).encode(), b" Y shift" + yield ("G1 X%.3f E%.4f F2400" % (-self.width, extruder.get_feed_length(self.width))).encode(), b" purge wall" + yield ("G1 Y%.3f E%.4f F2400" % (infill_y, extruder.get_feed_length(infill_y))).encode(), b" Y shift" flip = False for _ in range(5): if flip: - yield ("G1 X%.3f Y%s E%.4f F3000" % (infill_x, infill_y, infill_length)).encode(), b" infill" + yield ("G1 X%.3f Y%s E%.4f F2400" % (infill_x, infill_y, infill_length)).encode(), b" infill" else: - yield ("G1 X%.3f Y%s E%.4f F3000" % (infill_x, -infill_y, infill_length)).encode(), b" infill" + yield ("G1 X%.3f Y%s E%.4f F2400" % (infill_x, -infill_y, infill_length)).encode(), b" infill" flip = not flip - if self.flipflop_infill: - yield b"G1 Y0.2 F3000", b" wipe" - else: - yield b"G1 Y-0.2 F3000", b" wipe" - yield extruder.get_retract_gcode() - if self.flipflop_infill: - yield b"G1 Y1 F3000", b" wipe" + yield b"G1 Y-4 F3000", b" wipe" else: - yield b"G1 Y-1 F3000", b" wipe" + yield b"G1 Y4 F3000", b" wipe" yield b"G90", b" absolute positioning" hop = self._get_z_hop(layer, z_hop, z_speed, extruder)