HelloWorld.vue 6.4 KB

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