From f9d81aa7263d915eeed7df6421cfeb34bd394b7f Mon Sep 17 00:00:00 2001 From: caiyiling <1321909229@qq.com> Date: Mon, 1 Jul 2024 16:19:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E9=98=85=E7=89=87?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=90=8E=EF=BC=8C=E5=90=8E=E7=BB=AD=E5=8F=AF?= =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E5=9C=A8=E9=98=85=E7=89=87=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=B4=E6=97=B6=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/modules/reading.js | 10 +- src/views/dicom-show/dicom-study.vue | 4 +- .../dicoms/customize/CustomizeDicomCanvas.vue | 91 +- .../dicoms/customize/CustomizeDicomViewer.vue | 1319 +++++++++-------- .../customize/CustomizeMeasurementList.vue | 55 +- .../dicoms/tools/CircleRoi/CircleRoiTool.js | 453 ++++++ .../dicoms/tools/CircleRoi/getCircleCoords.js | 21 + 7 files changed, 1235 insertions(+), 718 deletions(-) create mode 100644 src/views/trials/trials-panel/reading/dicoms/tools/CircleRoi/CircleRoiTool.js create mode 100644 src/views/trials/trials-panel/reading/dicoms/tools/CircleRoi/getCircleCoords.js diff --git a/src/store/modules/reading.js b/src/store/modules/reading.js index cfc74e05..1467ddc9 100644 --- a/src/store/modules/reading.js +++ b/src/store/modules/reading.js @@ -499,7 +499,7 @@ const actions = { // var uuid = obj.measureData.data.uuid // var idx = measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === uuid) - console.log(obj, measureData) + // console.log(obj, measureData) var idx = measureData.findIndex(item => item.Id === obj.questionInfo.Id) console.log('idx', idx) if (idx > -1) { @@ -510,7 +510,9 @@ const actions = { measureData.splice(idx, 1) console.log('移除标记成功', idx) } - await deleteCustomTag(obj.questionInfo.Id) + if (obj.questionInfo.Id) { + await deleteCustomTag(obj.questionInfo.Id) + } state.visitTaskList[index].MeasureData = measureData } else if (obj.orderMarkName) { const i = measureData.findIndex(item => item.QuestionId === obj.questionId && item.OrderMarkName === obj.orderMarkName) @@ -523,7 +525,9 @@ const actions = { console.log('移除标记成功', i) } } - await deleteCustomTag(obj.questionInfo.Id) + if (obj.questionInfo.Id) { + await deleteCustomTag(obj.questionInfo.Id) + } state.visitTaskList[index].MeasureData = measureData } // sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '') diff --git a/src/views/dicom-show/dicom-study.vue b/src/views/dicom-show/dicom-study.vue index 59bc1e8b..b51e5315 100644 --- a/src/views/dicom-show/dicom-study.vue +++ b/src/views/dicom-show/dicom-study.vue @@ -225,8 +225,8 @@ export default { }, beforeDestroy() { requestPoolManager.stopTaskTimer() - window.removeEventListener('beforeunload', e => { - cornerstone.imageCache.purgeCache() + window.removeEventListener('beforeunload', e => { + cornerstone.imageCache.purgeCache() requestPoolManager.resetRequestPool() }) }, diff --git a/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue b/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue index 94ca0017..4e754cae 100644 --- a/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue +++ b/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue @@ -13,7 +13,7 @@
- +
@@ -146,6 +146,7 @@ import LengthTool from '@/views/trials/trials-panel/reading/dicoms/tools/Length/ import BidirectionalTool from '@/views/trials/trials-panel/reading/dicoms/tools/Bidirectional/BidirectionalTool' import ArrowAnnotateTool from '@/views/trials/trials-panel/reading/dicoms/tools/ArrowAnnotate/ArrowAnnotateTool' import RectangleRoiTool from '@/views/trials/trials-panel/reading/dicoms/tools/RectangleRoi/RectangleRoiTool' +import CircleRoiTool from '@/views/trials/trials-panel/reading/dicoms/tools/CircleRoi/CircleRoiTool' // import OrientationMarkersTool from '@/views/trials/trials-panel/reading/dicoms/tools/OrientationMarkers/OrientationMarkersTool' import ScaleOverlayTool from '@/views/trials/trials-panel/reading/dicoms/tools/ScaleOverlay/ScaleOverlayTool' import getOrientationString from '@/views/trials/trials-panel/reading/dicoms/tools/OrientationMarkers/getOrientationString' @@ -257,7 +258,7 @@ export default { series: '', ToolStateManager: null, renderedMeasured: [], - measuredTools: ['Length', 'Bidirectional', 'ArrowAnnotate', 'RectangleRoi'], + measuredTools: ['Length', 'Bidirectional', 'ArrowAnnotate', 'RectangleRoi', 'CircleRoi'], measureData: [], selectedLesion: null, activeTool: 0, // 0:enable 1:passive 2:active @@ -297,8 +298,8 @@ export default { ], scrollSyncInfo: { offset: 0 }, - hideMeasureArr: [] - + hideMeasureArr: [], + enabledElement: null } }, computed: { @@ -398,7 +399,8 @@ export default { cornerstone.updateImage(this.canvas, true) }) DicomEvent.$on('updateImage', () => { - cornerstone.updateImage(this.canvas) + if (!this.canvas) return + this.updateImage() }) // this.canvas.addEventListener('keydown', event => { // event.preventDefault() @@ -541,7 +543,7 @@ export default { this.mousePosition.y = currentPoints.image.y + 1 this.mousePosition.mo = stats.mo this.mousePosition.suv = stats.suv - if (this.isFirstChangeTask && this.pointNearTool(e)) { + if (this.pointNearTool(e)) { e.stopImmediatePropagation() e.stopPropagation() e.preventDefault() @@ -550,18 +552,14 @@ export default { mouseUp(e) { console.log('mouseUp') - if (this.readingTaskState >= 2) return + // if (this.readingTaskState >= 2) return this.image = e.detail.image this.getToolStateInfo(e) }, mouseDown(e) { this.image = e.detail.image var pointNearTool = this.pointNearTool(e) - if (this.isFirstChangeTask && pointNearTool) { - e.stopImmediatePropagation() - e.stopPropagation() - e.preventDefault() - } else if (this.activeToolName === 'Length' || this.activeToolName === 'Bidirectional' && this.readingTaskState < 2) { + if (this.activeToolName === 'Length' || this.activeToolName === 'Bidirectional') { if (!e.detail.image.columnPixelSpacing || !e.detail.image.rowPixelSpacing) { // '该影像不具备测量长度所需的必要数据,不能进行长度测量。请选择其他工具进行标注。' this.$confirm(this.$t('trials:reading:warnning:msg56'), '', { @@ -574,6 +572,10 @@ export default { e.stopPropagation() e.preventDefault() } + } else if (pointNearTool) { + e.stopImmediatePropagation() + e.stopPropagation() + e.preventDefault() } }, pointNearTool(e) { @@ -600,8 +602,8 @@ export default { getDisabledMarks(measureDatas) { var arr = [] measureDatas.map(i => { - if ((i.LesionType === 0 || i.LesionType === 1 || i.LesionType === 7) && i.IsFirstChangeTask) { - arr.push(i.OrderMarkName) + if (i.Id && this.readingTaskState >= 2) { + arr.push(i.MeasureData.data.remark) } }) return arr @@ -882,7 +884,9 @@ export default { } else if (this.activeTool === 1 && this.readingTaskState < 2) { cornerstoneTools.setToolPassiveForElement(element, data.MeasureData.type, { mouseButtonMask: 1 }) } else { - cornerstoneTools.setToolEnabledForElement(element, data.MeasureData.type, { mouseButtonMask: 1 }) + // cornerstoneTools.setToolEnabledForElement(element, data.MeasureData.type, { mouseButtonMask: 1 }) + cornerstoneTools.setToolPassiveForElement(element, data.MeasureData.type, { mouseButtonMask: 1 }) + } // console.log('renderMeasuredData', this.stack.frame) @@ -986,15 +990,14 @@ export default { if (idx > -1) { console.log('mouseClick') DicomEvent.$emit('setCollapseActive', this.measureData[idx]) - if (this.readingTaskState < 2) { const measureData = {} var markName = this.measureData[idx].OrderMarkName - if (this.activeToolName === 'Eraser') { - var questionInfo = this.measureData[idx] + if (this.activeToolName === 'Eraser' && this.disabledMarks.indexOf(markName) === -1) { + const questionInfo = this.measureData[idx] this.$emit('moveMeasureData', { measureData, questionInfo }) } if ((this.disabledMarks.indexOf(markName) === -1 || !this.disabledMarks) && this.activeToolName !== 'Eraser') { - var questionInfo = this.measureData[idx] + const questionInfo = this.measureData[idx] const canvas = this.canvas.querySelector('canvas') measureData.pictureBaseStr = canvas.toDataURL('image/png', 1) measureData.studyId = this.stack.studyId @@ -1010,7 +1013,7 @@ export default { measureData.data.active = false this.$emit('modifyMeasureData', { measureData, questionInfo }) } - } + break } } @@ -1049,11 +1052,7 @@ export default { var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId) this.stack.visitTaskNum = this.visitTaskList[idx].VisitTaskNum this.isFirstChangeTask = this.visitTaskList[idx].IsFirstChangeTask - if (this.isFirstChangeTask) { - this.disabledMarks = this.getDisabledMarks(this.visitTaskList[idx].MeasureData) - } else { - this.disabledMarks = [] - } + this.disabledMarks = this.getDisabledMarks(this.visitTaskList[idx].MeasureData) this.maxVistNum = this.visitTaskList[this.visitTaskList.length - 1].VisitTaskNum this.minVistNum = this.visitTaskList[0].VisitTaskNum @@ -1114,7 +1113,6 @@ export default { if (!this.toolState.initialized) { this.toolState.initialized = true const toolButtons = document.querySelectorAll('[data-tool]') - // const scope = this Array.from(toolButtons).forEach((toolBtn) => { // Add the tool @@ -1134,6 +1132,8 @@ export default { cornerstoneTools.addToolForElement(element, ArrowAnnotateTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }}) } else if (toolName === 'RectangleRoi') { cornerstoneTools.addToolForElement(element, RectangleRoiTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }}) + } else if (toolName === 'CircleRoi') { + cornerstoneTools.addToolForElement(element, CircleRoiTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true, showMinMax: true }}) } else { cornerstoneTools.addToolForElement(element, apiTool) } @@ -1221,8 +1221,8 @@ export default { if (this.dicomInfo.thick) { this.dicomInfo.thick = this.dicomInfo.thick.toFixed(2) } - let newImageIdIndex = this.stack.imageIds.findIndex(i=>i===imageId) - if(newImageIdIndex === -1) return + const newImageIdIndex = this.stack.imageIds.findIndex(i => i === imageId) + if (newImageIdIndex === -1) return this.stack.currentImageIdIndex = newImageIdIndex this.stack.imageIdIndex = newImageIdIndex this.series.imageIdIndex = newImageIdIndex @@ -1298,7 +1298,7 @@ export default { this.setMarkers() }, onMeasurementcompleted(e) { - if (this.readingTaskState >= 2) return + // if (this.readingTaskState >= 2) return var element = cornerstone.getEnabledElement(this.canvas) var viewport = element.viewport @@ -1311,7 +1311,7 @@ export default { var instanceId = imageInfo.instanceId var frame = imageInfo.frame this.stack.frame = !isNaN(parseInt(frame)) ? parseInt(frame) : 0 - if (e.detail.toolName === 'Length' || e.detail.toolName === 'ArrowAnnotate' || e.detail.toolName === 'RectangleRoi') { + if (e.detail.toolName === 'Length' || e.detail.toolName === 'ArrowAnnotate' || e.detail.toolName === 'RectangleRoi' || e.detail.toolName === 'CircleRoi') { const measureData = {} measureData.studyId = this.stack.studyId measureData.seriesId = this.stack.seriesId @@ -1326,6 +1326,7 @@ export default { const canvas = this.canvas.querySelector('canvas') measureData.pictureBaseStr = canvas.toDataURL('image/png', 1) + measureData.temporary = this.readingTaskState >= 2 this.$emit('setMeasureData', measureData) cornerstoneTools.setToolPassiveForElement(this.canvas, e.detail.toolName) } else if (e.detail.toolName === 'Bidirectional') { @@ -1342,6 +1343,7 @@ export default { measureData.wc = Math.round(viewport.voi.windowCenter) const canvas = this.canvas.querySelector('canvas') measureData.pictureBaseStr = canvas.toDataURL('image/png', 1) + measureData.temporary = this.readingTaskState >= 2 this.$emit('setMeasureData', measureData) cornerstoneTools.setToolPassiveForElement(this.canvas, e.detail.toolName) } else if (!e.detail.toolName) { @@ -1422,7 +1424,7 @@ export default { onMeasurementmodified(e) { // 移动 console.log('modified') - if (this.readingTaskState >= 2) return + // if (this.readingTaskState >= 2) return const { measurementData, toolType } = e.detail var element = cornerstone.getEnabledElement(this.canvas) var viewport = element.viewport @@ -1466,15 +1468,21 @@ export default { } }, updateImage(instanceId) { + if (!this.canvas) return var i = this.visitTaskList.findIndex(i => i.VisitTaskId === this.stack.visitTaskId) this.measureData = this.visitTaskList[i].MeasureData - const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager - var element = cornerstone.getEnabledElement(this.canvas) + if (!element) return var { imageId } = element.image - ToolStateManager.clearImageIdToolState(imageId) - cornerstone.updateImage(element, true) + if (imageId) { + ToolStateManager.clearImageIdToolState(imageId) + let elements = cornerstone.getEnabledElementsByImageId(imageId) + elements.map(el=>{ + cornerstone.updateImage(el.element) + }) + } + // cornerstone.updateImage(element) }, toggleSeries(evt, type) { evt.stopImmediatePropagation() @@ -1756,20 +1764,19 @@ export default { this.activeToolName = toolName this.$nextTick(() => { // console.log(cornerstoneTools.isToolActiveForElement(this.canvas, 'Bidirectional')) - if (!cornerstoneTools.isToolActiveForElement(this.canvas, toolName)) { - cornerstoneTools.setToolActiveForElement(this.canvas, toolName, { - mouseButtonMask: 1 - }) - } + if (toolName === 'Zoom') { cornerstoneTools.setToolActiveForElement(this.canvas, 'Zoom', { mouseButtonMask: [1, 2] }) - } - if (toolName === 'Pan') { + } else if (toolName === 'Pan') { cornerstoneTools.setToolActiveForElement(this.canvas, 'Pan', { mouseButtonMask: [1, 4] }) + } else { + cornerstoneTools.setToolActiveForElement(this.canvas, toolName, { + mouseButtonMask: 1 + }) } }) }, diff --git a/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomViewer.vue b/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomViewer.vue index 9856780e..ff58527e 100644 --- a/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomViewer.vue +++ b/src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomViewer.vue @@ -106,8 +106,7 @@ v-if="item.val === 1" class="divider" content-position="center" - >{{ ` ${$t("trials:reading:title:preset")}` }} + >{{ ` ${$t("trials:reading:title:preset")}` }} @@ -224,8 +223,7 @@ {{ rotate.label }} + >{{ rotate.label }} @@ -318,7 +316,7 @@

{{ tool.text }}

-
{{ tool.disabledReason }} +
{{ tool.disabledReason }}
{{ tool.text }}
@@ -445,10 +443,10 @@ placement="bottom" >