Make thumbnails display
This commit is contained in:
parent
c55d069e32
commit
63cf079288
@ -1 +1 @@
|
|||||||
module.exports = require("../../babel.config.js");
|
module.exports = require('../../babel.config.js');
|
||||||
|
|||||||
@ -17,6 +17,6 @@ const setCornerstoneLayout = () => {
|
|||||||
const action = setLayout(layout);
|
const action = setLayout(layout);
|
||||||
|
|
||||||
window.store.dispatch(action);
|
window.store.dispatch(action);
|
||||||
}
|
};
|
||||||
|
|
||||||
export default setCornerstoneLayout;
|
export default setCornerstoneLayout;
|
||||||
|
|||||||
@ -125,8 +125,8 @@ function createDicomWebApi(dicomWebConfig) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
getImageIdsForDisplaySet(displaySetInstanceUID) {
|
getImageIdsForDisplaySet(displaySetInstanceUID, DisplaySetService) {
|
||||||
const displaySet = displaySetManager.getDisplaySetByUID(
|
const displaySet = DisplaySetService.getDisplaySetByUID(
|
||||||
displaySetInstanceUID
|
displaySetInstanceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import React, { useState, useEffect, useCallback } from 'react';
|
import React, { useState, useEffect, useCallback } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { StudyBrowser } from '@ohif/ui';
|
import { StudyBrowser } from '@ohif/ui';
|
||||||
import { dicomMetadataStore, useViewModel } from '@ohif/core';
|
import { dicomMetadataStore } from '@ohif/core';
|
||||||
//
|
//
|
||||||
|
|
||||||
function PanelStudyBrowser({ getImageSrc, getStudiesByPatientId, dataSource }) {
|
function PanelStudyBrowser({ servicesManager, getImageSrc, getStudiesByPatientId, dataSource }) {
|
||||||
console.warn('StudyBrowserPanel rerender');
|
console.warn('StudyBrowserPanel rerender');
|
||||||
const [activeTabName, setActiveTabName] = useState('primary');
|
const [activeTabName, setActiveTabName] = useState('primary');
|
||||||
const [studyData, setStudyData] = useState([]);
|
const [studyData, setStudyData] = useState([]);
|
||||||
@ -13,34 +13,30 @@ function PanelStudyBrowser({ getImageSrc, getStudiesByPatientId, dataSource }) {
|
|||||||
setThumbnailImageSrcMap(thumbnailImageSrcMap.set(k, v));
|
setThumbnailImageSrcMap(thumbnailImageSrcMap.set(k, v));
|
||||||
};
|
};
|
||||||
|
|
||||||
const isSubscribed = true;
|
const { DisplaySetService } = servicesManager.services;
|
||||||
const viewModel = useViewModel();
|
const handleDisplaySetSubscription = useCallback(displaySets => {
|
||||||
const viewportData = []; //useViewportGrid();
|
if (!displaySets) {
|
||||||
const seriesTracking = {}; //useSeriesTracking();
|
|
||||||
|
|
||||||
// This effect
|
|
||||||
useEffect(() => {
|
|
||||||
if (!viewModel.displaySetInstanceUIDs.length) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getImageSrc) {
|
if (getImageSrc) {
|
||||||
viewModel.displaySetInstanceUIDs.forEach(async uid => {
|
Object.keys(displaySets).forEach(StudyInstanceUid => {
|
||||||
const imageIds = dataSource.getImageIdsForDisplaySet(uid);
|
const dSets = displaySets[StudyInstanceUid];
|
||||||
const imageId = imageIds[Math.floor(imageIds.length / 2)];
|
dSets.forEach(async (dset) => {
|
||||||
const imageSrc = await getImageSrc(imageId);
|
const uid = dset.displaySetInstanceUID;
|
||||||
|
const imageIds = dataSource.getImageIdsForDisplaySet(uid, DisplaySetService);
|
||||||
|
const imageId = imageIds[Math.floor(imageIds.length / 2)];
|
||||||
|
const imageSrc = await getImageSrc(imageId);
|
||||||
|
|
||||||
updateThumbnailMap(uid, imageSrc);
|
updateThumbnailMap(uid, imageSrc);
|
||||||
});
|
});
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const displaySets = viewModel.displaySetInstanceUIDs.map(
|
// TODO: This isn't really the 'first'
|
||||||
displaySetManager.getDisplaySetByUID
|
const firstStudyInstanceUID = Object.keys(displaySets)[0];
|
||||||
);
|
|
||||||
|
|
||||||
const aDisplaySet = displaySets[0];
|
|
||||||
const firstStudy = dicomMetadataStore.getStudy(
|
const firstStudy = dicomMetadataStore.getStudy(
|
||||||
aDisplaySet.StudyInstanceUID
|
firstStudyInstanceUID
|
||||||
);
|
);
|
||||||
const firstInstance = firstStudy.series[0].instances[0];
|
const firstInstance = firstStudy.series[0].instances[0];
|
||||||
const PatientID = firstInstance.PatientID;
|
const PatientID = firstInstance.PatientID;
|
||||||
@ -62,9 +58,19 @@ function PanelStudyBrowser({ getImageSrc, getStudiesByPatientId, dataSource }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getData();
|
getData();
|
||||||
|
});
|
||||||
|
|
||||||
return () => (isSubscribed = false);
|
useEffect(() => {
|
||||||
}, [viewModel.displaySetInstanceUIDs]);
|
const { unsubscribe } = DisplaySetService.subscribe(
|
||||||
|
DisplaySetService.EVENTS.DISPLAY_SET_ADDED,
|
||||||
|
handleDisplaySetSubscription
|
||||||
|
);
|
||||||
|
|
||||||
|
return unsubscribe;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const viewportData = []; //useViewportGrid();
|
||||||
|
const seriesTracking = {}; //useSeriesTracking();
|
||||||
|
|
||||||
studyData.forEach(study => {
|
studyData.forEach(study => {
|
||||||
study.displaySets.forEach(ds => {
|
study.displaySets.forEach(ds => {
|
||||||
@ -112,7 +118,7 @@ function PanelStudyBrowser({ getImageSrc, getStudiesByPatientId, dataSource }) {
|
|||||||
|
|
||||||
dataSource.retrieve.series.metadata(
|
dataSource.retrieve.series.metadata(
|
||||||
queryParams,
|
queryParams,
|
||||||
displaySetManager.makeDisplaySets
|
DisplaySetService.makeDisplaySets
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,34 +175,39 @@ function _mapDataSourceStudies(studies) {
|
|||||||
* Iterates over displaysets and creates mapped studies from
|
* Iterates over displaysets and creates mapped studies from
|
||||||
* instance metadata.
|
* instance metadata.
|
||||||
*
|
*
|
||||||
* @param {*} displaySets
|
* @param {*} displaySetsPerStudy
|
||||||
*/
|
*/
|
||||||
function _getMappedStudiesFromDisplaySets(displaySets) {
|
function _getMappedStudiesFromDisplaySets(displaySetsPerStudy) {
|
||||||
const studiesFromInstanceData = {};
|
const studiesFromInstanceData = {};
|
||||||
|
|
||||||
displaySets.forEach(ds => {
|
Object.keys(displaySetsPerStudy).forEach(StudyInstanceUID => {
|
||||||
const displaySet = {
|
const displaySets = displaySetsPerStudy[StudyInstanceUID];
|
||||||
displaySetInstanceUID: ds.displaySetInstanceUID,
|
|
||||||
description: ds.SeriesDescription,
|
|
||||||
seriesNumber: ds.SeriesNumber,
|
|
||||||
modality: ds.Modality,
|
|
||||||
date: ds.SeriesDate,
|
|
||||||
numInstances: ds.numImageFrames,
|
|
||||||
};
|
|
||||||
|
|
||||||
studiesFromInstanceData[ds.StudyInstanceUID] =
|
displaySets.forEach(ds => {
|
||||||
studiesFromInstanceData[ds.StudyInstanceUID] ||
|
const displaySet = {
|
||||||
_mapStudyFromInstance(ds.StudyInstanceUID);
|
displaySetInstanceUID: ds.displaySetInstanceUID,
|
||||||
|
description: ds.SeriesDescription,
|
||||||
|
seriesNumber: ds.SeriesNumber,
|
||||||
|
modality: ds.Modality,
|
||||||
|
date: ds.SeriesDate,
|
||||||
|
numInstances: ds.numImageFrames,
|
||||||
|
componentType: 'thumbnailTracked' // TODO: PUT THIS SOMEWHERE ELSE
|
||||||
|
};
|
||||||
|
|
||||||
const mappedStudy = studiesFromInstanceData[ds.StudyInstanceUID];
|
studiesFromInstanceData[ds.StudyInstanceUID] =
|
||||||
|
studiesFromInstanceData[ds.StudyInstanceUID] ||
|
||||||
|
_mapStudyFromInstance(ds.StudyInstanceUID);
|
||||||
|
|
||||||
mappedStudy.displaySets.push(displaySet);
|
const mappedStudy = studiesFromInstanceData[ds.StudyInstanceUID];
|
||||||
mappedStudy.numInstances += displaySet.numInstances;
|
|
||||||
mappedStudy.modalitiesSet.add(displaySet.modality);
|
|
||||||
|
|
||||||
const modalitiesSet = mappedStudy.modalitiesSet;
|
mappedStudy.displaySets.push(displaySet);
|
||||||
mappedStudy.modalities = Array.from(modalitiesSet).join(', ');
|
mappedStudy.numInstances += displaySet.numInstances;
|
||||||
});
|
mappedStudy.modalitiesSet.add(displaySet.modality);
|
||||||
|
|
||||||
|
const modalitiesSet = mappedStudy.modalitiesSet;
|
||||||
|
mappedStudy.modalities = Array.from(modalitiesSet).join(', ');
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
return studiesFromInstanceData;
|
return studiesFromInstanceData;
|
||||||
}
|
}
|
||||||
@ -223,6 +234,7 @@ function _mergeDataSourceAndInstanceStudies(mappedQidoStudies, mappedInstanceStu
|
|||||||
description: qidoStudy.StudyDescription || studyFromInstances.description,
|
description: qidoStudy.StudyDescription || studyFromInstances.description,
|
||||||
modalities: studyFromInstances.modalities || qidoStudy.ModalitiesInStudy,
|
modalities: studyFromInstances.modalities || qidoStudy.ModalitiesInStudy,
|
||||||
numInstances: qidoStudy.NumInstances || studyFromInstances.numInstances,
|
numInstances: qidoStudy.NumInstances || studyFromInstances.numInstances,
|
||||||
|
seriesNumber: studyFromInstances.seriesNumber,
|
||||||
displaySets: studyFromInstances.displaySets,
|
displaySets: studyFromInstances.displaySets,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@ -11,18 +11,18 @@ import getImageSrcFromImageId from './getImageSrcFromImageId';
|
|||||||
* @param {object} commandsManager
|
* @param {object} commandsManager
|
||||||
* @param {object} extensionManager
|
* @param {object} extensionManager
|
||||||
*/
|
*/
|
||||||
function WrappedPanelStudyBrowser({ commandsManager, extensionManager }) {
|
function WrappedPanelStudyBrowser({ commandsManager, extensionManager, servicesManager }) {
|
||||||
// Note: this feels odd
|
// Note: this feels odd
|
||||||
const dataSource = extensionManager.getDataSources('dicomweb')[0];
|
const dataSource = extensionManager.getDataSources('dicomweb')[0];
|
||||||
const getStudiesByPatientId = patientId =>
|
const getStudiesByPatientId = patientId =>
|
||||||
dataSource.query.studies.search(patientId);
|
dataSource.query.studies.search(patientId);
|
||||||
const _getImageSrcFromImageId = _createGetImageSrcFromImageIdFn(
|
const _getImageSrcFromImageId = _createGetImageSrcFromImageIdFn(
|
||||||
commandsManager.getCommand
|
commandsManager.getCommand.bind(commandsManager),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PanelStudyBrowser
|
<PanelStudyBrowser
|
||||||
|
servicesManager={servicesManager}
|
||||||
dataSource={dataSource}
|
dataSource={dataSource}
|
||||||
getImageSrc={_getImageSrcFromImageId}
|
getImageSrc={_getImageSrcFromImageId}
|
||||||
getStudiesByPatientId={getStudiesByPatientId}
|
getStudiesByPatientId={getStudiesByPatientId}
|
||||||
@ -47,7 +47,7 @@ function _createGetImageSrcFromImageIdFn(getCommand) {
|
|||||||
|
|
||||||
return getImageSrcFromImageId.bind(null, cornerstone);
|
return getImageSrcFromImageId.bind(null, cornerstone);
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
// throw new Error('Required command not found');
|
throw new Error('Required command not found');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { WrappedPanelStudyBrowser } from './Panels'
|
import { WrappedPanelStudyBrowser } from './Panels';
|
||||||
|
|
||||||
import MeasurementTable from './MeasurementTable.js';
|
import MeasurementTable from './MeasurementTable.js';
|
||||||
|
|
||||||
@ -31,6 +31,7 @@ function getPanelModule({
|
|||||||
component: WrappedPanelStudyBrowser.bind(null, {
|
component: WrappedPanelStudyBrowser.bind(null, {
|
||||||
commandsManager,
|
commandsManager,
|
||||||
extensionManager,
|
extensionManager,
|
||||||
|
servicesManager,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -45,35 +46,34 @@ function getPanelModule({
|
|||||||
|
|
||||||
export default getPanelModule;
|
export default getPanelModule;
|
||||||
|
|
||||||
|
// // TODO -> Need some way of selecting which displaySets hit the viewports.
|
||||||
|
// const { DisplaySetService } = servicesManager.services;
|
||||||
|
|
||||||
// // TODO -> Need some way of selecting which displaySets hit the viewports.
|
// // TODO -> Make a HangingProtocolService
|
||||||
// const { DisplaySetService } = servicesManager.services;
|
// const HangingProtocolService = displaySets => {
|
||||||
|
// const displaySetInstanceUid = displaySets[Object.keys(displaySets)[0]][0].displaySetInstanceUid;
|
||||||
|
|
||||||
// // TODO -> Make a HangingProtocolService
|
// return {
|
||||||
// const HangingProtocolService = displaySets => {
|
// numRows: 1,
|
||||||
// const displaySetInstanceUid = displaySets[Object.keys(displaySets)[0]][0].displaySetInstanceUid;
|
// numCols: 1,
|
||||||
|
// activeViewportIndex: 0,
|
||||||
|
// viewports: [
|
||||||
|
// {
|
||||||
|
// displaySetInstanceUid,
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// };
|
||||||
|
// };
|
||||||
|
|
||||||
// return {
|
// const handleDisplaySetSubscription = useCallback(displaySets => {
|
||||||
// numRows: 1,
|
// setViewportGrid(HangingProtocolService(displaySets));
|
||||||
// numCols: 1,
|
// });
|
||||||
// activeViewportIndex: 0,
|
|
||||||
// viewports: [
|
|
||||||
// {
|
|
||||||
// displaySetInstanceUid,
|
|
||||||
// },
|
|
||||||
// ],
|
|
||||||
// };
|
|
||||||
// };
|
|
||||||
|
|
||||||
// const handleDisplaySetSubscription = useCallback(displaySets => {
|
// useEffect(() => {
|
||||||
// setViewportGrid(HangingProtocolService(displaySets));
|
// const { unsubscribe } = DisplaySetService.subscribe(
|
||||||
// });
|
// DisplaySetService.EVENTS.DISPLAY_SET_ADDED,
|
||||||
|
// handleDisplaySetSubscription
|
||||||
|
// );
|
||||||
|
|
||||||
// useEffect(() => {
|
// return unsubscribe;
|
||||||
// const { unsubscribe } = DisplaySetService.subscribe(
|
// }, []);
|
||||||
// DisplaySetService.EVENTS.DISPLAY_SET_ADDED,
|
|
||||||
// handleDisplaySetSubscription
|
|
||||||
// );
|
|
||||||
|
|
||||||
// return unsubscribe;
|
|
||||||
// }, []);
|
|
||||||
|
|||||||
@ -76,13 +76,13 @@ const additionalFindings = [
|
|||||||
|
|
||||||
const currentCollections = [
|
const currentCollections = [
|
||||||
{
|
{
|
||||||
selectorAction: () => { },
|
selectorAction: () => {},
|
||||||
maxMeasurements: 3,
|
maxMeasurements: 3,
|
||||||
groupName: 'Measurements',
|
groupName: 'Measurements',
|
||||||
measurements: measurements,
|
measurements: measurements,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
selectorAction: () => { },
|
selectorAction: () => {},
|
||||||
groupName: 'Additional Findings',
|
groupName: 'Additional Findings',
|
||||||
measurements: additionalFindings,
|
measurements: additionalFindings,
|
||||||
},
|
},
|
||||||
@ -90,13 +90,13 @@ const currentCollections = [
|
|||||||
|
|
||||||
const comparisonColletions = [
|
const comparisonColletions = [
|
||||||
{
|
{
|
||||||
selectorAction: () => { },
|
selectorAction: () => {},
|
||||||
maxMeasurements: 3,
|
maxMeasurements: 3,
|
||||||
groupName: 'Measurements',
|
groupName: 'Measurements',
|
||||||
measurements: measurements,
|
measurements: measurements,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
selectorAction: () => { },
|
selectorAction: () => {},
|
||||||
groupName: 'Additional Findings',
|
groupName: 'Additional Findings',
|
||||||
measurements: additionalFindings,
|
measurements: additionalFindings,
|
||||||
},
|
},
|
||||||
@ -128,7 +128,7 @@ const comparisonTimepoints = [
|
|||||||
{
|
{
|
||||||
key: 'Comparison',
|
key: 'Comparison',
|
||||||
date: '15-Jun-18',
|
date: '15-Jun-18',
|
||||||
}
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const MeasurementComparisonTable = () => {
|
const MeasurementComparisonTable = () => {
|
||||||
@ -138,8 +138,8 @@ const MeasurementComparisonTable = () => {
|
|||||||
timepoints={comparisonTimepoints}
|
timepoints={comparisonTimepoints}
|
||||||
overallWarnings={overallWarnings}
|
overallWarnings={overallWarnings}
|
||||||
measurementCollection={comparisonCollections}
|
measurementCollection={comparisonCollections}
|
||||||
onRelabelClick={() => { }}
|
onRelabelClick={() => {}}
|
||||||
onEditDescriptionClick={() => { }}
|
onEditDescriptionClick={() => {}}
|
||||||
/>
|
/>
|
||||||
<div className="generate-report">
|
<div className="generate-report">
|
||||||
<button className="btn btn-primary">Generate Report</button>
|
<button className="btn btn-primary">Generate Report</button>
|
||||||
|
|||||||
@ -26,7 +26,7 @@ export default {
|
|||||||
component: MeasurementComparisonTable,
|
component: MeasurementComparisonTable,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
defaultContext: ['VIEWER']
|
defaultContext: ['VIEWER'],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
module.exports = require("../../babel.config.js");
|
module.exports = require('../../babel.config.js');
|
||||||
|
|||||||
@ -115,7 +115,7 @@ export class CommandsManager {
|
|||||||
* @param {String} commandName - Command to find
|
* @param {String} commandName - Command to find
|
||||||
* @param {String} [contextName] - Specific command to look in. Defaults to current activeContexts
|
* @param {String} [contextName] - Specific command to look in. Defaults to current activeContexts
|
||||||
*/
|
*/
|
||||||
getCommand(commandName, contextName) {
|
getCommand = (commandName, contextName) => {
|
||||||
let contexts = [];
|
let contexts = [];
|
||||||
|
|
||||||
if (contextName) {
|
if (contextName) {
|
||||||
@ -145,7 +145,7 @@ export class CommandsManager {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return foundCommand;
|
return foundCommand;
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|||||||
@ -131,8 +131,9 @@ export default class DisplaySetService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
getDisplaySetByUID = displaySetInstanceUid => {
|
getDisplaySetByUID = displaySetInstanceUid => {
|
||||||
return this.displaySets.find(
|
// TODO: Why is this searching active, not just displaySets?
|
||||||
displaySet => displaySet.displaySetInstanceUid === displaySetInstanceUid
|
return displaySetCache.find(
|
||||||
|
displaySet => displaySet.displaySetInstanceUID === displaySetInstanceUid
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user