diff --git a/src/api/reading.js b/src/api/reading.js
index 53cdedae..e686f326 100644
--- a/src/api/reading.js
+++ b/src/api/reading.js
@@ -408,6 +408,14 @@ export function changeSegmentationSavedStatus(data) {
data
})
}
+// 修改分割片段锁定状态
+export function lockOrUnLockSegment(data) {
+ return request({
+ url: `/Segmentation/lockOrUnLockSegment`,
+ method: 'post',
+ data
+ })
+}
// 图像数据匿名
export function studyMaskImage(data) {
return request({
diff --git a/src/api/trials.js b/src/api/trials.js
index 2e79d92f..3c367114 100644
--- a/src/api/trials.js
+++ b/src/api/trials.js
@@ -4448,4 +4448,13 @@ export function editPatientInfo(data) {
method: 'post',
data
})
+}
+
+//修正患者基本信息
+export function amendmentPatientInfo(data) {
+ return request({
+ url: `/Inspection/Study/amendmentPatientInfo`,
+ method: 'post',
+ data
+ })
}
\ No newline at end of file
diff --git a/src/icons/svg/fitToImage.svg b/src/icons/svg/fitToImage.svg
index 3bf71f3e..a5703249 100644
--- a/src/icons/svg/fitToImage.svg
+++ b/src/icons/svg/fitToImage.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/icons/svg/rotateHorizontal.svg b/src/icons/svg/rotateHorizontal.svg
new file mode 100644
index 00000000..59afcb0b
--- /dev/null
+++ b/src/icons/svg/rotateHorizontal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/rotateTurnLeft.svg b/src/icons/svg/rotateTurnLeft.svg
new file mode 100644
index 00000000..f14d65da
--- /dev/null
+++ b/src/icons/svg/rotateTurnLeft.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/rotateTurnRight.svg b/src/icons/svg/rotateTurnRight.svg
new file mode 100644
index 00000000..410b26ef
--- /dev/null
+++ b/src/icons/svg/rotateTurnRight.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/rotateVertical.svg b/src/icons/svg/rotateVertical.svg
new file mode 100644
index 00000000..a02e3b6a
--- /dev/null
+++ b/src/icons/svg/rotateVertical.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/PetCt.vue b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/PetCt.vue
index a0fdf9e8..22010f45 100644
--- a/src/views/trials/trials-panel/reading/dicoms/components/Fusion/PetCt.vue
+++ b/src/views/trials/trials-panel/reading/dicoms/components/Fusion/PetCt.vue
@@ -259,6 +259,7 @@ import CustomWwwcForm from './../CustomWwwcForm'
import FusionForm from './FusionForm.vue'
import { getTableAnswerRowInfoList, getDicomSeriesInfo } from '@/api/trials'
import FusionEvent from './FusionEvent'
+import FusionJumpToPointTool from '../../../dicoms3D/components/tools/FusionJumpToPointTool'
// import { ColorMaps } from '@kitware/vtk.js/Common/Core/ColorMaps'
import vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps'
import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction'
@@ -282,7 +283,6 @@ const {
// StackScrollMouseWheelTool,
StackScrollTool,
synchronizers,
- MIPJumpToClickTool,
// VolumeRotateMouseWheelTool,
VolumeRotateTool,
OrientationMarkerTool,
@@ -425,7 +425,12 @@ export default {
fusion: { visible: false }, // 历史记录融合调窗
screenshotWindow: null,
hasVoiChanged: false,
- lastUpper: null
+ lastUpper: null,
+ fusionCrosshairStyle: {
+ lineWidth: 2,
+ lineLength: 20,
+ centerHoleSize: 20,
+ }
// initFirstAnnotation:false
}
},
@@ -623,6 +628,7 @@ export default {
this.setUpToolGroups()
this.setUpSynchronizers()
+ this.dispatchFusionCenterPoint()
// this.$refs['CT_AXIAL'].scroll(0)
// this.$refs['PT_AXIAL'].scroll(0)
// this.$refs['FUSION_AXIAL'].scroll(0)
@@ -974,7 +980,7 @@ export default {
cornerstoneTools.addTool(WindowLevelTool)
cornerstoneTools.addTool(ZoomTool)
cornerstoneTools.addTool(StackScrollTool)
- cornerstoneTools.addTool(MIPJumpToClickTool)
+ cornerstoneTools.addTool(FusionJumpToPointTool)
cornerstoneTools.addTool(VolumeRotateTool)
cornerstoneTools.addTool(EllipticalROITool)
cornerstoneTools.addTool(CircleROITool)
@@ -1006,6 +1012,7 @@ export default {
toolGroup.addTool(ProbeTool.toolName)
toolGroup.addTool(ScaleOverlayTool.toolName)
toolGroup.addTool(OrientationMarkerTool.toolName)
+ toolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration())
})
fusionToolGroup.addTool(PanTool.toolName)
@@ -1021,6 +1028,7 @@ export default {
fusionToolGroup.addTool(ProbeTool.toolName)
fusionToolGroup.addTool(ScaleOverlayTool.toolName)
fusionToolGroup.addTool(OrientationMarkerTool.toolName)
+ fusionToolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration())
// Here is the difference in the toolGroups used, that we need to specify the
// volume to use for the WindowLevelTool for the fusion viewports
@@ -1072,6 +1080,13 @@ export default {
true // overwrite
)
toolGroup.setToolEnabled(ScaleOverlayTool.toolName)
+ toolGroup.setToolActive(FusionJumpToPointTool.toolName, {
+ bindings: [
+ {
+ mouseButton: MouseBindings.Primary // Left Click
+ }
+ ]
+ })
// toolGroup.setToolConfiguration(OrientationMarkerTool.toolName, {
// orientationWidget: {
// enabled: true,
@@ -1123,14 +1138,11 @@ export default {
mipToolGroup.setToolActive(VolumeRotateTool.toolName, {
bindings: [{ mouseButton: MouseBindings.Wheel }],
});
- mipToolGroup.addTool('MIPJumpToClickTool', {
- //
- toolGroupId: ptToolGroupId
- })
+ mipToolGroup.addTool(FusionJumpToPointTool.toolName, this.getFusionJumpToolConfiguration())
// Set the initial state of the tools, here we set one tool active on left click.
// This means left click will draw that tool.
- mipToolGroup.setToolActive('MIPJumpToClickTool', {
+ mipToolGroup.setToolActive(FusionJumpToPointTool.toolName, {
bindings: [
{
mouseButton: MouseBindings.Primary // Left ClickR
@@ -1144,6 +1156,81 @@ export default {
// mipToolGroup.setToolActive(OrientationMarkerTool.toolName)
mipToolGroup.addViewport(viewportIds.PETMIP.CORONAL, renderingEngineId)
},
+ 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'
+ },
+ 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/dicoms3D/components/MPRViewport.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue
index 242f58c0..0caaa393 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/MPRViewport.vue
@@ -41,10 +41,10 @@
Location: {{
`${Number(imageInfo.location).toFixed(digitPlaces)} mm`
- }}
+ }}
Slice Thickness: {{
`${Number(imageInfo.sliceThickness).toFixed(digitPlaces)} mm`
- }}
+ }}
WW/WL: {{ imageInfo.wwwc }}
@@ -228,7 +228,7 @@ export default {
DicomEvent.$on('renderSegmentation', async (viewportId) => {
// if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false
if (this.viewportId !== viewportId) return false
- await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration)
+ await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration, this.segmentationId, this.segmentIndex)
})
},
watch: {
@@ -561,16 +561,37 @@ export default {
viewport.render()
},
resize(forceFitToWindow) {
- console.log('resize: ', forceFitToWindow)
const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewport = renderingEngine.getViewport(this.viewportId)
- if (!forceFitToWindow) {
- viewport.setZoom(0.5)
- viewport.render()
- } else {
- viewport.setZoom(1)
+ if (!viewport) return
+
+ if (forceFitToWindow) {
+ viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
viewport.render()
+ return
}
+
+ viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
+ const canvas = viewport.getCanvas() || this.element.querySelector('canvas')
+ const imageData = viewport.getImageData()?.imageData
+ const dimensions = imageData?.getDimensions?.()
+ const imageWidth = dimensions?.[0]
+ const imageHeight = dimensions?.[1]
+ const canvasWidth = canvas?.clientWidth
+ const canvasHeight = canvas?.clientHeight
+
+ if (!imageWidth || !imageHeight || !canvasWidth || !canvasHeight) {
+ viewport.render()
+ return
+ }
+
+ const fitScale = Math.min(canvasWidth / imageWidth, canvasHeight / imageHeight)
+ if (fitScale > 0) {
+ // zoom=1 通常是 fit-to-window,这里换算为图像接近 1:1 像素显示
+ viewport.setZoom(1 / fitScale)
+ }
+
+ viewport.render()
},
voiChange(v) {
const renderingEngine = getRenderingEngine(this.renderingEngineId)
@@ -644,7 +665,7 @@ export default {
renderingEngine.render()
}, 100)
}
- await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration)
+ await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration, this.segmentationId, this.segmentIndex)
DicomEvent.$emit('SegmentationLoading', this.viewportId)
let volume = cache.getVolume(this.volumeId)
// console.log(volume, 'volume')
@@ -1024,4 +1045,4 @@ export default {
cursor: move
}
}
-
\ No newline at end of file
+
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 2ea372c7..a4aa5c11 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/PetCtViewport.vue
@@ -415,16 +415,42 @@ export default {
viewport.render()
},
resize(forceFitToWindow) {
- console.log('resize: ', forceFitToWindow)
const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewport = renderingEngine.getViewport(this.viewportId)
- if (!forceFitToWindow) {
- viewport.setZoom(0.5)
- viewport.render()
- } else {
- viewport.setZoom(1)
+ if (!viewport) return
+
+ if (this.isMip) {
+ viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
viewport.render()
+ return
}
+
+ if (forceFitToWindow) {
+ viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
+ viewport.render()
+ return
+ }
+
+ viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
+ const canvas = viewport.getCanvas() || this.element.querySelector('canvas')
+ const imageData = viewport.getImageData()?.imageData
+ const dimensions = imageData?.getDimensions?.()
+ const imageWidth = dimensions?.[0]
+ const imageHeight = dimensions?.[1]
+ const canvasWidth = canvas?.clientWidth
+ const canvasHeight = canvas?.clientHeight
+
+ if (!imageWidth || !imageHeight || !canvasWidth || !canvasHeight) {
+ viewport.render()
+ return
+ }
+
+ const fitScale = Math.min(canvasWidth / imageWidth, canvasHeight / imageHeight)
+ if (fitScale > 0) {
+ viewport.setZoom(1 / fitScale)
+ }
+
+ viewport.render()
},
voiChange(v) {
const renderingEngine = getRenderingEngine(this.renderingEngineId)
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 7c79d450..f91f24e8 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
@@ -143,9 +143,10 @@
-
+
+
{{ rotate.label }}
@@ -707,11 +708,11 @@ export default {
criterionType: null,
tools: [],
rotateOptions: [
- { label: this.$t('trials:reading:button:rotateDefault'), val: 1 },
- { label: this.$t('trials:reading:button:rotateVertical'), val: 2 },
- { label: this.$t('trials:reading:button:rotateHorizontal'), val: 3 },
- { label: this.$t('trials:reading:button:rotateTurnLeft'), val: 4 },
- { label: this.$t('trials:reading:button:rotateTurnRight'), val: 5 }
+ { label: this.$t('trials:reading:button:rotateDefault'), val: 1, icon: '' },
+ { label: this.$t('trials:reading:button:rotateVertical'), val: 2, icon: 'rotateVertical' },
+ { label: this.$t('trials:reading:button:rotateHorizontal'), val: 3, icon: 'rotateHorizontal' },
+ { label: this.$t('trials:reading:button:rotateTurnLeft'), val: 4, icon: 'rotateTurnLeft' },
+ { label: this.$t('trials:reading:button:rotateTurnRight'), val: 5, icon: 'rotateTurnRight' }
],
defaultWwwc: [
{ label: this.$t('trials:reading:button:wwwcDefault'), val: -1, ww: null, wc: null }, // 默认值
@@ -1003,6 +1004,26 @@ export default {
this.getSystemInfoReading();
},
methods: {
+ changeScreenSave() {
+ return new Promise(async (reslove, reject) => {
+ if (this.$refs.Segmentations.readingTaskState < 2) {
+ let isSaved = this.$refs.Segmentations.segmentList.some(item => !item.isSaved)
+ if (isSaved) {
+ let confirm = await this.$confirm(this.$t("trials:reading:Segmentations:confirm:changeScreenSave"))
+ if (!confirm) reslove(true)
+ this.loading = true
+ this.loadingText = this.$t("segment:loadingText:saveSegmentation")
+ this.$refs.Segmentations.checkSaveLoading(() => {
+ reslove(true)
+ })
+ } else {
+ reslove(true)
+ }
+ } else {
+ reslove(true)
+ }
+ })
+ },
resetHistogram() {
if (!this.histogramVisible) return false
if (this.timer['histogram']) {
@@ -3042,16 +3063,21 @@ export default {
},
// 更改视图布局
async changeLayout(v) {
+ if (this.readingTool === 3) {
+ let res = await this.changeScreenSave()
+ if (!res) return false
+ }
this.setToolsPassive()
this.fullScreenIndex = null
this.layout = v
const series = this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series
let index = series.SliceIndex
const seriesArr = []
+ let activeViewportIndex = 0
if (v === 1) {
this.rows = 1
this.cols = 1
- this.activeViewportIndex = 0
+ activeViewportIndex = 0
series.curIndex = index
if (typeof series === 'object') {
seriesArr.push(series)
@@ -3059,7 +3085,7 @@ export default {
} else if (v === 2) {
this.rows = 1
this.cols = 2
- this.activeViewportIndex = 1
+ activeViewportIndex = 1
series.curIndex = index
if (typeof series === 'object') {
seriesArr.push(series)
@@ -3106,7 +3132,7 @@ export default {
seriesArr.push(series)
}
}
- this.activeViewportIndex = 1
+ activeViewportIndex = 1
} else if (v === 4) {
this.rows = 2
this.cols = 2
@@ -3117,10 +3143,12 @@ export default {
seriesArr.push(series)
seriesArr.push(series)
}
- this.activeViewportIndex = 3
+ activeViewportIndex = 3
}
- seriesArr.map((i, index) => {
- this.$refs[`${this.viewportKey}-${index}`][0].setSeriesInfo(i)
+ seriesArr.map(async (i, index) => {
+ await this.$refs[`${this.viewportKey}-${index}`][0].setSeriesInfo(i)
+ if (index === seriesArr.length - 1) this.activeViewportIndex = activeViewportIndex
+
})
this.$nextTick(() => {
const renderingEngine = getRenderingEngine(renderingEngineId)
@@ -3355,9 +3383,12 @@ export default {
}, time)
},
// 切换全屏
- toggleFullScreen(e, index) {
+ async toggleFullScreen(e, index) {
if (this.isDelay && (this.readingTool === 3 || this.isMPR)) return false
-
+ if (this.readingTool === 3) {
+ let res = await this.changeScreenSave()
+ if (!res) return false
+ }
this.fullScreenIndex = this.fullScreenIndex === index ? null : index
this.activeViewportIndex = index
if (this.readingTool === 3 || this.isMPR) {
@@ -3472,14 +3503,14 @@ export default {
this.setToolsPassive()
this.rows = 1
this.cols = 1
- this.activeViewportIndex = 0
this.fullScreenIndex = null
this.isMPR = false
obj.isChange = false
return this.$nextTick(() => {
DicomEvent.$emit('activeSeries', obj)
DicomEvent.$emit('changeMPR')
- this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(obj)
+ this.$refs[`${this.viewportKey}-0`][0].setSeriesInfo(obj)
+ this.activeViewportIndex = 0
const renderingEngine = getRenderingEngine(renderingEngineId)
renderingEngine.resize(true, false)
renderingEngine.render()
@@ -3493,6 +3524,7 @@ export default {
if (!obj.IsDicom) {
return this.previewNoneDicoms(obj)
}
+ this.activeViewportIndex = 0
this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setSeriesInfo(obj)
this.clipPlaying = false
this.fps = 15
@@ -3515,8 +3547,12 @@ export default {
this.setToolsPassive()
},
// 激活视口
- activeViewport(index) {
+ async activeViewport(index) {
if (this.activeViewportIndex === index) return
+ if (this.readingTool === 3) {
+ let res = await this.changeScreenSave()
+ if (!res) return false
+ }
this.activeViewportIndex = index
// 切换检查列表
const series = this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series
@@ -4173,6 +4209,11 @@ export default {
if (!data) return resolve(false)
let viewportSeries = this.$refs[`viewport-MPR-0`][0].series
if (data && viewportSeries.SeriesInstanceUid === data.SeriesInstanceUid) return resolve(true)
+ } else {
+ if (this.readingTool === 3) {
+ let res = await this.changeScreenSave()
+ if (!res) return false
+ }
}
if (!data) {
let { imageOrientationPatient, imagePositionPatient } = this.$refs[`viewport-${this.activeViewportIndex}`][0].imageInfo
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 abc852fc..d5b2b0c1 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/Segmentations.vue
@@ -1,6 +1,6 @@
-
+
{{ series.TaskInfo.SubjectCode }}
{{ series.TaskInfo.TaskBlindName }}
@@ -133,8 +133,8 @@
-
+
{{ $t('trials:reading:Segmentations:button:addSegmentGroup') }}
@@ -151,6 +151,7 @@
+
-
{{ $t("trials:reading:Segmentations:button:save") }}
@@ -225,7 +226,7 @@
+ @show="handleClickPopover(item)" v-if="readingTaskState < 2 && !isMPR">
{{ $t('trials:reading:Segmentations:button:renameSegmentGroup') }}
@@ -244,21 +245,22 @@
+
-
-
+
+
{{ $t("trials:reading:Segmentations:button:saveAll") }}
\ No newline at end of file
+
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/customize/QuestionList.vue b/src/views/trials/trials-panel/reading/dicoms3D/components/customize/QuestionList.vue
index 8d334b66..6e791fdd 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/customize/QuestionList.vue
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/customize/QuestionList.vue
@@ -27,15 +27,15 @@
-
+
{{ $t('trials:readingReport:button:skip') }}
-
+
{{ $t('common:button:save') }}
-
+
{{ $t('common:button:submit') }}
@@ -121,7 +121,8 @@ export default {
digitPlaces: 2,
questionImageToolAttributeInfo: {},
unSaveTargets: [],
- isTableVisible: false
+ isTableVisible: false,
+ isSaved: false
}
},
mounted() {
@@ -283,6 +284,7 @@ export default {
const res = await changeDicomReadingQuestionAnswer(params)
if (res.IsSuccess) {
if (isMsg) {
+ this.isSaved = true
this.$message.success(this.$t('common:message:savedSuccessfully'))
}
this.loading = false
@@ -1444,6 +1446,12 @@ export default {
deep: true,
immediate: true
},
+ questionForm: {
+ handler() {
+ this.isSaved = false
+ },
+ deep: true
+ }
// questionMarkInfoList: {
// handler() {
// console.log(this.questionMarkInfoList, 'questionMarkInfoList')
diff --git a/src/views/trials/trials-panel/reading/dicoms3D/components/helpers/segmentations.js b/src/views/trials/trials-panel/reading/dicoms3D/components/helpers/segmentations.js
index fc75f336..6a33e468 100644
--- a/src/views/trials/trials-panel/reading/dicoms3D/components/helpers/segmentations.js
+++ b/src/views/trials/trials-panel/reading/dicoms3D/components/helpers/segmentations.js
@@ -229,7 +229,7 @@ function selectSegmentation(viewportId, segmentationId) {
segmentation.activeSegmentation.setActiveSegmentation(viewportId, segmentationId)
}
function selectSegment(viewportId, segmentationId, segmentIndex) {
- if (!segmentIndex) return false
+ if (!segmentIndex || !segmentationId) return false
selectSegmentation(viewportId, segmentationId)
segmentation.segmentIndex.setActiveSegmentIndex(segmentationId, segmentIndex);
}
@@ -343,7 +343,7 @@ function resetViewport(viewportId) {
function changeColor(item, viewportId) {
segmentation.config.color.setSegmentIndexColor(viewportId, item.segmentationId, item.segmentIndex, hex2Rgb(item.color))
}
-async function renderSegmentation(series, visitInfo, viewportId, SegmentConfig, RenderingEngineId, Segment = null, actionConfiguration) {
+async function renderSegmentation(series, visitInfo, viewportId, SegmentConfig, RenderingEngineId, Segment = null, actionConfiguration, segmentationId = null, segmentIndex = null) {
try {
// console.log(segmentation, 'segmentation')
renderingEngineId = RenderingEngineId
@@ -354,8 +354,6 @@ async function renderSegmentation(series, visitInfo, viewportId, SegmentConfig,
PageSize: 9999,
PageIndex: 1,
}
- let segmentationId = null;
- let segmentIndex = null;
let res = await getSegmentationList(data);
if (res.IsSuccess) {
let list = res.Result.CurrentPageData;
@@ -383,7 +381,7 @@ async function renderSegmentation(series, visitInfo, viewportId, SegmentConfig,
let SegmentJson = s.SegmentJson ? JSON.parse(s.SegmentJson) : {};
segmentation.segmentIndex.setActiveSegmentIndex(s.SegmentationId, s.SegmentNumber);
segmentation.config.color.setSegmentIndexColor(viewportId, s.SegmentationId, s.SegmentNumber, hex2Rgb(s.ColorRgb))
- segmentation.segmentLocking.setSegmentIndexLocked(s.SegmentationId, s.SegmentNumber, true)
+ segmentation.segmentLocking.setSegmentIndexLocked(s.SegmentationId, s.SegmentNumber, s.IsLock)
if (SegmentJson.bidirectional) {
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === s.SegmentationId && i.metadata.segmentIndex === SegmentJson.bidirectional.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
if (!an) {
diff --git a/src/views/trials/trials-panel/setting/reading-unit/components/ArbitrationRules.vue b/src/views/trials/trials-panel/setting/reading-unit/components/ArbitrationRules.vue
index ebbe1998..f6d50402 100644
--- a/src/views/trials/trials-panel/setting/reading-unit/components/ArbitrationRules.vue
+++ b/src/views/trials/trials-panel/setting/reading-unit/components/ArbitrationRules.vue
@@ -194,9 +194,9 @@
- {{
- $fd('ValueUnit', QuestionList[index].Unit)
- }}
+
+ {{ `${QuestionList[index].Unit === 4 ? QuestionList[index].CustomUnit : $fd('ValueUnit', QuestionList[index].Unit)}`}}
+
diff --git a/src/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue b/src/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue
index d3ed41c5..5ed6a82a 100644
--- a/src/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue
+++ b/src/views/trials/trials-panel/visit/crc-upload/components/uploadPetClinicalData.vue
@@ -307,7 +307,14 @@
style="width: 100%"
>
-
+
+
+
{{ $t('trials:ptData:button:submit') }}
@@ -351,6 +358,19 @@
+
+
+ {{
+ $t('common:dialogTitle:sign')
+ }}
+ {{
+ `(${$t('common:label:sign')}${currentUser})`
+ }}
+
+
+