fuse-model.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import {
  2. computed,
  3. reactive,
  4. ref,
  5. watch,
  6. watchEffect,
  7. watchPostEffect,
  8. } from "vue";
  9. import {
  10. autoSetModeCallback,
  11. unSetModelUpdate,
  12. createTemploraryID,
  13. } from "./sys";
  14. import { custom } from "@/env";
  15. import {
  16. fetchFuseModels,
  17. postAddFuseModel,
  18. postDeleteFuseModel,
  19. postUpdateFuseModels,
  20. SceneType,
  21. SceneStatus,
  22. } from "@/api";
  23. import {
  24. deleteStoreItem,
  25. updateStoreItem,
  26. fetchStoreItems,
  27. saveStoreItems,
  28. deepIsRevise,
  29. } from "@/utils";
  30. import { initialTaggings } from "./tagging";
  31. import { initialMeasures } from "./measure";
  32. import type { FuseModel as SModel, FuseModelAttrs } from "@/api";
  33. import { isUnSet } from "@/utils/unset";
  34. export type FuseModel = SModel & {
  35. loaded: boolean;
  36. error: boolean;
  37. progress: number;
  38. };
  39. export type FuseModels = FuseModel[];
  40. export type { FuseModelAttrs } from "@/api";
  41. export const fuseModels = ref<FuseModels>([]);
  42. export const dynamicAddedModelIds = ref<FuseModel["id"][]>([]);
  43. export const defaultFuseModelAttrs: FuseModelAttrs = {
  44. show: true,
  45. scale: 100,
  46. opacity: 100,
  47. bottom: 0,
  48. position: { x: 0, y: 0, z: 0 },
  49. rotation: { x: 0, y: 0, z: 0 },
  50. };
  51. export const createFuseModels = (model: Partial<FuseModel> = {}): FuseModel =>
  52. serviceToLocal({
  53. id: createTemploraryID(),
  54. modelId: 0,
  55. fusionNumId: 0,
  56. url:[ ""],
  57. fusionId: 0,
  58. title: "",
  59. modelType: "glb",
  60. type: SceneType.SWMX,
  61. status: SceneStatus.SUCCESS,
  62. size: 0,
  63. time: new Date().toString(),
  64. ...defaultFuseModelAttrs,
  65. ...model,
  66. });
  67. export const getFuseModel = (modelId: FuseModel["id"]) =>
  68. fuseModels.value.find((model) => model.id === modelId);
  69. let setModel: FuseModel;
  70. export const getFuseModelShowVariable = (model: FuseModel) =>
  71. computed({
  72. get: () => {
  73. return false && custom.modelsChangeStore
  74. ? model.show
  75. : custom.showModelsMap.get(model) || false;
  76. },
  77. set: (show: boolean) => {
  78. if (false && custom.modelsChangeStore) {
  79. model.show = show;
  80. } else {
  81. setModel = model;
  82. custom.showModelsMap.set(model, show);
  83. }
  84. },
  85. });
  86. watchEffect(
  87. () => {
  88. fuseModels.value.forEach((item) => custom.showModelsMap.get(item));
  89. },
  90. { flush: "sync" }
  91. );
  92. export const fuseModelsLoaded = ref(false);
  93. watchPostEffect(() => {
  94. const loaded = fuseModels.value
  95. .filter((model) => getFuseModelShowVariable(model).value)
  96. .every((model) => model.loaded || model.error);
  97. console.log('a?')
  98. fuseModelsLoaded.value = loaded;
  99. });
  100. let bcModels: FuseModels = [];
  101. export const getBackupFuseModels = () => bcModels;
  102. export const backupFuseModels = () => {
  103. console.error('???')
  104. bcModels = JSON.parse(JSON.stringify(fuseModels.value))
  105. console.log('bcModels', bcModels)
  106. for (const model of fuseModels.value) {
  107. initFuseModel(model);
  108. }
  109. };
  110. watch(
  111. fuseModels,
  112. () => {
  113. for (const model of bcModels) {
  114. const newModel = getFuseModel(model.id);
  115. if (newModel) {
  116. model.progress = newModel.progress;
  117. model.error = newModel.error;
  118. model.loaded = newModel.loaded;
  119. }
  120. }
  121. },
  122. { deep: true }
  123. );
  124. const serviceToLocal = (model: SModel): FuseModel => ({
  125. ...model,
  126. error: false,
  127. loaded: false,
  128. progress: 0,
  129. });
  130. const initFuseModel = (model: FuseModel) => {
  131. custom.showModelsMap.has(model) ||
  132. custom.showModelsMap.set(model, model.show);
  133. };
  134. export const recoverFuseModels = () => {
  135. const backupItems = getBackupFuseModels();
  136. fuseModels.value = backupItems.map((oldItem) => {
  137. const model = fuseModels.value.find((item) => item.id === oldItem.id);
  138. return model ? Object.assign(model, oldItem) : serviceToLocal(oldItem);
  139. });
  140. };
  141. export const updateFuseModel = updateStoreItem(
  142. fuseModels,
  143. postUpdateFuseModels
  144. );
  145. export const deleteFuseModel = deleteStoreItem(fuseModels, async (model) => {
  146. await postDeleteFuseModel(model);
  147. const index = dynamicAddedModelIds.value.indexOf(model.id);
  148. ~index && dynamicAddedModelIds.value.splice(index, 1);
  149. });
  150. export const addFuseModel = async (model: FuseModel) => {
  151. const addModel = reactive(serviceToLocal(await postAddFuseModel(model)));
  152. initFuseModel(addModel);
  153. unSetModelUpdate(() => {
  154. fuseModels.value.push(addModel);
  155. dynamicAddedModelIds.value.push(addModel.id);
  156. });
  157. backupFuseModels()
  158. };
  159. export const initialFuseModels = fetchStoreItems(
  160. fuseModels,
  161. fetchFuseModels,
  162. () => {
  163. for (const model of fuseModels.value) {
  164. initFuseModel(model);
  165. }
  166. backupFuseModels();
  167. },
  168. (smodels) => smodels.map(serviceToLocal)
  169. );
  170. export const saveFuseModels = saveStoreItems(fuseModels, getBackupFuseModels, {
  171. update: updateFuseModel,
  172. delete: deleteFuseModel,
  173. });
  174. export const autoSaveFuseModels = autoSetModeCallback(fuseModels, {
  175. isUpdate: (fuseModels) => {
  176. // if (isUnSet) return false
  177. return deepIsRevise(
  178. fuseModels.map((item) => ({
  179. ...item,
  180. loaded: true,
  181. error: true,
  182. progress: 0,
  183. })),
  184. getBackupFuseModels().map((item) => ({
  185. ...item,
  186. loaded: true,
  187. error: true,
  188. progress: 0,
  189. }))
  190. )
  191. },
  192. backup: backupFuseModels,
  193. recovery: async () => {
  194. recoverFuseModels()
  195. await new Promise<void>((resolve) => {
  196. setTimeout(() => {
  197. resolve()
  198. }, 100)
  199. })
  200. },
  201. save: async () => {
  202. await saveFuseModels();
  203. // for (const model of bcModels) {
  204. // const currentModel = getFuseModel(model.id)
  205. // if (currentModel && currentModel.show !== model.show) {
  206. // custom.showModelsMap.set(currentModel, currentModel.show)
  207. // }
  208. // }
  209. await Promise.all([initialTaggings(), initialMeasures()]);
  210. },
  211. });