Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
"react/jsx-handler-names": 0,
"react/jsx-fragments": 0,
"react/no-unused-prop-types": 0,
"import/export": 0
"import/export": 0,
"n/no-callback-literal": 0,
"@typescript-eslint/no-explicit-any": 0
}
}
33 changes: 25 additions & 8 deletions src/core/Geometry2DRepresentation.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';
import vtkActor2D, {
IActor2DInitialValues,
} from '@kitware/vtk.js/Rendering/Core/Actor2D';
Expand All @@ -11,6 +12,7 @@ import { Vector2 } from '@kitware/vtk.js/types';
import {
forwardRef,
PropsWithChildren,
useCallback,
useEffect,
useImperativeHandle,
useMemo,
Expand All @@ -20,14 +22,14 @@ import { IDownstream, IRepresentation } from '../types';
import { compareShallowObject } from '../utils/comparators';
import useBooleanAccumulator from '../utils/useBooleanAccumulator';
import useComparableEffect from '../utils/useComparableEffect';
import useLatest from '../utils/useLatest';
import {
DownstreamContext,
RepresentationContext,
useRendererContext,
} from './contexts';
import useColorTransferFunction from './modules/useColorTransferFunction';
import useCoordinate from './modules/useCoordinate';
import useDataEvents from './modules/useDataEvents';
import useMapper from './modules/useMapper';
import useProp from './modules/useProp';

Expand Down Expand Up @@ -120,6 +122,11 @@ export default forwardRef(function Geometry2DRepresentation(
trackModified
);

const getInputData = useCallback(
() => getMapper().getInputData(),
[getMapper]
);

// --- actor --- //

const actorProps = {
Expand Down Expand Up @@ -154,15 +161,15 @@ export default forwardRef(function Geometry2DRepresentation(

// --- events --- //

const onDataAvailable = useLatest(props.onDataAvailable);
const { dataChangedEvent, dataAvailableEvent } =
useDataEvents<vtkPolyData>(props);

// trigger data available event
useEffect(() => {
if (dataAvailable) {
// trigger onDataAvailable after making updates to the actor and mapper
onDataAvailable.current?.();
dataAvailableEvent.current.dispatchEvent(getInputData());
}
// onDataAvailable is a ref
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [dataAvailable]);
}, [dataAvailable, dataAvailableEvent, getInputData]);

// --- //

Expand All @@ -178,6 +185,7 @@ export default forwardRef(function Geometry2DRepresentation(
const representation = useMemo<IRepresentation>(
() => ({
dataChanged: () => {
dataChangedEvent.current.dispatchEvent(getInputData());
renderer.requestRender();
},
dataAvailable: (available = true) => {
Expand All @@ -186,8 +194,17 @@ export default forwardRef(function Geometry2DRepresentation(
},
getActor,
getMapper,
onDataAvailable: (cb) => dataAvailableEvent.current.addEventListener(cb),
onDataChanged: (cb) => dataChangedEvent.current.addEventListener(cb),
}),
[renderer, getActor, getMapper]
[
renderer,
getActor,
getMapper,
getInputData,
dataAvailableEvent,
dataChangedEvent,
]
);

const downstream = useMemo<IDownstream>(
Expand Down
33 changes: 25 additions & 8 deletions src/core/GeometryRepresentation.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';
import vtkActor, {
IActorInitialValues,
} from '@kitware/vtk.js/Rendering/Core/Actor';
Expand All @@ -9,6 +10,7 @@ import { Vector2 } from '@kitware/vtk.js/types';
import {
forwardRef,
PropsWithChildren,
useCallback,
useEffect,
useImperativeHandle,
useMemo,
Expand All @@ -18,13 +20,13 @@ import { IDownstream, IRepresentation } from '../types';
import { compareShallowObject } from '../utils/comparators';
import useBooleanAccumulator from '../utils/useBooleanAccumulator';
import useComparableEffect from '../utils/useComparableEffect';
import useLatest from '../utils/useLatest';
import {
DownstreamContext,
RepresentationContext,
useRendererContext,
} from './contexts';
import useColorTransferFunction from './modules/useColorTransferFunction';
import useDataEvents from './modules/useDataEvents';
import useMapper from './modules/useMapper';
import useProp from './modules/useProp';

Expand Down Expand Up @@ -137,6 +139,11 @@ export default forwardRef(function GeometryRepresentation(
getMapper().setLookupTable(getLookupTable());
}, [getMapper, getLookupTable]);

const getInputData = useCallback(
() => getMapper().getInputData(),
[getMapper]
);

// --- actor --- //

const actorProps = {
Expand Down Expand Up @@ -167,15 +174,15 @@ export default forwardRef(function GeometryRepresentation(

// --- events --- //

const onDataAvailable = useLatest(props.onDataAvailable);
const { dataChangedEvent, dataAvailableEvent } =
useDataEvents<vtkPolyData>(props);

// trigger data available event
useEffect(() => {
if (dataAvailable) {
// trigger onDataAvailable after making updates to the actor and mapper
onDataAvailable.current?.();
dataAvailableEvent.current.dispatchEvent(getInputData());
}
// onDataAvailable is a ref
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [dataAvailable]);
}, [dataAvailable, dataAvailableEvent, getInputData]);

// --- //

Expand All @@ -191,6 +198,7 @@ export default forwardRef(function GeometryRepresentation(
const representation = useMemo<IRepresentation>(
() => ({
dataChanged: () => {
dataChangedEvent.current.dispatchEvent(getInputData());
renderer.requestRender();
},
dataAvailable: () => {
Expand All @@ -199,8 +207,17 @@ export default forwardRef(function GeometryRepresentation(
},
getActor,
getMapper,
onDataAvailable: (cb) => dataAvailableEvent.current.addEventListener(cb),
onDataChanged: (cb) => dataChangedEvent.current.addEventListener(cb),
}),
[renderer, getActor, getMapper]
[
renderer,
getActor,
getMapper,
getInputData,
dataAvailableEvent,
dataChangedEvent,
]
);

const downstream = useMemo<IDownstream>(
Expand Down
13 changes: 11 additions & 2 deletions src/core/ShareDataSet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
useRepresentation,
useShareDataSet,
} from './contexts';
import useDataEvents from './modules/useDataEvents';

const DATA_AVAILABLE_EVENT = 'dataAvailable';
const DATA_CHANGED_EVENT = 'dataChanged';
Expand Down Expand Up @@ -63,7 +64,7 @@ export function ShareDataSetRoot(props: PropsWithChildren) {
};

const handler = (ev: Event) => {
if (!(ev instanceof CustomEvent<DataEventDetails>)) return;
if (!(ev instanceof CustomEvent)) return;
if (name === ev.detail?.name) {
invoke();
}
Expand Down Expand Up @@ -153,6 +154,10 @@ export function RegisterDataSet(props: RegisterDataSetProps) {
share.unregister(id);
});

// --- events --- //

const { dataChangedEvent, dataAvailableEvent } = useDataEvents({});

// --- //

const downstream = useMemo<IDownstream>(
Expand All @@ -171,14 +176,18 @@ export function RegisterDataSet(props: RegisterDataSetProps) {
() => ({
dataChanged() {
share.dispatchDataChanged(id);
dataChangedEvent.current.dispatchEvent();
},
dataAvailable() {
share.dispatchDataAvailable(id);
dataAvailableEvent.current.dispatchEvent();
},
getActor: () => null,
getMapper: () => null,
onDataAvailable: (cb) => share.onDataAvailable(id, cb),
onDataChanged: (cb) => share.onDataChanged(id, cb),
}),
[id, share]
[id, share, dataAvailableEvent, dataChangedEvent]
);

return (
Expand Down
32 changes: 24 additions & 8 deletions src/core/SliceRepresentation.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
import AbstractImageMapper, {
vtkAbstractImageMapper,
} from '@kitware/vtk.js/Rendering/Core/AbstractImageMapper';
Expand All @@ -23,13 +24,13 @@ import { IDownstream, IRepresentation } from '../types';
import { compareShallowObject } from '../utils/comparators';
import useBooleanAccumulator from '../utils/useBooleanAccumulator';
import useComparableEffect from '../utils/useComparableEffect';
import useLatest from '../utils/useLatest';
import {
DownstreamContext,
RepresentationContext,
useRendererContext,
} from './contexts';
import useColorTransferFunction from './modules/useColorTransferFunction';
import useDataEvents from './modules/useDataEvents';
import useMapper from './modules/useMapper';
import useProp from './modules/useProp';

Expand Down Expand Up @@ -162,6 +163,11 @@ export default forwardRef(function SliceRepresentation(
return getInternalMapper();
}, [mapperInstance, getInternalMapper]);

const getInputData = useCallback(
() => getMapper().getInputData(),
[getMapper]
);

// --- actor --- //

const actorProps = {
Expand Down Expand Up @@ -254,15 +260,15 @@ export default forwardRef(function SliceRepresentation(

// --- events --- //

const onDataAvailable = useLatest(props.onDataAvailable);
const { dataChangedEvent, dataAvailableEvent } =
useDataEvents<vtkImageData>(props);

// trigger data available event
useEffect(() => {
if (dataAvailable) {
// trigger onDataAvailable after making updates to the actor and mapper
onDataAvailable.current?.();
dataAvailableEvent.current.dispatchEvent(getInputData());
}
// onDataAvailable is a ref
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [dataAvailable]);
}, [dataAvailable, dataAvailableEvent, getInputData]);

// --- //

Expand All @@ -278,6 +284,7 @@ export default forwardRef(function SliceRepresentation(
const representation = useMemo<IRepresentation>(
() => ({
dataChanged: () => {
dataChangedEvent.current.dispatchEvent(getInputData());
renderer.requestRender();
},
dataAvailable: (available = true) => {
Expand All @@ -286,8 +293,17 @@ export default forwardRef(function SliceRepresentation(
},
getActor,
getMapper,
onDataAvailable: (cb) => dataAvailableEvent.current.addEventListener(cb),
onDataChanged: (cb) => dataChangedEvent.current.addEventListener(cb),
}),
[renderer, getActor, getMapper]
[
renderer,
getActor,
getMapper,
getInputData,
dataAvailableEvent,
dataChangedEvent,
]
);

const downstream = useMemo<IDownstream>(
Expand Down
Loading