Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
# Conflicts: # src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue # src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vueuat_us
commit
d07adc4948
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: ssh
|
type: ssh
|
||||||
name: ssh-linux-test-irc-publish
|
name: ssh-linux-uat-irc-publish
|
||||||
|
|
||||||
platform:
|
platform:
|
||||||
os: Linux
|
os: Linux
|
||||||
|
|
@ -33,6 +33,38 @@ trigger:
|
||||||
- uat
|
- uat
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: ssh
|
||||||
|
name: ssh-linux-test-irc-publish
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: Linux
|
||||||
|
arch: 386
|
||||||
|
|
||||||
|
clone:
|
||||||
|
disable: true #禁用默认克隆
|
||||||
|
|
||||||
|
server:
|
||||||
|
host: 106.14.89.110
|
||||||
|
user: root
|
||||||
|
password:
|
||||||
|
from_secret: local_pwd
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: publish-test-irc-web
|
||||||
|
commands:
|
||||||
|
- bash /opt/1panel/xc-deploy-new/devops-center/build-vue-then-publish.sh IRC_Web main
|
||||||
|
- name: notify-wecom
|
||||||
|
commands:
|
||||||
|
- echo $DRONE_COMMIT_AUTHOR "$DRONE_COMMIT_MESSAGE"
|
||||||
|
- bash /opt/1panel/xc-deploy-new/devops-center/drone-notify-wecom.sh "$DRONE_BUILD_STATUS" "$DRONE_REPO_NAME" "$DRONE_BRANCH" "$DRONE_BUILD_NUMBER" "4355b98e-1e72-4678-8dfb-2fc6ad0bf449" "$DRONE_COMMIT_MESSAGE" "$DRONE_COMMIT_AUTHOR" "Test_IRC_WEB" "irc.test.extimaging.com"
|
||||||
|
when:
|
||||||
|
status:
|
||||||
|
- success
|
||||||
|
- failure
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- main
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
17
package.json
17
package.json
|
|
@ -15,18 +15,17 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.701.0",
|
"@aws-sdk/client-s3": "^3.701.0",
|
||||||
"@cornerstonejs/adapters": "^2.19.7",
|
"@cornerstonejs/adapters": "4.19.2",
|
||||||
"@cornerstonejs/calculate-suv": "^1.1.0",
|
"@cornerstonejs/calculate-suv": "^1.1.0",
|
||||||
"@cornerstonejs/core": "^2.19.7",
|
"@cornerstonejs/core": "^4.19.2",
|
||||||
"@cornerstonejs/dicom-image-loader": "^2.19.7",
|
"@cornerstonejs/dicom-image-loader": "^4.19.2",
|
||||||
"@cornerstonejs/tools": "^2.19.7",
|
"@cornerstonejs/tools": "^4.19.2",
|
||||||
"@fingerprintjs/fingerprintjs": "^4.6.2",
|
"@fingerprintjs/fingerprintjs": "^4.6.2",
|
||||||
"@icr/polyseg-wasm": "^0.4.0",
|
"@icr/polyseg-wasm": "^0.4.0",
|
||||||
"@microsoft/signalr": "^8.0.7",
|
"@microsoft/signalr": "^8.0.7",
|
||||||
"@riophae/vue-treeselect": "^0.4.0",
|
"@riophae/vue-treeselect": "^0.4.0",
|
||||||
"@vue-office/docx": "^1.6.2",
|
"@vue-office/docx": "^1.6.2",
|
||||||
"@vue-office/excel": "^1.7.11",
|
"@vue-office/excel": "^1.7.11",
|
||||||
"@vue/composition-api": "^1.7.2",
|
|
||||||
"ali-oss": "^6.17.1",
|
"ali-oss": "^6.17.1",
|
||||||
"axios": "^0.18.1",
|
"axios": "^0.18.1",
|
||||||
"core-js": "^3.8.3",
|
"core-js": "^3.8.3",
|
||||||
|
|
@ -60,11 +59,10 @@
|
||||||
"screenfull": "^6.0.2",
|
"screenfull": "^6.0.2",
|
||||||
"sortablejs": "^1.15.5",
|
"sortablejs": "^1.15.5",
|
||||||
"streamsaver": "^2.0.6",
|
"streamsaver": "^2.0.6",
|
||||||
"svg-sprite-loader": "^4.1.3",
|
|
||||||
"svgo": "^1.2.2",
|
"svgo": "^1.2.2",
|
||||||
"v-viewer": "^1.7.4",
|
"v-viewer": "^1.7.4",
|
||||||
"vcrontab": "^0.3.5",
|
"vcrontab": "^0.3.5",
|
||||||
"vue": "^2.6.14",
|
"vue": "2.7.16",
|
||||||
"vue-clipboard2": "^0.3.3",
|
"vue-clipboard2": "^0.3.3",
|
||||||
"vue-contextmenujs": "^1.4.11",
|
"vue-contextmenujs": "^1.4.11",
|
||||||
"vue-count-to": "^1.0.13",
|
"vue-count-to": "^1.0.13",
|
||||||
|
|
@ -98,9 +96,10 @@
|
||||||
"path-browserify": "^1.0.1",
|
"path-browserify": "^1.0.1",
|
||||||
"process": "^0.11.10",
|
"process": "^0.11.10",
|
||||||
"sass": "^1.63.2",
|
"sass": "^1.63.2",
|
||||||
"sass-loader": "^10.4.1",
|
"sass-loader": "^16.0.7",
|
||||||
|
"svg-sprite-loader": "^6.0.11",
|
||||||
"terser-webpack-plugin": "^5.3.10",
|
"terser-webpack-plugin": "^5.3.10",
|
||||||
"vue-template-compiler": "^2.6.14",
|
"vue-template-compiler": "2.7.16",
|
||||||
"webpack": "^5.96.1",
|
"webpack": "^5.96.1",
|
||||||
"webpack-bundle-analyzer": "^4.10.2"
|
"webpack-bundle-analyzer": "^4.10.2"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -74,10 +74,11 @@ export default {
|
||||||
zzSessionStorage.setItem('lastWorkbench', `${v.path}${query ? '?' : ''}${query}`)
|
zzSessionStorage.setItem('lastWorkbench', `${v.path}${query ? '?' : ''}${query}`)
|
||||||
var firstGoIn = this.trialsRouter.children.find(v => { return v.name === 'TrialsPanel' }).children[0]
|
var firstGoIn = this.trialsRouter.children.find(v => { return v.name === 'TrialsPanel' }).children[0]
|
||||||
if (this.trialsTab === '/trials/trials-panel') {
|
if (this.trialsTab === '/trials/trials-panel') {
|
||||||
this.$router.replace({ path: `${firstGoIn.path}${query ? '?' : ''}${query}` })
|
var targetPath = firstGoIn.path
|
||||||
if (firstGoIn.children && firstGoIn.children.length > 0) {
|
if (firstGoIn.children && firstGoIn.children.length > 0) {
|
||||||
this.$router.replace({ path: `${firstGoIn.children[0].path}${query ? '?' : ''}${query}` })
|
targetPath = firstGoIn.children[0].path
|
||||||
}
|
}
|
||||||
|
this.$router.replace({ path: `${targetPath}${query ? '?' : ''}${query}` })
|
||||||
}
|
}
|
||||||
// document.cookie = 'TrialId=' + this.$route.query.trialId + ';path=/'
|
// document.cookie = 'TrialId=' + this.$route.query.trialId + ';path=/'
|
||||||
},
|
},
|
||||||
|
|
@ -112,10 +113,11 @@ export default {
|
||||||
this.getTrialList()
|
this.getTrialList()
|
||||||
var firstGoIn = this.trialsRouter.children.find(v => { return v.name === 'TrialsPanel' }).children[0]
|
var firstGoIn = this.trialsRouter.children.find(v => { return v.name === 'TrialsPanel' }).children[0]
|
||||||
if (this.trialsTab === '/trials/trials-panel') {
|
if (this.trialsTab === '/trials/trials-panel') {
|
||||||
this.$router.replace({ path: `${firstGoIn.path}${query ? '?' : ''}${query}` })
|
var targetPath = firstGoIn.path
|
||||||
if (firstGoIn.children && firstGoIn.children.length > 0) {
|
if (firstGoIn.children && firstGoIn.children.length > 0) {
|
||||||
this.$router.replace({ path: `${firstGoIn.children[0].path}${query ? '?' : ''}${query}` })
|
targetPath = firstGoIn.children[0].path
|
||||||
}
|
}
|
||||||
|
this.$router.replace({ path: `${targetPath}${query ? '?' : ''}${query}` })
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
@ -201,15 +203,19 @@ export default {
|
||||||
if (~url.indexOf('?')) {
|
if (~url.indexOf('?')) {
|
||||||
query = url.split('?')[1]
|
query = url.split('?')[1]
|
||||||
}
|
}
|
||||||
|
var trialsPanelList = this.trialsRouter.children.find(item => { return item.name === 'TrialsPanel' }).children
|
||||||
|
var currentRoute = trialsPanelList.find(c => { return c.path === v.name })
|
||||||
|
|
||||||
|
if (currentRoute && currentRoute.tabHiddn) {
|
||||||
this.$router.push({ path: `${v.name}${query ? '?' : ''}${query}` })
|
this.$router.push({ path: `${v.name}${query ? '?' : ''}${query}` })
|
||||||
var trialsPanelList = this.trialsRouter.children.find(v => { return v.name === 'TrialsPanel' }).children
|
|
||||||
var isHasChild = trialsPanelList.find(c => { return c.path === v.name }) && trialsPanelList.find(c => { return c.path === v.name }).children
|
|
||||||
if (trialsPanelList.find(c => { return c.path === v.name }) && trialsPanelList.find(c => { return c.path === v.name }).tabHiddn) {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
var isHasChild = currentRoute && currentRoute.children
|
||||||
if (isHasChild && isHasChild.length > 0) {
|
if (isHasChild && isHasChild.length > 0) {
|
||||||
this.trialsTabChild = isHasChild[0].path
|
this.trialsTabChild = isHasChild[0].path
|
||||||
this.$router.push({ path: `${this.trialsTabChild}${query ? '?' : ''}${query}` })
|
this.$router.push({ path: `${this.trialsTabChild}${query ? '?' : ''}${query}` })
|
||||||
|
} else {
|
||||||
|
this.$router.push({ path: `${v.name}${query ? '?' : ''}${query}` })
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
|
|
|
||||||
|
|
@ -56,8 +56,10 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import "~@/styles/mixin.scss";
|
@use "@/styles/mixin.scss" as *;
|
||||||
@import "~@/styles/variables.module.scss";
|
@use "@/styles/variables.module.scss" as *;
|
||||||
|
// @import "~@/styles/mixin.scss";
|
||||||
|
// @import "~@/styles/variables.module.scss";
|
||||||
|
|
||||||
.app-wrapper {
|
.app-wrapper {
|
||||||
@include clearfix;
|
@include clearfix;
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,16 @@
|
||||||
@import "./variables.module.scss";
|
@use "./variables.module.scss";
|
||||||
@import "./mixin.scss";
|
@use "./mixin.scss";
|
||||||
@import "./transition.scss";
|
@use "./transition.scss";
|
||||||
@import "./element-ui.scss";
|
@use "./element-ui.scss";
|
||||||
@import "./sidebar.scss";
|
@use "./sidebar.scss";
|
||||||
|
|
||||||
body {
|
body {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
text-rendering: optimizeLegibility;
|
text-rendering: optimizeLegibility;
|
||||||
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
|
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
|
||||||
|
"Microsoft YaHei", "微软雅黑", Arial, sans-serif;
|
||||||
// font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;
|
// font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
// font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
|
// font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
|
||||||
// "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial,
|
// "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial,
|
||||||
|
|
@ -205,133 +206,139 @@ body .el-table th.gutter {
|
||||||
.el-descriptions {
|
.el-descriptions {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #303133
|
color: #303133;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions__header {
|
.el-descriptions__header {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-bottom: 20px
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions__title {
|
.el-descriptions__title {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: 700
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions__body {
|
.el-descriptions__body {
|
||||||
color: #606266;
|
color: #606266;
|
||||||
background-color: #fff
|
background-color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions__body .el-descriptions__table {
|
.el-descriptions__body .el-descriptions__table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
table-layout: fixed
|
table-layout: fixed;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell {
|
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
line-height: 1.5
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-left {
|
.el-descriptions__body
|
||||||
text-align: left
|
.el-descriptions__table
|
||||||
|
.el-descriptions-item__cell.is-left {
|
||||||
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-center {
|
.el-descriptions__body
|
||||||
text-align: center
|
.el-descriptions__table
|
||||||
|
.el-descriptions-item__cell.is-center {
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-right {
|
.el-descriptions__body
|
||||||
text-align: right
|
.el-descriptions__table
|
||||||
|
.el-descriptions-item__cell.is-right {
|
||||||
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions .is-bordered {
|
.el-descriptions .is-bordered {
|
||||||
table-layout: auto
|
table-layout: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions .is-bordered .el-descriptions-item__cell {
|
.el-descriptions .is-bordered .el-descriptions-item__cell {
|
||||||
border: 1px solid #ebeef5;
|
border: 1px solid #ebeef5;
|
||||||
padding: 12px 10px
|
padding: 12px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions :not(.is-bordered) .el-descriptions-item__cell {
|
.el-descriptions :not(.is-bordered) .el-descriptions-item__cell {
|
||||||
padding-bottom: 12px
|
padding-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions--medium.is-bordered .el-descriptions-item__cell {
|
.el-descriptions--medium.is-bordered .el-descriptions-item__cell {
|
||||||
padding: 10px
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions--medium:not(.is-bordered) .el-descriptions-item__cell {
|
.el-descriptions--medium:not(.is-bordered) .el-descriptions-item__cell {
|
||||||
padding-bottom: 10px
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions--small {
|
.el-descriptions--small {
|
||||||
font-size: 12px
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions--small.is-bordered .el-descriptions-item__cell {
|
.el-descriptions--small.is-bordered .el-descriptions-item__cell {
|
||||||
padding: 8px 10px
|
padding: 8px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions--small:not(.is-bordered) .el-descriptions-item__cell {
|
.el-descriptions--small:not(.is-bordered) .el-descriptions-item__cell {
|
||||||
padding-bottom: 8px
|
padding-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions--mini {
|
.el-descriptions--mini {
|
||||||
font-size: 12px
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions--mini.is-bordered .el-descriptions-item__cell {
|
.el-descriptions--mini.is-bordered .el-descriptions-item__cell {
|
||||||
padding: 6px 10px
|
padding: 6px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions--mini:not(.is-bordered) .el-descriptions-item__cell {
|
.el-descriptions--mini:not(.is-bordered) .el-descriptions-item__cell {
|
||||||
padding-bottom: 6px
|
padding-bottom: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions-item {
|
.el-descriptions-item {
|
||||||
vertical-align: top
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions-item__container {
|
.el-descriptions-item__container {
|
||||||
display: flex
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions-item__container .el-descriptions-item__content,
|
.el-descriptions-item__container .el-descriptions-item__content,
|
||||||
.el-descriptions-item__container .el-descriptions-item__label {
|
.el-descriptions-item__container .el-descriptions-item__label {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: baseline
|
align-items: baseline;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions-item__container .el-descriptions-item__content {
|
.el-descriptions-item__container .el-descriptions-item__content {
|
||||||
flex: 1
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions-item__label.has-colon:after {
|
.el-descriptions-item__label.has-colon:after {
|
||||||
content: ":";
|
content: ":";
|
||||||
position: relative;
|
position: relative;
|
||||||
top: -.5px
|
top: -0.5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions-item__label.is-bordered-label {
|
.el-descriptions-item__label.is-bordered-label {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #909399;
|
color: #909399;
|
||||||
background: #fafafa
|
background: #fafafa;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions-item__label:not(.is-bordered-label) {
|
.el-descriptions-item__label:not(.is-bordered-label) {
|
||||||
margin-right: 10px
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-descriptions-item__content {
|
.el-descriptions-item__content {
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
overflow-wrap: break-word
|
overflow-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.feedBack-box {
|
.feedBack-box {
|
||||||
|
|
@ -350,7 +357,7 @@ body .el-table th.gutter {
|
||||||
top: 0;
|
top: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
opacity: .5;
|
opacity: 0.5;
|
||||||
background: #000;
|
background: #000;
|
||||||
z-index: 3999;
|
z-index: 3999;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8366,7 +8366,7 @@
|
||||||
|
|
||||||
for (var i = 0; i < valarr.length; i++) {
|
for (var i = 0; i < valarr.length; i++) {
|
||||||
var checkValue = valarr[i],
|
var checkValue = valarr[i],
|
||||||
checklen = lengths[i],
|
checklen = lengths[i] || 0,
|
||||||
isString = false,
|
isString = false,
|
||||||
displaylen = checklen;
|
displaylen = checklen;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -965,8 +965,8 @@ export default {
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss">
|
||||||
.imageBox {
|
.viewerContainer .imageBox {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
i {
|
i {
|
||||||
|
|
|
||||||
|
|
@ -158,8 +158,7 @@
|
||||||
<div class="viewerSidethumbinner">
|
<div class="viewerSidethumbinner">
|
||||||
|
|
||||||
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
|
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
|
||||||
<template v-for="item in relationStudyListByVisitName">
|
<div v-for="item in relationStudyListByVisitName" :key="`${item.VisitName}`">
|
||||||
<div :key="`${item.VisitName}`">
|
|
||||||
<div v-show="item.VisitName" class="text-desc" style="background-color: #1f1f1f;">
|
<div v-show="item.VisitName" class="text-desc" style="background-color: #1f1f1f;">
|
||||||
{{ item.VisitName }}
|
{{ item.VisitName }}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -258,8 +257,6 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
|
||||||
|
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1012,7 +1009,7 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.imageBox {
|
.viewerContainer .imageBox {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
i {
|
i {
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,10 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import "~@/styles/mixin.scss";
|
// @import "~@/styles/mixin.scss";
|
||||||
@import "~@/styles/variables.module.scss";
|
// @import "~@/styles/variables.module.scss";
|
||||||
|
@use "@/styles/mixin.scss" as *;
|
||||||
|
@use "@/styles/variables.module.scss" as *;
|
||||||
|
|
||||||
.trials-wrapper {
|
.trials-wrapper {
|
||||||
@include clearfix;
|
@include clearfix;
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,7 @@ export default {
|
||||||
getStudyList(obj) {
|
getStudyList(obj) {
|
||||||
if (obj) {
|
if (obj) {
|
||||||
var studyList = obj.StudyList || []
|
var studyList = obj.StudyList || []
|
||||||
studyList = studyList.filter(i => !i.IsCriticalSequence && (i.Modalities.indexOf('CT') !== -1 || i.Modalities.indexOf('MR') !== -1) && i.Modalities.indexOf('PT') !== -1)
|
studyList = studyList.filter(i => !i.IsCriticalSequence && (i.Modalities.indexOf('CT') !== -1 || i.Modalities.indexOf('MR') !== -1) && (i.Modalities.indexOf('PT') !== -1 || i.Modalities.indexOf('NM') !== -1))
|
||||||
if (studyList.length === 0) return
|
if (studyList.length === 0) return
|
||||||
this.studyList = studyList
|
this.studyList = studyList
|
||||||
}
|
}
|
||||||
|
|
@ -200,7 +200,7 @@ export default {
|
||||||
var series = seriesList.filter(series => series.Modality === 'CT' || series.Modality === 'MR')
|
var series = seriesList.filter(series => series.Modality === 'CT' || series.Modality === 'MR')
|
||||||
this.ctSeries = series.sort((a, b) => b.instanceCount - a.instanceCount)
|
this.ctSeries = series.sort((a, b) => b.instanceCount - a.instanceCount)
|
||||||
|
|
||||||
series = seriesList.filter(series => series.Modality === 'PT')
|
series = seriesList.filter(series => series.Modality === 'PT' || series.Modality === 'NM')
|
||||||
this.petSeries = series.sort((a, b) => b.instanceCount - a.instanceCount)
|
this.petSeries = series.sort((a, b) => b.instanceCount - a.instanceCount)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@
|
||||||
<div class="dropdown-content">
|
<div class="dropdown-content">
|
||||||
<ul style="width:165px;">
|
<ul style="width:165px;">
|
||||||
<li v-for="item in wwwcArr" :key="item.label">
|
<li v-for="item in wwwcArr" :key="item.label">
|
||||||
<a href="#" @click.stop="changeVoiRange(item)">
|
<span @click.stop="changeVoiRange(item)">
|
||||||
<div v-if="item.wc !== null"
|
<div v-if="item.wc !== null"
|
||||||
style="display:flex;flex-direction: row;justify-content: space-between;">
|
style="display:flex;flex-direction: row;justify-content: space-between;">
|
||||||
<div>{{ item.label }}</div>
|
<div>{{ item.label }}</div>
|
||||||
|
|
@ -104,7 +104,7 @@
|
||||||
<div v-else style="text-align:left;">
|
<div v-else style="text-align:left;">
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</span>
|
||||||
<el-divider v-if="item.val === 1" class="divider" content-position="center">
|
<el-divider v-if="item.val === 1" class="divider" content-position="center">
|
||||||
{{ ` ${$t('trials:reading:title:preset')}` }}
|
{{ ` ${$t('trials:reading:title:preset')}` }}
|
||||||
</el-divider>
|
</el-divider>
|
||||||
|
|
@ -145,9 +145,9 @@
|
||||||
<div class="dropdown-content">
|
<div class="dropdown-content">
|
||||||
<ul style="width:100px;">
|
<ul style="width:100px;">
|
||||||
<li v-for="rotate in rotateOptions" :key="rotate.label" style="text-align:left;">
|
<li v-for="rotate in rotateOptions" :key="rotate.label" style="text-align:left;">
|
||||||
<a href="#" @click.prevent="setViewportRotate(rotate.val)">
|
<span @click.prevent="setViewportRotate(rotate.val)">
|
||||||
{{ rotate.label }}
|
{{ rotate.label }}
|
||||||
</a>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -239,10 +239,10 @@
|
||||||
<!--v-if="readingTaskState < 2"-->
|
<!--v-if="readingTaskState < 2"-->
|
||||||
<ul style="width:100px;">
|
<ul style="width:100px;">
|
||||||
<li v-for="i in customizeStandards" :key="i.toolName" style="text-align:left;">
|
<li v-for="i in customizeStandards" :key="i.toolName" style="text-align:left;">
|
||||||
<a href="#" @click.prevent="setMoreToolActive(i.toolName)">
|
<span @click.prevent="setMoreToolActive(i.toolName)">
|
||||||
<svg-icon :icon-class="i.icon" class="svg-icon" style="margin-right: 5px;" />
|
<svg-icon :icon-class="i.icon" class="svg-icon" style="margin-right: 5px;" />
|
||||||
{{ $t(i.i18nKey) }}
|
{{ $t(i.i18nKey) }}
|
||||||
</a>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -327,10 +327,10 @@
|
||||||
@renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" />
|
@renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="readingTool === 2" :class="['viewports-box', !isFusion ? 'viewports-box-down' : '']"
|
<div v-if="readingTool === 2"
|
||||||
|
:class="['viewports-box', !isFusion ? 'viewports-box-down' : '', fullScreenIndex !== null ? 'viewports-box-full-screen' : '']"
|
||||||
:style="gridStyle">
|
:style="gridStyle">
|
||||||
<div v-for="(v, index) in cellsMax" v-show="index < cells.length" :key="`viewport-fusion-${index}`"
|
<div v-for="(v, index) in cellsMax" v-show="index < cells.length" :key="`viewport-fusion-${index}`"
|
||||||
:style="cellStyle"
|
|
||||||
:class="['grid-cell', index === activeViewportIndex ? 'cell_active' : '', index === fullScreenIndex ? 'cell-full-screen' : '']"
|
:class="['grid-cell', index === activeViewportIndex ? 'cell_active' : '', index === fullScreenIndex ? 'cell-full-screen' : '']"
|
||||||
@dblclick="toggleFullScreen($event, index)" @click="activeViewport(index)">
|
@dblclick="toggleFullScreen($event, index)" @click="activeViewport(index)">
|
||||||
<PetCtViewport :ref="`viewport-fusion-${index}`" :data-viewport-uid="`viewport-fusion-${index}`"
|
<PetCtViewport :ref="`viewport-fusion-${index}`" :data-viewport-uid="`viewport-fusion-${index}`"
|
||||||
|
|
@ -364,7 +364,8 @@
|
||||||
<Segmentations ref="Segmentations" :visitInfo="taskInfo" :isMPR="isMPR"
|
<Segmentations ref="Segmentations" :visitInfo="taskInfo" :isMPR="isMPR"
|
||||||
:volumeToolGroupId="volumeToolGroupId" :viewportKey="viewportKey"
|
:volumeToolGroupId="volumeToolGroupId" :viewportKey="viewportKey"
|
||||||
:activeViewportIndex="activeViewportIndex" :activeTool.sync="activeTool"
|
:activeViewportIndex="activeViewportIndex" :activeTool.sync="activeTool"
|
||||||
:actionConfiguration="actionConfiguration" @setToolsPassive="setToolsPassive" @resetQuestion="resetQuestion"/>
|
:actionConfiguration="actionConfiguration" @setToolsPassive="setToolsPassive"
|
||||||
|
@resetQuestion="resetQuestion" />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
|
|
@ -570,6 +571,7 @@ const {
|
||||||
synchronizers,
|
synchronizers,
|
||||||
PlanarFreehandContourSegmentationTool,
|
PlanarFreehandContourSegmentationTool,
|
||||||
BrushTool,
|
BrushTool,
|
||||||
|
SegmentBidirectionalTool,
|
||||||
utilities: CStUtils,
|
utilities: CStUtils,
|
||||||
// cursors
|
// cursors
|
||||||
} = cornerstoneTools
|
} = cornerstoneTools
|
||||||
|
|
@ -1323,6 +1325,7 @@ export default {
|
||||||
cornerstoneTools.addTool(CrosshairsTool)
|
cornerstoneTools.addTool(CrosshairsTool)
|
||||||
cornerstoneTools.addTool(PlanarFreehandContourSegmentationTool)
|
cornerstoneTools.addTool(PlanarFreehandContourSegmentationTool)
|
||||||
cornerstoneTools.addTool(BrushTool)
|
cornerstoneTools.addTool(BrushTool)
|
||||||
|
cornerstoneTools.addTool(SegmentBidirectionalTool)
|
||||||
viewportIds.forEach((viewportId, i) => {
|
viewportIds.forEach((viewportId, i) => {
|
||||||
// const toolGroupId = `viewport-${i}`
|
// const toolGroupId = `viewport-${i}`
|
||||||
let toolGroupId = viewportId
|
let toolGroupId = viewportId
|
||||||
|
|
@ -1364,6 +1367,7 @@ export default {
|
||||||
toolGroup.addTool(PlanarFreehandContourSegmentationTool.toolName, {
|
toolGroup.addTool(PlanarFreehandContourSegmentationTool.toolName, {
|
||||||
cachedStats: true,
|
cachedStats: true,
|
||||||
});
|
});
|
||||||
|
toolGroup.addTool(SegmentBidirectionalTool.toolName, {});
|
||||||
// toolGroup.setToolActive(PlanarFreehandContourSegmentationTool.toolName, {
|
// toolGroup.setToolActive(PlanarFreehandContourSegmentationTool.toolName, {
|
||||||
// bindings: [
|
// bindings: [
|
||||||
// {
|
// {
|
||||||
|
|
@ -1485,7 +1489,10 @@ export default {
|
||||||
toolGroup.setToolPassive(FixedRadiusCircleROITool.toolName)
|
toolGroup.setToolPassive(FixedRadiusCircleROITool.toolName)
|
||||||
toolGroup.setToolPassive(AngleTool.toolName)
|
toolGroup.setToolPassive(AngleTool.toolName)
|
||||||
toolGroup.setToolPassive(CobbAngleTool.toolName)
|
toolGroup.setToolPassive(CobbAngleTool.toolName)
|
||||||
if (this.readingTool === 3) toolGroup.setToolPassive(PlanarFreehandContourSegmentationTool.toolName)
|
if (this.readingTool === 3) {
|
||||||
|
toolGroup.setToolPassive(PlanarFreehandContourSegmentationTool.toolName)
|
||||||
|
toolGroup.setToolPassive(SegmentBidirectionalTool.toolName, {});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
toolGroup.setToolEnabled(ArrowAnnotateTool.toolName)
|
toolGroup.setToolEnabled(ArrowAnnotateTool.toolName)
|
||||||
toolGroup.setToolEnabled(RectangleROITool.toolName)
|
toolGroup.setToolEnabled(RectangleROITool.toolName)
|
||||||
|
|
@ -3038,8 +3045,7 @@ export default {
|
||||||
if (obj.segment) {
|
if (obj.segment) {
|
||||||
let study = studyList.find(item => item.StudyId === obj.segmentGroup.StudyId)
|
let study = studyList.find(item => item.StudyId === obj.segmentGroup.StudyId)
|
||||||
series = study.SeriesList.find(item => item.Id === obj.segmentGroup.SeriesId)
|
series = study.SeriesList.find(item => item.Id === obj.segmentGroup.SeriesId)
|
||||||
let sliceIndex = obj.segment.bidirectional.sliceIndex || 0
|
series.SliceIndex = 0
|
||||||
series.SliceIndex = series.InstanceCount - 1 - sliceIndex
|
|
||||||
series.segment = obj.segment
|
series.segment = obj.segment
|
||||||
} else {
|
} else {
|
||||||
series = this.getMarkedSeries(studyList, obj.annotation, true)
|
series = this.getMarkedSeries(studyList, obj.annotation, true)
|
||||||
|
|
@ -3976,14 +3982,14 @@ export default {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
a {
|
span {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ul li a:hover {
|
ul li span:hover {
|
||||||
background-color: #727272;
|
background-color: #727272;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4075,10 +4081,29 @@ export default {
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
z-index: 9;
|
z-index: 9;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewports-box-down {
|
.viewports-box-down {
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
|
opacity: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewports-box-down {
|
||||||
|
>.grid-cell {
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewports-box-full-screen {
|
||||||
|
>.grid-cell {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
>.grid-cell.cell-full-screen {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.grid-cell {
|
.grid-cell {
|
||||||
|
|
@ -4086,6 +4111,9 @@ export default {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
overflow: hidden;
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4121,61 +4149,6 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .manuals-dialog-container {
|
|
||||||
margin-top: 50px !important;
|
|
||||||
width: 75%;
|
|
||||||
height: 80%;
|
|
||||||
|
|
||||||
.el-dialog__body {
|
|
||||||
padding: 10px;
|
|
||||||
height: calc(100% - 50px) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog__header {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .manuals-full-dialog-container {
|
|
||||||
.el-dialog__body {
|
|
||||||
padding: 10px;
|
|
||||||
height: calc(100% - 50px) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog__header {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .cd-dialog-container {
|
|
||||||
background: #fff !important;
|
|
||||||
margin-top: 50px !important;
|
|
||||||
width: 75%;
|
|
||||||
height: 80%;
|
|
||||||
|
|
||||||
.el-dialog__body {
|
|
||||||
padding: 20px 20px 0 20px;
|
|
||||||
height: calc(100% - 70px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog__header {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .cd-full-dialog-container {
|
|
||||||
background: #fff !important;
|
|
||||||
|
|
||||||
.el-dialog__body {
|
|
||||||
padding: 10px;
|
|
||||||
height: calc(100% - 50px) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog__header {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .el-dropdown-menu {
|
::v-deep .el-dropdown-menu {
|
||||||
.el-dropdown-menu__item {
|
.el-dropdown-menu__item {
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
|
|
@ -4218,3 +4191,60 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.manuals-dialog-container {
|
||||||
|
margin-top: 50px !important;
|
||||||
|
width: 75%;
|
||||||
|
height: 80%;
|
||||||
|
|
||||||
|
.el-dialog__body {
|
||||||
|
padding: 10px;
|
||||||
|
height: calc(100% - 50px) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-dialog__header {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.manuals-full-dialog-container {
|
||||||
|
.el-dialog__body {
|
||||||
|
padding: 10px;
|
||||||
|
height: calc(100% - 50px) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-dialog__header {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cd-dialog-container {
|
||||||
|
background: #fff !important;
|
||||||
|
margin-top: 50px !important;
|
||||||
|
width: 75%;
|
||||||
|
height: 80%;
|
||||||
|
|
||||||
|
.el-dialog__body {
|
||||||
|
padding: 20px 20px 0 20px;
|
||||||
|
height: calc(100% - 70px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-dialog__header {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cd-full-dialog-container {
|
||||||
|
background: #fff !important;
|
||||||
|
|
||||||
|
.el-dialog__body {
|
||||||
|
padding: 10px;
|
||||||
|
height: calc(100% - 50px) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-dialog__header {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -208,9 +208,11 @@ const {
|
||||||
Enums: csToolsEnums,
|
Enums: csToolsEnums,
|
||||||
segmentation,
|
segmentation,
|
||||||
annotation,
|
annotation,
|
||||||
|
SegmentBidirectionalTool,
|
||||||
utilities: CStUtils,
|
utilities: CStUtils,
|
||||||
} = cornerstoneTools;
|
} = cornerstoneTools;
|
||||||
const { MouseBindings, Events: toolsEvents } = csToolsEnums
|
const { MouseBindings, Events: toolsEvents } = csToolsEnums
|
||||||
|
const { segmentation: segmentationUtils, roundNumber } = CStUtils;
|
||||||
const { cache, getRenderingEngine, imageLoader, eventTarget, metaData, utilities: csUtils, volumeLoader } = cornerstone;
|
const { cache, getRenderingEngine, imageLoader, eventTarget, metaData, utilities: csUtils, volumeLoader } = cornerstone;
|
||||||
const { downloadDICOMData } = cornerstoneAdapters.helpers;
|
const { downloadDICOMData } = cornerstoneAdapters.helpers;
|
||||||
const { Cornerstone3D } = cornerstoneAdapters.adaptersSEG;
|
const { Cornerstone3D } = cornerstoneAdapters.adaptersSEG;
|
||||||
|
|
@ -378,26 +380,34 @@ export default {
|
||||||
const viewportId = `${this.viewportKey}-${this.activeViewportIndex}`
|
const viewportId = `${this.viewportKey}-${this.activeViewportIndex}`
|
||||||
const viewport = renderingEngine.getViewport(viewportId);
|
const viewport = renderingEngine.getViewport(viewportId);
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
[viewport.element].forEach((element) => {
|
[viewport.element].forEach(async (element) => {
|
||||||
const bidirectional = this.actionConfiguration.contourBidirectional.method(
|
const bidirectionalData =
|
||||||
element,
|
await CStUtils.segmentation.getSegmentLargestBidirectional({
|
||||||
this.actionConfiguration.contourBidirectional
|
segmentationId: item.segmentationId,
|
||||||
);
|
segmentIndices: [item.segmentIndex],
|
||||||
if (!bidirectional) {
|
});
|
||||||
console.log('No bidirectional found');
|
bidirectionalData.forEach((bidirectional) => {
|
||||||
return;
|
const { segmentIndex } = bidirectional;
|
||||||
}
|
const { majorAxis, minorAxis, maxMajor, maxMinor } = bidirectional;
|
||||||
|
|
||||||
|
SegmentBidirectionalTool.hydrate(viewportId, [majorAxis, minorAxis], {
|
||||||
|
segmentIndex,
|
||||||
|
segmentationId: item.segmentationId,
|
||||||
|
});
|
||||||
item.bidirectional = bidirectional
|
item.bidirectional = bidirectional
|
||||||
let an = annotation.state.getAllAnnotations().find(i => i.data.segment && i.data.segment.segmentationId === bidirectional.segmentationId && i.data.segment.segmentIndex === bidirectional.segmentIndex && i.metadata.toolName === "Bidirectional");
|
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.locking.setAnnotationLocked(an.annotationUID, true)
|
||||||
|
}
|
||||||
if (DATA) {
|
if (DATA) {
|
||||||
this.segmentationId = DATA.SegmentationId;
|
this.segmentationId = DATA.SegmentationId;
|
||||||
// this.segmentIndex = this.segmentList[this.segmentList.length - 1].segments[0].segmentIndex;
|
|
||||||
this.segmentIndex = DATA.SegmentMumber;
|
this.segmentIndex = DATA.SegmentMumber;
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.selectSegment(DATA)
|
this.selectSegment(DATA)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// render the bidirectional tool data
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
@ -427,7 +437,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
viewBidirectional(item, view) {
|
viewBidirectional(item, view) {
|
||||||
let bidirectional = annotation.state.getAllAnnotations().find(i => i.data.segment && i.data.segment.segmentationId === this.segmentationId && i.data.segment.segmentIndex === item.segmentIndex && i.metadata.toolName === "Bidirectional");
|
let bidirectional = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
|
||||||
annotation.visibility.setAnnotationVisibility(bidirectional.annotationUID, view)
|
annotation.visibility.setAnnotationVisibility(bidirectional.annotationUID, view)
|
||||||
item.bidirectionalView = view
|
item.bidirectionalView = view
|
||||||
this.resetViewport()
|
this.resetViewport()
|
||||||
|
|
@ -469,16 +479,15 @@ export default {
|
||||||
this.segmentationId = item.segmentationId;
|
this.segmentationId = item.segmentationId;
|
||||||
this.segmentIndex = item.segmentIndex;
|
this.segmentIndex = item.segmentIndex;
|
||||||
segmentation.segmentIndex.setActiveSegmentIndex(item.segmentationId, item.segmentIndex);
|
segmentation.segmentIndex.setActiveSegmentIndex(item.segmentationId, item.segmentIndex);
|
||||||
console.log(item.bidirectional)
|
|
||||||
if (item.bidirectional) {
|
if (item.bidirectional) {
|
||||||
let sliceIndex = item.bidirectional.sliceIndex
|
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
|
||||||
|
if (!an) return false
|
||||||
|
let referencedImageId = an.metadata.referencedImageId;
|
||||||
|
let sliceIndex = metaData.get('generalImageModule', referencedImageId).instanceNumber
|
||||||
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)
|
||||||
const segmentGroup =
|
csUtils.jumpToSlice(viewport.element, { imageIndex: sliceIndex - 1 });
|
||||||
segmentation.state.getSegmentation(this.segmentationId);
|
|
||||||
const { imageIds } = segmentGroup.representationData.Labelmap;
|
|
||||||
csUtils.jumpToSlice(viewport.element, { imageIndex: imageIds.length - 1 - sliceIndex });
|
|
||||||
}
|
}
|
||||||
if (item.lock) {
|
if (item.lock) {
|
||||||
this.$emit('setToolsPassive')
|
this.$emit('setToolsPassive')
|
||||||
|
|
@ -596,7 +605,7 @@ export default {
|
||||||
delAllSegment() {
|
delAllSegment() {
|
||||||
segmentation.removeAllSegmentations()
|
segmentation.removeAllSegmentations()
|
||||||
segmentation.state.removeAllSegmentations()
|
segmentation.state.removeAllSegmentations()
|
||||||
let annotations = annotation.state.getAllAnnotations().filter(item => item.data.segmentation || item.data.segment);
|
let annotations = annotation.state.getAllAnnotations().filter(item => item.metadata.segmentationId && item.metadata.segmentIndex && item.metadata.toolName === "SegmentBidirectional");
|
||||||
annotations.forEach(item => {
|
annotations.forEach(item => {
|
||||||
annotation.state.removeAnnotation(item.annotationUID)
|
annotation.state.removeAnnotation(item.annotationUID)
|
||||||
})
|
})
|
||||||
|
|
@ -613,7 +622,7 @@ export default {
|
||||||
segmentation.state.removeSegmentation(this.segmentationId)
|
segmentation.state.removeSegmentation(this.segmentationId)
|
||||||
let groupIndex = this.segmentList.findIndex(item => item.segmentationId === this.segmentationId)
|
let groupIndex = this.segmentList.findIndex(item => item.segmentationId === this.segmentationId)
|
||||||
this.segmentList.splice(groupIndex, 1)
|
this.segmentList.splice(groupIndex, 1)
|
||||||
let annotations = annotation.state.getAllAnnotations().filter(item => (item.data.segmentation && item.data.segmentation.segmentationId === this.segmentationId) || (item.data.segment && item.data.segment.segmentationId === this.segmentationId));
|
let annotations = annotation.state.getAllAnnotations().filter(item => item.metadata.segmentationId === this.segmentationId);
|
||||||
annotations.forEach(item => {
|
annotations.forEach(item => {
|
||||||
annotation.state.removeAnnotation(item.annotationUID)
|
annotation.state.removeAnnotation(item.annotationUID)
|
||||||
})
|
})
|
||||||
|
|
@ -637,7 +646,7 @@ export default {
|
||||||
// segmentation.updateSegmentations({ segmentationId: this.segmentationId })
|
// segmentation.updateSegmentations({ segmentationId: this.segmentationId })
|
||||||
let index = this.segmentList[groupIndex].segments.findIndex(item => item.segmentIndex === segmentIndex)
|
let index = this.segmentList[groupIndex].segments.findIndex(item => item.segmentIndex === segmentIndex)
|
||||||
this.segmentList[groupIndex].segments.splice(index, 1)
|
this.segmentList[groupIndex].segments.splice(index, 1)
|
||||||
let annotations = annotation.state.getAllAnnotations().filter(item => (item.data.segmentation && item.data.segmentation.segmentationId === this.segmentationId && item.data.segmentation.segmentIndex === segmentIndex) || (item.data.segment && item.data.segment.segmentationId === this.segmentationId && item.data.segment.segmentIndex === segmentIndex));
|
let annotations = annotation.state.getAllAnnotations().filter(item => item.metadata.segmentationId === this.segmentationId && item.metadata.segmentIndex === segmentIndex);
|
||||||
annotations.forEach(item => {
|
annotations.forEach(item => {
|
||||||
annotation.state.removeAnnotation(item.annotationUID)
|
annotation.state.removeAnnotation(item.annotationUID)
|
||||||
})
|
})
|
||||||
|
|
@ -740,9 +749,7 @@ export default {
|
||||||
segmentation.state.getSegmentation(segmentationId);
|
segmentation.state.getSegmentation(segmentationId);
|
||||||
|
|
||||||
let { imageIds } = segmentGroup.representationData.Labelmap;
|
let { imageIds } = segmentGroup.representationData.Labelmap;
|
||||||
// imageIds.forEach(id => {
|
|
||||||
// console.log(metaData.get('generalImageModule', id))
|
|
||||||
// })
|
|
||||||
let segImages = imageIds.map(imageId => cache.getImage(imageId));
|
let segImages = imageIds.map(imageId => cache.getImage(imageId));
|
||||||
segImages = segImages.reverse()
|
segImages = segImages.reverse()
|
||||||
let referencedImages = segImages.map(image =>
|
let referencedImages = segImages.map(image =>
|
||||||
|
|
@ -818,6 +825,7 @@ export default {
|
||||||
labelmap3D,
|
labelmap3D,
|
||||||
metaData
|
metaData
|
||||||
);
|
);
|
||||||
|
console.log(generatedSegmentation.dataset, 'generatedSegmentation.dataset')
|
||||||
if (!isFile) {
|
if (!isFile) {
|
||||||
const buffer = Buffer.from(dcmjs.data.datasetToDict(generatedSegmentation.dataset).write());
|
const buffer = Buffer.from(dcmjs.data.datasetToDict(generatedSegmentation.dataset).write());
|
||||||
let blob = new Blob([buffer], { type: "application/dicom" });
|
let blob = new Blob([buffer], { type: "application/dicom" });
|
||||||
|
|
@ -970,18 +978,35 @@ export default {
|
||||||
}
|
}
|
||||||
this.drawing = true
|
this.drawing = true
|
||||||
},
|
},
|
||||||
calculateStatistics(indices, segmentationId) {
|
async calculateStatistics(indices, segmentationId, mode) {
|
||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const stats = await segmentationUtils.getStatistics({
|
||||||
const toolGroupId = this.isMPR ? this.volumeToolGroupId : `${this.viewportKey}-${this.activeViewportIndex}`
|
segmentationId,
|
||||||
const viewportId = `${this.viewportKey}-${this.activeViewportIndex}`
|
segmentIndices: indices,
|
||||||
const viewport = renderingEngine.getViewport(viewportId)
|
mode,
|
||||||
const toolGroup = ToolGroupManager.getToolGroup(toolGroupId);
|
});
|
||||||
const activeName = toolGroup.getActivePrimaryMouseButtonTool();
|
|
||||||
const brush = toolGroup.getToolInstance(activeName);
|
if (mode === 'individual') {
|
||||||
const stats = brush.getStatistics(viewport.element, { indices });
|
// Handle individual mode where stats is an object with segment indices as keys
|
||||||
|
const segmentStats = stats;
|
||||||
|
|
||||||
|
for (const segmentIndex of indices) {
|
||||||
|
if (segmentStats[segmentIndex]) {
|
||||||
|
const segmentStat = segmentStats[segmentIndex];
|
||||||
|
console.log(segmentStat, 'segmentStat')
|
||||||
|
segmentStat.count.label = 'Voxels';
|
||||||
let segmentGroup = this.segmentList.find(item => item.segmentationId === segmentationId)
|
let segmentGroup = this.segmentList.find(item => item.segmentationId === segmentationId)
|
||||||
let segment = segmentGroup.segments.find(item => item.segmentIndex === indices[0])
|
let segment = segmentGroup.segments.find(item => item.segmentIndex === segmentIndex)
|
||||||
segment.stats = stats;
|
segment.stats = segmentStat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const items = [`Statistics on ${indices.join(', ')}`];
|
||||||
|
// Handle collective mode where stats is a NamedStatistics object
|
||||||
|
const namedStats = stats;
|
||||||
|
namedStats.count.label = 'Voxels';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
createSegmentationRepresentation(segmentationId) {
|
createSegmentationRepresentation(segmentationId) {
|
||||||
this.viewprotIds.forEach(id => {
|
this.viewprotIds.forEach(id => {
|
||||||
|
|
@ -1004,7 +1029,7 @@ export default {
|
||||||
this.timeoutId = null;
|
this.timeoutId = null;
|
||||||
this.drawing = false;
|
this.drawing = false;
|
||||||
if (!this.isDel) {
|
if (!this.isDel) {
|
||||||
this.calculateStatistics([this.segmentIndex], this.segmentationId);
|
this.calculateStatistics([this.segmentIndex], this.segmentationId, 'individual');
|
||||||
let segmentGroup = this.segmentList.find(item => item.segmentationId === this.segmentationId)
|
let segmentGroup = this.segmentList.find(item => item.segmentationId === this.segmentationId)
|
||||||
let segment = segmentGroup.segments.find(item => item.segmentIndex === this.segmentIndex)
|
let segment = segmentGroup.segments.find(item => item.segmentIndex === this.segmentIndex)
|
||||||
this.getBidirectional(segment)
|
this.getBidirectional(segment)
|
||||||
|
|
@ -1015,7 +1040,7 @@ export default {
|
||||||
segmentIndexs.push(item.segmentIndex)
|
segmentIndexs.push(item.segmentIndex)
|
||||||
this.getBidirectional(item)
|
this.getBidirectional(item)
|
||||||
})
|
})
|
||||||
this.calculateStatistics(segmentIndexs, this.segmentationId);
|
this.calculateStatistics(segmentIndexs, this.segmentationId, 'individual');
|
||||||
}
|
}
|
||||||
this.isDel = false
|
this.isDel = false
|
||||||
|
|
||||||
|
|
@ -1067,9 +1092,10 @@ export default {
|
||||||
}
|
}
|
||||||
let res = await this.getSegmentBindingList(data)
|
let res = await this.getSegmentBindingList(data)
|
||||||
if (res && res.length > 0) questionNeedChange = true
|
if (res && res.length > 0) questionNeedChange = true
|
||||||
res.forEach(async i => {
|
for (let j = 0; j < res.length; j++) {
|
||||||
let segment = segmentGroup.find(d => d.id === i.SegmentId)
|
let item = res[j]
|
||||||
let question = await this.getQuestionConfig(i.TableQuestionId ? i.TableQuestionId : i.QuestionId, !!i.TableQuestionId);
|
let segment = segmentGroup.segments.find(d => d.id === item.SegmentId)
|
||||||
|
let question = await this.getQuestionConfig(item.TableQuestionId ? item.TableQuestionId : item.QuestionId, !!item.TableQuestionId);
|
||||||
let imageToolAttribute = question.ImageToolAttribute
|
let imageToolAttribute = question.ImageToolAttribute
|
||||||
let answer = ''
|
let answer = ''
|
||||||
if (imageToolAttribute === 'length' || imageToolAttribute === 'width') {
|
if (imageToolAttribute === 'length' || imageToolAttribute === 'width') {
|
||||||
|
|
@ -1077,21 +1103,21 @@ export default {
|
||||||
length: "maxMajor",
|
length: "maxMajor",
|
||||||
width: 'maxMinor'
|
width: 'maxMinor'
|
||||||
}
|
}
|
||||||
answer = segment.bidirectional && segment.stats[s[imageToolAttribute]] ? (segment.bidirectional[s[imageToolAttribute]]).toFixed(this.digitPlaces) : ''
|
answer = segment.bidirectional && segment.bidirectional[s[imageToolAttribute]] ? Number(segment.bidirectional[s[imageToolAttribute]]).toFixed(this.digitPlaces) : ''
|
||||||
} else {
|
} else {
|
||||||
answer = segment.stats && segment.stats[imageToolAttribute] ? Number((segment.stats[imageToolAttribute]).value).toFixed(this.digitPlaces) : ''
|
answer = segment.stats && segment.stats[imageToolAttribute] ? Number((segment.stats[imageToolAttribute]).value).toFixed(this.digitPlaces) : ''
|
||||||
}
|
}
|
||||||
let o = {
|
let o = {
|
||||||
Answer: answer,
|
Answer: answer,
|
||||||
QuestionId: i.QuestionId,
|
QuestionId: item.QuestionId,
|
||||||
RowId: i.RowId,
|
RowId: item.RowId,
|
||||||
SegmentId: i.SegmentId,
|
SegmentId: item.SegmentId,
|
||||||
SegmentationId: i.SegmentationId,
|
SegmentationId: item.SegmentationId,
|
||||||
TableQuestionId: i.TableQuestionId,
|
TableQuestionId: item.TableQuestionId,
|
||||||
VisitTaskId: this.visitInfo.VisitTaskId,
|
VisitTaskId: this.visitInfo.VisitTaskId,
|
||||||
}
|
}
|
||||||
bindingList.push(o)
|
bindingList.push(o)
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
if (questionNeedChange) {
|
if (questionNeedChange) {
|
||||||
let confirm = await this.$confirm(this.$t("segment:confirm:questionNeedChange"))
|
let confirm = await this.$confirm(this.$t("segment:confirm:questionNeedChange"))
|
||||||
|
|
@ -1196,13 +1222,17 @@ export default {
|
||||||
this.selectSegment(o)
|
this.selectSegment(o)
|
||||||
this.changeColor(s.ColorRgb, o)
|
this.changeColor(s.ColorRgb, o)
|
||||||
this.lockSegment(o, true)
|
this.lockSegment(o, true)
|
||||||
setTimeout(() => {
|
// setTimeout(() => {
|
||||||
|
// if (SEGMENT && index === segments.length - 1) {
|
||||||
|
// return this.getBidirectional(o, SEGMENT)
|
||||||
|
// }
|
||||||
|
// this.getBidirectional(o)
|
||||||
|
// })
|
||||||
if (SEGMENT && index === segments.length - 1) {
|
if (SEGMENT && index === segments.length - 1) {
|
||||||
return this.getBidirectional(o, SEGMENT)
|
return this.getBidirectional(o, SEGMENT)
|
||||||
}
|
}
|
||||||
this.getBidirectional(o)
|
this.getBidirectional(o)
|
||||||
})
|
})
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
||||||
|
|
@ -248,7 +248,6 @@ export default {
|
||||||
background-color: #607d8b !important;
|
background-color: #607d8b !important;
|
||||||
border: 1px solid #607d8b !important;
|
border: 1px solid #607d8b !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-progress__text{
|
::v-deep .el-progress__text{
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|
@ -300,7 +299,6 @@ export default {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-collapse{
|
::v-deep .el-collapse{
|
||||||
border: none;
|
border: none;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -517,7 +517,7 @@ export default {
|
||||||
width: 'maxMinor'
|
width: 'maxMinor'
|
||||||
}
|
}
|
||||||
if (!obj.bidirectional || !obj.bidirectional.maxMajor) return this.$confirm(this.$t("segment:error:notValue"))
|
if (!obj.bidirectional || !obj.bidirectional.maxMajor) return this.$confirm(this.$t("segment:error:notValue"))
|
||||||
answer = obj.bidirectional[s[imageToolAttribute]] ? (obj.bidirectional[s[imageToolAttribute]]).toFixed(this.digitPlaces) : ''
|
answer = obj.bidirectional[s[imageToolAttribute]] ? Number(obj.bidirectional[s[imageToolAttribute]]).toFixed(this.digitPlaces) : ''
|
||||||
} else {
|
} else {
|
||||||
if (!obj.stats) return this.$confirm(this.$t("segment:error:notValue"))
|
if (!obj.stats) return this.$confirm(this.$t("segment:error:notValue"))
|
||||||
answer = obj.stats[imageToolAttribute] ? Number((obj.stats[imageToolAttribute]).value).toFixed(this.digitPlaces) : ''
|
answer = obj.stats[imageToolAttribute] ? Number((obj.stats[imageToolAttribute]).value).toFixed(this.digitPlaces) : ''
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue