feat(HP): Frame View HP (#4235)
This commit is contained in:
parent
9d0b729dc5
commit
d5d821464a
@ -5,6 +5,7 @@ import { mprAnd3DVolumeViewport } from './hps/mprAnd3DVolumeViewport';
|
|||||||
import { only3D } from './hps/only3D';
|
import { only3D } from './hps/only3D';
|
||||||
import { primary3D } from './hps/primary3D';
|
import { primary3D } from './hps/primary3D';
|
||||||
import { primaryAxial } from './hps/primaryAxial';
|
import { primaryAxial } from './hps/primaryAxial';
|
||||||
|
import { frameView } from './hps/frameView';
|
||||||
|
|
||||||
function getHangingProtocolModule() {
|
function getHangingProtocolModule() {
|
||||||
return [
|
return [
|
||||||
@ -36,6 +37,10 @@ function getHangingProtocolModule() {
|
|||||||
name: primary3D.id,
|
name: primary3D.id,
|
||||||
protocol: primary3D,
|
protocol: primary3D,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: frameView.id,
|
||||||
|
protocol: frameView,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1565
extensions/cornerstone/src/hps/frameView.ts
Normal file
1565
extensions/cornerstone/src/hps/frameView.ts
Normal file
File diff suppressed because it is too large
Load Diff
@ -38,6 +38,7 @@ import { ViewportActionCornersProvider } from './contextProviders/ViewportAction
|
|||||||
import ActiveViewportWindowLevel from './components/ActiveViewportWindowLevel';
|
import ActiveViewportWindowLevel from './components/ActiveViewportWindowLevel';
|
||||||
import getSOPInstanceAttributes from './utils/measurementServiceMappings/utils/getSOPInstanceAttributes';
|
import getSOPInstanceAttributes from './utils/measurementServiceMappings/utils/getSOPInstanceAttributes';
|
||||||
import { findNearbyToolData } from './utils/findNearbyToolData';
|
import { findNearbyToolData } from './utils/findNearbyToolData';
|
||||||
|
import { createFrameViewSynchronizer } from './synchronizers/frameViewSynchronizer';
|
||||||
|
|
||||||
const { helpers: volumeLoaderHelpers } = csStreamingImageVolumeLoader;
|
const { helpers: volumeLoaderHelpers } = csStreamingImageVolumeLoader;
|
||||||
const { getDynamicVolumeInfo } = volumeLoaderHelpers ?? {};
|
const { getDynamicVolumeInfo } = volumeLoaderHelpers ?? {};
|
||||||
@ -114,6 +115,9 @@ const cornerstoneExtension: Types.Extensions.Extension = {
|
|||||||
ViewportActionCornersService.REGISTRATION.name,
|
ViewportActionCornersService.REGISTRATION.name,
|
||||||
ViewportActionCornersProvider
|
ViewportActionCornersProvider
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { syncGroupService } = servicesManager.services;
|
||||||
|
syncGroupService.registerCustomSynchronizer('frameview', createFrameViewSynchronizer);
|
||||||
return init.call(this, props);
|
return init.call(this, props);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -98,6 +98,15 @@ export default class SyncGroupService {
|
|||||||
return SynchronizerManager.getSynchronizer(id);
|
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.
|
* Retrieves an array of synchronizers of a specific type.
|
||||||
* @param type - The type of synchronizers to retrieve.
|
* @param type - The type of synchronizers to retrieve.
|
||||||
|
|||||||
@ -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 };
|
||||||
Loading…
Reference in New Issue
Block a user