diff --git a/examples/box_sliders.py b/examples/box_sliders.py index 6ebebc6..1a7ce20 100644 --- a/examples/box_sliders.py +++ b/examples/box_sliders.py @@ -27,9 +27,9 @@ def box_pose(t, values): env.add_shape(box, callback=box_pose) -env.add_ui(Slider(lambda v: None, min=-0.5, max=0.5, step=0.01, value=0.0, desc="Box X", unit="m"), name="x") -env.add_ui(Slider(lambda v: None, min=-0.5, max=0.5, step=0.01, value=0.0, desc="Box Y", unit="m"), name="y") -env.add_ui(Slider(lambda v: None, min=0.0, max=0.6, step=0.01, value=0.0, desc="Box Z", unit="m"), name="z") +env.add_ui(Slider(min=-0.5, max=0.5, step=0.01, value=0.0, desc="Box X", unit="m"), name="x") +env.add_ui(Slider(min=-0.5, max=0.5, step=0.01, value=0.0, desc="Box Y", unit="m"), name="y") +env.add_ui(Slider(min=0.0, max=0.6, step=0.01, value=0.0, desc="Box Z", unit="m"), name="z") while True: env.step(0.05) diff --git a/examples/panda_ik_sliders.py b/examples/panda_ik_sliders.py index 3444d33..209afe5 100644 --- a/examples/panda_ik_sliders.py +++ b/examples/panda_ik_sliders.py @@ -53,9 +53,9 @@ def track_target(t, values): handle.callback = track_target -env.add_ui(Slider(lambda v: None, min=0.2, max=0.7, step=0.01, value=X0, desc="Target X", unit="m"), name="x") -env.add_ui(Slider(lambda v: None, min=-0.4, max=0.4, step=0.01, value=Y0, desc="Target Y", unit="m"), name="y") -env.add_ui(Slider(lambda v: None, min=0.05, max=0.6, step=0.01, value=Z0, desc="Target Z", unit="m"), name="z") +env.add_ui(Slider(min=0.2, max=0.7, step=0.01, value=X0, desc="Target X", unit="m"), name="x") +env.add_ui(Slider(min=-0.4, max=0.4, step=0.01, value=Y0, desc="Target Y", unit="m"), name="y") +env.add_ui(Slider(min=0.05, max=0.6, step=0.01, value=Z0, desc="Target Z", unit="m"), name="z") while True: env.step(dt) diff --git a/examples/two_link_arm.py b/examples/two_link_arm.py index b43e8a4..381357e 100644 --- a/examples/two_link_arm.py +++ b/examples/two_link_arm.py @@ -47,8 +47,8 @@ def part_poses(self, q) -> list[SE3]: callback=lambda t, values: [values["q1"], values["q2"]], ) -env.add_ui(Slider(lambda v: None, min=-np.pi, max=np.pi, step=0.01, value=0.0, desc="Joint 1", unit="rad"), name="q1") -env.add_ui(Slider(lambda v: None, min=-np.pi, max=np.pi, step=0.01, value=0.0, desc="Joint 2", unit="rad"), name="q2") +env.add_ui(Slider(min=-np.pi, max=np.pi, step=0.01, value=0.0, desc="Joint 1", unit="rad"), name="q1") +env.add_ui(Slider(min=-np.pi, max=np.pi, step=0.01, value=0.0, desc="Joint 2", unit="rad"), name="q2") while True: env.step(0.05) diff --git a/src/swift/SwiftElement.py b/src/swift/SwiftElement.py index 236d440..4617e0a 100644 --- a/src/swift/SwiftElement.py +++ b/src/swift/SwiftElement.py @@ -68,7 +68,10 @@ class Slider(SwiftElement): :param cb: A callback function which is executed when the value of the slider changes. The callback should accept one argument which - represents the new value of the slider + represents the new value of the slider. Optional -- if not given, + the slider has no per-element callback, which is the common case + for a named slider read via ``env.values`` in a shape/assembly + callback instead. :type cb: function :param min: the minimum value of the slider, optional :type min: float @@ -92,11 +95,11 @@ class Slider(SwiftElement): """ - def __init__(self, cb, min=0, max=100, step=1, value=0, desc='', unit='', precision=3): + def __init__(self, cb=None, min=0, max=100, step=1, value=0, desc='', unit='', precision=3): super(Slider, self).__init__() self._element = 'slider' - self.cb = cb + self.cb = cb if cb is not None else lambda x: None self.min = min self.max = max self.step = step diff --git a/tests/test_swift_element.py b/tests/test_swift_element.py index 8f942e8..77aec25 100644 --- a/tests/test_swift_element.py +++ b/tests/test_swift_element.py @@ -40,6 +40,12 @@ def test_slider_precision_defaults_to_3_and_is_settable(): assert s2.to_dict()["precision"] == 1 +def test_slider_cb_is_optional(): + s = Slider(min=0, max=10, value=3, desc="d") + assert s.to_dict()["value"] == 3.0 + s.cb(3) # default no-op cb must be callable, not None + + def test_button_to_dict(): b = Button(lambda v: None, desc="Click Me") b._id = 0