{
- 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)
- }
- },
+ getFusionJumpToolConfiguration() {
+ return {
+ targetViewportIds: [
+ viewportIds.CT.AXIAL,
+ viewportIds.PT.AXIAL,
+ viewportIds.FUSION.AXIAL,
+ viewportIds.PETMIP.CORONAL
+ ],
+ useBrightestPoint: true,
+ jumpToTargetViewports: true,
+ dispatchEventName: 'fusion-mip-point-selected',
+ getReferenceLineColor: this.setFusionCrosshairsToolLineColor,
+ style: this.fusionCrosshairStyle,
+ referenceLinesCenterGapRadius: this.fusionCrosshairStyle.centerHoleSize,
+ minimal: {
+ enabled: true,
+ lineLengthInPx: this.fusionCrosshairStyle.lineLength,
+ },
+ mipViewportIds: [viewportIds.PETMIP.CORONAL]
+ }
+ },
+ setFusionCrosshairsToolLineColor(viewportId) {
+ const colors = {
+ [viewportIds.CT.AXIAL]: '#0000ff',
+ [viewportIds.PT.AXIAL]: '#0000ff',
+ [viewportIds.FUSION.AXIAL]: '#0000ff',
+ [viewportIds.PETMIP.CORONAL]: '#ff0000'
+ }
+ return colors[viewportId] || '#0000ff'
+ },
+ handleFusionSlicePointChange({ viewportId, worldPoint }) {
+ if (!this.isFusion) return
+ if (!viewportId || !Array.isArray(worldPoint) || worldPoint.length < 3) return
+ if (viewportId === viewportIds.PETMIP.CORONAL) return
+
+ const activeViewportId = this.activeIndex === 1
+ ? viewportIds.CT.AXIAL
+ : this.activeIndex === 2
+ ? viewportIds.PT.AXIAL
+ : this.activeIndex === 3
+ ? viewportIds.FUSION.AXIAL
+ : viewportIds.PETMIP.CORONAL
+ if (viewportId !== activeViewportId) return
+
+ const renderEngine = getRenderingEngine(renderingEngineId)
+ if (!renderEngine) return
+ const toolGroupCandidates = [fusionToolGroupId, mipToolGroupUID, ptToolGroupId, ctToolGroupId]
+ let instance = null
+ for (const toolGroupId of toolGroupCandidates) {
+ const toolGroup = ToolGroupManager.getToolGroup(toolGroupId)
+ instance = toolGroup?.getToolInstance(FusionJumpToPointTool.toolName)
+ if (instance?.setPoint) break
+ }
+ if (!instance?.setPoint) return
+
+ instance.setPoint(worldPoint, viewportId, renderEngine.id, {
+ jumpToTargetViewports: false,
+ dispatchEvent: false,
+ })
+ },
+ dispatchFusionCenterPoint(retryCount = 0) {
+ const renderEngine = getRenderingEngine(renderingEngineId)
+ if (!renderEngine) return
+ const toolGroupCandidates = [fusionToolGroupId, mipToolGroupUID, ptToolGroupId, ctToolGroupId]
+ let instance = null
+ for (const toolGroupId of toolGroupCandidates) {
+ const toolGroup = ToolGroupManager.getToolGroup(toolGroupId)
+ instance = toolGroup?.getToolInstance?.(FusionJumpToPointTool.toolName)
+ if (instance?.setPoint) break
+ }
+ if (!instance?.setPoint) {
+ if (retryCount < 10) {
+ setTimeout(() => {
+ 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) {
const cachedVolumeStats = data.cachedStats[targetId]
const {
diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/Viewport.vue b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/Viewport.vue
index 2e38d02c..83339788 100644
--- a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/Viewport.vue
+++ b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/Viewport.vue
@@ -272,6 +272,24 @@ export default {
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() {
// eslint-disable-next-line no-unused-vars
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue
index a4aa5c11..3f0b9ebc 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue
@@ -270,6 +270,24 @@ 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) {
setTimeout(() => {
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
index a4e18cea..84d5285a 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
@@ -362,7 +362,7 @@
:viewport-index="index" :active-tool="activeTool" @activeViewport="activeViewport"
@toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD"
@renderAnnotations="renderAnnotations" @upperRangeChange="upperRangeChange"
- @contentMouseup="contentMouseup" />
+ @contentMouseup="contentMouseup" @fusionSlicePointChange="handleFusionSlicePointChange" />
@@ -2634,6 +2634,25 @@ export default {
if (this.isFusion) return [this.fusionToolGroupId]
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) {
if (!this.isFusion) return
const toolGroup = ToolGroupManager.getToolGroup(this.fusionToolGroupId)
@@ -3455,6 +3474,10 @@ export default {
async toggleTaskByViewport(obj) {
const i = this.visitTaskList.findIndex(v => v.VisitTaskNum === obj.visitTaskNum)
if (i === -1) return
+ if (this.readingTool === 3) {
+ let res = await this.changeScreenSave()
+ if (!res) return false
+ }
this.activeTaskId = this.visitTaskList[i].VisitTaskId
this.activeTaskIndex = i
if (!this.selectArr.includes(this.activeTaskId)) {
@@ -3490,6 +3513,11 @@ export default {
this.setToolsPassive()
},
async activeSeries(obj) {
+ if (this.readingTool === 3) {
+ let res = await this.changeScreenSave()
+ if (!res) return false
+ DicomEvent.$emit('activeSeries', obj)
+ }
if (this.isFusion || this.isMPR) {
if (this.isFusion && this.$refs[`ecrf_${this.taskInfo.VisitTaskId}`][0].verifyAnnotationIsSave()) {
const confirm = await this.$confirm(this.$t('trials:reading:confirm:clearnAnnotation'))
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
index 1778aa3f..f09b57f1 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
@@ -127,7 +127,7 @@
{{
$t('trials:reading:Segmentations:title:InactiveSegmentationsShow')
- }}
+ }}
@@ -171,11 +171,11 @@
-
+ style="display: flex;align-items: center;justify-content: space-between;">
+
{{ $t('trials:reading:Segmentations:button:addSegment') }}
+
i.segmentationId === segmentationId))" />
@@ -977,7 +977,7 @@ export default {
this.selectSegment(this.segmentList[groupIndex].segments[0])
}
this.$emit('resetQuestion')
- this.saveSegmentGroup([this.segmentList[groupIndex]], false)
+ this.saveSegmentGroup([this.segmentList[groupIndex]], true)
},
resetViewport(passive = true) {
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue
index c11a3d07..123f1656 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue
@@ -107,7 +107,7 @@
{{ series.Description }}
-
+
T: {{ parseFloat(series.SliceThickness).toFixed(digitPlaces) }}
@@ -199,10 +199,9 @@ export default {
},
methods: {
activeSeries(series, seriesIndex, studyIndex) {
+ this.$emit('activeSeries', series)
this.activeStudyIndex = studyIndex
this.activeSeriesIndex = seriesIndex
- this.$emit('activeSeries', series)
- DicomEvent.$emit('activeSeries', series)
},
activeStudy(id) {
if (this.activeNames.indexOf(id) > -1) return
@@ -267,6 +266,7 @@ export default {
// display: inline-block;
text-align: right;
}
+
.patient-info-popper {
font-size: 12px;
color: #ddd;
@@ -291,7 +291,7 @@ export default {
line-height: 18px;
}
-.patient-info-popper .patient-info-row + .patient-info-row {
+.patient-info-popper .patient-info-row+.patient-info-row {
margin-top: 4px;
}