1878 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			1878 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			Plaintext
		
	
	
| <template>
 | ||
|   <div class="dicom-viewer-wrapper">
 | ||
|     <div class="dicom-viewer-container">
 | ||
|       <div class="dicom-tools">
 | ||
|         <el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:layout')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper" @click.stop="showPanel($event)" @mouseleave="handleMouseout">
 | ||
|             <div class="dropdown">
 | ||
|               <div class="icon">
 | ||
|                 <svg-icon icon-class="layout" class="svg-icon" />
 | ||
|                 <i class="el-icon-arrow-down" style="color:#fff;" />
 | ||
|               </div>
 | ||
|               <!-- 布局 -->
 | ||
|               <!-- <div class="text">{{ $t('trials:reading:button:layout') }}<i class="el-icon-caret-bottom" /></div> -->
 | ||
|               <div class="dropdown-content layout-content">
 | ||
|                 <ul style="width:50px">
 | ||
|                   <li class="flex_row" @click.stop="changeLayout('A')">
 | ||
|                     <div class="layout_box_1_1">
 | ||
|                       A
 | ||
|                     </div>
 | ||
|                   </li>
 | ||
|                   <li class="flex_row" @click.stop="changeLayout('A|A')">
 | ||
|                     <div class="layout_box_1_1">
 | ||
|                       A
 | ||
|                     </div>
 | ||
|                     <div class="layout_box_1_1">
 | ||
|                       A
 | ||
|                     </div>
 | ||
|                   </li>
 | ||
|                   <li v-if="isReadingTaskViewInOrder" class="flex_row" @click.stop="changeLayout('A|B')">
 | ||
|                     <div class="layout_box_1_1">
 | ||
|                       A
 | ||
|                     </div>
 | ||
|                     <div class="layout_box_1_1">
 | ||
|                       B
 | ||
|                     </div>
 | ||
|                   </li>
 | ||
| 
 | ||
|                   <li class="flex_column" @click.stop="changeLayout('A|A|A|A')">
 | ||
| 
 | ||
|                     <div style="flex:1;display: flex;width:100%;">
 | ||
|                       <div class="layout_box_1_2">
 | ||
|                         A
 | ||
|                       </div>
 | ||
|                       <div class="layout_box_1_2">
 | ||
|                         A
 | ||
|                       </div>
 | ||
|                     </div>
 | ||
|                     <div style="flex:1;display: flex;width:100%;">
 | ||
|                       <div class="layout_box_1_2">
 | ||
|                         A
 | ||
|                       </div>
 | ||
|                       <div class="layout_box_1_2">
 | ||
|                         A
 | ||
|                       </div>
 | ||
|                     </div>
 | ||
|                   </li>
 | ||
|                 </ul>
 | ||
|               </div>
 | ||
|             </div>
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
| 
 | ||
|         <el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:wwwc')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper" @click.stop="showPanel($event)" @mouseleave="handleMouseout">
 | ||
|             <div class="dropdown">
 | ||
|               <div
 | ||
|                 class="icon"
 | ||
|                 data-tool="Wwwc"
 | ||
|                 :class="[activeTool==='Wwwc'?'tool_active':'']"
 | ||
| 
 | ||
|                 @click.prevent="setToolActive('Wwwc',false)"
 | ||
|               >
 | ||
|                 <svg-icon icon-class="reverse" class="svg-icon" />
 | ||
|                 <i class="el-icon-arrow-down" style="color:#fff;" />
 | ||
|               </div>
 | ||
|               <!-- 调窗 -->
 | ||
|               <!-- <div class="text">{{ $t('trials:reading:button:wwwc') }}<i class="el-icon-caret-bottom" /></div> -->
 | ||
|               <div class="dropdown-content">
 | ||
|                 <ul style="width:165px;padding: 0 10px;">
 | ||
| 
 | ||
|                   <li v-for="item in wwwcArr" :key="item.label">
 | ||
|                     <a href="#" @click.prevent="setDicomCanvasWwwc(item)">
 | ||
|                       <div v-if="item.wc" style="display:flex;flex-direction: row;justify-content: space-between;">
 | ||
|                         <div>{{ item.label }}</div>
 | ||
|                         <div>{{ item.ww }}/{{ item.wc }}</div>
 | ||
|                       </div>
 | ||
|                       <div v-else style="text-align:left;">
 | ||
|                         {{ item.label }}
 | ||
|                       </div>
 | ||
|                     </a>
 | ||
|                     <!-- <div
 | ||
|                     v-if="item.val === 1"
 | ||
|                     class="divider"
 | ||
|                   >
 | ||
|                     W/L {{ $t('trials:reading:title:preset') }}
 | ||
|                   </div> -->
 | ||
|                     <el-divider v-if="item.val === 1" class="divider" content-position="center">{{ ` ${$t('trials:reading:title:preset') }` }}</el-divider>
 | ||
|                   </li>
 | ||
| 
 | ||
|                 </ul>
 | ||
|               </div>
 | ||
|             </div>
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
| 
 | ||
|         <!-- <div class="tool-wrapper">
 | ||
| 
 | ||
|           <div
 | ||
|             class="icon"
 | ||
|             data-tool="WwwcRegion"
 | ||
|             :class="[activeTool==='WwwcRegion'?'tool_active':'']"
 | ||
| 
 | ||
|             @click.prevent="setToolActive('WwwcRegion',false)"
 | ||
|           >
 | ||
|             <svg-icon icon-class="wwwcRegion" class="svg-icon" />
 | ||
|           </div>
 | ||
|           <div class="text">区域调窗</div>
 | ||
| 
 | ||
|         </div> -->
 | ||
|         <el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:reverseColor')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper">
 | ||
| 
 | ||
|             <div
 | ||
|               class="icon"
 | ||
|               :class="[activeTool==='reversecolor'?'tool_active':'']"
 | ||
| 
 | ||
|               @click.prevent="toggleInvert"
 | ||
|             >
 | ||
|               <svg-icon icon-class="reversecolor" class="svg-icon" />
 | ||
|             </div>
 | ||
|           <!-- 反色 -->
 | ||
|           <!-- <div class="text">{{ $t('trials:reading:button:reverseColor') }}</div> -->
 | ||
| 
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
| 
 | ||
|         <el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:zoom')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper">
 | ||
|             <div
 | ||
|               class="icon"
 | ||
|               :class="[activeTool==='Zoom'?'tool_active':'']"
 | ||
|               data-tool="Zoom"
 | ||
|               @click.prevent="setToolActive('Zoom',false)"
 | ||
|             >
 | ||
|               <svg-icon icon-class="magnifier" class="svg-icon" />
 | ||
|             </div>
 | ||
|             <!-- 缩放 -->
 | ||
|             <div class="text">{{ $t('trials:reading:button:zoom') }}</div>
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
| 
 | ||
|         <el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:move')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper">
 | ||
|             <div
 | ||
|               class="icon"
 | ||
|               :class="[activeTool==='Pan'?'tool_active':'']"
 | ||
|               data-tool="Pan"
 | ||
|               @click.prevent="setToolActive('Pan',false)"
 | ||
|             >
 | ||
|               <svg-icon icon-class="move" class="svg-icon" />
 | ||
|             </div>
 | ||
|             <!-- 移动 -->
 | ||
|             <div class="text">{{ $t('trials:reading:button:move') }}</div>
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
| 
 | ||
|         <el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:rotate')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper" @click.stop="showPanel($event)" @mouseleave="handleMouseout">
 | ||
|             <!-- @click.prevent="setToolActive('Rotate',false)" -->
 | ||
|             <div class="dropdown">
 | ||
|               <div
 | ||
|                 class="icon"
 | ||
|                 data-tool="Rotate"
 | ||
|                 :class="[activeTool==='Rotate'?'tool_active':'']"
 | ||
|               >
 | ||
|                 <svg-icon icon-class="rotate" class="svg-icon" />
 | ||
|                 <i class="el-icon-arrow-down" style="color:#fff;" />
 | ||
|               </div>
 | ||
|               <!-- 旋转 -->
 | ||
|               <div class="text">{{ $t('trials:reading:button:rotate') }}<i class="el-icon-caret-bottom" /></div>
 | ||
|               <div class="dropdown-content">
 | ||
|                 <ul style="width:100px;padding:0 10px;">
 | ||
|                   <li v-for="rotate in rotateArr" :key="rotate.label" style="text-align:left;">
 | ||
|                     <a href="#" @click.prevent="setDicomCanvasRotate(rotate.val)">{{ rotate.label }}</a>
 | ||
|                   </li>
 | ||
|                 </ul>
 | ||
|               </div>
 | ||
|             </div>
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
| 
 | ||
|         <el-tooltip class="item" effect="dark" :content="fitType===1?`${$t('trials:reading:button:fitWindow')}`:`${$t('trials:reading:button:fitImage')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper">
 | ||
|             <div
 | ||
|               class="icon"
 | ||
|               @click.prevent="fitToType(fitType===1?'fitToWindow':'fitToImage')"
 | ||
|             >
 | ||
|               <svg-icon v-if="fitType===1" icon-class="fitToWindow" class="svg-icon" />
 | ||
|               <svg-icon v-else icon-class="fitToImage" class="svg-icon" />
 | ||
|             </div>
 | ||
|             <div class="text">{{ fitType===1?$t('trials:reading:button:fitWindow'):$t('trials:reading:button:fitImage') }}</div>
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
| 
 | ||
|         <el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:imageIndexSync')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper">
 | ||
|             <div
 | ||
|               class="icon"
 | ||
|               :class="[isScrollSync?'tool_active':'']"
 | ||
|               @click.prevent="setImageIndexSync"
 | ||
|             >
 | ||
|               <i v-if="isScrollSync" class="el-icon-lock svg-icon" />
 | ||
|               <i v-else class="el-icon-unlock svg-icon" />
 | ||
|             </div>
 | ||
|             <!-- 同步 -->
 | ||
|             <div class="text">{{ $t('trials:reading:button:imageIndexSync') }}</div>
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
|         <!--
 | ||
|         <div class="tool-wrapper">
 | ||
|           <div
 | ||
|             class="icon"
 | ||
|             @click.prevent="fitToType('fitToImage')"
 | ||
|           >
 | ||
|             <svg-icon icon-class="fitToImage" class="svg-icon" />
 | ||
|           </div>
 | ||
|           <div class="text">适应图像</div>
 | ||
|         </div> -->
 | ||
|         <el-tooltip class="item" effect="dark" :content="`${$t('trials:reading:button:screenShot')}`" placement="bottom">
 | ||
|           <div class="tool-wrapper">
 | ||
|             <div
 | ||
|               class="icon"
 | ||
|               @click.prevent="saveImage"
 | ||
|             >
 | ||
|               <svg-icon icon-class="image" class="svg-icon" />
 | ||
|             </div>
 | ||
|             <!-- 截屏 -->
 | ||
|             <div class="text">{{ $t('trials:reading:button:screenShot') }}</div>
 | ||
|           </div>
 | ||
|         </el-tooltip>
 | ||
| 
 | ||
|         <div
 | ||
|           v-for="tool in measuredTools"
 | ||
|           :key="tool.toolName"
 | ||
|         >
 | ||
|           <el-tooltip class="item" effect="dark" placement="bottom">
 | ||
|             <div slot="content">
 | ||
|               <div v-if="tool.disabledReason">
 | ||
|                 <h4 style="margin:0;padding-bottom:2px;">{{ tool.text }}</h4>
 | ||
|                 <br>{{ tool.disabledReason }}
 | ||
|               </div>
 | ||
|               <div v-else>{{ tool.text }}</div>
 | ||
| 
 | ||
|             </div>
 | ||
|             <div class="tool-wrapper">
 | ||
|               <div
 | ||
|                 class="icon"
 | ||
|                 :class="[activeTool===tool.toolName?'tool_active':'']"
 | ||
|                 :style="{cursor:tool.isDisabled?'not-allowed':'pointer'}"
 | ||
|                 :data-tool="tool.toolName"
 | ||
|                 @click.prevent="setToolActive(tool.toolName,true,$event)"
 | ||
|                 @mouseenter="enter($event,tool.toolName)"
 | ||
|               >
 | ||
|                 <svg-icon :icon-class="tool.icon" class="svg-icon" />
 | ||
|               </div>
 | ||
|               <div class="text">{{ tool.text }}</div>
 | ||
|             </div>
 | ||
|           </el-tooltip>
 | ||
|           <!-- <div v-else class="tool-wrapper">
 | ||
|             <div
 | ||
|               class="icon"
 | ||
|               :class="[activeTool===tool.toolName?'tool_active':'']"
 | ||
|               :style="{cursor:tool.isDisabled?'not-allowed':'pointer'}"
 | ||
|               :data-tool="tool.toolName"
 | ||
|               @click.prevent="setToolActive(tool.toolName,true,$event)"
 | ||
|               @mouseenter="enter($event,tool.toolName)"
 | ||
|             >
 | ||
|               <svg-icon :icon-class="tool.icon" class="svg-icon" />
 | ||
|             </div>
 | ||
|             <div class="text">{{ tool.text }}</div>
 | ||
|           </div> -->
 | ||
|         </div>
 | ||
| 
 | ||
|         <div style="margin-left:auto;">
 | ||
|           <div style="padding:5px">
 | ||
|             <!-- 临床数据 -->
 | ||
|             <el-button v-if="isExistsClinicalData" type="text" @click="previewCD">{{ $t('trials:reading:button:clinicalData') }}</el-button>
 | ||
|             <!-- <el-button v-if="isExistsNoDicomFile" type="text" @click="previewNoneDicoms">非Dicom文件</el-button> -->
 | ||
|             <el-button type="text" @click="previewHotkeys">{{ $t('trials:hotkeys:title:hotkey') }}</el-button>
 | ||
| 
 | ||
|           </div>
 | ||
| 
 | ||
|         </div>
 | ||
|       </div>
 | ||
|       <div class="dicom-viewers">
 | ||
|         <div ref="container" class="viewer-container" :class="['box', `box_${layoutRow}_${layoutCol}`]">
 | ||
|           <div
 | ||
|             v-for="i in maxCanvas"
 | ||
|             :key="i"
 | ||
|             :class="['item', i-1===currentDicomCanvasIndex?'item_active':'']"
 | ||
|             :data-index="i-1"
 | ||
|             :style="i-1===currentDicomCanvasIndex ? cornerstoneStyle : {}"
 | ||
|             @dblclick="setCornerstoneStyle(i-1)"
 | ||
|             @click="activateDicomCanvas(i-1)"
 | ||
|           >
 | ||
|             <dicom-canvas
 | ||
|               v-if="canvasW"
 | ||
|               :ref="`dicomCanvas${i-1}`"
 | ||
|               :style="{width:canvasW,height: canvasH}"
 | ||
|               :canvas-index="i-1"
 | ||
|               :is-active="i-1===currentDicomCanvasIndex"
 | ||
|               :is-scroll-sync="isScrollSync"
 | ||
|               :is-reading-show-subject-info="isReadingShowSubjectInfo"
 | ||
|               :is-reading-task-view-in-order="isReadingTaskViewInOrder"
 | ||
|               :current-dicom-canvas-index="currentDicomCanvasIndex"
 | ||
|               :hot-key-list="hotKeyList"
 | ||
|               @setMeasureData="setMeasureData"
 | ||
|               @modifyMeasureData="modifyMeasureData"
 | ||
|               @scrollSync="scrollSync"
 | ||
|               @selectViewCanvas="selectViewCanvas"
 | ||
|             />
 | ||
|           </div>
 | ||
|         </div>
 | ||
|         <div ref="form-container" class="form-container">
 | ||
|           <!-- 激活canvas测量数据 -->
 | ||
|           <MeasurementList
 | ||
|             v-if="CriterionType !== 17"
 | ||
|             ref="measurementList"
 | ||
|             :question-form-change-state="questionFormChangeState"
 | ||
|             :question-form-change-num="questionFormChangeNum"
 | ||
|             :is-show="isShow"
 | ||
|             :is-reading-show-subject-info="isReadingShowSubjectInfo"
 | ||
|           />
 | ||
|           <RecistBMQuestionList
 | ||
|             v-else-if="CriterionType === 17"
 | ||
|             ref="measurementList"
 | ||
|             :question-form-change-state="questionFormChangeState"
 | ||
|             :question-form-change-num="questionFormChangeNum"
 | ||
|             :is-show="isShow"
 | ||
|             :is-reading-show-subject-info="isReadingShowSubjectInfo"
 | ||
|           />
 | ||
|         </div>
 | ||
|       </div>
 | ||
|     </div>
 | ||
| 
 | ||
|     <el-dialog
 | ||
|       v-if="customWwc.visible"
 | ||
|       :visible.sync="customWwc.visible"
 | ||
|       :close-on-click-modal="false"
 | ||
|       :title="customWwc.title"
 | ||
|       width="400px"
 | ||
|       custom-class="base-dialog-wrapper"
 | ||
|     >
 | ||
|       <CustomWwwcForm @close="customWwc.visible = false" @setWwwc="setWwwc" />
 | ||
|     </el-dialog>
 | ||
| 
 | ||
|     <el-dialog
 | ||
|       v-if="hotkeysDialog.visible"
 | ||
|       :visible.sync="hotkeysDialog.visible"
 | ||
|       :close-on-click-modal="false"
 | ||
|       :title="hotkeysDialog.title"
 | ||
|       width="600px"
 | ||
|     >
 | ||
|       <Hotkeys :reading-tool="0" @reset="resetHotkeyList" @close="hotkeysDialog.visible = false" />
 | ||
|       <!-- <el-descriptions class="margin-top" :column="2" size="mini" border>
 | ||
|         <el-descriptions-item v-for="item in hotKeyList" :key="item.id">
 | ||
|           <template slot="label">
 | ||
|             {{ $fd('ShortcutKey',item.shortcutKeyEnum) }}
 | ||
|           </template>
 | ||
|           {{ item.text }}
 | ||
|         </el-descriptions-item>
 | ||
|       </el-descriptions> -->
 | ||
| 
 | ||
|     </el-dialog>
 | ||
|   </div>
 | ||
| </template>
 | ||
| <script>
 | ||
| import * as cornerstone from 'cornerstone-core'
 | ||
| import * as cornerstoneMath from 'cornerstone-math'
 | ||
| import * as cornerstoneTools from 'cornerstone-tools'
 | ||
| import Hammer from 'hammerjs'
 | ||
| cornerstoneTools.external.cornerstone = cornerstone
 | ||
| cornerstoneTools.external.Hammer = Hammer
 | ||
| cornerstoneTools.external.cornerstoneMath = cornerstoneMath
 | ||
| 
 | ||
| // import DicomCanvas from './DicomCanvas'
 | ||
| import DicomCanvas from '@/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue'
 | ||
| import MeasurementList from './MeasurementList'
 | ||
| import RecistBMQuestionList from './RecistBM/QuestionList'
 | ||
| import CustomWwwcForm from './CustomWwwcForm'
 | ||
| import Hotkeys from './Hotkeys'
 | ||
| import DicomEvent from './DicomEvent'
 | ||
| import { mapGetters } from 'vuex'
 | ||
| import store from '@/store'
 | ||
| import { getDoctorShortcutKey } from '@/api/user'
 | ||
| export default {
 | ||
|   name: 'DicomViewer',
 | ||
|   components: { DicomCanvas, MeasurementList, CustomWwwcForm, Hotkeys, RecistBMQuestionList },
 | ||
|   props: {
 | ||
|     isShow: {
 | ||
|       type: Boolean,
 | ||
|       required: true
 | ||
|     },
 | ||
|     isExistsClinicalData: {
 | ||
|       type: Boolean,
 | ||
|       default: false
 | ||
|     },
 | ||
|     isExistsNoDicomFile: {
 | ||
|       type: Boolean,
 | ||
|       default: false
 | ||
|     },
 | ||
|     isReadingShowSubjectInfo: {
 | ||
|       type: Boolean,
 | ||
|       required: true
 | ||
|     },
 | ||
|     isReadingTaskViewInOrder: {
 | ||
|       type: Boolean,
 | ||
|       required: true
 | ||
|     },
 | ||
|     questionFormChangeState: {
 | ||
|       type: Boolean,
 | ||
|       default() {
 | ||
|         return false
 | ||
|       }
 | ||
|     },
 | ||
|     questionFormChangeNum: {
 | ||
|       type: Number,
 | ||
|       default() {
 | ||
|         return 0
 | ||
|       }
 | ||
|     }
 | ||
|   },
 | ||
|   data() {
 | ||
|     return {
 | ||
|       cornerstoneStyle: {},
 | ||
|       layouts: [
 | ||
|         { index: 0, row: 1, col: 1, name: 'A' },
 | ||
|         { index: 1, row: 1, col: 2, name: 'A|A' },
 | ||
|         { index: 2, row: 1, col: 2, name: 'A|B' },
 | ||
|         { index: 3, row: 2, col: 2, name: 'A|A|A|A' }
 | ||
|         // { index: 2, row: 2, col: 1 },
 | ||
|         // { index: 3, row: 2, col: 2 }
 | ||
|       ],
 | ||
|       rotateArr: [
 | ||
|         { label: this.$t('trials:reading:button:rotateDefault'), val: 1 }, // 默认值
 | ||
|         { label: this.$t('trials:reading:button:rotateVertical'), val: 2 }, // 垂直翻转
 | ||
|         { label: this.$t('trials:reading:button:rotateHorizontal'), val: 3 }, // 水平翻转
 | ||
|         { label: this.$t('trials:reading:button:rotateTurnLeft'), val: 4 }, // 左转90度
 | ||
|         { label: this.$t('trials:reading:button:rotateTurnRight'), val: 5 }// 右转90度
 | ||
|       ],
 | ||
|       maxCanvas: 1,
 | ||
|       layoutRow: 1,
 | ||
|       layoutCol: 1,
 | ||
|       currentDicomCanvasIndex: 0,
 | ||
|       currentDicomCanvas: {
 | ||
|         toolState: {
 | ||
|           clipPlaying: false
 | ||
|         }
 | ||
|       },
 | ||
|       colormapsList: [],
 | ||
|       rotateList: [],
 | ||
|       colorList: [],
 | ||
|       wwwcList: [],
 | ||
|       canvasW: null,
 | ||
|       canvasH: null,
 | ||
|       activeTool: '',
 | ||
|       CriterionType: 0,
 | ||
|       measuredTools: [
 | ||
|         // 直径测量
 | ||
|         { toolName: 'Length', text: this.$t('trials:reading:button:length'), icon: 'length', isDisabled: false, disabledReason: '' },
 | ||
|         // 长短径测量
 | ||
|         { toolName: 'Bidirectional', text: this.$t('trials:reading:button:bidirectional'), icon: 'bidirection', isDisabled: false, disabledReason: '' },
 | ||
|         // 矩形工具
 | ||
|         { toolName: 'RectangleRoi', text: this.$t('trials:reading:button:rectangle'), icon: 'rectangle', isDisabled: false, disabledReason: '' },
 | ||
|         // 箭头工具
 | ||
|         { toolName: 'ArrowAnnotate', text: this.$t('trials:reading:button:arrowAnnotate'), icon: 'arrow', isDisabled: false, disabledReason: '' }
 | ||
| 
 | ||
|       ],
 | ||
|       fitType: 0,
 | ||
|       isDisabledTool: false,
 | ||
|       canvasObj: {},
 | ||
|       wwwcArr: [
 | ||
|         { label: this.$t('trials:reading:button:wwwcDefault'), val: -1, ww: null, wc: null }, // 默认值
 | ||
|         { label: this.$t('trials:reading:button:wwwcCustom'), val: 0, ww: null, wc: null }, // 自定义
 | ||
|         { label: this.$t('trials:reading:button:wwwcRegion'), val: 1, ww: null, wc: null }, // 区域窗宽
 | ||
|         { label: 'CT Brain', val: 5, wc: 40, ww: 80 },
 | ||
|         { label: 'CT Neck', val: 5, wc: 700, ww: 4000 },
 | ||
|         { label: 'CT Heart', val: 5, wc: 300, ww: 600 },
 | ||
|         { label: 'CT Lungs', val: 7, wc: -400, ww: 1500 },
 | ||
|         { label: 'CT Chest', val: 6, wc: 40, ww: 400 },
 | ||
|         { label: 'CT Abdomen', val: 2, wc: 60, ww: 400 },
 | ||
|         { label: 'CT Liver', val: 2, wc: 40, ww: 400 },
 | ||
|         { label: 'CT Bone', val: 4, wc: 300, ww: 1500 }
 | ||
|         // { label: 'CT Angio', val: 3, wc: 300, ww: 600 },
 | ||
| 
 | ||
|       ],
 | ||
|       activeSeries: {},
 | ||
|       seriesStack: [],
 | ||
|       trialId: '',
 | ||
|       isScrollSync: false,
 | ||
|       imageIndexSync: {
 | ||
|         sourceCanvas: '',
 | ||
|         targetCanvas: []
 | ||
|       },
 | ||
|       isFirstRender: false,
 | ||
|       customWwc: { visible: false, title: null }, // 自定义调窗
 | ||
|       hotkeysDialog: { visible: false, title: this.$t('trials:hotkeys:title:hotkey') }, // 热键
 | ||
|       layout: '',
 | ||
|       isFirstNotLinked: false,
 | ||
|       hotKeyList: []
 | ||
|     }
 | ||
|   },
 | ||
|   computed: {
 | ||
|     ...mapGetters(['visitTaskList'])
 | ||
|   },
 | ||
|   mounted() {
 | ||
|     this.getHotKeys()
 | ||
|     // cornerstone.imageCache.setMaximumSizeBytes(0)
 | ||
| 
 | ||
|     const maximumSizeInBytes = 1024 * 1024 * 1024 // 1 GB
 | ||
|     // const maximumSizeInBytes = 1024 * 1024 * 500
 | ||
|     cornerstone.imageCache.setMaximumSizeBytes(maximumSizeInBytes)
 | ||
| 
 | ||
|     // const cacheInfo = cornerstone.imageCache.getCacheInfo()
 | ||
|     // console.log(cacheInfo)
 | ||
|     this.customWwc = { visible: false, title: this.$t('trials:reading:dagTitle:wwwcCustom') }
 | ||
|     // this.isReadingTaskViewInOrder = this.$router.currentRoute.query.isReadingTaskViewInOrder === 'true'
 | ||
|     this.CriterionType = parseInt(localStorage.getItem('CriterionType'))
 | ||
|     console.log(this.CriterionType)
 | ||
|     if (this.CriterionType === 10) {
 | ||
|       this.measuredTools = [{ toolName: 'ArrowAnnotate', text: this.$t('trials:reading:button:arrowAnnotate'), icon: 'arrow', isDisabled: false, disabledReason: '' }, { toolName: 'RectangleRoi', text: this.$t('trials:reading:button:rectangle'), icon: 'rectangle', isDisabled: false, disabledReason: '' }]
 | ||
|     } else if (this.CriterionType === 17) {
 | ||
|       this.measuredTools = [{ toolName: 'Length', text: this.$t('trials:reading:button:length'), icon: 'length', isDisabled: false, disabledReason: '' }, { toolName: 'RectangleRoi', text: this.$t('trials:reading:button:rectangle'), icon: 'rectangle', isDisabled: false, disabledReason: '' }, { toolName: 'ArrowAnnotate', text: this.$t('trials:reading:button:arrowAnnotate'), icon: 'arrow', isDisabled: false, disabledReason: '' }]
 | ||
|     }
 | ||
|     this.rotateList[0] = '1'
 | ||
|     this.colorList[0] = ''
 | ||
|     this.wwwcList[0] = '1'
 | ||
|     this.colormapsList = cornerstone.colors.getColormapsList()
 | ||
|     this.currentDicomCanvas = this.$refs['dicomCanvas0'] ? this.$refs['dicomCanvas0'][0] : ''
 | ||
|     this.trialId = this.$router.currentRoute.query.trialId
 | ||
|     this.setCanvasStyle()
 | ||
|     window.addEventListener('resize', this.setCanvasStyle)
 | ||
|     DicomEvent.$on('updateImage', (instanceId) => {
 | ||
|       for (let i = 0; i < this.maxCanvas; i++) {
 | ||
|         var stack = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].stack
 | ||
|         if (stack.studyId) {
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].updateImage(instanceId)
 | ||
|         }
 | ||
|       }
 | ||
|     })
 | ||
|     DicomEvent.$on('getMeasureData', () => {
 | ||
|       for (let i = 0; i < this.maxCanvas; i++) {
 | ||
|         var stack = this.$refs[`dicomCanvas${i}`][0].stack
 | ||
|         if (stack.visitTaskId) {
 | ||
|           this.$refs[`dicomCanvas${i}`][0].getMeasureData()
 | ||
|           // if (callback) {
 | ||
|           //   callback(res)
 | ||
|           // }
 | ||
|         }
 | ||
|       }
 | ||
|       console.log('getMeasureData')
 | ||
|     })
 | ||
|     DicomEvent.$on('getScreenshots', (callback) => {
 | ||
|       var base64Str = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].getScreenshots()
 | ||
|       callback(base64Str)
 | ||
|       console.log('getScreenshots')
 | ||
|     })
 | ||
|     DicomEvent.$on('imageLocation', measuredData => {
 | ||
|       if (!measuredData) return
 | ||
|       this.imageLocation(measuredData)
 | ||
|       console.log('imageLocation')
 | ||
|     })
 | ||
|     DicomEvent.$on('setReadingState', readingTaskState => {
 | ||
|       this.canvasObj[this.currentDicomCanvasIndex].readingTaskState = readingTaskState
 | ||
|       if (this.activeTool) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(this.activeTool)
 | ||
|         this.activeTool = ''
 | ||
|       }
 | ||
|     })
 | ||
|     DicomEvent.$on('PGWC3Active', res => {
 | ||
|       this.setToolActive('ArrowAnnotate', true, null, 'open')
 | ||
|     })
 | ||
|     DicomEvent.$on('loadImageStacks', seriesList => {
 | ||
|       this.loadImageStacks(seriesList)
 | ||
|       console.log('loadImageStacks')
 | ||
|     })
 | ||
|     DicomEvent.$on('loadLinkedImageStack', seriesInfo => {
 | ||
|       this.loadLinkedImageStack(seriesInfo)
 | ||
|       console.log('loadLinkedImageStack')
 | ||
|     })
 | ||
|   },
 | ||
|   beforeDestroy() {
 | ||
|     DicomEvent.$off('updateImage')
 | ||
|     DicomEvent.$off('getMeasureData')
 | ||
|     DicomEvent.$off('imageLocation')
 | ||
|     DicomEvent.$off('setReadingState')
 | ||
|     DicomEvent.$off('loadImageStacks')
 | ||
|     DicomEvent.$off('loadLinkedImageStack')
 | ||
|   },
 | ||
|   methods: {
 | ||
|     getHotKeys() {
 | ||
|       const loading = this.$loading({ fullscreen: true })
 | ||
|       getDoctorShortcutKey({ imageToolType: 0 }).then(res => {
 | ||
|         res.Result.map(item => {
 | ||
|           this.hotKeyList.push({ id: item.Id, altKey: item.AltKey, ctrlKey: item.CtrlKey, shiftKey: item.ShiftKey, metaKey: item.MetaKey, key: item.Keyboardkey, code: item.Code, text: item.Text, shortcutKeyEnum: item.ShortcutKeyEnum })
 | ||
|         })
 | ||
|         this.bindHotKey()
 | ||
|         loading.close()
 | ||
|       }).catch(() => {
 | ||
|         loading.close()
 | ||
|       })
 | ||
|     },
 | ||
|     resetHotkeyList(arr) {
 | ||
|       this.hotKeyList = []
 | ||
| 
 | ||
|       arr.map(item => {
 | ||
|         this.hotKeyList.push({ id: item.id, altKey: item.keys.controlKey.altKey, ctrlKey: item.keys.controlKey.ctrlKey, shiftKey: item.keys.controlKey.shiftKey, metaKey: item.keys.controlKey.metaKey, key: item.keys.controlKey.key, code: item.keys.controlKey.code, text: item.keys.text, shortcutKeyEnum: item.label })
 | ||
|       })
 | ||
| 
 | ||
|       // const loading = this.$loading({ fullscreen: true })
 | ||
|       // getDoctorShortcutKey({ imageToolType: 0 }).then(res => {
 | ||
|       //   res.Result.map(item => {
 | ||
|       //     this.hotKeyList.push({ id: item.Id, altKey: item.AltKey, ctrlKey: item.CtrlKey, shiftKey: item.ShiftKey, metaKey: item.MetaKey, key: item.Keyboardkey, code: item.Code, text: item.Text, shortcutKeyEnum: item.ShortcutKeyEnum })
 | ||
|       //   })
 | ||
|       //   loading.close()
 | ||
|       // }).catch(() => {
 | ||
|       //   loading.close()
 | ||
|       // })
 | ||
|     },
 | ||
|     bindHotKey() {
 | ||
|       var container = this.$refs['container']
 | ||
|       // window.addEventListener
 | ||
|       container.addEventListener('keydown', event => {
 | ||
|         console.log(event)
 | ||
|         event.preventDefault()
 | ||
|         var idx = this.hotKeyList.findIndex(i => i.code === event.code && i.ctrlKey === event.ctrlKey && i.shiftKey === event.shiftKey && i.altKey === event.altKey)
 | ||
|         if (idx === -1) return
 | ||
|         var shortcutKeyEnum = this.hotKeyList[idx].shortcutKeyEnum
 | ||
|         if (shortcutKeyEnum === 1) {
 | ||
|         // 前一图像视口
 | ||
|           this.selectViewCanvas(-1)
 | ||
|         } else if (shortcutKeyEnum === 2) {
 | ||
|         // 后一图像视口
 | ||
|           this.selectViewCanvas(1)
 | ||
|         } else if (shortcutKeyEnum === 3) {
 | ||
|         // 上一个序列
 | ||
|           const series = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].series
 | ||
|           DicomEvent.$emit('selectSeries', { seriesId: series.seriesId, studyId: series.studyId, offset: -1 })
 | ||
|         } else if (shortcutKeyEnum === 4) {
 | ||
|         // 下一个序列
 | ||
|           const series = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].series
 | ||
|           DicomEvent.$emit('selectSeries', { seriesId: series.seriesId, studyId: series.studyId, offset: 1 })
 | ||
|         } else if (shortcutKeyEnum === 5) {
 | ||
|         // 上一张图像
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].scrollPage(-1)
 | ||
|         } else if (shortcutKeyEnum === 6) {
 | ||
|         // 下一张图像
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].scrollPage(1)
 | ||
|         } else if (shortcutKeyEnum === 7) {
 | ||
|         // 向左旋转
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setRotate(false, false, -90, 4)
 | ||
|         } else if (shortcutKeyEnum === 8) {
 | ||
|         // 向右旋转
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setRotate(false, false, 90, 5)
 | ||
|         } else if (shortcutKeyEnum === 9) {
 | ||
|         // 水平翻转
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setRotate(false, true, 0, 3)
 | ||
|         } else if (shortcutKeyEnum === 10) {
 | ||
|         // 垂直翻转
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setRotate(true, false, 0, 2)
 | ||
|         } else if (shortcutKeyEnum === 11) {
 | ||
|         // 放大
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setZoomScale(1)
 | ||
|         } else if (shortcutKeyEnum === 12) {
 | ||
|         // 缩小
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setZoomScale(0)
 | ||
|         } else if (shortcutKeyEnum === 13) {
 | ||
|         // 适应图像
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].fitToImage()
 | ||
|         } else if (shortcutKeyEnum === 14) {
 | ||
|         // 适应窗口
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].fitToWindow()
 | ||
|         } else if (shortcutKeyEnum === 15) {
 | ||
|         // 截图
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].saveImage()
 | ||
|         } else if (shortcutKeyEnum === 16) {
 | ||
|         // 反色
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].toggleInvert()
 | ||
|         } else if (shortcutKeyEnum === 17) {
 | ||
|           // 窗宽/窗位
 | ||
|           var wwwcArrIdx = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].wwwcArrIdx
 | ||
|           var wwwcArr = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].wwwcArr
 | ||
|           if (wwwcArrIdx + 1 === wwwcArr.length) {
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].wwwcArrIdx = 0
 | ||
|           } else {
 | ||
|             ++this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].wwwcArrIdx
 | ||
|           }
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setWwwc(this.wwwcArr[wwwcArrIdx].ww, this.wwwcArr[wwwcArrIdx].wc)
 | ||
|         } else if (shortcutKeyEnum === 18) {
 | ||
|           // 重置
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].resetViewport()
 | ||
|         }
 | ||
|       })
 | ||
|     },
 | ||
|     previewHotkeys() {
 | ||
|       this.hotkeysDialog.visible = true
 | ||
|     },
 | ||
|     setCornerstoneStyle(i) {
 | ||
|       if (this.cornerstoneStyle.position) {
 | ||
|         this.cornerstoneStyle = {}
 | ||
|         this.setCanvasStyle()
 | ||
|       } else {
 | ||
|         this.cornerstoneStyle = {
 | ||
|           position: 'absolute',
 | ||
|           top: '72px',
 | ||
|           left: '205px',
 | ||
|           right: '350px',
 | ||
|           zIndex: 10
 | ||
|         }
 | ||
|         this.canvasW = window.innerWidth - 570 + 'px'
 | ||
|         this.canvasH = window.innerHeight - 130 + 'px'
 | ||
|       }
 | ||
|       this.$nextTick(() => {
 | ||
|         // this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].reloadCanvas()
 | ||
|         for (var i = 0; i < this.maxCanvas; i++) {
 | ||
|           this.$refs[`dicomCanvas${i}`][0].reloadCanvas()
 | ||
|         }
 | ||
|       })
 | ||
|     },
 | ||
|     loadImageStacks(seriesList) {
 | ||
|       var l = seriesList.length > 1 ? 'A|B' : 'A'
 | ||
|       this.layout = l
 | ||
|       var i = this.layouts.findIndex(i => i.name === l)
 | ||
|       var layout = this.layouts[i]
 | ||
|       this.layoutRow = layout.row
 | ||
|       this.layoutCol = layout.col
 | ||
|       this.setCanvasStyle()
 | ||
|       this.maxCanvas = layout.row * layout.col
 | ||
|       this.$nextTick(() => {
 | ||
|         const elements = document.querySelectorAll('.cornerstone-element')
 | ||
|         Array.from(elements).forEach((element) => {
 | ||
|           cornerstone.enable(element)
 | ||
|           cornerstone.resize(element)
 | ||
|         })
 | ||
|         seriesList.map((series, index) => {
 | ||
|           this.canvasObj[index] = series
 | ||
|           if (series.isCurrentTask) {
 | ||
|             this.currentDicomCanvasIndex = index
 | ||
|             this.activeSeries = series
 | ||
|             this.$refs['measurementList'].initPage(series)
 | ||
|           }
 | ||
|           this.$refs[`dicomCanvas${index}`][0].loadImageStack(series)
 | ||
| 
 | ||
|           if (this.activeTool) {
 | ||
|             if (series.isCurrentTask && series.readingTaskState < 2) {
 | ||
|               this.$nextTick(() => {
 | ||
|                 this.$refs[`dicomCanvas${index}`][0].setToolPassive(this.activeTool)
 | ||
|               })
 | ||
|             } else {
 | ||
|               this.$nextTick(() => {
 | ||
|                 this.$refs[`dicomCanvas${index}`][0].setToolEnabled(this.activeTool)
 | ||
|               })
 | ||
|             }
 | ||
|             this.activeTool = ''
 | ||
|           }
 | ||
|         })
 | ||
|       })
 | ||
|     },
 | ||
|     loadImageStack(dicomSeries) {
 | ||
|       this.canvasObj[this.currentDicomCanvasIndex] = dicomSeries
 | ||
|       if (this.activeTool) {
 | ||
|         if (dicomSeries.isCurrentTask && dicomSeries.readingTaskState < 2) {
 | ||
|           this.$nextTick(() => {
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolPassive(this.activeTool)
 | ||
|           })
 | ||
|         } else {
 | ||
|           this.$nextTick(() => {
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(this.activeTool)
 | ||
|           })
 | ||
|         }
 | ||
|         this.activeTool = ''
 | ||
|       }
 | ||
|       this.$nextTick(() => {
 | ||
|         this.activeSeries = dicomSeries
 | ||
|         // !this.isFirstRender || dicomSeries.isFirstRender
 | ||
|         // if (!this.isFirstRender) {
 | ||
|         //   this.isFirstRender = true
 | ||
| 
 | ||
|         //   const idx = this.visitTaskList.findIndex(i => i.VisitTaskId === dicomSeries.visitTaskId)
 | ||
|         //   if (!this.visitTaskList[idx].IsBaseLineTask && this.isReadingTaskViewInOrder && this.visitTaskList.length > 1) {
 | ||
|         //     this.changeLayout('A|B')
 | ||
|         //   } else {
 | ||
|         //     this.changeLayout('A')
 | ||
|         //     // this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].loadImageStack(dicomSeries)
 | ||
|         //   }
 | ||
|         // } else {
 | ||
|         //   this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].loadImageStack(dicomSeries)
 | ||
|         //   // this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].loadImageStack(dicomSeries)
 | ||
|         // }
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].loadImageStack(dicomSeries)
 | ||
| 
 | ||
|         this.$refs['measurementList'].initPage(dicomSeries)
 | ||
|       })
 | ||
|     },
 | ||
|     loadLinkedImageStack(dicomSeries) {
 | ||
|       this.currentDicomCanvasIndex = dicomSeries.canvasIndex
 | ||
|       var canvasIndex = dicomSeries.canvasIndex
 | ||
|       this.canvasObj[canvasIndex] = dicomSeries
 | ||
|       if (this.activeTool) {
 | ||
|         if (dicomSeries.isCurrentTask && dicomSeries.readingTaskState < 2) {
 | ||
|           this.$nextTick(() => {
 | ||
|             this.$refs[`dicomCanvas${canvasIndex}`][0].setToolPassive(this.activeTool)
 | ||
|           })
 | ||
|         } else {
 | ||
|           this.$nextTick(() => {
 | ||
|             this.$refs[`dicomCanvas${canvasIndex}`][0].setToolEnabled(this.activeTool)
 | ||
|           })
 | ||
|         }
 | ||
|         this.activeTool = ''
 | ||
|       }
 | ||
|       this.$nextTick(() => {
 | ||
|         this.activeSeries = dicomSeries
 | ||
|         this.$refs[`dicomCanvas${canvasIndex}`][0].loadImageStack(dicomSeries)
 | ||
| 
 | ||
|         this.$refs['measurementList'].initPage(dicomSeries)
 | ||
|       })
 | ||
|     },
 | ||
|     // 给显示的画布设置显示的序列信息
 | ||
|     async getSeriesShowInCanvas(layout) {
 | ||
|       const loading = this.$loading({ fullscreen: true })
 | ||
|       if (layout.name === 'A') {
 | ||
|         // 判断当前激活窗口是否有序列信息
 | ||
|         if (this.activeSeries) {
 | ||
|           this.seriesStack = [this.activeSeries]
 | ||
|           this.currentDicomCanvasIndex = 0
 | ||
|           await this.setCanvas(this.seriesStack)
 | ||
|           loading.close()
 | ||
|         } else {
 | ||
|           const idx = this.visitTaskList.findIndex(i => i.IsCurrentTask)
 | ||
|           this.getFirstSeries(this.visitTaskList[idx]).then(async serires => {
 | ||
|             this.seriesStack = [serires]
 | ||
|             this.currentDicomCanvasIndex = 0
 | ||
|             await this.setCanvas(this.seriesStack)
 | ||
|             loading.close()
 | ||
|           })
 | ||
|         }
 | ||
|       } else if (layout.name === 'A|A') {
 | ||
|         if (this.activeSeries) {
 | ||
|           this.seriesStack = [this.activeSeries, this.activeSeries]
 | ||
|           this.currentDicomCanvasIndex = 0
 | ||
|           await this.setCanvas(this.seriesStack)
 | ||
|           loading.close()
 | ||
|         } else {
 | ||
|           const idx = this.visitTaskList.findIndex(i => i.IsCurrentTask)
 | ||
|           this.getFirstSeries(this.visitTaskList[idx]).then(async serires => {
 | ||
|             this.seriesStack = [serires, serires]
 | ||
|             this.currentDicomCanvasIndex = 0
 | ||
|             await this.setCanvas(this.seriesStack)
 | ||
|             loading.close()
 | ||
|           })
 | ||
|         }
 | ||
|       } else if (layout.name === 'A|B') {
 | ||
|         if (this.activeSeries) {
 | ||
|           const idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.activeSeries.visitTaskId)
 | ||
|           const visitTaskNum = this.visitTaskList[idx].VisitTaskNum
 | ||
|           if (visitTaskNum > 0 && this.visitTaskList.length > 1) {
 | ||
|             const baseIdx = this.visitTaskList.findIndex(i => i.IsBaseLineTask)
 | ||
|             this.getFirstSeries(this.visitTaskList[this.CriterionType === 10 ? visitTaskNum - 1 : baseIdx]).then(async baseSerires => {
 | ||
|               this.seriesStack = [baseSerires, this.activeSeries]
 | ||
|               this.currentDicomCanvasIndex = 1
 | ||
|               await this.setCanvas(this.seriesStack)
 | ||
|               loading.close()
 | ||
|             })
 | ||
|           } else {
 | ||
|             this.seriesStack = [this.activeSeries, this.activeSeries]
 | ||
|             this.currentDicomCanvasIndex = 1
 | ||
|             await this.setCanvas(this.seriesStack)
 | ||
|             loading.close()
 | ||
|           }
 | ||
|         } else {
 | ||
|           // 初始化
 | ||
|           const idx = this.visitTaskList.findIndex(i => i.IsCurrentTask)
 | ||
|           const visitTaskNum = this.visitTaskList[idx].VisitTaskNum
 | ||
|           if (visitTaskNum > 0) {
 | ||
|             // 随访
 | ||
|             const baseIdx = this.visitTaskList.findIndex(i => i.IsBaseLineTask)
 | ||
|             this.getFirstSeries(this.visitTaskList[baseIdx]).then(baseSerires => {
 | ||
|               this.getFirstSeries(this.visitTaskList[idx]).then(async serires => {
 | ||
|                 serires.ww = baseSerires.ww
 | ||
|                 serires.wc = baseSerires.wc
 | ||
|                 this.seriesStack = [baseSerires, serires]
 | ||
|                 this.currentDicomCanvasIndex = 1
 | ||
|                 await this.setCanvas(this.seriesStack)
 | ||
|                 loading.close()
 | ||
|               })
 | ||
|             })
 | ||
|           } else {
 | ||
|             // 基线
 | ||
|             this.getFirstSeries(this.visitTaskList[idx]).then(async serires => {
 | ||
|               this.seriesStack = [serires, serires]
 | ||
|               this.currentDicomCanvasIndex = 1
 | ||
|               await this.setCanvas(this.seriesStack)
 | ||
|               loading.close()
 | ||
|             })
 | ||
|           }
 | ||
|         }
 | ||
|       } else if (layout.name === 'A|A|A|A') {
 | ||
|         if (this.activeSeries) {
 | ||
|           this.seriesStack = [this.activeSeries, this.activeSeries, this.activeSeries, this.activeSeries]
 | ||
|           this.currentDicomCanvasIndex = 0
 | ||
|           await this.setCanvas(this.seriesStack)
 | ||
|           loading.close()
 | ||
|         } else {
 | ||
|           const idx = this.visitTaskList.findIndex(i => i.IsCurrentTask)
 | ||
|           this.getFirstSeries(this.visitTaskList[idx]).then(async serires => {
 | ||
|             this.seriesStack = [serires, serires, serires, serires]
 | ||
|             this.currentDicomCanvasIndex = 0
 | ||
|             await this.setCanvas(this.seriesStack)
 | ||
|             loading.close()
 | ||
|           })
 | ||
|         }
 | ||
|       }
 | ||
|     },
 | ||
|     // 设置画布序列信息
 | ||
|     setCanvas(seriesStack) {
 | ||
|       return new Promise(resolve => {
 | ||
|         var promiseArr = []
 | ||
|         for (let i = 0; i < this.maxCanvas && i < seriesStack.length; i++) {
 | ||
|           this.canvasObj[i] = seriesStack[i]
 | ||
|           promiseArr.push(this.$refs[`dicomCanvas${i}`][0].loadImageStack(seriesStack[i]))
 | ||
|         }
 | ||
|         Promise.all(promiseArr).then(() => {
 | ||
|           this.activateDicomCanvas(this.currentDicomCanvasIndex)
 | ||
|           resolve()
 | ||
|         }).catch(() => { resolve() })
 | ||
|       })
 | ||
|     },
 | ||
|     // 根据病灶标识定位图像
 | ||
|     async imageLocation(obj) {
 | ||
|       var loading = null
 | ||
|       var loadImagePromises = []
 | ||
|       var isScrollSync = this.isScrollSync
 | ||
|       var isActiveSeriesExistMark = false
 | ||
|       if (this.isScrollSync) {
 | ||
|         // 取消滚动同步
 | ||
|         this.isScrollSync = false
 | ||
|       }
 | ||
|       // 激活的窗口
 | ||
|       var activeCanvasTaskId = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].stack.visitTaskId
 | ||
|       var firstSeries = this.getSeriesInfoByMark(activeCanvasTaskId, obj)
 | ||
|       if (firstSeries) {
 | ||
|         DicomEvent.$emit('activeSeries', firstSeries)
 | ||
|         // this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].isSetWwc = false
 | ||
|         loadImagePromises.push(this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].loadImageStack(firstSeries))
 | ||
|         isActiveSeriesExistMark = true
 | ||
|       } else {
 | ||
|         firstSeries = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].series
 | ||
|       }
 | ||
|       // 非激活窗口
 | ||
| 
 | ||
|       for (let i = 0; i < this.maxCanvas; i++) {
 | ||
|         if (i !== this.currentDicomCanvasIndex && this.$refs[`dicomCanvas${i}`][0].stack && this.$refs[`dicomCanvas${i}`][0].stack.seriesId) {
 | ||
|           var visitTaskId = this.$refs[`dicomCanvas${i}`][0].stack.visitTaskId
 | ||
|           // 新病灶 || 基线病灶obj.lesionType === 2 || obj.lesionType === 4 既往新病灶
 | ||
|           if ((this.CriterionType === 1) || (this.CriterionType === 10)) {
 | ||
|             var index = this.visitTaskList.findIndex(i => i.VisitTaskId === activeCanvasTaskId)
 | ||
|             var idx = -1
 | ||
|             if (this.CriterionType === 10) {
 | ||
|               idx = this.visitTaskList[index].MeasureData.findIndex(item => {
 | ||
|                 return item.OrderMarkName === obj.lesionName
 | ||
|               })
 | ||
|               if (idx > -1) {
 | ||
|                 visitTaskId = this.visitTaskList[index].MeasureData[idx].FristAddTaskId
 | ||
|               }
 | ||
|             } else {
 | ||
|               idx = this.visitTaskList[index].MeasureData.findIndex(item => item.QuestionId === obj.questionId && item.RowIndex === obj.rowIndex)
 | ||
|               if (idx > -1) {
 | ||
|                 visitTaskId = this.visitTaskList[index].MeasureData[idx].FristAddTaskId
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
| 
 | ||
|           var taskIdx = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
 | ||
|           if (this.visitTaskList[taskIdx].VisitTaskId && !this.visitTaskList[taskIdx].IsInit) {
 | ||
|             loading = this.$loading({ fullscreen: true })
 | ||
|             if (!this.visitTaskList[taskIdx].measureDataInit) {
 | ||
|               await store.dispatch('reading/getMeasuredData', this.visitTaskList[taskIdx].VisitTaskId)
 | ||
|             }
 | ||
|             if (!this.visitTaskList[taskIdx].studyListInit) {
 | ||
|               await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: this.visitTaskList[taskIdx].VisitId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId, taskBlindName: this.visitTaskList[taskIdx].TaskBlindName })
 | ||
|             }
 | ||
|             if (!this.visitTaskList[taskIdx].readingQuestionsInit) {
 | ||
|               await store.dispatch('reading/getReadingQuestionAndAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
 | ||
|             }
 | ||
|             if (!this.visitTaskList[taskIdx].questionsInit) {
 | ||
|               await store.dispatch('reading/getDicomReadingQuestionAnswer', { trialId: this.trialId, visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
 | ||
|             }
 | ||
| 
 | ||
|             await store.dispatch('reading/setStatus', { visitTaskId: this.visitTaskList[taskIdx].VisitTaskId })
 | ||
|           }
 | ||
| 
 | ||
|           var secondSeries = this.getSeriesInfoByMark(visitTaskId, obj)
 | ||
|           if (!secondSeries) {
 | ||
|             secondSeries = this.getLinkedSeries(firstSeries, visitTaskId)
 | ||
|             if (!secondSeries || secondSeries.seriesId === this.$refs[`dicomCanvas${i}`][0].series.seriesId) {
 | ||
|               secondSeries = this.$refs[`dicomCanvas${i}`][0].series
 | ||
|             } else {
 | ||
|               secondSeries = secondSeries || this.$refs[`dicomCanvas${i}`][0].series
 | ||
|             }
 | ||
|           }
 | ||
|           DicomEvent.$emit('activeSeries', secondSeries)
 | ||
|           loadImagePromises.push(this.$refs[`dicomCanvas${i}`][0].loadImageStack(secondSeries))
 | ||
|           if (!isActiveSeriesExistMark && secondSeries) {
 | ||
|             const activeTaskId = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].stack.visitTaskId
 | ||
|             var canvasIdx = this.currentDicomCanvasIndex === 0 ? 1 : 0
 | ||
|             if (i === canvasIdx) {
 | ||
|               const series = this.getLinkedSeries(this.$refs[`dicomCanvas${canvasIdx}`][0].series, activeTaskId)
 | ||
|               if (series) {
 | ||
|                 loadImagePromises.push(this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].loadImageStack(series))
 | ||
|                 DicomEvent.$emit('activeSeries', series)
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|       Promise.all(loadImagePromises)
 | ||
|         .then(() => {
 | ||
|           this.isScrollSync = isScrollSync
 | ||
|         })
 | ||
|       if (loading) {
 | ||
|         loading.close()
 | ||
|       }
 | ||
|     },
 | ||
|     selectViewCanvas(offset) {
 | ||
|       var canvasIndex = this.currentDicomCanvasIndex + offset
 | ||
|       if (canvasIndex < 0 || canvasIndex >= this.maxCanvas) return
 | ||
|       this.activateDicomCanvas(canvasIndex)
 | ||
|     },
 | ||
|     // 废弃
 | ||
|     imageLocation1(obj) {
 | ||
|       var isScrollSync = this.isScrollSync
 | ||
|       if (this.isScrollSync) {
 | ||
|         // 取消滚动同步
 | ||
|         this.isScrollSync = false
 | ||
|       }
 | ||
|       if (this.layout === 'A|B') {
 | ||
|         // 新病灶,视图显示新病灶第一次出现时访视下的序列,
 | ||
| 
 | ||
|         // 第一个视图所在的任务有标记,第二个视图所在的任务无标记时,第二个任务与第一个任务对齐
 | ||
| 
 | ||
|         if (this.$refs[`dicomCanvas0`][0].stack && this.$refs[`dicomCanvas0`][0].stack.seriesId) {
 | ||
|           const firstVisitTaskId = this.$refs[`dicomCanvas0`][0].stack.visitTaskId
 | ||
|           const firstSeries = this.getSeriesInfoByMark(firstVisitTaskId, obj)
 | ||
|           console.log('firstSeries', firstSeries)
 | ||
|           if (firstSeries && this.$refs[`dicomCanvas1`][0].stack && this.$refs[`dicomCanvas1`][0].stack.seriesId) {
 | ||
|             const secondVisitTaskId = this.$refs[`dicomCanvas1`][0].stack.visitTaskId
 | ||
|             const secondSeries = this.getSeriesInfoByMark(secondVisitTaskId, obj)
 | ||
|             console.log('secondSeries', secondSeries)
 | ||
|             if (!secondSeries) {
 | ||
|               var loadImagePromises = [this.$refs[`dicomCanvas0`][0].loadImageStack(firstSeries)]
 | ||
| 
 | ||
|               DicomEvent.$emit('activeSeries', firstSeries)
 | ||
|               this.$refs[`dicomCanvas0`][0].isSetWwc = false
 | ||
|               var seriesInfo = this.getLinkedSeries(firstSeries, secondVisitTaskId)
 | ||
|               if (Object.keys(seriesInfo).length !== 0) {
 | ||
|                 loadImagePromises.push(this.$refs[`dicomCanvas1`][0].loadImageStack(seriesInfo.series))
 | ||
|                 DicomEvent.$emit('activeSeries', seriesInfo)
 | ||
|                 this.$refs[`dicomCanvas1`][0].isSetWwc = false
 | ||
|               }
 | ||
|               Promise.all(loadImagePromises)
 | ||
|                 .then(() => {
 | ||
|                   this.isScrollSync = isScrollSync
 | ||
|                 })
 | ||
|               return
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|       // 根据病灶标识(T01),所有canvas都跳转到当前canvas所属任务下T01所在的影像,没有则不处理
 | ||
|       var loadImagePromiseArr = []
 | ||
|       for (let i = 0; i < this.maxCanvas; i++) {
 | ||
|         if (this.$refs[`dicomCanvas${i}`][0].stack && this.$refs[`dicomCanvas${i}`][0].stack.seriesId) {
 | ||
|           var visitTaskId = this.$refs[`dicomCanvas${i}`][0].stack.visitTaskId
 | ||
|           // 根据任务ID测量病灶信息
 | ||
|           var index = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
 | ||
|           if (index > -1 && this.visitTaskList[index].measureDataInit) {
 | ||
|             var idx = -1
 | ||
|             if (this.CriterionType === 10) {
 | ||
|               idx = this.visitTaskList[index].MeasureData.findIndex(item => {
 | ||
|                 return item.OrderMarkName === obj.lesionName
 | ||
|               })
 | ||
|             } else {
 | ||
|               idx = this.visitTaskList[index].MeasureData.findIndex(item => item.QuestionId === obj.questionId && item.RowIndex === obj.rowIndex)
 | ||
|             }
 | ||
|             if (idx > -1 && this.visitTaskList[index].MeasureData[idx].MeasureData) {
 | ||
|               var studyList = this.visitTaskList[index].StudyList
 | ||
|               var studyId = this.visitTaskList[index].MeasureData[idx].StudyId
 | ||
|               var seriesId = this.visitTaskList[index].MeasureData[idx].SeriesId
 | ||
|               var instanceId = this.visitTaskList[index].MeasureData[idx].InstanceId
 | ||
|               var studyIdx = studyList.findIndex(study => study.StudyId === studyId)
 | ||
|               if (studyIdx > -1) {
 | ||
|                 var seriesIdx = studyList[studyIdx].SeriesList.findIndex(s => s.seriesId === seriesId)
 | ||
|                 if (seriesIdx > -1) {
 | ||
|                   var series = studyList[studyIdx].SeriesList[seriesIdx]
 | ||
|                   // var instanceIdx = series.imageIds.findIndex(imageId => !!~imageId.indexOf(instanceId))
 | ||
|                   var instanceIdx = series.instanceList.findIndex(imageId => !!~imageId.indexOf(instanceId))
 | ||
|                   if (instanceIdx > -1) {
 | ||
|                     series.imageIdIndex = instanceIdx
 | ||
|                     this.$refs[`dicomCanvas${i}`][0].isSetWwc = false
 | ||
|                     loadImagePromiseArr.push(this.$refs[`dicomCanvas${i}`][0].loadImageStack(series))
 | ||
|                     DicomEvent.$emit('activeSeries', { visitTaskId: visitTaskId, studyId, studyIndex: studyIdx, seriesIndex: series.seriesIndex })
 | ||
|                   }
 | ||
|                 }
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|       Promise.all(loadImagePromiseArr)
 | ||
|         .then(() => {
 | ||
|           this.isScrollSync = isScrollSync
 | ||
|         })
 | ||
|     },
 | ||
|     // 根据标记获取标记所在的序列信息
 | ||
|     getSeriesInfoByMark(visitTaskId, obj) {
 | ||
|       var seriesInfo = null
 | ||
|       // 根据任务ID测量病灶信息
 | ||
|       var index = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
 | ||
| 
 | ||
|       if (index > -1) {
 | ||
|         var idx = -1
 | ||
|         if (this.CriterionType === 10) {
 | ||
|           idx = this.visitTaskList[index].MeasureData.findIndex(item => item.OrderMarkName === obj.lesionName)
 | ||
|         } else {
 | ||
|           idx = this.visitTaskList[index].MeasureData.findIndex(item => item.QuestionId === obj.questionId && item.RowIndex === obj.rowIndex)
 | ||
|         }
 | ||
|         if (idx > -1 && this.visitTaskList[index].MeasureData[idx].MeasureData) {
 | ||
|           var studyList = this.visitTaskList[index].StudyList
 | ||
|           var studyId = this.visitTaskList[index].MeasureData[idx].StudyId
 | ||
|           var seriesId = this.visitTaskList[index].MeasureData[idx].SeriesId
 | ||
|           var instanceId = this.visitTaskList[index].MeasureData[idx].InstanceId
 | ||
|           var studyIdx = studyList.findIndex(study => study.StudyId === studyId)
 | ||
|           if (studyIdx > -1) {
 | ||
|             var seriesIdx = studyList[studyIdx].SeriesList.findIndex(s => s.seriesId === seriesId)
 | ||
|             if (seriesIdx > -1) {
 | ||
|               var series = studyList[studyIdx].SeriesList[seriesIdx]
 | ||
|               // var instanceIdx = series.imageIds.findIndex(imageId => !!~imageId.indexOf(instanceId))
 | ||
|               var instanceIdx = series.instanceList.findIndex(imageId => !!~imageId.indexOf(instanceId))
 | ||
|               if (instanceIdx > -1) {
 | ||
|                 series.imageIdIndex = instanceIdx
 | ||
|                 // series.studyIndex = studyIdx
 | ||
|                 // series.seriesIndex = seriesIdx
 | ||
|                 // this.$refs[`dicomCanvas${i}`][0].isSetWwc = false
 | ||
|                 // loadImagePromiseArr.push(this.$refs[`dicomCanvas${i}`][0].loadImageStack(series))
 | ||
|                 // series.visitTaskId = visitTaskId
 | ||
|                 // series.studyId = studyId
 | ||
|                 seriesInfo = series
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|       return seriesInfo
 | ||
|     },
 | ||
|     getLinkedSeries(baseSeries, visitTaskId) {
 | ||
|       var index = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
 | ||
|       var visitTaskInfo = this.visitTaskList[index]
 | ||
|       var obj = null
 | ||
|       var studyList = visitTaskInfo.StudyList
 | ||
|       // 查找筛选描述一致
 | ||
|       var seriesList = studyList.map(s => s.SeriesList).flat()
 | ||
|       var similarArr = seriesList.map((i, index) => {
 | ||
|         return { similar: this.strSimilarity2Percent(i.description, baseSeries.description), index }
 | ||
|       })
 | ||
|       similarArr = similarArr.sort((a, b) => {
 | ||
|         return b.similar - a.similar
 | ||
|       })
 | ||
|       const i = similarArr[0] && similarArr[0].similar > 0.85 ? similarArr[0].index : -1
 | ||
|       if (i > -1) {
 | ||
|         obj = seriesList[i]
 | ||
|       }
 | ||
| 
 | ||
|       // const idx = seriesList.findIndex(series => series.description === baseSeries.description)
 | ||
|       // idx > -1 ? obj = seriesList[idx] : ''
 | ||
|       if (!obj) {
 | ||
|         // 描述不一致,则筛选层厚一致
 | ||
|         const idx = seriesList.findIndex(series => series.sliceThickness === baseSeries.sliceThickness)
 | ||
|         idx > -1 ? obj = seriesList[idx] : ''
 | ||
|       }
 | ||
|       if (!obj) {
 | ||
|         // 层厚不一致,则筛选图像数量一致
 | ||
|         const idx = seriesList.findIndex(series => series.instanceCount === baseSeries.instanceCount)
 | ||
|         idx > -1 ? obj = seriesList[idx] : ''
 | ||
|       }
 | ||
|       // if (!obj) {
 | ||
|       //   const idx = seriesList.findIndex(series => series.isDicom && series.instanceCount > 0)
 | ||
|       //   idx > -1 ? obj = seriesList[idx] : ''
 | ||
|       // }
 | ||
| 
 | ||
|       if (obj) {
 | ||
|         obj.imageIdIndex = Math.floor(obj.imageIds.length * (baseSeries.imageIdIndex / baseSeries.instanceCount))
 | ||
|       }
 | ||
|       return obj
 | ||
|     },
 | ||
|     strSimilarity2Number(s, t) {
 | ||
|       var n = s.length; var m = t.length; var d = []
 | ||
|       var i, j, s_i, t_j, cost
 | ||
|       if (n === 0) return m
 | ||
|       if (m === 0) return n
 | ||
|       for (i = 0; i <= n; i++) {
 | ||
|         d[i] = []
 | ||
|         d[i][0] = i
 | ||
|       }
 | ||
|       for (j = 0; j <= m; j++) {
 | ||
|         d[0][j] = j
 | ||
|       }
 | ||
|       for (i = 1; i <= n; i++) {
 | ||
|         s_i = s.charAt(i - 1)
 | ||
|         for (j = 1; j <= m; j++) {
 | ||
|           t_j = t.charAt(j - 1)
 | ||
|           if (s_i === t_j) {
 | ||
|             cost = 0
 | ||
|           } else {
 | ||
|             cost = 1
 | ||
|           }
 | ||
|           d[i][j] = this.Minimum(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost)
 | ||
|         }
 | ||
|       }
 | ||
|       return d[n][m]
 | ||
|     },
 | ||
|     // 两个字符串的相似程度,并返回相似度百分比
 | ||
|     strSimilarity2Percent(s, t) {
 | ||
|       var l = s.length > t.length ? s.length : t.length
 | ||
|       var d = this.strSimilarity2Number(s, t)
 | ||
|       return Number((1 - d / l).toFixed(4))
 | ||
|     },
 | ||
|     Minimum(a, b, c) {
 | ||
|       return a < b ? (a < c ? a : c) : (b < c ? b : c)
 | ||
|     },
 | ||
|     getLinkedSeries1(baseSeries, visitTaskId) {
 | ||
|       var index = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
 | ||
|       var visitTaskInfo = this.visitTaskList[index]
 | ||
|       var obj = {}
 | ||
|       var studyList = visitTaskInfo.StudyList
 | ||
|       // 筛选描述一致
 | ||
|       var seriseArr = []
 | ||
|       studyList.forEach((s, i) => {
 | ||
|         var series = s.SeriesList.filter(series => series.description === baseSeries.description)
 | ||
|         series.length > 0 ? seriseArr.push(...series) : ''
 | ||
|       })
 | ||
|       if (seriseArr.length > 0) {
 | ||
|         // 描述一致,则筛选层厚一致
 | ||
|         var stSeriseArr = seriseArr.filter(s => s.sliceThickness === baseSeries.sliceThickness)
 | ||
|         if (stSeriseArr.length > 0) {
 | ||
|           // 层厚一致,则筛选图像数量一致
 | ||
|           var icSeriseArr = stSeriseArr.filter(s => s.instanceCount === baseSeries.instanceCount)
 | ||
|           if (icSeriseArr.length > 0) {
 | ||
|             const sIdx = icSeriseArr[0].studyIndex
 | ||
|             const series = icSeriseArr[0]
 | ||
|             var imageIdIndex = Math.floor(series.imageIds.length * (baseSeries.imageIdIndex / baseSeries.instanceCount))
 | ||
|             obj.studyId = series.studyId
 | ||
|             obj.studyIndex = sIdx
 | ||
|             obj.seriesIndex = series.seriesIndex
 | ||
|             obj.series = series
 | ||
|             obj.series.imageIdIndex = imageIdIndex
 | ||
|             obj.seriesId = series.seriesId
 | ||
|             obj.visitTaskId = visitTaskId
 | ||
|           } else {
 | ||
|             const sIdx = stSeriseArr[0].studyIndex
 | ||
|             const series = stSeriseArr[0]
 | ||
|             const imageIdIndex = Math.floor(series.imageIds.length * (baseSeries.imageIdIndex / baseSeries.instanceCount))
 | ||
|             obj.studyIndex = sIdx
 | ||
|             obj.studyId = series.studyId
 | ||
|             obj.seriesIndex = series.seriesIndex
 | ||
|             obj.series = series
 | ||
|             obj.series.imageIdIndex = imageIdIndex
 | ||
|             obj.seriesId = series.seriesId
 | ||
|             obj.visitTaskId = visitTaskId
 | ||
|           }
 | ||
|         } else {
 | ||
|           const sIdx = seriseArr[0].studyIndex
 | ||
|           const series = seriseArr[0]
 | ||
|           const imageIdIndex = Math.floor(series.imageIds.length * (baseSeries.imageIdIndex / baseSeries.instanceCount))
 | ||
|           obj.studyIndex = sIdx
 | ||
|           obj.studyId = series.studyId
 | ||
|           obj.seriesIndex = series.seriesIndex
 | ||
|           obj.series = series
 | ||
|           obj.series.imageIdIndex = imageIdIndex
 | ||
|           obj.seriesId = series.seriesId
 | ||
|           obj.visitTaskId = visitTaskId
 | ||
|         }
 | ||
|       } else {
 | ||
|         // if (!this.isFirstNotLinked) {
 | ||
|         //   this.isFirstNotLinked = true
 | ||
|         //   // 都不符合要求, 判断是否存在层厚为5的序列,否则显示第一个检查的第一个序列
 | ||
|         //   var seriesObj = null
 | ||
|         //   for (let i = 0; i < studyList.length; i++) {
 | ||
|         //     const seriesIdx = studyList[i].SeriesList.findIndex(s => s.sliceThickness && parseInt(s.sliceThickness) === 5)
 | ||
|         //     if (seriesIdx > -1) {
 | ||
|         //       seriesObj = { studyIndex: i, seriesIdx, series: studyList[i].SeriesList[seriesIdx] }
 | ||
|         //       break
 | ||
|         //     }
 | ||
|         //   }
 | ||
|         //   if (seriesObj) {
 | ||
|         //     obj.studyIndex = seriesObj.studyIndex
 | ||
|         //     obj.seriesIndex = seriesObj.seriesIdx
 | ||
|         //     seriesObj.series.imageIdIndex = Math.floor(seriesObj.series.imageIds.length / 2)
 | ||
|         //     obj.series = seriesObj.series
 | ||
|         //     obj.seriesId = seriesObj.series.seriesId
 | ||
|         //   } else {
 | ||
|         //     const sIdx = studyList.findIndex(s => s.IsDicom)
 | ||
|         //     const series = studyList[sIdx].SeriesList[0]
 | ||
|         //     series.imageIdIndex = Math.floor(series.imageIds.length / 2)
 | ||
|         //     obj.studyIndex = sIdx
 | ||
|         //     obj.seriesIndex = 0
 | ||
|         //     obj.series = series
 | ||
|         //     obj.seriesId = series.seriesId
 | ||
|         //   }
 | ||
|         // }
 | ||
|       }
 | ||
|       return obj
 | ||
|     },
 | ||
|     // 获取某个任务下第一个序列信息
 | ||
|     async getFirstSeries(visitTaskList) {
 | ||
|       if (visitTaskList && !visitTaskList.studyListInit) {
 | ||
|         await store.dispatch('reading/getStudyInfo', { trialId: this.trialId, subjectVisitId: visitTaskList.VisitId, visitTaskId: visitTaskList.VisitTaskId, taskBlindName: visitTaskList.TaskBlindName })
 | ||
| 
 | ||
|         await store.dispatch('reading/getMeasuredData', visitTaskList.VisitTaskId)
 | ||
|       }
 | ||
|       var index = this.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskList.VisitTaskId)
 | ||
|       var studyList = this.visitTaskList[index].StudyList
 | ||
|       var idx = studyList.findIndex(i => i.SeriesList.length > 0)
 | ||
|       if (idx > -1) {
 | ||
|         const seriesIdx = studyList[idx].SeriesList.findIndex(i => i.isDicom)
 | ||
|         return seriesIdx > -1 ? studyList[idx].SeriesList[seriesIdx] : ''
 | ||
|       } else {
 | ||
|         return ''
 | ||
|       }
 | ||
|     },
 | ||
| 
 | ||
|     // 设置画布大小
 | ||
|     setCanvasStyle() {
 | ||
|       this.canvasW = (window.innerWidth - 570) / this.layoutCol + 'px'
 | ||
|       this.canvasH = (window.innerHeight - 130) / this.layoutRow + 'px'
 | ||
|     },
 | ||
|     // 切换布局
 | ||
|     changeLayout(name) {
 | ||
|       this.layout = name
 | ||
|       var i = this.layouts.findIndex(i => i.name === name)
 | ||
|       var layout = this.layouts[i]
 | ||
|       this.layoutRow = layout.row
 | ||
|       this.layoutCol = layout.col
 | ||
|       this.setCanvasStyle()
 | ||
|       this.maxCanvas = layout.row * layout.col
 | ||
|       this.$nextTick(() => {
 | ||
|         const elements = document.querySelectorAll('.cornerstone-element')
 | ||
|         Array.from(elements).forEach((element) => {
 | ||
|           cornerstone.enable(element)
 | ||
|           cornerstone.resize(element)
 | ||
|         })
 | ||
|         this.getSeriesShowInCanvas(layout)
 | ||
|       })
 | ||
|     },
 | ||
|     // 更新画布
 | ||
|     updateCanvas(measureData) {
 | ||
|       for (let i = 0; i < this.maxCanvas; i++) {
 | ||
|         var stack = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].stack
 | ||
|         if (stack.studyId) {
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].removeToolState(measureData)
 | ||
|         }
 | ||
|       }
 | ||
|     },
 | ||
|     // 旋转
 | ||
|     setDicomCanvasRotate(value) {
 | ||
|       const type = parseInt(value)
 | ||
|       if (type === 1) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].resetRotate()
 | ||
|       } else if (type === 2) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setRotate(true, false, 0, type)
 | ||
|       } else if (type === 3) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setRotate(false, true, 0, type)
 | ||
|       } else if (type === 4) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setRotate(false, false, -90, type)
 | ||
|       } else if (type === 5) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setRotate(false, false, 90, type)
 | ||
|       }
 | ||
|     },
 | ||
|     // 激活画布
 | ||
|     activateDicomCanvas(index) {
 | ||
|       if (index !== this.currentDicomCanvasIndex) {
 | ||
|         var dicomSeries = this.canvasObj[this.currentDicomCanvasIndex]
 | ||
|         this.activeSeries = dicomSeries
 | ||
|         if (this.activeTool) {
 | ||
|           if (dicomSeries.isCurrentTask && dicomSeries.readingTaskState < 2) {
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolPassive(this.activeTool)
 | ||
|           } else {
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(this.activeTool)
 | ||
|           }
 | ||
|           this.activeTool = ''
 | ||
|         }
 | ||
| 
 | ||
|         this.currentDicomCanvasIndex = index
 | ||
|         this.currentDicomCanvas = this.$refs[`dicomCanvas${index}`]
 | ||
|         this.currentDicomCanvas.tabIndex = 0
 | ||
|         if (!this.rotateList[this.currentDicomCanvasIndex]) {
 | ||
|           this.rotateList[this.currentDicomCanvasIndex] = '1'
 | ||
|         }
 | ||
|         if (!this.colorList[this.currentDicomCanvasIndex]) {
 | ||
|           this.colorList[this.currentDicomCanvasIndex] = ''
 | ||
|         }
 | ||
|         if (!this.wwwcList[this.currentDicomCanvasIndex]) {
 | ||
|           this.wwwcList[this.currentDicomCanvasIndex] = '1'
 | ||
|         }
 | ||
|         var stack = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].stack
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`].focus()
 | ||
|         if (stack.studyId) {
 | ||
|           DicomEvent.$emit('toggleVisitList', stack)
 | ||
|         }
 | ||
|       }
 | ||
|     },
 | ||
|     // 鼠标移入测量工具时,判断工具是否可激活
 | ||
|     enter(e, toolName) {
 | ||
|       var i = this.measuredTools.findIndex(item => item.toolName === toolName)
 | ||
|       if (i === -1) return
 | ||
|       var dicomSeries = this.canvasObj[this.currentDicomCanvasIndex]
 | ||
|       if (dicomSeries && (!dicomSeries.isCurrentTask || dicomSeries.readingTaskState >= 2)) {
 | ||
|         this.measuredTools[i].isDisabled = true
 | ||
|         e.target.style.cursor = 'not-allowed'
 | ||
|         if (this.activeTool) {
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(toolName)
 | ||
|           this.activeTool = ''
 | ||
|         }
 | ||
|       } else {
 | ||
|         // var obj = this.$refs['measurementList'].isCanActiveTool(toolName, true)
 | ||
|         var obj = this.$refs['measurementList'].isCanActiveTool(toolName, true)
 | ||
|         this.measuredTools[i].disabledReason = obj.reason
 | ||
|         if (!obj.isCanActiveTool) {
 | ||
|           if (this.activeTool) {
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolPassive(toolName)
 | ||
|             this.activeTool = ''
 | ||
|           }
 | ||
|           this.measuredTools[i].isDisabled = true
 | ||
|           e.target.style.cursor = 'not-allowed'
 | ||
|         } else {
 | ||
|           this.measuredTools[i].isDisabled = false
 | ||
|           e.target.style.cursor = 'pointer'
 | ||
|         }
 | ||
|       }
 | ||
|     },
 | ||
|     // 设置测量工具启用(不会对输入作出反应)
 | ||
|     setToolActive(toolName, isMeasuredTool, e, type) {
 | ||
|       console.log('setToolActive', toolName)
 | ||
|       if (isMeasuredTool) {
 | ||
|         // var i = this.measuredTools.findIndex(item => item.toolName === toolName)
 | ||
|         // if (i === -1 && this.measuredTools[i].isDisabled) return
 | ||
| 
 | ||
|         var toolObj = this.measuredTools.find(i => i.toolName === toolName)
 | ||
|         if (!toolObj || toolObj.isDisabled) return
 | ||
|         var dicomSeries = this.canvasObj[this.currentDicomCanvasIndex]
 | ||
|         if (dicomSeries.isCurrentTask && isMeasuredTool && dicomSeries.readingTaskState < 2) {
 | ||
|           if (this.activeTool && !type) {
 | ||
|             this.measuredTools.forEach(item => {
 | ||
|               this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolPassive(item.toolName)
 | ||
|             })
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolPassive(toolName)
 | ||
|             // this.activeTool = ''
 | ||
|             this.activeTool = toolName
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolActive(toolName)
 | ||
|           } else {
 | ||
|             this.measuredTools.forEach(item => {
 | ||
|               this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolPassive(item.toolName)
 | ||
|             })
 | ||
|             this.activeTool = toolName
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolActive(toolName)
 | ||
|           }
 | ||
|         } else {
 | ||
|           if (!this.activeTool) return
 | ||
|           this.measuredTools.forEach(item => {
 | ||
|             this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(item.toolName)
 | ||
|           })
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(toolName)
 | ||
|           this.activeTool = ''
 | ||
|         }
 | ||
|       } else {
 | ||
|         if (this.activeTool === toolName) {
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(toolName)
 | ||
|           this.activeTool = ''
 | ||
|         } else {
 | ||
|           this.activeTool = toolName
 | ||
|           this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolActive(toolName)
 | ||
|         }
 | ||
|       }
 | ||
|     },
 | ||
|     // 设置测量工具禁用(不会对输入作出反应)
 | ||
|     setToolEnabled() {
 | ||
|       var dicomSeries = this.canvasObj[this.currentDicomCanvasIndex]
 | ||
|       if (!dicomSeries.isCurrentTask) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(this.activeTool)
 | ||
|         this.activeTool = ''
 | ||
|         return
 | ||
|       }
 | ||
|       if (this.activeTool) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(this.activeTool)
 | ||
|         this.activeTool = ''
 | ||
|       }
 | ||
|     },
 | ||
|     // 影像适应图像/适应窗口
 | ||
|     fitToType(toolName) {
 | ||
|       if (this.activeTool !== 'fitToWindow' && this.activeTool !== 'fitToImage') {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolPassive(this.activeTool)
 | ||
|       }
 | ||
|       if (toolName === 'fitToWindow') {
 | ||
|         this.fitType = 0
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].fitToWindow()
 | ||
|       } else if (toolName === 'fitToImage') {
 | ||
|         this.fitType = 1
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].fitToImage()
 | ||
|       }
 | ||
|       this.activeTool = toolName
 | ||
|     },
 | ||
|     // 添加标记
 | ||
|     setMeasureData(data) {
 | ||
|       this.$refs['measurementList'].setMeasuredData(data)
 | ||
|       this.activeTool = ''
 | ||
|     },
 | ||
|     // 修改标记
 | ||
|     modifyMeasureData(data) {
 | ||
|       this.$refs['measurementList'].modifyMeasuredData(data)
 | ||
|       this.activeTool = ''
 | ||
|     },
 | ||
|     saveImage() {
 | ||
|       this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].saveImage()
 | ||
|     },
 | ||
|     // 设置窗宽/窗位
 | ||
|     setDicomCanvasWwwc(v) {
 | ||
|       if (v.val === -1) {
 | ||
|         // 默认值
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].resetWwwc()
 | ||
|       } else if (v.val === 0) {
 | ||
|         // 自定义
 | ||
|         this.setCustomWwwc()
 | ||
|       } else if (v.val === 1) {
 | ||
|         // 区域窗宽
 | ||
|         // this.setToolActive('WwwcRegion', false)
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolActive('WwwcRegion')
 | ||
|       } else if (v.val === 8) {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].toggleInvert()
 | ||
|       } else {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setWwwc(v.ww, v.wc)
 | ||
|       }
 | ||
|     },
 | ||
|     setCustomWwwc() {
 | ||
|       this.customWwc.visible = true
 | ||
|     },
 | ||
|     setWwwc(v) {
 | ||
|       this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setWwwc(v.ww, v.wc)
 | ||
|       this.customWwc.visible = false
 | ||
|     },
 | ||
|     toggleInvert() {
 | ||
|       if (this.activeTool === 'reversecolor') {
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].resetWwwc()
 | ||
|         this.activeTool = ''
 | ||
|       } else {
 | ||
|         this.activeTool = 'reversecolor'
 | ||
|         this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].toggleInvert()
 | ||
|       }
 | ||
|     },
 | ||
|     setImageIndexSync() {
 | ||
|       this.isScrollSync = !this.isScrollSync
 | ||
|       // if (this.isImageIndexSync) {
 | ||
|       //   for (var i = 0; i < this.maxCanvas; i++) {
 | ||
|       //     if (i === this.currentDicomCanvasIndex) {
 | ||
|       //       this.imageIndexSync.sourceCanvas = this.$refs[`dicomCanvas${i}`][0].canvas
 | ||
|       //     } else {
 | ||
|       //       this.imageIndexSync.targetCanvas.push(this.$refs[`dicomCanvas${i}`][0].canvas)
 | ||
|       //     }
 | ||
|       //   }
 | ||
|       // }
 | ||
|     },
 | ||
|     scrollSync(obj) {
 | ||
|       for (var i = 0; i < this.maxCanvas; i++) {
 | ||
|         if (i !== obj.canvasIndex) {
 | ||
|           this.$refs[`dicomCanvas${i}`][0].scrollPage(obj.direction)
 | ||
|         }
 | ||
|       }
 | ||
|     },
 | ||
|     // setImageIndexSync() {
 | ||
|     //   this.isImageIndexSync = !this.isImageIndexSync
 | ||
|     //   if (!this.imageIndexSync) {
 | ||
|     //     this.imageIndexSync = new cornerstoneTools.Synchronizer(
 | ||
|     //       'cornerstonenewimage',
 | ||
|     //       cornerstoneTools.stackImagePositionOffsetSynchronizer
 | ||
|     //     )
 | ||
|     //     for (var i = 0; i < this.maxCanvas; i++) {
 | ||
|     //       if (i === this.currentDicomCanvasIndex) {
 | ||
|     //         this.imageIndexSync.add(this.$refs[`dicomCanvas${i}`][0].canvas)
 | ||
|     //       } else {
 | ||
|     //         this.imageIndexSync.add(this.$refs[`dicomCanvas${i}`][0].canvas)
 | ||
|     //       }
 | ||
|     //     }
 | ||
|     //     this.imageIndexSync.enabled = true
 | ||
|     //   } else {
 | ||
|     //     this.imageIndexSync.destroy()
 | ||
|     //     this.imageIndexSync = null
 | ||
|     //   }
 | ||
|     // },
 | ||
|     showPanel(e) {
 | ||
|       e.currentTarget.firstChild.lastChild.style.display = 'block'
 | ||
|     },
 | ||
|     handleMouseout(e) {
 | ||
|       e.currentTarget.firstChild.lastChild.style.display = 'none'
 | ||
|     },
 | ||
|     // 预览临床数据
 | ||
|     previewCD() {
 | ||
|       // const idx = this.visitTaskList.findIndex(i => i.IsCurrentTask)
 | ||
|       // if (idx > -1) {
 | ||
|       //   if (this.visitTaskList[idx].ReadingTaskState < 2) {
 | ||
|       //     var visitTaskId = this.visitTaskList[idx].VisitTaskId
 | ||
|       //     readClinicalData({ visitTaskId }).then(res => {
 | ||
|       //       console.log(res)
 | ||
|       //     })
 | ||
|       //   }
 | ||
|       // }
 | ||
| 
 | ||
|       this.$emit('previewCD')
 | ||
|     },
 | ||
|     previewNoneDicoms() {
 | ||
|       this.$emit('previewNoneDicoms')
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| </script>
 | ||
| <style lang="scss" scoped>
 | ||
| .dicom-viewer-wrapper{
 | ||
|   height: 100%;
 | ||
|   padding: 5px 0px 5px 5px;
 | ||
|   box-sizing: border-box;
 | ||
|   .divider{
 | ||
|     display: block;
 | ||
|     height: 1px;
 | ||
|     width: 100%;
 | ||
|     margin: 10px 0;
 | ||
|     // background-color: #383838;
 | ||
|     // color: #fff;
 | ||
|     // background-color: #DCDFE6;
 | ||
|   }
 | ||
|   .el-divider__text{
 | ||
|     padding: 0 10px;
 | ||
|     color: #fff;
 | ||
|     background-color: #383838;
 | ||
|     font-size: 12px;
 | ||
|     width: 80px;
 | ||
|   }
 | ||
|   .dicom-viewer-container{
 | ||
|     display:flex;
 | ||
|     flex-direction: column;
 | ||
|     height: 100%;
 | ||
|   }
 | ||
|   ::-webkit-scrollbar {
 | ||
|     width: 5px;
 | ||
|     height: 5px;
 | ||
|   }
 | ||
|   ::-webkit-scrollbar-thumb {
 | ||
|     border-radius: 10px;
 | ||
|     background: #d0d0d0;
 | ||
|   }
 | ||
|   .dicom-tools{
 | ||
|     box-sizing: border-box;
 | ||
|     width: 100%;
 | ||
|     height: 80px;
 | ||
|     padding: 0 5px;
 | ||
|     border: 1px solid #727272;
 | ||
|     display: flex;
 | ||
|     flex-direction: row;
 | ||
|     justify-content: flex-start;
 | ||
|     align-items: center;
 | ||
|     .tool-wrapper{
 | ||
|       display: flex;
 | ||
|       flex-direction: column;
 | ||
|       justify-content: center;
 | ||
|       align-items: center;
 | ||
|       margin-right: 30px;
 | ||
|       .icon{
 | ||
|         padding: 5px;
 | ||
|         border: 1px solid #404040;
 | ||
|         cursor: pointer;
 | ||
|         text-align: center;
 | ||
|         .svg-icon{
 | ||
|           font-size:20px;
 | ||
|           color:#ddd;
 | ||
|         }
 | ||
|       }
 | ||
|       .text{
 | ||
|         position: relative;
 | ||
|         font-size: 12px;
 | ||
|         margin-top: 5px;
 | ||
|         color: #d0d0d0;
 | ||
|         display: none;
 | ||
|       }
 | ||
|     }
 | ||
|     .tool_active{
 | ||
|       background-color: #607d8b;
 | ||
|     }
 | ||
|     .tool_disabled{
 | ||
|       cursor:not-allowed
 | ||
|     }
 | ||
|     .icon:hover{
 | ||
|       background-color: #607d8b;
 | ||
|     }
 | ||
|     .dropdown {
 | ||
|       position: relative;
 | ||
|       display: inline-block;
 | ||
|       .text{
 | ||
|         text-align: center;
 | ||
|       }
 | ||
|     }
 | ||
| 
 | ||
|     .dropdown-content {
 | ||
|       display: none;
 | ||
|       position: absolute;
 | ||
|       background-color: #383838;
 | ||
|       color: #fff;
 | ||
|       box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
 | ||
|       z-index: 9999;
 | ||
|       font-size: 12px;
 | ||
|       ul{
 | ||
|         list-style: none;
 | ||
|         margin: 0;
 | ||
|         padding: 0;
 | ||
|         text-align: center;
 | ||
|         li{
 | ||
|           a{
 | ||
|             display: block;
 | ||
|             padding: 5px 0px;
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|       ul li:hover a{
 | ||
|         background-color: #727272;
 | ||
|       }
 | ||
|     }
 | ||
| 
 | ||
|     // .dropdown:hover .dropdown-content {
 | ||
|     //   display: block;
 | ||
| 
 | ||
|     // }
 | ||
|     .layout-content ul li{
 | ||
|       border-top:1px solid #ddd;
 | ||
|       border-left:1px solid #ddd;
 | ||
|     }
 | ||
|     .layout-content ul  .flex_row{
 | ||
|       // border: 1px solid #ddd;
 | ||
|       display: flex;
 | ||
|       justify-content: space-between;
 | ||
|       flex-direction: row;
 | ||
|       align-items: center;
 | ||
|       // padding: 2px;
 | ||
|       margin-bottom: 2px;
 | ||
|     }
 | ||
|     .layout-content ul .flex_column{
 | ||
|       display: flex;
 | ||
|       justify-content: space-between;
 | ||
|       flex-direction: column;
 | ||
|       align-items: center;
 | ||
|       margin-bottom: 2px;
 | ||
|     }
 | ||
|     .layout_box_1_1{
 | ||
|       flex:1;
 | ||
|       // border: 1px solid #ddd;
 | ||
|       line-height: 30px;
 | ||
|       font-size: 12px;
 | ||
|       text-align: center;
 | ||
|       border-bottom:1px solid #ddd;
 | ||
|       border-right:1px solid #ddd;
 | ||
|       // padding: 0 5px;
 | ||
|     }
 | ||
|     .layout_box_1_2{
 | ||
|       flex:1;
 | ||
|       // border: 1px solid #ddd;
 | ||
|       line-height: 15px;
 | ||
|       font-size: 10px;
 | ||
|       text-align: center;
 | ||
|       border-bottom:1px solid #ddd;
 | ||
|       border-right:1px solid #ddd;
 | ||
|       // padding: 0 5px;
 | ||
|     }
 | ||
|     .layout-content li .layout_box_1_1 :last-child{
 | ||
|       color: red;
 | ||
|     }
 | ||
|     // .layout_li:last-child{
 | ||
|     //   .layout_box{
 | ||
|     //     border-bottom: none;
 | ||
|     //   }
 | ||
|     // }
 | ||
|     .layout-content li:hover {
 | ||
|       cursor: pointer;
 | ||
|       background-color: #727272;
 | ||
|     }
 | ||
| 
 | ||
|   }
 | ||
|   .dicom-viewers{
 | ||
|     box-sizing: border-box;
 | ||
|     flex: 1;
 | ||
|     // width: 100%;
 | ||
|     margin-top: 5px;
 | ||
|     height: 100%;
 | ||
|     display: flex;
 | ||
|     flex-direction: row;
 | ||
|     justify-content: flex-start;
 | ||
|     .form-container{
 | ||
|       // box-sizing: border-box;
 | ||
|       width: 350px;
 | ||
|       height: 100%;
 | ||
|       border: 1px solid #727272;
 | ||
|       // overflow-y: auto;
 | ||
|     }
 | ||
|     .viewer-container{
 | ||
|       box-sizing: border-box;
 | ||
|       flex: 1;
 | ||
|       height: 100%;
 | ||
|       border: 1px solid #727272;
 | ||
|     }
 | ||
| 
 | ||
|     .measurement-container{
 | ||
|       // height: 100%;
 | ||
|       overflow-y: auto;
 | ||
|     }
 | ||
|     .box{
 | ||
|       display: grid;
 | ||
|       box-sizing: border-box;
 | ||
|       height: 100%;
 | ||
|       padding: 0;
 | ||
|       .item{
 | ||
|         box-sizing: border-box;
 | ||
|         position: relative;
 | ||
|         border: 1px solid rgba(255, 255, 255, 0.21);
 | ||
|         position: relative;
 | ||
|         &_active{
 | ||
|           // border: 2px solid #ffeb3b;
 | ||
|           border: 1px dashed #fff;
 | ||
| 
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|     .box_1_1{
 | ||
|       grid-template-columns: repeat(1, 100%); //1列,占100%
 | ||
|       grid-template-rows: repeat(1, 100%); //1行,占100%
 | ||
|     }
 | ||
|     .box_1_2{
 | ||
|       grid-template-columns: repeat(2, 50%); //1列,占50%
 | ||
|       grid-template-rows: repeat(1, 100%); //1行,占100%
 | ||
|     }
 | ||
|     .box_2_1{
 | ||
|       grid-template-columns: repeat(1, 100%); //1列,占100%
 | ||
|       grid-template-rows: repeat(2, 50%); //1行,占50%
 | ||
|     }
 | ||
|     .box_2_2{
 | ||
|       grid-template-columns: repeat(2, 50%); //1列,占50%
 | ||
|       grid-template-rows: repeat(2, 50%); //1行,占50%
 | ||
|     }
 | ||
| 
 | ||
|     // .box_3_1{
 | ||
|     //   grid-template-columns: repeat(3, 100%); //1列,占100%
 | ||
|     //   grid-template-rows: repeat(3, 33.33%); //1行,占100%
 | ||
|     // }
 | ||
|     // .box_3_2{
 | ||
|     //   grid-template-columns: repeat(3, 50%); //1列,占100%
 | ||
|     //   grid-template-rows: repeat(3, 50%); //1行,占100%
 | ||
|     // }
 | ||
|     // .box_3_3{
 | ||
|     //   grid-template-columns: repeat(3, 33.33%); //1列,占100%
 | ||
|     //   grid-template-rows: repeat(3, 33.33%); //1行,占100%
 | ||
|     // }
 | ||
| 
 | ||
|   }
 | ||
| }
 | ||
| </style>
 |