Skip to content

Commit b07b3d4

Browse files
fix(views): fix registration of builtin displayable managers
- Add vtkMRMLLinearTransformsDisplayableManager to handle linear transform widget creation. - Add vtkMRMLColorLegendDisplayableManager to handle color legend display. - Add back rendering for interactive tests
1 parent 57266d8 commit b07b3d4

File tree

7 files changed

+64
-18
lines changed

7 files changed

+64
-18
lines changed

.github/workflows/test_and_merge.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ jobs:
7070
pip install .[dev]
7171
playwright install
7272
playwright install-deps
73-
pytest -s ./tests --cov=trame_slicer --cov-report=xml --cov-report=term-missing
73+
pytest -s ./tests --cov=trame_slicer --cov-report=json --cov-report=term-missing
7474
7575
- name: Upload Coverage to Codecov
7676
uses: codecov/codecov-action@v4
7777
with:
78-
files: ./coverage.xml
78+
files: ./coverage.json
7979
token: ${{ secrets.CODECOV_TOKEN }}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,6 @@ __pycache__
2525
*egg-info
2626
*pyc
2727
/dist
28+
29+
coverage.*
30+
/.coverage

tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ def a_segment_id(a_segmentation_editor, an_active_segmentation):
5252

5353

5454
@pytest.fixture
55-
def a_view_factory():
56-
return DirectViewFactory()
55+
def a_view_factory(render_interactive):
56+
return DirectViewFactory(do_render_offscreen=not bool(render_interactive))
5757

5858

5959
@pytest.fixture

tests/direct_view_factory.py

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ class _View(Generic[AbstractViewChild]):
2121

2222

2323
class DirectViewFactory(IViewFactory):
24+
def __init__(self, do_render_offscreen: bool):
25+
super().__init__()
26+
self._do_render_offscreen = do_render_offscreen
27+
2428
def can_create_view(self, _view: ViewLayoutDefinition) -> bool:
2529
return True
2630

@@ -31,25 +35,36 @@ def _create_view(
3135
app_logic: vtkMRMLApplicationLogic,
3236
) -> V:
3337
if view.view_type == ViewType.SLICE_VIEW:
34-
slice_view = SliceView(
38+
slice_view = self._create_slice_view(app_logic, scene, view)
39+
return _View(slice_view)
40+
if view.view_type == ViewType.THREE_D_VIEW:
41+
return _View(self._create_threed_view(app_logic, scene, view))
42+
return None
43+
44+
def _create_threed_view(self, app_logic, scene, view: ViewLayoutDefinition) -> ThreeDView:
45+
return self._update_offscreen_rendering(
46+
ThreeDView(
3547
scene,
3648
app_logic,
3749
view.singleton_tag,
3850
scheduled_render_strategy=DirectRendering(),
3951
)
40-
if view.properties.orientation:
41-
slice_view.set_orientation(view.properties.orientation)
42-
return _View(slice_view)
43-
if view.view_type == ViewType.THREE_D_VIEW:
44-
return _View(
45-
ThreeDView(
46-
scene,
47-
app_logic,
48-
view.singleton_tag,
49-
scheduled_render_strategy=DirectRendering(),
50-
)
51-
)
52-
return None
52+
)
53+
54+
def _create_slice_view(self, app_logic, scene, view: ViewLayoutDefinition) -> SliceView:
55+
slice_view = SliceView(
56+
scene,
57+
app_logic,
58+
view.singleton_tag,
59+
scheduled_render_strategy=DirectRendering(),
60+
)
61+
if view.properties.orientation:
62+
slice_view.set_orientation(view.properties.orientation)
63+
return self._update_offscreen_rendering(slice_view)
5364

5465
def _get_slicer_view(self, view: V) -> AbstractViewChild:
5566
return view.slicer_view
67+
68+
def _update_offscreen_rendering(self, view: AbstractViewChild) -> AbstractViewChild:
69+
view.render_window().SetOffScreenRendering(self._do_render_offscreen)
70+
return view

tests/test_transform_node.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import pytest
2+
3+
from tests.conftest import a_slice_view, a_threed_view
4+
5+
6+
@pytest.mark.parametrize("view", [a_threed_view, a_slice_view])
7+
def test_linear_transform_widget_can_be_displayed_in_views(view, request, a_slicer_app, render_interactive):
8+
view = request.getfixturevalue(view.__name__)
9+
10+
transform_node = a_slicer_app.scene.AddNewNodeByClass("vtkMRMLLinearTransformNode")
11+
assert transform_node
12+
13+
transform_node.CreateDefaultDisplayNodes()
14+
display_node = transform_node.GetDisplayNode()
15+
assert display_node
16+
17+
display_node.SetEditorVisibility(True)
18+
19+
if render_interactive:
20+
view.start_interactor()

trame_slicer/views/slice_view.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import vtk
77
from slicer import (
88
vtkMRMLApplicationLogic,
9+
vtkMRMLColorLegendDisplayableManager,
910
vtkMRMLCrosshairDisplayableManager,
1011
vtkMRMLLayerDisplayableManager,
12+
vtkMRMLLinearTransformsDisplayableManager,
1113
vtkMRMLMarkupsDisplayableManager,
1214
vtkMRMLModelSliceDisplayableManager,
1315
vtkMRMLOrientationMarkerDisplayableManager,
@@ -124,6 +126,8 @@ def __init__(
124126
vtkMRMLMarkupsDisplayableManager,
125127
vtkMRMLTransformsDisplayableManager2D,
126128
vtkMRMLLayerDisplayableManager,
129+
vtkMRMLLinearTransformsDisplayableManager,
130+
vtkMRMLColorLegendDisplayableManager,
127131
]
128132
self._initialize_displayable_manager_group(vtkMRMLSliceViewDisplayableManagerFactory, app_logic, managers)
129133
self.name = name

trame_slicer/views/threed_view.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
vtkMRMLApplicationLogic,
88
vtkMRMLCameraDisplayableManager,
99
vtkMRMLCameraNode,
10+
vtkMRMLColorLegendDisplayableManager,
1011
vtkMRMLCrosshairDisplayableManager,
1112
vtkMRMLCrosshairDisplayableManager3D,
1213
vtkMRMLCrosshairNode,
1314
vtkMRMLLayerDisplayableManager,
15+
vtkMRMLLinearTransformsDisplayableManager,
1416
vtkMRMLMarkupsDisplayableManager,
1517
vtkMRMLModelDisplayableManager,
1618
vtkMRMLOrientationMarkerDisplayableManager,
@@ -96,6 +98,8 @@ def __init__(
9698
vtkMRMLMarkupsDisplayableManager,
9799
vtkMRMLTransformsDisplayableManager3D,
98100
vtkMRMLLayerDisplayableManager,
101+
vtkMRMLLinearTransformsDisplayableManager,
102+
vtkMRMLColorLegendDisplayableManager,
99103
]
100104

101105
self._initialize_displayable_manager_group(vtkMRMLThreeDViewDisplayableManagerFactory, app_logic, managers)

0 commit comments

Comments
 (0)