fuse-model.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 uploadMaterialToModel = async (uploadId: number) => {
  46. const model = await axios.post<{modelId: number}>('/fusion/model/addByMediaLibrary', {caseId: params.caseId, uploadId})
  47. return model
  48. }
  49. export const getSceneUrl = (sceneData: Scene) => {
  50. let url: any = [""];
  51. if (
  52. [SceneType.SWSS, SceneType.SWYDSS].includes(sceneData.type)
  53. ) {
  54. url = [sceneData.num];
  55. } else {
  56. switch (sceneData.modelDateType) {
  57. case "3dgs":
  58. url = sceneData.model3dgsUrl;
  59. break;
  60. case "shp":
  61. url = sceneData.modelGlbUrl;
  62. break;
  63. default:
  64. url = sceneData.modelGlbUrl;
  65. }
  66. try {
  67. url = JSON.parse(url);
  68. } catch (e) {
  69. if (typeof url === 'string') {
  70. url = [url]
  71. }
  72. console.error(url, e);
  73. }
  74. }
  75. return url
  76. }
  77. const serviceToLocal = (
  78. serviceModel: ServiceFuseModel,
  79. test = false
  80. ): FuseModel => {
  81. return {
  82. show: true,
  83. scale: serviceModel.transform.scale[0],
  84. opacity: serviceModel.opacity || 1,
  85. bottom: serviceModel.bottom || 0,
  86. fusionNumId: serviceModel.fusionNumId,
  87. modelType: serviceModel.sceneData?.modelDateType,
  88. position: serviceModel.transform.position,
  89. rotation: serviceModel.transform.rotation,
  90. id: serviceModel.fusionNumId.toString(),
  91. url: getSceneUrl(serviceModel.sceneData),
  92. title: serviceModel.sceneData
  93. ? serviceModel.sceneData?.name ||
  94. serviceModel.sceneData.sceneName ||
  95. serviceModel.sceneData.modelTitle
  96. : "-",
  97. modelId: serviceModel.sceneData?.modelId,
  98. fusionId: serviceModel.fusionId,
  99. type: serviceModel.sceneData?.type,
  100. size: serviceModel.sceneData?.modelSize,
  101. raw: serviceModel.sceneData,
  102. time: serviceModel.sceneData?.createTime,
  103. status: serviceModel.sceneData
  104. ? serviceModel.sceneData.status
  105. : SceneStatus.ERR,
  106. };
  107. };
  108. const localToService = (
  109. model: FuseModel
  110. ): Omit<ServiceFuseModel, "sceneData"> => ({
  111. fusionId: model.fusionId,
  112. hide: Number(!model.show),
  113. opacity: model.opacity,
  114. fusionNumId: model.fusionNumId,
  115. bottom: model.bottom,
  116. transform: {
  117. position: model.position,
  118. rotation: model.rotation,
  119. scale: [model.scale, model.scale, model.scale],
  120. },
  121. });
  122. export type FuseModels = FuseModel[];
  123. export const fetchFuseModels = async () => {
  124. const serviceModels = await axios.get<ServiceFuseModel[]>(FUSE_MODEL_LIST, {
  125. params: { caseId: params.caseId },
  126. });
  127. console.error(
  128. serviceModels.map((item, index) => serviceToLocal(item, index == 0))
  129. );
  130. return serviceModels.map((item, index) => serviceToLocal(item, index == 0));
  131. };
  132. export const postAddFuseModel = async (model: FuseModel) => {
  133. const upload = localToService(model);
  134. const serviceModel = await axios<ServiceFuseModel>({
  135. url: FUSE_INSERT_MODEL,
  136. method: "POST",
  137. data: {
  138. caseId: params.caseId,
  139. modelId: model.modelId,
  140. hide: upload.hide,
  141. transform: upload.transform,
  142. opacity: upload.opacity,
  143. bottom: upload.bottom,
  144. },
  145. });
  146. return serviceToLocal(serviceModel);
  147. };
  148. export const postUpdateFuseModels = (model: FuseModel) => {
  149. const upload = localToService(model);
  150. return axios.post<undefined>(FUSE_UPDATE_MODEL, {
  151. fusionNumId: upload.fusionNumId,
  152. hide: upload.hide,
  153. transform: upload.transform,
  154. opacity: upload.opacity,
  155. bottom: upload.bottom,
  156. });
  157. };
  158. export const postDeleteFuseModel = (model: FuseModel) => {
  159. return axios.post<undefined>(FUSE_DELETE_MODEL, {
  160. fusionNumId: model.fusionNumId,
  161. });
  162. };