1
+ import AbstractImageMapper , {
2
+ vtkAbstractImageMapper ,
3
+ } from '@kitware/vtk.js/Rendering/Core/AbstractImageMapper' ;
4
+ import vtkImageArrayMapper from '@kitware/vtk.js/Rendering/Core/ImageArrayMapper' ;
1
5
import vtkImageMapper , {
2
6
IImageMapperInitialValues ,
3
7
} from '@kitware/vtk.js/Rendering/Core/ImageMapper' ;
@@ -9,6 +13,7 @@ import { Vector2 } from '@kitware/vtk.js/types';
9
13
import {
10
14
forwardRef ,
11
15
PropsWithChildren ,
16
+ useCallback ,
12
17
useEffect ,
13
18
useImperativeHandle ,
14
19
useMemo ,
@@ -38,6 +43,11 @@ export interface SliceRepresentationProps extends PropsWithChildren {
38
43
*/
39
44
mapper ?: IImageMapperInitialValues ;
40
45
46
+ /**
47
+ * An opational mapper instanc
48
+ */
49
+ mapperInstance ?: AbstractImageMapper ;
50
+
41
51
/**
42
52
* Properties to set to the slice/actor
43
53
*/
@@ -94,6 +104,18 @@ const DefaultProps = {
94
104
colorDataRange : 'auto' as const ,
95
105
} ;
96
106
107
+ function isVtkImageMapper (
108
+ mapper : vtkAbstractImageMapper
109
+ ) : mapper is vtkImageMapper {
110
+ return mapper . isA ( 'vtkImageMapper' ) ;
111
+ }
112
+
113
+ function isVtkImageArrayMapper (
114
+ mapper : vtkAbstractImageMapper
115
+ ) : mapper is vtkImageArrayMapper {
116
+ return mapper . isA ( 'vtkImageArrayMapper' ) ;
117
+ }
118
+
97
119
export default forwardRef ( function SliceRepresentation (
98
120
props : SliceRepresentationProps ,
99
121
fwdRef
@@ -117,12 +139,20 @@ export default forwardRef(function SliceRepresentation(
117
139
118
140
// --- mapper --- //
119
141
120
- const getMapper = useMapper (
142
+ const getInternalMapper = useMapper (
121
143
( ) => vtkImageMapper . newInstance ( ) ,
122
144
props . mapper ,
123
145
trackModified
124
146
) ;
125
147
148
+ const { mapperInstance } = props ;
149
+ const getMapper = useCallback < ( ) => vtkAbstractImageMapper > ( ( ) => {
150
+ if ( mapperInstance ) {
151
+ return mapperInstance ;
152
+ }
153
+ return getInternalMapper ( ) ;
154
+ } , [ mapperInstance , getInternalMapper ] ) ;
155
+
126
156
// --- actor --- //
127
157
128
158
const actorProps = {
@@ -137,7 +167,8 @@ export default forwardRef(function SliceRepresentation(
137
167
} ) ;
138
168
139
169
useEffect ( ( ) => {
140
- getActor ( ) . setMapper ( getMapper ( ) ) ;
170
+ // workaround for vtkImageSlice.setMapper only taking vtkImageMapper
171
+ getActor ( ) . setMapper ( getMapper ( ) as vtkImageMapper ) ;
141
172
} , [ getActor , getMapper ] ) ;
142
173
143
174
useEffect ( ( ) => {
@@ -160,30 +191,58 @@ export default forwardRef(function SliceRepresentation(
160
191
161
192
const { iSlice, jSlice, kSlice, xSlice, ySlice, zSlice } = props ;
162
193
194
+ // --- vtkImageMapper setSlice --- //
195
+
163
196
useEffect ( ( ) => {
164
- if ( iSlice != null ) trackModified ( getMapper ( ) . setISlice ( iSlice ) ) ;
197
+ const mapper = getMapper ( ) ;
198
+ if ( isVtkImageMapper ( mapper ) && iSlice != null )
199
+ trackModified ( mapper . setISlice ( iSlice ) ) ;
165
200
} , [ iSlice , getMapper , trackModified ] ) ;
166
201
167
202
useEffect ( ( ) => {
168
- if ( jSlice != null ) trackModified ( getMapper ( ) . setJSlice ( jSlice ) ) ;
203
+ const mapper = getMapper ( ) ;
204
+ if ( isVtkImageMapper ( mapper ) && jSlice != null )
205
+ trackModified ( mapper . setJSlice ( jSlice ) ) ;
169
206
} , [ jSlice , getMapper , trackModified ] ) ;
170
207
171
208
useEffect ( ( ) => {
172
- if ( kSlice != null ) trackModified ( getMapper ( ) . setKSlice ( kSlice ) ) ;
209
+ const mapper = getMapper ( ) ;
210
+ if ( isVtkImageMapper ( mapper ) && kSlice != null )
211
+ trackModified ( mapper . setKSlice ( kSlice ) ) ;
173
212
} , [ kSlice , getMapper , trackModified ] ) ;
174
213
175
214
useEffect ( ( ) => {
176
- if ( xSlice != null ) trackModified ( getMapper ( ) . setXSlice ( xSlice ) ) ;
215
+ const mapper = getMapper ( ) ;
216
+ if ( isVtkImageMapper ( mapper ) && xSlice != null )
217
+ trackModified ( mapper . setXSlice ( xSlice ) ) ;
177
218
} , [ xSlice , getMapper , trackModified ] ) ;
178
219
179
220
useEffect ( ( ) => {
180
- if ( ySlice != null ) trackModified ( getMapper ( ) . setYSlice ( ySlice ) ) ;
221
+ const mapper = getMapper ( ) ;
222
+ if ( isVtkImageMapper ( mapper ) && ySlice != null )
223
+ trackModified ( mapper . setYSlice ( ySlice ) ) ;
181
224
} , [ ySlice , getMapper , trackModified ] ) ;
182
225
183
226
useEffect ( ( ) => {
184
- if ( zSlice != null ) trackModified ( getMapper ( ) . setZSlice ( zSlice ) ) ;
227
+ const mapper = getMapper ( ) ;
228
+ if ( isVtkImageMapper ( mapper ) && zSlice != null )
229
+ trackModified ( mapper . setZSlice ( zSlice ) ) ;
185
230
} , [ zSlice , getMapper , trackModified ] ) ;
186
231
232
+ // --- vtkImageArrayMapper setSlice --- //
233
+
234
+ useEffect ( ( ) => {
235
+ const mapper = getMapper ( ) ;
236
+ if (
237
+ isVtkImageArrayMapper ( mapper ) &&
238
+ kSlice != null &&
239
+ kSlice !== mapper . getSlice ( )
240
+ ) {
241
+ trackModified ( true ) ;
242
+ mapper . setSlice ( kSlice ) ;
243
+ }
244
+ } , [ kSlice , getMapper , trackModified ] ) ;
245
+
187
246
// --- //
188
247
189
248
const renderer = useRendererContext ( ) ;
0 commit comments