import axios from './instance' import { TAGGING_POINT_LIST, DELETE_TAGGING_POINT, UPDATE_TAGGING_POINT, INSERT_TAGGING_POINT } from './constant' import type { FuseModel } from './fuse-model' import type { Tagging } from './tagging' import { Tagging3DProps } from '@/sdk' interface ServicePosition { "tagPointId": number, "tagId": number, "fusionNumId": number "modelId"?: number "tagPoint": string, normal: string show3dTitle: number type: string, mat: string fontSize: number, lineHeight: number, visibilityRange: number } export enum TaggingPositionType { '2d' = '2d', '3d' = '3d' } export interface TaggingPosition { id: string, taggingId: Tagging['id'] modelId: FuseModel['id'] normal: SceneLocalPos, localPos: SceneLocalPos fontSize: number, lineHeight: number, globalVisibility: boolean visibilityRange: number type: TaggingPositionType mat: Tagging3DProps['mat'] } export type TaggingPositions = TaggingPosition[] const serviceToLocal = (position: ServicePosition, taggingId?: Tagging['id']): TaggingPosition => ({ id: position.tagPointId.toString(), modelId: position.fusionNumId ? position.fusionNumId.toString() : position.modelId ? position.modelId.toString() : '123123', taggingId: taggingId || position.tagId.toString(), localPos: JSON.parse(position.tagPoint), type: (position.type || TaggingPositionType['2d']) as TaggingPositionType, globalVisibility: Boolean(position.show3dTitle), normal: position.normal ? JSON.parse(position.normal) : { x: 0, y: 0, z: 1 }, mat: position.mat ? JSON.parse(position.mat) : { scale: 1, rotation: 0 }, visibilityRange: position.visibilityRange || 30, fontSize: position.fontSize || 12, lineHeight: position.lineHeight || 1, }) const localToService = (position: TaggingPosition, update = false): PartialProps => ({ "tagPointId": update ? Number(position.id) : undefined, "tagId": Number(position.taggingId), "fusionNumId": Number(position.modelId), "tagPoint": JSON.stringify(position.localPos), show3dTitle: Number(position.globalVisibility), type: position.type, mat: position.mat && JSON.stringify(position.mat), normal: JSON.stringify(position.normal), fontSize: position.fontSize, lineHeight: position.lineHeight, visibilityRange: position.visibilityRange }) export const fetchTaggingPositions = async (taggingId: Tagging['id']) => { const positions = await axios.get(`${TAGGING_POINT_LIST}`, {params: { tagId: taggingId } }) return positions.map(position => serviceToLocal(position, taggingId)) } export const postAddTaggingPosition = async (position: TaggingPosition) => { const servicePosition = await axios.post(INSERT_TAGGING_POINT, localToService(position)) return serviceToLocal(servicePosition) } export const postUpdateTaggingPosition = (position: TaggingPosition) => { return axios.post(UPDATE_TAGGING_POINT, localToService(position, true)) } export const postDeleteTaggingPosition = (position: TaggingPosition) => { return axios.post(DELETE_TAGGING_POINT, { tagPointId: Number(position.id) }) }