import { types } from "mobx-state-tree"; import Registry from "../../core/Registry"; import { Hotkey } from "../../core/Hotkey"; import ControlBase from "./Base"; import { customTypes } from "../../core/CustomTypes"; import Types from "../../core/Types"; import { AnnotationMixin } from "../../mixins/AnnotationMixin"; import SeparatedControlMixin from "../../mixins/SeparatedControlMixin"; import { ToolManagerMixin } from "../../mixins/ToolManagerMixin"; const hotkeys = Hotkey("Polygons"); /** * The `Polygon` tag is used to add polygons to an image without selecting a label. This can be useful when you have only one label to assign to the polygon. Use for image segmentation tasks. * * Use with the following data types: image. * @example * * * * * * @name Polygon * @meta_title Polygon Tag for Adding Polygons to Images * @meta_description Customize Label Studio with the Polygon tag by adding polygons to images for segmentation machine learning and data science projects. * @param {string} name - Name of tag * @param {string} toname - Name of image to label * @param {number} [opacity=0.6] - Opacity of polygon * @param {string} [fillColor=transparent] - Polygon fill color in hexadecimal or HTML color name * @param {string} [strokeColor=#f48a42] - Stroke color in hexadecimal * @param {number} [strokeWidth=3] - Width of stroke * @param {small|medium|large} [pointSize=small] - Size of polygon handle points * @param {rectangle|circle} [pointStyle=circle] - Style of points * @param {boolean} [smart] - Show smart tool for interactive pre-annotations * @param {boolean} [smartOnly] - Only show smart tool for interactive pre-annotations * @param {pixel|none} [snap=none] - Snap polygon to image pixels */ const TagAttrs = types.model({ toname: types.maybeNull(types.string), opacity: types.optional(customTypes.range(), "0.2"), fillcolor: types.optional(customTypes.color, "#f48a42"), strokewidth: types.optional(types.string, "2"), strokecolor: types.optional(customTypes.color, "#f48a42"), snap: types.optional(types.string, "none"), pointsize: types.optional(types.string, "small"), pointstyle: types.optional(types.string, "circle"), }); const Validation = types.model({ controlledTags: Types.unionTag(["Image"]), }); const Model = types .model({ type: "polygon", // regions: types.array(RectRegionModel), _value: types.optional(types.string, ""), }) .volatile(() => ({ toolNames: ["Polygon"], })) .actions((self) => { return { initializeHotkeys() { hotkeys.addNamed("polygon:undo", () => { if (self.annotation?.selected && self.annotation.isDrawing) self.annotation.undo(); }); hotkeys.addNamed("polygon:redo", () => { if (self.annotation?.selected && self.annotation.isDrawing) self.annotation.redo(); }); }, disposeHotkeys() { hotkeys.removeNamed("polygon:undo"); hotkeys.removeNamed("polygon:redo"); }, afterCreate() { self.initializeHotkeys(); }, beforeDestroy() { self.disposeHotkeys(); }, }; }); const PolygonModel = types.compose( "PolygonModel", ControlBase, AnnotationMixin, SeparatedControlMixin, TagAttrs, Validation, ToolManagerMixin, Model, ); const HtxView = () => null; Registry.addTag("polygon", PolygonModel, HtxView); export { HtxView, PolygonModel };