* feat: Add state sync and use it to remember viewport grid info fix: Version updates Fixes for toggling MPR mode Fix the display when the interleaved load module fails Fix the memory of the state to restore correctly PR fixes for the state sync service PR fixes PR fixes PR fixes Added a hack warning to remove volumeDeactivate Fixes for TMTV colormap setting Fix the casing Missed renames fix: tests not running due to variance in ordering Reverting some fixes to change case PR changes - mostly comments and minor improvements fix: All display sets were being updated on drag and drop PR fixes - mostly renames PR fixes Test support for OHIF, for HP branch test: Add at least a minimal set of automated tests for hanging protocols Docs PR fixes Merge fixes DOCS updates Add an example of the mn hanging protocol PR fixes PR fixes PR fixes * Fix the drag and drop PR fixes * PR changes - update default keys for next/previous stage * fix: Was storing the custom viewport grid too aggressively Caused by a PR change misspelling a variable
201 lines
5.9 KiB
JavaScript
201 lines
5.9 KiB
JavaScript
import { hotkeys } from '@ohif/core';
|
|
import toolbarButtons from './toolbarButtons.js';
|
|
import { id } from './id.js';
|
|
import initToolGroups, { toolGroupIds } from './initToolGroups.js';
|
|
import setCrosshairsConfiguration from './utils/setCrosshairsConfiguration.js';
|
|
import setFusionActiveVolume from './utils/setFusionActiveVolume.js';
|
|
|
|
const ohif = {
|
|
layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout',
|
|
sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack',
|
|
measurements: '@ohif/extension-default.panelModule.measure',
|
|
thumbnailList: '@ohif/extension-default.panelModule.seriesList',
|
|
};
|
|
|
|
const cs3d = {
|
|
viewport: '@ohif/extension-cornerstone.viewportModule.cornerstone',
|
|
};
|
|
|
|
const tmtv = {
|
|
hangingProtocol: '@ohif/extension-tmtv.hangingProtocolModule.ptCT',
|
|
petSUV: '@ohif/extension-tmtv.panelModule.petSUV',
|
|
ROIThresholdPanel: '@ohif/extension-tmtv.panelModule.ROIThresholdSeg',
|
|
};
|
|
|
|
const extensionDependencies = {
|
|
// Can derive the versions at least process.env.from npm_package_version
|
|
'@ohif/extension-default': '^3.0.0',
|
|
'@ohif/extension-cornerstone': '^3.0.0',
|
|
'@ohif/extension-tmtv': '^3.0.0',
|
|
};
|
|
|
|
let unsubscriptions = [];
|
|
function modeFactory({ modeConfiguration }) {
|
|
return {
|
|
// TODO: We're using this as a route segment
|
|
// We should not be.
|
|
id,
|
|
routeName: 'tmtv',
|
|
displayName: 'Total Metabolic Tumor Volume',
|
|
/**
|
|
* Lifecycle hooks
|
|
*/
|
|
onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => {
|
|
const {
|
|
toolbarService,
|
|
toolGroupService,
|
|
hangingProtocolService,
|
|
displaySetService,
|
|
} = servicesManager.services;
|
|
|
|
const utilityModule = extensionManager.getModuleEntry(
|
|
'@ohif/extension-cornerstone.utilityModule.tools'
|
|
);
|
|
|
|
const { toolNames, Enums } = utilityModule.exports;
|
|
|
|
// Init Default and SR ToolGroups
|
|
initToolGroups(toolNames, Enums, toolGroupService, commandsManager);
|
|
|
|
const setWindowLevelActive = () => {
|
|
toolbarService.recordInteraction({
|
|
groupId: 'WindowLevel',
|
|
itemId: 'WindowLevel',
|
|
interactionType: 'tool',
|
|
commands: [
|
|
{
|
|
commandName: 'setToolActive',
|
|
commandOptions: {
|
|
toolName: toolNames.WindowLevel,
|
|
toolGroupId: toolGroupIds.CT,
|
|
},
|
|
context: 'CORNERSTONE',
|
|
},
|
|
{
|
|
commandName: 'setToolActive',
|
|
commandOptions: {
|
|
toolName: toolNames.WindowLevel,
|
|
toolGroupId: toolGroupIds.PT,
|
|
},
|
|
context: 'CORNERSTONE',
|
|
},
|
|
{
|
|
commandName: 'setToolActive',
|
|
commandOptions: {
|
|
toolName: toolNames.WindowLevel,
|
|
toolGroupId: toolGroupIds.Fusion,
|
|
},
|
|
context: 'CORNERSTONE',
|
|
},
|
|
],
|
|
});
|
|
};
|
|
|
|
const { unsubscribe } = toolGroupService.subscribe(
|
|
toolGroupService.EVENTS.VIEWPORT_ADDED,
|
|
() => {
|
|
// For fusion toolGroup we need to add the volumeIds for the crosshairs
|
|
// since in the fusion viewport we don't want both PT and CT to render MIP
|
|
// when slabThickness is modified
|
|
const {
|
|
displaySetMatchDetails,
|
|
} = hangingProtocolService.getMatchDetails();
|
|
|
|
setCrosshairsConfiguration(
|
|
displaySetMatchDetails,
|
|
toolNames,
|
|
toolGroupService,
|
|
displaySetService
|
|
);
|
|
|
|
setFusionActiveVolume(
|
|
displaySetMatchDetails,
|
|
toolNames,
|
|
toolGroupService,
|
|
displaySetService
|
|
);
|
|
|
|
setWindowLevelActive();
|
|
}
|
|
);
|
|
|
|
unsubscriptions.push(unsubscribe);
|
|
toolbarService.init(extensionManager);
|
|
toolbarService.addButtons(toolbarButtons);
|
|
toolbarService.createButtonSection('primary', [
|
|
'MeasurementTools',
|
|
'Zoom',
|
|
'WindowLevel',
|
|
'Crosshairs',
|
|
'Pan',
|
|
'RectangleROIStartEndThreshold',
|
|
'fusionPTColormap',
|
|
]);
|
|
},
|
|
onModeExit: ({ servicesManager }) => {
|
|
const {
|
|
toolGroupService,
|
|
syncGroupService,
|
|
segmentationService,
|
|
cornerstoneViewportService,
|
|
} = servicesManager.services;
|
|
|
|
unsubscriptions.forEach(unsubscribe => unsubscribe());
|
|
toolGroupService.destroy();
|
|
syncGroupService.destroy();
|
|
segmentationService.destroy();
|
|
cornerstoneViewportService.destroy();
|
|
},
|
|
validationTags: {
|
|
study: [],
|
|
series: [],
|
|
},
|
|
isValidMode: ({ modalities }) => {
|
|
const modalities_list = modalities.split('\\');
|
|
const invalidModalities = ['SM'];
|
|
|
|
// there should be both CT and PT modalities and the modality should not be SM
|
|
return (
|
|
modalities_list.includes('CT') &&
|
|
modalities_list.includes('PT') &&
|
|
!invalidModalities.some(modality => modalities_list.includes(modality))
|
|
);
|
|
},
|
|
routes: [
|
|
{
|
|
path: 'tmtv',
|
|
/*init: ({ servicesManager, extensionManager }) => {
|
|
//defaultViewerRouteInit
|
|
},*/
|
|
layoutTemplate: ({ location, servicesManager }) => {
|
|
return {
|
|
id: ohif.layout,
|
|
props: {
|
|
// leftPanels: [ohif.thumbnailList],
|
|
rightPanels: [tmtv.ROIThresholdPanel, tmtv.petSUV],
|
|
viewports: [
|
|
{
|
|
namespace: cs3d.viewport,
|
|
displaySetsToDisplay: [ohif.sopClassHandler],
|
|
},
|
|
],
|
|
},
|
|
};
|
|
},
|
|
},
|
|
],
|
|
extensions: extensionDependencies,
|
|
hangingProtocol: tmtv.hangingProtocol,
|
|
sopClassHandlers: [ohif.sopClassHandler],
|
|
hotkeys: [...hotkeys.defaults.hotkeyBindings],
|
|
};
|
|
}
|
|
|
|
const mode = {
|
|
id,
|
|
modeFactory,
|
|
extensionDependencies,
|
|
};
|
|
|
|
export default mode;
|