process-monitor2.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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-right"
  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("曲线数据2:", 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]), -1*parseFloat(vals[1])]);
  102. } else {
  103. series.value.push({
  104. name: vars[1],
  105. type: "line",
  106. showSymbol: false,
  107. data: [[parseFloat(vals[0]), -1*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. name: "x/c",
  119. },
  120. yAxis: {
  121. type: "value" // Y 轴也是数值轴
  122. },
  123. series: series.value
  124. });
  125. console.log("更新后的 xdata2:", xdata.value);
  126. console.log("更新后的 series2:", series.value);
  127. };
  128. // 数据转化废弃
  129. // const getshuju = (data) => {
  130. // curvedata.value = data
  131. // convergeDate.value = []
  132. // series.value = []
  133. // xdata.value = []
  134. // let rows = JSON.parse(curvedata.value)
  135. // let num = 0
  136. // for (let i = 0; i < rows.length; i++) {
  137. // num += 1
  138. // vars.value = rows[i].vars.split(",")
  139. // vals.value = rows[i].vals.split(" ")
  140. // let data = vals.value.map((str) => Number(str))
  141. // convergeDate.value.push(data)
  142. // xdata.value.push(num)
  143. // }
  144. // console.log(convergeDate.value)
  145. // // console.log( convergeDate.value);
  146. // for (let j = 0; j < vars.value.length; j++) {
  147. // let firstColumn = convergeDate.value.map((row) => row[j])
  148. // let item = {
  149. // name: vars.value[j],
  150. // type: "line",
  151. // stack: "Total",
  152. // data: firstColumn
  153. // }
  154. // series.value.push(item)
  155. // }
  156. // myChart.setOption({
  157. // legend: {
  158. // data: vars.value
  159. // },
  160. // xAxis: {
  161. // data: xdata.value
  162. // },
  163. // series: series.value
  164. // })
  165. // }
  166. const getshuju = (data) => {
  167. // console.log("曲线数据2:", data);
  168. curvedata.value = data;
  169. convergeDate.value = [];
  170. series.value = [];
  171. xdata.value = [];
  172. // 解析传入的 JSON 数据
  173. let rows = JSON.parse(curvedata.value);
  174. vars = rows[0].vars.split(" ");
  175. for (let i = 0; i < rows.length; i++) {
  176. let vals = rows[i].vals.split(" ");
  177. let existingSeries = series.value.find((s) => s.name === vars[1]);
  178. if (existingSeries) {
  179. existingSeries.data.push([parseFloat(vals[0]), -1*parseFloat(vals[1])]);
  180. } else {
  181. series.value.push({
  182. name: vars[1],
  183. type: "line",
  184. showSymbol: false,
  185. data: [[parseFloat(vals[0]), -1*parseFloat(vals[1])]],
  186. });
  187. }
  188. }
  189. console.log("vars:", vars);
  190. console.log("vals:", vals);
  191. myChart.setOption({
  192. legend: {
  193. data: [vars[1]], // 图例数据
  194. },
  195. xAxis: {
  196. type: "value",
  197. min: 0,
  198. max: 1,
  199. },
  200. yAxis: {
  201. type: "value" // Y 轴也是数值轴
  202. },
  203. series: series.value
  204. });
  205. console.log("初始化后的 xdata2:", xdata.value);
  206. console.log("初始化后的 series2:", series.value);
  207. };
  208. const linechart = () => {
  209. // let chartDom = document.getElementById('line');
  210. // let myChart= echarts.init(chartDom);
  211. option.value = {
  212. title: {
  213. text: "压力分布",
  214. left: "7.5%",
  215. top: "5%",
  216. textStyle: {
  217. color: "#333333",
  218. fontSize: 16,
  219. fontWeight: "normal",
  220. fontFamily:'Source Sans Pro-Regular'
  221. },
  222. },
  223. tooltip: {
  224. trigger: "axis", //item
  225. backgroundColor: "rgba(0,0,0,.6)",
  226. borderColor: "rgba(147, 235, 248, .8)",
  227. textStyle: {
  228. color: "#333333"
  229. }
  230. },
  231. legend: {
  232. data: vars.value,
  233. orient: "vertical", // 图例方向 (horizontal水平, vertical垂直)
  234. right: '4%',
  235. top: '2%'
  236. },
  237. grid: {
  238. show: false,
  239. left: "5%",
  240. right: "10%",
  241. bottom: "10%",
  242. containLabel: true
  243. },
  244. // toolbox: {
  245. // feature: {
  246. // saveAsImage: {}
  247. // }
  248. // },
  249. xAxis: {
  250. type: "value",
  251. boundaryGap: false,
  252. name: "x/c",
  253. nameGap:40,
  254. nameTextStyle:{
  255. fontSize: 16,
  256. color:'#333333',
  257. fontFamily:'Source Sans Pro-Regular'
  258. },
  259. nameLocation: "middle",
  260. data: xdata.value,
  261. axisLine: {
  262. //X轴线
  263. show: true,
  264. lineStyle: {
  265. color: "#333333", // 线的颜色
  266. width: 1, // 线宽
  267. type: "solid" // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
  268. }
  269. },
  270. splitLine: {
  271. show: true // 如果不需要网格线,可以设置为 false
  272. }
  273. },
  274. yAxis: {
  275. type: "value",
  276. name: "cp",
  277. nameGap:40,
  278. nameTextStyle:{
  279. fontSize: 16,
  280. color:'#333333',
  281. fontFamily:'Source Sans Pro-Regular'
  282. },
  283. nameLocation: "middle",
  284. axisLine: {
  285. //Y轴线
  286. show: true,
  287. lineStyle: {
  288. color: "#333333", // 线的颜色
  289. width: 1, // 线宽
  290. type: "solid" // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
  291. }
  292. },
  293. axisTick: {
  294. // Y轴刻度线
  295. show:true,
  296. }
  297. },
  298. dataZoom: [
  299. {
  300. type: "inside", // 鼠标滚轮缩放
  301. xAxisIndex: [0], // 针对 X 轴
  302. },
  303. {
  304. type: "slider", // 滑动条缩放
  305. xAxisIndex: [0],
  306. show: false,
  307. }
  308. ],
  309. series: series.value
  310. }
  311. option.value && myChart.setOption(option.value)
  312. window.onresize = function () {
  313. // 让图表自适应大小
  314. myChart.resize()
  315. }
  316. }
  317. // 监听数据变化,重绘图表
  318. // watch( myChart.value, () => {
  319. // console.log(11111)
  320. // window.onresize = function() {
  321. // // 让图表自适应大小
  322. // myChart.value.resize();
  323. // };
  324. // });
  325. //window.addEventListener('resize', handleResize);
  326. // watch(series, () => {
  327. // linechart();
  328. // }, { deep: true });
  329. // watch(() =>props.echartdata, (newValue, oldValue) => {
  330. // // 这里处理 echartData 变化的逻辑
  331. // console.log(11111)
  332. // console.log('echartData changed:', newValue);
  333. // // console.log(optmonitor1.value);
  334. // }, {deep: true ,immediate: true });
  335. defineExpose({ linechart, getshuju, getsockechart, echatinit })
  336. </script>
  337. <style lang="scss" scoped>
  338. .selcal {
  339. position: absolute;
  340. top: 37%;
  341. width: 26px;
  342. color: #000;
  343. font-size: 14px;
  344. font-weight: bold;
  345. left: 5px;
  346. }
  347. </style>