docstr: Entry point for reading OBJ files.
  
  Parameters
  ----------
  fname : str
      The name of the file to read.
docstr_tok: ["Entry","point","for","reading","OBJ","files",".","Parameters","--","--","--","--","--","fname",":","str","The","name","of","the","file","to","read","."]
code: def read(cls, fname):
      """Entry point for reading OBJ files.
  
      Parameters
      ----------
      fname : str
          The name of the file to read.
  
      """
      # Open file
      fmt = op.splitext(fname)[1].lower()
      assert fmt in (".obj", ".gz")
      opener = open if fmt == ".obj" else GzipFile
      with opener(fname, "rb") as f:
          try:
              reader = WavefrontReader(f)
              while True:
                  reader.readLine()
          except EOFError:
              pass
  
      # Done
      t0 = time.time()
      mesh = reader.finish()
      logger.debug(
          "reading mesh took " + str(time.time() - t0) + " seconds"
      )
      return mesh
  
imports: import numpy
  import time
  from gzip import GzipFile
  from os import path
  from ..geometry import _calculate_normals
  from ..util import logger
label_desc: Use image node_id 2 for calling the WavefrontReader obj's underlying member method code with example usage: obj.read(cls, fname) and returns: mesh