@@ -3586,21 +3586,20 @@ def __init__(self, ax, onselect, useblit=False,
3586
3586
super ().__init__ (ax , onselect , useblit = useblit ,
3587
3587
state_modifier_keys = state_modifier_keys )
3588
3588
3589
- self ._xs , self . _ys = [0 ], [ 0 ]
3589
+ self ._xys = [( 0 , 0 ) ]
3590
3590
3591
3591
if props is None :
3592
3592
props = dict (color = 'k' , linestyle = '-' , linewidth = 2 , alpha = 0.5 )
3593
3593
props ['animated' ] = self .useblit
3594
3594
self ._props = props
3595
- line = Line2D (self . _xs , self . _ys , ** self ._props )
3595
+ self . _selection_artist = line = Line2D ([], [] , ** self ._props )
3596
3596
self .ax .add_line (line )
3597
- self ._selection_artist = line
3598
3597
3599
3598
if handle_props is None :
3600
3599
handle_props = dict (markeredgecolor = 'k' ,
3601
3600
markerfacecolor = self ._props .get ('color' , 'k' ))
3602
3601
self ._handle_props = handle_props
3603
- self ._polygon_handles = ToolHandles (self .ax , self . _xs , self . _ys ,
3602
+ self ._polygon_handles = ToolHandles (self .ax , [], [] ,
3604
3603
useblit = self .useblit ,
3605
3604
marker_props = self ._handle_props )
3606
3605
@@ -3619,33 +3618,25 @@ def __init__(self, ax, onselect, useblit=False,
3619
3618
lambda self , value : setattr (self , "grab_range" , value ))
3620
3619
)
3621
3620
3622
- @property
3623
- def _nverts (self ):
3624
- return len (self ._xs )
3625
-
3626
3621
@property
3627
3622
def _handles_artists (self ):
3628
3623
return self ._polygon_handles .artists
3629
3624
3630
3625
def _remove_vertex (self , i ):
3631
3626
"""Remove vertex with index i."""
3632
- if (self ._nverts > 2 and
3627
+ if (len ( self ._xys ) > 2 and
3633
3628
self ._selection_completed and
3634
- i in (0 , self ._nverts - 1 )):
3629
+ i in (0 , len ( self ._xys ) - 1 )):
3635
3630
# If selecting the first or final vertex, remove both first and
3636
3631
# last vertex as they are the same for a closed polygon
3637
- self ._xs .pop (0 )
3638
- self ._ys .pop (0 )
3639
- self ._xs .pop (- 1 )
3640
- self ._ys .pop (- 1 )
3632
+ self ._xys .pop (0 )
3633
+ self ._xys .pop (- 1 )
3641
3634
# Close the polygon again by appending the new first vertex to the
3642
3635
# end
3643
- self ._xs .append (self ._xs [0 ])
3644
- self ._ys .append (self ._ys [0 ])
3636
+ self ._xys .append (self ._xys [0 ])
3645
3637
else :
3646
- self ._xs .pop (i )
3647
- self ._ys .pop (i )
3648
- if self ._nverts <= 2 :
3638
+ self ._xys .pop (i )
3639
+ if len (self ._xys ) <= 2 :
3649
3640
# If only one point left, return to incomplete state to let user
3650
3641
# start drawing again
3651
3642
self ._selection_completed = False
@@ -3654,13 +3645,13 @@ def _press(self, event):
3654
3645
"""Button press event handler."""
3655
3646
# Check for selection of a tool handle.
3656
3647
if ((self ._selection_completed or 'move_vertex' in self ._state )
3657
- and len (self ._xs ) > 0 ):
3648
+ and len (self ._xys ) > 0 ):
3658
3649
h_idx , h_dist = self ._polygon_handles .closest (event .x , event .y )
3659
3650
if h_dist < self .grab_range :
3660
3651
self ._active_handle_idx = h_idx
3661
3652
# Save the vertex positions at the time of the press event (needed to
3662
3653
# support the 'move_all' state modifier).
3663
- self ._xs_at_press , self . _ys_at_press = self ._xs . copy (), self . _ys .copy ()
3654
+ self ._xys_at_press = self ._xys .copy ()
3664
3655
3665
3656
def _release (self , event ):
3666
3657
"""Button release event handler."""
@@ -3672,17 +3663,14 @@ def _release(self, event):
3672
3663
self ._active_handle_idx = - 1
3673
3664
3674
3665
# Complete the polygon.
3675
- elif (len (self ._xs ) > 3
3676
- and self ._xs [- 1 ] == self ._xs [0 ]
3677
- and self ._ys [- 1 ] == self ._ys [0 ]):
3666
+ elif len (self ._xys ) > 3 and self ._xys [- 1 ] == self ._xys [0 ]:
3678
3667
self ._selection_completed = True
3679
3668
3680
3669
# Place new vertex.
3681
3670
elif (not self ._selection_completed
3682
3671
and 'move_all' not in self ._state
3683
3672
and 'move_vertex' not in self ._state ):
3684
- self ._xs .insert (- 1 , event .xdata )
3685
- self ._ys .insert (- 1 , event .ydata )
3673
+ self ._xys .insert (- 1 , (event .xdata , event .ydata ))
3686
3674
3687
3675
if self ._selection_completed :
3688
3676
self .onselect (self .verts )
@@ -3704,19 +3692,19 @@ def _onmove(self, event):
3704
3692
# Move the active vertex (ToolHandle).
3705
3693
if self ._active_handle_idx >= 0 :
3706
3694
idx = self ._active_handle_idx
3707
- self ._xs [ idx ], self . _ys [idx ] = event .xdata , event .ydata
3695
+ self ._xys [idx ] = event .xdata , event .ydata
3708
3696
# Also update the end of the polygon line if the first vertex is
3709
3697
# the active handle and the polygon is completed.
3710
3698
if idx == 0 and self ._selection_completed :
3711
- self ._xs [ - 1 ], self . _ys [- 1 ] = event .xdata , event .ydata
3699
+ self ._xys [- 1 ] = event .xdata , event .ydata
3712
3700
3713
3701
# Move all vertices.
3714
3702
elif 'move_all' in self ._state and self ._eventpress :
F438
3715
3703
dx = event .xdata - self ._eventpress .xdata
3716
3704
dy = event .ydata - self ._eventpress .ydata
3717
- for k in range (len (self ._xs )):
3718
- self . _xs [ k ] = self ._xs_at_press [k ] + dx
3719
- self ._ys [k ] = self . _ys_at_press [ k ] + dy
3705
+ for k in range (len (self ._xys )):
3706
+ x_at_press , y_at_press = self ._xys_at_press [k ]
3707
+ self ._xys [k ] = x_at_press + dx , y_at_press + dy
3720
3708
3721
3709
# Do nothing if completed or waiting for a move.
3722
3710
elif (self ._selection_completed
@@ -3726,15 +3714,14 @@ def _onmove(self, event):
3726
3714
# Position pending vertex.
3727
3715
else :
3728
3716
# Calculate distance to the start vertex.
3729
- x0 , y0 = self ._selection_artist .get_transform ().transform (
3730
- (self ._xs [0 ], self ._ys [0 ])
3731
- )
3717
+ x0 , y0 = \
3718
+ self ._selection_artist .get_transform ().transform (self ._xys [0 ])
3732
3719
v0_dist = np .hypot (x0 - event .x , y0 - event .y )
3733
3720
# Lock on to the start vertex if near it and ready to complete.
3734
- if len (self ._xs ) > 3 and v0_dist < self .grab_range :
3735
- self ._xs [- 1 ], self . _ys [ - 1 ] = self ._xs [ 0 ], self . _ys [0 ]
3721
+ if len (self ._xys ) > 3 and v0_dist < self .grab_range :
3722
+ self ._xys [- 1 ] = self ._xys [0 ]
3736
3723
else :
3737
- self ._xs [ - 1 ], self . _ys [- 1 ] = event .xdata , event .ydata
3724
+ self ._xys [- 1 ] = event .xdata , event .ydata
3738
3725
3739
3726
self ._draw_polygon ()
3740
3727
@@ -3745,7 +3732,7 @@ def _on_key_press(self, event):
3745
3732
if (not self ._selection_completed
3746
3733
and ('move_vertex' in self ._state or
3747
3734
'move_all' in self ._state )):
3748
- self ._xs , self . _ys = self . _xs [: - 1 ], self . _ys [: - 1 ]
3735
+ self ._xys . pop ()
3749
3736
self ._draw_polygon ()
3750
3737
3751
3738
def _on_key_release (self , event ):
@@ -3756,35 +3743,34 @@ def _on_key_release(self, event):
3756
3743
and
3757
3744
(event .key == self ._state_modifier_keys .get ('move_vertex' )
3758
3745
or event .key == self ._state_modifier_keys .get ('move_all' ))):
3759
- self ._xs .append (event .xdata )
3760
- self ._ys .append (event .ydata )
3746
+ self ._xys .append ((event .xdata , event .ydata ))
3761
3747
self ._draw_polygon ()
3762
3748
# Reset the polygon if the released key is the 'clear' key.
3763
3749
elif event .key == self ._state_modifier_keys .get ('clear' ):
3764
3750
event = self ._clean_event (event )
3765
- self ._xs , self . _ys = [event .xdata ], [ event .ydata ]
3751
+ self ._xys = [( event .xdata , event .ydata ) ]
3766
3752
self ._selection_completed = False
3767
3753
self .set_visible (True )
3768
3754
3769
3755
def _draw_polygon (self ):
3770
3756
"""Redraw the polygon based on the new vertex positions."""
3771
- self ._selection_artist .set_data (self ._xs , self ._ys )
3757
+ xs , ys = zip (* self ._xys ) if self ._xys else ([], [])
3758
+ self ._selection_artist .set_data (xs , ys )
3772
3759
# Only show one tool handle at the start and end vertex of the polygon
3773
3760
# if the polygon is completed or the user is locked on to the start
3774
3761
# vertex.
3775
3762
if (self ._selection_completed
3776
- or (len (self ._xs ) > 3
3777
- and self ._xs [- 1 ] == self ._xs [0 ]
3778
- and self ._ys [- 1 ] == self ._ys [0 ])):
3779
- self ._polygon_handles .set_data (self ._xs [:- 1 ], self ._ys [:- 1 ])
3763
+ or (len (self ._xys ) > 3
3764
+ and self ._xys [- 1 ] == self ._xys [0 ])):
3765
+ self ._polygon_handles .set_data (xs [:- 1 ], ys [:- 1 ])
3780
3766
else :
3781
- self ._polygon_handles .set_data (self . _xs , self . _ys )
3767
+ self ._polygon_handles .set_data (xs , ys )
3782
3768
self .update ()
3783
3769
3784
3770
@property
3785
3771
def verts (self ):
3786
3772
"""The polygon vertices, as a list of ``(x, y)`` pairs."""
3787
- return list ( zip ( self ._xs [:- 1 ], self . _ys [: - 1 ]))
3773
+ return self ._xys [:- 1 ]
3788
3774
3789
3775
@verts .setter
3790
3776
def verts (self , xys ):
@@ -3794,10 +3780,7 @@ def verts(self, xys):
3794
3780
This will remove any pre-existing vertices, creating a complete polygon
3795
3781
with the new vertices.
3796
3782
"""
3797
- self ._xs = [xy [0 ] for xy in xys ]
3798
- self ._xs .append (self ._xs [0 ])
3799
- self ._ys = [xy [1 ] for xy in xys ]
3800
- self ._ys .append (self ._ys [0 ])
3783
+ self ._xys = [* xys , xys [0 ]]
3801
3784
self ._selection_completed = True
3802
3785
self .set_visible (True )
3803
3786
self ._draw_polygon ()
0 commit comments