xzw vor 3 Jahren
Ursprung
Commit
b98a959050
4 geänderte Dateien mit 2628 neuen und 405 gelöschten Zeilen
  1. 22 7
      pnpm-lock.yaml
  2. 2478 348
      public/lib/potree/potree.js
  3. 1 1
      public/lib/potree/potree.js.map
  4. 127 49
      src/sdk/cover/index.js

+ 22 - 7
pnpm-lock.yaml

@@ -1,4 +1,4 @@
-lockfileVersion: 5.3
+lockfileVersion: 5.4
 
 specifiers:
   '@simaq/core': ^1.1.0
@@ -56,12 +56,20 @@ packages:
       vue: 3.2.37
     dev: false
 
+  /@babel/helper-string-parser/7.18.10:
+    resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==}
+    engines: {node: '>=6.9.0'}
+
+  /@babel/helper-validator-identifier/7.18.6:
+    resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
+    engines: {node: '>=6.9.0'}
+
   /@babel/parser/7.18.11:
     resolution: {integrity: sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==}
     engines: {node: '>=6.0.0'}
     hasBin: true
     dependencies:
-      '@babel/types': link:registry.npmmirror.com/@babel/types/7.18.10
+      '@babel/types': 7.18.13
 
   /@babel/runtime/7.18.9:
     resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==}
@@ -70,6 +78,14 @@ packages:
       regenerator-runtime: 0.13.9
     dev: false
 
+  /@babel/types/7.18.13:
+    resolution: {integrity: sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-string-parser': 7.18.10
+      '@babel/helper-validator-identifier': 7.18.6
+      to-fast-properties: 2.0.0
+
   /@ctrl/tinycolor/3.4.1:
     resolution: {integrity: sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==}
     engines: {node: '>=10'}
@@ -200,7 +216,6 @@ packages:
     dependencies:
       '@vue/reactivity': 3.2.37
       '@vue/shared': 3.2.37
-    dev: false
 
   /@vue/runtime-dom/3.2.37:
     resolution: {integrity: sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==}
@@ -208,7 +223,6 @@ packages:
       '@vue/runtime-core': 3.2.37
       '@vue/shared': 3.2.37
       csstype: 2.6.20
-    dev: false
 
   /@vue/server-renderer/3.2.37_vue@3.2.37:
     resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==}
@@ -218,7 +232,6 @@ packages:
       '@vue/compiler-ssr': 3.2.37
       '@vue/shared': 3.2.37
       vue: 3.2.37
-    dev: false
 
   /@vue/shared/3.2.37:
     resolution: {integrity: sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==}
@@ -323,7 +336,6 @@ packages:
 
   /csstype/2.6.20:
     resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
-    dev: false
 
   /dayjs/1.11.5:
     resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==}
@@ -801,6 +813,10 @@ packages:
     engines: {node: '>= 0.4'}
     dev: true
 
+  /to-fast-properties/2.0.0:
+    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+    engines: {node: '>=4'}
+
   /to-regex-range/5.0.1:
     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
     engines: {node: '>=8.0'}
@@ -887,7 +903,6 @@ packages:
       '@vue/runtime-dom': 3.2.37
       '@vue/server-renderer': 3.2.37_vue@3.2.37
       '@vue/shared': 3.2.37
-    dev: false
 
   /vuedraggable/4.1.0_vue@3.2.37:
     resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}

Datei-Diff unterdrückt, da er zu groß ist
+ 2478 - 348
public/lib/potree/potree.js


Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 1
public/lib/potree/potree.js.map


+ 127 - 49
src/sdk/cover/index.js

@@ -9,6 +9,9 @@ export const enter = (dom, isLocal) => {
     //Potree.fileServer = axios 
     Potree.settings.libsUrl = '../lib/'
     
+    const tagLimitDis = 8;
+    
+    
     
     let {THREE} = Potree.mergeEditStart(dom)
     let MergeEditor = viewer.modules.MergeEditor
@@ -21,16 +24,23 @@ export const enter = (dom, isLocal) => {
             sceneBus.emit('cameraChange', { x: pos.x, y: pos.y, z: pos.z, rotate: camera.rotation })
         } 
     })
+    viewer.addEventListener('webglError', e => {
+        console.error('viewer webglError: ' + e)
+        sceneBus.emit('webglError', { msg: e.msg })
+    })
     
     window.THREE = THREE
-     
-    let autoLoads = [] 
-    let autoLoadsDone = []
-   
+    //isLocal = false 
+    let autoLoads = []  
+    let readyToAddModel 
+    let maxLoadingCount = /* isLocal ? 1 :  */2; //正在加载模型的最大数目
+    
     
     let sdk = {
         sceneBus,
-        getPositionByScreen(pos2d, mustModelId ){//通过屏幕坐标获取真实坐标 . mustModelId: 如果指定了模型,modelId必须为mustModelId才有效
+        getPositionByScreen(pos2d, hopeModelId ){//通过屏幕坐标获取真实坐标 . hopeModelId: 如果指定了模型,优先返回hopeModelId上的intersect
+            console.log('getPositionByScreen',hopeModelId)
+            hopeModelId = null
             let worldPos, localPos, modelId,  intersect
             let Handler = viewer.inputHandler
             
@@ -39,19 +49,22 @@ export const enter = (dom, isLocal) => {
                 pos2d.clientY = pos2d.y
                 pos2d.onlyGetIntersect = true
                 pos2d.whichPointcloud = true
-                if(mustModelId != void 0){//隐藏其他的模型
+                if(hopeModelId != void 0){//隐藏其他的模型
                     let models = MergeEditor.getAllObjects()
                     models.forEach(model=>{
-                        viewer.updateVisible(model, 'forPick', model.dataset_id == mustModelId)
+                        viewer.updateVisible(model, 'forPick', model.dataset_id == hopeModelId)
                     }) 
                 }
-                intersect = Handler.onMouseMove(pos2d)
-                if(mustModelId != void 0){//恢复
+                let intersect2 = Handler.onMouseMove(pos2d)
+                if(hopeModelId != void 0){//恢复
                     let models = MergeEditor.getAllObjects()
                     models.forEach(model=>{
                         viewer.updateVisible(model, 'forPick', true)
                     }) 
                 }
+                if(intersect2 && intersect2.location){
+                    intersect = intersect2
+                }
             }
             if (pos2d && pos2d.inDrag) {  
                 reGet() 
@@ -59,7 +72,7 @@ export const enter = (dom, isLocal) => {
                 intersect = Handler.intersect
                 if(intersect){
                     modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
-                    if(mustModelId != void 0 && modelId != mustModelId){
+                    if(hopeModelId != void 0 && modelId != hopeModelId){
                         reGet()
                     } 
                 }
@@ -67,9 +80,9 @@ export const enter = (dom, isLocal) => {
 
             if (intersect && intersect.location) {
                 modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
-                if(mustModelId != void 0 && modelId != mustModelId){
+                /* if(hopeModelId != void 0 && modelId != hopeModelId){
                     return null
-                } 
+                } */ 
                 worldPos = intersect.location.clone()
                 localPos = Potree.Utils.datasetPosTransform({ toDataset: true, datasetId:modelId, position:worldPos })
             } else return null
@@ -82,14 +95,30 @@ export const enter = (dom, isLocal) => {
          
         
         
-        getScreenByPosition(pos3d, modelId){//通过模型局部坐标获取屏幕坐标 
+        getScreenByPosition(pos3d, modelId, canShelter/* , disToCameraLimit */){//通过模型局部坐标获取屏幕坐标 
+            
+            
             let isLocal = modelId != void 0 
             pos3d = new THREE.Vector3().copy(pos3d)
             let worldPos = isLocal ? Potree.Utils.datasetPosTransform({ fromDataset: true, datasetId: modelId, position:pos3d}) : pos3d
-            if(!worldPos)return
+            if(!worldPos)return 
+            
+            
+            if(canShelter){ 
+                if(viewer.inputHandler.ifBlockedByIntersect(worldPos, 0.1, true)) return {trueSide:false}; 
+            }
+            
+            
             var viewport = viewer.mainViewport
             var camera = viewport.camera
             var dom = viewer.renderArea
+            if(tagLimitDis != void 0){
+                if(camera.position.distanceTo(worldPos) > tagLimitDis)return false
+            } 
+            
+            
+            
+            
             //console.log('getScreenByPoint ' + pos3d.toArray())
             return Potree.Utils.getPos2d(worldPos, camera, dom, viewport)
         },
@@ -326,45 +355,80 @@ export const enter = (dom, isLocal) => {
         //scaleRange: { min, max }, opacityRange: { min, max }, bottomRange: { min, max } })
         
         addModel(props){ 
+            
             let bus = mitt()  
             //console.log('addModel',props)
             props.isFirstLoad = props.bottom == void 0 //在编辑时用户添加的
             if(props.opacity == void 0)  props.opacity = 1
             props.scale /= 100
-            var oneByOne = !!isLocal;
-             
-            if(!props.isFirstLoad){
+            
+            
+            
+            if(!props.isFirstLoad){ 
+                if(autoLoads.length == 0){ //首次加载
+                    setTimeout(()=>{
+                        let sizes = autoLoads.map(e=>e.size||'0')
+                        console.log('需要请求加载的模型大小为', sizes, '总大小', sizes.reduce(function(total, currentValue ){
+                            let current = parseFloat(currentValue)
+                            return total + (currentValue.includes('M') ? current : current / 1024)
+                        }, 0))
+                         
+                        readyToAddModel = true  //准备开始加载
+                        startLoad(autoLoads[0])
+                    },30) 
+                }
                 autoLoads.push(props) 
+            }else{
+                readyToAddModel = true
             }
+             
+            
             
             let startLoad = (prop)=>{
+                //if(autoLoads.filter(e=>e.loaded).length>1)return console.log('取消加载', prop), prop.onError()
+                
+                //return prop.onError()
+            
                 Potree.addModel(prop,  prop.done , prop.progressFun, prop.onError)
-                console.log('startLoad', prop)
+                prop.loading = true
+                console.log('startLoad',getName(prop.url),  prop ) 
             }
             
             let spliceFromArr = (model,loaded)=>{
-                let index = autoLoads.indexOf(props)
-                if(index>-1){
-                    autoLoads.splice(index,1)
-                     
-                    if(loaded){
-                        autoLoadsDone.push(model)
-                    }
+                //let autoLoads.find()
+                props.loadFinish = true
+                props.loading = false
+                  
+                if(loaded){
+                    props.loaded = true
+                    props.model = model
+                }else{
+                    props.error = true 
                 }
-
-                if(oneByOne && autoLoads[0]){
-                    startLoad(autoLoads[0])
+               
+                let haventLoad = autoLoads.filter(e=>!e.loading && !e.loadFinish);
+                if( haventLoad[0]){
+                    startLoad(haventLoad[0])
                      
                     //this.addModel(autoLoads[0])
-                }else if(autoLoads.length == 0 && autoLoadsDone.length>0){//设置相机位置:当自动开始加载第一个模型时(其余的也跟着自动加载),等这批加载完后;  
-                    MergeEditor.focusOn(autoLoadsDone, 1000)
+                }else if(autoLoads.filter(e=>!e.loadFinish).length == 0 && autoLoads.filter(e=>e.loaded).length>0 && !props.isFirstLoad){//设置相机位置:当自动开始加载第一个模型时(其余的也跟着自动加载),等这批加载完后;  
+                    let autoLoadsDone = autoLoads.filter(e=>e.loaded).map(e=>e.model)
+                    console.log('所有模型加载完毕')
+                    autoLoads.filter(e=>e.loaded && e.show).forEach(e=>e.visible = true)
+                    
+                    MergeEditor.focusOn(autoLoadsDone, 1000, true, true)
+                    
+                    
                 }  
             }
             
             let model
             let done = (model_)=>{
                 model = model_
-                props.opacity < 1 && result.changeOpacity(props.opacity) 
+                if(!props.isFirstLoad){
+                    model.visible = false//先不显示,防止卡顿
+                }
+                props.opacity < 100 && result.changeOpacity(props.opacity) 
                 
                 model.addEventListener('changeSelect',(e)=>{
                     bus.emit('changeSelect',e.selected)
@@ -388,8 +452,8 @@ export const enter = (dom, isLocal) => {
             
             let onError = function ( xhr ) {
                 bus.emit('loadError', xhr)
+                console.log('loadError!!!!!!!!!',  getName(props.url), props.size, xhr) 
                 spliceFromArr(model,false)
-                console.log('loadError!!!!!!!!!',  props.url, props.size, xhr) 
             }
             
             if(props.type == "glb"){////////////////////////////test
@@ -405,36 +469,42 @@ export const enter = (dom, isLocal) => {
             props.done = done; props.progressFun = progressFun; props.onError = onError
             
             
-            
-            if(!oneByOne || autoLoads.length==1){
-                startLoad(props)
-            }                
+            if(readyToAddModel){
+                   
+                if(autoLoads.filter(e=>e.loading).length<maxLoadingCount ){
+                    startLoad(props)
+                }
+                    
+            }
             
             
             let result = {  
                 bus,
                 changeShow(show){ 
-                    if(model){
-                        viewer.updateVisible(model, 'changeShow', show)
+                    if(model){ 
+                        viewer.updateVisible(model, 'changeShow', show) 
                     } 
                 },
                 changeSelect(state){
                     if(model){
                         MergeEditor.selectModel(model, state, true, true)
                         if(state && viewer.inputHandler.selection[0]){
-                            viewer.transformObject(model); //交换
+                            MergeEditor.transformControls.attach(model) //viewer.transformObject(model); //交换
                         }
+                        //console.log('changeSelect',  props.id, state)
                     }
                 },
                 changeScale(s){
                     if(model){
                         s /= 100
                         model.scale.set(s,s,s)
+                        model.isPointcloud && model.changePointSize(Potree.config.material.realPointSize * s)  
                         model.dispatchEvent("scale_changed")
                     }
                 },
-                changeOpacity(opacity){
-                    if(opacity == void 0)opacity = 1
+                changeOpacity(opacity){ 
+                    if(opacity == void 0)opacity = 100
+                    opacity/=100
                     if(model){
                         if(model.isPointcloud){
                             model.material.opacity = opacity
@@ -449,24 +519,30 @@ export const enter = (dom, isLocal) => {
                 },
                 enterRotateMode(){
                     if(model){
-                        viewer.transformObject(model);
+                        MergeEditor.transformControls.attach(model)
+                        MergeEditor.transformControls.mode = 'rotate'
+                        /* viewer.transformObject(model);
                         viewer.transformationTool.setModeEnable('rotation',true)
-                        viewer.transformationTool.setModeEnable('translation',false)
+                        viewer.transformationTool.setModeEnable('translation',false) */
                     }
                 }, 
                 enterMoveMode(){
                     if(model){
-                        viewer.transformObject(model);
+                        
+                        MergeEditor.transformControls.attach(model)
+                        MergeEditor.transformControls.mode = 'translate'
+                        /* viewer.transformObject(model);
                         viewer.transformationTool.setModeEnable('rotation',false)
-                        viewer.transformationTool.setModeEnable('translation',true)
+                        viewer.transformationTool.setModeEnable('translation',true) */
                     }
                 },
                 leaveTransform(){ 
-                    viewer.transformObject(null); 
+                    //viewer.transformObject(null); 
+                    MergeEditor.transformControls.detach()
                 },
                  
                 destroy(){
-                    MergeEditor.removeModel(model) 
+                    model && MergeEditor.removeModel(model) 
                 }
                  
             } 
@@ -482,10 +558,12 @@ export const enter = (dom, isLocal) => {
       
 
     
-    
+    function getName(url){
+        return url.split('/').pop()
+    }
      
     
-      
+    console.log('版本: 2022.8.23-1')
      
     return sdk 
 }