index.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import { nextTick, ref, toRaw, watchEffect } from "vue";
  2. import { Pose, SceneModel, sdk, SDK } from "../sdk";
  3. import {
  4. activeModel,
  5. associationModels,
  6. getFuseModel,
  7. sceneModelMap,
  8. } from "./fuseMode";
  9. import { FuseModel, fuseModelsLoaded, GuidePath, setting } from "@/store";
  10. import { associationTaggings } from "./tagging";
  11. import { associationSetting } from "./setting";
  12. import { associationMessaures } from "./measure";
  13. import { custom } from "@/env";
  14. import { associationPaths } from "./path";
  15. export const getSupperPanoModel = () => {
  16. const supperModel = ref<FuseModel | null>(null);
  17. const interval = setInterval(() => {
  18. if (!sdk) return;
  19. clearInterval(interval);
  20. const update = () => {
  21. const data = sdk.canTurnToPanoMode();
  22. if (data?.model) {
  23. const smodel = getFuseModel(data.model)!
  24. supperModel.value = smodel;
  25. } else {
  26. supperModel.value = null;
  27. }
  28. }
  29. watchEffect((onCleanup) => {
  30. const smodels = [...sceneModelMap.values()]
  31. console.log(smodels)
  32. smodels.forEach(smodel => {
  33. smodel.bus.on('transformChanged', update)
  34. })
  35. onCleanup(() => {
  36. smodels.forEach(smodel => {
  37. smodel.bus.off('transformChanged', update)
  38. })
  39. })
  40. })
  41. sdk.sceneBus.on("cameraChange", update);
  42. }, 16);
  43. return supperModel;
  44. };
  45. export const analysisPose = (pose: Pose) => {
  46. if ("model" in pose && pose.model) {
  47. let info: GuidePath["panoInfo"] | undefined = undefined;
  48. let fuseMode = getFuseModel(pose.model);
  49. if (fuseMode!) {
  50. info = {
  51. panoId: pose.panoId,
  52. modelId: fuseMode.id,
  53. posInModel: pose.posInModel,
  54. rotInModel: pose.rotInModel,
  55. };
  56. return {
  57. position: pose.position,
  58. target: pose.target,
  59. panoInfo: info,
  60. };
  61. }
  62. }
  63. return pose;
  64. };
  65. export const analysisPoseInfo = (info: ReturnType<typeof analysisPose>) => {
  66. let pose: Pose = { target: info.target, position: info.position };
  67. if ("panoInfo" in info && info.panoInfo) {
  68. let sceneModel: SceneModel;
  69. for (const [k, v] of Array.from(sceneModelMap.entries())) {
  70. if (k.id === info.panoInfo.modelId) {
  71. sceneModel = toRaw(v);
  72. }
  73. }
  74. if (sceneModel!) {
  75. pose = {
  76. ...pose,
  77. model: sceneModel,
  78. panoId: info.panoInfo.panoId,
  79. posInModel: info.panoInfo.posInModel,
  80. rotInModel: info.panoInfo.rotInModel,
  81. };
  82. }
  83. }
  84. return pose;
  85. };
  86. export const setPose = (info: ReturnType<typeof analysisPose>, _sdk = sdk) => {
  87. const pose = analysisPoseInfo(info);
  88. if ("model" in pose) {
  89. setTimeout(() => {
  90. for (const [k, v] of Array.from(sceneModelMap.entries())) {
  91. if (toRaw(v) === toRaw(pose.model)) {
  92. activeModel({ showMode: "pano", active: k });
  93. return;
  94. }
  95. }
  96. }, 300);
  97. } else {
  98. activeModel({ showMode: "fuse" });
  99. }
  100. setTimeout(() => {
  101. sdk.comeTo({ ...pose, dur: 300 });
  102. });
  103. };
  104. export const setupAssociation = (mountEl: HTMLDivElement, sdk: SDK) => {
  105. associationModels(sdk);
  106. const stopWatch = watchEffect(() => {
  107. if (fuseModelsLoaded.value && setting.value) {
  108. associationTaggings(sdk, mountEl);
  109. associationMessaures(sdk);
  110. associationSetting(sdk, mountEl);
  111. associationPaths(sdk, mountEl)
  112. nextTick(() => stopWatch());
  113. }
  114. });
  115. };
  116. export * from "./fuseMode";
  117. export * from "./guide";
  118. export * from "./measure";
  119. export * from "./setting";
  120. export * from "./tagging";