Compare commits

...
Author SHA1 Message Date
ohif-bot 19a8e71317 chore(release): publish [skip ci]
- @ohif/extension-dicom-segmentation@0.2.4
 - @ohif/viewer@3.11.7
2020-05-04 14:46:58 +00:00
James Petts fa95bae6ef Support initialization of segment color from RecommendedDisplayCIELabValue (#1709)
* fix: 🐛 Proper error handling for derived display sets

* Revert idc.js change

* Load correct Segment colors.
2020-05-04 16:43:09 +02:00
ohif-bot 8a20a0526e chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.7.2
 - @ohif/extension-dicom-html@1.2.2
 - @ohif/extension-dicom-rt@0.1.2
 - @ohif/extension-dicom-segmentation@0.2.3
 - @ohif/extension-vtk@1.5.3
 - @ohif/core@2.9.3
 - @ohif/ui@1.4.4
 - @ohif/viewer@3.11.6
2020-05-04 14:15:22 +00:00
James Petts 5b20d8f323 fix: 🐛 Proper error handling for derived display sets (#1708)
* fix: 🐛 Proper error handling for derived display sets

* Revert idc.js change
2020-05-04 16:10:39 +02:00
ohif-bot 9ea37a2201 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.7.1
 - @ohif/viewer@3.11.5
2020-05-04 12:37:30 +00:00
Igor OctavianoandJames Petts 2a66e175df Update viewport state after moving the stack (#1645)
* Update viewport state after moving the stack

* Only trigger new imagecallback if index bigger than 0

* Fix cornerstone viewport version

Co-authored-by: James Petts <jamesapetts@gmail.com>
2020-05-04 14:30:51 +02:00
ohif-bot 77a421cdc0 chore(release): publish [skip ci]
- @ohif/extension-vtk@1.5.2
 - @ohif/core@2.9.2
 - @ohif/viewer@3.11.4
2020-05-04 08:15:19 +00:00
Sanders DeNardiandSanders DeNardi 7033886697 fix: use bit-appropriate array for palette lookup tables (#1698)
Co-authored-by: Sanders DeNardi <sdenardi@summusglobal.com>
2020-05-04 10:13:04 +02:00
ohif-bot 256563d7ee chore(release): publish [skip ci]
- @ohif/viewer@3.11.3
2020-04-29 12:56:38 +00:00
Erik Ziegler f7162ce617 fix: Add IHEInvokeImageDisplay routes back into viewer (#1695) 2020-04-29 08:54:40 -04:00
29 changed files with 418 additions and 130 deletions

No files matched your search

+19
View File
@@ -3,6 +3,25 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.7.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.7.1...@ohif/extension-cornerstone@2.7.2) (2020-05-04)
### Bug Fixes
* 🐛 Proper error handling for derived display sets ([#1708](https://github.com/OHIF/Viewers/issues/1708)) ([5b20d8f](https://github.com/OHIF/Viewers/commit/5b20d8f323e4b3ef9988f2f2ab672d697b6da409))
## [2.7.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.7.0...@ohif/extension-cornerstone@2.7.1) (2020-05-04)
**Note:** Version bump only for package @ohif/extension-cornerstone
# [2.7.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.6.1...@ohif/extension-cornerstone@2.7.0) (2020-04-24) # [2.7.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@2.6.1...@ohif/extension-cornerstone@2.7.0) (2020-04-24)
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-cornerstone", "name": "@ohif/extension-cornerstone",
"version": "2.7.0", "version": "2.7.2",
"description": "OHIF extension for Cornerstone", "description": "OHIF extension for Cornerstone",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -36,7 +36,7 @@
"cornerstone-math": "^0.1.8", "cornerstone-math": "^0.1.8",
"cornerstone-tools": "4.12.5", "cornerstone-tools": "4.12.5",
"cornerstone-wado-image-loader": "^3.1.0", "cornerstone-wado-image-loader": "^3.1.0",
"dcmjs": "^0.12.2", "dcmjs": "^0.12.3",
"dicom-parser": "^1.8.3", "dicom-parser": "^1.8.3",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
@@ -51,6 +51,6 @@
"classnames": "^2.2.6", "classnames": "^2.2.6",
"lodash.merge": "^4.6.2", "lodash.merge": "^4.6.2",
"lodash.throttle": "^4.1.1", "lodash.throttle": "^4.1.1",
"react-cornerstone-viewport": "^2.3.6" "react-cornerstone-viewport": "2.3.8"
} }
} }
@@ -4,6 +4,7 @@ import ConnectedCornerstoneViewport from './ConnectedCornerstoneViewport';
import OHIF from '@ohif/core'; import OHIF from '@ohif/core';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import cornerstone from 'cornerstone-core'; import cornerstone from 'cornerstone-core';
import debounce from 'lodash.debounce';
const { StackManager } = OHIF.utils; const { StackManager } = OHIF.utils;
@@ -215,12 +216,26 @@ class OHIFCornerstoneViewport extends Component {
}); });
} }
const debouncedNewImageHandler = debounce(({ currentImageIdIndex, sopInstanceUid }) => {
const { displaySet } = this.props.viewportData;
const { StudyInstanceUID } = displaySet;
if (currentImageIdIndex > 0) {
this.props.onNewImage({
StudyInstanceUID,
SOPInstanceUID: sopInstanceUid,
frameIndex: currentImageIdIndex,
activeViewportIndex: viewportIndex,
});
}
}, 700);
return ( return (
<> <>
<ConnectedCornerstoneViewport <ConnectedCornerstoneViewport
viewportIndex={viewportIndex} viewportIndex={viewportIndex}
imageIds={imageIds} imageIds={imageIds}
imageIdIndex={currentImageIdIndex} imageIdIndex={currentImageIdIndex}
onNewImage={debouncedNewImageHandler}
// ~~ Connected (From REDUX) // ~~ Connected (From REDUX)
// frameRate={frameRate} // frameRate={frameRate}
// isPlaying={false} // isPlaying={false}
+9 -2
View File
@@ -34,8 +34,15 @@ export default {
preRegistration({ servicesManager, configuration = {} }) { preRegistration({ servicesManager, configuration = {} }) {
init({ servicesManager, configuration }); init({ servicesManager, configuration });
}, },
getViewportModule() { getViewportModule({ commandsManager }) {
return OHIFCornerstoneViewport; const ExtendedOHIFCornerstoneViewport = props => {
const onNewImageHandler = jumpData => {
commandsManager.runCommand('jumpToImage', jumpData);
};
return <OHIFCornerstoneViewport {...props} onNewImage={onNewImageHandler} />;
};
return ExtendedOHIFCornerstoneViewport;
}, },
getToolbarModule() { getToolbarModule() {
return toolbarModule; return toolbarModule;
+11
View File
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.2.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.2.1...@ohif/extension-dicom-html@1.2.2) (2020-05-04)
### Bug Fixes
* 🐛 Proper error handling for derived display sets ([#1708](https://github.com/OHIF/Viewers/issues/1708)) ([5b20d8f](https://github.com/OHIF/Viewers/commit/5b20d8f323e4b3ef9988f2f2ab672d697b6da409))
## [1.2.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.2.0...@ohif/extension-dicom-html@1.2.1) (2020-04-28) ## [1.2.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@1.2.0...@ohif/extension-dicom-html@1.2.1) (2020-04-28)
**Note:** Version bump only for package @ohif/extension-dicom-html **Note:** Version bump only for package @ohif/extension-dicom-html
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-html", "name": "@ohif/extension-dicom-html",
"version": "1.2.1", "version": "1.2.2",
"description": "OHIF extension for rendering structured reports to HTML", "description": "OHIF extension for rendering structured reports to HTML",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -29,7 +29,7 @@
}, },
"peerDependencies": { "peerDependencies": {
"@ohif/core": "^0.50.0", "@ohif/core": "^0.50.0",
"dcmjs": "^0.12.2", "dcmjs": "^0.12.3",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^16.8.6", "react": "^16.8.6",
"react-dom": "^16.8.6" "react-dom": "^16.8.6"
+11
View File
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.1.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.1.1...@ohif/extension-dicom-rt@0.1.2) (2020-05-04)
### Bug Fixes
* 🐛 Proper error handling for derived display sets ([#1708](https://github.com/OHIF/Viewers/issues/1708)) ([5b20d8f](https://github.com/OHIF/Viewers/commit/5b20d8f323e4b3ef9988f2f2ab672d697b6da409))
## [0.1.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.1.0...@ohif/extension-dicom-rt@0.1.1) (2020-04-28) ## [0.1.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-rt@0.1.0...@ohif/extension-dicom-rt@0.1.1) (2020-04-28)
**Note:** Version bump only for package @ohif/extension-dicom-rt **Note:** Version bump only for package @ohif/extension-dicom-rt
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-rt", "name": "@ohif/extension-dicom-rt",
"version": "0.1.1", "version": "0.1.2",
"description": "OHIF extension for rendering DICOM RTSTRUCTs on top of cornerstone images.", "description": "OHIF extension for rendering DICOM RTSTRUCTs on top of cornerstone images.",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -31,7 +31,7 @@
"@ohif/core": "^0.50.0", "@ohif/core": "^0.50.0",
"cornerstone-core": "^2.2.8", "cornerstone-core": "^2.2.8",
"cornerstone-tools": "^4.0.9", "cornerstone-tools": "^4.0.9",
"dcmjs": "^0.12.2", "dcmjs": "^0.12.3",
"prop-types": "^15.6.2", "prop-types": "^15.6.2",
"react": "^16.8.6", "react": "^16.8.6",
"react-dom": "^16.8.6" "react-dom": "^16.8.6"
@@ -3,6 +3,25 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.2.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.2.3...@ohif/extension-dicom-segmentation@0.2.4) (2020-05-04)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation
## [0.2.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.2.2...@ohif/extension-dicom-segmentation@0.2.3) (2020-05-04)
### Bug Fixes
* 🐛 Proper error handling for derived display sets ([#1708](https://github.com/OHIF/Viewers/issues/1708)) ([5b20d8f](https://github.com/OHIF/Viewers/commit/5b20d8f323e4b3ef9988f2f2ab672d697b6da409))
## [0.2.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.2.1...@ohif/extension-dicom-segmentation@0.2.2) (2020-04-28) ## [0.2.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-segmentation@0.2.1...@ohif/extension-dicom-segmentation@0.2.2) (2020-04-28)
**Note:** Version bump only for package @ohif/extension-dicom-segmentation **Note:** Version bump only for package @ohif/extension-dicom-segmentation
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-dicom-segmentation", "name": "@ohif/extension-dicom-segmentation",
"version": "0.2.2", "version": "0.2.4",
"description": "OHIF extension for viewing segmentations in the 2D MPR view", "description": "OHIF extension for viewing segmentations in the 2D MPR view",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -1,71 +0,0 @@
import { MODULE_TYPES, utils } from '@ohif/core';
import loadSegmentation from './loadSegmentation';
// TODO: Should probably use dcmjs for this
const SOP_CLASS_UIDS = {
DICOM_SEG: '1.2.840.10008.5.1.4.1.1.66.4',
};
const sopClassUIDs = Object.values(SOP_CLASS_UIDS);
// TODO: Handle the case where there is more than one SOP Class Handler for the
// same SOP Class.
const OHIFDicomSegSopClassHandler = {
id: 'OHIFDicomSegSopClassHandler',
type: MODULE_TYPES.SOP_CLASS_HANDLER,
sopClassUIDs,
getDisplaySetFromSeries: function (
series,
study,
dicomWebClient,
authorizationHeaders
) {
const instance = series.getFirstInstance();
const metadata = instance.getData().metadata;
const {
SeriesDate,
SeriesTime,
SeriesDescription,
FrameOfReferenceUID,
SOPInstanceUID,
SeriesInstanceUID,
StudyInstanceUID,
} = metadata;
const segDisplaySet = {
Modality: 'SEG',
displaySetInstanceUID: utils.guid(),
wadoRoot: study.getData().wadoRoot,
wadoUri: instance.getData().wadouri,
SOPInstanceUID,
SeriesInstanceUID,
StudyInstanceUID,
FrameOfReferenceUID,
authorizationHeaders,
metadata,
isDerived: true,
referencedDisplaySetUID: null, // Assigned when loaded.
labelmapIndex: null, // Assigned when loaded.
isLoaded: false,
SeriesDate,
SeriesTime,
SeriesDescription,
};
segDisplaySet.load = function (referencedDisplaySet, studies) {
return loadSegmentation(
segDisplaySet,
referencedDisplaySet,
studies
).catch(error => {
segDisplaySet.isLoaded = false;
throw new Error(error);
});
};
return segDisplaySet;
},
};
export default OHIFDicomSegSopClassHandler;
@@ -41,6 +41,7 @@ const SegmentationPanel = ({
activeIndex, activeIndex,
isOpen, isOpen,
onSegItemClick, onSegItemClick,
UINotificationService,
}) => { }) => {
/* /*
* TODO: wrap get/set interactions with the cornerstoneTools * TODO: wrap get/set interactions with the cornerstoneTools
@@ -115,7 +116,11 @@ const SegmentationPanel = ({
firstImageId, firstImageId,
activeViewport activeViewport
); );
const segmentList = getSegmentList(labelmap3D, firstImageId, brushStackState); const segmentList = getSegmentList(
labelmap3D,
firstImageId,
brushStackState
);
setState(state => ({ setState(state => ({
...state, ...state,
brushStackState, brushStackState,
@@ -130,7 +135,14 @@ const SegmentationPanel = ({
segmentList: [], segmentList: [],
})); }));
} }
}, [studies, viewports, activeIndex, getLabelmapList, getSegmentList, state.selectedSegmentation]); }, [
studies,
viewports,
activeIndex,
getLabelmapList,
getSegmentList,
state.selectedSegmentation,
]);
/* Handle open/closed panel behaviour */ /* Handle open/closed panel behaviour */
useEffect(() => { useEffect(() => {
@@ -170,7 +182,8 @@ const SegmentationPanel = ({
studies, studies,
displaySet, displaySet,
firstImageId, firstImageId,
brushStackState.activeLabelmapIndex brushStackState.activeLabelmapIndex,
UINotificationService
); );
updateState('selectedSegmentation', activatedLabelmapIndex); updateState('selectedSegmentation', activatedLabelmapIndex);
}, },
@@ -424,7 +437,9 @@ const SegmentationPanel = ({
<h3>Segmentations</h3> <h3>Segmentations</h3>
<div className="segmentations"> <div className="segmentations">
<SegmentationSelect <SegmentationSelect
value={state.labelmapList.find(i => i.value === state.selectedSegmentation)} value={state.labelmapList.find(
i => i.value === state.selectedSegmentation
)}
formatOptionLabel={SegmentationItem} formatOptionLabel={SegmentationItem}
options={state.labelmapList} options={state.labelmapList}
/> />
@@ -509,7 +524,8 @@ const _setActiveLabelmap = async (
studies, studies,
displaySet, displaySet,
firstImageId, firstImageId,
activeLabelmapIndex activeLabelmapIndex,
UINotificationService
) => { ) => {
if (displaySet.labelmapIndex === activeLabelmapIndex) { if (displaySet.labelmapIndex === activeLabelmapIndex) {
log.warn(`${activeLabelmapIndex} is already the active labelmap`); log.warn(`${activeLabelmapIndex} is already the active labelmap`);
@@ -519,7 +535,22 @@ const _setActiveLabelmap = async (
if (!displaySet.isLoaded) { if (!displaySet.isLoaded) {
// What props does this expect `viewportSpecificData` to have? // What props does this expect `viewportSpecificData` to have?
// TODO: Should this return the `labelmapIndex`? // TODO: Should this return the `labelmapIndex`?
await displaySet.load(viewportSpecificData, studies);
const loadPromise = displaySet.load(viewportSpecificData, studies);
loadPromise.catch(error => {
UINotificationService.show({
title: 'DICOM Segmentation Loader',
message: error.message,
type: 'error',
autoClose: false,
});
// Return old index.
return activeLabelmapIndex;
});
await loadPromise;
} }
const { state } = cornerstoneTools.getModule('segmentation'); const { state } = cornerstoneTools.getModule('segmentation');
@@ -0,0 +1,64 @@
import { MODULE_TYPES, utils } from '@ohif/core';
import loadSegmentation from './loadSegmentation';
// TODO: Should probably use dcmjs for this
const SOP_CLASS_UIDS = {
DICOM_SEG: '1.2.840.10008.5.1.4.1.1.66.4',
};
const sopClassUIDs = Object.values(SOP_CLASS_UIDS);
export default function getSopClassHandlerModule({ servicesManager }) {
// TODO: Handle the case where there is more than one SOP Class Handler for the
// same SOP Class.
return {
id: 'OHIFDicomSegSopClassHandler',
type: MODULE_TYPES.SOP_CLASS_HANDLER,
sopClassUIDs,
getDisplaySetFromSeries: function(
series,
study,
dicomWebClient,
authorizationHeaders
) {
const instance = series.getFirstInstance();
const metadata = instance.getData().metadata;
const {
SeriesDate,
SeriesTime,
SeriesDescription,
FrameOfReferenceUID,
SOPInstanceUID,
SeriesInstanceUID,
StudyInstanceUID,
} = metadata;
const segDisplaySet = {
Modality: 'SEG',
displaySetInstanceUID: utils.guid(),
wadoRoot: study.getData().wadoRoot,
wadoUri: instance.getData().wadouri,
SOPInstanceUID,
SeriesInstanceUID,
StudyInstanceUID,
FrameOfReferenceUID,
authorizationHeaders,
metadata,
isDerived: true,
referencedDisplaySetUID: null, // Assigned when loaded.
labelmapIndex: null, // Assigned when loaded.
isLoaded: false,
SeriesDate,
SeriesTime,
SeriesDescription,
};
segDisplaySet.load = function(referencedDisplaySet, studies) {
return loadSegmentation(segDisplaySet, referencedDisplaySet, studies);
};
return segDisplaySet;
},
};
}
+10 -6
View File
@@ -2,7 +2,7 @@ import React from 'react';
import init from './init.js'; import init from './init.js';
import toolbarModule from './toolbarModule.js'; import toolbarModule from './toolbarModule.js';
import sopClassHandlerModule from './OHIFDicomSegSopClassHandler.js'; import getSopClassHandlerModule from './getOHIFDicomSegSopClassHandler.js';
import SegmentationPanel from './components/SegmentationPanel/SegmentationPanel.js'; import SegmentationPanel from './components/SegmentationPanel/SegmentationPanel.js';
export default { export default {
@@ -23,14 +23,20 @@ export default {
getToolbarModule({ servicesManager }) { getToolbarModule({ servicesManager }) {
return toolbarModule; return toolbarModule;
}, },
getPanelModule({ commandsManager }) { getPanelModule({ commandsManager, servicesManager }) {
const ExtendedSegmentationPanel = props => { const ExtendedSegmentationPanel = props => {
const segItemClickHandler = segData => { const segItemClickHandler = segData => {
commandsManager.runCommand('jumpToImage', segData); commandsManager.runCommand('jumpToImage', segData);
}; };
const { UINotificationService } = servicesManager.services;
return ( return (
<SegmentationPanel {...props} onSegItemClick={segItemClickHandler} /> <SegmentationPanel
{...props}
onSegItemClick={segItemClickHandler}
UINotificationService={UINotificationService}
/>
); );
}; };
@@ -72,7 +78,5 @@ export default {
defaultContext: ['VIEWER'], defaultContext: ['VIEWER'],
}; };
}, },
getSopClassHandlerModule({ servicesManager }) { getSopClassHandlerModule,
return sopClassHandlerModule;
},
}; };
@@ -34,10 +34,14 @@ export default async function loadSegmentation(
referencedDisplaySet.SeriesInstanceUID referencedDisplaySet.SeriesInstanceUID
); );
const results = _parseSeg(segArrayBuffer, imageIds); return new Promise((resolve, reject) => {
let results;
if (!results) { try {
throw new Error('Fractional segmentations are not yet supported'); results = _parseSeg(segArrayBuffer, imageIds);
} catch (error) {
segDisplaySet.isLoaded = false;
reject(error);
} }
const { labelmapBuffer, segMetadata, segmentsOnFrame } = results; const { labelmapBuffer, segMetadata, segmentsOnFrame } = results;
@@ -45,6 +49,7 @@ export default async function loadSegmentation(
// TODO: Could define a color LUT based on colors in the SEG. // TODO: Could define a color LUT based on colors in the SEG.
const labelmapIndex = _getNextLabelmapIndex(imageIds[0]); const labelmapIndex = _getNextLabelmapIndex(imageIds[0]);
const colorLUTIndex = _makeColorLUTAndGetIndex(segMetadata);
setters.labelmap3DByFirstImageId( setters.labelmap3DByFirstImageId(
imageIds[0], imageIds[0],
@@ -52,10 +57,14 @@ export default async function loadSegmentation(
labelmapIndex, labelmapIndex,
segMetadata, segMetadata,
imageIds.length, imageIds.length,
segmentsOnFrame segmentsOnFrame,
colorLUTIndex
); );
segDisplaySet.labelmapIndex = labelmapIndex; segDisplaySet.labelmapIndex = labelmapIndex;
resolve(labelmapIndex);
});
} }
function _getNextLabelmapIndex(firstImageId) { function _getNextLabelmapIndex(firstImageId) {
@@ -79,6 +88,69 @@ function _getNextLabelmapIndex(firstImageId) {
return labelmapIndex; return labelmapIndex;
} }
function _makeColorLUTAndGetIndex(segMetadata) {
const { setters, state } = cornerstoneTools.getModule('segmentation');
const { colorLutTables } = state;
const colorLUTIndex = _getNextColorLUTIndex();
const { data } = segMetadata;
if (
!data.some(
segment =>
segment &&
(segment.ROIDisplayColor || segment.RecommendedDisplayCIELabValue)
)
) {
// Use default cornerstoneTools colorLUT.
return 0;
}
const colorLUT = [];
for (let i = 0; i < data.length; i++) {
const segment = data[i];
if (!segment) {
continue;
}
const { ROIDisplayColor, RecommendedDisplayCIELabValue } = segment;
if (RecommendedDisplayCIELabValue) {
const rgb = dcmjs.data.Colors.dicomlab2RGB(
RecommendedDisplayCIELabValue
).map(x => Math.round(x * 255));
colorLUT[i] = [...rgb, 255];
} else if (ROIDisplayColor) {
colorLUT[i] = [...ROIDisplayColor, 255];
} else {
colorLUT[i] = [...colorLutTables[0][i]];
}
}
colorLUT.shift();
setters.colorLUT(colorLUTIndex, colorLUT);
return colorLUTIndex;
}
function _getNextColorLUTIndex() {
const { state } = cornerstoneTools.getModule('segmentation');
const { colorLutTables } = state;
let colorLUTIndex = colorLutTables.length;
for (let i = 0; i < colorLutTables.length; i++) {
if (!colorLutTables[i]) {
colorLUTIndex = i;
break;
}
}
return colorLUTIndex;
}
function _parseSeg(arrayBuffer, imageIds) { function _parseSeg(arrayBuffer, imageIds) {
return dcmjs.adapters.Cornerstone.Segmentation.generateToolState( return dcmjs.adapters.Cornerstone.Segmentation.generateToolState(
imageIds, imageIds,
+16
View File
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.5.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.5.2...@ohif/extension-vtk@1.5.3) (2020-05-04)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.5.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.5.1...@ohif/extension-vtk@1.5.2) (2020-05-04)
**Note:** Version bump only for package @ohif/extension-vtk
## [1.5.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.5.0...@ohif/extension-vtk@1.5.1) (2020-04-28) ## [1.5.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@1.5.0...@ohif/extension-vtk@1.5.1) (2020-04-28)
**Note:** Version bump only for package @ohif/extension-vtk **Note:** Version bump only for package @ohif/extension-vtk
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/extension-vtk", "name": "@ohif/extension-vtk",
"version": "1.5.1", "version": "1.5.3",
"description": "OHIF extension for VTK.js", "description": "OHIF extension for VTK.js",
"author": "OHIF", "author": "OHIF",
"license": "MIT", "license": "MIT",
@@ -53,8 +53,8 @@
"react-vtkjs-viewport": "^0.8.3" "react-vtkjs-viewport": "^0.8.3"
}, },
"devDependencies": { "devDependencies": {
"@ohif/core": "^2.9.1", "@ohif/core": "^2.9.3",
"@ohif/ui": "^1.4.3", "@ohif/ui": "^1.4.4",
"cornerstone-tools": "4.12.5", "cornerstone-tools": "4.12.5",
"cornerstone-wado-image-loader": "^3.1.0", "cornerstone-wado-image-loader": "^3.1.0",
"dicom-parser": "^1.8.3", "dicom-parser": "^1.8.3",
+22
View File
@@ -3,6 +3,28 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.9.3](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.2...@ohif/core@2.9.3) (2020-05-04)
### Bug Fixes
* 🐛 Proper error handling for derived display sets ([#1708](https://github.com/OHIF/Viewers/issues/1708)) ([5b20d8f](https://github.com/OHIF/Viewers/commit/5b20d8f323e4b3ef9988f2f2ab672d697b6da409))
## [2.9.2](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.1...@ohif/core@2.9.2) (2020-05-04)
### Bug Fixes
* use bit-appropriate array for palette lookup tables ([#1698](https://github.com/OHIF/Viewers/issues/1698)) ([7033886](https://github.com/OHIF/Viewers/commit/70338866978a76fa026c18d7c3c05257c5ece762))
## [2.9.1](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.0...@ohif/core@2.9.1) (2020-04-28) ## [2.9.1](https://github.com/OHIF/Viewers/compare/@ohif/core@2.9.0...@ohif/core@2.9.1) (2020-04-28)
**Note:** Version bump only for package @ohif/core **Note:** Version bump only for package @ohif/core
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/core", "name": "@ohif/core",
"version": "2.9.1", "version": "2.9.3",
"description": "Generic business logic for web-based medical imaging applications", "description": "Generic business logic for web-based medical imaging applications",
"author": "OHIF Core Team", "author": "OHIF Core Team",
"license": "MIT", "license": "MIT",
@@ -50,10 +50,12 @@ import studyMetadataManager from './studyMetadataManager';
const loadAndCacheDerivedDisplaySets = (referencedDisplaySet, studies) => { const loadAndCacheDerivedDisplaySets = (referencedDisplaySet, studies) => {
const { StudyInstanceUID, SeriesInstanceUID } = referencedDisplaySet; const { StudyInstanceUID, SeriesInstanceUID } = referencedDisplaySet;
const promises = [];
const studyMetadata = studyMetadataManager.get(StudyInstanceUID); const studyMetadata = studyMetadataManager.get(StudyInstanceUID);
if (!studyMetadata) { if (!studyMetadata) {
return; return promises;
} }
const derivedDisplaySets = studyMetadata.getDerivedDatasets({ const derivedDisplaySets = studyMetadata.getDerivedDatasets({
@@ -61,7 +63,7 @@ const loadAndCacheDerivedDisplaySets = (referencedDisplaySet, studies) => {
}); });
if (!derivedDisplaySets.length) { if (!derivedDisplaySets.length) {
return; return promises;
} }
// Filter by type // Filter by type
@@ -100,8 +102,10 @@ const loadAndCacheDerivedDisplaySets = (referencedDisplaySet, studies) => {
} }
}); });
recentDisplaySet.load(referencedDisplaySet, studies); promises.push(recentDisplaySet.load(referencedDisplaySet, studies));
}); });
return promises;
}; };
export default loadAndCacheDerivedDisplaySets; export default loadAndCacheDerivedDisplaySets;
@@ -115,23 +115,15 @@ function _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) {
const numLutEntries = lutDescriptor[0]; const numLutEntries = lutDescriptor[0];
const bits = lutDescriptor[2]; const bits = lutDescriptor[2];
const readUInt16 = (byteArray, position) => {
return byteArray[position] + byteArray[position + 1] * 256;
};
const arrayBufferToPaletteColorLUT = arraybuffer => { const arrayBufferToPaletteColorLUT = arraybuffer => {
const byteArray = new Uint8Array(arraybuffer); const byteArray = bits === 16 ?
new Uint16Array(arraybuffer) :
new Uint8Array(arraybuffer);
const lut = []; const lut = [];
if (bits === 16) {
for (let i = 0; i < numLutEntries; i++) {
lut[i] = readUInt16(byteArray, i * 2);
}
} else {
for (let i = 0; i < numLutEntries; i++) { for (let i = 0; i < numLutEntries; i++) {
lut[i] = byteArray[i]; lut[i] = byteArray[i];
} }
}
return lut; return lut;
}; };
+11
View File
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.4](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.4.3...@ohif/ui@1.4.4) (2020-05-04)
### Bug Fixes
* 🐛 Proper error handling for derived display sets ([#1708](https://github.com/OHIF/Viewers/issues/1708)) ([5b20d8f](https://github.com/OHIF/Viewers/commit/5b20d8f323e4b3ef9988f2f2ab672d697b6da409))
## [1.4.3](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.4.2...@ohif/ui@1.4.3) (2020-04-09) ## [1.4.3](https://github.com/OHIF/Viewers/compare/@ohif/ui@1.4.2...@ohif/ui@1.4.3) (2020-04-09)
**Note:** Version bump only for package @ohif/ui **Note:** Version bump only for package @ohif/ui
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/ui", "name": "@ohif/ui",
"version": "1.4.3", "version": "1.4.4",
"description": "A set of React components for Medical Imaging Viewers", "description": "A set of React components for Medical Imaging Viewers",
"author": "OHIF Contributors", "author": "OHIF Contributors",
"license": "MIT", "license": "MIT",
@@ -127,7 +127,7 @@
.sb-message { .sb-message {
font-size: 14px; font-size: 14px;
word-break: break-all; word-break: normal;
} }
.sb-item { .sb-item {
+46
View File
@@ -3,6 +3,52 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.11.7](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.6...@ohif/viewer@3.11.7) (2020-05-04)
**Note:** Version bump only for package @ohif/viewer
## [3.11.6](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.5...@ohif/viewer@3.11.6) (2020-05-04)
### Bug Fixes
* 🐛 Proper error handling for derived display sets ([#1708](https://github.com/OHIF/Viewers/issues/1708)) ([5b20d8f](https://github.com/OHIF/Viewers/commit/5b20d8f323e4b3ef9988f2f2ab672d697b6da409))
## [3.11.5](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.4...@ohif/viewer@3.11.5) (2020-05-04)
**Note:** Version bump only for package @ohif/viewer
## [3.11.4](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.3...@ohif/viewer@3.11.4) (2020-05-04)
**Note:** Version bump only for package @ohif/viewer
## [3.11.3](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.2...@ohif/viewer@3.11.3) (2020-04-29)
### Bug Fixes
* Add IHEInvokeImageDisplay routes back into viewer ([#1695](https://github.com/OHIF/Viewers/issues/1695)) ([f7162ce](https://github.com/OHIF/Viewers/commit/f7162ce61708776a6c192732b0904a022bcc6b3a))
## [3.11.2](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.1...@ohif/viewer@3.11.2) (2020-04-28) ## [3.11.2](https://github.com/OHIF/Viewers/compare/@ohif/viewer@3.11.1...@ohif/viewer@3.11.2) (2020-04-28)
**Note:** Version bump only for package @ohif/viewer **Note:** Version bump only for package @ohif/viewer
+8 -8
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ohif/viewer", "name": "@ohif/viewer",
"version": "3.11.2", "version": "3.11.7",
"description": "OHIF Viewer", "description": "OHIF Viewer",
"author": "OHIF Contributors", "author": "OHIF Contributors",
"license": "MIT", "license": "MIT",
@@ -48,18 +48,18 @@
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.5.5",
"@ohif/core": "^2.9.1", "@ohif/core": "^2.9.3",
"@ohif/extension-cornerstone": "^2.7.0", "@ohif/extension-cornerstone": "^2.7.2",
"@ohif/extension-dicom-html": "^1.2.1", "@ohif/extension-dicom-html": "^1.2.2",
"@ohif/extension-dicom-microscopy": "^0.50.9", "@ohif/extension-dicom-microscopy": "^0.50.9",
"@ohif/extension-dicom-p10-downloader": "^0.1.0", "@ohif/extension-dicom-p10-downloader": "^0.1.0",
"@ohif/extension-dicom-pdf": "^1.0.3", "@ohif/extension-dicom-pdf": "^1.0.3",
"@ohif/extension-dicom-rt": "^0.1.1", "@ohif/extension-dicom-rt": "^0.1.2",
"@ohif/extension-dicom-segmentation": "^0.2.2", "@ohif/extension-dicom-segmentation": "^0.2.4",
"@ohif/extension-lesion-tracker": "^0.2.0", "@ohif/extension-lesion-tracker": "^0.2.0",
"@ohif/extension-vtk": "^1.5.1", "@ohif/extension-vtk": "^1.5.3",
"@ohif/i18n": "^0.52.8", "@ohif/i18n": "^0.52.8",
"@ohif/ui": "^1.4.3", "@ohif/ui": "^1.4.4",
"@tanem/react-nprogress": "^1.1.25", "@tanem/react-nprogress": "^1.1.25",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"core-js": "^3.2.1", "core-js": "^3.2.1",
@@ -4,6 +4,7 @@ import React, { useEffect } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import { utils } from '@ohif/core'; import { utils } from '@ohif/core';
import { useSnackbarContext } from '@ohif/ui';
// //
import ViewportPane from './ViewportPane.js'; import ViewportPane from './ViewportPane.js';
import DefaultViewport from './DefaultViewport.js'; import DefaultViewport from './DefaultViewport.js';
@@ -33,9 +34,22 @@ const ViewportGrid = function (props) {
return null; return null;
} }
const snackbar = useSnackbarContext();
useEffect(() => { useEffect(() => {
viewportData.forEach(displaySet => { viewportData.forEach(displaySet => {
loadAndCacheDerivedDisplaySets(displaySet, studies); const promises = loadAndCacheDerivedDisplaySets(displaySet, studies);
promises.forEach(promise => {
promise.catch(error => {
snackbar.show({
title: 'Error loading derived display set:',
message: error.message,
type: 'error',
autoClose: false,
});
});
});
}); });
}, [studies, viewportData]); }, [studies, viewportData]);
+1
View File
@@ -54,6 +54,7 @@ const ROUTES_DEF = {
}, },
IHEInvokeImageDisplay: { IHEInvokeImageDisplay: {
path: '/IHEInvokeImageDisplay', path: '/IHEInvokeImageDisplay',
component: IHEInvokeImageDisplay
}, },
}, },
gcloud: { gcloud: {
+4 -4
View File
@@ -15598,10 +15598,10 @@ react-codemirror2@^6.0.0:
resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-6.0.0.tgz#180065df57a64026026cde569a9708fdf7656525" resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-6.0.0.tgz#180065df57a64026026cde569a9708fdf7656525"
integrity sha512-D7y9qZ05FbUh9blqECaJMdDwKluQiO3A9xB+fssd5jKM7YAXucRuEOlX32mJQumUvHUkHRHqXIPBjm6g0FW0Ag== integrity sha512-D7y9qZ05FbUh9blqECaJMdDwKluQiO3A9xB+fssd5jKM7YAXucRuEOlX32mJQumUvHUkHRHqXIPBjm6g0FW0Ag==
react-cornerstone-viewport@^2.3.6: react-cornerstone-viewport@^2.3.8:
version "2.3.6" version "2.3.8"
resolved "https://registry.yarnpkg.com/react-cornerstone-viewport/-/react-cornerstone-viewport-2.3.6.tgz#1c76bd37c95284254767296952845bacd3b810a4" resolved "https://registry.yarnpkg.com/react-cornerstone-viewport/-/react-cornerstone-viewport-2.3.8.tgz#7af8360f29bca986ae4e36b4e503269b88ddc52f"
integrity sha512-MBs1Mgl0g0YswkhgoaYlaPoPDVs/HZQ3Z89thHxVytvJsgnQvhc3YrR48iRaUfQj0eYoazh7AL/lLCfd8veFKA== integrity sha512-aiG2uVNrDY6SQx4t/HBxIA3zsMsCwT+6TpcXK9qSSoXhs+X6OTmYEKncWUqL0jtxU1yfh6JTUz8ARTg03gtF+A==
dependencies: dependencies:
classnames "^2.2.6" classnames "^2.2.6"
date-fns "^2.2.1" date-fns "^2.2.1"