|
@@ -54,6 +54,108 @@ const echatinit = () => {
|
|
|
xdata.value = []
|
|
|
}
|
|
|
// 从websocket取数据
|
|
|
+// const getsockechart = (data) => {
|
|
|
+// console.log("曲线数据", data);
|
|
|
+// curvedata.value = data;
|
|
|
+
|
|
|
+// // 如果是第一次传入数据,则初始化为空数组;否则保留之前的数据
|
|
|
+// if (!xdata.value) {
|
|
|
+// xdata.value = [];
|
|
|
+// }
|
|
|
+
|
|
|
+// let rows = curvedata.value;
|
|
|
+
|
|
|
+// vars = rows[0].vars.split(" ")
|
|
|
+// console.log('变量名:',vars);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// // 继续累加之前的数据
|
|
|
+// let convergeDate = {
|
|
|
+// "design_var/upperB": [],
|
|
|
+// "design_var/lowerB": []
|
|
|
+// };
|
|
|
+
|
|
|
+// // 遍历每一行数据
|
|
|
+// for (let i = 0; i < rows.length; i++) {
|
|
|
+// let vals = rows[i].vals.split(" ");
|
|
|
+
|
|
|
+// let upperB = JSON.parse(vals[3]);
|
|
|
+// let lowerB = JSON.parse(vals[4]);
|
|
|
+
|
|
|
+// // 将新的数据追加到对应的数组中
|
|
|
+// convergeDate["design_var/upperB"].push(...upperB);
|
|
|
+// convergeDate["design_var/lowerB"].push(...lowerB);
|
|
|
+
|
|
|
+// // 将新的 step 值追加到 xdata 数组
|
|
|
+// xdata.value.push(rows[i].step);
|
|
|
+// }
|
|
|
+
|
|
|
+// // 获取所有的 upperB 和 lowerB 数据
|
|
|
+// let upperBData = convergeDate["design_var/upperB"];
|
|
|
+// let lowerBData = convergeDate["design_var/lowerB"];
|
|
|
+
|
|
|
+// // 计算每条曲线的数量
|
|
|
+// let curveCount = upperBData.length / rows.length;
|
|
|
+// console.log('曲线数据测试:',curveCount,upperBData.length,rows.length)
|
|
|
+// // 遍历每一条曲线,检查是否已经存在,如果存在,则更新数据;否则,创建新曲线
|
|
|
+// for (let i = 0; i < curveCount; i++) {
|
|
|
+// let upperBCurveData = [];
|
|
|
+// let lowerBCurveData = [];
|
|
|
+
|
|
|
+// // 填充每条曲线的数据
|
|
|
+// for (let j = 0; j < rows.length; j++) {
|
|
|
+// upperBCurveData.push(upperBData[j * curveCount + i]);
|
|
|
+// lowerBCurveData.push(lowerBData[j * curveCount + i]);
|
|
|
+// }
|
|
|
+
|
|
|
+// // 查找是否已经存在此曲线
|
|
|
+// let upperBSeries = series.value.find(s => s.name === `design_var/upperB${i + 1}`);
|
|
|
+// let lowerBSeries = series.value.find(s => s.name === `design_var/lowerB${i + 1}`);
|
|
|
+
|
|
|
+// // 如果存在则更新数据,否则创建新曲线
|
|
|
+// if (upperBSeries) {
|
|
|
+// upperBSeries.data.push(...upperBCurveData);
|
|
|
+// } else {
|
|
|
+// series.value.push({
|
|
|
+// name: `design_var/upperB${i + 1}`,
|
|
|
+// type: "line",
|
|
|
+
|
|
|
+// data: upperBCurveData
|
|
|
+// });
|
|
|
+// }
|
|
|
+
|
|
|
+// if (lowerBSeries) {
|
|
|
+// lowerBSeries.data.push(...lowerBCurveData);
|
|
|
+// } else {
|
|
|
+// series.value.push({
|
|
|
+// name: `design_var/lowerB${i + 1}`,
|
|
|
+// type: "line",
|
|
|
+
|
|
|
+// data: lowerBCurveData
|
|
|
+// });
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+// // 使用 myChart 设置图表的配置
|
|
|
+// myChart.setOption({
|
|
|
+// legend: {
|
|
|
+// data: [
|
|
|
+// ...Array.from({ length: curveCount }, (_, i) => `design_var/upperB${i + 1}`),
|
|
|
+// ...Array.from({ length: curveCount }, (_, i) => `design_var/lowerB${i + 1}`)
|
|
|
+// ] // 设置图例数据为曲线名
|
|
|
+// },
|
|
|
+// xAxis: {
|
|
|
+// data: xdata.value // 使用更新后的 xdata
|
|
|
+// },
|
|
|
+// series: series.value // 使用更新后的 series
|
|
|
+// });
|
|
|
+
|
|
|
+// console.log('更新后的 xdata:', xdata.value);
|
|
|
+// console.log('更新后的 series:', series.value);
|
|
|
+// };
|
|
|
+
|
|
|
const getsockechart = (data) => {
|
|
|
console.log("曲线数据", data);
|
|
|
curvedata.value = data;
|
|
@@ -63,83 +165,86 @@ const getsockechart = (data) => {
|
|
|
xdata.value = [];
|
|
|
}
|
|
|
|
|
|
+ // 如果是第一次传入数据,则初始化series为空数组;否则保留之前的数据
|
|
|
+ if (!series.value) {
|
|
|
+ series.value = [];
|
|
|
+ }
|
|
|
+
|
|
|
let rows = curvedata.value;
|
|
|
|
|
|
+ // 获取变量名
|
|
|
+ let vars = rows[0].vars.split(" ");
|
|
|
+ console.log('变量名:', vars);
|
|
|
+
|
|
|
// 继续累加之前的数据
|
|
|
- let convergeDate = {
|
|
|
- "design_var/upperB": [],
|
|
|
- "design_var/lowerB": []
|
|
|
- };
|
|
|
+ let convergeDate = {};
|
|
|
|
|
|
// 遍历每一行数据
|
|
|
for (let i = 0; i < rows.length; i++) {
|
|
|
let vals = rows[i].vals.split(" ");
|
|
|
|
|
|
- let upperB = JSON.parse(vals[3]);
|
|
|
- let lowerB = JSON.parse(vals[4]);
|
|
|
+ // 获取每一列的值
|
|
|
+ for (let j = 0; j < vars.length; j++) {
|
|
|
+ let columnName = vars[j];
|
|
|
+ let value = vals[j];
|
|
|
|
|
|
- // 将新的数据追加到对应的数组中
|
|
|
- convergeDate["design_var/upperB"].push(...upperB);
|
|
|
- convergeDate["design_var/lowerB"].push(...lowerB);
|
|
|
+ // 判断值是否是数组
|
|
|
+ try {
|
|
|
+ let parsedValue = JSON.parse(value); // 尝试解析为数组
|
|
|
+ if (Array.isArray(parsedValue)) {
|
|
|
+ // 如果是数组,分解成每个单独的值,创建多条曲线
|
|
|
+ parsedValue.forEach((item, index) => {
|
|
|
+ let curveName = `${columnName}_${index + 1}`;
|
|
|
+ if (!convergeDate[curveName]) {
|
|
|
+ convergeDate[curveName] = [];
|
|
|
+ }
|
|
|
+ convergeDate[curveName].push(item);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ // 如果是单个值,创建单一的曲线
|
|
|
+ if (!convergeDate[columnName]) {
|
|
|
+ convergeDate[columnName] = [];
|
|
|
+ }
|
|
|
+ convergeDate[columnName].push(parsedValue);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ // 如果解析失败,说明该列不是数组,直接作为单个数值处理
|
|
|
+ if (!convergeDate[columnName]) {
|
|
|
+ convergeDate[columnName] = [];
|
|
|
+ }
|
|
|
+ convergeDate[columnName].push(parseFloat(value));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// 将新的 step 值追加到 xdata 数组
|
|
|
- xdata.value.push(rows[i].step);
|
|
|
+ xdata.value.push(rows[i].step);
|
|
|
}
|
|
|
|
|
|
- // 获取所有的 upperB 和 lowerB 数据
|
|
|
- let upperBData = convergeDate["design_var/upperB"];
|
|
|
- let lowerBData = convergeDate["design_var/lowerB"];
|
|
|
-
|
|
|
- // 计算每条曲线的数量
|
|
|
- let curveCount = upperBData.length / rows.length;
|
|
|
-
|
|
|
- // 遍历每一条曲线,检查是否已经存在,如果存在,则更新数据;否则,创建新曲线
|
|
|
- for (let i = 0; i < curveCount; i++) {
|
|
|
- let upperBCurveData = [];
|
|
|
- let lowerBCurveData = [];
|
|
|
-
|
|
|
- // 填充每条曲线的数据
|
|
|
- for (let j = 0; j < rows.length; j++) {
|
|
|
- upperBCurveData.push(upperBData[j * curveCount + i]);
|
|
|
- lowerBCurveData.push(lowerBData[j * curveCount + i]);
|
|
|
- }
|
|
|
+ // 遍历每一个列名,动态更新或创建曲线
|
|
|
+ Object.keys(convergeDate).forEach((curveName) => {
|
|
|
+ if(curveName === 'No'|| curveName === 'Time/s') return;
|
|
|
+ let curveData = convergeDate[curveName];
|
|
|
|
|
|
// 查找是否已经存在此曲线
|
|
|
- let upperBSeries = series.value.find(s => s.name === `design_var/upperB${i + 1}`);
|
|
|
- let lowerBSeries = series.value.find(s => s.name === `design_var/lowerB${i + 1}`);
|
|
|
+ let existingSeries = series.value.find(s => s.name === curveName);
|
|
|
|
|
|
- // 如果存在则更新数据,否则创建新曲线
|
|
|
- if (upperBSeries) {
|
|
|
- upperBSeries.data.push(...upperBCurveData);
|
|
|
+ if (existingSeries) {
|
|
|
+ // 如果已存在,更新数据
|
|
|
+ existingSeries.data.push(...curveData);
|
|
|
} else {
|
|
|
+ // 否则,创建新的曲线
|
|
|
series.value.push({
|
|
|
- name: `design_var/upperB${i + 1}`,
|
|
|
+ name: curveName,
|
|
|
type: "line",
|
|
|
- stack: "Total",
|
|
|
- data: upperBCurveData
|
|
|
+ data: curveData
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
- if (lowerBSeries) {
|
|
|
- lowerBSeries.data.push(...lowerBCurveData);
|
|
|
- } else {
|
|
|
- series.value.push({
|
|
|
- name: `design_var/lowerB${i + 1}`,
|
|
|
- type: "line",
|
|
|
- stack: "Total",
|
|
|
- data: lowerBCurveData
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ });
|
|
|
|
|
|
// 使用 myChart 设置图表的配置
|
|
|
myChart.setOption({
|
|
|
legend: {
|
|
|
- data: [
|
|
|
- ...Array.from({ length: curveCount }, (_, i) => `design_var/upperB${i + 1}`),
|
|
|
- ...Array.from({ length: curveCount }, (_, i) => `design_var/lowerB${i + 1}`)
|
|
|
- ] // 设置图例数据为曲线名
|
|
|
+ data: Object.keys(convergeDate) // 设置图例数据为曲线名
|
|
|
},
|
|
|
xAxis: {
|
|
|
data: xdata.value // 使用更新后的 xdata
|
|
@@ -153,43 +258,117 @@ const getsockechart = (data) => {
|
|
|
|
|
|
|
|
|
// 数据转化废弃
|
|
|
+// const getshuju = (data) => {
|
|
|
+// curvedata.value = data
|
|
|
+// convergeDate.value = []
|
|
|
+// series.value = []
|
|
|
+// xdata.value = []
|
|
|
+// let rows = JSON.parse(curvedata.value)
|
|
|
+// let num = 0
|
|
|
+// for (let i = 0; i < rows.length; i++) {
|
|
|
+// num += 1
|
|
|
+// vars.value = rows[i].vars.split(",")
|
|
|
+// vals.value = rows[i].vals.split(" ")
|
|
|
+// let data = vals.value.map((str) => Number(str))
|
|
|
+// convergeDate.value.push(data)
|
|
|
+// xdata.value.push(num)
|
|
|
+// }
|
|
|
+// console.log(convergeDate.value)
|
|
|
+// // console.log( convergeDate.value);
|
|
|
+// for (let j = 0; j < vars.value.length; j++) {
|
|
|
+// let firstColumn = convergeDate.value.map((row) => row[j])
|
|
|
+// let item = {
|
|
|
+// name: vars.value[j],
|
|
|
+// type: "line",
|
|
|
+// stack: "Total",
|
|
|
+// data: firstColumn
|
|
|
+// }
|
|
|
+// series.value.push(item)
|
|
|
+// }
|
|
|
+// myChart.setOption({
|
|
|
+// legend: {
|
|
|
+// data: vars.value
|
|
|
+// },
|
|
|
+// xAxis: {
|
|
|
+// data: xdata.value
|
|
|
+// },
|
|
|
+// series: series.value
|
|
|
+// })
|
|
|
+// }
|
|
|
+
|
|
|
const getshuju = (data) => {
|
|
|
- curvedata.value = data
|
|
|
- convergeDate.value = []
|
|
|
- series.value = []
|
|
|
- xdata.value = []
|
|
|
- let rows = JSON.parse(curvedata.value)
|
|
|
- let num = 0
|
|
|
+ // 初始化变量
|
|
|
+ curvedata.value = data;
|
|
|
+ convergeDate.value = [];
|
|
|
+ series.value = [];
|
|
|
+ xdata.value = [];
|
|
|
+
|
|
|
+ // 解析传入的 JSON 数据
|
|
|
+ let rows = JSON.parse(curvedata.value);
|
|
|
+
|
|
|
for (let i = 0; i < rows.length; i++) {
|
|
|
- num += 1
|
|
|
- vars.value = rows[i].vars.split(",")
|
|
|
- vals.value = rows[i].vals.split(" ")
|
|
|
- let data = vals.value.map((str) => Number(str))
|
|
|
- convergeDate.value.push(data)
|
|
|
- xdata.value.push(num)
|
|
|
+ // 解析每一行的列名和列值
|
|
|
+ vars.value = rows[i].vars.split(" "); // 列名(空格分隔)
|
|
|
+ vals.value = rows[i].vals.split(" "); // 对应的值(空格分隔)
|
|
|
+
|
|
|
+ // 处理 vals 中的数据
|
|
|
+ let data = vals.value.map((str) => {
|
|
|
+ // 处理每个值,如果是数组类型(JSON 字符串),则转换为数组
|
|
|
+ try {
|
|
|
+ return JSON.parse(str);
|
|
|
+ } catch (e) {
|
|
|
+ return Number(str); // 如果不是数组,直接转换为数字
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ convergeDate.value.push(data);
|
|
|
+ xdata.value.push(rows[i].step);
|
|
|
}
|
|
|
- console.log(convergeDate.value)
|
|
|
- // console.log( convergeDate.value);
|
|
|
+
|
|
|
+ // 遍历每一个列名
|
|
|
for (let j = 0; j < vars.value.length; j++) {
|
|
|
- let firstColumn = convergeDate.value.map((row) => row[j])
|
|
|
- let item = {
|
|
|
- name: vars.value[j],
|
|
|
- type: "line",
|
|
|
- stack: "Total",
|
|
|
- data: firstColumn
|
|
|
+ if (vars.value[j] === 'No' || vars.value[j] === 'Time/s') {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ let firstColumn = convergeDate.value.map((row) => row[j]);
|
|
|
+
|
|
|
+ // 如果该列是数组类型的数据(例如 design_var/upperB),需要为每个值创建一条曲线
|
|
|
+ if (Array.isArray(firstColumn[0])) {
|
|
|
+ firstColumn[0].forEach((_, idx) => {
|
|
|
+ let curveData = convergeDate.value.map((row) => row[j][idx]);
|
|
|
+ let item = {
|
|
|
+ name: `${vars.value[j]}-${idx + 1}`, // 为每条曲线命名,使用列名 + 索引
|
|
|
+ type: "line",
|
|
|
+ data: curveData
|
|
|
+ };
|
|
|
+ series.value.push(item);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ // 如果该列不是数组类型(普通值),直接绘制一条曲线
|
|
|
+ let item = {
|
|
|
+ name: vars.value[j],
|
|
|
+ type: "line",
|
|
|
+ data: firstColumn
|
|
|
+ };
|
|
|
+ series.value.push(item);
|
|
|
}
|
|
|
- series.value.push(item)
|
|
|
}
|
|
|
+
|
|
|
+ // 提取 legend 的名称
|
|
|
+ const legendData = series.value.map(item => item.name);
|
|
|
+ // 更新图表配置
|
|
|
myChart.setOption({
|
|
|
legend: {
|
|
|
- data: vars.value
|
|
|
+ data: legendData.value
|
|
|
},
|
|
|
xAxis: {
|
|
|
- data: xdata.value
|
|
|
+ data: xdata.value
|
|
|
},
|
|
|
- series: series.value
|
|
|
- })
|
|
|
-}
|
|
|
+ series: series.value
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
|
|
|
const linechart = () => {
|
|
|
// let chartDom = document.getElementById('line');
|
|
@@ -206,21 +385,30 @@ const linechart = () => {
|
|
|
legend: {
|
|
|
data: vars.value,
|
|
|
orient: "vertical", // 图例方向 (horizontal水平, vertical垂直)
|
|
|
- right: '4%',
|
|
|
- top: '2%'
|
|
|
+ right: '-8%',
|
|
|
+ top: '2%',
|
|
|
+ itemWidth: 40, // 设置每个图例项的宽度
|
|
|
+ itemHeight: 14, // 设置每个图例项的高度
|
|
|
+ // icon: "line",
|
|
|
+ width: 'auto',
|
|
|
+ height: 'auto',
|
|
|
+ pageButtonItemGap: 10, // 上下滚动按钮之间的间隔
|
|
|
+ pageButtonPosition: 'end', // 滚动按钮位置,'start'、'end'
|
|
|
+ type: 'scroll',
|
|
|
+
|
|
|
},
|
|
|
grid: {
|
|
|
show: false,
|
|
|
left: "6%",
|
|
|
- right: "4%",
|
|
|
+ right: "14%",
|
|
|
bottom: "10%",
|
|
|
containLabel: true
|
|
|
},
|
|
|
- toolbox: {
|
|
|
- feature: {
|
|
|
- saveAsImage: {}
|
|
|
- }
|
|
|
- },
|
|
|
+ // toolbox: {
|
|
|
+ // feature: {
|
|
|
+ // saveAsImage: {}
|
|
|
+ // }
|
|
|
+ // },
|
|
|
xAxis: {
|
|
|
type: "category",
|
|
|
boundaryGap: false,
|