Source code for supervisely.geometry.pointcloud
# coding: utf-8
from __future__ import annotations
from supervisely.geometry.constants import (
CLASS_ID,
CREATED_AT,
ID,
INDICES,
LABELER_LOGIN,
UPDATED_AT,
)
from supervisely.geometry.geometry import Geometry
# pointcloud mask (segmentation)
[docs]
class Pointcloud(Geometry):
"""3D point cloud geometry: reference to external point cloud file. Immutable."""
[docs]
@staticmethod
def geometry_name():
"""
Returns the name of the geometry.
:returns: name of the geometry
:rtype: str
"""
return 'point_cloud'
def __init__(self, indices, sly_id=None, class_id=None, labeler_login=None, updated_at=None, created_at=None):
"""Pointcloud initialization.
:param indices: Indices of the pointcloud.
:type indices: list
:param sly_id: Pointcloud ID in Supervisely server.
:type sly_id: int, optional
:param class_id: ID of ObjClass to which Pointcloud belongs.
:type class_id: int, optional
:param labeler_login: Login of the user who created Pointcloud.
:type labeler_login: str, optional
:param updated_at: Date and Time when Pointcloud 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 Pointcloud was created. Date Format is the same as in "updated_at" parameter.
:type created_at: str, optional
"""
super().__init__(sly_id=sly_id, class_id=class_id, labeler_login=labeler_login, updated_at=updated_at, created_at=created_at)
if type(indices) is not list:
raise TypeError("\"indices\" param has to be of type {!r}".format(type(list)))
self._indices = indices
@property
def indices(self):
"""
Copy of the indices of the Pointcloud.
:returns: indices of the :class:`~supervisely.geometry.pointcloud.Pointcloud`
:rtype: list
"""
return self._indices.copy()
[docs]
def to_json(self):
"""
Converts the Pointcloud to a JSON object.
:returns: JSON object
:rtype: dict
:returns: Pointcloud in json format
"""
res = {INDICES: self.indices}
self._add_creation_info(res)
return res
[docs]
@classmethod
def from_json(cls, data):
"""
Converts a JSON object to a Pointcloud.
:param data: JSON object
:type data: dict
:returns: Pointcloud
:rtype: :class:`~supervisely.geometry.pointcloud.Pointcloud`
:returns: Pointcloud from json.
:rtype: :class:`~supervisely.geometry.pointcloud.Pointcloud`
"""
indices = data[INDICES]
labeler_login = data.get(LABELER_LOGIN, None)
updated_at = data.get(UPDATED_AT, None)
created_at = data.get(CREATED_AT, None)
sly_id = data.get(ID, None)
class_id = data.get(CLASS_ID, None)
return cls(indices, sly_id=sly_id, class_id=class_id, labeler_login=labeler_login, updated_at=updated_at, created_at=created_at)
[docs]
def to_bytes(self) -> bytes:
"""Encode point indices as little-endian uint32 bytes for separate geometry storage."""
from supervisely.io.fs import encode_uint32_le
return encode_uint32_le(self._indices)
[docs]
@classmethod
def from_bytes(cls, data: bytes) -> Pointcloud:
"""Create a Pointcloud from little-endian uint32 index bytes."""
from supervisely.io.fs import decode_uint32_le
return cls(indices=decode_uint32_le(data))