fuse-model.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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. const data =
  74. false && custom.modelsChangeStore
  75. ? model.show
  76. : custom.showModelsMap.get(model);
  77. return data || false;
  78. },
  79. set: (show: boolean) => {
  80. if (false && custom.modelsChangeStore) {
  81. model.show = show;
  82. } else {
  83. setModel = model;
  84. custom.showModelsMap.set(model, show);
  85. }
  86. },
  87. });
  88. watchEffect(
  89. () => {
  90. fuseModels.value.forEach((item) =>
  91. custom.showModelsMap.set(
  92. item,
  93. custom.showModelsMap.has(item) ? custom.showModelsMap.get(item)! : true
  94. )
  95. );
  96. },
  97. { flush: "sync" }
  98. );
  99. export const fuseModelsLoaded = ref(false);
  100. watchPostEffect(() => {
  101. const loaded = fuseModels.value
  102. .filter((model) => getFuseModelShowVariable(model).value)
  103. .every((model) => model.loaded || model.error);
  104. console.log("a?");
  105. fuseModelsLoaded.value = loaded;
  106. });
  107. let bcModels: FuseModels = [];
  108. export const getBackupFuseModels = () => bcModels;
  109. export const backupFuseModels = () => {
  110. console.error("???");
  111. bcModels = JSON.parse(JSON.stringify(fuseModels.value));
  112. console.log("bcModels", bcModels);
  113. for (const model of fuseModels.value) {
  114. initFuseModel(model);
  115. }
  116. };
  117. watch(
  118. fuseModels,
  119. () => {
  120. for (const model of bcModels) {
  121. const newModel = getFuseModel(model.id);
  122. if (newModel) {
  123. model.progress = newModel.progress;
  124. model.error = newModel.error;
  125. model.loaded = newModel.loaded;
  126. }
  127. }
  128. },
  129. { deep: true }
  130. );
  131. const serviceToLocal = (model: SModel): FuseModel => ({
  132. ...model,
  133. error: false,
  134. loaded: false,
  135. progress: 0,
  136. });
  137. const initFuseModel = (model: FuseModel) => {
  138. custom.showModelsMap.has(model) ||
  139. custom.showModelsMap.set(model, model.show);
  140. };
  141. export const recoverFuseModels = () => {
  142. const backupItems = getBackupFuseModels();
  143. fuseModels.value = backupItems.map((oldItem) => {
  144. const model = fuseModels.value.find((item) => item.id === oldItem.id);
  145. return model ? Object.assign(model, oldItem) : serviceToLocal(oldItem);
  146. });
  147. };
  148. export const updateFuseModel = updateStoreItem(
  149. fuseModels,
  150. postUpdateFuseModels
  151. );
  152. export const deleteFuseModel = deleteStoreItem(fuseModels, async (model) => {
  153. await postDeleteFuseModel(model);
  154. const index = dynamicAddedModelIds.value.indexOf(model.id);
  155. ~index && dynamicAddedModelIds.value.splice(index, 1);
  156. });
  157. export const addFuseModel = async (model: FuseModel, attach?: any) => {
  158. const addModel = reactive(serviceToLocal(await postAddFuseModel(model, attach)));
  159. initFuseModel(addModel);
  160. unSetModelUpdate(() => {
  161. fuseModels.value.push(addModel);
  162. dynamicAddedModelIds.value.push(addModel.id);
  163. });
  164. backupFuseModels();
  165. return addModel;
  166. };
  167. export const initialFuseModels = fetchStoreItems(
  168. fuseModels,
  169. fetchFuseModels,
  170. () => {
  171. for (const model of fuseModels.value) {
  172. initFuseModel(model);
  173. }
  174. backupFuseModels();
  175. },
  176. (smodels) => smodels.map(serviceToLocal)
  177. );
  178. export const saveFuseModels = saveStoreItems(fuseModels, getBackupFuseModels, {
  179. update: updateFuseModel,
  180. delete: deleteFuseModel,
  181. });
  182. export const autoSaveFuseModels = autoSetModeCallback(fuseModels, {
  183. isUpdate: (fuseModels) => {
  184. // if (isUnSet) return false
  185. return deepIsRevise(
  186. fuseModels.map((item) => ({
  187. ...item,
  188. loaded: true,
  189. error: true,
  190. progress: 0,
  191. })),
  192. getBackupFuseModels().map((item) => ({
  193. ...item,
  194. loaded: true,
  195. error: true,
  196. progress: 0,
  197. }))
  198. );
  199. },
  200. backup: backupFuseModels,
  201. recovery: async () => {
  202. recoverFuseModels();
  203. await new Promise<void>((resolve) => {
  204. setTimeout(() => {
  205. resolve();
  206. }, 100);
  207. });
  208. },
  209. save: async () => {
  210. await saveFuseModels();
  211. // for (const model of bcModels) {
  212. // const currentModel = getFuseModel(model.id)
  213. // if (currentModel && currentModel.show !== model.show) {
  214. // custom.showModelsMap.set(currentModel, currentModel.show)
  215. // }
  216. // }
  217. await Promise.all([initialTaggings(), initialMeasures()]);
  218. },
  219. });