arrayview 0.26.0__py3-none-any.whl → 0.26.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
arrayview/__init__.py CHANGED
@@ -1,4 +1,5 @@
1
- __version__ = "0.25.1"
1
+ import importlib.metadata as _metadata
2
+ __version__ = _metadata.version("arrayview")
2
3
 
3
4
  __all__ = [
4
5
  "TrainingMonitor",
arrayview/_io.py CHANGED
@@ -38,6 +38,15 @@ def _fix_mat_complex(arr):
38
38
  return arr
39
39
 
40
40
 
41
+ def _is_viewable_mat_array(value):
42
+ """True for MATLAB arrays ArrayView can display directly."""
43
+ return (
44
+ isinstance(value, np.ndarray)
45
+ and value.ndim >= 1
46
+ and value.dtype.kind in ("b", "i", "u", "f", "c")
47
+ )
48
+
49
+
41
50
  def list_npz_keys(filepath):
42
51
  """Return [{key, shape, dtype}] for each ndarray in an .npz file.
43
52
 
@@ -67,7 +76,7 @@ def list_mat_keys(filepath):
67
76
  for k, v in mat.items():
68
77
  if k.startswith("_"):
69
78
  continue
70
- if isinstance(v, np.ndarray) and v.ndim >= 1 and v.dtype.kind in ("b", "i", "u", "f", "c"):
79
+ if _is_viewable_mat_array(v):
71
80
  keys.append({"key": k, "shape": list(v.shape), "dtype": str(v.dtype)})
72
81
  return keys
73
82
  except NotImplementedError:
@@ -95,6 +104,12 @@ def list_array_keys(filepath):
95
104
  return []
96
105
 
97
106
 
107
+ def default_array_key(filepath):
108
+ """Return the first selectable array key for multi-array formats, if any."""
109
+ keys = list_array_keys(filepath)
110
+ return keys[0]["key"] if keys else None
111
+
112
+
98
113
  def _select_npz_array(npz, filepath):
99
114
  """Load the first array from a multi-array .npz file.
100
115
 
@@ -233,7 +248,7 @@ def load_data(filepath, key=None):
233
248
  arrays = {
234
249
  k: v
235
250
  for k, v in mat.items()
236
- if not k.startswith("_") and isinstance(v, np.ndarray)
251
+ if not k.startswith("_") and _is_viewable_mat_array(v)
237
252
  }
238
253
  if key is not None:
239
254
  return _fix_mat_complex(arrays[key])
arrayview/_launcher.py CHANGED
@@ -2717,7 +2717,7 @@ def _serve_daemon(
2717
2717
  _array_keys = list_array_keys(filepath)
2718
2718
  except Exception:
2719
2719
  pass
2720
- _load_key = _array_keys[0]["key"] if _array_keys and len(_array_keys) > 1 else None
2720
+ _load_key = _array_keys[0]["key"] if _array_keys else None
2721
2721
  data, spatial_meta = load_data_with_meta(filepath, key=_load_key)
2722
2722
  if cleanup:
2723
2723
  try:
@@ -3187,12 +3187,12 @@ def arrayview():
3187
3187
  )
3188
3188
  print(f"SESSION:{info}", file=sys.stderr)
3189
3189
  elif args.files:
3190
- from arrayview._io import load_data
3190
+ from arrayview._io import default_array_key, load_data
3191
3191
  from arrayview._session import SESSIONS, Session
3192
3192
 
3193
3193
  # First file is the main array
3194
3194
  base_path = args.files[0]
3195
- data = load_data(base_path)
3195
+ data = load_data(base_path, key=default_array_key(base_path))
3196
3196
  session = Session(
3197
3197
  data=data,
3198
3198
  filepath=base_path,
@@ -3205,7 +3205,10 @@ def arrayview():
3205
3205
  if getattr(args, "vectorfield", None):
3206
3206
  from arrayview._vectorfield import _configure_vectorfield
3207
3207
 
3208
- vf_data = load_data(args.vectorfield)
3208
+ vf_data = load_data(
3209
+ args.vectorfield,
3210
+ key=default_array_key(args.vectorfield),
3211
+ )
3209
3212
  _configure_vectorfield(
3210
3213
  session, vf_data,
3211
3214
  getattr(args, "vectorfield_components_dim", None),
@@ -3216,7 +3219,7 @@ def arrayview():
3216
3219
  # Load overlay(s) as separate sessions
3217
3220
  overlay_sids = []
3218
3221
  for ov_path in (getattr(args, "overlay", None) or []):
3219
- ov_data = load_data(ov_path)
3222
+ ov_data = load_data(ov_path, key=default_array_key(ov_path))
3220
3223
  ov_session = Session(
3221
3224
  data=ov_data,
3222
3225
  filepath=ov_path,
@@ -3232,7 +3235,7 @@ def arrayview():
3232
3235
  if getattr(args, "compare", None):
3233
3236
  compare_paths.append(args.compare)
3234
3237
  for cp in compare_paths:
3235
- cmp_data = load_data(cp)
3238
+ cmp_data = load_data(cp, key=default_array_key(cp))
3236
3239
  cmp_session = Session(
3237
3240
  data=cmp_data,
3238
3241
  filepath=cp,
@@ -3572,18 +3575,21 @@ def arrayview():
3572
3575
 
3573
3576
  if args.vectorfield:
3574
3577
  try:
3575
- from arrayview._io import load_data
3578
+ from arrayview._io import default_array_key, load_data
3576
3579
  from arrayview._render import _detect_rgb_axis
3577
3580
  from arrayview._vectorfield import _resolve_vfield_layout
3578
3581
 
3579
- base_data = load_data(base_file)
3582
+ base_data = load_data(base_file, key=default_array_key(base_file))
3580
3583
  image_shape = tuple(int(s) for s in base_data.shape)
3581
3584
  if args.rgb:
3582
3585
  rgb_axis = _detect_rgb_axis(image_shape)
3583
3586
  image_shape = tuple(
3584
3587
  s for i, s in enumerate(image_shape) if i != rgb_axis
3585
3588
  )
3586
- vf_data = load_data(args.vectorfield)
3589
+ vf_data = load_data(
3590
+ args.vectorfield,
3591
+ key=default_array_key(args.vectorfield),
3592
+ )
3587
3593
  layout = _resolve_vfield_layout(
3588
3594
  tuple(int(s) for s in vf_data.shape),
3589
3595
  image_shape,
arrayview/_platform.py CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import importlib.util
5
6
  import os
6
7
  import subprocess
7
8
  import sys
@@ -414,12 +415,13 @@ def _can_native_window() -> bool:
414
415
  # Plain SSH (no VS Code): the display is on the client machine, not here.
415
416
  if os.environ.get("SSH_CLIENT") or os.environ.get("SSH_CONNECTION"):
416
417
  return False
418
+ if importlib.util.find_spec("webview") is None:
419
+ return False
417
420
  if sys.platform in ("darwin", "win32"):
418
421
  return True
419
422
  # Linux/BSD: need a display server AND pywebview's GUI bindings
420
423
  if not (os.environ.get("DISPLAY") or os.environ.get("WAYLAND_DISPLAY")):
421
424
  return False
422
- import importlib.util
423
425
 
424
426
  return (
425
427
  importlib.util.find_spec("qtpy") is not None
@@ -123,8 +123,14 @@ def register_loading_routes(app, *, notify_shells, setup_rgb) -> None:
123
123
  _array_keys = await asyncio.to_thread(list_array_keys, filepath)
124
124
  if len(_array_keys) > 1 and not _key:
125
125
  return {"array_keys": _array_keys, "filepath": filepath}
126
+ if len(_array_keys) == 1 and not _key:
127
+ _key = _array_keys[0]["key"]
126
128
 
127
- data, spatial_meta = await asyncio.to_thread(load_data_with_meta, filepath, key=_key)
129
+ data, spatial_meta = await asyncio.to_thread(
130
+ load_data_with_meta,
131
+ filepath,
132
+ key=_key,
133
+ )
128
134
  except Exception as e:
129
135
  return {"error": str(e)}
130
136
  session = await asyncio.to_thread(Session, data, filepath=filepath, name=name)
@@ -115,9 +115,19 @@ def _handle_register(msg: dict) -> None:
115
115
  name = msg.get("name") or __import__("os").path.basename(file_path)
116
116
  options = msg.get("options", {})
117
117
 
118
- data, spatial_meta = load_data_with_meta(file_path)
118
+ from ._io import list_array_keys
119
+
120
+ array_keys = list_array_keys(file_path)
121
+ key = array_keys[0]["key"] if array_keys else None
122
+ data, spatial_meta = load_data_with_meta(
123
+ file_path,
124
+ key=key,
125
+ )
119
126
  session = Session(data=data, filepath=file_path, name=name)
120
127
  session.spatial_meta = spatial_meta
128
+ if len(array_keys) > 1:
129
+ session.array_keys = array_keys
130
+ session.array_filepath = file_path
121
131
  if spatial_meta is not None:
122
132
  session.original_volume = data
123
133
 
@@ -149,6 +159,48 @@ def _handle_metadata(msg: dict) -> None:
149
159
  _write_json(_build_metadata(session))
150
160
 
151
161
 
162
+ def _handle_reload_key(sid: str, msg: dict) -> None:
163
+ """Reload a session's data from a multi-array file with a different key."""
164
+ session = SESSIONS.get(sid)
165
+ if not session:
166
+ _write_error("session not found")
167
+ return
168
+ array_filepath = getattr(session, "array_filepath", None)
169
+ if not array_filepath:
170
+ _write_error("session has no array keys")
171
+ return
172
+
173
+ try:
174
+ body = json.loads(msg.get("body") or "{}")
175
+ except Exception:
176
+ _write_error("invalid JSON body")
177
+ return
178
+ key = body.get("key")
179
+ if not key:
180
+ _write_error("key is required")
181
+ return
182
+
183
+ try:
184
+ from ._io import load_data
185
+
186
+ data = load_data(array_filepath, key=key)
187
+ except Exception as e:
188
+ _write_error(str(e))
189
+ return
190
+
191
+ session.data = data
192
+ session.shape = data.shape
193
+ session.data_version += 1
194
+ session.raw_cache.clear()
195
+ session.rgba_cache.clear()
196
+ session.mosaic_cache.clear()
197
+ session._raw_bytes = 0
198
+ session._rgba_bytes = 0
199
+ session._mosaic_bytes = 0
200
+ session._estimated_mem = session._estimate_memory()
201
+ _write_json({"ok": True})
202
+
203
+
152
204
  def _handle_sessions() -> None:
153
205
  """Return list of active sessions."""
154
206
  _write_json([_session_summary(s) for s in SESSIONS.values()])
@@ -404,6 +456,8 @@ def _handle_fetch_proxy(msg: dict) -> None:
404
456
  _handle_metadata({"sid": sid})
405
457
  elif route == "clearcache" and sid:
406
458
  _handle_clearcache({"sid": sid})
459
+ elif route == "session" and len(parts) >= 3 and parts[2] == "reload-key":
460
+ _handle_reload_key(parts[1], msg)
407
461
  elif route == "sessions":
408
462
  _handle_sessions()
409
463
  elif route == "histogram" and sid:
arrayview/_viewer.html CHANGED
@@ -285,7 +285,7 @@
285
285
  .dim-size { opacity: 0.28; font-size: 0.68em; font-weight: normal; }
286
286
  .dim-hover-idx { font-size: 0.68em; font-weight: normal; color: var(--dim-hover, #777); opacity: 1; }
287
287
  .active-dim { font-weight: bold; }
288
- .playing-dim { color: var(--playing-dim); font-weight: bold; }
288
+ .playing-dim { font-weight: bold; }
289
289
  .vfield-t-dim { color: var(--vfield-t-dim); }
290
290
  .active-vfield-t { font-weight: bold; }
291
291
  .dim-sep { color: var(--muted); opacity: 0.4; font-weight: normal; }
@@ -466,8 +466,7 @@
466
466
  color: var(--text);
467
467
  -webkit-text-fill-color: var(--text);
468
468
  }
469
- .active-dim .dim-slash:not([style*="background"]),
470
- .playing-dim .dim-slash:not([style*="background"]) {
469
+ .active-dim .dim-slash:not([style*="background"]) {
471
470
  color: var(--active-dim) !important;
472
471
  -webkit-text-fill-color: var(--active-dim) !important;
473
472
  }
@@ -13784,10 +13783,9 @@
13784
13783
  const subtle = style.getPropertyValue('--subtle').trim();
13785
13784
  let fill;
13786
13785
  if (isVfieldT) fill = style.getPropertyValue('--vfield-t-dim').trim();
13787
- else if (playing) fill = style.getPropertyValue('--playing-dim').trim();
13788
13786
  else if (active) fill = style.getPropertyValue('--active-dim').trim();
13789
13787
  else fill = muted;
13790
- const unfilled = (active || playing || isVfieldT) ? `color-mix(in srgb, ${fill} 32%, ${muted})` : subtle;
13788
+ const unfilled = (active || isVfieldT) ? `color-mix(in srgb, ${fill} 32%, ${muted})` : subtle;
13791
13789
  return slashFill(pct, fill, unfilled);
13792
13790
  }
13793
13791
  /* ── JS: Info Bar and Pixel Display ───────────────────────── */
@@ -17577,24 +17575,20 @@
17577
17575
  // Transpose x and y: swap the dimension indices and flips
17578
17576
  if (shape.length < 2) return;
17579
17577
  if (multiViewActive) {
17580
- crossfade(() => {
17581
- mvViews.forEach(v => { [v.dimX, v.dimY] = [v.dimY, v.dimX]; v.seq++; });
17582
- [dim_x, dim_y] = [dim_y, dim_x];
17583
- [flip_x, flip_y] = [flip_y, flip_x];
17584
- flipDims[dim_x] = flip_x; flipDims[dim_y] = flip_y;
17585
- mvViews.forEach(v => { mvDrawFrame(v); mvRender(v); });
17586
- });
17578
+ mvViews.forEach(v => { [v.dimX, v.dimY] = [v.dimY, v.dimX]; v.seq++; });
17579
+ [dim_x, dim_y] = [dim_y, dim_x];
17580
+ [flip_x, flip_y] = [flip_y, flip_x];
17581
+ flipDims[dim_x] = flip_x; flipDims[dim_y] = flip_y;
17582
+ mvViews.forEach(v => { mvDrawFrame(v); mvRender(v); });
17587
17583
  showStatus('transposed x/y (all panes)');
17588
17584
  if (typeof _cropReconcileBindings === 'function') _cropReconcileBindings();
17589
17585
  return;
17590
17586
  }
17591
17587
  const wasMosaic = dim_z >= 0;
17592
- crossfade(() => {
17593
- [dim_x, dim_y] = [dim_y, dim_x];
17594
- [flip_x, flip_y] = [flip_y, flip_x];
17595
- if (!wasMosaic) dim_z = -1;
17596
- updateView(); triggerPreload();
17597
- });
17588
+ [dim_x, dim_y] = [dim_y, dim_x];
17589
+ [flip_x, flip_y] = [flip_y, flip_x];
17590
+ if (!wasMosaic) dim_z = -1;
17591
+ updateView(); triggerPreload();
17598
17592
  showStatus(wasMosaic ? 'transposed x/y (mosaic)' : 'transposed x/y');
17599
17593
  if (typeof _cropReconcileBindings === 'function') _cropReconcileBindings();
17600
17594
  },
@@ -17605,34 +17599,32 @@
17605
17599
  run: (ctx, e) => {
17606
17600
  if (_segMode) { _segReset(); return; }
17607
17601
  if (multiViewActive) {
17608
- crossfade(() => {
17609
- const oldDimX = dim_x, oldDimY = dim_y;
17610
- dim_x = oldDimY; dim_y = oldDimX;
17611
- const ofx = flipDims[oldDimX] || false, ofy = flipDims[oldDimY] || false;
17612
- flipDims[dim_x] = ofy; flipDims[dim_y] = !ofx;
17613
- const third = mvDims.find(d => d !== oldDimX && d !== oldDimY);
17614
- mvDims = [dim_y, dim_x, third];
17615
- const newDefs = [
17616
- { dimX: mvDims[1], dimY: mvDims[0], sliceDir: mvDims[2] },
17617
- { dimX: mvDims[2], dimY: mvDims[0], sliceDir: mvDims[1] },
17618
- { dimX: mvDims[2], dimY: mvDims[1], sliceDir: mvDims[0] },
17619
- ];
17620
- mvViews.forEach((v, i) => {
17621
- v.dimX = newDefs[i].dimX; v.dimY = newDefs[i].dimY;
17622
- v.sliceDir = newDefs[i].sliceDir;
17623
- v.seq++;
17624
- });
17625
- mvViews.forEach(v => { mvDrawFrame(v); mvRender(v); });
17626
- const _axLetters = ['x', 'y', 'z'];
17627
- mvViews.forEach((v, i) => {
17628
- const newX = _axLetters[mvDims.indexOf(v.dimX)] || '?';
17629
- const newY = _axLetters[mvDims.indexOf(v.dimY)] || '?';
17630
- v.axLblX = newX; v.axLblY = newY;
17631
- if (v.axesSvg) {
17632
- v.axesSvg.querySelector('.axes-lbl-x').textContent = newX;
17633
- v.axesSvg.querySelector('.axes-lbl-y').textContent = newY;
17634
- }
17635
- });
17602
+ const oldDimX = dim_x, oldDimY = dim_y;
17603
+ dim_x = oldDimY; dim_y = oldDimX;
17604
+ const ofx = flipDims[oldDimX] || false, ofy = flipDims[oldDimY] || false;
17605
+ flipDims[dim_x] = ofy; flipDims[dim_y] = !ofx;
17606
+ const third = mvDims.find(d => d !== oldDimX && d !== oldDimY);
17607
+ mvDims = [dim_y, dim_x, third];
17608
+ const newDefs = [
17609
+ { dimX: mvDims[1], dimY: mvDims[0], sliceDir: mvDims[2] },
17610
+ { dimX: mvDims[2], dimY: mvDims[0], sliceDir: mvDims[1] },
17611
+ { dimX: mvDims[2], dimY: mvDims[1], sliceDir: mvDims[0] },
17612
+ ];
17613
+ mvViews.forEach((v, i) => {
17614
+ v.dimX = newDefs[i].dimX; v.dimY = newDefs[i].dimY;
17615
+ v.sliceDir = newDefs[i].sliceDir;
17616
+ v.seq++;
17617
+ });
17618
+ mvViews.forEach(v => { mvDrawFrame(v); mvRender(v); });
17619
+ const _axLetters = ['x', 'y', 'z'];
17620
+ mvViews.forEach((v, i) => {
17621
+ const newX = _axLetters[mvDims.indexOf(v.dimX)] || '?';
17622
+ const newY = _axLetters[mvDims.indexOf(v.dimY)] || '?';
17623
+ v.axLblX = newX; v.axLblY = newY;
17624
+ if (v.axesSvg) {
17625
+ v.axesSvg.querySelector('.axes-lbl-x').textContent = newX;
17626
+ v.axesSvg.querySelector('.axes-lbl-y').textContent = newY;
17627
+ }
17636
17628
  });
17637
17629
  showStatus('rotated 90°');
17638
17630
  renderInfo(); saveState();
@@ -17645,11 +17637,9 @@
17645
17637
  if (lastImageData) ctx.putImageData(applyFlips(lastImageData, lastImgW, lastImgH), 0, 0);
17646
17638
  renderInfo(); saveState();
17647
17639
  } else {
17648
- crossfade(() => {
17649
- const [odx, ody, ofx, ofy] = [dim_x, dim_y, flip_x, flip_y];
17650
- dim_x = ody; dim_y = odx; flip_x = ofy; flip_y = !ofx;
17651
- updateView(); triggerPreload();
17652
- });
17640
+ const [odx, ody, ofx, ofy] = [dim_x, dim_y, flip_x, flip_y];
17641
+ dim_x = ody; dim_y = odx; flip_x = ofy; flip_y = !ofx;
17642
+ updateView(); triggerPreload();
17653
17643
  showStatus('rotated 90°'); saveState();
17654
17644
  }
17655
17645
  if (typeof _cropReconcileBindings === 'function') _cropReconcileBindings();
@@ -21058,7 +21048,7 @@
21058
21048
 
21059
21049
  /* ── JS: Keyboard Shortcuts ───────────────────────────────── */
21060
21050
 
21061
- sink.addEventListener('keydown', async (e) => {
21051
+ function _handleViewerShortcutKeydown(e) {
21062
21052
  e.preventDefault();
21063
21053
  e.stopImmediatePropagation();
21064
21054
  if (_cmapPickerOpen) {
@@ -21146,7 +21136,14 @@
21146
21136
  document.getElementById('info-overlay').classList.remove('visible');
21147
21137
  return;
21148
21138
  }
21149
- });
21139
+ }
21140
+
21141
+ sink.addEventListener('keydown', _handleViewerShortcutKeydown);
21142
+ document.addEventListener('keydown', (e) => {
21143
+ if (e.target === sink) return;
21144
+ if (_isEditableActive()) return;
21145
+ _handleViewerShortcutKeydown(e);
21146
+ }, true);
21150
21147
 
21151
21148
  // Hold-`g` finalizer. The picker handles its own commit/cancel
21152
21149
  // through armUp(); this listener just routes the keyup to it. Listen
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arrayview
3
- Version: 0.26.0
3
+ Version: 0.26.2
4
4
  Summary: Fast multi-dimensional array viewer
5
5
  Project-URL: Home, https://github.com/oscarvanderheide/arrayview
6
6
  Project-URL: Source, https://github.com/oscarvanderheide/arrayview
@@ -1,5 +1,5 @@
1
1
  arrayview/ARCHITECTURE.md,sha256=2ViMWblcjtO-u88SbPo1CVwbfq2GjqzZEHjaSioBScU,17184
2
- arrayview/__init__.py,sha256=uatWmXJuj1j41naWVWWVeoqw7mUoxjQxAJuNHgC7Wuc,640
2
+ arrayview/__init__.py,sha256=COIBnPCL1neX-3HdjVI0HPpZdiAhPNJQzqIUAniNQ-c,701
3
3
  arrayview/__main__.py,sha256=Fj5RszShrCcAS7_nIyBndtkpMI_PLBxM5GG9huzqhVs,101
4
4
  arrayview/_analysis.py,sha256=7xrW57o90J-mumu5b7TfnwHQNb8EEytkmt6uSXfiwhY,8781
5
5
  arrayview/_app.py,sha256=2lA5P4YD8zEJ-HnDiGdZUtO4uOSxRoKrs110Iq5Xl0k,5336
@@ -8,15 +8,15 @@ arrayview/_config.py,sha256=64rtArzgJGF0_ukrWlaNZWQHVRk8wiIinUQQBXoB27g,4356
8
8
  arrayview/_diff.py,sha256=mSIo1ArNxkrB0v2iUMy3dezJOlpos0xNu1V_umNUMhU,5677
9
9
  arrayview/_icon.png,sha256=a8RTAbvweLhh3hzD5eGg76Peq-KSDcS6YrCphRb_HEs,2748
10
10
  arrayview/_imaging.py,sha256=MQX1uy4m1lofOeoLDhCp6cHO5p_V5fXm4qlSu9Ykn-c,534
11
- arrayview/_io.py,sha256=MuIFqFJvnDgqZgUVBsyut-Rtnsy221B9o94Dzl9RwDo,11205
12
- arrayview/_launcher.py,sha256=Cz81KiLBhm74FlwV56sII8HKqrBTcw7sWd3apms5EpU,136405
11
+ arrayview/_io.py,sha256=z9gFRI7OneCnm5jBTLwdkDARrHF-LyqHspksYQx1lTg,11585
12
+ arrayview/_launcher.py,sha256=oToBEnso80kbGNT0G9XB7xeRd7XWs_Hi-F53wLe-68E,136733
13
13
  arrayview/_lifecycle.py,sha256=oFD05gNYAu6OBIUFcKmPfT-_Hp03KaI2oK8komUXtJY,937
14
14
  arrayview/_overlays.py,sha256=C-qDZFBOgwJQL84XxFoMAX3qyfNa2EI5N-AlOvXeoTI,1634
15
- arrayview/_platform.py,sha256=Ay3o4g22TEvSVJc-xI8yanWzdUJmMBrin4XHRSrFCR0,18162
15
+ arrayview/_platform.py,sha256=xyEksBuhg4rmHE2IKxIXt0o2J_yCbfEJfR_01micXOo,18231
16
16
  arrayview/_render.py,sha256=UCUx8YD8Q38GDTajHhnmEMUUUali-8PLvoBOHvUmaYc,28684
17
17
  arrayview/_routes_analysis.py,sha256=ipws39Q0e6ZtYsxXk4ZcbRKlD7LPAt_Iehf_kDjo1Yo,16272
18
18
  arrayview/_routes_export.py,sha256=Ha8mMO2E9TlRL5x25-ADV8_8xUiC-jRz9N1oWwgKOsg,3898
19
- arrayview/_routes_loading.py,sha256=b2Y4XuY9XX3YFBu9lGM81o63vjvonL7KjVGYf0PFY-c,17293
19
+ arrayview/_routes_loading.py,sha256=24k97guBjR6i4CnkwSF_GIlRy1c1J2kn7lyyQ64SaAk,17460
20
20
  arrayview/_routes_persistence.py,sha256=T03csHb7ppGT-8yMDf227XkqhnhjgSLYj0RW2wmg59g,17176
21
21
  arrayview/_routes_preload.py,sha256=KOsankNguxdIWmFW9iZcY9p2SvUN1mOKY7KkW1qMGcc,1729
22
22
  arrayview/_routes_query.py,sha256=2tWkpLgDDzLsdN0US0_H1_RIyTQioCires_j9gsYs5k,4735
@@ -29,11 +29,11 @@ arrayview/_segmentation.py,sha256=aENWHmefrKDScXhcZL1X3KgYXE784dpMkmFFo83qnrw,73
29
29
  arrayview/_server.py,sha256=HpgoSxW76Rp8q_BnBBtuHdrpmdzHfxVRphSoydtTkR8,7733
30
30
  arrayview/_session.py,sha256=OD3f2Q2gubZt1ftoIwfPX3SfKmCvPYy_FbplmmSnLSg,17427
31
31
  arrayview/_shell.html,sha256=xzHIB-kRX12okubZoqdrgsWDY8CCLteg5jtXxDQru8U,11624
32
- arrayview/_stdio_server.py,sha256=49wGPhPRjca3jxbqVcs2MEI2SpDhWMge8l5Bb-jdYJo,32401
32
+ arrayview/_stdio_server.py,sha256=ECwUGHuO6KUx4TlQPPzqFZoL48HOTFc0n2ckCPo69Mc,33954
33
33
  arrayview/_synthetic_mri.py,sha256=zb613sIke-yljrILKYn_f-1SB6T4XsB4f916STgAp4M,6756
34
34
  arrayview/_torch.py,sha256=13sqIMCUu_-b9SQ9KfDCExDz2UMStL87EDVjnbJxAEo,7536
35
35
  arrayview/_vectorfield.py,sha256=eDqMCMEGjO8Jdt-6Auh01cz3WD9dbF7xYUWD9xHAf1E,8115
36
- arrayview/_viewer.html,sha256=1GxoFGiXyzecj-UKEqKByWbL_g-qgKSF8U8ssEvOzYI,1538348
36
+ arrayview/_viewer.html,sha256=3-IDDxLCkeMbuIp31dR1ae8hi0ulq2QX96P8QbUyA0E,1538008
37
37
  arrayview/_vscode.py,sha256=laTHzOL6YnUsZYFX0fAR3aAMBFpPLL6cF9KArBl3nAI,988
38
38
  arrayview/_vscode_browser.py,sha256=EzYEl4ZdxD_njqIfHywqw3ovy3p2SaWX9c03Kzd_Xh0,7458
39
39
  arrayview/_vscode_extension.py,sha256=v17e4IVJkTpHmuJMhuL2VPPWwbmsCCDWnbEzdONwH3I,12953
@@ -41,8 +41,8 @@ arrayview/_vscode_shm.py,sha256=Rm5DapeorNwhnLnVz5fkXcctkQqTzii9uLxnOxxIMU4,2238
41
41
  arrayview/_vscode_signal.py,sha256=rSDPEjFeX4dl2PnlBMlVsFO_lmRhgJ7eHlNmNDY4h9U,33840
42
42
  arrayview/arrayview-opener.vsix,sha256=uxIm_06uI9RC7N54SpckwhkjIh0yKLXDv613hvJTgV0,19098
43
43
  arrayview/gsap.min.js,sha256=VGihm4idI0E1uqrWezWsiScB9F_jMosn7qs6pPSkeac,72304
44
- arrayview-0.26.0.dist-info/METADATA,sha256=bx5_z1FhDG7s5tIL3toPmXPAEXG5J0CTxsX8S_nC7SY,2161
45
- arrayview-0.26.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
46
- arrayview-0.26.0.dist-info/entry_points.txt,sha256=FQSz3M11B-zaVLDyXofKUDvMhHASz7OjmoLgI4nn7ko,105
47
- arrayview-0.26.0.dist-info/licenses/LICENSE,sha256=34OivjM9faB2QaPjZpMRTIiSx31V3U9cEyQ6F2k-bH0,1062
48
- arrayview-0.26.0.dist-info/RECORD,,
44
+ arrayview-0.26.2.dist-info/METADATA,sha256=sazLVlN3xN1zUgSTLeUfNDe26FsnvIVDaZ7chzzuSEI,2161
45
+ arrayview-0.26.2.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
46
+ arrayview-0.26.2.dist-info/entry_points.txt,sha256=FQSz3M11B-zaVLDyXofKUDvMhHASz7OjmoLgI4nn7ko,105
47
+ arrayview-0.26.2.dist-info/licenses/LICENSE,sha256=34OivjM9faB2QaPjZpMRTIiSx31V3U9cEyQ6F2k-bH0,1062
48
+ arrayview-0.26.2.dist-info/RECORD,,