import ConvertViews from '@/utils/ConvertViews' import browser from '@/utils/browser' const views = new ConvertViews() let sourceApp = null, targetApp = 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),} ] */ export function setPanoWithBim(data){ if(!isEdit){ panoData = data } } export function flyToP1P2(data){ //left views.flyToPano(sourceApp, data.id, {duration : views.settings.durations.flyToPano}) {//right views.bimFlyTo({position:data.position, duration : views.settings.durations.flyToPano}) } } /* 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]}) } {//right views.bimFlyTo({position:data.position}) } } */ /* 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 */) }else if(sourceApp.sceneType == targetApp.sceneType){ views.bindWithSameType(sourceApp,targetApp, isSwitchScene) } } } export function singleConvert(lastFakeApp, targetApp ){//单屏转换 if(targetApp.sceneType == 'bim'){ views.fakeWithBim(lastFakeApp, targetApp, getSourcePanos(sourceApp), targetPano) } } let isSwitchScene export function beforeChangeURL(which ){ //if (views.loaded ) { isSwitchScene = true views.clear({ dontClearTarget: targetApp && targetApp.sceneType == 'bim' }) //} } /** * 左屏加载 * @param {String} type kankan|laser */ export function loadSourceScene(sourceFrame,type,mode) { /* if (views.loaded ) { isSwitchScene = true views.clear({ dontClearTarget: targetApp.sceneType == 'bim' }) } */ Log('loadSourceScene, ' + type) sourceApp = window.app1 = null let win = sourceFrame.value.contentWindow win.sceneType = type let loaded = ()=>{ sourceApp = window.app1 = win initConvertView(isSwitchScene && 'source') } if(type == 'laser'){ win.loaded.then(sdk => { sdk.scene.changeMode(mode) laserLoaded(win,mode) loaded() }) }else if(type == 'kankan'){ win.app.Scene.on('loaded', (e) => { loaded() }) } } /** * 右屏加载 * @param {String} type kankan|laser|bim * @param {mode} mode 0|1 */ export function loadTargetScene(targetFrame, type, mode) { Log('loadTargetScene, ' + type) if (views.loaded ) { views.clear( ) } targetApp = window.app2 = null let win = targetFrame.value.contentWindow //其实只用赋值一次 win.sceneType = type let loaded = ()=>{ targetApp = window.app2 = win initConvertView( 'target') } if(type == 'kankan'){ win.app.Scene.on('loaded', () => { loaded() }) }else{ win.loaded.then(sdk => { //targetApp.viewer.scene.changeMode(mode) if(type == 'laser'){ laserLoaded(win,mode) }else if(type == 'bim'){ } loaded() }) } } /* views.addEventListener('sendCameraData', e => { //同步右侧数据到左侧 if(sourceApp.sceneType == 'laser'){ sourceApp.viewer.mainViewport.view.position.copy(e.data.position) sourceApp.viewer.mainViewport.view.lookAt(e.data.target) } }) */ window.Log = function(value, color, fontSize){ color = color || '#ff4399' fontSize = fontSize || 13 console.warn(`%c${value}`, `color:${color};font-size:${fontSize}px`) } function laserLoaded(app,mode){ if(!app.viewer){ return console.error('!app.viewer', app.viewer) } app.viewer.images360.cancelFlyToPano() 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 //去除原因:比较好同步,尤其当左边在当前点位,右边同步后却离开当前点位的话拖拽就会绕点旋转了 setTimeout(()=>{//laser的代码中莫名会请求showPointCloud,所以尽量晚一点覆盖它 app.Potree.settings.displayMode = mode == 0 ? "showPanos" : "showPointCloud" },1000) } 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'}) }) export default { views, get sourceInst() { return sourceApp }, get targetInst() { return targetApp }, } /* matchPanos:[ { id: 0, position : {x: 1, y: 1, z: 1} }, { id: 3 position : {x: 2, y: 1, z: 2} } ] */