sync.js 6.8 KB

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