From 00f0ae4bbc93bdda57a1dcb640239480d1d9b676 Mon Sep 17 00:00:00 2001 From: "James A. Petts" Date: Mon, 15 Jun 2020 12:09:48 +0100 Subject: [PATCH] By default other tool state not loaded into the viewport. (set disabled) --- .../dicom-sr/src/OHIFCornerstoneSRViewport.js | 82 +++++++++++++++++-- .../dicom-sr/src/tools/DICOMSRDisplayTool.js | 1 + .../dicom-sr/src/utils/addMeasurement.js | 7 +- modes/SRViewportExample/src/index.js | 6 +- modes/longitudinal/src/index.js | 12 ++- platform/core/src/classes/MetadataProvider.js | 2 + 6 files changed, 96 insertions(+), 14 deletions(-) diff --git a/extensions/dicom-sr/src/OHIFCornerstoneSRViewport.js b/extensions/dicom-sr/src/OHIFCornerstoneSRViewport.js index ef3630f67..99b95e8c0 100644 --- a/extensions/dicom-sr/src/OHIFCornerstoneSRViewport.js +++ b/extensions/dicom-sr/src/OHIFCornerstoneSRViewport.js @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import cornerstoneTools from 'cornerstone-tools'; +import cornerstone from 'cornerstone-core'; import CornerstoneViewport from 'react-cornerstone-viewport'; import OHIF from '@ohif/core'; @@ -8,6 +9,10 @@ import { ViewportActionBar, useViewportGrid } from '@ohif/ui'; import TOOL_NAMES from './constants/toolNames'; import id from './id'; +const BaseAnnotationTool = cornerstoneTools.importInternal( + 'base/BaseAnnotationTool' +); + // const cine = viewportSpecificData.cine; // isPlaying = cine.isPlaying === true; @@ -33,19 +38,65 @@ function OHIFCornerstoneSRViewport({ const onElementEnabled = evt => { const eventData = evt.detail; - const { element } = eventData; + const targetElement = eventData.element; + debugger; + + // TODO -> This will only be temporary until we set a tool on, and isn't very customizable. + const globalTools = cornerstoneTools.store.state.globalTools; + + const toolNames = Object.keys(globalTools); + + Object.keys(globalTools).forEach(globalToolName => { + cornerstoneTools.setToolDisabledForElement(targetElement, globalToolName); + }); + + debugger; + + cornerstoneTools.setToolEnabledForElement( + targetElement, + TOOL_NAMES.DICOM_SR_DISPLAY_TOOL + ); + + cornerstoneTools.setToolActiveForElement(targetElement, 'PanMultiTouch', { + pointers: 2, + }); + cornerstoneTools.setToolActiveForElement( + targetElement, + 'ZoomTouchPinch', + {} + ); + + cornerstoneTools.setToolActiveForElement(targetElement, 'Wwwc', { + mouseButtonMask: 1, + }); + cornerstoneTools.setToolActiveForElement(targetElement, 'Pan', { + mouseButtonMask: 4, + }); + cornerstoneTools.setToolActiveForElement(targetElement, 'Zoom', { + mouseButtonMask: 2, + }); + cornerstoneTools.setToolActiveForElement( + targetElement, + 'StackScrollMouseWheel', + {} + ); + + setTrackingUniqueIdentifiersForElement(targetElement); + + setElement(targetElement); + }; + + const setTrackingUniqueIdentifiersForElement = targetElement => { const { measurements } = displaySet; const srModule = cornerstoneTools.getModule(id); srModule.setters.trackingUniqueIdentifiersForElement( - element, + targetElement, measurements.map(measurement => measurement.TrackingUniqueIdentifier), measurementSelected ); - - setElement(element); }; useEffect(() => { @@ -85,17 +136,34 @@ function OHIFCornerstoneSRViewport({ ).then(({ viewportData, activeDisplaySetData }) => { setViewportData({ ...viewportData }); setActiveDisplaySetData({ ...activeDisplaySetData }); + + if (element !== null) { + cornerstone.updateImage(element); + } }); }; useEffect(() => { - updateViewport(); + if (element !== null) { + debugger; + setTrackingUniqueIdentifiersForElement(element); + } }, [ dataSource, displaySet, displaySet.StudyInstanceUID, displaySet.displaySetInstanceUID, + ]); + + useEffect(() => { + updateViewport(); + }, [ measurementSelected, + dataSource, + displaySet, + displaySet.StudyInstanceUID, + displaySet.displaySetInstanceUID, + element, ]); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -142,8 +210,6 @@ function OHIFCornerstoneSRViewport({ SeriesNumber, } = activeDisplaySetData; - debugger; - const onMeasurementChange = direction => { let newMeausrementSelected = measurementSelected; @@ -306,8 +372,6 @@ async function _getViewportAndActiveDisplaySetData( SeriesNumber: image0.SeriesNumber, }; - debugger; - return { viewportData, activeDisplaySetData }; } diff --git a/extensions/dicom-sr/src/tools/DICOMSRDisplayTool.js b/extensions/dicom-sr/src/tools/DICOMSRDisplayTool.js index cc0c8a51f..f0dc64b4e 100644 --- a/extensions/dicom-sr/src/tools/DICOMSRDisplayTool.js +++ b/extensions/dicom-sr/src/tools/DICOMSRDisplayTool.js @@ -9,6 +9,7 @@ const draw = importInternal('drawing/draw'); const drawJoinedLines = importInternal('drawing/drawJoinedLines'); const drawCircle = importInternal('drawing/drawCircle'); const drawEllipse = importInternal('drawing/drawEllipse'); +const drawHandles = importInternal('drawing/drawHandles'); const getNewContext = importInternal('drawing/getNewContext'); const BaseTool = importInternal('base/BaseTool'); diff --git a/extensions/dicom-sr/src/utils/addMeasurement.js b/extensions/dicom-sr/src/utils/addMeasurement.js index 825769523..8ad925b2c 100644 --- a/extensions/dicom-sr/src/utils/addMeasurement.js +++ b/extensions/dicom-sr/src/utils/addMeasurement.js @@ -1,13 +1,14 @@ import cornerstoneTools from 'cornerstone-tools'; +import cornerstoneMath from 'cornerstone-math'; +import cornerstone from 'cornerstone-core'; import TOOL_NAMES from '../constants/toolNames'; import SCOORD_TYPES from '../constants/scoordTypes'; -import { cornerstone } from '../../../../platform/core/src'; + +window.cornerstone = cornerstone; const globalImageIdSpecificToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager; -console.log(globalImageIdSpecificToolStateManager); - export default function addMeasurement( measurement, imageId, diff --git a/modes/SRViewportExample/src/index.js b/modes/SRViewportExample/src/index.js index cb5390881..542e42108 100644 --- a/modes/SRViewportExample/src/index.js +++ b/modes/SRViewportExample/src/index.js @@ -93,7 +93,11 @@ export default function mode({ modeConfiguration }) { }, }, ], - extensions: ['org.ohif.default', 'org.ohif.cornerstone'], + extensions: [ + 'org.ohif.default', + 'org.ohif.cornerstone', + 'org.ohif.dicom-sr', + ], sopClassHandlers: [ 'org.ohif.default.sopClassHandlerModule.stack', 'org.ohif.dicom-sr.sopClassHandlerModule.dicom-sr', diff --git a/modes/longitudinal/src/index.js b/modes/longitudinal/src/index.js index 717d301e0..d693d26a1 100644 --- a/modes/longitudinal/src/index.js +++ b/modes/longitudinal/src/index.js @@ -10,6 +10,11 @@ const tracked = { viewport: 'org.ohif.measurement-tracking.viewportModule.cornerstone-tracked', }; +const dicomsr = { + sopClassHandler: 'org.ohif.dicom-sr.sopClassHandlerModule.dicom-sr', + viewport: 'org.ohif.dicom-sr.viewportModule.dicom-sr', +}; + export default function mode({ modeConfiguration }) { return { // TODO: We're using this as a route segment @@ -60,6 +65,10 @@ export default function mode({ modeConfiguration }) { namespace: tracked.viewport, displaySetsToDisplay: [ohif.sopClassHandler], }, + { + namespace: dicomsr.viewport, + displaySetsToDisplay: [dicomsr.sopClassHandler], + }, ], }, }; @@ -70,8 +79,9 @@ export default function mode({ modeConfiguration }) { 'org.ohif.default', 'org.ohif.cornerstone', 'org.ohif.measurement-tracking', + 'org.ohif.dicom-sr', ], - sopClassHandlers: [ohif.sopClassHandler], + sopClassHandlers: [ohif.sopClassHandler, dicomsr.sopClassHandler], }; } diff --git a/platform/core/src/classes/MetadataProvider.js b/platform/core/src/classes/MetadataProvider.js index 61e4fcd78..7b013436e 100644 --- a/platform/core/src/classes/MetadataProvider.js +++ b/platform/core/src/classes/MetadataProvider.js @@ -6,6 +6,8 @@ import fetchPaletteColorLookupTableData from '../utils/metadataProvider/fetchPal import fetchOverlayData from '../utils/metadataProvider/fetchOverlayData'; import DicomMetadataStore from '../services/DicomMetadataStore'; +window.dcmjs = dcmjs; + class MetadataProvider { constructor() { // Define the main "metadataLookup" private property as an immutable property.