瀏覽代碼

Merge branch 'master' of http://192.168.0.115:3000/bill/traffic-laser

xushiting 2 年之前
父節點
當前提交
0fb347a808
共有 51 個文件被更改,包括 100 次插入64 次删除
  1. 17 14
      public/static/lib/potree/potree.js
  2. 1 1
      public/static/lib/potree/potree.js.map
  3. 2 0
      server/mock.ts
  4. 1 0
      server/test/SS-t-P1d6CwREny2/attach/floor_0_vision.txt
  5. 1 1
      server/test/SS-t-P1d6CwREny2/attach/sceneStore
  6. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685518090910611.jpg
  7. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685520124861337.jpg
  8. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685520158221265.jpg
  9. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685520752118646.jpg
  10. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/168552108627021.jpg
  11. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685521100958725.jpg
  12. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685521116786961.jpg
  13. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685521130035543.jpg
  14. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685521148222535.jpg
  15. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685521159254605.jpg
  16. 二進制
      server/test/SS-t-P1d6CwREny2/attach/upload/1685521184172334.jpg
  17. 1 0
      server/test/SS-t-P1d6CwREny2/attach/vision.json
  18. 1 1
      server/test/a0k4xu045_202305311600080410/attach/sceneStore
  19. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685522025979634.jpg
  20. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685526052186380.jpg
  21. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685526111353443.jpg
  22. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685526113065592.jpg
  23. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685526134152409.jpg
  24. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685526152705630.jpg
  25. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685581812129495.jpg
  26. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685581883868282.jpg
  27. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685581888778190.jpg
  28. 二進制
      server/test/a0k4xu045_202305311600080410/attach/upload/1685582198712327.jpg
  29. 3 2
      src/graphic/Geometry/Img.js
  30. 3 2
      src/graphic/Geometry/Magnifier.js
  31. 2 1
      src/graphic/Load.js
  32. 二進制
      src/graphic/a0k4xu045_202305301709276070.zip
  33. 1 1
      src/hook/useGraphic.ts
  34. 1 1
      src/hook/useParams.ts
  35. 4 4
      src/sdk/laser/core/enter.js
  36. 1 1
      src/store/photos.ts
  37. 6 5
      src/store/sync.ts
  38. 1 1
      src/views/accidents/index.vue
  39. 2 1
      src/views/graphic/geos/magnifier.vue
  40. 1 1
      src/views/photos/index.vue
  41. 16 7
      src/views/scene/covers/basePoint.vue
  42. 11 5
      src/views/scene/covers/cover.vue
  43. 15 5
      src/views/scene/covers/fixPoint.vue
  44. 二進制
      src/views/scene/covers/icon/point_f_s.png
  45. 二進制
      src/views/scene/covers/icon/point_s_n.png
  46. 二進制
      src/views/scene/covers/icon/point_s_s.png
  47. 二進制
      src/views/scene/covers/icon/pointf_n.png
  48. 二進制
      src/views/scene/covers/point1.png
  49. 1 1
      src/views/scene/menus/menus.ts
  50. 1 1
      src/views/scene/menus/pane.vue
  51. 7 8
      src/views/scene/photo.vue

+ 17 - 14
public/static/lib/potree/potree.js

@@ -63575,7 +63575,7 @@ vec4 getMapColor(vec4 color){
             const vec3 mapAnotherColor = vec3(1.0,1.0,1.0);
             //uniform vec4 replaceColor;//新的颜色 
             
-              
+               
             if(mapColor.r < beReplacedRed){//要被取代的颜色
                 mapColor = vec4(replaceColor, mapColor.a);
             }/*else if(mapColor.r>mapTextColotR){
@@ -75241,7 +75241,7 @@ void main()
 	            transparent: o.transparent == void 0 ?  true : o.transparent,
 	            side: o.side || 0 /* THREE.DoubleSide */, 
 	        });
-	        
+	         
 	        
 	        
 	        this.events = {
@@ -75249,7 +75249,8 @@ void main()
 	                if(!this.useDepth || !e.viewport.camera.isPerspectiveCamera || !e.viewport)return
 	                let viewport = e.viewport;
 	                let viewportOffset = viewport.offset || new Vector2(); 
-	                this.uniforms.resolution.value.copy(viewport.resolution); 
+	                
+	                this.uniforms.resolution.value.copy(viewport.resolution);  
 	                this.uniforms.viewportOffset.value.copy(viewportOffset);
 	            },
 	            render:(e)=>{//before render  如果有大于两个viewport的话,不同viewport用不同的depthTex
@@ -75505,7 +75506,7 @@ void main()
 	                
 	                
 	                let r1 = Potree.Utils.getPos2d(center, camera, viewer.renderArea, e.viewport); 
-	                if(!r1.trueSide)return Potree.Utils.updateVisible(this, 'notTrueSide', false); //console.error('!r1.trueSide') //中心点如果在背面直接不渲染了
+	                if(!r1.trueSide)return //Potree.Utils.updateVisible(this, 'notTrueSide', false); 但这句会使realVisible为false从而无法更新//console.error('!r1.trueSide') //中心点如果在背面直接不渲染了
 	                    
 	                let r2, point2;
 	                
@@ -75536,9 +75537,9 @@ void main()
 	                //console.log(p2StateHistory,len)
 	                
 	                if(!r2.trueSide){
-	                    return Potree.Utils.updateVisible(this, 'notTrueSide', false), console.log('  !r2.trueSide', )
+	                    return //Potree.Utils.updateVisible(this, 'notTrueSide', false), console.log('  !r2.trueSide', )
 	                }
-	                Potree.Utils.updateVisible(this, 'notTrueSide', true);
+	                //Potree.Utils.updateVisible(this, 'notTrueSide', true)
 	                 
 	                let p1 = r1.pos,  p2 = r2.pos;
 	                let vec = new Vector2().subVectors(p1,p2);
@@ -80269,7 +80270,7 @@ void main()
 	        this.points = [...this.points.slice(0,index), o.point, ...this.points.slice(index,this.points.length)];
 			//this.points.push(o.point);
 	         
-	        if(o.marker){
+	        if(o.marker){ 
 	            this.add(o.marker);
 	            this.markers = [...this.markers.slice(0,index), o.marker, ...this.markers.slice(index,this.markers.length)];
 	            this.updateMarker(o.marker, o.point);
@@ -80968,7 +80969,7 @@ void main()
 	        
 	        
 	        this.name = this.measureType + this.constructor.counter;  //'Measure_' + this.constructor.counter;
-	        this.color = '#FF4399';   
+	        //this.color = '#FF4399'   
 	        this.color = new Color(this.color);
 			
 			this.markerLabels = [];
@@ -81569,12 +81570,14 @@ void main()
 	    
 	    
 	    createEdgeLabel(name, hasHoverEvent){
+	        
+	        mainLabelProp.backgroundColor = {r: this.color.r*255, g: this.color.g*255, b: this.color.b*255, a:config$1.measure.default.opacity}; 
+	            
+	        
 	        const edgeLabel = new TextSprite$2(
 	            $.extend(hasHoverEvent ? mainLabelProp : subLabelProp,{
-	                sizeInfo: labelSizeInfo,  name:name||'edgeLabel',
-	            
-	                backgroundColor: {r: this.color.r*255, g: this.color.g*255, b: this.color.b*255, a:config$1.measure.default.opacity},
-	            
+	                sizeInfo: labelSizeInfo,  name:name||'edgeLabel', 
+	                
 	            })
 	        );
 	        if(hasHoverEvent){
@@ -81701,7 +81704,7 @@ void main()
 	    
 	    
 	        if(type != 'guide'){
-	            return Measure$1.lineMats['edgeSelect'+color] 
+	            return Measure$1.lineMats[type+color] 
 	        }else return Measure$1.lineMats[type]
 	        
 	         
@@ -106251,7 +106254,7 @@ ENDSEC
 
 	    //鼠标静止一段时间它就会消失
 	    updateVisible(){
-	        //Date.now() - this.mouseLastMoveTime > 1500 && !this.hidden && this.hide()
+	        Date.now() - this.mouseLastMoveTime > 1500 && !this.hidden && this.hide();
 	    }
 	    
 	    

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


+ 2 - 0
server/mock.ts

@@ -39,8 +39,10 @@ export async function createServer(port: number) {
     const file = (req as any).files.file
     const relUrl = `/attach/upload/${file.name}`
     const absUrl = path.resolve(staticDir, `./${req.params.sceneCode}/${relUrl}`)
+    console.log("上传图片完成路径为", relUrl)
     file.mv(absUrl, err => {
       if (err) {
+        res.status(404)
         res.json({code: 1, msg: 'ok'})
       } else {
         res.json({code: 0, msg: 'ok', data: relUrl})

+ 1 - 0
server/test/SS-t-P1d6CwREny2/attach/floor_0_vision.txt

@@ -0,0 +1 @@
+{}

文件差異過大導致無法顯示
+ 1 - 1
server/test/SS-t-P1d6CwREny2/attach/sceneStore


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685518090910611.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685520124861337.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685520158221265.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685520752118646.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/168552108627021.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685521100958725.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685521116786961.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685521130035543.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685521148222535.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685521159254605.jpg


二進制
server/test/SS-t-P1d6CwREny2/attach/upload/1685521184172334.jpg


+ 1 - 0
server/test/SS-t-P1d6CwREny2/attach/vision.json

@@ -0,0 +1 @@
+{}

文件差異過大導致無法顯示
+ 1 - 1
server/test/a0k4xu045_202305311600080410/attach/sceneStore


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685522025979634.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685526052186380.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685526111353443.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685526113065592.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685526134152409.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685526152705630.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685581812129495.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685581883868282.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685581888778190.jpg


二進制
server/test/a0k4xu045_202305311600080410/attach/upload/1685582198712327.jpg


+ 3 - 2
src/graphic/Geometry/Img.js

@@ -1,6 +1,7 @@
 import { mathUtil } from "../Util/MathUtil.js";
 import VectorType from "../enum/VectorType.js";
 import Geometry from "./Geometry";
+import {api} from '@/store/sync.ts'
 
 export default class Img extends Geometry {
   constructor(src, vectorId) {
@@ -25,9 +26,9 @@ export default class Img extends Geometry {
   }
 
   setImageData() {
-    return new Promise((resolve, reject) => {
+    return new Promise(async (resolve, reject) => {
       this.imageData = new Image();
-      this.imageData.src = this.src;
+      this.imageData.src = await api.getFile(this.src);
       this.imageData.onload = function () {
         resolve();
       };

+ 3 - 2
src/graphic/Geometry/Magnifier.js

@@ -4,6 +4,7 @@ import { coordinate } from "../Coordinate.js";
 import { mathUtil } from "../Util/MathUtil.js";
 import VectorType from "../enum/VectorType.js";
 import Geometry from "./Geometry";
+import {api} from '@/store/sync.ts'
 
 const distance = 500;
 export default class Magnifier extends Geometry {
@@ -141,10 +142,10 @@ export default class Magnifier extends Geometry {
   }
 
   setImageData() {
-    return new Promise((resolve, reject) => {
+    return new Promise(async (resolve, reject) => {
       if (this.photoUrl) {
         this.photoImage = new Image();
-        this.photoImage.src = this.photoUrl;
+        this.photoImage.src = await api.getFile(this.photoUrl);
         this.photoImage.onload = function () {
           resolve();
         };

+ 2 - 1
src/graphic/Load.js

@@ -171,7 +171,8 @@ export default class Load {
         if (data3d.fixPoints) {
           for (let i = 0; i < data3d.fixPoints.length; ++i) {
             let point = pointService.create(
-              this.getXY(width, height, data3d.fixPoints[i])
+              // data3d.fixPoints[i].text
+              this.getXY(width, height, data3d.fixPoints[i].pos)
             );
             point.setCategory(VectorCategory.Point.FixPoint);
           }

二進制
src/graphic/a0k4xu045_202305301709276070.zip


+ 1 - 1
src/hook/useGraphic.ts

@@ -55,7 +55,7 @@ export const setCanvas = async (canvas: HTMLCanvasElement, data: Ref<AccidentPho
           console.log("load", data.value)
           drawRef.value.load.load(data.value.data, {
             ...data.value.sceneData,
-            backImage: await api.getFile(data.value.photoUrl)
+            backImage: data.value.photoUrl
           })
         } else {
           drawRef.value.load.clear()

+ 1 - 1
src/hook/useParams.ts

@@ -21,7 +21,7 @@ export const setParams = (p: Params) => (params = p);
 
 export const useParams = () => params;
 
-//params.m = "SS-t-P1d6CwREny2"
+// params.m = "SS-t-P1d6CwREny2"
 if (params.test) {
   params.test = true;
 } else {

+ 4 - 4
src/sdk/laser/core/enter.js

@@ -468,11 +468,11 @@ var enter = ({
             /**
              * 开始测量
              */
-            startMeasure(type, unit) {
+            startMeasure(type, unit, color) {
                 const bus = mitt();
                 let info = getMeasureType(type, unit);
                 //info.bus = bus
-
+                info.color = color
                 let measure = viewer.measuringTool.startInsertion(
                         info,
                         () => {
@@ -521,7 +521,7 @@ var enter = ({
                 datasetId,
                 dataset_points,
                 points_datasets,
-                sid) {
+                sid, color) {
                 const bus = mitt();
                 let info = getMeasureType(type, unit);
                 info.points = points;
@@ -530,7 +530,7 @@ var enter = ({
                 info.points_datasets = points_datasets;
                 info.sid = sid;
                 info.bus = bus;
-
+                info.color = color
                 let measure = viewer.measuringTool.createMeasureFromData(info);
                 Potree.Log("drawMeasure由数据新建: " + measure.id, {
                     font: {

+ 1 - 1
src/store/photos.ts

@@ -7,7 +7,7 @@ export type PhotoRaw = {
   meterPerPixel: number
   time: number,
   measures: { pos: Pos[], dis: number}[],
-  fixPoints: Array<Pos>,
+  fixPoints: Array<{ text:string, pos: Pos }>,
   basePoints: Array<Pos>
   baseLines: Array<Pos[]>
 }

+ 6 - 5
src/store/sync.ts

@@ -16,8 +16,8 @@ const global = window as any;
 
 let count = 0;
 export const api =
-  // import.meta.env.DEV && !global.android
-  true
+  import.meta.env.DEV && !global.android
+  // true
     ? // const api = import.meta.env.DEV
       {
         async setStore(data) {
@@ -47,7 +47,7 @@ export const api =
           url = url.trim();
           const paths = url.split("/")
           const notBase64BaseTypes = [
-            ".png", ".jpg", ".bin"
+            ".png", ".jpg"
           ]
           const notBase64 = notBase64BaseTypes.some(type => paths[paths.length - 1].includes(type))
           if (notBase64) {
@@ -97,7 +97,8 @@ export const api =
 
           const paths = fileUrl.split("/")
           const notBase64BaseTypes = [
-            ".png", ".jpg", ".bin"
+            // ".png", ".jpg"
+            // , ".bin"
           ]
           const notBase64 = notBase64BaseTypes.some(type => paths[paths.length - 1].includes(type))
 
@@ -105,7 +106,7 @@ export const api =
             return await new Promise<string>((resolve) => {
               const apiName = `getImageCallback${count++}`
               global[apiName] = (base64) => {
-                console.error("请求url:" + fileUrl, "返回:" + base64.substring(0, 60))
+                // console.error("请求url:" + fileUrl, "返回:" + base64.substring(0, 60))
                 resolve(URL.createObjectURL(base64ToBlob(base64)));
                 delete global[apiName]
               };

+ 1 - 1
src/views/accidents/index.vue

@@ -1,7 +1,7 @@
 <template>
   <MainPanel>
     <template v-slot:header>
-      <Header :count="selects.length" :title="`标注照片(${sortPhotos.length})`">
+      <Header :count="selects.length" :title="`标注照片(${sortPhotos.length})`">
         <ui-button
             :type="selectMode ? 'primary' : 'normal'"
             @click="selectMode = !selectMode"

+ 2 - 1
src/views/graphic/geos/magnifier.vue

@@ -51,7 +51,8 @@ const menus = [
 watch(
   () => [file.value],
   async ([blob]) => {
-    syncVector(await api.getFile(await uploadImage(blob)))
+    // console.log(blob)
+    syncVector(await uploadImage(blob))
   }
 )
 

+ 1 - 1
src/views/photos/index.vue

@@ -1,7 +1,7 @@
 <template>
   <MainPanel>
     <template v-slot:header>
-      <Header :count="selects.length" title="照片管理">
+      <Header :count="selects.length" :title="`全部照片(${photos.length})`">
         <ui-button type="primary" @click="selectMode = !selectMode" width="96px">
           {{ selectMode ? '取消' : '选择' }}
         </ui-button>

+ 16 - 7
src/views/scene/covers/basePoint.vue

@@ -2,26 +2,35 @@
   <Cover
       @change-pos="pos => $emit('changePos', pos)"
       :pos="pos"
-      @focus="$emit('focus')"
-      @blur="$emit('blur')"
+      @focus="active = true"
+      @blur="active = false"
   >
-    <img :src="icon" class="label" />
+    <img :src="active ? activeIcon : icon" class="label" />
   </Cover>
 
 </template>
 
 <script setup lang="ts">
 import Cover from './cover.vue'
-import icon from './point1.png'
+import icon from './icon/point_s_n.png'
+import activeIcon from './icon/point_s_s.png'
 import {Pos3D} from '@/sdk'
-import {watchEffect} from "vue";
+import {ref, watchEffect} from "vue";
 
 const props = defineProps<{ pos: Pos3D }>()
-defineEmits<{
+const active = ref(false)
+const emit = defineEmits<{
   (m: 'changePos', pos: Pos3D): void,
   (m: 'focus'): void,
-  (m: 'blur'): void
+  (m: 'blur'): void,
 }>()
+watchEffect(() => {
+  if (active.value) {
+    emit('focus')
+  } else {
+    emit('blur')
+  }
+})
 </script>
 
 <style scoped lang="scss">

+ 11 - 5
src/views/scene/covers/cover.vue

@@ -1,11 +1,12 @@
 <template>
   <div
       class="cover-layout"
-      @click.stop.prevent="clickHandler"
+      @click="clickHandler"
       @mousedown.stop.prevent="downHandler"
       @touchstart.stop.prevent="downHandler"
       :class="{ move: move }"
       :style="style"
+      ref="dom"
   >
     <slot />
   </div>
@@ -17,13 +18,16 @@ import {Pos, Pos3D} from '@/sdk'
 import {useSDK} from '@/hook'
 import { getPostionByTarget} from '@/components/base/utils'
 
-const props = defineProps<{ pos: Pos3D }>()
+const props = defineProps<{
+  pos: Pos3D
+}>()
 const emit = defineEmits<{
   (m: 'changePos', pos: Pos3D): void
   (m: 'focus'): void
   (m: 'blur'): void
 }>()
 const sdk = useSDK()
+const dom = ref<HTMLElement>()
 
 const screen = ref<Pos>(null)
 const style = computed(
@@ -95,9 +99,11 @@ const downHandler = (sev: MouseEvent | TouchEvent) => {
 const clickHandler = ev => {
   emit("focus")
 
-  const handler = () => {
-    emit("blur")
-    document.documentElement.removeEventListener("click", handler)
+  const handler = (ev: MouseEvent) => {
+    if (!dom.value.contains(ev.target as HTMLElement) && ev.target !== dom.value) {
+      emit("blur")
+      document.documentElement.removeEventListener("click", handler)
+    }
   }
   document.documentElement.addEventListener("click", handler, { passive: true })
 }

+ 15 - 5
src/views/scene/covers/fixPoint.vue

@@ -2,12 +2,12 @@
   <Cover
       @change-pos="pos => $emit('changePos', pos)"
       :pos="data.pos"
-      @focus="$emit('focus')"
-      @blur="$emit('blur')"
+      @focus="active = true"
+      @blur="active = false"
       class="fix-cover"
   >
     <div class="label">
-      <img :src="icon" />
+      <img :src="active ? activeIcon : icon" />
       <p>{{ data.text }}</p>
     </div>
   </Cover>
@@ -16,16 +16,26 @@
 
 <script setup lang="ts">
 import Cover from './cover.vue'
-import icon from './point1.png'
+import icon from './icon/pointf_n.png'
+import activeIcon from './icon/point_f_s.png'
 import {Pos3D} from '@/sdk'
 import {FixPoint} from "@/store/fixPoint";
+import {ref, watchEffect} from "vue";
 
 const props = defineProps<{ data: FixPoint }>()
-defineEmits<{
+const active = ref(false)
+const emit = defineEmits<{
   (m: 'changePos', pos: Pos3D): void,
   (m: 'focus'): void,
   (m: 'blur'): void,
 }>()
+watchEffect(() => {
+  if (active.value) {
+    emit('focus')
+  } else {
+    emit('blur')
+  }
+})
 </script>
 
 <style scoped lang="scss">

二進制
src/views/scene/covers/icon/point_f_s.png


二進制
src/views/scene/covers/icon/point_s_n.png


二進制
src/views/scene/covers/icon/point_s_s.png


二進制
src/views/scene/covers/icon/pointf_n.png


二進制
src/views/scene/covers/point1.png


+ 1 - 1
src/views/scene/menus/menus.ts

@@ -71,7 +71,7 @@ export const menus: MenuRaw[] = [
   },
   {
     icon: "standard",
-    text: "基准线/点",
+    text: "基准",
     key: "baseLineOrPoint",
     children: [
       {

+ 1 - 1
src/views/scene/menus/pane.vue

@@ -27,7 +27,7 @@ const props = withDefaults(
 const emit = defineEmits<{ (e: 'back'): void }>();
 const backMenu = {
   icon: "return",
-  text: "返回",
+  text: "",
   key: "back",
   onClick: () => emit("back")
 }

+ 7 - 8
src/views/scene/photo.vue

@@ -39,15 +39,14 @@ if (photos.value[photos.value.length - 1]?.url) {
 
 const tempPhoto = ref<string>();
 const coverRef = ref<HTMLImageElement>()
-const getCurrentScreens = (poss: Array<Pos3D>): Array<Pos> => {
+const getCurrentScreen = (pos: Pos3D): Pos => {
   const sdk = useSDK()
-  return poss
-    .map(pos => {
-      const data = sdk.scene.getScreenByPoint(pos)
-      return data.trueSide ? data.pos : null
-    })
-    .filter(pos => !!pos);
+  const data = sdk.scene.getScreenByPoint(pos)
+  return data.trueSide ? data.pos : null
 }
+const getCurrentScreens = (poss: Array<Pos3D>): Array<Pos> =>
+  poss.map(getCurrentScreen).filter(pos => !!pos);
+
 const photo = genUseLoading(async () => {
   const sdk = useSDK()
   const dom = sdk.scene.el
@@ -90,7 +89,7 @@ const photo = genUseLoading(async () => {
       baseLines: baseLines.value
         .map(data => getCurrentScreens(data.points))
         .filter(poss => poss.length),
-      fixPoints: getCurrentScreens(fixPoints.value.map(data => data.pos)),
+      fixPoints: fixPoints.value.map(data => ({ text: data.text, pos: getCurrentScreen(data.pos) })),
       basePoints: getCurrentScreens(basePoints.value.map(data => data.pos))
     })
     showCoverUrl.value = await api.getFile(url)