feat(HP): Frame View HP (#4235)

This commit is contained in:
Ibrahim 2024-06-21 11:22:05 -04:00 committed by GitHub
parent 9d0b729dc5
commit d5d821464a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 1634 additions and 0 deletions

View File

@ -5,6 +5,7 @@ import { mprAnd3DVolumeViewport } from './hps/mprAnd3DVolumeViewport';
import { only3D } from './hps/only3D';
import { primary3D } from './hps/primary3D';
import { primaryAxial } from './hps/primaryAxial';
import { frameView } from './hps/frameView';
function getHangingProtocolModule() {
return [
@ -36,6 +37,10 @@ function getHangingProtocolModule() {
name: primary3D.id,
protocol: primary3D,
},
{
name: frameView.id,
protocol: frameView,
},
];
}

File diff suppressed because it is too large Load Diff

View File

@ -38,6 +38,7 @@ import { ViewportActionCornersProvider } from './contextProviders/ViewportAction
import ActiveViewportWindowLevel from './components/ActiveViewportWindowLevel';
import getSOPInstanceAttributes from './utils/measurementServiceMappings/utils/getSOPInstanceAttributes';
import { findNearbyToolData } from './utils/findNearbyToolData';
import { createFrameViewSynchronizer } from './synchronizers/frameViewSynchronizer';
const { helpers: volumeLoaderHelpers } = csStreamingImageVolumeLoader;
const { getDynamicVolumeInfo } = volumeLoaderHelpers ?? {};
@ -114,6 +115,9 @@ const cornerstoneExtension: Types.Extensions.Extension = {
ViewportActionCornersService.REGISTRATION.name,
ViewportActionCornersProvider
);
const { syncGroupService } = servicesManager.services;
syncGroupService.registerCustomSynchronizer('frameview', createFrameViewSynchronizer);
return init.call(this, props);
},

View File

@ -98,6 +98,15 @@ export default class SyncGroupService {
return SynchronizerManager.getSynchronizer(id);
}
/**
* Registers a custom synchronizer.
* @param id - The id of the synchronizer.
* @param createFunction - The function that creates the synchronizer.
*/
public registerCustomSynchronizer(id: string, createFunction: SyncCreator): void {
this.synchronizerCreators[id] = createFunction;
}
/**
* Retrieves an array of synchronizers of a specific type.
* @param type - The type of synchronizers to retrieve.

View File

@ -0,0 +1,51 @@
import { SynchronizerManager, Synchronizer, utilities } from '@cornerstonejs/tools';
import { EVENTS, getRenderingEngine, Types } 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.CAMERA_MODIFIED,
frameViewSyncCallback
);
return synchronizer;
};
export { createFrameViewSynchronizer };