Instance metadata/metadata providers overhaul (#1481)

* Instance metadata plus metadata provider overhaul.

Fix consumption of wado-uri urls

fallbacks + datatype agnosticism.

WIP DICOMify things.

fix various issues with naturalized variable naming migration.

Remove metadata provider.

Fix consumption of multiframe images and addition of CWIL metadata.

Fix strange build issues.

Fix CWIL style windowWidth to array from naturalized DICOM.

Fix PT, CT, CR and DX issues for cornerstone + DX issues for vtkjs.

Move color palette fetching down to the natuaralized JSON level.

Remove unused StudyMetadataSummary

Remove redundant dicom metadata dictionary.

Working local + json routes.

Fix SR read.

Finished first round of testing + cleaned up debugging etc.

* data => metadata for instance naturalizedJSON

* Update dcmjs version

* Correct github isssues.

* Fix erroneously replaced files.

* Danny's recommended changes.

* Instance metadata plus metadata provider overhaul.

Fix consumption of wado-uri urls

fallbacks + datatype agnosticism.

WIP DICOMify things.

fix various issues with naturalized variable naming migration.

Remove metadata provider.

Fix consumption of multiframe images and addition of CWIL metadata.

Fix strange build issues.

Fix CWIL style windowWidth to array from naturalized DICOM.

Fix PT, CT, CR and DX issues for cornerstone + DX issues for vtkjs.

Move color palette fetching down to the natuaralized JSON level.

Remove unused StudyMetadataSummary

Remove redundant dicom metadata dictionary.

Working local + json routes.

Fix SR read.

Finished first round of testing + cleaned up debugging etc.

* data => metadata for instance naturalizedJSON

* Update dcmjs version

* Correct github isssues.

* Fix erroneously replaced files.

* Danny's recommended changes.

* Update JSON CI

* Update casing of import.

* Fix jump for SR.

* Fix unit tests for measurements service

* Fix json CI test.

* fix: update yarn lock

* Fix local non-encapsulated pdf view

* CI updated to new sucess message.

Co-authored-by: Danny <danny.ri.brown@gmail.com>
This commit is contained in:
James PettsandDanny authored and GitHub committed 2020-03-09 19:03:23 +00:00
1 parent 8833731ad3
commit 1d85f7a74e
142 files changed
+5322 -8570

No files matched your search

@@ -16,20 +16,20 @@ function IHEInvokeImageDisplay({ location }) {
case 'STUDY':
return (
<ConnectedViewerRetrieveStudyData
studyInstanceUids={studyUID.split(';')}
studyInstanceUIDs={studyUID.split(';')}
/>
);
case 'STUDYBASE64':
return (
<ConnectedViewerRetrieveStudyData
studyInstanceUids={UrlUtil.paramString.parseParam(studyUID)}
studyInstanceUIDs={UrlUtil.paramString.parseParam(studyUID)}
/>
);
case 'PATIENT':
// TODO: connect this to the StudyList when we have the filter parameters set up
// return <StudyList patientUids={patientID.split(';')} />;
// return <StudyList patientUIDs={patientID.split(';')} />;
return '';
default:
+62 -31
View File
@@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { log, metadata, utils } from '@ohif/core';
import OHIF from '@ohif/core';
import PropTypes from 'prop-types';
import qs from 'querystring';
@@ -8,15 +8,16 @@ import ConnectedViewer from '../connectedComponents/ConnectedViewer';
import ConnectedViewerRetrieveStudyData from '../connectedComponents/ConnectedViewerRetrieveStudyData';
import NotFound from '../routes/NotFound';
const { studyMetadataManager, updateMetaDataManager } = utils;
const { log, metadata, utils } = OHIF;
const { studyMetadataManager } = utils;
const { OHIFStudyMetadata } = metadata;
class StandaloneRouting extends Component {
state = {
studies: null,
server: null,
studyInstanceUids: null,
seriesInstanceUids: null,
studyInstanceUIDs: null,
seriesInstanceUIDs: null,
error: null,
loading: true,
};
@@ -63,7 +64,7 @@ class StandaloneRouting extends Component {
const data = JSON.parse(oReq.responseText);
if (data.servers) {
if (!query.studyInstanceUids) {
if (!query.studyInstanceUIDs) {
log.warn('No study instance uids specified');
reject(new Error('No study instance uids specified'));
}
@@ -74,12 +75,41 @@ class StandaloneRouting extends Component {
log.warn('Activating server', server);
this.props.activateServer(server);
const studyInstanceUids = query.studyInstanceUids.split(';');
const seriesInstanceUids = query.seriesInstanceUids ? query.seriesInstanceUids.split(';') : [];
const studyInstanceUIDs = query.studyInstanceUIDs.split(';');
const seriesInstanceUIDs = query.seriesInstanceUIDs
? query.seriesInstanceUIDs.split(';')
: [];
resolve({ server, studyInstanceUids, seriesInstanceUids });
resolve({ server, studyInstanceUIDs, seriesInstanceUIDs });
} else {
resolve({ studies: data.studies, studyInstanceUids: [] });
// Parse data here and add to metadata provider.
const metadataProvider = OHIF.cornerstone.metadataProvider;
let StudyInstanceUID;
let SeriesInstanceUID;
data.studies.forEach(study => {
StudyInstanceUID = study.StudyInstanceUID;
study.series.forEach(series => {
SeriesInstanceUID = series.SeriesInstanceUID;
series.instances.forEach(instance => {
const { url: imageId, metadata: naturalizedDicom } = instance;
// Add instance to metadata provider.
metadataProvider.addInstance(naturalizedDicom);
// Add imageId specific mapping to this data as the URL isn't necessarliy WADO-URI.
metadataProvider.addImageIdToUIDs(imageId, {
StudyInstanceUID,
SeriesInstanceUID,
SOPInstanceUID: naturalizedDicom.SOPInstanceUID,
});
});
});
});
resolve({ studies: data.studies, studyInstanceUIDs: [] });
}
});
@@ -106,24 +136,24 @@ class StandaloneRouting extends Component {
let {
server,
studies,
studyInstanceUids,
seriesInstanceUids,
studyInstanceUIDs,
seriesInstanceUIDs,
} = await this.parseQueryAndRetrieveDICOMWebData(query);
if (studies) {
const {
studies: updatedStudies,
studyInstanceUids: updatedStudiesInstanceUids,
studyInstanceUIDs: updatedStudiesInstanceUIDs,
} = _mapStudiesToNewFormat(studies);
studies = updatedStudies;
studyInstanceUids = updatedStudiesInstanceUids;
studyInstanceUIDs = updatedStudiesInstanceUIDs;
}
this.setState({
studies,
server,
studyInstanceUids,
seriesInstanceUids,
studyInstanceUIDs,
seriesInstanceUIDs,
loading: false,
});
} catch (error) {
@@ -132,7 +162,9 @@ class StandaloneRouting extends Component {
}
render() {
const message = this.state.error ? `Error: ${JSON.stringify(this.state.error)}` : 'Loading...';
const message = this.state.error
? `Error: ${JSON.stringify(this.state.error)}`
: 'Loading...';
if (this.state.error || this.state.loading) {
return <NotFound message={message} showGoBackButton={this.state.error} />;
}
@@ -140,12 +172,12 @@ class StandaloneRouting extends Component {
return this.state.studies ? (
<ConnectedViewer studies={this.state.studies} />
) : (
<ConnectedViewerRetrieveStudyData
studyInstanceUids={this.state.studyInstanceUids}
seriesInstanceUids={this.state.seriesInstanceUids}
server={this.state.server}
/>
);
<ConnectedViewerRetrieveStudyData
studyInstanceUIDs={this.state.studyInstanceUIDs}
seriesInstanceUIDs={this.state.seriesInstanceUIDs}
server={this.state.server}
/>
);
}
}
@@ -153,27 +185,26 @@ const _mapStudiesToNewFormat = studies => {
studyMetadataManager.purge();
/* Map studies to new format, update metadata manager? */
const uniqueStudyUids = new Set();
const uniqueStudyUIDs = new Set();
const updatedStudies = studies.map(study => {
const studyMetadata = new OHIFStudyMetadata(study, study.studyInstanceUid);
const studyMetadata = new OHIFStudyMetadata(study, study.StudyInstanceUID);
const sopClassHandlerModules = extensionManager.modules['sopClassHandlerModule'];
study.displaySets = study.displaySets ||
const sopClassHandlerModules =
extensionManager.modules['sopClassHandlerModule'];
study.displaySets =
study.displaySets ||
studyMetadata.createDisplaySets(sopClassHandlerModules);
studyMetadata.setDisplaySets(study.displaySets);
/* Updates WADO-RS metaDataManager */
updateMetaDataManager(study);
studyMetadataManager.add(studyMetadata);
uniqueStudyUids.add(study.studyInstanceUid);
uniqueStudyUIDs.add(study.StudyInstanceUID);
return study;
});
return {
studies: updatedStudies,
studyInstanceUids: Array.from(uniqueStudyUids),
studyInstanceUIDs: Array.from(uniqueStudyUIDs),
};
};
+13 -13
View File
@@ -7,15 +7,15 @@ const { urlUtil: UrlUtil } = OHIF.utils;
/**
* Get array of seriesUIDs from param or from queryString
* @param {*} seriesInstanceUids
* @param {*} seriesInstanceUIDs
* @param {*} location
*/
const getSeriesInstanceUIDs = (seriesInstanceUids, routeLocation) => {
const getSeriesInstanceUIDs = (seriesInstanceUIDs, routeLocation) => {
const queryFilters = UrlUtil.queryString.getQueryFilters(routeLocation);
const querySeriesUIDs = queryFilters && queryFilters['seriesInstanceUID'];
const _seriesInstanceUids = seriesInstanceUids || querySeriesUIDs;
const _seriesInstanceUIDs = seriesInstanceUIDs || querySeriesUIDs;
return UrlUtil.paramString.parseParam(_seriesInstanceUids);
return UrlUtil.paramString.parseParam(_seriesInstanceUIDs);
};
function ViewerRouting({ match: routeMatch, location: routeLocation }) {
@@ -24,19 +24,19 @@ function ViewerRouting({ match: routeMatch, location: routeLocation }) {
location,
dataset,
dicomStore,
studyInstanceUids,
seriesInstanceUids,
studyInstanceUIDs,
seriesInstanceUIDs,
} = routeMatch.params;
const server = useServer({ project, location, dataset, dicomStore });
const studyUids = UrlUtil.paramString.parseParam(studyInstanceUids);
const seriesUids = getSeriesInstanceUIDs(seriesInstanceUids, routeLocation);
const studyUIDs = UrlUtil.paramString.parseParam(studyInstanceUIDs);
const seriesUIDs = getSeriesInstanceUIDs(seriesInstanceUIDs, routeLocation);
if (server && studyUids) {
if (server && studyUIDs) {
return (
<ConnectedViewerRetrieveStudyData
studyInstanceUids={studyUids}
seriesInstanceUids={seriesUids}
studyInstanceUIDs={studyUIDs}
seriesInstanceUIDs={seriesUIDs}
/>
);
}
@@ -47,8 +47,8 @@ function ViewerRouting({ match: routeMatch, location: routeLocation }) {
ViewerRouting.propTypes = {
match: PropTypes.shape({
params: PropTypes.shape({
studyInstanceUids: PropTypes.string.isRequired,
seriesInstanceUids: PropTypes.string,
studyInstanceUIDs: PropTypes.string.isRequired,
seriesInstanceUIDs: PropTypes.string,
dataset: PropTypes.string,
dicomStore: PropTypes.string,
location: PropTypes.string,
+2 -2
View File
@@ -32,7 +32,7 @@ const reload = () => window.location.reload();
const ROUTES_DEF = {
default: {
viewer: {
path: '/viewer/:studyInstanceUids',
path: '/viewer/:studyInstanceUIDs',
component: ViewerRouting,
},
standaloneViewer: {
@@ -59,7 +59,7 @@ const ROUTES_DEF = {
gcloud: {
viewer: {
path:
'/projects/:project/locations/:location/datasets/:dataset/dicomStores/:dicomStore/study/:studyInstanceUids',
'/projects/:project/locations/:location/datasets/:dataset/dicomStores/:dicomStore/study/:studyInstanceUIDs',
component: ViewerRouting,
condition: appConfig => {
return !!appConfig.enableGoogleCloudAdapter;