def export_jmol(self, filename='jmol_shape.jmol', force_reload=False,
                    zoom=100, spin=False, background=(1,1,1), stereo=False,
                    mesh = False, dots = False,
                    perspective_depth = True,
                    orientation = (-764,-346,-545,76.39), **kwds):
                    # orientation chosen to look same as tachyon
        render_params = self.default_render_params()
        render_params.output_file = filename
        render_params.force_reload = render_params.randomize_counter = force_reload
        render_params.output_archive = zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED, True)
        render_params.atom_list = [] # some things (such as labels) must be attached to atoms
        render_params.mesh = mesh
        render_params.dots = dots
        
        # Get optional params:
        

        if kwds.has_key('Script'): Script=kwds['Script']  #Show Jmol Sciprt or not.  Default false
        else: Script = False
        if kwds.has_key('delay'): delay=kwds['delay'] 
        else: delay = 2  
        if kwds.has_key('rotate'): rotate = kwds['rotate']
        else: rotate = ()

        # Render the data
        all = flatten_list([self.jmol_repr(render_params), ""])
        
        f = StringIO()
        if len(render_params.atom_list):
            # Load the atom model
            f.write('data "model list0"\n')
            f.write('%s\nempty\n' % (len(render_params.atom_list) + 1))
            for atom in render_params.atom_list:
                f.write('Xx %s %s %s\n' % atom)
            f.write('Xx 5.5 5.5 5.5\n') # so the zoom fits the box
            f.write('end "model list0"; show data\n')
            f.write('select *\n')
            f.write('wireframe off; spacefill off\n')
            f.write('set labelOffset 0 0\n')
         
        if kwds.has_key('Test'): Test = kwds['Test']
        else: Test = False
         
        # Set the scene background color
        f.write('background [%s,%s,%s]\n'%tuple([int(a*255) for a in background]))
        if spin:
            f.write('spin ON\n')
        else:
            f.write('spin OFF\n')
        if stereo:
            if stereo is True: stereo = "redblue"
            f.write('stereo %s\n' % stereo)
        if orientation:
            f.write('moveto 0 %s %s %s %s\n'%tuple(orientation))
                
        f.write('centerAt absolute {0 0 0}\n')
        f.write('zoom %s\n'%zoom)
        f.write('frank OFF\n') # jmol logo
        if perspective_depth:
            f.write('set perspectivedepth ON\n')
        else:
            f.write('set perspectivedepth OFF\n')
         
        # Put the rest of the object in
        f.write("\n".join(all)) 
        
        
        # Rotations
        if not len(rotate) == 0:
            f.write('moveto 0 0 0 1 90\n')  # Set orientation looking down on z-axis initially.  May want to delete this.
        for j in range(0, len(rotate)):
            r = rotate[j]
            if not (len(r) == 5 or len(r)==4):
                raise TypeError, 'rotions must be 4 or 5-tuples or lists'
            f.write('delay %s\n' % delay)
            if len(r)==5:
                f.write('spin axisangle {%s %s %s} %s %s\n' % tuple(r))
                speed = r[4]
                degrees = r[3]
            else:
                speed = 20
                degrees = r[3]
                f.write('spin axisangle {%s %s %s} %s %s\n' % (r[0],r[1],r[2], r[3], speed))
            rotation_time = float(degrees)/float(speed)
            d = delay + rotation_time
            f.write('delay %s\n' % d)             
       
         # Print Script option
        if Script:     
            print f.getvalue()
        

        render_params.output_archive.writestr('SCRIPT', f.getvalue())
        render_params.output_archive.close()