|
@@ -1,14 +1,18 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
+ <div>
|
|
|
+ <button @click="increment">Count is: {{ count }}</button>
|
|
|
+ <button @click="inOpacity">透明度: {{ opacity }}</button>
|
|
|
+ </div>
|
|
|
<div id="vtkContainer" />
|
|
|
|
|
|
</div>
|
|
|
-</template>
|
|
|
+</template >
|
|
|
|
|
|
-<script>
|
|
|
+<script setup>
|
|
|
import * as d3 from 'd3-scale';
|
|
|
import { formatDefaultLocale } from 'd3-format';
|
|
|
-import { onMounted } from 'vue';
|
|
|
+import { ref,onMounted } from 'vue';
|
|
|
import '@kitware/vtk.js/Rendering/Profiles/Geometry';
|
|
|
import vtkRenderWindowWithControlBar from '@kitware/vtk.js/Rendering/Misc/RenderWindowWithControlBar';
|
|
|
import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
|
|
@@ -18,136 +22,183 @@ 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);
|
|
|
|
|
|
-export default {
|
|
|
- name: 'HelloWorld',
|
|
|
- //体制
|
|
|
- setup() {
|
|
|
- //安装时
|
|
|
- onMounted(() => {
|
|
|
- const rootContainer =document.getElementById("vtkContainer");
|
|
|
- rootContainer.style.position = 'relative';
|
|
|
- rootContainer.style.width = '1000px';
|
|
|
- rootContainer.style.height = '500px';
|
|
|
- console.log("rootContainer:",rootContainer);
|
|
|
- const renderWindowWith = vtkRenderWindowWithControlBar.newInstance({
|
|
|
- controlSize: 11,
|
|
|
- });
|
|
|
- renderWindowWith.setContainer(rootContainer);
|
|
|
- // fullScreenRenderer.setBackground([0,0,0]);
|
|
|
|
|
|
- // const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
|
|
|
- const renderer = renderWindowWith.getRenderer();
|
|
|
- const renderWindow = renderWindowWith.getRenderWindow();
|
|
|
-
|
|
|
- const resetCamera = renderer.resetCamera;
|
|
|
- const render = renderWindow.render;
|
|
|
- const mapper = vtkMapper.newInstance();
|
|
|
- const actor = vtkActor.newInstance();
|
|
|
- const reader = vtkUnstructuredDataReader.newInstance();
|
|
|
- const scalarName ="Pressure";
|
|
|
- var scalars;
|
|
|
- reader.setUrl('data/Fire/POST0.vtk').then(() => {
|
|
|
- const polydata = reader.getOutputData(0);
|
|
|
- scalars = reader.getOutputData(1);
|
|
|
- const scalarArray=scalars.get(scalarName);
|
|
|
- const dataArray = vtkDataArray.newInstance({
|
|
|
- name:scalarName,
|
|
|
- size:polydata.getNumberOfPoints()
|
|
|
- });
|
|
|
- dataArray.setData(scalarArray);
|
|
|
- polydata.getPointData().setScalars(dataArray);
|
|
|
- actor.setMapper(mapper);
|
|
|
- mapper.setInputData(polydata);
|
|
|
- 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)
|
|
|
- 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);
|
|
|
- };
|
|
|
- }
|
|
|
- scalarBarActor.setGenerateTicks(generateTicks(5));
|
|
|
- scalarBarActor.setAxisLabel(scalarName);
|
|
|
- scalarBarActor.setDrawAboveRangeSwatch(true);
|
|
|
-
|
|
|
- const ctf = vtkColorTransferFunction.newInstance();
|
|
|
- ctf.addRGBPoint(0.0, 0.0, 0.0, 1.0);
|
|
|
- ctf.addRGBPoint(1.0, 1.0, 0.0, 0.0);
|
|
|
+const min=ref(0.0);
|
|
|
+const max=ref(1.0);
|
|
|
+const scalarAll = 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,
|
|
|
+ });
|
|
|
|
|
|
- mapper.setLookupTable(ctf);
|
|
|
- lut = mapper.getLookupTable();
|
|
|
- scalarBarActor.setScalarsToColors(lut);
|
|
|
- resetCamera();
|
|
|
- render();
|
|
|
+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();
|
|
|
|
|
|
- for (let index = 1; index <= 60; index++) {
|
|
|
- var flag =true;
|
|
|
- while(flag){
|
|
|
- flag=false;
|
|
|
- const reader = vtkUnstructuredDataReader.newInstance();
|
|
|
- reader.setUrl('data/Fire/POST'+index+'.vtk').then(() => {
|
|
|
- console.log("index:",index);
|
|
|
- const polydata = mapper.getInputData();
|
|
|
- // console.log("polydata:",polydata);
|
|
|
- const scalars = reader.getOutputData(1);
|
|
|
- // console.log("scalars:",scalars);
|
|
|
- const scalarArray=scalars.get(scalarName);
|
|
|
- // console.log("polydata.getNumberOfPoints():",polydata.getNumberOfPoints());
|
|
|
- const dataArray = vtkDataArray.newInstance({
|
|
|
- name:scalarName,
|
|
|
- size:polydata.getNumberOfPoints()
|
|
|
- });
|
|
|
- dataArray.setData(scalarArray);
|
|
|
- polydata.getPointData().setScalars(dataArray);
|
|
|
- mapper.setInputData(polydata);
|
|
|
- renderWindow.render();
|
|
|
- flag=true;
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- });
|
|
|
- renderWindow.render();
|
|
|
+// 用来修改状态、触发更新的函数
|
|
|
+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++;
|
|
|
+ const scalars=scalarAll.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);
|
|
|
+ // console.log("dataArray1:",JSON.stringify(dataArray)==JSON.stringify(polydata.getPointData().getScalars()));
|
|
|
+ // polydata.getPointData().removeAllArrays();
|
|
|
+ polydata.getPointData().setScalars(dataArray);
|
|
|
+ // getMinMax(scalarArray);
|
|
|
+ // mapper.setScalarRange(min.value,max.value);//设置范围
|
|
|
+ // console.log("dataArray2:",JSON.stringify(dataArray)==JSON.stringify(polydata.getPointData().getScalars()));
|
|
|
+ // mapper.setInputData(polydata);
|
|
|
+ mapper.clearColorArrays();//强制重建颜色
|
|
|
+ // actor.setMapper(mapper);
|
|
|
+ // mapper.setInputData(polydata);
|
|
|
+ // renderer.addActor(actor);
|
|
|
+ actor.getProperty().setOpacity(count.value);//设置错误的透明度使得页面重新加载 不设置不刷新页面
|
|
|
+ renderWindow.render();
|
|
|
+}
|
|
|
+//加载所有 标量数据
|
|
|
+function loadScalarAll(){
|
|
|
+ for (let index = 0; index <= 60; index++) {
|
|
|
+ const reader = vtkUnstructuredDataReader.newInstance();
|
|
|
+ reader.setUrl(filedir.value+'POST'+index+'.vtk').then(() => {
|
|
|
+ const scalars = reader.getOutputData(1);
|
|
|
+ scalarAll.value[index]=scalars;
|
|
|
});
|
|
|
- return ;
|
|
|
}
|
|
|
+ // 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(() => {
|
|
|
+ //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+'POST1.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.0);
|
|
|
+ ctf.addRGBPoint(2.0, 1.0, 0.0, 0.0);
|
|
|
+ mapper.setLookupTable(ctf);
|
|
|
|
|
|
+
|
|
|
+ lut = mapper.getLookupTable();
|
|
|
+ scalarBarActor.setScalarsToColors(lut);
|
|
|
+
|
|
|
+ resetCamera();
|
|
|
+ render();
|
|
|
+ });
|
|
|
+ // renderWindow.render();
|
|
|
+ loadScalarAll();
|
|
|
+});
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
|
-.controls {
|
|
|
- position: absolute;
|
|
|
- top: 25px;
|
|
|
- left: 25px;
|
|
|
- background: white;
|
|
|
- padding: 12px;
|
|
|
-}
|
|
|
</style>
|