import { ref } from 'vue' import { autoSetModeCallback, createTemploraryID } from './sys' import { getFuseModel, getFuseModelShowVariable } from './fuse-model' import { custom } from '@/env' import { fetchTaggingPositions, postAddTaggingPosition, postDeleteTaggingPosition, postUpdateTaggingPosition, TaggingPositionType, } from '@/api' import { deleteStoreItem, addStoreItem, updateStoreItem, saveStoreItems, recoverStoreItems } from '@/utils' import type { TaggingPosition, TaggingPositions } from '@/api' import type { Tagging } from './tagging' export type { TaggingPosition, TaggingPositions } export const taggingPositions = ref([]) export const createTaggingPosition = (position: Partial = {}): TaggingPosition => ({ id: createTemploraryID(), taggingId: '', globalVisibility: false, visibilityRange: 30, mat: { scale: 1, rotation: 0 }, lineHeight: 1, fontSize: 12, normal: {x: 0, y: 0, z: 1}, type: TaggingPositionType['2d'], modelId: '', localPos: { x: 0, y: 0, z: 0 }, ...position }) export const getTaggingPositions = (tagging: Tagging) => taggingPositions.value.filter(position => position.taggingId === tagging.id) || [] export const getTaggingPositionIsShow = (position: TaggingPosition) => { const model = getFuseModel(position.modelId) return custom.showTaggings && model && model.loaded && getFuseModelShowVariable(model).value } let bcPositions: TaggingPositions = [] export const getBackupTaggingPositions = () => bcPositions export const backupTaggingPositions = () => { bcPositions = JSON.parse(JSON.stringify(taggingPositions.value)) } export const initTaggingPositionsByTagging = async (tagging: Tagging) => { const positions = await fetchTaggingPositions(tagging.id) taggingPositions.value = taggingPositions.value .filter(position => position.taggingId !== tagging.id) .concat(positions) backupTaggingPositions() } export const recoverTaggingPositions = recoverStoreItems(taggingPositions, getBackupTaggingPositions) export const addTaggingPosition = addStoreItem(taggingPositions, postAddTaggingPosition) export const updateTaggingPosition = updateStoreItem(taggingPositions, postUpdateTaggingPosition) export const deleteTaggingPosition = deleteStoreItem(taggingPositions, postDeleteTaggingPosition) export const saveTaggingPositions = saveStoreItems( taggingPositions, getBackupTaggingPositions, { add: addTaggingPosition, update: updateTaggingPosition, delete: deleteTaggingPosition, } ) export const autoSaveTaggingPositions = autoSetModeCallback(taggingPositions, { backup: backupTaggingPositions, recovery: recoverTaggingPositions, save: saveTaggingPositions, })