feat(multiframe): enhanced support for multiframe dicom (#3164)
* Changes in cswil version and multiframe * Minor changes * wip * Adding support for NM multiframe images * Applying PR suggestions * fixing package versions * Restoring default.js config file * Check if NM subtype is reconstructable * Restore default.js values * refactore code * feat: add flag for strict zspacing --------- Co-authored-by: Alireza <ar.sedghi@gmail.com>
This commit is contained in:
parent
5e42a42b5f
commit
226244a26c
@ -46,7 +46,7 @@
|
|||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"classnames": "^2.3.2",
|
"classnames": "^2.3.2",
|
||||||
"@cornerstonejs/adapters": "^0.6.0",
|
"@cornerstonejs/adapters": "^0.6.0",
|
||||||
"@cornerstonejs/core": "^0.38.0",
|
"@cornerstonejs/core": "^0.40.0",
|
||||||
"@cornerstonejs/tools": "^0.58.0"
|
"@cornerstonejs/tools": "^0.60.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ohif/core": "^3.0.0",
|
"@ohif/core": "^3.0.0",
|
||||||
"@ohif/ui": "^2.0.0",
|
"@ohif/ui": "^2.0.0",
|
||||||
"cornerstone-wado-image-loader": "^4.10.2",
|
"cornerstone-wado-image-loader": "^4.13.0",
|
||||||
"dcmjs": "^0.29.4",
|
"dcmjs": "^0.29.4",
|
||||||
"dicom-parser": "^1.8.9",
|
"dicom-parser": "^1.8.9",
|
||||||
"hammerjs": "^2.0.8",
|
"hammerjs": "^2.0.8",
|
||||||
@ -44,9 +44,9 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/adapters": "^0.6.0",
|
"@cornerstonejs/adapters": "^0.6.0",
|
||||||
"@cornerstonejs/core": "^0.38.0",
|
"@cornerstonejs/core": "^0.40.0",
|
||||||
"@cornerstonejs/streaming-image-volume-loader": "^0.15.13",
|
"@cornerstonejs/streaming-image-volume-loader": "^0.16.0",
|
||||||
"@cornerstonejs/tools": "^0.58.0",
|
"@cornerstonejs/tools": "^0.60.1",
|
||||||
"@kitware/vtk.js": "26.5.6",
|
"@kitware/vtk.js": "26.5.6",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
"lodash.debounce": "4.0.8",
|
"lodash.debounce": "4.0.8",
|
||||||
|
|||||||
@ -43,6 +43,14 @@ export default async function init({
|
|||||||
|
|
||||||
// For debugging e2e tests that are failing on CI
|
// For debugging e2e tests that are failing on CI
|
||||||
cornerstone.setUseCPURendering(Boolean(appConfig.useCPURendering));
|
cornerstone.setUseCPURendering(Boolean(appConfig.useCPURendering));
|
||||||
|
cornerstone.setConfiguration({
|
||||||
|
...cornerstone.getConfiguration(),
|
||||||
|
rendering: {
|
||||||
|
...cornerstone.getConfiguration().rendering,
|
||||||
|
strictZSpacingForVolumeViewport:
|
||||||
|
appConfig.strictZSpacingForVolumeViewport,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
// For debugging large datasets
|
// For debugging large datasets
|
||||||
const MAX_CACHE_SIZE_1GB = 1073741824;
|
const MAX_CACHE_SIZE_1GB = 1073741824;
|
||||||
|
|||||||
@ -138,7 +138,9 @@ function createDicomLocalApi(dicomLocalConfig) {
|
|||||||
study.series.forEach(aSeries => {
|
study.series.forEach(aSeries => {
|
||||||
const { SeriesInstanceUID } = aSeries;
|
const { SeriesInstanceUID } = aSeries;
|
||||||
|
|
||||||
aSeries.instances.forEach(instance => {
|
const isMultiframe = aSeries.instances[0].NumberOfFrames > 1;
|
||||||
|
|
||||||
|
aSeries.instances.forEach((instance, index) => {
|
||||||
const {
|
const {
|
||||||
url: imageId,
|
url: imageId,
|
||||||
StudyInstanceUID,
|
StudyInstanceUID,
|
||||||
@ -153,6 +155,7 @@ function createDicomLocalApi(dicomLocalConfig) {
|
|||||||
StudyInstanceUID,
|
StudyInstanceUID,
|
||||||
SeriesInstanceUID,
|
SeriesInstanceUID,
|
||||||
SOPInstanceUID,
|
SOPInstanceUID,
|
||||||
|
frameIndex: isMultiframe ? index : 1,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -185,7 +188,7 @@ function createDicomLocalApi(dicomLocalConfig) {
|
|||||||
displaySet.images.forEach(instance => {
|
displaySet.images.forEach(instance => {
|
||||||
const NumberOfFrames = instance.NumberOfFrames;
|
const NumberOfFrames = instance.NumberOfFrames;
|
||||||
if (NumberOfFrames > 1) {
|
if (NumberOfFrames > 1) {
|
||||||
for (let i = 0; i < NumberOfFrames; i++) {
|
for (let i = 1; i <= NumberOfFrames; i++) {
|
||||||
const imageId = this.getImageIdsForInstance({
|
const imageId = this.getImageIdsForInstance({
|
||||||
instance,
|
instance,
|
||||||
frame: i,
|
frame: i,
|
||||||
|
|||||||
@ -104,7 +104,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
|
|||||||
query: {
|
query: {
|
||||||
studies: {
|
studies: {
|
||||||
mapParams: mapParams.bind(),
|
mapParams: mapParams.bind(),
|
||||||
search: async function (origParams) {
|
search: async function(origParams) {
|
||||||
const headers = userAuthenticationService.getAuthorizationHeader();
|
const headers = userAuthenticationService.getAuthorizationHeader();
|
||||||
if (headers) {
|
if (headers) {
|
||||||
qidoDicomWebClient.headers = headers;
|
qidoDicomWebClient.headers = headers;
|
||||||
@ -129,7 +129,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
|
|||||||
},
|
},
|
||||||
series: {
|
series: {
|
||||||
// mapParams: mapParams.bind(),
|
// mapParams: mapParams.bind(),
|
||||||
search: async function (studyInstanceUid) {
|
search: async function(studyInstanceUid) {
|
||||||
const headers = userAuthenticationService.getAuthorizationHeader();
|
const headers = userAuthenticationService.getAuthorizationHeader();
|
||||||
if (headers) {
|
if (headers) {
|
||||||
qidoDicomWebClient.headers = headers;
|
qidoDicomWebClient.headers = headers;
|
||||||
|
|||||||
@ -32,8 +32,8 @@
|
|||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@ohif/core": "^3.0.0",
|
"@ohif/core": "^3.0.0",
|
||||||
"classnames": "^2.3.2",
|
"classnames": "^2.3.2",
|
||||||
"@cornerstonejs/core": "^0.38.0",
|
"@cornerstonejs/core": "^0.40.0",
|
||||||
"@cornerstonejs/tools": "^0.58.0",
|
"@cornerstonejs/tools": "^0.60.1",
|
||||||
"@ohif/extension-cornerstone-dicom-sr": "^3.0.0",
|
"@ohif/extension-cornerstone-dicom-sr": "^3.0.0",
|
||||||
"dcmjs": "^0.29.4",
|
"dcmjs": "^0.29.4",
|
||||||
"lodash.debounce": "^4.17.21",
|
"lodash.debounce": "^4.17.21",
|
||||||
|
|||||||
@ -31,7 +31,7 @@
|
|||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"cornerstone-math": "0.1.9",
|
"cornerstone-math": "0.1.9",
|
||||||
"cornerstone-wado-image-loader": "^4.10.2",
|
"cornerstone-wado-image-loader": "^4.13.0",
|
||||||
"dicom-parser": "^1.8.9",
|
"dicom-parser": "^1.8.9",
|
||||||
"@ohif/ui": "^2.0.0"
|
"@ohif/ui": "^2.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -412,6 +412,34 @@ class MetadataProvider {
|
|||||||
return metadata;
|
return metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the frameNumber information, depending on the url style
|
||||||
|
* wadors /frames/1
|
||||||
|
* wadouri &frame=1
|
||||||
|
* @param {*} imageId
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
getFrameInformationFromURL(imageId) {
|
||||||
|
function getInformationFromURL(informationString, separator) {
|
||||||
|
let result = '';
|
||||||
|
const splittedStr = imageId.split(informationString)[1];
|
||||||
|
if (splittedStr.includes(separator)) {
|
||||||
|
result = splittedStr.split(separator)[0];
|
||||||
|
} else {
|
||||||
|
result = splittedStr;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imageId.includes('/frames')) {
|
||||||
|
return getInformationFromURL('/frames', '/');
|
||||||
|
}
|
||||||
|
if (imageId.includes('&frame=')) {
|
||||||
|
return getInformationFromURL('&frame=', '&');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
getUIDsFromImageID(imageId) {
|
getUIDsFromImageID(imageId) {
|
||||||
// TODO: adding csiv here is not really correct. Probably need to use
|
// TODO: adding csiv here is not really correct. Probably need to use
|
||||||
// metadataProvider.addImageIdToUIDs(imageId, {
|
// metadataProvider.addImageIdToUIDs(imageId, {
|
||||||
@ -445,7 +473,7 @@ class MetadataProvider {
|
|||||||
// check if the imageId starts with http:// or https:// using regex
|
// check if the imageId starts with http:// or https:// using regex
|
||||||
// Todo: handle non http imageIds
|
// Todo: handle non http imageIds
|
||||||
let imageURI;
|
let imageURI;
|
||||||
const urlRegex = /^(http|https):\/\//;
|
const urlRegex = /^(http|https|dicomfile):\/\//;
|
||||||
if (urlRegex.test(imageId)) {
|
if (urlRegex.test(imageId)) {
|
||||||
imageURI = imageId;
|
imageURI = imageId;
|
||||||
} else {
|
} else {
|
||||||
@ -453,7 +481,7 @@ class MetadataProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const uids = this.imageURIToUIDs.get(imageURI);
|
const uids = this.imageURIToUIDs.get(imageURI);
|
||||||
const frameNumber = imageId.split(/\/frames\//)[1];
|
let frameNumber = this.getFrameInformationFromURL(imageId) || '1';
|
||||||
|
|
||||||
if (uids && frameNumber !== undefined) {
|
if (uids && frameNumber !== undefined) {
|
||||||
return { ...uids, frameNumber };
|
return { ...uids, frameNumber };
|
||||||
|
|||||||
@ -84,9 +84,9 @@ function _getInstance(StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _getInstanceByImageId(imageId) {
|
function _getInstanceByImageId(imageId) {
|
||||||
for (let study of _model.studies) {
|
for (const study of _model.studies) {
|
||||||
for (let series of study.series) {
|
for (const series of study.series) {
|
||||||
for (let instance of series.instances) {
|
for (const instance of series.instances) {
|
||||||
if (instance.imageId === imageId) {
|
if (instance.imageId === imageId) {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
@ -236,7 +236,7 @@ const BaseImplementation = {
|
|||||||
addStudy(study) {
|
addStudy(study) {
|
||||||
const { StudyInstanceUID } = study;
|
const { StudyInstanceUID } = study;
|
||||||
|
|
||||||
let existingStudy = _model.studies.find(
|
const existingStudy = _model.studies.find(
|
||||||
study => study.StudyInstanceUID === StudyInstanceUID
|
study => study.StudyInstanceUID === StudyInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -30,12 +30,35 @@ const combineFrameInstance = (frame, instance) => {
|
|||||||
.map(it => it[0])
|
.map(it => it[0])
|
||||||
.filter(it => it !== undefined && typeof it === 'object');
|
.filter(it => it !== undefined && typeof it === 'object');
|
||||||
|
|
||||||
return Object.assign(
|
// this is to fix NM multiframe datasets with position and orientation
|
||||||
{ frameNumber: frameNumber },
|
// information inside DetectorInformationSequence
|
||||||
instance,
|
if (
|
||||||
...Object.values(shared),
|
!instance.ImageOrientationPatient &&
|
||||||
...Object.values(perFrame)
|
instance.DetectorInformationSequence
|
||||||
);
|
) {
|
||||||
|
instance.ImageOrientationPatient =
|
||||||
|
instance.DetectorInformationSequence[0].ImageOrientationPatient;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!instance.ImagePositionPatient &&
|
||||||
|
instance.DetectorInformationSequence
|
||||||
|
) {
|
||||||
|
instance.ImagePositionPatient =
|
||||||
|
instance.DetectorInformationSequence[0].ImagePositionPatient;
|
||||||
|
}
|
||||||
|
|
||||||
|
const newInstance = Object.assign(instance, { frameNumber: frameNumber });
|
||||||
|
|
||||||
|
// merge the shared first then the per frame to override
|
||||||
|
[...shared, ...perFrame].forEach(item => {
|
||||||
|
Object.entries(item).forEach(([key, value]) => {
|
||||||
|
newInstance[key] = value;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Todo: we should cache this combined instance somewhere, maybe add it
|
||||||
|
// back to the dicomMetaStore so we don't have to do this again.
|
||||||
|
return newInstance;
|
||||||
} else {
|
} else {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,62 +30,98 @@ export default function isDisplaySetReconstructable(instances) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Can't reconstruct if all instances don't have the ImagePositionPatient.
|
// Can't reconstruct if all instances don't have the ImagePositionPatient.
|
||||||
if (!instances.every(instance => !!instance.ImagePositionPatient)) {
|
if (
|
||||||
|
!isMultiframe &&
|
||||||
|
!instances.every(instance => instance.ImagePositionPatient)
|
||||||
|
) {
|
||||||
return { value: false };
|
return { value: false };
|
||||||
}
|
}
|
||||||
|
|
||||||
const sortedInstances = sortInstancesByPosition(instances);
|
const sortedInstances = sortInstancesByPosition(instances);
|
||||||
|
|
||||||
if (isMultiframe) {
|
return isMultiframe
|
||||||
return processMultiframe(sortedInstances[0]);
|
? processMultiframe(sortedInstances[0])
|
||||||
} else {
|
: processSingleframe(sortedInstances);
|
||||||
return processSingleframe(sortedInstances);
|
}
|
||||||
}
|
|
||||||
|
function hasPixelMeasurements(multiFrameInstance) {
|
||||||
|
const perFrameSequence =
|
||||||
|
multiFrameInstance.PerFrameFunctionalGroupsSequence?.[0];
|
||||||
|
const sharedSequence = multiFrameInstance.SharedFunctionalGroupsSequence;
|
||||||
|
|
||||||
|
return (
|
||||||
|
Boolean(perFrameSequence?.PixelMeasuresSequence) ||
|
||||||
|
Boolean(sharedSequence?.PixelMeasuresSequence) ||
|
||||||
|
Boolean(
|
||||||
|
multiFrameInstance.PixelSpacing &&
|
||||||
|
(multiFrameInstance.SliceThickness ||
|
||||||
|
multiFrameInstance.SpacingBetweenFrames)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasOrientation(multiFrameInstance) {
|
||||||
|
const sharedSequence = multiFrameInstance.SharedFunctionalGroupsSequence;
|
||||||
|
const perFrameSequence =
|
||||||
|
multiFrameInstance.PerFrameFunctionalGroupsSequence?.[0];
|
||||||
|
|
||||||
|
return (
|
||||||
|
Boolean(sharedSequence?.PlaneOrientationSequence) ||
|
||||||
|
Boolean(perFrameSequence?.PlaneOrientationSequence) ||
|
||||||
|
Boolean(
|
||||||
|
multiFrameInstance.ImageOrientationPatient ||
|
||||||
|
multiFrameInstance.DetectorInformationSequence?.[0]
|
||||||
|
?.ImageOrientationPatient
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasPosition(multiFrameInstance) {
|
||||||
|
const perFrameSequence =
|
||||||
|
multiFrameInstance.PerFrameFunctionalGroupsSequence?.[0];
|
||||||
|
|
||||||
|
return (
|
||||||
|
Boolean(perFrameSequence?.PlanePositionSequence) ||
|
||||||
|
Boolean(perFrameSequence?.CTPositionSequence) ||
|
||||||
|
Boolean(
|
||||||
|
multiFrameInstance.ImagePositionPatient ||
|
||||||
|
multiFrameInstance.DetectorInformationSequence?.[0]
|
||||||
|
?.ImagePositionPatient
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isNMReconstructable(multiFrameInstance) {
|
||||||
|
const imageSubType = multiFrameInstance.ImageType?.[2];
|
||||||
|
return imageSubType === 'RECON TOMO' || imageSubType === 'RECON GATED TOMO';
|
||||||
}
|
}
|
||||||
|
|
||||||
function processMultiframe(multiFrameInstance) {
|
function processMultiframe(multiFrameInstance) {
|
||||||
const {
|
|
||||||
PerFrameFunctionalGroupsSequence,
|
|
||||||
SharedFunctionalGroupsSequence,
|
|
||||||
} = multiFrameInstance;
|
|
||||||
|
|
||||||
// If we don't have the PixelMeasuresSequence, then the pixel spacing and
|
// If we don't have the PixelMeasuresSequence, then the pixel spacing and
|
||||||
// slice thickness isn't specified or is changing and we can't reconstruct
|
// slice thickness isn't specified or is changing and we can't reconstruct
|
||||||
// the dataset.
|
// the dataset.
|
||||||
|
if (!hasPixelMeasurements(multiFrameInstance)) {
|
||||||
|
return { value: false };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasOrientation(multiFrameInstance)) {
|
||||||
|
console.log('No image orientation information, not reconstructable');
|
||||||
|
return { value: false };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasPosition(multiFrameInstance)) {
|
||||||
|
console.log('No image position information, not reconstructable');
|
||||||
|
return { value: false };
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!SharedFunctionalGroupsSequence ||
|
multiFrameInstance.Modality.includes('NM') &&
|
||||||
!SharedFunctionalGroupsSequence[0].PixelMeasuresSequence
|
!isNMReconstructable(multiFrameInstance)
|
||||||
) {
|
) {
|
||||||
return { value: false };
|
return { value: false };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that the orientation is either shared or with the allowed
|
|
||||||
// difference amount
|
|
||||||
const {
|
|
||||||
PlaneOrientationSequence: sharedOrientation,
|
|
||||||
} = SharedFunctionalGroupsSequence;
|
|
||||||
|
|
||||||
if (!sharedOrientation) {
|
|
||||||
const {
|
|
||||||
PlaneOrientationSequence: firstOrientation,
|
|
||||||
} = PerFrameFunctionalGroupsSequence[0];
|
|
||||||
|
|
||||||
if (!firstOrientation) {
|
|
||||||
console.log('No orientation information');
|
|
||||||
return { value: false };
|
|
||||||
}
|
|
||||||
// TODO - check orientation consistency
|
|
||||||
}
|
|
||||||
|
|
||||||
const frame0 = PerFrameFunctionalGroupsSequence[0];
|
|
||||||
const firstPosition =
|
|
||||||
frame0.PlanePositionSequence || frame0.CTPositionSequence;
|
|
||||||
if (!firstPosition) {
|
|
||||||
console.log('No image position information, not reconstructable');
|
|
||||||
return { value: false };
|
|
||||||
}
|
|
||||||
// TODO - check spacing consistency
|
// TODO - check spacing consistency
|
||||||
|
|
||||||
return { value: true };
|
return { value: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -65,7 +65,7 @@
|
|||||||
"config-point": "^0.4.8",
|
"config-point": "^0.4.8",
|
||||||
"core-js": "^3.16.1",
|
"core-js": "^3.16.1",
|
||||||
"cornerstone-math": "^0.1.9",
|
"cornerstone-math": "^0.1.9",
|
||||||
"cornerstone-wado-image-loader": "^4.10.2",
|
"cornerstone-wado-image-loader": "^4.13.0",
|
||||||
"dcmjs": "^0.29.4",
|
"dcmjs": "^0.29.4",
|
||||||
"detect-gpu": "^4.0.16",
|
"detect-gpu": "^4.0.16",
|
||||||
"dicom-parser": "^1.8.9",
|
"dicom-parser": "^1.8.9",
|
||||||
|
|||||||
@ -9,6 +9,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -15,6 +15,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
maxNumRequests: {
|
maxNumRequests: {
|
||||||
interaction: 100,
|
interaction: 100,
|
||||||
thumbnail: 75,
|
thumbnail: 75,
|
||||||
@ -34,10 +35,12 @@ window.config = {
|
|||||||
// wadoUriRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/wado',
|
// wadoUriRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/wado',
|
||||||
// qidoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs',
|
// qidoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs',
|
||||||
// wadoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs',
|
// wadoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs',
|
||||||
|
|
||||||
// new server
|
// new server
|
||||||
wadoUriRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb',
|
wadoUriRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb',
|
||||||
qidoRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb',
|
qidoRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb',
|
||||||
wadoRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb',
|
wadoRoot: 'https://domvja9iplmyu.cloudfront.net/dicomweb',
|
||||||
|
|
||||||
qidoSupportsIncludeField: false,
|
qidoSupportsIncludeField: false,
|
||||||
supportsReject: false,
|
supportsReject: false,
|
||||||
imageRendering: 'wadors',
|
imageRendering: 'wadors',
|
||||||
|
|||||||
@ -5,6 +5,7 @@ window.config = {
|
|||||||
// below flag is for performance reasons, but it might not work for all servers
|
// below flag is for performance reasons, but it might not work for all servers
|
||||||
omitQuotationForMultipartRequest: true,
|
omitQuotationForMultipartRequest: true,
|
||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
servers: {
|
servers: {
|
||||||
dicomWeb: [
|
dicomWeb: [
|
||||||
|
|||||||
@ -9,6 +9,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
@ -29,6 +30,20 @@ window.config = {
|
|||||||
supportsWildcard: false,
|
supportsWildcard: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom json',
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomjson',
|
||||||
|
sourceName: 'dicomjson',
|
||||||
|
configuration: {
|
||||||
|
name: 'json',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom local',
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomlocal',
|
||||||
|
sourceName: 'dicomlocal',
|
||||||
|
configuration: {},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
defaultDataSourceName: 'dicomweb',
|
defaultDataSourceName: 'dicomweb',
|
||||||
};
|
};
|
||||||
|
|||||||
@ -10,6 +10,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -8,6 +8,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
friendlyName: 'Orthanc Server',
|
friendlyName: 'Orthanc Server',
|
||||||
@ -23,6 +24,20 @@ window.config = {
|
|||||||
thumbnailRendering: 'wadors',
|
thumbnailRendering: 'wadors',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom json',
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomjson',
|
||||||
|
sourceName: 'dicomjson',
|
||||||
|
configuration: {
|
||||||
|
name: 'json',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom local',
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomlocal',
|
||||||
|
sourceName: 'dicomlocal',
|
||||||
|
configuration: {},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
defaultDataSourceName: 'dicomweb',
|
defaultDataSourceName: 'dicomweb',
|
||||||
};
|
};
|
||||||
|
|||||||
@ -6,6 +6,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
servers: {
|
servers: {
|
||||||
// This is an array, but we'll only use the first entry for now
|
// This is an array, but we'll only use the first entry for now
|
||||||
dicomWeb: [
|
dicomWeb: [
|
||||||
|
|||||||
@ -8,6 +8,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
friendlyName: 'Orthanc Server',
|
friendlyName: 'Orthanc Server',
|
||||||
@ -23,6 +24,20 @@ window.config = {
|
|||||||
thumbnailRendering: 'wadors',
|
thumbnailRendering: 'wadors',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom json',
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomjson',
|
||||||
|
sourceName: 'dicomjson',
|
||||||
|
configuration: {
|
||||||
|
name: 'json',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom local',
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomlocal',
|
||||||
|
sourceName: 'dicomlocal',
|
||||||
|
configuration: {},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
defaultDataSourceName: 'dicomweb',
|
defaultDataSourceName: 'dicomweb',
|
||||||
};
|
};
|
||||||
|
|||||||
@ -8,6 +8,7 @@ window.config = {
|
|||||||
maxNumberOfWebWorkers: 3,
|
maxNumberOfWebWorkers: 3,
|
||||||
showWarningMessageForCrossOrigin: false,
|
showWarningMessageForCrossOrigin: false,
|
||||||
showCPUFallbackMessage: false,
|
showCPUFallbackMessage: false,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -6,6 +6,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// This is an array, but we'll only use the first entry for now
|
// This is an array, but we'll only use the first entry for now
|
||||||
oidc: [
|
oidc: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -6,6 +6,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
servers: {
|
servers: {
|
||||||
// This is an array, but we'll only use the first entry for now
|
// This is an array, but we'll only use the first entry for now
|
||||||
dicomWeb: [],
|
dicomWeb: [],
|
||||||
|
|||||||
@ -8,6 +8,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
friendlyName: 'DCM4CHEE Server',
|
friendlyName: 'DCM4CHEE Server',
|
||||||
@ -27,6 +28,20 @@ window.config = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom json',
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomjson',
|
||||||
|
sourceName: 'dicomjson',
|
||||||
|
configuration: {
|
||||||
|
name: 'json',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom local',
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomlocal',
|
||||||
|
sourceName: 'dicomlocal',
|
||||||
|
configuration: {},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
studyListFunctionsEnabled: true,
|
studyListFunctionsEnabled: true,
|
||||||
defaultDataSourceName: 'dicomweb',
|
defaultDataSourceName: 'dicomweb',
|
||||||
|
|||||||
@ -8,6 +8,7 @@ window.config = {
|
|||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -12,6 +12,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -20,6 +20,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -9,6 +9,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -6,6 +6,7 @@ window.config = {
|
|||||||
showWarningMessageForCrossOrigin: true,
|
showWarningMessageForCrossOrigin: true,
|
||||||
showCPUFallbackMessage: true,
|
showCPUFallbackMessage: true,
|
||||||
showLoadingIndicator: true,
|
showLoadingIndicator: true,
|
||||||
|
strictZSpacingForVolumeViewport: true,
|
||||||
servers: {
|
servers: {
|
||||||
dicomWeb: [
|
dicomWeb: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -31,11 +31,6 @@ export default function buildModeRoutes({
|
|||||||
hotkeysManager,
|
hotkeysManager,
|
||||||
}) {
|
}) {
|
||||||
const routes = [];
|
const routes = [];
|
||||||
|
|
||||||
// const dataSources = Object.keys(extensionManager.dataSourceMap).map(a =>
|
|
||||||
// extensionManager.getDataSources(a)
|
|
||||||
// );
|
|
||||||
|
|
||||||
const dataSourceNames = [];
|
const dataSourceNames = [];
|
||||||
|
|
||||||
dataSources.forEach(dataSource => {
|
dataSources.forEach(dataSource => {
|
||||||
@ -61,7 +56,6 @@ export default function buildModeRoutes({
|
|||||||
servicesManager={servicesManager}
|
servicesManager={servicesManager}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
hotkeysManager={hotkeysManager}
|
hotkeysManager={hotkeysManager}
|
||||||
commandsManager={commandsManager}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -86,7 +80,6 @@ export default function buildModeRoutes({
|
|||||||
servicesManager={servicesManager}
|
servicesManager={servicesManager}
|
||||||
commandsManager={commandsManager}
|
commandsManager={commandsManager}
|
||||||
hotkeysManager={hotkeysManager}
|
hotkeysManager={hotkeysManager}
|
||||||
commandsManager={commandsManager}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
44
yarn.lock
44
yarn.lock
@ -1443,28 +1443,28 @@
|
|||||||
resolved "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.2.tgz#e96721d56f6ec96f7f95c16321d88cc8467d8d81"
|
resolved "https://registry.npmjs.org/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.2.tgz#e96721d56f6ec96f7f95c16321d88cc8467d8d81"
|
||||||
integrity sha512-lgdvBvvNezleY+4pIe2ceUsJzlZe/0PipdeubQ3vZZOz3xxtHHMR1XFCl4fgd8gosR8COHuD7h6q+MwgrwBsng==
|
integrity sha512-lgdvBvvNezleY+4pIe2ceUsJzlZe/0PipdeubQ3vZZOz3xxtHHMR1XFCl4fgd8gosR8COHuD7h6q+MwgrwBsng==
|
||||||
|
|
||||||
"@cornerstonejs/core@^0.38.0":
|
"@cornerstonejs/core@^0.40.0":
|
||||||
version "0.38.0"
|
version "0.40.0"
|
||||||
resolved "https://registry.npmjs.org/@cornerstonejs/core/-/core-0.38.0.tgz#6ee3341f38f78e98da85d2511ac16f25e9800f18"
|
resolved "https://registry.npmjs.org/@cornerstonejs/core/-/core-0.40.0.tgz#5b6409277362b26c6ddb55b54025ecf26b304f84"
|
||||||
integrity sha512-4/+qDEtGQRwV6AN5Ze4S6oOFiNH48oT5Mp/YQEzJHO+Zn9ceRHZ6ReTwccVUJ5QY2d5d89CoWJ2sKhdsLFZsNw==
|
integrity sha512-tjUGFyXuRNRSybpKpd/mP4tKMshc48n/TIt9x5mXU+zqywBPGmojkXOj/v+pG02XopKLg5XPSI4LPysZNVscsg==
|
||||||
dependencies:
|
dependencies:
|
||||||
detect-gpu "^4.0.45"
|
detect-gpu "^4.0.45"
|
||||||
lodash.clonedeep "4.5.0"
|
lodash.clonedeep "4.5.0"
|
||||||
|
|
||||||
"@cornerstonejs/streaming-image-volume-loader@^0.15.13":
|
"@cornerstonejs/streaming-image-volume-loader@^0.16.0":
|
||||||
version "0.15.13"
|
version "0.16.0"
|
||||||
resolved "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-0.15.13.tgz#d4c6651f5edac0adbc2c4059b78945fb70c38eb5"
|
resolved "https://registry.npmjs.org/@cornerstonejs/streaming-image-volume-loader/-/streaming-image-volume-loader-0.16.0.tgz#513f868c285963fd2f2dbf54ed7840a2dc05e33a"
|
||||||
integrity sha512-o0e+vEr08GmMztjabPs7vHKYhofW0dQvSI8Dy7tb1wKEnf05Tis/5s9sCt6PORNHXweK+Cylja3xy8b469ZuVw==
|
integrity sha512-+bbQ6/FN7ryCDdsuyheIPeRa5MO8mTDUDZusNIU97Q8fdmw1hB+eiy9fNThdGfCENd/GPANNsXe6K5olUX7QhQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@cornerstonejs/core" "^0.38.0"
|
"@cornerstonejs/core" "^0.40.0"
|
||||||
cornerstone-wado-image-loader "^4.10.2"
|
cornerstone-wado-image-loader "^4.10.2"
|
||||||
|
|
||||||
"@cornerstonejs/tools@^0.58.0":
|
"@cornerstonejs/tools@^0.60.1":
|
||||||
version "0.58.0"
|
version "0.60.1"
|
||||||
resolved "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-0.58.0.tgz#c9a2ba6a96491a565fe03a2ef1c1403bd70992e4"
|
resolved "https://registry.npmjs.org/@cornerstonejs/tools/-/tools-0.60.1.tgz#88cf32fe79c7fb714a99c1a63c25822233a4d231"
|
||||||
integrity sha512-sVsX6WGLmHg5UUg7p9iwvwjb8AswUypO2jARyIVtpa3JM3dP16Y0uh1jTWJFG2xWLZgEXDXcFCIhw5nOSohy7A==
|
integrity sha512-0GsxN8INh8/1/uKH4pU1ZT8XLNn4Xi2GJug9CQBT6plfnppru//+P+xl+LEQbYVpsydD1iYoWzLe8ykPuIeQCA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@cornerstonejs/core" "^0.38.0"
|
"@cornerstonejs/core" "^0.40.0"
|
||||||
lodash.clonedeep "4.5.0"
|
lodash.clonedeep "4.5.0"
|
||||||
lodash.get "^4.4.2"
|
lodash.get "^4.4.2"
|
||||||
|
|
||||||
@ -8527,6 +8527,22 @@ cornerstone-wado-image-loader@^4.10.2:
|
|||||||
pako "^2.0.4"
|
pako "^2.0.4"
|
||||||
uuid "^9.0.0"
|
uuid "^9.0.0"
|
||||||
|
|
||||||
|
cornerstone-wado-image-loader@^4.13.0:
|
||||||
|
version "4.13.0"
|
||||||
|
resolved "https://registry.npmjs.org/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-4.13.0.tgz#277173973b1d5ec90a2d10557df1f667065953da"
|
||||||
|
integrity sha512-pv3Ic1wDXUopa3DuSJ/IVmnrdUzEsva8ARB5w/I2JPnH3GaO80yZB6TtCqP8BUf3bl33O15k7EsGSICd2KoeCw==
|
||||||
|
dependencies:
|
||||||
|
"@babel/eslint-parser" "^7.19.1"
|
||||||
|
"@cornerstonejs/codec-charls" "^1.2.3"
|
||||||
|
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"
|
||||||
|
"@cornerstonejs/codec-openjpeg" "^1.2.2"
|
||||||
|
"@cornerstonejs/codec-openjph" "^2.4.2"
|
||||||
|
coverage-istanbul-loader "^3.0.5"
|
||||||
|
date-format "^4.0.14"
|
||||||
|
dicom-parser "^1.8.9"
|
||||||
|
pako "^2.0.4"
|
||||||
|
uuid "^9.0.0"
|
||||||
|
|
||||||
cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.1:
|
cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.1:
|
||||||
version "5.2.1"
|
version "5.2.1"
|
||||||
resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
|
resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user