系统问题配置
commit
33be113d8d
|
@ -690,46 +690,46 @@ export default {
|
||||||
})
|
})
|
||||||
|
|
||||||
const debouncedCallback = this.debounce((e) => {
|
const debouncedCallback = this.debounce((e) => {
|
||||||
const { annotation } = e.detail
|
// const { annotation } = e.detail
|
||||||
const { cachedStats } = annotation.data
|
this.onAnnotationModified(e)
|
||||||
var isNotValidAnnotationNum = 0
|
// const { cachedStats } = annotation.data
|
||||||
for (const volumeId in cachedStats) {
|
// var isNotValidAnnotationNum = 0
|
||||||
var statObj = cachedStats[volumeId]
|
// for (const volumeId in cachedStats) {
|
||||||
var arr = Object.keys(statObj)
|
// var statObj = cachedStats[volumeId]
|
||||||
if (arr.length < 2) {
|
// var arr = Object.keys(statObj)
|
||||||
++isNotValidAnnotationNum
|
// if (arr.length < 2) {
|
||||||
}
|
// ++isNotValidAnnotationNum
|
||||||
}
|
// }
|
||||||
if (isNotValidAnnotationNum === 0) {
|
// }
|
||||||
this.onAnnotationModified(e)
|
// if (!annotation.isHandleOutsideImage) {
|
||||||
} else {
|
// this.onAnnotationModified(e)
|
||||||
// console.log('异常标记:', annotation)
|
// } else {
|
||||||
// const { remark } = annotation.data
|
// // console.log('异常标记:', annotation)
|
||||||
// if (remark === 'Liver' || remark === 'Mediastinum') {
|
// // const { remark } = annotation.data
|
||||||
// this.$refs['questions'].setOutsideMeasuredData(annotation)
|
// // if (remark === 'Liver' || remark === 'Mediastinum') {
|
||||||
// } else {
|
// // this.$refs['questions'].setOutsideMeasuredData(annotation)
|
||||||
// this.$refs['tableQuestions'].setOutsideMeasuredData(annotation)
|
// // } else {
|
||||||
// }
|
// // this.$refs['tableQuestions'].setOutsideMeasuredData(annotation)
|
||||||
// 移除标记
|
// // }
|
||||||
this.removeAnnotation({ otherMeasureData: annotation })
|
// // 移除标记
|
||||||
const { remark } = annotation.data
|
// // this.removeAnnotation({ otherMeasureData: annotation })
|
||||||
// 清除病灶上的标记信息
|
// // const { remark } = annotation.data
|
||||||
if (remark === 'Liver' || remark === 'Mediastinum') {
|
// // // 清除病灶上的标记信息
|
||||||
this.$refs['questions'].clearMeasuredData(remark)
|
// // if (remark === 'Liver' || remark === 'Mediastinum') {
|
||||||
// 激活工具
|
// // this.$refs['questions'].clearMeasuredData(remark)
|
||||||
this.setNonTargetMeasurementStatus({ status: true, toolName: 'CircleROI' })
|
// // // 激活工具
|
||||||
} else {
|
// // this.setNonTargetMeasurementStatus({ status: true, toolName: 'CircleROI' })
|
||||||
this.$refs['tableQuestions'].clearMeasuredData()
|
// // } else {
|
||||||
// 激活工具
|
// // this.$refs['tableQuestions'].clearMeasuredData()
|
||||||
this.setBasicToolActive('CircleROI')
|
// // // 激活工具
|
||||||
}
|
// // this.setBasicToolActive('CircleROI')
|
||||||
}
|
// // }
|
||||||
|
// }
|
||||||
}, 120)
|
}, 120)
|
||||||
eventTarget.addEventListener(cornerstoneTools.Enums.Events.ANNOTATION_MODIFIED, (e) => {
|
eventTarget.addEventListener(cornerstoneTools.Enums.Events.ANNOTATION_MODIFIED, (e) => {
|
||||||
debouncedCallback(e)
|
debouncedCallback(e)
|
||||||
})
|
})
|
||||||
eventTarget.addEventListener(cornerstoneTools.Enums.Events.ANNOTATION_SELECTION_CHANGE, (e) => {
|
eventTarget.addEventListener(cornerstoneTools.Enums.Events.ANNOTATION_SELECTION_CHANGE, (e) => {
|
||||||
console.log(e)
|
|
||||||
const { detail } = e
|
const { detail } = e
|
||||||
const { selection } = detail
|
const { selection } = detail
|
||||||
if (selection && selection.length > 0) {
|
if (selection && selection.length > 0) {
|
||||||
|
@ -833,7 +833,6 @@ export default {
|
||||||
if (this.isNonTargetMeasurement || annotation.data.remark === 'Liver' || annotation.data.remark === 'Mediastinum') {
|
if (this.isNonTargetMeasurement || annotation.data.remark === 'Liver' || annotation.data.remark === 'Mediastinum') {
|
||||||
this.$refs['questions'].setMeasuredData(measureData)
|
this.$refs['questions'].setMeasuredData(measureData)
|
||||||
} else {
|
} else {
|
||||||
console.log('onAnnotationAdded')
|
|
||||||
this.$refs['tableQuestions'] && this.$refs['tableQuestions'].setMeasuredData(measureData)
|
this.$refs['tableQuestions'] && this.$refs['tableQuestions'].setMeasuredData(measureData)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -234,7 +234,7 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { uploadReadingAnswerImage } from '@/api/trials'
|
// import { uploadReadingAnswerImage } from '@/api/trials'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
export default {
|
export default {
|
||||||
name: 'QuestionItem',
|
name: 'QuestionItem',
|
||||||
|
|
|
@ -60,7 +60,8 @@ export default {
|
||||||
suvmaxId: '',
|
suvmaxId: '',
|
||||||
questionFormChangeState: false,
|
questionFormChangeState: false,
|
||||||
questionFormChangeNum: 0,
|
questionFormChangeNum: 0,
|
||||||
isInsideVolume: true
|
lungIsInsideVolume: true,
|
||||||
|
liverIsInsideVolume: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -196,7 +197,7 @@ export default {
|
||||||
handleSave() {
|
handleSave() {
|
||||||
this.$refs['questions'].validate((valid) => {
|
this.$refs['questions'].validate((valid) => {
|
||||||
if (!valid) return
|
if (!valid) return
|
||||||
if (!this.isInsideVolume) {
|
if (!this.lungIsInsideVolume || !this.liverIsInsideVolume) {
|
||||||
this.$alert('当前标记在图像外,不允许保存!', '提示', {
|
this.$alert('当前标记在图像外,不允许保存!', '提示', {
|
||||||
callback: action => {
|
callback: action => {
|
||||||
this.$message({
|
this.$message({
|
||||||
|
@ -308,7 +309,51 @@ export default {
|
||||||
FusionEvent.$emit('imageLocation', { otherMeasureData: otherMeasureData })
|
FusionEvent.$emit('imageLocation', { otherMeasureData: otherMeasureData })
|
||||||
},
|
},
|
||||||
setMeasuredData(measurement) {
|
setMeasuredData(measurement) {
|
||||||
this.isInsideVolume = true
|
if (measurement.data.isHandleOutsideImage) {
|
||||||
|
this.setOutsideMeasuredData(measurement)
|
||||||
|
} else {
|
||||||
|
var idx = -1
|
||||||
|
if (this.currentQsId) {
|
||||||
|
// 新增
|
||||||
|
idx = this.measurements.findIndex(i => i.QuestionId === this.currentQsId)
|
||||||
|
this.currentQsId = ''
|
||||||
|
} else {
|
||||||
|
// 编辑
|
||||||
|
idx = this.measurements.findIndex(i => i.OrderMarkName === measurement.data.data.remark)
|
||||||
|
}
|
||||||
|
if (idx === -1) return
|
||||||
|
var obj = this.measurements[idx]
|
||||||
|
var remark = obj.QuestionType === 51 ? 'Liver' : obj.QuestionType === 52 ? 'Mediastinum' : ''
|
||||||
|
obj.QuestionType === 51 ? this.liverIsInsideVolume = true : obj.QuestionType === 52 ? this.lungIsInsideVolume = true : ''
|
||||||
|
measurement.data.data.remark = remark
|
||||||
|
this.measurements[idx].OtherMeasureData = measurement.data
|
||||||
|
this.measurements[idx].OtherMarkTool = measurement.data.metadata.toolName
|
||||||
|
|
||||||
|
// 添加标记
|
||||||
|
var data = {
|
||||||
|
OtherMeasureData: measurement.data,
|
||||||
|
QuestionId: obj.QuestionId,
|
||||||
|
VisitTaskId: this.visitTaskId,
|
||||||
|
OrderMarkName: remark
|
||||||
|
}
|
||||||
|
if (measurement.type === 'CircleROI') {
|
||||||
|
const suvMax = measurement.suvMax
|
||||||
|
this.$set(this.questionForm, obj.QuestionId, suvMax || null)
|
||||||
|
var pet5PS = this.setpet5PS()
|
||||||
|
this.questionForm[this.pet5PSId] = pet5PS
|
||||||
|
this.calculatePet5PS = pet5PS
|
||||||
|
this.setPet5PSCommentDisplay()
|
||||||
|
}
|
||||||
|
FusionEvent.$emit('addOrUpdateAnnotations', { data })
|
||||||
|
this.questionFormChangeState = true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setOutsideMeasuredData(measurement) {
|
||||||
|
console.log('setOutsideMeasuredData: ', measurement)
|
||||||
|
if ((measurement.data.remark === 'Liver' && this.liverIsInsideVolume === false) || (measurement.data.remark === 'Mediastinum' && this.lungIsInsideVolume === false)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var idx = -1
|
var idx = -1
|
||||||
if (this.currentQsId) {
|
if (this.currentQsId) {
|
||||||
// 新增
|
// 新增
|
||||||
|
@ -321,6 +366,7 @@ export default {
|
||||||
if (idx === -1) return
|
if (idx === -1) return
|
||||||
var obj = this.measurements[idx]
|
var obj = this.measurements[idx]
|
||||||
var remark = obj.QuestionType === 51 ? 'Liver' : obj.QuestionType === 52 ? 'Mediastinum' : ''
|
var remark = obj.QuestionType === 51 ? 'Liver' : obj.QuestionType === 52 ? 'Mediastinum' : ''
|
||||||
|
obj.QuestionType === 51 ? this.liverIsInsideVolume = false : obj.QuestionType === 52 ? this.lungIsInsideVolume = false : ''
|
||||||
measurement.data.data.remark = remark
|
measurement.data.data.remark = remark
|
||||||
this.measurements[idx].OtherMeasureData = measurement.data
|
this.measurements[idx].OtherMeasureData = measurement.data
|
||||||
this.measurements[idx].OtherMarkTool = measurement.data.metadata.toolName
|
this.measurements[idx].OtherMarkTool = measurement.data.metadata.toolName
|
||||||
|
@ -333,43 +379,6 @@ export default {
|
||||||
OrderMarkName: remark
|
OrderMarkName: remark
|
||||||
}
|
}
|
||||||
if (measurement.type === 'CircleROI') {
|
if (measurement.type === 'CircleROI') {
|
||||||
const suvMax = measurement.suvMax
|
|
||||||
this.$set(this.questionForm, obj.QuestionId, suvMax || null)
|
|
||||||
var pet5PS = this.setpet5PS()
|
|
||||||
this.questionForm[this.pet5PSId] = pet5PS
|
|
||||||
this.calculatePet5PS = pet5PS
|
|
||||||
this.setPet5PSCommentDisplay()
|
|
||||||
}
|
|
||||||
FusionEvent.$emit('addOrUpdateAnnotations', { data })
|
|
||||||
this.questionFormChangeState = true
|
|
||||||
},
|
|
||||||
setOutsideMeasuredData(measurement) {
|
|
||||||
this.isInsideVolume = false
|
|
||||||
var idx = -1
|
|
||||||
if (this.currentQsId) {
|
|
||||||
// 新增
|
|
||||||
idx = this.measurements.findIndex(i => i.QuestionId === this.currentQsId)
|
|
||||||
this.currentQsId = ''
|
|
||||||
} else {
|
|
||||||
// 编辑
|
|
||||||
idx = this.measurements.findIndex(i => i.OrderMarkName === measurement.data.remark)
|
|
||||||
}
|
|
||||||
if (idx === -1) return
|
|
||||||
var obj = this.measurements[idx]
|
|
||||||
var remark = obj.QuestionType === 51 ? 'Liver' : obj.QuestionType === 52 ? 'Mediastinum' : ''
|
|
||||||
measurement.data.remark = remark
|
|
||||||
this.measurements[idx].OtherMeasureData = measurement
|
|
||||||
this.measurements[idx].OtherMarkTool = measurement.metadata.toolName
|
|
||||||
|
|
||||||
// 添加标记
|
|
||||||
var data = {
|
|
||||||
OtherMeasureData: measurement,
|
|
||||||
QuestionId: obj.QuestionId,
|
|
||||||
VisitTaskId: this.visitTaskId,
|
|
||||||
OrderMarkName: remark
|
|
||||||
}
|
|
||||||
if (measurement.metadata.toolName === 'CircleROI') {
|
|
||||||
// const suvMax = measurement.suvMax
|
|
||||||
this.$set(this.questionForm, obj.QuestionId, null)
|
this.$set(this.questionForm, obj.QuestionId, null)
|
||||||
var pet5PS = this.setpet5PS()
|
var pet5PS = this.setpet5PS()
|
||||||
this.questionForm[this.pet5PSId] = pet5PS
|
this.questionForm[this.pet5PSId] = pet5PS
|
||||||
|
|
|
@ -521,97 +521,104 @@ export default {
|
||||||
this.$emit('resetQuestions', { isLymphLesion, lesionPart, lesionOrgan, suvMax, saveTypeEnum: this.questionForm.saveTypeEnum, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
this.$emit('resetQuestions', { isLymphLesion, lesionPart, lesionOrgan, suvMax, saveTypeEnum: this.questionForm.saveTypeEnum, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
||||||
},
|
},
|
||||||
setMeasureData(measureData, isInit = false) {
|
setMeasureData(measureData, isInit = false) {
|
||||||
console.log('setMeasureData')
|
|
||||||
this.isInsideVolume = true
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
if (measureData) {
|
if (measureData.data.isHandleOutsideImage) {
|
||||||
// 获取SUVmax(20)
|
this.setOutsideMeasuredData(measureData)
|
||||||
var SUVmax = measureData.suvMax ? measureData.suvMax : null
|
} else {
|
||||||
var suvObj = this.questions.find(i => i.QuestionMark === 20)
|
this.isInsideVolume = true
|
||||||
this.$set(this.questionForm, suvObj.Id, SUVmax)
|
|
||||||
var data = {}
|
|
||||||
measureData.data.data.remark = this.getLesionName(this.orderMark, this.questionForm.RowIndex)
|
|
||||||
// measureData.data.data.studyId = measureData.studyId
|
|
||||||
// measureData.data.data.seriesId = measureData.seriesId
|
|
||||||
// measureData.data.data.instanceId = measureData.instanceId
|
|
||||||
// measureData.data.data.viewportId = measureData.viewportId
|
|
||||||
// measureData.data.data.questionId = this.parentQsId
|
|
||||||
// measureData.data.data.rowIndex = this.questionForm.RowIndex
|
|
||||||
data = {
|
|
||||||
// OtherStudyId: measureData.studyId,
|
|
||||||
// OtherSeriesId: measureData.seriesId,
|
|
||||||
// OtherInstanceId: measureData.instanceId,
|
|
||||||
OtherMeasureData: measureData.data,
|
|
||||||
QuestionId: this.parentQsId,
|
|
||||||
RowIndex: this.questionForm.RowIndex,
|
|
||||||
RowId: this.questionForm.RowId,
|
|
||||||
VisitTaskId: this.visitTaskId,
|
|
||||||
OrderMarkName: measureData.data.data.remark
|
|
||||||
}
|
|
||||||
FusionEvent.$emit('addOrUpdateAnnotations', { data })
|
|
||||||
}
|
|
||||||
if (!isInit) {
|
|
||||||
// if (this.questionForm.RowId) {
|
|
||||||
// this.$set(this.questionForm, 'saveTypeEnum', 1)
|
|
||||||
// } else {
|
|
||||||
// this.$set(this.questionForm, 'saveTypeEnum', 0)
|
|
||||||
// }
|
|
||||||
// saveTypeEnum 0:未保存过(新建病灶);1:已保存,信息不完整(随访初始化病灶/分裂病灶,通过状态判断)
|
|
||||||
if (this.questionForm.OtherMeasureData) {
|
|
||||||
var annotation = Object.assign({}, this.questionForm.OtherMeasureData)
|
|
||||||
|
|
||||||
if (annotation && this.firstRenderAnnotation) {
|
if (measureData) {
|
||||||
for (const k in annotation.data.cachedStats) {
|
// 获取SUVmax(20)
|
||||||
if (annotation.data.cachedStats[k].pointsInShape.length !== 0) {
|
var SUVmax = measureData.suvMax ? measureData.suvMax : null
|
||||||
this.firstRenderAnnotation = false
|
var suvObj = this.questions.find(i => i.QuestionMark === 20)
|
||||||
break
|
this.$set(this.questionForm, suvObj.Id, SUVmax)
|
||||||
|
var data = {}
|
||||||
|
measureData.data.data.remark = this.getLesionName(this.orderMark, this.questionForm.RowIndex)
|
||||||
|
// measureData.data.data.studyId = measureData.studyId
|
||||||
|
// measureData.data.data.seriesId = measureData.seriesId
|
||||||
|
// measureData.data.data.instanceId = measureData.instanceId
|
||||||
|
// measureData.data.data.viewportId = measureData.viewportId
|
||||||
|
// measureData.data.data.questionId = this.parentQsId
|
||||||
|
// measureData.data.data.rowIndex = this.questionForm.RowIndex
|
||||||
|
data = {
|
||||||
|
// OtherStudyId: measureData.studyId,
|
||||||
|
// OtherSeriesId: measureData.seriesId,
|
||||||
|
// OtherInstanceId: measureData.instanceId,
|
||||||
|
OtherMeasureData: measureData.data,
|
||||||
|
QuestionId: this.parentQsId,
|
||||||
|
RowIndex: this.questionForm.RowIndex,
|
||||||
|
RowId: this.questionForm.RowId,
|
||||||
|
VisitTaskId: this.visitTaskId,
|
||||||
|
OrderMarkName: measureData.data.data.remark
|
||||||
|
}
|
||||||
|
FusionEvent.$emit('addOrUpdateAnnotations', { data })
|
||||||
|
}
|
||||||
|
if (!isInit) {
|
||||||
|
// if (this.questionForm.RowId) {
|
||||||
|
// this.$set(this.questionForm, 'saveTypeEnum', 1)
|
||||||
|
// } else {
|
||||||
|
// this.$set(this.questionForm, 'saveTypeEnum', 0)
|
||||||
|
// }
|
||||||
|
// saveTypeEnum 0:未保存过(新建病灶);1:已保存,信息不完整(随访初始化病灶/分裂病灶,通过状态判断)
|
||||||
|
if (this.questionForm.OtherMeasureData) {
|
||||||
|
var annotation = Object.assign({}, this.questionForm.OtherMeasureData)
|
||||||
|
|
||||||
|
if (annotation && this.firstRenderAnnotation) {
|
||||||
|
for (const k in annotation.data.cachedStats) {
|
||||||
|
if (annotation.data.cachedStats[k].pointsInShape.length !== 0) {
|
||||||
|
this.firstRenderAnnotation = false
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.firstRenderAnnotation = false
|
|
||||||
}
|
|
||||||
if (!this.firstRenderAnnotation) {
|
|
||||||
if (this.questionForm.RowId) {
|
|
||||||
this.$set(this.questionForm, 'saveTypeEnum', 1)
|
|
||||||
} else {
|
} else {
|
||||||
this.$set(this.questionForm, 'saveTypeEnum', 0)
|
this.firstRenderAnnotation = false
|
||||||
|
}
|
||||||
|
if (!this.firstRenderAnnotation) {
|
||||||
|
if (this.questionForm.RowId) {
|
||||||
|
this.$set(this.questionForm, 'saveTypeEnum', 1)
|
||||||
|
} else {
|
||||||
|
this.$set(this.questionForm, 'saveTypeEnum', 0)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.$set(this.questionForm, 'saveTypeEnum', 2)
|
||||||
|
this.$emit('close')
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this.$set(this.questionForm, 'saveTypeEnum', 2)
|
|
||||||
this.$emit('close')
|
|
||||||
}
|
}
|
||||||
}
|
this.$set(this.questionForm, 'OtherMeasureData', measureData.data)
|
||||||
this.$set(this.questionForm, 'OtherMeasureData', measureData.data)
|
var isLymph = this.getQuestionVal(2)
|
||||||
var isLymph = this.getQuestionVal(2)
|
isLymph = !isNaN(parseInt(isLymph)) ? parseInt(isLymph) : null
|
||||||
isLymph = !isNaN(parseInt(isLymph)) ? parseInt(isLymph) : null
|
const lesionPart = this.getQuestionVal(8)
|
||||||
const lesionPart = this.getQuestionVal(8)
|
const lesionOrgan = this.getQuestionVal(6)
|
||||||
const lesionOrgan = this.getQuestionVal(6)
|
var suvMax = this.getQuestionVal(20)
|
||||||
var suvMax = this.getQuestionVal(20)
|
this.$emit('resetQuestions', { isLymphLesion: isLymph, lesionPart, lesionOrgan, suvMax, saveTypeEnum: this.questionForm.saveTypeEnum, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
||||||
this.$emit('resetQuestions', { isLymphLesion: isLymph, lesionPart, lesionOrgan, suvMax, saveTypeEnum: this.questionForm.saveTypeEnum, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
this.toolType = measureData.type
|
||||||
this.toolType = measureData.type
|
if (this.questionForm.MeasureData) {
|
||||||
if (this.questionForm.MeasureData) {
|
// if (measureData.type === 'Bidirectional') {
|
||||||
// if (measureData.type === 'Bidirectional') {
|
// this.organList = []
|
||||||
// this.organList = []
|
// this.getOrganInfoList(1)
|
||||||
// this.getOrganInfoList(1)
|
// } else if (measureData.type === 'Length') {
|
||||||
// } else if (measureData.type === 'Length') {
|
// // 直径测量工具 且是靶病灶 器官只能是非淋巴结类型
|
||||||
// // 直径测量工具 且是靶病灶 器官只能是非淋巴结类型
|
// this.organList = []
|
||||||
// this.organList = []
|
// this.getOrganInfoList(0)
|
||||||
// this.getOrganInfoList(0)
|
// } else {
|
||||||
// } else {
|
// this.organList = []
|
||||||
// this.organList = []
|
// this.getOrganInfoList()
|
||||||
// this.getOrganInfoList()
|
// }
|
||||||
// }
|
this.organList = []
|
||||||
this.organList = []
|
this.getOrganInfoList()
|
||||||
this.getOrganInfoList()
|
} else {
|
||||||
} else {
|
this.organList = []
|
||||||
this.organList = []
|
this.getOrganInfoList()
|
||||||
this.getOrganInfoList()
|
}
|
||||||
}
|
}
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
setOutsideMeasuredData(measureData) {
|
setOutsideMeasuredData(measureData) {
|
||||||
|
if (this.isInsideVolume === false) {
|
||||||
|
return
|
||||||
|
}
|
||||||
this.isInsideVolume = false
|
this.isInsideVolume = false
|
||||||
var suvObj = this.questions.find(i => i.QuestionMark === 20)
|
var suvObj = this.questions.find(i => i.QuestionMark === 20)
|
||||||
this.$set(this.questionForm, suvObj.Id, '')
|
this.$set(this.questionForm, suvObj.Id, '')
|
||||||
|
@ -627,7 +634,6 @@ export default {
|
||||||
const lesionOrgan = this.getQuestionVal(6)
|
const lesionOrgan = this.getQuestionVal(6)
|
||||||
var suvMax = this.getQuestionVal(20)
|
var suvMax = this.getQuestionVal(20)
|
||||||
this.$emit('resetQuestions', { isLymphLesion: isLymph, lesionPart, lesionOrgan, suvMax, saveTypeEnum: this.questionForm.saveTypeEnum, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
this.$emit('resetQuestions', { isLymphLesion: isLymph, lesionPart, lesionOrgan, suvMax, saveTypeEnum: this.questionForm.saveTypeEnum, rowIndex: this.rowIndex, questionId: this.parentQsId, anwsers: this.questionForm })
|
||||||
this.toolType = measureData.type
|
|
||||||
if (this.questionForm.MeasureData) {
|
if (this.questionForm.MeasureData) {
|
||||||
this.organList = []
|
this.organList = []
|
||||||
this.getOrganInfoList()
|
this.getOrganInfoList()
|
||||||
|
@ -730,6 +736,29 @@ export default {
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 消失、无法评估状态的病灶限制不能测量SUV值
|
||||||
|
var lesionState = this.getQuestionVal(7)
|
||||||
|
if ((lesionState === 2 || lesionState === 3) && this.questionForm.OtherMeasureData) {
|
||||||
|
this.$confirm(this.$t('评估状态为无法评估或消失的病灶不能测量SUV值!'), {
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: false,
|
||||||
|
callback: action => {}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// suv测量值可以测量为0,但不能与病灶、肝脏、纵隔血池绑定。
|
||||||
|
if (this.questionForm.OtherMeasureData) {
|
||||||
|
var suvmax = this.getQuestionVal(20)
|
||||||
|
if (suvmax === 0) {
|
||||||
|
this.$confirm(this.$t('当前病灶suv测量值为0,不允许保存!'), {
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: false,
|
||||||
|
callback: action => {}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const loading = this.$loading({ fullscreen: true })
|
const loading = this.$loading({ fullscreen: true })
|
||||||
var otherMeasureData = this.questionForm.OtherMeasureData ? Object.assign({}, this.questionForm.OtherMeasureData) : null
|
var otherMeasureData = this.questionForm.OtherMeasureData ? Object.assign({}, this.questionForm.OtherMeasureData) : null
|
||||||
if (otherMeasureData) {
|
if (otherMeasureData) {
|
||||||
|
|
|
@ -520,7 +520,6 @@ export default {
|
||||||
return
|
return
|
||||||
},
|
},
|
||||||
getUnSaveTarget() {
|
getUnSaveTarget() {
|
||||||
console.log('getUnSaveTarget')
|
|
||||||
this.unSaveTargets = []
|
this.unSaveTargets = []
|
||||||
this.tableQuestions.map(item => {
|
this.tableQuestions.map(item => {
|
||||||
if (item.TableQuestions && item.TableQuestions.Answers) {
|
if (item.TableQuestions && item.TableQuestions.Answers) {
|
||||||
|
@ -532,7 +531,6 @@ export default {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// console.log(this.unSaveTargets)
|
|
||||||
return this.unSaveTargets
|
return this.unSaveTargets
|
||||||
},
|
},
|
||||||
getAllUnSaveLesions() {
|
getAllUnSaveLesions() {
|
||||||
|
|
|
@ -18,7 +18,7 @@ const {
|
||||||
} = cornerstoneTools
|
} = cornerstoneTools
|
||||||
// const { getWorldWidthAndHeightFromTwoPoints } = utilities.planar
|
// const { getWorldWidthAndHeightFromTwoPoints } = utilities.planar
|
||||||
// const { roundNumber } = utilities
|
// const { roundNumber } = utilities
|
||||||
const { hideElementCursor } = cursors.elementCursor
|
const { hideElementCursor,resetElementCursor } = cursors.elementCursor
|
||||||
const { getAnnotations,addAnnotation } = annotation.state
|
const { getAnnotations,addAnnotation } = annotation.state
|
||||||
const { isAnnotationVisible } = annotation.visibility
|
const { isAnnotationVisible } = annotation.visibility
|
||||||
const { isAnnotationLocked } = annotation.locking
|
const { isAnnotationLocked } = annotation.locking
|
||||||
|
@ -83,81 +83,81 @@ class CircleROITool extends cornerstoneTools.CircleROITool {
|
||||||
// )
|
// )
|
||||||
// this._getTextLines = this.getTextLines
|
// this._getTextLines = this.getTextLines
|
||||||
}
|
}
|
||||||
// addNewAnnotation = (evt) => {
|
addNewAnnotation = (evt) => {
|
||||||
// const eventDetail = evt.detail;
|
const eventDetail = evt.detail;
|
||||||
// const { currentPoints, element } = eventDetail;
|
const { currentPoints, element } = eventDetail;
|
||||||
// const worldPos = currentPoints.world;
|
const worldPos = currentPoints.world;
|
||||||
// // const canvasPos = currentPoints.canvas;
|
// const canvasPos = currentPoints.canvas;
|
||||||
|
|
||||||
// const enabledElement = getEnabledElement(element);
|
const enabledElement = getEnabledElement(element);
|
||||||
// const { viewport, renderingEngine } = enabledElement;
|
const { viewport, renderingEngine } = enabledElement;
|
||||||
|
|
||||||
// this.isDrawing = true;
|
this.isDrawing = true;
|
||||||
|
|
||||||
// const camera = viewport.getCamera();
|
const camera = viewport.getCamera();
|
||||||
// const { viewPlaneNormal, viewUp } = camera;
|
const { viewPlaneNormal, viewUp } = camera;
|
||||||
|
|
||||||
// const referencedImageId = this.getReferencedImageId(
|
const referencedImageId = this.getReferencedImageId(
|
||||||
// viewport,
|
viewport,
|
||||||
// worldPos,
|
worldPos,
|
||||||
// viewPlaneNormal,
|
viewPlaneNormal,
|
||||||
// viewUp
|
viewUp
|
||||||
// );
|
);
|
||||||
|
|
||||||
// const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
|
const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
|
||||||
|
|
||||||
// const annotation = {
|
const annotation = {
|
||||||
// highlighted: true,
|
highlighted: true,
|
||||||
// invalidated: true,
|
invalidated: true,
|
||||||
// metadata: {
|
metadata: {
|
||||||
// toolName: this.getToolName(),
|
toolName: this.getToolName(),
|
||||||
// viewPlaneNormal: [...viewPlaneNormal],
|
viewPlaneNormal: [...viewPlaneNormal],
|
||||||
// viewUp: [...viewUp],
|
viewUp: [...viewUp],
|
||||||
// FrameOfReferenceUID,
|
FrameOfReferenceUID,
|
||||||
// referencedImageId,
|
referencedImageId,
|
||||||
// },
|
},
|
||||||
// data: {
|
data: {
|
||||||
// label: '',
|
label: '',
|
||||||
// handles: {
|
handles: {
|
||||||
// textBox: {
|
textBox: {
|
||||||
// hasMoved: false,
|
hasMoved: false,
|
||||||
// worldPosition: [0, 0, 0],
|
worldPosition: [0, 0, 0],
|
||||||
// worldBoundingBox: {
|
worldBoundingBox: {
|
||||||
// topLeft: [0, 0, 0],
|
topLeft: [0, 0, 0],
|
||||||
// topRight: [0, 0, 0],
|
topRight: [0, 0, 0],
|
||||||
// bottomLeft: [0, 0, 0],
|
bottomLeft: [0, 0, 0],
|
||||||
// bottomRight: [0, 0, 0],
|
bottomRight: [0, 0, 0],
|
||||||
// },
|
},
|
||||||
// },
|
},
|
||||||
// points: [[...worldPos], [...worldPos]],
|
points: [[...worldPos], [...worldPos]],
|
||||||
// activeHandleIndex: 1,
|
activeHandleIndex: 1,
|
||||||
// },
|
},
|
||||||
// cachedStats: {},
|
cachedStats: {},
|
||||||
// },
|
},
|
||||||
// };
|
};
|
||||||
// addAnnotation(annotation, element);
|
addAnnotation(annotation, element);
|
||||||
|
|
||||||
// const viewportIdsToRender = getViewportIdsWithToolToRender(
|
const viewportIdsToRender = getViewportIdsWithToolToRender(
|
||||||
// element,
|
element,
|
||||||
// this.getToolName()
|
this.getToolName()
|
||||||
// );
|
);
|
||||||
|
|
||||||
// this.editData = {
|
this.editData = {
|
||||||
// annotation,
|
annotation,
|
||||||
// viewportIdsToRender,
|
viewportIdsToRender,
|
||||||
// newAnnotation: true,
|
newAnnotation: true,
|
||||||
// hasMoved: false,
|
hasMoved: false,
|
||||||
// };
|
};
|
||||||
// this._activateDraw(element);
|
this._activateDraw(element);
|
||||||
|
|
||||||
// hideElementCursor(element);
|
hideElementCursor(element);
|
||||||
|
|
||||||
// evt.preventDefault();
|
evt.preventDefault();
|
||||||
|
|
||||||
// triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
|
triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
|
||||||
|
|
||||||
// return annotation;
|
return annotation;
|
||||||
// };
|
};
|
||||||
renderAnnotation = (enabledElement, svgDrawingHelper) => {
|
renderAnnotation = (enabledElement, svgDrawingHelper) => {
|
||||||
let renderStatus = false
|
let renderStatus = false
|
||||||
const { viewport } = enabledElement
|
const { viewport } = enabledElement
|
||||||
|
@ -421,7 +421,161 @@ class CircleROITool extends cornerstoneTools.CircleROITool {
|
||||||
|
|
||||||
return renderStatus
|
return renderStatus
|
||||||
};
|
};
|
||||||
|
_calculateCachedStats = (
|
||||||
|
annotation,
|
||||||
|
viewport,
|
||||||
|
renderingEngine,
|
||||||
|
enabledElement,
|
||||||
|
modalityUnitOptions
|
||||||
|
) => {
|
||||||
|
const data = annotation.data
|
||||||
|
const { viewportId, renderingEngineId } = enabledElement
|
||||||
|
|
||||||
|
const { points } = data.handles
|
||||||
|
|
||||||
|
const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p))
|
||||||
|
const { viewPlaneNormal, viewUp } = viewport.getCamera()
|
||||||
|
|
||||||
|
const [topLeftCanvas, bottomRightCanvas] = (
|
||||||
|
getCanvasCircleCorners(canvasCoordinates)
|
||||||
|
)
|
||||||
|
|
||||||
|
const topLeftWorld = viewport.canvasToWorld(topLeftCanvas)
|
||||||
|
const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas)
|
||||||
|
const { cachedStats } = data
|
||||||
|
|
||||||
|
const targetIds = Object.keys(cachedStats)
|
||||||
|
const worldPos1 = topLeftWorld
|
||||||
|
const worldPos2 = bottomRightWorld
|
||||||
|
for (let i = 0; i < targetIds.length; i++) {
|
||||||
|
const targetId = targetIds[i]
|
||||||
|
|
||||||
|
const image = this.getTargetIdImage(targetId, renderingEngine)
|
||||||
|
|
||||||
|
// If image does not exists for the targetId, skip. This can be due
|
||||||
|
// to various reasons such as if the target was a volumeViewport, and
|
||||||
|
// the volumeViewport has been decached in the meantime.
|
||||||
|
if (!image) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
const { dimensions, imageData, metadata } = image
|
||||||
|
|
||||||
|
const worldPos1Index = transformWorldToIndex(imageData, worldPos1)
|
||||||
|
|
||||||
|
worldPos1Index[0] = Math.floor(worldPos1Index[0])
|
||||||
|
worldPos1Index[1] = Math.floor(worldPos1Index[1])
|
||||||
|
worldPos1Index[2] = Math.floor(worldPos1Index[2])
|
||||||
|
|
||||||
|
const worldPos2Index = transformWorldToIndex(imageData, worldPos2)
|
||||||
|
|
||||||
|
worldPos2Index[0] = Math.floor(worldPos2Index[0])
|
||||||
|
worldPos2Index[1] = Math.floor(worldPos2Index[1])
|
||||||
|
worldPos2Index[2] = Math.floor(worldPos2Index[2])
|
||||||
|
|
||||||
|
// Check if one of the indexes are inside the volume, this then gives us
|
||||||
|
// Some area to do stats over.
|
||||||
|
|
||||||
|
if (this._isInsideVolume(worldPos1Index, worldPos2Index, dimensions)) {
|
||||||
|
const iMin = Math.min(worldPos1Index[0], worldPos2Index[0])
|
||||||
|
const iMax = Math.max(worldPos1Index[0], worldPos2Index[0])
|
||||||
|
|
||||||
|
const jMin = Math.min(worldPos1Index[1], worldPos2Index[1])
|
||||||
|
const jMax = Math.max(worldPos1Index[1], worldPos2Index[1])
|
||||||
|
|
||||||
|
const kMin = Math.min(worldPos1Index[2], worldPos2Index[2])
|
||||||
|
const kMax = Math.max(worldPos1Index[2], worldPos2Index[2])
|
||||||
|
|
||||||
|
const boundsIJK = [
|
||||||
|
[iMin, iMax],
|
||||||
|
[jMin, jMax],
|
||||||
|
[kMin, kMax]
|
||||||
|
]
|
||||||
|
|
||||||
|
const center = [
|
||||||
|
(topLeftWorld[0] + bottomRightWorld[0]) / 2,
|
||||||
|
(topLeftWorld[1] + bottomRightWorld[1]) / 2,
|
||||||
|
(topLeftWorld[2] + bottomRightWorld[2]) / 2
|
||||||
|
]
|
||||||
|
|
||||||
|
const ellipseObj = {
|
||||||
|
center,
|
||||||
|
xRadius: Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2,
|
||||||
|
yRadius: Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2,
|
||||||
|
zRadius: Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2
|
||||||
|
}
|
||||||
|
const { worldWidth, worldHeight } = getWorldWidthAndHeightFromTwoPoints(
|
||||||
|
viewPlaneNormal,
|
||||||
|
viewUp,
|
||||||
|
worldPos1,
|
||||||
|
worldPos2
|
||||||
|
)
|
||||||
|
const isEmptyArea = worldWidth === 0 && worldHeight === 0
|
||||||
|
const scale = getCalibratedScale(image)
|
||||||
|
const aspect = getCalibratedAspect(image)
|
||||||
|
const area = Math.abs(
|
||||||
|
Math.PI *
|
||||||
|
(worldWidth / scale / 2) *
|
||||||
|
(worldHeight / aspect / scale / 2)
|
||||||
|
)
|
||||||
|
|
||||||
|
const modalityUnit = getModalityUnit(
|
||||||
|
metadata.Modality,
|
||||||
|
annotation.metadata.referencedImageId,
|
||||||
|
modalityUnitOptions
|
||||||
|
)
|
||||||
|
const pointsInShape = pointInShapeCallback(
|
||||||
|
imageData,
|
||||||
|
(pointLPS, pointIJK) => pointInEllipse(ellipseObj, pointLPS),
|
||||||
|
this.configuration.statsCalculator.statsCallback,
|
||||||
|
boundsIJK
|
||||||
|
)
|
||||||
|
|
||||||
|
const stats = this.configuration.statsCalculator.getStatistics()
|
||||||
|
|
||||||
|
cachedStats[targetId] = {
|
||||||
|
Modality: metadata.Modality,
|
||||||
|
area,
|
||||||
|
mean: stats[1] && stats[1].value ? stats[1].value : null,
|
||||||
|
max: stats[0] && stats[0].value ? stats[0].value : null,
|
||||||
|
stdDev: stats[2] && stats[2].value ? stats[2].value : null,
|
||||||
|
statsArray: stats,
|
||||||
|
pointsInShape: pointsInShape,
|
||||||
|
isEmptyArea,
|
||||||
|
areaUnit: getCalibratedAreaUnits(null, image),
|
||||||
|
radius: worldWidth / 2 / scale,
|
||||||
|
radiusUnit: getCalibratedLengthUnits(null, image),
|
||||||
|
perimeter: (2 * Math.PI * (worldWidth / 2)) / scale,
|
||||||
|
modalityUnit
|
||||||
|
}
|
||||||
|
annotation.isHandleOutsideImage = false
|
||||||
|
} else {
|
||||||
|
this.isHandleOutsideImage = true
|
||||||
|
|
||||||
|
cachedStats[targetId] = {
|
||||||
|
Modality: metadata.Modality,
|
||||||
|
areaUnit: getCalibratedAreaUnits(null, image)
|
||||||
|
}
|
||||||
|
annotation.isHandleOutsideImage = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
annotation.invalidated = false
|
||||||
|
|
||||||
|
// Dispatching annotation modified
|
||||||
|
const eventType = Enums.Events.ANNOTATION_MODIFIED
|
||||||
|
|
||||||
|
const eventDetail = {
|
||||||
|
annotation,
|
||||||
|
viewportId,
|
||||||
|
renderingEngineId
|
||||||
|
}
|
||||||
|
triggerEvent(eventTarget, eventType, eventDetail)
|
||||||
|
|
||||||
|
return cachedStats
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCanvasCircleCorners(
|
function getCanvasCircleCorners(
|
||||||
circleCanvasPoints
|
circleCanvasPoints
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -680,6 +680,7 @@ export default {
|
||||||
// 融合
|
// 融合
|
||||||
handleMerge(answers, questionId, orderMark) {
|
handleMerge(answers, questionId, orderMark) {
|
||||||
this.lesionData = []
|
this.lesionData = []
|
||||||
|
this.mergeList = []
|
||||||
this.merge.visible = true
|
this.merge.visible = true
|
||||||
this.mergeInfo.questionId = questionId
|
this.mergeInfo.questionId = questionId
|
||||||
this.mergeInfo.mergeRowId = answers.RowId
|
this.mergeInfo.mergeRowId = answers.RowId
|
||||||
|
|
Loading…
Reference in New Issue