Skip to content

Commit

Permalink
Print speed settings set to S3D speeds
Browse files Browse the repository at this point in the history
- read print speeds from S3D header
- use travel speeds with purge tower
- slow down purge line printing
- TODO: calculate feed rate from S3D g-code and use it to
  set purge line speeds properly
  • Loading branch information
spegelius committed Jul 7, 2017
1 parent 41c2564 commit cd14319
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 38 deletions.
13 changes: 10 additions & 3 deletions gcode_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand All @@ -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
Expand Down
8 changes: 8 additions & 0 deletions slicer_simplify3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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")
Expand Down
64 changes: 29 additions & 35 deletions switch_tower.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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)):
Expand Down Expand Up @@ -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
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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"
Expand All @@ -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
Expand All @@ -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()
Expand All @@ -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)
Expand Down

0 comments on commit cd14319

Please sign in to comment.