feat(WADO) Allow WADO / QIDO requests to originate from client (#222)
This commit is contained in:
1 parent
92408d4c86
commit
ebe0a40f3e
43 files changed
+519
-571
No files matched your search
@@ -0,0 +1,2 @@
|
||||
import './lib';
|
||||
import './services';
|
||||
File renamed without changes.
+1
@@ -1 +1,2 @@
|
||||
import './encodeQueryData.js';
|
||||
import './parseFloatArray.js';
|
||||
File renamed without changes.
@@ -0,0 +1,6 @@
|
||||
import './namespace';
|
||||
|
||||
// DICOMWeb instance, study, and metadata retrieval
|
||||
import './qido/instances.js';
|
||||
import './qido/studies.js';
|
||||
import './wado/retrieveMetadata.js';
|
||||
@@ -0,0 +1,6 @@
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
|
||||
OHIF.studies.services = {
|
||||
QIDO: {},
|
||||
WADO: {}
|
||||
};
|
||||
+1
@@ -1,4 +1,5 @@
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { DICOMWeb } from 'meteor/ohif:dicomweb-client';
|
||||
|
||||
/**
|
||||
* Creates a QIDO URL given the server settings and a study instance UID
|
||||
+8
-7
@@ -1,4 +1,5 @@
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { DICOMWeb } from 'meteor/ohif:dicomweb-client';
|
||||
|
||||
/**
|
||||
* Creates a QIDO date string for a date range query
|
||||
@@ -99,13 +100,13 @@ function resultDataToStudies(resultData) {
|
||||
OHIF.studies.services.QIDO.Studies = (server, filter) => {
|
||||
const url = filterToQIDOURL(server, filter);
|
||||
|
||||
try {
|
||||
const result = DICOMWeb.getJSON(url, server.requestOptions);
|
||||
return new Promise((resolve, reject) => {
|
||||
console.warn(DICOMWeb);
|
||||
|
||||
return resultDataToStudies(result.data);
|
||||
} catch (error) {
|
||||
OHIF.log.trace();
|
||||
DICOMWeb.getJSON(url, server.requestOptions).then(result => {
|
||||
const studies = resultDataToStudies(result);
|
||||
|
||||
throw error;
|
||||
}
|
||||
resolve(studies);
|
||||
}, reject);
|
||||
});
|
||||
};
|
||||
+66
-71
@@ -1,4 +1,5 @@
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { DICOMWeb } from 'meteor/ohif:dicomweb-client';
|
||||
import { parseFloatArray } from '../../lib/parseFloatArray';
|
||||
|
||||
/**
|
||||
@@ -67,9 +68,8 @@ function buildInstanceWadoUrl(server, studyInstanceUid, seriesInstanceUid, sopIn
|
||||
params.push('transferSyntax=*');
|
||||
|
||||
const paramString = params.join('&');
|
||||
const uri = encodeURIComponent(paramString);
|
||||
|
||||
return `${server.wadoUriRoot}?${uri}`;
|
||||
return `${server.wadoUriRoot}?${paramString}`;
|
||||
}
|
||||
|
||||
function buildInstanceWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid) {
|
||||
@@ -106,17 +106,19 @@ function getPaletteColor(server, instance, tag, lutDescriptor) {
|
||||
const numLutEntries = lutDescriptor[0];
|
||||
const bits = lutDescriptor[2];
|
||||
const uri = WADOProxy.convertURL(instance[tag].BulkDataURI, server)
|
||||
const data = DICOMWeb.getBulkData(uri);
|
||||
const bulkDataPromise = DICOMWeb.getBulkData(uri);
|
||||
|
||||
for (var i = 0; i < numLutEntries; i++) {
|
||||
if(bits === 16) {
|
||||
lut[i] = data.readUInt16LE(i*2);
|
||||
} else {
|
||||
lut[i] = data.readUInt8(i);
|
||||
return bulkDataPromise.then(data => {
|
||||
for (var i = 0; i < numLutEntries; i++) {
|
||||
if(bits === 16) {
|
||||
lut[i] = data[i * 65536] + data[i + 1];
|
||||
} else {
|
||||
lut[i] = data[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return lut;
|
||||
return lut;
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -126,38 +128,33 @@ function getPaletteColor(server, instance, tag, lutDescriptor) {
|
||||
* @param instance {Object} The retrieved instance metadata;
|
||||
* @returns {String} The ReferenceSOPInstanceUID
|
||||
*/
|
||||
function getPaletteColors(server, instance, lutDescriptor) {
|
||||
async function getPaletteColors(server, instance, lutDescriptor) {
|
||||
let entry = null;
|
||||
let paletteUID = DICOMWeb.getString(instance['00281199']);
|
||||
|
||||
let entry = null,
|
||||
paletteUID = DICOMWeb.getString(instance['00281199']);
|
||||
|
||||
if (paletteColorCache.isValidUID(paletteUID)) {
|
||||
entry = paletteColorCache.get(paletteUID);
|
||||
} else {
|
||||
paletteUID = null;
|
||||
}
|
||||
|
||||
if (!entry) {
|
||||
// no entry on cache... Fetch remote data.
|
||||
try {
|
||||
let r, g, b;
|
||||
r = getPaletteColor(server, instance, '00281201', lutDescriptor);
|
||||
g = getPaletteColor(server, instance, '00281202', lutDescriptor);;
|
||||
b = getPaletteColor(server, instance, '00281203', lutDescriptor);;
|
||||
|
||||
entry = { red: r, green: g, blue: b };
|
||||
if (paletteUID !== null) {
|
||||
// when paletteUID is present, the entry can be cached...
|
||||
entry.uid = paletteUID;
|
||||
paletteColorCache.add(entry);
|
||||
}
|
||||
} catch (error) {
|
||||
OHIF.log.error(`(${error.name}) ${error.message}`);
|
||||
return new Promise((resolve, reject) => {
|
||||
if (paletteColorCache.isValidUID(paletteUID)) {
|
||||
entry = paletteColorCache.get(paletteUID);
|
||||
return resolve(entry);
|
||||
}
|
||||
}
|
||||
|
||||
return entry;
|
||||
// no entry in cache... Fetch remote data.
|
||||
const r = getPaletteColor(server, instance, '00281201', lutDescriptor);
|
||||
const g = getPaletteColor(server, instance, '00281202', lutDescriptor);;
|
||||
const b = getPaletteColor(server, instance, '00281203', lutDescriptor);;
|
||||
|
||||
const promises = [r, g, b];
|
||||
|
||||
Promise.all(promises).then((args) => {
|
||||
entry = { red: r, green: g, blue: b };
|
||||
|
||||
// when paletteUID is present, the entry can be cached...
|
||||
entry.uid = paletteUID;
|
||||
paletteColorCache.add(entry);
|
||||
|
||||
resolve(entry);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getFrameIncrementPointer(element) {
|
||||
@@ -204,21 +201,27 @@ function getRadiopharmaceuticalInfo(instance) {
|
||||
* @param resultData
|
||||
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
|
||||
*/
|
||||
function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
||||
var seriesMap = {};
|
||||
var seriesList = [];
|
||||
async function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
||||
const seriesMap = {};
|
||||
const seriesList = [];
|
||||
|
||||
if (!WADOProxy) {
|
||||
WADOProxy = {
|
||||
convertURL: (a => a)
|
||||
};
|
||||
}
|
||||
|
||||
if (!resultData.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
var anInstance = resultData[0];
|
||||
const anInstance = resultData[0];
|
||||
if (!anInstance) {
|
||||
return;
|
||||
}
|
||||
|
||||
var studyData = {
|
||||
seriesList: seriesList,
|
||||
const studyData = {
|
||||
seriesList,
|
||||
patientName: DICOMWeb.getName(anInstance['00100010']),
|
||||
patientId: DICOMWeb.getString(anInstance['00100020']),
|
||||
patientAge: DICOMWeb.getNumber(anInstance['00101010']),
|
||||
@@ -233,7 +236,7 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
||||
institutionName: DICOMWeb.getString(anInstance['00080080'])
|
||||
};
|
||||
|
||||
resultData.forEach(function(instance) {
|
||||
await Promise.all(resultData.map(async function(instance) {
|
||||
var seriesInstanceUid = DICOMWeb.getString(instance['0020000E']);
|
||||
var series = seriesMap[seriesInstanceUid];
|
||||
if (!series) {
|
||||
@@ -250,17 +253,16 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
||||
seriesList.push(series);
|
||||
}
|
||||
|
||||
var sopInstanceUid = DICOMWeb.getString(instance['00080018']);
|
||||
|
||||
const sopInstanceUid = DICOMWeb.getString(instance['00080018']);
|
||||
const wadouri = buildInstanceWadoUrl(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
|
||||
const baseWadoRsUri = buildInstanceWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
|
||||
const wadorsuri = buildInstanceFrameWadoRsUri(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
|
||||
|
||||
var instanceSummary = {
|
||||
const instanceSummary = {
|
||||
imageType: DICOMWeb.getString(instance['00080008']),
|
||||
sopClassUid: DICOMWeb.getString(instance['00080016']),
|
||||
modality: DICOMWeb.getString(instance['00080060']),
|
||||
sopInstanceUid: sopInstanceUid,
|
||||
sopInstanceUid,
|
||||
instanceNumber: DICOMWeb.getNumber(instance['00200013']),
|
||||
imagePositionPatient: DICOMWeb.getString(instance['00200032']),
|
||||
imageOrientationPatient: DICOMWeb.getString(instance['00200037']),
|
||||
@@ -312,12 +314,13 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
||||
const redPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281101']));
|
||||
const greenPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281102']));
|
||||
const bluePaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281103']));
|
||||
const palettes = getPaletteColors(server, instance, redPaletteColorLookupTableDescriptor);
|
||||
const palettes = await getPaletteColors(server, instance, redPaletteColorLookupTableDescriptor);
|
||||
|
||||
if (palettes) {
|
||||
if (palettes.uid) {
|
||||
instanceSummary.paletteColorLookupTableUID = palettes.uid;
|
||||
}
|
||||
|
||||
instanceSummary.redPaletteColorLookupTableData = palettes.red;
|
||||
instanceSummary.greenPaletteColorLookupTableData = palettes.green;
|
||||
instanceSummary.bluePaletteColorLookupTableData = palettes.blue;
|
||||
@@ -328,8 +331,7 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
||||
}
|
||||
|
||||
series.instances.push(instanceSummary);
|
||||
|
||||
});
|
||||
}));
|
||||
|
||||
return studyData;
|
||||
}
|
||||
@@ -338,26 +340,19 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
|
||||
* Retrieved Study MetaData from a DICOM server using a WADO call
|
||||
* @param server
|
||||
* @param studyInstanceUid
|
||||
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
|
||||
* @returns {Promise}
|
||||
*/
|
||||
OHIF.studies.services.WADO.RetrieveMetadata = function(server, studyInstanceUid) {
|
||||
var url = buildUrl(server, studyInstanceUid);
|
||||
OHIF.studies.services.WADO.RetrieveMetadata = async function(server, studyInstanceUid) {
|
||||
const url = buildUrl(server, studyInstanceUid);
|
||||
|
||||
try {
|
||||
var result = DICOMWeb.getJSON(url, server.requestOptions);
|
||||
return new Promise((resolve, reject) => {
|
||||
DICOMWeb.getJSON(url, server.requestOptions).then(result => {
|
||||
resultDataToStudyMetadata(server, studyInstanceUid, result).then((study) => {
|
||||
study.wadoUriRoot = server.wadoUriRoot;
|
||||
study.studyInstanceUid = studyInstanceUid;
|
||||
|
||||
var study = resultDataToStudyMetadata(server, studyInstanceUid, result.data);
|
||||
if (!study) {
|
||||
study = {};
|
||||
}
|
||||
|
||||
study.wadoUriRoot = server.wadoUriRoot;
|
||||
study.studyInstanceUid = studyInstanceUid;
|
||||
|
||||
return study;
|
||||
} catch (error) {
|
||||
OHIF.log.trace();
|
||||
|
||||
throw error;
|
||||
}
|
||||
resolve(study);
|
||||
}, reject);
|
||||
}, reject);
|
||||
});
|
||||
};
|
||||
@@ -1,6 +1,7 @@
|
||||
import { ReactiveDict } from 'meteor/reactive-dict';
|
||||
import { Tracker } from 'meteor/tracker';
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { Meteor } from "meteor/meteor";
|
||||
|
||||
// Create a studies loaded state dictionary to enable reactivity. Values: loading|loaded|failed
|
||||
OHIF.studies.loadingDict = new ReactiveDict();
|
||||
@@ -24,16 +25,34 @@ OHIF.studies.loadStudy = studyInstanceUid => new Promise((resolve, reject) => {
|
||||
}
|
||||
|
||||
return OHIF.studies.retrieveStudyMetadata(studyInstanceUid).then(study => {
|
||||
// Add the display sets to the study if not present
|
||||
if (!study.displaySets) {
|
||||
const displaySets = OHIF.viewerbase.sortingManager.getDisplaySets(study);
|
||||
study.displaySets = displaySets;
|
||||
study.setDisplaySets(displaySets);
|
||||
study.forEachDisplaySet(displaySet => {
|
||||
OHIF.viewerbase.stackManager.makeAndAddStack(study, displaySet);
|
||||
if (window.HipaaLogger && Meteor.user && Meteor.user()) {
|
||||
window.HipaaLogger.logEvent({
|
||||
eventType: 'viewed',
|
||||
userId: Meteor.userId(),
|
||||
userName: Meteor.user().profile.fullName,
|
||||
collectionName: 'Study',
|
||||
recordId: studyInstanceUid,
|
||||
patientId: study.patientId,
|
||||
patientName: study.patientName
|
||||
});
|
||||
}
|
||||
|
||||
// Once the data was retrieved, the series are sorted by series and instance number
|
||||
OHIF.viewerbase.sortStudy(study);
|
||||
|
||||
// Updates WADO-RS metaDataManager
|
||||
OHIF.viewerbase.updateMetaDataManager(study);
|
||||
|
||||
// Transform the study in a StudyMetadata object
|
||||
const studyMetadata = new OHIF.metadata.StudyMetadata(study);
|
||||
|
||||
// Add the display sets to the study
|
||||
study.displaySets = OHIF.viewerbase.sortingManager.getDisplaySets(studyMetadata);
|
||||
study.displaySets.forEach(displaySet => {
|
||||
OHIF.viewerbase.stackManager.makeAndAddStack(study, displaySet);
|
||||
studyMetadata.addDisplaySet(displaySet);
|
||||
});
|
||||
|
||||
// Double check to make sure this study wasn't already inserted into OHIF.viewer.Studies
|
||||
// so we don't cause duplicate entry errors
|
||||
const loaded = OHIF.viewer.Studies.findBy({ studyInstanceUid: study.studyInstanceUid });
|
||||
|
||||
@@ -6,6 +6,18 @@ import 'meteor/ohif:viewerbase';
|
||||
// promises and prevent unnecessary subsequent calls to the server
|
||||
const StudyMetaDataPromises = new Map();
|
||||
|
||||
/**
|
||||
* Delete the study promise cached to ensure next retrieve will get it retrieved by server call
|
||||
*
|
||||
* @param {String} studyInstanceUid The UID of the Study to be removed from cache
|
||||
*
|
||||
*/
|
||||
OHIF.studies.deleteStudyMetadataPromise = (studyInstanceUid) => {
|
||||
if (StudyMetaDataPromises.has(studyInstanceUid)) {
|
||||
StudyMetaDataPromises.delete(studyInstanceUid);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves study metadata using a server call
|
||||
*
|
||||
@@ -30,70 +42,50 @@ OHIF.studies.retrieveStudyMetadata = (studyInstanceUid, seriesInstanceUids) => {
|
||||
|
||||
// Create a promise to handle the data retrieval
|
||||
const promise = new Promise((resolve, reject) => {
|
||||
const server = OHIF.servers.getCurrentServer();
|
||||
|
||||
// If no study metadata is in the cache variable, we need to retrieve it from
|
||||
// the server with a call.
|
||||
Meteor.call('GetStudyMetadata', studyInstanceUid, function(error, study) {
|
||||
OHIF.log.timeEnd(timingKey);
|
||||
if (server.type === 'dicomWeb' && server.requestOptions.requestFromBrowser === true) {
|
||||
OHIF.studies.services.WADO.RetrieveMetadata(server, studyInstanceUid).then(function (data) {
|
||||
resolve(data)
|
||||
}, reject);
|
||||
} else {
|
||||
Meteor.call('GetStudyMetadata', studyInstanceUid, function (error, study) {
|
||||
OHIF.log.timeEnd(timingKey);
|
||||
|
||||
if (error) {
|
||||
const errorType = error.error;
|
||||
let errorMessage = '';
|
||||
if (error) {
|
||||
const errorType = error.error;
|
||||
let errorMessage = '';
|
||||
|
||||
if (errorType === 'server-connection-error') {
|
||||
errorMessage = 'There was an error connecting to the DICOM server, please verify if it is up and running.';
|
||||
} else if (errorType === 'server-internal-error') {
|
||||
errorMessage = `There was an internal error with the DICOM server getting metadeta for ${studyInstanceUid}`;
|
||||
} else {
|
||||
errorMessage = `For some reason we could not retrieve the study\'s metadata for ${studyInstanceUid}.`;
|
||||
if (errorType === 'server-connection-error') {
|
||||
errorMessage = 'There was an error connecting to the DICOM server, please verify if it is up and running.';
|
||||
} else if (errorType === 'server-internal-error') {
|
||||
errorMessage = `There was an internal error with the DICOM server getting metadeta for ${studyInstanceUid}`;
|
||||
} else {
|
||||
errorMessage = `For some reason we could not retrieve the study\'s metadata for ${studyInstanceUid}.`;
|
||||
}
|
||||
|
||||
OHIF.log.error(errorMessage);
|
||||
OHIF.log.error(error.stack);
|
||||
reject(`GetStudyMetadata: ${errorMessage}`);
|
||||
return;
|
||||
}
|
||||
|
||||
OHIF.log.error(errorMessage);
|
||||
OHIF.log.error(error.stack);
|
||||
reject(`GetStudyMetadata: ${errorMessage}`);
|
||||
return;
|
||||
}
|
||||
// Filter series if seriesInstanceUid exists
|
||||
if (seriesInstanceUids && seriesInstanceUids.length) {
|
||||
study.seriesList = study.seriesList.filter(series => seriesInstanceUids.indexOf(series.seriesInstanceUid) > -1);
|
||||
}
|
||||
|
||||
// Filter series if seriesInstanceUid exists
|
||||
if (seriesInstanceUids && seriesInstanceUids.length) {
|
||||
study.seriesList = study.seriesList.filter(series => seriesInstanceUids.indexOf(series.seriesInstanceUid) > -1);
|
||||
}
|
||||
if (!study) {
|
||||
reject(`GetStudyMetadata: No study data returned from server: ${studyInstanceUid}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!study) {
|
||||
reject(`GetStudyMetadata: No study data returned from server: ${studyInstanceUid}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (window.HipaaLogger && Meteor.user && Meteor.user()) {
|
||||
window.HipaaLogger.logEvent({
|
||||
eventType: 'viewed',
|
||||
userId: Meteor.userId(),
|
||||
userName: Meteor.user().profile.fullName,
|
||||
collectionName: 'Study',
|
||||
recordId: studyInstanceUid,
|
||||
patientId: study.patientId,
|
||||
patientName: study.patientName
|
||||
});
|
||||
}
|
||||
|
||||
// Once the data was retrieved, the series are sorted by series and instance number
|
||||
OHIF.viewerbase.sortStudy(study);
|
||||
|
||||
// Updates WADO-RS metaDataManager
|
||||
OHIF.viewerbase.updateMetaDataManager(study);
|
||||
|
||||
// Transform the study in a StudyMetadata object
|
||||
const studyMetadata = new OHIF.metadata.StudyMetadata(study);
|
||||
|
||||
// Add the display sets to the study
|
||||
study.displaySets = OHIF.viewerbase.sortingManager.getDisplaySets(studyMetadata);
|
||||
study.displaySets.forEach(displaySet => {
|
||||
OHIF.viewerbase.stackManager.makeAndAddStack(study, displaySet);
|
||||
studyMetadata.addDisplaySet(displaySet);
|
||||
// Resolve the promise with the final study metadata object
|
||||
resolve(study);
|
||||
});
|
||||
|
||||
// Resolve the promise with the final study metadata object
|
||||
resolve(study);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Store the promise in cache
|
||||
|
||||
@@ -15,13 +15,19 @@ OHIF.studies.searchStudies = filter => {
|
||||
return studySearchPromises.get(promiseKey);
|
||||
} else {
|
||||
const promise = new Promise((resolve, reject) => {
|
||||
Meteor.call('StudyListSearch', filter, (error, studiesData) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
resolve(studiesData);
|
||||
}
|
||||
});
|
||||
const server = OHIF.servers.getCurrentServer();
|
||||
|
||||
if (server.type === 'dicomWeb' && server.requestOptions.requestFromBrowser === true) {
|
||||
OHIF.studies.services.QIDO.Studies(server, filter).then(resolve, reject);
|
||||
} else {
|
||||
Meteor.call('StudyListSearch', filter, (error, studiesData) => {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
resolve(studiesData);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
studySearchPromises.set(promiseKey, promise);
|
||||
return promise;
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
import './lib';
|
||||
import './methods';
|
||||
import './services';
|
||||
@@ -5,6 +5,7 @@ import { OHIF } from 'meteor/ohif:core';
|
||||
* an array of series that are present in the study
|
||||
*
|
||||
* @param resultData
|
||||
* @param studyInstanceUid
|
||||
* @returns {Array} Series List
|
||||
*/
|
||||
function resultDataToStudyMetadata(resultData, studyInstanceUid) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { parseFloatArray } from 'meteor/ohif:studies/imports/server/lib/parseFloatArray';
|
||||
import { parseFloatArray } from 'meteor/ohif:studies/imports/both/lib/parseFloatArray';
|
||||
|
||||
/**
|
||||
* Returns the value of the element (e.g. '00280009')
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
import './namespace.js';
|
||||
|
||||
// DICOMWeb instance, study, and metadata retrieval
|
||||
import './qido/instances.js';
|
||||
import './qido/studies.js';
|
||||
import './wado/retrieveMetadata.js';
|
||||
|
||||
// DIMSE instance, study, and metadata retrieval
|
||||
import './dimse/instances.js';
|
||||
import './dimse/studies.js';
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
|
||||
const Services = {};
|
||||
Services.QIDO = {};
|
||||
Services.WADO = {};
|
||||
Services.DIMSE = {};
|
||||
|
||||
OHIF.studies.services = Services;
|
||||
OHIF.studies.services.DIMSE = {};
|
||||
@@ -5,7 +5,7 @@ Package.describe({
|
||||
});
|
||||
|
||||
Package.onUse(function(api) {
|
||||
api.versionsFrom('1.4');
|
||||
api.versionsFrom('1.6');
|
||||
|
||||
api.use([
|
||||
'ecmascript',
|
||||
@@ -21,6 +21,7 @@ Package.onUse(function(api) {
|
||||
'ohif:log',
|
||||
'ohif:servers',
|
||||
'ohif:dicom-services',
|
||||
'ohif:dicomweb-client',
|
||||
'ohif:viewerbase',
|
||||
'ohif:wadoproxy'
|
||||
]);
|
||||
|
||||
Reference in new issue
Block a user