process-monitor1.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <template>
  2. <!-- 曲线监控 -->
  3. <div style="width: 100%; height: 100%">
  4. <div class="echartitem" style="width: 100%; height: 100%">
  5. <!-- <h3 class="selcal">{{ props.selval }}</h3> -->
  6. <div
  7. id="line-left"
  8. ref="chartContainer"
  9. style="width: 100%; height: 100%"
  10. ></div>
  11. </div>
  12. </div>
  13. </template>
  14. <script setup>
  15. import { ref, onMounted, reactive, markRaw, inject, watch, nextTick } from "vue"
  16. import { RouterView, RouterLink } from "vue-router"
  17. import { request, uploadFile } from "@/utils/request"
  18. import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
  19. import * as echarts from "echarts"
  20. let vars = ref([])
  21. let vals = ref([])
  22. let series = ref([
  23. ])
  24. let xdata = ref([])
  25. let chartContainer = ref()
  26. let myChart
  27. let chartDom = ref()
  28. let option = ref(null)
  29. let convergeDate = ref([])
  30. let curvedata = ref("")
  31. let state = reactive({
  32. instance: null
  33. })
  34. const props = defineProps({
  35. echartdata: {
  36. type: String
  37. },
  38. curvedata: {
  39. type: String
  40. }
  41. })
  42. let emit = defineEmits([""])
  43. onMounted(() => {
  44. myChart = echarts.init(chartContainer.value)
  45. linechart()
  46. myChart.resize()
  47. window.addEventListener('resize', () => {
  48. myChart.resize()
  49. })
  50. })
  51. //初始化
  52. const echatinit = () => {
  53. convergeDate.value = []
  54. series.value = []
  55. xdata.value = []
  56. }
  57. // 从websocket取数据
  58. // const getsockechart = (data) => {
  59. // curvedata.value = data
  60. // series.value = []
  61. // let rows = curvedata.value
  62. // for (let i = 0; i < rows.length; i++) {
  63. // vars.value = rows[i].vars.split(",")
  64. // vals.value = rows[i].vals.split(" ")
  65. // let data = vals.value.map((str) => Number(str))
  66. // convergeDate.value.push(data)
  67. // xdata.value.push(rows[i].step)
  68. // }
  69. // for (let j = 0; j < vars.value.length; j++) {
  70. // let firstColumn = convergeDate.value.map((row) => row[j])
  71. // let item = {
  72. // name: vars.value[j],
  73. // type: "line",
  74. // stack: "Total",
  75. // data: firstColumn
  76. // }
  77. // series.value.push(item)
  78. // }
  79. // myChart.setOption({
  80. // legend: {
  81. // data: vars.value
  82. // },
  83. // xAxis: {
  84. // data: xdata.value
  85. // },
  86. // series: series.value
  87. // })
  88. // // linechart();
  89. // }
  90. const getsockechart = (data) => {
  91. console.log("曲线数据1:", data);
  92. curvedata.value = data;
  93. let rows = curvedata.value;
  94. vars = rows[0].vars.split(" ");
  95. vals = rows[0].vals.split(" ");
  96. console.log("vars:", vars);
  97. console.log("vals:", vals);
  98. xdata.value.push(parseFloat(vals[0]));
  99. let existingSeries = series.value.find((s) => s.name === vars[1]);
  100. if (existingSeries) {
  101. existingSeries.data.push([parseFloat(vals[0]), parseFloat(vals[1])]);
  102. } else {
  103. series.value.push({
  104. name: vars[1],
  105. type: "line",
  106. showSymbol: false,
  107. data: [[parseFloat(vals[0]), parseFloat(vals[1])]],
  108. });
  109. }
  110. myChart.setOption({
  111. legend: {
  112. data: [vars[1]], // 图例数据
  113. },
  114. xAxis: {
  115. type: "value",
  116. min: 0,
  117. max: 1,
  118. },
  119. yAxis: {
  120. type: "value" // Y 轴也是数值轴
  121. },
  122. series: series.value
  123. });
  124. console.log("更新后的 xdata1:", xdata.value);
  125. console.log("更新后的 series1:", series.value);
  126. };
  127. // 数据转化废弃
  128. // const getshuju = (data) => {
  129. // curvedata.value = data
  130. // convergeDate.value = []
  131. // series.value = []
  132. // xdata.value = []
  133. // let rows = JSON.parse(curvedata.value)
  134. // let num = 0
  135. // for (let i = 0; i < rows.length; i++) {
  136. // num += 1
  137. // vars.value = rows[i].vars.split(",")
  138. // vals.value = rows[i].vals.split(" ")
  139. // let data = vals.value.map((str) => Number(str))
  140. // convergeDate.value.push(data)
  141. // xdata.value.push(num)
  142. // }
  143. // console.log(convergeDate.value)
  144. // // console.log( convergeDate.value);
  145. // for (let j = 0; j < vars.value.length; j++) {
  146. // let firstColumn = convergeDate.value.map((row) => row[j])
  147. // let item = {
  148. // name: vars.value[j],
  149. // type: "line",
  150. // stack: "Total",
  151. // data: firstColumn
  152. // }
  153. // series.value.push(item)
  154. // }
  155. // myChart.setOption({
  156. // legend: {
  157. // data: vars.value
  158. // },
  159. // xAxis: {
  160. // data: xdata.value
  161. // },
  162. // series: series.value
  163. // })
  164. // }
  165. const getshuju = (data) => {
  166. // console.log("曲线数据1:", data);
  167. curvedata.value = data;
  168. convergeDate.value = [];
  169. series.value = [];
  170. xdata.value = [];
  171. // 解析传入的 JSON 数据
  172. let rows = JSON.parse(curvedata.value);
  173. vars = rows[0].vars.split(" ");
  174. for (let i = 0; i < rows.length; i++) {
  175. let vals = rows[i].vals.split(" ");
  176. let existingSeries = series.value.find((s) => s.name === vars[1]);
  177. if (existingSeries) {
  178. existingSeries.data.push([parseFloat(vals[0]), parseFloat(vals[1])]);
  179. } else {
  180. series.value.push({
  181. name: vars[1],
  182. type: "line",
  183. showSymbol: false,
  184. data: [[parseFloat(vals[0]), parseFloat(vals[1])]],
  185. });
  186. }
  187. }
  188. console.log("vars:", vars);
  189. console.log("vals:", vals);
  190. myChart.setOption({
  191. legend: {
  192. data: [vars[1]], // 图例数据
  193. },
  194. xAxis: {
  195. type: "value",
  196. min: 0,
  197. max: 1,
  198. },
  199. yAxis: {
  200. type: "value" // Y 轴也是数值轴
  201. },
  202. series: series.value
  203. });
  204. console.log("初始化后的 xdata1:", xdata.value);
  205. console.log("初始化后的 series1:", series.value);
  206. };
  207. const linechart = () => {
  208. // let chartDom = document.getElementById('line');
  209. // let myChart= echarts.init(chartDom);
  210. option.value = {
  211. title: {
  212. text: "几何外形",
  213. left: "12%",
  214. top: "5%",
  215. textStyle: {
  216. color: "#333333",
  217. fontSize: 16,
  218. fontWeight: "normal",
  219. fontFamily:'Microsoft YaHei'
  220. },
  221. },
  222. tooltip: {
  223. trigger: "axis", //item
  224. backgroundColor: "rgba(0,0,0,.6)",
  225. borderColor: "rgba(147, 235, 248, .8)",
  226. textStyle: {
  227. color: "#333333"
  228. }
  229. },
  230. legend: {
  231. data: vars.value,
  232. orient: "vertical", // 图例方向 (horizontal水平, vertical垂直)
  233. right: '4%',
  234. top: '2%'
  235. },
  236. grid: {
  237. show: false,
  238. left: "10%",
  239. right: "5%",
  240. bottom: "10%",
  241. containLabel: true
  242. },
  243. // toolbox: {
  244. // feature: {
  245. // saveAsImage: {}
  246. // }
  247. // },
  248. xAxis: {
  249. type: "value",
  250. boundaryGap: false,
  251. name: "x/c",
  252. nameGap:40,
  253. nameTextStyle:{
  254. fontSize: 16,
  255. color:'#333333',
  256. fontFamily:'Microsoft YaHei'
  257. },
  258. nameLocation: 'middle',
  259. data: xdata.value,
  260. axisLine: {
  261. //X轴线
  262. show: true,
  263. lineStyle: {
  264. color: "#333333", // 线的颜色
  265. width: 1, // 线宽
  266. type: "solid" // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
  267. }
  268. },
  269. splitLine: {
  270. show: true // 如果不需要网格线,可以设置为 false
  271. }
  272. },
  273. yAxis: {
  274. type: "value",
  275. name: "y/c",
  276. nameGap:40,
  277. nameTextStyle:{
  278. fontSize: 16,
  279. color:'#333333',
  280. fontFamily:'Microsoft YaHei'
  281. },
  282. nameLocation: 'middle',
  283. axisLine: {
  284. //Y轴线
  285. show: true,
  286. lineStyle: {
  287. color: "#333333", // 线的颜色
  288. width: 1, // 线宽
  289. type: "solid" // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
  290. }
  291. },
  292. axisTick: {
  293. // Y轴刻度线
  294. show:true,
  295. }
  296. },
  297. dataZoom: [
  298. {
  299. type: "inside", // 鼠标滚轮缩放
  300. xAxisIndex: [0], // 针对 X 轴
  301. },
  302. {
  303. type: "slider", // 滑动条缩放
  304. xAxisIndex: [0],
  305. show: false,
  306. }
  307. ],
  308. series: series.value
  309. }
  310. option.value && myChart.setOption(option.value)
  311. window.onresize = function () {
  312. // 让图表自适应大小
  313. myChart.resize()
  314. }
  315. }
  316. // 监听数据变化,重绘图表
  317. // watch( myChart.value, () => {
  318. // console.log(11111)
  319. // window.onresize = function() {
  320. // // 让图表自适应大小
  321. // myChart.value.resize();
  322. // };
  323. // });
  324. //window.addEventListener('resize', handleResize);
  325. // watch(series, () => {
  326. // linechart();
  327. // }, { deep: true });
  328. // watch(() =>props.echartdata, (newValue, oldValue) => {
  329. // // 这里处理 echartData 变化的逻辑
  330. // console.log(11111)
  331. // console.log('echartData changed:', newValue);
  332. // // console.log(optmonitor1.value);
  333. // }, {deep: true ,immediate: true });
  334. defineExpose({ linechart, getshuju, getsockechart, echatinit })
  335. </script>
  336. <style lang="scss" scoped>
  337. .selcal {
  338. position: absolute;
  339. top: 37%;
  340. width: 26px;
  341. color: #000;
  342. font-size: 14px;
  343. font-weight: bold;
  344. left: 5px;
  345. }
  346. </style>