2525from matplotlib import pyplot
2626from netCDF4 import Dataset
2727from matplotlib .collections import LineCollection
28+ from datetime import datetime
2829from py_eddy_tracker .poly import create_vertice
2930from py_eddy_tracker .generic import flatten_line_matrix
3031from py_eddy_tracker import EddyParser
@@ -63,12 +64,13 @@ def merge_eddies():
6364
6465
6566class Anim :
66- def __init__ (self , eddy , intern , ** kwargs ):
67+ def __init__ (self , eddy , intern = False , sleep_event = 0.1 , ** kwargs ):
6768 self .eddy = eddy
6869 x_name , y_name = eddy .intern (intern )
6970 self .t , self .x , self .y = eddy .time , eddy [x_name ], eddy [y_name ]
7071 self .pause = False
7172 self .period = self .eddy .period
73+ self .sleep_event = sleep_event
7274 self .setup (** kwargs )
7375
7476 def setup (self , cmap = "jet" , nb_step = 25 ):
@@ -99,13 +101,16 @@ def setup(self, cmap="jet", nb_step=25):
99101 zorder = 10 ,
100102 bbox = dict (facecolor = "w" , alpha = 0.85 ),
101103 )
104+ self .display_speed = self .ax .text (
105+ x_min + 0.02 * d_x , y_max - 0.04 * d_y , "" , fontsize = 10
106+ )
102107 self .contour = LineCollection ([], zorder = 1 )
103108 self .ax .add_collection (self .contour )
104109
105110 self .fig .canvas .draw ()
106111 self .fig .canvas .mpl_connect ("key_press_event" , self .keyboard )
107112
108- def show (self , sleep_event = 0.1 , infinity_loop = False ):
113+ def show (self , infinity_loop = False ):
109114 pyplot .show (block = False )
110115 # save background for future bliting
111116 self .bg_cache = self .fig .canvas .copy_from_bbox (self .ax .bbox )
@@ -115,9 +120,17 @@ def show(self, sleep_event=0.1, infinity_loop=False):
115120 self .segs = list ()
116121 self .now = t0
117122 while True :
123+ dt = self .sleep_event
118124 if not self .pause :
125+ d0 = datetime .now ()
119126 self .next ()
120- self .fig .canvas .start_event_loop (sleep_event )
127+ dt_draw = (datetime .now () - d0 ).total_seconds ()
128+ dt = self .sleep_event - dt_draw
129+ if dt < 0 :
130+ self .sleep_event = dt_draw * 1.01
131+ dt = 1e-10
132+ self .fig .canvas .start_event_loop (dt )
133+
121134 if self .now > t1 :
122135 break
123136 if infinity_loop :
@@ -149,8 +162,10 @@ def draw_contour(self):
149162 self .contour .set_paths (self .segs )
150163 self .contour .set_color (self .colors [- len (self .segs ) :])
151164 self .txt .set_text (f"{ t0 } -> { self .now } -> { t1 } " )
165+ self .display_speed .set_text (f"{ 1 / self .sleep_event :.0f} frame/s" )
152166 self .ax .draw_artist (self .contour )
153167 self .ax .draw_artist (self .txt )
168+ self .ax .draw_artist (self .display_speed )
154169 # Remove first segment to keep only T contour
155170 if len (self .segs ) > self .nb_step :
156171 self .segs .pop (0 )
@@ -162,6 +177,10 @@ def keyboard(self, event):
162177 exit ()
163178 elif event .key == " " :
164179 self .pause = not self .pause
180+ elif event .key == "+" :
181+ self .sleep_event *= 0.9
182+ elif event .key == "-" :
183+ self .sleep_event *= 1.1
165184 elif event .key == "right" and self .pause :
166185 self .next ()
167186 elif event .key == "left" and self .pause :
@@ -172,7 +191,8 @@ def keyboard(self, event):
172191
173192def anim ():
174193 parser = EddyParser (
175- "Anim eddy, keyboard shortcut : Escape => exit, SpaceBar => pause, left arrow => t - 1, right arrow => t + 1"
194+ """Anim eddy, keyboard shortcut : Escape => exit, SpaceBar => pause,
195+ left arrow => t - 1, right arrow => t + 1, + => speed increase of 10 %, - => speed decrease of 10 %"""
176196 )
177197 parser .add_argument ("filename" , help = "eddy atlas" )
178198 parser .add_argument ("id" , help = "Track id to anim" , type = int )
@@ -195,8 +215,16 @@ def anim():
195215 "--infinity_loop" , action = "store_true" , help = "Press Escape key to stop loop"
196216 )
197217 args = parser .parse_args ()
218+ variables = ["time" , "track" ]
219+ variables .extend (TrackEddiesObservations .intern (args .intern , public_label = True ))
198220
199- atlas = TrackEddiesObservations .load_file (args .filename )
221+ atlas = TrackEddiesObservations .load_file (args .filename , include_vars = variables )
200222 eddy = atlas .extract_ids ([args .id ])
201- a = Anim (eddy , intern = args .intern , cmap = args .cmap , nb_step = args .keep_step )
202- a .show (sleep_event = args .time_sleep , infinity_loop = args .infinity_loop )
223+ a = Anim (
224+ eddy ,
225+ intern = args .intern ,
226+ sleep_event = args .time_sleep ,
227+ cmap = args .cmap ,
228+ nb_step = args .keep_step ,
229+ )
230+ a .show (infinity_loop = args .infinity_loop )
0 commit comments