def get_message(self) -> XVIZMessage: message = XVIZMessage(StateUpdate( update_type=self._update_type, updates=[self._get_streamset()], ), buffers=[self._stream_buffers]) return message
def write_message(self, message: XVIZMessage, index: int = None): self._check_valid() if self._wrap_envelop: obj = XVIZEnvelope(message).to_proto() else: obj = message.to_proto() data = BytesIO() # write PBE1 header data.write(b'\x50\x42\x45\x31') data.write(obj.SerializeToString()) fname = self._get_sequential_name(message, index) + '.pbe' self._source.write(data.getvalue(), fname)
def write_message(self, message: XVIZMessage, index: int = None): self._check_valid() if self._wrap_envelop: obj = XVIZEnvelope(message).to_object() else: obj = message.to_object() builder = GLTFBuilder() fname = self._get_sequential_name(message, index) + '.glb' if isinstance(message.data, StateUpdate): # Wrap image data and point cloud if self._wrap_envelop: dataobj = obj['data']['updates'] else: dataobj = obj['updates'] if 'primitives' in dataobj: for pdata in dataobj['primitives'].values(): # process point cloud if 'points' in pdata: for pldata in pdata['points']: if 'points' in pldata: pldata['points'] = array.array( 'f', pldata['points']) # process images if 'images' in pdata: for imdata in pdata['points']: imdata['data'] = ImageWrapper( image=base64.b64decode(imdata['data']), width=imdata['width_px'], height=imdata['height_px'], mime_type= 'image/png', # FIXME: use Pillow to detect type ) # Encode GLB into file packed_data = builder.pack_binary_json(obj) if self._use_xviz_extension: builder.add_extension(XVIZ_GLTF_EXTENSION, packed_data) else: builder.add_application_data('xviz', packed_data) with self._source.open(fname) as fout: builder.flush(fout)
def write_message(self, message: XVIZMessage, index: int = None): self._check_valid() if self._wrap_envelop: obj = XVIZEnvelope(message).to_object() else: obj = message.to_object() fname = self._get_sequential_name(message, index) + '.json' # Encode GLB into file result = [] # These codes are for float truncation for part in json.JSONEncoder(separators=(',', ':')).iterencode(obj): try: rounded = round(float(part), self._json_precision) except ValueError: pass else: part = str(rounded) result.append(part) self._source.write(''.join(result).encode('ascii'), fname)
def get_message(self): return XVIZMessage(metadata=self.get_data())
def write_message(self, message: XVIZMessage, index: int = None): self._check_valid() if self._wrap_envelop: obj = XVIZEnvelope(message).to_object() else: obj = message.to_object() builder = GLTFBuilder() fname = self._get_sequential_name(message, index) + '.glb' if isinstance(message.data, StateUpdate): # Wrap image data and point cloud if self._wrap_envelop: dataobjs = obj['data']['updates'] else: dataobjs = obj['updates'] for dataobj in dataobjs: if 'primitives' in dataobj: for pdata in dataobj['primitives'].values(): # convert lists into typed arrays to leverage binary format if 'points' in pdata: for pldata in pdata['points']: num_points = None if 'points' in pldata: num_points = len(pldata['points']) // 3 pldata['points'] = TypedArrayWrapper( array=array.array( 'f', pldata['points']), size=3, ) if 'colors' in pldata: # infer size from num_points assert num_points is not None color_bytes = bytes(pldata['colors']) size = len(color_bytes) // num_points assert size in ( 3, 4 ), 'expecting size to be 3 or 4, got %s' % size pldata['colors'] = TypedArrayWrapper( array=color_bytes, size=size, ) if 'polylines' in pdata: for pldata in pdata['polylines']: if 'vertices' in pldata: pldata['vertices'] = TypedArrayWrapper( array=array.array( 'f', pldata['vertices']), size=3, ) if 'polygons' in pdata: for pldata in pdata['polygons']: if 'vertices' in pldata: pldata['vertices'] = TypedArrayWrapper( array=array.array( 'f', pldata['vertices']), size=3, ) # process images if 'images' in pdata: for imdata in pdata['images']: imdata['data'] = ImageWrapper( image=base64.b64decode(imdata['data']), width=imdata['width_px'], height=imdata['height_px'], mime_type= 'image/png', # FIXME: use Pillow to detect type ) # Encode GLB into file packed_data = builder.pack_binary_json(obj) if self._use_xviz_extension: builder.add_extension(XVIZ_GLTF_EXTENSION, packed_data) else: builder.add_application_data('xviz', packed_data) with self._source.open(fname, mode='w') as fout: builder.flush(fout)
def write_message(self, message: XVIZMessage, index: int = None): self._check_valid() if self._wrap_envelop: obj = XVIZEnvelope(message).to_object(unravel='partial') else: obj = message.to_object(unravel='partial') builder = GLTFBuilder() fname = self._get_sequential_name(message, index) + '.glb' if isinstance(message._data, StateUpdate): # Wrap image data and point cloud if self._wrap_envelop: dataobjs = obj['data']['updates'] else: dataobjs = obj['updates'] for dataobj in dataobjs: if 'primitives' in dataobj: for pdata in dataobj['primitives'].values(): # convert lists into typed arrays to leverage binary format if 'points' in pdata: for pldata in pdata['points']: num_points = None if 'points' in pldata: num_points = len(pldata['points']) // 3 pldata['points'] = TypedArrayWrapper( array=pldata['points'], size=3) if 'colors' in pldata: # infer size from num_points assert num_points is not None, "No points are provided in the stream" color_bytes = bytes(pldata['colors']) size = len(color_bytes) // num_points assert size in ( 3, 4 ), 'expecting size to be 3 or 4, got %s' % size pldata['colors'] = TypedArrayWrapper( array=color_bytes, size=size, ) if 'polylines' in pdata: for pldata in pdata['polylines']: if 'vertices' in pldata: pldata['vertices'] = TypedArrayWrapper( array=array.array( 'f', pldata['vertices']), size=3, ) if 'polygons' in pdata: for pldata in pdata['polygons']: if 'vertices' in pldata: pldata['vertices'] = TypedArrayWrapper( array=array.array( 'f', pldata['vertices']), size=3, ) # process images if 'images' in pdata: for imdata in pdata['images']: image = imdata['data'] data = BytesIO() image.save(data, format=self._image_encoding) mime = mimetypes.types_map[ '.' + self._image_encoding.lower()] imdata['data'] = ImageWrapper( data=data.getvalue(), width=image.width, height=image.height, mime_type=mime) # Encode GLB into file packed_data = builder.pack_binary_json(obj) if self._use_xviz_extension: builder.add_extension(XVIZ_GLTF_EXTENSION, packed_data) else: builder.add_application_data('xviz', packed_data) with self._source.open(fname, mode='w') as fout: builder.flush(fout)
def get_message(self): message = XVIZMessage( StateUpdate(update_type=self._update_type, updates=[self.get_data().data])) return message