code: def ply2gii(in_file, metadata, out_file=None):
      
      from pathlib import Path
      from numpy import eye
      from nibabel.gifti import (
          GiftiMetaData, GiftiCoordSystem, GiftiImage, GiftiDataArray,
      )
      from pyntcloud import PyntCloud
  
      in_file = Path(in_file)
      surf = PyntCloud.from_file(str(in_file))
  
      # Update centroid metadata
      metadata.update(
          zip(('SurfaceCenterX', 'SurfaceCenterY', 'SurfaceCenterZ'),
              ['%.4f' % c for c in surf.centroid])
      )
  
      # Prepare data arrays
      da = (
          GiftiDataArray(
              data=surf.xyz.astype('float32'),
              datatype='NIFTI_TYPE_FLOAT32',
              intent='NIFTI_INTENT_POINTSET',
              meta=GiftiMetaData.from_dict(metadata),
              coordsys=GiftiCoordSystem(xform=eye(4), xformspace=3)),
          GiftiDataArray(
              data=surf.mesh.values,
              datatype='NIFTI_TYPE_INT32',
              intent='NIFTI_INTENT_TRIANGLE',
              coordsys=None))
      surfgii = GiftiImage(darrays=da)
  
      if out_file is None:
          out_file = fname_presuffix(
              in_file.name, suffix='.gii', use_ext=False, newpath=str(Path.cwd()))
  
      surfgii.to_filename(str(out_file))
      return out_file
docs: Convert from ply to GIfTI