diff --git a/components/label/LabelNossr.tsx b/components/label/LabelNossr.tsx index a00c241..21d989f 100644 --- a/components/label/LabelNossr.tsx +++ b/components/label/LabelNossr.tsx @@ -1511,6 +1511,7 @@ const LabelPage = ({ const restoreDrawShortcutSnapshot = useCallback(() => { useKeyboardStore.getState().setDrawAction("none") + useKeyboardStore.getState().setSelectedObjectEditTarget(null) const snapshot = drawShortcutSnapshotRef.current if (!snapshot) return @@ -1562,6 +1563,7 @@ const LabelPage = ({ setActiveOperation(selectedContext.operationId) usePaperStore.getState().setContinuePolygonTarget(null) + useKeyboardStore.getState().setSelectedObjectEditTarget(selectedContext) setEditMode(true) setDrawOption("default") useKeyboardStore.getState().setDrawAction(mode) @@ -1715,6 +1717,7 @@ const LabelPage = ({ setPressA(false) setActiveOperation(selectedContext.operationId) useKeyboardStore.getState().setDrawAction("none") + useKeyboardStore.getState().setSelectedObjectEditTarget(null) usePaperStore.getState().setContinuePolygonTarget({ imageId: selectedContext.imageId, operationId: selectedContext.operationId, @@ -2367,6 +2370,7 @@ const LabelPage = ({ useEffect(() => { useKeyboardStore.getState().setCopyDataIds([]) useKeyboardStore.getState().setDrawAction("none") + useKeyboardStore.getState().setSelectedObjectEditTarget(null) usePaperStore.getState().setContinuePolygonTarget(null) drawShortcutSnapshotRef.current = null }, [activeImage]) diff --git a/components/label/useKeyBoardStore.tsx b/components/label/useKeyBoardStore.tsx index a9e26bb..0dd39f6 100644 --- a/components/label/useKeyBoardStore.tsx +++ b/components/label/useKeyBoardStore.tsx @@ -1,5 +1,12 @@ import { create } from "zustand" +export interface SelectedObjectEditTarget { + imageId: string + operationId: string + objectId: number + objectType: string +} + interface KeyboardStore { ctrl: boolean setCtrl: (v: boolean) => void @@ -7,6 +14,8 @@ interface KeyboardStore { setShift: (v: boolean) => void drawAction: "none" | "add" | "subtract" setDrawAction: (mode: "none" | "add" | "subtract") => void + selectedObjectEditTarget: SelectedObjectEditTarget | null + setSelectedObjectEditTarget: (target: SelectedObjectEditTarget | null) => void copyDataIds: number[] // ctrl + c 复制数据 setCopyDataIds: (ids: number[]) => void } @@ -15,9 +24,12 @@ export const useKeyboardStore = create((set) => ({ ctrl: false, shift: false, drawAction: "none", + selectedObjectEditTarget: null, copyDataIds: [], setCtrl: (v) => set((state) => ({ ...state, ctrl: v })), setShift: (v) => set((state) => ({ ...state, shift: v })), setDrawAction: (mode) => set((state) => ({ ...state, drawAction: mode })), + setSelectedObjectEditTarget: (target) => + set((state) => ({ ...state, selectedObjectEditTarget: target })), setCopyDataIds: (ids) => set((state) => ({ ...state, copyDataIds: ids })), })) diff --git a/components/label/usePaperStore.ts b/components/label/usePaperStore.ts index db9b32f..7945303 100644 --- a/components/label/usePaperStore.ts +++ b/components/label/usePaperStore.ts @@ -3947,11 +3947,20 @@ export const usePaperStore = create((set) => ({ const getSelectedPolygonContext = () => { const activeImage = useBottomToolsStore.getState().activeImage + const lockedEditTarget = + useKeyboardStore.getState().selectedObjectEditTarget const selectedIds = useObjectStore.getState().selectedPath[activeImage] || [] - if (selectedIds.length !== 1) return null + const selectedId = + lockedEditTarget && + lockedEditTarget.imageId === activeImage && + lockedEditTarget.objectType === "polygon" + ? lockedEditTarget.objectId + : selectedIds.length === 1 + ? selectedIds[0] + : null + if (selectedId === null) return null - const selectedId = selectedIds[0] const targetShapes = usePaperStore .getState() .getItemsById(selectedId) @@ -3959,9 +3968,13 @@ export const usePaperStore = create((set) => ({ if (!targetShapes.length) return null const operationId = ( - targetShapes.find((item) => !!item.data)?.data?.operationId || - useTopToolsStore.getState().activeOperation || - "" + lockedEditTarget && + lockedEditTarget.imageId === activeImage && + lockedEditTarget.objectId === selectedId + ? lockedEditTarget.operationId + : targetShapes.find((item) => !!item.data)?.data?.operationId || + useTopToolsStore.getState().activeOperation || + "" ).toString() if (!operationId) return null @@ -4464,7 +4477,10 @@ export const usePaperStore = create((set) => ({ } = {} ) => { const context = getSelectedPolygonContext() - if (!context) return false + if (!context) { + options.draftPath?.remove() + return false + } const prevDrawOption = useTopToolsStore.getState().drawOption const nextDrawOption = mode === "subtract" ? "intersect" : "unite" const baseShape = createWorkingPolygonShape(context.targetShapes)