Compare commits

..

No commits in common. "06d0ce229099a6bbf6c731f0ae1f07154ce5ec53" and "a59509dd7dc2041d0ef2f7ffba5aae0731a6db3e" have entirely different histories.

4 changed files with 99 additions and 185 deletions

View File

@ -179,18 +179,17 @@
<Viewport ref="CT_AXIAL" :index="1" :active-index="activeIndex" <Viewport ref="CT_AXIAL" :index="1" :active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="ctSeries" :is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="ctSeries"
:rendering-engine-id="renderingEngineId" viewport-id="CT_AXIAL" :volume="ctVolume" :rendering-engine-id="renderingEngineId" viewport-id="CT_AXIAL" :volume="ctVolume"
:measure-datas="measureDatas" :style="1 === activeIndex ? viewportStyle : {}" :measure-datas="measureDatas" :style="1 === activeIndex ? viewportStyle : {}" />
@fusionSlicePointChange="handleFusionSlicePointChange" />
<Viewport ref="PT_AXIAL" :index="2" :active-index="activeIndex" <Viewport ref="PT_AXIAL" :index="2" :active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries" :is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries"
:rendering-engine-id="renderingEngineId" viewport-id="PT_AXIAL" :volume="ptVolume" :rendering-engine-id="renderingEngineId" viewport-id="PT_AXIAL" :volume="ptVolume"
:measure-datas="measureDatas" :style="2 === activeIndex ? viewportStyle : {}" :measure-datas="measureDatas" :style="2 === activeIndex ? viewportStyle : {}"
@upperRangeChange="upperRangeChange" @fusionSlicePointChange="handleFusionSlicePointChange" /> @upperRangeChange="upperRangeChange" />
<Viewport ref="FUSION_AXIAL" :index="3" :active-index="activeIndex" <Viewport ref="FUSION_AXIAL" :index="3" :active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries" :ct-series-info="ctSeries" :is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries" :ct-series-info="ctSeries"
:rendering-engine-id="renderingEngineId" viewport-id="FUSION_AXIAL" :volume="ptVolume" :rendering-engine-id="renderingEngineId" viewport-id="FUSION_AXIAL" :volume="ptVolume"
:measure-datas="measureDatas" :rgb-preset-name="rgbPresetName" :style="3 === activeIndex ? viewportStyle : {}" :measure-datas="measureDatas" :rgb-preset-name="rgbPresetName" :style="3 === activeIndex ? viewportStyle : {}"
@upperRangeChange="upperRangeChange" @fusionSlicePointChange="handleFusionSlicePointChange" /> @upperRangeChange="upperRangeChange" />
<Viewport ref="PET_MIP_CORONAL" :index="4" :active-index="activeIndex" <Viewport ref="PET_MIP_CORONAL" :index="4" :active-index="activeIndex"
:is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries" :is-reading-show-subject-info="isReadingShowSubjectInfo" :series-info="petSeries"
:rendering-engine-id="renderingEngineId" viewport-id="PET_MIP_CORONAL" :measure-datas="measureDatas" :rendering-engine-id="renderingEngineId" viewport-id="PET_MIP_CORONAL" :measure-datas="measureDatas"
@ -260,7 +259,7 @@ import CustomWwwcForm from './../CustomWwwcForm'
import FusionForm from './FusionForm.vue' import FusionForm from './FusionForm.vue'
import { getTableAnswerRowInfoList, getDicomSeriesInfo } from '@/api/trials' import { getTableAnswerRowInfoList, getDicomSeriesInfo } from '@/api/trials'
import FusionEvent from './FusionEvent' import FusionEvent from './FusionEvent'
import FusionJumpToPointTool from '../../../dicoms3D/components/tools/FusionJumpToPointTool' import FusionJumpToPointTool from '../../../dicoms3D/components/tools/FusionJumpToPointTool'
// import { ColorMaps } from '@kitware/vtk.js/Common/Core/ColorMaps' // import { ColorMaps } from '@kitware/vtk.js/Common/Core/ColorMaps'
import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps' import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps'
import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction' import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'
@ -426,12 +425,12 @@ export default {
fusion: { visible: false }, // fusion: { visible: false }, //
screenshotWindow: null, screenshotWindow: null,
hasVoiChanged: false, hasVoiChanged: false,
lastUpper: null, lastUpper: null,
fusionCrosshairStyle: { fusionCrosshairStyle: {
lineWidth: 2, lineWidth: 2,
lineLength: 20, lineLength: 20,
centerHoleSize: 20, centerHoleSize: 20,
} }
// initFirstAnnotation:false // initFirstAnnotation:false
} }
}, },
@ -629,7 +628,7 @@ export default {
this.setUpToolGroups() this.setUpToolGroups()
this.setUpSynchronizers() this.setUpSynchronizers()
this.dispatchFusionCenterPoint() this.dispatchFusionCenterPoint()
// this.$refs['CT_AXIAL'].scroll(0) // this.$refs['CT_AXIAL'].scroll(0)
// this.$refs['PT_AXIAL'].scroll(0) // this.$refs['PT_AXIAL'].scroll(0)
// this.$refs['FUSION_AXIAL'].scroll(0) // this.$refs['FUSION_AXIAL'].scroll(0)
@ -981,7 +980,7 @@ export default {
cornerstoneTools.addTool(WindowLevelTool) cornerstoneTools.addTool(WindowLevelTool)
cornerstoneTools.addTool(ZoomTool) cornerstoneTools.addTool(ZoomTool)
cornerstoneTools.addTool(StackScrollTool) cornerstoneTools.addTool(StackScrollTool)
cornerstoneTools.addTool(FusionJumpToPointTool) cornerstoneTools.addTool(FusionJumpToPointTool)
cornerstoneTools.addTool(VolumeRotateTool) cornerstoneTools.addTool(VolumeRotateTool)
cornerstoneTools.addTool(EllipticalROITool) cornerstoneTools.addTool(EllipticalROITool)
cornerstoneTools.addTool(CircleROITool) cornerstoneTools.addTool(CircleROITool)
@ -1013,7 +1012,7 @@ export default {
toolGroup.addTool(ProbeTool.toolName) toolGroup.addTool(ProbeTool.toolName)
toolGroup.addTool(ScaleOverlayTool.toolName) toolGroup.addTool(ScaleOverlayTool.toolName)
toolGroup.addTool(OrientationMarkerTool.toolName) toolGroup.addTool(OrientationMarkerTool.toolName)
toolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration()) toolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration())
}) })
fusionToolGroup.addTool(PanTool.toolName) fusionToolGroup.addTool(PanTool.toolName)
@ -1029,7 +1028,7 @@ export default {
fusionToolGroup.addTool(ProbeTool.toolName) fusionToolGroup.addTool(ProbeTool.toolName)
fusionToolGroup.addTool(ScaleOverlayTool.toolName) fusionToolGroup.addTool(ScaleOverlayTool.toolName)
fusionToolGroup.addTool(OrientationMarkerTool.toolName) fusionToolGroup.addTool(OrientationMarkerTool.toolName)
fusionToolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration()) fusionToolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration())
// Here is the difference in the toolGroups used, that we need to specify the // Here is the difference in the toolGroups used, that we need to specify the
// volume to use for the WindowLevelTool for the fusion viewports // volume to use for the WindowLevelTool for the fusion viewports
@ -1081,13 +1080,13 @@ export default {
true // overwrite true // overwrite
) )
toolGroup.setToolEnabled(ScaleOverlayTool.toolName) toolGroup.setToolEnabled(ScaleOverlayTool.toolName)
toolGroup.setToolActive(FusionJumpToPointTool.toolName, { toolGroup.setToolActive(FusionJumpToPointTool.toolName, {
bindings: [ bindings: [
{ {
mouseButton: MouseBindings.Primary // Left Click mouseButton: MouseBindings.Primary // Left Click
} }
] ]
}) })
// toolGroup.setToolConfiguration(OrientationMarkerTool.toolName, { // toolGroup.setToolConfiguration(OrientationMarkerTool.toolName, {
// orientationWidget: { // orientationWidget: {
// enabled: true, // enabled: true,
@ -1139,11 +1138,11 @@ export default {
mipToolGroup.setToolActive(VolumeRotateTool.toolName, { mipToolGroup.setToolActive(VolumeRotateTool.toolName, {
bindings: [{ mouseButton: MouseBindings.Wheel }], bindings: [{ mouseButton: MouseBindings.Wheel }],
}); });
mipToolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration()) mipToolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration())
// Set the initial state of the tools, here we set one tool active on left click. // Set the initial state of the tools, here we set one tool active on left click.
// This means left click will draw that tool. // This means left click will draw that tool.
mipToolGroup.setToolActive(FusionJumpToPointTool.toolName, { mipToolGroup.setToolActive(FusionJumpToPointTool.toolName, {
bindings: [ bindings: [
{ {
mouseButton: MouseBindings.Primary // Left ClickR mouseButton: MouseBindings.Primary // Left ClickR
@ -1157,111 +1156,81 @@ export default {
// mipToolGroup.setToolActive(OrientationMarkerTool.toolName) // mipToolGroup.setToolActive(OrientationMarkerTool.toolName)
mipToolGroup.addViewport(viewportIds.PETMIP.CORONAL, renderingEngineId) mipToolGroup.addViewport(viewportIds.PETMIP.CORONAL, renderingEngineId)
}, },
getFusionJumpToolConfiguration() { getFusionJumpToolConfiguration() {
return { return {
targetViewportIds: [ targetViewportIds: [
viewportIds.CT.AXIAL, viewportIds.CT.AXIAL,
viewportIds.PT.AXIAL, viewportIds.PT.AXIAL,
viewportIds.FUSION.AXIAL, viewportIds.FUSION.AXIAL,
viewportIds.PETMIP.CORONAL viewportIds.PETMIP.CORONAL
], ],
useBrightestPoint: true, useBrightestPoint: true,
jumpToTargetViewports: true, jumpToTargetViewports: true,
dispatchEventName: 'fusion-mip-point-selected', dispatchEventName: 'fusion-mip-point-selected',
getReferenceLineColor: this.setFusionCrosshairsToolLineColor, getReferenceLineColor: this.setFusionCrosshairsToolLineColor,
style: this.fusionCrosshairStyle, style: this.fusionCrosshairStyle,
referenceLinesCenterGapRadius: this.fusionCrosshairStyle.centerHoleSize, referenceLinesCenterGapRadius: this.fusionCrosshairStyle.centerHoleSize,
minimal: { minimal: {
enabled: true, enabled: true,
lineLengthInPx: this.fusionCrosshairStyle.lineLength, lineLengthInPx: this.fusionCrosshairStyle.lineLength,
}, },
mipViewportIds: [viewportIds.PETMIP.CORONAL] mipViewportIds: [viewportIds.PETMIP.CORONAL]
} }
}, },
setFusionCrosshairsToolLineColor(viewportId) { setFusionCrosshairsToolLineColor(viewportId) {
const colors = { const colors = {
[viewportIds.CT.AXIAL]: '#0000ff', [viewportIds.CT.AXIAL]: '#0000ff',
[viewportIds.PT.AXIAL]: '#0000ff', [viewportIds.PT.AXIAL]: '#0000ff',
[viewportIds.FUSION.AXIAL]: '#0000ff', [viewportIds.FUSION.AXIAL]: '#0000ff',
[viewportIds.PETMIP.CORONAL]: '#ff0000' [viewportIds.PETMIP.CORONAL]: '#ff0000'
} }
return colors[viewportId] || '#0000ff' return colors[viewportId] || '#0000ff'
}, },
handleFusionSlicePointChange({ viewportId, worldPoint }) { dispatchFusionCenterPoint(retryCount = 0) {
if (!this.isFusion) return const renderEngine = getRenderingEngine(renderingEngineId)
if (!viewportId || !Array.isArray(worldPoint) || worldPoint.length < 3) return if (!renderEngine) return
if (viewportId === viewportIds.PETMIP.CORONAL) return const toolGroupCandidates = [fusionToolGroupId, mipToolGroupUID, ptToolGroupId, ctToolGroupId]
let instance = null
const activeViewportId = this.activeIndex === 1 for (const toolGroupId of toolGroupCandidates) {
? viewportIds.CT.AXIAL const toolGroup = ToolGroupManager.getToolGroup(toolGroupId)
: this.activeIndex === 2 instance = toolGroup?.getToolInstance?.(FusionJumpToPointTool.toolName)
? viewportIds.PT.AXIAL if (instance?.setPoint) break
: this.activeIndex === 3 }
? viewportIds.FUSION.AXIAL if (!instance?.setPoint) {
: viewportIds.PETMIP.CORONAL if (retryCount < 10) {
if (viewportId !== activeViewportId) return setTimeout(() => {
this.dispatchFusionCenterPoint(retryCount + 1)
const renderEngine = getRenderingEngine(renderingEngineId) }, 120)
if (!renderEngine) return }
const toolGroupCandidates = [fusionToolGroupId, mipToolGroupUID, ptToolGroupId, ctToolGroupId] return
let instance = null }
for (const toolGroupId of toolGroupCandidates) {
const toolGroup = ToolGroupManager.getToolGroup(toolGroupId) const candidates = [viewportIds.FUSION.AXIAL, viewportIds.PT.AXIAL, viewportIds.CT.AXIAL]
instance = toolGroup.getToolInstance(FusionJumpToPointTool.toolName) for (const viewportId of candidates) {
if (instance.setPoint) break const viewport = renderEngine.getViewport(viewportId)
} if (!viewport) continue
if (!instance.setPoint) return const width = viewport.element?.clientWidth
const height = viewport.element?.clientHeight
instance.setPoint(worldPoint, viewportId, renderEngine.id, { let worldPoint = null
jumpToTargetViewports: false, if (width && height && viewport.canvasToWorld) {
dispatchEvent: false, worldPoint = viewport.canvasToWorld([width / 2, height / 2])
}) }
}, if ((!worldPoint || worldPoint.length < 3) && viewport.getCamera) {
dispatchFusionCenterPoint(retryCount = 0) { worldPoint = viewport.getCamera()?.focalPoint
const renderEngine = getRenderingEngine(renderingEngineId) }
if (!renderEngine) return if (!worldPoint || worldPoint.length < 3) continue
const toolGroupCandidates = [fusionToolGroupId, mipToolGroupUID, ptToolGroupId, ctToolGroupId] instance.setPoint(worldPoint, viewportId, renderEngine.id, {
let instance = null jumpToTargetViewports: true,
for (const toolGroupId of toolGroupCandidates) { dispatchEvent: false,
const toolGroup = ToolGroupManager.getToolGroup(toolGroupId) })
instance = toolGroup?.getToolInstance?.(FusionJumpToPointTool.toolName) return
if (instance?.setPoint) break }
} if (retryCount < 10) {
if (!instance?.setPoint) { setTimeout(() => {
if (retryCount < 10) { this.dispatchFusionCenterPoint(retryCount + 1)
setTimeout(() => { }, 120)
this.dispatchFusionCenterPoint(retryCount + 1) }
}, 120) },
}
return
}
const candidates = [viewportIds.FUSION.AXIAL, viewportIds.PT.AXIAL, viewportIds.CT.AXIAL]
for (const viewportId of candidates) {
const viewport = renderEngine.getViewport(viewportId)
if (!viewport) continue
const width = viewport.element?.clientWidth
const height = viewport.element?.clientHeight
let worldPoint = null
if (width && height && viewport.canvasToWorld) {
worldPoint = viewport.canvasToWorld([width / 2, height / 2])
}
if ((!worldPoint || worldPoint.length < 3) && viewport.getCamera) {
worldPoint = viewport.getCamera()?.focalPoint
}
if (!worldPoint || worldPoint.length < 3) continue
instance.setPoint(worldPoint, viewportId, renderEngine.id, {
jumpToTargetViewports: true,
dispatchEvent: false,
})
return
}
if (retryCount < 10) {
setTimeout(() => {
this.dispatchFusionCenterPoint(retryCount + 1)
}, 120)
}
},
getTextLines(data, targetId) { getTextLines(data, targetId) {
const cachedVolumeStats = data.cachedStats[targetId] const cachedVolumeStats = data.cachedStats[targetId]
const { const {

View File

@ -272,24 +272,6 @@ export default {
this.renderColorBar(this.presetName) this.renderColorBar(this.presetName)
} }
} }
if (this.index !== 4 && viewport) {
const width = viewport.element.clientWidth
const height = viewport.element.clientHeight
let worldPoint = null
if (width && height && viewport.canvasToWorld) {
worldPoint = viewport.canvasToWorld([width / 2, height / 2])
}
if ((!worldPoint || worldPoint.length < 3) && viewport.getCamera) {
worldPoint = viewport.getCamera()?.focalPoint
}
if (Array.isArray(worldPoint) && worldPoint.length >= 3) {
this.$emit('fusionSlicePointChange', {
viewportId: this.viewportId,
worldPoint: [...worldPoint]
})
}
}
}, },
getOrientationMarker() { getOrientationMarker() {
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars

View File

@ -270,24 +270,6 @@ export default {
} }
} }
if (!this.isMip && viewport) {
const width = this.element?.clientWidth
const height = this.element?.clientHeight
let worldPoint = null
if (width && height && viewport.canvasToWorld) {
worldPoint = viewport.canvasToWorld([width / 2, height / 2])
}
if ((!worldPoint || worldPoint.length < 3) && viewport.getCamera) {
worldPoint = viewport.getCamera()?.focalPoint
}
if (Array.isArray(worldPoint) && worldPoint.length >= 3) {
this.$emit('fusionSlicePointChange', {
viewportId: this.viewportId,
worldPoint: [...worldPoint],
})
}
}
}, },
setFullScreen(index) { setFullScreen(index) {
setTimeout(() => { setTimeout(() => {

View File

@ -362,7 +362,7 @@
:viewport-index="index" :active-tool="activeTool" @activeViewport="activeViewport" :viewport-index="index" :active-tool="activeTool" @activeViewport="activeViewport"
@toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD" @toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD"
@renderAnnotations="renderAnnotations" @upperRangeChange="upperRangeChange" @renderAnnotations="renderAnnotations" @upperRangeChange="upperRangeChange"
@contentMouseup="contentMouseup" @fusionSlicePointChange="handleFusionSlicePointChange" /> @contentMouseup="contentMouseup" />
</div> </div>
</div> </div>
<div v-if="readingTool === 2" class="fusion-hidden-viewports"> <div v-if="readingTool === 2" class="fusion-hidden-viewports">
@ -2634,25 +2634,6 @@ export default {
if (this.isFusion) return [this.fusionToolGroupId] if (this.isFusion) return [this.fusionToolGroupId]
return [`${this.viewportKey}-0`, `${this.viewportKey}-1`, `${this.viewportKey}-2`, `${this.viewportKey}-3`] return [`${this.viewportKey}-0`, `${this.viewportKey}-1`, `${this.viewportKey}-2`, `${this.viewportKey}-3`]
}, },
handleFusionSlicePointChange({ viewportId, worldPoint }) {
if (!this.isFusion) return
if (!viewportId || !Array.isArray(worldPoint) || worldPoint.length < 3) return
const activeFusionViewportId = `viewport-fusion-${this.activeViewportIndex}`
if (viewportId !== activeFusionViewportId) return
if (viewportId === 'viewport-fusion-3') return
const renderingEngine = getRenderingEngine(renderingEngineId)
if (!renderingEngine) return
const toolGroup = ToolGroupManager.getToolGroup(this.fusionToolGroupId)
const instance = toolGroup.getToolInstance(FusionJumpToPointTool.toolName)
if (!instance.setPoint) return
instance.setPoint(worldPoint, viewportId, renderingEngine.id, {
jumpToTargetViewports: false,
dispatchEvent: false,
})
},
setFusionMipJumpEnabled(enabled) { setFusionMipJumpEnabled(enabled) {
if (!this.isFusion) return if (!this.isFusion) return
const toolGroup = ToolGroupManager.getToolGroup(this.fusionToolGroupId) const toolGroup = ToolGroupManager.getToolGroup(this.fusionToolGroupId)