From 266886fa64145309400a17ad1e9fd199d8eb79e6 Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Mon, 23 Mar 2026 10:01:22 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E7=89=87=E6=B7=BB=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E5=89=B2=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 3 +- src/api/reading.js | 81 + src/icons/svg/contour.svg | 12 + src/icons/svg/fill.svg | 1 + src/icons/svg/fill_outline.svg | 1 + src/icons/svg/outline.svg | 1 + .../dicoms3D/components/MPRViewport.vue | 823 ++++++++ .../reading/dicoms3D/components/ReadPage.vue | 331 +++- .../dicoms3D/components/SegmentForm.vue | 193 ++ .../dicoms3D/components/Segmentations.vue | 1649 +++++++++++++++++ .../reading/dicoms3D/components/StudyList.vue | 145 +- .../dicoms3D/components/VolumeViewport.vue | 69 +- .../components/customize/QuestionFormItem.vue | 115 +- .../components/customize/QuestionList.vue | 192 +- .../customize/QuestionTableFormItem.vue | 54 +- .../reading/dicoms3D/components/toolConfig.js | 35 +- .../reading/reading-task/index.vue | 2 +- .../reading-unit/components/QuestionsForm.vue | 45 +- .../reading-unit/components/QuestionsList.vue | 250 +-- .../components/ReadingCriterions.vue | 78 +- .../reading-unit/components/ReadingRules.vue | 40 +- .../reading-unit/components/TableQsForm.vue | 45 +- .../reading-unit/components/TableQsList.vue | 163 +- .../setting/reading-unit/index.vue | 18 +- .../trial-summary/report-forms/index.vue | 1 - 25 files changed, 3783 insertions(+), 564 deletions(-) create mode 100644 src/icons/svg/contour.svg create mode 100644 src/icons/svg/fill.svg create mode 100644 src/icons/svg/fill_outline.svg create mode 100644 src/icons/svg/outline.svg create mode 100644 src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue create mode 100644 src/views/trials/trials-panel/reading/dicoms3D/components/SegmentForm.vue create mode 100644 src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue diff --git a/src/App.vue b/src/App.vue index 91f9b2de..0bb34278 100644 --- a/src/App.vue +++ b/src/App.vue @@ -115,8 +115,7 @@ export default { } }, mounted() { - // this.show = process.env.VUE_APP_OSS_PATH === '/test/dist' - this.show = false + this.show = process.env.VUE_APP_OSS_PATH === '/test/dist' Vue.prototype.$openI18n = this.openI18n }, // watch: { diff --git a/src/api/reading.js b/src/api/reading.js index 89faf9ae..1c10ecd7 100644 --- a/src/api/reading.js +++ b/src/api/reading.js @@ -319,3 +319,84 @@ export function getReportsChartData(param) { data: param }) } + +// 分割相关 +// 获取分割组 +export function getSegmentationList(param) { + return request({ + url: `/Segmentation/getSegmentationList`, + method: 'post', + data: param + }) +} +// 新增修改分割组 +export function addOrUpdateSegmentation(param) { + return request({ + url: `/Segmentation/addOrUpdateSegmentation`, + method: 'post', + data: param + }) +} +// 删除分割组 +export function deleteSegmentation(segmentationId) { + return request({ + url: `/Segmentation/deleteSegmentation/${segmentationId}`, + method: 'delete' + }) +} +// 获取分割 +export function getSegmentList(param) { + return request({ + url: `/Segmentation/getSegmentList`, + method: 'post', + data: param + }) +} +// 新增修改分割 +export function addOrUpdateSegment(param) { + return request({ + url: `/Segmentation/addOrUpdateSegment`, + method: 'post', + data: param + }) +} +// 删除分割 +export function deleteSegment(segmentId) { + return request({ + url: `/Segmentation/deleteSegment/${segmentId}`, + method: 'delete' + }) +} +// 获取分割绑定关系 +export function getSegmentBindingList(param) { + return request({ + url: `/Segmentation/getSegmentBindingList`, + method: 'post', + data: param + }) +} +// 保存分割绑定关系(可用作修改删除) +export function saveSegmentBindingAndAnswer(param) { + return request({ + url: `/Segmentation/saveSegmentBindingAndAnswer`, + method: 'post', + data: param + }) +} + +// 获取表格问题配置 +export function getReadingTableQuestionTrialById(params) { + return request({ + url: `/ReadingQuestion/getReadingTableQuestionTrialById`, + method: 'post', + params + }) +} +// 获取外层问题配置 +export function getReadingQuestionTrialById(params) { + return request({ + url: `/ReadingQuestion/getReadingQuestionTrialById`, + method: 'post', + params + }) +} \ No newline at end of file diff --git a/src/icons/svg/contour.svg b/src/icons/svg/contour.svg new file mode 100644 index 00000000..69b89b7e --- /dev/null +++ b/src/icons/svg/contour.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/src/icons/svg/fill.svg b/src/icons/svg/fill.svg new file mode 100644 index 00000000..e15e3aa6 --- /dev/null +++ b/src/icons/svg/fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/fill_outline.svg b/src/icons/svg/fill_outline.svg new file mode 100644 index 00000000..73d67449 --- /dev/null +++ b/src/icons/svg/fill_outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/outline.svg b/src/icons/svg/outline.svg new file mode 100644 index 00000000..a95b57ee --- /dev/null +++ b/src/icons/svg/outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue new file mode 100644 index 00000000..ed500192 --- /dev/null +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue @@ -0,0 +1,823 @@ + + + \ No newline at end of file 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 cb66523b..e0754ca2 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue @@ -162,7 +162,7 @@
+ v-if="(criterionType === 0 && readingTool === 0) || this.readingTool === 3">
@@ -299,24 +299,29 @@
+
+ + @renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" v-else />
-
-
+
- @@ -340,32 +345,59 @@
-
- - - -
+ + +
+ +
+
+ + + +
+
@@ -444,6 +476,11 @@ @close="closeFusion" @fusion="handleFusion" /> + + + @@ -479,7 +516,9 @@ import { getTools, getCustomizeStandardsTools, config } from './toolConfig' import StudyList from './StudyList' import Viewport from './Viewport' import PetCtViewport from './PetCtViewport' +import MPRViewport from './MPRViewport' import VolumeViewport from './VolumeViewport' +import Segmentations from './Segmentations' import mRecisit from './mRecist/QuestionList' import recisit from './Recist/QuestionList' import customizeQuestionList from './customize/QuestionList' @@ -491,6 +530,7 @@ import WL from '@/views/trials/trials-panel/reading/dicoms/components/WL' import Others from '@/views/trials/trials-panel/reading/dicoms/components/Others' import ClinicalData from '@/views/trials/trials-panel/reading/clinical-data' import FusionForm from './FusionForm.vue' +import SegmentForm from './SegmentForm.vue' import colorMap from './colorMap.vue' import RectangleROITool from './tools/RectangleROITool' import ScaleOverlayTool from './tools/ScaleOverlayTool' @@ -527,7 +567,10 @@ const { VolumeRotateTool, CrosshairsTool, EllipticalROITool, - synchronizers + synchronizers, + PlanarFreehandContourSegmentationTool, + BrushTool, + utilities: CStUtils, // cursors } = cornerstoneTools const { createCameraPositionSynchronizer, createVOISynchronizer, createSlabThicknessSynchronizer } = synchronizers @@ -562,7 +605,9 @@ export default { StudyList, Viewport, PetCtViewport, + MPRViewport, VolumeViewport, + Segmentations, mRecisit, recisit, customizeQuestionList, @@ -573,6 +618,7 @@ export default { Others, ClinicalData, FusionForm, + SegmentForm, colorMap, downloadDicomAndNonedicom, uploadDicomAndNonedicom, @@ -687,6 +733,24 @@ export default { SAGITTAL: { imageNum: 0 }, + }, + + segmentVisible: false, + segmentVisitInfo: {}, + formWrapperActiveName: 'ecrf', + actionConfiguration: { + contourBidirectional: { + method: CStUtils.segmentation.segmentContourAction, + bindings: [ + { + key: 'c', + }, + ], + data: { + segmentData: new Map(), + segmentationId: null + }, + }, } } }, @@ -694,8 +758,17 @@ export default { gridStyle() { return { display: 'grid', - gridTemplateRows: `repeat(${this.isMPR ? 2 : this.rows}, 1fr)`, - gridTemplateColumns: `repeat(${this.isMPR ? 2 : this.cols}, 1fr)`, + gridTemplateRows: `repeat(${this.rows}, 1fr)`, + gridTemplateColumns: `repeat(${this.cols}, 1fr)`, + height: '100%', + width: '100%' + } + }, + gridStyleMPR() { + return { + display: 'grid', + gridTemplateRows: `repeat(2, 1fr)`, + gridTemplateColumns: `repeat(2, 1fr)`, height: '100%', width: '100%' } @@ -712,11 +785,11 @@ export default { return Array(this.rows * this.cols).fill(0) }, viewportKey() { - return this.isMPR ? 'viewport-volume' : this.isFusion ? 'viewport-fusion' : 'viewport' + return this.isMPR ? 'viewport-MPR' : this.isFusion ? 'viewport-fusion' : 'viewport' }, openManuals() { return !this.taskInfo.IsReadKeyFile && this.taskInfo.IsHaveKeyFile - } + }, }, watch: { openManuals: { @@ -787,7 +860,7 @@ export default { } else { this.tools = getTools(this.criterionType) } - + console.log(toolsEvents, 'toolsEvents') this.trialId = this.$route.query.trialId this.readingTaskState = this.taskInfo.ReadingTaskState if (!this.taskInfo.IsBaseLine && this.taskInfo.IsReadingTaskViewInOrder !== 0) { @@ -816,6 +889,20 @@ export default { this.getSystemInfoReading(); }, methods: { + resetQuestion(){ + this.$refs[`ecrf_${this.lastViewportTaskId}`][0].getQuestions(false) + }, + handleSegmentSave(obj) { + this.$refs[`ecrf_${this.lastViewportTaskId}`][0].handleSegmentSave(obj) + }, + openSegmentForm(obj) { + let { visitInfo } = obj + this.segmentVisitInfo = visitInfo + this.segmentVisible = true + }, + handleClick(tab, event) { + this.formWrapperActiveName = tab.name + }, setMPRInfo(obj) { let { type, key, value } = obj this.$set(this.MPRInfo[type], key, value) @@ -1071,7 +1158,7 @@ export default { } let viewportIds = ['viewport-0', 'viewport-1', 'viewport-2', 'viewport-3'] const fusionViewportIds = ['viewport-fusion-0', 'viewport-fusion-1', 'viewport-fusion-2', 'viewport-fusion-3'] - const volumeViewportIds = ['viewport-volume-0', 'viewport-volume-1', 'viewport-volume-2'] + const volumeViewportIds = ['viewport-MPR-0', 'viewport-MPR-1', 'viewport-MPR-2'] const element1 = this.$refs['viewport-0'][0].$el const element2 = this.$refs['viewport-1'][0].$el const element3 = this.$refs['viewport-2'][0].$el @@ -1098,13 +1185,49 @@ export default { element: element4 } ] - if (this.criterionType === 0 && this.readingTool === 0) { - const volumeElement1 = this.$refs['viewport-volume-0'][0].$el - const volumeElement2 = this.$refs['viewport-volume-1'][0].$el - const volumeElement3 = this.$refs['viewport-volume-2'][0].$el + if (this.readingTool === 3) { + viewportInputArray = [ + { + viewportId: 'viewport-0', + type: ViewportType.ORTHOGRAPHIC, + element: element1, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL + } + }, + { + viewportId: 'viewport-1', + type: ViewportType.ORTHOGRAPHIC, + element: element2, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL + } + }, + { + viewportId: 'viewport-2', + type: ViewportType.ORTHOGRAPHIC, + element: element3, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL + } + }, + { + viewportId: 'viewport-3', + type: ViewportType.ORTHOGRAPHIC, + element: element4, + defaultOptions: { + orientation: Enums.OrientationAxis.AXIAL + } + } + ] + } + if ((this.criterionType === 0 && this.readingTool === 0) || this.readingTool === 3) { + const volumeElement1 = this.$refs['viewport-MPR-0'][0].$el + const volumeElement2 = this.$refs['viewport-MPR-1'][0].$el + const volumeElement3 = this.$refs['viewport-MPR-2'][0].$el const arr = [ { - viewportId: 'viewport-volume-0', + viewportId: 'viewport-MPR-0', type: ViewportType.ORTHOGRAPHIC, element: volumeElement1, defaultOptions: { @@ -1112,7 +1235,7 @@ export default { } }, { - viewportId: 'viewport-volume-1', + viewportId: 'viewport-MPR-1', type: ViewportType.ORTHOGRAPHIC, element: volumeElement2, defaultOptions: { @@ -1120,7 +1243,7 @@ export default { } }, { - viewportId: 'viewport-volume-2', + viewportId: 'viewport-MPR-2', type: ViewportType.ORTHOGRAPHIC, element: volumeElement3, defaultOptions: { @@ -1198,14 +1321,14 @@ export default { cornerstoneTools.addTool(MIPJumpToClickTool) cornerstoneTools.addTool(VolumeRotateTool) cornerstoneTools.addTool(CrosshairsTool) - + cornerstoneTools.addTool(PlanarFreehandContourSegmentationTool) + cornerstoneTools.addTool(BrushTool) viewportIds.forEach((viewportId, i) => { // const toolGroupId = `viewport-${i}` let toolGroupId = viewportId if (volumeViewportIds.includes(viewportId)) { toolGroupId = this.volumeToolGroupId } - const toolGroup = ToolGroupManager.getToolGroup(toolGroupId) ? ToolGroupManager.getToolGroup(toolGroupId) : ToolGroupManager.createToolGroup(toolGroupId) toolGroup.addViewport(viewportId, renderingEngineId) toolGroup.addTool(StackScrollTool.toolName, { @@ -1215,6 +1338,44 @@ export default { toolGroup.addTool(PanTool.toolName) toolGroup.addTool(ZoomTool.toolName) + toolGroup.addTool(BrushTool.toolName) + if (this.readingTool === 3 || toolGroupId === this.volumeToolGroupId) { + toolGroup.addToolInstance( + 'CircularBrush', + BrushTool.toolName, + { + activeStrategy: 'FILL_INSIDE_CIRCLE', + preview: { + previewColors: {} + } + } + ); + toolGroup.addToolInstance( + 'CircularEraser', + BrushTool.toolName, + { + activeStrategy: 'ERASE_INSIDE_CIRCLE', + preview: { + previewColors: {} + } + + } + ) + toolGroup.addTool(PlanarFreehandContourSegmentationTool.toolName, { + cachedStats: true, + }); + // toolGroup.setToolActive(PlanarFreehandContourSegmentationTool.toolName, { + // bindings: [ + // { + // mouseButton: MouseBindings.Primary, // Left Click + // }, + // { + // mouseButton: MouseBindings.Primary, // Shift + Left Click + // modifierKey: cornerstoneTools.Enums.KeyboardBindings.Shift, + // }, + // ], + // }); + } if (volumeViewportIds.includes(viewportId)) { toolGroup.addTool(WindowLevelTool.toolName, { targetViewportIds: volumeViewportIds @@ -1251,7 +1412,8 @@ export default { // cachedStats: false }) toolGroup.addTool(BidirectionalTool.toolName, { - // cachedStats: true + // cachedStats: true, + actions: this.actionConfiguration, getTextLines: this.getBidirectionalToolTextLines }) toolGroup.addTool(CircleROITool.toolName, { @@ -1308,9 +1470,6 @@ export default { toolGroup.setToolActive(PanTool.toolName, { bindings: [{ mouseButton: MouseBindings.Auxiliary }] }) - // toolGroup.setToolEnabled(ScaleOverlayTool.toolName); - // toolGroup.setToolPassive(PanTool.toolName) - // toolGroup.setToolPassive(ZoomTool.toolName) toolGroup.setToolPassive(WindowLevelTool.toolName) toolGroup.setToolPassive(WindowLevelRegionTool.toolName) toolGroup.setToolPassive(PlanarRotateTool.toolName) @@ -1326,6 +1485,7 @@ export default { toolGroup.setToolPassive(FixedRadiusCircleROITool.toolName) toolGroup.setToolPassive(AngleTool.toolName) toolGroup.setToolPassive(CobbAngleTool.toolName) + if (this.readingTool === 3) toolGroup.setToolPassive(PlanarFreehandContourSegmentationTool.toolName) } else { toolGroup.setToolEnabled(ArrowAnnotateTool.toolName) toolGroup.setToolEnabled(RectangleROITool.toolName) @@ -1337,6 +1497,7 @@ export default { toolGroup.setToolEnabled(FixedRadiusCircleROITool.toolName) toolGroup.setToolEnabled(AngleTool.toolName) toolGroup.setToolEnabled(CobbAngleTool.toolName) + if (this.readingTool === 3) toolGroup.setToolEnabled(PlanarFreehandContourSegmentationTool.toolName) } toolGroup.setToolPassive(EraserTool.toolName) }) @@ -1346,7 +1507,7 @@ export default { if (this.readingTool === 2) { this.setUpSynchronizers() } - if (this.criterionType === 0 && this.readingTool === 0) { + if ((this.criterionType === 0 && this.readingTool === 0) || this.readingTool === 3) { this.setUpSynchronizersMPR() } }, @@ -1500,7 +1661,6 @@ export default { this.$refs[`ecrf_${this.lastViewportTaskId}`][0].setAnnotation({ annotation, toolName: annotation.metadata.toolName }) this.markedSeriesIds.push(series.Id) } - this.setToolsPassive() }, annotationModifiedListener(e) { @@ -1516,6 +1676,7 @@ export default { this.$refs[`ecrf_${this.lastViewportTaskId}`][0].modifyAnnotation({ annotation, toolName: annotation.metadata.toolName }) } this.setToolsPassive() + }, annotationRemovedListener(e) { const { annotation } = e.detail @@ -1552,9 +1713,10 @@ export default { if (!annotation) return const i = this.tools.findIndex(i => i.toolName === annotation.metadata.toolName) if (i === -1) { - this.setToolsPassive() + if (annotation.metadata.toolName !== PlanarFreehandContourSegmentationTool.toolName) this.setToolsPassive() return } + if (annotation.data.segmentation || annotation.data.segment) return if (annotation.metadata.toolName === 'PlanarFreehandROI' && !annotation.data.contour.closed) return const series = this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series if (series && series.TaskInfo.VisitTaskId && series.TaskInfo.VisitTaskId === this.taskInfo.VisitTaskId) { @@ -1593,7 +1755,6 @@ export default { // } } } - this.setToolsPassive() }, validMarkName(markName) { @@ -1639,9 +1800,10 @@ export default { if (!annotation) return const i = this.tools.findIndex(i => i.toolName === annotation.metadata.toolName) if (i === -1) { - this.setToolsPassive() + if (annotation.metadata.toolName !== PlanarFreehandContourSegmentationTool.toolName) this.setToolsPassive() return } + if (annotation.data.segmentation || annotation.data.segment) return if (!annotation.data.label) return if (annotation.metadata.toolName === 'PlanarFreehandROI' && !annotation.data.contour.closed) return const series = this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series @@ -1672,6 +1834,7 @@ export default { // 临时标记 return } + if (annotation.data.segmentation || annotation.data.segment) return if (annotation.visitTaskId === this.taskInfo.VisitTaskId) { const isBound = this.$refs[`ecrf_${annotation.visitTaskId}`][0].verifyAnnotationIsBound(annotation) if (isBound && this.activeTool === 'Eraser') { @@ -1724,6 +1887,9 @@ export default { }, contentMouseup(e) { console.log('contentMouseup') + if (this.$refs.Segmentations) { + this.$refs.Segmentations.contentMouseup() + } if (this.curOperation.type === 'Modified') { let annotation = this.curOperation.annotation this.saveCustomAnnotation(annotation) @@ -2270,6 +2436,7 @@ export default { if (!obj.isCanActiveTool) { if (this.activeTool === toolName) { this.setToolsPassive() + } this.tools[i].isDisabled = true e.target.style.cursor = 'not-allowed' @@ -2282,6 +2449,7 @@ export default { // 旋转视口 setViewportRotate(value) { this.setToolsPassive() + const renderingEngine = getRenderingEngine(renderingEngineId) const viewportId = `${this.viewportKey}-${this.activeViewportIndex}` const viewport = renderingEngine.getViewport(viewportId) @@ -2620,6 +2788,7 @@ export default { this.cols = 1 this.activeViewportIndex = 0 this.setToolsPassive() + } if (taskIndex === this.activeTaskIndex) return if (!this.selectArr.includes(taskInfo.VisitTaskId)) { @@ -2865,13 +3034,23 @@ export default { const i = this.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId) if (i === -1) return const studyList = this.visitTaskList[i].StudyList - let series = this.getMarkedSeries(studyList, obj.annotation, true) + let series = null + if (obj.segment) { + let study = studyList.find(item => item.StudyId === obj.segmentGroup.StudyId) + series = study.SeriesList.find(item => item.Id === obj.segmentGroup.SeriesId) + let sliceIndex = obj.segment.bidirectional.sliceIndex || 0 + series.SliceIndex = series.InstanceCount - 1 - sliceIndex + series.segment = obj.segment + } else { + series = this.getMarkedSeries(studyList, obj.annotation, true) + } + if (series) { if (this.isFusion && series.SeriesInstanceUid !== this.fusionSerieId.ct && series.SeriesInstanceUid !== this.fusionSerieId.pt) { return await this.$confirm(this.$t('trials:reading:confirm:fusionPTOrCTInconsistent')) } this.activeViewportIndex = this.cells.length - 1 - if (obj.annotation.from === 'MPR') { + if (obj.annotation && obj.annotation.from === 'MPR') { let viewPlaneNormal = obj.annotation?.metadata?.viewPlaneNormal.map(i => i == 0 ? 0 : i).join(',') if (viewPlaneNormal === '0,0,-1') { this.activeViewportIndex = 0 @@ -2906,7 +3085,7 @@ export default { } } } - this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(series, true) + this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(series, obj.segment ? false : true) this.$refs[series.TaskInfo.VisitTaskId][0].setSeriesActive(series.StudyIndex, series.SeriesIndex) } }, @@ -3087,7 +3266,6 @@ export default { if (obj.isActiveTarget && obj.SplitOrMergeType !== '1' && obj.SplitOrMergeType !== '3') { this.setToolToTarget(obj) } - resolve() }) }, @@ -3097,6 +3275,7 @@ export default { const toolName = obj.markTool if (this.activeTool) { this.setToolsPassive() + } const toolGroupId = this.isMPR ? this.volumeToolGroupId : `${this.viewportKey}-${this.activeViewportIndex}` const toolGroup = ToolGroupManager.getToolGroup(toolGroupId) @@ -3317,9 +3496,9 @@ export default { syncColormap: false }) let viewportIds = [ - `viewport-volume-0`, - `viewport-volume-1`, - `viewport-volume-2` + `viewport-MPR-0`, + `viewport-MPR-1`, + `viewport-MPR-2` ] viewportIds.forEach((viewportId) => { MPRVoiSynchronizer.add({ @@ -3331,9 +3510,9 @@ export default { // Add viewports to VOI synchronizers [ - `viewport-volume-0`, - `viewport-volume-1`, - `viewport-volume-2` + `viewport-MPR-0`, + `viewport-MPR-1`, + `viewport-MPR-2` ].forEach((viewportId) => { synchronizer.add({ renderingEngineId: this.renderingEngineId, @@ -3360,7 +3539,7 @@ export default { return new Promise(async (resolve, reject) => { if (this.isMPR) { if (!data) return resolve(false) - let viewportSeries = this.$refs[`viewport-volume-0`][0].series + let viewportSeries = this.$refs[`viewport-MPR-0`][0].series if (data && viewportSeries.SeriesInstanceUid === data.SeriesInstanceUid) return resolve(true) } if (!data) { @@ -3378,8 +3557,8 @@ export default { if (!res) return false } this.isMPR = true - this.rows = 3 - this.cols = 1 + // this.rows = 3 + // this.cols = 1 this.loading = true this.loadingText = this.$t('trials:lugano:message:loadVolumes') if (!data) this.activeViewportIndex = 0 @@ -3388,9 +3567,9 @@ export default { await this.getVolume(series) this.loading = false this.loadingText = null - this.$refs[`viewport-volume-0`][0].setSeriesInfo(Object.assign({ orientation: 'AXIAL', isLocation: data && this.activeViewportIndex === 0 }, series)) - this.$refs[`viewport-volume-1`][0].setSeriesInfo(Object.assign({ orientation: 'SAGITTAL', isLocation: data && this.activeViewportIndex === 1 }, series)) - this.$refs[`viewport-volume-2`][0].setSeriesInfo(Object.assign({ orientation: 'CORONAL', isLocation: data && this.activeViewportIndex === 2 }, series)) + this.$refs[`viewport-MPR-0`][0].setSeriesInfo(Object.assign({ orientation: 'AXIAL', isLocation: data && this.activeViewportIndex === 0 }, series)) + this.$refs[`viewport-MPR-1`][0].setSeriesInfo(Object.assign({ orientation: 'SAGITTAL', isLocation: data && this.activeViewportIndex === 1 }, series)) + this.$refs[`viewport-MPR-2`][0].setSeriesInfo(Object.assign({ orientation: 'CORONAL', isLocation: data && this.activeViewportIndex === 2 }, series)) resolve(false) }) diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/SegmentForm.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/SegmentForm.vue new file mode 100644 index 00000000..99343aba --- /dev/null +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/SegmentForm.vue @@ -0,0 +1,193 @@ + + + diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue new file mode 100644 index 00000000..72c8da66 --- /dev/null +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue @@ -0,0 +1,1649 @@ + + + \ No newline at end of file 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 1f14339d..3846018d 100644 --- a/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue +++ b/src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue @@ -1,16 +1,10 @@