123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523 |
- <template>
- <!-- 曲线监控 -->
- <div style="width: 100%; height: 100%">
- <div class="echartitem" style="width: 100%; height: 100%">
- <!-- <h3 class="selcal">{{ props.selval }}</h3> -->
- <div
- id="line"
- ref="chartContainer"
- style="width: 100%; height: 100%"
- ></div>
-
- </div>
- </div>
- </template>
- <script setup>
- import { ref, onMounted, reactive, markRaw, inject, watch, nextTick } from "vue"
- import { RouterView, RouterLink } from "vue-router"
- import { request, uploadFile } from "@/utils/request"
- import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
- import * as echarts from "echarts"
- let vars = ref([])
- let vals = ref([])
- let series = ref([
-
- ])
- let xdata = ref([])
- let chartContainer = ref()
- let myChart
- let chartDom = ref()
- let option = ref(null)
- let convergeDate = ref([])
- let curvedata = ref("")
- let state = reactive({
- instance: null
- })
- const props = defineProps({
- echartdata: {
- type: String
- },
- curvedata: {
- type: String
- }
- })
- let emit = defineEmits([""])
- onMounted(() => {
- myChart = echarts.init(chartContainer.value)
- linechart()
- myChart.resize();
- })
- //初始化
- const echatinit = () => {
- convergeDate.value = []
- series.value = []
- 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;
- let rows = curvedata.value;
- // 获取变量名
- let vars = rows[0].vars.split(" ");
- console.log('变量名:', vars);
- // 继续累加之前的数据
- let convergeDate = {};
- // 遍历每一行数据
- for (let i = 0; i < rows.length; i++) {
- let vals = rows[i].vals.split(" ");
- // 获取每一列的值
- for (let j = 0; j < vars.length; j++) {
- let columnName = vars[j];
- let value = vals[j];
- // 判断值是否是数组
- 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);
- }
- // 遍历每一个列名,动态更新或创建曲线
- Object.keys(convergeDate).forEach((curveName) => {
- if(curveName === 'No'|| curveName === 'Time/s') return;
- let curveData = convergeDate[curveName];
- // 查找是否已经存在此曲线
- let existingSeries = series.value.find(s => s.name === curveName);
- if (existingSeries) {
- // 如果已存在,更新数据
- existingSeries.data.push(...curveData);
- } else {
- // 否则,创建新的曲线
- series.value.push({
- name: curveName,
- type: "line",
- data: curveData
- });
- }
- });
- // 使用 myChart 设置图表的配置
- myChart.setOption({
- legend: {
- data: Object.keys(convergeDate) // 设置图例数据为曲线名
- },
- xAxis: {
- data: xdata.value // 使用更新后的 xdata
- },
- series: series.value // 使用更新后的 series
- });
- console.log('更新后的 xdata:', xdata.value);
- console.log('更新后的 series:', series.value);
- };
- // 数据转化废弃
- // 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 = [];
- // 解析传入的 JSON 数据
- let rows = JSON.parse(curvedata.value);
- for (let i = 0; i < rows.length; i++) {
- // 解析每一行的列名和列值
- 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);
- }
- // 遍历每一个列名
- for (let j = 0; j < vars.value.length; j++) {
- 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);
- }
- }
- // 提取 legend 的名称
- const legendData = series.value.map(item => item.name);
- // 更新图表配置
- myChart.setOption({
- legend: {
- data: legendData
- },
- xAxis: {
- data: xdata.value
- },
- series: series.value
- });
- };
- const linechart = () => {
- // let chartDom = document.getElementById('line');
- // let myChart= echarts.init(chartDom);
- option.value = {
- tooltip: {
- trigger: "axis", //item
- backgroundColor: "rgba(0,0,0,.6)",
- borderColor: "rgba(147, 235, 248, .8)",
- textStyle: {
- color: "#FFF"
- }
- },
- legend: {
- data: vars.value,
- orient: "vertical", // 图例方向 (horizontal水平, vertical垂直)
- right: '0%',
- top: '3%',
- itemWidth: 30, // 设置每个图例项的宽度
- itemHeight: 0, // 设置每个图例项的高度
- // icon: "line",
- width: 'auto',
- height: 'auto',
- pageButtonItemGap: 10, // 上下滚动按钮之间的间隔
- pageButtonPosition: 'end', // 滚动按钮位置,'start'、'end'
- type: 'scroll',
- formatter: function (name) {
- // 使用 ECharts 内部 API 获取文本宽度
- var textWidth = echarts.format.getTextRect(name).width;
- // 设置一个最大宽度(如 150px),如果文本宽度超出最大值则截断
- if (textWidth > 150) {
- return name.substring(0, 15) + '...'; // 超出最大宽度的部分加省略号
- }
- return name; // 否则,直接返回原始文本
- },
- },
- grid: {
- show: false,
- left: "6%",
- right: "14%",
- bottom: "10%",
- containLabel: true
- },
- // toolbox: {
- // feature: {
- // saveAsImage: {}
- // }
- // },
- xAxis: {
- type: "category",
- boundaryGap: false,
- name: "迭代次数",
- nameGap:40,
- nameTextStyle:{
- fontSize: 16,
- color:'#333333',
- fontFamily:'Microsoft YaHei'
- },
- nameLocation: 'middle',
- data: xdata.value,
- axisLine: {
- //X轴线
- show: true,
- lineStyle: {
- color: "#333333", // 线的颜色
- width: 1, // 线宽
- type: "solid" // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
- }
- },
- splitLine: {
- show: true // 如果不需要网格线,可以设置为 false
- },
-
- },
- yAxis: {
- type: "value",
- name: "优化变量",
- nameGap:40,
- nameTextStyle:{
- fontSize: 16,
- color:'#333333',
- fontFamily:'Microsoft YaHei'
- },
- nameLocation: 'middle',
- axisLine: {
- //Y轴线
- show: true,
- lineStyle: {
- color: "#333333", // 线的颜色
- width: 1, // 线宽
- type: "solid" // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
- }
- },
- axisTick: {
- // Y轴刻度线
- show:true,
- },
- splitLine: {
- show: true // 如果不需要网格线,可以设置为 false
- },
-
- },
- dataZoom: [
- {
- type: "inside", // 鼠标滚轮缩放
- xAxisIndex: [0], // 针对 X 轴
- },
- {
- type: "slider", // 滑动条缩放
- xAxisIndex: [0],
-
- show: false,
- }
- ],
- series: series.value
- }
- option.value && myChart.setOption(option.value)
- window.onresize = function () {
- // 让图表自适应大小
- myChart.resize()
- }
- }
- // 监听数据变化,重绘图表
- // watch( myChart.value, () => {
- // console.log(11111)
- // window.onresize = function() {
- // // 让图表自适应大小
- // myChart.value.resize();
- // };
- // });
- //window.addEventListener('resize', handleResize);
- // watch(series, () => {
- // linechart();
- // }, { deep: true });
- // watch(() =>props.echartdata, (newValue, oldValue) => {
- // // 这里处理 echartData 变化的逻辑
- // console.log(11111)
- // console.log('echartData changed:', newValue);
- // // console.log(optmonitor1.value);
- // }, {deep: true ,immediate: true });
- defineExpose({ linechart, getshuju, getsockechart, echatinit })
- </script>
- <style lang="scss" scoped>
- .selcal {
- position: absolute;
- top: 37%;
- width: 26px;
- color: #000;
- font-size: 14px;
- font-weight: bold;
- left: 5px;
- }
- .diedai {
- color: #000;
- font-size: 14px;
- padding-bottom: 20px;
- font-weight: bold;
- }
- </style>
-
-
|