feat: 增加对gamma图表缩放的键盘快捷键

This commit is contained in:
Xu Zhimeng 2023-10-26 11:39:06 +08:00
parent 78dba4c37c
commit 67757b84e7
2 changed files with 195 additions and 19 deletions

View File

@ -235,6 +235,8 @@ export default {
this.$bus.$on('colorChange', this.handleColorChange) this.$bus.$on('colorChange', this.handleColorChange)
this.$bus.$on('gammaRefresh', this.handleRefresh) this.$bus.$on('gammaRefresh', this.handleRefresh)
this.$bus.$on('accept', this.handleAccept) this.$bus.$on('accept', this.handleAccept)
document.addEventListener('keydown', this.handleKeyboardEvent)
}, },
destroyed() { destroyed() {
this.cancelLastRequest() this.cancelLastRequest()
@ -242,12 +244,170 @@ export default {
this.$bus.$off('colorChange', this.handleColorChange) this.$bus.$off('colorChange', this.handleColorChange)
this.$bus.$off('gammaRefresh', this.handleRefresh) this.$bus.$off('gammaRefresh', this.handleRefresh)
this.$bus.$off('accept', this.handleAccept) this.$bus.$off('accept', this.handleAccept)
document.removeEventListener('keydown', this.handleKeyboardEvent)
}, },
mounted() { mounted() {
this.option.brush = { toolbox: [] } this.option.brush = { toolbox: [] }
this.initWebSocket() this.initWebSocket()
}, },
methods: { methods: {
//
handleKeyboardEvent(event) {
this.changeRectByKeyBoard(event.key)
},
/**
* 键盘事件处理
* @param {*} key
* @description 1xAxis采用按axis值增/减量的方式实现
* 2而因为yAxis在type=log下分布不平均无法用按axis值增/减量的方式实现平均的增大或缩小
* 所以采用像素增/减量的方式
* 具体实现则为因为右上角缩略图表是不改变轴最大值最小值的也就是它的每个axis像素数不会
* 随着图表值域的缩小而变大所以将其视作标准参照物将主图表现在的axis值转为像素值/
* 去每步像素值得到新的像素值然后再转化为axis值去设置主图表范围和设置右上角缩略图表的
* 框的范围
*/
changeRectByKeyBoard(key) {
if (!['=', '-', 'ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft'].includes(key)) {
return
}
const spectrumLineSeries = findSeriesByName(this.option.series, 'Spectrum')
const markLineData = spectrumLineSeries.markLine.data[0]
const markLineXAxis = markLineData.xAxis
const thumbnailChart = this.getThumbnailChart()
// thumbnail chart
const maxX = getAxisMax(thumbnailChart, 'xAxis')
const maxY = getAxisMax(thumbnailChart, 'yAxis')
const xStep = Math.ceil(maxX / 100) // x axis
const yStep = 5 // y
// dataMax
let { min: currMinX, max: currMaxX } = this.option.xAxis
if (currMaxX == 'dataMax') {
currMaxX = maxX
}
let { min: currMinY, max: currMaxY } = this.option.yAxis
if (currMaxY == 'dataMax') {
currMaxY = maxY
}
const { pixX: currMinXPix } = this.convertToPixel(thumbnailChart, currMinX, currMinY)
const { pixY: currMinYPix } = this.convertToPixel(thumbnailChart, currMinX, currMinY)
const { pixY: currMaxYPix } = this.convertToPixel(thumbnailChart, currMinX, currMaxY)
const { pixY: minYPixel } = this.convertToPixel(thumbnailChart, currMinX, 1)
const { pixY: maxYPixel } = this.convertToPixel(thumbnailChart, currMinX, maxY)
let nextMinX, nextMaxX, nextMinYPix, nextMaxYPix
switch (key) {
case '=': // x
nextMinX = currMinX - xStep
nextMaxX = currMaxX + xStep
if (nextMinX < 1) {
nextMinX = 1
}
if (nextMaxX > maxX) {
nextMaxX = maxX
}
this.setRectRange(nextMinX, nextMaxX, currMinY, currMaxY)
break
case '-': // x
if (currMaxX - currMinX > 2 * xStep) {
nextMinX = currMinX + xStep
nextMaxX = currMaxX - xStep
this.setRectRange(nextMinX, nextMaxX, currMinY, currMaxY)
}
break
case 'ArrowUp': // y
nextMinYPix = currMinYPix + yStep
nextMaxYPix = currMaxYPix - yStep
if (nextMinYPix > minYPixel) {
nextMinYPix = minYPixel
}
if (nextMaxYPix < maxYPixel) {
nextMaxYPix = maxYPixel
}
const nextMinY = getXAxisAndYAxisByPosition(thumbnailChart, currMinXPix, nextMinYPix)[1]
const nextMaxY = getXAxisAndYAxisByPosition(thumbnailChart, currMinXPix, nextMaxYPix)[1]
this.setRectRange(currMinX, currMaxX, nextMinY, nextMaxY)
break
case 'ArrowDown': // y
if (currMinYPix - currMaxYPix > 2 * yStep) {
nextMinYPix = currMinYPix - yStep
nextMaxYPix = currMaxYPix + yStep
const nextMinY = getXAxisAndYAxisByPosition(thumbnailChart, currMinXPix, nextMinYPix)[1]
const nextMaxY = getXAxisAndYAxisByPosition(thumbnailChart, currMinXPix, nextMaxYPix)[1]
this.setRectRange(currMinX, currMaxX, nextMinY, nextMaxY)
}
break
case 'ArrowRight':
if (markLineXAxis == maxX) {
return
}
const nextAxis = markLineXAxis == -1 ? 1 : markLineXAxis + 1
markLineData.xAxis = nextAxis
const { channel: nextChannel, energy: nextEnergy, counts: nextCounts } = this.getEnergyAndCountsByXAxis(nextAxis)
this.setChartBottomTitle(nextChannel, nextEnergy, nextCounts)
this.getSelPosNuclide(nextChannel)
break
case 'ArrowLeft':
if (markLineXAxis <= 1) {
return
}
markLineData.xAxis = markLineXAxis - 1
const {
channel: prevChannel,
energy: prevEnergy,
counts: prevCounts,
} = this.getEnergyAndCountsByXAxis(markLineXAxis - 1)
this.setChartBottomTitle(prevChannel, prevEnergy, prevCounts)
this.getSelPosNuclide(prevChannel)
break
}
},
//
convertToPixel(chart, xAxis, yAxis) {
const [pixX, pixY] = chart.convertToPixel({ seriesIndex: 0 }, [xAxis, yAxis])
return {
pixX,
pixY,
}
},
//
setRectRange(minX, maxX, minY, maxY) {
this.option.xAxis.min = minX
this.option.xAxis.max = maxX
this.option.yAxis.min = minY
this.option.yAxis.max = maxY
if (this.isEnergy()) {
const channel1 = this.getChannelByEnergy(minX)
const channel2 = this.getChannelByEnergy(maxX)
this.setThumbnailChartRect(channel1, maxY, channel2, minY)
} else {
this.setThumbnailChartRect(minX, maxY, maxX, minY)
}
const thumbnailChart = this.getThumbnailChart()
const [, maxYPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, minY]) // yAxispix
const [, minYPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, maxY])
const rectHeightPixel = maxYPixel - minYPixel // (pix)
this.halfHeightPixel = rectHeightPixel / 2
},
initWebSocket: function () { initWebSocket: function () {
console.log('qweqwerq') console.log('qweqwerq')
// WebSocketwshttpwsshttps // WebSocketwshttpwsshttps
@ -434,7 +594,12 @@ export default {
this.resetThumbnailChartDataMax() this.resetThumbnailChartDataMax()
// Spectrum Line // Spectrum Line
this.redrawLineBySeriesName('Spectrum', shadowEnergyChart, shadowChannelChart, true, shadowChannelChart.color) this.setSeriesData(
this.option.series,
'Spectrum',
this.transformPointListData(shadowChannelChart.pointlist),
shadowChannelChart.color
)
// BaseLine // BaseLine
this.setSeriesData( this.setSeriesData(
@ -691,7 +856,7 @@ export default {
if (point) { if (point) {
const xAxis = point[0] const xAxis = point[0]
const spectrumLineSeries = findSeriesByName(this.option.series, 'Spectrum') const spectrumLineSeries = findSeriesByName(this.option.series, 'Spectrum')
spectrumLineSeries.markLine.data[0].xAxis = xAxis spectrumLineSeries.markLine.data[0].xAxis = parseInt(xAxis.toFixed())
const { channel, energy, counts } = this.getEnergyAndCountsByXAxis(xAxis) const { channel, energy, counts } = this.getEnergyAndCountsByXAxis(xAxis)
this.setChartBottomTitle(channel, energy, counts) this.setChartBottomTitle(channel, energy, counts)
@ -702,7 +867,9 @@ export default {
// //
setChartBottomTitle(channel, energy, counts) { setChartBottomTitle(channel, energy, counts) {
this.option.title.text = `{a|Channel:${channel}} {a|Energy:${energy}} {a|Counts:${counts}} {a|Detectability:0}` this.option.title.text = `{a|Channel:${channel}} {a|Energy:${
energy || 0
}} {a|Counts:${counts || 0}} {a|Detectability:0}`
}, },
// xAixschannelenergycounts // xAixschannelenergycounts
@ -1058,14 +1225,11 @@ export default {
const point = getXAxisAndYAxisByPosition(thumbnailChart, offsetX, offsetY) const point = getXAxisAndYAxisByPosition(thumbnailChart, offsetX, offsetY)
if (point && this.thumbnailChartRect && this.thumbnailChartRect.length) { if (point && this.thumbnailChartRect && this.thumbnailChartRect.length) {
const [x1, y2, x2, y1] = this.thumbnailChartRect const [x1, y2, x2, y1] = this.thumbnailChartRect
const halfWidth = Math.ceil((x2 - x1) / 2) const halfWidth = (x2 - x1) / 2
// pix // pix
const [, maxYAxisPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [ const { pixY: maxYAxisPixel } = this.convertToPixel(thumbnailChart, 0, getAxisMax(thumbnailChart, 'yAxis'))
0, const { pixY: minYAxisPixel } = this.convertToPixel(thumbnailChart, 0, 1)
getAxisMax(thumbnailChart, 'yAxis'),
])
const [, minYAxisPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, 1])
let [xAxis, yAxis] = point let [xAxis, yAxis] = point
@ -1078,7 +1242,7 @@ export default {
xAxis = xAxisLimit(xAxis) xAxis = xAxisLimit(xAxis)
let [, yAxisPixel] = thumbnailChart.convertToPixel({ seriesIndex: 0 }, [0, yAxis]) let { pixY: yAxisPixel } = this.convertToPixel(thumbnailChart, 0, yAxis)
yAxisPixel = yAxisLimit(yAxisPixel) yAxisPixel = yAxisLimit(yAxisPixel)
const minYAxis = thumbnailChart.convertFromPixel({ seriesIndex: 0 }, [0, yAxisPixel + halfHeightPixel])[1] // ypixyAxis const minYAxis = thumbnailChart.convertFromPixel({ seriesIndex: 0 }, [0, yAxisPixel + halfHeightPixel])[1] // ypixyAxis

View File

@ -1,5 +1,12 @@
import { buildLineSeries } from "@/utils/chartHelper" import { buildLineSeries } from '@/utils/chartHelper'
import { baseLineCtrlPoint, baseLineSeries, compareLineSeries, lcLineSeries, scacLineSeries, spectrumSeries } from "./seriesBuilder" import {
baseLineCtrlPoint,
baseLineSeries,
compareLineSeries,
lcLineSeries,
scacLineSeries,
spectrumSeries
} from './seriesBuilder'
export const GammaOptions = { export const GammaOptions = {
option: { option: {
@ -36,6 +43,7 @@ export const GammaOptions = {
className: 'figure-chart-option-tooltip' className: 'figure-chart-option-tooltip'
}, },
xAxis: { xAxis: {
type: 'value',
name: 'Channel', name: 'Channel',
nameTextStyle: { nameTextStyle: {
color: '#8FD4F8', color: '#8FD4F8',
@ -105,13 +113,13 @@ export const GammaOptions = {
// 缩略图配置 // 缩略图配置
thumbnailOption: { thumbnailOption: {
grid: { grid: {
top: 0, top: 5,
left: 5, left: 5,
right: 5, right: 5,
bottom: 0 bottom: 5
}, },
xAxis: { xAxis: {
type: 'category', type: 'value',
axisLine: { axisLine: {
show: false show: false
}, },
@ -121,6 +129,9 @@ export const GammaOptions = {
axisLabel: { axisLabel: {
show: false show: false
}, },
axisTick: {
show: false
},
min: 1, min: 1,
max: 'dataMax' max: 'dataMax'
}, },
@ -135,6 +146,9 @@ export const GammaOptions = {
axisLabel: { axisLabel: {
show: false show: false
}, },
axisTick: {
show: false
},
min: 1, min: 1,
max: 'dataMax' max: 'dataMax'
}, },
@ -159,8 +173,6 @@ export const GammaOptions = {
} }
} }
console.log('%c [ ]-162', 'font-size:13px; background:pink; color:#bf2c9f;', GammaOptions.option)
export const graphAssistance = { export const graphAssistance = {
chartYAxisType: 'Log10', chartYAxisType: 'Log10',
Cursor: true, Cursor: true,
@ -168,5 +180,5 @@ export const graphAssistance = {
Lc: true, Lc: true,
axisType: 'Channel', axisType: 'Channel',
spectrumType: 'Lines', spectrumType: 'Lines',
SCAC: true, SCAC: true
} }