diff --git a/platform/core/package.json b/platform/core/package.json index caf478013..8a44b76cb 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -39,6 +39,7 @@ "dependencies": { "@babel/runtime": "^7.5.5", "ajv": "^6.10.0", + "dcmjs": "^0.8.3", "dicomweb-client": "^0.5.2", "isomorphic-base64": "^1.0.2", "lodash.clonedeep": "^4.5.0", diff --git a/platform/viewer/src/lib/DICOMSR/dataExchange.js b/platform/core/src/DICOMSR/dataExchange.js similarity index 88% rename from platform/viewer/src/lib/DICOMSR/dataExchange.js rename to platform/core/src/DICOMSR/dataExchange.js index 344183b85..4cb332c4d 100644 --- a/platform/viewer/src/lib/DICOMSR/dataExchange.js +++ b/platform/core/src/DICOMSR/dataExchange.js @@ -1,5 +1,10 @@ -import { log, studies, utils } from '@ohif/core'; -import { retrieveMeasurementFromSR, stowSRFromMeasurements } from './handleStructuredReport'; +import log from '../log'; +import studies from '../studies'; +import utils from '../utils'; +import { + retrieveMeasurementFromSR, + stowSRFromMeasurements, +} from './handleStructuredReport'; import findMostRecentStructuredReport from './utils/findMostRecentStructuredReport'; /** @@ -65,7 +70,9 @@ const storeMeasurements = async (measurementData, filter, server) => { message: 'Measurements were saved with success', }; } catch (error) { - log.error(`[DICOMSR] Error while saving the measurements: ${error.message}`); + log.error( + `[DICOMSR] Error while saving the measurements: ${error.message}` + ); throw new Error('Error while saving the measurements.'); } }; diff --git a/platform/viewer/src/lib/DICOMSR/handleStructuredReport.js b/platform/core/src/DICOMSR/handleStructuredReport.js similarity index 89% rename from platform/viewer/src/lib/DICOMSR/handleStructuredReport.js rename to platform/core/src/DICOMSR/handleStructuredReport.js index d72e6f685..c98dda29a 100644 --- a/platform/viewer/src/lib/DICOMSR/handleStructuredReport.js +++ b/platform/core/src/DICOMSR/handleStructuredReport.js @@ -1,11 +1,11 @@ import * as dcmjs from 'dcmjs'; -import { DICOMWeb } from '@ohif/core'; +import { api } from 'dicomweb-client'; + +import DICOMWeb from '../DICOMWeb'; import parseDicomStructuredReport from './parseDicomStructuredReport'; import parseMeasurementsData from './parseMeasurementsData'; import getAllDisplaySets from './utils/getAllDisplaySets'; -import { api } from 'dicomweb-client'; - const VERSION_NAME = 'dcmjs-0.0'; const TRANSFER_SYNTAX_UID = '1.2.840.10008.1.2.1'; @@ -34,7 +34,10 @@ const retrieveMeasurementFromSR = async (series, studies, serverUrl) => { const part10SRArrayBuffer = await dicomWeb.retrieveInstance(options); const displaySets = getAllDisplaySets(studies); - const measurementsData = parseDicomStructuredReport(part10SRArrayBuffer, displaySets); + const measurementsData = parseDicomStructuredReport( + part10SRArrayBuffer, + displaySets + ); return measurementsData; }; @@ -47,13 +50,10 @@ const retrieveMeasurementFromSR = async (series, studies, serverUrl) => { * @returns {Promise} */ const stowSRFromMeasurements = async (measurements, serverUrl) => { - const { dataset } = parseMeasurementsData( - measurements - ); + const { dataset } = parseMeasurementsData(measurements); const { DicomMetaDictionary, DicomDict } = dcmjs.data; const meta = { - FileMetaInformationVersion: - dataset._meta.FileMetaInformationVersion.Value, + FileMetaInformationVersion: dataset._meta.FileMetaInformationVersion.Value, MediaStorageSOPClassUID: dataset.SOPClassUID, MediaStorageSOPInstanceUID: dataset.SOPInstanceUID, TransferSyntaxUID: TRANSFER_SYNTAX_UID, diff --git a/platform/viewer/src/lib/DICOMSR/index.js b/platform/core/src/DICOMSR/index.js similarity index 100% rename from platform/viewer/src/lib/DICOMSR/index.js rename to platform/core/src/DICOMSR/index.js diff --git a/platform/viewer/src/lib/DICOMSR/parseDicomStructuredReport.js b/platform/core/src/DICOMSR/parseDicomStructuredReport.js similarity index 89% rename from platform/viewer/src/lib/DICOMSR/parseDicomStructuredReport.js rename to platform/core/src/DICOMSR/parseDicomStructuredReport.js index 2f5796316..576d077c5 100644 --- a/platform/viewer/src/lib/DICOMSR/parseDicomStructuredReport.js +++ b/platform/core/src/DICOMSR/parseDicomStructuredReport.js @@ -1,4 +1,5 @@ import * as dcmjs from 'dcmjs'; + import findInstanceMetadataBySopInstanceUid from './utils/findInstanceMetadataBySopInstanceUid'; /** @@ -37,7 +38,12 @@ const parseDicomStructuredReport = (part10SRArrayBuffer, displaySets) => { const { studyInstanceUid, patientId } = study; const { seriesInstanceUid } = series; const { sopInstanceUid, frameIndex } = measurement; - const imagePath = getImagePath(studyInstanceUid, seriesInstanceUid, sopInstanceUid, frameIndex); + const imagePath = getImagePath( + studyInstanceUid, + seriesInstanceUid, + sopInstanceUid, + frameIndex + ); const imageId = instanceMetadata.getImageId(); if (!imageId) { @@ -75,8 +81,15 @@ const parseDicomStructuredReport = (part10SRArrayBuffer, displaySets) => { * @param {string} frameIndex * @returns */ -const getImagePath = (studyInstanceUid, seriesInstanceUid, sopInstanceUid, frameIndex) => { - return [studyInstanceUid, seriesInstanceUid, sopInstanceUid, frameIndex].join('_'); -} +const getImagePath = ( + studyInstanceUid, + seriesInstanceUid, + sopInstanceUid, + frameIndex +) => { + return [studyInstanceUid, seriesInstanceUid, sopInstanceUid, frameIndex].join( + '_' + ); +}; export default parseDicomStructuredReport; diff --git a/platform/viewer/src/lib/DICOMSR/parseMeasurementsData.js b/platform/core/src/DICOMSR/parseMeasurementsData.js similarity index 95% rename from platform/viewer/src/lib/DICOMSR/parseMeasurementsData.js rename to platform/core/src/DICOMSR/parseMeasurementsData.js index fe72bdcb3..50b8a5b1d 100644 --- a/platform/viewer/src/lib/DICOMSR/parseMeasurementsData.js +++ b/platform/core/src/DICOMSR/parseMeasurementsData.js @@ -1,6 +1,8 @@ import * as dcmjs from 'dcmjs'; -import { log, measurements } from '@ohif/core'; import cornerstone from 'cornerstone-core'; + +import log from '../log'; +import measurements from '../measurements'; import isToolSupported from './utils/isToolSupported'; /** diff --git a/platform/viewer/src/lib/DICOMSR/utils/findInstanceMetadataBySopInstanceUid.js b/platform/core/src/DICOMSR/utils/findInstanceMetadataBySopInstanceUid.js similarity index 81% rename from platform/viewer/src/lib/DICOMSR/utils/findInstanceMetadataBySopInstanceUid.js rename to platform/core/src/DICOMSR/utils/findInstanceMetadataBySopInstanceUid.js index 3911c67ff..34ef42111 100644 --- a/platform/viewer/src/lib/DICOMSR/utils/findInstanceMetadataBySopInstanceUid.js +++ b/platform/core/src/DICOMSR/utils/findInstanceMetadataBySopInstanceUid.js @@ -11,7 +11,9 @@ const findInstanceMetadataBySopInstanceUid = (displaySets, sopInstanceUid) => { displaySets.find(displaySet => { if (!displaySet.images) return false; - instanceFound = displaySet.images.find(instanceMetadata => instanceMetadata._sopInstanceUID === sopInstanceUid); + instanceFound = displaySet.images.find( + instanceMetadata => instanceMetadata._sopInstanceUID === sopInstanceUid + ); return !!instanceFound; }); diff --git a/platform/viewer/src/lib/DICOMSR/utils/findMostRecentStructuredReport.js b/platform/core/src/DICOMSR/utils/findMostRecentStructuredReport.js similarity index 77% rename from platform/viewer/src/lib/DICOMSR/utils/findMostRecentStructuredReport.js rename to platform/core/src/DICOMSR/utils/findMostRecentStructuredReport.js index 44dd1ffc0..daebc4003 100644 --- a/platform/viewer/src/lib/DICOMSR/utils/findMostRecentStructuredReport.js +++ b/platform/core/src/DICOMSR/utils/findMostRecentStructuredReport.js @@ -4,15 +4,17 @@ * @param {Array} studies * @returns {Object} Series */ -const findMostRecentStructuredReport = (studies) => { +const findMostRecentStructuredReport = studies => { let mostRecentStructuredReport; studies.forEach(study => { const allSeries = study.getSeries ? study.getSeries() : []; allSeries.forEach(series => { - if (isStructuredReportSeries(series)) { - if (!mostRecentStructuredReport || compareSeriesDate(series, mostRecentStructuredReport)) { + if ( + !mostRecentStructuredReport || + compareSeriesDate(series, mostRecentStructuredReport) + ) { mostRecentStructuredReport = series; } } @@ -28,7 +30,7 @@ const findMostRecentStructuredReport = (studies) => { * @param {Object} series - Series metadata * @returns {boolean} */ -const isStructuredReportSeries = (series) => { +const isStructuredReportSeries = series => { const supportedSopClassUIDs = [ '1.2.840.10008.5.1.4.1.1.88.22', '1.2.840.10008.5.1.4.1.1.11.1', @@ -38,7 +40,7 @@ const isStructuredReportSeries = (series) => { const sopClassUid = firstInstance._instance.sopClassUid; return supportedSopClassUIDs.includes(sopClassUid); -} +}; /** * Checkes if series1 is newer than series2 @@ -48,10 +50,11 @@ const isStructuredReportSeries = (series) => { * @returns {boolean} true/false if series1 is newer than series2 */ const compareSeriesDate = (series1, series2) => { - return series1._data.seriesDate > series2._data.seriesDate || + return ( + series1._data.seriesDate > series2._data.seriesDate || (series1._data.seriesDate === series2._data.seriesDate && - series1._data.seriesTime > series2._data.seriesTime); -} - + series1._data.seriesTime > series2._data.seriesTime) + ); +}; export default findMostRecentStructuredReport; diff --git a/platform/viewer/src/lib/DICOMSR/utils/getAllDisplaySets.js b/platform/core/src/DICOMSR/utils/getAllDisplaySets.js similarity index 90% rename from platform/viewer/src/lib/DICOMSR/utils/getAllDisplaySets.js rename to platform/core/src/DICOMSR/utils/getAllDisplaySets.js index 4ea29323e..a8eda16b5 100644 --- a/platform/viewer/src/lib/DICOMSR/utils/getAllDisplaySets.js +++ b/platform/core/src/DICOMSR/utils/getAllDisplaySets.js @@ -4,7 +4,7 @@ * @param {Object} studies - List of studies loaded into the viewer * @returns {Object} List of DisplaySets */ -const getAllDisplaySets = (studies) => { +const getAllDisplaySets = studies => { let allDisplaySets = []; studies.forEach(study => { diff --git a/platform/viewer/src/lib/DICOMSR/utils/isToolSupported.js b/platform/core/src/DICOMSR/utils/isToolSupported.js similarity index 100% rename from platform/viewer/src/lib/DICOMSR/utils/isToolSupported.js rename to platform/core/src/DICOMSR/utils/isToolSupported.js diff --git a/platform/core/src/index.js b/platform/core/src/index.js index 1a2106f7d..7f915003d 100644 --- a/platform/core/src/index.js +++ b/platform/core/src/index.js @@ -5,6 +5,7 @@ import { ServicesManager } from './services'; import classes, { CommandsManager, HotkeysManager } from './classes/'; import DICOMWeb from './DICOMWeb'; +import DICOMSR from './DICOMSR'; import cornerstone from './cornerstone.js'; import hangingProtocols from './hanging-protocols'; import header from './header.js'; @@ -46,6 +47,7 @@ const OHIF = { object, log, DICOMWeb, + DICOMSR, viewer: {}, measurements, hangingProtocols, @@ -76,6 +78,7 @@ export { object, log, DICOMWeb, + DICOMSR, measurements, hangingProtocols, // diff --git a/platform/core/src/index.test.js b/platform/core/src/index.test.js index 3026ffd50..b4a7026a0 100644 --- a/platform/core/src/index.test.js +++ b/platform/core/src/index.test.js @@ -28,6 +28,7 @@ describe('Top level exports', () => { 'object', 'log', 'DICOMWeb', + 'DICOMSR', 'OHIF', // 'measurements', 'hangingProtocols', diff --git a/platform/viewer/src/appExtensions/MeasurementsPanel/ConnectedMeasurementTable.js b/platform/viewer/src/appExtensions/MeasurementsPanel/ConnectedMeasurementTable.js index ebf7b7313..79684b924 100644 --- a/platform/viewer/src/appExtensions/MeasurementsPanel/ConnectedMeasurementTable.js +++ b/platform/viewer/src/appExtensions/MeasurementsPanel/ConnectedMeasurementTable.js @@ -1,9 +1,8 @@ import { connect } from 'react-redux'; import { MeasurementTable } from '@ohif/ui'; -import OHIF from '@ohif/core'; +import OHIF, { DICOMSR } from '@ohif/core'; import moment from 'moment'; import cornerstone from 'cornerstone-core'; -import DICOMSR from './../../lib/DICOMSR'; import jumpToRowItem from './jumpToRowItem.js'; @@ -32,9 +31,7 @@ function groupBy(list, props) { */ function getAllTools(toolGroups = []) { let tools = []; - toolGroups.forEach( - toolGroup => (tools = tools.concat(toolGroup.childTools)) - ); + toolGroups.forEach(toolGroup => (tools = tools.concat(toolGroup.childTools))); return tools; } diff --git a/platform/viewer/src/connectedComponents/Viewer.js b/platform/viewer/src/connectedComponents/Viewer.js index df8551429..922b5660c 100644 --- a/platform/viewer/src/connectedComponents/Viewer.js +++ b/platform/viewer/src/connectedComponents/Viewer.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import classNames from 'classnames'; import { MODULE_TYPES } from '@ohif/core'; -import OHIF from '@ohif/core'; +import OHIF, { DICOMSR } from '@ohif/core'; import { withDialog } from '@ohif/ui'; import moment from 'moment'; import ConnectedHeader from './ConnectedHeader.js'; @@ -12,7 +12,6 @@ import ConnectedStudyBrowser from './ConnectedStudyBrowser.js'; import ConnectedViewerMain from './ConnectedViewerMain.js'; import SidePanel from './../components/SidePanel.js'; import { extensionManager } from './../App.js'; -import DICOMSR from '../lib/DICOMSR'; // Contexts import WhiteLabellingContext from '../context/WhiteLabellingContext.js'; diff --git a/yarn.lock b/yarn.lock index bd16e2563..c7dd59eeb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6545,6 +6545,16 @@ dcmjs@^0.8.2: loglevelnext "^3.0.1" ndarray "^1.0.18" +dcmjs@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/dcmjs/-/dcmjs-0.8.3.tgz#fff1b030b6cb2d6e2afb1aa99840bfa853724c31" + integrity sha512-eXQjqgtJf9+oseraKDNDm2A5F3Th4B2GJeZtjStj0IFXxjlbPOzdq3PfCyxdwfRaKOBIwr0q3YK/Vfs2CpQY8Q== + dependencies: + "@babel/polyfill" "^7.6.0" + "@babel/runtime" "^7.6.3" + loglevelnext "^3.0.1" + ndarray "^1.0.18" + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.1, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"