Source code for supervisely.pointcloud_annotation.pointcloud_object

# coding: utf-8

# docs
import uuid
from typing import Optional

from supervisely.video_annotation.video_object import VideoObject
from supervisely.annotation.label import LabelJsonFields
from supervisely.project.project_meta import ProjectMeta
from supervisely.video_annotation.constants import KEY, ID
from supervisely.pointcloud_annotation.pointcloud_tag_collection import PointcloudTagCollection
from supervisely.video_annotation.key_id_map import KeyIdMap
from supervisely.geometry.constants import LABELER_LOGIN, UPDATED_AT, CREATED_AT, CLASS_ID

[docs]class PointcloudObject(VideoObject): """ PointcloudObject object for :class:`PointcloudAnnotation<supervisely.pointcloud_annotation.pointcloud_annotation.PointcloudAnnotation>`. :class:`PointcloudObject<PointcloudObject>` object is immutable. :param obj_class: :class:`class<supervisely.annotation.obj_class.ObjClass>` object. :type obj_class: ObjClass :param tags: :class:`tags<supervisely.video_annotation.video_tag_collection.VideoTagCollection>` object. :type tags: VideoTagCollection, optional :param key: KeyIdMap object. :type key: KeyIdMap, optional :param class_id: ID of :class:`ObjClass<supervisely.annotation.obj_class.ObjClass>` to which PointcloudObject belongs. :type class_id: int, optional :param labeler_login: Login of the user who created PointcloudObject. :type labeler_login: str, optional :param updated_at: Date and Time when PointcloudObject 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 PointcloudObject 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 from supervisely.geometry.cuboid_3d import Cuboid3d obj_class_car = sly.ObjClass('car', Cuboid3d) pointcloud_obj_car = sly.PointcloudObject(obj_class_car) pointcloud_obj_car_json = pointcloud_obj_car.to_json() print(pointcloud_obj_car_json) # Output: { # "key": "6b819f1840f84d669b32cdec225385f0", # "classTitle": "car", # "tags": [] # } """ tag_collection_type = PointcloudTagCollection
[docs] @classmethod def from_json(cls, data, project_meta: ProjectMeta, key_id_map: Optional[KeyIdMap] = None): """ Convert PointcloudObject from json format to PointcloudObject class object. Raise error if object class name is not found in the given project meta. :param data: PointcloudObject in json format. :type data: dict :param project_meta: Project metadata. :type project_meta: ProjectMeta :param key_id_map: KeyIdMap object. :type key_id_map: KeyIdMap, optional :return: PointcloudObject object. :rtype: PointcloudObject :Usage example: .. code-block:: python import supervisely as sly from supervisely.geometry.cuboid_3d import Cuboid3d, Vector3d key_id_map = KeyIdMap() project_id = 19441 obj_class_car = sly.ObjClass('car', Cuboid3d) project_meta = sly.ProjectMeta([obj_class_car]) api.project.update_meta(id=project_id, meta=project_meta) pointcloud_obj_car = sly.PointcloudObject(obj_class_car) pointcloud_obj_car_json = pointcloud_obj_car.to_json() new_pointcloud_obj_car = sly.PointcloudObject.from_json( data=pointcloud_obj_car_json, project_meta=project_meta, key_id_map=key_id_map ) pprint(new_pointcloud_obj_car) # <supervisely.pointcloud_annotation.pointcloud_object.PointcloudObject object at 0x7f97e0ba8ed0> """ obj_class_name = data[LabelJsonFields.OBJ_CLASS_NAME] obj_class = project_meta.get_obj_class(obj_class_name) if obj_class is None: raise RuntimeError( f"Failed to deserialize a object from JSON: class name {obj_class_name!r} " f"was not found in the given project meta." ) object_id = data.get(ID, None) existing_key = None if object_id is not None and key_id_map is not None: existing_key = key_id_map.get_object_key(object_id) json_key = uuid.UUID(data[KEY]) if KEY in data else None if (existing_key is not None) and (json_key is not None) and (existing_key != json_key): raise RuntimeError( "Object id = {!r}: existing_key {!r} != json_key {!r}".format( object_id, existing_key, json_key ) ) if existing_key is not None: key = existing_key elif json_key is not None: key = json_key else: key = uuid.uuid4() if key_id_map is not None and existing_key is None: key_id_map.add_object(key, object_id) class_id = data.get(CLASS_ID, None) labeler_login = data.get(LABELER_LOGIN, None) updated_at = data.get(UPDATED_AT, None) created_at = data.get(CREATED_AT, None) return cls( obj_class=obj_class, key=key, tags=cls.tag_collection_type.from_json( data[LabelJsonFields.TAGS], project_meta.tag_metas ), class_id=class_id, labeler_login=labeler_login, updated_at=updated_at, created_at=created_at, )