1
continuous-integration/drone/push Build is passing Details

main
caiyiling 2025-05-29 17:21:25 +08:00
parent f1b816fd85
commit 3f63c126ff
2 changed files with 156 additions and 148 deletions

View File

@ -1,6 +1,11 @@
<template>
<div v-loading="loading" :element-loading-text="loadingText" element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)" class="read-page-container">
<div
v-loading="loading"
:element-loading-text="loadingText"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
class="read-page-container"
>
<!-- 检查列表 -->
<div class="left-panel">
<div class="task-container">
@ -200,7 +205,7 @@
<svg-icon v-else icon-class="fitToImage" class="svg-icon" />
</div>
<!--融合-->
<div class="tool-item" :title="$t('trials:lugano:button:fusion')" @click.prevent="openFusion" v-if="readingTool === 2">
<div v-if="readingTool === 2" class="tool-item" :title="$t('trials:lugano:button:fusion')" @click.prevent="openFusion">
<svg-icon icon-class="fusion" class="svg-icon" />
</div>
<div
@ -279,9 +284,9 @@
<div
v-if="criterionType === 0"
:title="$t('trials:reading:button:more')"
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '']"
@click.stop="showPanel($event)"
@mouseleave="toolMouseout"
:class="['tool-item', readingTaskState === 2 ? 'tool-disabled' : '']"
>
<div class="dropdown">
<div
@ -292,7 +297,7 @@
<i class="el-icon-arrow-down" style="color:#fff;" />
</div>
<div class="dropdown-content">
<ul style="width:100px;" v-if="readingTaskState < 2">
<ul v-if="readingTaskState < 2" style="width:100px;">
<li v-for="i in customizeStandards" :key="i.toolName" style="text-align:left;">
<a href="#" @click.prevent="setMoreToolActive(i.toolName)">
<svg-icon :icon-class="i.icon" class="svg-icon" style="margin-right: 5px;" />
@ -362,7 +367,7 @@
/>
</div>
</div>
<div :class="[ 'viewports-box', !isFusion ? 'viewports-box-down' : '' ]" v-if="readingTool === 2" :style="gridStyle">
<div v-if="readingTool === 2" :class="[ 'viewports-box', !isFusion ? 'viewports-box-down' : '' ]" :style="gridStyle">
<div
v-for="(v, index) in cellsMax"
v-show="index < cells.length"
@ -523,9 +528,13 @@
</div>
</el-dialog>
<el-dialog :visible.sync="fusionVisible" :close-on-click-modal="false" :title="$t('trials:lugano:button:record')"
width="850px" >
<FusionForm v-if="fusionVisible" :activeTaskIndex="activeTaskIndex" :taskList="visitTaskList" @close="closeFusion" @fusion="handleFusion" />
<el-dialog
:visible.sync="fusionVisible"
:close-on-click-modal="false"
:title="$t('trials:lugano:button:record')"
width="850px"
>
<FusionForm v-if="fusionVisible" :active-task-index="activeTaskIndex" :task-list="visitTaskList" @close="closeFusion" @fusion="handleFusion" />
</el-dialog>
</div>
</template>
@ -591,7 +600,7 @@ const {
synchronizers
// cursors
} = cornerstoneTools
const { createCameraPositionSynchronizer, createVOISynchronizer } = synchronizers;
const { createCameraPositionSynchronizer, createVOISynchronizer } = synchronizers
const newStyles = {
global: {
color: 'rgb(255, 0, 0)',
@ -619,12 +628,6 @@ annotation.config.style.setDefaultToolStyles(newStyles)
const { MouseBindings, Events: toolsEvents } = csToolsEnums
export default {
name: 'ReadPage',
props: {
readingTool: {
type: Number,
default: 2
}
},
components: {
StudyList,
Viewport,
@ -641,6 +644,12 @@ export default {
FusionForm,
colorMap
},
props: {
readingTool: {
type: Number,
default: 2
}
},
data() {
return {
loading: false,
@ -710,7 +719,7 @@ export default {
studyList: [],
volumeData: {},
fusionSerieId: {},
loadingText: null,
loadingText: null
// resetAnnotation: false , // 使
}
},
@ -794,7 +803,7 @@ export default {
this.digitPlaces = digitPlaces === -1 ? this.digitPlaces : digitPlaces
if (this.criterionType === 0) {
this.tools = getCustomizeStandardsTools(this.taskInfo.ReadingToolList)
let toolNames = this.tools.map(i=>i.toolName)
const toolNames = this.tools.map(i => i.toolName)
this.customizeStandards = config.customizeStandards.filter(item => !toolNames.includes(item.toolName))
} else {
this.tools = getTools(this.criterionType)
@ -1063,13 +1072,13 @@ export default {
}
]
let viewportIds = ['viewport-0', 'viewport-1', 'viewport-2', 'viewport-3']
let fusionViewportIds = ["viewport-fusion-0", "viewport-fusion-1", "viewport-fusion-2", "viewport-fusion-3"]
const fusionViewportIds = ['viewport-fusion-0', 'viewport-fusion-1', 'viewport-fusion-2', 'viewport-fusion-3']
if (this.readingTool === 2) {
const fusionElement1 = this.$refs['viewport-fusion-0'][0].$el
const fusionElement2 = this.$refs['viewport-fusion-1'][0].$el
const fusionElement3 = this.$refs['viewport-fusion-2'][0].$el
const fusionElement4 = this.$refs['viewport-fusion-3'][0].$el
let arr = [
const arr = [
{
viewportId: 'viewport-fusion-0',
type: ViewportType.ORTHOGRAPHIC,
@ -1172,27 +1181,27 @@ export default {
getTextLines: this.getCircleROIToolTextLines
})
if (toolGroupId === 'viewport-fusion-3') {
toolGroup.addTool(VolumeRotateTool.toolName);
toolGroup.addTool(VolumeRotateTool.toolName)
toolGroup.setToolActive(VolumeRotateTool.toolName, {
bindings: [
{
mouseButton: MouseBindings.Wheel, // mouse wheel
},
],
});
mouseButton: MouseBindings.Wheel // mouse wheel
}
]
})
toolGroup.addTool(MIPJumpToClickTool.toolName, {
targetViewportIds: fusionViewportIds,
});
targetViewportIds: fusionViewportIds
})
// Set the initial state of the tools, here we set one tool active on left click.
// This means left click will draw that tool.
toolGroup.setToolActive(MIPJumpToClickTool.toolName, {
bindings: [
{
mouseButton: MouseBindings.Primary, // Left Click
},
],
});
mouseButton: MouseBindings.Primary // Left Click
}
]
})
}
toolGroup.setToolActive(StackScrollTool.toolName, {
bindings: [{ mouseButton: MouseBindings.Wheel }]
@ -1434,7 +1443,6 @@ export default {
this.saveCustomAnnotation(annotation)
this.$refs[`ecrf_${series.TaskInfo.VisitTaskId}`][0].bindAnnotationToQuestion(annotation)
}
}
this.setToolsPassive()
@ -1485,17 +1493,21 @@ export default {
try {
// if ( this.resetAnnotation && this.isFusion ) return false
if (!annotation) return false
if (this.readingTaskState === 2) throw 'annotation Not allowed to operate'
if (this.readingTaskState === 2) {
const errorMsg = { message: 'annotation Not allowed to operate' }
throw errorMsg
}
const i = this.tools.findIndex(i => i.toolName === annotation.metadata.toolName)
if (i === -1) {
//
return
}
if (annotation.visitTaskId === this.taskInfo.VisitTaskId) {
let isBound = this.$refs[`ecrf_${annotation.visitTaskId}`][0].verifyAnnotationIsBound(annotation)
const isBound = this.$refs[`ecrf_${annotation.visitTaskId}`][0].verifyAnnotationIsBound(annotation)
if (isBound) {
this.$alert('该标记已与问题进行绑定,不允许删除!')
throw 'annotation Not allowed to operate'
const errorMsg = { message: 'annotation Not allowed to operate' }
throw errorMsg
}
}
@ -1521,7 +1533,8 @@ export default {
viewport.render()
}
} else {
throw 'annotation Not allowed to operate'
const errorMsg = { message: 'annotation Not allowed to operate' }
throw errorMsg
}
} catch (e) {
cornerstoneTools.annotation.state.addAnnotation(annotation)
@ -2219,16 +2232,16 @@ export default {
this.fullScreenIndex = this.fullScreenIndex === index ? null : index
this.activeViewportIndex = index
if (this.isFusion) {
let viewportIds = [`${this.viewportKey}-0`, `${this.viewportKey}-1`, `${this.viewportKey}-2`]
const viewportIds = [`${this.viewportKey}-0`, `${this.viewportKey}-1`, `${this.viewportKey}-2`]
viewportIds.forEach(id => {
let index = this.$refs[id][0].series.SliceIndex
const index = this.$refs[id][0].series.SliceIndex
this.$refs[id][0].setFullScreen(index)
})
}
},
async toggleTask(taskInfo, taskIndex) {
if (this.isFusion) {
let confirm = await this.$confirm(this.$t('trials:reading:confirm:changeStack'))
const confirm = await this.$confirm(this.$t('trials:reading:confirm:changeStack'))
if (!confirm) return false
this.isFusion = false
this.fullScreenIndex = null
@ -2300,7 +2313,7 @@ export default {
},
async activeSeries(obj) {
if (this.isFusion) {
let confirm = await this.$confirm(this.$t('trials:reading:confirm:changeStack'))
const confirm = await this.$confirm(this.$t('trials:reading:confirm:changeStack'))
if (!confirm) return false
this.isFusion = false
this.setToolsPassive()
@ -2461,7 +2474,7 @@ 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)
const series = this.getMarkedSeries(studyList, obj.annotation)
if (series) {
this.$refs[`${this.viewportKey}-${this.cells.length - 1}`][0].setSeriesInfo(series, true)
this.activeViewportIndex = i
@ -2710,67 +2723,67 @@ export default {
},
//
setUpSynchronizers() {
let axialCameraPositionSynchronizer = createCameraPositionSynchronizer(
const axialCameraPositionSynchronizer = createCameraPositionSynchronizer(
'AXIAL_CAMERA_SYNCHRONIZER_ID'
);
let ctVoiSynchronizer = createVOISynchronizer('CT_VOI_SYNCHRONIZER_ID', {
)
const ctVoiSynchronizer = createVOISynchronizer('CT_VOI_SYNCHRONIZER_ID', {
syncInvertState: false,
syncColormap: false,
});
let ptVoiSynchronizer = createVOISynchronizer('PT_VOI_SYNCHRONIZER_ID', {
syncColormap: false
})
const ptVoiSynchronizer = createVOISynchronizer('PT_VOI_SYNCHRONIZER_ID', {
syncInvertState: false,
syncColormap: false,
});
let fusionVoiSynchronizer = createVOISynchronizer('FUSION_VOI_SYNCHRONIZER_ID', {
syncColormap: false
})
const fusionVoiSynchronizer = createVOISynchronizer('FUSION_VOI_SYNCHRONIZER_ID', {
syncInvertState: false,
syncColormap: false,
syncColormap: false
});
[
`viewport-fusion-0`,
`viewport-fusion-1`,
`viewport-fusion-2`,
`viewport-fusion-2`
].forEach((viewportId) => {
axialCameraPositionSynchronizer.add({
renderingEngineId: this.renderingEngineId,
viewportId,
});
viewportId
})
});
[
`viewport-fusion-0`,
`viewport-fusion-0`
].forEach((viewportId) => {
ctVoiSynchronizer.add({
renderingEngineId: this.renderingEngineId,
viewportId,
});
viewportId
})
});
[
`viewport-fusion-3`,
`viewport-fusion-1`,
`viewport-fusion-1`
].forEach((viewportId) => {
ptVoiSynchronizer.add({
renderingEngineId: this.renderingEngineId,
viewportId,
});
viewportId
})
});
[
`viewport-fusion-2`,
`viewport-fusion-2`
].forEach((viewportId) => {
fusionVoiSynchronizer.add({
renderingEngineId,
viewportId,
});
viewportId
})
ctVoiSynchronizer.addTarget({
renderingEngineId,
viewportId,
});
viewportId
})
ptVoiSynchronizer.addTarget({
renderingEngineId,
viewportId,
});
});
viewportId
})
})
},
setColorMap(rgbPresetName) {
let fusionViewportIds = [`viewport-fusion-1`, `viewport-fusion-2`, `viewport-fusion-3`]
const fusionViewportIds = [`viewport-fusion-1`, `viewport-fusion-2`, `viewport-fusion-3`]
fusionViewportIds.forEach(id => {
this.$refs[id][0].setPreset(rgbPresetName)
this.$refs[id][0].renderColorBar(rgbPresetName)
@ -2778,7 +2791,7 @@ export default {
})
},
voiChange(v) {
let fusionViewportIds = [`viewport-fusion-1`, `viewport-fusion-2`, `viewport-fusion-3`]
const fusionViewportIds = [`viewport-fusion-1`, `viewport-fusion-2`, `viewport-fusion-3`]
fusionViewportIds.forEach(id => {
this.$refs[id][0].voiChange(v)
})
@ -2787,9 +2800,9 @@ export default {
try {
this.fusionVisible = false
this.isFusion = true
this.rows = 2;
this.rows = 2
this.cols = 2
let { ct, pt } = data
const { ct, pt } = data
this.loading = true
this.loadingText = this.$t('trials:lugano:message:loadVolumes')
// this.resetAnnotation = true
@ -2817,22 +2830,22 @@ export default {
await this.getVolume(pt, true)
this.loading = false
this.loadingText = null
let ctData = {
const ctData = {
data: ct,
volumeId: this.volumeData[ct.SeriesInstanceUid].volumeId,
volumeId: this.volumeData[ct.SeriesInstanceUid].volumeId
}
let ptData = {
const ptData = {
data: pt,
volumeId: this.volumeData[pt.SeriesInstanceUid].volumeId,
volume: this.volumeData[pt.SeriesInstanceUid].volume,
volume: this.volumeData[pt.SeriesInstanceUid].volume
}
let fusionData = {
const fusionData = {
ct,
data: pt,
volumeId: this.volumeData[pt.SeriesInstanceUid].volumeId,
ctVolumeId: this.volumeData[ct.SeriesInstanceUid].volumeId,
ptVolumeId: this.volumeData[pt.SeriesInstanceUid].volumeId,
fusionVolumeId: this.volumeData[`fusion_${pt.SeriesInstanceUid}`].volumeId,
fusionVolumeId: this.volumeData[`fusion_${pt.SeriesInstanceUid}`].volumeId
}
this.$refs[`viewport-0`][0].setSeriesInfo(ct)
this.$refs[`viewport-1`][0].setSeriesInfo(pt)
@ -2861,15 +2874,15 @@ export default {
},
async getVolume(serie, isFusion = false) {
return new Promise(async res => {
let volumeId = null, volume = null
let key = isFusion ? `fusion_${serie.SeriesInstanceUid}` : serie.SeriesInstanceUid
let volumeId = null; let volume = null
const key = isFusion ? `fusion_${serie.SeriesInstanceUid}` : serie.SeriesInstanceUid
if (!this.volumeData[key] || !cache.getVolume(this.volumeData[key].volumeId)) {
if (serie.Modality === 'PT' && !isFusion) {
serie.ImageIds.forEach(async id => {
const imageLoadObject = cache.getImage(id);
const imageLoadObject = cache.getImage(id)
if (imageLoadObject) {
await new Promise(res => {
cache.removeImageLoadObject(id, {force:true}); //
cache.removeImageLoadObject(id, { force: true }) //
res()
})
}
@ -2899,7 +2912,7 @@ export default {
},
closeFusion() {
this.fusionVisible = false
},
}
}
}
</script>

View File

@ -32,8 +32,8 @@
:reading-task-state="readingTaskState"
:criterion-id="criterionId"
:calculation-list="calculationList"
:questionMarkInfoList="questionMarkInfoList"
:questionsMarkStatus="questionsMarkStatus"
:question-mark-info-list="questionMarkInfoList"
:questions-mark-status="questionsMarkStatus"
:is-baseline="isBaseLineTask"
@resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData"
@ -97,7 +97,7 @@ export default {
readingTaskState: {
type: Number,
required: true
},
}
},
data() {
return {
@ -348,7 +348,7 @@ export default {
})
},
verifyAnnotationIsBound(annotation) {
let i = this.questionMarkInfoList.findIndex(i=>i.MeasureData && i.MeasureData.annotationUID === annotation.annotationUID)
const i = this.questionMarkInfoList.findIndex(i => i.MeasureData && i.MeasureData.annotationUID === annotation.annotationUID)
return i > -1
},
async operateImageMarker(obj) {
@ -359,19 +359,18 @@ export default {
} else if (obj.operateStateEnum === 2) {
//
let i = this.questionMarkInfoList.findIndex(i=>i.QuestionId === obj.question.Id)
const i = this.questionMarkInfoList.findIndex(i => i.QuestionId === obj.question.Id)
if (i > -1) {
let annotation = this.questionMarkInfoList[i].MeasureData
const annotation = this.questionMarkInfoList[i].MeasureData
this.$emit('viewCustomAnnotationSeries', { visitTaskId: this.visitTaskId, annotation })
}
} else if (obj.operateStateEnum === 3) {
//
// this.$set(this.questionsMarkStatus, obj.question.Id, 1)
} else if (obj.operateStateEnum === 4) {
//
this.$set(this.questionForm, obj.question.Id, '')
let i = this.questionMarkInfoList.findIndex(i=>i.QuestionId === obj.question.Id)
const i = this.questionMarkInfoList.findIndex(i => i.QuestionId === obj.question.Id)
if (i > -1) {
this.questionMarkInfoList.splice(i, 1)
}
@ -380,16 +379,16 @@ export default {
//
this.loading = true
try {
let answers = []
const answers = []
answers.push({ id: obj.question.Id, answer: this.questionForm[obj.question.Id] })
let markInfo = []
let i = this.questionMarkInfoList.findIndex(i=>i.QuestionId === this.operateQuestionId)
const markInfo = []
const i = this.questionMarkInfoList.findIndex(i => i.QuestionId === this.operateQuestionId)
if (i > -1) {
let obj = Object.assign({}, this.questionMarkInfoList[i])
const obj = Object.assign({}, this.questionMarkInfoList[i])
obj.MeasureData = obj.MeasureData ? JSON.stringify(obj.MeasureData) : ''
markInfo.push(obj)
}
let params = {
const params = {
visitTaskId: this.visitTaskId,
answers: answers,
questionMarkInfoList: markInfo
@ -402,9 +401,7 @@ export default {
console.log(e)
this.loading = false
}
}
},
async bindAnnotationToQuestion(annotation) {
try {
@ -420,13 +417,12 @@ export default {
distinguishCancelAndClose: true
})
if (confirm !== 'confirm') return
}
console.log('bindAnnotationToQuestion', annotation)
let i = this.questionMarkInfoList.findIndex(i=>i.QuestionId === this.operateQuestionId)
const i = this.questionMarkInfoList.findIndex(i => i.QuestionId === this.operateQuestionId)
if (i === -1) {
let markInfo = {
const markInfo = {
QuestionId: this.operateQuestionId,
InstanceId: annotation.instanceId,
SeriesId: annotation.seriesId,
@ -448,14 +444,13 @@ export default {
}
this.setAnswerToQuestion(annotation, this.operateQuestionId)
this.$set(this.questionsMarkStatus, this.operateQuestionId, 1)
} catch (e) {
console.log(e)
}
},
updateAnnotationToQuestion(annotation) {
console.log('updateAnnotationToQuestion', annotation)
let i = this.questionMarkInfoList.findIndex(i=>i.MeasureData && i.MeasureData.annotationUID === annotation.annotationUID)
const i = this.questionMarkInfoList.findIndex(i => i.MeasureData && i.MeasureData.annotationUID === annotation.annotationUID)
if (i === -1) return
this.questionMarkInfoList[i].measureData = annotation
this.setAnswerToQuestion(annotation, this.questionMarkInfoList[i].QuestionId)
@ -468,7 +463,7 @@ export default {
let length = annotation.data.cachedStats[`imageId:${referencedImageId}`].length
length = length ? parseFloat(length).toFixed(this.digitPlaces) : length
this.$set(this.questionForm, questionId, length)
} else if (obj.toolName === 'Bidirectional') {
} else if (annotation.metadata.toolName === 'Bidirectional') {
// let length = annotation.data.cachedStats[`imageId:${referencedImageId}`].length
// length = length ? parseFloat(length).toFixed(this.digitPlaces) : length
let short = annotation.data.cachedStats[`imageId:${referencedImageId}`].width
@ -503,7 +498,7 @@ export default {
loading.close()
console.log(e)
}
},
}
}
}
</script>