系统问题配置

uat_us
熊飞 2024-02-27 13:27:08 +08:00
commit 33be113d8d
7 changed files with 413 additions and 223 deletions

View File

@ -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)
} }

View File

@ -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',

View File

@ -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

View File

@ -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 01访/
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 01访/
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
}
// suv0
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) {

View File

@ -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() {

View File

@ -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
) { ) {

View File

@ -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