@@ -45,8 +45,6 @@ def find_port(port=SERVER_PORT):
4545
4646
4747PORT = find_port ()
48- OPTS = None
49- EVENT = threading .Event ()
5048VIEWER = None
5149BROWSER = None
5250
@@ -68,8 +66,8 @@ def standalone_viewer(url):
6866 return view (itk_viewer = svc .viewer ())
6967
7068
71- def input_dict ():
72- user_input = read_files ()
69+ def input_dict (viewer_options ):
70+ user_input = read_files (viewer_options )
7371 data = build_init_data (user_input )
7472 ui = user_input .get ("ui" , "reference" )
7573 data ["config" ] = build_config (ui )
@@ -88,8 +86,8 @@ def input_dict():
8886 return {"data" : data }
8987
9088
91- def read_files ():
92- user_input = vars (OPTS )
89+ def read_files (viewer_options ):
90+ user_input = vars (viewer_options )
9391 reader = user_input .get ("reader" , None )
9492 for param in INPUT_OPTIONS :
9593 input = user_input .get (param , None )
@@ -107,14 +105,22 @@ def read_files():
107105 return user_input
108106
109107
110- async def viewer_ready (itk_viewer ):
111- init_viewer_kwargs = vars (OPTS )
112- settings = init_params_dict (itk_viewer )
113- for key , value in init_viewer_kwargs .items ():
114- if key in settings .keys () and value is not None :
115- settings [key ](value )
108+ class ViewerReady :
109+ def __init__ (self , viewer_options , init_params_dict ):
110+ self .init_viewer_kwargs = vars (viewer_options )
111+ self .init_params_dict = init_params_dict
112+ self .event = threading .Event ()
116113
117- EVENT .set ()
114+ async def on_ready (self , itk_viewer ):
115+ settings = self .init_params_dict (itk_viewer )
116+ for key , value in self .init_viewer_kwargs .items ():
117+ if key in settings .keys () and value is not None :
118+ settings [key ](value )
119+
120+ self .event .set ()
121+
122+ def wait (self ):
123+ self .event .wait ()
118124
119125
120126def set_label_or_image (server , type ):
@@ -127,7 +133,7 @@ def fetch_zarr_store(store_type):
127133 return getattr (VIEWER , store_type , None )
128134
129135
130- def start_viewer (server_url ):
136+ def start_viewer (server_url , viewer_options ):
131137 server = connect_to_server_sync (
132138 {
133139 "client_id" : "itkwidgets-server" ,
@@ -137,7 +143,8 @@ def start_viewer(server_url):
137143 )
138144 register_itkwasm_imjoy_codecs_cli (server )
139145
140- input_obj = input_dict ()
146+ input_obj = input_dict (viewer_options )
147+ viewer_ready = ViewerReady (viewer_options , init_params_dict )
141148 server .register_service (
142149 {
143150 "name" : "parsed_data" ,
@@ -149,7 +156,7 @@ def start_viewer(server_url):
149156 "run_in_executor" : True ,
150157 },
151158 "inputObject" : lambda : input_obj ,
152- "viewerReady" : viewer_ready ,
159+ "viewerReady" : viewer_ready . on_ready ,
153160 "fetchZarrStore" : fetch_zarr_store ,
154161 }
155162 )
@@ -168,10 +175,10 @@ def start_viewer(server_url):
168175 }
169176 )
170177
171- return server , input_obj
178+ return server , input_obj , viewer_ready
172179
173180
174- def main ():
181+ def main (viewer_options ):
175182 global VIEWER
176183 JWT_SECRET = str (uuid .uuid4 ())
177184 os .environ ["JWT_SECRET" ] = JWT_SECRET
@@ -180,8 +187,8 @@ def main():
180187 server_url = f"http://{ SERVER_HOST } :{ PORT } "
181188 viewer_mount_dir = str (Path (VIEWER_HTML ).parent )
182189
183- out = None if OPTS .verbose else subprocess .DEVNULL
184- err = None if OPTS .verbose else subprocess .STDOUT
190+ out = None if viewer_options .verbose else subprocess .DEVNULL
191+ err = None if viewer_options .verbose else subprocess .STDOUT
185192 with subprocess .Popen (
186193 [
187194 sys .executable ,
@@ -208,7 +215,7 @@ def main():
208215 timeout -= 0.1
209216 time .sleep (0.1 )
210217
211- server , input_obj = start_viewer (server_url )
218+ server , input_obj , viewer_ready = start_viewer (server_url , viewer_options )
212219 workspace = server .config .workspace
213220 token = server .generate_token ()
214221 params = urlencode ({"workspace" : workspace , "token" : token })
@@ -217,10 +224,10 @@ def main():
217224 # Updates for resolution progression
218225 rate = 1.0
219226 fast_rate = 0.05
220- if OPTS .rotate :
227+ if viewer_options .rotate :
221228 rate = fast_rate
222229
223- if OPTS .browser :
230+ if viewer_options .browser :
224231 sys .stdout .write (f"Viewer url:\n \n { url } \n \n " )
225232 webbrowser .open_new_tab (f"{ server_url } /itkwidgets/index.html?{ params } " )
226233 else :
@@ -258,15 +265,15 @@ def main():
258265 elif input_data ["y_slice" ] is None and input_data ["view_mode" ] == "YPlane" :
259266 page .locator ('label[itk-vtk-tooltip-content="Y plane play scroll"]' ).click ()
260267 rate = fast_rate
261- elif input_data ["y_slice " ] is None and input_data ["view_mode" ] == "ZPlane" :
268+ elif input_data ["z_slice " ] is None and input_data ["view_mode" ] == "ZPlane" :
262269 page .locator ('label[itk-vtk-tooltip-content="Z plane play scroll"]' ).click ()
263270 rate = fast_rate
264271
265- EVENT .wait () # Wait until viewer is created before launching REPL
272+ viewer_ready .wait () # Wait until viewer is created before launching REPL
266273 workspace = server .config .workspace
267274 svc = server .get_service (f"{ workspace } /itkwidgets-client:itk-vtk-viewer" )
268275 VIEWER = view (itk_viewer = svc .viewer (), server = server )
269- if not OPTS .browser :
276+ if not viewer_options .browser :
270277 from imgcat import imgcat
271278 terminal_height = min (terminal_size .lines - 1 , terminal_size .columns // 3 )
272279
@@ -278,7 +285,7 @@ def main():
278285 CSI = b'\033 ['
279286 sys .stdout .buffer .write (CSI + str (terminal_height ).encode () + b"F" )
280287
281- if OPTS .repl :
288+ if viewer_options .repl :
282289 banner = f"""
283290 Welcome to the itkwidgets command line tool! Press CTRL+D or
284291 run `exit()` to terminate the REPL session. Use the `viewer`
@@ -289,8 +296,6 @@ def main():
289296
290297
291298def cli_entrypoint ():
292- global OPTS
293-
294299 parser = argparse .ArgumentParser ()
295300
296301 parser .add_argument ("data" , nargs = "?" , type = str , help = "Path to a data file." )
@@ -484,14 +489,14 @@ def cli_entrypoint():
484489 )
485490 parser .add_argument ("--units" , type = str , help = "Units to display in the scale bar." )
486491
487- OPTS = parser .parse_args ()
492+ viewer_options = parser .parse_args ()
488493
489494 try :
490- main ()
495+ main (viewer_options )
491496 except KeyboardInterrupt :
492497 if BROWSER :
493498 BROWSER .close ()
494- if not OPTS .browser :
499+ if not viewer_options .browser :
495500 # Clear `^C%`
496501 CSI = b'\033 ['
497502 sys .stdout .buffer .write (CSI + b"1K" )
0 commit comments