From c8c049b5d097f26bbae37c33ac1f894a3903dd40 Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 3 Apr 2025 11:15:22 +0800 Subject: [PATCH 1/4] =?UTF-8?q?DICOM=E5=BD=B1=E5=83=8F=E4=B8=AD=EF=BC=8C?= =?UTF-8?q?=E5=AD=98=E5=9C=A8Tag=E6=9C=80=E5=A4=A7=E5=83=8F=E7=B4=A0?= =?UTF-8?q?=E5=80=BC=E3=80=81=E6=9C=80=E5=B0=8F=E5=83=8F=E7=B4=A0=E5=80=BC?= =?UTF-8?q?=E7=AD=89=EF=BC=8C=E4=BD=86=E6=98=AF=E5=92=8C=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E4=B8=8D=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/metaDataProvider.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/utils/metaDataProvider.js b/src/utils/metaDataProvider.js index 85bd0116..dfdc27a8 100644 --- a/src/utils/metaDataProvider.js +++ b/src/utils/metaDataProvider.js @@ -99,5 +99,27 @@ function metaDataProvider(type, imageId) { columnPixelSpacing, }; } + if (type === 'imagePixelModule') { + return { + samplesPerPixel: dataSet.uint16('x00280002'), + photometricInterpretation: dataSet.string('x00280004'), + rows: dataSet.uint16('x00280010'), + columns: dataSet.uint16('x00280011'), + bitsAllocated: dataSet.uint16('x00280100'), + bitsStored: dataSet.uint16('x00280101'), + highBit: dataSet.uint16('x00280102'), + pixelRepresentation: dataSet.uint16('x00280103'), + planarConfiguration: dataSet.uint16('x00280006'), + pixelAspectRatio: dataSet.uint16('x00280034'), + smallestPixelValue: null, + largestPixelValue: null, + redPaletteColorLookupTableDescriptor: dataSet.string('x00281101'), + greenPaletteColorLookupTableDescriptor: dataSet.string('x00281102'), + bluePaletteColorLookupTableDescriptor: dataSet.string('x00281103'), + redPaletteColorLookupTableData: dataSet.string('x00281201'), + greenPaletteColorLookupTableData: dataSet.string('x00281202'), + bluePaletteColorLookupTableData: dataSet.string('x00281203') + } + } } export default metaDataProvider; \ No newline at end of file From 1368397da99657ba83b94e8c256024a9b261558b Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 3 Apr 2025 11:15:36 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=80=BB=E8=A7=88?= =?UTF-8?q?=E2=80=94>=E4=B8=8A=E4=BC=A0=E8=AE=B0=E5=BD=95=EF=BC=9A?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E7=BC=96=E5=8F=B7=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=EF=BC=8C=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trials/trials-panel/trial-summary/upload-monitor/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/trials/trials-panel/trial-summary/upload-monitor/index.vue b/src/views/trials/trials-panel/trial-summary/upload-monitor/index.vue index 9b604fdf..572734d5 100644 --- a/src/views/trials/trials-panel/trial-summary/upload-monitor/index.vue +++ b/src/views/trials/trials-panel/trial-summary/upload-monitor/index.vue @@ -15,7 +15,7 @@ v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteCode" - :value="item.SiteId" + :value="item.TrialSiteId" /> From 1e720e399d56de8d5f4dfcc9f64b2e15b2070c1d Mon Sep 17 00:00:00 2001 From: wangxiaoshuang <825034831@qq.com> Date: Thu, 3 Apr 2025 11:15:54 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E6=94=B6=E5=85=A5?= =?UTF-8?q?=E9=A1=B9=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=80=89=E9=A1=B9=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E5=85=B6=E4=BB=96=E6=96=87=E4=BB=B6=E4=B9=9F=E6=94=B9?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trial-document/components/fileRecord/index.vue | 3 ++- .../trial-document/components/report_doc/index.vue | 3 ++- .../trial-document/components/template/index.vue | 3 ++- .../trial-document/components/trainRecord/index.vue | 3 ++- .../trial-document/components/viewer/certificate/index.vue | 7 ------- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/fileRecord/index.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/fileRecord/index.vue index e3ed2c8f..f0b31b38 100644 --- a/src/views/trials/trials-panel/trial-summary/trial-document/components/fileRecord/index.vue +++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/fileRecord/index.vue @@ -770,11 +770,12 @@ export default { }, immediate: true, }, - 'rowData.IsEnable': { + 'rowData': { handler() { this.DATA = Object.assign({}, this.rowData) }, immediate: true, + deep:true }, }, created() { diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/report_doc/index.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/report_doc/index.vue index a9831f1c..8abfee05 100644 --- a/src/views/trials/trials-panel/trial-summary/trial-document/components/report_doc/index.vue +++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/report_doc/index.vue @@ -766,11 +766,12 @@ export default { }, immediate: true, }, - 'rowData.IsEnable': { + 'rowData': { handler() { this.DATA = Object.assign({}, this.rowData) }, immediate: true, + deep:true }, }, computed: { diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/template/index.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/template/index.vue index c85326b8..2262e936 100644 --- a/src/views/trials/trials-panel/trial-summary/trial-document/components/template/index.vue +++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/template/index.vue @@ -722,11 +722,12 @@ export default { }, immediate: true, }, - 'rowData.IsEnable': { + 'rowData': { handler() { this.DATA = Object.assign({}, this.rowData) }, immediate: true, + deep:true }, }, created() { diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/index.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/index.vue index d182f815..a9320ecf 100644 --- a/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/index.vue +++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/index.vue @@ -865,11 +865,12 @@ export default { }, immediate: true, }, - 'rowData.IsEnable': { + 'rowData': { handler() { this.DATA = Object.assign({}, this.rowData) }, immediate: true, + deep:true }, }, created() { diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/viewer/certificate/index.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/viewer/certificate/index.vue index 451e77fd..9f216df4 100644 --- a/src/views/trials/trials-panel/trial-summary/trial-document/components/viewer/certificate/index.vue +++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/viewer/certificate/index.vue @@ -359,7 +359,6 @@ export default { status: 'add', upload: null, }, - DATA: {}, doctorList: [], } }, @@ -632,12 +631,6 @@ export default { }, immediate: true, }, - rowData: { - handler() { - this.DATA = Object.assign({}, this.rowData) - }, - immediate: true, - }, }, created() { let typeArr = ['', 'Report', 'Doc', 'Record', 'Reviewer', 'Template'] From e0321bae7254d670dddda0299164243bad568758 Mon Sep 17 00:00:00 2001 From: "DESKTOP-775TN7O\\wxs" <825034831@qq.com> Date: Sat, 12 Apr 2025 12:04:20 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=BD=B1=E5=83=8F=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/metaDataProvider.js | 147 +++++++++++++++++++++++++++++++--- vue.config.js | 2 +- 2 files changed, 138 insertions(+), 11 deletions(-) diff --git a/src/utils/metaDataProvider.js b/src/utils/metaDataProvider.js index dfdc27a8..b840ddc0 100644 --- a/src/utils/metaDataProvider.js +++ b/src/utils/metaDataProvider.js @@ -39,6 +39,108 @@ function getNumberValues(dataSet, tag, minimumLength) { return values; } +function getLutDescriptor(dataSet, tag) { + if (!dataSet.elements[tag] || dataSet.elements[tag].length !== 6) { + return; + } + + return [ + dataSet.uint16(tag, 0), + dataSet.uint16(tag, 1), + dataSet.uint16(tag, 2), + ]; +} + +function getLutData(lutDataSet, tag, lutDescriptor) { + const lut = []; + const lutData = lutDataSet.elements[tag]; + + for (let i = 0; i < lutDescriptor[0]; i++) { + // Output range is always unsigned + if (lutDescriptor[2] === 16) { + lut[i] = lutDataSet.uint16(tag, i); + } else { + lut[i] = lutDataSet.byteArray[i + lutData.dataOffset]; + } + } + + return lut; +} +function populateSmallestLargestPixelValues(dataSet, imagePixelModule) { + const pixelRepresentation = dataSet.uint16('x00280103'); + if (pixelRepresentation === 0) { + imagePixelModule.smallestPixelValue = dataSet.uint16('x00280106'); + imagePixelModule.largestPixelValue = dataSet.uint16('x00280107'); + } else { + imagePixelModule.smallestPixelValue = dataSet.int16('x00280106'); + imagePixelModule.largestPixelValue = dataSet.int16('x00280107'); + } + imagePixelModule.largestPixelValue = imagePixelModule.largestPixelValue === 0 ? undefined : imagePixelModule.largestPixelValue; +} +function populatePaletteColorLut(dataSet, imagePixelModule) { + imagePixelModule.redPaletteColorLookupTableDescriptor = getLutDescriptor( + dataSet, + 'x00281101' + ); + imagePixelModule.greenPaletteColorLookupTableDescriptor = getLutDescriptor( + dataSet, + 'x00281102' + ); + imagePixelModule.bluePaletteColorLookupTableDescriptor = getLutDescriptor( + dataSet, + 'x00281103' + ); + + // The first Palette Color Lookup Table Descriptor value is the number of entries in the lookup table. + // When the number of table entries is equal to 2ˆ16 then this value shall be 0. + // See http://dicom.nema.org/MEDICAL/DICOM/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.5 + if (imagePixelModule.redPaletteColorLookupTableDescriptor[0] === 0) { + imagePixelModule.redPaletteColorLookupTableDescriptor[0] = 65536; + imagePixelModule.greenPaletteColorLookupTableDescriptor[0] = 65536; + imagePixelModule.bluePaletteColorLookupTableDescriptor[0] = 65536; + } + + // The third Palette Color Lookup Table Descriptor value specifies the number of bits for each entry in the Lookup Table Data. + // It shall take the value of 8 or 16. + // The LUT Data shall be stored in a format equivalent to 8 bits allocated when the number of bits for each entry is 8, and 16 bits allocated when the number of bits for each entry is 16, where in both cases the high bit is equal to bits allocated-1. + // The third value shall be identical for each of the Red, Green and Blue Palette Color Lookup Table Descriptors. + // + // Note: Some implementations have encoded 8 bit entries with 16 bits allocated, padding the high bits; + // this can be detected by comparing the number of entries specified in the LUT Descriptor with the actual value length of the LUT Data entry. + // The value length in bytes should equal the number of entries if bits allocated is 8, and be twice as long if bits allocated is 16. + const numLutEntries = + imagePixelModule.redPaletteColorLookupTableDescriptor[0]; + const lutData = dataSet.elements.x00281201; + const lutBitsAllocated = lutData.length === numLutEntries ? 8 : 16; + + // If the descriptors do not appear to have the correct values, correct them + if ( + imagePixelModule.redPaletteColorLookupTableDescriptor[2] !== + lutBitsAllocated + ) { + imagePixelModule.redPaletteColorLookupTableDescriptor[2] = lutBitsAllocated; + imagePixelModule.greenPaletteColorLookupTableDescriptor[2] = + lutBitsAllocated; + imagePixelModule.bluePaletteColorLookupTableDescriptor[2] = + lutBitsAllocated; + } + + imagePixelModule.redPaletteColorLookupTableData = getLutData( + dataSet, + 'x00281201', + imagePixelModule.redPaletteColorLookupTableDescriptor + ); + imagePixelModule.greenPaletteColorLookupTableData = getLutData( + dataSet, + 'x00281202', + imagePixelModule.greenPaletteColorLookupTableDescriptor + ); + imagePixelModule.bluePaletteColorLookupTableData = getLutData( + dataSet, + 'x00281203', + imagePixelModule.bluePaletteColorLookupTableDescriptor + ); +} function metaDataProvider(type, imageId) { const parsedImageId = parseImageId(imageId); const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(parsedImageId.url); @@ -100,7 +202,7 @@ function metaDataProvider(type, imageId) { }; } if (type === 'imagePixelModule') { - return { + const imagePixelModule = { samplesPerPixel: dataSet.uint16('x00280002'), photometricInterpretation: dataSet.string('x00280004'), rows: dataSet.uint16('x00280010'), @@ -110,16 +212,41 @@ function metaDataProvider(type, imageId) { highBit: dataSet.uint16('x00280102'), pixelRepresentation: dataSet.uint16('x00280103'), planarConfiguration: dataSet.uint16('x00280006'), - pixelAspectRatio: dataSet.uint16('x00280034'), - smallestPixelValue: null, - largestPixelValue: null, - redPaletteColorLookupTableDescriptor: dataSet.string('x00281101'), - greenPaletteColorLookupTableDescriptor: dataSet.string('x00281102'), - bluePaletteColorLookupTableDescriptor: dataSet.string('x00281103'), - redPaletteColorLookupTableData: dataSet.string('x00281201'), - greenPaletteColorLookupTableData: dataSet.string('x00281202'), - bluePaletteColorLookupTableData: dataSet.string('x00281203') + pixelAspectRatio: dataSet.string('x00280034'), + }; + populateSmallestLargestPixelValues(dataSet, imagePixelModule); + + if ( + imagePixelModule.photometricInterpretation === 'PALETTE COLOR' && + dataSet.elements.x00281101 + ) { + populatePaletteColorLut(dataSet, imagePixelModule); } + return imagePixelModule; } + // if (type === 'imagePixelModule') { + // return { + // samplesPerPixel: dataSet.uint16('x00280002'), + // photometricInterpretation: dataSet.string('x00280004'), + // rows: dataSet.uint16('x00280010'), + // columns: dataSet.uint16('x00280011'), + // bitsAllocated: dataSet.uint16('x00280100'), + // bitsStored: dataSet.uint16('x00280101'), + // highBit: dataSet.uint16('x00280102'), + // pixelRepresentation: dataSet.uint16('x00280103'), + // planarConfiguration: dataSet.uint16('x00280006'), + // pixelAspectRatio: dataSet.uint16('x00280034'), + // smallestPixelValue: null, + // largestPixelValue: null, + // // smallestPixelValue: dataSet.uint16('x00280106'), + // // largestPixelValue: dataSet.uint16('x00280107'), + // redPaletteColorLookupTableDescriptor: dataSet.string('x00281101'), + // greenPaletteColorLookupTableDescriptor: dataSet.string('x00281102'), + // bluePaletteColorLookupTableDescriptor: dataSet.string('x00281103'), + // redPaletteColorLookupTableData: dataSet.string('x00281201'), + // greenPaletteColorLookupTableData: dataSet.string('x00281202'), + // bluePaletteColorLookupTableData: dataSet.string('x00281203') + // } + // } } export default metaDataProvider; \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index b2790c5d..05dc69d2 100644 --- a/vue.config.js +++ b/vue.config.js @@ -97,7 +97,7 @@ module.exports = defineConfig({ ] }), // new BundleAnalyzerPlugin(), - process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'prod' || process.env.NODE_ENV === 'production' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? function () { } + process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'production' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? function () { } : new WebpackAliyunOss({ from: ['./dist/**'], dist: process.env.VUE_APP_OSS_PATH + distDate,