sync.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import ConvertViews from '@/utils/ConvertViews'
  2. import browser from '@/utils/browser'
  3. const views = new ConvertViews()
  4. let sourceApp = null,
  5. targetApp = null
  6. const isEdit = browser.urlHasValue('adjust')
  7. let panoData //= {p1:{id:0},p2:{id:1}}//默认
  8. let targetPano /* = isEdit ? null : [//targetPano
  9. {position: new THREE.Vector3( -5.313605730801787, -4.889868407960505, 1.237447893355817),},
  10. {position: new THREE.Vector3( -5.337403524084278, -2.5012228235167737, 1.2808838933558175),}
  11. ] */
  12. export function setPanoWithBim(data){
  13. if(!isEdit){
  14. panoData = data
  15. }
  16. }
  17. export function flyToP1P2(data){
  18. //left
  19. if(sourceApp.sceneType == 'laser'){
  20. sourceApp.viewer.images360.flyToPano({pano:sourceApp.viewer.images360.getPano(data.id)})
  21. }else{
  22. let player = sourceApp.app.core.get('Player')
  23. player.flyToPano({pano:model.panos.index[data.id]})
  24. }
  25. {//right
  26. views.bimFlyTo({position:data.position})
  27. }
  28. }
  29. /* const getSourcePanos = (sourceApp)=>{
  30. let sourcePanos
  31. if(sourceApp.sceneType == 'laser'){
  32. sourcePanos = [sourceApp.viewer.images360.panos[panoData.p1.id], sourceApp.viewer.images360.panos[panoData.p2.id]], //sourceApp.viewer.images360.panos.slice(0, 2),
  33. sourceApp.Potree.settings.rotAroundPoint = false
  34. }else if(sourceApp.sceneType == 'kankan'){
  35. 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),
  36. }
  37. return sourcePanos
  38. } */
  39. const initConvertView = (isSwitchScene) => {
  40. if (sourceApp && targetApp) {
  41. if(targetApp.sceneType == 'bim'){
  42. views.bindWithBim( sourceApp, targetApp, panoData/* getSourcePanos(sourceApp), targetPano */)
  43. }else if(sourceApp.sceneType == targetApp.sceneType){
  44. views.bindWithSameType(sourceApp,targetApp, isSwitchScene)
  45. }
  46. }
  47. }
  48. export function singleConvert(lastFakeApp, targetApp ){//单屏转换
  49. if(targetApp.sceneType == 'bim'){
  50. views.fakeWithBim(lastFakeApp, targetApp, getSourcePanos(sourceApp), targetPano)
  51. }
  52. }
  53. let isSwitchScene
  54. export function beforeChangeURL(which ){
  55. //if (views.loaded ) {
  56. isSwitchScene = true
  57. views.clear({ dontClearTarget: targetApp && targetApp.sceneType == 'bim' })
  58. //}
  59. }
  60. /**
  61. * 左屏加载
  62. * @param {String} type kankan|laser
  63. */
  64. export function loadSourceScene(sourceFrame,type,mode) {
  65. /* if (views.loaded ) {
  66. isSwitchScene = true
  67. views.clear({ dontClearTarget: targetApp.sceneType == 'bim' })
  68. } */
  69. Log('loadSourceScene, ' + type)
  70. sourceApp = window.app1 = null
  71. let win = sourceFrame.value.contentWindow
  72. win.sceneType = type
  73. let loaded = ()=>{
  74. sourceApp = window.app1 = win
  75. initConvertView(isSwitchScene && 'source')
  76. }
  77. if(type == 'laser'){
  78. win.loaded.then(sdk => {
  79. sdk.scene.changeMode(mode)
  80. laserLoaded(win)
  81. loaded()
  82. })
  83. }else if(type == 'kankan'){
  84. win.app.Scene.on('loaded', (e) => {
  85. loaded()
  86. })
  87. }
  88. }
  89. /**
  90. * 右屏加载
  91. * @param {String} type kankan|laser|bim
  92. * @param {mode} mode 0|1
  93. */
  94. export function loadTargetScene(targetFrame, type, mode) {
  95. Log('loadTargetScene, ' + type)
  96. if (views.loaded ) {
  97. views.clear( )
  98. }
  99. targetApp = window.app2 = null
  100. let win = targetFrame.value.contentWindow //其实只用赋值一次
  101. win.sceneType = type
  102. let loaded = ()=>{
  103. targetApp = window.app2 = win
  104. initConvertView( 'target')
  105. }
  106. if(type == 'kankan'){
  107. win.app.Scene.on('loaded', () => {
  108. loaded()
  109. })
  110. }else{
  111. win.loaded.then(sdk => {
  112. //targetApp.viewer.scene.changeMode(mode)
  113. if(type == 'laser'){
  114. laserLoaded(win)
  115. }else if(type == 'bim'){
  116. }
  117. loaded()
  118. })
  119. }
  120. }
  121. /* views.addEventListener('sendCameraData', e => {
  122. //同步右侧数据到左侧
  123. if(sourceApp.sceneType == 'laser'){
  124. sourceApp.viewer.mainViewport.view.position.copy(e.data.position)
  125. sourceApp.viewer.mainViewport.view.lookAt(e.data.target)
  126. }
  127. }) */
  128. window.Log = function(value, color, fontSize){
  129. color = color || '#ff4399'
  130. fontSize = fontSize || 13
  131. console.warn(`%c${value}`, `color:${color};font-size:${fontSize}px`)
  132. }
  133. function laserLoaded(app){
  134. if(!app.viewer){
  135. return console.error('!app.viewer', app.viewer)
  136. }
  137. app.viewer.mainViewport.view.minPitch += 0.01 //防止bim垂直视角上的闪烁(似乎是因 up 要乘以某矩阵导致微小偏差所致)
  138. app.viewer.mainViewport.view.minPitch -= 0.01
  139. app.viewer.images360.panos.forEach(pano=>{
  140. app.viewer.updateVisible(pano.label2, 'notDisplay', true)
  141. pano.dispatchEvent({type:'changeMarkerTex',name:'ring'})
  142. })
  143. //app.Potree.settings.pointDensity = 'high'
  144. app.Potree.settings.UserDensityPercent = 1 ; //因为nodeMaxLevel不同,感觉只有最高质量能看起来一样
  145. app.viewer.setPointLevels()
  146. app.Potree.settings.rotAroundPoint = false //去除原因:比较好同步,尤其当左边在当前点位,右边同步后却离开当前点位的话拖拽就会绕点旋转了
  147. }
  148. window.addEventListener('mouseup',(e)=>{
  149. //iframe的window的mouseup 在拖拽出窗口外居然不执行,只好用全局的通知它们
  150. sourceApp && sourceApp.sceneType == 'laser' && sourceApp.viewer && sourceApp.viewer.inputHandler.onMouseUp(e)
  151. targetApp && targetApp.sceneType == 'laser' && targetApp.viewer && targetApp.viewer.inputHandler.onMouseUp(e)
  152. views.dispatchEvent({type:'globalMouseUp'})
  153. })
  154. export default {
  155. views,
  156. get sourceInst() {
  157. return sourceApp
  158. },
  159. get targetInst() {
  160. return targetApp
  161. },
  162. }
  163. /*
  164. matchPanos:[
  165. {
  166. id: 0,
  167. position : {x: 1, y: 1, z: 1}
  168. },
  169. {
  170. id: 3
  171. position : {x: 2, y: 1, z: 2}
  172. }
  173. ]
  174. */