fix: 优化代码,解决scatterGL不受轴线最大/最小值控制的问题

This commit is contained in:
Xu Zhimeng 2023-09-25 19:42:31 +08:00
parent 7d29399802
commit c81923e744
2 changed files with 154 additions and 43 deletions

View File

@ -104,4 +104,14 @@ export function rangeNumber(min, max) {
return num => {
return num > max ? max : num < min ? min : num
}
}
/**
* 获取图表某条轴线的最大值
* @param {import("echarts").ECharts} chartInstance
* @param {'xAxis' | 'yAxis'} axis
* @returns
*/
export function getAxisMax(chartInstance, axis) {
return chartInstance.getModel().getComponent(axis).axis.scale._extent[1]
}

View File

@ -106,7 +106,13 @@ import NuclideLibrary from './components/SubOperators/NuclideLibrary.vue'
import ButtonWithSwitchIcon from './components/SubOperators/ButtonWithSwitchIcon.vue'
import { getAction, postAction } from '@/api/manage'
import Response from './response.json'
import { buildLineSeries, findSeriesByName, getXAxisAndYAxisByPosition, rangeNumber } from '@/utils/chartHelper'
import {
buildLineSeries,
findSeriesByName,
getAxisMax,
getXAxisAndYAxisByPosition,
rangeNumber,
} from '@/utils/chartHelper'
import { cloneDeep } from 'lodash'
import axios from 'axios'
import NuclideReviewModal from './components/Modals/AnalyzeInteractiveToolModal/components/NuclideReviewModal.vue'
@ -256,6 +262,7 @@ const thumbnailOption = {
const graphAssistance = {
axisType: 'Channel',
spectrumType: 'Lines',
Baseline: true,
SCAC: true,
Lc: true,
@ -462,6 +469,7 @@ export default {
shadowChannelChart.pointlist && shadowChannelChart.pointlist.map(({ x, y }) => [x, y]),
shadowChannelChart.color,
{
symbolSize: 2,
markLine: {
silent: true,
symbol: 'none',
@ -576,6 +584,7 @@ export default {
})
series.push(...peakLines)
// Compare Line
series.push(
buildLineSeries('Compare', [], '#fff', {
symbolSize: 2,
@ -606,6 +615,8 @@ export default {
// Graph Assistance
handleGraphAssistanceChange({ type, label, value }) {
const spectrumLineSeries = findSeriesByName(this.option.series, 'Spectrum')
const thumbnailSpectrumLineSeries = findSeriesByName(this.thumbnailOption.series, 'Spectrum')
const compareLineSeries = findSeriesByName(this.option.series, 'Compare')
//
@ -651,24 +662,35 @@ export default {
this.redrawLineBySeriesName('Compare', this.energyCompareLine, this.channelCompareLine)
break
case 'Lines':
this.option.series[0].type = 'line'
this.option.series[0].symbol = 'none'
this.graphAssistance.spectrumType = 'Lines'
this.thumbnailOption.series[0].type = 'line'
this.thumbnailOption.series[0].symbol = 'none'
spectrumLineSeries.type = 'line'
spectrumLineSeries.symbol = 'none'
thumbnailSpectrumLineSeries.type = 'line'
thumbnailSpectrumLineSeries.symbol = 'none'
compareLineSeries.type = 'line'
compareLineSeries.symbol = 'none'
this.redrawLineBySeriesName('Spectrum', this.shadowEnergyChart, this.shadowChannelChart)
this.redrawLineBySeriesName('Compare', this.energyCompareLine, this.channelCompareLine)
break
case 'Scatter':
this.option.series[0].type = 'scatterGL'
this.option.series[0].symbol = 'circle'
this.graphAssistance.spectrumType = 'Scatter'
this.thumbnailOption.series[0].type = 'scatterGL'
this.thumbnailOption.series[0].symbol = 'circle'
spectrumLineSeries.type = 'scatterGL'
spectrumLineSeries.symbol = 'circle'
thumbnailSpectrumLineSeries.type = 'scatterGL'
thumbnailSpectrumLineSeries.symbol = 'circle'
compareLineSeries.type = 'scatterGL'
compareLineSeries.symbol = 'circle'
this.$nextTick(() => {
this.rangeScatter()
})
break
}
}
@ -680,9 +702,9 @@ export default {
case 'Cursor':
// 线
if (value) {
this.option.series[0].markLine.lineStyle.width = 2
spectrumLineSeries.markLine.lineStyle.width = 2
} else {
this.option.series[0].markLine.lineStyle.width = 0
spectrumLineSeries.markLine.lineStyle.width = 0
}
break
case 'Baseline':
@ -758,7 +780,7 @@ export default {
//
redrawThumbnailChart() {
const series = this.thumbnailOption.series[0]
const series = findSeriesByName(this.thumbnailOption.series, 'Spectrum')
const data = this.isEnergy() ? this.shadowEnergyChart : this.shadowChannelChart
series.data = data.pointlist.map(({ x, y }) => [x, y])
},
@ -766,10 +788,11 @@ export default {
// 线
handleChartClick(param) {
const { offsetX, offsetY } = param
const point = getXAxisAndYAxisByPosition(this.$refs.chartRef.getChartInstance(), offsetX, offsetY)
const point = getXAxisAndYAxisByPosition(this.getChart(), offsetX, offsetY)
if (point) {
const xAxis = point[0]
this.option.series[0].markLine.data[0].xAxis = xAxis
const spectrumLineSeries = findSeriesByName(this.option.series, 'Spectrum')
spectrumLineSeries.markLine.data[0].xAxis = xAxis
const channel = this.isEnergy() ? this.getChannelByEnergy(xAxis) : parseInt(xAxis.toFixed())
const energy = this.isEnergy()
@ -834,7 +857,8 @@ export default {
// Peak Infomation
handleTogglePeak() {
const xAxis = this.option.series[0].markLine.data[0].xAxis
const spectrumLineSeries = findSeriesByName(this.option.series, 'Spectrum')
const xAxis = spectrumLineSeries.markLine.data[0].xAxis
const channel = this.isEnergy() ? this.getChannelByEnergy(xAxis) : parseInt(xAxis.toFixed())
const index = this.channelPeakGroup.findIndex((peakItem) => {
const allX = peakItem.pointlist.map((item) => item.x)
@ -864,9 +888,7 @@ export default {
return prev && prev.y > curr.y ? prev : curr
})
const chart = this.$refs.chartRef.getChartInstance()
const [xPix, yPix] = chart.convertToPixel({ seriesIndex: 0 }, [x, y])
const [xPix, yPix] = this.getChart().convertToPixel({ seriesIndex: 0 }, [x, y])
this.peakInfomationTooltip.content = html
this.peakInfomationTooltip.visible = true
this.peakInfomationTooltip.left = xPix
@ -889,7 +911,8 @@ export default {
* @param { 'left'| 'right' } direction
*/
moveMarkLine(direction) {
const prevAxis = this.option.series[0].markLine.data[0].xAxis
const spectrumLineSeries = findSeriesByName(this.option.series, 'Spectrum')
const prevAxis = spectrumLineSeries.markLine.data[0].xAxis
// Channel
const maxXAxises = this.channelPeakGroup.map((item) => {
@ -903,13 +926,13 @@ export default {
// prevAxisxAxis
find = maxXAxises.find((xAxis) => xAxis > prevAxis)
if (find) {
this.option.series[0].markLine.data[0].xAxis = find
spectrumLineSeries.markLine.data[0].xAxis = find
}
} else if (direction == 'left') {
// prevAxisxAxis
find = maxXAxises.reverse().find((xAxis) => xAxis < prevAxis)
if (find) {
this.option.series[0].markLine.data[0].xAxis = find
spectrumLineSeries.markLine.data[0].xAxis = find
}
}
@ -920,8 +943,7 @@ export default {
//
handleMouseDown() {
const chart = this.$refs.chartRef.getChartInstance()
chart.dispatchAction({
this.getChart().dispatchAction({
type: 'takeGlobalCursor',
//
key: 'brush',
@ -934,8 +956,7 @@ export default {
handleMouseUp() {
setTimeout(() => {
const chart = this.$refs.chartRef.getChartInstance()
this.clearBrush(chart)
this.clearBrush(this.getChart())
}, 0)
},
@ -965,7 +986,7 @@ export default {
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 xAxisMax = chart.getModel().getComponent('xAxis').axis.scale._extent[1]
const xAxisMax = getAxisMax(chart, 'xAxis')
const yAxisMax = this.option.yAxis.max
let [x1, y2, x2, y1] = [...point1, ...point2] //
@ -992,7 +1013,7 @@ export default {
this.setThumbnailChartRect(x1, y2, x2, y1)
}
const thumbnailChart = this.$refs.thumbnailChartRef.getChartInstance()
const thumbnailChart = this.getThumbnailChart()
const [, maxYPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, y1]) // yAxispix
const [, minYPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, y2])
const rectHeightPixel = maxYPixel - minYPixel // (pix)
@ -1000,13 +1021,72 @@ export default {
}
this.clearBrush(chart)
this.$nextTick(() => {
this.rangeScatter()
})
},
/**
* 因scatterGL 不受axis中max和min的控制手动处理溢出部分
* @param {*} x1 xAxis min
* @param {*} x2 xAxis max
* @param {*} y1 yAxis min
* @param {*} y2 yAxis max
*/
rangeScatter() {
if (!this.isScatter()) {
return
}
const {
xAxis: { min: x1 },
yAxis: { min: y1 },
} = this.option
const chart = this.getChart()
const x2 = getAxisMax(chart, 'xAxis')
const y2 = getAxisMax(chart, 'yAxis')
const channelSpectrumData = {
...this.shadowChannelChart,
pointlist: this.pointlistLimit(this.shadowChannelChart.pointlist, x1, x2, y1, y2),
}
const energySpectrumData = {
...this.shadowEnergyChart,
pointlist: this.pointlistLimit(this.shadowEnergyChart.pointlist, x1, x2, y1, y2),
}
this.redrawLineBySeriesName('Spectrum', energySpectrumData, channelSpectrumData)
const channelCompareLine = {
...this.channelCompareLine,
pointlist: this.pointlistLimit(this.channelCompareLine.pointlist, x1, x2, y1, y2),
}
const energyCompareLine = {
...this.energyCompareLine,
pointlist: this.pointlistLimit(this.energyCompareLine.pointlist, x1, x2, y1, y2),
}
this.redrawLineBySeriesName('Compare', energyCompareLine, channelCompareLine)
},
/**
* 筛选范围内的点
* @param {*} pointlist
* @param {*} x1
* @param {*} x2
* @param {*} y1
* @param {*} y2
*/
pointlistLimit(pointlist, x1, x2, y1, y2) {
return pointlist.filter(({ x, y }) => x >= x1 && x <= x2 && y >= y1 && y <= y2)
},
//
setThumbnailChartRect(x1, y2, x2, y1) {
this.thumbnailChartRect = [x1, y2, x2, y1]
const { markLine } = this.thumbnailOption.series[0]
const thumbnailSpectrumLineSeries = findSeriesByName(this.thumbnailOption.series, 'Spectrum')
const { markLine } = thumbnailSpectrumLineSeries
const pointList = [
[
[x1, y1],
@ -1034,7 +1114,7 @@ export default {
//
handleThumbnailChartClick(param) {
const { offsetX, offsetY } = param
const thumbnailChart = this.$refs.thumbnailChartRef.getChartInstance()
const thumbnailChart = this.getThumbnailChart()
const point = getXAxisAndYAxisByPosition(thumbnailChart, offsetX, offsetY)
if (point && this.thumbnailChartRect && this.thumbnailChartRect.length) {
@ -1046,7 +1126,7 @@ export default {
let [xAxis, yAxis] = point
const xAxisMax = thumbnailChart.getModel().getComponent('xAxis').axis.scale._extent[1]
const xAxisMax = getAxisMax(thumbnailChart, 'xAxis')
const xAxisLimit = rangeNumber(1 + halfWidth, xAxisMax - halfWidth)
@ -1081,14 +1161,22 @@ export default {
//
handleReset() {
this.option.xAxis.min = 1
this.option.xAxis.max = 'dataMax'
this.option.yAxis.min = 1
this.option.yAxis.max = 'dataMax'
const spectrumLineMaxX = Math.max(...this.shadowChannelChart.pointlist.map(({ x }) => x))
const spectrumLineMaxY = Math.max(...this.shadowChannelChart.pointlist.map(({ y }) => y))
this.thumbnailOption.series[0].markLine.data = []
this.option.xAxis.min = 1
this.option.xAxis.max = spectrumLineMaxX
this.option.yAxis.min = 1
this.option.yAxis.max = spectrumLineMaxY
const thumbnailSpectrumLineSeries = findSeriesByName(this.thumbnailOption.series, 'Spectrum')
thumbnailSpectrumLineSeries.markLine.data = []
this.thumbnailChartRect = []
this.closePeakInfomationTooltip()
this.$nextTick(() => {
this.rangeScatter()
})
},
//
@ -1120,13 +1208,12 @@ export default {
this.energyCompareLine = energyData
this.redrawLineBySeriesName('Compare', energyData, channelData, true, channelData.color)
if (this.option.series[0].type == 'scatterGL') {
if (this.isScatter()) {
lineSeries.type = 'scatterGL'
}
this.$nextTick(() => {
const chart = this.$refs.chartRef.getChartInstance()
const yAxisMax = chart.getModel().getComponent('yAxis').axis.scale._extent[1]
const yAxisMax = getAxisMax(this.getChart(), 'yAxis')
this.thumbnailOption.yAxis.max = yAxisMax
})
},
@ -1231,14 +1318,16 @@ export default {
this.option.yAxis.type = 'value'
if (this.option.series.length) {
this.option.series[0].type = 'line'
this.option.series[0].symbol = 'none'
this.option.series[0].markLine.lineStyle.width = 2
const spectrumLineSeries = findSeriesByName(this.option.series, 'Spectrum')
spectrumLineSeries.type = 'line'
spectrumLineSeries.symbol = 'none'
spectrumLineSeries.markLine.lineStyle.width = 2
}
if (this.thumbnailOption.series.length) {
this.thumbnailOption.series[0].type = 'line'
this.thumbnailOption.series[0].symbol = 'none'
const thumbnailSpectrumLineSeries = findSeriesByName(this.thumbnailOption.series, 'Spectrum')
thumbnailSpectrumLineSeries.type = 'line'
thumbnailSpectrumLineSeries.symbol = 'none'
}
this.graphAssistance = cloneDeep(graphAssistance)
},
@ -1310,6 +1399,18 @@ export default {
isEnergy() {
return this.graphAssistance.axisType == 'Energy'
},
isScatter() {
return this.graphAssistance.spectrumType == 'Scatter'
},
getChart() {
return this.$refs.chartRef.getChartInstance()
},
getThumbnailChart() {
return this.$refs.thumbnailChartRef.getChartInstance()
},
},
watch: {
sample: {