Skip to content

Commit 9aff778

Browse files
committed
feat(SliceRepresentation): mapper instance prop
1 parent 6a1db28 commit 9aff778

File tree

1 file changed

+67
-8
lines changed

1 file changed

+67
-8
lines changed

src/core/SliceRepresentation.tsx

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import AbstractImageMapper, {
2+
vtkAbstractImageMapper,
3+
} from '@kitware/vtk.js/Rendering/Core/AbstractImageMapper';
4+
import vtkImageArrayMapper from '@kitware/vtk.js/Rendering/Core/ImageArrayMapper';
15
import vtkImageMapper, {
26
IImageMapperInitialValues,
37
} from '@kitware/vtk.js/Rendering/Core/ImageMapper';
@@ -9,6 +13,7 @@ import { Vector2 } from '@kitware/vtk.js/types';
913
import {
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+
97119
export 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

Comments
 (0)