1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084 |
- import * as d3 from "d3-scale";
- import { formatDefaultLocale } from "d3-format";
- import "@kitware/vtk.js/Rendering/Profiles/Geometry";
- import vtkFullScreenRenderWindow from "@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow";
- import vtkGenericRenderWindow from '@kitware/vtk.js/Rendering/Misc/GenericRenderWindow';
- import vtkActor from "@kitware/vtk.js/Rendering/Core/Actor";
- import vtkMapper from "@kitware/vtk.js/Rendering/Core/Mapper";
- import vtkScalarBarActor from "@kitware/vtk.js/Rendering/Core/ScalarBarActor";
- import vtkColorTransferFunction from "@kitware/vtk.js/Rendering/Core/ColorTransferFunction";
- import vtkLookupTable from '@kitware/vtk.js/Common/Core/LookupTable';
- import { Representation } from "@kitware/vtk.js/Rendering/Core/Property/Constants";
- import vtkPolyData from "@kitware/vtk.js/Common/DataModel/PolyData";
- import vtkLight from "@kitware/vtk.js/Rendering/Core/Light";
- import { throttle } from '@kitware/vtk.js/macros';
- import {
- FieldDataTypes,
- FieldAssociations,
- } from '@kitware/vtk.js/Common/DataModel/DataSet/Constants';
- import vtkSphereSource from '@kitware/vtk.js/Filters/Sources/SphereSource';
- import vtkLineSource from '@kitware/vtk.js/Filters/Sources/LineSource';
- import vtkSphereMapper from '@kitware/vtk.js/Rendering/Core/SphereMapper';
- import vtk2DShape from '@kitware/vtk.js/Filters/Sources/Arrow2DSource';
- import vtkArrowSource from '@kitware/vtk.js/Filters/Sources/ArrowSource';
- import vtkArrow2DSource from '@kitware/vtk.js/Filters/Sources/Arrow2DSource';
- import vtkConeSource from '@kitware/vtk.js/Filters/Sources/ConeSource';
- import vtkAxesActor from '@kitware/vtk.js/Rendering/Core/AxesActor';
- import vtkAnnotatedCubeActor from '@kitware/vtk.js/Rendering/Core/AnnotatedCubeActor';
- import vtkOrientationMarkerWidget from '@kitware/vtk.js/Interaction/Widgets/OrientationMarkerWidget';
- import vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';
- import vtkPLYReader from '@kitware/vtk.js/IO/Geometry/PLYReader';
- import vtkTexture from '@kitware/vtk.js/Rendering/Core/Texture';
- import vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder';
- import axios from 'axios';
- export class VtkModel {
- constructor() {
- //当前显示 模版 还是结果
- this.isJg = false;
- /**
- * 选择点线
- */
- this.isSelectNode = false;
- /**
- * 选择管道
- */
- this.isSelectPipe = false;
- //管道节点选择对象
- this.selectObj = null;
- //X,Y
- this.epageX=null;
- this.epageY=null;
- //结果选择的点数据
- this.selectJgPointId = 0;
- this.validNodes = [];//节点数据
- this.pipes = [];//管道数据
- this.renderWindowWith = null;
- this.renderer = null;
- this.renderWindow = null;
- //选取
- this.lastActor = null;
- this.nodeActors = []; //节点actor 数据
- this.pipeActors = []; //管道actor 数据
- this.interactor = null;
- this.apiSpecificRenderWindow = null;
- this.hardwareSelector = null;
- //模板数据
- this.polyData = vtkPolyData.newInstance();
- this.mapper = vtkMapper.newInstance();
- this.actor = vtkActor.newInstance();
- this.actor.getProperty().setRepresentation(Representation.SURFACE); //线
- this.actor.getProperty().setColor(WHITE);
- this.mapper.setInputData(this.polyData);
- this.actor.setMapper(this.mapper);
-
- //点数据
- this.actor2 = vtkActor.newInstance();
- this.actor2.getProperty().setRepresentation(Representation.POINTS); //点
- this.actor2.getProperty().setColor(WHITE);
- this.actor2.getProperty().setPointSize(2);
- this.actor2.setMapper(this.mapper);
- //结果数据渲染
- this.jgActor = vtkActor.newInstance();
- this.jgMapper = vtkMapper.newInstance();
- this.jgActor.getProperty().setRepresentation(Representation.SURFACE); //面
- this.scalarBarActor = vtkScalarBarActor.newInstance();
- this.scalarBarActor.setGenerateTicks(this.generateTicks(10));
- this.scalarBarActor.setDrawAboveRangeSwatch(true);
- this.scalarBarActor.setDrawNanAnnotation(false);
- this.scalarBarActor.setDrawAboveRangeSwatch(false);
- this.scalarBarActor.setBoxPosition([1, 0]);
- // 修改设条颜色
- const ctf = vtkColorTransferFunction.newInstance();
- ctf.addRGBPoint(0.0,0, 1, 154/255.0);
- ctf.addRGBPoint(1.0, 1.0, 165.0/255.0, 0.0);
- ctf.addRGBPoint(2.0, 230/255.0, 0.0, 92.0/225.0);
- // ctf.addRGBPoint(0.0, 0.0, 0.0, 1.0);
- // ctf.addRGBPoint(1.0, 0.0, 1.0, 0.5);
- // ctf.addRGBPoint(2.0, 0.0, 1.0, 0.0);
- // ctf.addRGBPoint(3.0, 1.0, 0.5, 0.0);
- // ctf.addRGBPoint(4.0, 1.0, 0.0, 0.0);
- this.jgMapper.setLookupTable(ctf);
- this.jgActor.setMapper(this.jgMapper);
- const lut = this.jgMapper.getLookupTable();
- this.scalarBarActor.setScalarsToColors(lut);
- //告警数据渲染
- this.gjActor = vtkActor.newInstance();
- this.gjMapper = vtkMapper.newInstance();
- this.gjActor.getProperty().setRepresentation(Representation.SURFACE); //面
- this.gjscalarBarActor = vtkScalarBarActor.newInstance();
- this.gjscalarBarActor.setGenerateTicks(this.generateTicks(2));
- this.gjscalarBarActor.setDrawAboveRangeSwatch(true);
- this.gjscalarBarActor.setDrawNanAnnotation(false);
- this.gjscalarBarActor.setDrawAboveRangeSwatch(false);
- this.gjscalarBarActor.setBoxPosition([1, 0]);
- this.gjMapper.setLookupTable(vtkLookupTable.newInstance());
- const gjlut = this.gjMapper.getLookupTable();
- gjlut.setNumberOfColors(parseInt(2, 10));
- // hueRange: [0.0, 0.66667], //色调范围
- // saturationRange: [1.0, 1.0],//饱和度
- // valueRange: [1.0, 1.0],
- // alphaRange: [1.0, 1.0], //透明度
- gjlut.setAlphaRange([1,1]);
- gjlut.setValueRange([0.5,1]);
- // gjlut.setHueRange([0.66667,0.0]);//蓝色到红色
- gjlut.setHueRange([0.3375,0.0]);//绿色到红色
- // this.gjscalarBarActor.setScalarsToColors(gjlut);
- this.gjMapper.setInterpolateScalarsBeforeMapping(true);//有无渐变
- this.gjActor.setMapper(this.gjMapper);
- this.ways = [];
- this.wayActors = [];
- //管道位置数据
- const sphereSource = vtkSphereSource.newInstance({
- center: [0, 0, 0],
- radius: 4.0,
- });
- const pipsiteMapper = vtkMapper.newInstance();
- this.actorpipsite = vtkActor.newInstance();
- pipsiteMapper.setInputConnection(sphereSource.getOutputPort());
- this.actorpipsite.setMapper(pipsiteMapper);
- // this.actorpipsite.setPosition(parseFloat(node.x), parseFloat(node.y), parseFloat(node.z));
- this.actorpipsite.getProperty().setColor(WHITE);
- this.jcdActors = []; //检测点数据
- this.jcreader = vtkPLYReader.newInstance();
- fetchJSFileAsArrayBuffer('src/assets/3d/jiancd.ply').then(arrayBuffer => {
- // 读取PLY数据
- this.jcreader.parseAsArrayBuffer(arrayBuffer);
- });
- this.pnameActors =[];
-
- this.soureActors =[];
- this.soureReader = vtkPLYReader.newInstance();
- fetchJSFileAsArrayBuffer('src/assets/3d/fire.ply').then(arrayBuffer => {
- // 读取PLY数据
- this.soureReader.parseAsArrayBuffer(arrayBuffer);
- });
- }
-
- xyz_back(){
- let cam =this.renderer.getActiveCamera();
- cam.setViewUp([0,1,0]);
- cam.setPosition(495544.15625, 5403554.25, 9989.55990464236);//相机位置;
- this.renderer.resetCamera();
- this.renderWindow.render()
- }
- x_up(){
- let cam =this.renderer.getActiveCamera();
- cam.setViewUp([0,0,1]);
- cam.setPosition(495544.15625+5000, 5403554.25, 467.62999725341797);//相机位置;
- this.renderer.resetCamera();
- this.renderWindow.render();
- }
- x_down(){
- let cam =this.renderer.getActiveCamera();
- cam.setViewUp([0,0,1]);
- cam.setPosition(495544.15625+-5000, 5403554.25, 467.62999725341797);//相机位置
- this.renderer.resetCamera();
- this.renderWindow.render();
- }
- y_up(){
- let cam =this.renderer.getActiveCamera();
- cam.setViewUp([0,0,1]);
- cam.setPosition(495544.15625, 5403554.25+5000, 467.62999725341797);//相机位置
- this.renderer.resetCamera();
- this.renderWindow.render();
- }
- y_down(){
- let cam =this.renderer.getActiveCamera();
- cam.setViewUp([0,0,1]);
- cam.setPosition(495544.15625, 5403554.25-5000, 467.62999725341797);//相机位置
- this.renderer.resetCamera();
- this.renderWindow.render();
- }
- z_up(){
- let cam =this.renderer.getActiveCamera();
- cam.setViewUp([0,1,0]);
- cam.setPosition(495544.15625, 5403554.25, 467.62999725341797+5000);//相机位置
- this.renderer.resetCamera();
- this.renderWindow.render();
- }
- z_down(){
- let cam =this.renderer.getActiveCamera();
- cam.setViewUp([0,1,0]);
- cam.setPosition(495544.15625, 5403554.25, 467.62999725341797-5000);//相机位置
- this.renderer.resetCamera();
- this.renderWindow.render();
- }
- //巷道名称
- initPname() {
- fetch('src/assets/3d/pipname.json')
- .then(response => response.json()).then(data => {
- let pipnames = data;
- pipnames.forEach((pipname)=>{
- let pnameReader = vtkPLYReader.newInstance();
- fetchJSFileAsArrayBuffer('src/assets/3d/'+pipname.name+'.ply').then(arrayBuffer => {
- // 读取PLY数据
- pnameReader.parseAsArrayBuffer(arrayBuffer);
- });
- const mapper = vtkMapper.newInstance();
- mapper.setInputConnection(pnameReader.getOutputPort());
- const actor = vtkActor.newInstance();
- actor.setPosition(pipname.x,pipname.y,pipname.z);
- actor.getProperty().setColor(TEXTCOLOR);
- actor.setMapper(mapper);
- actor.setScale(20,20,20);//放大
- this.pnameActors.push(actor);
- // this.renderer.addActor(actor);
- });
- }).catch(error => {
- console.error('Error fetching JSON:', error);
- });
- }
- //显示巷道名称
- showPname(){
- this.pnameActors.forEach((actor)=>{
- this.renderer.addActor(actor);
- });
- this.renderWindow.render();
- }
- //隐藏巷道名称
- removePname(){
- this.pnameActors.forEach((actor)=>{
- this.renderer.removeActor(actor);
- });
- this.renderWindow.render();
- }
- //清空灾源
- delSoures(){
- this.removeSoure();
- this.soureActors=[];
- }
- //添加一个灾源点
- addSoures(pid,site){
- let pipe =this.pipeByPid(pid);
- let point1 = this.pointByPipeNodeId(pipe.snId);
- let point2 = this.pointByPipeNodeId(pipe.enId);
- let py = site/(1-site);
- let pipsite_point=[
- (point1[0]+py*point2[0])/(1+py),
- (point1[1]+py*point2[1])/(1+py),
- (point1[2]+py*point2[2])/(1+py),
- ]
- this.initSoure(pipsite_point[0],pipsite_point[1],pipsite_point[2]);
- }
- initSoure(x,y,z) {
- const mapper = vtkMapper.newInstance();
- mapper.setInputConnection(this.soureReader.getOutputPort());
- const actor = vtkActor.newInstance();
- actor.setPosition(x,y,z);
- actor.getProperty().setColor(SOURECOLOR);
- actor.setMapper(mapper);
- // 旋转actor
- actor.rotateY(45);// 绕y轴旋转
- actor.setScale(20,20,20);//放大
- this.soureActors.push(actor);
- // this.renderer.addActor(actor);
- }
- //显示灾源点
- showSoure(){
- this.soureActors.forEach((actor)=>{
- this.renderer.addActor(actor);
- });
- this.renderWindow.render();
- }
- //隐藏灾源点
- removeSoure(){
- this.soureActors.forEach((actor)=>{
- this.renderer.removeActor(actor);
- });
- this.renderWindow.render();
- }
- //初始化监测点
- initCheckNodes(checkNodes){
- checkNodes.forEach((checkNode) => {
- let pipe =this.pipeByPid(checkNode.pid);
- let site =checkNode.site;
- let point1 = this.pointByPipeNodeId(pipe.snId);
- let point2 = this.pointByPipeNodeId(pipe.enId);
- let py = site/(1-site);
- let pipsite_point=[
- (point1[0]+py*point2[0])/(1+py),
- (point1[1]+py*point2[1])/(1+py),
- (point1[2]+py*point2[2])/(1+py),
- ]
- this.initjc(pipsite_point[0],pipsite_point[1],pipsite_point[2]);
- });
- }
- initjc(x,y,z) {
- const mapper = vtkMapper.newInstance();
- mapper.setInputConnection(this.jcreader.getOutputPort());
- const actor = vtkActor.newInstance();
- actor.setPosition(x,y,z);
- actor.getProperty().setColor(WHITE);
- actor.setMapper(mapper);
- actor.setScale(5,5,5);//放大
- this.jcdActors.push(actor);
- }
- //显示监测点
- showjc(){
- this.jcdActors.forEach((actor)=>{
-
- this.renderer.addActor(actor);
- });
- this.renderWindow.render();
- }
- //隐藏监测点
- removejc(){
- this.jcdActors.forEach((actor)=>{
- this.renderer.removeActor(actor);
- });
- this.renderWindow.render();
- }
- //显示所选择巷道位置
- addpipsite(pipe,site){
- let point1 = this.pointByPipeNodeId(pipe.snId);
- let point2 = this.pointByPipeNodeId(pipe.enId);
- let py = site/(1-site);
- let pipsite_point=[
- (point1[0]+py*point2[0])/(1+py),
- (point1[1]+py*point2[1])/(1+py),
- (point1[2]+py*point2[2])/(1+py),
- ]
- this.actorpipsite.setPosition(pipsite_point);
- this.renderer.addActor(this.actorpipsite);
- this.renderWindow.render();
- }
-
- //移除所选择的巷道位置
- clearpipsite(){
- this.renderer.removeActor(this.actorpipsite);
- }
- waysInit(ways) {
- this.renderWindowWith.resize();
- this.ways = ways;
- this.ways.forEach((way) => {
- let nodes1 = [];
- let nodes2 = [];
- for (let index = 0; index < way.nrows.length - 1; index++) {
- nodes1.push(way.nrows[index]);
- }
- for (let index = 1; index < way.nrows.length; index++) {
- nodes2.push(way.nrows[index]);
- }
- for (let index = 0; index < nodes2.length; index++) {
- const lineSource = vtkLineSource.newInstance();
- let snode = nodes1[index];
- let enode = nodes2[index];
- let point1 = [parseFloat(snode.x), parseFloat(snode.y), parseFloat(snode.z)];
- let point2 = [parseFloat(enode.x), parseFloat(enode.y), parseFloat(enode.z)];
- lineSource.setPoint1(point1);
- lineSource.setPoint2(point2);
- lineSource.setResolution(12);
- const actor = vtkActor.newInstance();
- const mapper = vtkMapper.newInstance();
- actor.setMapper(mapper);
- actor.getProperty().setLineWidth(3);//设置线宽
- if(way.safety=="safety"){
- actor.getProperty().setColor(GREEN);
- }else if(way.safety=="danger"){
- actor.getProperty().setColor(REA);
- }
- const initialValues = {
- base: 0,
- center: point2,
- height: 9,
- radius: 5,
- resolution: 8,
- direction: [
- point2[0]-point1[0],
- point2[1]-point1[1],
- point2[2]-point1[2],
- ]
- };
- const vtk2d = vtkConeSource.newInstance(initialValues);
- const mapper2 = vtkMapper.newInstance();
- mapper2.setInputConnection(vtk2d.getOutputPort());
- const actor2 = vtkActor.newInstance();
- actor2.setMapper(mapper2);
- if(way.safety=="safety"){
- actor2.getProperty().setColor(GREEN);
- }else if(way.safety=="danger"){
- actor2.getProperty().setColor(REA);
- }
- this.wayActors.push(actor2);
- mapper.setInputConnection(lineSource.getOutputPort());
- this.wayActors.push(actor);
- }
- });
- this.wayActors.forEach((wayAcotor) => {
- this.renderer.addActor(wayAcotor);
- });
- // vtkmodel.renderer.resetCamera();
- vtkmodel.renderWindow.render();
- }
- initMode(rootContainer) {
- this.renderWindowWith = vtkGenericRenderWindow.newInstance();
- this.renderWindowWith.setContainer(rootContainer);
- this.renderer = this.renderWindowWith.getRenderer();
- this.renderer.setBackground(0.0, 0.0, 0.0, 0.0)
- this.renderWindow = this.renderWindowWith.getRenderWindow();
- //选取
- this.lastActor = null;
- this.nodeActors = []; //节点actor 数据
- this.pipeActors = []; //管道actor 数据
- this.interactor = this.renderer.getRenderWindow().getInteractor();
- this.apiSpecificRenderWindow = this.interactor.getView();
- this.hardwareSelector = this.apiSpecificRenderWindow.getSelector();
- this.hardwareSelector.setCaptureZValues(true);
- // this.hardwareSelector.setFieldAssociation(FieldAssociations.FIELD_ASSOCIATION_POINTS);
- this.hardwareSelector.setFieldAssociation(FieldAssociations.FIELD_ASSOCIATION_CELLS);
- // document.addEventListener("mousemove", throttleMouseHandler);
-
- document.addEventListener('contextmenu', throttleMouseHandler,function(e){
- e.preventDefault();
- // throttleMouseHandler
- })
-
-
-
- // //箭头
- this.arrowActors = [];
- // const viewColors = [
- // [1, 0, 0], // sagittal
- // [0, 1, 0], // coronal
- // [0, 0, 1], // axial
- // [0.5, 0.5, 0.5], // 3D
- // ];
- // // create axes
- // const axes = vtkAnnotatedCubeActor.newInstance();
- // axes.setDefaultStyle({
- // text: '+X',
- // fontStyle: 'bold',
- // fontFamily: 'Arial',
- // fontColor: 'black',
- // fontSizeScale: (res) => res / 2,
- // faceColor: createRGBStringFromRGBValues(viewColors[0]),
- // faceRotation: 0,
- // edgeThickness: 0.1,
- // edgeColor: 'black',
- // resolution: 400,
- // });
- // // axes.setXPlusFaceProperty({ text: '+X' });
- // axes.setXMinusFaceProperty({
- // text: '-X',
- // faceColor: createRGBStringFromRGBValues(viewColors[0]),
- // faceRotation: 90,
- // fontStyle: 'italic',
- // });
- // axes.setYPlusFaceProperty({
- // text: '+Y',
- // faceColor: createRGBStringFromRGBValues(viewColors[1]),
- // fontSizeScale: (res) => res / 4,
- // });
- // axes.setYMinusFaceProperty({
- // text: '-Y',
- // faceColor: createRGBStringFromRGBValues(viewColors[1]),
- // fontColor: 'white',
- // });
- // axes.setZPlusFaceProperty({
- // text: '+Z',
- // faceColor: createRGBStringFromRGBValues(viewColors[2]),
- // });
- // axes.setZMinusFaceProperty({
- // text: '-Z',
- // faceColor: createRGBStringFromRGBValues(viewColors[2]),
- // faceRotation: 45,
- // });
- // // const vtkAxesActor = vtkAxesActor.newInstance();
- // // create orientation widget
- // this.orientationWidget = vtkOrientationMarkerWidget.newInstance({
- // actor: axes,
- // interactor: this.renderWindow.getInteractor(),
- // });
- // this.orientationWidget.setEnabled(true);
- // this.orientationWidget.setViewportCorner(
- // vtkOrientationMarkerWidget.Corners.BOTTOM_LEFT
- // );
- // this.orientationWidget.setViewportSize(0.15);
- // this.orientationWidget.setMinPixelSize(100);
- // this.orientationWidget.setMaxPixelSize(300);
- }
- 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);
- };
- }
- //添加箭头
- addArrow(velocitys) {
- this.clearArrow();
- this.arrowActors = [];
- velocitys.forEach(velocity => {
- velocity.points.forEach(point => {
- // const initialValues = {
- // base:0,
- // shape: 'arrow4points',
- // center: [point.x,point.y,point.z],
- // direction:[
- // velocity.vector[2],
- // velocity.vector[0],
- // velocity.vector[1]
- // ],
- // height: 10.0,
- // thickness: 1.5,
- // width: 3,
- // };
- // const vtk2d = vtk2DShape.newInstance(initialValues);
- const initialValues = {
- // base: 0,
- center: [point.x, point.y, point.z],
- // height: 10,
- // radius: 3,
- // resolution: 6,
- height: 10.0,
- radius:2,
- resolution: 6,
- direction: [
- // velocity.vector[2],
- // velocity.vector[0],
- // velocity.vector[1]
- velocity.vector[0],
- velocity.vector[1],
- velocity.vector[2]
- ],
- capping: true,
- };
- const vtk2d = vtkConeSource.newInstance(initialValues);
- const mapper = vtkMapper.newInstance();
- mapper.setInputConnection(vtk2d.getOutputPort());
- const actor = vtkActor.newInstance();
- actor.setMapper(mapper);
- actor.getProperty().setColor(REA);
- this.arrowActors.push(actor);
- // this.renderer.addActor(actor);
- })
- });
- for (let index = 0; index < this.arrowActors.length; index=index+30) {
- let actor =this.arrowActors[index];
- this.renderer.addActor(actor);
- };
- this.renderWindow.render();
- }
- clearArrow() {
- if (this.arrowActors) {
- this.arrowActors.forEach(actor => {
- this.renderer.removeActor(actor);
- });
- }
- }
- modelInit(validNodes, pipes) {
- this.renderWindowWith.resize();
- this.validNodes = validNodes;
- this.pipes = pipes;
- this.modelCreate();
- }
- modelCreate() {
- console.log("modelInit..");
-
- const points = this.polyData.getPoints();
- const lines = this.polyData.getLines();
- //无节点actor
- this.validNodes.forEach((node) => {
- points.insertNextPoint(parseFloat(node.x), parseFloat(node.y), parseFloat(node.z));
- });
- //无管道actor
- this.pipes.forEach((pipe) => {
- let sid = this.indexIdByPipeNodeId(pipe.snId);
- let eid = this.indexIdByPipeNodeId(pipe.enId);
- lines.insertNextCell([sid, eid]);
- });
- //有节点actors
- const sphereSource = vtkSphereSource.newInstance({
- center: [0, 0, 0],
- radius: 4.0,
- });
- const mapper = vtkMapper.newInstance();
- mapper.setInputConnection(sphereSource.getOutputPort());
- this.validNodes.forEach((node) => {
- const actor = vtkActor.newInstance();
- actor.setMapper(mapper);
- actor.setPosition(parseFloat(node.x), parseFloat(node.y), parseFloat(node.z));
- actor.getProperty().setColor(WHITE);
- const nodeActor = {};
- nodeActor.node = node;
- nodeActor.actor = actor;
- this.nodeActors.push(nodeActor);
- });
- //有管道actors
- this.pipes.forEach((pipe) => {
- const lineSource = vtkLineSource.newInstance();
- let point1 = this.pointByPipeNodeId(pipe.snId);
- let point2 = this.pointByPipeNodeId(pipe.enId);
- lineSource.setPoint1(point1);
- lineSource.setPoint2(point2);
- lineSource.setResolution(12);
- const actor = vtkActor.newInstance();
- const mapper = vtkMapper.newInstance();
- actor.setMapper(mapper);
- actor.getProperty().setLineWidth(3);//设置线宽
- actor.getProperty().setColor(WHITE);
- mapper.setInputConnection(lineSource.getOutputPort());
- const pipeActor = {};
- pipeActor.pipe = pipe;
- pipeActor.actor = actor;
- this.pipeActors.push(pipeActor);
- });
- this.modelShow();
- this.renderer.resetCamera();
- const cam = this.renderer.getActiveCamera();
- console.log("透视或平行相机", cam.getParallelProjection());
- // cam.setParallelProjection(true);
- // console.log("透视或平行相机",cam.getParallelProjection());
- console.log("水平视角使用", cam.getUseHorizontalViewAngle());
- // cam.setUseHorizontalViewAngle(true);
- console.log("平行位置投影比例", cam.getParallelScale());
- // cam.setParallelScale(600);
- console.log("窗口中心位置", cam.getWindowCenter());//[0, 0]
- // cam.setWindowCenter([1,-1]);
- console.log("相机视角", cam.getViewAngle());//30
- // cam.setViewAngle(90);
- console.log("摄像头位置", cam.getPosition());//[495544.15625, 5403554.25, 9989.55990464236]
- // cam.setPosition(495544.15625, 5403554.25, 9989.55990464236);
- console.log("相机焦点", cam.getFocalPoint());// [495544.15625, 5403554.25, 467.62999725341797]
- // cam.setFocalPoint(495544.15625, 5403554.25, 467.62999725341797);
- console.log("相机方向", cam.getViewUp());//[0,1,0]
- // cam.setViewUp([0,1,1]);
- console.log("近远平面", cam.getClippingRange());// [9141.491986233214, 9913.53967078369]
- // cam.setClippingRange(9241.491986233214,9300.53967078369);
-
- //设置环境光和光照
- const light = vtkLight.newInstance();
- light.setColor(1.0, 1.0, 1.0); // 白色环境光
- light.setIntensity(3.0); // 强度为1.0
- this.renderer.addLight(light);
- // this.renderer.resetCamera();
- // cam.setPosition(0, 0, 9989);
- //相机焦点 495544.15625 5403554.25 467.62999725341797
- // cam.setPosition( 495544.15625+500, 5403554.25, 467.62999725341797);
- // cam.setPosition( 495544.15625-500, 5403554.25, 467.62999725341797);
- // cam.setViewUp([0,0,1]);
- // this.renderer.updateCamera();
- }
- modelClearShow() {
- this.renderer.removeActor(this.actor);
- this.renderer.removeActor(this.actor2);
- this.nodeActors.forEach((nodeActor) => {
- this.renderer.removeActor(nodeActor.actor);
- });
- this.pipeActors.forEach((pipeActor) => {
- this.renderer.removeActor(pipeActor.actor);
- });
- }
- wayClearShow(){
- this.wayActors.forEach((wayAcotor) => {
- this.renderer.removeActor(wayAcotor);
- });
- }
- modelShow() {
- this.modelClearShow();
-
- if (!this.isSelectNode) {//不选择节点
- this.renderer.addActor(this.actor2);
- }
- if (!this.isSelectPipe) {//不选择管道
- this.renderer.addActor(this.actor);
- }
- if (this.isSelectNode) {//选择节点
- this.nodeActors.forEach((nodeActor) => {
- this.renderer.addActor(nodeActor.actor);
- });
- }
- if (this.isSelectPipe) {//选择管道
- this.pipeActors.forEach((pipeActor) => {
- this.renderer.addActor(pipeActor.actor);
- });
- }
- // this.addjc(495530.903,5403828.821,432.40);
- // this.addpname(495530.903,5403829.821,432.40);
- // this.addSoure(495530.903,5403829.821,432.40);
- // this.addpname(495530.903,5403829.821,432.40);
- this.initPname();
- this.renderer.addActor(this.axesActor);
- // this.rotateY();
- }
- selectNodes() {
- this.isSelectNode = true;
- this.isSelectPipe = false;
- this.modelShow();
- document.addEventListener("mousemove", throttleMouseHandler);
- this.renderWindow.render();
- }
- selectPipes() {
- this.isSelectNode = false;
- this.isSelectPipe = true;
- document.addEventListener("mousemove", throttleMouseHandler);
- this.modelShow();
- this.renderWindow.render();
- }
- selectNoting() {
- this.isSelectNode = false;
- this.isSelectPipe = false;
- this.modelShow();
- this.renderWindow.render();
- }
- /**
- * 根据id 获取对应的编号
- */
- indexIdByPipeNodeId(nid) {
- for (let index = 0; index < this.validNodes.length; index++) {
- const node = this.validNodes[index];
- if (node.id == nid) {
- return index;
- }
- }
- return 0;
- }
- pipeByPid(pid) {
- console.log("pipeByPid",this.pipes.length)
- for (let index = 0; index < this.pipes.length; index++) {
- const pipe = this.pipes[index];
- if (pipe.id == pid) {
- return pipe;
- }
- }
- }
- pointByPipeNodeId(nid) {
- for (let index = 0; index < this.validNodes.length; index++) {
- const node = this.validNodes[index];
- if (node.id == nid) {
- return [parseFloat(node.x), parseFloat(node.y), parseFloat(node.z)];
- }
- }
- return 0;
- }
- clearAllShowGj() {
- this.renderer.addActor(this.gjActor);
- this.renderer.addActor(this.gjscalarBarActor);
- this.renderer.removeActor(this.jgActor);
- this.renderer.removeActor(this.scalarBarActor);
- this.isSelectNode = false;
- this.isSelectPipe = false;
- this.wayClearShow();
- this.modelClearShow();
- this.isJg = true; //显示结果
- document.removeEventListener("mousemove", throttleMouseHandler);
- }
- clearModeAddJg() {
- this.renderer.addActor(this.jgActor);
- this.renderer.addActor(this.scalarBarActor);
- this.isSelectNode = false;
- this.isSelectPipe = false;
- this.renderer.removeActor(this.gjActor);
- this.renderer.removeActor(this.gjscalarBarActor)
- this.wayClearShow();
- this.modelClearShow();
- this.isJg = true; //显示结果
- document.removeEventListener("mousemove", throttleMouseHandler);
- }
- clearJgAddMode() {
- this.renderer.removeActor(this.scalarBarActor);
- this.renderer.removeActor(this.jgActor);
- this.renderer.removeActor(this.gjActor);
- this.renderer.removeActor(this.gjscalarBarActor)
- this.clearArrow();
- this.modelShow();
- this.wayClearShow();
- this.isJg = false; //不显示结果
- }
- clearAll() {
- this.renderer.removeActor(this.jgActor);
- this.renderer.removeActor(this.scalarBarActor);
- this.renderer.removeActor(this.gjActor);
- this.renderer.removeActor(this.gjscalarBarActor)
- this.clearArrow();
- this.modelClearShow();
- this.wayClearShow();
- this.renderWindow.render();
- }
- //选中指定点
- selectByNodeId(nid) {
- console.log("selectByNodeId", nid);
- if (this.isSelectNode) {
- if (this.lastActor != null) {
- this.lastActor.getProperty().setColor(WHITE);
- }
- this.nodeActors.forEach(nodeActor => {
- if (nid == nodeActor.node.id) {
- nodeActor.actor.getProperty().setColor(GREEN);
- this.renderWindow.render();
- this.lastActor = nodeActor.actor;
- this.selectObj = nodeActor.node;
- return;
- }
- });
- }
- }
- //选中指定管道
- selectByPipeId(pid) {
- console.log("selectByPipeId", pid);
- if (this.isSelectPipe) {
- if (this.lastActor != null) {
- this.lastActor.getProperty().setColor(WHITE);
- }
- this.pipeActors.forEach(pipeActor => {
- if (pid == pipeActor.pipe.id) {
- pipeActor.actor.getProperty().setColor(GREEN);
- this.renderWindow.render();
- this.lastActor = pipeActor.actor;
- this.selectObj = pipeActor.node;
- return;
- }
- });
- }
- }
- }
- function createRGBStringFromRGBValues(rgb) {
- if (rgb.length !== 3) {
- return 'rgb(0, 0, 0)';
- }
- return `rgb(${(rgb[0] * 255).toString()}, ${(rgb[1] * 255).toString()}, ${(
- rgb[2] * 255
- ).toString()})`;
- }
- function pickOnMouseEvent(event) {
- if (vtkmodel.interactor.isAnimating()) {
- // We should not do picking when interacting with the scene
- return;
- }
- const [x, y] = eventToWindowXY(event);
- // console.log([x,y]);
- // if(!vtkmodel.getPointData){//没有数据
- // return ;
- // }
- // console.log(vtkmodel.hardwareSelector.getPointData());
- // if(!vtkmodel.renderer.getActors().size==0){
- // return;
- // }
- vtkmodel.hardwareSelector
- .getSourceDataAsync(vtkmodel.renderer, x, y, x, y)
- .then((result) => {
- if (result) {
- processSelections(result.generateSelection(x, y, x, y));
- // processSelections(result.generateSelection(x, y, x, y));
- } else {
- // processSelections(null);
- }
- });
- }
- function eventToWindowXY(event) {
- // We know we are full screen => window.innerXXX
- // Otherwise we can use pixel device ratio or else...
- var left = event.pageX ;
- var top = event.pageY ;
- vtkmodel.epageX=left;
- vtkmodel.epageY=top;
- const { clientX, clientY } = event;
- const [width, height] = vtkmodel.apiSpecificRenderWindow.getSize();
- const x = Math.round((width * clientX) / window.innerWidth);
- const y = Math.round(height * (1 - clientY / window.innerHeight)); // Need to flip Y
- // console.log(x,y)
- return [x, y];
- }
- function processSelections(selections) {
- if (!selections || selections.length === 0) {//没有选择
- if (vtkmodel.lastActor == null) {
- } else {
- // vtkmodel.lastActor.getProperty().setColor(WHITE);
- // vtkmodel.renderWindow.render();
- }
- // vtkmodel.lastActor = null;
- return;
- }
- const {
- worldPosition: rayHitWorldPosition,
- compositeID,
- prop,
- propID,
- attributeID,
- } = selections[0].getProperties();
- if (vtkmodel.lastActor != null) {
- vtkmodel.lastActor.getProperty().setColor(WHITE);
- vtkmodel.renderWindow.render();
- }
- vtkmodel.nodeActors.forEach((nodeActor) => {
- if (prop == nodeActor.actor) {
- vtkmodel.selectObj = nodeActor.node;
- prop.getProperty().setColor(GREEN);
- vtkmodel.lastActor = prop;
- // console.log(vtkmodel.selectObj );
- }
- });
- vtkmodel.pipeActors.forEach((pipeActor) => {
- if (prop == pipeActor.actor) {
- vtkmodel.selectObj = pipeActor.pipe;
- prop.getProperty().setColor(GREEN);
- vtkmodel.lastActor = prop;
- // console.log(vtkmodel.selectObj );
- }
- });
- if (vtkmodel.isJg) {//结果数据选择cell
- if (vtkmodel.hardwareSelector.getFieldAssociation() ===
- FieldAssociations.FIELD_ASSOCIATION_POINTS) {//选择点
- } else {
- //选择Cell
- const input = prop.getMapper().getInputData();
- if (!input.getCells()) {
- input.buildCells();
- // return;
- }
- const cellPoints = input.getCellPoints(attributeID);
- if (cellPoints) {
- const pointIds = cellPoints.cellPointIds;
- // Find the closest cell point, and use that as cursor position
- const points = Array.from(pointIds).map((pointId) =>
- input.getPoints().getPoint(pointId)
- );
- const scalarDataArray = input.getPointData().getScalars().getData();
- console.log(scalarDataArray[pointIds[0]]);//节点标量数据
-
- // pointIds.forEach(pointId=>{
- // console.log(input.getPointData().getScalars().getName());
- // console.log(scalarDataArray[pointId]);//节点标量数据
- // });
- vtkmodel.selectJgPointId = pointIds[0];
- }
- }
- } else {
- vtkmodel.renderWindow.render();
- }
- }
- // 异步函数,用于读取JS文件并转换为ArrayBuffer
- async function fetchJSFileAsArrayBuffer(url) {
- try {
- // 使用fetch API异步加载JS文件
- const response = await fetch(url, {
- method: 'GET',
- responseType: 'arraybuffer' // 指定响应类型为arraybuffer
- });
- // 确保响应成功
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
- // 获取ArrayBuffer对象
- const arrayBuffer = await response.arrayBuffer();
- // 可选:验证转换后的ArrayBuffer内容
- const decoder = new TextDecoder(); // 使用TextDecoder将ArrayBuffer解码为字符串
- const content = decoder.decode(arrayBuffer);
- // console.log('File content:', content);
- return arrayBuffer;
- } catch (error) {
- console.error('Error fetching the file:', error);
- throw error; // 重新抛出错误以便上层处理
- }
- }
- const throttleMouseHandler = throttle(pickOnMouseEvent, 20);
- const WHITE = [1, 0.2, 1];
- const GREEN = [0.1, 0.8, 0.1];
- const REA = [1, 0, 0];
- const JCDCOLOR = [0.5, 0, 0];
- const SOURECOLOR = [0.5, 0.5, 0];
- const TEXTCOLOR = [1, 1, 1];
- const vtkmodel = new VtkModel();
- export { vtkmodel };
|