Forráskód Böngészése

fix: Merge branch 'dev' of http://face3d.4dage.com:7005/4dkankan/4dkankan_bim into dev

bill 2 éve
szülő
commit
dd7fa6510b

+ 1 - 1
public/smart-sviewer.html

@@ -4,7 +4,7 @@
         <title></title>
         <meta charset="utf-8" />
         <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
-        <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfont/iconfont.css" />
+        <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/ext/iconfont/iconfont.css" />
         <link rel="stylesheet" href="//at.alicdn.com/t/c/font_3693743_qnz6eozqyvk.css" />
         <script src="<%= VUE_APP_STATIC_DIR %>/ext/mobile-detect.js"></script>
         <script src="<%= VUE_APP_STATIC_DIR %>/ext/base64.min.js"></script>

+ 2 - 2
public/static/lib/potree/potree.js

@@ -92468,7 +92468,7 @@ void main() {
                     this.resetHighMap(); 
                 }
                 
-                this.smoothZoomTo(1, toPano.duration / 2);  
+                this.smoothZoomTo(toPano.zoomLevel || 1, toPano.duration / 2);  
             }
                  
             
@@ -94256,7 +94256,7 @@ void main() {
          
 
         zoomFovTo( fov ) { //通过fov来算zoomLevel 
-            let zoomLevel = this.baseFov / fov;
+            let zoomLevel = Potree.config.view.fov /* this.baseFov */ / fov;
             this.zoomTo( zoomLevel );
         }
     	smoothZoomTo(aimLevel, dur=0) {

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 1
public/static/lib/potree/potree.js.map


+ 3 - 3
src/components/calendar/index.vue

@@ -1,8 +1,8 @@
 <template>
     <div class="calendar">
-        <span class="prev" @click="emits('prev', props.name)" v-show="props.count>1"><i class="iconfont icon-arrows_left"></i></span>
+        <span class="prev" @click="emits('prev', props.name)" v-show="controls"><i class="iconfont icon-arrows_left"></i></span>
         <span class="cale" @click="onPickDate()">{{ value.format('YYYY-mm-dd') }}<i class="iconfont icon-date"></i></span>
-        <span class="next" @click="emits('next', props.name)" v-show="props.count>1"><i class="iconfont icon-arrows_right"></i></span>
+        <span class="next" @click="emits('next', props.name)" v-show="controls"><i class="iconfont icon-arrows_right"></i></span>
         <div class="calendar-list" v-if="showCalendar" @click="showCalendar = false">
             <div @click.stop>
                 <datepicker language="zh" :inline="true" :value="value" :highlighted="highlighted" @selected="onSelected"></datepicker>
@@ -16,7 +16,7 @@ import Datepicker from '@/components/datepicker/Datepicker'
 const props = defineProps({
     name: String,
     value: Date,
-    count:Number,
+    controls:Boolean,
     highlighted: Object,
 })
 const emits = defineEmits(['prev', 'selected', 'next', 'pick'])

+ 6 - 0
src/components/header/index.vue

@@ -41,6 +41,7 @@
     <Toast v-if="showCopyDone" content="复制成功" />
     <Toast v-if="showTips" :content="showTips" :close="() => (showTips = null)" />
     <Login v-if="showLogin" @close="showLogin = false" @user="info => (user = info)" />
+    <Loading v-if="showLoading"/>
     <CopyLink v-if="showLink" @close="showLink = false" @done="showCopyDone = true;showLink = false" />
 </template>
 <script setup>
@@ -48,6 +49,7 @@ import { ref, defineProps, onMounted, watchEffect } from 'vue'
 import { http } from '@/utils/request'
 import browser from '@/utils/browser'
 import Toast from '@/components/dialog/Toast'
+import Loading from '@/components/loading/Loading'
 import Login from './Login'
 import CopyLink from './CopyLink'
 import sync from '@/utils/sync'
@@ -61,6 +63,7 @@ const emits = defineEmits(['update'])
 const user = ref(null)
 const points = ref({ p1: null, p2: null })
 const showLink = ref(false)
+const showLoading = ref(false)
 const showLogin = ref(false)
 const showCopyDone = ref(false)
 const showTips = ref(null)
@@ -127,11 +130,13 @@ const onCancel = () => {
     window.location.href = window.location.href.replace('&adjust', '')
 }
 const onSubmit = () => {
+    showLoading.value = true
     http.post(`smart-site/project/updatePanos`, {
         projectId: props.project.projectId,
         panos: JSON.stringify(points.value),
     })
         .then(response => {
+            showLoading.value = false
             if (response.success) {
                 showTips.value = 'BIM同步成功'
                 setTimeout(() => {
@@ -144,6 +149,7 @@ const onSubmit = () => {
             }
         })
         .catch(() => {
+            showLoading.value = false
             showTips.value = '连接服务器失败'
         })
 }

+ 45 - 15
src/pages/SViewer.vue

@@ -1,6 +1,6 @@
 <template>
-    <main v-if="source">
-        <iframe ref="sourceFrame" :src="sourceURL" frameborder="0" @load="onLoadSource"></iframe>
+    <main>
+        <iframe ref="sourceFrame" v-if="sourceURL" :src="sourceURL" frameborder="0" @load="onLoadSource"></iframe>
         <div class="model" v-show="!showAdjust">
             <div class="bim" :class="{ active: bimChecked, disable: project && !project.bimData }">
                 <div @click="onBimChecked">
@@ -9,7 +9,7 @@
                 <span v-show="showBimTips">BIM</span>
             </div>
         </div>
-        <div class="tools" v-show="!bimChecked">
+        <div class="tools"  v-if="source" v-show="!bimChecked">
             <div class="item-date">
                 <Calendar :value="sourceDate" :highlighted="sourceDays" @selected="onSelected" @prev="onPrevDate" @next="onNextDate" />
             </div>
@@ -28,13 +28,15 @@ import { http } from '@/utils/request'
 import Toast from '@/components/dialog/Toast'
 import browser from '@/utils/browser'
 import Calendar from '@/components/calendar/mobile.vue'
-import sync, { loadSourceScene, loadTargetScene , setPanoWithBim} from '@/utils/sync'
+import sync, {laserChangeMode, loadSourceScene, loadTargetScene , setPanoWithBim} from '@/utils/sync'
 
 // 点位信息
 let lastFakeApp = null
 let panoData
-const showBimTips = ref(false)
 
+// 是否BIM模式
+const showBim = ref(browser.urlHasValue('bim'))
+const showBimTips = ref(false)
 const showTips = ref(null)
 const bimChecked = ref(null)
 const sourceFrame = ref(null)
@@ -63,7 +65,7 @@ const sourceURL = computed(() => {
         // 获取当前点位旋转值
         if (sourceFrame.value && sourceFrame.value.contentWindow.app && sourceFrame.value.contentWindow.app.Camera) {
             let sdk = sourceFrame.value.contentWindow.app
-            lastFakeApp = sync.views.createTempApp(sourceFrame.value.contentWindow, true);
+            lastFakeApp = sync.views.createFakeApp(sourceFrame.value.contentWindow, true);
               
             //pose = '&'+sdk.Camera.getPoseUrlParams()
         }
@@ -74,12 +76,16 @@ const sourceURL = computed(() => {
         return `smart-kankan.html?m=${source.value.num}`//`smart-laser.html?m=${source.value.num}&dev`
     }*/ 
     
-    if(sourceFrame.value && (bimChecked.value || sourceFrame.value.contentWindow.app || sourceFrame.value.contentWindow.loaded)){
-        sync.views.addViewInfo(sourceFrame.value.contentWindow)
+    if(lastFakeApp/*sourceFrame.value && (bimChecked.value || sourceFrame.value.contentWindow.app || sourceFrame.value.contentWindow.loaded)*/){
+        sync.views.fakeAppUpdateInfo(sourceFrame.value.contentWindow)  //这两个怎么都会报错? bim的得不到app.viewer
     }
     if(bimChecked.value){
         return `smart-bim.html?m=${project.value.bimData.bimOssFilePath}`
-    }else if(source.value.type < 2) {
+    }
+    if(!source.value){
+        return
+    }
+    if(source.value.type < 2) {
         return `smart-kankan.html?m=${source.value.num}`
     } else {
         return `smart-laser.html?m=${source.value.num}&dev`
@@ -99,8 +105,10 @@ const onLoadSource = () => {
             }
             
               
-        } 
-        lastFakeApp = sync.views.createTempApp(sourceFrame.value.contentWindow);  
+        }
+        if(project.value.sceneList.length) {
+            lastFakeApp = sync.views.createFakeApp(sourceFrame.value.contentWindow);  
+        }
     } 
 
  
@@ -119,8 +127,16 @@ const onLoadSource = () => {
     }else{ 
         win.sceneType = 'laser' 
         win.loaded.then(sdk => { 
-            loaded() 
-        }) 
+            sync.views.laserInit(win, mode.value)
+            loaded();
+            
+            /*setTimeout(()=>{//laser的代码中莫名会请求showPointCloud,所以尽量晚一点覆盖它
+                if(win.Potree){
+                    win.Potree.settings.displayMode = mode.value == 0 ? "showPanos" : "showPointCloud"
+                }
+            }, sync.views.settings.checkModeDelay)*/
+            
+         }) 
     }
      
      
@@ -167,6 +183,7 @@ const onModeChange = targetMode => {
     if (sourceFrame.value && sourceFrame.value.contentWindow.loaded) {
         sourceFrame.value.contentWindow.loaded.then(sdk => sdk.scene.changeMode(targetMode))
         mode.value = targetMode
+        sync.views.laserChangeMode(mode.value)
     }
 }
 
@@ -227,13 +244,26 @@ const onBimChecked = () => {
 }
 
 onMounted(() => {
+    const num = browser.valueFromUrl('m') || ''
     const projectId = browser.valueFromUrl('projectId') || 1
-    http.get(`smart-site/project/info?projectId=${projectId}`)
+    http.get(`smart-site/project/info?projectId=${projectId}&sceneOrder=asc`)
         .then(response => {
             if (response.success) {
                 project.value = response.data
+                if (showBim.value) {
+                    onBimChecked()
+                }
                 if (project.value.sceneList.length) {
-                    source.value = project.value.sceneList[0]
+                    if (num) {
+                        source.value = project.value.sceneList.find(c => c.num == num)
+                    } else {
+                        source.value = project.value.sceneList[project.value.sceneList.length-1]
+                    }
+                    if (!source.value) {
+                        return  showTips.value = '当前场景已被删除,无法进行查看'
+                    }
+                } else {
+                        return  showTips.value = '当前场景已被删除,无法进行查看'
                 }
                 if(response.data.panos){
                     response.data.panos = JSON.parse(response.data.panos)

+ 46 - 22
src/pages/Viewer.vue

@@ -6,7 +6,7 @@
                 <iframe ref="sourceFrame" v-if="sourceURL" :src="sourceURL" frameborder="0" @load="onLoadSource"></iframe>
                 <div class="tools" v-if="source" v-show="!showAdjust && !fscChecked && (dbsChecked || (!target && !bimChecked))">
                     <div class="item-date">
-                        <calendar name="source" :count="scenes.length" :value="sourceDate" :highlighted="sourceDays" @selected="onSelected" @pick="onPickDate" @prev="onPrevDate" @next="onNextDate"></calendar>
+                        <calendar name="source" :count="scenes.length" :controls="controls" :value="sourceDate" :highlighted="sourceDays" @selected="onSelected" @pick="onPickDate" @prev="onPrevDate" @next="onNextDate"></calendar>
                     </div>
                     <div class="item-mode" v-if="source.type == 2">
                         <div class="iconfont icon-show_roaming" :class="{ active: mode == 0 }" @click="onModeChange(0)"></div>
@@ -28,12 +28,12 @@
                 <iframe ref="targetFrame" :src="targetURL" frameborder="0" @load="onLoadTarget"></iframe>
                 <div class="tools" v-show="!fscChecked && !bimChecked">
                     <div class="item-date target">
-                        <calendar name="target" :value="targetDate" :highlighted="targetDays" @selected="onSelected" @pick="onPickDate" @prev="onPrevDate" @next="onNextDate"></calendar>
+                        <calendar name="target" :count="scenes.length" :controls="controls" :value="targetDate" :highlighted="targetDays" @selected="onSelected" @pick="onPickDate" @prev="onPrevDate" @next="onNextDate"></calendar>
                     </div>
                 </div>
                 <div class="points" v-if="showAdjust">
                     <div :class="{ active: points.p1 }" @click="onP1Click('right')">
-                        <i class="iconfont" :class="[points.p1 ? 'icon-positioning01' : 'icon-positioning02']"></i>
+                        <i class="iconfont"  :class="[points.p1 ? 'icon-positioning01' : 'icon-positioning02']"></i>
                         <span>P1</span>
                     </div>
                     <div :class="{ active: points.p2 }" @click="onP2Click('right')">
@@ -43,15 +43,17 @@
                 </div>
             </div>
             <div class="model" v-show="!showAdjust">
-                <div class="bim" :class="{ active: bimChecked, disable: project && !project.bimData }" v-show="!fscChecked">
+                <div class="bim" :class="{ active: bimChecked, disable: bimDisable }" v-show="!fscChecked  && !showBim">
                     <div @click="onBimChecked">
                         <i class="iconfont icon-BIM"></i>
                         <span>BIM</span>
                     </div>
                 </div>
-                <div class="dbs" :class="{ active: dbsChecked, disable: scenes.length < 2 && !bimChecked }" @click="onDbsChecked" v-show="!fscChecked">
-                    <i class="iconfont icon-split_screen"></i>
-                    <span>分屏</span>
+                <div class="dbs" :class="{ active: dbsChecked, disable: dbsDisable }"  v-show="!fscChecked && !showBim">
+                    <div @click="onDbsChecked">
+                        <i class="iconfont icon-split_screen"></i>
+                        <span>分屏</span>
+                    </div>
                 </div>
                 <div class="fsc" :class="{ active: fscChecked }" @click="onFscChecked">
                     <i class="iconfont" :class="[fscChecked ? 'icon-full_screen_selected' : 'icon-full_screen_normal']"></i>
@@ -70,7 +72,7 @@ import browser from '@/utils/browser'
 import Toast from '@/components/dialog/Toast'
 import AppHeader from '@/components/header'
 import Calendar from '@/components/calendar'
-import sync, { beforeChangeURL, loadSourceScene, loadTargetScene, setPanoWithBim, flyToP1P2} from '@/utils/sync'
+import sync, { laserChangeMode, beforeChangeURL, loadSourceScene, loadTargetScene, setPanoWithBim, flyToP1P2} from '@/utils/sync'
 
 // 是否BIM模式
 const showBim = ref(browser.urlHasValue('bim'))
@@ -107,6 +109,12 @@ const scenes = computed(() => {
         }
     })
 })
+const controls = computed(()=>{
+    if(bimChecked.value){
+        return scenes.value.length>1
+    }
+    return dbsChecked.value? scenes.value.length>2: scenes.value.length>1
+})
 const sourceURL = computed(() => {
 
     beforeChangeURL('source' ) 
@@ -185,13 +193,28 @@ const targetDays = computed(() => {
     }
 })
 
+const bimDisable = computed(()=>{
+    if(!project.value || !project.value.bimData){
+        return true
+    }
+})
+
+const dbsDisable = computed(()=>{
+    if(scenes.value.length == 0){ // 没有场景的情况
+        return 1
+    }
+    if(!bimChecked.value && scenes.value.length == 1){ // 只有1个场景的情况
+        return 2
+    }
+})
+
 const onLoadSource = () => {
     if (bimChecked.value && !dbsChecked.value) {
         // BIM单屏模式
         return
     }
 
-    loadSourceScene(sourceFrame, source.value.type < 2 ? 'kankan' : 'laser')
+    loadSourceScene(sourceFrame, source.value.type < 2 ? 'kankan' : 'laser', mode.value)
 }
 const onLoadTarget = () => {
     if (bimChecked.value) {
@@ -206,6 +229,7 @@ const onModeChange = targetMode => {
     if (sync.sourceInst) {
         sync.sourceInst.loaded.then(sdk => sdk.scene.changeMode(targetMode))
         mode.value = targetMode
+        sync.views.laserChangeMode(mode.value)
     }
 }
 const onPickDate = name => {
@@ -256,7 +280,7 @@ const onPrevDate = name => {
         index = scenes.value.length - 1
     }
 
-    if (target.value) {
+    if (target.value && !bimChecked.value) {
         // 分屏模式判断
         if (name == 'source') {
             if (scenes.value[index].createTime == target.value.createTime) {
@@ -289,7 +313,7 @@ const onNextDate = name => {
         index = 0
     }
 
-    if (target.value) {
+    if (target.value && !bimChecked.value) {
         // 分屏模式判断
         if (name == 'source') {
             if (scenes.value[index].createTime == target.value.createTime) {
@@ -311,9 +335,8 @@ const onNextDate = name => {
 
 // bim点击
 const onBimChecked = () => {
-    if (!project.value || !project.value.bimData) {
-        showTips.value = '未发现BIM文件'
-        return
+    if (bimDisable.value) {
+        return showTips.value = '未发现BIM文件'
     }
     if (bimChecked.value) {
         bimChecked.value = false
@@ -341,15 +364,14 @@ const onBimChecked = () => {
 
 // 分屏点击
 const onDbsChecked = () => {
-    if (!dbsChecked.value && scenes.value.length < 2 && !bimChecked.value) {
-        showTips.value = '未发现对比场景'
-        return
+    if(dbsDisable.value && !dbsChecked.value){
+        return showTips.value = '未发现对比场景'        
     }
     dbsChecked.value = !dbsChecked.value
     if (dbsChecked.value) {
         if (bimChecked.value) {
             // BIM分屏
-            source.value = scenes.value[0]
+            source.value = scenes.value[scenes.value.length-1]
             target.value = project.value.bimData
         } else {
             // 四维看看、激光场景分屏
@@ -364,8 +386,6 @@ const onDbsChecked = () => {
         }
     } else {
         target.value = null
-        //targetApp = null
-        views.clear()
     }
 }
 
@@ -427,7 +447,7 @@ const onP2Click = (type) =>{
 onMounted(() => {
     const num = browser.valueFromUrl('m') || ''
     const projectId = browser.valueFromUrl('projectId') || 1
-    http.get(`smart-site/project/info?projectId=${projectId}`)
+    http.get(`smart-site/project/info?projectId=${projectId}&sceneOrder=asc`)
         .then(response => {
             if (response.success) {
                 if (response.data) {
@@ -451,14 +471,18 @@ onMounted(() => {
                     else if (project.value.sceneList.length) {
                         if (num) {
                             source.value = project.value.sceneList.find(c => c.num == num)
+                        } else {
+                            source.value = project.value.sceneList[project.value.sceneList.length-1]
                         }
                         if (!source.value) {
-                            source.value = project.value.sceneList[0]
+                           return  showTips.value = '当前场景已被删除,无法进行查看'
                         }
                         if (showAdjust.value || showSplit.value) {
                             onBimChecked()
                             nextTick(() => onDbsChecked())
                         }
+                    } else {
+                        return  showTips.value = '当前场景已被删除,无法进行查看'
                     }
                 }
             } else {

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 608 - 510
src/utils/ConvertViews.js


+ 18 - 52
src/utils/sync.js

@@ -8,50 +8,29 @@ let sourceApp = null,
   
 const isEdit = browser.urlHasValue('adjust')
 
-let panoData //= {p1:{id:0},p2:{id:1}}//默认
-let targetPano /* = isEdit ? null : [//targetPano
-                        {position: new THREE.Vector3( -5.313605730801787,  -4.889868407960505,  1.237447893355817),},
-                        {position: new THREE.Vector3( -5.337403524084278,  -2.5012228235167737, 1.2808838933558175),} 
-                    ]    */
+let panoData 
+let targetPano
+ 
 export function setPanoWithBim(data){
     if(!isEdit){
         panoData = data 
      }  
 }
-
 export function flyToP1P2(data){
     //left
-    if(sourceApp.sceneType == 'laser'){
-        sourceApp.viewer.images360.flyToPano({pano:sourceApp.viewer.images360.getPano(data.id)}) 
-    }else{
-        let player = sourceApp.app.core.get('Player')
-        player.flyToPano({pano:model.panos.index[data.id]})  
-    }
+    views.flyToPano(sourceApp, data.id,  {duration : views.settings.durations.flyToPano}) 
     
-    {//right
-        views.bimFlyTo({position:data.position})
-    }
+    //right
+    views.bimFlyTo({position:data.position,  duration : views.settings.durations.flyToPano}) 
 }
+ 
 
-/* const getSourcePanos = (sourceApp)=>{
-    let sourcePanos
-    if(sourceApp.sceneType == 'laser'){  
-        sourcePanos = [sourceApp.viewer.images360.panos[panoData.p1.id], sourceApp.viewer.images360.panos[panoData.p2.id]], //sourceApp.viewer.images360.panos.slice(0, 2),
-          
-        sourceApp.Potree.settings.rotAroundPoint = false
-        
-    }else if(sourceApp.sceneType == 'kankan'){ 
-        sourcePanos = [sourceApp.app.core.get('Player').model.panos.index[panoData.p1.id], sourceApp.app.core.get('Player').model.panos.index[panoData.p2.id]],//sourceApp.app.core.get('Player').model.panos.list.slice(0, 2), 
-        
-    }
-    return sourcePanos
-} */
  
 const initConvertView = (isSwitchScene) => {  
 
     if (sourceApp && targetApp) {
         if(targetApp.sceneType == 'bim'){  
-            views.bindWithBim( sourceApp, targetApp, panoData/* getSourcePanos(sourceApp),  targetPano */) 
+            views.bindWithBim( sourceApp, targetApp, panoData ) 
             
         }else if(sourceApp.sceneType == targetApp.sceneType){
             
@@ -85,7 +64,7 @@ export function beforeChangeURL(which  ){
  * 左屏加载
  * @param {String} type kankan|laser
  */
-export function loadSourceScene(sourceFrame,type) {
+export function loadSourceScene(sourceFrame,type,mode) {
      
     /* if (views.loaded ) {
         isSwitchScene = true
@@ -105,8 +84,9 @@ export function loadSourceScene(sourceFrame,type) {
     
     
     if(type == 'laser'){
-        win.loaded.then(sdk => { 
-            laserLoaded(win)
+        win.loaded.then(sdk => {
+            //sdk.scene.changeMode(mode)  
+            views.laserInit(win,mode)
             loaded()
         })  
     }else if(type == 'kankan'){  
@@ -117,6 +97,7 @@ export function loadSourceScene(sourceFrame,type) {
     }
 }
 
+ 
 /**
  * 右屏加载
  * @param {String} type kankan|laser|bim
@@ -153,7 +134,7 @@ export function loadTargetScene(targetFrame, type, mode) {
         win.loaded.then(sdk => {
             //targetApp.viewer.scene.changeMode(mode)  
             if(type == 'laser'){
-                laserLoaded(win)
+                views.laserInit(win,mode)
             }else if(type == 'bim'){
             } 
           
@@ -179,30 +160,15 @@ window.Log = function(value, color, fontSize){
     console.warn(`%c${value}`, `color:${color};font-size:${fontSize}px`) 
 }
   
-function laserLoaded(app){
-    if(!app.viewer){
-        return console.error('!app.viewer', app.viewer)
-    }
-    
-    
-    app.viewer.mainViewport.view.minPitch += 0.01 //防止bim垂直视角上的闪烁(似乎是因 up 要乘以某矩阵导致微小偏差所致)
-    app.viewer.mainViewport.view.minPitch -= 0.01
-    app.viewer.images360.panos.forEach(pano=>{
-        app.viewer.updateVisible(pano.label2, 'notDisplay', true)
-        pano.dispatchEvent({type:'changeMarkerTex',name:'ring'})
-    }) 
-    //app.Potree.settings.pointDensity = 'high'
-    app.Potree.settings.UserDensityPercent = 1 ; //因为nodeMaxLevel不同,感觉只有最高质量能看起来一样
-    app.viewer.setPointLevels()
-    app.Potree.settings.rotAroundPoint = false   //去除原因:比较好同步,尤其当左边在当前点位,右边同步后却离开当前点位的话拖拽就会绕点旋转了
-}
+ 
 
+ 
 
-window.addEventListener('mouseup',(e)=>{
+window.addEventListener('mouseup',(e)=>{//拖拽出窗口外才执行
     //iframe的window的mouseup 在拖拽出窗口外居然不执行,只好用全局的通知它们
     sourceApp && sourceApp.sceneType == 'laser' && sourceApp.viewer && sourceApp.viewer.inputHandler.onMouseUp(e)  
     targetApp && targetApp.sceneType == 'laser' && targetApp.viewer && targetApp.viewer.inputHandler.onMouseUp(e) 
-    views.dispatchEvent({type:'globalMouseUp'})
+    views.dispatchEvent({type:'mouseupOutOfWin', evt:e})
 
 })