vtkContainer.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. <template>
  2. <div class="vtk">
  3. <!-- <div id="vtkContainer" /> -->
  4. </div>
  5. </template>
  6. <script setup>
  7. import * as d3 from "d3-scale";
  8. import { formatDefaultLocale } from "d3-format";
  9. import { ref, onMounted, reactive } from "vue";
  10. import "@kitware/vtk.js/Rendering/Profiles/Geometry";
  11. import vtkRenderWindowWithControlBar from "@kitware/vtk.js/Rendering/Misc/RenderWindowWithControlBar";
  12. import vtkFullScreenRenderWindow from "@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow";
  13. import vtkActor from "@kitware/vtk.js/Rendering/Core/Actor";
  14. import vtkMapper from "@kitware/vtk.js/Rendering/Core/Mapper";
  15. import vtkUnstructuredDataReader from "../reader/UnstructuredDataReader.js";
  16. import { createFireControl } from "../control/fireControl.js";
  17. import vtkScalarBarActor from "@kitware/vtk.js/Rendering/Core/ScalarBarActor";
  18. import vtkLookupTable from "@kitware/vtk.js/Common/Core/LookupTable";
  19. import vtkDataArray from "@kitware/vtk.js/Common/Core/DataArray.js";
  20. import vtkColorTransferFunction from "@kitware/vtk.js/Rendering/Core/ColorTransferFunction";
  21. import { I } from "@kitware/vtk.js/macros2.js";
  22. import { Representation } from "@kitware/vtk.js/Rendering/Core/Property/Constants";
  23. import evolutionView from "./evolutionView.vue";
  24. import vtkConeSource from "@kitware/vtk.js/Filters/Sources/ConeSource";
  25. import vtkSphereMapper from "@kitware/vtk.js/Rendering/Core/SphereMapper";
  26. import vtkPixelSpaceCallbackMapper from "@kitware/vtk.js/Rendering/Core/PixelSpaceCallbackMapper";
  27. import vtkSphereSource from "@kitware/vtk.js/Filters/Sources/SphereSource";
  28. import vtkAxesActor from "@kitware/vtk.js/Rendering/Core/AxesActor";
  29. import vtkCubeAxesActor from "@kitware/vtk.js/Rendering/Core/CubeAxesActor";
  30. import vtk2DShape from '@kitware/vtk.js/Filters/Sources/Arrow2DSource';
  31. import vtkTriangleFilter from '@kitware/vtk.js/Filters/General/TriangleFilter';
  32. // const props = {};
  33. let time = 3 * 60;
  34. const props= defineProps({
  35. vatkval:{
  36. type: Object,
  37. },
  38. arrvalue:{
  39. type: Array,
  40. }
  41. });
  42. // let title1=ref("我是父组件")
  43. let dialogVisible = ref(false);
  44. // let num = ref(4);
  45. // let starttime = ref(1);
  46. // let endtime = ref(60);
  47. // let timenum = ref(2);
  48. // let isstop = ref(false);
  49. let arrvalue = reactive([]);
  50. // 响应式状态
  51. const count = ref(0);
  52. const opacity = ref(0.1);
  53. const min = ref(0);
  54. const max = ref(1);
  55. const scalarFAll = ref([]); //火灾标量
  56. const scalarWAll = ref([]); //水灾标量
  57. /*
  58. Temperature:温度
  59. Pressure:压强
  60. SO2:SO2
  61. CO2:CO2
  62. Height:水位高度
  63. */
  64. // const scalarName = ref("CO2");
  65. // const filedir =ref("data/Fire/");
  66. //const scalarName = ref("Height");
  67. const filedir = ref("data/Water/");
  68. // const renderWindowWith = vtkRenderWindowWithControlBar.newInstance({
  69. // controlSize: 11,
  70. // });
  71. const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
  72. const renderer = fullScreenRenderer.getRenderer();
  73. const renderWindow = fullScreenRenderer.getRenderWindow();
  74. const mapper = vtkMapper.newInstance();
  75. const actor = vtkActor.newInstance();
  76. // actor.getProperty().setRepresentation(Representation.WIREFRAME);//线
  77. // actor.getProperty().setRepresentation(Representation.POINTS);//点
  78. actor.getProperty().setRepresentation(Representation.SURFACE); //面
  79. // 用来修改状态、触发更新的函数
  80. function inOpacity() {
  81. opacity.value = opacity.value + 0.1;
  82. actor.getProperty().setOpacity(opacity.value);
  83. renderWindow.render();
  84. }
  85. function getMinMax(scalars) {
  86. // console.log("getMinMax:",scalars);
  87. min.value = scalars[0];
  88. max.value = scalars[0];
  89. for (let index = 0; index <= scalars.length; index++) {
  90. let scalar = scalars[index];
  91. if (min.value > scalar) {
  92. min.value = scalar;
  93. }
  94. if (max.value < scalar) {
  95. max.value = scalar;
  96. }
  97. }
  98. // console.log("max,min:", max.value, min.value);
  99. }
  100. //时间
  101. function sleep(numberMillis) {
  102. var now = new Date();
  103. var exitTime = now.getTime() + numberMillis;
  104. console.log(exitTime);
  105. }
  106. // 用来修改状态、触发更新的函数
  107. function increment() {
  108. isstop.value = false;
  109. if (count.value == endtime.value) {
  110. return;
  111. }
  112. count.value++;
  113. changeScalar();
  114. }
  115. function changeScalar() {
  116. console.log(props.arrvalue)
  117. var scalars;
  118. if (props.arrvalue[0] == "fire") {
  119. scalars = scalarFAll.value[count.value];
  120. } else {
  121. scalars = scalarWAll.value[count.value];
  122. }
  123. const polydata = mapper.getInputData();
  124. const scalarArray = scalars.get(props.arrvalue[1]);
  125. // console.log("scalarArray:", scalarArray);
  126. const dataArray = vtkDataArray.newInstance({
  127. name: props.arrvalue[1],
  128. size: polydata.getNumberOfPoints(),
  129. });
  130. dataArray.setData(scalarArray);
  131. getMinMax(scalarArray);
  132. mapper.setScalarRange(min.value, max.value); //设置范围
  133. scalarBarActor.setAxisLabel(props.arrvalue[1]);
  134. polydata.getPointData().setScalars(dataArray);
  135. mapper.clearColorArrays(); //强制重建颜色
  136. actor.getProperty().setOpacity(count.value); //设置错误的透明度使得页面重新加载 不设置不刷新页面
  137. renderWindow.render();
  138. }
  139. //加载所有 标量数据
  140. function loadScalarAll() {
  141. //水灾
  142. // for (let index = 0; index <= 15; index++) {
  143. // const reader = vtkUnstructuredDataReader.newInstance();
  144. // const url="http://192.168.0.131:8187/TransServlet?channelNo=service&clientToken=e47b87eec69545559d1e81e56626da68&transCode=D00009&userId=5f06c8bc77234f969d13e160b54c27e3&aid=5&stype=Water&step="
  145. // reader.setUrl(url + index ).then(() => {
  146. // const scalars = reader.getOutputData(1);
  147. // scalarWAll.value[index] = scalars;
  148. // });
  149. // }
  150. //火灾
  151. for (let index = 1; index <= 4; index++) {
  152. const reader = vtkUnstructuredDataReader.newInstance();
  153. const url =
  154. "http://192.168.0.131:8187/TransServlet?channelNo=service&clientToken=e47b87eec69545559d1e81e56626da68&transCode=D00009&userId=5f06c8bc77234f969d13e160b54c27e3&aid=5&stype=Fire&step=";
  155. reader.setUrl(url + index).then(() => {
  156. console.log("url + index ", index);
  157. const scalars = reader.getOutputData(1);
  158. scalarFAll.value[index] = scalars;
  159. console.log(scalars);
  160. console.log(2222)
  161. console.log("url end ");
  162. });
  163. }
  164. console.log("scalarAll.value:", scalarFAll);
  165. }
  166. //设置
  167. function generateTicks(numberOfTicks) {
  168. return (helper) => {
  169. const lastTickBounds = helper.getLastTickBounds();
  170. // compute tick marks for axes
  171. const scale = d3
  172. .scaleLinear()
  173. .domain([0.0, 1.0])
  174. .range([lastTickBounds[0], lastTickBounds[1]]);
  175. const samples = scale.ticks(numberOfTicks);
  176. const ticks = samples.map((tick) => scale(tick));
  177. // Replace minus "\u2212" with hyphen-minus "\u002D" so that parseFloat() works
  178. formatDefaultLocale({ minus: "\u002D" });
  179. const format = scale.tickFormat(ticks[0], ticks[ticks.length - 1], numberOfTicks);
  180. const tickStrings = ticks
  181. .map(format)
  182. .map((tick) => Number(parseFloat(tick).toPrecision(12)).toPrecision()); // d3 sometimes adds unwanted whitespace
  183. helper.setTicks(ticks);
  184. helper.setTickStrings(tickStrings);
  185. };
  186. }
  187. //安装时
  188. onMounted(() => {
  189. arrvalue = ["Water", "Height"];
  190. // const sphereSource = vtkSphereSource.newInstance({
  191. // center: [495960.36, 5402540.18, -424.27],
  192. // radius: 3.02,
  193. // phiResolution: 20,
  194. // thetaResolution:20,
  195. // });
  196. // const mapper1 = vtkMapper.newInstance();
  197. // mapper1.setInputConnection(sphereSource.getOutputPort());
  198. // const actor1 = vtkActor.newInstance();
  199. // actor1.setMapper(mapper1);
  200. // actor1.getProperty().setColor([0.95, 0.45, 0.95]);
  201. // renderer.addActor(actor1);
  202. // choices include triangle, star, arrow4points, arrow6points
  203. const initialValues = { base:-0.1,shape: 'arrow4points',center: [495960.36, 5402540.18, -424.27],width: 20.0,height:20,direction:[0,1,1] };
  204. // const triangleFilter = vtkTriangleFilter.newInstance();
  205. const shapeSource2 = vtk2DShape.newInstance(initialValues);
  206. // triangleFilter.setInputConnection(shapeSource2.getOutputPort());
  207. const mapper2 = vtkMapper.newInstance();
  208. mapper2.setInputConnection(shapeSource2.getOutputPort());
  209. const actor2 = vtkActor.newInstance();
  210. actor2.setMapper(mapper2);
  211. renderer.addActor(actor2);
  212. // const cubeAxes = vtkCubeAxesActor.newInstance();
  213. // cubeAxes.setCamera(renderer.getActiveCamera());
  214. // cubeAxes.setDataBounds(actor1.getBounds());
  215. // renderer.addActor(cubeAxes);
  216. // const axesActor = vtkAxesActor.newInstance();
  217. // renderer.addActor(axesActor);
  218. renderer.resetCamera();
  219. renderWindow.render();
  220. fireRead();
  221. });
  222. function fireRead() {
  223. var fcon = createFireControl();
  224. fcon
  225. .initGemetry()
  226. .then((result) => {
  227. fcon
  228. .initScalrs()
  229. .then((result) => {
  230. // console.log(fcon.scalars)
  231. const scalarArray = fcon.scalars[3].get("Pressure");
  232. //console.log("scalarArray:", scalarArray);
  233. const dataArray = vtkDataArray.newInstance({
  234. name: arrvalue[1],
  235. size: fcon.polydata.getNumberOfPoints(),
  236. });
  237. console.log(dataArray)
  238. dataArray.setData(scalarArray);
  239. fcon.polydata.getPointData().setScalars(dataArray);
  240. mapper.setInputData(fcon.polydata);
  241. getMinMax(scalarArray);
  242. mapper.setScalarRange(min.value, max.value); //设置范围
  243. actor.setMapper(mapper);
  244. renderer.addActor(actor);
  245. initScalarBar();
  246. renderer.resetCamera();
  247. renderWindow.render();
  248. })
  249. .catch((err) => {});
  250. })
  251. .catch((err) => {});
  252. }
  253. // 初始化 bar
  254. function initScalarBar() {
  255. const scalarBarActor = vtkScalarBarActor.newInstance();
  256. let lut = mapper.getLookupTable();
  257. scalarBarActor.setScalarsToColors(lut);
  258. // console.log("lut:", lut.getRange());
  259. // Change the number of ticks (TODO: add numberOfTicks to ScalarBarActor)
  260. scalarBarActor.setGenerateTicks(generateTicks(5));
  261. scalarBarActor.setAxisLabel(arrvalue[1]);
  262. scalarBarActor.setDrawAboveRangeSwatch(true);
  263. //修改设条颜色
  264. const ctf = vtkColorTransferFunction.newInstance();
  265. ctf.addRGBPoint(0.0, 0.0, 0.0, 1.0);
  266. ctf.addRGBPoint(1.0, 0.0, 1.0, 0.5);
  267. ctf.addRGBPoint(2.0, 0.0, 1.0, 0.0);
  268. ctf.addRGBPoint(3.0, 1.0, 0.5, 0.0);
  269. ctf.addRGBPoint(4.0, 1.0, 0.0, 0.0);
  270. mapper.setLookupTable(ctf);
  271. lut = mapper.getLookupTable();
  272. scalarBarActor.setScalarsToColors(lut);
  273. renderer.addActor(scalarBarActor);
  274. }
  275. defineExpose({changeScalar})
  276. </script>
  277. <style>
  278. #vtkContainer{
  279. position: relative;
  280. }
  281. .vtk{
  282. position: relative;
  283. }
  284. .controls {
  285. position: absolute;
  286. top: 25px;
  287. left: 25px;
  288. background: white;
  289. padding: 12px;
  290. }
  291. .haha {
  292. color: #fff;
  293. }
  294. .tool {
  295. position: fixed;
  296. top: 50px;
  297. left: 20px;
  298. z-index: 205;
  299. }
  300. .img {
  301. width: 48px;
  302. margin: -6px 0;
  303. padding: 8px 10px;
  304. background-color: rgba(255, 255, 255, 0.1);
  305. font-size: 12px;
  306. transform: scale(0.9);
  307. }
  308. .img span {
  309. color: #fff;
  310. display: inline-block;
  311. }
  312. .img .el-image {
  313. width: 34px;
  314. }
  315. .leftdialong {
  316. padding: 15px;
  317. width: 300px;
  318. position: relative;
  319. top: -248px;
  320. left: 69px;
  321. border-radius: 5px;
  322. box-shadow: 0px 3px 10px rgba(255, 255, 255, 0.1);
  323. }
  324. .leftdialong .el-form-item__label {
  325. font-size: 12px;
  326. color: #fff !important;
  327. padding-left: 6px;
  328. }
  329. .time {
  330. color: #fff;
  331. font-size: 12px;
  332. margin-bottom: 30px;
  333. }
  334. .itemlist {
  335. display: flex;
  336. }
  337. .item {
  338. background-color: rgba(255, 255, 255, 0.1);
  339. margin: 5px;
  340. padding: 5px 9px;
  341. border-radius: 5px;
  342. font-size: 14px;
  343. transform: scale(0.8);
  344. color: #fff;
  345. }
  346. .dialog-footer {
  347. margin-top: 30px;
  348. text-align: right;
  349. }
  350. .block {
  351. display: flex;
  352. }
  353. .demonstration {
  354. padding: 5px 5px 5px 0;
  355. font-size: 12px;
  356. color: #fff;
  357. display: inline-block;
  358. width: 100px;
  359. height: 24px;
  360. line-height: 24px;
  361. }
  362. .block .el-slider {
  363. padding: 0 5px;
  364. }
  365. .cascadeer .el-cascader {
  366. width: 100%;
  367. }
  368. .cascadeer .asterisk-left {
  369. width: 100% !important;
  370. font-size: 12px;
  371. }
  372. .btn {
  373. background-color: rgba(255, 255, 255, 0.1);
  374. margin: 5px;
  375. padding: 5px 9px;
  376. border-radius: 5px;
  377. font-size: 14px;
  378. transform: scale(0.8);
  379. color: #fff;
  380. }
  381. </style>