first-left.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843
  1. <template>
  2. <!-- 底部导航栏 -->
  3. <div class="rightfl" v-show="firstshow" style="right: 0;">
  4. <div class="rightfl_hei">
  5. <el-aside width="1.7708rem" class="L_aside L_aside1 asideg asidegbg leftbgimg1" v-show="firstshow">
  6. <div class="demo-collapse jiance asideg1 jc_header collapseeion jianstyle">
  7. <el-collapse accordion v-model="activeNames">
  8. <el-collapse-item name="1" class="imgneon">
  9. <template #title>
  10. <el-icon class="iconimg Frame3" fit="contain"></el-icon>
  11. 灾害信息展示
  12. </template>
  13. <div class="rg_content">
  14. <div class="rg-padding">
  15. <div class="he_pading color1 wusele">
  16. <el-form-item label="物理量:" v-if="props.classradio == 'Fire'||props.classradio == 'Gass'">
  17. <el-select
  18. v-model="formInline.region"
  19. @change="regionchange($event)"
  20. placeholder="请选择"
  21. >
  22. <el-option
  23. v-for="item in strResultFormatlist"
  24. :key="item.id"
  25. :label="item.name"
  26. :value="item.value"
  27. ></el-option>
  28. </el-select>
  29. </el-form-item>
  30. <div class="woter" v-else>
  31. <span>物理量:</span>
  32. <span>水位</span>
  33. </div>
  34. </div>
  35. <div class="zongji">
  36. <div class="zongjili img1">{{ warnin2 }}<span>个</span></div>
  37. <div class="zongjili img2">{{ warnin}}<span>个</span></div>
  38. </div>
  39. <div class="asides_content">
  40. <div class="jc_content tablecolor">
  41. <div class="jc_padding">
  42. <div class="xian2 btncolor tablefocus ">
  43. <!-- -->
  44. <el-table
  45. :data="tableData"
  46. style="width: 100%"
  47. :row-class-name="tableRowClassName"
  48. :header-cell-style="{ background: 'rgba(13, 22, 57, 0) ' }"
  49. @row-click="handleDelete($event)"
  50. :highlight-current-row="currentrow1"
  51. :max-height="tableHeight"
  52. >
  53. <el-table-column prop="chname" label="监测点" />
  54. <el-table-column
  55. v-for="(header, index) in dynamicHeaders"
  56. :key="index"
  57. :prop="header.prop"
  58. :label="header.label"
  59. >
  60. <template #default="scope">
  61. <span>{{ Number(scope.row[header.prop]).toFixed(2)}}</span>
  62. </template>
  63. </el-table-column>
  64. <!-- <el-table-column prop="date" label="监测点" />
  65. <el-table-column prop="name" label="水位(m)" />
  66. <el-table-column prop="name" label="流量(m³/s)" /> -->
  67. <el-table-column prop="state" label="预警" >
  68. <template #default="scope">
  69. <el-image v-if="scope.row.state=='0'" style="height: 100%" :src="bt1" fit="contain"></el-image>
  70. <el-image v-if="scope.row.state=='1'" style="height: 100%" :src="bt2" fit="contain"></el-image>
  71. <el-image v-if="scope.row.state=='2'" style="height: 100%" :src="bt3" fit="contain"></el-image>
  72. <el-image v-if="scope.row.state=='3'" style="height: 100%" :src="bt4" fit="contain"></el-image>
  73. </template>
  74. </el-table-column>
  75. </el-table>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. <!-- 监测点 -->
  81. <div>
  82. <div class="hedse">
  83. <el-icon class="iconimg1 Frame3" fit="contain"></el-icon>{{ jcname }}
  84. </div>
  85. <div class="zongji2" v-show="noneshow">
  86. <div class="Firetile" ><span>温度(℃):</span><span class="text">{{ c}}</span></div>
  87. <div class="Firetile"><span>压力(Pa):</span><span class="text2">{{ pa }}</span></div>
  88. </div>
  89. <div class="echart">
  90. <div id="line" style="width: 1.526rem;height:.9375rem;"></div></div>
  91. <div class="zongji" v-if="props.classradio=='Water'" >
  92. <div class="zongjili img3">{{ heightnum }}<span>m</span></div>
  93. <div class="zongjili img4">
  94. <p class="jcshijian">{{datetime}}</p>
  95. <p style="text-align: center;font-size: 0.0625rem;">{{ maxtime.steptime }}</p></div>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <!-- <div class="mgsnoe" style="height: 200px"></div> -->
  101. </el-collapse-item>
  102. </el-collapse>
  103. </div>
  104. </el-aside>
  105. <!-- 动画 -->
  106. <el-aside width="1.7708rem" class="L_aside L_aside1 asideg asidegbg leftbgimg1" v-show="firstshow">
  107. <div class="demo-collapse jiance asideg1 jc_header collapseeion jianstyle">
  108. <el-collapse accordion v-model="activeNames1" class="bganimation">
  109. <el-collapse-item name="2" class="imgneon">
  110. <template #title>
  111. <el-icon class="iconimg Frame3" fit="contain"></el-icon>
  112. 动画展示
  113. </template>
  114. <div class="rg_content">
  115. <div class="rg-padding">
  116. <div class="animation_s">
  117. <el-slider
  118. :max="endtime"
  119. :min="0"
  120. v-model="count"
  121. @change="sliderchange"
  122. >
  123. </el-slider>
  124. <!-- <el-progress type="line" :percentage="percentage" :color="customColor" :stroke-width="4"/> -->
  125. <div class="tanniu">
  126. <div><el-image :src="t1" fit="contain" @click="Prev" ></el-image></div>
  127. <div v-show="suspendshow"><el-image :src="t2" fit="contain" @click="play(500)" ></el-image></div>
  128. <div v-show="playshow"><el-image :src="t3" fit="contain" @click="play(500)" ></el-image></div>
  129. <div><el-image :src="t4" fit="contain" @click="increment"></el-image></div>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. <!-- <div class="mgsnoe" style="height: 200px"></div> -->
  135. </el-collapse-item>
  136. </el-collapse>
  137. </div>
  138. </el-aside>
  139. </div>
  140. </div>
  141. <htmldialog ref="htmldialogref" :classradio="props.classradio" :isshow='isshow' @funidshow="funidshow"/>
  142. </template>
  143. <script setup>
  144. import { ref, onMounted, reactive, } from "vue";
  145. import { RouterView, RouterLink } from "vue-router"
  146. import { request, uploadFile } from "@/utils/request";
  147. import { ElMessage, ElButton, ElDialog, ElSelect } from 'element-plus'
  148. import * as echarts from 'echarts'
  149. import { createFireControl } from "@/control/fireControl.js";
  150. import { vtkmodel } from "@/control/vtkModel.js";
  151. import vtkDataArray from "@kitware/vtk.js/Common/Core/DataArray.js";
  152. import bt4 from "@/assets/img/Group1376.png"
  153. import bt1 from "@/assets/img/Group1377.png"
  154. import bt3 from "@/assets/img/Group1395.png"
  155. import bt2 from "@/assets/img/Group1396.png"
  156. import t1 from "@/assets/img/t1.png";
  157. import t2 from "@/assets/img/t2.png";
  158. import t3 from "@/assets/img/t3.png";
  159. import t4 from "@/assets/img/t4.png";
  160. import htmldialog from "./htmldialog.vue"
  161. let firstshow = ref(false);
  162. let activeNames = ref(["1"]);
  163. let activeNames1=ref(["2"])
  164. let tableHeight = ref(130);
  165. let playshow=ref(true);
  166. let suspendshow=ref(false);
  167. let showfalse=ref(false);
  168. let c=ref("0");
  169. let htmldialogref=ref();
  170. let pa=ref("30s");
  171. const isstop = ref(false);
  172. let noneshow=ref(false);
  173. const strResultFormatlist = ref([]);
  174. let count=ref(1);
  175. let starttime = ref(1);
  176. let endtime = ref(60);
  177. let timenum = ref(2);
  178. let aid = ref();
  179. let newcount = ref(0);
  180. let timing = ref(null);
  181. let timing3 = ref(null);
  182. let timing2 = ref(null);
  183. let currentrow1 = ref(false);
  184. let steptimes = ref([]);
  185. let series = ref([]);
  186. let heightnum=ref("0");
  187. let maxtime=ref({
  188. steptime:"03:02"
  189. });
  190. let datetime=ref();
  191. let jcname=ref("监测点");
  192. let danwei=ref();
  193. let state=ref();
  194. let warnin=ref(0);
  195. let warnin2=ref(0);
  196. const min = ref(0);
  197. const max = ref(1);
  198. let selelist=ref();
  199. let jgSelectPointId=ref(0);
  200. let selobj=ref([]);
  201. let isshow=ref(false);
  202. let maxindex=ref();
  203. const dynamicHeaders = ref([
  204. ]);
  205. const props = defineProps({
  206. classradio: {
  207. type: String,
  208. // default: '',activeIndex
  209. },
  210. })
  211. let classradio=ref();
  212. const job = ref({
  213. jid: 0, // 任务ID
  214. aid: 0, // 事故ID
  215. starttime: "", // 结束时间
  216. endtime: "", // 开始时间
  217. state: "", // 状态
  218. faildes: "", // 失败原因
  219. dt: "", // 时间步长
  220. dx: "", // 空间步长
  221. reportstep: "", // 输出步长
  222. interactionstep: "", // 交互步长
  223. acctime: "", // 事故开始时间
  224. totaltime: "", // 模拟时长
  225. coids: "", // 物理属性ID逗号分隔
  226. cocodes: "", //物理属性code逗号分隔
  227. });
  228. const formInline = ref({
  229. region: "Temperature",
  230. });
  231. const tableData =ref( [
  232. // {
  233. // date: '检测点',
  234. // name: '1',
  235. // state: '1',
  236. // city: 'Los Angeles',
  237. // address: 'No. 189, Grove St, Los Angeles',
  238. // v1: 'CA 90036',
  239. // v2: 'Home',
  240. // },
  241. // {
  242. // date: '检测点',
  243. // name: '1',
  244. // state: '2',
  245. // city: 'Los Angeles',
  246. // address: 'No. 189, Grove St, Los Angeles',
  247. // v1: 'CA 90036',
  248. // v2: 'Office',
  249. // },
  250. ])
  251. let myChart;
  252. onMounted(() => {
  253. lineChart();
  254. // window.onresize = function() {
  255. // // 让图表自适应大小
  256. // myChart.resize();
  257. // };
  258. fcon.step=count.value;
  259. });
  260. const fcon = createFireControl();
  261. // 检测点的结果获取
  262. // 父组件获取的方法初始化
  263. const indexinit= (id,radio)=>{
  264. aid.value=id;
  265. // classradio.value=radio;
  266. //console.log(classradio.value);
  267. // fcon.step=count.value;
  268. // getMonitor();
  269. // vtkmodel.clearModeAddJg();
  270. // vtkGridRead()
  271. if(props.classradio=='Fire'){
  272. formInline.value.region="Temperature";
  273. }else if(props.classradio=='Water'){
  274. formInline.value.region="Height";
  275. }
  276. myChart.clear();
  277. readJob();
  278. }
  279. function regionchange(val) {
  280. let newMap = new Map([
  281. ["Temperature", "(℃)"],
  282. ["Pressure", "(Pa)"],
  283. ["CO", "(ppm)"],
  284. ["CO2", "(%)"],
  285. ["H2S", "(%)"],
  286. ["HCL", "(ppm)"],
  287. ["NO2", "(ppm)"],
  288. ["SO2", "(ppm)"],
  289. ["Flow", "(Pa)"],
  290. ["Height", "(m)"],
  291. ]);
  292. newMap.forEach((value, key) => {
  293. // console.log(key, value);
  294. if (key == val) {
  295. danwei.value = key + value;
  296. }
  297. });
  298. //getMonitor();
  299. vtkShow();
  300. }
  301. //获取任务信息
  302. async function readJob() {
  303. const params = {
  304. transCode: "D10017",
  305. aid: aid.value,
  306. };
  307. await request(params)
  308. .then((res) => {
  309. if (res.returnCode == "000000000") {
  310. //成功
  311. datetime.value=res.endtime.slice(0,10);
  312. if(res.state=='1'){
  313. // vtkmodel.clearModeAddJg(); //隐藏模版显示结果
  314. job.value = res;
  315. getMonitor();
  316. vtkmodel.clearModeAddJg();
  317. reddate(new Date());
  318. vtkGridRead();
  319. jgSelect1();
  320. firstshow.value=true;
  321. endtime.value= Number(res.totaltime)/Number(res.reportstep);
  322. }else if(res.state=='-1'){
  323. firstshow.value=false;
  324. ElMessage({
  325. message: " 求解失败",
  326. type: 'error',
  327. });
  328. }else if(res.state=='0'){
  329. firstshow.value=false;
  330. ElMessage({ message: "求解未完成", type: 'error',
  331. });
  332. }
  333. } else {
  334. ElMessage({
  335. message: res.returnMsg,
  336. type: "error",
  337. });
  338. }
  339. })
  340. .catch((err) => {
  341. if(err.returnMsg=="任务不存在!"){
  342. monitor.value=false;
  343. console.log(1111)
  344. ElMessage({
  345. message: "未求解",
  346. type: 'error',
  347. });
  348. }
  349. });
  350. }
  351. //监测点数据获取
  352. function renderheader(h, { column, $index }) {
  353. // console.log(column.label)
  354. // return h("div", {}, [
  355. // h("div", {}, column.label.split(",")[0]),
  356. // h("div", {}, column.label.split(",")[1]),
  357. // ]);
  358. }
  359. async function getMonitor() {
  360. let cocode;
  361. let name;
  362. let v=1;
  363. const params = {
  364. transCode: "D10018",
  365. aid: aid.value,
  366. step: fcon.step,
  367. };
  368. request(params)
  369. .then((res) => {
  370. if (res.returnCode == "000000000") {
  371. strResultFormatlist.value = [];
  372. let headertable=[];
  373. //let s=0;
  374. // dynamicHeaders.value=res.codes;
  375. console.log(res);
  376. for (let i = 0; i < res.codes.length; i++) {
  377. cocode = res.codes[i];
  378. let num=i+1
  379. let newMap = new Map([
  380. ["Temperature", "(℃)"],
  381. ["Pressure", "(Pa)"],
  382. ["CO", "(ppm)"],
  383. ["CO2", "(%)"],
  384. ["H2S", "(%)"],
  385. ["HCL", "(ppm)"],
  386. ["NO2", "(ppm)"],
  387. ["SO2", "(ppm)"],
  388. ["Flow", "(m³/s)"],
  389. ["Height", "(m)"],
  390. ]);
  391. newMap.forEach((value, key) => {
  392. if ( key == res.codes[i].code ) {
  393. if(key=='Temperature'){
  394. key='温度'
  395. }else if(key=='Pressure'){
  396. key='压强'
  397. }else if(key=='CO'){
  398. key= '一氧化碳'
  399. }else if(key=='CO2'){
  400. key= '二氧化碳'
  401. }else if(key=='HCL'){
  402. key= '氯化氢'
  403. }else if(key=='NO2'){
  404. key= '二氧化氮'
  405. }else if(key=='SO2'){
  406. key= '二氧化硫'
  407. }else if(key=='H2S'){
  408. key= '硫化氢'
  409. }else if(key=='Height'){
  410. key= '水位'
  411. }else if(key=='Flow'){
  412. key= '流量'
  413. }else{
  414. }
  415. // res.codes[i].code = key+value;
  416. name = key+'\n'+value
  417. }
  418. });
  419. strResultFormatlist.value.push({
  420. id: i,
  421. name: name,
  422. value: cocode.code,
  423. });
  424. headertable.push(
  425. { prop:'v'+num, label:name},
  426. )
  427. }
  428. dynamicHeaders.value=headertable;
  429. let warning=[];//一级警告
  430. let warning2=[];//二级警告
  431. let warning3=[];//突水发生
  432. let warning4=[];//安全区域
  433. for (let j = 0; j < res.vals.length; j++) {
  434. if(Number(res.vals[j].v1)==0&&Number(res.vals[j].v1)<=0.1){
  435. res.vals[j].state=0;
  436. warning4.push(res.vals[j].v1);
  437. }else if(Number(res.vals[j].v1)>0.1&&Number(res.vals[j].v1)<=0.5){
  438. res.vals[j].state=1;
  439. warning3.push(res.vals[j].v1);
  440. }else if(Number(res.vals[j].v1)>0.5&&Number(res.vals[j].v1)<=1){
  441. res.vals[j].state=2;
  442. warning2.push(res.vals[j].v1);
  443. }else if(Number(res.vals[j].v1)>1){
  444. res.vals[j].state=3;
  445. warning.push(res.vals[j].v1);
  446. }
  447. // let value="v"+Number(v+j);
  448. // console.log(value)
  449. // res.vals[j].value=Number(res.vals[j].value).toFixed(2);
  450. }
  451. warnin2.value=warning2.length;
  452. warnin.value=warning.length;
  453. tableData.value=res.vals;
  454. }
  455. }) .catch((err) => {
  456. tableData.value=[];
  457. ElMessage.error(err.returnMsg);
  458. });
  459. }
  460. //回到上一页
  461. function Prev() {
  462. currentrow1.value=false;
  463. isstop.value = false;
  464. count.value--;
  465. fcon.step = count.value;
  466. newcount.value = count.value;
  467. }
  468. // 下一页
  469. function increment() {
  470. currentrow1.value=false;
  471. isstop.value = false;
  472. if (count.value == endtime.value) {
  473. return;
  474. }
  475. count.value++;
  476. newcount.value = count.value;
  477. fcon.step = count.value;
  478. console.log( newcount.value );
  479. }
  480. // 播放暂停
  481. const play =(time)=>{
  482. showfalse.value=!showfalse.value;
  483. currentrow1.value=false;
  484. if(showfalse.value){
  485. suspendshow.value=true;
  486. playshow.value=false;
  487. isstop.value = true;//播放
  488. const sleep = (timeout = time) =>
  489. new Promise((resolve, reject) => {
  490. setTimeout(resolve, timeout);
  491. });
  492. let timer = async (timeout) => {
  493. while (count.value < endtime.value && isstop.value) {
  494. if (isstop.value == true) {
  495. await sleep(time);
  496. count.value++;
  497. fcon.step = count.value;
  498. newcount.value = count.value;
  499. }
  500. }
  501. };
  502. console.log(count.value)
  503. timer(time);
  504. }else{
  505. isstop.value = false;//暂停
  506. playshow.value=true;
  507. suspendshow.value=false;
  508. }
  509. }
  510. function sliderchange(val) {
  511. suspendshow.value=false;
  512. playshow.value=true;
  513. isstop.value = false;
  514. newcount.value = count.value;
  515. fcon.step = count.value;
  516. console.log(count.value);
  517. }
  518. const tableRowClassName=()=>{
  519. }
  520. //获取最大值的下标
  521. function firstOccurrenceOfMax(arr) {
  522. var max = arr[0];
  523. //声明了个变量 保存下标值
  524. var index = 0;
  525. for (var i = 0; i < arr.length; i++) {
  526. if (max < arr[i]) {
  527. max = arr[i];
  528. index = i;
  529. }
  530. }
  531. maxindex.value=index
  532. return index;
  533. }
  534. // 随机颜色
  535. const randomColor=()=>{
  536. var letters = '0123456789ABCDEF';
  537. var color = '#';
  538. do {
  539. for (var i = 0; i < 6; i++) {
  540. color += letters[Math.floor(Math.random() * 16)];
  541. }
  542. } while (color === '#FFFFFF' || color === '#000000');
  543. console.log(color);
  544. return color;
  545. }
  546. // 批量数据
  547. const handleDelete=(event)=>{
  548. jcname.value=event.chname;
  549. currentrow1.value=true;
  550. const params = {
  551. transCode: "D10019",
  552. aid: aid.value,
  553. chname: event.chname,
  554. };
  555. request(params)
  556. .then((res) => {
  557. series.value=[];
  558. steptimes.value=[];
  559. if (res.returnCode == "000000000") {
  560. for (let j = 0; j < res.steptimes.length; j++) {
  561. steptimes.value.push(Object.values(res.steptimes[j]));
  562. }
  563. for (let i = 0; i < res.rows.length; i++) {
  564. let arr=[];
  565. for (let k = 0; k < res.rows[i].data.length; k++) {
  566. if(res.rows[i].data[k].val<0){
  567. }
  568. arr.push(res.rows[i].data[k].val);
  569. }
  570. // var arr = Array.from(Object.values(res.rows[i].data),x=>x);
  571. series.value.push({
  572. name:res.rows[i].code,
  573. type: 'line',
  574. showSymbol: false,
  575. smooth: true,
  576. data:arr,//res.rows[i].data
  577. })
  578. }
  579. firstOccurrenceOfMax(series.value[0].data)
  580. const max = Math.max(...series.value[0].data);
  581. maxtime.value= res.steptimes[ maxindex.value];
  582. console.log(maxtime.value);
  583. console.log(1111)
  584. heightnum.value=max;
  585. }
  586. lineChart();
  587. }) .catch((err) => {
  588. ElMessage.error(err.returnMsg);
  589. });
  590. }
  591. const funidshow=(val)=>{
  592. isshow.value=val;
  593. }
  594. // 获取点的数据
  595. function jgSelect1(event) {
  596. // console.log(event.pageX);
  597. timing2.value = setInterval(() => {
  598. //定时器
  599. if (jgSelectPointId.value != vtkmodel.selectJgPointId) {
  600. // console.log("pointid",vtkmodel.selectJgPointId);//选择的点数据
  601. //获取点对应的Scalar
  602. isshow.value=true;
  603. htmldialogref.value.X=Number(vtkmodel.epageX)+'px';
  604. htmldialogref.value.Y=Number(vtkmodel.epageY)+'px';
  605. jgSelectPointId.value = vtkmodel.selectJgPointId;
  606. selobj.value = [];
  607. for (const key of fcon.scalar.keys()) {
  608. selobj.value.push({
  609. name: key,
  610. value: fcon.scalar.get(key)[vtkmodel.selectJgPointId],
  611. });
  612. }
  613. console.log(selobj.value);
  614. // console.log(window.style.left )
  615. // msgval.value = selobj.value;
  616. htmldialogref.value.getdatahtml(selobj.value);
  617. }
  618. }, 1000);
  619. }
  620. const linedata=()=>{
  621. }
  622. const lineChart=()=>{
  623. // console.log(series.value);
  624. var chartDom = document.getElementById('line');
  625. myChart = echarts.init(chartDom);
  626. // myChart = echarts.init(document.getElementById('line'));
  627. let option = {
  628. tooltip: {
  629. trigger: 'axis'
  630. },
  631. // legend: {
  632. // data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
  633. // },
  634. grid: {
  635. left: '3%',
  636. right: '4%',
  637. bottom: '3%',
  638. containLabel: true
  639. },
  640. xAxis: {
  641. type: 'category',
  642. boundaryGap: false,
  643. data:steptimes.value,
  644. },
  645. yAxis: {
  646. type: 'value'
  647. },
  648. series: series.value
  649. };
  650. option && myChart.setOption(option);
  651. window.onresize = function() {
  652. // 让图表自适应大小
  653. myChart.resize();
  654. };
  655. }
  656. function reddate(date) {
  657. //当前时间
  658. const timestamp = date.getTime();
  659. // newtime.value = timestampToTime(timestamp);
  660. const accstamp = Date.parse(job.value.acctime);
  661. var timeDifference = parseInt((timestamp - accstamp) / 1000);
  662. fcon.stepsum = parseInt(job.value.totaltime) / parseInt(job.value.reportstep);
  663. if (timeDifference < parseInt(job.value.totaltime)) {
  664. //最长时间范围
  665. fcon.step = parseInt(timeDifference / parseInt(job.value.reportstep));
  666. } else {
  667. fcon.step = fcon.stepsum;
  668. }
  669. count.value = fcon.step;
  670. newcount.value = count.value;
  671. }
  672. function velocityRead() {
  673. return;
  674. // clearInterval(arrowtime.value);
  675. fcon
  676. .getVelocityByStep(fcon.step)
  677. .then((result) => {
  678. vtkmodel.addArrow(fcon.velocitys);
  679. // arrowtimeStart();
  680. })
  681. .catch((err) => {
  682. console.log(err);
  683. });
  684. }
  685. function getMinMax(scalars) {
  686. // console.log("getMinMax:",scalars);
  687. min.value = 0;
  688. max.value = scalars[0];
  689. for (let index = 0; index <= scalars.length; index++) {
  690. let scalar = scalars[index];
  691. if (min.value > scalar) {
  692. min.value = scalar;
  693. }
  694. if (max.value < scalar) {
  695. max.value = scalar;
  696. }
  697. }
  698. if( min.value== max.value){
  699. max.value=min.value+1;
  700. }
  701. console.log("max,min:", max.value, min.value);
  702. }
  703. function vtkShow() {
  704. const scalarBarActor = vtkmodel.scalarBarActor;
  705. const mapper = vtkmodel.jgMapper;
  706. const actor = vtkmodel.jgActor;
  707. if (!fcon.scalar) {
  708. return;
  709. }
  710. const scalarArray = fcon.scalar.get(formInline.value.region);
  711. if (!scalarArray || !fcon.polydata) {
  712. return;
  713. }
  714. console.log("scalarArray:", scalarArray);
  715. const dataArray = vtkDataArray.newInstance({
  716. name: formInline.value.region,
  717. size: fcon.polydata.getNumberOfPoints(),
  718. });
  719. console.log("执行了");
  720. // console.log(dataArray);
  721. dataArray.setData(scalarArray);
  722. fcon.polydata.getPointData().setScalars(dataArray);
  723. // fcon.polydata.getPointData().setOpacity(dataArray);
  724. mapper.setInputData(fcon.polydata);
  725. getMinMax(scalarArray);
  726. mapper.setScalarRange(
  727. parseFloat(min.value.toFixed(3)),
  728. parseFloat(max.value.toFixed(3))
  729. ); //设置范围
  730. // actor.setMapper(mapper);
  731. scalarBarActor.setAxisLabel(formInline.value.region);
  732. mapper.clearColorArrays(); //强制重建颜色
  733. actor.getProperty().setOpacity(count.value); //设置错误的透明度使得页面重新加载 不设置不刷新页面
  734. actor.getProperty().setOpacity(0.5);
  735. // vtkmodel.renderer.resetCamera();
  736. vtkmodel.renderWindow.render();
  737. }
  738. function vtkGridRead() {
  739. fcon.aid = aid.value;
  740. fcon
  741. .initGemetry()
  742. .then((result) => {
  743. vtkScalarRead();
  744. vtkmodel.renderWindowWith.resize();
  745. })
  746. .catch((err) => {});
  747. }
  748. function vtkScalarRead() {
  749. fcon
  750. .getScalrsByStep(fcon.step)
  751. .then((result) => {
  752. // velocityRead() ;
  753. vtkShow();
  754. })
  755. .catch((err) => {
  756. // console.log(err);
  757. });
  758. }
  759. watch(
  760. newcount,
  761. (newVal, oldVal) => {
  762. console.log("值改变了", newVal, oldVal);
  763. fcon.step = newVal;
  764. getMonitor();
  765. vtkScalarRead();
  766. // vtkScalarRead();
  767. if( newVal>=endtime.value){
  768. playshow.value=true;
  769. suspendshow.value=false;
  770. isstop.value = false;
  771. }
  772. },
  773. { deep: true }
  774. ); //深度监视
  775. defineExpose({firstshow,isshow,indexinit});
  776. </script>
  777. <style lang="scss" scoped>
  778. .el-slider {
  779. width: 100%;
  780. height: 32px;
  781. display: flex;
  782. align-items: center;
  783. }
  784. .tanniu{
  785. display: flex;
  786. justify-content:space-between;
  787. align-items: center;
  788. }
  789. </style>
  790. <style>
  791. .el-table .cell {
  792. white-space:pre-line;
  793. text-align: center ;
  794. }
  795. </style>