新加beta 页面

This commit is contained in:
任珮宇 2024-01-11 13:47:10 +08:00
parent 0fd0634c70
commit bed1fb4830
7 changed files with 1640 additions and 111 deletions

View File

@ -0,0 +1,292 @@
<template>
<div class="beta-gamma-analysis">
<a-spin :spinning="isLoading">
<!-- 二级交互栏 -->
<div class="spectrum-analysis-sub-operators">
<pop-over-with-icon placement="bottomLeft">
Detailed-Information
<beta-gamma-detailed-infomation slot="content" :data="spectrumData" />
</pop-over-with-icon>
<pop-over-with-icon placement="bottomLeft">
QC Flags
<beta-gamma-qc-flags slot="content" :data="qcFlags" @click="handleQcFlagClick" />
</pop-over-with-icon>
<custom-select
v-model="spectraType"
:options="SampleType"
@change="changeChartByType"
style="width: 246px"
class="sample-select"
></custom-select>
<div @click="handleDetalSelfStationCache">删除</div>
</div>
<!-- 二级交互栏结束 -->
<!-- 主体部分 -->
<div class="beta-gamma-analysis-main">
<!-- 中间图表部分 -->
<div class="beta-gamma-analysis-main-charts">
<div class="beta-gamma-analysis-main-charts-left">
<beta-gamma-chart-container>
<template slot="title"> Beta-Gamma Spectrum: Sample </template>
<beta-gamma-spectrum
ref="betaChartRef"
:betaEnergyData="betaEnergyData"
:gammaEnergyData="gammaEnergyData"
:histogramDataList="histogramDataList"
:boundary="boundaryList"
/>
</beta-gamma-chart-container>
</div>
<div class="beta-gamma-analysis-main-charts-right">
<beta-gamma-chart-container>
<template slot="title"> ROI LIMITS </template>
<roi-limits ref="RoiChartRef" :ROILists="ROILists" />
</beta-gamma-chart-container>
</div>
</div>
<!-- 中间图表部分结束 -->
<!-- 底部显示 -->
<div class="beta-gamma-analysis-main-bottom">
<div class="beta-gamma-analysis-main-bottom-left">
<beta-gamma-chart-container>
<template slot="title"> Result display </template>
<result-display-beta :data="resultDisplay" @sendFlag="handleGetFlag"></result-display-beta>
</beta-gamma-chart-container>
</div>
<div class="beta-gamma-analysis-main-bottom-right">
<beta-gamma-chart-container>
<template slot="title"> ROI Param </template>
<roi-param :roiParam="roiParam" />
</beta-gamma-chart-container>
</div>
</div>
<!-- 底部显示结束 -->
</div>
<!-- 主体部分结束 -->
</a-spin>
</div>
</template>
<script>
import PopOverWithIcon from './components/SubOperators/PopOverWithIcon.vue'
import BetaGammaDetailedInfomation from './components/SubOperators/BetaGammaDetailedInfomation.vue'
import BetaGammaQcFlags from './components/SubOperators/BetaGammaQcFlags.vue'
import CustomSelect from '@/components/CustomSelect/index.vue'
import BetaGammaChartContainer from './components/BetaGammaChartContainer.vue'
import ResultDisplayBeta from './components/ResultDisplay-Beta.vue'
import BetaGammaSpectrum from './components/BetaGammaSpectrum.vue'
import RoiLimits from './components/RoiLimits.vue'
import RoiParam from './components/RoiParam.vue'
import axios from 'axios'
import { getAction, postAction, deleteAction } from '../../api/manage'
const SampleType = [
{
label: 'Sample Data',
value: 'sample',
},
{
label: 'GasBg Data',
value: 'gasBg',
},
{
label: 'DetBg Data',
value: 'detBg',
},
{
label: 'QC Data',
value: 'qc',
},
]
export default {
components: {
PopOverWithIcon,
BetaGammaDetailedInfomation,
BetaGammaQcFlags,
CustomSelect,
BetaGammaChartContainer,
ResultDisplayBeta,
BetaGammaSpectrum,
RoiLimits,
RoiParam,
},
data() {
this.SampleType = SampleType
return {
isLoading: false,
spectrumData: {}, // Detailed Infomation
spectraType: 'sample',
histogramDataList: [],
gammaEnergyData: [],
betaEnergyData: [],
ROILists: [],
roiParam: {
ROIOneStart: 0,
ROIOneStop: 0,
ROITwoStart: 0,
ROITwoStop: 0,
ROIThreeStart: 0,
ROIThreeStop: 0,
ROIFourStart: 0,
ROIFourStop: 0,
},
boundaryList: [],
sampleDetail: {},
qcFlags: {},
resultDisplay: [],
}
},
mounted() {
this.getSelfStationSampleDetail()
},
methods: {
async handleDetalSelfStationCache() {
let params = {
sampleFileName: 'ABC01_001-20240108_1405_S_FULL_40186.0.PHD',
}
try {
const { success, result, message } = await deleteAction('/selfStation/deleteSelfStationCache', params)
} catch (error) {
console.error(error)
}
},
async getSelfStationSampleDetail() {
let params = {
sampleFileName: 'ABC01_001-20240108_1405_S_FULL_40186.0.PHD',
detFileName: 'ABC01_001-20240108_1327_D_FULL_381505.PHD',
}
try {
this.isLoading = true
this.cancelLastRequest()
const cancelToken = this.createCancelToken()
const { success, result, message } = await getAction('/selfStation/loadFromFile', params, cancelToken)
if (success) {
this.sampleDetail = result
const {
spectrumData,
betaEnergyData,
gammaEnergyData,
histogramDataList,
ROIOneList,
ROITwoList,
ROIThreeList,
ROIFourList,
ROIOneStart,
ROIOneStop,
ROITwoStart,
ROITwoStop,
ROIThreeStart,
ROIThreeStop,
ROIFourStart,
ROIFourStop,
} = this.sampleDetail
this.spectrumData = spectrumData
this.histogramDataList = histogramDataList
this.gammaEnergyData = gammaEnergyData
this.betaEnergyData = betaEnergyData
this.ROILists = [ROIOneList, ROITwoList, ROIThreeList, ROIFourList]
this.roiParam.ROIOneStart = ROIOneStart
this.roiParam.ROIOneStop = ROIOneStop
this.roiParam.ROITwoStart = ROITwoStart
this.roiParam.ROITwoStop = ROITwoStop
this.roiParam.ROIThreeStart = ROIThreeStart
this.roiParam.ROIThreeStop = ROIThreeStop
this.roiParam.ROIFourStart = ROIFourStart
this.roiParam.ROIFourStop = ROIFourStop
let boundary1 = { minX: 500, maxX: ROIOneStop, minY: 0, maxY: 4096 }
let boundary2 = { minX: ROITwoStart, maxX: ROITwoStop, minY: 0, maxY: 4096 }
let boundary3 = { minX: ROIThreeStart, maxX: ROIThreeStop, minY: 0, maxY: 4096 }
let boundary4 = { minX: ROIFourStart, maxX: ROIFourStop, minY: 0, maxY: 4096 }
this.boundaryList.push(boundary1, boundary2, boundary3, boundary4)
// this.$store.commit('ADD_SAMPLE_DATA', {
// inputFileName: this.sample.sampleFileName,
// data: result,
// from: 'file',
// })
this.isLoading = false
} else {
this.$message.error(message)
}
} catch (error) {
console.error(error)
}
},
cancelLastRequest() {
if (this._cancelToken && typeof this._cancelToken == 'function') {
this._cancelToken()
}
},
createCancelToken() {
const cancelToken = new axios.CancelToken((c) => {
this._cancelToken = c
})
return cancelToken
},
changeChartByType(val) {
console.log(val)
},
handleQcFlagClick(item) {
console.log(item)
},
handleGetFlag(val, obj) {
console.log(val, obj)
},
},
destroyed() {
this.cancelLastRequest()
},
}
</script>
<style lang="less" scoped>
.beta-gamma-analysis {
height: 100%;
.ant-spin-nested-loading {
height: 100%;
::v-deep {
.ant-spin-container {
height: 100%;
}
}
}
.sample-select {
::v-deep {
.ant-select-selection {
background-color: transparent !important;
color: #ade6ee;
}
}
}
&-main {
height: calc(100% - 51px);
overflow: auto hidden;
&-charts {
height: calc(100% - 220px);
display: flex;
gap: 30px;
overflow: auto hidden;
&-left {
flex: 1;
}
&-right {
flex: 1;
}
}
&-bottom {
margin-top: 20px;
height: 234px;
display: flex;
gap: 30px;
overflow: auto hidden;
&-left {
flex: 1;
}
&-right {
flex: 1;
}
}
}
}
</style>

View File

@ -0,0 +1,758 @@
<template>
<div class="beta-gamma-spectrum-chart">
<div class="beta-gamma-spectrum-chart-operators">
<span
v-for="(item, index) in buttons"
:key="item"
:class="active == index ? 'active' : ''"
@click="handleChange(index)"
>
{{ item }}
</span>
<span @click="handleUnzoom">Unzoom</span>
<span @click="handleROI">ROI</span>
<span @click="handleUpdate">Update</span>
</div>
<div class="beta-gamma-spectrum-chart-main">
<!-- 2D 图表为了相应Unzoom采用的v-show -->
<div class="_2d-chart" v-show="active == 0">
<CustomChart
ref="chartTwoDRef"
:option="twoDOption"
@zr:mousedown="handleMouseDown"
@zr:mouseup="handleMouseUp"
/>
<!-- @brushEnd="handleBrushEnd" -->
<!-- @zr:mousemove="handleMouseMove" -->
<div class="bar">
<color-palette v-model="currCount" />
<div>{{ currCount }}</div>
<div class="bar-main"></div>
<div>0</div>
</div>
</div>
<!-- 2D图表结束 -->
<CustomChart v-if="active == 1" key="1" ref="roiLimitsRef" :option="gammaOption" />
<CustomChart v-if="active == 2" key="2" ref="roiLimitsRef" :option="betaOption" />
</div>
</div>
</template>
<script>
import CustomChart from '@/components/CustomChart/index.vue'
import ColorPalette from './ColorPalette.vue'
import { getXAxisAndYAxisByPosition, rangeNumber } from '@/utils/chartHelper.js'
const buttons = ['Beta-Gamma', 'Gamma', 'Beta']
// Beta-Gamma
const twoDOption = {
grid: {
top: 15,
left: 60,
right: 20,
bottom: 45,
},
tooltip: {
trigger: 'item',
formatter: (params) => {
const [b, g, c] = params.value
return `Beta: ${b}<br>Gamma: ${g}<br>Count: ${c}`
},
axisPointer: {
animation: false,
type: 'cross',
lineStyle: {
type: 'dashed',
},
},
},
xAxis: {
name: 'Beta Channel',
nameTextStyle: {
color: '#5b9cba',
fontSize: 16,
},
nameLocation: 'center',
nameGap: 30,
axisLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisLabel: {
color: '#ade6ee',
fontSize: 12,
},
splitLine: {
show: true,
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisTick: {
show: false,
},
min: 0,
max: 1024,
interval: 128,
},
yAxis: {
name: 'Gamma Channel',
nameTextStyle: {
color: '#5b9cba',
fontSize: 16,
},
nameLocation: 'center',
nameGap: 40,
axisLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisLabel: {
color: '#ade6ee',
fontSize: 12,
},
splitLine: {
show: true,
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisTick: {
show: false,
},
min: 0,
max: 4096,
interval: 512,
},
series: {
type: 'scatterGL',
symbolSize: 4,
data: [],
itemStyle: {
color: '#fff',
},
markLine: {
silent: true,
symbol: 'none',
data: [],
animation: false,
lineStyle: {
type: 'solid',
width: 2,
},
},
},
brush: {},
animation: false,
}
// Gamma
const gammaOption = {
grid: {
top: 15,
left: 55,
right: 18,
bottom: 45,
},
tooltip: {},
xAxis: {
type: 'category',
boundaryGap: false,
splitLine: {
show: true,
interval: 'auto',
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisLabel: {
fontSize: 12,
color: '#ade6ee',
},
},
yAxis: {
type: 'value',
splitLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisLabel: {
fontSize: 12,
color: '#ade6ee',
},
},
series: {
name: '今日',
type: 'line',
smooth: true,
showSymbol: false,
symbol: 'circle',
symbolSize: 6,
data: [],
itemStyle: {
normal: {
color: '#baaa3d',
},
},
lineStyle: {
normal: {
width: 2,
},
},
},
}
// Beta
const betaOption = {
grid: {
top: 15,
left: 55,
right: 18,
bottom: 45,
},
tooltip: {},
xAxis: {
type: 'category',
boundaryGap: false,
splitLine: {
show: true,
interval: 'auto',
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisLabel: {
fontSize: 12,
color: '#ade6ee',
},
},
yAxis: {
type: 'value',
splitLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisLabel: {
fontSize: 12,
color: '#ade6ee',
},
},
series: {
name: '今日',
type: 'line',
smooth: true,
showSymbol: false,
symbol: 'circle',
symbolSize: 6,
data: [],
itemStyle: {
normal: {
color: '#baaa3d',
},
},
lineStyle: {
normal: {
width: 2,
},
},
},
}
export default {
components: {
CustomChart,
ColorPalette,
},
props: {
histogramDataList: {
type: Array,
default: () => [],
},
gammaEnergyData: {
type: Array,
default: () => [],
},
betaEnergyData: {
type: Array,
default: () => [],
},
boundary: {
type: Array,
default: () => [],
},
},
watch: {
// 2D
histogramDataList: {
handler() {
this.active = 0
this.buildScatterList()
},
immediate: true,
},
gammaEnergyData: {
handler(newVal) {
this.buildGammaLineList(newVal)
},
immediate: true,
},
betaEnergyData: {
handler(newVal) {
this.buildBetaLineList(newVal)
},
immediate: true,
},
// 2D
boundary: {
handler(newVal) {
newVal.forEach((item, index) => {
item.color = '#99CA53'
})
this.boundaryData = newVal[0]
this.reDrawRect()
},
immediate: true,
},
currCount: {
handler() {
this.buildScatterList()
},
immediate: true,
},
},
data() {
this.buttons = buttons
return {
active: 0,
twoDOption,
gammaOption,
betaOption,
currCount: 50,
showROI: true,
}
},
mounted() {
this.twoDOption.brush = { toolbox: [] }
},
methods: {
// Gamma 线
buildGammaLineList(val) {
const gammaSeries = this.gammaOption.series
gammaSeries.data = val.map((item, index) => [index, item])
},
// Beta 线
buildBetaLineList(val) {
const betaSeries = this.betaOption.series
betaSeries.data = val.map((item, index) => [index, item])
},
// scatter
buildScatterList() {
const {
xAxis: { min: minX, max: maxX },
yAxis: { min: minY, max: maxY },
} = this.twoDOption
this.twoDOption.series.data = this.histogramDataList
.filter(({ b, g, c }) => c && b >= minX && b <= maxX && g >= minY && g <= maxY)
.map(({ b, g, c }) => this.buildScatterItem(b, g, c))
console.log('this.twoDOption.series.data', this.twoDOption.series.data)
},
// scatter
buildScatterItem(xAxis, yAxis, count) {
const { r, g, b } = this.interpolateColor(1 - count / this.currCount)
return {
value: [xAxis, yAxis],
itemStyle: {
color: `rgb(${r}, ${g}, ${b})`,
},
}
},
//
reDrawRect() {
const rectList = []
if (this.showROI) {
const { minX, maxX, minY, maxY, color } = this.boundaryData
// rect
const rect = [
[minX, minY],
[maxX, minY],
[maxX, maxY],
[minX, maxY],
]
rectList.push(...this.drawOneRect(rect, color))
}
this.twoDOption.series.markLine.data = rectList
},
/**
* 绘制一个矩形框区域
* 矩形框在这里的实现是由几条线段围起来的但由于线段在超出图表区域显示有问题故作了以下处理
* @param {*} rect 左下 右下 右上 左上 的顺序
*/
drawOneRect(rect, color) {
const rectList = []
const {
xAxis: { min: minX, max: maxX },
yAxis: { min: minY, max: maxY },
} = this.twoDOption
const inchartPoints = this.getInChartPoints(rect)
const outchartPoints = rect.filter((pointItem) => !inchartPoints.includes(pointItem))
//
if (inchartPoints.length == 2) {
const [point1, point2] = inchartPoints
const isVerticleLine = this.isVerticleLine(point1, point2)
// 线
if (isVerticleLine) {
const find = outchartPoints.find((outcharPoint) => point1[1] == outcharPoint[1]) //
//
const isLeft = find[0] <= point1[0]
/**
* 如果在左边推入左边俩点构成矩形
* y
* |________________
* | |
* |________________|
* |
* | x
**/
if (isLeft) {
inchartPoints.forEach((point) => {
rectList.push(this.generateLineDataByTwoPoints([minX, point[1]], point))
})
rectList.push(this.generateLineDataByTwoPoints(point1, point2))
}
//
else {
inchartPoints.forEach((point) => {
rectList.push(this.generateLineDataByTwoPoints([maxX, point[1]], point))
})
rectList.push(this.generateLineDataByTwoPoints(point1, point2))
}
}
// 线
else {
const find = outchartPoints.find((outcharPoint) => point1[0] == outcharPoint[0]) //
//
const isBottom = find[1] <= point1[1]
/**
* 如果在下边推入下边俩点构成矩形
**/
if (isBottom) {
inchartPoints.forEach((point) => {
rectList.push(this.generateLineDataByTwoPoints([point[0], minY], point))
})
rectList.push(this.generateLineDataByTwoPoints(point1, point2))
}
//
else {
inchartPoints.forEach((point) => {
rectList.push(this.generateLineDataByTwoPoints([point[0], maxY], point))
})
rectList.push(this.generateLineDataByTwoPoints(point1, point2))
}
}
}
//
else if (inchartPoints.length == 1) {
const point = inchartPoints[0]
const isLeft = !!outchartPoints.find((outPoint) => outPoint[0] < point[0])
const isBottom = !!outchartPoints.find((outPoint) => outPoint[1] < point[1])
//
if (isLeft && isBottom) {
rectList.push(this.generateLineDataByTwoPoints(point, [minX, point[1]]))
rectList.push(this.generateLineDataByTwoPoints(point, [point[0], minY]))
}
//
if (isLeft && !isBottom) {
rectList.push(this.generateLineDataByTwoPoints(point, [minX, point[1]]))
rectList.push(this.generateLineDataByTwoPoints(point, [point[0], maxY]))
}
//
if (!isLeft && !isBottom) {
rectList.push(this.generateLineDataByTwoPoints(point, [maxX, point[1]]))
rectList.push(this.generateLineDataByTwoPoints(point, [point[0], maxY]))
}
//
if (!isLeft && isBottom) {
rectList.push(this.generateLineDataByTwoPoints(point, [maxX, point[1]]))
rectList.push(this.generateLineDataByTwoPoints(point, [point[0], minY]))
}
}
//
else if (inchartPoints.length == 4) {
//
rect.forEach((point, index) => {
if (index == rect.length - 1) {
rectList.push(this.generateLineDataByTwoPoints(point, rect[0]))
} else {
rectList.push(this.generateLineDataByTwoPoints(point, rect[index + 1]))
}
})
}
//
else {
//
const xAxisList = rect.map((item) => item[0]).filter((xAxis) => xAxis > minX && xAxis < maxX)
const leftBottomPoint = rect[0]
const rightBottomPoint = rect[1]
const rightTopPoint = rect[3]
const minYAxis = rightBottomPoint[1]
const maYAxis = rightTopPoint[1]
// 线
if (xAxisList.length == 4 && minYAxis < minY && maYAxis > maxY) {
const minAxis = Math.min(...xAxisList)
const maxAxis = Math.max(...xAxisList)
rectList.push(this.generateLineDataByTwoPoints([minAxis, minY], [minAxis, maxY]))
rectList.push(this.generateLineDataByTwoPoints([maxAxis, minY], [maxAxis, maxY]))
}
// 线
else if (xAxisList.length == 2 && minYAxis < minY && maYAxis > maxY) {
const xAxis = xAxisList[0]
rectList.push(this.generateLineDataByTwoPoints([xAxis, minY], [xAxis, maxY]))
}
//
const yAxisList = rect.map((item) => item[1]).filter((xAxis) => xAxis > minY && xAxis < maxY)
const minXAxis = leftBottomPoint[0]
const maxXAxis = rightBottomPoint[0]
// 线
if (yAxisList.length == 4 && minXAxis < minX && maxXAxis > maxX) {
const minAxis = Math.min(...yAxisList)
const maxAxis = Math.max(...yAxisList)
rectList.push(this.generateLineDataByTwoPoints([minX, minAxis], [maxX, minAxis]))
rectList.push(this.generateLineDataByTwoPoints([minX, maxAxis], [maxX, maxAxis]))
}
// 线
else if (yAxisList.length == 2 && minXAxis < minX && maxXAxis > maxX) {
const yAxis = yAxisList[0]
rectList.push(this.generateLineDataByTwoPoints([minX, yAxis], [maxX, yAxis]))
}
}
//
rectList.forEach((item) => {
item[0].lineStyle = {
color,
}
})
return rectList
},
/**
* 获取在框选范围内的点列表
* @param { Array<Array<number>> } rectInfo
*/
getInChartPoints(rectInfo) {
const {
xAxis: { min: minX, max: maxX },
yAxis: { min: minY, max: maxY },
} = this.twoDOption
return rectInfo.filter((point) => {
const [xAxis, yAxis] = point
return xAxis >= minX && xAxis <= maxX && yAxis >= minY && yAxis <= maxY
})
},
/**
* 根据两个点生成一个markLine直线
*/
generateLineDataByTwoPoints(point1, point2) {
return [
{
xAxis: point1[0],
yAxis: point1[1],
},
{
xAxis: point2[0],
yAxis: point2[1],
},
]
},
// Beta-Gamma Spectrum: Sample
handleChange(index) {
this.active = index
},
// unzoom
handleUnzoom() {
this.twoDOption.xAxis.min = 0
this.twoDOption.xAxis.max = 256
this.twoDOption.yAxis.min = 0
this.twoDOption.yAxis.max = 256
// this.emitRangeChange([0, 256, 0, 256])
// this.reDrawRect()
this.buildScatterList()
},
//
handleMouseDown() {
const chart = this.$refs.chartRef.getChartInstance()
chart.dispatchAction({
type: 'takeGlobalCursor',
//
key: 'brush',
brushOption: {
// brush brushType false
brushType: 'rect',
},
})
},
handleMouseUp() {
setTimeout(() => {
const chart = this.$refs.chartRef.getChartInstance()
this.clearBrush(chart)
}, 0)
},
//
handleBrushEnd(param) {
const chart = this.$refs.chartRef.getChartInstance()
const areas = param.areas[0]
if (areas) {
const range = areas.range
const [[minX, maxX], [minY, maxY]] = range
const point1 = chart.convertFromPixel({ seriesIndex: 0 }, [minX, minY]).map((num) => parseInt(num.toFixed()))
const point2 = chart.convertFromPixel({ seriesIndex: 0 }, [maxX, maxY]).map((num) => parseInt(num.toFixed()))
const [x1, y2, x2, y1] = [...point1, ...point2] //
const rangeNumberFunc = rangeNumber(0, 256)
this.twoDOption.xAxis.min = rangeNumberFunc(x1)
this.twoDOption.xAxis.max = rangeNumberFunc(x2)
this.twoDOption.yAxis.min = rangeNumberFunc(y1)
this.twoDOption.yAxis.max = rangeNumberFunc(y2)
this.emitRangeChange([x1, x2, y1, y2])
this.reDrawRect()
this.buildScatterList()
}
this.clearBrush(chart)
},
// ROI
handleROI() {
this.showROI = !this.showROI
this.reDrawRect()
},
// Update
handleUpdate() {},
//
interpolateColor(percentage) {
const color1 = { r: 255, g: 0, b: 0 },
color2 = { r: 255, g: 255, b: 255 }
const r = color1.r + (color2.r - color1.r) * percentage
const g = color1.g + (color2.g - color1.g) * percentage
const b = color1.b + (color2.b - color1.b) * percentage
return { r, g, b }
},
},
}
</script>
<style lang="less" scoped>
.beta-gamma-spectrum-chart {
height: 100%;
&-operators {
text-align: right;
overflow: auto;
height: 26px;
display: flex;
justify-content: flex-end;
gap: 9px;
.ant-space-item:first-child {
span {
width: 70px;
}
}
span {
text-align: center;
height: 100%;
line-height: 26px;
width: 100px;
background-color: #406979;
cursor: pointer;
user-select: none;
&.active {
background-color: #1397a3;
}
}
}
&-main {
height: calc(100% - 40px);
margin-top: 15px;
._2d-chart {
height: 100%;
display: flex;
.custom-chart {
width: calc(100% - 45px);
}
.bar {
width: 30px;
margin-left: 15px;
height: 100%;
color: #ade6ee;
padding-top: 5px;
padding-bottom: 38px;
text-align: center;
&-main {
display: inline-block;
width: 14px;
height: calc(100% - 70px);
background: linear-gradient(to bottom, #ff0000 0, #fff 100%);
}
}
}
}
}
</style>

View File

@ -56,11 +56,11 @@ const twoDOption = {
top: 15, top: 15,
left: 55, left: 55,
right: 10, right: 10,
bottom: 45 bottom: 45,
}, },
tooltip: { tooltip: {
trigger: 'item', trigger: 'item',
formatter: params => { formatter: (params) => {
const [b, g, c] = params.value const [b, g, c] = params.value
return `Beta: ${b}<br>Gamma: ${g}<br>Count: ${c}` return `Beta: ${b}<br>Gamma: ${g}<br>Count: ${c}`
}, },
@ -68,76 +68,76 @@ const twoDOption = {
animation: false, animation: false,
type: 'cross', type: 'cross',
lineStyle: { lineStyle: {
type: 'dashed' type: 'dashed',
} },
} },
}, },
xAxis: { xAxis: {
name: 'Beta Channel', name: 'Beta Channel',
nameTextStyle: { nameTextStyle: {
color: '#5b9cba', color: '#5b9cba',
fontSize: 16 fontSize: 16,
}, },
nameLocation: 'center', nameLocation: 'center',
nameGap: 30, nameGap: 30,
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: 'rgba(119, 181, 213, .3)' color: 'rgba(119, 181, 213, .3)',
} },
}, },
axisLabel: { axisLabel: {
color: '#ade6ee', color: '#ade6ee',
fontSize: 12 fontSize: 12,
}, },
splitLine: { splitLine: {
show: true, show: true,
lineStyle: { lineStyle: {
color: 'rgba(119, 181, 213, .3)' color: 'rgba(119, 181, 213, .3)',
} },
}, },
axisTick: { axisTick: {
show: false show: false,
}, },
min: 0, min: 0,
max: 256, max: 256,
interval: 64 interval: 64,
}, },
yAxis: { yAxis: {
name: 'Gamma Channel', name: 'Gamma Channel',
nameTextStyle: { nameTextStyle: {
color: '#5b9cba', color: '#5b9cba',
fontSize: 16 fontSize: 16,
}, },
nameLocation: 'center', nameLocation: 'center',
nameGap: 35, nameGap: 35,
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: 'rgba(119, 181, 213, .3)' color: 'rgba(119, 181, 213, .3)',
} },
}, },
axisLabel: { axisLabel: {
color: '#ade6ee', color: '#ade6ee',
fontSize: 12 fontSize: 12,
}, },
splitLine: { splitLine: {
show: true, show: true,
lineStyle: { lineStyle: {
color: 'rgba(119, 181, 213, .3)' color: 'rgba(119, 181, 213, .3)',
} },
}, },
axisTick: { axisTick: {
show: false show: false,
}, },
min: 0, min: 0,
max: 256, max: 256,
interval: 64 interval: 64,
}, },
series: { series: {
type: 'scatterGL', type: 'scatterGL',
symbolSize: 4, symbolSize: 4,
data: [], data: [],
itemStyle: { itemStyle: {
color: '#fff' color: '#fff',
}, },
markLine: { markLine: {
silent: true, silent: true,
@ -146,12 +146,12 @@ const twoDOption = {
animation: false, animation: false,
lineStyle: { lineStyle: {
type: 'solid', type: 'solid',
width: 2 width: 2,
} },
} },
}, },
brush: {}, brush: {},
animation: false animation: false,
} }
//3D Surface //3D Surface
@ -162,66 +162,66 @@ const threeDSurfaceOption = {
formatter: ({ value: [x, y, z] }) => { formatter: ({ value: [x, y, z] }) => {
// tooltip // tooltip
return `Beta Channel:${x} Count:${z} Gamma Channel: ${y}` return `Beta Channel:${x} Count:${z} Gamma Channel: ${y}`
} },
}, },
visualMap: { visualMap: {
show: false, show: false,
min: 0, min: 0,
max: 0, max: 0,
inRange: { inRange: {
color: ['#0DCF38', '#B5475E'] color: ['#0DCF38', '#B5475E'],
} },
}, },
grid3D: { grid3D: {
axisLabel: { axisLabel: {
color: '#ade6ee' color: '#ade6ee',
}, },
axisPointer: { axisPointer: {
show: false show: false,
}, },
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: 'rgba(119, 181, 213, .3)' color: 'rgba(119, 181, 213, .3)',
} },
}, },
splitLine: { splitLine: {
lineStyle: { lineStyle: {
color: 'rgba(119, 181, 213, .3)' color: 'rgba(119, 181, 213, .3)',
} },
} },
}, },
xAxis3D: { xAxis3D: {
name: 'Beta Channel', name: 'Beta Channel',
nameTextStyle: { nameTextStyle: {
color: '#5b9cba', color: '#5b9cba',
fontSize: 14 fontSize: 14,
}, },
min: 0, min: 0,
max: 256, max: 256,
interval: 64 interval: 64,
}, },
yAxis3D: { yAxis3D: {
name: 'Gamma Channel', name: 'Gamma Channel',
nameTextStyle: { nameTextStyle: {
color: '#5b9cba', color: '#5b9cba',
fontSize: 14 fontSize: 14,
}, },
min: 0, min: 0,
max: 256, max: 256,
interval: 64 interval: 64,
}, },
zAxis3D: { zAxis3D: {
name: 'Count', name: 'Count',
nameTextStyle: { nameTextStyle: {
color: '#5b9cba', color: '#5b9cba',
fontSize: 14 fontSize: 14,
}, },
max: 0 max: 0,
}, },
series: { series: {
type: 'surface', type: 'surface',
data: [] data: [],
} },
} }
// 3D Scatter // 3D Scatter
@ -231,92 +231,92 @@ const threeDScatterOption = {
formatter: ({ value: [x, y, z] }) => { formatter: ({ value: [x, y, z] }) => {
// tooltip // tooltip
return `Beta Channel:${x} Count:${z} Gamma Channel: ${y}` return `Beta Channel:${x} Count:${z} Gamma Channel: ${y}`
} },
}, },
visualMap: { visualMap: {
show: false, show: false,
min: 0, min: 0,
max: 0, max: 0,
inRange: { inRange: {
color: ['#0DCF38', '#B5475E'] color: ['#0DCF38', '#B5475E'],
} },
}, },
grid3D: { grid3D: {
axisLabel: { axisLabel: {
color: '#ade6ee' color: '#ade6ee',
}, },
axisPointer: { axisPointer: {
show: false show: false,
}, },
axisLine: { axisLine: {
lineStyle: { lineStyle: {
color: 'rgba(119, 181, 213, .3)' color: 'rgba(119, 181, 213, .3)',
} },
}, },
splitLine: { splitLine: {
lineStyle: { lineStyle: {
color: 'rgba(119, 181, 213, .3)' color: 'rgba(119, 181, 213, .3)',
} },
} },
}, },
xAxis3D: { xAxis3D: {
name: 'Beta Channel', name: 'Beta Channel',
nameTextStyle: { nameTextStyle: {
color: '#5b9cba', color: '#5b9cba',
fontSize: 14 fontSize: 14,
}, },
min: 0, min: 0,
max: 256, max: 256,
interval: 64 interval: 64,
}, },
yAxis3D: { yAxis3D: {
name: 'Gamma Channel', name: 'Gamma Channel',
nameTextStyle: { nameTextStyle: {
color: '#5b9cba', color: '#5b9cba',
fontSize: 14 fontSize: 14,
}, },
min: 0, min: 0,
max: 256, max: 256,
interval: 64 interval: 64,
}, },
zAxis3D: { zAxis3D: {
name: 'Count', name: 'Count',
nameTextStyle: { nameTextStyle: {
color: '#5b9cba', color: '#5b9cba',
fontSize: 14 fontSize: 14,
}, },
max: 0 max: 0,
}, },
series: { series: {
type: 'scatter3D', type: 'scatter3D',
symbolSize: 5, symbolSize: 5,
emphasis: { emphasis: {
label: { label: {
show: false show: false,
} },
}, },
data: [] data: [],
} },
} }
export default { export default {
props: { props: {
histogramDataList: { histogramDataList: {
type: Array, type: Array,
default: () => [] default: () => [],
}, },
histogramDataDList: { histogramDataDList: {
type: Array, type: Array,
default: () => [] default: () => [],
}, },
boundary: { boundary: {
type: Array, type: Array,
default: () => [] default: () => [],
} },
}, },
components: { components: {
CustomChart, CustomChart,
ColorPalette ColorPalette,
}, },
data() { data() {
this.buttons = buttons this.buttons = buttons
@ -328,7 +328,7 @@ export default {
twoDOption, twoDOption,
threeDSurfaceOption, threeDSurfaceOption,
threeDScatterOption, threeDScatterOption,
showROI: true showROI: true,
} }
}, },
@ -390,8 +390,8 @@ export default {
key: 'brush', key: 'brush',
brushOption: { brushOption: {
// brush brushType false // brush brushType false
brushType: 'rect' brushType: 'rect',
} },
}) })
}, },
@ -406,12 +406,12 @@ export default {
// //
chart.dispatchAction({ chart.dispatchAction({
type: 'brush', type: 'brush',
areas: [] areas: [],
}) })
// //
chart.dispatchAction({ chart.dispatchAction({
type: 'takeGlobalCursor' type: 'takeGlobalCursor',
}) })
}, },
@ -423,8 +423,8 @@ export default {
const range = areas.range const range = areas.range
const [[minX, maxX], [minY, maxY]] = range const [[minX, maxX], [minY, maxY]] = range
const point1 = chart.convertFromPixel({ seriesIndex: 0 }, [minX, minY]).map(num => parseInt(num.toFixed())) const point1 = chart.convertFromPixel({ seriesIndex: 0 }, [minX, minY]).map((num) => parseInt(num.toFixed()))
const point2 = chart.convertFromPixel({ seriesIndex: 0 }, [maxX, maxY]).map(num => parseInt(num.toFixed())) const point2 = chart.convertFromPixel({ seriesIndex: 0 }, [maxX, maxY]).map((num) => parseInt(num.toFixed()))
const [x1, y2, x2, y1] = [...point1, ...point2] // const [x1, y2, x2, y1] = [...point1, ...point2] //
@ -449,7 +449,7 @@ export default {
buildScatterList() { buildScatterList() {
const { const {
xAxis: { min: minX, max: maxX }, xAxis: { min: minX, max: maxX },
yAxis: { min: minY, max: maxY } yAxis: { min: minY, max: maxY },
} = this.twoDOption } = this.twoDOption
this.twoDOption.series.data = this.histogramDataDList this.twoDOption.series.data = this.histogramDataDList
@ -459,12 +459,12 @@ export default {
// scatter // scatter
buildScatterItem(xAxis, yAxis, count) { buildScatterItem(xAxis, yAxis, count) {
const { r, g, b } = this.interpolateColor(1 - (count / this.currCount)) const { r, g, b } = this.interpolateColor(1 - count / this.currCount)
return { return {
value: [xAxis, yAxis], value: [xAxis, yAxis],
itemStyle: { itemStyle: {
color: `rgb(${r}, ${g}, ${b})` color: `rgb(${r}, ${g}, ${b})`,
} },
} }
}, },
@ -503,7 +503,7 @@ export default {
[minX, minY], [minX, minY],
[maxX, minY], [maxX, minY],
[maxX, maxY], [maxX, maxY],
[minX, maxY] [minX, maxY],
] ]
rectList.push(...this.drawOneRect(rect, color)) rectList.push(...this.drawOneRect(rect, color))
@ -521,18 +521,18 @@ export default {
const rectList = [] const rectList = []
const { const {
xAxis: { min: minX, max: maxX }, xAxis: { min: minX, max: maxX },
yAxis: { min: minY, max: maxY } yAxis: { min: minY, max: maxY },
} = this.twoDOption } = this.twoDOption
const inchartPoints = this.getInChartPoints(rect) const inchartPoints = this.getInChartPoints(rect)
const outchartPoints = rect.filter(pointItem => !inchartPoints.includes(pointItem)) const outchartPoints = rect.filter((pointItem) => !inchartPoints.includes(pointItem))
// //
if (inchartPoints.length == 2) { if (inchartPoints.length == 2) {
const [point1, point2] = inchartPoints const [point1, point2] = inchartPoints
const isVerticleLine = this.isVerticleLine(point1, point2) const isVerticleLine = this.isVerticleLine(point1, point2)
// 线 // 线
if (isVerticleLine) { if (isVerticleLine) {
const find = outchartPoints.find(outcharPoint => point1[1] == outcharPoint[1]) // const find = outchartPoints.find((outcharPoint) => point1[1] == outcharPoint[1]) //
// //
const isLeft = find[0] <= point1[0] const isLeft = find[0] <= point1[0]
/** /**
@ -546,7 +546,7 @@ export default {
**/ **/
if (isLeft) { if (isLeft) {
inchartPoints.forEach(point => { inchartPoints.forEach((point) => {
rectList.push(this.generateLineDataByTwoPoints([minX, point[1]], point)) rectList.push(this.generateLineDataByTwoPoints([minX, point[1]], point))
}) })
@ -554,7 +554,7 @@ export default {
} }
// //
else { else {
inchartPoints.forEach(point => { inchartPoints.forEach((point) => {
rectList.push(this.generateLineDataByTwoPoints([maxX, point[1]], point)) rectList.push(this.generateLineDataByTwoPoints([maxX, point[1]], point))
}) })
rectList.push(this.generateLineDataByTwoPoints(point1, point2)) rectList.push(this.generateLineDataByTwoPoints(point1, point2))
@ -562,7 +562,7 @@ export default {
} }
// 线 // 线
else { else {
const find = outchartPoints.find(outcharPoint => point1[0] == outcharPoint[0]) // const find = outchartPoints.find((outcharPoint) => point1[0] == outcharPoint[0]) //
// //
const isBottom = find[1] <= point1[1] const isBottom = find[1] <= point1[1]
/** /**
@ -570,7 +570,7 @@ export default {
**/ **/
if (isBottom) { if (isBottom) {
inchartPoints.forEach(point => { inchartPoints.forEach((point) => {
rectList.push(this.generateLineDataByTwoPoints([point[0], minY], point)) rectList.push(this.generateLineDataByTwoPoints([point[0], minY], point))
}) })
@ -578,7 +578,7 @@ export default {
} }
// //
else { else {
inchartPoints.forEach(point => { inchartPoints.forEach((point) => {
rectList.push(this.generateLineDataByTwoPoints([point[0], maxY], point)) rectList.push(this.generateLineDataByTwoPoints([point[0], maxY], point))
}) })
@ -589,8 +589,8 @@ export default {
// //
else if (inchartPoints.length == 1) { else if (inchartPoints.length == 1) {
const point = inchartPoints[0] const point = inchartPoints[0]
const isLeft = !!outchartPoints.find(outPoint => outPoint[0] < point[0]) const isLeft = !!outchartPoints.find((outPoint) => outPoint[0] < point[0])
const isBottom = !!outchartPoints.find(outPoint => outPoint[1] < point[1]) const isBottom = !!outchartPoints.find((outPoint) => outPoint[1] < point[1])
// //
if (isLeft && isBottom) { if (isLeft && isBottom) {
rectList.push(this.generateLineDataByTwoPoints(point, [minX, point[1]])) rectList.push(this.generateLineDataByTwoPoints(point, [minX, point[1]]))
@ -626,7 +626,7 @@ export default {
// //
else { else {
// //
const xAxisList = rect.map(item => item[0]).filter(xAxis => xAxis > minX && xAxis < maxX) const xAxisList = rect.map((item) => item[0]).filter((xAxis) => xAxis > minX && xAxis < maxX)
const leftBottomPoint = rect[0] const leftBottomPoint = rect[0]
const rightBottomPoint = rect[1] const rightBottomPoint = rect[1]
const rightTopPoint = rect[3] const rightTopPoint = rect[3]
@ -646,7 +646,7 @@ export default {
} }
// //
const yAxisList = rect.map(item => item[1]).filter(xAxis => xAxis > minY && xAxis < maxY) const yAxisList = rect.map((item) => item[1]).filter((xAxis) => xAxis > minY && xAxis < maxY)
const minXAxis = leftBottomPoint[0] const minXAxis = leftBottomPoint[0]
const maxXAxis = rightBottomPoint[0] const maxXAxis = rightBottomPoint[0]
// 线 // 线
@ -663,9 +663,9 @@ export default {
} }
} }
// //
rectList.forEach(item => { rectList.forEach((item) => {
item[0].lineStyle = { item[0].lineStyle = {
color color,
} }
}) })
return rectList return rectList
@ -678,10 +678,10 @@ export default {
getInChartPoints(rectInfo) { getInChartPoints(rectInfo) {
const { const {
xAxis: { min: minX, max: maxX }, xAxis: { min: minX, max: maxX },
yAxis: { min: minY, max: maxY } yAxis: { min: minY, max: maxY },
} = this.twoDOption } = this.twoDOption
return rectInfo.filter(point => { return rectInfo.filter((point) => {
const [xAxis, yAxis] = point const [xAxis, yAxis] = point
return xAxis >= minX && xAxis <= maxX && yAxis >= minY && yAxis <= maxY return xAxis >= minX && xAxis <= maxX && yAxis >= minY && yAxis <= maxY
}) })
@ -702,12 +702,12 @@ export default {
return [ return [
{ {
xAxis: point1[0], xAxis: point1[0],
yAxis: point1[1] yAxis: point1[1],
}, },
{ {
xAxis: point2[0], xAxis: point2[0],
yAxis: point2[1] yAxis: point2[1],
} },
] ]
}, },
@ -728,7 +728,7 @@ export default {
const g = color1.g + (color2.g - color1.g) * percentage const g = color1.g + (color2.g - color1.g) * percentage
const b = color1.b + (color2.b - color1.b) * percentage const b = color1.b + (color2.b - color1.b) * percentage
return { r, g, b } return { r, g, b }
} },
}, },
watch: { watch: {
// 2D // 2D
@ -737,43 +737,43 @@ export default {
this.active = 0 this.active = 0
this.buildScatterList() this.buildScatterList()
}, },
immediate: true immediate: true,
}, },
// 3D // 3D
histogramDataDList: { histogramDataDList: {
handler(newVal) { handler(newVal) {
const maxCount = Math.max(...newVal.map(item => item.c)) const maxCount = Math.max(...newVal.map((item) => item.c))
this.threeDSurfaceOption.zAxis3D.max = Math.ceil(maxCount * 1.2) this.threeDSurfaceOption.zAxis3D.max = Math.ceil(maxCount * 1.2)
this.threeDSurfaceOption.series.data = newVal.map(item => [item.b, item.g, item.c]) // 3D surface this.threeDSurfaceOption.series.data = newVal.map((item) => [item.b, item.g, item.c]) // 3D surface
this.threeDSurfaceOption.visualMap.max = maxCount this.threeDSurfaceOption.visualMap.max = maxCount
this.threeDScatterOption.zAxis3D.max = Math.ceil(maxCount * 1.2) this.threeDScatterOption.zAxis3D.max = Math.ceil(maxCount * 1.2)
this.threeDScatterOption.series.data = newVal.map(item => [item.b, item.g, item.c]) // 3D scatter this.threeDScatterOption.series.data = newVal.map((item) => [item.b, item.g, item.c]) // 3D scatter
this.threeDScatterOption.visualMap.max = maxCount this.threeDScatterOption.visualMap.max = maxCount
}, },
immediate: true immediate: true,
}, },
// 2D // 2D
boundary: { boundary: {
handler(newVal) { handler(newVal) {
newVal.forEach((item, index) => { newVal.forEach((item, index) => {
item.color = rectColorList[index%5] item.color = rectColorList[index % 5]
}) })
this.boundaryData = newVal this.boundaryData = newVal
this.reDrawRect() this.reDrawRect()
}, },
immediate: true immediate: true,
}, },
currCount: { currCount: {
handler() { handler() {
this.buildScatterList() this.buildScatterList()
}, },
immediate: true immediate: true,
} },
} },
} }
</script> </script>

View File

@ -0,0 +1,233 @@
<template>
<div class="result-display-content">
<a-table :data-source="source1" rowKey="id" :columns="columns" :pagination="false">
<template slot="flag" slot-scope="text, record">
<a-checkbox :checked="text == 1 ? true : false" @change="(e) => handleCheckboxChange(e, record)"></a-checkbox>
</template>
<template slot="concentration" slot-scope="text, record">
<div class="concentration color-box" :class="record.className">
{{ text }}
</div>
</template>
<template slot="uncertainty" slot-scope="text">
<div class="uncertainty color-box">+/-{{ text }}</div>
</template>
<template slot="mdc" slot-scope="text">
<div class="mdc color-box">
{{ text }}
</div>
</template>
<template slot="operator" slot-scope="text, record">
<div class="search" @click="handleSearch(record.nuclideName)"></div>
</template>
</a-table>
<a-table :data-source="source2" rowKey="id" :columns="columns" :pagination="false">
<template slot="flag" slot-scope="text, record">
<a-checkbox :checked="text == 1 ? true : false" @change="(e) => handleCheckboxChange(e, record)"></a-checkbox>
</template>
<template slot="concentration" slot-scope="text, record">
<div class="concentration color-box" :class="record.className">
{{ text }}
</div>
</template>
<template slot="uncertainty" slot-scope="text">
<div class="uncertainty color-box">+/-{{ text }}</div>
</template>
<template slot="mdc" slot-scope="text">
<div class="mdc color-box">
{{ text }}
</div>
</template>
<template slot="operator" slot-scope="text, record">
<div class="search" @click="handleSearch(record.nuclideName)"></div>
</template>
</a-table>
</div>
</template>
<script>
const columns = [
{
title: 'Flag',
align: 'center',
dataIndex: 'nidFlag',
scopedSlots: {
customRender: 'flag',
},
width: 37,
},
{
title: 'Isotope',
dataIndex: 'nuclideName',
ellipsis: true,
width: 60,
},
{
title: 'Concentration',
dataIndex: 'conc',
scopedSlots: {
customRender: 'concentration',
},
width: 108,
},
{
title: 'Uncertainty',
dataIndex: 'concErr',
scopedSlots: {
customRender: 'uncertainty',
},
width: 88,
},
{
title: 'MDC[mBq/m3]',
dataIndex: 'mdc',
scopedSlots: {
customRender: 'mdc',
},
// width: 133,
},
]
export default {
props: {
data: {
type: Array,
default: () => [],
},
},
data() {
this.columns = columns
return {
source1: [],
source2: [],
}
},
methods: {
handleCheckboxChange(e, obj) {
this.$emit('sendFlag', e.target.checked, obj)
},
handleSearch(nuclideName) {
this.$emit('zoom', nuclideName)
},
},
watch: {
data: {
handler(val) {
if (val && Array.isArray(val)) {
val.forEach((item) => {
if (item.conc < 0) {
item.className = 'error'
} else if (item.conc > 0 && item.conc < item.mdc) {
item.className = 'warning'
} else {
item.className = 'success'
}
})
this.source1 = val.slice(0, 2)
this.source2 = val.slice(2, 4)
}
},
immediate: true,
},
},
}
</script>
<style lang="less" scoped>
.result-display-content {
display: flex;
.ant-table-wrapper {
flex: 1;
&:first-child {
margin-right: 12px;
}
::v-deep {
.ant-table {
border: none;
}
.ant-table-thead > tr th {
color: #00e9fe;
font-family: MicrosoftYaHei;
font-size: 14px;
padding: 4px 4px;
background-color: transparent !important;
&:first-child {
padding-left: 0 !important;
}
&:last-child {
padding-right: 0 !important;
}
}
.ant-table-tbody {
tr {
background-color: transparent;
td {
&:first-child {
padding-left: 0 !important;
}
&:last-child {
padding-right: 0 !important;
}
}
&:hover {
td {
background-color: transparent !important;
}
}
}
}
}
}
.color-box {
height: 36px;
line-height: 36px;
text-align: center;
color: #fff;
}
.concentration {
background-color: #ad8815;
&.error {
background-color: red;
}
&.warning {
background-color: #ffcc30;
}
&.success {
background-color: #0f0;
}
}
.uncertainty {
background-color: rgba(57, 184, 222, 0.4);
}
.mdc {
background-color: rgba(57, 184, 222, 0.4);
}
.search {
width: 24px;
height: 24px;
margin-bottom: 0 !important;
cursor: pointer;
background: url(~@/assets/images/spectrum/search.png) center no-repeat;
&:hover {
background: url(~@/assets/images/spectrum/search-hover.png) center no-repeat;
}
}
}
</style>

View File

@ -0,0 +1,169 @@
<template>
<div class="beta-gamma-spectrum-chart">
<div class="beta-gamma-spectrum-chart-operators">
<span
v-for="(item, index) in buttons"
:key="item"
:class="active == index ? 'active' : ''"
@click="handleChange(index)"
>
{{ item }}
</span>
</div>
<div class="beta-gamma-spectrum-chart-main">
<CustomChart key="1" ref="roiLimitsRef" :option="roiLimitsOption" />
</div>
</div>
</template>
<script>
import CustomChart from '@/components/CustomChart/index.vue'
const buttons = ['ROI1', 'ROI2', 'ROI3', 'ROI4']
// 线
const roiLimitsOption = {
grid: {
top: 15,
left: 55,
right: 18,
bottom: 45,
},
tooltip: {},
xAxis: {
type: 'category',
boundaryGap: false,
splitLine: {
show: true,
interval: 'auto',
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisLabel: {
fontSize: 12,
color: '#ade6ee',
},
},
yAxis: {
type: 'value',
splitLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: 'rgba(119, 181, 213, .3)',
},
},
axisLabel: {
fontSize: 12,
color: '#ade6ee',
},
},
series: {
type: 'line',
smooth: true,
showSymbol: false,
symbol: 'circle',
symbolSize: 6,
data: [],
itemStyle: {
normal: {
color: '#baaa3d',
},
},
lineStyle: {
normal: {
width: 2,
},
},
},
}
export default {
components: {
CustomChart,
},
props: {
ROILists: {
type: Array,
default: () => [],
},
},
watch: {
ROILists: {
handler(newVal) {
const [ROIOneList, ...lists] = newVal
this.buildOneLineList(ROIOneList)
},
immediate: true,
},
},
data() {
this.buttons = buttons
return {
active: 0,
roiLimitsOption,
}
},
methods: {
buildOneLineList(val) {
const currSeries = this.roiLimitsOption.series
currSeries.data = val.map((item) => [item.x, item.y])
},
// Beta-Gamma Spectrum: Sample
handleChange(index) {
this.active = index
this.buildOneLineList(this.ROILists[index])
},
},
}
</script>
<style lang="less" scoped>
.beta-gamma-spectrum-chart {
height: 100%;
&-operators {
text-align: right;
overflow: auto;
height: 26px;
display: flex;
justify-content: flex-end;
gap: 9px;
.ant-space-item:first-child {
span {
width: 70px;
}
}
span {
text-align: center;
height: 100%;
line-height: 26px;
width: 100px;
background-color: #406979;
cursor: pointer;
user-select: none;
&.active {
background-color: #1397a3;
}
}
}
&-main {
height: calc(100% - 40px);
margin-top: 15px;
}
}
</style>

View File

@ -0,0 +1,69 @@
<template>
<div class="roi-param-container">
<div class="roi-param-container-roi">
<div class="roi-param-container-roi-label">ROI1</div>
<div class="roi-param-container-roi-item">
<div style="text-align: center">Beta</div>
<a-input :value="roiParam.ROIOneStart" style="margin: 15px 0 20px" />
<a-input :value="roiParam.ROIOneStop" />
</div>
</div>
<div class="roi-param-container-roi">
<div class="roi-param-container-roi-label">ROI2</div>
<div class="roi-param-container-roi-item">
<div style="text-align: center">Beta</div>
<a-input :value="roiParam.ROITwoStart" style="margin: 15px 0 20px" />
<a-input :value="roiParam.ROITwoStop" />
</div>
</div>
<div class="roi-param-container-roi">
<div class="roi-param-container-roi-label">ROI3</div>
<div class="roi-param-container-roi-item">
<div style="text-align: center">Beta</div>
<a-input :value="roiParam.ROIThreeStart" style="margin: 15px 0 20px" />
<a-input :value="roiParam.ROIThreeStop" />
</div>
</div>
<div class="roi-param-container-roi">
<div class="roi-param-container-roi-label">ROI4</div>
<div class="roi-param-container-roi-item">
<div style="text-align: center">Beta</div>
<a-input :value="roiParam.ROIFourStart" style="margin: 15px 0 20px" />
<a-input :value="roiParam.ROIFourStop" />
</div>
</div>
</div>
</template>
<script>
export default {
props: {
roiParam: {
type: Object,
default: () => {},
},
},
}
</script>
<style lang="less" scoped>
.roi-param-container {
height: 100%;
display: flex;
gap: 12px;
&-roi {
flex: 1;
// background: #0ff;
display: flex;
// align-items: center;
gap: 10px;
&-label {
width: 60px;
line-height: 160px;
}
&--item {
flex: 1;
}
}
}
</style>

View File

@ -50,6 +50,8 @@
/> />
<!-- Gamma 分析 --> <!-- Gamma 分析 -->
<beta-analysis v-else-if="isBeta" />
<!-- Beta-Gamma 分析 --> <!-- Beta-Gamma 分析 -->
<!-- <beta-gamma-analysis v-else-if="isBetaGamma" ref="betaGammaAnalysisRef" :sample="sampleData" /> --> <!-- <beta-gamma-analysis v-else-if="isBetaGamma" ref="betaGammaAnalysisRef" :sample="sampleData" /> -->
<beta-gamma-analysis <beta-gamma-analysis
@ -237,6 +239,7 @@
<script> <script>
import { postAction } from '@/api/manage' import { postAction } from '@/api/manage'
import GammaAnalysis from './gamma-analysis.vue' import GammaAnalysis from './gamma-analysis.vue'
import BetaAnalysis from './beta-analysis.vue'
import BetaGammaAnalysis from './beta-gamma-analysis.vue' import BetaGammaAnalysis from './beta-gamma-analysis.vue'
import SpectraListInMenu from './components/SpectraListInMenu.vue' import SpectraListInMenu from './components/SpectraListInMenu.vue'
import LoadFromDbModal from './components/Modals/LoadFromDBModal.vue' import LoadFromDbModal from './components/Modals/LoadFromDBModal.vue'
@ -291,6 +294,7 @@ export default {
name: 'SpectrumAnalysis', name: 'SpectrumAnalysis',
components: { components: {
BetaGammaAnalysis, BetaGammaAnalysis,
BetaAnalysis,
GammaAnalysis, GammaAnalysis,
SpectraListInMenu, SpectraListInMenu,
LoadFromDbModal, LoadFromDbModal,
@ -1647,6 +1651,10 @@ export default {
isGamma() { isGamma() {
return this.analysisType == ANALYZE_TYPE.GAMMA return this.analysisType == ANALYZE_TYPE.GAMMA
}, },
// Beta
isBeta() {
return this.analysisType == ANALYZE_TYPE.BETA_GAMMA ? false : true
},
// Beta-Gamma // Beta-Gamma
isBetaGamma() { isBetaGamma() {