lost-sia 2.0.1-alpha8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/Annotation/logic/Annotation.d.ts +17 -0
- package/dist/Annotation/logic/Annotation.js +1 -0
- package/dist/Annotation/ui/AnnotationComponent.d.ts +24 -0
- package/dist/Annotation/ui/AnnotationComponent.js +1 -0
- package/dist/Annotation/ui/atoms/AnnoBar.d.ts +15 -0
- package/dist/Annotation/ui/atoms/AnnoBar.js +1 -0
- package/dist/Annotation/ui/atoms/DaviIcon.d.ts +9 -0
- package/dist/Annotation/ui/atoms/DaviIcon.js +19 -0
- package/dist/Annotation/ui/atoms/Edge.d.ts +17 -0
- package/dist/Annotation/ui/atoms/Edge.js +1 -0
- package/dist/Annotation/ui/atoms/Node.d.ts +17 -0
- package/dist/Annotation/ui/atoms/Node.js +1 -0
- package/dist/Annotation/ui/atoms/PolygonArea.d.ts +16 -0
- package/dist/Annotation/ui/atoms/PolygonArea.js +1 -0
- package/dist/Annotation/ui/tools/BBox.d.ts +21 -0
- package/dist/Annotation/ui/tools/BBox.js +1 -0
- package/dist/Annotation/ui/tools/Line.d.ts +21 -0
- package/dist/Annotation/ui/tools/Line.js +1 -0
- package/dist/Annotation/ui/tools/Point.d.ts +16 -0
- package/dist/Annotation/ui/tools/Point.js +1 -0
- package/dist/Annotation/ui/tools/Polygon.d.ts +23 -0
- package/dist/Annotation/ui/tools/Polygon.js +1 -0
- package/dist/Canvas/Canvas.d.ts +31 -0
- package/dist/Canvas/Canvas.js +1 -0
- package/dist/Canvas/LabelInput.d.ts +11 -0
- package/dist/Canvas/LabelInput.js +1 -0
- package/dist/IconButton.d.ts +25 -0
- package/dist/IconButton.js +1 -0
- package/dist/Sia.d.ts +33 -0
- package/dist/Sia.js +1 -0
- package/dist/Toolbar/Toolbar.d.ts +21 -0
- package/dist/Toolbar/Toolbar.js +1 -0
- package/dist/Toolbar/ToolbarItems/AccessibilityTools.d.ts +7 -0
- package/dist/Toolbar/ToolbarItems/AccessibilityTools.js +1 -0
- package/dist/Toolbar/ToolbarItems/AnnoToolSelector.d.ts +11 -0
- package/dist/Toolbar/ToolbarItems/AnnoToolSelector.js +1 -0
- package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.d.ts +11 -0
- package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.js +1 -0
- package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.d.ts +11 -0
- package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.js +1 -0
- package/dist/Toolbar/ToolbarItems/ImageTools.d.ts +13 -0
- package/dist/Toolbar/ToolbarItems/ImageTools.js +1 -0
- package/dist/Toolbar/ToolbarItems/Instructions.d.ts +2 -0
- package/dist/Toolbar/ToolbarItems/Instructions.js +1 -0
- package/dist/Toolbar/ToolbarItems/InstructionsModal.d.ts +6 -0
- package/dist/Toolbar/ToolbarItems/InstructionsModal.js +1 -0
- package/dist/assets/SIA-BV1tYu3P.css +1 -0
- package/dist/assets/brand-icons-Cu_C0hZ4.svg +1008 -0
- package/dist/assets/brand-icons-F3SPCeH1.woff +0 -0
- package/dist/assets/brand-icons-XL9sxUpA.woff2 +0 -0
- package/dist/assets/brand-icons-sqJ2Pg7a.eot +0 -0
- package/dist/assets/brand-icons-ubhWoxly.ttf +0 -0
- package/dist/assets/flags-DOLqOU7Y.png +0 -0
- package/dist/assets/icons-BOCtAERH.woff +0 -0
- package/dist/assets/icons-CHzK1VD9.eot +0 -0
- package/dist/assets/icons-D29ZQHHw.ttf +0 -0
- package/dist/assets/icons-Du6TOHnR.woff2 +0 -0
- package/dist/assets/icons-RwhydX30.svg +1518 -0
- package/dist/assets/node_modules/semantic-ui-css/semantic.min-Bvulf91l.css +346 -0
- package/dist/assets/outline-icons-BfdLr8tr.svg +366 -0
- package/dist/assets/outline-icons-DD8jm0uy.ttf +0 -0
- package/dist/assets/outline-icons-DInHoiqI.woff2 +0 -0
- package/dist/assets/outline-icons-LX8adJ4n.eot +0 -0
- package/dist/assets/outline-icons-aQ88nltS.woff +0 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1 -0
- package/dist/models/AnnotationMode.d.ts +11 -0
- package/dist/models/AnnotationMode.js +1 -0
- package/dist/models/AnnotationStatus.d.ts +8 -0
- package/dist/models/AnnotationStatus.js +1 -0
- package/dist/models/AnnotationTool.d.ts +7 -0
- package/dist/models/AnnotationTool.js +1 -0
- package/dist/models/CanvasAction.d.ts +28 -0
- package/dist/models/CanvasAction.js +1 -0
- package/dist/models/Direction.d.ts +7 -0
- package/dist/models/Direction.js +1 -0
- package/dist/models/EditorModes.d.ts +11 -0
- package/dist/models/EditorModes.js +1 -0
- package/dist/models/KeyAction.d.ts +22 -0
- package/dist/models/KeyAction.js +1 -0
- package/dist/models/NotificationType.d.ts +7 -0
- package/dist/models/NotificationType.js +1 -0
- package/dist/models/index.d.ts +6 -0
- package/dist/models/index.js +1 -0
- package/dist/stories/AnnotationTools.stories.d.ts +40 -0
- package/dist/stories/Canvas/Canvas.stories.d.ts +50 -0
- package/dist/stories/Canvas/CanvasOffset.d.ts +13 -0
- package/dist/stories/Canvas/CanvasWithOffset.stories.d.ts +36 -0
- package/dist/stories/FilterDropdown.stories.d.ts +19 -0
- package/dist/stories/MinimalSia.stories.d.ts +66 -0
- package/dist/stories/SIA/DemoWrapper.d.ts +8 -0
- package/dist/stories/SIA/DemoWrapper.stories.d.ts +27 -0
- package/dist/stories/SIA/SIA.stories.d.ts +72 -0
- package/dist/stories/Toolbar/ImageTools/TagLabel.stories.d.ts +21 -0
- package/dist/stories/Toolbar/Instructions.stories.d.ts +11 -0
- package/dist/stories/Toolbar/Toolbar.stories.d.ts +37 -0
- package/dist/stories/exampleData/exampleAnnotations.d.ts +8 -0
- package/dist/stories/exampleData/exampleExternalAnnotations.d.ts +8 -0
- package/dist/stories/exampleData/exampleImage.d.ts +2 -0
- package/dist/stories/exampleData/exampleLabels.d.ts +6 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.js +1 -0
- package/dist/utils/KeyMapper.d.ts +9 -0
- package/dist/utils/KeyMapper.js +1 -0
- package/dist/utils/TimeUtils.d.ts +4 -0
- package/dist/utils/TimeUtils.js +1 -0
- package/dist/utils/color.d.ts +2 -0
- package/dist/utils/color.js +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/mouse.d.ts +6 -0
- package/dist/utils/mouse.js +1 -0
- package/dist/utils/siaIcons.js +12 -0
- package/dist/utils/transform.d.ts +28 -0
- package/dist/utils/transform.js +1 -0
- package/dist/utils/uiConfig.js +1 -0
- package/dist/utils/windowViewport.d.ts +22 -0
- package/dist/utils/windowViewport.js +1 -0
- package/package.json +19 -16
- package/src/AnnoExampleViewer.jsx +18 -18
- package/src/Annotation/logic/Annotation.ts +24 -26
- package/src/Annotation/ui/AnnotationComponent.tsx +115 -86
- package/src/Annotation/ui/atoms/AnnoBar.tsx +51 -53
- package/src/Annotation/ui/atoms/DaviIcon.tsx +12 -22
- package/src/Annotation/ui/atoms/Edge.tsx +25 -22
- package/src/Annotation/ui/atoms/Node.tsx +56 -50
- package/src/Annotation/ui/atoms/PolygonArea.tsx +30 -35
- package/src/Annotation/ui/tools/BBox.tsx +136 -150
- package/src/Annotation/ui/tools/Line.tsx +94 -91
- package/src/Annotation/ui/tools/Point.tsx +19 -17
- package/src/Annotation/ui/tools/Polygon.tsx +126 -95
- package/src/Canvas/Canvas.tsx +748 -594
- package/src/Canvas/LabelInput.tsx +68 -45
- package/src/IconButton.tsx +119 -0
- package/src/InfoBoxes/AnnoDetails.jsx +53 -53
- package/src/InfoBoxes/AnnoStats.jsx +41 -41
- package/src/InfoBoxes/InfoBox.jsx +16 -16
- package/src/InfoBoxes/InfoBoxArea.jsx +32 -34
- package/src/InfoBoxes/LabelInfo.jsx +30 -30
- package/src/SIASettingButton.jsx +25 -25
- package/src/Sia.tsx +484 -0
- package/src/Toolbar/Toolbar.tsx +38 -31
- package/src/Toolbar/ToolbarItems/AccessibilityTools.tsx +26 -46
- package/src/Toolbar/ToolbarItems/AnnoToolSelector.tsx +53 -46
- package/src/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.tsx +127 -0
- package/src/Toolbar/ToolbarItems/ImageToolItems/TagLabel.tsx +29 -28
- package/src/Toolbar/ToolbarItems/ImageTools.tsx +43 -40
- package/src/Toolbar/ToolbarItems/Instructions.tsx +47 -50
- package/src/Toolbar/ToolbarItems/InstructionsModal.tsx +8 -8
- package/src/index.ts +9 -13
- package/src/models/{AnnotationMode.tsx → AnnotationMode.ts} +1 -1
- package/src/models/{AnnotationStatus.tsx → AnnotationStatus.ts} +1 -1
- package/src/models/{AnnotationTool.tsx → AnnotationTool.ts} +1 -1
- package/src/models/{CanvasAction.tsx → CanvasAction.ts} +1 -1
- package/src/models/{Direction.tsx → Direction.ts} +1 -1
- package/src/models/{EditorModes.tsx → EditorModes.ts} +1 -1
- package/src/models/{KeyAction.tsx → KeyAction.ts} +3 -1
- package/src/models/NotificationType.ts +8 -0
- package/src/models/index.ts +6 -7
- package/src/siaDummyData.js +71 -71
- package/src/stories/AnnotationTools.mdx +27 -0
- package/src/stories/AnnotationTools.stories.tsx +104 -0
- package/src/stories/Canvas/Canvas.stories.tsx +59 -113
- package/src/stories/Canvas/CanvasOffset.tsx +54 -38
- package/src/stories/Canvas/CanvasWithOffset.stories.tsx +42 -113
- package/src/stories/FilterDropdown.stories.ts +13 -11
- package/src/stories/MinimalSIA.mdx +20 -0
- package/src/stories/MinimalSia.stories.tsx +90 -0
- package/src/stories/SIA/DemoWrapper.stories.tsx +71 -0
- package/src/stories/SIA/DemoWrapper.tsx +55 -0
- package/src/stories/SIA/SIA.stories.tsx +79 -45
- package/src/stories/Toolbar/ImageTools/TagLabel.stories.tsx +11 -12
- package/src/stories/Toolbar/Instructions.stories.tsx +11 -11
- package/src/stories/Toolbar/Toolbar.stories.tsx +32 -47
- package/src/stories/Welcome.mdx +5 -0
- package/src/stories/development/CoordinateSystems.mdx +25 -0
- package/src/stories/exampleData/exampleAnnotations.ts +65 -0
- package/src/stories/exampleData/exampleExternalAnnotations.ts +115 -0
- package/src/stories/{siaDummyData2.ts → exampleData/exampleImage.ts} +3 -264
- package/src/stories/exampleData/exampleLabels.ts +146 -0
- package/src/stories/main.scss +6 -0
- package/src/styles/style.scss +1 -26
- package/src/types.ts +67 -0
- package/src/utils/KeyMapper.ts +76 -74
- package/src/utils/TimeUtils.ts +11 -0
- package/src/utils/color.ts +25 -25
- package/src/utils/hist.js +22 -22
- package/src/utils/index.ts +2 -3
- package/src/utils/mouse.ts +45 -0
- package/src/utils/siaIcons.jsx +5 -7
- package/src/utils/transform.ts +186 -0
- package/src/utils/uiConfig.js +19 -22
- package/src/utils/windowViewport.ts +34 -0
- package/src/AnnoLabelInput.jsx +0 -109
- package/src/AnnoToolBar.jsx +0 -153
- package/src/Annotation/AnnoBar.jsx +0 -154
- package/src/Annotation/Annotation.jsx +0 -395
- package/src/Annotation/Annotation.scss +0 -47
- package/src/Annotation/BBox.jsx +0 -299
- package/src/Annotation/Edge.jsx +0 -92
- package/src/Annotation/InfSelectionArea.jsx +0 -72
- package/src/Annotation/Line.jsx +0 -68
- package/src/Annotation/Node.jsx +0 -282
- package/src/Annotation/Point.jsx +0 -200
- package/src/Annotation/Polygon.jsx +0 -404
- package/src/Annotation/logic/AnnotationUtils.ts +0 -30
- package/src/Canvas.jsx +0 -2194
- package/src/ImgBar.jsx +0 -131
- package/src/LabelInput.jsx +0 -238
- package/src/Prompt.jsx +0 -45
- package/src/SIAFilterButton.jsx +0 -186
- package/src/Sia.jsx +0 -478
- package/src/Sia2.tsx +0 -392
- package/src/SiaPopup.jsx +0 -15
- package/src/ToolBar.jsx +0 -463
- package/src/Toolbar/NavigationButtons.tsx +0 -21
- package/src/Toolbar/ToolbarItem.jsx +0 -30
- package/src/Toolbar/ToolbarItems/ImageToolItems/ImageLabel.tsx +0 -62
- package/src/Toolbar.css +0 -13
- package/src/ToolbarItem.jsx +0 -31
- package/src/filterTools.js +0 -5
- package/src/models/AllowedTools.tsx +0 -9
- package/src/models/AnnotationSettings.tsx +0 -9
- package/src/models/ExternalAnnotation.ts +0 -15
- package/src/models/Label.tsx +0 -8
- package/src/models/UiConfig.tsx +0 -6
- package/src/stories/Button.jsx +0 -54
- package/src/stories/Button.stories.js +0 -48
- package/src/stories/Header.jsx +0 -69
- package/src/stories/Header.stories.js +0 -28
- package/src/stories/Page.jsx +0 -87
- package/src/stories/Page.stories.js +0 -28
- package/src/stories/SIA2/DemoWrapper.stories.tsx +0 -167
- package/src/stories/SIA2/DemoWrapper.tsx +0 -54
- package/src/stories/SIA2/Sia2.stories.tsx +0 -62
- package/src/stories/Toolbar/ImageTools/ImageLabel.stories.tsx +0 -32
- package/src/stories/assets/accessibility.png +0 -0
- package/src/stories/assets/accessibility.svg +0 -5
- package/src/stories/assets/addon-library.png +0 -0
- package/src/stories/assets/assets.png +0 -0
- package/src/stories/assets/avif-test-image.avif +0 -0
- package/src/stories/assets/context.png +0 -0
- package/src/stories/assets/discord.svg +0 -15
- package/src/stories/assets/docs.png +0 -0
- package/src/stories/assets/figma-plugin.png +0 -0
- package/src/stories/assets/github.svg +0 -3
- package/src/stories/assets/share.png +0 -0
- package/src/stories/assets/styling.png +0 -0
- package/src/stories/assets/testing.png +0 -0
- package/src/stories/assets/theming.png +0 -0
- package/src/stories/assets/tutorials.svg +0 -12
- package/src/stories/assets/youtube.svg +0 -4
- package/src/stories/button.css +0 -30
- package/src/stories/header.css +0 -32
- package/src/stories/lost.js +0 -54
- package/src/stories/page.css +0 -69
- package/src/stories/siaDummyData.js +0 -263
- package/src/stories/store.js +0 -18
- package/src/test.js +0 -7
- package/src/types/annoStatus.js +0 -4
- package/src/types/canvasActions.js +0 -58
- package/src/types/cursorstyles.js +0 -3
- package/src/types/modes.js +0 -9
- package/src/types/notificationType.js +0 -11
- package/src/types/toolbarEvents.js +0 -35
- package/src/types/tools.js +0 -17
- package/src/types.tsx +0 -11
- package/src/utils/annoConversion.js +0 -145
- package/src/utils/annoConversion2.ts +0 -145
- package/src/utils/colorlut.js +0 -68
- package/src/utils/constraints.js +0 -81
- package/src/utils/index.js +0 -1
- package/src/utils/keyActions.js +0 -113
- package/src/utils/mouse.js +0 -14
- package/src/utils/mouse2.ts +0 -35
- package/src/utils/transform.js +0 -336
- package/src/utils/transform2.ts +0 -343
- package/src/utils/windowViewport.js +0 -34
- package/src/utils/windowViewport2.ts +0 -50
package/src/Sia2.tsx
DELETED
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState, ReactElement, useRef } from "react";
|
|
2
|
-
import { CSpinner } from "@coreui/react";
|
|
3
|
-
import Canvas from "./Canvas/Canvas";
|
|
4
|
-
import AllowedTools from "./models/AllowedTools";
|
|
5
|
-
import AnnotationTool from "./models/AnnotationTool";
|
|
6
|
-
import Toolbar from "./Toolbar/Toolbar";
|
|
7
|
-
import UiConfig from "./models/UiConfig";
|
|
8
|
-
import Label from "./models/Label";
|
|
9
|
-
import Annotation from "./Annotation/logic/Annotation";
|
|
10
|
-
import ExternalAnnotation from "./models/ExternalAnnotation";
|
|
11
|
-
import AnnotationMode from "./models/AnnotationMode";
|
|
12
|
-
import AnnotationSettings from "./models/AnnotationSettings";
|
|
13
|
-
import AnnotationStatus from "./models/AnnotationStatus";
|
|
14
|
-
import { PolygonOperationResult } from "./types";
|
|
15
|
-
|
|
16
|
-
type SiaProps = {
|
|
17
|
-
additionalButtons?: ReactElement | undefined;
|
|
18
|
-
allowedTools?: AllowedTools;
|
|
19
|
-
polygonOperationResult?: PolygonOperationResult;
|
|
20
|
-
annotationSettings?: AnnotationSettings;
|
|
21
|
-
defaultAnnotationTool?: AnnotationTool;
|
|
22
|
-
image?: string;
|
|
23
|
-
isLoading?: boolean;
|
|
24
|
-
isPolygonSelectionMode?: boolean;
|
|
25
|
-
initialAnnotations?: ExternalAnnotation[];
|
|
26
|
-
initialImageLabelIds?: number[];
|
|
27
|
-
initialIsImageJunk?: boolean;
|
|
28
|
-
possibleLabels: Label[];
|
|
29
|
-
uiConfig?: UiConfig;
|
|
30
|
-
onAnnoCreated?: (createdAnno: Annotation, allAnnos: Annotation[]) => void;
|
|
31
|
-
onAnnoCreationFinished?: (
|
|
32
|
-
createdAnno: Annotation,
|
|
33
|
-
allAnnos: Annotation[],
|
|
34
|
-
) => void;
|
|
35
|
-
onAnnoChanged?: (changedAnno: Annotation, allAnnos: Annotation[]) => void;
|
|
36
|
-
onAnnoDeleted?: (deletedAnno: Annotation, allAnnos: Annotation[]) => void;
|
|
37
|
-
onImageLabelsChanged?: (selectedImageIds: number[]) => void;
|
|
38
|
-
onIsImageJunk?: (isJunk: boolean) => void;
|
|
39
|
-
onSelectAnnotation: (annotation?: Annotation) => void;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const Sia2 = ({
|
|
43
|
-
additionalButtons,
|
|
44
|
-
allowedTools: propAllowedTools,
|
|
45
|
-
polygonOperationResult = { annotationsToDelete: [], polygonsToCreate: [] },
|
|
46
|
-
annotationSettings: propAnnotationSettings,
|
|
47
|
-
uiConfig: propUiConfig,
|
|
48
|
-
defaultAnnotationTool,
|
|
49
|
-
image,
|
|
50
|
-
isLoading = false,
|
|
51
|
-
isPolygonSelectionMode = false,
|
|
52
|
-
initialAnnotations = [],
|
|
53
|
-
initialImageLabelIds = [],
|
|
54
|
-
initialIsImageJunk = false,
|
|
55
|
-
possibleLabels,
|
|
56
|
-
onAnnoCreated = (_, __) => {},
|
|
57
|
-
onAnnoCreationFinished = (_, __) => {},
|
|
58
|
-
onAnnoChanged = (_, __) => {},
|
|
59
|
-
onAnnoDeleted = (_, __) => {},
|
|
60
|
-
onImageLabelsChanged = () => {},
|
|
61
|
-
onIsImageJunk = () => {},
|
|
62
|
-
onSelectAnnotation = () => {},
|
|
63
|
-
}: SiaProps) => {
|
|
64
|
-
const marginBetweenToolbarAndContainerPixels: number = 10;
|
|
65
|
-
|
|
66
|
-
// ref for accessing the toolbar height (adjustable by screen size + custom components)
|
|
67
|
-
const toolbarContainerRef = useRef(null);
|
|
68
|
-
|
|
69
|
-
const [allowedTools, setAllowedTools] = useState<AllowedTools>();
|
|
70
|
-
|
|
71
|
-
const [annotations, setAnnotations] = useState<Annotation[]>([]);
|
|
72
|
-
const [annotationSettings, setAnnotationSettings] =
|
|
73
|
-
useState<AnnotationSettings>();
|
|
74
|
-
|
|
75
|
-
const [uiConfig, setUiConfig] = useState<UiConfig>();
|
|
76
|
-
|
|
77
|
-
const [selectedAnnotation, setSelectedAnnotation] = useState<Annotation>();
|
|
78
|
-
|
|
79
|
-
const [selectedAnnoTool, setSelectedAnnoTool] = useState<AnnotationTool>(
|
|
80
|
-
defaultAnnotationTool !== undefined
|
|
81
|
-
? defaultAnnotationTool
|
|
82
|
-
: AnnotationTool.Point,
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
// for adjusting the container/canvas size
|
|
86
|
-
const [toolbarHeight, setToolbarHeight] = useState<number>(-1);
|
|
87
|
-
|
|
88
|
-
const [outerContainerStyle, setOuterContainerStyle] = useState({
|
|
89
|
-
height: `100%`,
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
const [imageLabelIds, setImageLabelIds] =
|
|
93
|
-
useState<number[]>(initialImageLabelIds);
|
|
94
|
-
|
|
95
|
-
const [isImageJunk, setIsImageJunk] = useState<boolean>();
|
|
96
|
-
|
|
97
|
-
// keep track which numbers are already used for annotation ids - even if they are deleted
|
|
98
|
-
const [usedInternalIds, setUsedInternalIds] = useState<number[]>([]);
|
|
99
|
-
|
|
100
|
-
const deleteAnnotationByInternalId = (internalId: number) => {
|
|
101
|
-
// get index of selected annotation
|
|
102
|
-
const annoListIndex: number = annotations!.findIndex(
|
|
103
|
-
(anno) => anno.internalId === internalId,
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
// dereference list to force state update
|
|
107
|
-
const _annotations: Annotation[] = [...annotations];
|
|
108
|
-
|
|
109
|
-
// remove annotation
|
|
110
|
-
const removedAnno: Annotation = _annotations.splice(annoListIndex, 1)[0];
|
|
111
|
-
|
|
112
|
-
setAnnotations(_annotations);
|
|
113
|
-
|
|
114
|
-
// inform the outside world about our changes
|
|
115
|
-
onAnnoDeleted(removedAnno, _annotations);
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const deleteSelectedAnnotation = () => {
|
|
119
|
-
if (selectedAnnotation === undefined) return;
|
|
120
|
-
|
|
121
|
-
deleteAnnotationByInternalId(selectedAnnotation.internalId);
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
const createInitialAnnotations = () => {
|
|
125
|
-
// this is only run during initialization, so internal id list is always empty at this point
|
|
126
|
-
// fill this without the dedicated createNewInternalAnnotationId to avoid accessing old state
|
|
127
|
-
// setState in loop thats depending on its value => you are in react hell
|
|
128
|
-
let internalAnnoId: number = 0;
|
|
129
|
-
|
|
130
|
-
// create internal annotation object from external annotations
|
|
131
|
-
// assign internal id, add default data if not set from the outside
|
|
132
|
-
const _annotations: Annotation[] = initialAnnotations.map(
|
|
133
|
-
(externalAnno: ExternalAnnotation) => {
|
|
134
|
-
const _anno: Annotation = {
|
|
135
|
-
...externalAnno,
|
|
136
|
-
internalId: internalAnnoId++,
|
|
137
|
-
mode: AnnotationMode.VIEW,
|
|
138
|
-
selectedNode: 1,
|
|
139
|
-
status: externalAnno.status,
|
|
140
|
-
annoTime:
|
|
141
|
-
externalAnno.annoTime !== undefined ? externalAnno.annoTime : 0.0,
|
|
142
|
-
timestamp:
|
|
143
|
-
externalAnno.timestamp !== undefined
|
|
144
|
-
? externalAnno.timestamp
|
|
145
|
-
: performance.now(),
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
return _anno;
|
|
149
|
-
},
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
// list all used internal ids (from 0 to internalAnnoId)
|
|
153
|
-
setUsedInternalIds([...Array(internalAnnoId).keys()]);
|
|
154
|
-
|
|
155
|
-
setAnnotations(_annotations);
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
const createNewInternalAnnotationId = (): number => {
|
|
159
|
-
// find the next free number
|
|
160
|
-
let newInternalId: number = 0;
|
|
161
|
-
while (usedInternalIds.includes(newInternalId)) newInternalId++;
|
|
162
|
-
|
|
163
|
-
// add it to the used numbers (dereference list to trigger react state change)
|
|
164
|
-
const _usedInternalIds = [...usedInternalIds];
|
|
165
|
-
_usedInternalIds.push(newInternalId);
|
|
166
|
-
setUsedInternalIds(_usedInternalIds);
|
|
167
|
-
|
|
168
|
-
return newInternalId;
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
useEffect(() => {
|
|
172
|
-
// update the initial annotations only when the image is not set
|
|
173
|
-
// (the annotations are always loaded before the image)
|
|
174
|
-
if (image !== undefined) return;
|
|
175
|
-
|
|
176
|
-
createInitialAnnotations();
|
|
177
|
-
setIsImageJunk(initialIsImageJunk);
|
|
178
|
-
}, [initialAnnotations]);
|
|
179
|
-
|
|
180
|
-
// update annotation settings if changed in the parent
|
|
181
|
-
useEffect(() => {
|
|
182
|
-
const defaultAnnotationSettigs: AnnotationSettings = {
|
|
183
|
-
canCreate: true,
|
|
184
|
-
canEdit: true,
|
|
185
|
-
canHaveMultipleLabels: false,
|
|
186
|
-
canLabel: true,
|
|
187
|
-
minimalArea: 250,
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
// use default values if a key is not set
|
|
191
|
-
const newAnnotationSettings = {
|
|
192
|
-
...defaultAnnotationSettigs,
|
|
193
|
-
...propAnnotationSettings,
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
setAnnotationSettings(newAnnotationSettings);
|
|
197
|
-
}, [propAnnotationSettings]);
|
|
198
|
-
|
|
199
|
-
useEffect(() => {
|
|
200
|
-
const defaultUiConfig: UiConfig = {
|
|
201
|
-
nodeRadius: 4,
|
|
202
|
-
strokeWidth: 4,
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
// use default values if a key is not set
|
|
206
|
-
const newUiConfig = {
|
|
207
|
-
...defaultUiConfig,
|
|
208
|
-
...propUiConfig,
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
setUiConfig(newUiConfig);
|
|
212
|
-
}, [propUiConfig]);
|
|
213
|
-
|
|
214
|
-
// set default allowed tools if user has not specified them
|
|
215
|
-
useEffect(() => {
|
|
216
|
-
const defaultAllowedTools: AllowedTools = {
|
|
217
|
-
bbox: true,
|
|
218
|
-
point: true,
|
|
219
|
-
line: true,
|
|
220
|
-
junk: true,
|
|
221
|
-
polygon: true,
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
if (propAllowedTools === undefined)
|
|
225
|
-
return setAllowedTools(defaultAllowedTools);
|
|
226
|
-
|
|
227
|
-
setAllowedTools(propAllowedTools);
|
|
228
|
-
}, [propAllowedTools]);
|
|
229
|
-
|
|
230
|
-
// useEffect(() => {
|
|
231
|
-
// if (toolbarHeight < 0) return;
|
|
232
|
-
|
|
233
|
-
// setOuterContainerStyle({
|
|
234
|
-
// height: `calc(100% - ${toolbarHeight}px)`,
|
|
235
|
-
// });
|
|
236
|
-
// }, [toolbarHeight]);
|
|
237
|
-
|
|
238
|
-
// useEffect(() => {
|
|
239
|
-
// if (toolbarContainerRef.current === null) return;
|
|
240
|
-
// const { width, height } =
|
|
241
|
-
// toolbarContainerRef.current.getBoundingClientRect();
|
|
242
|
-
|
|
243
|
-
// setToolbarHeight(height + marginBetweenToolbarAndContainerPixels);
|
|
244
|
-
// }, [toolbarContainerRef]);
|
|
245
|
-
|
|
246
|
-
if (allowedTools === undefined)
|
|
247
|
-
return (
|
|
248
|
-
<div className="d-flex justify-content-center">
|
|
249
|
-
<CSpinner color="primary" style={{ width: "5rem", height: "5rem" }} />
|
|
250
|
-
</div>
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
return (
|
|
254
|
-
<>
|
|
255
|
-
<div
|
|
256
|
-
ref={toolbarContainerRef}
|
|
257
|
-
style={{
|
|
258
|
-
marginBottom: marginBetweenToolbarAndContainerPixels,
|
|
259
|
-
}}
|
|
260
|
-
>
|
|
261
|
-
<Toolbar
|
|
262
|
-
annotationSettings={annotationSettings}
|
|
263
|
-
allowedTools={allowedTools}
|
|
264
|
-
additionalButtons={additionalButtons}
|
|
265
|
-
isDisabled={isLoading}
|
|
266
|
-
isImageJunk={isImageJunk}
|
|
267
|
-
imageLabelIds={imageLabelIds}
|
|
268
|
-
possibleLabels={possibleLabels}
|
|
269
|
-
selectedTool={selectedAnnoTool}
|
|
270
|
-
onImageLabelsChanged={(newImageLabelIds: number[]) => {
|
|
271
|
-
setImageLabelIds(newImageLabelIds);
|
|
272
|
-
onImageLabelsChanged(newImageLabelIds);
|
|
273
|
-
}}
|
|
274
|
-
onSetSelectedTool={setSelectedAnnoTool}
|
|
275
|
-
onSetIsImageJunk={(newJunkState: boolean) => {
|
|
276
|
-
setIsImageJunk(newJunkState);
|
|
277
|
-
onIsImageJunk(newJunkState);
|
|
278
|
-
}}
|
|
279
|
-
onShouldDeleteSelectedAnnotation={deleteSelectedAnnotation}
|
|
280
|
-
/>
|
|
281
|
-
</div>
|
|
282
|
-
<div style={outerContainerStyle}>
|
|
283
|
-
{isLoading && (
|
|
284
|
-
<div className="d-flex justify-content-center">
|
|
285
|
-
<CSpinner
|
|
286
|
-
color="primary"
|
|
287
|
-
style={{ width: "5rem", height: "5rem", marginTop: 200 }}
|
|
288
|
-
/>
|
|
289
|
-
</div>
|
|
290
|
-
)}
|
|
291
|
-
|
|
292
|
-
{image && annotations && (
|
|
293
|
-
<Canvas
|
|
294
|
-
annotations={annotations}
|
|
295
|
-
annotationSettings={annotationSettings}
|
|
296
|
-
image={image}
|
|
297
|
-
isImageJunk={isImageJunk}
|
|
298
|
-
isPolygonSelectionMode={isPolygonSelectionMode}
|
|
299
|
-
selectedAnnotation={selectedAnnotation}
|
|
300
|
-
selectedAnnoTool={selectedAnnoTool}
|
|
301
|
-
polygonOperationResult={polygonOperationResult}
|
|
302
|
-
possibleLabels={possibleLabels}
|
|
303
|
-
uiConfig={uiConfig}
|
|
304
|
-
onAnnoCreated={(annotation: Annotation) => {
|
|
305
|
-
const _annotations: Annotation[] = [...annotations];
|
|
306
|
-
_annotations.push(annotation);
|
|
307
|
-
setAnnotations(_annotations);
|
|
308
|
-
setSelectedAnnotation(annotation);
|
|
309
|
-
onAnnoCreated(annotation, _annotations);
|
|
310
|
-
}}
|
|
311
|
-
onAnnoChanged={(changedAnno: Annotation) => {
|
|
312
|
-
// update annotation list
|
|
313
|
-
const annoListIndex: number = annotations.findIndex(
|
|
314
|
-
(anno) => anno.internalId === changedAnno.internalId,
|
|
315
|
-
);
|
|
316
|
-
const _annotations: Annotation[] = [...annotations];
|
|
317
|
-
_annotations[annoListIndex] = changedAnno;
|
|
318
|
-
setAnnotations(_annotations);
|
|
319
|
-
|
|
320
|
-
// inform the outside world about our change
|
|
321
|
-
onAnnoChanged(changedAnno, _annotations);
|
|
322
|
-
}}
|
|
323
|
-
onAnnoCreationFinished={(changedAnno: Annotation) => {
|
|
324
|
-
// update annotation list
|
|
325
|
-
const _annotations: Annotation[] = [...annotations];
|
|
326
|
-
|
|
327
|
-
// remove the previous annotations we used to do the operation with
|
|
328
|
-
if (isPolygonSelectionMode) {
|
|
329
|
-
if (polygonOperationResult?.annotationsToDelete !== undefined) {
|
|
330
|
-
// we also want to remove the current selected annotation
|
|
331
|
-
polygonOperationResult.annotationsToDelete.push(
|
|
332
|
-
selectedAnnotation!,
|
|
333
|
-
);
|
|
334
|
-
|
|
335
|
-
polygonOperationResult.annotationsToDelete.forEach(
|
|
336
|
-
(annotation) => {
|
|
337
|
-
// remove annotations "the official way" (inform the server what we did)
|
|
338
|
-
deleteAnnotationByInternalId(annotation.internalId);
|
|
339
|
-
|
|
340
|
-
// since we are updating the annotations list after all the deletions again, their disappearance wouldn't be noticed
|
|
341
|
-
// therefore also manually remove the annotations here
|
|
342
|
-
|
|
343
|
-
// get index of selected annotation
|
|
344
|
-
const annoListIndex: number = _annotations!.findIndex(
|
|
345
|
-
(anno) => anno.internalId === annotation.internalId,
|
|
346
|
-
);
|
|
347
|
-
|
|
348
|
-
// remove annotation from object
|
|
349
|
-
_annotations.splice(annoListIndex, 1);
|
|
350
|
-
},
|
|
351
|
-
);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
// the polygon selection mode hands annotations to SIA in one single frame
|
|
355
|
-
// add the new annotation here
|
|
356
|
-
_annotations.push(changedAnno);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
// point annotations are created in one frame
|
|
360
|
-
// they dont exist in the annotations list yet, so just append them
|
|
361
|
-
if (changedAnno.type === AnnotationTool.Point)
|
|
362
|
-
_annotations.push(changedAnno);
|
|
363
|
-
else {
|
|
364
|
-
// all other annotation types
|
|
365
|
-
const annoListIndex: number = annotations.findIndex(
|
|
366
|
-
(anno) => anno.internalId === changedAnno.internalId,
|
|
367
|
-
);
|
|
368
|
-
_annotations[annoListIndex] = changedAnno;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
setAnnotations(_annotations);
|
|
372
|
-
|
|
373
|
-
// mark annotation as fully created
|
|
374
|
-
changedAnno.status = AnnotationStatus.CREATED;
|
|
375
|
-
|
|
376
|
-
// inform the outer world about our changes
|
|
377
|
-
onAnnoCreationFinished(changedAnno, _annotations);
|
|
378
|
-
}}
|
|
379
|
-
onRequestNewAnnoId={createNewInternalAnnotationId}
|
|
380
|
-
onSelectAnnotation={(annotation) => {
|
|
381
|
-
setSelectedAnnotation(annotation);
|
|
382
|
-
onSelectAnnotation(annotation);
|
|
383
|
-
}}
|
|
384
|
-
// eventDeleteSelectedAnnotation={deleteSelectedAnnotation}
|
|
385
|
-
/>
|
|
386
|
-
)}
|
|
387
|
-
</div>
|
|
388
|
-
</>
|
|
389
|
-
);
|
|
390
|
-
};
|
|
391
|
-
|
|
392
|
-
export default Sia2;
|
package/src/SiaPopup.jsx
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Popup } from "semantic-ui-react";
|
|
3
|
-
|
|
4
|
-
const SiaPopup = ({ content, trigger }) => {
|
|
5
|
-
return (
|
|
6
|
-
<Popup
|
|
7
|
-
inverted
|
|
8
|
-
style={{ opacity: 0.9 }}
|
|
9
|
-
content={content}
|
|
10
|
-
trigger={trigger}
|
|
11
|
-
/>
|
|
12
|
-
);
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export default SiaPopup;
|