123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504 |
- <template>
- <div v-show="isexpdialog" class="dialog_class4 bgcolor tianjia foter_l tianjia">
- <div class="expcontent">
- <h1 class="headertiele">一维瓦斯爆炸演化</h1>
- <div class="exp">
- <div class="expleft" id="expleft1"></div>
- <div class="expright">
- <!-- 物理量 -->
- <div class="heigjie imgneon">
- <div class="he_pading1 color1">
- <el-form-item label="物理量:">
- <el-config-provider :locale="zhCn">
- <el-select v-model="formInline.region" @change="regionchange($event)" placeholder="请选择">
- <el-option v-for="item in strResultFormatlist" :key="item.id" :label="item.name"
- :value="item.value"></el-option>
- </el-select>
- </el-config-provider>
- </el-form-item>
- </div>
- </div>
- <!-- 动画 -->
- <el-aside class="L_aside L_aside1 asideg asidegbg leftbgimg1">
- <div class="demo-collapse jiance asideg1 jc_header collapseeion jianstyle">
- <el-collapse accordion v-model="activeNames1" class="bganimation">
- <el-collapse-item name="2" class="imgneon">
- <template #title>
- <el-icon class="iconimg Frame3" fit="contain"></el-icon>
- 动画展示
- </template>
- <div class="rg_content">
- <div class="rg-padding">
- <div class="animation_s">
- <el-slider :max="endtime" :min="1" v-model="count" @change="sliderchange">
- </el-slider>
- <div class="tanniu">
- <div><el-image :src="t1" fit="contain" @click="Prev"></el-image></div>
- <div v-show="suspendshow"><el-image :src="t2" fit="contain" @click="play(500)"></el-image></div>
- <div v-show="playshow"><el-image :src="t3" fit="contain" @click="play(500)"></el-image></div>
- <div><el-image :src="t4" fit="contain" @click="increment"></el-image></div>
- </div>
- </div>
- </div>
- </div>
- <!-- <div class="mgsnoe" style="height: 200px"></div> -->
- </el-collapse-item>
- </el-collapse>
- </div>
- </el-aside>
- </div>
- </div>
- <div class="dialog-footer footer_div l_btn">
- <div class="footerbtn flex1">
- <div class="borderimg"><el-button @click="isexpdialog = false">取消</el-button></div>
- </div>
- <div class="footerbtn flex1">
- <div class="borderimg"><el-button @click="quding()">
- 确定
- </el-button></div>
- </div>
- </div>
- </div>
-
- </div>
- <!-- 一维瓦斯爆炸弹出列表-->
- </template>
- <script setup>
- import zhCn from "element-plus/es/locale/lang/zh-cn"
- import { ref, onMounted, reactive } from "vue"
- import { RouterView, RouterLink } from "vue-router"
- import { request, uploadFile } from "@/utils/request"
- import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
- import { createGassControl } from "@/control/gassControl.js"
- import t1 from "@/assets/img/t1.png"
- import t2 from "@/assets/img/t2.png"
- import t3 from "@/assets/img/t3.png"
- import t4 from "@/assets/img/t4.png"
- import * as d3 from "d3-scale";
- import { formatDefaultLocale } from "d3-format";
- import vtkGenericRenderWindow from '@kitware/vtk.js/Rendering/Misc/GenericRenderWindow';
- import vtkRenderWindowWithControlBar from "@kitware/vtk.js/Rendering/Misc/RenderWindowWithControlBar";
- import vtkActor from "@kitware/vtk.js/Rendering/Core/Actor";
- import vtkConeSource from "@kitware/vtk.js/Filters/Sources/ConeSource";
- import vtkMapper from "@kitware/vtk.js/Rendering/Core/Mapper";
- import { Representation } from "@kitware/vtk.js/Rendering/Core/Property/Constants";
- import vtkScalarBarActor from "@kitware/vtk.js/Rendering/Core/ScalarBarActor";
- import vtkColorTransferFunction from "@kitware/vtk.js/Rendering/Core/ColorTransferFunction";
- import vtkDataArray from "@kitware/vtk.js/Common/Core/DataArray.js";
- import vtkLight from "@kitware/vtk.js/Rendering/Core/Light";
- const props = defineProps({
- aid: Number
- })
- let isexpdialog = ref(false)
- const strResultFormatlist = ref([])
- const formInline = ref({
- user: "11",
- region: "Pressure",
- date: ""
- })
- let newMap = new Map([
- ["Temperature", "(℃)"],
- ["Pressure", "(Pa)"],
- ["Velocity",''],
- ["CO", "(ppm)"],
- ["CO2", "(%)"],
- ["H2O", "(%)"],
- ["CH", "(ppm)"],
- ["Soot", "(ppm)"],
- ["NOx", ""],
- ["CO", ""],
- ["CH4", "(ppm)"],
- ["N2", "(ppm)"],
-
-
- ]);
- let arr=[];
- let currentrow1 = ref(false)
- let activeNames1 = ref(["2"])
- let starttime = ref(1)
- let endtime = ref(60)
- let count = ref(1)
- let newcount = ref(0)
- let timenum = ref(2)
- let playshow = ref(true)
- const isstop = ref(false)
- let suspendshow = ref(false)
- let showfalse = ref(false)
- let initFlag=false;
- let aid = ref()
- let vtkObj = {}
- let max, min;
- watch(
- () => [formInline.value.region, count.value, aid.value],
- (newVal, oldVal) => {
-
- if(initFlag){
- console.log(count.value);
- if (newVal[1] != oldVal[1]) {
- console.log("步数改变", newVal[1], oldVal[1]);
- if (vtkObj.fcon) {
- console.log(count.value);
- vtkScalarRead(count.value); //步数
- }
- }
- if (newVal[0] != oldVal[0]) {
- console.log("标量改变", newVal[0], oldVal[0]);
- if (vtkObj.fcon) {
- vtkShow();
- }
- }
- }
- },
- { deep: true }
- ); //深度监视
- onMounted(() => {
- const rootContainer = document.getElementById("expleft1")
- // rootContainer.style.position = "relative"
- // rootContainer.style.width = "100%"
- // rootContainer.style.height = "100%"
- vtkObj.fcon = createGassControl();
- const fcon = vtkObj.fcon;
- vtkObj.renderWindow = vtkGenericRenderWindow.newInstance()
- vtkObj.renderWindow.setContainer(rootContainer)
- vtkObj.jgMapper = vtkMapper.newInstance()
- vtkObj.jgActor = vtkActor.newInstance()
- vtkObj.jgActor.getProperty().setRepresentation(Representation.SURFACE) //面
- vtkObj.jgActor.setMapper(vtkObj.jgMapper)
- // vtkObj.renderWindow.getRenderer().addActor(vtkObj.jgActor);
- vtkObj.renderWindow.getRenderer().setBackground(0.0, 0.0, 0.0, 0.0)
- vtkObj.scalarBarActor = vtkScalarBarActor.newInstance()
- vtkObj.scalarBarActor.setGenerateTicks(generateTicks(5))
- vtkObj.scalarBarActor.setDrawAboveRangeSwatch(true)
- vtkObj.scalarBarActor.setDrawNanAnnotation(false)
- vtkObj.scalarBarActor.setBoxPosition([1, 0])
- // 修改设条颜色
- const ctf = vtkColorTransferFunction.newInstance()
- ctf.addRGBPoint(0.0, 0, 1, 154 / 255.0)
- ctf.addRGBPoint(1.0, 1.0, 165.0 / 255.0, 0.0)
- ctf.addRGBPoint(2.0, 230 / 255.0, 0.0, 92.0 / 225.0)
- vtkObj.jgMapper.setLookupTable(ctf)
- const lut = vtkObj.jgMapper.getLookupTable()
- vtkObj.scalarBarActor.setScalarsToColors(lut)
- vtkObj.renderWindow.resize()
- // vtkObj.renderWindow.getRenderer().addActor(vtkObj.scalarBarActor);
- // vtkGridRead(props.aid);
- // vtkObj.renderWindow.getRenderer().resetCamera();
- // vtkObj.renderWindow.getRenderWindow().render();
- // 设置环境光和光照
- const light = vtkLight.newInstance()
- light.setColor(1.0, 1.0, 1.0) // 白色环境光
- light.setIntensity(3.0) // 强度为1.0
- vtkObj.renderWindow.getRenderer().addLight(light)
- })
- function initVtk() {
- }
- function generateTicks(numberOfTicks) {
- return (helper) => {
- const lastTickBounds = helper.getLastTickBounds()
- // compute tick marks for axes
- const scale = d3
- .scaleLinear()
- .domain([0.0, 1.0])
- .range([lastTickBounds[0], lastTickBounds[1]])
- const samples = scale.ticks(numberOfTicks)
- const ticks = samples.map((tick) => scale(tick))
- // Replace minus "\u2212" with hyphen-minus "\u002D" so that parseFloat() works
- formatDefaultLocale({ minus: "\u002D" })
- const format = scale.tickFormat(
- ticks[0],
- ticks[ticks.length - 1],
- numberOfTicks
- )
- const tickStrings = ticks
- .map(format)
- .map((tick) => Number(parseFloat(tick).toPrecision(12)).toPrecision()) // d3 sometimes adds unwanted whitespace
- helper.setTicks(ticks)
- helper.setTickStrings(tickStrings)
- }
- }
- function vtkShow() {
- // formInline.region="Pressure";
- console.log("执行了1111")
- const scalarBarActor = vtkObj.scalarBarActor
- const mapper = vtkObj.jgMapper
- const actor = vtkObj.jgActor
- const fcon = vtkObj.fcon
- // console.log(props.region)
- const scalarArray = fcon.scalar.get(formInline.value.region)
- if (!scalarArray || !fcon.polydata) {
- return
- }
- console.log(" fcon.polydata.getNumberOfPoints():", fcon.polydata.getNumberOfPoints());
- const dataArray = vtkDataArray.newInstance({
- name: formInline.value.region,
- size: fcon.polydata.getNumberOfPoints()
- })
- // console.log(dataArray);
- dataArray.setData(scalarArray)
- fcon.polydata.getPointData().setScalars(dataArray)
- mapper.setInputData(fcon.polydata)
- getMinMax(scalarArray)
- mapper.setScalarRange(parseFloat(min.toFixed(3)), parseFloat(max.toFixed(3))) //设置范围
- scalarBarActor.setAxisLabel(formInline.value.region)
- mapper.clearColorArrays() //强制重建颜色
- actor.getProperty().setOpacity(count.value) //设置错误的透明度使得页面重新加载 不设置不刷新页面
- vtkObj.renderWindow.getRenderer().addActor(scalarBarActor)
- vtkObj.renderWindow.getRenderer().addActor(actor)
- vtkObj.renderWindow.getRenderer().resetCamera();
- vtkObj.renderWindow.getRenderWindow().render();
- vtkObj.renderWindow.resize();
- initFlag=true;
- }
- function getMinMax(scalars) {
- // console.log("getMinMax:",scalars);
- min = scalars[0]
- max = scalars[0]
- for (let index = 0; index <= scalars.length; index++) {
- let scalar = scalars[index]
- if (min > scalar) {
- min = scalar
- }
- if (max < scalar) {
- max = scalar
- }
- }
- console.log("max,min:", max, min);
- }
- onBeforeUnmount(() => {
- vtkObj.scalarBarActor.delete()
- vtkObj.jgMapper.delete()
- vtkObj.jgActor.delete()
- vtkObj.renderWindow.delete()
- vtkObj = null
- })
- // 播放暂停
- const play = (time) => {
- const fcon = vtkObj.fcon;
- showfalse.value = !showfalse.value
- currentrow1.value = false
- if (showfalse.value) {
- suspendshow.value = true
- playshow.value = false
- isstop.value = true //播放
- const sleep = (timeout = time) =>
- new Promise((resolve, reject) => {
- setTimeout(resolve, timeout)
- })
- let timer = async (timeout) => {
- while (count.value < endtime.value && isstop.value) {
- if (isstop.value == true) {
- await sleep(time)
- count.value++
- fcon.step = count.value
- newcount.value = count.value
- // newtime();
- }
-
-
- }
- isstop.value = false //暂停
- playshow.value = true
- suspendshow.value = false
- }
- timer(time)
- } else {
- isstop.value = false //暂停
- playshow.value = true
- suspendshow.value = false
- }
- }
- // 下一页
- function increment() {
- const fcon = vtkObj.fcon
- currentrow1.value = false
- isstop.value = false
- if (count.value == endtime.value) {
- return
- }
- count.value++
- newcount.value = count.value
- fcon.step = count.value
- //newtime();
- }
- //回到上一页
- function Prev() {
- const fcon = vtkObj.fcon
- currentrow1.value = false
- isstop.value = false
- count.value--
- fcon.step = count.value
- newcount.value = count.value
- //newtime();
- }
- // 时间计算
- const newtime = () => {
- timeshow.value = true
- time.value = null
- oldtime.value = sessionStorage.getItem("acctime")
- console.log(oldtime.value)
- time.value = new Date(oldtime.value).getTime() / 1000
- if (count.value == 2) {
- let time2 = (count.value - 1) * 60 + time.value
- timeline.value = timescount(time2)
- } else {
- let time2 = count.value * 60 + time.value
- timeline.value = timescount(time2)
- }
- }
- function sliderchange(val) {
- const fcon = vtkObj.fcon
- suspendshow.value = false
- playshow.value = true
- isstop.value = false
- newcount.value = count.value
- fcon.step = count.value
- }
- function vtkGridRead() {
- initVtk();
- const fcon = vtkObj.fcon
- aid.value = props.aid
- fcon.step = count.value
- fcon.aid = aid.value
- const params = {
- transCode: "D40003",
- aid: aid.value
- }
- request(params).then((res) => {
- endtime.value = res.steps
- fcon
- .initGemetry(aid.value)
- .then((result) => {
- vtkScalarRead(count.value) //步数
- })
- .catch((err) => { })
-
- }).catch((err) => { })
- }
- function vtkScalarRead(step) {
- arr=[];
- let i=0;
- const fcon = vtkObj.fcon
- fcon
- .getScalrsByStep(step)
- .then((result) => {
- // console.log(fcon.scalar)
- strResultFormatlist.value = [];
- fcon.scalar.forEach((value, key) => {
- //arr.push(key)
- i=i+1
- strResultFormatlist.value.push({
- id: i,
- name:key ,
- value:key ,
-
- });
- })
- console.log(strResultFormatlist.value);
- vtkShow()
- })
- .catch((err) => {
- console.log(err)
- })
- }
- //深度监视
- const regionchange=(val)=>{
- formInline.value.region=val;
- }
- const quding=()=>{
- isexpdialog.value=false;
- }
- defineExpose({ isexpdialog, vtkGridRead })
- </script>
- <style lang="scss" scoped>
- .exp {
- display: flex;
- .expleft {
- width: 70%;
- border-radius: 0px 0px 0px 0px;
- border: 1px solid;
- border-image: linear-gradient(180deg,
- rgba(31, 107, 255, 1),
- rgba(31, 107, 255, 0.48)) 1 1;
- box-shadow: inset 0px 0px 17px 5px rgba(12, 97, 197, 0.2);
- margin-right: 2%;
- height: 600px;
- }
- .expright {
- padding: 10px;
- width: 340px;
- border-radius: 0px 0px 0px 0px;
- border: 1px solid;
- border-image: linear-gradient(180deg,
- rgba(31, 107, 255, 1),
- rgba(31, 107, 255, 0.48)) 1 1;
- box-shadow: inset 0px 0px 17px 5px rgba(12, 97, 197, 0.2);
- }
- }
- .tanniu {
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- .expcontent {
- position: absolute;
- left: 25%;
- top: 100px;
- width: 50%;
- padding: 10px;
- z-index: 11111;
- background-color:rgba(13, 22, 57, 0.96);
- border: 1px solid;
- border-image: linear-gradient(180deg,
- rgba(31, 107, 255, 1),
- rgba(31, 107, 255, 0.48)) 1 1;
- box-shadow: inset 0px 0px 17px 5px rgba(12, 97, 197, 0.2);
- }
- .headertiele{
- color: #fff;
- text-align: left;
- padding: 0 20px;
- font-size: 16px;
- font-family: 'YouShe';
- }
- // #expleft1{
- // width:750px;
- // height:500px;
- // left:25%;
- // top: 25%;
- // background-color:rgba(12, 97, 197, 1);
- // border: 1px solid;
- // border-image: linear-gradient(
- // 180deg,
- // rgba(31, 107, 255, 1),
- // rgba(31, 107, 255, 0.48)
- // )
- // 1 1;
- // box-shadow: inset 0px 0px 17px 5px rgba(12, 97, 197, 0.2);
- // position: absolute;
- // z-index: 11111;
- // color: #fff;
- // }
- </style>
|