fuse-model.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import axios from "./instance";
  2. import {
  3. FUSE_MODEL_LIST,
  4. FUSE_INSERT_MODEL,
  5. FUSE_UPDATE_MODEL,
  6. FUSE_DELETE_MODEL,
  7. } from "./constant";
  8. import { params } from "@/env";
  9. import { Scene, SceneStatus, SceneType } from "./scene";
  10. export interface FuseModelAttrs {
  11. show: boolean;
  12. scale: number;
  13. opacity: number;
  14. bottom: number;
  15. position: SceneLocalPos;
  16. rotation: SceneLocalPos;
  17. }
  18. export interface FuseModel extends FuseModelAttrs {
  19. id: string;
  20. modelId: number;
  21. fusionNumId: number;
  22. url: string[];
  23. title: string;
  24. fusionId: number;
  25. modelType: string;
  26. type: SceneType;
  27. size: number;
  28. status: SceneStatus;
  29. raw?: any;
  30. time: string;
  31. }
  32. interface ServiceFuseModel {
  33. fusionId: number;
  34. hide: number;
  35. opacity: number;
  36. bottom: number;
  37. fusionNumId: number;
  38. transform: {
  39. position: SceneLocalPos;
  40. rotation: SceneLocalPos;
  41. scale: [number, number, number];
  42. };
  43. sceneData: Scene;
  44. }
  45. export const getSceneUrl = (sceneData: Scene) => {
  46. let url: any = [""];
  47. console.log(sceneData, sceneData.type);
  48. if (
  49. [SceneType.SWSS, SceneType.SWYDSS].includes(sceneData.type)
  50. ) {
  51. url = [sceneData.num];
  52. } else {
  53. switch (sceneData.modelDateType) {
  54. case "3dgs":
  55. url = sceneData.model3dgsUrl;
  56. break;
  57. case "shp":
  58. url = sceneData.modelShpUrl;
  59. break;
  60. default:
  61. url = sceneData.modelGlbUrl;
  62. }
  63. try {
  64. url = JSON.parse(url);
  65. url = url.map((u: any) => location.origin + (import.meta.env.DEV ? '/res' : '/') + u)
  66. console.log(url)
  67. } catch (e) {
  68. console.error(url, e);
  69. }
  70. }
  71. return url
  72. }
  73. const serviceToLocal = (
  74. serviceModel: ServiceFuseModel,
  75. test = false
  76. ): FuseModel => {
  77. return {
  78. show: true,
  79. scale: serviceModel.transform.scale[0],
  80. opacity: serviceModel.opacity || 1,
  81. bottom: serviceModel.bottom || 0,
  82. fusionNumId: serviceModel.fusionNumId,
  83. modelType: serviceModel.sceneData?.modelDateType,
  84. position: serviceModel.transform.position,
  85. rotation: serviceModel.transform.rotation,
  86. id: serviceModel.fusionNumId.toString(),
  87. url: getSceneUrl(serviceModel.sceneData),
  88. title: serviceModel.sceneData
  89. ? serviceModel.sceneData?.name ||
  90. serviceModel.sceneData.sceneName ||
  91. serviceModel.sceneData.modelTitle
  92. : "-",
  93. modelId: serviceModel.sceneData?.modelId,
  94. fusionId: serviceModel.fusionId,
  95. type: serviceModel.sceneData?.type,
  96. size: serviceModel.sceneData?.modelSize,
  97. raw: serviceModel.sceneData,
  98. time: serviceModel.sceneData?.createTime,
  99. status: serviceModel.sceneData
  100. ? serviceModel.sceneData.status
  101. : SceneStatus.ERR,
  102. };
  103. };
  104. const localToService = (
  105. model: FuseModel
  106. ): Omit<ServiceFuseModel, "sceneData"> => ({
  107. fusionId: model.fusionId,
  108. hide: Number(!model.show),
  109. opacity: model.opacity,
  110. fusionNumId: model.fusionNumId,
  111. bottom: model.bottom,
  112. transform: {
  113. position: model.position,
  114. rotation: model.rotation,
  115. scale: [model.scale, model.scale, model.scale],
  116. },
  117. });
  118. export type FuseModels = FuseModel[];
  119. export const fetchFuseModels = async () => {
  120. const serviceModels = await axios.get<ServiceFuseModel[]>(FUSE_MODEL_LIST, {
  121. params: { caseId: params.caseId },
  122. });
  123. console.error(
  124. serviceModels.map((item, index) => serviceToLocal(item, index == 0))
  125. );
  126. return serviceModels.map((item, index) => serviceToLocal(item, index == 0));
  127. };
  128. export const postAddFuseModel = async (model: FuseModel) => {
  129. const upload = localToService(model);
  130. const serviceModel = await axios<ServiceFuseModel>({
  131. url: FUSE_INSERT_MODEL,
  132. method: "POST",
  133. data: {
  134. caseId: params.caseId,
  135. modelId: model.modelId,
  136. hide: upload.hide,
  137. transform: upload.transform,
  138. opacity: upload.opacity,
  139. bottom: upload.bottom,
  140. },
  141. });
  142. return serviceToLocal(serviceModel);
  143. };
  144. export const postUpdateFuseModels = (model: FuseModel) => {
  145. const upload = localToService(model);
  146. return axios.post<undefined>(FUSE_UPDATE_MODEL, {
  147. fusionNumId: upload.fusionNumId,
  148. hide: upload.hide,
  149. transform: upload.transform,
  150. opacity: upload.opacity,
  151. bottom: upload.bottom,
  152. });
  153. };
  154. export const postDeleteFuseModel = (model: FuseModel) => {
  155. return axios.post<undefined>(FUSE_DELETE_MODEL, {
  156. fusionNumId: model.fusionNumId,
  157. });
  158. };