@@ -3640,21 +3640,20 @@ def __init__(self, ax, onselect, useblit=False,
3640
3640
super ().__init__ (ax , onselect , useblit = useblit ,
3641
3641
state_modifier_keys = state_modifier_keys )
3642
3642
3643
- self ._xs , self . _ys = [0 ], [ 0 ]
3643
+ self ._xys = [( 0 , 0 ) ]
3644
3644
3645
3645
if props is None :
3646
3646
props = dict (color = 'k' , linestyle = '-' , linewidth = 2 , alpha = 0.5 )
3647
3647
props ['animated' ] = self .useblit
3648
3648
self ._props = props
3649
- line = Line2D (self . _xs , self . _ys , ** self ._props )
3649
+ self . _selection_artist = line = Line2D ([], [] , ** self ._props )
3650
3650
self .ax .add_line (line )
3651
- self ._selection_artist = line
3652
3651
3653
3652
if handle_props is None :
3654
3653
handle_props = dict (markeredgecolor = 'k' ,
3655
3654
markerfacecolor = self ._props .get ('color' , 'k' ))
3656
3655
self ._handle_props = handle_props
3657
- self ._polygon_handles = ToolHandles (self .ax , self . _xs , self . _ys ,
3656
+ self ._polygon_handles = ToolHandles (self .ax , [], [] ,
3658
3657
useblit = self .useblit ,
3659
3658
marker_props = self ._handle_props )
3660
3659
@@ -3725,10 +3724,9 @@ def _scale_polygon(self, event):
3725
3724
.scale (w1 , h1 )
3726
3725
.translate (x1 , y1 ))
3727
3726
3728
- # Update polygon verts
3729
- new_verts = t .transform (np .array (self .verts ))
3730
- self ._xs = list (np .append (new_verts [:, 0 ], new_verts [0 , 0 ]))
3731
- self ._ys = list (np .append (new_verts [:, 1 ], new_verts [0 , 1 ]))
3727
+ # Update polygon verts. Must be a list of tuples for consistency.
3728
+ new_verts = [(x , y ) for x , y in t .transform (np .array (self .verts ))]
3729
+ self ._xys = [* new_verts , new_verts [0 ]]
3732
3730
self ._draw_polygon ()
3733
3731
self ._old_box_extents = self ._box .extents
3734
3732
@@ -3742,33 +3740,25 @@ def _scale_polygon(self, event):
3742
3740
lambda self , value : setattr (self , "grab_range" , value ))
3743
3741
)
3744
3742
3745
- @property
3746
- def _nverts (self ):
3747
- return len (self ._xs )
3748
-
3749
3743
@property
3750
3744
def _handles_artists (self ):
3751
3745
return self ._polygon_handles .artists
3752
3746
3753
3747
def _remove_vertex (self , i ):
3754
3748
"""Remove vertex with index i."""
3755
- if (self ._nverts > 2 and
3749
+ if (len ( self ._xys ) > 2 and
3756
3750
self ._selection_completed and
3757
- i in (0 , self ._nverts - 1 )):
3751
+ i in (0 , len ( self ._xys ) - 1 )):
3758
3752
# If selecting the first or final vertex, remove both first and
3759
3753
# last vertex as they are the same for a closed polygon
3760
- self ._xs .pop (0 )
3761
- self ._ys .pop (0 )
3762
- self ._xs .pop (- 1 )
3763
- self ._ys .pop (- 1 )
3754
+ self ._xys .pop (0 )
3755
+ self ._xys .pop (- 1 )
3764
3756
# Close the polygon again by appending the new first vertex to the
3765
3757
# end
3766
- self ._xs .append (self ._xs [0 ])
3767
- self ._ys .append (self ._ys [0 ])
3758
+ self ._xys .append (self ._xys [0 ])
3768
3759
else :
3769
- self ._xs .pop (i )
3770
- self ._ys .pop (i )
3771
- if self ._nverts <= 2 :
3760
+ self ._xys .pop (i )
3761
+ if len (self ._xys ) <= 2 :
3772
3762
# If only one point left, return to incomplete state to let user
3773
3763
# start drawing again
3774
3764
self ._selection_completed = False
@@ -3778,13 +3768,13 @@ def _press(self, event):
3778
3768
"""Button press event handler."""
3779
3769
# Check for selection of a tool handle.
3780
3770
if ((self ._selection_completed or 'move_vertex' in self ._state )
3781
- and len (self ._xs ) > 0 ):
3771
+ and len (self ._xys ) > 0 ):
3782
3772
h_idx , h_dist = self ._polygon_handles .closest (event .x , event .y )
3783
3773
if h_dist < self .grab_range :
3784
3774
self ._active_handle_idx = h_idx
3785
3775
# Save the vertex positions at the time of the press event (needed to
3786
3776
# support the 'move_all' state modifier).
3787
- self ._xs_at_press , self . _ys_at_press = self ._xs . copy (), self . _ys .copy ()
3777
+ self ._xys_at_press = self ._xys .copy ()
3788
3778
3789
3779
def _release (self , event ):
3790
3780
"""Button release event handler."""
@@ -3796,9 +3786,7 @@ def _release(self, event):
3796
3786
self ._active_handle_idx = - 1
3797
3787
3798
3788
# Complete the polygon.
3799
- elif (len (self ._xs ) > 3
3800
- and self ._xs [- 1 ] == self ._xs [0 ]
3801
- and self ._ys [- 1 ] == self ._ys [0 ]):
3789
+ elif len (self ._xys ) > 3 and self ._xys [- 1 ] == self ._xys [0 ]:
3802
3790
self ._selection_completed = True
3803
3791
if self ._draw_box and self ._box is None :
3804
3792
self ._add_box ()
@@ -3807,8 +3795,7 @@ def _release(self, event):
3807
3795
elif (not self ._selection_completed
3808
3796
and 'move_all' not in self ._state
3809
3797
and 'move_vertex' not in self ._state ):
3810
- self ._xs .insert (- 1 , event .xdata )
3811
- self ._ys .insert (- 1 , event .ydata )
3798
+ self ._xys .insert (- 1 , (event .xdata , event .ydata ))
3812
3799
3813
3800
if self ._selection_completed :
3814
3801
self .onselect (self .verts )
@@ -3830,19 +3817,19 @@ def _onmove(self, event):
3830
3817
# Move the active vertex (ToolHandle).
3831
3818
if self ._active_handle_idx >= 0 :
3832
3819
idx = self ._active_handle_idx
3833
- self ._xs [ idx ], self . _ys [idx ] = event .xdata , event .ydata
3820
+ self ._xys [idx ] = event .xdata , event .ydata
3834
3821
# Also update the end of the polygon line if the first vertex is
3835
3822
# the active handle and the polygon is completed.
3836
3823
if idx == 0 and self ._selection_completed :
3837
- self ._xs [ - 1 ], self . _ys [- 1 ] = event .xdata , event .ydata
3824
+ self ._xys [- 1 ] = event .xdata , event .ydata
3838
3825
3839
3826
# Move all vertices.
3840
3827
elif 'move_all' in self ._state and self ._eventpress :
3841
3828
dx = event .xdata - self ._eventpress .xdata
3842
3829
dy = event .ydata - self ._eventpress .ydata
3843
- for k in range (len (self ._xs )):
3844
- self . _xs [ k ] = self ._xs_at_press [k ] + dx
3845
- self ._ys [k ] = self . _ys_at_press [ k ] + dy
3830
+ for k in range (len (self ._xys )):
3831
+ x_at_press , y_at_press = self ._xys_at_press [k ]
3832
+ self ._xys [k ] = x_at_press + dx , y_at_press + dy
3846
3833
3847
3834
# Do nothing if completed or waiting for a move.
3848
3835
elif (self ._selection_completed
@@ -3852,15 +3839,14 @@ def _onmove(self, event):
3852
3839
# Position pending vertex.
3853
3840
else :
3854
3841
# Calculate distance to the start vertex.
3855
- x0 , y0 = self ._selection_artist .get_transform ().transform (
3856
- (self ._xs [0 ], self ._ys [0 ])
3857
- )
3842
+ x0 , y0 = \
3843
+ self ._selection_artist .get_transform ().transform (self ._xys [0 ])
3858
3844
v0_dist = np .hypot (x0 - event .x , y0 - event .y )
3859
3845
# Lock on to the start vertex if near it and ready to complete.
3860
- if len (self ._xs ) > 3 and v0_dist < self .grab_range :
3861
- self ._xs [- 1 ], self . _ys [ - 1 ] = self ._xs [ 0 ], self . _ys [0 ]
3846
+ if len (self ._xys ) > 3 and v0_dist < self .grab_range :
3847
+ self ._xys [- 1 ] = self ._xys [0 ]
3862
3848
else :
3863
- self ._xs [ - 1 ], self . _ys [- 1 ] = event .xdata , event .ydata
3849
+ self ._xys [- 1 ] = event .xdata , event .ydata
3864
3850
3865
3851
self ._draw_polygon ()
3866
3852
@@ -3871,7 +3857,7 @@ def _on_key_press(self, event):
3871
3857
if (not self ._selection_completed
3872
3858
and ('move_vertex' in self ._state or
3873
3859
'move_all' in self ._state )):
3874
- self ._xs , self . _ys = self . _xs [: - 1 ], self . _ys [: - 1 ]
3860
+ self ._xys . pop ()
3875
3861
self ._draw_polygon ()
3876
3862
3877
3863
def _on_key_release (self , event ):
@@ -3882,37 +3868,36 @@ def _on_key_release(self, event):
3882
3868
and
3883
3869
(event .key == self ._state_modifier_keys .get ('move_vertex' )
3884
3870
or event .key == self ._state_modifier_keys .get ('move_all' ))):
3885
- self ._xs .append (event .xdata )
3886
- self ._ys .append (event .ydata )
3871
+ self ._xys .append ((event .xdata , event .ydata ))
3887
3872
self ._draw_polygon ()
3888
3873
# Reset the polygon if the released key is the 'clear' key.
3889
3874
elif event .key == self ._state_modifier_keys .get ('clear' ):
3890
3875
event = self ._clean_event (event )
3891
- self ._xs , self . _ys = [event .xdata ], [ event .ydata ]
3876
+ self ._xys = [( event .xdata , event .ydata ) ]
3892
3877
self ._selection_completed = False
3893
3878
self ._remove_box ()
3894
3879
self .set_visible (True )
3895
3880
3896
3881
def _draw_polygon (self ):
3897
3882
"""Redraw the polygon based on the new vertex positions."""
3898
- self ._selection_artist .set_data (self ._xs , self ._ys )
3883
+ xs , ys = zip (* self ._xys ) if self ._xys else ([], [])
3884
+ self ._selection_artist .set_data (xs , ys )
3899
3885
self ._update_box ()
3900
3886
# Only show one tool handle at the start and end vertex of the polygon
3901
3887
# if the polygon is completed or the user is locked on to the start
3902
3888
# vertex.
3903
3889
if (self ._selection_completed
3904
- or (len (self ._xs ) > 3
3905
- and self ._xs [- 1 ] == self ._xs [0 ]
3906
- and self ._ys [- 1 ] == self ._ys [0 ])):
3907
- self ._polygon_handles .set_data (self ._xs [:- 1 ], self ._ys [:- 1 ])
3890
+ or (len (self ._xys ) > 3
3891
+ and self ._xys [- 1 ] == self ._xys [0 ])):
3892
+ self ._polygon_handles .set_data (xs [:- 1 ], ys [:- 1 ])
3908
3893
else :
3909
- self ._polygon_handles .set_data (self . _xs , self . _ys )
3894
+ self ._polygon_handles .set_data (xs , ys )
3910
3895
self .update ()
3911
3896
3912
3897
@property
3913
3898
def verts (self ):
3914
3899
"""The polygon vertices, as a list of ``(x, y)`` pairs."""
3915
- return list ( zip ( self ._xs [:- 1 ], self . _ys [: - 1 ]))
3900
+ return self ._xys [:- 1 ]
3916
3901
3917
3902
@verts .setter
3918
3903
def verts (self , xys ):
@@ -3922,10 +3907,7 @@ def verts(self, xys):
3922
3907
This will remove any pre-existing vertices, creating a complete polygon
3923
3908
with the new vertices.
3924
3909
"""
3925
- self ._xs = [xy [0 ] for xy in xys ]
3926
- self ._xs .append (self ._xs [0 ])
3927
- self ._ys = [xy [1 ] for xy in xys ]
3928
- self ._ys .append (self ._ys [0 ])
3910
+ self ._xys = [* xys , xys [0 ]]
3929
3911
self ._selection_completed = True
3930
3912
self .set_visible (True )
3931
3913
self ._draw_polygon ()
0 commit comments