@@ -120,8 +120,8 @@ def test_eq(self):
120
120
@pytest .mark .parametrize ('sync' , (False ,))
121
121
def test_as_mpl_selector (self , sync ):
122
122
plt = pytest .importorskip ('matplotlib.pyplot' )
123
+ from matplotlib import __version_info__ as MPL_VERSION # noqa: N812
123
124
from matplotlib .testing .widgets import do_event
124
- from matplotlib import __version_info__ as MPL_VERSION
125
125
126
126
rng = np .random .default_rng (0 )
127
127
data = rng .random ((16 , 16 ))
@@ -180,8 +180,9 @@ def test_mpl_selector_drag(self, anywhere, rotate):
180
180
Test dragging of entire region from central handle and anywhere.
181
181
"""
182
182
plt = pytest .importorskip ('matplotlib.pyplot' )
183
- from matplotlib .testing .widgets import do_event # click_and_drag # MPL_VERSION >= 36
184
- from matplotlib import __version_info__ as MPL_VERSION
183
+ from matplotlib import __version_info__ as MPL_VERSION # noqa: N812
184
+ # if MPL_VERSION >= 36:
185
+ from matplotlib .testing .widgets import do_event # click_and_drag
185
186
186
187
if rotate != 0 and MPL_VERSION < (3 , 6 , 0 ):
187
188
pytest .xfail ('Creating selectors for rotated shapes is not yet supported' )
@@ -220,9 +221,9 @@ def update_mask(reg):
220
221
assert_allclose ((region .width , region .height ), (4 , 3 ), atol = 1e-12 , rtol = 0 )
221
222
222
223
# click_and_drag from outside centre handle, but inside region
223
- do_event (selector , 'press' , xdata = 3 .0 , ydata = 5.0 , button = 1 )
224
- do_event (selector , 'onmove' , xdata = 4 .0 , ydata = 7.0 , button = 1 )
225
- do_event (selector , 'release' , xdata = 4 .0 , ydata = 7.0 , button = 1 )
224
+ do_event (selector , 'press' , xdata = 2 .0 , ydata = 5.0 , button = 1 )
225
+ do_event (selector , 'onmove' , xdata = 3 .0 , ydata = 7.0 , button = 1 )
226
+ do_event (selector , 'release' , xdata = 3 .0 , ydata = 7.0 , button = 1 )
226
227
227
228
ax .figure .canvas .draw ()
228
229
@@ -231,7 +232,7 @@ def update_mask(reg):
231
232
assert_allclose (region .center .xy , (4.5 , 6.5 ), atol = 1e-12 , rtol = 0 )
232
233
assert_allclose ((region .width , region .height ), (4 , 3 ), atol = 1e-12 , rtol = 0 )
233
234
else :
234
- assert_allclose (region .center .xy , (3 .5 , 6.0 ), atol = 1e-12 , rtol = 0 )
235
+ assert_allclose (region .center .xy , (2 .5 , 6.0 ), atol = 1e-12 , rtol = 0 )
235
236
assert_allclose ((region .width , region .height ), (1 , 2 ), atol = 1e-12 , rtol = 0 )
236
237
237
238
assert_equal (mask , region .to_mask (mode = 'subpixels' , subpixels = 10 ).to_image (data .shape ))
@@ -280,6 +281,85 @@ def update_mask(reg):
280
281
281
282
assert_equal (mask , region .to_mask (mode = 'subpixels' , subpixels = 10 ).to_image (data .shape ))
282
283
284
+ def test_mpl_selector_rotate (self ):
285
+ """
286
+ Test rotating region on corner handles and by setting angle.
287
+ """
288
+ plt = pytest .importorskip ('matplotlib.pyplot' )
289
+ from matplotlib .testing .widgets import do_event
290
+
291
+ rng = np .random .default_rng (0 )
292
+ data = rng .random ((16 , 16 ))
293
+ mask = np .zeros_like (data )
294
+
295
+ ax = plt .subplot (1 , 1 , 1 )
296
+ ax .imshow (data )
297
+
298
+ def update_mask (reg ):
299
+ mask [:] = reg .to_mask (mode = 'subpixels' , subpixels = 10 ).to_image (data .shape )
300
+
301
+ region = self .reg .copy (angle = 0 * u .deg )
302
+ selector = region .as_mpl_selector (ax , callback = update_mask )
303
+
304
+ # Need rotation implementation from matplotlib#26833, hopefully to change once released
305
+ if not hasattr (selector , '_geometry_state' ):
306
+ pytest .xfail ('Rotating selectors is not yet supported' )
307
+
308
+ assert region ._mpl_selector .drag_from_anywhere is False
309
+ assert_allclose (region .center .xy , (3.0 , 4.0 ), atol = 1e-12 , rtol = 0 )
310
+ assert_allclose ((region .width , region .height ), (4 , 3 ), atol = 1e-12 , rtol = 0 )
311
+ assert_quantity_allclose (region .angle , 0 * u .deg )
312
+ assert_allclose (region ._mpl_selector .rotation , 0.0 , atol = 1e-12 )
313
+ assert_allclose (region .corners , [(1 , 2.5 ), (5 , 2.5 ), (5 , 5.5 ), (1 , 5.5 )],
314
+ atol = 1e-12 , rtol = 0 )
315
+
316
+ # Rotate counter-clockwise using top-right corner
317
+ do_event (selector , 'on_key_press' , key = 'r' )
318
+ do_event (selector , 'press' , xdata = 5 , ydata = 5.5 , button = 1 )
319
+ do_event (selector , 'onmove' , xdata = 4 , ydata = 6 , button = 1 )
320
+ do_event (selector , 'release' , xdata = 4 , ydata = 6 , button = 1 )
321
+ do_event (selector , 'on_key_press' , key = 'r' )
322
+
323
+ ax .figure .canvas .draw ()
324
+
325
+ assert_allclose (region .center .xy , (3.0 , 4.0 ), atol = 1e-12 , rtol = 0 )
326
+ assert_allclose ((region .width , region .height ), (4 , 3 ), atol = 1e-12 , rtol = 0 )
327
+ assert_allclose (region ._mpl_selector .rotation , - 26.56 , atol = 0.01 )
328
+ assert_quantity_allclose (region .angle , 26.56 * u .deg , rtol = 0.001 )
329
+ assert_allclose (region .corners , [(1.88 , 1.76 ), (5.46 , 3.55 ), (4.12 , 6.24 ), (0.54 , 4.45 )],
330
+ atol = 1e-2 , rtol = 0 )
331
+
332
+ assert_equal (mask , region .to_mask (mode = 'subpixels' , subpixels = 10 ).to_image (data .shape ))
333
+
334
+ # click_and_drag(selector, start=(3, 4), end=(7, 6)) # (shift center +3|+2)
335
+ do_event (selector , 'press' , xdata = 3 , ydata = 4 , button = 1 )
336
+ do_event (selector , 'onmove' , xdata = 6 , ydata = 6 , button = 1 )
337
+ do_event (selector , 'release' , xdata = 6 , ydata = 6 , button = 1 )
338
+
339
+ ax .figure .canvas .draw ()
340
+
341
+ assert_allclose (region .center .xy , (6 , 6 ), atol = 1e-12 , rtol = 0 )
342
+ assert_allclose ((region .width , region .height ), (4 , 3 ), atol = 1e-12 , rtol = 0 )
343
+ assert_allclose (region ._mpl_selector .rotation , - 26.56 , atol = 0.01 )
344
+ assert_quantity_allclose (region .angle , 26.56 * u .deg , rtol = 0.001 )
345
+ assert_allclose (region .corners , [(4.88 , 3.76 ), (8.46 , 5.55 ), (7.12 , 8.24 ), (3.54 , 6.45 )],
346
+ atol = 1e-2 , rtol = 0 )
347
+
348
+ assert_equal (mask , region .to_mask (mode = 'subpixels' , subpixels = 10 ).to_image (data .shape ))
349
+
350
+ # and de-rotate shifted rectangle
351
+ region ._mpl_selector .rotation = 0.0
352
+ region ._update_from_mpl_selector ()
353
+
354
+ assert_allclose (region .center .xy , (6 , 6 ), atol = 1e-2 , rtol = 0 )
355
+ assert_allclose ((region .width , region .height ), (4 , 3 ), atol = 1e-12 , rtol = 0 )
356
+ assert_quantity_allclose (region .angle , 0 * u .deg , atol = 1e-12 * u .deg )
357
+ assert_allclose (region ._mpl_selector .rotation , 0.0 , atol = 1e-12 )
358
+ assert_allclose (region .corners , [(4 , 4.5 ), (8 , 4.5 ), (8 , 7.5 ), (4 , 7.5 )],
359
+ atol = 1e-12 , rtol = 0 )
360
+
361
+ assert_equal (mask , region .to_mask (mode = 'subpixels' , subpixels = 10 ).to_image (data .shape ))
362
+
283
363
@pytest .mark .parametrize ('userargs' ,
284
364
({'useblit' : True },
285
365
{'grab_range' : 20 , 'minspanx' : 5 , 'minspany' : 4 },
0 commit comments