docs: def add_isosurface(self, function, isolevel=0.3, resolution=32, style="wireframe", color=0xffffff):
          '''Add an isosurface to the current scene.
  
          :param callable function: A function that takes x, y, z coordinates as input and is broadcastable using numpy. Typically simple
                                    functions that involve standard arithmetic operations and functions
                                    such as ``x**2 + y**2 + z**2`` or ``np.exp(x**2 + y**2 + z**2)`` will work. If not sure, you can first
                                    pass the function through ``numpy.vectorize``.\
  
                                    Example: ``mv.add_isosurface(np.vectorize(f))``
          :param float isolevel: The value for which the function should be constant.
          :param int resolution: The number of grid point to use for the surface. An high value will give better quality but lower performance.
          :param str style: The surface style, choose between ``solid``, ``wireframe`` and ``transparent``.
          :param int color: The color given as an hexadecimal integer. Example: ``0xffffff`` is white.
  
          '''
  
          avail_styles = ['wireframe', 'solid', 'transparent']
          if style not in avail_styles:
              raise ValueError('style must be in ' + str(avail_styles))
  
          # We want to make a container that contains the whole molecule
          # and surface
          area_min = self.coordinates.min(axis=0) - 0.2
          area_max = self.coordinates.max(axis=0) + 0.2
  
          x = np.linspace(area_min[0], area_max[0], resolution)
          y = np.linspace(area_min[1], area_max[1], resolution)
          z = np.linspace(area_min[2], area_max[2], resolution)
  
          xv, yv, zv = np.meshgrid(x, y, z)
          spacing = np.array((area_max - area_min)/resolution)
  
          if isolevel >= 0:
              triangles = marching_cubes(function(xv, yv, zv), isolevel)
          else: # Wrong traingle unwinding roder -- god only knows why
              triangles = marching_cubes(-function(xv, yv, zv), -isolevel)
  
          if len(triangles) == 0:
              ## NO surface
              return
  
          faces = []
          verts = []
          for i, t in enumerate(triangles):
             faces.append([i * 3, i * 3 +1, i * 3 + 2])
             verts.extend(t)
  
          faces = np.array(faces)
          verts = area_min + spacing/2 + np.array(verts)*spacing
          rep_id = self.add_representation('surface', {'verts': verts.astype('float32'),
                                                       'faces': faces.astype('int32'),
                                                       'style': style,
                                                       'color': color})
          self.autozoom(verts)