HelloWorld.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <template>
  2. <div>
  3. <div>
  4. <button @click="increment">步数: {{ count }}</button>
  5. <button @click="inOpacity">透明度: {{ opacity }}</button>
  6. </div>
  7. <div id="vtkContainer" />
  8. </div>
  9. </template >
  10. <script setup>
  11. import * as d3 from 'd3-scale';
  12. import { formatDefaultLocale } from 'd3-format';
  13. import { ref,onMounted } from 'vue';
  14. import '@kitware/vtk.js/Rendering/Profiles/Geometry';
  15. import vtkRenderWindowWithControlBar from '@kitware/vtk.js/Rendering/Misc/RenderWindowWithControlBar';
  16. import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
  17. import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
  18. import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';
  19. import vtkUnstructuredDataReader from '../reader/UnstructuredDataReader.js';
  20. import vtkScalarBarActor from '@kitware/vtk.js/Rendering/Core/ScalarBarActor';
  21. import vtkLookupTable from '@kitware/vtk.js/Common/Core/LookupTable';
  22. import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray.js';
  23. import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
  24. // 响应式状态
  25. const count = ref(0);//步数
  26. const opacity = ref(0.1);
  27. const min=ref(0.0);
  28. const max=ref(1.0);
  29. const scalarFAll = ref([]);//火灾标量
  30. const scalarWAll = ref([]);//水灾标量
  31. const foW =ref(false);//火灾 true 水灾 false
  32. /*
  33. Temperature:温度
  34. Pressure:压强
  35. SO2:SO2
  36. CO2:CO2
  37. Height:水位高度
  38. */
  39. const scalarName = ref("CO2");
  40. const filedir =ref("data/Fire/");
  41. //const scalarName = ref("Height");
  42. //const filedir =ref("data/Water/");
  43. const renderWindowWith = vtkRenderWindowWithControlBar.newInstance({
  44. controlSize: 2,
  45. });
  46. // const renderWindowWith =vtkFullScreenRenderWindow.newInstance();
  47. const renderer = renderWindowWith.getRenderer();
  48. // renderer.setBackground([0.1,0.2,0]);
  49. const renderWindow = renderWindowWith.getRenderWindow();
  50. const resetCamera = renderer.resetCamera;
  51. const render = renderWindow.render;
  52. const mapper = vtkMapper.newInstance();
  53. //Sets scalarMode to USE_POINT_DATA
  54. // mapper.setScalarModeToUsePointData();
  55. const actor = vtkActor.newInstance();
  56. const reader = vtkUnstructuredDataReader.newInstance();
  57. // 设置透明度
  58. function inOpacity() {
  59. opacity.value=opacity.value+0.1;
  60. actor.getProperty().setOpacity(opacity.value);
  61. renderWindow.render();
  62. }
  63. //计算最大最小值
  64. function getMinMax(scalars){
  65. // console.log("getMinMax:",scalars);
  66. min.value=scalars[0];
  67. max.value=scalars[0];
  68. for (let index = 0; index <= scalars.length; index++) {
  69. let scalar=scalars[index];
  70. if(min.value>scalar){
  71. min.value=scalar;
  72. }
  73. if(max.value<scalar){
  74. max.value=scalar;
  75. }
  76. }
  77. // console.log("max,min:",max.value,min.value);
  78. }
  79. // 用来修改状态、触发更新的函数
  80. function increment() {
  81. count.value++;
  82. var scalars;
  83. if(foW.value){
  84. scalars=scalarFAll.value[count.value];
  85. }else{
  86. scalars=scalarWAll.value[count.value];
  87. }
  88. const polydata = mapper.getInputData();
  89. const scalarArray=scalars.get(scalarName.value);
  90. // console.log("scalarArray:",scalarArray);
  91. const dataArray = vtkDataArray.newInstance({
  92. name:scalarName.value,
  93. size:polydata.getNumberOfPoints()
  94. });
  95. dataArray.setData(scalarArray);
  96. polydata.getPointData().setScalars(dataArray);
  97. mapper.clearColorArrays();//强制重建颜色
  98. actor.getProperty().setOpacity(count.value+2);//设置错误的透明度使得页面重新加载 不设置不刷新页面
  99. renderWindow.render();
  100. }
  101. //加载所有 标量数据
  102. function loadScalarAll(){
  103. //水灾
  104. for (let index = 0; index <= 60; index++) {
  105. const reader = vtkUnstructuredDataReader.newInstance();
  106. reader.setUrl("data/Water/"+'POST'+index+'.vtk').then(() => {
  107. const scalars = reader.getOutputData(1);
  108. scalarWAll.value[index]=scalars;
  109. });
  110. }
  111. //火灾
  112. for (let index = 0; index <= 60; index++) {
  113. const reader = vtkUnstructuredDataReader.newInstance();
  114. reader.setUrl("data/Fire/"+'POST'+index+'.vtk').then(() => {
  115. const scalars = reader.getOutputData(1);
  116. scalarFAll.value[index]=scalars;
  117. });
  118. }
  119. }
  120. //设置
  121. function generateTicks(numberOfTicks) {
  122. return (helper) => {
  123. const lastTickBounds = helper.getLastTickBounds();
  124. // compute tick marks for axes
  125. const scale = d3
  126. .scaleLinear()
  127. .domain([0.0, 1.0])
  128. .range([lastTickBounds[0], lastTickBounds[1]]);
  129. const samples = scale.ticks(numberOfTicks);
  130. const ticks = samples.map((tick) => scale(tick));
  131. // Replace minus "\u2212" with hyphen-minus "\u002D" so that parseFloat() works
  132. formatDefaultLocale({ minus: '\u002D' });
  133. const format = scale.tickFormat(
  134. ticks[0],
  135. ticks[ticks.length - 1],
  136. numberOfTicks
  137. );
  138. const tickStrings = ticks
  139. .map(format)
  140. .map((tick) => Number(parseFloat(tick).toPrecision(12)).toPrecision()); // d3 sometimes adds unwanted whitespace
  141. helper.setTicks(ticks);
  142. helper.setTickStrings(tickStrings);
  143. };
  144. }
  145. //安装时
  146. onMounted(() => {
  147. //div 绑定
  148. const rootContainer =document.getElementById("vtkContainer");
  149. rootContainer.style.position = 'relative';
  150. rootContainer.style.width = '1000px';
  151. rootContainer.style.height = '500px';
  152. console.log("rootContainer:",rootContainer);
  153. renderWindowWith.setContainer(rootContainer);
  154. // fullScreenRenderer.setBackground([0,0,0]);
  155. // const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
  156. reader.setUrl(filedir.value+'POST0.vtk').then(() => {
  157. const polydata = reader.getOutputData(0);
  158. const scalars = reader.getOutputData(1);
  159. const scalarArray=scalars.get(scalarName.value);
  160. // console.log("scalarArray:",scalarArray);
  161. const dataArray = vtkDataArray.newInstance({
  162. name:scalarName.value,
  163. size:polydata.getNumberOfPoints()
  164. });
  165. dataArray.setData(scalarArray);
  166. polydata.getPointData().setScalars(dataArray);
  167. actor.setMapper(mapper);
  168. mapper.setInputData(polydata);
  169. getMinMax(scalarArray);
  170. mapper.setScalarRange(min.value,max.value);//设置范围
  171. renderer.addActor(actor);
  172. let lut = mapper.getLookupTable();
  173. const scalarBarActor = vtkScalarBarActor.newInstance();
  174. renderer.addActor(scalarBarActor);
  175. scalarBarActor.setScalarsToColors(lut);
  176. // console.log("lut:",lut.getRange());
  177. // Change the number of ticks (TODO: add numberOfTicks to ScalarBarActor)
  178. scalarBarActor.setGenerateTicks(generateTicks(5));
  179. scalarBarActor.setAxisLabel(scalarName.value);
  180. scalarBarActor.setDrawAboveRangeSwatch(true);
  181. //修改设条颜色
  182. const ctf = vtkColorTransferFunction.newInstance();
  183. ctf.addRGBPoint(0.0, 0.0, 0.0, 1.0);
  184. ctf.addRGBPoint(1.0, 0.0, 1.0, 0.5);
  185. ctf.addRGBPoint(2.0, 0.0, 1.0, 0.0);
  186. ctf.addRGBPoint(3.0, 1.0, 0.5, 0.0);
  187. ctf.addRGBPoint(4.0, 1.0, 0.0, 0.0);
  188. mapper.setLookupTable(ctf);
  189. // lut = mapper.getLookupTable();
  190. // scalarBarActor.setScalarsToColors(lut);
  191. resetCamera();
  192. renderWindow.render();
  193. });
  194. loadScalarAll();
  195. });
  196. </script>
  197. <style scoped>
  198. </style>