Jonathan wrote: > Jason, > I think this is a great idea. As I use Sage a bit in my teaching, > it would be nice to have a primitive with separate items for axes, > axes' labels, axes scale (the numbers on the axes). Then buttons > could be added to turn these on and off at the user request. If some > things can be passed to Jmol as functions, they will render well at > any zoom level. It would also be easier to use the slab function for > slicing 3-D objects. > That said there are some serious problems with how the notebook/ > plot3D uses Jmol presently, that have little to do with whether a > primitive exists or not. I'm willing to help fix them, but need to > understand where in the code the html and javascript for Jmol is > generated. The way it is presently done the following things are a > problem: > > 1) It does not work in Firefox on Macs. Since I never have trouble > with this, I'm assuming something abnormal is being done with the > javascript that controls Jmol. Again, I bet I can help with this, but > I could not easily find where the code was generated. All I can do is > look at a web page. > 2) Since people are running into memory problems, I suggest that only > a limited number of live Jmols (present default JavaVM configurations > support about 8 - 10 per page) be allowed in any given notebook. I > provided some example code that does not require any server > intervention that does this. I could help fold this in, if I could > figure out how you are generating the javascript to control Jmol. > 3) Since there is room next to Jmol in the notebook, I suggest that > simple instructions on what Jmol can do and how to access the pop-up > be added and maybe a link to more extensive documentation (the Jmol > Site?). I'm an expert with Jmol and found it difficult to do anything > but rotate the image without significant experimentation. > 4) It also might be worth loading only a static image first with a > link to make live. This saves a lot of bandwidth and will decrease > the time users have to wait to see their plots. > 5) It would probably be a good idea to upgrade Jmol to the latest > stable release 11.8. I will try slipping that into a copy of 4.2 I > just downloaded. > > These are just some thoughts. The key thing is I think I could help, > but do not have time to wade through the code to figure out how > everything is connected. Can someone just tell me were to look?
Here's what I found by poking around for a bit. Everything has changed since the new notebook, so someone that knows, *please* correct me if I'm wrong. In Sage 4.2, it looks like the jmol-invoking javascript code is in: local/lib/python2.6/site-packages/sagenb/data/sage/js/jmol_lib.js That appears to be the code that actually sets up a jmol applet and makes the "Get Image" link. That file is loaded in local/lib/python2.6/site-packages/sagenb/data/sage/js/notebook_lib.js Jmol is initialized at the bottom of the template file: local/lib/python2.6/site-packages/sagenb/data/sage/html/notebook/head.tmpl The actual jmol application is in: local/lib/python2.6/site-packages/sagenb/data/jmol The jmol code gets invoked when a ".jmol" file is created by a 3d plot. The notebook then comes by, sees the .jmol file, and creates the jmol applet. The code that does this is in local/lib/python2.6/site-packages/sagenb/notebook/cell.py (search for jmol). The code in Sage that generates the .jmol files is (I believe) in devel/sage/sage/plot/plot3d/base.pyx (see the show method, starting with the following code. EMBEDDED_MODE is True when you are inside the notebook, and False if you are not executing inside the notebook.) if DOCTEST_MODE or viewer=='jmol': # Temporary hack: encode the desired applet size in the end of the filename: # (This will be removed once we have dynamic resizing of applets in the browser.) base, ext = os.path.splitext(filename) fg = figsize[0] #if fg >= 2: # fg = 2 filename = '%s-size%s%s'%(base, fg*100, ext) ext = "jmol" archive_name = "%s.%s.zip" % (filename, ext) if EMBEDDED_MODE: # jmol doesn't seem to correctly parse the ?params part of a URL archive_name = "%s-%s.%s.zip" % (filename, randint(0, 1 << 30), ext) T = self._prepare_for_jmol(frame, axes, frame_aspect_ratio, aspect_ratio, zoom) T.export_jmol(archive_name, force_reload=EMBEDDED_MODE, zoom=zoom*100, **kwds) viewer_app = "sage-native-execute " + os.path.join(sage.misc.misc.SAGE_LOCAL, "bin/jmol") # We need a script to load the file f = open(filename + '.jmol', 'w') f.write('set defaultdirectory "%s"\n' % archive_name) f.write('script SCRIPT\n') f.close() I hope this helps. Thanks, Jason -- Jason Grout --~--~---------~--~----~------------~-------~--~----~ To post to this group, send an email to sage-devel@googlegroups.com To unsubscribe from this group, send an email to sage-devel-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-devel URL: http://www.sagemath.org -~----------~----~----~----~------~----~------~--~---