Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details

uat_us
caiyiling 2026-03-27 16:24:54 +08:00
commit 8600054405
5 changed files with 237 additions and 81 deletions

View File

@ -40,10 +40,10 @@
<div v-if="series" class="right-bottom-text"> <div v-if="series" class="right-bottom-text">
<div v-show="imageInfo.location">Location: {{ <div v-show="imageInfo.location">Location: {{
`${Number(imageInfo.location).toFixed(digitPlaces)} mm` `${Number(imageInfo.location).toFixed(digitPlaces)} mm`
}}</div> }}</div>
<div v-show="imageInfo.sliceThickness">Slice Thickness: {{ <div v-show="imageInfo.sliceThickness">Slice Thickness: {{
`${Number(imageInfo.sliceThickness).toFixed(digitPlaces)} mm` `${Number(imageInfo.sliceThickness).toFixed(digitPlaces)} mm`
}}</div> }}</div>
<div v-show="imageInfo.wwwc">WW/WL: {{ imageInfo.wwwc }}</div> <div v-show="imageInfo.wwwc">WW/WL: {{ imageInfo.wwwc }}</div>
</div> </div>
<div class="orientation-top"> <div class="orientation-top">
@ -493,7 +493,10 @@ export default {
console.log("渲染成功") console.log("渲染成功")
DicomEvent.$emit("isloaded", {}) DicomEvent.$emit("isloaded", {})
} }
}]).then(res => { }]).then(r => {
let volume = cache.getVolume(this.volumeId)
const voi = metaData.get('voiLutModule', volume._imageIds[Math.ceil((volume._imageIds.length - 1) / 2)])
this.$emit('setWwwc', { ww: voi.windowWidth[0], wc: voi.windowCenter[0], id: this.viewportId })
if (data.isLocation) { if (data.isLocation) {
setTimeout(() => { csUtils.jumpToSlice(viewport.element, { imageIndex: data.SliceIndex }); }) setTimeout(() => { csUtils.jumpToSlice(viewport.element, { imageIndex: data.SliceIndex }); })
} }
@ -509,13 +512,51 @@ export default {
const worldPoint = currentPoints.world const worldPoint = currentPoints.world
const renderingEngine = getRenderingEngine(this.renderingEngineId) const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewport = renderingEngine.getViewport(this.viewportId) const viewport = renderingEngine.getViewport(this.viewportId)
const imageData = viewport.getImageData() let referencedImageId = viewport.getCurrentImageId()
if (!imageData) return const data = viewport.getImageData()
const index = imageData.imageData.worldToIndex(worldPoint) if (!data) return
const { dimensions, imageData, metadata, voxelManager } = data
const index = imageData.worldToIndex(worldPoint)
index[0] = Math.floor(index[0]) index[0] = Math.floor(index[0])
index[1] = Math.floor(index[1]) index[1] = Math.floor(index[1])
index[2] = Math.floor(index[2]) index[2] = Math.floor(index[2])
this.mousePosition.index = index this.mousePosition.index = index
const modality = metadata.Modality
let ijk = csUtils.transformWorldToIndex(imageData, worldPoint)
ijk = vec3.round(ijk, ijk);
if (csUtils.indexWithinDimensions(ijk, dimensions)) {
this.isHandleOutsideImage = false
let value = voxelManager.getAtIJKPoint(ijk)
ijk[2] = viewport.getCurrentImageIdIndex()
let modalityUnit
if (modality === 'US') {
const calibratedResults = cornerstoneTools.utilities.getCalibratedProbeUnitsAndValue(image, [ijk])
const hasEnhancedRegionValues = calibratedResults.values.every(
(value) => value !== null
)
value = (hasEnhancedRegionValues ? calibratedResults.values : value)
modalityUnit = hasEnhancedRegionValues
? calibratedResults.units
: 'raw';
} else {
const scalingModule = referencedImageId && metaData.get('scalingModule', referencedImageId)
const isSuvScaled = typeof scalingModule?.suvbw === 'number'
if (scalingModule && scalingModule.suvbw) {
const pixelUnitsOptions = {
isPreScaled: cornerstoneTools.utilities.viewport.isViewportPreScaled(viewport, referencedImageId),
isSuvScaled: isSuvScaled,
}
modalityUnit = cornerstoneTools.utilities.getPixelValueUnits(
modality,
referencedImageId,
pixelUnitsOptions
);
}
}
this.mousePosition.value = value
this.mousePosition.modalityUnit = modalityUnit
}
}, },
toggleTask(evt, visitTaskNum, i) { toggleTask(evt, visitTaskNum, i) {
this.$emit('activeViewport', this.viewportIndex) this.$emit('activeViewport', this.viewportIndex)

View File

@ -1,7 +1,8 @@
<template> <template>
<div ref="viewport-fusion" class="viewport-wrapper" v-loading="loading" :element-loading-text="NSTip" <div ref="viewport-fusion" class="viewport-wrapper" v-loading="loading" :element-loading-text="NSTip"
element-loading-background="rgba(0, 0, 0, 0.8)" @mouseup="sliderMouseup" @mousemove="sliderMousemove" element-loading-background="rgba(0, 0, 0, 0.8)" @mouseup="sliderMouseup" @mousemove="sliderMousemove"
@mouseleave="sliderMouseleave" :style="{ color: series.Modality === 'PT' || series.Modality === 'NM' || isMip ? '#666' : '#ddd' }"> @mouseleave="sliderMouseleave"
:style="{ color: series.Modality === 'PT' || series.Modality === 'NM' || isMip ? '#666' : '#ddd' }">
<div v-if="isFusion" class="opacity-slider-wrapper" @mousedown.stop @mousemove.stop @mouseup.stop @wheel.stop> <div v-if="isFusion" class="opacity-slider-wrapper" @mousedown.stop @mousemove.stop @mouseup.stop @wheel.stop>
<div class="slider-title">{{ Math.round(fusionOpacity * 100) }}%</div> <div class="slider-title">{{ Math.round(fusionOpacity * 100) }}%</div>
<input type="range" min="0" max="1" step="0.05" v-model.number="fusionOpacity" @input="applyFusionOpacity" <input type="range" min="0" max="1" step="0.05" v-model.number="fusionOpacity" @input="applyFusionOpacity"
@ -282,9 +283,9 @@ export default {
} else if (upper) { } else if (upper) {
this.currentVoiUpper = upper this.currentVoiUpper = upper
} }
if (!upper) return if (!upper) return
const { windowWidth, windowCenter } = csUtils.windowLevel.toWindowLevel( const { windowWidth, windowCenter } = csUtils.windowLevel.toWindowLevel(
lower, lower,
upper upper
@ -590,7 +591,7 @@ export default {
if (!volumes.length) return if (!volumes.length) return
const camera = viewport.getCamera?.() const camera = viewport.getCamera?.()
const savedVoiUpper = this.currentVoiUpper const savedVoiUpper = this.currentVoiUpper
await viewport.setVolumes(volumes) await viewport.setVolumes(volumes)
@ -635,8 +636,8 @@ export default {
let { ct, data } = obj let { ct, data } = obj
this.series = { ...data } this.series = { ...data }
this.ctSeries = { ...ct } this.ctSeries = { ...ct }
await viewport.setVolumes(this.getFusionVolumes()) await viewport.setVolumes(this.getFusionVolumes())
} else { } else {
@ -694,13 +695,48 @@ export default {
const worldPoint = currentPoints.world const worldPoint = currentPoints.world
const renderingEngine = getRenderingEngine(this.renderingEngineId) const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewport = renderingEngine.getViewport(this.viewportId) const viewport = renderingEngine.getViewport(this.viewportId)
const imageData = viewport.getImageData() let referencedImageId = viewport.getCurrentImageId()
if (!imageData) return const data = viewport.getImageData()
const index = imageData.imageData.worldToIndex(worldPoint) if (!data) return
const { dimensions, imageData, metadata, voxelManager } = data
const index = imageData.worldToIndex(worldPoint)
index[0] = Math.floor(index[0]) index[0] = Math.floor(index[0])
index[1] = Math.floor(index[1]) index[1] = Math.floor(index[1])
index[2] = Math.floor(index[2]) index[2] = Math.floor(index[2])
this.mousePosition.index = index this.mousePosition.index = index
const modality = metadata.Modality
let ijk = csUtils.transformWorldToIndex(imageData, worldPoint)
ijk = vec3.round(ijk, ijk);
if (csUtils.indexWithinDimensions(ijk, dimensions)) {
this.isHandleOutsideImage = false
let value = voxelManager.getAtIJKPoint(ijk)
ijk[2] = viewport.getCurrentImageIdIndex()
let modalityUnit
if (modality === 'US') {
const calibratedResults = cornerstoneTools.utilities.getCalibratedProbeUnitsAndValue(image, [ijk])
const hasEnhancedRegionValues = calibratedResults.values.every(
(value) => value !== null
)
value = (hasEnhancedRegionValues ? calibratedResults.values : value)
modalityUnit = hasEnhancedRegionValues
? calibratedResults.units
: 'raw';
} else {
const scalingModule = referencedImageId && metaData.get('scalingModule', referencedImageId)
const isSuvScaled = typeof scalingModule?.suvbw === 'number'
const pixelUnitsOptions = {
isPreScaled: cornerstoneTools.utilities.viewport.isViewportPreScaled(viewport, referencedImageId),
isSuvScaled: isSuvScaled,
}
modalityUnit = cornerstoneTools.utilities.getPixelValueUnits(
modality,
referencedImageId,
pixelUnitsOptions
);
}
this.mousePosition.value = value
this.mousePosition.modalityUnit = modalityUnit
}
}, },
toggleTask(evt, visitTaskNum, i) { toggleTask(evt, visitTaskNum, i) {
this.$emit('activeViewport', this.viewportIndex) this.$emit('activeViewport', this.viewportIndex)
@ -897,7 +933,7 @@ export default {
padding: 10px; padding: 10px;
border-radius: 4px; border-radius: 4px;
width: 40px; width: 40px;
.slider-title { .slider-title {
font-size: 12px; font-size: 12px;
color: #ddd; color: #ddd;

View File

@ -309,7 +309,8 @@
<VolumeViewport :ref="`viewport-${index}`" :data-viewport-uid="`viewport-${index}`" <VolumeViewport :ref="`viewport-${index}`" :data-viewport-uid="`viewport-${index}`"
:rendering-engine-id="renderingEngineId" :viewport-id="`viewport-${index}`" :viewport-index="index" :rendering-engine-id="renderingEngineId" :viewport-id="`viewport-${index}`" :viewport-index="index"
@activeViewport="activeViewport" @toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD" @activeViewport="activeViewport" @toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD"
@renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" v-if="readingTool === 3" /> @renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" @setWwwc="setWwwc"
v-if="readingTool === 3" />
<Viewport :ref="`viewport-${index}`" :data-viewport-uid="`viewport-${index}`" <Viewport :ref="`viewport-${index}`" :data-viewport-uid="`viewport-${index}`"
:rendering-engine-id="renderingEngineId" :viewport-id="`viewport-${index}`" :viewport-index="index" :rendering-engine-id="renderingEngineId" :viewport-id="`viewport-${index}`" :viewport-index="index"
@activeViewport="activeViewport" @toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD" @activeViewport="activeViewport" @toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD"
@ -327,7 +328,7 @@
:rendering-engine-id="renderingEngineId" :viewport-id="`viewport-MPR-${index}`" :rendering-engine-id="renderingEngineId" :viewport-id="`viewport-MPR-${index}`"
:viewport-index="index" :MPRInfo="MPRInfo" @activeViewport="activeViewport" @setMPRInfo="setMPRInfo" :viewport-index="index" :MPRInfo="MPRInfo" @activeViewport="activeViewport" @setMPRInfo="setMPRInfo"
@toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD" @toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD"
@renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" /> @renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" @setWwwc="setWwwc" />
</div> </div>
</div> </div>
<div v-if="readingTool === 2" <div v-if="readingTool === 2"
@ -1607,6 +1608,7 @@ export default {
const taskIdx = this.visitTaskList.findIndex(i => i.VisitTaskId === taskId) const taskIdx = this.visitTaskList.findIndex(i => i.VisitTaskId === taskId)
if (taskIdx === -1) return if (taskIdx === -1) return
const annotations = this.visitTaskList[taskIdx].Annotations const annotations = this.visitTaskList[taskIdx].Annotations
console.log(annotations, 'annotations')
annotations.map(i => { annotations.map(i => {
if (i.MeasureData && !Object.hasOwn(i.MeasureData, 'isDicomReading')) { if (i.MeasureData && !Object.hasOwn(i.MeasureData, 'isDicomReading')) {
const annotation = i.MeasureData const annotation = i.MeasureData
@ -2511,7 +2513,14 @@ export default {
const viewport = renderingEngine.getViewport(viewportId) const viewport = renderingEngine.getViewport(viewportId)
this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].resetOrientationMarkers() this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].resetOrientationMarkers()
viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true }) viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
viewport.resetProperties() if (this.isMPR || this.readingTool === 3) {
let volume = cache.getVolume(this.$refs[viewportId][0].volumeId)
const voi = metaData.get('voiLutModule', volume._imageIds[Math.ceil((volume._imageIds.length - 1) / 2)])
this.setWwwc({ ww: voi.windowWidth[0], wc: voi.windowCenter[0] })
} else {
viewport.resetProperties()
}
viewport.render() viewport.render()
renderingEngine.render() renderingEngine.render()
}, },
@ -2606,6 +2615,11 @@ export default {
const viewport = renderingEngine.getViewport(viewportId) const viewport = renderingEngine.getViewport(viewportId)
if (v.val === -1) { if (v.val === -1) {
// //
if (this.isMPR || this.readingTool === 3) {
let volume = cache.getVolume(this.$refs[viewportId][0].volumeId)
const voi = metaData.get('voiLutModule', volume._imageIds[Math.ceil((volume._imageIds.length - 1) / 2)])
return this.setWwwc({ ww: voi.windowWidth[0], wc: voi.windowCenter[0] })
}
viewport.resetProperties() viewport.resetProperties()
viewport.render() viewport.render()
} else if (v.val === 0) { } else if (v.val === 0) {
@ -2631,7 +2645,7 @@ export default {
// //
setWwwc(v) { setWwwc(v) {
const renderingEngine = getRenderingEngine(renderingEngineId) const renderingEngine = getRenderingEngine(renderingEngineId)
const viewportId = `${this.viewportKey}-${this.activeViewportIndex}` const viewportId = v.id ? v.id : `${this.viewportKey}-${this.activeViewportIndex}`
const viewport = renderingEngine.getViewport(viewportId) const viewport = renderingEngine.getViewport(viewportId)
const lower = v.wc - v.ww / 2 const lower = v.wc - v.ww / 2
const upper = v.wc + v.ww / 2 - 1 const upper = v.wc + v.ww / 2 - 1

View File

@ -169,7 +169,7 @@
<div class="messageBox"> <div class="messageBox">
<el-popover placement="left" :title="item.SegmentLabel" width="200" trigger="hover"> <el-popover placement="left" :title="item.SegmentLabel" width="200" trigger="hover">
<div class="Bidirectionalbox"> <div class="Bidirectionalbox">
<div class="BidirectionalBtn" @click.stop="getBidirectional([item])" <div class="BidirectionalBtn" @click.stop="addTip(item)"
v-if="!item.bidirectional"> v-if="!item.bidirectional">
{{ $t('trials:reading:Segmentations:button:getBidirectional') }} {{ $t('trials:reading:Segmentations:button:getBidirectional') }}
</div> </div>
@ -450,6 +450,11 @@ export default {
this.actionConfiguration.contourBidirectional.data.segmentationId = segmentationId this.actionConfiguration.contourBidirectional.data.segmentationId = segmentationId
this.actionConfiguration.contourBidirectional.data.segmentIndex = segmentIndex this.actionConfiguration.contourBidirectional.data.segmentIndex = segmentIndex
}, },
addTip(item) {
this.calculateStatistics([item.segmentIndex], item.segmentationId, 'individual');
this.getBidirectional([item])
},
getBidirectional(list, DATA = null) { getBidirectional(list, DATA = null) {
list.forEach(item => { list.forEach(item => {
this.createSegmentConfiguration(item.segmentIndex, item.segmentationId); this.createSegmentConfiguration(item.segmentIndex, item.segmentationId);
@ -458,58 +463,57 @@ export default {
const renderingEngine = getRenderingEngine(this.renderingEngineId) const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewportId = `${this.viewportKey}-${this.activeViewportIndex}` const viewportId = `${this.viewportKey}-${this.activeViewportIndex}`
const viewport = renderingEngine.getViewport(viewportId); const viewport = renderingEngine.getViewport(viewportId);
this.$nextTick(() => { [viewport.element].forEach(async (element) => {
[viewport.element].forEach(async (element) => { const bidirectionalData =
const bidirectionalData = await CStUtils.segmentation.getSegmentLargestBidirectional({
await CStUtils.segmentation.getSegmentLargestBidirectional({ segmentationId: list[0].segmentationId,
segmentationId: list[0].segmentationId, segmentIndices: list.map(item => item.segmentIndex),
segmentIndices: list.map(item => item.segmentIndex),
});
if (bidirectionalData.length <= 0) {
list.forEach(item => {
let annotations = annotation.state.getAllAnnotations().filter(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex);
annotations.forEach(i => {
annotation.state.removeAnnotation(i.annotationUID)
})
item.bidirectional = null
})
this.resetViewport(false)
if (DATA) {
this.segmentationId = DATA.SegmentationId;
this.segmentIndex = DATA.SegmentMumber;
setTimeout(() => {
this.selectSegment(DATA)
})
}
}
bidirectionalData.forEach((bidirectional) => {
const { segmentIndex } = bidirectional;
const { majorAxis, minorAxis, maxMajor, maxMinor } = bidirectional;
let item = list.find(i => i.segmentIndex === segmentIndex)
SegmentBidirectionalTool.hydrate(viewportId, [majorAxis, minorAxis], {
segmentIndex,
segmentationId: item.segmentationId,
});
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === bidirectional.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
if (an) {
annotation.locking.setAnnotationLocked(an.annotationUID, true)
annotation.visibility.setAnnotationVisibility(an.annotationUID, item.bidirectionalView)
}
item.bidirectional = bidirectional
if (DATA) {
this.segmentationId = DATA.SegmentationId;
this.segmentIndex = DATA.SegmentMumber;
setTimeout(() => {
this.selectSegment(DATA)
})
}
// render the bidirectional tool data
}); });
console.log(bidirectionalData, 'bidirectionalData')
if (bidirectionalData.length <= 0) {
list.forEach(item => {
let annotations = annotation.state.getAllAnnotations().filter(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex);
annotations.forEach(i => {
annotation.state.removeAnnotation(i.annotationUID)
})
item.bidirectional = null
})
this.resetViewport(false)
if (DATA) {
this.segmentationId = DATA.SegmentationId;
this.segmentIndex = DATA.SegmentMumber;
setTimeout(() => {
this.selectSegment(DATA)
})
}
}
bidirectionalData.forEach((bidirectional) => {
const { segmentIndex } = bidirectional;
const { majorAxis, minorAxis, maxMajor, maxMinor } = bidirectional;
let item = list.find(i => i.segmentIndex === segmentIndex)
SegmentBidirectionalTool.hydrate(viewportId, [majorAxis, minorAxis], {
segmentIndex,
segmentationId: item.segmentationId,
});
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === bidirectional.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
if (an) {
annotation.locking.setAnnotationLocked(an.annotationUID, true)
annotation.visibility.setAnnotationVisibility(an.annotationUID, item.bidirectionalView)
}
item.bidirectional = bidirectional
if (DATA) {
this.segmentationId = DATA.SegmentationId;
this.segmentIndex = DATA.SegmentMumber;
setTimeout(() => {
this.selectSegment(DATA)
})
}
// render the bidirectional tool data
}); });
})
});
}, },
setToolActive(toolName) { setToolActive(toolName) {
if (this.segmentList.length <= 0) return false if (this.segmentList.length <= 0) return false
@ -560,7 +564,7 @@ export default {
async jumpBidirectional(item) { async jumpBidirectional(item) {
if (item.bidirectional) { if (item.bidirectional) {
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex && i.metadata.toolName === "SegmentBidirectional"); let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
// console.log(an, 'an') console.log(an, 'an')
if (!an) return false if (!an) return false
const renderingEngine = getRenderingEngine(this.renderingEngineId) const renderingEngine = getRenderingEngine(this.renderingEngineId)
@ -823,6 +827,7 @@ export default {
}, },
async customPrompt() { async customPrompt() {
try { try {
console.log(annotation.state.getAllAnnotations(), 'annotation.state.getAllAnnotations()')
const that = this const that = this
// //
let message = this.$t('trials:reading:Segmentations:message:rename') let message = this.$t('trials:reading:Segmentations:message:rename')
@ -986,7 +991,10 @@ export default {
metaData metaData
); );
group.segments.forEach((item, index) => { group.segments.forEach((item, index) => {
generatedSegmentation.dataset.SegmentSequence[index].SegmentNumber = item.segmentIndex.toString() if (generatedSegmentation.dataset.SegmentSequence[index]) {
generatedSegmentation.dataset.SegmentSequence[index].SegmentNumber = item.segmentIndex.toString()
}
}) })
if (!isFile) { if (!isFile) {
const buffer = Buffer.from(dcmjs.data.datasetToDict(generatedSegmentation.dataset).write()); const buffer = Buffer.from(dcmjs.data.datasetToDict(generatedSegmentation.dataset).write());
@ -1131,6 +1139,7 @@ export default {
if (toolName === 'ThresholdSphere') { if (toolName === 'ThresholdSphere') {
this.setDynamicRadius() this.setDynamicRadius()
} }
console.log(this.brushThreshold.dynamicRadius, 'this.brushThreshold.dynamicRadius')
}, },
setDynamicRadius() { setDynamicRadius() {
let volume = cache.getVolume(this.series.SeriesInstanceUid); let volume = cache.getVolume(this.series.SeriesInstanceUid);
@ -1182,7 +1191,7 @@ export default {
}, },
segmentationModifiedCallback(evt) { segmentationModifiedCallback(evt) {
const { detail } = evt; const { detail } = evt;
console.log(detail) // console.log(detail)
if (detail.segmentIndex === 0) { if (detail.segmentIndex === 0) {
this.drawing = true this.drawing = true
this.isDel = true this.isDel = true
@ -1200,7 +1209,7 @@ export default {
segmentIndices: indices, segmentIndices: indices,
mode, mode,
}); });
console.log(stats)
if (mode === 'individual') { if (mode === 'individual') {
const segmentStats = stats; const segmentStats = stats;
@ -1263,8 +1272,9 @@ export default {
annotation.state.removeAnnotation(i.annotationUID) annotation.state.removeAnnotation(i.annotationUID)
} }
}) })
this.getBidirectional(segmentGroup.segments)
this.calculateStatistics(segmentIndexs, this.segmentationId, 'individual'); this.calculateStatistics(segmentIndexs, this.segmentationId, 'individual');
this.getBidirectional(segmentGroup.segments)
} }
} }

View File

@ -180,6 +180,7 @@ export default {
// resizeObserver.observe(this.element) // resizeObserver.observe(this.element)
this.element.addEventListener("CORNERSTONE_VOLUME_NEW_IMAGE", this.stackNewImage) this.element.addEventListener("CORNERSTONE_VOLUME_NEW_IMAGE", this.stackNewImage)
this.element.addEventListener('CORNERSTONE_VOI_MODIFIED', this.voiModified) this.element.addEventListener('CORNERSTONE_VOI_MODIFIED', this.voiModified)
this.element.addEventListener('CORNERSTONE_IMAGE_RENDERED', this.imageRendered)
this.element.addEventListener('wheel', (e) => { this.element.addEventListener('wheel', (e) => {
console.log('CORNERSTONE_STACK_VIEWPORT_SCROLL') console.log('CORNERSTONE_STACK_VIEWPORT_SCROLL')
const renderingEngine = getRenderingEngine(this.renderingEngineId) const renderingEngine = getRenderingEngine(this.renderingEngineId)
@ -274,8 +275,6 @@ export default {
let imageId = imageIds[detail.imageIndex] let imageId = imageIds[detail.imageIndex]
if (imageId) { if (imageId) {
const imagePlaneModule = metaData.get('imagePlaneModule', imageId) const imagePlaneModule = metaData.get('imagePlaneModule', imageId)
// const voi = metaData.get('voiLutModule', imageId)
// console.log(voi, 'voi')
this.imageInfo.imageOrientationPatient = imagePlaneModule.imageOrientationPatient this.imageInfo.imageOrientationPatient = imagePlaneModule.imageOrientationPatient
this.imageInfo.imagePositionPatient = imagePlaneModule.imagePositionPatient this.imageInfo.imagePositionPatient = imagePlaneModule.imagePositionPatient
this.imageInfo.size = `${imagePlaneModule.columns}*${imagePlaneModule.rows}` this.imageInfo.size = `${imagePlaneModule.columns}*${imagePlaneModule.rows}`
@ -326,6 +325,22 @@ export default {
this.$emit('upperRangeChange', Math.round(windowWidth)) this.$emit('upperRangeChange', Math.round(windowWidth))
} }
}, },
imageRendered(e) {
const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewport = renderingEngine.getViewport(this.viewportId)
const properties = viewport.getProperties()
if (properties && properties.voiRange) {
var { lower, upper } = properties.voiRange
const { windowWidth, windowCenter } = csUtils.windowLevel.toWindowLevel(
lower,
upper
)
this.imageInfo.wwwc = `${Math.round(windowWidth)}/${Math.round(windowCenter)}`
}
const zoom = viewport.getZoom()
this.imageInfo.zoom = zoom.toFixed(4)
},
getOrientationMarker() { getOrientationMarker() {
const renderingEngine = getRenderingEngine(this.renderingEngineId) const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewport = renderingEngine.getViewport(this.viewportId) const viewport = renderingEngine.getViewport(this.viewportId)
@ -508,7 +523,10 @@ export default {
} }
console.log("渲染成功") console.log("渲染成功")
} }
}]).then(res => { }]).then(r => {
const voi = metaData.get('voiLutModule', res.volume._imageIds[Math.ceil((res.volume._imageIds.length - 1) / 2)])
this.$emit('setWwwc', { ww: voi.windowWidth[0], wc: voi.windowCenter[0], id: this.viewportId })
// console.log(viewport.getSlabThickness(), 'getSlabThickness')
if (data.segment) { if (data.segment) {
return DicomEvent.$emit("isloaded", { segment: data.segment }) return DicomEvent.$emit("isloaded", { segment: data.segment })
} }
@ -528,13 +546,50 @@ export default {
const worldPoint = currentPoints.world const worldPoint = currentPoints.world
const renderingEngine = getRenderingEngine(this.renderingEngineId) const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewport = renderingEngine.getViewport(this.viewportId) const viewport = renderingEngine.getViewport(this.viewportId)
const imageData = viewport.getImageData() let referencedImageId = viewport.getCurrentImageId()
if (!imageData) return const data = viewport.getImageData()
const index = imageData.imageData.worldToIndex(worldPoint) if (!data) return
const { dimensions, imageData, metadata, voxelManager } = data
const index = imageData.worldToIndex(worldPoint)
index[0] = Math.floor(index[0]) index[0] = Math.floor(index[0])
index[1] = Math.floor(index[1]) index[1] = Math.floor(index[1])
index[2] = Math.floor(index[2]) index[2] = Math.floor(index[2])
this.mousePosition.index = index this.mousePosition.index = index
const modality = metadata.Modality
let ijk = csUtils.transformWorldToIndex(imageData, worldPoint)
ijk = vec3.round(ijk, ijk);
if (csUtils.indexWithinDimensions(ijk, dimensions)) {
this.isHandleOutsideImage = false
let value = voxelManager.getAtIJKPoint(ijk)
ijk[2] = viewport.getCurrentImageIdIndex()
let modalityUnit
if (modality === 'US') {
const calibratedResults = cornerstoneTools.utilities.getCalibratedProbeUnitsAndValue(image, [ijk])
const hasEnhancedRegionValues = calibratedResults.values.every(
(value) => value !== null
)
value = (hasEnhancedRegionValues ? calibratedResults.values : value)
modalityUnit = hasEnhancedRegionValues
? calibratedResults.units
: 'raw';
} else {
const scalingModule = referencedImageId && metaData.get('scalingModule', referencedImageId)
const isSuvScaled = typeof scalingModule?.suvbw === 'number'
if (scalingModule && scalingModule.suvbw) {
const pixelUnitsOptions = {
isPreScaled: cornerstoneTools.utilities.viewport.isViewportPreScaled(viewport, referencedImageId),
isSuvScaled: isSuvScaled,
}
modalityUnit = cornerstoneTools.utilities.getPixelValueUnits(
modality,
referencedImageId,
pixelUnitsOptions
);
}
}
this.mousePosition.value = value
this.mousePosition.modalityUnit = modalityUnit
}
}, },
toggleTask(evt, visitTaskNum, i) { toggleTask(evt, visitTaskNum, i) {
this.$emit('activeViewport', this.viewportIndex) this.$emit('activeViewport', this.viewportIndex)