From 6f8b9ae5932e23a1b2031ad173d9a87121e9eae8 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Thu, 21 Feb 2019 16:51:52 +0100 Subject: [PATCH] Update ohif-cornerstone-extension to support props to specify which image should be displayed in a stack --- .../ohif-cornerstone-extension/package.json | 4 +- .../src/ConnectedCornerstoneViewport.js | 6 +- .../src/OHIFCornerstoneViewport.js | 80 ++++++++++++++----- .../ohif-cornerstone-extension/yarn.lock | 55 +------------ Packages-react/ohif-viewer/package.json | 2 +- Packages-react/ohif-viewer/yarn.lock | 18 ++--- Packages-react/react-cornerstone-viewport | 2 +- 7 files changed, 80 insertions(+), 87 deletions(-) diff --git a/Packages-react/extensions/ohif-cornerstone-extension/package.json b/Packages-react/extensions/ohif-cornerstone-extension/package.json index c57841876..ffbbe8418 100644 --- a/Packages-react/extensions/ohif-cornerstone-extension/package.json +++ b/Packages-react/extensions/ohif-cornerstone-extension/package.json @@ -1,6 +1,6 @@ { "name": "ohif-cornerstone-extension", - "version": "0.0.16", + "version": "0.0.17", "description": "OHIF extension for Cornerstone", "author": "OHIF", "license": "MIT", @@ -90,6 +90,6 @@ "@babel/runtime": "^7.2.0", "classnames": "^2.2.6", "lodash.throttle": "^4.1.1", - "react-cornerstone-viewport": "^0.1.14" + "react-cornerstone-viewport": "^0.1.16" } } diff --git a/Packages-react/extensions/ohif-cornerstone-extension/src/ConnectedCornerstoneViewport.js b/Packages-react/extensions/ohif-cornerstone-extension/src/ConnectedCornerstoneViewport.js index 39460d1e9..ac299ba7a 100644 --- a/Packages-react/extensions/ohif-cornerstone-extension/src/ConnectedCornerstoneViewport.js +++ b/Packages-react/extensions/ohif-cornerstone-extension/src/ConnectedCornerstoneViewport.js @@ -1,8 +1,6 @@ import { connect } from 'react-redux'; import CornerstoneViewport from 'react-cornerstone-viewport'; import OHIF from 'ohif-core'; -import cornerstone from 'cornerstone-core'; -import cornerstoneTools from 'cornerstone-tools'; import throttle from 'lodash.throttle'; const { @@ -32,9 +30,7 @@ const mapStateToProps = (state, ownProps) => { ...dataFromStore, enableStackPrefetch: isActive, //stack: viewportSpecificData.stack, - cineToolData: viewportSpecificData.cine, - cornerstone, - cornerstoneTools + cineToolData: viewportSpecificData.cine }; }; diff --git a/Packages-react/extensions/ohif-cornerstone-extension/src/OHIFCornerstoneViewport.js b/Packages-react/extensions/ohif-cornerstone-extension/src/OHIFCornerstoneViewport.js index 44f6d1b6b..9d38c83bd 100644 --- a/Packages-react/extensions/ohif-cornerstone-extension/src/OHIFCornerstoneViewport.js +++ b/Packages-react/extensions/ohif-cornerstone-extension/src/OHIFCornerstoneViewport.js @@ -50,7 +50,13 @@ class OHIFCornerstoneViewport extends Component { StackManager.clearStacks(); } - static getCornerstoneStack(studies, studyInstanceUid, displaySetInstanceUid) { + static getCornerstoneStack( + studies, + studyInstanceUid, + displaySetInstanceUid, + sopInstanceUid, + frameIndex + ) { // Create shortcut to displaySet const study = studies.find( study => study.studyInstanceUid === studyInstanceUid @@ -61,32 +67,59 @@ class OHIFCornerstoneViewport extends Component { }); // Get stack from Stack Manager - return StackManager.findOrCreateStack(study, displaySet); + const storedStack = StackManager.findOrCreateStack(study, displaySet); + + // Clone the stack here so we don't mutate it + const stack = Object.assign({}, storedStack); + + if (frameIndex !== undefined) { + stack.currentImageIdIndex = frameIndex; + } else if (sopInstanceUid) { + const index = stack.imageIds.findIndex(imageId => { + const sopCommonModule = cornerstone.metaData.get( + 'sopCommonModule', + imageId + ); + if (!sopCommonModule) { + return; + } + + return sopCommonModule.sopInstanceUID === sopInstanceUid; + }); + + if (index > -1) { + stack.currentImageIdIndex = index; + } + } else { + stack.currentImageIdIndex = 0; + } + + return stack; } static getViewportData = ( studies, studyInstanceUid, - displaySetInstanceUid + displaySetInstanceUid, + sopInstanceUid, + frameIndex ) => { - const currentStack = OHIFCornerstoneViewport.getCornerstoneStack( + return OHIFCornerstoneViewport.getCornerstoneStack( studies, studyInstanceUid, - displaySetInstanceUid + displaySetInstanceUid, + sopInstanceUid, + frameIndex ); - - // Clone the stack here so we don't mutate it later - const stack = Object.assign({}, currentStack); - stack.currentImageIdIndex = 0; - - return stack; }; getViewportData = async ( studies, studyInstanceUid, displaySetInstanceUid, - sopClassUid + sopClassUid, + sopInstanceUid, + frameIndex ) => { let viewportData; @@ -98,15 +131,20 @@ class OHIFCornerstoneViewport extends Component { viewportData = await specialCaseHandler( studies, studyInstanceUid, - displaySetInstanceUid + displaySetInstanceUid, + sopInstanceUid, + frameIndex ); break; default: const stack = OHIFCornerstoneViewport.getViewportData( studies, studyInstanceUid, - displaySetInstanceUid + displaySetInstanceUid, + sopInstanceUid, + frameIndex ); + viewportData = { studyInstanceUid, displaySetInstanceUid, @@ -124,7 +162,9 @@ class OHIFCornerstoneViewport extends Component { const { studyInstanceUid, displaySetInstanceUid, - sopClassUids + sopClassUids, + sopInstanceUid, + frameIndex } = displaySet; if (sopClassUids.length > 1) { @@ -139,7 +179,9 @@ class OHIFCornerstoneViewport extends Component { studies, studyInstanceUid, displaySetInstanceUid, - sopClassUid + sopClassUid, + sopInstanceUid, + frameIndex ).then(viewportData => { this.setState({ viewportData @@ -153,11 +195,13 @@ class OHIFCornerstoneViewport extends Component { componentDidUpdate(prevProps) { const { studies, displaySet } = this.props.viewportData; - const { displaySetInstanceUid } = displaySet; const prevDisplaySet = prevProps.viewportData.displaySet; if ( - displaySet.displaySetInstanceUid !== prevDisplaySet.displaySetInstanceUid + displaySet.displaySetInstanceUid !== + prevDisplaySet.displaySetInstanceUid || + displaySet.sopInstanceUid !== prevDisplaySet.sopInstanceUid || + displaySet.frameIndex !== prevDisplaySet.frameIndex ) { this.setStateFromProps(); } diff --git a/Packages-react/extensions/ohif-cornerstone-extension/yarn.lock b/Packages-react/extensions/ohif-cornerstone-extension/yarn.lock index e9be0ea7b..472173116 100644 --- a/Packages-react/extensions/ohif-cornerstone-extension/yarn.lock +++ b/Packages-react/extensions/ohif-cornerstone-extension/yarn.lock @@ -1663,11 +1663,6 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -dicomweb-client@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.4.2.tgz#f1f5167d935810423ad2599e5160306bde2458ed" - integrity sha512-Raf2SVjWDrNaVIVt4CmfXWdKVacyEX5ux+pY2Qop0mhluG+OiCkbnESljz4PjglFRnprETEk6C0ELGDru0haew== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2957,11 +2952,6 @@ isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" -isomorphic-base64@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/isomorphic-base64/-/isomorphic-base64-1.0.2.tgz#f426aae82569ba8a4ec5ca73ad21a44ab1ee7803" - integrity sha1-9Caq6CVpuopOxcpzrSGkSrHueAM= - jest-get-type@^22.1.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" @@ -2975,16 +2965,6 @@ jest-validate@^23.5.0: leven "^2.1.0" pretty-format "^23.6.0" -jquery.hotkeys@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jquery.hotkeys/-/jquery.hotkeys-0.1.0.tgz#a88f636494fe75de41e4b753a059e5a523b83273" - integrity sha1-qI9jZJT+dd5B5LdToFnlpSO4MnM= - -jquery@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" - integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== - js-levenshtein@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" @@ -3268,11 +3248,6 @@ lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -3281,11 +3256,6 @@ lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" -lodash.merge@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== - lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" @@ -3711,18 +3681,6 @@ octal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/octal/-/octal-1.0.0.tgz#63e7162a68efbeb9e213588d58e989d1e5c4530b" -"ohif-core@file:.yalc/ohif-core": - version "0.2.9-ee88c076" - dependencies: - "@babel/runtime" "^7.2.0" - dicomweb-client "^0.4.2" - isomorphic-base64 "^1.0.2" - jquery "^3.3.1" - jquery.hotkeys "^0.1.0" - lodash.clonedeep "^4.5.0" - lodash.merge "^4.6.1" - validate.js "^0.12.0" - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4455,10 +4413,10 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -react-cornerstone-viewport@^0.1.14: - version "0.1.14" - resolved "https://registry.yarnpkg.com/react-cornerstone-viewport/-/react-cornerstone-viewport-0.1.14.tgz#297d004c3e746c476fc785336a928096f257e860" - integrity sha512-PUnrDsQujOKEDuXVZFuxX3d8I4sEYtbNeTrGk5HPeFZXccIx+KSUf+qU06CsJnpMu4FqgaeHGtMVKm3hJJRmvg== +react-cornerstone-viewport@^0.1.16: + version "0.1.16" + resolved "https://registry.yarnpkg.com/react-cornerstone-viewport/-/react-cornerstone-viewport-0.1.16.tgz#b1db13a3160ee10ffa9bfd91a6a0247f008170e2" + integrity sha512-hMEWoA3oDuurJ0AWZDH/hw1jPD7yY3EbaguE0CFusXdHsclCa7GjZXZb9EPqiAw8bF8vBIty7s96dwkqSFSLdw== dependencies: lodash.debounce "^4.0.8" moment "^2.23.0" @@ -5590,11 +5548,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate.js@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/validate.js/-/validate.js-0.12.0.tgz#17f989e37c192ea2f826bbf19bf4e97e6e4be68f" - integrity sha512-/x2RJSvbqEyxKj0RPN4xaRquK+EggjeVXiDDEyrJzsJogjtiZ9ov7lj/svVb4DM5Q5braQF4cooAryQbUwOxlA== - vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" diff --git a/Packages-react/ohif-viewer/package.json b/Packages-react/ohif-viewer/package.json index a8386d724..18660fa73 100644 --- a/Packages-react/ohif-viewer/package.json +++ b/Packages-react/ohif-viewer/package.json @@ -107,7 +107,7 @@ "lodash.isequal": "^4.5.0", "moment": "^2.24.0", "ohif-core": "^0.3.2", - "ohif-cornerstone-extension": "0.0.16", + "ohif-cornerstone-extension": "0.0.17", "ohif-dicom-html-extension": "^0.0.2", "ohif-dicom-microscopy-extension": "^0.0.5", "ohif-dicom-pdf-extension": "^0.0.5", diff --git a/Packages-react/ohif-viewer/yarn.lock b/Packages-react/ohif-viewer/yarn.lock index fdc1210b3..f39db738e 100644 --- a/Packages-react/ohif-viewer/yarn.lock +++ b/Packages-react/ohif-viewer/yarn.lock @@ -7825,15 +7825,15 @@ ohif-core@^0.3.2: lodash.merge "^4.6.1" validate.js "^0.12.0" -ohif-cornerstone-extension@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/ohif-cornerstone-extension/-/ohif-cornerstone-extension-0.0.16.tgz#5320ced8b7599c6f9e27c966dff74f87e32de15b" - integrity sha512-qT0/FvutUlNC6TPZnSUh5DHUidcduf7zvml8MQESIfDp5nI0ffsMR2EjWK8R9+0DOpHwZjVttoxlDJJWuVsggw== +ohif-cornerstone-extension@0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/ohif-cornerstone-extension/-/ohif-cornerstone-extension-0.0.17.tgz#58c182d3227d328c5a17966b5e7c40b513920704" + integrity sha512-tT6rbirsCyMDgYPzJXjNhk7zT9KN/mJaKPfp3TVcNIgN1EAARQROU/5shaLUa6DA8M3QDQyKVIVKu+39i6ijVg== dependencies: "@babel/runtime" "^7.2.0" classnames "^2.2.6" lodash.throttle "^4.1.1" - react-cornerstone-viewport "^0.1.14" + react-cornerstone-viewport "^0.1.16" ohif-dicom-html-extension@^0.0.2: version "0.0.2" @@ -9440,10 +9440,10 @@ react-bootstrap-modal@^4.2.0: react-overlays "^0.8.0" react-transition-group "^2.0.0" -react-cornerstone-viewport@^0.1.14: - version "0.1.15" - resolved "https://registry.yarnpkg.com/react-cornerstone-viewport/-/react-cornerstone-viewport-0.1.15.tgz#be2743cb027f9eb7848910bee53b37e85f46d9a4" - integrity sha512-GwrVRWeStycL15VrmVZezulIpb8fLGOpg/MrIM0va5s6EfFZSGRqwTcM/1WZZOvKAdRr8y+SDmITiacy5+r3kg== +react-cornerstone-viewport@^0.1.16: + version "0.1.16" + resolved "https://registry.yarnpkg.com/react-cornerstone-viewport/-/react-cornerstone-viewport-0.1.16.tgz#b1db13a3160ee10ffa9bfd91a6a0247f008170e2" + integrity sha512-hMEWoA3oDuurJ0AWZDH/hw1jPD7yY3EbaguE0CFusXdHsclCa7GjZXZb9EPqiAw8bF8vBIty7s96dwkqSFSLdw== dependencies: lodash.debounce "^4.0.8" moment "^2.23.0" diff --git a/Packages-react/react-cornerstone-viewport b/Packages-react/react-cornerstone-viewport index 8bfdda9e3..3773fd489 160000 --- a/Packages-react/react-cornerstone-viewport +++ b/Packages-react/react-cornerstone-viewport @@ -1 +1 @@ -Subproject commit 8bfdda9e3357a0c555e10e903fc019f1c1d98394 +Subproject commit 3773fd4899eb8faf24a128f6a4a43f6e6e5762ee