fix(viewport): Initial blank image on SR/SEG initial display (#3304)
* fix: Blank display area on initial DICOM SR load * Docs * Fix a NPE
This commit is contained in:
parent
45a34ae0fe
commit
d3da969d23
@ -0,0 +1,78 @@
|
|||||||
|
import { Types } from '@ohif/core';
|
||||||
|
|
||||||
|
const srProtocol: Types.HangingProtocol.Protocol = {
|
||||||
|
id: '@ohif/sr',
|
||||||
|
// Don't store this hanging protocol as it applies to the currently active
|
||||||
|
// display set by default
|
||||||
|
// cacheId: null,
|
||||||
|
hasUpdatedPriorsInformation: false,
|
||||||
|
name: 'SR Key Images',
|
||||||
|
// Just apply this one when specifically listed
|
||||||
|
protocolMatchingRules: [],
|
||||||
|
toolGroupIds: ['default'],
|
||||||
|
// -1 would be used to indicate active only, whereas other values are
|
||||||
|
// the number of required priors referenced - so 0 means active with
|
||||||
|
// 0 or more priors.
|
||||||
|
numberOfPriorsReferenced: 0,
|
||||||
|
// Default viewport is used to define the viewport when
|
||||||
|
// additional viewports are added using the layout tool
|
||||||
|
defaultViewport: {
|
||||||
|
viewportOptions: {
|
||||||
|
viewportType: 'stack',
|
||||||
|
toolGroupId: 'default',
|
||||||
|
allowUnmatchedView: true,
|
||||||
|
},
|
||||||
|
displaySets: [
|
||||||
|
{
|
||||||
|
id: 'srDisplaySetId',
|
||||||
|
matchedDisplaySetsIndex: -1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
displaySetSelectors: {
|
||||||
|
srDisplaySetId: {
|
||||||
|
seriesMatchingRules: [
|
||||||
|
{
|
||||||
|
attribute: 'Modality',
|
||||||
|
constraint: {
|
||||||
|
equals: 'SR',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
stages: [
|
||||||
|
{
|
||||||
|
name: 'SR Key Images',
|
||||||
|
viewportStructure: {
|
||||||
|
layoutType: 'grid',
|
||||||
|
properties: {
|
||||||
|
rows: 1,
|
||||||
|
columns: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
viewports: [
|
||||||
|
{
|
||||||
|
viewportOptions: { allowUnmatchedView: true },
|
||||||
|
displaySets: [
|
||||||
|
{
|
||||||
|
id: 'srDisplaySetId',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
function getHangingProtocolModule() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
name: srProtocol.id,
|
||||||
|
protocol: srProtocol,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default getHangingProtocolModule;
|
||||||
|
export { srProtocol };
|
||||||
@ -1,8 +1,11 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import getSopClassHandlerModule from './getSopClassHandlerModule';
|
import getSopClassHandlerModule from './getSopClassHandlerModule';
|
||||||
|
import getHangingProtocolModule, {
|
||||||
|
srProtocol,
|
||||||
|
} from './getHangingProtocolModule';
|
||||||
import onModeEnter from './onModeEnter';
|
import onModeEnter from './onModeEnter';
|
||||||
import commandsModule from './commandsModule';
|
import getCommandsModule from './commandsModule';
|
||||||
import init from './init';
|
import preRegistration from './init';
|
||||||
import { id } from './id.js';
|
import { id } from './id.js';
|
||||||
import toolNames from './tools/toolNames';
|
import toolNames from './tools/toolNames';
|
||||||
import hydrateStructuredReport from './utils/hydrateStructuredReport';
|
import hydrateStructuredReport from './utils/hydrateStructuredReport';
|
||||||
@ -31,9 +34,7 @@ const dicomSRExtension = {
|
|||||||
id,
|
id,
|
||||||
onModeEnter,
|
onModeEnter,
|
||||||
|
|
||||||
preRegistration({ servicesManager, configuration = {} }) {
|
preRegistration,
|
||||||
init({ servicesManager, configuration });
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -54,14 +55,11 @@ const dicomSRExtension = {
|
|||||||
|
|
||||||
return [{ name: 'dicom-sr', component: ExtendedOHIFCornerstoneSRViewport }];
|
return [{ name: 'dicom-sr', component: ExtendedOHIFCornerstoneSRViewport }];
|
||||||
},
|
},
|
||||||
getCommandsModule({ servicesManager, commandsManager, extensionManager }) {
|
getCommandsModule,
|
||||||
return commandsModule({
|
|
||||||
servicesManager,
|
|
||||||
commandsManager,
|
|
||||||
extensionManager,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getSopClassHandlerModule,
|
getSopClassHandlerModule,
|
||||||
|
getHangingProtocolModule,
|
||||||
|
|
||||||
|
// Include dynmically computed values such as toolNames not known till instantiation
|
||||||
getUtilityModule({ servicesManager }) {
|
getUtilityModule({ servicesManager }) {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
@ -75,4 +73,6 @@ const dicomSRExtension = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default dicomSRExtension;
|
export default dicomSRExtension;
|
||||||
export { hydrateStructuredReport };
|
|
||||||
|
// Put static exports here so they can be type checked
|
||||||
|
export { hydrateStructuredReport, srProtocol };
|
||||||
|
|||||||
@ -390,8 +390,9 @@ const OHIFCornerstoneViewport = React.memo(props => {
|
|||||||
initialImageIndex
|
initialImageIndex
|
||||||
);
|
);
|
||||||
|
|
||||||
storePresentation();
|
// The presentation state will have been stored previously by closing
|
||||||
|
// a viewport. Otherwise, this viewport will be unchanged and the
|
||||||
|
// presentation information will be directly carried over.
|
||||||
const {
|
const {
|
||||||
lutPresentationStore,
|
lutPresentationStore,
|
||||||
positionPresentationStore,
|
positionPresentationStore,
|
||||||
|
|||||||
@ -200,11 +200,12 @@ function ViewerViewportGrid(props) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updatedViewports.forEach(vp => {
|
updatedViewports.forEach(vp => {
|
||||||
|
vp.viewportOptions ||= {};
|
||||||
const { orientation, viewportType } = vp.viewportOptions;
|
const { orientation, viewportType } = vp.viewportOptions;
|
||||||
let initialImageOptions;
|
let initialImageOptions;
|
||||||
|
|
||||||
// For initial imageIndex to hang be careful for the volume viewport
|
// For initial imageIndex to hang be careful for the volume viewport
|
||||||
if (viewportType === 'stack') {
|
if (viewportType === 'stack' || !viewportType) {
|
||||||
initialImageOptions = {
|
initialImageOptions = {
|
||||||
index: imageIndex,
|
index: imageIndex,
|
||||||
};
|
};
|
||||||
@ -227,7 +228,7 @@ function ViewerViewportGrid(props) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vp.viewportOptions['initialImageOptions'] = initialImageOptions;
|
vp.viewportOptions.initialImageOptions = initialImageOptions;
|
||||||
});
|
});
|
||||||
|
|
||||||
viewportGridService.setDisplaySetsForViewports(updatedViewports);
|
viewportGridService.setDisplaySetsForViewports(updatedViewports);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user