fuse-model.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. } catch (e) {
  66. console.error(url, e);
  67. }
  68. }
  69. return url
  70. }
  71. const serviceToLocal = (
  72. serviceModel: ServiceFuseModel,
  73. test = false
  74. ): FuseModel => {
  75. return {
  76. show: true,
  77. scale: serviceModel.transform.scale[0],
  78. opacity: serviceModel.opacity || 1,
  79. bottom: serviceModel.bottom || 0,
  80. fusionNumId: serviceModel.fusionNumId,
  81. modelType: serviceModel.sceneData?.modelDateType,
  82. position: serviceModel.transform.position,
  83. rotation: serviceModel.transform.rotation,
  84. id: serviceModel.fusionNumId.toString(),
  85. url: getSceneUrl(serviceModel.sceneData),
  86. title: serviceModel.sceneData
  87. ? serviceModel.sceneData?.name ||
  88. serviceModel.sceneData.sceneName ||
  89. serviceModel.sceneData.modelTitle
  90. : "-",
  91. modelId: serviceModel.sceneData?.modelId,
  92. fusionId: serviceModel.fusionId,
  93. type: serviceModel.sceneData?.type,
  94. size: serviceModel.sceneData?.modelSize,
  95. raw: serviceModel.sceneData,
  96. time: serviceModel.sceneData?.createTime,
  97. status: serviceModel.sceneData
  98. ? serviceModel.sceneData.status
  99. : SceneStatus.ERR,
  100. };
  101. };
  102. const localToService = (
  103. model: FuseModel
  104. ): Omit<ServiceFuseModel, "sceneData"> => ({
  105. fusionId: model.fusionId,
  106. hide: Number(!model.show),
  107. opacity: model.opacity,
  108. fusionNumId: model.fusionNumId,
  109. bottom: model.bottom,
  110. transform: {
  111. position: model.position,
  112. rotation: model.rotation,
  113. scale: [model.scale, model.scale, model.scale],
  114. },
  115. });
  116. export type FuseModels = FuseModel[];
  117. export const fetchFuseModels = async () => {
  118. const serviceModels = await axios.get<ServiceFuseModel[]>(FUSE_MODEL_LIST, {
  119. params: { caseId: params.caseId },
  120. });
  121. console.error(
  122. serviceModels.map((item, index) => serviceToLocal(item, index == 0))
  123. );
  124. return serviceModels.map((item, index) => serviceToLocal(item, index == 0));
  125. };
  126. export const postAddFuseModel = async (model: FuseModel) => {
  127. const upload = localToService(model);
  128. const serviceModel = await axios<ServiceFuseModel>({
  129. url: FUSE_INSERT_MODEL,
  130. method: "POST",
  131. data: {
  132. caseId: params.caseId,
  133. modelId: model.modelId,
  134. hide: upload.hide,
  135. transform: upload.transform,
  136. opacity: upload.opacity,
  137. bottom: upload.bottom,
  138. },
  139. });
  140. return serviceToLocal(serviceModel);
  141. };
  142. export const postUpdateFuseModels = (model: FuseModel) => {
  143. const upload = localToService(model);
  144. return axios.post<undefined>(FUSE_UPDATE_MODEL, {
  145. fusionNumId: upload.fusionNumId,
  146. hide: upload.hide,
  147. transform: upload.transform,
  148. opacity: upload.opacity,
  149. bottom: upload.bottom,
  150. });
  151. };
  152. export const postDeleteFuseModel = (model: FuseModel) => {
  153. return axios.post<undefined>(FUSE_DELETE_MODEL, {
  154. fusionNumId: model.fusionNumId,
  155. });
  156. };