diff --git a/src/views/spectrumAnalysis/components/Modals/AnalyzeInteractiveToolModal/index.vue b/src/views/spectrumAnalysis/components/Modals/AnalyzeInteractiveToolModal/index.vue
index 62877f6..2cabc60 100644
--- a/src/views/spectrumAnalysis/components/Modals/AnalyzeInteractiveToolModal/index.vue
+++ b/src/views/spectrumAnalysis/components/Modals/AnalyzeInteractiveToolModal/index.vue
@@ -84,10 +84,10 @@
(M)odify CP
Replot
@@ -383,6 +383,14 @@ const thumbnailOption = {
},
series: null
}
+
+// 操作类型
+export const Operators = {
+ ADD: 1, // 新增
+ REMOVE: 2, // 移除
+ MODIFY: 3 // 改变
+}
+
export default {
mixins: [ModalMixin, SampleDataMixin],
components: {
@@ -429,7 +437,9 @@ export default {
currChannel: undefined, // 当currChannel前选中的channel
selectedTableItem: undefined, // 当前选中的表格项
- isModifying: false // 正在修改控制点
+ isModifying: false, // 正在修改控制点
+
+ operationStack: [] // 操作记录
}
},
created() {
@@ -1141,8 +1151,8 @@ export default {
if (this.btnGroupType == 2) {
this.$nextTick(() => {
- this.option.graphic = this._channelBaseCPChart.map(({ point: { x, y } }, dataIndex) => {
- return this.buildGraphicPoint(chart, x, y, dataIndex)
+ this.option.graphic = this._channelBaseCPChart.map(({ point: { x, y } }) => {
+ return this.buildGraphicPoint(chart, x, y)
})
})
}
@@ -1164,8 +1174,8 @@ export default {
if (this.btnGroupType == 2) {
const chart = this.$refs.chartRef.getChartInstance()
this.$nextTick(() => {
- this.option.graphic = this._channelBaseCPChart.map(({ point: { x, y } }, dataIndex) => {
- return this.buildGraphicPoint(chart, x, y, dataIndex)
+ this.option.graphic = this._channelBaseCPChart.map(({ point: { x, y } }) => {
+ return this.buildGraphicPoint(chart, x, y)
})
})
}
@@ -1176,6 +1186,7 @@ export default {
// 切换到Base Line 和 Control Point 操作
if (this.btnGroupType == 1) {
this.btnGroupType = 2
+ this.clearOperationStack()
const originalCPSeries = findSeriesByName(this.option.series, 'BaseLine')
@@ -1187,8 +1198,8 @@ export default {
const chart = this.$refs.chartRef.getChartInstance()
- this.option.graphic = this.channelBaseCPChart.map(({ point: { x, y } }, dataIndex) => {
- return this.buildGraphicPoint(chart, x, y, dataIndex)
+ this.option.graphic = this.channelBaseCPChart.map(({ point: { x, y } }) => {
+ return this.buildGraphicPoint(chart, x, y)
})
this._channelBaseCPChart = cloneDeep(this.channelBaseCPChart)
@@ -1205,7 +1216,7 @@ export default {
}
},
- buildGraphicPoint(chart, x, y, dataIndex) {
+ buildGraphicPoint(chart, x, y) {
const [xPix, yPix] = chart.convertToPixel('grid', [x, y])
return {
type: 'rect',
@@ -1227,6 +1238,10 @@ export default {
this.position[0] = xPixel
},
ondragend: ({ offsetY }) => {
+ const graphic = this.option.graphic
+
+ const dataIndex = graphic.findIndex(item => item.position[0] == xPix)
+
this.option.graphic[dataIndex].position = [xPix, offsetY]
this.setGraphicDraggable(false)
@@ -1237,6 +1252,11 @@ export default {
baseLineEditSeries.data[parseInt(xAxis) - 1] = [x, yAxis]
this._channelBaseCPChart[dataIndex].point.y = yAxis
+
+ this.pushOperationStack(Operators.MODIFY, {
+ index: dataIndex,
+ position: [xPix, yPix]
+ })
},
zlevel: 100
}
@@ -1288,13 +1308,11 @@ export default {
const baseLineEditSeries = findSeriesByName(this.option.series, 'BaseLine_Edit')
const yAxis = baseLineEditSeries.data[this.currChannel - 1][1]
- this.option.graphic.splice(
- i,
- 0,
- this.buildGraphicPoint(chart, this.currChannel, yAxis, this.option.graphic.length)
- )
+ this.option.graphic.splice(i, 0, this.buildGraphicPoint(chart, this.currChannel, yAxis))
this._channelBaseCPChart.splice(i, 0, { point: { x: this.currChannel, y: yAxis } })
+
+ this.pushOperationStack(Operators.ADD, { index: i })
},
// 移除控制点
@@ -1319,7 +1337,12 @@ export default {
return
}
- controlPointList.splice(i, 1)
+ const [point] = controlPointList.splice(i, 1)
+
+ this.pushOperationStack(Operators.REMOVE, {
+ index: i,
+ point
+ })
},
// 修改控制点
@@ -1327,6 +1350,24 @@ export default {
this.setGraphicDraggable(true)
},
+ // 编辑斜率
+ handleEditSlope() {
+ // if (m_baseCtrl.XCtrl.empty()) {
+ // this.$message.warn('No control points to be edited')
+ // return
+ // }
+ // // find nearest control-point
+ // let i = 1,
+ // n = m_baseCtrl.XCtrl.size()
+ // for (; i < n; ++i) {
+ // if (m_baseCtrl.XCtrl[i] >= m_curChan) {
+ // if (m_baseCtrl.XCtrl[i] - m_curChan > m_curChan - m_baseCtrl.XCtrl[i - 1]) --i
+ // break
+ // }
+ // }
+ // if (i == n) i = n - 1
+ },
+
// 确定对Control Point 的操作
handleAccept() {},
@@ -1390,6 +1431,47 @@ export default {
this.selectedTableItem._deleting = false
}
}
+ },
+
+ /**
+ * 推入操作
+ * @param {*} operator 操作符
+ * @param {*} operand 操作数
+ */
+ pushOperationStack(operator, operand) {
+ this.operationStack.push({
+ operator,
+ operand
+ })
+ },
+
+ /**
+ * 弹出操作
+ */
+ popOperationStack() {
+ const { operator, operand } = this.operationStack.pop()
+ const { index } = operand
+ switch (operator) {
+ case Operators.ADD:
+ this.option.graphic.splice(index, 1)
+ this._channelBaseCPChart.splice(index, 1)
+ break
+ case Operators.MODIFY:
+ const { position } = operand
+ this.option.graphic[index].position = position
+ break
+ case Operators.REMOVE:
+ const { point } = operand
+ this.option.graphic.splice(index, 0, point)
+ break
+ }
+ },
+
+ /**
+ * 清理操作栈
+ */
+ clearOperationStack() {
+ this.operationStack = []
}
},
computed: {
@@ -1397,6 +1479,10 @@ export default {
const [selectedKey] = this.selectedKeys
const findIndex = this.list.findIndex(item => item.index == selectedKey)
return findIndex
+ },
+
+ isOperationStackEmpty() {
+ return this.operationStack.length == 0
}
}
}
@@ -1405,6 +1491,7 @@ export default {