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

main
caiyiling 2026-05-06 16:11:35 +08:00
commit 8ff9e3b232
5 changed files with 47 additions and 26 deletions

View File

@ -304,7 +304,7 @@ export default {
cornerstoneTools.addToolForElement(element, Note_RectangleRoiTool, { cornerstoneTools.addToolForElement(element, Note_RectangleRoiTool, {
configuration: { configuration: {
color: '#f00', color: '#f00',
lineWidth: 0.5, lineWidth: 2,
drawHandles: false, drawHandles: false,
fillColor: 'rgba(0, 0, 0, 1)', fillColor: 'rgba(0, 0, 0, 1)',
}, },

View File

@ -9,10 +9,10 @@
<div class="Anonymous" v-if="isAnonymous"> <div class="Anonymous" v-if="isAnonymous">
<div <div
:class="{ btn: true, activeBtn: activeTool === 'Note_RectangleRoi' && !isComparison, isNoted: isComparison }" :class="{ btn: true, activeBtn: activeTool === 'Note_RectangleRoi' && !isComparison, isNoted: isComparison }"
@click="setToolActive($event, 'Note_RectangleRoi')">{{ @click="setToolActive($event, 'Note_RectangleRoi', true)">{{
$t('DicomViewer:anonymous:Note_RectangleRoi') }}</div> $t('DicomViewer:anonymous:Note_RectangleRoi') }}</div>
<div :class="{ btn: true, activeBtn: activeTool === 'Eraser' && !isComparison, isNoted: isComparison }" <div :class="{ btn: true, activeBtn: activeTool === 'Eraser' && !isComparison, isNoted: isComparison }"
@click="setToolActive($event, 'Eraser')">{{ @click="setToolActive($event, 'Eraser', true)">{{
$t('DicomViewer:anonymous:Eraser') }} $t('DicomViewer:anonymous:Eraser') }}
</div> </div>
<div :class="{ btn: true, isNoted: isComparison }" @click="anonymousImage(false)">{{ <div :class="{ btn: true, isNoted: isComparison }" @click="anonymousImage(false)">{{
@ -299,7 +299,8 @@
v-if="type === 'Study' && modality && ['PT、CT', 'CT、PT', 'PET-CT'].includes(modality)"> v-if="type === 'Study' && modality && ['PT、CT', 'CT、PT', 'PET-CT'].includes(modality)">
<div class="sideTool-title">{{ $t('trials:tab:patientData') }}</div> <div class="sideTool-title">{{ $t('trials:tab:patientData') }}</div>
<div class="sideTool-wrapper"> <div class="sideTool-wrapper">
<el-form ref="patientForm" size="mini" :model="formData" :rules="rules" label-width="150" v-loading="formLoading"> <el-form ref="patientForm" size="mini" :model="formData" :rules="rules" label-width="150"
v-loading="formLoading">
<!-- 性别 --> <!-- 性别 -->
<el-form-item :label="$t('trials:ptData:label:patientSex')" prop="PatientSex"> <el-form-item :label="$t('trials:ptData:label:patientSex')" prop="PatientSex">
<el-select v-model="formData.PatientSex" :placeholder="$t('common:ruleMessage:select')" <el-select v-model="formData.PatientSex" :placeholder="$t('common:ruleMessage:select')"
@ -401,10 +402,10 @@ export default {
handler(v) { handler(v) {
if (v) { if (v) {
if (this.type === 'Study' && ['PT、CT', 'CT、PT', 'PET-CT'].includes(v)) { if (this.type === 'Study' && ['PT、CT', 'CT、PT', 'PET-CT'].includes(v)) {
this.$nextTick(()=>{ this.$nextTick(() => {
this.getPatientInfo() this.getPatientInfo()
}) })
} }
} }
} }
} }
@ -641,7 +642,7 @@ export default {
}) })
}) })
let res = await this.studyMaskImage(data) let res = await this.studyMaskImage(data)
if (!res) return false if (!res || res.length <= 0) return this.$confirm(this.$t("DicomViewer:anonymous:studyMaskImageFail"))
this.$emit("update:loading", true) this.$emit("update:loading", true)
if (!isAll) { if (!isAll) {
let strs = image.imageId.split("?") let strs = image.imageId.split("?")
@ -839,8 +840,25 @@ export default {
} }
}) })
}, },
setToolActive(e, toolName) { setToolActive(e, toolName, isNotSetClassName = false) {
const elements = document.querySelectorAll('.dicom-item') const elements = document.querySelectorAll('.dicom-item')
if (isNotSetClassName) {
const scope = this
if (scope.activeTool) {
Array.from(elements).forEach((element, index) => {
if (element.style.display !== 'none') {
scope.$refs[`dicomCanvas${index}`].setToolPassive(scope.activeTool)
}
})
}
if (scope.activeTool === toolName) return scope.activeTool = null
scope.activeTool = toolName
return Array.from(elements).forEach((element, index) => {
if (element.style.display !== 'none') {
scope.$refs[`dicomCanvas${index}`].setToolActive(toolName)
}
})
}
if (e.currentTarget.classList.contains('activeTool')) { if (e.currentTarget.classList.contains('activeTool')) {
e.currentTarget.classList.remove('activeTool') e.currentTarget.classList.remove('activeTool')
const scope = this const scope = this
@ -1020,7 +1038,7 @@ export default {
try { try {
this.formLoading = true this.formLoading = true
let studyId = this.$route.query.studyId let studyId = this.$route.query.studyId
let res = await getPatientInfo({studyId: studyId}) let res = await getPatientInfo({ studyId: studyId })
this.formData = { this.formData = {
Id: res.Result.Id || '', Id: res.Result.Id || '',
PatientSex: res.Result.PatientSex || '', PatientSex: res.Result.PatientSex || '',
@ -1035,7 +1053,7 @@ export default {
// PT 2D SUV 使/ // PT 2D SUV 使/
this.cachePtClinicalDataToInstances() this.cachePtClinicalDataToInstances()
this.formLoading = false this.formLoading = false
} catch(e) { } catch (e) {
this.formLoading = false this.formLoading = false
console.log(e) console.log(e)
} }
@ -1161,6 +1179,7 @@ export default {
cursor: pointer; cursor: pointer;
padding: 5px 10px; padding: 5px 10px;
border: 1px solid rgba(255, 255, 255, .7); border: 1px solid rgba(255, 255, 255, .7);
color: #000;
&:hover { &:hover {
background-color: rgba(255, 255, 255, .5); background-color: rgba(255, 255, 255, .5);
@ -1168,7 +1187,8 @@ export default {
} }
.activeBtn { .activeBtn {
background-color: rgba(255, 255, 255, .5); background-color: #16477b90;
color: #fff;
} }
.isNoted { .isNoted {

View File

@ -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">
@ -658,13 +658,12 @@ export default {
} }
}) })
viewport.render() viewport.render()
if (this.series.Modality === 'PT') { if (this.series.Modality === 'PT' || this.series.Modality === 'NM') {
setTimeout(() => { setTimeout(() => {
viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true }) // viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
viewport.resetProperties() // viewport.resetProperties()
viewport.setProperties({ voiRange: { upper: 5, lower: 0 } }) viewport.setProperties({ voiRange: { upper: 5, lower: 0 }, invert: true }, this.volumeId)
viewport.render() viewport.render()
renderingEngine.render()
}, 100) }, 100)
} }
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)

View File

@ -3052,7 +3052,6 @@ export default {
if (this.readingTool !== 3) { if (this.readingTool !== 3) {
viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true, resetRotation: true }) viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true, resetRotation: true })
} }
viewport.resetProperties()
if (this.isMPR) { if (this.isMPR) {
let volume = cache.getVolume(this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].volumeId) let volume = cache.getVolume(this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].volumeId)
const voi = metaData.get('voiLutModule', volume._imageIds[Math.ceil((volume._imageIds.length - 1) / 2)]) const voi = metaData.get('voiLutModule', volume._imageIds[Math.ceil((volume._imageIds.length - 1) / 2)])
@ -3068,9 +3067,12 @@ export default {
return this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setFullScreen(index) return this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].setFullScreen(index)
} }
// viewport.resetProperties()
this.setToolsPassive() this.setToolsPassive()
if (this.readingTool === 3 && this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series.Modality === 'PT') { if (this.readingTool === 3 && this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].series.Modality === 'PT') {
viewport.setProperties({ voiRange: { upper: 5, lower: 0 } }) viewport.setProperties({ voiRange: { upper: 5, lower: 0 }, invert: true }, this.$refs[`${this.viewportKey}-${this.activeViewportIndex}`][0].volumeId)
} else {
viewport.resetProperties()
} }
viewport.render() viewport.render()
// renderingEngine.render() // renderingEngine.render()
@ -3405,6 +3407,7 @@ export default {
// //
async toggleFullScreen(e, index) { async toggleFullScreen(e, index) {
if (this.isDelay && (this.readingTool === 3 || this.isMPR)) return false if (this.isDelay && (this.readingTool === 3 || this.isMPR)) return false
if (this.readingTool === 3 && this.isMPR) return false
if (this.readingTool === 3) { if (this.readingTool === 3) {
let res = await this.changeScreenSave() let res = await this.changeScreenSave()
if (!res) return false if (!res) return false

View File

@ -59,10 +59,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">
@ -706,11 +706,10 @@ export default {
viewport.render() viewport.render()
if (this.series.Modality === 'PT' || this.series.Modality === 'NM') { if (this.series.Modality === 'PT' || this.series.Modality === 'NM') {
setTimeout(() => { setTimeout(() => {
viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true }) // viewport.resetCamera({ resetPan: true, resetZoom: true, resetToCenter: true })
viewport.resetProperties() // viewport.resetProperties()
viewport.setProperties({ voiRange: { upper: 5, lower: 0 } }) viewport.setProperties({ voiRange: { upper: 5, lower: 0 }, invert: true }, this.volumeId)
viewport.render() viewport.render()
renderingEngine.render()
}, 100) }, 100)
} }
await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, data.segment, this.actionConfiguration, this.segmentationId, this.segmentIndex) await renderSegmentation(this.series, this.series.TaskInfo, this.viewportId, this.SegmentConfig, this.renderingEngineId, data.segment, this.actionConfiguration, this.segmentationId, this.segmentIndex)