Skip to content

Multi-series viewing - #774

Merged
PaulHax merged 39 commits into
mainfrom
multiseries-viewing
Oct 2, 2025
Merged

Multi-series viewing#774
PaulHax merged 39 commits into
mainfrom
multiseries-viewing

Conversation

@floryst

@florystfloryst commented Aug 12, 2025

Copy link
Copy Markdown
Contributor

Overview

Adds support for multi-series viewing. This fundamentally changes how VolView is used, so a lot of changes were necessary.

Underpinning this change are two core interfaces: how layouts/views are accessed and updated, and the useCurrentImage hook.

  • views are no longer fixed, since the number of views can now be changed as well as updated. Any code that needs to reference the view properties must now use the API available through the view store
  • useCurrentImage depends on the active/selected view's loaded image

Additionally, this whole change is enabled from vtkRenderWindow supporting parenting to avoid exhausting WebGL contexts.

@PaulHax I'm tapping you to review functionality in the preview deployment. Deprioritize code review (unless you have bandwidth), since it is unfortunately large.

Remaining tasks

  • address painting functionality
  • show viewed dataset name in the view itself
  • Fix Sync painting mode
  • Fix typescript build erros
  • serializaton saving and loading of session.volview.zips
  • Fix Rendering tab to layers and the rendering controls if 3d in view.
  • Fix e2e tests.
  • Fix layers.
  • Backwards compatablity of volview.zip
  • Make sure view config works with Yaml.
  • Test view maximing with double click
  • Fix oblique views
  • Maintain paint brush size per image. Paint on one image, then paint on another image, paint on first image, verify paint brush size is the same as the first stroke.
  • Check for commented out code
  • Simplify view changing dropdown
  • Make a video
  • update docs
  • Document in gh issue of segment groups and mearements being invislibe in UI if there base image view is not selected.
  • Menu option to apply a volume to all viewports with a single click.

Non-exhaustive list of changes:

commits

  • Use a vtkRenderWindow parent for single-context rendering
  • Simplify resize-to-fit auto-fit state tracking using pointerdown/up

refactors

  • useSyncWindowing is now used to synchronize windowing configs across views
  • LayoutDirection dropped in favor of using "H" and "V"
  • Layout type changed
  • useCurrentImage() now relies on activeView -> dataID
  • primaryImageID and primaryDataset is removed from dataset store
  • use of events for synchronization of state
  • layout configuration now supports updating the view type associated
    with a layout slot

fixes

  • datasets calls removeData on more stores

file changes

  • windowing.ts
    • getConfig no longer returns computed
    • syncAcrossViews is removed in favor of useSyncWindowing
  • image-stats.ts
    • getAutoRangeValues no longer returns computed
    • add removeData
  • WindowLevelControls.vue
    • Use activeView instead of the first view ID
  • doubleKeyRecord.ts
    • Add forEachEntry
  • useWindowingConfigInitializer.ts
    • drop the config initializer in favor of computing the defaults in the windowing store
  • SliceView.vue
    • fix camera initialization when reloading a dataset
  • useSlicingConfigInitializer.ts
    • drop the initializer in favor of computing the defaults in the slicing store

@netlify

netlifyBot commented Aug 12, 2025

Copy link
Copy Markdown

Deploy Preview for volview-dev ready!

NameLink
🔨 Latest commit38d61a1
🔍 Latest deploy loghttps://app.netlify.com/projects/volview-dev/deploys/68ddd9e5fd18400008c0babb
😎 Deploy Previewhttps://deploy-preview-774--volview-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@floryst
florystforce-pushed the multiseries-viewing branch from 05bb63a to c1fee60CompareAugust 13, 2025 18:15
@focus="onFocusView(item.id!, item.viewType!)"
/>
</div>
<LayoutGridItem

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Entry point for views

@PaulHaxPaulHax mentioned this pull request Aug 13, 2025
@florystfloryst mentioned this pull request Aug 19, 2025
@floryst
florystforce-pushed the multiseries-viewing branch 2 times, most recently from 07e5bb3 to dff7958CompareAugust 19, 2025 21:20
Comment threadsrc/components/ObliqueViewer.vue Outdated
Comment threadsrc/store/views.ts
Comment threadsrc/store/views.ts
@PaulHax
PaulHaxforce-pushed the multiseries-viewing branch 13 times, most recently from 27ed138 to b291137CompareSeptember 8, 2025 12:50
@PaulHax
PaulHaxforce-pushed the multiseries-viewing branch 4 times, most recently from 2ebd6ef to bbcff37CompareSeptember 16, 2025 17:43
Guards auto-fit state with pointerdown/pointerup interaction on the vtk
container.
Non-exhaustive list of changes:
commits
- Use a vtkRenderWindow parent for single-context rendering
- Simplify resize-to-fit auto-fit state tracking using pointerdown/up
refactors
- useSyncWindowing is now used to synchronize windowing configs across views
- LayoutDirection dropped in favor of using "H" and "V"
- Layout type changed
- useCurrentImage() now relies on activeView -> dataID
- primaryImageID and primaryDataset is removed from dataset store
- use of events for synchronization of state
- layout configuration now supports updating the view type associated
with a layout slot
fixes
- datasets calls removeData on more stores
file changes
- windowing.ts
- getConfig no longer returns computed
- syncAcrossViews is removed in favor of useSyncWindowing
- image-stats.ts
- getAutoRangeValues no longer returns computed
- add removeData
- WindowLevelControls.vue
- Use activeView instead of the first view ID
- doubleKeyRecord.ts
- Add forEachEntry
- useWindowingConfigInitializer.ts
- drop the config initializer in favor of computing the defaults in the windowing store
- SliceView.vue
- fix camera initialization when reloading a dataset
- useSlicingConfigInitializer.ts
- drop the initializer in favor of computing the defaults in the slicing store
- Replace old layout constants with flexible gridSize configuration
- Add e2e test for single view (1x1) layout configuration
- Update documentation to reflect new gridSize format
This change breaks the views folowing the center pan
point when the mouse drags the center pan point.
When switching between views with different volumes, the paint tool now:
- Uses spacing from the volume under the cursor for correct brush stencil shape
- Uses image data from the correct volume for threshold filtering
- Switches to the appropriate segment group for the volume being painted
- Tracks and restores the last used segment per segment group
- Creates segment groups automatically if they don't exist
- Throws error if segment group creation fails (indicates bug)
This fixes issues where:
- Brush stencil was elongated/distorted when moving between volumes with different spacing
- Threshold filtering used wrong image data
- Segment group mismatches caused "No such segment" errors
…lume views
When rasterizing polygons with multiple volumes displayed, ensure we:
- Show segments from the segment group belonging to the image where the polygon is drawn
- Switch to the correct segment group before rasterizing
- Throw clear errors instead of silently failing when segment groups are missing
This matches the fix pattern from the paint tool for multi-volume support.
- Remove v-menu wrapper for single-click operation
- Style v-select to be compact and right-aligned
- Hide ViewTypeSwitcher in oblique sub-views
Replace flexbox layout with CSS Grid to eliminate border-induced pixel offset
- Detect RT modality during DICOM parsing before ITK-WASM processing
- Skip ITK-WASM for RT files to prevent parsing errors
- Add warning notification when RT files are skipped
- Handle implicit VR with undefined length as sequences
closes#758
@PaulHax
PaulHaxforce-pushed the multiseries-viewing branch from 19ede97 to c20e79fCompareOctober 1, 2025 20:59
Changed image-stats to watch activeScalars directly instead of using
useVtkComputed. This ensures stats are computed when SEG images replace
their vtkImageData object after loading, fixing the paint tool error
when selecting segmentation files.
@PaulHax
PaulHaxforce-pushed the multiseries-viewing branch from c20e79f to ab46617CompareOctober 2, 2025 01:41
This prevents grid layout config from overriding state file user settings
@PaulHax
PaulHax added this pull request to the merge queueOct 2, 2025
Merged via the queue into main with commit ccb3c7dOct 2, 2025
6 of 7 checks passed
@zachmullen
zachmullen deleted the multiseries-viewing branch November 11, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@floryst@PaulHax