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