|
@@ -0,0 +1,245 @@
|
|
|
+<template>
|
|
|
+ <div>
|
|
|
+ <div>
|
|
|
+ <!--button @click="increment">Count is: {{ count }}</button-->
|
|
|
+ </div>
|
|
|
+ <div id="vtkContainer" />
|
|
|
+
|
|
|
+ <div>
|
|
|
+ <!-- :title1="title1" -->
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import * as d3 from "d3-scale";
|
|
|
+import { formatDefaultLocale } from "d3-format";
|
|
|
+import { ref, onMounted, reactive } from "vue";
|
|
|
+import "@kitware/vtk.js/Rendering/Profiles/Geometry";
|
|
|
+import vtkRenderWindowWithControlBar from "@kitware/vtk.js/Rendering/Misc/RenderWindowWithControlBar";
|
|
|
+import vtkFullScreenRenderWindow from "@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow";
|
|
|
+
|
|
|
+import vtkActor from "@kitware/vtk.js/Rendering/Core/Actor";
|
|
|
+import vtkMapper from "@kitware/vtk.js/Rendering/Core/Mapper";
|
|
|
+import vtkUnstructuredDataReader from "../reader/UnstructuredDataReader.js";
|
|
|
+import vtkScalarBarActor from "@kitware/vtk.js/Rendering/Core/ScalarBarActor";
|
|
|
+import vtkLookupTable from "@kitware/vtk.js/Common/Core/LookupTable";
|
|
|
+import vtkDataArray from "@kitware/vtk.js/Common/Core/DataArray.js";
|
|
|
+import vtkColorTransferFunction from "@kitware/vtk.js/Rendering/Core/ColorTransferFunction";
|
|
|
+import { I } from "@kitware/vtk.js/macros2.js";
|
|
|
+import { Representation } from '@kitware/vtk.js/Rendering/Core/Property/Constants';
|
|
|
+
|
|
|
+// import {RouterView,RouterLink} from "vue-router"
|
|
|
+// const router=RouterView();
|
|
|
+
|
|
|
+// const props = {};
|
|
|
+let time = 3 * 60;
|
|
|
+let evolution=ref();
|
|
|
+// let title1=ref("我是父组件")
|
|
|
+let dialogVisible = ref(false);
|
|
|
+let num = ref(4);
|
|
|
+let starttime = ref(1);
|
|
|
+let endtime = ref(60);
|
|
|
+let timenum = ref(2);
|
|
|
+let isstop = ref(false);
|
|
|
+let arrvalue = reactive([]);
|
|
|
+
|
|
|
+function add(id) {
|
|
|
+ if (id == 2) {
|
|
|
+ dialogVisible.value = true;
|
|
|
+ evolution.value.isshow=false;
|
|
|
+ }else if(id==1){
|
|
|
+ // router.push("/myDemo");
|
|
|
+
|
|
|
+}
|
|
|
+ else if(id==0){
|
|
|
+
|
|
|
+ evolution.value.isshow=true;
|
|
|
+ evolution.value.getdata();
|
|
|
+ dialogVisible.value = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+// 响应式状态
|
|
|
+const count = ref(0);
|
|
|
+const opacity = ref(0.1);
|
|
|
+const min = ref(0);
|
|
|
+const max = ref(1);
|
|
|
+const scalarFAll = ref([]); //火灾标量
|
|
|
+const scalarWAll = ref([]); //水灾标量
|
|
|
+/*
|
|
|
+Temperature:温度
|
|
|
+Pressure:压强
|
|
|
+SO2:SO2
|
|
|
+CO2:CO2
|
|
|
+Height:水位高度
|
|
|
+*/
|
|
|
+// const scalarName = ref("CO2");
|
|
|
+// const filedir =ref("data/Fire/");
|
|
|
+//const scalarName = ref("Height");
|
|
|
+const filedir = ref("data/Water/");
|
|
|
+// const renderWindowWith = vtkRenderWindowWithControlBar.newInstance({
|
|
|
+// controlSize: 11,
|
|
|
+// });
|
|
|
+const renderWindowWith = vtkFullScreenRenderWindow.newInstance();
|
|
|
+const renderer = renderWindowWith.getRenderer();
|
|
|
+// renderer.setBackground([0.1,0.2,0]);
|
|
|
+const renderWindow = renderWindowWith.getRenderWindow();
|
|
|
+const resetCamera = renderer.resetCamera;
|
|
|
+const render = renderWindow.render;
|
|
|
+const mapper = vtkMapper.newInstance();
|
|
|
+//Sets scalarMode to USE_POINT_DATA
|
|
|
+// mapper.setScalarModeToUsePointData();
|
|
|
+const actor = vtkActor.newInstance();
|
|
|
+const reader = vtkUnstructuredDataReader.newInstance();
|
|
|
+const scalarBarActor = vtkScalarBarActor.newInstance();
|
|
|
+// actor.getProperty().setRepresentation(Representation.WIREFRAME);//线
|
|
|
+// actor.getProperty().setRepresentation(Representation.POINTS);//点
|
|
|
+actor.getProperty().setRepresentation(Representation.SURFACE);//面
|
|
|
+
|
|
|
+// 用来修改状态、触发更新的函数
|
|
|
+function inOpacity() {
|
|
|
+ opacity.value = opacity.value + 0.1;
|
|
|
+ actor.getProperty().setOpacity(opacity.value);
|
|
|
+ renderWindow.render();
|
|
|
+}
|
|
|
+function getMinMax(scalars) {
|
|
|
+ // console.log("getMinMax:",scalars);
|
|
|
+ min.value = scalars[0];
|
|
|
+ max.value = scalars[0];
|
|
|
+ for (let index = 0; index <= scalars.length; index++) {
|
|
|
+ let scalar = scalars[index];
|
|
|
+ if (min.value > scalar) {
|
|
|
+ min.value = scalar;
|
|
|
+ }
|
|
|
+ if (max.value < scalar) {
|
|
|
+ max.value = scalar;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // console.log("max,min:", max.value, min.value);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 用来修改状态、触发更新的函数
|
|
|
+function increment() {
|
|
|
+ isstop.value = false;
|
|
|
+ if (count.value == endtime.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ count.value++;
|
|
|
+ changeScalar();
|
|
|
+}
|
|
|
+function changeScalar() {
|
|
|
+ var scalars;
|
|
|
+ if (arrvalue[0] == "fire") {
|
|
|
+ scalars = scalarFAll.value[count.value];
|
|
|
+ } else {
|
|
|
+ scalars = scalarWAll.value[count.value];
|
|
|
+ }
|
|
|
+ const polydata = mapper.getInputData();
|
|
|
+ const scalarArray = scalars.get(arrvalue[1]);
|
|
|
+ // console.log("scalarArray:", scalarArray);
|
|
|
+ const dataArray = vtkDataArray.newInstance({
|
|
|
+ name: arrvalue[1],
|
|
|
+ size: polydata.getNumberOfPoints(),
|
|
|
+ });
|
|
|
+ dataArray.setData(scalarArray);
|
|
|
+ getMinMax(scalarArray);
|
|
|
+ mapper.setScalarRange(min.value, max.value); //设置范围
|
|
|
+ scalarBarActor.setAxisLabel(arrvalue[1]);
|
|
|
+ polydata.getPointData().setScalars(dataArray);
|
|
|
+ mapper.clearColorArrays(); //强制重建颜色
|
|
|
+ actor.getProperty().setOpacity(count.value); //设置错误的透明度使得页面重新加载 不设置不刷新页面
|
|
|
+ renderWindow.render();
|
|
|
+}
|
|
|
+//加载所有 标量数据
|
|
|
+function loadScalarAll() {
|
|
|
+ //水灾
|
|
|
+ for (let index = 0; index <= 60; index++) {
|
|
|
+ const reader = vtkUnstructuredDataReader.newInstance();
|
|
|
+ reader.setUrl("data/Water/" + "POST" + index + ".vtk").then(() => {
|
|
|
+ const scalars = reader.getOutputData(1);
|
|
|
+ scalarWAll.value[index] = scalars;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //火灾
|
|
|
+ for (let index = 0; index <= 60; index++) {
|
|
|
+ const reader = vtkUnstructuredDataReader.newInstance();
|
|
|
+ reader.setUrl("data/Fire/" + "POST" + index + ".vtk").then(() => {
|
|
|
+ const scalars = reader.getOutputData(1);
|
|
|
+ scalarFAll.value[index] = scalars;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // console.log("scalarAll.value:",scalarAll.value);
|
|
|
+}
|
|
|
+//设置
|
|
|
+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);
|
|
|
+ };
|
|
|
+}
|
|
|
+//安装时
|
|
|
+onMounted(() => {
|
|
|
+ // console.log(process.env.VUE_APP_BASE_websokt);
|
|
|
+ // console.log(1111)
|
|
|
+ arrvalue = ["Water", "Height"];
|
|
|
+ reader.setUrl(filedir.value + "POST1.vtk").then(() => {
|
|
|
+ const polydata = reader.getOutputData(0);
|
|
|
+ const scalars = reader.getOutputData(1);
|
|
|
+ const scalarArray = scalars.get(arrvalue[1]);
|
|
|
+ // console.log("scalarArray:", scalarArray);
|
|
|
+ const dataArray = vtkDataArray.newInstance({
|
|
|
+ name: arrvalue[1],
|
|
|
+ size: polydata.getNumberOfPoints(),
|
|
|
+ });
|
|
|
+ dataArray.setData(scalarArray);
|
|
|
+ polydata.getPointData().setScalars(dataArray);
|
|
|
+ actor.setMapper(mapper);
|
|
|
+ mapper.setInputData(polydata);
|
|
|
+ getMinMax(scalarArray);
|
|
|
+ mapper.setScalarRange(min.value, max.value); //设置范围
|
|
|
+
|
|
|
+ renderer.addActor(actor);
|
|
|
+
|
|
|
+ let lut = mapper.getLookupTable();
|
|
|
+
|
|
|
+ renderer.addActor(scalarBarActor);
|
|
|
+ scalarBarActor.setScalarsToColors(lut);
|
|
|
+ // console.log("lut:", lut.getRange());
|
|
|
+ // Change the number of ticks (TODO: add numberOfTicks to ScalarBarActor)
|
|
|
+ scalarBarActor.setGenerateTicks(generateTicks(5));
|
|
|
+ scalarBarActor.setAxisLabel(arrvalue[1]);
|
|
|
+ scalarBarActor.setDrawAboveRangeSwatch(true);
|
|
|
+
|
|
|
+ //修改设条颜色
|
|
|
+ const ctf = vtkColorTransferFunction.newInstance();
|
|
|
+ ctf.addRGBPoint(0.0, 0.0, 0.0, 1.0);
|
|
|
+ ctf.addRGBPoint(1.0, 0.0, 1.0, 0.5);
|
|
|
+ ctf.addRGBPoint(2.0, 0.0, 1.0, 0.0);
|
|
|
+ ctf.addRGBPoint(3.0, 1.0, 0.5, 0.0);
|
|
|
+ ctf.addRGBPoint(4.0, 1.0, 0.0, 0.0);
|
|
|
+ mapper.setLookupTable(ctf);
|
|
|
+ lut = mapper.getLookupTable();
|
|
|
+ scalarBarActor.setScalarsToColors(lut);
|
|
|
+ resetCamera();
|
|
|
+ render();
|
|
|
+ });
|
|
|
+ loadScalarAll();
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|