|
@@ -1,209 +0,0 @@
|
|
|
-<template>
|
|
|
- <div>
|
|
|
- <div>
|
|
|
- <button @click="increment">步数: {{ count }}</button>
|
|
|
- <button @click="inOpacity">透明度: {{ opacity }}</button>
|
|
|
- </div>
|
|
|
- <div id="vtkContainer" />
|
|
|
-
|
|
|
- </div>
|
|
|
-</template >
|
|
|
-
|
|
|
-<script setup>
|
|
|
-import * as d3 from 'd3-scale';
|
|
|
-import { formatDefaultLocale } from 'd3-format';
|
|
|
-import { ref,onMounted } 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';
|
|
|
-// 响应式状态
|
|
|
-const count = ref(0);//步数
|
|
|
-const opacity = ref(0.1);
|
|
|
-const min=ref(0.0);
|
|
|
-const max=ref(1.0);
|
|
|
-
|
|
|
-const scalarFAll = ref([]);//火灾标量
|
|
|
-const scalarWAll = ref([]);//水灾标量
|
|
|
-const foW =ref(false);//火灾 true 水灾 false
|
|
|
-/*
|
|
|
- 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: 2,
|
|
|
- });
|
|
|
-// 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();
|
|
|
-
|
|
|
-// 设置透明度
|
|
|
-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() {
|
|
|
- count.value++;
|
|
|
- var scalars;
|
|
|
- if(foW.value){
|
|
|
- scalars=scalarFAll.value[count.value];
|
|
|
- }else{
|
|
|
- scalars=scalarWAll.value[count.value];
|
|
|
- }
|
|
|
- const polydata = mapper.getInputData();
|
|
|
- const scalarArray=scalars.get(scalarName.value);
|
|
|
- // console.log("scalarArray:",scalarArray);
|
|
|
- const dataArray = vtkDataArray.newInstance({
|
|
|
- name:scalarName.value,
|
|
|
- size:polydata.getNumberOfPoints()
|
|
|
- });
|
|
|
- dataArray.setData(scalarArray);
|
|
|
- polydata.getPointData().setScalars(dataArray);
|
|
|
-
|
|
|
- mapper.clearColorArrays();//强制重建颜色
|
|
|
- actor.getProperty().setOpacity(count.value+2);//设置错误的透明度使得页面重新加载 不设置不刷新页面
|
|
|
- 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;
|
|
|
- });
|
|
|
- }
|
|
|
-}
|
|
|
-//设置
|
|
|
-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(() => {
|
|
|
- //div 绑定
|
|
|
- const rootContainer =document.getElementById("vtkContainer");
|
|
|
- rootContainer.style.position = 'relative';
|
|
|
- rootContainer.style.width = '1000px';
|
|
|
- rootContainer.style.height = '500px';
|
|
|
- console.log("rootContainer:",rootContainer);
|
|
|
-
|
|
|
- renderWindowWith.setContainer(rootContainer);
|
|
|
- // fullScreenRenderer.setBackground([0,0,0]);
|
|
|
- // const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
|
|
|
- reader.setUrl(filedir.value+'POST0.vtk').then(() => {
|
|
|
- const polydata = reader.getOutputData(0);
|
|
|
- const scalars = reader.getOutputData(1);
|
|
|
- const scalarArray=scalars.get(scalarName.value);
|
|
|
- // console.log("scalarArray:",scalarArray);
|
|
|
- const dataArray = vtkDataArray.newInstance({
|
|
|
- name:scalarName.value,
|
|
|
- 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();
|
|
|
- const scalarBarActor = vtkScalarBarActor.newInstance();
|
|
|
- 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(scalarName.value);
|
|
|
- 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();
|
|
|
- renderWindow.render();
|
|
|
- });
|
|
|
- loadScalarAll();
|
|
|
-});
|
|
|
-</script>
|
|
|
-
|
|
|
-<style scoped>
|
|
|
-</style>
|