fuse-model.ts 4.7 KB

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