From 475214810b88b40e4d05a90780bffa7ea5ee520a Mon Sep 17 00:00:00 2001 From: ThePaPsT Date: Mon, 20 Jan 2025 19:36:13 +0100 Subject: [PATCH 1/5] Update dualgantry_corexy.py to make it compatible again with klipper A change in klipper requires the function clear_home_state to be provided by the kinematics. This function was added. --- klippy/kinematics/dualgantry_corexy.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/klippy/kinematics/dualgantry_corexy.py b/klippy/kinematics/dualgantry_corexy.py index ea753923d2a2..5eaad7b34e35 100644 --- a/klippy/kinematics/dualgantry_corexy.py +++ b/klippy/kinematics/dualgantry_corexy.py @@ -61,6 +61,10 @@ def set_position(self, newpos, homing_axes): rail.set_position(newpos) if i in homing_axes: self.limits[i] = rail.get_range() + def clear_homing_state(self, axes): + for i, _ in enumerate(self.limits): + if i in axes: + self.limits[i] = (1.0, -1.0) def note_z_not_homed(self): # Helper for Safe Z Home self.limits[2] = (1.0, -1.0) From f565255575d00599633ef457fd597a1bb1861739 Mon Sep 17 00:00:00 2001 From: ThePaPsT Date: Wed, 29 Jan 2025 12:12:30 +0100 Subject: [PATCH 2/5] New fix for changes in klipper --- klippy/kinematics/dualgantry_corexy.py | 34 +++++++++++++++++--------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/klippy/kinematics/dualgantry_corexy.py b/klippy/kinematics/dualgantry_corexy.py index 5eaad7b34e35..546372f25978 100644 --- a/klippy/kinematics/dualgantry_corexy.py +++ b/klippy/kinematics/dualgantry_corexy.py @@ -9,6 +9,7 @@ class DualGantryCoreXYKinematics: def __init__(self, toolhead, config): + self.printer = config.get_printer() # Setup axis rails self.rails = [stepper.LookupMultiRail(config.getsection('stepper_' + n)) @@ -29,8 +30,6 @@ def __init__(self, toolhead, config): for s in self.get_steppers(): s.set_trapq(toolhead.get_trapq()) toolhead.register_step_generator(s.generate_steps) - config.get_printer().register_event_handler("stepper_enable:motor_off", - self._motor_off) self.rails[3].set_trapq(None) self.rails[4].set_trapq(None) self.dualgantry_rails = ( (self.rails[0], self.rails[1]), @@ -45,6 +44,7 @@ def __init__(self, toolhead, config): self.max_z_accel = config.getfloat( 'max_z_accel', max_accel, above=0., maxval=max_accel) self.limits = [(1.0, -1.0)] * 3 + self.saved_limits = [self.limits] *2 self.active_carriage = 0 self.last_inactive_position = None self.printer.lookup_object('gcode').register_command( @@ -59,12 +59,19 @@ def calc_position(self, stepper_positions): def set_position(self, newpos, homing_axes): for i, rail in enumerate(self.rails): rail.set_position(newpos) - if i in homing_axes: - self.limits[i] = rail.get_range() - def clear_homing_state(self, axes): - for i, _ in enumerate(self.limits): - if i in axes: - self.limits[i] = (1.0, -1.0) + logging.info("rail %s: limit: %s", rail.get_name(), rail.get_range()) + if "xyzuv"[i] in homing_axes: + self.limits[i] = rail.get_range() + logging.info("updated limits for T%d for axis %s with %s",self.active_carriage, "xyz"[i ], self.limits[i]) + def clear_homing_state(self, clear_axes): + for axis, axis_name in enumerate("xyz"): + if axis_name in clear_axes: + logging.debug("Resetting T%s : axis %s",self.active_carriage, axis_name) + self.limits[axis] = (1.0, -1.0) + if axis in [0,1]: + self.saved_limits[0][axis] = (1.0, -1.0) + self.saved_limits[1][axis] = (1.0, -1.0) + def note_z_not_homed(self): # Helper for Safe Z Home self.limits[2] = (1.0, -1.0) @@ -91,8 +98,6 @@ def home(self, homing_state): self._activate_gantry(altc) else: self._home_axis(homing_state, axis, self.rails[axis]) - def _motor_off(self, print_time): - self.limits = [(1.0, -1.0)] * 3 def _check_endstops(self, move): end_pos = move.end_pos for i in range(3): @@ -134,11 +139,15 @@ def _activate_gantry(self, carriage): xy_position_to_restore = toolhead.get_position()[:2] else: xy_position_to_restore = self.last_inactive_position - for i, r in enumerate( self.dualgantry_rails[( carriage + 1) % 2]): + for i, r in enumerate( self.dualgantry_rails[( carriage + 1) % 2]): # just setting the other ( != carriage ) rails off r.set_trapq(None) self.rails[i + 3] = r # Save position value for a future toolchange self.last_inactive_position = toolhead.get_position()[:2] + + # store x / y limits + self.saved_limits[self.active_carriage][0] = self.limits[0] + self.saved_limits[self.active_carriage][1] = self.limits[1] # Activate carriage rails rails = self.dualgantry_rails[carriage] ranges = [r.get_range() for r in rails] @@ -150,6 +159,9 @@ def _activate_gantry(self, carriage): r.set_trapq(toolhead.get_trapq()) self.rails[i] = r pos = toolhead.get_position() + # restore old limits + self.limits[0] = self.saved_limits[carriage][0] + self.limits[1] = self.saved_limits[carriage][1] for i, r in enumerate(rails): if self.limits[i][0] <= self.limits[i][1]: self.limits[i] = ranges[i] From f93d89e79967b07f06e7bb4e27a35bd71c09312c Mon Sep 17 00:00:00 2001 From: ThePaPsT Date: Wed, 29 Jan 2025 12:14:47 +0100 Subject: [PATCH 3/5] Cleaned up file --- klippy/kinematics/dualgantry_corexy.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/klippy/kinematics/dualgantry_corexy.py b/klippy/kinematics/dualgantry_corexy.py index 546372f25978..c51a45c4b2e2 100644 --- a/klippy/kinematics/dualgantry_corexy.py +++ b/klippy/kinematics/dualgantry_corexy.py @@ -9,7 +9,6 @@ class DualGantryCoreXYKinematics: def __init__(self, toolhead, config): - self.printer = config.get_printer() # Setup axis rails self.rails = [stepper.LookupMultiRail(config.getsection('stepper_' + n)) @@ -44,7 +43,6 @@ def __init__(self, toolhead, config): self.max_z_accel = config.getfloat( 'max_z_accel', max_accel, above=0., maxval=max_accel) self.limits = [(1.0, -1.0)] * 3 - self.saved_limits = [self.limits] *2 self.active_carriage = 0 self.last_inactive_position = None self.printer.lookup_object('gcode').register_command( @@ -62,16 +60,10 @@ def set_position(self, newpos, homing_axes): logging.info("rail %s: limit: %s", rail.get_name(), rail.get_range()) if "xyzuv"[i] in homing_axes: self.limits[i] = rail.get_range() - logging.info("updated limits for T%d for axis %s with %s",self.active_carriage, "xyz"[i ], self.limits[i]) def clear_homing_state(self, clear_axes): for axis, axis_name in enumerate("xyz"): if axis_name in clear_axes: - logging.debug("Resetting T%s : axis %s",self.active_carriage, axis_name) self.limits[axis] = (1.0, -1.0) - if axis in [0,1]: - self.saved_limits[0][axis] = (1.0, -1.0) - self.saved_limits[1][axis] = (1.0, -1.0) - def note_z_not_homed(self): # Helper for Safe Z Home self.limits[2] = (1.0, -1.0) @@ -144,10 +136,6 @@ def _activate_gantry(self, carriage): self.rails[i + 3] = r # Save position value for a future toolchange self.last_inactive_position = toolhead.get_position()[:2] - - # store x / y limits - self.saved_limits[self.active_carriage][0] = self.limits[0] - self.saved_limits[self.active_carriage][1] = self.limits[1] # Activate carriage rails rails = self.dualgantry_rails[carriage] ranges = [r.get_range() for r in rails] @@ -159,9 +147,6 @@ def _activate_gantry(self, carriage): r.set_trapq(toolhead.get_trapq()) self.rails[i] = r pos = toolhead.get_position() - # restore old limits - self.limits[0] = self.saved_limits[carriage][0] - self.limits[1] = self.saved_limits[carriage][1] for i, r in enumerate(rails): if self.limits[i][0] <= self.limits[i][1]: self.limits[i] = ranges[i] From c1c945f58c0d43c73b7634e71ab621c0fcf8abe8 Mon Sep 17 00:00:00 2001 From: ThePaPsT Date: Wed, 29 Jan 2025 12:19:43 +0100 Subject: [PATCH 4/5] Cleaned up file even more, removed remaining logging --- klippy/kinematics/dualgantry_corexy.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/klippy/kinematics/dualgantry_corexy.py b/klippy/kinematics/dualgantry_corexy.py index c51a45c4b2e2..616ac8ef936b 100644 --- a/klippy/kinematics/dualgantry_corexy.py +++ b/klippy/kinematics/dualgantry_corexy.py @@ -57,8 +57,7 @@ def calc_position(self, stepper_positions): def set_position(self, newpos, homing_axes): for i, rail in enumerate(self.rails): rail.set_position(newpos) - logging.info("rail %s: limit: %s", rail.get_name(), rail.get_range()) - if "xyzuv"[i] in homing_axes: + if "xyzuv"[i] in homing_axes: # uv are unused, but loop goes from 0 to 4 self.limits[i] = rail.get_range() def clear_homing_state(self, clear_axes): for axis, axis_name in enumerate("xyz"): @@ -131,7 +130,7 @@ def _activate_gantry(self, carriage): xy_position_to_restore = toolhead.get_position()[:2] else: xy_position_to_restore = self.last_inactive_position - for i, r in enumerate( self.dualgantry_rails[( carriage + 1) % 2]): # just setting the other ( != carriage ) rails off + for i, r in enumerate( self.dualgantry_rails[( carriage + 1) % 2]): r.set_trapq(None) self.rails[i + 3] = r # Save position value for a future toolchange From 49cc296e69b6e3af0dd5ea639a076d550d80e9fd Mon Sep 17 00:00:00 2001 From: ThePaPsT Date: Mon, 17 Nov 2025 11:40:40 +0100 Subject: [PATCH 5/5] Changed init style according to new klipper code --- klippy/kinematics/dualgantry_corexy.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/klippy/kinematics/dualgantry_corexy.py b/klippy/kinematics/dualgantry_corexy.py index 616ac8ef936b..99c1b0be9632 100644 --- a/klippy/kinematics/dualgantry_corexy.py +++ b/klippy/kinematics/dualgantry_corexy.py @@ -1,5 +1,6 @@ -# Code for handling the kinematics of corexy robots +# Code for handling the kinematics of dualgantry corexy robots # +# Copyright (C) 2025 Thepapst # Copyright (C) 2022 Zruncho3D # Copyright (C) 2022 Fabrice Gallet # @@ -28,14 +29,13 @@ def __init__(self, toolhead, config): self.rails[4].setup_itersolve('corexy_stepper_alloc', b'-') for s in self.get_steppers(): s.set_trapq(toolhead.get_trapq()) - toolhead.register_step_generator(s.generate_steps) self.rails[3].set_trapq(None) self.rails[4].set_trapq(None) self.dualgantry_rails = ( (self.rails[0], self.rails[1]), (self.rails[3], self.rails[4]) ) ranges = [r.get_range() for r in self.rails] - self.axes_min = toolhead.Coord(*[r[0] for r in ranges[:3]], e=0.) - self.axes_max = toolhead.Coord(*[r[1] for r in ranges[:3]], e=0.) + self.axes_min = toolhead.Coord([r[0] for r in ranges[:3]]) + self.axes_max = toolhead.Coord([r[1] for r in ranges[:3]]) # Setup boundary checks max_velocity, max_accel = toolhead.get_max_velocity() self.max_z_velocity = config.getfloat( @@ -138,10 +138,10 @@ def _activate_gantry(self, carriage): # Activate carriage rails rails = self.dualgantry_rails[carriage] ranges = [r.get_range() for r in rails] - self.axes_min = toolhead.Coord(ranges[0][0], ranges[1][0], - self.axes_min[2], self.axes_min[3]) - self.axes_max = toolhead.Coord(ranges[0][1], ranges[1][1], - self.axes_max[2], self.axes_max[3]) + self.axes_min = toolhead.Coord((ranges[0][0], ranges[1][0], + self.axes_min[2], self.axes_min[3])) + self.axes_max = toolhead.Coord((ranges[0][1], ranges[1][1], + self.axes_max[2], self.axes_max[3])) for i, r in enumerate(rails): r.set_trapq(toolhead.get_trapq()) self.rails[i] = r