瀏覽代碼

Merge branch 'local'

bill 3 年之前
父節點
當前提交
94428ab4a7

+ 145 - 68
public/lib/potree/potree.js

@@ -599,7 +599,12 @@
             siteModeSideVisi:14,//只有侧面可见
         },
         
-        
+        /* renderOrders:{ //会影响到绘制、pick时的顺序。
+            measureLine: 1,
+            measureLabel: 2,
+            model: 
+            ground:  
+        }, */
         siteModel:{
             names:{
                 'building': '建筑',
@@ -778,7 +783,7 @@
         
         
         useDepthTex: true,//使用深度贴图,但不代表一定有(得到的intersect更快速准确和稳定)   SS-t-7DUfWAUZ3V  
-        matUseDepth:false, 
+        //matUseDepth:false, 
         //panoEdit:
         datasetsPanos:{},
         
@@ -56726,7 +56731,7 @@ void main() {
             
             let defines = {};
             
-            let useDepth = o.useDepth && Features.EXT_DEPTH.isSupported() && Potree.settings.matUseDepth;
+            let useDepth = o.useDepth && Features.EXT_DEPTH.isSupported();/*  && Potree.settings.matUseDepth */
             if(useDepth )defines.useDepth = '';
             if(o.map)defines.use_map = ''; 
             super({ 
@@ -56843,6 +56848,7 @@ void main() {
              
             this.root = options.root || this;
             this.renderOrder = options.renderOrder != void 0 ? options.renderOrder : 4;
+            this.pickOrder = options.pickOrder || 0;
             this.sizeInfo = options.sizeInfo;
             this.dontFixOrient = options.dontFixOrient;
             
@@ -56984,14 +56990,12 @@ void main() {
     		map.minFilter = LinearFilter;
     		map.magFilter = LinearFilter;
             
-            this.sprite = new Sprite$1({
-                sizeInfo:options.sizeInfo, 
-                renderOrder:options.renderOrder,
-                useDepth: options.useDepth,
-                map,
-                root: this ,    
-                dontFixOrient: options.dontFixOrient
-            });
+            this.sprite = new Sprite$1( Object.assign({},options,
+                {
+                    root: this ,  
+                    map,
+                })
+            );
             this.add(this.sprite);
             
             
@@ -59515,15 +59519,15 @@ void main() {
                 //默认
                 lineWidth : 5,  
                 color:0xffffff,
-                transparent : true, depthWrite:true,  depthTest:true,
+                transparent : true, depthWrite:false,  depthTest:false,
                 dashSize : 0.1, gapSize:0.1, 
             }, o, {
                 //修正覆盖:
                 dashed: o.dashWithDepth ? supportExtDepth && !!o.dashed : !!o.dashed ,
                 dashWithDepth:!!o.dashWithDepth,//只在被遮住的部分显示虚线
-                useDepth: Potree.settings.matUseDepth  && !!o.useDepth,  
+                useDepth: !!o.useDepth,  
                 supportExtDepth,
-                 
+                
             });
             
             
@@ -60561,13 +60565,13 @@ void main() {
         textColor: {r: textColor.r*255, g: textColor.g*255, b: textColor.b*255, a: 1.0},
         fontsize:16, 
         useDepth : true ,
-        renderOrder : 5 
+        renderOrder : 5, pickOrder:5, 
     };
     const subLabelProp = { 
         backgroundColor: {r: 255, g: 255, b: 255, a:1},
         textColor: {r: 0, g: 0, b:0, a: 1.0},
         fontsize:14, 
-        renderOrder : 4
+        renderOrder : 4, pickOrder:4,
     };
 
 
@@ -60815,7 +60819,7 @@ void main() {
              
             let marker = new Sprite$1({mat:this.getMarkerMaterial('default'), sizeInfo: markerSizeInfo, name:"measure_point"} );
             viewer.setObjectLayers(marker, 'measure' );
-            marker.renderOrder = 3; 
+            marker.pickOrder = marker.renderOrder = 3; 
             marker.markerSelectStates = {}; 
             marker.addEventListener('startDragging',(e)=>{
                 if(e.drag.dragViewport.name == 'MainView')viewer.inputHandler.dispatchEvent( {type: 'isMeasuring',v:true, cause:'startDragging'});
@@ -60827,6 +60831,7 @@ void main() {
             let edge;
     		{ // edges 
                 edge = LineDraw.createFatLine( [ ],{material:this.getLineMat('edgeDefault')} ); 
+                edge.pickOrder = 0;
                 viewer.setObjectLayers(edge, 'measure' ); 
 
 
@@ -61227,7 +61232,7 @@ void main() {
                         gapSize: 0.04,    
                         transparent: true,
                         opacity: config$1.measure.default.opacity,
-                        depthTestWhenPick:true, 
+                        depthTestWhenPick:true,
                     }),
                     edgeSelect:  LineDraw.createFatLineMat({
                         color: config$1.measure.highlight.color,//'#f0ff00',
@@ -61236,7 +61241,6 @@ void main() {
                         lineWidth: config$1.measure.lineWidth  ,
                         transparent: true,
                         opacity: config$1.measure.highlight.opacity
-                        
                     }),
                     guide:   LineDraw.createFatLineMat({
                         color:config$1.measure.guide.color, 
@@ -74617,8 +74621,8 @@ void main() {
             
             if(this.useDurSlice){ //已经设定好了每一段的duration的话
                 let sums = [0];
-                let sum = 0, last = this.durations[0];
-                for(let i=1;i<length;i++){
+                let sum = 0, last;
+                for(let i=0;i<length-1;i++){ //去掉最后一个duration,因为已到终点
                     let duration = this.durations[i];
                     sum += duration;   
                     last = duration;
@@ -85112,8 +85116,8 @@ void main() {
             
             if(isTouch){ 
                 this.hoveredElements = this.getHoveredElements();
-                this.intersectPoint = this.getIntersect(viewport);
-                this.intersect = this.getWholeIntersect();
+                this.intersect = this.getIntersect(viewport);
+                //this.intersect = this.getWholeIntersect()
                 
             }
             
@@ -85176,9 +85180,9 @@ void main() {
     		 
     	}
 
-        getWholeIntersect(hoveredElements, intersectPoint){//add
-            hoveredElements = hoveredElements || this.hoveredElements;
-            intersectPoint = intersectPoint || this.intersectPoint;  
+        /* getWholeIntersect(hoveredElements, intersectPoint){//add
+            hoveredElements = hoveredElements || this.hoveredElements
+            intersectPoint = intersectPoint || this.intersectPoint  
             if(Potree.settings.intersectOnObjs && hoveredElements[0] && hoveredElements[0].object.isModel){
                 return {//模拟点云的intersectPoint的结构写法
                     hoveredElement : hoveredElements[0] ,
@@ -85188,7 +85192,7 @@ void main() {
                     object: hoveredElements[0].object
                 } 
             }else return intersectPoint  
-        }
+        } */
 
 
         getEventDesc(e,isTouch){//搜集dispatchEvent要给的一般数据 
@@ -85201,7 +85205,7 @@ void main() {
                 dragViewport : this.dragViewport,
                 hoverViewport: this.hoverViewport,
                // button: isTouch ? 0 : e.button,
-                intersectPoint:this.intersectPoint,
+                //intersectPoint:this.intersectPoint,
                 hoveredElement: this.hoveredElements[0],
                 intersect: this.intersect//this.getWholeIntersect() , //可能包含mesh上的,针对融合页面
             };
@@ -85312,7 +85316,8 @@ void main() {
                     if(this.hoveredElements){
                         clickElement = this.hoveredElements.find(e=>e.object._listeners['click']); 
                         if(clickElement){
-                            if (this.logMessages) console.log(`${this.constructor.name}: click ${clickObject.name}`);
+                            console.log('clickElement',clickElement);
+                            if (this.logMessages) console.log(`${this.constructor.name}: click ${clickElement.name}`);
                             clickElement.object.dispatchEvent($.extend(  
                                 this.getEventDesc(e,isTouch),
                                 {
@@ -85357,7 +85362,7 @@ void main() {
                     
                     //自行执行双击:
                     
-                    if(now - this.lastClickTime < this.doubleClickTime){
+                    if(now - this.lastClickTime < Potree.config.doubleClickTime){
                         this.onDoubleClick(e);
                     }
                     
@@ -85527,22 +85532,50 @@ void main() {
             }
               
             //console.log(viewport.name , intersectPoint &&  intersectPoint.location )
+            let intersect;
+            let intersectOnModel;
+            
+            if(Potree.settings.intersectOnObjs){
+                let intesects = this.getHoveredElements(viewer.objs.children, true);
+                
+                
+                if(intesects[0]){
+                    intersectOnModel = {//模拟点云的intersectPoint的结构写法
+                        hoveredElement : intesects[0] ,
+                        location: intesects[0].point,
+                        point: {normal: intesects[0].face.normal },
+                        distance: intesects[0].distance,
+                        object: intesects[0].object
+                    }; 
+                }
+            }
+            
+            if(intersectPoint && intersectOnModel){
+                if(intersectPoint.distance < intersectOnModel.distance){
+                    intersect = intersectPoint;
+                }else {
+                    intersect = intersectOnModel;
+                } 
+            }else {
+                intersect = intersectOnModel || intersectPoint;
+            }                
+             
             
             if(viewport.camera.type == 'OrthographicCamera'/*  == 'mapViewport' */){ 
                 let pos3d = new Vector3(this.pointer.x,this.pointer.y,-1).unproject(viewport.camera); //z:-1朝外   
                  
-                if(!intersectPoint){
-                    intersectPoint = {};
+                if(!intersect){
+                    intersect = {};
                 }   
-                intersectPoint.orthoIntersect = pos3d.clone(); 
+                intersect.orthoIntersect = pos3d.clone(); 
             } 
             if(onlyGetIntersect){ 
-                return intersectPoint
+                return intersect
             }
             
-            if (intersectPoint) {  
+            if (intersect) {  
                 if(viewer.showCoordType){ //显示坐标位置时
-                    let pos = intersectPoint.point.position.toArray();
+                    let pos = intersect.point.position.toArray();
                     if(viewer.showCoordType == "local"){
                          
                     }else if(viewer.showCoordType == "lonlat"){
@@ -85559,11 +85592,11 @@ void main() {
             }
             //console.log('getIntersect', !!intersectPoint)  
             
-            this.intersectPoint = intersectPoint; 
+            this.intersect = intersect; 
              
-            intersectPoint && (this.hoverViewport.lastIntersect = intersectPoint);
+            intersect && (this.hoverViewport.lastIntersect = intersect);
              
-            return intersectPoint         
+            return intersect         
         }
         
         
@@ -85585,25 +85618,26 @@ void main() {
             if(!viewport)return//刚变化viewport时会找不到
              
     		let isFlying = this.viewer.viewports.some(e=>e.view.isFlying());
-            let intersectPoint;
+            let intersect; 
             
             
             if(e.onlyGetIntersect || !this.drag || this.drag.object || viewport.alignment ){ //没有拖拽物体,但按下鼠标了的话,不intersect
             
                 let dontIntersectPointcloud =  this.drag && viewport.alignment && Potree.settings.editType == 'pano' || isFlying;/* viewer.images360.flying */ // flying 时可能卡顿
                 //console.log('dontIntersectPointcloud',dontIntersectPointcloud)
-                intersectPoint = this.getIntersect(viewport,  e.onlyGetIntersect, e.pickWindowSize, dontIntersectPointcloud, e.whichPointcloud); //数据集多的时候卡顿
+                intersect = this.getIntersect(viewport,  e.onlyGetIntersect, e.pickWindowSize, dontIntersectPointcloud, e.whichPointcloud); //数据集多的时候卡顿
                 //console.log('intersectPoint', intersectPoint)
             } 
             
             if(e.onlyGetIntersect){ 
-                if(Potree.settings.intersectOnObjs){
-                    let hoveredElements = this.getHoveredElements(); //应该不用发送mouseover事件吧
-                    let intersect = this.getWholeIntersect(hoveredElements, intersectPoint);
+                /* if(Potree.settings.intersectOnObjs){
+                    let hoveredElements = this.getHoveredElements() //应该不用发送mouseover事件吧
+                    let intersect = this.getWholeIntersect(hoveredElements, intersectPoint)
                     return intersect
                 }
              
-                return intersectPoint
+                return intersectPoint */
+                return intersect
             }
             e.preventDefault();
             
@@ -85707,7 +85741,7 @@ void main() {
                 
                 
                 
-                this.intersect = this.getWholeIntersect();
+                //this.intersect = this.getWholeIntersect()
                 
                 
                 
@@ -85913,25 +85947,30 @@ void main() {
     		}
     	}
      
-    	getHoveredElements () {
+         
+     
+     
+    	getHoveredElements (interactables, dontCheckDis) {
     		let scenes = this.hoverViewport.interactiveScenes || this.interactiveScenes.concat(this.scene);
 
     		let interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];
-    		let interactables = [];
-    		for (let scene of scenes) {
-    			scene.traverseVisible(node => {//检测加了侦听的object
-    				if (node._listeners && node.visible && (Potree.settings.intersectOnObjs || !this.blacklist.has(node))) {
-    					let hasInteractableListener = interactableListeners.filter((e) => {
-    						return node._listeners[e] !== undefined;
-    					}).length > 0;
-
-    					if (hasInteractableListener) {
-    						interactables.push(node);
-    					}                        
-    				}
-    			});
-    		}
     		
+            if(!interactables){
+                interactables = [];
+                for (let scene of scenes) {
+                    scene.traverseVisible(node => {//检测加了侦听的object
+                        if (node._listeners && node.visible && (Potree.settings.intersectOnObjs || !this.blacklist.has(node))) {
+                            let hasInteractableListener = interactableListeners.filter((e) => {
+                                return node._listeners[e] !== undefined;
+                            }).length > 0;
+
+                            if (hasInteractableListener) {
+                                interactables.push(node);
+                            }                        
+                        }
+                    });
+                }
+    		}
     		let camera = this.hoverViewport.camera;
             let ray = Utils.mouseToRay(this.pointer, camera  );
     		
@@ -85958,14 +85997,18 @@ void main() {
             
             viewer.dispatchEvent( {type:'raycaster',  viewport: this.hoverViewport});//add
     		let intersections = raycaster.intersectObjects(interactables.filter(o => o.visible), true); //原本是false 检测不到children
-            if(this.intersectPoint && this.intersectPoint.distance != void 0){//add
+            //if(this.intersectPoint && this.intersectPoint.distance != void 0){//add
+           
+            if(this.intersect && this.intersect.distance != void 0 && !dontCheckDis){//add
                 intersections = intersections.filter(e=>{
                     let material = e.object.material;
                     
                     return (material.depthTest == false || material.depthWrite == false) && !material.useDepth  //!material.depthTestWhenPick
-                     || ( material instanceof DepthBasicMaterial ? e.distance < this.intersectPoint.distance + material.uniforms.occlusionDistance.value : e.distance < this.intersectPoint.distance )
+                     || ( material.useDepth ? e.distance < this.intersect.distance + material.uniforms.occlusionDistance.value : e.distance < this.intersect.distance )
                 }); 
             }
+         
+           
             intersections = intersections.map(e=>{//add 转化为interactables
                 var object = e.object; 
                 do{ 
@@ -85980,9 +86023,31 @@ void main() {
                 return e
             });
             
+            
+            let intersectionsCopy = intersections.slice();
+            /* 
+            let intersectOnModel =  
+
+            for(let i=0;i<intersections.length;i++){
+                if(!intersections.oriObject.isModel)continue
+                if(this.intersectPoint && intersections.distance < this.intersectPoint.distance ){
+                    
+                }
+            } */
+            
+            
+            
+            
             //add for测量线,在检测到sphere时优先选中sphere而非线
-            intersections = intersections.sort(function(a,b){return b.object.renderOrder-a.object.renderOrder}); // 降序
-     
+             
+            //intersections = intersections.sort(function(a,b){return b.object.renderOrder-a.object.renderOrder}) // 降序
+            intersections = intersections.sort(function(a,b){
+                let order2 = b.object.pickOrder || 0;
+                let order1 = a.object.pickOrder || 0;
+                return order2-order1
+            }); // 降序
+            
+            
             //console.log('getHoveredElement ', intersections)
     		return intersections;
     	}
@@ -115097,8 +115162,15 @@ ENDSEC
             
             
             viewer.addEventListener('global_single_click',(e)=>{
+<<<<<<< HEAD
                 if(viewer.inputHandler.selection[0] ||//正在平移和旋转,不允许更换
                     viewer.scene.cameraAnimations.length  //正在播放
+=======
+                if( viewer.scene.cameraAnimations.length  //正在播放
+                    || e.drag && e.drag.notPressMouse   //在加测量线
+                    || viewer.mainViewport.view.isFlying() //有其他校准
+                    //e.clickElement && e.clickElement != e.intersect.object
+>>>>>>> local
                 ){
                     return
                 }
@@ -115109,10 +115181,14 @@ ENDSEC
                     if(objects.includes(object)){ 
                         this.selectModel(object); 
                     }else {
-                        this.selectModel(null);
+                        if(!viewer.inputHandler.selection[0]){//正在平移和旋转,不允许取消
+                            this.selectModel(null);
+                        }
                     }                    
                 }else {
-                    this.selectModel(null); 
+                    if(!viewer.inputHandler.selection[0]){
+                        this.selectModel(null);
+                    }                
                 }
             });  
             
@@ -115229,7 +115305,8 @@ ENDSEC
             if(fitBound){
                 viewer.focusOnObject({boundingBox}, 'boundingBox', duration); 
             }else {
-                viewer.focusOnObject({position: boundingBox.getCenter(new Vector3)},  'point', duration, {dontChangePos: true});
+                let position = viewer.inputHandler.intersect ? viewer.inputHandler.intersect.location : boundingBox.getCenter(new Vector3);
+                viewer.focusOnObject({position},  'point', duration, {dontChangePos: true});
             }
                
              

文件差異過大導致無法顯示
+ 1 - 5
public/lib/potree/potree.js.map


+ 72 - 3
src/components/bill-ui/components/icon/iconfont/demo_index.html

@@ -55,6 +55,24 @@
           <ul class="icon_lists dib-box">
           
             <li class="dib">
+              <span class="icon iconfont">&#xe64c;</span>
+                <div class="name">search</div>
+                <div class="code-name">&amp;#xe64c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6ae;</span>
+                <div class="name">left</div>
+                <div class="code-name">&amp;#xe6ae;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6af;</span>
+                <div class="name">right</div>
+                <div class="code-name">&amp;#xe6af;</div>
+              </li>
+          
+            <li class="dib">
               <span class="icon iconfont">&#xe624;</span>
                 <div class="name">state_e</div>
                 <div class="code-name">&amp;#xe624;</div>
@@ -246,9 +264,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1660619600055') format('woff2'),
-       url('iconfont.woff?t=1660619600055') format('woff'),
-       url('iconfont.ttf?t=1660619600055') format('truetype');
+  src: url('iconfont.woff2?t=1660727466034') format('woff2'),
+       url('iconfont.woff?t=1660727466034') format('woff'),
+       url('iconfont.ttf?t=1660727466034') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -275,6 +293,33 @@
         <ul class="icon_lists dib-box">
           
           <li class="dib">
+            <span class="icon iconfont icon-search"></span>
+            <div class="name">
+              search
+            </div>
+            <div class="code-name">.icon-search
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-left1"></span>
+            <div class="name">
+              left
+            </div>
+            <div class="code-name">.icon-left1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-right"></span>
+            <div class="name">
+              right
+            </div>
+            <div class="code-name">.icon-right
+            </div>
+          </li>
+          
+          <li class="dib">
             <span class="icon iconfont icon-state_e"></span>
             <div class="name">
               state_e
@@ -564,6 +609,30 @@
           
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-search"></use>
+                </svg>
+                <div class="name">search</div>
+                <div class="code-name">#icon-search</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-left1"></use>
+                </svg>
+                <div class="name">left</div>
+                <div class="code-name">#icon-left1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-right"></use>
+                </svg>
+                <div class="name">right</div>
+                <div class="code-name">#icon-right</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-state_e"></use>
                 </svg>
                 <div class="name">state_e</div>

+ 15 - 3
src/components/bill-ui/components/icon/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 3549513 */
-  src: url('iconfont.woff2?t=1660619600055') format('woff2'),
-       url('iconfont.woff?t=1660619600055') format('woff'),
-       url('iconfont.ttf?t=1660619600055') format('truetype');
+  src: url('iconfont.woff2?t=1660727466034') format('woff2'),
+       url('iconfont.woff?t=1660727466034') format('woff'),
+       url('iconfont.ttf?t=1660727466034') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,18 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-search:before {
+  content: "\e64c";
+}
+
+.icon-left1:before {
+  content: "\e6ae";
+}
+
+.icon-right:before {
+  content: "\e6af";
+}
+
 .icon-state_e:before {
   content: "\e624";
 }

文件差異過大導致無法顯示
+ 1 - 1
src/components/bill-ui/components/icon/iconfont/iconfont.js


+ 21 - 0
src/components/bill-ui/components/icon/iconfont/iconfont.json

@@ -6,6 +6,27 @@
   "description": "",
   "glyphs": [
     {
+      "icon_id": "25631464",
+      "name": "search",
+      "font_class": "search",
+      "unicode": "e64c",
+      "unicode_decimal": 58956
+    },
+    {
+      "icon_id": "27765016",
+      "name": "left",
+      "font_class": "left1",
+      "unicode": "e6ae",
+      "unicode_decimal": 59054
+    },
+    {
+      "icon_id": "27765017",
+      "name": "right",
+      "font_class": "right",
+      "unicode": "e6af",
+      "unicode_decimal": 59055
+    },
+    {
       "icon_id": "22132762",
       "name": "state_e",
       "font_class": "state_e",

二進制
src/components/bill-ui/components/icon/iconfont/iconfont.ttf


二進制
src/components/bill-ui/components/icon/iconfont/iconfont.woff


二進制
src/components/bill-ui/components/icon/iconfont/iconfont.woff2


+ 6 - 1
src/components/bill-ui/components/input/range.vue

@@ -14,7 +14,11 @@
                 <span class="range-slide" @click.stop @touchstart="slideDownHandler" @mousedown="slideDownHandler"></span>
             </div>
         </div>
-        <UInumber v-if="props.input" :modelValue="modelValue" @update:modelValue="inputUpdateHandler" :min="min" :max="max" :step="step" class="range-text" />
+        <UInumber v-if="props.input" :ctrl="ctrl" :modelValue="modelValue" @update:modelValue="inputUpdateHandler" :min="min" :max="max" :step="step" class="range-text">
+            <template v-for="(slot, name) in $slots" v-slot:[name]="raw">
+                <slot :name="name" v-bind="raw" />
+            </template>
+        </UInumber>
     </div>
 </template>
 
@@ -25,6 +29,7 @@ import UInumber from './number.vue'
 import { os } from '../../utils/index'
 
 const props = defineProps(rangePropsDesc)
+
 const emit = defineEmits(['update:modelValue'])
 const getValue = value => {
     const calcStep = Math.ceil(1 / props.step)

+ 7 - 1
src/components/tagging/list.vue

@@ -3,6 +3,7 @@
     <template v-for="(pos, index) in positions" :key="pos.id">
       <Sign 
         v-if="isShowSign(pos.modelId)"
+        @delete="deletePosition(pos)"
         :tagging="tagging"
         :scene-pos="pos"
       />
@@ -13,7 +14,7 @@
 <script lang="ts" setup>
 import { computed } from 'vue'
 import Sign from './sign.vue'
-import { Tagging, getFuseModelShowVariable, getFuseModel, getTaggingPositions } from '@/store';
+import { Tagging, getFuseModelShowVariable, getFuseModel, getTaggingPositions, TaggingPosition, taggingPositions } from '@/store';
 import { custom } from '@/env'
 
 const props = defineProps<{ tagging: Tagging }>()
@@ -28,4 +29,9 @@ const positions = computed(() => {
   return positions
 })
 
+const deletePosition = (pos: TaggingPosition) => {
+  const index = taggingPositions.value.indexOf(pos)
+  taggingPositions.value.splice(index, 1)
+}
+
 </script>

+ 19 - 0
src/components/tagging/sign.vue

@@ -30,6 +30,12 @@
           :in-full="true" 
           @pull="index => (pullIndex = index)" 
         />
+        <div class="edit-hot" v-if="router.currentRoute.value.name === RoutesName.tagging">
+          <span @click="$emit('delete')" class="fun-ctrl">
+            <ui-icon type="del" />
+            删除
+          </span>
+        </div>
       </UIBubble>
 
       <Preview 
@@ -44,6 +50,7 @@
 
 <script lang="ts" setup>
 import { computed, ref, watchEffect, watch } from 'vue'
+import { router, RoutesName } from '@/router'
 import UIBubble from 'bill/components/bubble/index.vue'
 import Images from '@/views/tagging/images.vue'
 import Preview, { MediaType } from '../static-preview/index.vue'
@@ -56,6 +63,7 @@ import type { Tagging, TaggingPosition } from '@/store';
 
 export type SignProps = { tagging: Tagging, scenePos: TaggingPosition, show?: boolean }
 
+defineEmits<{ (e: 'delete'): void }>()
 
 const props = defineProps<SignProps>()
 const posStyle = ref<null | { left: string, top: string}>(null)
@@ -146,4 +154,15 @@ const iconClickHandler = () => {
   }
 }
 
+.edit-hot {
+  margin-top: 20px;
+  text-align: right;
+
+  span {
+    font-size: 14px;
+    color: rgba(255, 255, 255, 0.6);
+    cursor: pointer;
+  }
+}
+
 </style>

+ 4 - 3
src/layout/model-list/sign.vue

@@ -2,19 +2,20 @@
   <div class="model-header" :class="{disabled: model.error}" @click="$emit('click')">
     <p>{{ model.title }}</p>
     <div class="model-action" @click.stop>
-      <ui-input type="checkbox" v-model="show" />
+        <ui-input type="checkbox" v-model="show" />
       <ui-icon 
+        v-if="custom.modelsChangeStore && model.type !== SceneType.SWSS"
         type="del" 
         ctrl 
         @click="$emit('delete')" 
-        v-if="custom.modelsChangeStore" 
+        v-if="model.type !== SceneType.SWSS && custom.modelsChangeStore" 
       />
     </div>
   </div>
   <div class="model-desc" @click="$emit('click')">
     <p><span>数据来源:</span>{{ SceneTypeDesc[model.type] }}</p>
     <p><span>数据大小:</span>{{ model.size }}</p>
-    <p><span>拍摄时间:</span>{{ model.time }}</p>
+    <p v-if="model.type === SceneType.SWSS"><span>拍摄时间:</span>{{ model.time }}</p>
   </div>
 </template>
 

+ 0 - 1
src/sdk/association.ts

@@ -52,7 +52,6 @@ const associationModels = (sdk: SDK) => {
         hideLoad()
       })
       sceneModel.bus.on('loadError', () => {
-        console.error(item, '加载失败')
         item.error = true
         item.show = false
         custom.showModelsMap.delete(item)

+ 4 - 1
src/sdk/cover/index.js

@@ -266,8 +266,11 @@ export const enter = (dom) => {
               speed: number //没用到
             } 
             */
+            
+            console.log('enterSceneGuide',pathArr)
+            
             let data = {
-                duration: pathArr.reduce(function(total, currentValue ){return total+currentValue.time}, 0), //总时长
+                duration: pathArr.slice(0,pathArr.length-1).reduce(function(total, currentValue ){return total+currentValue.time}, 0), //总时长(要去掉最后一个,因为已到终点,该点time无意义)
                 points: pathArr,
                 useDurSlice:true
             }

+ 20 - 5
src/views/merge/index.vue

@@ -8,19 +8,25 @@
         <!-- <template #icon>
           <a href="">设置比例</a>
         </template> -->
-        <ui-input type="range" v-model="custom.currentModel.scale" v-bind="scaleOption" width="100%" />
+        <ui-input type="range" v-model="custom.currentModel.scale" v-bind="scaleOption" width="100%">
+          <template #icon>%</template>
+        </ui-input>
       </ui-group-option>
       <ui-group-option label="离地高度">
-        <ui-input type="range" v-model="custom.currentModel.bottom" v-bind="bottomOption" width="100%" />
+        <ui-input type="range" v-model="custom.currentModel.bottom" v-bind="bottomOption" width="100%">
+          <template #icon>m</template>
+        </ui-input>
       </ui-group-option>
       <ui-group-option label="模型不透明度">
-        <ui-input type="range" v-model="custom.currentModel.opacity" v-bind="opacityOption" width="100%" />
+        <ui-input type="range" v-model="custom.currentModel.opacity" v-bind="opacityOption" width="100%">
+          <template #icon>%</template>
+        </ui-input>
       </ui-group-option>
       <!-- <ui-group-option>
         <ui-button>配准</ui-button>
       </ui-group-option> -->
       <ui-group-option>
-        <ui-button @click="Object.assign(custom.currentModel as any, defaultFuseModelAttrs)">恢复默认</ui-button>
+        <ui-button @click="reset">恢复默认</ui-button>
       </ui-group-option>
     </ui-group>
   </RightPano>
@@ -34,7 +40,8 @@ import Actions from '@/components/actions/index.vue'
 import { getSceneModel } from '@/sdk'
 import { useViewStack } from '@/hook'
 import { showLeftCtrlPanoStack, showLeftPanoStack, custom, modelsChangeStoreStack } from '@/env'
-import { ref } from 'vue'
+import { ref, nextTick } from 'vue'
+import { Dialog } from 'bill/expose-common'
 
 import type { ActionsProps } from '@/components/actions/index.vue'
 
@@ -68,6 +75,14 @@ const actionItems: ActionsProps['items'] = [
   },
 ]
 
+const reset = async () => {
+  if (custom.currentModel && await Dialog.confirm('确定恢复默认?此操作无法撤销')) {
+    Object.assign(custom.currentModel, defaultFuseModelAttrs)
+    await nextTick()
+    custom.currentModel && (custom.currentModel.bottom = 0)
+  }
+}
+
 useViewStack(() => togetherCallback([
   showLeftCtrlPanoStack.push(ref(false)),
   showLeftPanoStack.push(ref(true)),

+ 2 - 0
src/views/tagging/edit.vue

@@ -122,6 +122,8 @@ const tagging = ref<Tagging>({...props.data, images: [...props.data.images]})
 const submitHandler = () => {
   if (!tagging.value.title.trim()) {
     Message.error('标注标题必须填写!')
+  } else if (!tagging.value.images.length) {
+    Message.error('至少上传一张图片!')
   } else {
     emit('save', tagging.value)
   }

+ 5 - 3
src/views/tagging/index.vue

@@ -17,14 +17,14 @@
         />
       </template>
       <ui-group-option>
-        <ui-input type="text" width="100%" placeholder="搜索">
+        <ui-input type="text" width="100%" placeholder="搜索" v-model="keyword">
           <template #preIcon>
             <ui-icon type="search" />
           </template>
         </ui-input>
       </ui-group-option>
       <TagingSign 
-        v-for="tagging in taggings" 
+        v-for="tagging in filterTaggings" 
         :key="tagging.id" 
         :tagging="tagging" 
         :selected="selectTagging === tagging"
@@ -51,7 +51,7 @@ import { Message } from 'bill/index'
 import { RightFillPano } from '@/layout'
 import { togetherCallback } from '@/utils'
 import { useViewStack } from '@/hook'
-import { ref, watch } from 'vue';
+import { computed, ref, watch } from 'vue';
 import { sdk } from '@/sdk'
 import { 
   taggings, 
@@ -77,6 +77,8 @@ import {
   showRightPanoStack
 } from '@/env'
 
+const keyword = ref('')
+const filterTaggings = computed(() => taggings.value.filter(tagging => tagging.title.includes(keyword.value)))
 
 const editTagging = ref<Tagging | null>(null)
 const saveHandler = (tagging: Tagging) => {