Compare commits
2 Commits
00c5570692
...
72b1a3906d
| Author | SHA1 | Date |
|---|---|---|
|
|
72b1a3906d | |
|
|
06794447ec |
|
|
@ -17,7 +17,7 @@
|
||||||
<div
|
<div
|
||||||
v-else
|
v-else
|
||||||
class="dicom-desc"
|
class="dicom-desc"
|
||||||
style="width: 150px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"
|
style="width: 135px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<div style="text-overflow: ellipsis;overflow: hidden;" v-if="!study.StudyName">
|
<div style="text-overflow: ellipsis;overflow: hidden;" v-if="!study.StudyName">
|
||||||
|
|
@ -32,7 +32,37 @@
|
||||||
<div>{{ study.Modalities }} ({{ study.SeriesCount }})</div>
|
<div>{{ study.Modalities }} ({{ study.SeriesCount }})</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="text-overflow: ellipsis;overflow: hidden;" :title="study.Description">{{ study.Description }}</div>
|
<div style="text-overflow: ellipsis;overflow: hidden;" :title="study.Description">{{ study.Description }}</div>
|
||||||
|
<div class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)">
|
||||||
|
<el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper">
|
||||||
|
<h4>{{ $t('trials:ptData:title') }}</h4>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:patientSex') }}</label>
|
||||||
|
<span>{{ study.PatientSex }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:patientWeight') }}</label>
|
||||||
|
<span>{{ study.PatientWeight }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:totalDose') }}</label>
|
||||||
|
<span>{{ study.RadionuclideTotalDose }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:halfLife') }}</label>
|
||||||
|
<span>{{ study.RadionuclideHalfLife }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:injectTime') }}</label>
|
||||||
|
<span>{{ study.RadiopharmaceuticalStartTime }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:acquisitionTime') }}</label>
|
||||||
|
<span>{{ study.AcquisitionTime }}</span>
|
||||||
|
</div>
|
||||||
|
<i slot="reference" class="el-icon-document"
|
||||||
|
style="font-size: 15px;cursor: pointer;color: #f5f7fa;" />
|
||||||
|
</el-popover>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -99,37 +129,7 @@
|
||||||
<el-tooltip class="item" effect="dark" :content="series.description" placement="right">
|
<el-tooltip class="item" effect="dark" :content="series.description" placement="right">
|
||||||
<div style="">{{ series.description }}</div>
|
<div style="">{{ series.description }}</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<div class="patient-info" style="position: absolute;right: 0;top: 30px;" v-if="['PT','PET'].includes(series.modality)">
|
|
||||||
<el-popover placement="right" trigger="hover" popper-class="patient-info-popper">
|
|
||||||
<h4>{{ $t('trials:ptData:title') }}</h4>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:patientSex') }}</label>
|
|
||||||
<span>{{ study.PatientSex }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:patientWeight') }}</label>
|
|
||||||
<span>{{ study.PatientWeight }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:totalDose') }}</label>
|
|
||||||
<span>{{ study.RadionuclideTotalDose }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:halfLife') }}</label>
|
|
||||||
<span>{{ study.RadionuclideHalfLife }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:injectTime') }}</label>
|
|
||||||
<span>{{ study.RadiopharmaceuticalStartTime }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:acquisitionTime') }}</label>
|
|
||||||
<span>{{ study.AcquisitionTime }}</span>
|
|
||||||
</div>
|
|
||||||
<i slot="reference" class="el-icon-document"
|
|
||||||
style="font-size: 15px;cursor: pointer;color: #f5f7fa;" />
|
|
||||||
</el-popover>
|
|
||||||
</div>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p v-show="series.sliceThickness && !study.IsCriticalSequence">
|
<p v-show="series.sliceThickness && !study.IsCriticalSequence">
|
||||||
|
|
@ -1140,6 +1140,10 @@ export default {
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
.patient-info {
|
||||||
|
// display: inline-block;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
.patient-info-popper {
|
.patient-info-popper {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
|
||||||
|
|
@ -41,10 +41,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">
|
||||||
|
|
@ -120,10 +120,6 @@ export default {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
isMPR: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
actionConfiguration: {
|
actionConfiguration: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => {
|
default: () => {
|
||||||
|
|
@ -231,7 +227,6 @@ export default {
|
||||||
})
|
})
|
||||||
DicomEvent.$on('renderSegmentation', async (viewportId) => {
|
DicomEvent.$on('renderSegmentation', async (viewportId) => {
|
||||||
// if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false
|
// if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false
|
||||||
if (!this.isMPR) return false
|
|
||||||
if (this.viewportId !== viewportId) return false
|
if (this.viewportId !== viewportId) return false
|
||||||
await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration, this.segmentationId, this.segmentIndex)
|
await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration, this.segmentationId, this.segmentIndex)
|
||||||
})
|
})
|
||||||
|
|
@ -256,7 +251,6 @@ export default {
|
||||||
},
|
},
|
||||||
SegmentConfig: {
|
SegmentConfig: {
|
||||||
handler() {
|
handler() {
|
||||||
if (!this.isMPR) return false
|
|
||||||
if (!this.segmentationId) return false
|
if (!this.segmentationId) return false
|
||||||
if (!this.series.TaskInfo) return false
|
if (!this.series.TaskInfo) return false
|
||||||
readingSegmentByConfig(this.series, this.series.TaskInfo, this.viewportId, this.segmentationId, this.SegmentConfig)
|
readingSegmentByConfig(this.series, this.series.TaskInfo, this.viewportId, this.segmentationId, this.SegmentConfig)
|
||||||
|
|
@ -264,13 +258,11 @@ export default {
|
||||||
deep: true
|
deep: true
|
||||||
},
|
},
|
||||||
segmentIndex() {
|
segmentIndex() {
|
||||||
if (!this.isMPR) return false
|
|
||||||
if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false
|
if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false
|
||||||
if (this.segmentIndex <= 0) return false
|
if (this.segmentIndex <= 0) return false
|
||||||
selectSegment(this.viewportId, this.segmentationId, this.segmentIndex)
|
selectSegment(this.viewportId, this.segmentationId, this.segmentIndex)
|
||||||
},
|
},
|
||||||
segmentationId() {
|
segmentationId() {
|
||||||
if (!this.isMPR) return false
|
|
||||||
if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false
|
if (this.curSegSeries.Id !== this.series.Id || this.curSegSeries.VisitTaskId !== this.series.VisitTaskId) return false
|
||||||
if (!this.segmentationId) return false
|
if (!this.segmentationId) return false
|
||||||
selectSegmentation(this.viewportId, this.segmentationId)
|
selectSegmentation(this.viewportId, this.segmentationId)
|
||||||
|
|
@ -673,11 +665,8 @@ export default {
|
||||||
renderingEngine.render()
|
renderingEngine.render()
|
||||||
}, 100)
|
}, 100)
|
||||||
}
|
}
|
||||||
if (this.isMPR) {
|
await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration, this.segmentationId, this.segmentIndex)
|
||||||
await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, null, this.actionConfiguration, this.segmentationId, this.segmentIndex)
|
DicomEvent.$emit('SegmentationLoading', this.viewportId)
|
||||||
DicomEvent.$emit('SegmentationLoading', this.viewportId)
|
|
||||||
}
|
|
||||||
|
|
||||||
let volume = cache.getVolume(this.volumeId)
|
let volume = cache.getVolume(this.volumeId)
|
||||||
// console.log(volume, 'volume')
|
// console.log(volume, 'volume')
|
||||||
if (this.series.orientation === 'AXIAL' && this.series.curIndex) return this.setFullScreen(this.series.curIndex)
|
if (this.series.orientation === 'AXIAL' && this.series.curIndex) return this.setFullScreen(this.series.curIndex)
|
||||||
|
|
|
||||||
|
|
@ -344,7 +344,7 @@
|
||||||
:viewport-index="index" :histogramVisible="histogramVisible"
|
:viewport-index="index" :histogramVisible="histogramVisible"
|
||||||
:actionConfiguration="actionConfiguration" :SegmentConfig="SegmentConfig"
|
:actionConfiguration="actionConfiguration" :SegmentConfig="SegmentConfig"
|
||||||
:segmentationId.sync="segId" :segmentIndex.sync="segIndex" :curSegSeries.sync="curSegSeries"
|
:segmentationId.sync="segId" :segmentIndex.sync="segIndex" :curSegSeries.sync="curSegSeries"
|
||||||
:isMPR="isMPR" :MPRInfo="MPRInfo" @activeViewport="activeViewport" @setMPRInfo="setMPRInfo"
|
:MPRInfo="MPRInfo" @activeViewport="activeViewport" @setMPRInfo="setMPRInfo"
|
||||||
@toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD"
|
@toggleTaskByViewport="toggleTaskByViewport" @previewCD="previewCD"
|
||||||
@renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup"
|
@renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup"
|
||||||
@resetHistogram="resetHistogram" v-resize="(e) => handleSizeChange(e, `viewport-MPR-${index}`)" />
|
@resetHistogram="resetHistogram" v-resize="(e) => handleSizeChange(e, `viewport-MPR-${index}`)" />
|
||||||
|
|
@ -1052,6 +1052,7 @@ export default {
|
||||||
let imageId = imageIds[0]
|
let imageId = imageIds[0]
|
||||||
const imagePixelModule = metaData.get('imagePixelModule', imageId);
|
const imagePixelModule = metaData.get('imagePixelModule', imageId);
|
||||||
const photometricInterpretation = imagePixelModule?.photometricInterpretation;
|
const photometricInterpretation = imagePixelModule?.photometricInterpretation;
|
||||||
|
console.log(photometricInterpretation, 'photometricInterpretation')
|
||||||
if (photometricInterpretation && photometricInterpretation !== 'MONOCHROME1' && photometricInterpretation !== 'MONOCHROME2') return this.$confirm(this.$t('trials:histogram:confirm:photometricInterpretationNotSupported'))
|
if (photometricInterpretation && photometricInterpretation !== 'MONOCHROME1' && photometricInterpretation !== 'MONOCHROME2') return this.$confirm(this.$t('trials:histogram:confirm:photometricInterpretationNotSupported'))
|
||||||
this.histogramVisible = true
|
this.histogramVisible = true
|
||||||
this.setToolsPassive()
|
this.setToolsPassive()
|
||||||
|
|
|
||||||
|
|
@ -163,8 +163,7 @@
|
||||||
<i class="el-icon-warning-outline" style="color:red;margin-right: 5px;"
|
<i class="el-icon-warning-outline" style="color:red;margin-right: 5px;"
|
||||||
:title="$t('trials:reading:Segmentations:tip:segmentationIsNotSave')"
|
:title="$t('trials:reading:Segmentations:tip:segmentationIsNotSave')"
|
||||||
v-if="!curSegmentGroup.isSaved"></i>
|
v-if="!curSegmentGroup.isSaved"></i>
|
||||||
<el-button type="success" size="small"
|
<el-button type="success" size="small" :disabled="saveLoading || isMPR"
|
||||||
:disabled="saveLoading || isMPR || curSegmentGroup.isSaved"
|
|
||||||
@click="saveSegmentGroup([curSegmentGroup])">
|
@click="saveSegmentGroup([curSegmentGroup])">
|
||||||
{{ $t("trials:reading:Segmentations:button:save") }}
|
{{ $t("trials:reading:Segmentations:button:save") }}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
@ -187,34 +186,21 @@
|
||||||
<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="addTip(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>
|
||||||
<template>
|
<template v-else>
|
||||||
<div class="num">
|
<div class="num">
|
||||||
<span>L: {{
|
<span>L:{{ Number(item.bidirectional.maxMajor).toFixed(2) }} mm</span>
|
||||||
item.bidirectional && item.bidirectional.maxMajor
|
<span>S:{{ Number(item.bidirectional.maxMinor).toFixed(2) }} mm</span>
|
||||||
? Number(item.bidirectional.maxMajor).toFixed(2) : ' '
|
|
||||||
}} mm</span>
|
|
||||||
<span>S: {{
|
|
||||||
item.bidirectional && item.bidirectional.maxMinor
|
|
||||||
? Number(item.bidirectional.maxMinor).toFixed(2) : ' '
|
|
||||||
}} mm</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="btnBox">
|
<div class="btnBox">
|
||||||
<svg-icon :icon-class="!item.bidirectionalView ? 'eye' : 'eye-open'"
|
<svg-icon :icon-class="!item.bidirectionalView ? 'eye' : 'eye-open'"
|
||||||
style="color:#000;margin-right: 5px;cursor: pointer;"
|
style="color:#000;margin-right: 5px;cursor: pointer;"
|
||||||
@click.stop="viewBidirectional([item], !item.bidirectionalView)"
|
@click.stop="viewBidirectional([item], !item.bidirectionalView)" />
|
||||||
:title="!item.bidirectionalView ? $t('trials:reading:Segmentations:button:eye') : $t('trials:reading:Segmentations:button:eye-open')"
|
|
||||||
v-if="item.bidirectional" />
|
|
||||||
<svg-icon icon-class="jumpto" style="color:#000;cursor: pointer;"
|
<svg-icon icon-class="jumpto" style="color:#000;cursor: pointer;"
|
||||||
:title="$t('trials:reading:Segmentations:button:jumpto')"
|
@click.stop="jumpBidirectional(item)" />
|
||||||
@click.stop="jumpBidirectional(item)" v-if="item.bidirectional" />
|
|
||||||
<i class="el-icon-plus" style="color:#000;cursor: pointer;"
|
|
||||||
v-if="!item.bidirectional"
|
|
||||||
:title="$t('trials:reading:Segmentations:button:getBidirectional')"
|
|
||||||
@click.stop="addTip(item)" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -267,8 +253,7 @@
|
||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
<div class="saveBtnBox" v-if="readingTaskState < 2 && segmentList && segmentList.length > 1">
|
<div class="saveBtnBox" v-if="readingTaskState < 2 && segmentList && segmentList.length > 1">
|
||||||
<el-button type="success" size="small" :disabled="saveLoading || isMPR || curSegmentGroup.isSaved"
|
<el-button type="success" size="small" :disabled="saveLoading || isMPR" @click="saveSegmentGroup()">
|
||||||
@click="saveSegmentGroup()">
|
|
||||||
{{ $t("trials:reading:Segmentations:button:saveAll") }}
|
{{ $t("trials:reading:Segmentations:button:saveAll") }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,37 @@
|
||||||
<span :title="study.Modalities">{{ `${study.Modalities} (${study.SeriesCount})` }}</span>
|
<span :title="study.Modalities">{{ `${study.Modalities} (${study.SeriesCount})` }}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
<div class="patient-info" v-if="['PT、CT', 'CT、PT', 'PET-CT'].includes(study.Modalities)">
|
||||||
|
<el-popover placement="right-start" trigger="hover" popper-class="patient-info-popper">
|
||||||
|
<h4>{{ $t('trials:ptData:title') }}</h4>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:patientSex') }}</label>
|
||||||
|
<span>{{ study.PatientSex }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:patientWeight') }}</label>
|
||||||
|
<span>{{ study.PatientWeight }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:totalDose') }}</label>
|
||||||
|
<span>{{ study.RadionuclideTotalDose }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:halfLife') }}</label>
|
||||||
|
<span>{{ study.RadionuclideHalfLife }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:injectTime') }}</label>
|
||||||
|
<span>{{ study.RadiopharmaceuticalStartTime }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="patient-info-row">
|
||||||
|
<label>{{ $t('trials:ptData:label:acquisitionTime') }}</label>
|
||||||
|
<span>{{ study.AcquisitionTime }}</span>
|
||||||
|
</div>
|
||||||
|
<i slot="reference" class="el-icon-document"
|
||||||
|
style="font-size: 15px;cursor: pointer;color: #f5f7fa;" />
|
||||||
|
</el-popover>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
|
|
@ -74,41 +105,9 @@
|
||||||
#{{ series.SeriesNumber }}
|
#{{ series.SeriesNumber }}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div v-if="series.Description" class="text-desc" :title="series.Description"
|
<div v-if="series.Description" class="text-desc" :title="series.Description">
|
||||||
style="position: relative;">
|
|
||||||
{{ series.Description }}
|
{{ series.Description }}
|
||||||
<div class="patient-info" style="position: absolute;right: 0;top: 0;"
|
|
||||||
v-if="['PT', 'PET'].includes(series.Modality)">
|
|
||||||
<el-popover placement="right" trigger="hover" popper-class="patient-info-popper">
|
|
||||||
<h4>{{ $t('trials:ptData:title') }}</h4>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:patientSex') }}</label>
|
|
||||||
<span>{{ study.PatientSex }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:patientWeight') }}</label>
|
|
||||||
<span>{{ study.PatientWeight }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:totalDose') }}</label>
|
|
||||||
<span>{{ study.RadionuclideTotalDose }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:halfLife') }}</label>
|
|
||||||
<span>{{ study.RadionuclideHalfLife }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:injectTime') }}</label>
|
|
||||||
<span>{{ study.RadiopharmaceuticalStartTime }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="patient-info-row">
|
|
||||||
<label>{{ $t('trials:ptData:label:acquisitionTime') }}</label>
|
|
||||||
<span>{{ study.AcquisitionTime }}</span>
|
|
||||||
</div>
|
|
||||||
<i slot="reference" class="el-icon-document"
|
|
||||||
style="font-size: 15px;cursor: pointer;color: #f5f7fa;" />
|
|
||||||
</el-popover>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div v-if="series.SliceThickness && !study.IsCriticalSequence" class="text-desc">
|
<div v-if="series.SliceThickness && !study.IsCriticalSequence" class="text-desc">
|
||||||
T: {{ parseFloat(series.SliceThickness).toFixed(digitPlaces) }}
|
T: {{ parseFloat(series.SliceThickness).toFixed(digitPlaces) }}
|
||||||
|
|
@ -200,9 +199,6 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
activeSeries(series, seriesIndex, studyIndex) {
|
activeSeries(series, seriesIndex, studyIndex) {
|
||||||
const photometricInterpretation = series?.InstanceInfoList[0]?.PhotometricInterpretation;
|
|
||||||
if (!photometricInterpretation || (photometricInterpretation !== 'MONOCHROME1' && photometricInterpretation !== 'MONOCHROME2'))
|
|
||||||
return this.$confirm(this.$t('trials:histogram:confirm:activeSeriesPhotometricInterpretationNotSupported'))
|
|
||||||
this.activeStudyIndex = studyIndex
|
this.activeStudyIndex = studyIndex
|
||||||
this.activeSeriesIndex = seriesIndex
|
this.activeSeriesIndex = seriesIndex
|
||||||
this.$emit('activeSeries', series)
|
this.$emit('activeSeries', series)
|
||||||
|
|
@ -267,6 +263,10 @@ export default {
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
.patient-info {
|
||||||
|
// display: inline-block;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
.patient-info-popper {
|
.patient-info-popper {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
@ -291,7 +291,7 @@ export default {
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.patient-info-popper .patient-info-row+.patient-info-row {
|
.patient-info-popper .patient-info-row + .patient-info-row {
|
||||||
margin-top: 4px;
|
margin-top: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -299,6 +299,7 @@ export default {
|
||||||
color: #bbb;
|
color: #bbb;
|
||||||
// font-weight: 600;
|
// font-weight: 600;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
// text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.patient-info-popper span {
|
.patient-info-popper span {
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,6 @@ async function loadSegmentation(arrayBuffer, series, segmentationId) {
|
||||||
})
|
})
|
||||||
const megmentGroup =
|
const megmentGroup =
|
||||||
segmentation.state.getSegmentation(segmentationId);
|
segmentation.state.getSegmentation(segmentationId);
|
||||||
if (!megmentGroup) return false
|
|
||||||
const { imageIds } = megmentGroup.representationData.Labelmap;
|
const { imageIds } = megmentGroup.representationData.Labelmap;
|
||||||
const derivedSegmentationImages = imageIds.map(imageId =>
|
const derivedSegmentationImages = imageIds.map(imageId =>
|
||||||
cache.getImage(imageId)
|
cache.getImage(imageId)
|
||||||
|
|
@ -227,11 +226,10 @@ async function readingSegmentByConfig(series, visitInfo, viewportId, segmentatio
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
function selectSegmentation(viewportId, segmentationId) {
|
function selectSegmentation(viewportId, segmentationId) {
|
||||||
if (!segmentation.state.getSegmentation(segmentationId)) return false
|
|
||||||
segmentation.activeSegmentation.setActiveSegmentation(viewportId, segmentationId)
|
segmentation.activeSegmentation.setActiveSegmentation(viewportId, segmentationId)
|
||||||
}
|
}
|
||||||
function selectSegment(viewportId, segmentationId, segmentIndex) {
|
function selectSegment(viewportId, segmentationId, segmentIndex) {
|
||||||
if (!segmentIndex || !segmentationId || !segmentation.state.getSegmentation(segmentationId)) return false
|
if (!segmentIndex || !segmentationId) return false
|
||||||
selectSegmentation(viewportId, segmentationId)
|
selectSegmentation(viewportId, segmentationId)
|
||||||
segmentation.segmentIndex.setActiveSegmentIndex(segmentationId, segmentIndex);
|
segmentation.segmentIndex.setActiveSegmentIndex(segmentationId, segmentIndex);
|
||||||
}
|
}
|
||||||
|
|
@ -356,66 +354,63 @@ async function renderSegmentation(series, visitInfo, viewportId, SegmentConfig,
|
||||||
PageSize: 9999,
|
PageSize: 9999,
|
||||||
PageIndex: 1,
|
PageIndex: 1,
|
||||||
}
|
}
|
||||||
setTimeout(async () => {
|
let res = await getSegmentationList(data);
|
||||||
let res = await getSegmentationList(data);
|
if (res.IsSuccess) {
|
||||||
if (res.IsSuccess) {
|
let list = res.Result.CurrentPageData;
|
||||||
let list = res.Result.CurrentPageData;
|
for (let i = 0; i < list.length; i++) {
|
||||||
for (let i = 0; i < list.length; i++) {
|
let item = list[i]
|
||||||
let item = list[i]
|
if (!segmentationId) segmentationId = item.Id
|
||||||
if (!segmentationId) segmentationId = item.Id
|
await createSegmentation(viewportId, series.SeriesInstanceUid, item.Id)
|
||||||
await createSegmentation(viewportId, series.SeriesInstanceUid, item.Id)
|
if (item.SEGUrl) await readSegmentation(item.SEGUrl, series, item.Id)
|
||||||
if (item.SEGUrl) await readSegmentation(item.SEGUrl, series, item.Id)
|
createSegmentationRepresentation(viewportId, item.Id)
|
||||||
createSegmentationRepresentation(viewportId, item.Id)
|
if (!viewportInfo[viewportId]) {
|
||||||
if (!viewportInfo[viewportId]) {
|
viewportInfo[viewportId] = [item.Id]
|
||||||
viewportInfo[viewportId] = [item.Id]
|
} else {
|
||||||
} else {
|
viewportInfo[viewportId].push(item.Id)
|
||||||
viewportInfo[viewportId].push(item.Id)
|
}
|
||||||
}
|
let params = {
|
||||||
let params = {
|
SegmentationId: item.Id,
|
||||||
SegmentationId: item.Id,
|
PageSize: 9999,
|
||||||
PageSize: 9999,
|
PageIndex: 1,
|
||||||
PageIndex: 1,
|
}
|
||||||
}
|
let r = await getSegmentList(params)
|
||||||
let r = await getSegmentList(params)
|
if (r.IsSuccess) {
|
||||||
if (r.IsSuccess) {
|
let segments = r.Result.CurrentPageData
|
||||||
let segments = r.Result.CurrentPageData
|
segments.forEach(s => {
|
||||||
segments.forEach(s => {
|
if (!segmentIndex) segmentIndex = s.SegmentNumber
|
||||||
if (!segmentIndex) segmentIndex = s.SegmentNumber
|
let SegmentJson = s.SegmentJson ? JSON.parse(s.SegmentJson) : {};
|
||||||
let SegmentJson = s.SegmentJson ? JSON.parse(s.SegmentJson) : {};
|
segmentation.segmentIndex.setActiveSegmentIndex(s.SegmentationId, s.SegmentNumber);
|
||||||
segmentation.segmentIndex.setActiveSegmentIndex(s.SegmentationId, s.SegmentNumber);
|
segmentation.config.color.setSegmentIndexColor(viewportId, s.SegmentationId, s.SegmentNumber, hex2Rgb(s.ColorRgb))
|
||||||
segmentation.config.color.setSegmentIndexColor(viewportId, s.SegmentationId, s.SegmentNumber, hex2Rgb(s.ColorRgb))
|
segmentation.segmentLocking.setSegmentIndexLocked(s.SegmentationId, s.SegmentNumber, s.IsLock)
|
||||||
segmentation.segmentLocking.setSegmentIndexLocked(s.SegmentationId, s.SegmentNumber, s.IsLock)
|
if (SegmentJson.bidirectional) {
|
||||||
if (SegmentJson.bidirectional) {
|
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === s.SegmentationId && i.metadata.segmentIndex === SegmentJson.bidirectional.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
|
||||||
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === s.SegmentationId && i.metadata.segmentIndex === SegmentJson.bidirectional.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
|
if (!an) {
|
||||||
if (!an) {
|
let { majorAxis, minorAxis } = SegmentJson.bidirectional
|
||||||
let { majorAxis, minorAxis } = SegmentJson.bidirectional
|
// createSegmentConfiguration(s.SegmentNumber, s.SegmentationId, viewportId, actionConfiguration)
|
||||||
// createSegmentConfiguration(s.SegmentNumber, s.SegmentationId, viewportId, actionConfiguration)
|
SegmentBidirectionalTool.hydrate(viewportId, [majorAxis, minorAxis], {
|
||||||
SegmentBidirectionalTool.hydrate(viewportId, [majorAxis, minorAxis], {
|
segmentIndex: s.SegmentNumber,
|
||||||
segmentIndex: s.SegmentNumber,
|
segmentationId: s.SegmentationId,
|
||||||
segmentationId: s.SegmentationId,
|
})
|
||||||
})
|
|
||||||
}
|
|
||||||
an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === s.SegmentationId && i.metadata.segmentIndex === SegmentJson.bidirectional.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
|
|
||||||
if (an) {
|
|
||||||
annotation.locking.setAnnotationLocked(an.annotationUID, true)
|
|
||||||
annotation.visibility.setAnnotationVisibility(an.annotationUID, true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === s.SegmentationId && i.metadata.segmentIndex === SegmentJson.bidirectional.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
|
||||||
|
if (an) {
|
||||||
|
annotation.locking.setAnnotationLocked(an.annotationUID, true)
|
||||||
|
annotation.visibility.setAnnotationVisibility(an.annotationUID, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if (segmentationId && segmentIndex) {
|
if (segmentationId && segmentIndex) {
|
||||||
selectSegment(viewportId, segmentationId, segmentIndex)
|
selectSegment(viewportId, segmentationId, segmentIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Segment) {
|
if (Segment) {
|
||||||
jumpBidirectional(Segment, viewportId, series.SeriesInstanceUid)
|
jumpBidirectional(Segment, viewportId, series.SeriesInstanceUid)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
readingSegmentByConfig(series, visitInfo, viewportId, segmentationId, SegmentConfig)
|
}
|
||||||
}, 500)
|
readingSegmentByConfig(series, visitInfo, viewportId, segmentationId, SegmentConfig)
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -221,7 +221,6 @@ export default {
|
||||||
Object.keys(this.seriesData).forEach(key => {
|
Object.keys(this.seriesData).forEach(key => {
|
||||||
if (key !== 'default' || this.isNeedDefault) seriesData.push(this.seriesData[key])
|
if (key !== 'default' || this.isNeedDefault) seriesData.push(this.seriesData[key])
|
||||||
})
|
})
|
||||||
seriesData = this.formatSeriesData(seriesData)
|
|
||||||
this.chart.clear();
|
this.chart.clear();
|
||||||
const option = {
|
const option = {
|
||||||
useUTC: true,
|
useUTC: true,
|
||||||
|
|
@ -288,27 +287,6 @@ export default {
|
||||||
};
|
};
|
||||||
this.chart.setOption(option);
|
this.chart.setOption(option);
|
||||||
},
|
},
|
||||||
formatSeriesData(seriesData) {
|
|
||||||
let arr = []
|
|
||||||
seriesData.forEach(serie => {
|
|
||||||
serie.data.forEach(item => {
|
|
||||||
if (!arr.includes(item[0])) arr.push(item[0])
|
|
||||||
})
|
|
||||||
})
|
|
||||||
arr = arr.sort((a, b) => a - b)
|
|
||||||
seriesData.forEach(serie => {
|
|
||||||
let data = []
|
|
||||||
arr.forEach(item => {
|
|
||||||
if (serie.objKey[item]) {
|
|
||||||
data.push([item, serie.objKey[item]])
|
|
||||||
} else {
|
|
||||||
data.push([item, 0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
serie.data = data
|
|
||||||
})
|
|
||||||
return seriesData
|
|
||||||
},
|
|
||||||
async generateData(annotation) {
|
async generateData(annotation) {
|
||||||
var seriesData = [];
|
var seriesData = [];
|
||||||
var min = null;
|
var min = null;
|
||||||
|
|
@ -319,8 +297,10 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
res = await this.getCurrentSliceValuesFromVoxelManager(this.renderingEngineId, `${this.viewportKey}-${this.activeViewportIndex}`)
|
res = await this.getCurrentSliceValuesFromVoxelManager(this.renderingEngineId, `${this.viewportKey}-${this.activeViewportIndex}`)
|
||||||
}
|
}
|
||||||
let obj = {}
|
|
||||||
if (res) {
|
if (res) {
|
||||||
|
let obj = {
|
||||||
|
|
||||||
|
}
|
||||||
res.values.forEach(item => {
|
res.values.forEach(item => {
|
||||||
if (obj[item]) {
|
if (obj[item]) {
|
||||||
obj[item]++
|
obj[item]++
|
||||||
|
|
@ -347,8 +327,7 @@ export default {
|
||||||
seriesData: {
|
seriesData: {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
symbolSize: 0,
|
symbolSize: 0,
|
||||||
data: seriesData,
|
data: seriesData
|
||||||
objKey: obj
|
|
||||||
},
|
},
|
||||||
min: min,
|
min: min,
|
||||||
max: max
|
max: max
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue