53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
import { SynchronizerManager, Synchronizer } from '@cornerstonejs/tools';
|
|
import { EVENTS, getRenderingEngine, type Types, utilities } from '@cornerstonejs/core';
|
|
|
|
const frameViewSyncCallback = (
|
|
synchronizerInstance: Synchronizer,
|
|
sourceViewport: Types.IViewportId,
|
|
targetViewport: Types.IViewportId
|
|
) => {
|
|
const renderingEngine = getRenderingEngine(targetViewport.renderingEngineId);
|
|
if (!renderingEngine) {
|
|
throw new Error(`No RenderingEngine for Id: ${targetViewport.renderingEngineId}`);
|
|
}
|
|
const sViewport = renderingEngine.getViewport(sourceViewport.viewportId) as Types.IStackViewport;
|
|
|
|
const { viewportIndex: targetViewportIndex } = synchronizerInstance.getOptions(
|
|
targetViewport.viewportId
|
|
);
|
|
|
|
const { viewportIndex: sourceViewportIndex } = synchronizerInstance.getOptions(
|
|
sourceViewport.viewportId
|
|
);
|
|
|
|
if (targetViewportIndex === undefined || sourceViewportIndex === undefined) {
|
|
throw new Error('No viewportIndex provided');
|
|
}
|
|
|
|
const tViewport = renderingEngine.getViewport(targetViewport.viewportId) as Types.IStackViewport;
|
|
|
|
const sourceSliceIndex = sViewport.getSliceIndex();
|
|
const sliceDifference = Number(targetViewportIndex) - Number(sourceViewportIndex);
|
|
const targetSliceIndex = sourceSliceIndex + sliceDifference;
|
|
|
|
if (targetSliceIndex === tViewport.getSliceIndex()) {
|
|
return;
|
|
}
|
|
|
|
utilities.jumpToSlice(tViewport.element, {
|
|
imageIndex: targetSliceIndex,
|
|
});
|
|
};
|
|
|
|
const createFrameViewSynchronizer = (synchronizerName: string): Synchronizer => {
|
|
const synchronizer = SynchronizerManager.createSynchronizer(
|
|
synchronizerName,
|
|
EVENTS.STACK_VIEWPORT_SCROLL,
|
|
frameViewSyncCallback,
|
|
{ auxiliaryEvents: [{ name: EVENTS.CAMERA_MODIFIED, source: 'element' }] }
|
|
);
|
|
return synchronizer;
|
|
};
|
|
|
|
export { createFrameViewSynchronizer };
|