from __future__ import annotations
import uuid
from typing import Optional, Dict, Union, Tuple
from supervisely.annotation.tag_meta import TagMeta
from supervisely.annotation.tag_meta_collection import TagMetaCollection
from supervisely.video_annotation.key_id_map import KeyIdMap
from supervisely.video_annotation.video_tag import VideoTag
[docs]class PointcloudEpisodeTag(VideoTag):
"""
PointcloudEpisodeTag object for :class:`PointcloudEpisodeAnnotation<supervisely.pointcloud_annotation.pointcloud_episode_annotation.PointcloudEpisodeAnnotation>`. :class:`PointcloudEpisodeTag<PointcloudEpisodeTag>` object is immutable.
:param meta: General information about point cloud episodes Tag.
:type meta: TagMeta
:param value: point cloud episodes Tag value. Depends on :class:`TagValueType<TagValueType>` of :class:`TagMeta<TagMeta>`.
:type value: Optional[Union[str, int, float]]
:param frame_range: point cloud episodes Tag frame range.
:type frame_range: Tuple[int, int] or List[int, int], optional
:param key: uuid.UUID object.
:type key: uuid.UUID, optional
:param sly_id: PointcloudEpisodeTag ID in Supervisely.
:type sly_id: int, optional
:param labeler_login: Login of user who created PointcloudEpisodeTag.
:type labeler_login: str, optional
:param updated_at: Date and Time when PointcloudEpisodeTag was modified last. Date Format: Year:Month:Day:Hour:Minute:Seconds. Example: '2021-01-22T19:37:50.158Z'.
:type updated_at: str, optional
:param created_at: Date and Time when PointcloudEpisodeTag was created. Date Format is the same as in "updated_at" parameter.
:type created_at: str, optional
:Usage example:
.. code-block:: python
import supervisely as sly
meta_car = sly.TagMeta('car', sly.TagValueType.NONE)
# Now we can create a VideoTag using our TagMeta
tag_car = sly.PointcloudEpisodeTag(meta_car)
# When you are creating a new Tag
# Tag.value is automatically cross-checked against your TagMeta value type to make sure the value is valid.
# If we now try to add a value to our newly created Tag, we receive "ValueError", because our TagMeta value type is "NONE"
tag_car = sly.PointcloudEpisodeTag(meta_car, value="Bus")
# Output: ValueError: Tag car can not have value Bus
# Let's create another Tag with a string value type and frame range
meta_car = sly.TagMeta('cat', sly.TagValueType.ANY_STRING)
tag_car = sly.PointcloudEpisodeTag(meta_car, value="red", frame_range=(5, 10))
# Now let's create a Tag using TagMeta with "ONEOF_STRING" value type
# In order to use "oneof_string value type", you must initialize a variable with possible values(see class TagMeta for more information)
colors = ["brown", "white", "black", "red", "chocolate", "gold", "grey"]
meta_car_color = sly.TagMeta('car color', sly.TagValueType.ONEOF_STRING, possible_values=colors)
tag_car_color = sly.PointcloudEpisodeTag(meta_car_color, value="white", frame_range=(15, 20))
# If given value is not in a list of possible Tags, ValueError will be raised
tag_car_color = sly.PointcloudEpisodeTag(meta_car_color, value="yellow")
# Output: ValueError: Tag car color can not have value yellow
"""
[docs] @classmethod
def from_json(
cls,
data: Dict,
tag_meta_collection: TagMetaCollection,
key_id_map: Optional[KeyIdMap] = None,
) -> PointcloudEpisodeTag:
"""
Convert a json dict to PointcloudEpisodeTag. Read more about `Supervisely format <https://docs.supervise.ly/data-organization/00_ann_format_navi>`_.
:param data: PointcloudEpisodeTag in json format as a dict.
:type data: dict
:param tag_meta_collection: :class:`TagMetaCollection<supervisely.annotation.tag_meta_collection.TagMetaCollection>` object.
:type tag_meta_collection: TagMetaCollection
:param key_id_map: Key ID Map object.
:type key_id_map: KeyIdMap, optional
:return: PointcloudEpisodeTag object
:rtype: :class:`PointcloudEpisodeTag<PointcloudEpisodeTag>`
:Usage example:
.. code-block:: python
import supervisely as sly
tag_car_color_json = {
"frameRange": [15, 20],
"key": "da9ca75e97744fc5aaf24d6be2eb2832",
"name": "car color",
"value": "white"
}
colors = ["brown", "white", "black", "red", "chocolate", "gold", "grey"]
meta_car_color = sly.TagMeta('car color', sly.TagValueType.ONEOF_STRING, possible_values=colors)
meta_car_collection = sly.TagMetaCollection([meta_car_color])
tag_car_color = sly.PointcloudEpisodeTag.from_json(tag_car_color_json, meta_car_collection)
"""
return super().from_json(data, tag_meta_collection, key_id_map=key_id_map)
def __eq__(self, other: PointcloudEpisodeTag) -> bool:
return super().__eq__(other)
[docs] def clone(
self,
meta: Optional[TagMeta] = None,
value: Optional[Union[str, int, float]] = None,
frame_range: Optional[Tuple[int, int]] = None,
key: Optional[uuid.UUID] = None,
sly_id: Optional[int] = None,
labeler_login: Optional[str] = None,
updated_at: Optional[str] = None,
created_at: Optional[str] = None,
) -> PointcloudEpisodeTag:
"""
Makes a copy of PointcloudEpisodeTag with new fields, if fields are given, otherwise it will use fields of the original PointcloudEpisodeTag.
:param meta: General information about PointcloudEpisodeTag.
:type meta: TagMeta, optional
:param value: PointcloudEpisodeTag value. Depends on :class:`TagValueType<TagValueType>` of :class:`TagMeta<TagMeta>`.
:type value: Optional[Union[str, int, float]]
:param frame_range: PointcloudEpisodeTag frame range.
:type frame_range: Optional[Union[Tuple[int, int], List[int, int]]]
:param key: uuid.UUID object.
:type key: uuid.UUID, optional
:param sly_id: PointcloudEpisodeTag ID in Supervisely.
:type sly_id: int, optional
:param labeler_login: Login of user who created PointcloudEpisodeTag.
:type labeler_login: str, optional
:param updated_at: Date and Time when PointcloudEpisodeTag was modified last. Date Format: Year:Month:Day:Hour:Minute:Seconds. Example: '2021-01-22T19:37:50.158Z'.
:type updated_at: str, optional
:param created_at: Date and Time when PointcloudEpisodeTag was created. Date Format is the same as in "updated_at" parameter.
:type created_at: str, optional
:Usage example:
.. code-block:: python
import supervisely as sly
colors = ["brown", "white", "black", "red", "chocolate", "gold", "grey"]
meta_car_color = sly.TagMeta('car color', sly.TagValueType.ONEOF_STRING, possible_values=colors)
tag_car_color = sly.PointcloudEpisodeTag(meta_car_color, value="white", frame_range=(15, 20))
meta_bus = sly.TagMeta('bus', sly.TagValueType.ANY_STRING)
new_tag = tag_car_color.clone(meta=meta_bus, frame_range=(15, 30), key=tag_car_color.key())
print(new_tag.to_json())
# Output: {
# "frameRange": [15, 30],
# "key": "4360b25778144141aa4f1a0d775a0a7a",
# "name": "bus",
# "value": "white"
# }
"""
return super().clone(
meta=meta,
value=value,
frame_range=frame_range,
key=key,
sly_id=sly_id,
labeler_login=labeler_login,
updated_at=updated_at,
created_at=created_at,
)