bec-widgets 1.16.4__py3-none-any.whl → 1.17.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- CHANGELOG.md +41 -0
- PKG-INFO +1 -1
- bec_widgets/cli/client.py +46 -0
- bec_widgets/cli/server.py +3 -7
- bec_widgets/qt_utils/error_popups.py +3 -8
- bec_widgets/widgets/containers/dock/dock_area.py +1 -1
- bec_widgets/widgets/control/device_control/positioner_box/__init__.py +11 -0
- bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py +3 -0
- bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py +243 -0
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box/__init__.py +0 -0
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py +242 -0
- bec_widgets/widgets/control/device_control/positioner_box/{positioner_box_plugin.py → positioner_box/positioner_box_plugin.py} +1 -1
- bec_widgets/widgets/control/device_control/positioner_box/{register_positioner_box.py → positioner_box/register_positioner_box.py} +1 -1
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/__init__.py +0 -0
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d.pyproject +1 -0
- bec_widgets/widgets/control/{device_input/signal_combobox/signal_combo_box_plugin.py → device_control/positioner_box/positioner_box_2d/positioner_box2_d_plugin.py} +11 -9
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py +482 -0
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui +562 -0
- bec_widgets/widgets/control/{device_input/signal_combobox/register_signal_combo_box.py → device_control/positioner_box/positioner_box_2d/register_positioner_box2_d.py} +3 -3
- bec_widgets/widgets/control/device_control/positioner_box/{positioner_control_line.py → positioner_control_line/positioner_control_line.py} +5 -2
- bec_widgets/widgets/control/device_control/positioner_box/{positioner_control_line_plugin.py → positioner_control_line/positioner_control_line_plugin.py} +1 -3
- bec_widgets/widgets/control/device_control/positioner_box/{register_positioner_control_line.py → positioner_control_line/register_positioner_control_line.py} +1 -1
- bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py +7 -6
- {bec_widgets-1.16.4.dist-info → bec_widgets-1.17.0.dist-info}/METADATA +1 -1
- {bec_widgets-1.16.4.dist-info → bec_widgets-1.17.0.dist-info}/RECORD +33 -27
- pyproject.toml +1 -1
- bec_widgets/widgets/control/device_control/positioner_box/positioner_box.py +0 -352
- bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject +0 -1
- /bec_widgets/widgets/control/device_control/positioner_box/{positioner_box.pyproject → positioner_box/positioner_box.pyproject} +0 -0
- /bec_widgets/widgets/control/device_control/positioner_box/{positioner_box.ui → positioner_box/positioner_box.ui} +0 -0
- /bec_widgets/widgets/control/device_control/positioner_box/{positioner_control_line.pyproject → positioner_control_line/positioner_control_line.pyproject} +0 -0
- /bec_widgets/widgets/control/device_control/positioner_box/{positioner_control_line.ui → positioner_control_line/positioner_control_line.ui} +0 -0
- {bec_widgets-1.16.4.dist-info → bec_widgets-1.17.0.dist-info}/WHEEL +0 -0
- {bec_widgets-1.16.4.dist-info → bec_widgets-1.17.0.dist-info}/entry_points.txt +0 -0
- {bec_widgets-1.16.4.dist-info → bec_widgets-1.17.0.dist-info}/licenses/LICENSE +0 -0
@@ -2,11 +2,11 @@
|
|
2
2
|
.gitlab-ci.yml,sha256=CLlFGYRGKp4FxCPTkyF9p-7qx67KmbM9Yok9JQEU_Ls,8677
|
3
3
|
.pylintrc,sha256=eeY8YwSI74oFfq6IYIbCqnx3Vk8ZncKaatv96n_Y8Rs,18544
|
4
4
|
.readthedocs.yaml,sha256=aSOc277LqXcsTI6lgvm_JY80lMlr69GbPKgivua2cS0,603
|
5
|
-
CHANGELOG.md,sha256=
|
5
|
+
CHANGELOG.md,sha256=qgX1xiPmG7RoW1r93kPeYVnO1h710pEclbew4UQ5RaM,224623
|
6
6
|
LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
|
7
|
-
PKG-INFO,sha256=
|
7
|
+
PKG-INFO,sha256=y_KMJNgIR69OWoRZQQWDhQJ7xQIAaYNEVNWTnAQn3zk,1339
|
8
8
|
README.md,sha256=Od69x-RS85Hph0-WwWACwal4yUd67XkEn4APEfHhHFw,2649
|
9
|
-
pyproject.toml,sha256=
|
9
|
+
pyproject.toml,sha256=2NKYdrBf11D3GFzfCMHEDUVJ-kRiHl4wjqgKQ-Ix4w0,2596
|
10
10
|
.git_hooks/pre-commit,sha256=n3RofIZHJl8zfJJIUomcMyYGFi_rwq4CC19z0snz3FI,286
|
11
11
|
.gitlab/issue_templates/bug_report_template.md,sha256=gAuyEwl7XlnebBrkiJ9AqffSNOywmr8vygUFWKTuQeI,386
|
12
12
|
.gitlab/issue_templates/documentation_update_template.md,sha256=FHLdb3TS_D9aL4CYZCjyXSulbaW5mrN2CmwTaeLPbNw,860
|
@@ -24,10 +24,10 @@ bec_widgets/assets/app_icons/alignment_1d.png,sha256=5VouaWieb4lVv3wUBNHaO5ovUW2
|
|
24
24
|
bec_widgets/assets/app_icons/bec_widgets_icon.png,sha256=K8dgGwIjalDh9PRHUsSQBqgdX7a00nM3igZdc20pkYM,1747017
|
25
25
|
bec_widgets/cli/__init__.py,sha256=d0Q6Fn44e7wFfLabDOBxpcJ1DPKWlFunGYDUBmO-4hA,22
|
26
26
|
bec_widgets/cli/auto_updates.py,sha256=Pj8OHlSlKN3JOAmuuBC5oUMzdfC8TYRY7QKT5BQ2cZo,5171
|
27
|
-
bec_widgets/cli/client.py,sha256=
|
27
|
+
bec_widgets/cli/client.py,sha256=QI27Eb6ehePBpFVhNzEFRfxxEOKTMFoCN9LNexsi8-g,99850
|
28
28
|
bec_widgets/cli/client_utils.py,sha256=DXHHw1LNkKVCApbWmOAdZqU_qdvvqx28QiWV-Uf-jos,12207
|
29
29
|
bec_widgets/cli/generate_cli.py,sha256=2BFNgxM_0XLy2OXxG_SX0rgPHFc27oq0_yoOI2h2Rgw,6605
|
30
|
-
bec_widgets/cli/server.py,sha256=
|
30
|
+
bec_widgets/cli/server.py,sha256=Hzhhzhc9PQhTtjpNeu8Jmbmahad0DbyieutaRp7Vejc,10485
|
31
31
|
bec_widgets/cli/rpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
32
32
|
bec_widgets/cli/rpc/rpc_base.py,sha256=1qxtzUuxy77Z0jX8my5EmbS3vE-bYlTp5RvZ2zjSDCA,6002
|
33
33
|
bec_widgets/cli/rpc/rpc_register.py,sha256=8s-YJxqYoKc2K7jRLvs0TjW6_OnhaRYCK00RIok_4qE,2252
|
@@ -49,7 +49,7 @@ bec_widgets/examples/plugin_example_pyside/tictactoetaskmenu.py,sha256=V6OVnBTS-
|
|
49
49
|
bec_widgets/qt_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
50
|
bec_widgets/qt_utils/collapsible_panel_manager.py,sha256=tvv77-9YTfYpsU6M_Le3bHR6wtANC83DEOrJ2Hhj6rs,14201
|
51
51
|
bec_widgets/qt_utils/compact_popup.py,sha256=3yeb-GJ1PUla5Q_hT0XDKqvyIEH9yV_eGidf1t8Dbbw,10234
|
52
|
-
bec_widgets/qt_utils/error_popups.py,sha256
|
52
|
+
bec_widgets/qt_utils/error_popups.py,sha256=7bL-Lil1G8reQPaRZo8NfG_7Cq2Y0HkF3KREJUE0ZlQ,11545
|
53
53
|
bec_widgets/qt_utils/palette_viewer.py,sha256=--B0x7aE7bniHIeuuLY_pH8yBDrTTXaE0IDrC_AM1mo,6326
|
54
54
|
bec_widgets/qt_utils/redis_message_waiter.py,sha256=fvL_QgC0cTDv_FPJdRyp5AKjf401EJU4z3r38p47ydY,1745
|
55
55
|
bec_widgets/qt_utils/round_frame.py,sha256=Ba_sTzYB_vYDepBBMPPqU8XDwKOAiU6ClZ3xUqiveK0,5734
|
@@ -91,7 +91,7 @@ bec_widgets/widgets/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKV
|
|
91
91
|
bec_widgets/widgets/containers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
92
92
|
bec_widgets/widgets/containers/dock/__init__.py,sha256=B7foHt02gnhM7mFksa7GJVwT7n0j_JvYDCt6wc6XR5g,61
|
93
93
|
bec_widgets/widgets/containers/dock/dock.py,sha256=_cw5bbqCLZxaD5LmosHNmm_eXelMDoTyxFdTnSWkoOI,10379
|
94
|
-
bec_widgets/widgets/containers/dock/dock_area.py,sha256=
|
94
|
+
bec_widgets/widgets/containers/dock/dock_area.py,sha256=9325BpsIR_0Del2O__iCIKjxsa_rJsnTzlkG8m21W1o,17943
|
95
95
|
bec_widgets/widgets/containers/dock/dock_area.pyproject,sha256=URW0UrDXCnkzk80rbQmUMgF6Uqay2TjHsq8Dq0g1j-c,37
|
96
96
|
bec_widgets/widgets/containers/dock/dock_area_plugin.py,sha256=fDVXKPZuHr85B2fLfAYf_Ic5d9mZQpnZrODTDquzZpM,1331
|
97
97
|
bec_widgets/widgets/containers/dock/register_dock_area.py,sha256=L7BL4qknCjtqsDP-RMQzk2qRPpcYuzXWlb7sJB_0DDM,475
|
@@ -144,19 +144,28 @@ bec_widgets/widgets/control/device_control/position_indicator/position_indicator
|
|
144
144
|
bec_widgets/widgets/control/device_control/position_indicator/position_indicator.pyproject,sha256=s0JEf5YkpMag19ddFSYeRZ8erBau7erO3bqw05YrTyg,36
|
145
145
|
bec_widgets/widgets/control/device_control/position_indicator/position_indicator_plugin.py,sha256=54x8tGkD9P08GfnfAW5MwpW4ybbj53q6942na2VDBbA,1445
|
146
146
|
bec_widgets/widgets/control/device_control/position_indicator/register_position_indicator.py,sha256=ZbN5wPv4dhWEAgX9QD1HL7k7y1O5qZHAgj-xZjwFSho,539
|
147
|
-
bec_widgets/widgets/control/device_control/positioner_box/__init__.py,sha256=
|
148
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
149
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
150
|
-
bec_widgets/widgets/control/device_control/positioner_box/positioner_box.
|
151
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
152
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
153
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
154
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
155
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
156
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
157
|
-
bec_widgets/widgets/control/device_control/positioner_box/
|
147
|
+
bec_widgets/widgets/control/device_control/positioner_box/__init__.py,sha256=0vO7JjxKsO6bbxUjdCGYKELFTY0n4Cv8u4Z1i-MhwL0,476
|
148
|
+
bec_widgets/widgets/control/device_control/positioner_box/_base/__init__.py,sha256=IiOglwEwd908gs10ZRF6PHGdbRHw0B-ScAmebtQKhXc,84
|
149
|
+
bec_widgets/widgets/control/device_control/positioner_box/_base/positioner_box_base.py,sha256=bxZNAN2hXAdTnQBpQiDrBMaRviMqPmO_UAoyTK94ESE,8775
|
150
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
151
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.py,sha256=HDRNbS1w2Do4WHs3VmYI-jEbmkpEEeo85UBjVdT-oos,8035
|
152
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.pyproject,sha256=7966pHdDseaHciaPNEKgdQgbUThSZf5wEDCeAEJh9po,32
|
153
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box.ui,sha256=7LZlM9smIqmkvS2KAIDkBamn04mBAkXeG9T1fpKRQe8,6093
|
154
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box/positioner_box_plugin.py,sha256=CKtz61p5uYUh_l30APyhsV3uwJuLFBiBeFZfaOdT0Do,1421
|
155
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box/register_positioner_box.py,sha256=cp5356x3txtPLg9UkahQgC5oLlWu50GnEMcjrFr9pQI,538
|
156
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
157
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d.pyproject,sha256=BmmaJtz4dvFoDU2Lf8C5aoIrCzcVy1RmS7m2acnSdOA,35
|
158
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box2_d_plugin.py,sha256=d5vDlT3AwhqV60q1bZprEwdaY8XUdFmG-lKs53AftKA,1402
|
159
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.py,sha256=5f-q9VG3PskMzSXj4QcQ3MYUy8PRZKUsvbbon9-9mZw,16921
|
160
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/positioner_box_2d.ui,sha256=d-WRd8LekUwM0PGz8dGr4dB6eiLfLL2jBWkdbQYotyM,17510
|
161
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_box_2d/register_positioner_box2_d.py,sha256=YilAE4w0gd8PwUUBSijmqhyIaQ6kuXk_p5ByzZsw_dA,548
|
162
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.py,sha256=pUo65sk8N2meU09rvdb_ak7MPOo8rt9yKeZywbsm2J0,993
|
163
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.pyproject,sha256=RGIXDjWq3fNCgOnU-08oeIeBLCcjYbRXgyh26drxB7I,41
|
164
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line.ui,sha256=fUq56Bl05jxy81KKlaP9B52lZDDrCjUxMTjMCNFiukw,6170
|
165
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/positioner_control_line_plugin.py,sha256=GAIFfXXxNRWj39gqKKjMFNtYLJ8yvMTGGN5vS5rDSyM,1494
|
166
|
+
bec_widgets/widgets/control/device_control/positioner_box/positioner_control_line/register_positioner_control_line.py,sha256=HmHP1P46GqHM1Rh3UCwKqIg0i4TzXsGxTzUJUc4UYGU,572
|
158
167
|
bec_widgets/widgets/control/device_control/positioner_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
159
|
-
bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py,sha256=
|
168
|
+
bec_widgets/widgets/control/device_control/positioner_group/positioner_group.py,sha256=r_zDcyLNQoECo4J6OjzH6BoVWtAWTw2oLpuuFp1LvHo,5837
|
160
169
|
bec_widgets/widgets/control/device_control/positioner_group/positioner_group.pyproject,sha256=NV-Hupn3uA4T9KXhxFO3r4MVuUAfdfWaLH4CIm71eqc,35
|
161
170
|
bec_widgets/widgets/control/device_control/positioner_group/positioner_group_plugin.py,sha256=gVzc1yzfs0NyTNM00p8-UDfLqtSF9wgeJOe0E4Ibzmo,1482
|
162
171
|
bec_widgets/widgets/control/device_control/positioner_group/register_positioner_group.py,sha256=vjoIwn1CQbg3gEwKzgY2MuscfGab2agM5YV0r1_UL0k,531
|
@@ -175,9 +184,6 @@ bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit.pypro
|
|
175
184
|
bec_widgets/widgets/control/device_input/device_line_edit/device_line_edit_plugin.py,sha256=LoG1VyO21pZ9dbnDVU03xzqgP8P1oEmdeotlkYs_pE8,1466
|
176
185
|
bec_widgets/widgets/control/device_input/device_line_edit/register_device_line_edit.py,sha256=NTB3HghW5S7NvUlPe_k_uFYQLWPYgjgln2bAYipfkpM,527
|
177
186
|
bec_widgets/widgets/control/device_input/signal_combobox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
178
|
-
bec_widgets/widgets/control/device_input/signal_combobox/register_signal_combo_box.py,sha256=VEdFRUfLph7JE2arcnzHw8etsE-4wZkwyzlNLMJBsZk,526
|
179
|
-
bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box.pyproject,sha256=mjt4p6NTiZ2j7KCQdw-U2EFiwMptidXNu8UX6oYV3k4,34
|
180
|
-
bec_widgets/widgets/control/device_input/signal_combobox/signal_combo_box_plugin.py,sha256=I3KfF1p7Av94ErNY9CyQKalQ18fah94LEikIIgyDzqs,1315
|
181
187
|
bec_widgets/widgets/control/device_input/signal_combobox/signal_combobox.py,sha256=0aOAq3e9MdZMXTGJQY7WqQSvl-oPnqwrfHjBKGzeRAI,4572
|
182
188
|
bec_widgets/widgets/control/device_input/signal_line_edit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
183
189
|
bec_widgets/widgets/control/device_input/signal_line_edit/register_signal_line_edit.py,sha256=aQLTy_3gbji0vq5VvvAddHFimpwGGaMYJy5iGgX23aM,527
|
@@ -326,8 +332,8 @@ bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.py,sha256=Z
|
|
326
332
|
bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button.pyproject,sha256=Lbi9zb6HNlIq14k6hlzR-oz6PIFShBuF7QxE6d87d64,34
|
327
333
|
bec_widgets/widgets/utility/visual/dark_mode_button/dark_mode_button_plugin.py,sha256=CzChz2SSETYsR8-36meqWnsXCT-FIy_J_xeU5coWDY8,1350
|
328
334
|
bec_widgets/widgets/utility/visual/dark_mode_button/register_dark_mode_button.py,sha256=rMpZ1CaoucwobgPj1FuKTnt07W82bV1GaSYdoqcdMb8,521
|
329
|
-
bec_widgets-1.
|
330
|
-
bec_widgets-1.
|
331
|
-
bec_widgets-1.
|
332
|
-
bec_widgets-1.
|
333
|
-
bec_widgets-1.
|
335
|
+
bec_widgets-1.17.0.dist-info/METADATA,sha256=y_KMJNgIR69OWoRZQQWDhQJ7xQIAaYNEVNWTnAQn3zk,1339
|
336
|
+
bec_widgets-1.17.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
337
|
+
bec_widgets-1.17.0.dist-info/entry_points.txt,sha256=dItMzmwA1wizJ1Itx15qnfJ0ZzKVYFLVJ1voxT7K7D4,214
|
338
|
+
bec_widgets-1.17.0.dist-info/licenses/LICENSE,sha256=YRKe85CBRyP7UpEAWwU8_qSIyuy5-l_9C-HKg5Qm8MQ,1511
|
339
|
+
bec_widgets-1.17.0.dist-info/RECORD,,
|
pyproject.toml
CHANGED
@@ -1,352 +0,0 @@
|
|
1
|
-
""" Module for a PositionerBox widget to control a positioner device."""
|
2
|
-
|
3
|
-
from __future__ import annotations
|
4
|
-
|
5
|
-
import os
|
6
|
-
import uuid
|
7
|
-
|
8
|
-
from bec_lib.device import Positioner
|
9
|
-
from bec_lib.endpoints import MessageEndpoints
|
10
|
-
from bec_lib.logger import bec_logger
|
11
|
-
from bec_lib.messages import ScanQueueMessage
|
12
|
-
from bec_qthemes import material_icon
|
13
|
-
from qtpy.QtCore import Property, Signal, Slot
|
14
|
-
from qtpy.QtGui import QDoubleValidator
|
15
|
-
from qtpy.QtWidgets import QDialog, QDoubleSpinBox, QPushButton, QVBoxLayout
|
16
|
-
|
17
|
-
from bec_widgets.qt_utils.compact_popup import CompactPopupWidget
|
18
|
-
from bec_widgets.utils import UILoader
|
19
|
-
from bec_widgets.utils.bec_widget import BECWidget
|
20
|
-
from bec_widgets.utils.colors import get_accent_colors, set_theme
|
21
|
-
from bec_widgets.widgets.control.device_input.base_classes.device_input_base import BECDeviceFilter
|
22
|
-
from bec_widgets.widgets.control.device_input.device_line_edit.device_line_edit import (
|
23
|
-
DeviceLineEdit,
|
24
|
-
)
|
25
|
-
|
26
|
-
logger = bec_logger.logger
|
27
|
-
|
28
|
-
MODULE_PATH = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
29
|
-
|
30
|
-
|
31
|
-
class PositionerBox(BECWidget, CompactPopupWidget):
|
32
|
-
"""Simple Widget to control a positioner in box form"""
|
33
|
-
|
34
|
-
ui_file = "positioner_box.ui"
|
35
|
-
dimensions = (234, 224)
|
36
|
-
|
37
|
-
PLUGIN = True
|
38
|
-
ICON_NAME = "switch_right"
|
39
|
-
USER_ACCESS = ["set_positioner"]
|
40
|
-
device_changed = Signal(str, str)
|
41
|
-
# Signal emitted to inform listeners about a position update
|
42
|
-
position_update = Signal(float)
|
43
|
-
|
44
|
-
def __init__(self, parent=None, device: Positioner = None, **kwargs):
|
45
|
-
"""Initialize the PositionerBox widget.
|
46
|
-
|
47
|
-
Args:
|
48
|
-
parent: The parent widget.
|
49
|
-
device (Positioner): The device to control.
|
50
|
-
"""
|
51
|
-
super().__init__(**kwargs)
|
52
|
-
CompactPopupWidget.__init__(self, parent=parent, layout=QVBoxLayout)
|
53
|
-
self.get_bec_shortcuts()
|
54
|
-
self._device = ""
|
55
|
-
self._limits = None
|
56
|
-
self._dialog = None
|
57
|
-
|
58
|
-
self.init_ui()
|
59
|
-
|
60
|
-
if device is not None:
|
61
|
-
self.device = device
|
62
|
-
self.init_device()
|
63
|
-
|
64
|
-
def init_ui(self):
|
65
|
-
"""Init the ui"""
|
66
|
-
self.device_changed.connect(self.on_device_change)
|
67
|
-
|
68
|
-
current_path = os.path.dirname(__file__)
|
69
|
-
self.ui = UILoader(self).loader(os.path.join(current_path, self.ui_file))
|
70
|
-
|
71
|
-
self.addWidget(self.ui)
|
72
|
-
self.layout.setSpacing(0)
|
73
|
-
self.layout.setContentsMargins(0, 0, 0, 0)
|
74
|
-
|
75
|
-
# fix the size of the device box
|
76
|
-
db = self.ui.device_box
|
77
|
-
db.setFixedHeight(self.dimensions[0])
|
78
|
-
db.setFixedWidth(self.dimensions[1])
|
79
|
-
|
80
|
-
self.ui.step_size.setStepType(QDoubleSpinBox.AdaptiveDecimalStepType)
|
81
|
-
self.ui.stop.clicked.connect(self.on_stop)
|
82
|
-
self.ui.stop.setToolTip("Stop")
|
83
|
-
self.ui.stop.setStyleSheet(
|
84
|
-
f"QPushButton {{background-color: {get_accent_colors().emergency.name()}; color: white;}}"
|
85
|
-
)
|
86
|
-
self.ui.tweak_right.clicked.connect(self.on_tweak_right)
|
87
|
-
self.ui.tweak_right.setToolTip("Tweak right")
|
88
|
-
self.ui.tweak_left.clicked.connect(self.on_tweak_left)
|
89
|
-
self.ui.tweak_left.setToolTip("Tweak left")
|
90
|
-
self.ui.setpoint.returnPressed.connect(self.on_setpoint_change)
|
91
|
-
|
92
|
-
self.setpoint_validator = QDoubleValidator()
|
93
|
-
self.ui.setpoint.setValidator(self.setpoint_validator)
|
94
|
-
self.ui.spinner_widget.start()
|
95
|
-
self.ui.tool_button.clicked.connect(self._open_dialog_selection)
|
96
|
-
icon = material_icon(icon_name="edit_note", size=(16, 16), convert_to_pixmap=False)
|
97
|
-
self.ui.tool_button.setIcon(icon)
|
98
|
-
|
99
|
-
def _open_dialog_selection(self):
|
100
|
-
"""Open dialog window for positioner selection"""
|
101
|
-
self._dialog = QDialog(self)
|
102
|
-
self._dialog.setWindowTitle("Positioner Selection")
|
103
|
-
layout = QVBoxLayout()
|
104
|
-
line_edit = DeviceLineEdit(
|
105
|
-
self, client=self.client, device_filter=[BECDeviceFilter.POSITIONER]
|
106
|
-
)
|
107
|
-
line_edit.textChanged.connect(self.set_positioner)
|
108
|
-
layout.addWidget(line_edit)
|
109
|
-
close_button = QPushButton("Close")
|
110
|
-
close_button.clicked.connect(self._dialog.accept)
|
111
|
-
layout.addWidget(close_button)
|
112
|
-
self._dialog.setLayout(layout)
|
113
|
-
self._dialog.exec()
|
114
|
-
self._dialog = None
|
115
|
-
|
116
|
-
def init_device(self):
|
117
|
-
"""Init the device view and readback"""
|
118
|
-
if self._check_device_is_valid(self.device):
|
119
|
-
data = self.dev[self.device].read()
|
120
|
-
self.on_device_readback({"signals": data}, {})
|
121
|
-
|
122
|
-
def _toogle_enable_buttons(self, enable: bool) -> None:
|
123
|
-
"""Toogle enable/disable on available buttons
|
124
|
-
|
125
|
-
Args:
|
126
|
-
enable (bool): Enable buttons
|
127
|
-
"""
|
128
|
-
self.ui.tweak_left.setEnabled(enable)
|
129
|
-
self.ui.tweak_right.setEnabled(enable)
|
130
|
-
self.ui.stop.setEnabled(enable)
|
131
|
-
self.ui.setpoint.setEnabled(enable)
|
132
|
-
self.ui.step_size.setEnabled(enable)
|
133
|
-
|
134
|
-
@Property(str)
|
135
|
-
def device(self):
|
136
|
-
"""Property to set the device"""
|
137
|
-
return self._device
|
138
|
-
|
139
|
-
@device.setter
|
140
|
-
def device(self, value: str):
|
141
|
-
"""Setter, checks if device is a string"""
|
142
|
-
if not value or not isinstance(value, str):
|
143
|
-
return
|
144
|
-
if not self._check_device_is_valid(value):
|
145
|
-
return
|
146
|
-
old_device = self._device
|
147
|
-
self._device = value
|
148
|
-
if not self.label:
|
149
|
-
self.label = value
|
150
|
-
self.device_changed.emit(old_device, value)
|
151
|
-
|
152
|
-
@Property(bool)
|
153
|
-
def hide_device_selection(self):
|
154
|
-
"""Hide the device selection"""
|
155
|
-
return not self.ui.tool_button.isVisible()
|
156
|
-
|
157
|
-
@hide_device_selection.setter
|
158
|
-
def hide_device_selection(self, value: bool):
|
159
|
-
"""Set the device selection visibility"""
|
160
|
-
self.ui.tool_button.setVisible(not value)
|
161
|
-
|
162
|
-
@Slot(bool)
|
163
|
-
def show_device_selection(self, value: bool):
|
164
|
-
"""Show the device selection
|
165
|
-
|
166
|
-
Args:
|
167
|
-
value (bool): Show the device selection
|
168
|
-
"""
|
169
|
-
self.hide_device_selection = not value
|
170
|
-
|
171
|
-
@Slot(str)
|
172
|
-
def set_positioner(self, positioner: str | Positioner):
|
173
|
-
"""Set the device
|
174
|
-
|
175
|
-
Args:
|
176
|
-
positioner (Positioner | str) : Positioner to set, accepts str or the device
|
177
|
-
"""
|
178
|
-
if isinstance(positioner, Positioner):
|
179
|
-
positioner = positioner.name
|
180
|
-
self.device = positioner
|
181
|
-
|
182
|
-
def _check_device_is_valid(self, device: str):
|
183
|
-
"""Check if the device is a positioner
|
184
|
-
|
185
|
-
Args:
|
186
|
-
device (str): The device name
|
187
|
-
"""
|
188
|
-
if device not in self.dev:
|
189
|
-
logger.info(f"Device {device} not found in the device list")
|
190
|
-
return False
|
191
|
-
if not isinstance(self.dev[device], Positioner):
|
192
|
-
logger.info(f"Device {device} is not a positioner")
|
193
|
-
return False
|
194
|
-
return True
|
195
|
-
|
196
|
-
@Slot(str, str)
|
197
|
-
def on_device_change(self, old_device: str, new_device: str):
|
198
|
-
"""Upon changing the device, a check will be performed if the device is a Positioner.
|
199
|
-
|
200
|
-
Args:
|
201
|
-
old_device (str): The old device name.
|
202
|
-
new_device (str): The new device name.
|
203
|
-
"""
|
204
|
-
if not self._check_device_is_valid(new_device):
|
205
|
-
return
|
206
|
-
logger.info(f"Device changed from {old_device} to {new_device}")
|
207
|
-
self._toogle_enable_buttons(True)
|
208
|
-
self.init_device()
|
209
|
-
self.bec_dispatcher.disconnect_slot(
|
210
|
-
self.on_device_readback, MessageEndpoints.device_readback(old_device)
|
211
|
-
)
|
212
|
-
self.bec_dispatcher.connect_slot(
|
213
|
-
self.on_device_readback, MessageEndpoints.device_readback(new_device)
|
214
|
-
)
|
215
|
-
self.ui.device_box.setTitle(new_device)
|
216
|
-
self.ui.readback.setToolTip(f"{self.device} readback")
|
217
|
-
self.ui.setpoint.setToolTip(f"{self.device} setpoint")
|
218
|
-
self.ui.step_size.setToolTip(f"Step size for {new_device}")
|
219
|
-
|
220
|
-
precision = self.dev[new_device].precision
|
221
|
-
if precision is not None:
|
222
|
-
self.ui.step_size.setDecimals(precision)
|
223
|
-
self.ui.step_size.setValue(10**-precision * 10)
|
224
|
-
|
225
|
-
# pylint: disable=unused-argument
|
226
|
-
@Slot(dict, dict)
|
227
|
-
def on_device_readback(self, msg_content: dict, metadata: dict):
|
228
|
-
"""Callback for device readback.
|
229
|
-
|
230
|
-
Args:
|
231
|
-
msg_content (dict): The message content.
|
232
|
-
metadata (dict): The message metadata.
|
233
|
-
"""
|
234
|
-
signals = msg_content.get("signals", {})
|
235
|
-
# pylint: disable=protected-access
|
236
|
-
hinted_signals = self.dev[self.device]._hints
|
237
|
-
precision = self.dev[self.device].precision
|
238
|
-
|
239
|
-
readback_val = None
|
240
|
-
setpoint_val = None
|
241
|
-
|
242
|
-
if len(hinted_signals) == 1:
|
243
|
-
signal = hinted_signals[0]
|
244
|
-
readback_val = signals.get(signal, {}).get("value")
|
245
|
-
|
246
|
-
for setpoint_signal in ["setpoint", "user_setpoint"]:
|
247
|
-
setpoint_val = signals.get(f"{self.device}_{setpoint_signal}", {}).get("value")
|
248
|
-
if setpoint_val is not None:
|
249
|
-
break
|
250
|
-
|
251
|
-
for moving_signal in ["motor_done_move", "motor_is_moving"]:
|
252
|
-
is_moving = signals.get(f"{self.device}_{moving_signal}", {}).get("value")
|
253
|
-
if is_moving is not None:
|
254
|
-
break
|
255
|
-
|
256
|
-
if is_moving is not None:
|
257
|
-
self.ui.spinner_widget.setVisible(True)
|
258
|
-
if is_moving:
|
259
|
-
self.ui.spinner_widget.start()
|
260
|
-
self.ui.spinner_widget.setToolTip("Device is moving")
|
261
|
-
self.set_global_state("warning")
|
262
|
-
else:
|
263
|
-
self.ui.spinner_widget.stop()
|
264
|
-
self.ui.spinner_widget.setToolTip("Device is idle")
|
265
|
-
self.set_global_state("success")
|
266
|
-
else:
|
267
|
-
self.ui.spinner_widget.setVisible(False)
|
268
|
-
|
269
|
-
if readback_val is not None:
|
270
|
-
self.ui.readback.setText(f"{readback_val:.{precision}f}")
|
271
|
-
self.position_update.emit(readback_val)
|
272
|
-
|
273
|
-
if setpoint_val is not None:
|
274
|
-
self.ui.setpoint.setText(f"{setpoint_val:.{precision}f}")
|
275
|
-
|
276
|
-
limits = self.dev[self.device].limits
|
277
|
-
self.update_limits(limits)
|
278
|
-
if limits is not None and readback_val is not None and limits[0] != limits[1]:
|
279
|
-
pos = (readback_val - limits[0]) / (limits[1] - limits[0])
|
280
|
-
self.ui.position_indicator.set_value(pos)
|
281
|
-
|
282
|
-
def update_limits(self, limits: tuple):
|
283
|
-
"""Update limits
|
284
|
-
|
285
|
-
Args:
|
286
|
-
limits (tuple): Limits of the positioner
|
287
|
-
"""
|
288
|
-
if limits == self._limits:
|
289
|
-
return
|
290
|
-
self._limits = limits
|
291
|
-
if limits is not None and limits[0] != limits[1]:
|
292
|
-
self.ui.position_indicator.setToolTip(f"Min: {limits[0]}, Max: {limits[1]}")
|
293
|
-
self.setpoint_validator.setRange(limits[0], limits[1])
|
294
|
-
else:
|
295
|
-
self.ui.position_indicator.setToolTip("No limits set")
|
296
|
-
self.setpoint_validator.setRange(float("-inf"), float("inf"))
|
297
|
-
|
298
|
-
@Slot()
|
299
|
-
def on_stop(self):
|
300
|
-
"""Stop call"""
|
301
|
-
request_id = str(uuid.uuid4())
|
302
|
-
params = {
|
303
|
-
"device": self.device,
|
304
|
-
"rpc_id": request_id,
|
305
|
-
"func": "stop",
|
306
|
-
"args": [],
|
307
|
-
"kwargs": {},
|
308
|
-
}
|
309
|
-
msg = ScanQueueMessage(
|
310
|
-
scan_type="device_rpc",
|
311
|
-
parameter=params,
|
312
|
-
queue="emergency",
|
313
|
-
metadata={"RID": request_id, "response": False},
|
314
|
-
)
|
315
|
-
self.client.connector.send(MessageEndpoints.scan_queue_request(), msg)
|
316
|
-
|
317
|
-
@property
|
318
|
-
def step_size(self):
|
319
|
-
"""Step size for tweak"""
|
320
|
-
return self.ui.step_size.value()
|
321
|
-
|
322
|
-
@Slot()
|
323
|
-
def on_tweak_right(self):
|
324
|
-
"""Tweak motor right"""
|
325
|
-
self.dev[self.device].move(self.step_size, relative=True)
|
326
|
-
|
327
|
-
@Slot()
|
328
|
-
def on_tweak_left(self):
|
329
|
-
"""Tweak motor left"""
|
330
|
-
self.dev[self.device].move(-self.step_size, relative=True)
|
331
|
-
|
332
|
-
@Slot()
|
333
|
-
def on_setpoint_change(self):
|
334
|
-
"""Change the setpoint for the motor"""
|
335
|
-
self.ui.setpoint.clearFocus()
|
336
|
-
setpoint = self.ui.setpoint.text()
|
337
|
-
self.dev[self.device].move(float(setpoint), relative=False)
|
338
|
-
self.ui.tweak_left.setToolTip(f"Tweak left by {self.step_size}")
|
339
|
-
self.ui.tweak_right.setToolTip(f"Tweak right by {self.step_size}")
|
340
|
-
|
341
|
-
|
342
|
-
if __name__ == "__main__": # pragma: no cover
|
343
|
-
import sys
|
344
|
-
|
345
|
-
from qtpy.QtWidgets import QApplication # pylint: disable=ungrouped-imports
|
346
|
-
|
347
|
-
app = QApplication(sys.argv)
|
348
|
-
set_theme("dark")
|
349
|
-
widget = PositionerBox(device="bpm4i")
|
350
|
-
|
351
|
-
widget.show()
|
352
|
-
sys.exit(app.exec_())
|
@@ -1 +0,0 @@
|
|
1
|
-
{'files': ['signal_combobox.py']}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|