xzw 1 year ago
parent
commit
ad46995515

+ 8 - 7
src/custom/materials/postprocessing/OutlinePass.js

@@ -91,7 +91,12 @@ let OutlinePass = function ( selectedObjects ) {
  
  
 	this.textureMatrix = new THREE.Matrix4();
 	this.textureMatrix = new THREE.Matrix4();
 
 
-	
+	viewer.addEventListener('viewerResize',(e)=>{
+        let size = viewer.renderer.getSize(new THREE.Vector2)
+        this.renderTargetEdgeBuffer1.setSize(size.x, size.y );
+		this.renderTargetMaskBuffer.setSize(size.x, size.y); 
+        this.resolution.set(size.x, size.y)  
+    })
 
 
 };
 };
 
 
@@ -115,12 +120,8 @@ OutlinePass.prototype = Object.assign( Object.create(  Pass.prototype ), {
 
 
 	},
 	},
 	setSize: function ( width, height ) {
 	setSize: function ( width, height ) {
-         
-        this.renderTargetEdgeBuffer1.setSize( width, height );
-		this.renderTargetMaskBuffer.setSize( width, height ); 
-        this.resolution.set(width,height) 
-
-	},
+          
+	}, 
 
 
 	changeVisibilityOfSelectedObjects: function ( bVisible ) {
 	changeVisibilityOfSelectedObjects: function ( bVisible ) {
 
 

+ 40 - 12
src/custom/modules/mergeModel/MergeEditor.js

@@ -54,6 +54,30 @@ let MergeEditor = {
     SplitScreen : new SplitScreen(),
     SplitScreen : new SplitScreen(),
     
     
     init(){  
     init(){  
+    
+    
+        this.history = new History({ 
+            applyData: (data)=>{ 
+                if(data.object.parent && data.object == this.selected){
+                    data = Potree.Common.CloneObject(data) //避免使用后更改数据又被使用 
+                    data.matrix.decompose( data.object.position, data.object.quaternion, data.object.scale );
+                    data.object.dispatchEvent('changeByHistory') 
+                    data.object.dispatchEvent('transformChanged')                    
+                    viewer.dispatchEvent('content_changed')
+                    
+                    return true
+                }  
+            },
+            getData:(object)=>{   
+                return {
+                    object,
+                    matrix:  object.matrixWorld.clone()
+                }
+            } 
+        })  
+        
+    
+        
         { 
         { 
         
         
             Potree.settings.notAdditiveBlending = true
             Potree.settings.notAdditiveBlending = true
@@ -96,7 +120,7 @@ let MergeEditor = {
             this.transformControls2 = new TransformControls(viewer.mainViewport.camera, viewer.renderArea,{ 
             this.transformControls2 = new TransformControls(viewer.mainViewport.camera, viewer.renderArea,{ 
                 dontHideWhenFaceCamera: true,
                 dontHideWhenFaceCamera: true,
             }); 
             }); 
-            this.transformControls.setSize(1.5)
+            this.transformControls2.setSize(1.5)
             viewer.scene.scene.add(this.transformControls2) 
             viewer.scene.scene.add(this.transformControls2) 
             Potree.Utils.setObjectLayers(this.transformControls2, 'layer2' )  
             Potree.Utils.setObjectLayers(this.transformControls2, 'layer2' )  
              
              
@@ -117,6 +141,16 @@ let MergeEditor = {
             this.transformControls2.addEventListener('mouseUp',mouseUp)
             this.transformControls2.addEventListener('mouseUp',mouseUp)
             
             
             
             
+            
+            
+            
+            this.transformControls.addEventListener('mouseDown', ()=>{ //dragstart
+                this.history.beforeChange(this.selected)
+            })  
+            this.transformControls.addEventListener('transform_end',()=>{
+                this.history.afterChange(this.selected)
+            })
+
         }
         }
         
         
         
         
@@ -386,17 +420,7 @@ let MergeEditor = {
         this.transformState = state  
         this.transformState = state  
         this.clearTranCursor()       
         this.clearTranCursor()       
     },
     },
-    
-  
-    
-    //---------------------------
-    
-    /* writeToHistory(content){ 
-        if(!this.prepareRecord)return;
-        this.prepareRecord = false
-        this.history.push(content)
-    }, */
-    
+     
     //---------------------------
     //---------------------------
     
     
     getAllObjects(){
     getAllObjects(){
@@ -469,6 +493,10 @@ let MergeEditor = {
             model.dispatchEvent({type:'changeSelect', selected : state})
             model.dispatchEvent({type:'changeSelect', selected : state})
         }
         }
         
         
+         
+
+        
+        
     },
     },
     
     
     
     

+ 3 - 2
src/custom/modules/siteModel/BuildingBox.js

@@ -170,7 +170,7 @@ export class BuildingBox extends ctrlPolygon{//建筑实体,包括building, fl
     intersectPointcloudVolume(pointcloud){//和pointcloud的重叠体积
     intersectPointcloudVolume(pointcloud){//和pointcloud的重叠体积
         return this.intersectPointcloudArea(pointcloud) * this.coverPointcloudHeight(pointcloud)
         return this.intersectPointcloudArea(pointcloud) * this.coverPointcloudHeight(pointcloud)
     }
     }
-     
+      
     
     
     coverPointcloudHeight(pointcloud, getPercent){
     coverPointcloudHeight(pointcloud, getPercent){
         let bound2 = pointcloud.bound;
         let bound2 = pointcloud.bound;
@@ -418,11 +418,12 @@ export class BuildingBox extends ctrlPolygon{//建筑实体,包括building, fl
                 })
                 })
             }
             }
             let drag = (e) => {
             let drag = (e) => {
+                this.dispatchEvent('startDragging')
                 let index = this.midMarkers.indexOf(marker)
                 let index = this.midMarkers.indexOf(marker)
                 let newMarker = this.addMarker({index:(index+1), point:marker.position.clone()  }) 
                 let newMarker = this.addMarker({index:(index+1), point:marker.position.clone()  }) 
                 this.addMidMarker(index+1, new THREE.Vector3 )
                 this.addMidMarker(index+1, new THREE.Vector3 )
                 this.updateTwoMidMarker(index+1) 
                 this.updateTwoMidMarker(index+1) 
-                this.setMarkerSelected(marker, 'unhover') 
+                this.setMarkerSelected(marker, 'unhover')  
                 viewer.inputHandler.startDragging(newMarker , {/* dragViewport:viewer.mapViewer.viewports[0],  */   } ); //notPressMouse代表不是通过按下鼠标来拖拽.  dragViewport指定了只能在地图上拖拽
                 viewer.inputHandler.startDragging(newMarker , {/* dragViewport:viewer.mapViewer.viewports[0],  */   } ); //notPressMouse代表不是通过按下鼠标来拖拽.  dragViewport指定了只能在地图上拖拽
             } 
             } 
             marker.addEventListener('drag', drag );  
             marker.addEventListener('drag', drag );  

+ 34 - 15
src/custom/modules/siteModel/SiteModel.js

@@ -43,21 +43,23 @@ var SiteModel = {
         
         
         this.history = new History({ 
         this.history = new History({ 
             applyData: (data)=>{ 
             applyData: (data)=>{ 
-                if(data.entity.parent && data.entity.visible){
+                if(data.entity.parent && data.entity.selected ){
                     data = Potree.Common.CloneObject(data) //避免使用后更改数据又被使用
                     data = Potree.Common.CloneObject(data) //避免使用后更改数据又被使用
                     data.entity.reDraw() 
                     data.entity.reDraw() 
                     data.entity.initData(data) 
                     data.entity.initData(data) 
-                    data.entity.addMidMarkers()
+                    data.isNew || data.entity.addMidMarkers()
+                    data.entity.isNew = data.isNew
                     data.entity.dispatchEvent('changeByHistory') 
                     data.entity.dispatchEvent('changeByHistory') 
                     return true
                     return true
                 }  
                 }  
             },
             },
             getData:(entity)=>{  
             getData:(entity)=>{  
-                if(entity.isNew)return
+                //if(entity.isNew)return
                 return {
                 return {
                     entity, 
                     entity, 
                     points: entity.points.map(e=>e.clone()),
                     points: entity.points.map(e=>e.clone()),
-                    ifDraw: true
+                    ifDraw: true,
+                    isNew : entity.isNew,
                 }
                 }
             } 
             } 
         })  
         })  
@@ -322,7 +324,7 @@ var SiteModel = {
     
     
     
     
     startInsertion:function(buildType, parent, sid, name, callback, cancelFun){
     startInsertion:function(buildType, parent, sid, name, callback, cancelFun){
-        
+         
         let zMin, zMax, entity, resume 
         let zMin, zMax, entity, resume 
         let mapViewport = viewer.mapViewer.viewports[0]
         let mapViewport = viewer.mapViewer.viewports[0]
          
          
@@ -335,7 +337,7 @@ var SiteModel = {
             entity.reDraw(0)
             entity.reDraw(0)
             entity.isNew = true //当作新的来画
             entity.isNew = true //当作新的来画
         }
         }
-        
+ 
         if(!resume){
         if(!resume){
             if(buildType == 'hole' || buildType == 'room'){
             if(buildType == 'hole' || buildType == 'room'){
                 zMin = parent.zMin
                 zMin = parent.zMin
@@ -388,9 +390,10 @@ var SiteModel = {
         
         
          
          
         let endDragFun = (e) => {  
         let endDragFun = (e) => {  
-            if (e.button == THREE.MOUSE.LEFT ) { 
+            if (e.button == THREE.MOUSE.LEFT ) {
+                this.history.beforeChange(entity)        
                 var marker = entity.addMarker({point:entity.points[entity.points.length - 1].clone()})
                 var marker = entity.addMarker({point:entity.points[entity.points.length - 1].clone()})
-                   
+                this.history.afterChange(entity)   
                 //entity.editStateChange(true) //重新激活reticule状态
                 //entity.editStateChange(true) //重新激活reticule状态
                 entity.continueDrag(marker, e)  
                 entity.continueDrag(marker, e)  
             } else if (e.button === THREE.MOUSE.RIGHT ) {
             } else if (e.button === THREE.MOUSE.RIGHT ) {
@@ -465,8 +468,7 @@ var SiteModel = {
         };
         };
 
 
         
         
-        let Exit = (e)=>{ //强制结束
-         
+        let Exit = (e)=>{ //强制结束        
             entity.removeEventListener('unselect', Exit);
             entity.removeEventListener('unselect', Exit);
             
             
             if(viewer.inputHandler.drag){//还未触发drop的话
             if(viewer.inputHandler.drag){//还未触发drop的话
@@ -476,8 +478,8 @@ var SiteModel = {
                     viewer: viewer,
                     viewer: viewer,
                     pressDistance:0,
                     pressDistance:0,
                     button : THREE.MOUSE.RIGHT  
                     button : THREE.MOUSE.RIGHT  
-                });
-                viewer.inputHandler.drag = null 
+                }); 
+                viewer.inputHandler.drag.object.isDragging = false
             }else{
             }else{
                 end({remain:true})   
                 end({remain:true})   
             }
             }
@@ -487,8 +489,9 @@ var SiteModel = {
         
         
         viewer.dispatchEvent( 'cancel_insertions'  );//取消之前的 
         viewer.dispatchEvent( 'cancel_insertions'  );//取消之前的 
         viewer.addEventListener('cancel_insertions', Exit);
         viewer.addEventListener('cancel_insertions', Exit);
-        entity.addEventListener('unselect', Exit);   
-        
+        setTimeout(()=>{
+            entity.isNew && entity.addEventListener('unselect', Exit);   
+        },1)//因为刚创建会unselect一下所以延迟
         
         
         
         
         var marker = entity.addMarker({point:new THREE.Vector3(0, 0, 0)})
         var marker = entity.addMarker({point:new THREE.Vector3(0, 0, 0)})
@@ -503,7 +506,23 @@ var SiteModel = {
         marker.isDragging = true 
         marker.isDragging = true 
         viewer.inputHandler.startDragging(marker , {dragViewport:mapViewport, endDragFun, notPressMouse:true} ); //notPressMouse代表不是通过按下鼠标来拖拽.  dragViewport指定了只能在地图上拖拽
         viewer.inputHandler.startDragging(marker , {dragViewport:mapViewport, endDragFun, notPressMouse:true} ); //notPressMouse代表不是通过按下鼠标来拖拽.  dragViewport指定了只能在地图上拖拽
         viewer.dispatchEvent('startBuildEntity')
         viewer.dispatchEvent('startBuildEntity')
-          
+         
+
+        let changeByHistory = (e)=>{
+            if(!entity.isNew)return
+            
+            let marker = entity.markers[entity.points.length-1]
+            viewer.inputHandler.startDragging(marker , {dragViewport:mapViewport, endDragFun, notPressMouse:true} );  
+              
+            var I = viewer.inputHandler.intersect && (viewer.inputHandler.intersect.orthoIntersect || viewer.inputHandler.intersect.location)
+            if(I){ 
+                entity.dragChange(I.clone(), entity.points.length-1 )  //使最后一个点在鼠标处
+            }  
+            
+             
+        }
+        entity.addEventListener('changeByHistory',changeByHistory)
+                 
         return entity;
         return entity;
     
     
         
         

+ 3 - 1
src/custom/modules/volumeCompute/Prism.js

@@ -8,7 +8,9 @@ import * as THREE from "../../../../libs/three.js/build/three.module.js";
 let areaPlaneMats = {
 let areaPlaneMats = {
     
     
 } 
 } 
- 
+
+
+console.log('prism 11111111111')
 
 
 export class Prism extends Measure{
 export class Prism extends Measure{
     constructor(args){
     constructor(args){

+ 2 - 6
src/custom/modules/volumeCompute/VolumeComputer.js

@@ -92,13 +92,9 @@ export default class VolumeComputer extends THREE.EventDispatcher{
         this.material = new ExtendPointCloudMaterial();
         this.material = new ExtendPointCloudMaterial();
      
      
 		this.material.activeAttributeName =  testPoint ? "rgba" : 'prismHeight' ;// 'rgba' indices prismHeight
 		this.material.activeAttributeName =  testPoint ? "rgba" : 'prismHeight' ;// 'rgba' indices prismHeight
-        
-        this.height = {up: 2, down: 1}
-        
+         
         this.prisms = []
         this.prisms = []
-        
-        
-        
+         
         
         
     }
     }
     
     

+ 1 - 2
src/custom/objects/tool/Measure.js

@@ -89,8 +89,7 @@ export class Measure extends ctrlPolygon{
         
         
         this.name = this.measureType + this.constructor.counter  //'Measure_' + this.constructor.counter;
         this.name = this.measureType + this.constructor.counter  //'Measure_' + this.constructor.counter;
            
            
-	 
-		
+	  
 		this.markerLabels = [];
 		this.markerLabels = [];
 		this.edgeLabels = [];
 		this.edgeLabels = [];
 		this.angleLabels = [];
 		this.angleLabels = [];

+ 2 - 2
src/custom/objects/tool/MeasuringTool.js

@@ -32,6 +32,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
         this.history = new History({ 
         this.history = new History({ 
             applyData: (data)=>{ 
             applyData: (data)=>{ 
                 if(data.measure.parent && data.measure.visible){ 
                 if(data.measure.parent && data.measure.visible){ 
+                 
                     data = Potree.Common.CloneObject(data) //避免使用后更改数据又被使用
                     data = Potree.Common.CloneObject(data) //避免使用后更改数据又被使用
                     data.measure.reDraw() 
                     data.measure.reDraw() 
                     data.measure.initData(data) 
                     data.measure.initData(data) 
@@ -623,8 +624,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
             
             
             let marker = measure.markers[measure.points.length-1]
             let marker = measure.markers[measure.points.length-1]
             this.viewer.inputHandler.startDragging(marker , {endDragFun, notPressMouse:true} );  
             this.viewer.inputHandler.startDragging(marker , {endDragFun, notPressMouse:true} );  
-            e.drag = this.viewer.inputHandler.drag
-            
+             
             
             
             var I = viewer.inputHandler.intersect && (viewer.inputHandler.intersect.orthoIntersect || viewer.inputHandler.intersect.location)
             var I = viewer.inputHandler.intersect && (viewer.inputHandler.intersect.orthoIntersect || viewer.inputHandler.intersect.location)
             if(I){ 
             if(I){ 

+ 7 - 1
src/custom/objects/tool/ctrlPolygon.js

@@ -1,10 +1,16 @@
 import * as THREE from "../../../../libs/three.js/build/three.module.js";
 import * as THREE from "../../../../libs/three.js/build/three.module.js";
+
+
+
+
+
 import {LineDraw, MeshDraw} from "../../utils/DrawUtil.js";
 import {LineDraw, MeshDraw} from "../../utils/DrawUtil.js";
 import math from "../../utils/math.js";
 import math from "../../utils/math.js";
 
 
 
 
 
 
 
 
+//THREE.Vector2.name1 = 'ctrlPolygon'
 
 
 
 
 const verticalLine = new THREE.Line3()
 const verticalLine = new THREE.Line3()
@@ -16,7 +22,7 @@ export class ctrlPolygon extends THREE.Object3D {
         this.type = type
         this.type = type
         
         
         this.maxMarkers = Number.MAX_SAFE_INTEGER;
         this.maxMarkers = Number.MAX_SAFE_INTEGER;
-       
+      
          
          
         this.transformData(prop);
         this.transformData(prop);
         for(let i in prop){
         for(let i in prop){

+ 2 - 2
src/custom/potree.shim.js

@@ -323,7 +323,7 @@ Utils.getMousePointCloudIntersection = function(viewport, mouse, pointer, camera
         needsUpdate = true
         needsUpdate = true
     }
     }
     
     
-    if(old_visibleNodes) { 
+    if(needsUpdate) { 
         for(let pointcloud of pointclouds){  
         for(let pointcloud of pointclouds){  
             old_visibleNodes.set(pointcloud, pointcloud.visibleNodes)
             old_visibleNodes.set(pointcloud, pointcloud.visibleNodes)
         } 
         } 
@@ -390,7 +390,7 @@ Utils.getMousePointCloudIntersection = function(viewport, mouse, pointer, camera
         } 
         } 
     }
     }
     
     
-    if(old_visibleNodes){ 
+    if(needsUpdate){ 
         for(let pointcloud of pointclouds){  //不恢复的话(尤其cameraChanged时),在下次render前,再次pick可能是错的。表现为多数据集刚开始reticule消失了,直到ifPointBlockedByIntersect停止 
         for(let pointcloud of pointclouds){  //不恢复的话(尤其cameraChanged时),在下次render前,再次pick可能是错的。表现为多数据集刚开始reticule消失了,直到ifPointBlockedByIntersect停止 
             pointcloud.visibleNodes = old_visibleNodes.get(pointcloud)
             pointcloud.visibleNodes = old_visibleNodes.get(pointcloud)
         }  
         }  

+ 5 - 4
src/custom/utils/Common.js

@@ -3,6 +3,9 @@
 import * as THREE from "../../../libs/three.js/build/three.module.js";
 import * as THREE from "../../../libs/three.js/build/three.module.js";
 import math from './math.js'
 import math from './math.js'
 
 
+
+//THREE.Vector2.name2 = 'Common'
+
 var Common = {
 var Common = {
      
      
     
     
@@ -120,12 +123,10 @@ var Common = {
      
      
     CloneObject : function (copyObj, isSimpleCopy, simpleCopyList = [], judgeSimpleCopyFun) {
     CloneObject : function (copyObj, isSimpleCopy, simpleCopyList = [], judgeSimpleCopyFun) {
         //isSimpleCopy 只复制最外层
         //isSimpleCopy 只复制最外层
-        //复制json		result的可能:普通数字或字符串、普通数组、复杂对象
-
-        simpleCopyList.includes(THREE.Object3D) || simpleCopyList.push(THREE.Object3D) //遇到simpleCopyList中的类直接使用不拷贝
+        //复制json		result的可能:普通数字或字符串、普通数组、复杂对象 
         judgeSimpleCopyFun || (judgeSimpleCopyFun=()=>{})
         judgeSimpleCopyFun || (judgeSimpleCopyFun=()=>{})
         
         
-        if (!copyObj || typeof copyObj == 'number' || typeof copyObj == 'string' || copyObj instanceof Function || simpleCopyList.some(className => copyObj instanceof className) || judgeSimpleCopyFun(copyObj)) {
+        if (!copyObj || typeof copyObj == 'number' || typeof copyObj == 'string' ||copyObj.isObject3D || copyObj instanceof Function || simpleCopyList.some(className => copyObj instanceof className) || judgeSimpleCopyFun(copyObj)) {
             return copyObj
             return copyObj
         }
         }
 
 

+ 2 - 0
src/custom/viewer/ViewerNew.js

@@ -80,6 +80,8 @@ import {OrbitControls} from "../../navigation/OrbitControlsNew.js";
 import { ClassificationScheme } from "../../materials/ClassificationScheme.js";
 import { ClassificationScheme } from "../../materials/ClassificationScheme.js";
 import { VRButton } from '../../../libs/three.js/extra/VRButton.js';
 import { VRButton } from '../../../libs/three.js/extra/VRButton.js';
  
  
+ 
+ 
 const manager = new THREE.LoadingManager(); 
 const manager = new THREE.LoadingManager(); 
 let loaders = {}
 let loaders = {}
 
 

+ 5 - 2
src/custom/viewer/viewerBase.js

@@ -192,8 +192,11 @@ export class ViewerBase extends THREE.EventDispatcher{
         }
         }
         
         
         
         
-        if(!onlyForTarget){//因为onlyForTarget不传递devicePixelRatio所以不发送了
-            this.ifEmitResize({viewport:this.viewports[0],  deviceRatio:devicePixelRatio})
+        if(!onlyForTarget){//因为onlyForTarget不传递devicePixelRatio所以不发送了 
+            this.dispatchEvent('viewerResize')
+            this.viewports.forEach(e=>{
+                this.ifEmitResize({viewport:e,  deviceRatio:devicePixelRatio})
+            })
         }  
         }  
          
          
     }  
     }  

+ 11 - 1
改bug的历史.txt

@@ -3,6 +3,16 @@
 
 
 
 
 
 
+
+
+
+2024.2.4
+
+
+merge4dkk页面的window.THREE和ctrlPolygon的不是同一个,而和common.js的是同一个,导致在判断measure instanceof THREE.Object3D时为false。 另有Prism在被import时会执行两次该文件,输出的也不同,也会造成相同问题,一个在measuring一个在volumeComputer,但如果在ViewerNew不会。
+
+
+
 2023.12.29
 2023.12.29
 
 
 
 
@@ -17,7 +27,7 @@ let data = this.context.getImageData(0, 0, img.width , img.height ).data;
 错误2:cannot read properties of undefined (reading 'data')
 错误2:cannot read properties of undefined (reading 'data')
 
 
 
 
-
+解决方案: 每帧至多执行一次 该设备就不报错了
 
 
 
 
 2023.12.15
 2023.12.15