guide.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { SceneGuide, sdk } from "../sdk";
  2. import { toRaw, ref, watch, watchEffect, computed } from "vue";
  3. import { viewModeStack, showLeftPanoStack, custom, showTaggingsStack, showPathsStack, showMeasuresStack, showSearchStack } from "@/env";
  4. import { togetherCallback, asyncTimeout } from "@/utils";
  5. import { fuseModels, isEdit, sysBus, fuseModelsLoaded, selectPaths } from "@/store";
  6. import type { FuseModel, FuseModels, Guide, GuidePath } from "@/store";
  7. import { analysisPoseInfo } from ".";
  8. import { fullView, isScenePlayRun, pauseScene, playScene } from "@/utils/full";
  9. import { animationGroup, currentTime, play } from "./animation";
  10. // -----------------导览关联--------------------
  11. export const recovery = async (guide: Guide) => {
  12. let rFuseModels: (FuseModel & { viewShow: boolean })[];
  13. try {
  14. if (!guide.recoveryContent) {
  15. throw "没有recovery";
  16. }
  17. rFuseModels = JSON.parse(guide.recoveryContent);
  18. } catch (e) {
  19. return () => {};
  20. }
  21. const initFuseModels = JSON.parse(
  22. JSON.stringify(fuseModels.value)
  23. ) as FuseModels;
  24. const initViewShow = fuseModels.value.map((item) =>
  25. custom.showModelsMap.get(item)
  26. );
  27. const setModels = async (models: (FuseModel & { viewShow: boolean })[]) => {
  28. for (let i = 0; i < models.length; i++) {
  29. const ndx = fuseModels.value.findIndex(
  30. ({ modelId }) => modelId === models[i].modelId
  31. );
  32. if (~ndx) {
  33. Object.assign(fuseModels.value[ndx], models[i]);
  34. custom.showModelsMap.set(
  35. toRaw(fuseModels.value[ndx]),
  36. models[i].viewShow
  37. );
  38. } else {
  39. fuseModels.value.push(models[i]);
  40. custom.showModelsMap.set(toRaw(models[i]), models[i].viewShow);
  41. }
  42. }
  43. // console.log(models)
  44. for (let i = 0; i < fuseModels.value.length; i++) {
  45. const ndx = models.findIndex(
  46. ({ modelId }) => modelId === fuseModels.value[i].modelId
  47. );
  48. if (!~ndx) {
  49. fuseModels.value.splice(i, 1);
  50. i--;
  51. }
  52. }
  53. await asyncTimeout(100);
  54. await new Promise<void>((resolve) => {
  55. const stop = watchEffect(() => {
  56. if (fuseModelsLoaded.value) {
  57. setTimeout(() => stop());
  58. resolve();
  59. }
  60. });
  61. });
  62. };
  63. for (let i = 0; i < fuseModels.value.length; i++) {
  64. const ndx = rFuseModels.findIndex(
  65. ({ modelId }) => modelId === fuseModels.value[i].modelId
  66. );
  67. if (!~ndx) {
  68. rFuseModels.push({ ...fuseModels.value[i], viewShow: false });
  69. }
  70. }
  71. await setModels(rFuseModels);
  72. return () =>
  73. setModels(
  74. initFuseModels.map((item, i) => ({ ...item, viewShow: initViewShow[i]! }))
  75. );
  76. };
  77. export const playSceneGuide = (
  78. paths: GuidePath[],
  79. changeIndexCallback?: (index: number) => void,
  80. forceFull = false,
  81. guide?: Guide
  82. ) => {
  83. let sceneGuide: SceneGuide;
  84. currentTime.value = 0
  85. let pop: (() => void) | null = null
  86. return playScene(
  87. {
  88. create: () => {
  89. sceneGuide = sdk.enterSceneGuide(
  90. paths.map((path) => ({ ...path, ...analysisPoseInfo(path) }))
  91. );
  92. sceneGuide.bus.on("changePoint", (index) => {
  93. if (paths[index - 1].playAnimation) {
  94. play.value = true
  95. }
  96. changeIndexCallback && changeIndexCallback(index);
  97. });
  98. const oldSelect = [...selectPaths.selects.value]
  99. const oldUSelect = [...selectPaths.unSelects.value]
  100. selectPaths.all.value = guide ? guide.showPath : true
  101. pop = togetherCallback([
  102. showTaggingsStack.push(computed(() => guide ? guide.showTagging : true)),
  103. () => {
  104. oldSelect.forEach(item => selectPaths.updateSelectId(item.id, true))
  105. oldUSelect.forEach(item => selectPaths.updateSelectId(item.id, false))
  106. },
  107. // showPathsStack.push(computed(() => guide ? guide.showPath : true)),
  108. showMeasuresStack.push(computed(() => guide ? guide.showMeasure : true)),
  109. showSearchStack.push(ref(false))
  110. ])
  111. },
  112. play: () => {
  113. sceneGuide.play();
  114. return new Promise((resolve) =>
  115. sceneGuide.bus.on("playComplete", resolve)
  116. );
  117. },
  118. pause: () => {
  119. sceneGuide.pause();
  120. play.value = false
  121. },
  122. clear: () => {
  123. currentTime.value = 0
  124. sceneGuide.clear();
  125. pop && pop()
  126. sceneGuide.bus.off("changePoint");
  127. },
  128. },
  129. forceFull
  130. );
  131. };
  132. export const pauseSceneGuide = pauseScene;
  133. export const isScenePlayIng = isScenePlayRun;