vtkModel.js 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206
  1. import * as d3 from "d3-scale";
  2. import { formatDefaultLocale } from "d3-format";
  3. import "@kitware/vtk.js/Rendering/Profiles/Geometry";
  4. import vtkFullScreenRenderWindow from "@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow";
  5. import vtkGenericRenderWindow from '@kitware/vtk.js/Rendering/Misc/GenericRenderWindow';
  6. import vtkActor from "@kitware/vtk.js/Rendering/Core/Actor";
  7. import vtkMapper from "@kitware/vtk.js/Rendering/Core/Mapper";
  8. import vtkScalarBarActor from "@kitware/vtk.js/Rendering/Core/ScalarBarActor";
  9. import vtkColorTransferFunction from "@kitware/vtk.js/Rendering/Core/ColorTransferFunction";
  10. import vtkLookupTable from '@kitware/vtk.js/Common/Core/LookupTable';
  11. import { Representation } from "@kitware/vtk.js/Rendering/Core/Property/Constants";
  12. import vtkPolyData from "@kitware/vtk.js/Common/DataModel/PolyData";
  13. import vtkLight from "@kitware/vtk.js/Rendering/Core/Light";
  14. import { throttle } from '@kitware/vtk.js/macros';
  15. import {
  16. FieldDataTypes,
  17. FieldAssociations,
  18. } from '@kitware/vtk.js/Common/DataModel/DataSet/Constants';
  19. import vtkSphereSource from '@kitware/vtk.js/Filters/Sources/SphereSource';
  20. import vtkLineSource from '@kitware/vtk.js/Filters/Sources/LineSource';
  21. import vtkSphereMapper from '@kitware/vtk.js/Rendering/Core/SphereMapper';
  22. import vtk2DShape from '@kitware/vtk.js/Filters/Sources/Arrow2DSource';
  23. import vtkArrowSource from '@kitware/vtk.js/Filters/Sources/ArrowSource';
  24. import vtkArrow2DSource from '@kitware/vtk.js/Filters/Sources/Arrow2DSource';
  25. import vtkConeSource from '@kitware/vtk.js/Filters/Sources/ConeSource';
  26. import vtkAxesActor from '@kitware/vtk.js/Rendering/Core/AxesActor';
  27. import vtkAnnotatedCubeActor from '@kitware/vtk.js/Rendering/Core/AnnotatedCubeActor';
  28. import vtkOrientationMarkerWidget from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget';
  29. import vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';
  30. import vtkPLYReader from '@kitware/vtk.js/IO/Geometry/PLYReader';
  31. import vtkTexture from '@kitware/vtk.js/Rendering/Core/Texture';
  32. import vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder';
  33. import axios from 'axios';
  34. export class VtkModel {
  35. constructor() {
  36. //当前显示 模版 还是结果
  37. this.isJg = false;
  38. /**
  39. * 选择点线
  40. */
  41. this.isSelectNode = false;
  42. /**
  43. * 选择管道
  44. */
  45. this.isSelectPipe = false;
  46. //管道节点选择对象
  47. this.selectObj = null;
  48. //X,Y
  49. this.epageX=null;
  50. this.epageY=null;
  51. //结果选择的点数据
  52. this.selectJgPointId = 0;
  53. this.validNodes = [];//节点数据
  54. this.pipes = [];//管道数据
  55. this.renderWindowWith = null;
  56. this.renderer = null;
  57. this.renderWindow = null;
  58. //选取
  59. this.lastActor = null;
  60. this.nodeActors = []; //节点actor 数据
  61. this.pipeActors = []; //管道actor 数据
  62. this.interactor = null;
  63. this.apiSpecificRenderWindow = null;
  64. this.hardwareSelector = null;
  65. //模板数据
  66. this.polyData = vtkPolyData.newInstance();
  67. this.mapper = vtkMapper.newInstance();
  68. this.actor = vtkActor.newInstance();
  69. this.actor.getProperty().setRepresentation(Representation.SURFACE); //线
  70. this.actor.getProperty().setColor(WHITE);
  71. this.mapper.setInputData(this.polyData);
  72. this.actor.setMapper(this.mapper);
  73. //点数据
  74. this.actor2 = vtkActor.newInstance();
  75. this.actor2.getProperty().setRepresentation(Representation.POINTS); //点
  76. this.actor2.getProperty().setColor(WHITE);
  77. this.actor2.getProperty().setPointSize(2);
  78. this.actor2.setMapper(this.mapper);
  79. //结果数据渲染
  80. this.jgActor = vtkActor.newInstance();
  81. this.jgMapper = vtkMapper.newInstance();
  82. this.jgActor.getProperty().setRepresentation(Representation.SURFACE); //面
  83. this.scalarBarActor = vtkScalarBarActor.newInstance();
  84. this.scalarBarActor.setGenerateTicks(this.generateTicks(10));
  85. this.scalarBarActor.setDrawAboveRangeSwatch(true);
  86. this.scalarBarActor.setDrawNanAnnotation(false);
  87. this.scalarBarActor.setDrawAboveRangeSwatch(false);
  88. this.scalarBarActor.setBoxPosition([1, 0]);
  89. // 修改设条颜色
  90. const ctf = vtkColorTransferFunction.newInstance();
  91. ctf.addRGBPoint(0.0,0, 1, 154/255.0);
  92. ctf.addRGBPoint(1.0, 1.0, 165.0/255.0, 0.0);
  93. ctf.addRGBPoint(2.0, 230/255.0, 0.0, 92.0/225.0);
  94. // ctf.addRGBPoint(0.0, 0.0, 0.0, 1.0);
  95. // ctf.addRGBPoint(1.0, 0.0, 1.0, 0.5);
  96. // ctf.addRGBPoint(2.0, 0.0, 1.0, 0.0);
  97. // ctf.addRGBPoint(3.0, 1.0, 0.5, 0.0);
  98. // ctf.addRGBPoint(4.0, 1.0, 0.0, 0.0);
  99. this.jgMapper.setLookupTable(ctf);
  100. this.jgActor.setMapper(this.jgMapper);
  101. const lut = this.jgMapper.getLookupTable();
  102. this.scalarBarActor.setScalarsToColors(lut);
  103. //告警数据渲染
  104. this.gjActor = vtkActor.newInstance();
  105. this.gjMapper = vtkMapper.newInstance();
  106. this.gjActor.getProperty().setRepresentation(Representation.SURFACE); //面
  107. this.gjscalarBarActor = vtkScalarBarActor.newInstance();
  108. this.gjscalarBarActor.setGenerateTicks(this.generateTicks(2));
  109. this.gjscalarBarActor.setDrawAboveRangeSwatch(true);
  110. this.gjscalarBarActor.setDrawNanAnnotation(false);
  111. this.gjscalarBarActor.setDrawAboveRangeSwatch(false);
  112. this.gjscalarBarActor.setBoxPosition([1, 0]);
  113. this.gjMapper.setLookupTable(vtkLookupTable.newInstance());
  114. const gjlut = this.gjMapper.getLookupTable();
  115. gjlut.setNumberOfColors(parseInt(2, 10));
  116. // hueRange: [0.0, 0.66667], //色调范围
  117. // saturationRange: [1.0, 1.0],//饱和度
  118. // valueRange: [1.0, 1.0],
  119. // alphaRange: [1.0, 1.0], //透明度
  120. gjlut.setAlphaRange([1,1]);
  121. gjlut.setValueRange([0.5,1]);
  122. // gjlut.setHueRange([0.66667,0.0]);//蓝色到红色
  123. gjlut.setHueRange([0.3375,0.0]);//绿色到红色
  124. // this.gjscalarBarActor.setScalarsToColors(gjlut);
  125. this.gjMapper.setInterpolateScalarsBeforeMapping(true);//有无渐变
  126. this.gjActor.setMapper(this.gjMapper);
  127. this.ways = [];
  128. this.wayActors = [];
  129. this.wayspath = [];
  130. this.wayspathActors = [];
  131. this.sensorobj={};
  132. //管道位置数据
  133. const sphereSource = vtkSphereSource.newInstance({
  134. center: [0, 0, 0],
  135. radius: 4.0,
  136. });
  137. const pipsiteMapper = vtkMapper.newInstance();
  138. this.actorpipsite = vtkActor.newInstance();
  139. pipsiteMapper.setInputConnection(sphereSource.getOutputPort());
  140. this.actorpipsite.setMapper(pipsiteMapper);
  141. // this.actorpipsite.setPosition(parseFloat(node.x), parseFloat(node.y), parseFloat(node.z));
  142. this.actorpipsite.getProperty().setColor(WHITE);
  143. this.jcdActors = []; //检测点数据
  144. this.jcreader = vtkPLYReader.newInstance();
  145. fetchJSFileAsArrayBuffer('src/assets/3d/jiancd.ply').then(arrayBuffer => {
  146. // 读取PLY数据
  147. this.jcreader.parseAsArrayBuffer(arrayBuffer);
  148. });
  149. this.pnameActors =[];
  150. this.soureActors =[];
  151. this.soureReader = vtkPLYReader.newInstance();
  152. fetchJSFileAsArrayBuffer('src/assets/3d/fire.ply').then(arrayBuffer => {
  153. // 读取PLY数据
  154. this.soureReader.parseAsArrayBuffer(arrayBuffer);
  155. });
  156. this.cgqActors=[];
  157. this.cgqreader = vtkPLYReader.newInstance();
  158. fetchJSFileAsArrayBuffer('src/assets/3d/jiancd.ply').then(arrayBuffer => {
  159. // 读取PLY数据
  160. this.cgqreader.parseAsArrayBuffer(arrayBuffer);
  161. });
  162. }
  163. xyz_back(){
  164. let cam =this.renderer.getActiveCamera();
  165. cam.setViewUp([0,1,0]);
  166. cam.setPosition(495544.15625, 5403554.25, 9989.55990464236);//相机位置;
  167. this.renderer.resetCamera();
  168. this.renderWindow.render()
  169. }
  170. x_up(){
  171. let cam =this.renderer.getActiveCamera();
  172. cam.setViewUp([0,0,1]);
  173. cam.setPosition(495544.15625+5000, 5403554.25, 467.62999725341797);//相机位置;
  174. this.renderer.resetCamera();
  175. this.renderWindow.render();
  176. }
  177. x_down(){
  178. let cam =this.renderer.getActiveCamera();
  179. cam.setViewUp([0,0,1]);
  180. cam.setPosition(495544.15625+-5000, 5403554.25, 467.62999725341797);//相机位置
  181. this.renderer.resetCamera();
  182. this.renderWindow.render();
  183. }
  184. y_up(){
  185. let cam =this.renderer.getActiveCamera();
  186. cam.setViewUp([0,0,1]);
  187. cam.setPosition(495544.15625, 5403554.25+5000, 467.62999725341797);//相机位置
  188. this.renderer.resetCamera();
  189. this.renderWindow.render();
  190. }
  191. y_down(){
  192. let cam =this.renderer.getActiveCamera();
  193. cam.setViewUp([0,0,1]);
  194. cam.setPosition(495544.15625, 5403554.25-5000, 467.62999725341797);//相机位置
  195. this.renderer.resetCamera();
  196. this.renderWindow.render();
  197. }
  198. z_up(){
  199. let cam =this.renderer.getActiveCamera();
  200. cam.setViewUp([0,1,0]);
  201. cam.setPosition(495544.15625, 5403554.25, 467.62999725341797+5000);//相机位置
  202. this.renderer.resetCamera();
  203. this.renderWindow.render();
  204. }
  205. z_down(){
  206. let cam =this.renderer.getActiveCamera();
  207. cam.setViewUp([0,1,0]);
  208. cam.setPosition(495544.15625, 5403554.25, 467.62999725341797-5000);//相机位置
  209. this.renderer.resetCamera();
  210. this.renderWindow.render();
  211. }
  212. //巷道名称
  213. initPname() {
  214. fetch('src/assets/3d/pipname.json')
  215. .then(response => response.json()).then(data => {
  216. let pipnames = data;
  217. pipnames.forEach((pipname)=>{
  218. let pnameReader = vtkPLYReader.newInstance();
  219. fetchJSFileAsArrayBuffer('src/assets/3d/'+pipname.name+'.ply').then(arrayBuffer => {
  220. // 读取PLY数据
  221. pnameReader.parseAsArrayBuffer(arrayBuffer);
  222. });
  223. const mapper = vtkMapper.newInstance();
  224. mapper.setInputConnection(pnameReader.getOutputPort());
  225. const actor = vtkActor.newInstance();
  226. actor.setPosition(pipname.x,pipname.y,pipname.z);
  227. actor.getProperty().setColor(TEXTCOLOR);
  228. actor.setMapper(mapper);
  229. actor.setScale(20,20,20);//放大
  230. this.pnameActors.push(actor);
  231. // this.renderer.addActor(actor);
  232. });
  233. }).catch(error => {
  234. console.error('Error fetching JSON:', error);
  235. });
  236. }
  237. //显示巷道名称
  238. showPname(){
  239. this.pnameActors.forEach((actor)=>{
  240. this.renderer.addActor(actor);
  241. });
  242. this.renderWindow.render();
  243. }
  244. //隐藏巷道名称
  245. removePname(){
  246. this.pnameActors.forEach((actor)=>{
  247. this.renderer.removeActor(actor);
  248. });
  249. this.renderWindow.render();
  250. }
  251. //清空灾源
  252. delSoures(){
  253. this.removeSoure();
  254. this.soureActors=[];
  255. }
  256. addSensor(pid,site){
  257. let pipe =this.pipeByPid(pid,site);
  258. let point1 = this.pointByPipeNodeId(pipe.snId);
  259. let point2 = this.pointByPipeNodeId(pipe.enId);
  260. let py = site/(1-site);
  261. let pipsite_point=[
  262. (point1[0]+py*point2[0])/(1+py),
  263. (point1[1]+py*point2[1])/(1+py),
  264. (point1[2]+py*point2[2])/(1+py),
  265. ]
  266. const mapper = vtkMapper.newInstance();
  267. mapper.setInputConnection(this.cgqreader.getOutputPort());
  268. const actor = vtkActor.newInstance();
  269. actor.setPosition(pipsite_point[0],pipsite_point[1],pipsite_point[2]);
  270. actor.getProperty().setColor(SOURECOLOR);
  271. actor.setMapper(mapper);
  272. actor.setScale(5,5,5);//放大
  273. // 旋转actor
  274. actor.rotateY(90);// 绕y轴旋转
  275. this.cgqActors.push(actor);
  276. }
  277. showSensor(){
  278. this.cgqActors.forEach((actor)=>{
  279. this.renderer.addActor(actor);
  280. });
  281. console.log('看看谁先执行')
  282. this.renderWindow.render();
  283. }
  284. removeSensor(){
  285. this.cgqActors.forEach((actor)=>{
  286. this.renderer.removeActor(actor);
  287. });
  288. this.renderWindow.render();
  289. }
  290. delSensor(){
  291. this.removeSensor();
  292. this.cgqActors=[];
  293. }
  294. //添加一个灾源点
  295. addSoures(pid,site){
  296. let pipe =this.pipeByPid(pid);
  297. let point1 = this.pointByPipeNodeId(pipe.snId);
  298. let point2 = this.pointByPipeNodeId(pipe.enId);
  299. let py = site/(1-site);
  300. let pipsite_point=[
  301. (point1[0]+py*point2[0])/(1+py),
  302. (point1[1]+py*point2[1])/(1+py),
  303. (point1[2]+py*point2[2])/(1+py),
  304. ]
  305. this.initSoure(pipsite_point[0],pipsite_point[1],pipsite_point[2]);
  306. }
  307. initSoure(x,y,z) {
  308. const mapper = vtkMapper.newInstance();
  309. mapper.setInputConnection(this.soureReader.getOutputPort());
  310. const actor = vtkActor.newInstance();
  311. actor.setPosition(x,y,z);
  312. actor.getProperty().setColor(SOURECOLOR);
  313. actor.setMapper(mapper);
  314. // 旋转actor
  315. actor.rotateY(45);// 绕y轴旋转
  316. actor.setScale(20,20,20);//放大
  317. this.soureActors.push(actor);
  318. // this.renderer.addActor(actor);
  319. }
  320. //显示灾源点
  321. showSoure(){
  322. this.soureActors.forEach((actor)=>{
  323. this.renderer.addActor(actor);
  324. });
  325. this.renderWindow.render();
  326. }
  327. //隐藏灾源点
  328. removeSoure(){
  329. this.soureActors.forEach((actor)=>{
  330. this.renderer.removeActor(actor);
  331. });
  332. this.renderWindow.render();
  333. }
  334. //初始化监测点
  335. initCheckNodes(checkNodes){
  336. checkNodes.forEach((checkNode) => {
  337. let pipe =this.pipeByPid(checkNode.pid);
  338. let site =checkNode.site;
  339. let point1 = this.pointByPipeNodeId(pipe.snId);
  340. let point2 = this.pointByPipeNodeId(pipe.enId);
  341. let py = site/(1-site);
  342. let pipsite_point=[
  343. (point1[0]+py*point2[0])/(1+py),
  344. (point1[1]+py*point2[1])/(1+py),
  345. (point1[2]+py*point2[2])/(1+py),
  346. ]
  347. this.initjc(pipsite_point[0],pipsite_point[1],pipsite_point[2]);
  348. });
  349. }
  350. initjc(x,y,z) {
  351. const mapper = vtkMapper.newInstance();
  352. mapper.setInputConnection(this.jcreader.getOutputPort());
  353. const actor = vtkActor.newInstance();
  354. actor.setPosition(x,y,z);
  355. actor.getProperty().setColor(WHITE);
  356. actor.setMapper(mapper);
  357. actor.setScale(5,5,5);//放大
  358. this.jcdActors.push(actor);
  359. }
  360. //显示监测点
  361. showjc(){
  362. this.jcdActors.forEach((actor)=>{
  363. this.renderer.addActor(actor);
  364. });
  365. this.renderWindow.render();
  366. }
  367. //隐藏监测点
  368. removejc(){
  369. this.jcdActors.forEach((actor)=>{
  370. this.renderer.removeActor(actor);
  371. });
  372. this.renderWindow.render();
  373. }
  374. //显示所选择巷道位置
  375. addpipsite(pipe,site){
  376. let point1 = this.pointByPipeNodeId(pipe.snId);
  377. let point2 = this.pointByPipeNodeId(pipe.enId);
  378. let py = site/(1-site);
  379. let pipsite_point=[
  380. (point1[0]+py*point2[0])/(1+py),
  381. (point1[1]+py*point2[1])/(1+py),
  382. (point1[2]+py*point2[2])/(1+py),
  383. ]
  384. this.actorpipsite.setPosition(pipsite_point);
  385. this.renderer.addActor(this.actorpipsite);
  386. this.renderWindow.render();
  387. }
  388. //移除所选择的巷道位置
  389. clearpipsite(){
  390. this.renderer.removeActor(this.actorpipsite);
  391. }
  392. // 安全路径显示
  393. safetypath(rows){
  394. this.renderWindowWith.resize();
  395. this.wayspath=rows;
  396. let nodes1 = [];
  397. let nodes2 = [];
  398. this.wayspathActors=[];
  399. for (let index = 0; index < this.wayspath.length - 1; index++) {
  400. nodes1.push(this.wayspath[index]);
  401. }
  402. for (let index = 1; index < this.wayspath.length; index++) {
  403. nodes2.push(this.wayspath[index]);
  404. }
  405. for (let index = 0; index < nodes2.length; index++) {
  406. const lineSource = vtkLineSource.newInstance();
  407. let snode = nodes1[index];
  408. let enode = nodes2[index];
  409. let wizhi1 = this.pointByPipeNodeId(snode.nid);
  410. let wizhi2 = this.pointByPipeNodeId(enode.nid);
  411. let point1 = [parseFloat(wizhi1[0]), parseFloat(wizhi1[1]), parseFloat(wizhi1[2])];
  412. let point2 = [parseFloat(wizhi2[0]), parseFloat(wizhi2[1]), parseFloat(wizhi2[2])];
  413. lineSource.setPoint1(point1);
  414. lineSource.setPoint2(point2);
  415. lineSource.setResolution(12);
  416. const actor = vtkActor.newInstance();
  417. const mapper = vtkMapper.newInstance();
  418. actor.setMapper(mapper);
  419. actor.getProperty().setLineWidth(3);//设置线宽
  420. actor.getProperty().setColor(GREEN);
  421. const initialValues = {
  422. base: 0,
  423. center: point2,
  424. height: 9,
  425. radius: 5,
  426. resolution: 8,
  427. direction: [
  428. point2[0]-point1[0],
  429. point2[1]-point1[1],
  430. point2[2]-point1[2],
  431. ]
  432. };
  433. const vtk2d = vtkConeSource.newInstance(initialValues);
  434. const mapper2 = vtkMapper.newInstance();
  435. mapper2.setInputConnection(vtk2d.getOutputPort());
  436. const actor2 = vtkActor.newInstance();
  437. actor2.setMapper(mapper2);
  438. actor2.getProperty().setColor(GREEN);
  439. this.wayspathActors.push(actor2);
  440. mapper.setInputConnection(lineSource.getOutputPort());
  441. this.wayspathActors.push(actor);
  442. }
  443. this.wayspathActors.forEach((wayAcotor) => {
  444. this.renderer.addActor(wayAcotor);
  445. });
  446. // vtkmodel.renderer.resetCamera();
  447. vtkmodel.renderWindow.render();
  448. }
  449. // 清空安全路径
  450. safetypathremove(){
  451. this.wayspathActors.forEach(actor => {
  452. console.log(this.renderer.removeActor(actor));
  453. this.renderer.removeActor(actor);
  454. });
  455. vtkmodel.renderWindow.render();
  456. }
  457. waysInit(ways) {
  458. this.renderWindowWith.resize();
  459. this.ways = ways;
  460. this.ways.forEach((way) => {
  461. let nodes1 = [];
  462. let nodes2 = [];
  463. for (let index = 0; index < way.nrows.length - 1; index++) {
  464. nodes1.push(way.nrows[index]);
  465. }
  466. for (let index = 1; index < way.nrows.length; index++) {
  467. nodes2.push(way.nrows[index]);
  468. }
  469. for (let index = 0; index < nodes2.length; index++) {
  470. const lineSource = vtkLineSource.newInstance();
  471. let snode = nodes1[index];
  472. let enode = nodes2[index];
  473. let point1 = [parseFloat(snode.x), parseFloat(snode.y), parseFloat(snode.z)];
  474. let point2 = [parseFloat(enode.x), parseFloat(enode.y), parseFloat(enode.z)];
  475. lineSource.setPoint1(point1);
  476. lineSource.setPoint2(point2);
  477. lineSource.setResolution(12);
  478. const actor = vtkActor.newInstance();
  479. const mapper = vtkMapper.newInstance();
  480. actor.setMapper(mapper);
  481. actor.getProperty().setLineWidth(3);//设置线宽
  482. if(way.safety=="safety"){
  483. actor.getProperty().setColor(GREEN);
  484. }else if(way.safety=="danger"){
  485. actor.getProperty().setColor(REA);
  486. }
  487. const initialValues = {
  488. base: 0,
  489. center: point2,
  490. height: 9,
  491. radius: 5,
  492. resolution: 8,
  493. direction: [
  494. point2[0]-point1[0],
  495. point2[1]-point1[1],
  496. point2[2]-point1[2],
  497. ]
  498. };
  499. const vtk2d = vtkConeSource.newInstance(initialValues);
  500. const mapper2 = vtkMapper.newInstance();
  501. mapper2.setInputConnection(vtk2d.getOutputPort());
  502. const actor2 = vtkActor.newInstance();
  503. actor2.setMapper(mapper2);
  504. if(way.safety=="safety"){
  505. actor2.getProperty().setColor(GREEN);
  506. }else if(way.safety=="danger"){
  507. actor2.getProperty().setColor(REA);
  508. }
  509. this.wayActors.push(actor2);
  510. mapper.setInputConnection(lineSource.getOutputPort());
  511. this.wayActors.push(actor);
  512. }
  513. });
  514. this.wayActors.forEach((wayAcotor) => {
  515. this.renderer.addActor(wayAcotor);
  516. });
  517. // vtkmodel.renderer.resetCamera();
  518. vtkmodel.renderWindow.render();
  519. }
  520. initMode(rootContainer) {
  521. this.renderWindowWith = vtkGenericRenderWindow.newInstance();
  522. this.renderWindowWith.setContainer(rootContainer);
  523. this.renderer = this.renderWindowWith.getRenderer();
  524. this.renderer.setBackground(0.0, 0.0, 0.0, 0.0)
  525. this.renderWindow = this.renderWindowWith.getRenderWindow();
  526. //选取
  527. this.lastActor = null;
  528. this.nodeActors = []; //节点actor 数据
  529. this.pipeActors = []; //管道actor 数据
  530. this.interactor = this.renderer.getRenderWindow().getInteractor();
  531. this.apiSpecificRenderWindow = this.interactor.getView();
  532. this.hardwareSelector = this.apiSpecificRenderWindow.getSelector();
  533. this.hardwareSelector.setCaptureZValues(true);
  534. // this.hardwareSelector.setFieldAssociation(FieldAssociations.FIELD_ASSOCIATION_POINTS);
  535. this.hardwareSelector.setFieldAssociation(FieldAssociations.FIELD_ASSOCIATION_CELLS);
  536. // document.addEventListener("mousemove", throttleMouseHandler);
  537. document.addEventListener('contextmenu', throttleMouseHandler,function(e){
  538. e.preventDefault();
  539. // throttleMouseHandler
  540. })
  541. // //箭头
  542. this.arrowActors = [];
  543. // const viewColors = [
  544. // [1, 0, 0], // sagittal
  545. // [0, 1, 0], // coronal
  546. // [0, 0, 1], // axial
  547. // [0.5, 0.5, 0.5], // 3D
  548. // ];
  549. // // create axes
  550. // const axes = vtkAnnotatedCubeActor.newInstance();
  551. // axes.setDefaultStyle({
  552. // text: '+X',
  553. // fontStyle: 'bold',
  554. // fontFamily: 'Arial',
  555. // fontColor: 'black',
  556. // fontSizeScale: (res) => res / 2,
  557. // faceColor: createRGBStringFromRGBValues(viewColors[0]),
  558. // faceRotation: 0,
  559. // edgeThickness: 0.1,
  560. // edgeColor: 'black',
  561. // resolution: 400,
  562. // });
  563. // // axes.setXPlusFaceProperty({ text: '+X' });
  564. // axes.setXMinusFaceProperty({
  565. // text: '-X',
  566. // faceColor: createRGBStringFromRGBValues(viewColors[0]),
  567. // faceRotation: 90,
  568. // fontStyle: 'italic',
  569. // });
  570. // axes.setYPlusFaceProperty({
  571. // text: '+Y',
  572. // faceColor: createRGBStringFromRGBValues(viewColors[1]),
  573. // fontSizeScale: (res) => res / 4,
  574. // });
  575. // axes.setYMinusFaceProperty({
  576. // text: '-Y',
  577. // faceColor: createRGBStringFromRGBValues(viewColors[1]),
  578. // fontColor: 'white',
  579. // });
  580. // axes.setZPlusFaceProperty({
  581. // text: '+Z',
  582. // faceColor: createRGBStringFromRGBValues(viewColors[2]),
  583. // });
  584. // axes.setZMinusFaceProperty({
  585. // text: '-Z',
  586. // faceColor: createRGBStringFromRGBValues(viewColors[2]),
  587. // faceRotation: 45,
  588. // });
  589. // // const vtkAxesActor = vtkAxesActor.newInstance();
  590. // // create orientation widget
  591. // this.orientationWidget = vtkOrientationMarkerWidget.newInstance({
  592. // actor: axes,
  593. // interactor: this.renderWindow.getInteractor(),
  594. // });
  595. // this.orientationWidget.setEnabled(true);
  596. // this.orientationWidget.setViewportCorner(
  597. // vtkOrientationMarkerWidget.Corners.BOTTOM_LEFT
  598. // );
  599. // this.orientationWidget.setViewportSize(0.15);
  600. // this.orientationWidget.setMinPixelSize(100);
  601. // this.orientationWidget.setMaxPixelSize(300);
  602. }
  603. generateTicks(numberOfTicks) {
  604. return (helper) => {
  605. const lastTickBounds = helper.getLastTickBounds();
  606. // compute tick marks for axes
  607. const scale = d3
  608. .scaleLinear()
  609. .domain([0.0, 1.0])
  610. .range([lastTickBounds[0], lastTickBounds[1]]);
  611. const samples = scale.ticks(numberOfTicks);
  612. const ticks = samples.map((tick) => scale(tick));
  613. // Replace minus "\u2212" with hyphen-minus "\u002D" so that parseFloat() works
  614. formatDefaultLocale({ minus: "\u002D" });
  615. const format = scale.tickFormat(ticks[0], ticks[ticks.length - 1], numberOfTicks);
  616. const tickStrings = ticks
  617. .map(format)
  618. .map((tick) => Number(parseFloat(tick).toPrecision(12)).toPrecision()); // d3 sometimes adds unwanted whitespace
  619. helper.setTicks(ticks);
  620. helper.setTickStrings(tickStrings);
  621. };
  622. }
  623. //添加箭头
  624. addArrow(velocitys) {
  625. this.clearArrow();
  626. this.arrowActors = [];
  627. velocitys.forEach(velocity => {
  628. velocity.points.forEach(point => {
  629. // const initialValues = {
  630. // base:0,
  631. // shape: 'arrow4points',
  632. // center: [point.x,point.y,point.z],
  633. // direction:[
  634. // velocity.vector[2],
  635. // velocity.vector[0],
  636. // velocity.vector[1]
  637. // ],
  638. // height: 10.0,
  639. // thickness: 1.5,
  640. // width: 3,
  641. // };
  642. // const vtk2d = vtk2DShape.newInstance(initialValues);
  643. const initialValues = {
  644. // base: 0,
  645. center: [point.x, point.y, point.z],
  646. // height: 10,
  647. // radius: 3,
  648. // resolution: 6,
  649. height: 10.0,
  650. radius:2,
  651. resolution: 6,
  652. direction: [
  653. // velocity.vector[2],
  654. // velocity.vector[0],
  655. // velocity.vector[1]
  656. velocity.vector[0],
  657. velocity.vector[1],
  658. velocity.vector[2]
  659. ],
  660. capping: true,
  661. };
  662. const vtk2d = vtkConeSource.newInstance(initialValues);
  663. const mapper = vtkMapper.newInstance();
  664. mapper.setInputConnection(vtk2d.getOutputPort());
  665. const actor = vtkActor.newInstance();
  666. actor.setMapper(mapper);
  667. actor.getProperty().setColor(REA);
  668. this.arrowActors.push(actor);
  669. // this.renderer.addActor(actor);
  670. })
  671. });
  672. for (let index = 0; index < this.arrowActors.length; index=index+30) {
  673. let actor =this.arrowActors[index];
  674. this.renderer.addActor(actor);
  675. };
  676. this.renderWindow.render();
  677. }
  678. clearArrow() {
  679. if (this.arrowActors) {
  680. this.arrowActors.forEach(actor => {
  681. this.renderer.removeActor(actor);
  682. });
  683. }
  684. }
  685. modelInit(validNodes, pipes) {
  686. this.renderWindowWith.resize();
  687. this.validNodes = validNodes;
  688. this.pipes = pipes;
  689. this.modelCreate();
  690. }
  691. modelCreate() {
  692. console.log("modelInit..");
  693. const points = this.polyData.getPoints();
  694. const lines = this.polyData.getLines();
  695. //无节点actor
  696. this.validNodes.forEach((node) => {
  697. points.insertNextPoint(parseFloat(node.x), parseFloat(node.y), parseFloat(node.z));
  698. });
  699. //无管道actor
  700. this.pipes.forEach((pipe) => {
  701. let sid = this.indexIdByPipeNodeId(pipe.snId);
  702. let eid = this.indexIdByPipeNodeId(pipe.enId);
  703. lines.insertNextCell([sid, eid]);
  704. });
  705. //有节点actors
  706. const sphereSource = vtkSphereSource.newInstance({
  707. center: [0, 0, 0],
  708. radius: 4.0,
  709. });
  710. const mapper = vtkMapper.newInstance();
  711. mapper.setInputConnection(sphereSource.getOutputPort());
  712. this.validNodes.forEach((node) => {
  713. const actor = vtkActor.newInstance();
  714. actor.setMapper(mapper);
  715. actor.setPosition(parseFloat(node.x), parseFloat(node.y), parseFloat(node.z));
  716. actor.getProperty().setColor(WHITE);
  717. const nodeActor = {};
  718. nodeActor.node = node;
  719. nodeActor.actor = actor;
  720. this.nodeActors.push(nodeActor);
  721. });
  722. //有管道actors
  723. this.pipes.forEach((pipe) => {
  724. const lineSource = vtkLineSource.newInstance();
  725. let point1 = this.pointByPipeNodeId(pipe.snId);
  726. let point2 = this.pointByPipeNodeId(pipe.enId);
  727. lineSource.setPoint1(point1);
  728. lineSource.setPoint2(point2);
  729. lineSource.setResolution(12);
  730. const actor = vtkActor.newInstance();
  731. const mapper = vtkMapper.newInstance();
  732. actor.setMapper(mapper);
  733. actor.getProperty().setLineWidth(3);//设置线宽
  734. actor.getProperty().setColor(WHITE);
  735. mapper.setInputConnection(lineSource.getOutputPort());
  736. const pipeActor = {};
  737. pipeActor.pipe = pipe;
  738. pipeActor.actor = actor;
  739. this.pipeActors.push(pipeActor);
  740. });
  741. this.modelShow();
  742. this.renderer.resetCamera();
  743. const cam = this.renderer.getActiveCamera();
  744. console.log("透视或平行相机", cam.getParallelProjection());
  745. // cam.setParallelProjection(true);
  746. // console.log("透视或平行相机",cam.getParallelProjection());
  747. console.log("水平视角使用", cam.getUseHorizontalViewAngle());
  748. // cam.setUseHorizontalViewAngle(true);
  749. console.log("平行位置投影比例", cam.getParallelScale());
  750. // cam.setParallelScale(600);
  751. console.log("窗口中心位置", cam.getWindowCenter());//[0, 0]
  752. // cam.setWindowCenter([1,-1]);
  753. console.log("相机视角", cam.getViewAngle());//30
  754. // cam.setViewAngle(90);
  755. console.log("摄像头位置", cam.getPosition());//[495544.15625, 5403554.25, 9989.55990464236]
  756. // cam.setPosition(495544.15625, 5403554.25, 9989.55990464236);
  757. console.log("相机焦点", cam.getFocalPoint());// [495544.15625, 5403554.25, 467.62999725341797]
  758. // cam.setFocalPoint(495544.15625, 5403554.25, 467.62999725341797);
  759. console.log("相机方向", cam.getViewUp());//[0,1,0]
  760. // cam.setViewUp([0,1,1]);
  761. console.log("近远平面", cam.getClippingRange());// [9141.491986233214, 9913.53967078369]
  762. // cam.setClippingRange(9241.491986233214,9300.53967078369);
  763. //设置环境光和光照
  764. const light = vtkLight.newInstance();
  765. light.setColor(1.0, 1.0, 1.0); // 白色环境光
  766. light.setIntensity(3.0); // 强度为1.0
  767. this.renderer.addLight(light);
  768. // this.renderer.resetCamera();
  769. // cam.setPosition(0, 0, 9989);
  770. //相机焦点 495544.15625 5403554.25 467.62999725341797
  771. // cam.setPosition( 495544.15625+500, 5403554.25, 467.62999725341797);
  772. // cam.setPosition( 495544.15625-500, 5403554.25, 467.62999725341797);
  773. // cam.setViewUp([0,0,1]);
  774. // this.renderer.updateCamera();
  775. }
  776. modelClearShow() {
  777. this.renderer.removeActor(this.actor);
  778. this.renderer.removeActor(this.actor2);
  779. this.nodeActors.forEach((nodeActor) => {
  780. this.renderer.removeActor(nodeActor.actor);
  781. });
  782. this.pipeActors.forEach((pipeActor) => {
  783. this.renderer.removeActor(pipeActor.actor);
  784. });
  785. }
  786. wayClearShow(){
  787. this.wayActors.forEach((wayAcotor) => {
  788. this.renderer.removeActor(wayAcotor);
  789. });
  790. }
  791. modelShow() {
  792. this.modelClearShow();
  793. if (!this.isSelectNode) {//不选择节点
  794. this.renderer.addActor(this.actor2);
  795. }
  796. if (!this.isSelectPipe) {//不选择管道
  797. this.renderer.addActor(this.actor);
  798. }
  799. if (this.isSelectNode) {//选择节点
  800. this.nodeActors.forEach((nodeActor) => {
  801. this.renderer.addActor(nodeActor.actor);
  802. });
  803. }
  804. if (this.isSelectPipe) {//选择管道
  805. this.pipeActors.forEach((pipeActor) => {
  806. this.renderer.addActor(pipeActor.actor);
  807. });
  808. }
  809. // this.addjc(495530.903,5403828.821,432.40);
  810. // this.addpname(495530.903,5403829.821,432.40);
  811. // this.addSoure(495530.903,5403829.821,432.40);
  812. // this.addpname(495530.903,5403829.821,432.40);
  813. this.initPname();
  814. this.renderer.addActor(this.axesActor);
  815. // this.rotateY();
  816. }
  817. selectNodes() {
  818. this.isSelectNode = true;
  819. this.isSelectPipe = false;
  820. this.modelShow();
  821. document.addEventListener("mousemove", throttleMouseHandler);
  822. this.renderWindow.render();
  823. }
  824. selectPipes() {
  825. this.isSelectNode = false;
  826. this.isSelectPipe = true;
  827. document.addEventListener("mousemove", throttleMouseHandler);
  828. this.modelShow();
  829. this.renderWindow.render();
  830. }
  831. selectNoting() {
  832. this.isSelectNode = false;
  833. this.isSelectPipe = false;
  834. this.modelShow();
  835. this.renderWindow.render();
  836. }
  837. /**
  838. * 根据id 获取对应的编号
  839. */
  840. indexIdByPipeNodeId(nid) {
  841. for (let index = 0; index < this.validNodes.length; index++) {
  842. const node = this.validNodes[index];
  843. if (node.id == nid) {
  844. return index;
  845. }
  846. }
  847. return 0;
  848. }
  849. pipeByPid(pid) {
  850. console.log("pipeByPid",this.pipes.length)
  851. for (let index = 0; index < this.pipes.length; index++) {
  852. const pipe = this.pipes[index];
  853. if (pipe.id == pid) {
  854. return pipe;
  855. }
  856. }
  857. }
  858. pointByPipeNodeId(nid) {
  859. for (let index = 0; index < this.validNodes.length; index++) {
  860. const node = this.validNodes[index];
  861. if (node.id == nid) {
  862. return [parseFloat(node.x), parseFloat(node.y), parseFloat(node.z)];
  863. }
  864. }
  865. return 0;
  866. }
  867. clearAllShowGj() {
  868. this.renderer.addActor(this.gjActor);
  869. this.renderer.addActor(this.gjscalarBarActor);
  870. this.renderer.removeActor(this.jgActor);
  871. this.renderer.removeActor(this.scalarBarActor);
  872. this.isSelectNode = false;
  873. this.isSelectPipe = false;
  874. this.wayClearShow();
  875. this.modelClearShow();
  876. this.isJg = true; //显示结果
  877. document.removeEventListener("mousemove", throttleMouseHandler);
  878. }
  879. clearModeAddJg() {
  880. this.renderer.addActor(this.jgActor);
  881. this.renderer.addActor(this.scalarBarActor);
  882. this.isSelectNode = false;
  883. this.isSelectPipe = false;
  884. this.renderer.removeActor(this.gjActor);
  885. this.renderer.removeActor(this.gjscalarBarActor)
  886. this.wayClearShow();
  887. this.modelClearShow();
  888. this.isJg = true; //显示结果
  889. document.removeEventListener("mousemove", throttleMouseHandler);
  890. }
  891. clearJgAddMode() {
  892. this.renderer.removeActor(this.scalarBarActor);
  893. this.renderer.removeActor(this.jgActor);
  894. this.renderer.removeActor(this.gjActor);
  895. this.renderer.removeActor(this.gjscalarBarActor)
  896. this.clearArrow();
  897. this.modelShow();
  898. this.wayClearShow();
  899. this.isJg = false; //不显示结果
  900. }
  901. clearAll() {
  902. this.renderer.removeActor(this.jgActor);
  903. this.renderer.removeActor(this.scalarBarActor);
  904. this.renderer.removeActor(this.gjActor);
  905. this.renderer.removeActor(this.gjscalarBarActor)
  906. this.clearArrow();
  907. this.modelClearShow();
  908. this.wayClearShow();
  909. this.renderWindow.render();
  910. }
  911. //选中指定点
  912. selectByNodeId(nid) {
  913. console.log("selectByNodeId", nid);
  914. if (this.isSelectNode) {
  915. if (this.lastActor != null) {
  916. this.lastActor.getProperty().setColor(WHITE);
  917. }
  918. this.nodeActors.forEach(nodeActor => {
  919. if (nid == nodeActor.node.id) {
  920. nodeActor.actor.getProperty().setColor(GREEN);
  921. this.renderWindow.render();
  922. this.lastActor = nodeActor.actor;
  923. this.selectObj = nodeActor.node;
  924. return;
  925. }
  926. });
  927. }
  928. }
  929. //选中指定管道
  930. selectByPipeId(pid) {
  931. console.log("selectByPipeId", pid);
  932. if (this.isSelectPipe) {
  933. if (this.lastActor != null) {
  934. this.lastActor.getProperty().setColor(WHITE);
  935. }
  936. this.pipeActors.forEach(pipeActor => {
  937. if (pid == pipeActor.pipe.id) {
  938. pipeActor.actor.getProperty().setColor(GREEN);
  939. this.renderWindow.render();
  940. this.lastActor = pipeActor.actor;
  941. this.selectObj = pipeActor.node;
  942. return;
  943. }
  944. });
  945. }
  946. }
  947. }
  948. function createRGBStringFromRGBValues(rgb) {
  949. if (rgb.length !== 3) {
  950. return 'rgb(0, 0, 0)';
  951. }
  952. return `rgb(${(rgb[0] * 255).toString()}, ${(rgb[1] * 255).toString()}, ${(
  953. rgb[2] * 255
  954. ).toString()})`;
  955. }
  956. function pickOnMouseEvent(event) {
  957. if (vtkmodel.interactor.isAnimating()) {
  958. // We should not do picking when interacting with the scene
  959. return;
  960. }
  961. const [x, y] = eventToWindowXY(event);
  962. // console.log([x,y]);
  963. // if(!vtkmodel.getPointData){//没有数据
  964. // return ;
  965. // }
  966. // console.log(vtkmodel.hardwareSelector.getPointData());
  967. // if(!vtkmodel.renderer.getActors().size==0){
  968. // return;
  969. // }
  970. vtkmodel.hardwareSelector
  971. .getSourceDataAsync(vtkmodel.renderer, x, y, x, y)
  972. .then((result) => {
  973. if (result) {
  974. processSelections(result.generateSelection(x, y, x, y));
  975. // processSelections(result.generateSelection(x, y, x, y));
  976. } else {
  977. // processSelections(null);
  978. }
  979. });
  980. }
  981. function eventToWindowXY(event) {
  982. // We know we are full screen => window.innerXXX
  983. // Otherwise we can use pixel device ratio or else...
  984. var left = event.pageX ;
  985. var top = event.pageY ;
  986. vtkmodel.epageX=left;
  987. vtkmodel.epageY=top;
  988. const { clientX, clientY } = event;
  989. const [width, height] = vtkmodel.apiSpecificRenderWindow.getSize();
  990. const x = Math.round((width * clientX) / window.innerWidth);
  991. const y = Math.round(height * (1 - clientY / window.innerHeight)); // Need to flip Y
  992. // console.log(x,y)
  993. return [x, y];
  994. }
  995. function processSelections(selections) {
  996. if (!selections || selections.length === 0) {//没有选择
  997. if (vtkmodel.lastActor == null) {
  998. } else {
  999. // vtkmodel.lastActor.getProperty().setColor(WHITE);
  1000. // vtkmodel.renderWindow.render();
  1001. }
  1002. // vtkmodel.lastActor = null;
  1003. return;
  1004. }
  1005. const {
  1006. worldPosition: rayHitWorldPosition,
  1007. compositeID,
  1008. prop,
  1009. propID,
  1010. attributeID,
  1011. } = selections[0].getProperties();
  1012. if (vtkmodel.lastActor != null) {
  1013. vtkmodel.lastActor.getProperty().setColor(WHITE);
  1014. vtkmodel.renderWindow.render();
  1015. }
  1016. vtkmodel.nodeActors.forEach((nodeActor) => {
  1017. if (prop == nodeActor.actor) {
  1018. vtkmodel.selectObj = nodeActor.node;
  1019. prop.getProperty().setColor(GREEN);
  1020. vtkmodel.lastActor = prop;
  1021. // console.log(vtkmodel.selectObj );
  1022. }
  1023. });
  1024. vtkmodel.pipeActors.forEach((pipeActor) => {
  1025. if (prop == pipeActor.actor) {
  1026. vtkmodel.selectObj = pipeActor.pipe;
  1027. prop.getProperty().setColor(GREEN);
  1028. vtkmodel.lastActor = prop;
  1029. // console.log(vtkmodel.selectObj );
  1030. }
  1031. });
  1032. if (vtkmodel.isJg) {//结果数据选择cell
  1033. if (vtkmodel.hardwareSelector.getFieldAssociation() ===
  1034. FieldAssociations.FIELD_ASSOCIATION_POINTS) {//选择点
  1035. } else {
  1036. //选择Cell
  1037. const input = prop.getMapper().getInputData();
  1038. if (!input.getCells()) {
  1039. input.buildCells();
  1040. // return;
  1041. }
  1042. const cellPoints = input.getCellPoints(attributeID);
  1043. if (cellPoints) {
  1044. const pointIds = cellPoints.cellPointIds;
  1045. // Find the closest cell point, and use that as cursor position
  1046. const points = Array.from(pointIds).map((pointId) =>
  1047. input.getPoints().getPoint(pointId)
  1048. );
  1049. const scalarDataArray = input.getPointData().getScalars().getData();
  1050. console.log(scalarDataArray[pointIds[0]]);//节点标量数据
  1051. // pointIds.forEach(pointId=>{
  1052. // console.log(input.getPointData().getScalars().getName());
  1053. // console.log(scalarDataArray[pointId]);//节点标量数据
  1054. // });
  1055. vtkmodel.selectJgPointId = pointIds[0];
  1056. }
  1057. }
  1058. } else {
  1059. vtkmodel.renderWindow.render();
  1060. }
  1061. }
  1062. // 异步函数,用于读取JS文件并转换为ArrayBuffer
  1063. async function fetchJSFileAsArrayBuffer(url) {
  1064. try {
  1065. // 使用fetch API异步加载JS文件
  1066. const response = await fetch(url, {
  1067. method: 'GET',
  1068. responseType: 'arraybuffer' // 指定响应类型为arraybuffer
  1069. });
  1070. // 确保响应成功
  1071. if (!response.ok) {
  1072. throw new Error(`HTTP error! status: ${response.status}`);
  1073. }
  1074. // 获取ArrayBuffer对象
  1075. const arrayBuffer = await response.arrayBuffer();
  1076. // 可选:验证转换后的ArrayBuffer内容
  1077. const decoder = new TextDecoder(); // 使用TextDecoder将ArrayBuffer解码为字符串
  1078. const content = decoder.decode(arrayBuffer);
  1079. // console.log('File content:', content);
  1080. return arrayBuffer;
  1081. } catch (error) {
  1082. console.error('Error fetching the file:', error);
  1083. throw error; // 重新抛出错误以便上层处理
  1084. }
  1085. }
  1086. const throttleMouseHandler = throttle(pickOnMouseEvent, 20);
  1087. const WHITE = [1, 0.2, 1];
  1088. const GREEN = [0.1, 0.8, 0.1];
  1089. const REA = [1, 0, 0];
  1090. const JCDCOLOR = [0.5, 0, 0];
  1091. const SOURECOLOR = [0.5, 0.5, 0];
  1092. const TEXTCOLOR = [1, 1, 1];
  1093. const vtkmodel = new VtkModel();
  1094. export { vtkmodel };