1+ import AbstractImageMapper , {
2+ vtkAbstractImageMapper ,
3+ } from '@kitware/vtk.js/Rendering/Core/AbstractImageMapper' ;
4+ import vtkImageArrayMapper from '@kitware/vtk.js/Rendering/Core/ImageArrayMapper' ;
15import vtkImageMapper , {
26 IImageMapperInitialValues ,
37} from '@kitware/vtk.js/Rendering/Core/ImageMapper' ;
@@ -9,6 +13,7 @@ import { Vector2 } from '@kitware/vtk.js/types';
913import {
1014 forwardRef ,
1115 PropsWithChildren ,
16+ useCallback ,
1217 useEffect ,
1318 useImperativeHandle ,
1419 useMemo ,
@@ -38,6 +43,11 @@ export interface SliceRepresentationProps extends PropsWithChildren {
3843 */
3944 mapper ?: IImageMapperInitialValues ;
4045
46+ /**
47+ * An opational mapper instanc
48+ */
49+ mapperInstance ?: AbstractImageMapper ;
50+
4151 /**
4252 * Properties to set to the slice/actor
4353 */
@@ -94,6 +104,18 @@ const DefaultProps = {
94104 colorDataRange : 'auto' as const ,
95105} ;
96106
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+
97119export default forwardRef ( function SliceRepresentation (
98120 props : SliceRepresentationProps ,
99121 fwdRef
@@ -117,12 +139,20 @@ export default forwardRef(function SliceRepresentation(
117139
118140 // --- mapper --- //
119141
120- const getMapper = useMapper (
142+ const getInternalMapper = useMapper (
121143 ( ) => vtkImageMapper . newInstance ( ) ,
122144 props . mapper ,
123145 trackModified
124146 ) ;
125147
148+ const { mapperInstance } = props ;
149+ const getMapper = useCallback < ( ) => vtkAbstractImageMapper > ( ( ) => {
150+ if ( mapperInstance ) {
151+ return mapperInstance ;
152+ }
153+ return getInternalMapper ( ) ;
154+ } , [ mapperInstance , getInternalMapper ] ) ;
155+
126156 // --- actor --- //
127157
128158 const actorProps = {
@@ -137,7 +167,8 @@ export default forwardRef(function SliceRepresentation(
137167 } ) ;
138168
139169 useEffect ( ( ) => {
140- getActor ( ) . setMapper ( getMapper ( ) ) ;
170+ // workaround for vtkImageSlice.setMapper only taking vtkImageMapper
171+ getActor ( ) . setMapper ( getMapper ( ) as vtkImageMapper ) ;
141172 } , [ getActor , getMapper ] ) ;
142173
143174 useEffect ( ( ) => {
@@ -160,30 +191,58 @@ export default forwardRef(function SliceRepresentation(
160191
161192 const { iSlice, jSlice, kSlice, xSlice, ySlice, zSlice } = props ;
162193
194+ // --- vtkImageMapper setSlice --- //
195+
163196 useEffect ( ( ) => {
164- if ( iSlice != null ) trackModified ( getMapper ( ) . setISlice ( iSlice ) ) ;
197+ const mapper = getMapper ( ) ;
198+ if ( isVtkImageMapper ( mapper ) && iSlice != null )
199+ trackModified ( mapper . setISlice ( iSlice ) ) ;
165200 } , [ iSlice , getMapper , trackModified ] ) ;
166201
167202 useEffect ( ( ) => {
168- if ( jSlice != null ) trackModified ( getMapper ( ) . setJSlice ( jSlice ) ) ;
203+ const mapper = getMapper ( ) ;
204+ if ( isVtkImageMapper ( mapper ) && jSlice != null )
205+ trackModified ( mapper . setJSlice ( jSlice ) ) ;
169206 } , [ jSlice , getMapper , trackModified ] ) ;
170207
171208 useEffect ( ( ) => {
172- if ( kSlice != null ) trackModified ( getMapper ( ) . setKSlice ( kSlice ) ) ;
209+ const mapper = getMapper ( ) ;
210+ if ( isVtkImageMapper ( mapper ) && kSlice != null )
211+ trackModified ( mapper . setKSlice ( kSlice ) ) ;
173212 } , [ kSlice , getMapper , trackModified ] ) ;
174213
175214 useEffect ( ( ) => {
176- if ( xSlice != null ) trackModified ( getMapper ( ) . setXSlice ( xSlice ) ) ;
215+ const mapper = getMapper ( ) ;
216+ if ( isVtkImageMapper ( mapper ) && xSlice != null )
217+ trackModified ( mapper . setXSlice ( xSlice ) ) ;
177218 } , [ xSlice , getMapper , trackModified ] ) ;
178219
179220 useEffect ( ( ) => {
180- if ( ySlice != null ) trackModified ( getMapper ( ) . setYSlice ( ySlice ) ) ;
221+ const mapper = getMapper ( ) ;
222+ if ( isVtkImageMapper ( mapper ) && ySlice != null )
223+ trackModified ( mapper . setYSlice ( ySlice ) ) ;
181224 } , [ ySlice , getMapper , trackModified ] ) ;
182225
183226 useEffect ( ( ) => {
184- if ( zSlice != null ) trackModified ( getMapper ( ) . setZSlice ( zSlice ) ) ;
227+ const mapper = getMapper ( ) ;
228+ if ( isVtkImageMapper ( mapper ) && zSlice != null )
229+ trackModified ( mapper . setZSlice ( zSlice ) ) ;
185230 } , [ zSlice , getMapper , trackModified ] ) ;
186231
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+
187246 // --- //
188247
189248 const renderer = useRendererContext ( ) ;
0 commit comments