|  | @@ -57,6 +57,7 @@ export class VtkModel {
 | 
	
		
			
				|  |  |      this.isSelectPipe = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      this.isSelectSensor = false;
 | 
	
		
			
				|  |  | +    this.isSelectJC = false;
 | 
	
		
			
				|  |  |      //管道节点选择对象
 | 
	
		
			
				|  |  |      this.selectObj = null;
 | 
	
		
			
				|  |  |      //X,Y
 | 
	
	
		
			
				|  | @@ -343,11 +344,11 @@ delpump(){
 | 
	
		
			
				|  |  |    this.removepump();
 | 
	
		
			
				|  |  |    this.pmpActors=[];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -addSensor(pid,site){
 | 
	
		
			
				|  |  | -  let pipe =this.pipeByPid(pid,site);
 | 
	
		
			
				|  |  | +addSensor(val){
 | 
	
		
			
				|  |  | +  let pipe =this.pipeByPid(val.pid,val.site);
 | 
	
		
			
				|  |  |    let point1 = this.pointByPipeNodeId(pipe.snId);
 | 
	
		
			
				|  |  |    let point2 = this.pointByPipeNodeId(pipe.enId);
 | 
	
		
			
				|  |  | -  let py = site/(1-site);
 | 
	
		
			
				|  |  | +  let py = val.site/(1-val.site);
 | 
	
		
			
				|  |  |    let pipsite_point=[
 | 
	
		
			
				|  |  |      (point1[0]+py*point2[0])/(1+py),
 | 
	
		
			
				|  |  |      (point1[1]+py*point2[1])/(1+py),
 | 
	
	
		
			
				|  | @@ -364,7 +365,8 @@ addSensor(pid,site){
 | 
	
		
			
				|  |  |      // actor.rotateY(90);// 绕y轴旋转
 | 
	
		
			
				|  |  |      //  存储传感器信息(结构化存储)
 | 
	
		
			
				|  |  |      const sensor = {
 | 
	
		
			
				|  |  | -      id: pid,
 | 
	
		
			
				|  |  | +      id: val.seid,
 | 
	
		
			
				|  |  | +      info: val,
 | 
	
		
			
				|  |  |        actor: actor,      // VTK Actor对象
 | 
	
		
			
				|  |  |     };
 | 
	
		
			
				|  |  |      this.cgqActors.push(sensor);
 | 
	
	
		
			
				|  | @@ -442,10 +444,10 @@ initCheckNodes(checkNodes){
 | 
	
		
			
				|  |  |        (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]);
 | 
	
		
			
				|  |  | +    this.initjc(checkNode,pipsite_point[0],pipsite_point[1],pipsite_point[2]);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -initjc(x,y,z) {
 | 
	
		
			
				|  |  | +initjc(info,x,y,z) {
 | 
	
		
			
				|  |  |    const mapper = vtkMapper.newInstance();
 | 
	
		
			
				|  |  |    mapper.setInputConnection(this.jcreader.getOutputPort());
 | 
	
		
			
				|  |  |    const actor = vtkActor.newInstance();
 | 
	
	
		
			
				|  | @@ -453,20 +455,25 @@ initjc(x,y,z) {
 | 
	
		
			
				|  |  |    actor.getProperty().setColor(JCDCOLOR);
 | 
	
		
			
				|  |  |    actor.setMapper(mapper);
 | 
	
		
			
				|  |  |    actor.setScale(0.2,0.2,0.2);//放大
 | 
	
		
			
				|  |  | -  this.jcdActors.push(actor);
 | 
	
		
			
				|  |  | +  const jc = {
 | 
	
		
			
				|  |  | +    id: info.cid,
 | 
	
		
			
				|  |  | +    info: info ,
 | 
	
		
			
				|  |  | +    actor: actor,
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  this.jcdActors.push(jc);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  //显示监测点
 | 
	
		
			
				|  |  |  showjc(){
 | 
	
		
			
				|  |  | -  this.jcdActors.forEach((actor)=>{
 | 
	
		
			
				|  |  | +  this.jcdActors.forEach((jc) => {
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    this.renderer.addActor(actor);
 | 
	
		
			
				|  |  | +    this.renderer.addActor(jc.actor);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    this.renderWindow.render();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  //隐藏监测点
 | 
	
		
			
				|  |  |  removejc(){
 | 
	
		
			
				|  |  | -  this.jcdActors.forEach((actor)=>{
 | 
	
		
			
				|  |  | -    this.renderer.removeActor(actor);
 | 
	
		
			
				|  |  | +  this.jcdActors.forEach((jc) => {
 | 
	
		
			
				|  |  | +    this.renderer.removeActor(jc.actor);
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    this.renderWindow.render();
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -972,6 +979,10 @@ safetypathremove(){
 | 
	
		
			
				|  |  |      this.cgqActors.forEach((sensor) => {
 | 
	
		
			
				|  |  |        this.renderer.removeActor(sensor.actor);
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | +    this.jcdActors.forEach((jc) => {
 | 
	
		
			
				|  |  | +      this.renderer.removeActor(jc.actor);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    wayClearShow(){
 | 
	
		
			
				|  |  |      this.wayActors.forEach((wayAcotor) => {
 | 
	
	
		
			
				|  | @@ -1002,6 +1013,11 @@ safetypathremove(){
 | 
	
		
			
				|  |  |          this.renderer.addActor(sensor.actor);
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    if(this.isSelectJC) {
 | 
	
		
			
				|  |  | +      this.jcdActors.forEach((jc) => {
 | 
	
		
			
				|  |  | +        this.renderer.addActor(jc.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);
 | 
	
	
		
			
				|  | @@ -1016,6 +1032,7 @@ safetypathremove(){
 | 
	
		
			
				|  |  |      this.isSelectNode = true;
 | 
	
		
			
				|  |  |      this.isSelectPipe = false;
 | 
	
		
			
				|  |  |      this.isSelectSensor = false;
 | 
	
		
			
				|  |  | +    this.isSelectJC = false;
 | 
	
		
			
				|  |  |      this.modelShow();
 | 
	
		
			
				|  |  |      document.addEventListener("mousemove", throttleMouseHandler);
 | 
	
		
			
				|  |  |      this.renderWindow.render();
 | 
	
	
		
			
				|  | @@ -1024,6 +1041,7 @@ safetypathremove(){
 | 
	
		
			
				|  |  |      this.isSelectNode = false;
 | 
	
		
			
				|  |  |      this.isSelectPipe = true;
 | 
	
		
			
				|  |  |      this.isSelectSensor = false;
 | 
	
		
			
				|  |  | +    this.isSelectJC = false;
 | 
	
		
			
				|  |  |       document.addEventListener("mousemove", throttleMouseHandler);
 | 
	
		
			
				|  |  |      this.modelShow();
 | 
	
		
			
				|  |  |      this.renderWindow.render();
 | 
	
	
		
			
				|  | @@ -1032,6 +1050,16 @@ safetypathremove(){
 | 
	
		
			
				|  |  |      this.isSelectNode = false;
 | 
	
		
			
				|  |  |      this.isSelectPipe = false;
 | 
	
		
			
				|  |  |      this.isSelectSensor = true;
 | 
	
		
			
				|  |  | +    this.isSelectJC = false;
 | 
	
		
			
				|  |  | +     document.addEventListener("mousemove", throttleMouseHandler);
 | 
	
		
			
				|  |  | +    this.modelShow();
 | 
	
		
			
				|  |  | +    this.renderWindow.render();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  selectJCs() {
 | 
	
		
			
				|  |  | +    this.isSelectNode = false;
 | 
	
		
			
				|  |  | +    this.isSelectPipe = false;
 | 
	
		
			
				|  |  | +    this.isSelectSensor = false;
 | 
	
		
			
				|  |  | +    this.isSelectJC = true;
 | 
	
		
			
				|  |  |       document.addEventListener("mousemove", throttleMouseHandler);
 | 
	
		
			
				|  |  |      this.modelShow();
 | 
	
		
			
				|  |  |      this.renderWindow.render();
 | 
	
	
		
			
				|  | @@ -1040,6 +1068,9 @@ safetypathremove(){
 | 
	
		
			
				|  |  |      this.isSelectNode = false;
 | 
	
		
			
				|  |  |      this.isSelectPipe = false;
 | 
	
		
			
				|  |  |      this.isSelectSensor = false;
 | 
	
		
			
				|  |  | +    this.isSelectJC = false;
 | 
	
		
			
				|  |  | +    this.selectObj = null;
 | 
	
		
			
				|  |  | +    document.removeEventListener("mousemove", throttleMouseHandler);
 | 
	
		
			
				|  |  |      this.modelShow();
 | 
	
		
			
				|  |  |      this.renderWindow.render();
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -1164,34 +1195,83 @@ safetypathremove(){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // 选中指定传感器
 | 
	
		
			
				|  |  |    selectBySensorId(sid) {
 | 
	
		
			
				|  |  | -    console.log("selectBySensorId", sid);
 | 
	
		
			
				|  |  | +    console.log("[selectBySensorId] Selecting sensor:", sid);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 1. 清除上一次选中的 Actor(严格检查)
 | 
	
		
			
				|  |  | +    if (this.lastActor) {
 | 
	
		
			
				|  |  | +      // console.log("Last actor to remove:", this.lastActor);
 | 
	
		
			
				|  |  | +      const currentActors = this.renderer.getActors();
 | 
	
		
			
				|  |  | +      if (currentActors.includes(this.lastActor)) {
 | 
	
		
			
				|  |  | +        this.renderer.removeActor(this.lastActor);
 | 
	
		
			
				|  |  | +        // console.log("Actor removed. Current actors:", this.renderer.getActors());
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        // console.log("LastActor not found in renderer.");
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.renderWindow.render(); // 强制刷新
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 1. 清除上一次选中的 Actor(如果有)
 | 
	
		
			
				|  |  | -    console.log("Last actor before remove:", this.lastActor);
 | 
	
		
			
				|  |  | -    if (this.lastActor != null) {
 | 
	
		
			
				|  |  | -      console.log("Removing actor:", this.lastActor);
 | 
	
		
			
				|  |  | -      this.renderer.removeActor(this.lastActor);
 | 
	
		
			
				|  |  | +    // 2. 查找目标传感器
 | 
	
		
			
				|  |  | +    const targetSensor = this.cgqActors.find(sensor => sid === sensor.id);
 | 
	
		
			
				|  |  | +    if (!targetSensor) {
 | 
	
		
			
				|  |  | +      console.error(`Sensor ${sid} not found!`);
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 遍历传感器数组,查找匹配的传感器
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    this.cgqActors.forEach(sensor => {
 | 
	
		
			
				|  |  | -      if (sid === sensor.id) { 
 | 
	
		
			
				|  |  | -        // 3. 设置选中颜色
 | 
	
		
			
				|  |  | -        sensor.actor.getProperty().setColor(REA);
 | 
	
		
			
				|  |  | -        console.log("找到了")
 | 
	
		
			
				|  |  | -        // 4. 记录当前选中的 Actor 和传感器对象
 | 
	
		
			
				|  |  | -        this.lastActor = sensor.actor;
 | 
	
		
			
				|  |  | -        this.selectObj = { id: sid, type: "sensor" }; // 存储选中对象信息
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | -        // 5. 重新添加 Actor 并渲染
 | 
	
		
			
				|  |  | -        this.renderer.addActor(this.lastActor);
 | 
	
		
			
				|  |  | -        this.renderWindow.render();
 | 
	
		
			
				|  |  | -        return; // 找到后退出循环
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | +    // 3. 确保 targetSensor.actor 不在渲染器中(避免重复添加)
 | 
	
		
			
				|  |  | +    const currentActors = this.renderer.getActors();
 | 
	
		
			
				|  |  | +    if (!currentActors.includes(targetSensor.actor)) {
 | 
	
		
			
				|  |  | +      this.renderer.addActor(targetSensor.actor);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 4. 高亮选中
 | 
	
		
			
				|  |  | +    targetSensor.actor.getProperty().setColor(CYAN);
 | 
	
		
			
				|  |  | +    this.lastActor = targetSensor.actor; // 更新引用
 | 
	
		
			
				|  |  | +    this.selectObj = targetSensor.info;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 5. 触发渲染
 | 
	
		
			
				|  |  | +    this.renderWindow.render();
 | 
	
		
			
				|  |  | +    // console.log(`Sensor ${sid} selected. Current actors:`, this.renderer.getActors());
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  // 选中指定监测点
 | 
	
		
			
				|  |  | +  selectByJCId(cid) {
 | 
	
		
			
				|  |  | +    console.log("Selecting JC:", cid);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 1. 清除上一次选中的 Actor(严格检查)
 | 
	
		
			
				|  |  | +    if (this.lastActor) {
 | 
	
		
			
				|  |  | +      // console.log("Last actor to remove:", this.lastActor);
 | 
	
		
			
				|  |  | +      const currentActors = this.renderer.getActors();
 | 
	
		
			
				|  |  | +      if (currentActors.includes(this.lastActor)) {
 | 
	
		
			
				|  |  | +        this.renderer.removeActor(this.lastActor);
 | 
	
		
			
				|  |  | +        // console.log("Actor removed. Current actors:", this.renderer.getActors());
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        // console.log("LastActor not found in renderer.");
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.renderWindow.render(); // 强制刷新
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 2. 查找目标传感器
 | 
	
		
			
				|  |  | +    const targetSensor = this.jcdActors.find(jc => cid === jc.id);
 | 
	
		
			
				|  |  | +    if (!targetSensor) {
 | 
	
		
			
				|  |  | +      console.error(`JC ${cid} not found!`);
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 3. 确保 targetSensor.actor 不在渲染器中(避免重复添加)
 | 
	
		
			
				|  |  | +    const currentActors = this.renderer.getActors();
 | 
	
		
			
				|  |  | +    if (!currentActors.includes(targetSensor.actor)) {
 | 
	
		
			
				|  |  | +      this.renderer.addActor(targetSensor.actor);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 4. 高亮选中
 | 
	
		
			
				|  |  | +    targetSensor.actor.getProperty().setColor(BROWN);
 | 
	
		
			
				|  |  | +    this.lastActor = targetSensor.actor; // 更新引用
 | 
	
		
			
				|  |  | +    this.selectObj = targetSensor.info;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 5. 触发渲染
 | 
	
		
			
				|  |  | +    this.renderWindow.render();
 | 
	
		
			
				|  |  | +    // console.log(`Sensor ${sid} selected. Current actors:`, this.renderer.getActors());
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  function createRGBStringFromRGBValues(rgb) {
 | 
	
	
		
			
				|  | @@ -1264,7 +1344,16 @@ function processSelections(selections) {
 | 
	
		
			
				|  |  |      attributeID,
 | 
	
		
			
				|  |  |    } = selections[0].getProperties();
 | 
	
		
			
				|  |  |    if (vtkmodel.lastActor != null) {
 | 
	
		
			
				|  |  | -    vtkmodel.lastActor.getProperty().setColor(WHITE);
 | 
	
		
			
				|  |  | +    const lastSensor = vtkmodel.cgqActors.find(s => s.actor === vtkmodel.lastActor);
 | 
	
		
			
				|  |  | +    const lastJC = vtkmodel.jcdActors.find(j => j.actor === vtkmodel.lastActor);
 | 
	
		
			
				|  |  | +    if(lastSensor){
 | 
	
		
			
				|  |  | +      vtkmodel.lastActor.getProperty().setColor(SOURECOLOR);
 | 
	
		
			
				|  |  | +    }else if(lastJC){
 | 
	
		
			
				|  |  | +      vtkmodel.lastActor.getProperty().setColor(JCDCOLOR);
 | 
	
		
			
				|  |  | +    }else {
 | 
	
		
			
				|  |  | +      vtkmodel.lastActor.getProperty().setColor(WHITE);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      vtkmodel.renderWindow.render();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    vtkmodel.nodeActors.forEach((nodeActor) => {
 | 
	
	
		
			
				|  | @@ -1284,6 +1373,24 @@ function processSelections(selections) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  vtkmodel.cgqActors.forEach((sensor) => {
 | 
	
		
			
				|  |  | +    if (prop == sensor.actor) {
 | 
	
		
			
				|  |  | +      vtkmodel.selectObj = sensor.info;
 | 
	
		
			
				|  |  | +      prop.getProperty().setColor(REA);
 | 
	
		
			
				|  |  | +      vtkmodel.lastActor = prop;
 | 
	
		
			
				|  |  | +      // console.log(vtkmodel.selectObj );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  vtkmodel.jcdActors.forEach((jc) => {
 | 
	
		
			
				|  |  | +    if (prop == jc.actor) {
 | 
	
		
			
				|  |  | +      vtkmodel.selectObj = jc.info;
 | 
	
		
			
				|  |  | +      prop.getProperty().setColor(REA);
 | 
	
		
			
				|  |  | +      vtkmodel.lastActor = prop;
 | 
	
		
			
				|  |  | +      // console.log(vtkmodel.selectObj );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if (vtkmodel.isJg) {//结果数据选择cell
 | 
	
		
			
				|  |  |      if (vtkmodel.hardwareSelector.getFieldAssociation() ===
 | 
	
		
			
				|  |  |        FieldAssociations.FIELD_ASSOCIATION_POINTS) {//选择点
 | 
	
	
		
			
				|  | @@ -1354,6 +1461,11 @@ 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 YELLOW  = [1, 1, 0];
 | 
	
		
			
				|  |  | +const CYAN    = [0, 1, 1];
 | 
	
		
			
				|  |  | +const MAGENTA = [1, 0, 1];
 | 
	
		
			
				|  |  | +const GRAY    = [0.5, 0.5, 0.5];
 | 
	
		
			
				|  |  | +const BROWN      = [0.6, 0.4, 0.2];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const JCDCOLOR = [0.5, 0.2, 0.1];
 | 
	
		
			
				|  |  |  const SOURECOLOR = [0.2, 0.5, 0];
 |