From: <ha...@us...> - 2008-10-24 19:06:24
|
Revision: 10139 http://jmol.svn.sourceforge.net/jmol/?rev=10139&view=rev Author: hansonr Date: 2008-10-24 19:06:13 +0000 (Fri, 24 Oct 2008) Log Message: ----------- 11.7.5 VERSION # code: ScriptWindow public: sendConsoleEcho,sendConsoleMessage,notifyScriptStart,notifyScriptTermination # bug fix: set labelToggle malfunctioning # bug fix: missing default background for toggled labels # bug fix: color {oxygen} translucent blue # bug fix: color translucent 1 blue 1-8 integer settings off by one # bug fix: background color +/-1 adjustment removed Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/ScriptWindow.java Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-10-24 17:52:36 UTC (rev 10138) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-10-24 19:06:13 UTC (rev 10139) @@ -1,8 +1,9 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=11.7.5_dev +version=11.7.5 +# code: ScriptWindow public: sendConsoleEcho,sendConsoleMessage,notifyScriptStart,notifyScriptTermination # bug fix: set labelToggle malfunctioning # bug fix: missing default background for toggled labels # bug fix: color {oxygen} translucent blue Modified: trunk/Jmol/src/org/openscience/jmol/app/ScriptWindow.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/ScriptWindow.java 2008-10-24 17:52:36 UTC (rev 10138) +++ trunk/Jmol/src/org/openscience/jmol/app/ScriptWindow.java 2008-10-24 19:06:13 UTC (rev 10139) @@ -68,6 +68,13 @@ private JButton redoButton; JmolViewer viewer; + /* + * methods sendConsoleEcho, sendConsoleMessage(strStatus), notifyScriptStart(), notifyScriptTermination() + * are public in case developers want to use ScriptWindow separate from the Jmol application. + * + */ + + public ScriptWindow(JmolViewer viewer, JFrame frame) { super(frame, GT._("Jmol Script Console"), false); this.viewer = viewer; @@ -155,11 +162,11 @@ } boolean isError = false; - void setError(boolean TF) { + private void setError(boolean TF) { isError = TF; } - void sendConsoleMessage(String strStatus) { + public void sendConsoleMessage(String strStatus) { if (strStatus == null) { console.clearContent(); console.outputStatus(""); @@ -173,12 +180,12 @@ } } - void notifyScriptStart() { + public void notifyScriptStart() { runButton.setEnabled(true); haltButton.setEnabled(true); } - void notifyScriptTermination() { + public void notifyScriptTermination() { runButton.setEnabled(true); haltButton.setEnabled(false); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-11-13 15:17:56
|
Revision: 10304 http://jmol.svn.sourceforge.net/jmol/?rev=10304&view=rev Author: hansonr Date: 2008-11-13 15:17:51 +0000 (Thu, 13 Nov 2008) Log Message: ----------- jvxl Modified Paths: -------------- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java trunk/Jmol/src/org/openscience/jvxl/Jvxl.java Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2008-11-13 07:56:46 UTC (rev 10303) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2008-11-13 15:17:51 UTC (rev 10304) @@ -515,7 +515,7 @@ propertyName = "mapColor"; } else { colorEncoder.setColorScheme(colorScheme); - if (params.state == Parameters.STATE_DATA_COLORED) + if (surfaceReader != null && params.state == Parameters.STATE_DATA_COLORED) surfaceReader.applyColorScale(); return true; } Modified: trunk/Jmol/src/org/openscience/jvxl/Jvxl.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/Jvxl.java 2008-11-13 07:56:46 UTC (rev 10303) +++ trunk/Jmol/src/org/openscience/jvxl/Jvxl.java 2008-11-13 15:17:51 UTC (rev 10304) @@ -50,6 +50,7 @@ public class Jvxl { + private final static String VERSION = "JVXL.java Version 1.0"; public static void main(String[] args) { boolean blockData = false; @@ -268,6 +269,7 @@ // input file + sg.setVersion(VERSION); if (blockData) sg.setParameter("blockData", Boolean.TRUE); if (!Float.isNaN(cutoff)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-11-27 15:48:46
|
Revision: 10382 http://jmol.svn.sourceforge.net/jmol/?rev=10382&view=rev Author: hansonr Date: 2008-11-27 15:48:39 +0000 (Thu, 27 Nov 2008) Log Message: ----------- 11.7.14 VERSION # new feature: jmolGetPropertyAsString("errorMessage") # new feature: out-of-memory "Java heap error" trapping in scripts and image creation # new feature: save [bonds|coordinates|orientation|selected|state|structure] DELETE # bug fix: write coords CLIPBOARD broken # bug fix: select {*.ca} (phi < select(y; {*.ca}; y.resno = _x.resno + 1).phi) fails when atomExpression is ({}) # bug fix: applet compilation error not sent in termination message # bug fix: build javax package does not include AxisAngle4d.class, Matrix4d.class # bug fix: compilation of myfunc({1 2 3}) fails # bug fix: hover watcher occasional uncaught exception Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java trunk/Jmol/src/org/jmol/api/JmolStatusListener.java trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/applet/Jvm12.java trunk/Jmol/src/org/jmol/export/image/ImageCreator.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StatusManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -8,6 +8,14 @@ abstract public String getClipboardText(); - abstract public String createImage(String fileName, String type, Object text_bytes, int quality); + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ + abstract public String createImage(String fileName, String type, Object text_or_bytes, int quality); } Modified: trunk/Jmol/src/org/jmol/api/JmolStatusListener.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolStatusListener.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/api/JmolStatusListener.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -47,7 +47,15 @@ public float[][] functionXY(String functionName, int x, int y); - public String createImage(String file, String type, Object text_or_bytes, int quality); + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ + public String createImage(String fileName, String type, Object text_or_bytes, int quality); public Hashtable getRegistryInfo(); Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -153,7 +153,18 @@ abstract public void releaseScreenImage(); abstract public void writeTextFile(String string, String data); - abstract public String createImage(String file, String type, Object text_or_bytes, int quality, + + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @param width + * @param height + * @return null (canceled) or a message starting with OK or an error message + */ + abstract public String createImage(String fileName, String type, Object text_or_bytes, int quality, int width, int height); abstract public boolean handleOldJvm10Event(Event e); Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -1055,30 +1055,35 @@ return ""; } - public String createImage(String file, String type, Object text_or_bytes, + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ + public String createImage(String fileName, String type, Object text_or_bytes, int quality) { - String err = "OK"; - if (file == null) { - if (jvm12 != null) - jvm12.clipImage(); - } else if (file.equalsIgnoreCase("CLIPBOARD")) { - if (jvm12 != null) - jvm12.clipImage(); - } else if (isSigned) { + boolean isImage = (quality != Integer.MIN_VALUE); + if (isSigned) { if (jvm12 != null) { + if (isImage && (fileName == null || fileName.equalsIgnoreCase("CLIPBOARD"))) { + jvm12.clipImage(); + return "OK"; + } try { - return jvm12.createImage(file, type, text_or_bytes, quality); + return jvm12.createImage(fileName, type, text_or_bytes, quality); } catch (Exception e) { } - return GT._("File creation failed."); } - } else if (quality != Integer.MAX_VALUE) { + } else if (isImage) { return GT ._( "File creation by this applet is not allowed. For Base64 JPEG format, use {0}.", "jmolGetPropertyAsString('image')"); } - return (text_or_bytes instanceof String ? (String) text_or_bytes : err); + return GT._("File creation failed."); } public float[][] functionXY(String functionName, int nX, int nY) { Modified: trunk/Jmol/src/org/jmol/applet/Jvm12.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jvm12.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/applet/Jvm12.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -168,20 +168,30 @@ String imageType; int imageQuality; + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ String createImage(String fileName, String type, Object text_or_bytes, int quality) { - if (quality == Integer.MIN_VALUE) { - // text or bytes - fileName = dialogAsk("save", fileName); - } else { - imageType = type.toUpperCase(); - imageQuality = quality; - fileName = dialogAsk("saveImage+" + type, fileName); - quality = imageQuality; - type = imageType; + if (fileName != null) { + if (quality == Integer.MIN_VALUE) { + // text or bytes + fileName = dialogAsk("save", fileName); + } else { + imageType = type.toUpperCase(); + imageQuality = quality; + fileName = dialogAsk("saveImage+" + type, fileName); + quality = imageQuality; + type = imageType; + } + if (fileName == null) + return null; } - if (fileName == null) - return null; JmolImageCreatorInterface c = (JmolImageCreatorInterface) Interface .getOptionInterface("export.image.ImageCreator"); c.setViewer(viewer); Modified: trunk/Jmol/src/org/jmol/export/image/ImageCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -72,22 +72,31 @@ return ImageSelection.getClipboardText(); } - public String createImage(String fileName, String type, Object text_bytes, - int quality) { - boolean isBytes = (text_bytes instanceof byte[]); - String text = (isBytes ? null : (String) text_bytes); + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ + public String createImage(String fileName, String type, + Object text_or_bytes, int quality) { + // returns message starting with OK or an error message + boolean isBytes = (text_or_bytes instanceof byte[]); + String text = (isBytes ? null : (String) text_or_bytes); boolean isText = (quality == Integer.MIN_VALUE); if (fileName == null) { clipImage(text); return "OK " + text.length(); } - if ((isText || isBytes) && text_bytes == null) + if ((isText || isBytes) && text_or_bytes == null) return "NO DATA"; FileOutputStream os = null; try { os = new FileOutputStream(fileName); if (isBytes) { - os.write((byte[]) text_bytes); + os.write((byte[]) text_or_bytes); os.flush(); os.close(); } else if (isText) { @@ -137,7 +146,7 @@ try { os.close(); } catch (IOException e) { - Logger.error("IO Exception", e); + // ignore } } } Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -9209,9 +9209,12 @@ if (!isCommand) return data; String msg = viewer.createImage(fileName + ".ini", "ini", data, - Integer.MIN_VALUE, 0, 0); - scriptStatus(msg.startsWith("OK") ? "Created " + fileName + ".ini:\n\n" - + data : msg); + Integer.MIN_VALUE, 0, 0, null); + if (msg != null) { + if (!msg.startsWith("OK")) + evalError(msg); + scriptStatus("Created " + fileName + ".ini:\n\n" + data); + } return ""; } } else if (data == "MENU") { @@ -9262,8 +9265,8 @@ if ((data = getIsosurfaceJvxl()) == null) evalError(GT._("No data available")); if (!isShow) - showString((String) viewer.getShapeProperty(JmolConstants.SHAPE_ISOSURFACE, - "jvxlFileInfo")); + showString((String) viewer.getShapeProperty( + JmolConstants.SHAPE_ISOSURFACE, "jvxlFileInfo")); type = "JVXL"; } else { // image @@ -9295,10 +9298,12 @@ bytes = data; String msg = viewer.createImage(fileName, type, bytes, quality, width, height, bsFrames); - if (msg != null) - scriptStatus(!msg.startsWith("OK") ? msg : msg - // + (len >= 0 ? "; length=" + len : "") + if (msg != null) { + if (!msg.startsWith("OK")) + evalError(msg); + scriptStatus(msg + (isImage ? "; width=" + width + "; height=" + height : "")); + } } return ""; } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-11-27 15:48:39 UTC (rev 10382) @@ -1,16 +1,18 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=11.7.14_dev +version=11.7.14 +# new feature: jmolGetPropertyAsString("errorMessage") +# new feature: out-of-memory "Java heap error" trapping in scripts and image creation +# new feature: save [bonds|coordinates|orientation|selected|state|structure] DELETE + +# bug fix: write coords CLIPBOARD broken # bug fix: select {*.ca} (phi < select(y; {*.ca}; y.resno = _x.resno + 1).phi) fails when atomExpression is ({}) # bug fix: applet compilation error not sent in termination message -# new feature: jmolGetPropertyAsString("errorMessage") -# new feature: out-of-memory "Java heap error" trapping in scripts and image creation # bug fix: build javax package does not include AxisAngle4d.class, Matrix4d.class # bug fix: compilation of myfunc({1 2 3}) fails # bug fix: hover watcher occasional uncaught exception -# new feature: save [bonds|coordinates|orientation|selected|state|structure] DELETE # ----------------------------------------------------------------------------- Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -31,6 +31,7 @@ import java.util.Vector; import org.jmol.api.*; +import org.jmol.i18n.GT; /** * * The StatusManager class handles all details of status reporting, including: @@ -446,19 +447,27 @@ return (jmolStatusListener == null ? "" : jmolStatusListener.eval(strEval)); } - String createImage(String file, String type, Object text_or_bytes, int quality) { + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ + String createImage(String fileName, String type, Object text_or_bytes, int quality) { if (jmolStatusListener == null) - return ""; - if (file != null && file.startsWith("?")) { - file = file.substring(1); + return GT._("File creation failed."); + if (fileName != null && fileName.startsWith("?")) { + fileName = fileName.substring(1); if (!viewer.isSignedApplet()) { - file = dialogAsk(quality == Integer.MIN_VALUE ? "save" : "saveImage", - file); - if (file == null) + fileName = dialogAsk(quality == Integer.MIN_VALUE ? "save" : "saveImage", + fileName); + if (fileName == null) return null; } } - return jmolStatusListener.createImage(file, type, text_or_bytes, quality); + return jmolStatusListener.createImage(fileName, type, text_or_bytes, quality); } public Hashtable getRegistryInfo() { Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -3161,6 +3161,12 @@ resizeImage(width, height, false, false, true); } + private float imageFontScaling = 1; + + public float getImageFontScaling() { + return imageFontScaling; + } + private void resizeImage(int width, int height, boolean isImageWrite, boolean isGenerator, boolean isReset) { if (!isImageWrite && creatingImage) @@ -3523,7 +3529,7 @@ statusManager.setScriptStatus("Jmol script terminated", strErrorMessage, 1 + eval.getExecutionWalltime()); if (isScriptFile && writeInfo != null) - createImage(writeInfo); + writeImage(writeInfo); } else { statusManager.setScriptStatus("Jmol script terminated", strErrorMessage, 1); @@ -6370,13 +6376,16 @@ } // /////////////////////////////////////////////////////////////// - // image export + // image and file export // /////////////////////////////////////////////////////////////// /** + * only from application with -w flag + * * @param type_name TYPE:filename\twidth\theight\tquality */ - private void createImage(String type_name) { // or script now + private void writeImage(String type_name) { + int quality, width, height; if (type_name == null) return; @@ -6386,14 +6395,14 @@ type_name += ":jmol.jpg"; int i = type_name.indexOf(":"); String type = type_name.substring(0, i).toUpperCase(); - String file = type_name.substring(i + 1); + String fileName = type_name.substring(i + 1); String swidth = "-1"; String sheight = "-1"; String squality = (type.equals("PNG") ? "2" : "75"); - i = file.indexOf('\t'); + i = fileName.indexOf('\t'); if (i > 0) { - swidth = file.substring(i + 1); - file = file.substring(0, i); + swidth = fileName.substring(i + 1); + fileName = fileName.substring(0, i); } i = swidth.indexOf('\t'); if (i > 0) { @@ -6409,7 +6418,7 @@ width = Integer.parseInt(swidth); height = Integer.parseInt(sheight); quality = Integer.parseInt(squality); - createImage(file, type, null, quality, width, height); + createImage(fileName, type, null, quality, width, height); } catch (Exception e) { Logger.error(setErrorMessage("error processing write request: " + type_name + " "+ e.getMessage())); } catch (Error er) { @@ -6417,48 +6426,72 @@ } } - private float imageFontScaling = 1; - - public float getImageFontScaling() { - return imageFontScaling; + public void writeTextFile(String fileName, String data) { + createImage(fileName, "txt", data, Integer.MIN_VALUE, 0, 0); } - - public void writeTextFile(String file, String data) { - createImage(file, "txt", data, Integer.MIN_VALUE, 0, 0); - } - private boolean creatingImage; - - public String createImage(String file, String type, Object text_or_bytes, + /** + * + * from eval write command only + * includes option to write set of files + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @param width + * @param height + * @param bsFrames + * @return message starting with "OK" or an error message + */ + String createImage(String fileName, String type, Object text_or_bytes, int quality, int width, int height, BitSet bsFrames) { if (bsFrames == null) - return createImage(file, type, text_or_bytes, quality, width, height); + return createImage(fileName, type, text_or_bytes, quality, width, height); int modelCount = getModelCount(); String info = ""; int n = 0; - int ptDot = file.indexOf("."); + int ptDot = fileName.indexOf("."); if (ptDot < 0) - ptDot = file.length(); + ptDot = fileName.length(); - String froot = file.substring(0, ptDot); - String fext = file.substring(ptDot); + String froot = fileName.substring(0, ptDot); + String fext = fileName.substring(ptDot); for (int i = 0; i < modelCount; i++) if (bsFrames.get(i)) { setCurrentModelIndex(i); - String fname = "0000" + (++n); - fname = froot + fname.substring(fname.length() - 4) + fext; - String msg = createImage(fname, type, text_or_bytes, quality, width, height); + fileName = "0000" + (++n); + fileName = froot + fileName.substring(fileName.length() - 4) + fext; + String msg = createImage(fileName, type, text_or_bytes, quality, width, height); Logger.info(msg); info += msg + "\n"; if (!msg.startsWith("OK")) - return info; + return "ERROR WRITING FILE SET: \n" + info; } - return info; + if (info.length() == 0) + info = "OK\n"; + return info + "\n" + n + " files created"; } - public String createImage(String file, String type, Object text_or_bytes, + private boolean creatingImage; + + /** + * general routine for creating an image + * or writing data to a file + * + * passes request to statusManager to pass along + * to app or applet jmolStatusListener interface + * + * @param fileName starts with ? --> use file dialog; null --> to clipboard + * @param type PNG, JPG, etc. + * @param text_or_bytes String or byte[] or null if an image + * @param quality Integer.MIN_VALUE --> not an image + * @param width image width + * @param height image height + * @return null (canceled) or a message starting with OK or an error message + */ + public String createImage(String fileName, String type, Object text_or_bytes, int quality, int width, int height) { - //pushHoldRepaint(); /* * * org.jmol.export.image.AviCreator @@ -6497,20 +6530,20 @@ } creatingImage = true; String err = null; - file = FileManager.setLocalPathForWritingFile(this, file); + if (fileName != null) + fileName = FileManager.setLocalPathForWritingFile(this, fileName); try { - err = statusManager.createImage(file, type, text_or_bytes, quality); + err = statusManager.createImage(fileName, type, text_or_bytes, quality); + // err may be null if user cancels operation involving dialog and "?" } catch (Exception e) { - Logger.error(setErrorMessage("ERROR creating image: " + e.getMessage())); + Logger.error(setErrorMessage(err = "ERROR creating image: " + e.getMessage())); } catch (Error er) { - Logger.error(setErrorMessage("ERROR creating image: "+ er.getMessage())); + Logger.error(setErrorMessage(err = "ERROR creating image: "+ er.getMessage())); } - creatingImage = false; if (quality != Integer.MIN_VALUE) { resizeImage(saveWidth, saveHeight, true, false, true); } - //popHoldRepaint(); return err; } Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-11-27 15:46:56 UTC (rev 10381) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-11-27 15:48:39 UTC (rev 10382) @@ -1576,18 +1576,29 @@ } } - String createImageStatus(String file, String type, Object text_or_bytes, + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ + String createImageStatus(String fileName, String type, Object text_or_bytes, int quality) { ImageCreator c = new ImageCreator(viewer); - String msg = c.createImage(file, type, text_or_bytes, quality); - if (msg != null) { - if (msg.startsWith("OK")) - return msg; - if (status != null) { - status.setStatus(1, GT._("IO Exception:")); - status.setStatus(2, msg); - } + if (quality != Integer.MIN_VALUE + && (fileName == null || fileName.equalsIgnoreCase("CLIPBOARD"))) { + c.clipImage(null); + return "OK"; } + String msg = c.createImage(fileName, type, text_or_bytes, quality); + if (msg == null || msg.startsWith("OK")) + return msg; + if (status != null) { + status.setStatus(1, GT._("IO Exception:")); + status.setStatus(2, msg); + } return msg; } @@ -1725,9 +1736,17 @@ return "# 'eval' is implemented only for the applet."; } - public String createImage(String file, String type, Object text_or_bytes, + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ + public String createImage(String fileName, String type, Object text_or_bytes, int quality) { - return createImageStatus(file, type, text_or_bytes, quality); + return createImageStatus(fileName, type, text_or_bytes, quality); } public void setCallbackFunction(String callbackType, String callbackFunction) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-02 19:52:27
|
Revision: 10401 http://jmol.svn.sourceforge.net/jmol/?rev=10401&view=rev Author: hansonr Date: 2008-12-02 19:52:23 +0000 (Tue, 02 Dec 2008) Log Message: ----------- version=11.7.15_dev # bug fix: 11.7.14 has broken define ({...}) statement Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Compiler.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/viewer/Compiler.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Compiler.java 2008-12-02 14:09:40 UTC (rev 10400) +++ trunk/Jmol/src/org/jmol/viewer/Compiler.java 2008-12-02 19:52:23 UTC (rev 10401) @@ -385,6 +385,13 @@ } else { endOfLine = lookingAtEndOfLine(); } + if (nTokens == 0) { + isNewSet = isSetBrace = false; + ptNewSetModifier = 1; + nSemiSkip = 0; + braceCount = 0; + bracketCount = 0; + } if (comment != null || endOfLine || lookingAtEndOfStatement()) { if (nTokens > 0 || comment != null) { if (nTokens == 0) { @@ -433,13 +440,7 @@ break; } char ch; - if (nTokens == 0) { - isNewSet = isSetBrace = false; - ptNewSetModifier = 1; - nSemiSkip = 0; - braceCount = 0; - bracketCount = 0; - } else { + if (nTokens > 0) { if (nTokens == ptNewSetModifier) { ch = script.charAt(ichToken); if (tokCommand == Token.set @@ -457,7 +458,10 @@ bracketCount++; } else if (ch == '.') { addTokenToPrefix(new Token(Token.dot, ".")); + } else { + lastToken = Token.tokenMinus; // just to allow for {(....)} } + continue; } } @@ -606,10 +610,9 @@ addTokenToPrefix(new Token(Token.integer, val, intString)); continue; } - if (lastToken.tok == Token.select - || lastToken.tok == Token.within - || lastToken.tok != Token.identifier - && !tokenAttr(lastToken, Token.mathfunc)) { + if (lastToken.tok == Token.select || lastToken.tok == Token.within + || lastToken.tok != Token.identifier + && !tokenAttr(lastToken, Token.mathfunc)) { // here if: // select ({...}) // within({...}) @@ -883,38 +886,42 @@ case Token.select: case Token.delete: case Token.define: - if (tok == Token.define) { + if (tokCommand == Token.define) { if (nTokens == 1) { // we are looking at the variable name - if (tok == Token.identifier) - break; - if (preDefining) { - if (!Token.tokAttr(tok, Token.predefinedset)) - return error("ERROR IN Token.java or JmolConstants.java -- the following term was used in JmolConstants.java but not listed as predefinedset in Token.java: " - + ident); - } else if (Token.tokAttr(tok, Token.predefinedset)) { - Logger - .warn("WARNING: predefined term '" - + ident - + "' has been redefined by the user until the next file load."); - } else if (!isCheckOnly && ident.length() > 1) { - Logger - .warn("WARNING: redefining " - + ident - + "; was " - + token - + "not all commands may continue to be functional for the life of the applet!"); - tok = token.tok = Token.identifier; - Token.addToken(ident, token); + if (tok != Token.identifier) { + if (preDefining) { + if (!Token.tokAttr(tok, Token.predefinedset)) + return error("ERROR IN Token.java or JmolConstants.java -- the following term was used in JmolConstants.java but not listed as predefinedset in Token.java: " + + ident); + } else if (Token.tokAttr(tok, Token.predefinedset)) { + Logger + .warn("WARNING: predefined term '" + + ident + + "' has been redefined by the user until the next file load."); + } else if (!isCheckOnly && ident.length() > 1) { + Logger + .warn("WARNING: redefining " + + ident + + "; was " + + token + + "not all commands may continue to be functional for the life of the applet!"); + tok = token.tok = Token.identifier; + Token.addToken(ident, token); + } } - break; - } - if (nTokens == 2 && tok == Token.opEQ) { - // we are looking at @x =.... just insert a SET command - // and ignore the =. It's the same as set @x ... - ltoken.insertElementAt(Token.tokenSet, 0); + addTokenToPrefix(token); + lastToken = Token.tokenComma; continue; } + if (nTokens == 2) { + if (tok == Token.opEQ) { + // we are looking at @x =.... just insert a SET command + // and ignore the =. It's the same as set @x ... + ltoken.insertElementAt(Token.tokenSet, 0); + continue; + } + } } if (bracketCount == 0 && tok != Token.identifier && !Token.tokAttr(tok, Token.expression) && tok != Token.min Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-02 14:09:40 UTC (rev 10400) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-02 19:52:23 UTC (rev 10401) @@ -3,6 +3,7 @@ version=11.7.15_dev +# bug fix: 11.7.14 has broken define ({...}) statement # code: better handling of OutOfMemoryError conditions (2) # code: refactoring of method names in FileManager and Viewer # code: refactoring of method names to remove ambiguities between "openFile" and "createModelSet" Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-02 14:09:40 UTC (rev 10400) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-02 19:52:23 UTC (rev 10401) @@ -1708,6 +1708,8 @@ if (msWalltime > 0) { // termination -- button legacy scriptWindow.notifyScriptTermination(); + if (data[2] != null) + scriptWindow.sendConsoleMessage((String)data[2]); } else if (msWalltime < 0) { if (msWalltime == -2) scriptWindow.notifyScriptStart(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-03 17:11:30
|
Revision: 10422 http://jmol.svn.sourceforge.net/jmol/?rev=10422&view=rev Author: hansonr Date: 2008-12-03 17:11:20 +0000 (Wed, 03 Dec 2008) Log Message: ----------- version=11.7.16_dev # new feature: set errorCallback -- cannot be a Jmol script! Modified Paths: -------------- trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/JmolConstants.java trunk/Jmol/src/org/jmol/viewer/StatusManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-12-03 05:45:41 UTC (rev 10421) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-12-03 17:11:20 UTC (rev 10422) @@ -810,6 +810,7 @@ switch (type) { case JmolConstants.CALLBACK_ANIMFRAME: case JmolConstants.CALLBACK_ECHO: + case JmolConstants.CALLBACK_ERROR: case JmolConstants.CALLBACK_EVAL: case JmolConstants.CALLBACK_LOADSTRUCT: case JmolConstants.CALLBACK_MEASURE: @@ -883,6 +884,7 @@ break; case JmolConstants.CALLBACK_EVAL: case JmolConstants.CALLBACK_HOVER: + case JmolConstants.CALLBACK_ERROR: break; case JmolConstants.CALLBACK_LOADSTRUCT: String errorMsg = (String) data[4]; Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-12-03 05:45:41 UTC (rev 10421) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-12-03 17:11:20 UTC (rev 10422) @@ -287,6 +287,7 @@ } catch (ScriptException e) { setErrorMessage(e.toString()); scriptStatus(errorMessage); + viewer.notifyError("ScriptException", errorMessage); } timeEndExecution = System.currentTimeMillis(); fileOpenCheck = tempOpen; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-03 05:45:41 UTC (rev 10421) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-03 17:11:20 UTC (rev 10422) @@ -3,6 +3,7 @@ version=11.7.16_dev +# new feature: set errorCallback -- cannot be a Jmol script! # new feature: load xxx.gamess FILTER "natural,optimized" # new feature: load xxx.gamess FILTER "!natural,!initial" Modified: trunk/Jmol/src/org/jmol/viewer/JmolConstants.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JmolConstants.java 2008-12-03 05:45:41 UTC (rev 10421) +++ trunk/Jmol/src/org/jmol/viewer/JmolConstants.java 2008-12-03 17:11:20 UTC (rev 10422) @@ -87,17 +87,18 @@ public final static int CALLBACK_ANIMFRAME = 0; public final static int CALLBACK_ECHO = 1; - public final static int CALLBACK_EVAL = 2; - public final static int CALLBACK_HOVER = 3; - public final static int CALLBACK_LOADSTRUCT = 4; - public final static int CALLBACK_MEASURE = 5; - public final static int CALLBACK_MESSAGE = 6; - public final static int CALLBACK_MINIMIZATION = 7; - public final static int CALLBACK_PICK = 8; - public final static int CALLBACK_RESIZE = 9; - public final static int CALLBACK_SCRIPT = 10; - public final static int CALLBACK_SYNC = 11; - public final static int CALLBACK_COUNT = 12; + public final static int CALLBACK_ERROR = 2; + public final static int CALLBACK_EVAL = 3; + public final static int CALLBACK_HOVER = 4; + public final static int CALLBACK_LOADSTRUCT = 5; + public final static int CALLBACK_MEASURE = 6; + public final static int CALLBACK_MESSAGE = 7; + public final static int CALLBACK_MINIMIZATION = 8; + public final static int CALLBACK_PICK = 9; + public final static int CALLBACK_RESIZE = 10; + public final static int CALLBACK_SCRIPT = 11; + public final static int CALLBACK_SYNC = 12; + public final static int CALLBACK_COUNT = 13; private final static String[] callbackNames = { "animFrameCallback", Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2008-12-03 05:45:41 UTC (rev 10421) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2008-12-03 17:11:20 UTC (rev 10422) @@ -233,6 +233,15 @@ jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_MEASURE, new Object[] { null, strMeasure, new Integer(count), status }); } + synchronized void notifyError(String errType, String errMsg) { + if (jmolStatusListener == null + || !jmolStatusListener + .notifyEnabled(JmolConstants.CALLBACK_ERROR)) + return; + jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_ERROR, + new Object[] { errType, errMsg, viewer.getShapeErrorState() }); + } + synchronized void notifyMinimizationStatus(String sJmol) { if (jmolStatusListener == null || !jmolStatusListener Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-03 05:45:41 UTC (rev 10421) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-03 17:11:20 UTC (rev 10422) @@ -6533,9 +6533,9 @@ quality = Integer.parseInt(squality); createImage(fileName, type, null, quality, width, height); } catch (Exception e) { - Logger.error(setErrorMessage("error processing write request: " + type_name + " "+ e.getMessage())); + Logger.error(setErrorMessage("error processing write request: " + type_name + " "+ e)); } catch (Error er) { - Logger.error(setErrorMessage("error processing write request: " + type_name + " "+ er.getMessage())); + Logger.error(setErrorMessage("error processing write request: " + type_name + " "+ er)); } } @@ -6966,11 +6966,23 @@ return JmolConstants.getShapeClassName(currentShapeID) + " " + currentShapeState; } + void notifyError(String errType, String errMsg) { + statusManager.notifyError(errType, errMsg); + } public void handleError(Error er, boolean doClear) { // almost certainly out of memory; could be missing Jar file - if (doClear) - zap("" + er); // get some breathing room - Logger.error("viewer handling error condition: " + er); + try { + if (doClear) + zap("" + er); // get some breathing room + Logger.error("viewer handling error condition: " + er); + notifyError("Error", "doClear=" + doClear + "; " + er); + } catch (Throwable e1) { + try { + Logger.error("Could not notify error " + er + ": due to " + e1); + } catch (Throwable er2) { + // tough luck. + } + } } } Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-03 05:45:41 UTC (rev 10421) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-03 17:11:20 UTC (rev 10422) @@ -1658,11 +1658,12 @@ case JmolConstants.CALLBACK_PICK: case JmolConstants.CALLBACK_SCRIPT: return true; + case JmolConstants.CALLBACK_ERROR: case JmolConstants.CALLBACK_HOVER: case JmolConstants.CALLBACK_MINIMIZATION: case JmolConstants.CALLBACK_RESIZE: case JmolConstants.CALLBACK_SYNC: - //applet only + //applet only (but you could change this for your listener) } return false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-04 13:38:38
|
Revision: 10426 http://jmol.svn.sourceforge.net/jmol/?rev=10426&view=rev Author: hansonr Date: 2008-12-04 13:38:29 +0000 (Thu, 04 Dec 2008) Log Message: ----------- version=11.7.16_dev # bug fix: app -j "xxx" option bug Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-03 17:41:11 UTC (rev 10425) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-04 13:38:29 UTC (rev 10426) @@ -3,6 +3,7 @@ version=11.7.16_dev +# bug fix: app -j "xxx" option bug # new feature: set errorCallback -- cannot be a Jmol script! # new feature: load xxx.gamess FILTER "natural,optimized" # new feature: load xxx.gamess FILTER "!natural,!initial" Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-03 17:41:11 UTC (rev 10425) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-04 13:38:29 UTC (rev 10426) @@ -415,9 +415,7 @@ options.addOption(OptionBuilder.create("s")); OptionBuilder.withLongOpt("jmolscript"); - OptionBuilder.withDescription(GT._("Jmol script to execute")); - OptionBuilder.withValueSeparator('='); - OptionBuilder.hasArg(); + OptionBuilder.withDescription(GT._("quoted argument is Jmol script to execute")); options.addOption(OptionBuilder.create("j")); OptionBuilder.withLongOpt("menu"); @@ -497,7 +495,7 @@ } args = line.getArgs(); - if (args.length > 0) { + if (args.length > 0 && !line.hasOption("j")) { modelFilename = args[0]; } @@ -555,7 +553,7 @@ if (line.hasOption("j")) { commandOptions += "-s"; - script = line.getOptionValue("j"); + script = (args.length > 0 ? args[0] : GT._("{0} quoted argument missing", "echo -j")); } //menu file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-09 04:37:36
|
Revision: 10468 http://jmol.svn.sourceforge.net/jmol/?rev=10468&view=rev Author: hansonr Date: 2008-12-09 04:37:32 +0000 (Tue, 09 Dec 2008) Log Message: ----------- version=11.7.18_dev export/image refactoring, new feature # new feature: (embedded application method of JmolViewer): # # Object viewer.getImageAs(String type, # int quality, # String filename, # OutputStream outputStream); # # allows creation of an image of a given type ("JPG", "JPEG", "JPG64", "PNG", "GIF", "PPM") # of a specific quality (-1 indicates default) # 0 to 100 for JPG (-1 = default of 75) # 0-9 for PNG (-1 = default of 2) # and returned as byte[] (when fileName = null, os = null) # or sent to an output stream (os != null) # or set to a file (os == null, fileName != null) # # return can be String if there is an error. # # command sequence, for example: # # jmol.viewer.scriptWait("load =1crn;cartoons on;set antialiasdisplay"); # jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); # byte[] bytes = jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); # # note: You do have to use # # set antialiasDisplay # # to get precision drawing mode; this is not automatic, as for the write command # # primarily, this is for writing to an OutputStream directly, but # the rest seemed simple to implement along with that. # # ----------------------------------------------------------------------------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/applet/Jvm12.java trunk/Jmol/src/org/jmol/export/image/GifEncoder.java trunk/Jmol/src/org/jmol/export/image/ImageCreator.java trunk/Jmol/src/org/jmol/export/image/ImageEncoder.java trunk/Jmol/src/org/jmol/export/image/PngEncoder.java trunk/Jmol/src/org/jmol/export/image/PpmEncoder.java trunk/Jmol/src/org/jmol/util/Base64.java trunk/Jmol/src/org/jmol/util/JpegEncoder.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/PropertyManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -1,5 +1,8 @@ package org.jmol.api; +import java.io.IOException; +import java.io.OutputStream; + public interface JmolImageCreatorInterface { abstract public void setViewer(JmolViewer viewer); @@ -16,6 +19,8 @@ * @param quality * @return null (canceled) or a message starting with OK or an error message */ - abstract public String createImage(String fileName, String type, Object text_or_bytes, int quality); + abstract public Object createImage(String fileName, String type, Object text_or_bytes, int quality); + + abstract public Object getImageBytes(String type, int quality, String fileName, OutputStream os) throws IOException; } Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -30,6 +30,7 @@ import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; +import java.io.OutputStream; import java.io.Reader; import java.net.URL; import java.util.BitSet; @@ -168,6 +169,15 @@ abstract public String createImage(String fileName, String type, Object text_or_bytes, int quality, int width, int height); + /** + * @param type "PNG", "JPG", "JPEG", "JPG64", "PPM", "GIF" + * @param quality + * @param fileName + * @param os + * @return base64-encoded or binary version of the image + */ + abstract public Object getImageAs(String type, int quality, String fileName, OutputStream os); + abstract public boolean handleOldJvm10Event(Event e); abstract public int getMotionEventNumber(); Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -1095,9 +1095,8 @@ boolean isImage = (quality != Integer.MIN_VALUE); if (isSigned) { if (jvm12 != null) { - if (isImage && (fileName == null || fileName.equalsIgnoreCase("CLIPBOARD"))) { - jvm12.clipImage(); - return "OK"; + if (fileName == null || fileName.equalsIgnoreCase("CLIPBOARD")) { + return jvm12.clipImage(isImage ? null : (String) text_or_bytes); } try { return jvm12.createImage(fileName, type, text_or_bytes, quality); Modified: trunk/Jmol/src/org/jmol/applet/Jvm12.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jvm12.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/applet/Jvm12.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -176,31 +176,30 @@ */ String createImage(String fileName, String type, Object text_or_bytes, int quality) { - if (fileName != null) { - if (quality == Integer.MIN_VALUE) { - // text or bytes - fileName = dialogAsk("save", fileName); - } else { - imageType = type.toUpperCase(); - imageQuality = quality; - fileName = dialogAsk("saveImage+" + type, fileName); - quality = imageQuality; - type = imageType; - } - if (fileName == null) - return null; + if (quality == Integer.MIN_VALUE) { + // text or bytes + fileName = dialogAsk("save", fileName); + } else { + imageType = type.toUpperCase(); + imageQuality = quality; + fileName = dialogAsk("saveImage+" + type, fileName); + quality = imageQuality; + type = imageType; } + if (fileName == null) + return null; JmolImageCreatorInterface c = (JmolImageCreatorInterface) Interface .getOptionInterface("export.image.ImageCreator"); c.setViewer(viewer); - return c.createImage(fileName, type, text_or_bytes, quality); + return (String) c.createImage(fileName, type, text_or_bytes, quality); } - void clipImage() { + String clipImage(String text) { JmolImageCreatorInterface c = (JmolImageCreatorInterface) Interface .getOptionInterface("export.image.ImageCreator"); c.setViewer(viewer); - c.clipImage(null); + c.clipImage(text); + return (text == null ? "OK" : "OK " + text.length()); } String getClipboardText() { Modified: trunk/Jmol/src/org/jmol/export/image/GifEncoder.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/GifEncoder.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/export/image/GifEncoder.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -65,6 +65,22 @@ private boolean interlace = false; + public static void write(Image image, OutputStream os) throws IOException { + (new GifEncoder(image, os)).encode(); + } + + public static byte[] getBytes(Image image) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + try { + write(image, os); + os.flush(); + os.close(); + } catch (IOException e) { + // ignore + } + return os.toByteArray(); + } + /// Constructor from Image. // @param img The image to encode. // @param out The stream to write the GIF to. @@ -741,5 +757,6 @@ a_count = 0; } } + } Modified: trunk/Jmol/src/org/jmol/export/image/ImageCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -26,10 +26,10 @@ import java.awt.Image; import java.io.BufferedWriter; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.io.OutputStreamWriter; import org.jmol.api.JmolImageCreatorInterface; @@ -80,16 +80,12 @@ * @param quality * @return null (canceled) or a message starting with OK or an error message */ - public String createImage(String fileName, String type, Object text_or_bytes, + public Object createImage(String fileName, String type, Object text_or_bytes, int quality) { // returns message starting with OK or an error message boolean isBytes = (text_or_bytes instanceof byte[]); String text = (isBytes ? null : (String) text_or_bytes); boolean isText = (quality == Integer.MIN_VALUE); - if (fileName == null) { - clipImage(text); - return "OK " + text.length(); - } if ((isText || isBytes) && text_or_bytes == null) return "NO DATA"; FileOutputStream os = null; @@ -109,43 +105,17 @@ bw.write(text); bw.close(); os = null; - } else { - Image eImage = viewer.getScreenImage(); - if (eImage != null) { - len = 1; - os = new FileOutputStream(fileName); - if (type.equalsIgnoreCase("JPEG") || type.equalsIgnoreCase("JPG")) { - if (quality <= 0) - quality = 75; - (new JpegEncoder(eImage, quality, os)).Compress(); - } else if (type.equalsIgnoreCase("JPG64")) { - ByteArrayOutputStream osb = new ByteArrayOutputStream(); - (new JpegEncoder(eImage, quality, osb)).Compress(); - osb.flush(); - osb.close(); - StringBuffer jpg = Base64.getBase64(osb.toByteArray()); - os.write(Base64.toBytes(jpg)); - } else if (type.equalsIgnoreCase("PNG")) { - if (quality < 0) - quality = 2; - else if (quality > 9) - quality = 9; - byte[] pngbytes = (new PngEncoder(eImage, false, - PngEncoder.FILTER_NONE, quality)).pngEncode(); - os.write(pngbytes); - } else if (type.equalsIgnoreCase("PPM")) { - (new PpmEncoder(eImage, os)).encode(); - } else if (type.equalsIgnoreCase("GIF")) { - (new GifEncoder(eImage, os)).encode(); - } - os.flush(); - os.close(); - len = (new File(fileName)).length(); - } - viewer.releaseScreenImage(); + } else { + len = 1; + Object bytesOrError = getImageBytes(type, quality, fileName, null); + if (bytesOrError instanceof String) + return bytesOrError; + byte[] bytes = (byte[]) bytesOrError; + if (bytes != null) + return bytes; + len = (new File(fileName)).length(); } } catch (IOException exc) { - viewer.releaseScreenImage(); if (exc != null) { Logger.error("IO Exception", exc); return exc.toString(); @@ -163,4 +133,67 @@ + " " + len + " " + fileName + (quality == Integer.MIN_VALUE ? "" : "; quality=" + quality)); } + + public Object getImageBytes(String type, int quality, String fileName, + OutputStream os) throws IOException { + byte[] bytes = null; + String errMsg = null; + boolean isOsTemp = (os == null && fileName != null); + boolean asBytes = (os == null && fileName == null); + Image image = viewer.getScreenImage(); + try { + if (image == null) { + errMsg = viewer.getErrorMessage(); + }else { + if (isOsTemp) + os = new FileOutputStream(fileName); + if (type.equalsIgnoreCase("JPEG") || type.equalsIgnoreCase("JPG")) { + if (quality <= 0) + quality = 75; + if (asBytes) + bytes = JpegEncoder.getBytes(image, quality); + else + JpegEncoder.write(image, quality, os); + } else if (type.equalsIgnoreCase("JPG64")) { + if (quality <= 0) + quality = 75; + bytes = JpegEncoder.getBytes(image, quality); + if (asBytes) + bytes = Base64.getBytes64(bytes); + else + Base64.write(bytes, os); + } else if (type.equalsIgnoreCase("PNG")) { + if (quality < 0) + quality = 2; + else if (quality > 9) + quality = 9; + if (asBytes) + bytes = PngEncoder.getBytes(image, quality); + else + PngEncoder.write(image, quality, os); + } else if (type.equalsIgnoreCase("PPM")) { + if (asBytes) + bytes = PpmEncoder.getBytes(image); + else + PpmEncoder.write(image, os); + } else if (type.equalsIgnoreCase("GIF")) { + if (asBytes) + bytes = GifEncoder.getBytes(image); + else + GifEncoder.write(image, os); + } + if (os != null) + os.flush(); + if (isOsTemp) + os.close(); + } + } catch (IOException e) { + viewer.releaseScreenImage(); + throw new IOException(e); + } + viewer.releaseScreenImage(); + if (errMsg != null) + return errMsg; + return bytes; + } } Modified: trunk/Jmol/src/org/jmol/export/image/ImageEncoder.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/ImageEncoder.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/export/image/ImageEncoder.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -64,6 +64,7 @@ private IOException iox; private static final ColorModel rgbModel = ColorModel.getRGBdefault(); + /// Constructor. // @param img The image to encode. // @param out The stream to write the bytes to. Modified: trunk/Jmol/src/org/jmol/export/image/PngEncoder.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/PngEncoder.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/export/image/PngEncoder.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -31,6 +31,7 @@ import java.util.zip.DeflaterOutputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.OutputStream; /** * PngEncoder takes a Java Image object and creates a byte string which can be saved as a PNG file. @@ -78,6 +79,15 @@ protected int bytesPerPixel; protected int compressionLevel; + public static void write(Image image, int quality, OutputStream os) throws IOException { + os.write(getBytes(image, quality)); + } + + public static byte[] getBytes(Image image, int quality) { + return (new PngEncoder(image, false, PngEncoder.FILTER_NONE, + quality)).pngEncode(); + } + /** * Class constructor * @@ -599,5 +609,6 @@ crcValue = crc.getValue(); bytePos = writeInt4((int) crcValue, bytePos); } + } Modified: trunk/Jmol/src/org/jmol/export/image/PpmEncoder.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/PpmEncoder.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/export/image/PpmEncoder.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -43,6 +43,23 @@ public class PpmEncoder extends ImageEncoder { + + public static byte[] getBytes(Image image) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + try { + write(image, os); + os.flush(); + os.close(); + } catch (IOException e) { + // ignore + } + return os.toByteArray(); + } + + public static void write(Image image, OutputStream os) throws IOException { + (new PpmEncoder(image, os)).encode(); + } + /// Constructor. // @param img The image to encode. // @param out The stream to write the PPM to. @@ -87,5 +104,4 @@ void encodeDone() throws IOException { // Nothing. } - } Modified: trunk/Jmol/src/org/jmol/util/Base64.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Base64.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/util/Base64.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -14,6 +14,9 @@ package org.jmol.util; +import java.io.IOException; +import java.io.OutputStream; + public class Base64 { // 0 1 2 3 4 5 6 @@ -37,6 +40,20 @@ 41,42,43,44, 45,46,47,48, 49,50,51,0, 0,0,0,0, //0x70-0x7F }; + public static void write(byte[] bytes, OutputStream os) throws IOException { + StringBuffer sb = getBase64(bytes); + int len = sb.length(); + byte[] b = new byte[1]; + for (int i = 0; i < len; i++) { + b[0] = (byte) sb.charAt(i); + os.write(b); + } + } + + public static byte[] getBytes64(byte[] bytes) { + return toBytes(getBase64(bytes)); + } + public static StringBuffer getBase64(StringBuffer str) { return getBase64(toBytes(str)); } @@ -99,10 +116,11 @@ return bytes; } - public static byte[] toBytes(StringBuffer sb) { + private static byte[] toBytes(StringBuffer sb) { byte[] b = new byte[sb.length()]; for (int i = sb.length(); --i >= 0;) b[i] = (byte) sb.charAt(i); return b; - } + } + } \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/util/JpegEncoder.java =================================================================== --- trunk/Jmol/src/org/jmol/util/JpegEncoder.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/util/JpegEncoder.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -83,6 +83,22 @@ Huf=new Huffman(JpegObj.imageWidth,JpegObj.imageHeight); } + public static byte[] getBytes(Image image, int quality) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + write(image, quality, os); + try { + os.flush(); + os.close(); + } catch (IOException e) { + // ignore + } + return os.toByteArray(); + } + + public static void write(Image image, int quality, OutputStream os) { + (new JpegEncoder(image, quality, os)).Compress(); + } + public void setQuality(int quality) { dct = new DCT(quality); } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 04:37:32 UTC (rev 10468) @@ -3,6 +3,38 @@ version=11.7.18_dev +# new feature: (embedded application method of JmolViewer): +# +# Object viewer.getImageAs(String type, +# int quality, +# String filename, +# OutputStream outputStream); +# +# allows creation of an image of a given type ("JPG", "JPEG", "JPG64", "PNG", "GIF", "PPM") +# of a specific quality (-1 indicates default) +# 0 to 100 for JPG (-1 = default of 75) +# 0-9 for PNG (-1 = default of 2) +# and returned as byte[] (when fileName = null, os = null) +# or sent to an output stream (os != null) +# or set to a file (os == null, fileName != null) +# +# return can be String if there is an error. +# +# command sequence, for example: +# +# jmol.viewer.scriptWait("load =1crn;cartoons on;set antialiasdisplay"); +# jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); +# byte[] bytes = jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); +# +# note: You do have to use +# +# set antialiasDisplay +# +# to get precision drawing mode; this is not automatic, as for the write command +# +# primarily, this is for writing to an OutputStream directly, but +# the rest seemed simple to implement along with that. +# # ----------------------------------------------------------------------------- #version=11.7.17 Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -369,7 +369,7 @@ case PROP_EVALUATE: return Eval.evaluateExpression(viewer, myParam.toString()); case PROP_IMAGE: - return viewer.getJpeg(75, returnType != null); + return viewer.getImageAs(returnType == null ? "JPEG" : "JPG64", -1, null, null); } String info = "getProperty ERROR\n" + infoType + "?\nOptions include:\n"; for (int i = 0; i < PROP_COUNT; i++) { Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -37,17 +37,18 @@ import org.jmol.atomdata.AtomData; import org.jmol.atomdata.AtomDataServer; import org.jmol.g3d.*; +import org.jmol.util.Base64; import org.jmol.util.BitSetUtil; import org.jmol.util.CommandHistory; import org.jmol.util.Escape; +import org.jmol.util.JpegEncoder; import org.jmol.util.Logger; -import org.jmol.util.Base64; -import org.jmol.util.JpegEncoder; import org.jmol.util.Measure; +import org.jmol.util.Parser; import org.jmol.util.TempArray; import org.jmol.util.TextFormat; -import org.jmol.util.Parser; + import java.awt.Cursor; import java.awt.Graphics; import java.awt.Image; @@ -69,7 +70,8 @@ import javax.vecmath.AxisAngle4f; import java.net.URL; import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.io.Reader; //import java.io.Reader; import java.io.UnsupportedEncodingException; @@ -3414,23 +3416,45 @@ } /** + * @param type "PNG", "JPG", "JPEG", "JPG64", "PPM", "GIF" * @param quality - * @param asString + * @param fileName + * @param os * @return base64-encoded or binary version of the image */ - public Object getJpeg(int quality, boolean asString) { - byte[] jpeg = null; - Image eImage = getScreenImage(); - if (eImage != null) { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - JpegEncoder jc = new JpegEncoder(eImage, quality, os); - jc.Compress(); - jpeg = os.toByteArray(); + public Object getImageAs(String type, int quality, String fileName, + OutputStream os) { + JmolImageCreatorInterface c = null; + Object bytes = null; + try { + c = (JmolImageCreatorInterface) Interface + .getOptionInterface("export.image.ImageCreator"); + } catch (Error er) { + // unsigned applet will not have this interface + // and thus will not use os or filename + if (Parser.isOneOf(type.toLowerCase(), "jpg;jpeg;jpg64")) { + Image eImage = getScreenImage(); + if (eImage != null) { + try { + bytes = JpegEncoder.getBytes(eImage, quality); + } catch (Throwable e) { + // + } + } + releaseScreenImage(); + if (type.toLowerCase().equals("jpg64")) + return (bytes == null ? "" : Base64.getBase64((byte[]) bytes) + .toString()); + return bytes; + } } - releaseScreenImage(); - if (asString) - return Base64.getBase64(jpeg).toString(); - return jpeg; + c.setViewer(this); + try { + bytes = c.getImageBytes(type, quality, fileName, os); + } catch (IOException e) { + //not possible here? + } + return bytes; } public void releaseScreenImage() { @@ -4288,7 +4312,7 @@ * that can be parsed more easily, involving the atoms and measurement * with units, for example: * - * [Si #3, O #8, Si #7, 60.1 ] + * [Si #3, O #8, Si #7, 60.1 <degrees mark>] * * Viewer.setStatusMeasuring * Measures.clear Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-08 20:33:57 UTC (rev 10467) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 04:37:32 UTC (rev 10468) @@ -60,6 +60,8 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.cli.HelpFormatter; +import java.io.FileOutputStream; + public class Jmol extends JPanel { /** @@ -651,6 +653,9 @@ jmol.viewer.openFileAsynchronously(modelFilename); } + //jmol.viewer.scriptWait("load 1crn.pdb;cartoons on;set antialiasdisplay"); + //jmol.viewer.getImageAs("JPG64", -1, "t75.jpg", null); + // OK, by now it is time to execute the script // file first if (scriptFilename != null) { @@ -1473,7 +1478,7 @@ sType = sType.substring(i + 1).toUpperCase(); } String msg = (sType.equals("PDF") ?createPdfDocument(new File(fileName)) - : createImageStatus(fileName, sType, null, sd.getQuality(sType))); + : createImageStatus(fileName, sType, (String) null, sd.getQuality(sType))); Logger.info(msg); } @@ -1581,12 +1586,12 @@ String createImageStatus(String fileName, String type, Object text_or_bytes, int quality) { ImageCreator c = new ImageCreator(viewer); - if (quality != Integer.MIN_VALUE - && (fileName == null || fileName.equalsIgnoreCase("CLIPBOARD"))) { - c.clipImage(null); - return "OK"; + if (fileName == null || fileName.equalsIgnoreCase("CLIPBOARD")) { + String text = (String) text_or_bytes; + c.clipImage(text); + return (text == null ? "OK" : "OK " + text.length()); } - String msg = c.createImage(fileName, type, text_or_bytes, quality); + String msg = (String) c.createImage(fileName, type, text_or_bytes, quality); if (msg == null || msg.startsWith("OK")) return msg; if (status != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-09 12:33:28
|
Revision: 10469 http://jmol.svn.sourceforge.net/jmol/?rev=10469&view=rev Author: hansonr Date: 2008-12-09 12:33:22 +0000 (Tue, 09 Dec 2008) Log Message: ----------- version=11.7.18_dev -d -J -j, viewer.getImageAs # new feature: #exitJmol does that. # new feature: application -d --debug sets loglevel to 5 # new feature: application -J --jmolscript1 Jmol script BEFORE -s # new feature: application -j --jmolscript2 Jmol script AFTER -s not accepting values # # new feature: (embedded application method of JmolViewer): # # public Object viewer.getImageAs(String type, # int quality, # String filename, # OutputStream outputStream); # # allows creation of an image of a given type ("JPG", "JPEG", "JPG64", "PNG", "GIF", "PPM") # of a specific quality (-1 indicates default) # 0 to 100 for JPG (-1 = default of 75) # 0-9 for PNG (-1 = default of 2) # and returned as byte[] (when fileName = null, os = null) # or sent to an output stream (os != null) # or set to a file (os == null, fileName != null) # # return can be String if there is an error. # # command sequence, for example: # # jmol.viewer.scriptWait("load =1crn;cartoons on;set antialiasdisplay"); # jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); # byte[] bytes = jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); # # note: You do have to use # # set antialiasDisplay # # to get precision drawing mode; this is not automatic, as for the write command # # primarily, this is for writing to an OutputStream directly, but # the rest seemed simple to implement along with that. # # ----------------------------------------------------------------------------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-12-09 04:37:32 UTC (rev 10468) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-12-09 12:33:22 UTC (rev 10469) @@ -895,6 +895,12 @@ continue; switch (token.tok) { case Token.nada: + if (!isSyntaxCheck && !viewer.isApplet() + && parameterAsString(0).equalsIgnoreCase("exitjmol")) { + Logger.debug("#exitJmol -- exiting"); + System.out.flush(); + System.exit(0); + } break; case Token.elseif: case Token.ifcmd: Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 04:37:32 UTC (rev 10468) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 12:33:22 UTC (rev 10469) @@ -3,12 +3,17 @@ version=11.7.18_dev +# new feature: #exitJmol does that. +# new feature: application -d --debug sets loglevel to 5 +# new feature: application -J --jmolscript1 Jmol script BEFORE -s +# new feature: application -j --jmolscript2 Jmol script AFTER -s not accepting values +# # new feature: (embedded application method of JmolViewer): # -# Object viewer.getImageAs(String type, -# int quality, -# String filename, -# OutputStream outputStream); +# public Object viewer.getImageAs(String type, +# int quality, +# String filename, +# OutputStream outputStream); # # allows creation of an image of a given type ("JPG", "JPEG", "JPG64", "PNG", "GIF", "PPM") # of a specific quality (-1 indicates default) Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-09 04:37:32 UTC (rev 10468) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-09 12:33:22 UTC (rev 10469) @@ -308,7 +308,7 @@ } private String writeInfo; - private boolean autoExit = false; + boolean autoExit = false; private boolean haveDisplay = true; private boolean mustRender = true; private boolean checkScriptOnly = false; @@ -3424,6 +3424,8 @@ */ public Object getImageAs(String type, int quality, String fileName, OutputStream os) { + mustRender = true; + setModelVisibility(); JmolImageCreatorInterface c = null; Object bytes = null; try { @@ -3554,6 +3556,10 @@ pauseScriptExecution(); return true; } + if (!isApplet() && str.startsWith("exitJmol")) { + System.out.flush(); + System.exit(0); + } if (str.startsWith("exit")) { haltScriptExecution(); clearScriptQueue(); @@ -3662,10 +3668,7 @@ else Logger.error("--script check error\n" + strErrorMessageUntranslated); } - if (autoExit) { // had "isScriptFile" - System.out.flush(); - System.exit(0); - } else if (checkScriptOnly) + if (checkScriptOnly) Logger.info("(use 'exit' to stop checking)"); isScriptQueued = true; if (returnType.equalsIgnoreCase("String")) Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 04:37:32 UTC (rev 10468) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 12:33:22 UTC (rev 10469) @@ -143,9 +143,9 @@ "Jmol's persistent values"); } - static Boolean isSilent = Boolean.FALSE; - static Boolean haveConsole = Boolean.TRUE; - static Boolean haveDisplay = Boolean.TRUE; + static boolean isSilent = false; + static boolean haveConsole = true; + static boolean haveDisplay = true; JmolAdapter modelAdapter; String appletContext; @@ -181,7 +181,7 @@ status = (StatusBar) createStatusBar(); say(GT._("Initializing 3D display...")); // - display = new DisplayPanel(status, guimap, haveDisplay.booleanValue(), + display = new DisplayPanel(status, guimap, haveDisplay, startupWidth, startupHeight); String adapter = System.getProperty("model"); if (adapter == null || adapter.length() == 0) @@ -207,7 +207,7 @@ preferencesDialog = new PreferencesDialog(frame, guimap, viewer); say(GT._("Initializing Recent Files...")); recentFiles = new RecentFilesDialog(frame); - if (haveDisplay.booleanValue()) { + if (haveDisplay) { say(GT._("Initializing Script Window...")); scriptWindow = new ScriptWindow(viewer, frame); } @@ -232,7 +232,7 @@ // pluginManager.loadPlugins(System.getProperty("plugin.dir")); // } - if (haveDisplay.booleanValue()) { + if (haveDisplay) { // install the command table say(GT._("Building Command Hooks...")); @@ -336,7 +336,7 @@ } static void report(String str) { - if (isSilent.booleanValue()) + if (isSilent) return; Logger.info(str); } @@ -345,7 +345,7 @@ String commandOptions) { Splash splash = null; - if (haveDisplay.booleanValue()) { + if (haveDisplay) { ImageIcon splash_image = JmolResourceHandler.getIconX("splash"); report("splash_image=" + splash_image); splash = new Splash(frame, splash_image); @@ -367,7 +367,7 @@ Jmol window = new Jmol(splash, frame, null, startupWidth, startupHeight, commandOptions); - if (haveDisplay.booleanValue()) + if (haveDisplay) frame.show(); return window; } @@ -390,7 +390,8 @@ String modelFilename = null; String scriptFilename = null; - String script = null; + String script2 = ""; + String script1 = ""; Options options = new Options(); options.addOption("b", "backgroundtransparent", false, GT @@ -400,6 +401,7 @@ ._("no display (and also exit when done)")); options.addOption("c", "check", false, GT._("check script syntax only - no file loading")); options.addOption("C", "checkload", false, GT._("check script syntax only - with file loading")); + options.addOption("d", "debug", false, GT._("debug")); options.addOption("i", "silent", false, GT._("silent startup operation")); options.addOption("l", "list", false, GT ._("list commands during script execution")); @@ -416,10 +418,18 @@ OptionBuilder.hasArg(); options.addOption(OptionBuilder.create("s")); - OptionBuilder.withLongOpt("jmolscript"); - OptionBuilder.withDescription(GT._("quoted argument is Jmol script to execute")); + OptionBuilder.withLongOpt("jmolscript2"); + OptionBuilder.withDescription(GT._("Jmol script to execute AFTER -s option")); + OptionBuilder.withValueSeparator('='); + OptionBuilder.hasArg(); options.addOption(OptionBuilder.create("j")); + OptionBuilder.withLongOpt("jmolscript1"); + OptionBuilder.withDescription(GT._("Jmol script to execute BEFORE -s option")); + OptionBuilder.withValueSeparator('='); + OptionBuilder.hasArg(); + options.addOption(OptionBuilder.create("J")); + OptionBuilder.withLongOpt("menu"); OptionBuilder.withDescription("menu file to use"); OptionBuilder.withValueSeparator('='); @@ -497,7 +507,7 @@ } args = line.getArgs(); - if (args.length > 0 && !line.hasOption("j")) { + if (args.length > 0) { modelFilename = args[0]; } @@ -506,10 +516,15 @@ String commandOptions = ""; + //debug mode + if (line.hasOption("d")) { + Logger.setLogLevel(Logger.LEVEL_DEBUG); + } + //silent startup if (line.hasOption("i")) { commandOptions += "-i"; - isSilent = Boolean.TRUE; + isSilent = true; } // transparent background @@ -530,14 +545,15 @@ //output to sysout if (line.hasOption("o")) { commandOptions += "-o"; - haveConsole = Boolean.FALSE; + haveConsole = false; } //no display (and exit) if (line.hasOption("n")) { // this ensures that noDisplay also exits commandOptions += "-n-x"; - haveDisplay = Boolean.FALSE; + haveDisplay = false; + script2 = "#exitJmol"; } //check script only -- don't open files @@ -551,22 +567,28 @@ if (line.hasOption("s")) { commandOptions += "-s"; scriptFilename = line.getOptionValue("s"); + if (!haveDisplay) + script2 = "#exitJmol"; } if (line.hasOption("j")) { - commandOptions += "-s"; - script = (args.length > 0 ? args[0] : GT._("{0} quoted argument missing", "echo -j")); + commandOptions += "-j"; + script1 = line.getOptionValue("j"); + if (!haveDisplay) + script2 += ";#exitJmol"; } + //exit when script completes (or file is read) + if (line.hasOption("x")) { + commandOptions += "-x"; + script2 += ";#exitJmol"; + } + //menu file if (line.hasOption("m")) { menuFile = line.getOptionValue("m"); } - //exit when script completes (or file is read) - if (line.hasOption("x")) { - commandOptions += "-x"; - } String imageType_name = null; //write image to clipboard or image file if (line.hasOption("w")) { @@ -582,14 +604,14 @@ } size = historyFile.getWindowSize(JMOL_WINDOW_NAME); - if (size != null && haveDisplay.booleanValue()) { + if (size != null && haveDisplay) { startupWidth = size.width; startupHeight = size.height; } //OUTER window dimensions /* - if (line.hasOption("g") && haveDisplay.booleanValue()) { + if (line.hasOption("g") && haveDisplay) { String geometry = line.getOptionValue("g"); int indexX = geometry.indexOf('x'); if (indexX > 0) { @@ -622,7 +644,7 @@ height = Parser.parseInt(geometry.substring(indexX + 1)); //System.out.println("setting geometry to " + geometry + " " + border + " " + startupWidth + startupHeight); } - if (haveDisplay.booleanValue()) { + if (haveDisplay) { startupWidth = width + border.x; startupHeight = height + border.y; } @@ -645,6 +667,7 @@ jmolFrame.setLocation(jmolPosition); } + Logger.debug("command options: " + commandOptions); //now pass these to viewer jmol = getJmol(jmolFrame, startupWidth, startupHeight, commandOptions); @@ -654,29 +677,39 @@ } //jmol.viewer.scriptWait("load 1crn.pdb;cartoons on;set antialiasdisplay"); - //jmol.viewer.getImageAs("JPG64", -1, "t75.jpg", null); + //jmol.viewer.getImageAs("JPG", -1, "t75n.jpg", null); // OK, by now it is time to execute the script - // file first + + // then command script + if (script2 != null) { + report("Executing script: " + script1); + if (haveDisplay) + jmol.splash.showStatus(GT._("Executing script 1...")); + jmol.viewer.script(script1); + } + + // next the file + if (scriptFilename != null) { report("Executing script from file: " + scriptFilename); - if (haveDisplay.booleanValue()) - jmol.splash.showStatus(GT._("Executing script...")); + if (haveDisplay) + jmol.splash.showStatus(GT._("Executing script file...")); jmol.viewer.evalFile(scriptFilename); } // then command script - if (script != null) { - report("Executing script: " + script); - if (haveDisplay.booleanValue()) - jmol.splash.showStatus(GT._("Executing script...")); - jmol.viewer.script(script); + if (script2 != null) { + report("Executing script: " + script2); + if (haveDisplay) + jmol.splash.showStatus(GT._("Executing script 2...")); + jmol.viewer.script(script2); } } catch (Throwable t) { System.out.println("uncaught exception: " + t); t.printStackTrace(); } - if (haveConsole.booleanValue()) { + if (haveConsole) { Point location = jmol.frame.getLocation(); size = jmol.frame.getSize(); // Adding console frame to grab System.out & System.err @@ -725,7 +758,7 @@ } private void say(String message) { - if (haveDisplay.booleanValue()) + if (haveDisplay) if (splash == null) { report(message); } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-09 13:24:11
|
Revision: 10470 http://jmol.svn.sourceforge.net/jmol/?rev=10470&view=rev Author: hansonr Date: 2008-12-09 13:24:05 +0000 (Tue, 09 Dec 2008) Log Message: ----------- version=11.7.18_dev clipImage method # new feature: (embedded application method of JmolViewer): # # public String clipImage(String text); # # sends image (null parameter) or text to clipboard # Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/applet/Jvm12.java trunk/Jmol/src/org/jmol/export/image/ImageCreator.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StatusManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/jmol/api/JmolImageCreatorInterface.java 2008-12-09 13:24:05 UTC (rev 10470) @@ -7,7 +7,7 @@ abstract public void setViewer(JmolViewer viewer); - abstract public void clipImage(String text); + abstract public String clipImage(String text); abstract public String getClipboardText(); Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-12-09 13:24:05 UTC (rev 10470) @@ -158,6 +158,13 @@ /** * + * @param text null here clips image; String clips text + * @return "OK" for image or "OK [number of bytes]" + */ + abstract public String clipImage(String text); + + /** + * * @param fileName * @param type * @param text_or_bytes Modified: trunk/Jmol/src/org/jmol/applet/Jvm12.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jvm12.java 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/jmol/applet/Jvm12.java 2008-12-09 13:24:05 UTC (rev 10470) @@ -194,14 +194,6 @@ return (String) c.createImage(fileName, type, text_or_bytes, quality); } - String clipImage(String text) { - JmolImageCreatorInterface c = (JmolImageCreatorInterface) Interface - .getOptionInterface("export.image.ImageCreator"); - c.setViewer(viewer); - c.clipImage(text); - return (text == null ? "OK" : "OK " + text.length()); - } - String getClipboardText() { JmolImageCreatorInterface c = (JmolImageCreatorInterface) Interface .getOptionInterface("export.image.ImageCreator"); Modified: trunk/Jmol/src/org/jmol/export/image/ImageCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2008-12-09 13:24:05 UTC (rev 10470) @@ -55,13 +55,24 @@ this.viewer = viewer; } - public void clipImage(String text) { - if (text == null) { - ImageSelection.setClipboard(viewer.getScreenImage()); - viewer.releaseScreenImage(); - return; + public String clipImage(String text) { + String msg; + try { + if (text == null) { + Image image = viewer.getScreenImage(); + ImageSelection.setClipboard(image); + msg = "OK " + (image.getWidth(null) * image.getHeight(null)); + } else { + ImageSelection.setClipboard(text); + msg = "OK " + text.length(); + } + } catch (Error er) { + msg = viewer.getErrorMessage(); + } finally { + if (text == null) + viewer.releaseScreenImage(); } - ImageSelection.setClipboard(text); + return msg; } public String getClipboardText() { Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-12-09 13:24:05 UTC (rev 10470) @@ -9297,7 +9297,7 @@ // load error here scriptStatusOrBuffer((String) bytes); } else { - if (bytes == null) + if (bytes == null && (!isImage || fileName != null)) bytes = data; String msg = viewer.createImage(fileName, type, bytes, quality, width, height, bsFrames); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 13:24:05 UTC (rev 10470) @@ -3,6 +3,12 @@ version=11.7.18_dev +# new feature: (embedded application method of JmolViewer): +# +# public String clipImage(String text); +# +# sends image (null parameter) or text to clipboard +# # new feature: #exitJmol does that. # new feature: application -d --debug sets loglevel to 5 # new feature: application -J --jmolscript1 Jmol script BEFORE -s @@ -15,30 +21,30 @@ # String filename, # OutputStream outputStream); # -# allows creation of an image of a given type ("JPG", "JPEG", "JPG64", "PNG", "GIF", "PPM") -# of a specific quality (-1 indicates default) -# 0 to 100 for JPG (-1 = default of 75) -# 0-9 for PNG (-1 = default of 2) -# and returned as byte[] (when fileName = null, os = null) -# or sent to an output stream (os != null) -# or set to a file (os == null, fileName != null) +# allows creation of an image of a given type ("JPG", "JPEG", "JPG64", "PNG", "GIF", "PPM") +# of a specific quality (-1 indicates default) +# 0 to 100 for JPG (-1 = default of 75) +# 0-9 for PNG (-1 = default of 2) +# and returned as byte[] (when fileName = null, os = null) +# or sent to an output stream (os != null) +# or set to a file (os == null, fileName != null) # -# return can be String if there is an error. +# return can be String if there is an error. # -# command sequence, for example: +# command sequence, for example: # -# jmol.viewer.scriptWait("load =1crn;cartoons on;set antialiasdisplay"); -# jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); -# byte[] bytes = jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); +# jmol.viewer.scriptWait("load =1crn;cartoons on;set antialiasdisplay"); +# jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); +# byte[] bytes = jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); # -# note: You do have to use +# note: You do have to use # -# set antialiasDisplay +# set antialiasDisplay # -# to get precision drawing mode; this is not automatic, as for the write command +# to get precision drawing mode; this is not automatic, as for the write command # -# primarily, this is for writing to an OutputStream directly, but -# the rest seemed simple to implement along with that. +# primarily, this is for writing to an OutputStream directly, but +# the rest seemed simple to implement along with that. # # ----------------------------------------------------------------------------- Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2008-12-09 13:24:05 UTC (rev 10470) @@ -575,10 +575,10 @@ if (!viewer.isSignedApplet()) { fileName = dialogAsk(quality == Integer.MIN_VALUE ? "save" : "saveImage", fileName); - if (fileName == null) - return null; } } + if (fileName == null) + return null; return jmolStatusListener.createImage(fileName, type, text_or_bytes, quality); } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-09 13:24:05 UTC (rev 10470) @@ -6882,9 +6882,27 @@ public void writeTextFile(String fileName, String data) { createImage(fileName, "txt", data, Integer.MIN_VALUE, 0, 0); } - + /** * + * @param text null here clips image; String clips text + * @return "OK" for image or "OK [number of bytes]" + */ + public String clipImage(String text) { + JmolImageCreatorInterface c; + try { + c = (JmolImageCreatorInterface) Interface + .getOptionInterface("export.image.ImageCreator"); + } catch (Error er) { + // unsigned applet will not have this interface + return GT._("clipboard is not accessible -- use signed applet"); + } + c.setViewer(this); + return c.clipImage(text); + } + + /** + * * from eval write command only * includes option to write set of files * @@ -6984,10 +7002,13 @@ } creatingImage = true; String err = null; - if (fileName != null) - fileName = FileManager.setLocalPathForWritingFile(this, fileName); try { - err = statusManager.createImage(fileName, type, text_or_bytes, quality); + if (fileName == null) { + err = clipImage((String) text_or_bytes); + } else { + fileName = FileManager.setLocalPathForWritingFile(this, fileName); + err = statusManager.createImage(fileName, type, text_or_bytes, quality); + } // err may be null if user cancels operation involving dialog and "?" } catch (Exception e) { Logger.error(setErrorMessage(err = "ERROR creating image: " + e)); Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 12:33:22 UTC (rev 10469) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 13:24:05 UTC (rev 10470) @@ -1369,8 +1369,7 @@ } public void actionPerformed(ActionEvent e) { - ImageCreator c = new ImageCreator(viewer); - c.clipImage(null); + (new ImageCreator(viewer)).clipImage(null); } } @@ -1381,8 +1380,8 @@ } public void actionPerformed(ActionEvent e) { - ImageCreator c = new ImageCreator(viewer); - c.clipImage((String) viewer.getProperty("string", "stateInfo", null)); + (new ImageCreator(viewer)).clipImage((String) viewer.getProperty( + "string", "stateInfo", null)); } } @@ -1618,13 +1617,8 @@ */ String createImageStatus(String fileName, String type, Object text_or_bytes, int quality) { - ImageCreator c = new ImageCreator(viewer); - if (fileName == null || fileName.equalsIgnoreCase("CLIPBOARD")) { - String text = (String) text_or_bytes; - c.clipImage(text); - return (text == null ? "OK" : "OK " + text.length()); - } - String msg = (String) c.createImage(fileName, type, text_or_bytes, quality); + String msg = (String) (new ImageCreator(viewer)).createImage(fileName, + type, text_or_bytes, quality); if (msg == null || msg.startsWith("OK")) return msg; if (status != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-09 15:30:47
|
Revision: 10471 http://jmol.svn.sourceforge.net/jmol/?rev=10471&view=rev Author: hansonr Date: 2008-12-09 15:30:38 +0000 (Tue, 09 Dec 2008) Log Message: ----------- version=11.7.18_dev getImageAs, clipImage # new feature: (embedded application method of JmolViewer): # # public Object viewer.getImageAs(String type, # int quality, # int width, # int height, # String filename, # OutputStream outputStream); # # allows creation of an image of a given type ("JPG", "JPEG", "JPG64", "PNG", "GIF", "PPM") # of a specific quality (-1 indicates default) # 0 to 100 for JPG (-1 = default of 75) # 0-9 for PNG (-1 = default of 2) # and specific width and height # and returned as byte[] (when fileName = null, os = null) # or sent to an output stream (os != null) # or set to a file (os == null, fileName != null) # # return can be String if there is an error. # # command sequence, for example: # # jmol.viewer.scriptWait("load =1crn;cartoons on;set antialiasdisplay"); # Object nullOrErrorMsg = jmol.viewer.getImageAs("JPG", 75, 300, 300, "t75.jpg", null); # Object nullOrErrorMsg = jmol.viewer.getImageAs("JPG", 75, 300, 300, null, os); # Object bytesOrError = jmol.viewer.getImageAs("JPG", 75, 300, 300, null, null); # Object stringOrError = jmol.viewer.getImageAs("JPG64", 75, 300, 300, null, null); # # this method, like WRITE IMAGE uses the antialiasImage settings # # primarily, this is for writing to an OutputStream directly, but # the rest seemed simple to implement along with that. # # new feature: (embedded application method of JmolViewer): # # public String clipImage(String text); # # sends image (null parameter) or text to clipboard # # new feature: #exitJmol does that. # new feature: application -d --debug sets loglevel to 5 # new feature: application -J --jmolscript1 Jmol script BEFORE -s # new feature: application -j --jmolscript2 Jmol script AFTER -s not accepting values # # ----------------------------------------------------------------------------- Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/export/image/ImageCreator.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/PropertyManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-12-09 13:24:05 UTC (rev 10470) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2008-12-09 15:30:38 UTC (rev 10471) @@ -179,11 +179,13 @@ /** * @param type "PNG", "JPG", "JPEG", "JPG64", "PPM", "GIF" * @param quality + * @param width + * @param height * @param fileName * @param os * @return base64-encoded or binary version of the image */ - abstract public Object getImageAs(String type, int quality, String fileName, OutputStream os); + abstract public Object getImageAs(String type, int quality, int width, int height, String fileName, OutputStream os); abstract public boolean handleOldJvm10Event(Event e); Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-12-09 13:24:05 UTC (rev 10470) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-12-09 15:30:38 UTC (rev 10471) @@ -1095,9 +1095,6 @@ boolean isImage = (quality != Integer.MIN_VALUE); if (isSigned) { if (jvm12 != null) { - if (fileName == null || fileName.equalsIgnoreCase("CLIPBOARD")) { - return jvm12.clipImage(isImage ? null : (String) text_or_bytes); - } try { return jvm12.createImage(fileName, type, text_or_bytes, quality); } catch (Exception e) { Modified: trunk/Jmol/src/org/jmol/export/image/ImageCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2008-12-09 13:24:05 UTC (rev 10470) +++ trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2008-12-09 15:30:38 UTC (rev 10471) @@ -201,6 +201,9 @@ } catch (IOException e) { viewer.releaseScreenImage(); throw new IOException(e); + } catch (Error er) { + viewer.releaseScreenImage(); + throw new Error(er); } viewer.releaseScreenImage(); if (errMsg != null) Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 13:24:05 UTC (rev 10470) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 15:30:38 UTC (rev 10471) @@ -5,19 +5,10 @@ # new feature: (embedded application method of JmolViewer): # -# public String clipImage(String text); -# -# sends image (null parameter) or text to clipboard -# -# new feature: #exitJmol does that. -# new feature: application -d --debug sets loglevel to 5 -# new feature: application -J --jmolscript1 Jmol script BEFORE -s -# new feature: application -j --jmolscript2 Jmol script AFTER -s not accepting values -# -# new feature: (embedded application method of JmolViewer): -# # public Object viewer.getImageAs(String type, -# int quality, +# int quality, +# int width, +# int height, # String filename, # OutputStream outputStream); # @@ -25,6 +16,7 @@ # of a specific quality (-1 indicates default) # 0 to 100 for JPG (-1 = default of 75) # 0-9 for PNG (-1 = default of 2) +# and specific width and height # and returned as byte[] (when fileName = null, os = null) # or sent to an output stream (os != null) # or set to a file (os == null, fileName != null) @@ -34,18 +26,27 @@ # command sequence, for example: # # jmol.viewer.scriptWait("load =1crn;cartoons on;set antialiasdisplay"); -# jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); -# byte[] bytes = jmol.viewer.getImageAs("JPG", 75, "t75.jpg", null); +# Object nullOrErrorMsg = jmol.viewer.getImageAs("JPG", 75, 300, 300, "t75.jpg", null); +# Object nullOrErrorMsg = jmol.viewer.getImageAs("JPG", 75, 300, 300, null, os); +# Object bytesOrError = jmol.viewer.getImageAs("JPG", 75, 300, 300, null, null); +# Object stringOrError = jmol.viewer.getImageAs("JPG64", 75, 300, 300, null, null); # -# note: You do have to use -# -# set antialiasDisplay -# -# to get precision drawing mode; this is not automatic, as for the write command +# this method, like WRITE IMAGE uses the antialiasImage settings # # primarily, this is for writing to an OutputStream directly, but # the rest seemed simple to implement along with that. # +# new feature: (embedded application method of JmolViewer): +# +# public String clipImage(String text); +# +# sends image (null parameter) or text to clipboard +# +# new feature: #exitJmol does that. +# new feature: application -d --debug sets loglevel to 5 +# new feature: application -J --jmolscript1 Jmol script BEFORE -s +# new feature: application -j --jmolscript2 Jmol script AFTER -s not accepting values +# # ----------------------------------------------------------------------------- #version=11.7.17 Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2008-12-09 13:24:05 UTC (rev 10470) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2008-12-09 15:30:38 UTC (rev 10471) @@ -369,7 +369,7 @@ case PROP_EVALUATE: return Eval.evaluateExpression(viewer, myParam.toString()); case PROP_IMAGE: - return viewer.getImageAs(returnType == null ? "JPEG" : "JPG64", -1, null, null); + return viewer.getImageAs(returnType == null ? "JPEG" : "JPG64", -1, -1, -1, null, null); } String info = "getProperty ERROR\n" + infoType + "?\nOptions include:\n"; for (int i = 0; i < PROP_COUNT; i++) { Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-09 13:24:05 UTC (rev 10470) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-09 15:30:38 UTC (rev 10471) @@ -3418,14 +3418,20 @@ /** * @param type "PNG", "JPG", "JPEG", "JPG64", "PPM", "GIF" * @param quality + * @param width + * @param height * @param fileName * @param os * @return base64-encoded or binary version of the image */ - public Object getImageAs(String type, int quality, String fileName, - OutputStream os) { + public Object getImageAs(String type, int quality, int width, int height, + String fileName, OutputStream os) { + int saveWidth = dimScreen.width; + int saveHeight = dimScreen.height; mustRender = true; + resizeImage(width, height, true, false, false); setModelVisibility(); + creatingImage = true; JmolImageCreatorInterface c = null; Object bytes = null; try { @@ -3434,28 +3440,40 @@ } catch (Error er) { // unsigned applet will not have this interface // and thus will not use os or filename + } + if (c == null) { if (Parser.isOneOf(type.toLowerCase(), "jpg;jpeg;jpg64")) { Image eImage = getScreenImage(); if (eImage != null) { try { bytes = JpegEncoder.getBytes(eImage, quality); - } catch (Throwable e) { - // + releaseScreenImage(); + if (type.toLowerCase().equals("jpg64")) + bytes = (bytes == null ? "" : Base64.getBase64((byte[]) bytes) + .toString()); + } catch (Error er) { + releaseScreenImage(); + handleError(er, false); + setErrorMessage("Error creating image: " + er); + bytes = getErrorMessage(); } } - releaseScreenImage(); - if (type.toLowerCase().equals("jpg64")) - return (bytes == null ? "" : Base64.getBase64((byte[]) bytes) - .toString()); - return bytes; } + } else { + c.setViewer(this); + try { + bytes = c.getImageBytes(type, quality, fileName, os); + } catch (IOException e) { + bytes = e; + setErrorMessage("Error creating image: " + e); + } catch (Error er) { + handleError(er, false); + setErrorMessage("Error creating image: " + er); + bytes = getErrorMessage(); + } } - c.setViewer(this); - try { - bytes = c.getImageBytes(type, quality, fileName, os); - } catch (IOException e) { - //not possible here? - } + creatingImage = false; + resizeImage(saveWidth, saveHeight, true, false, true); return bytes; } @@ -7010,9 +7028,7 @@ err = statusManager.createImage(fileName, type, text_or_bytes, quality); } // err may be null if user cancels operation involving dialog and "?" - } catch (Exception e) { - Logger.error(setErrorMessage(err = "ERROR creating image: " + e)); - } catch (Error er) { + } catch (Throwable er) { Logger.error(setErrorMessage(err = "ERROR creating image: "+ er)); } creatingImage = false; Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 13:24:05 UTC (rev 10470) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 15:30:38 UTC (rev 10471) @@ -677,7 +677,10 @@ } //jmol.viewer.scriptWait("load 1crn.pdb;cartoons on;set antialiasdisplay"); - //jmol.viewer.getImageAs("JPG", -1, "t75n.jpg", null); + //System.out.println("" + jmol.viewer.getImageAs("JPG", -1, 300, 300, "t75n.jpg", null)); + //System.out.println("" + jmol.viewer.getImageAs("JPG", -1, 3000, 3000, "t75n.jpg", null)); + //System.out.println("" + jmol.viewer.getImageAs("JPG", -1, 300, 300, null, null)); + //System.out.println("" + jmol.viewer.getImageAs("JPG", -1, 3000, 3000, null, null)); // OK, by now it is time to execute the script This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-09 16:08:06
|
Revision: 10472 http://jmol.svn.sourceforge.net/jmol/?rev=10472&view=rev Author: hansonr Date: 2008-12-09 16:08:04 +0000 (Tue, 09 Dec 2008) Log Message: ----------- version=11.7.18_dev # new feature: new command "exitJmol" does just that -- application only; # can be overridden by user defining the function "exitJmol" # # new feature: application -d --debug sets loglevel to 5 # new feature: application -J --jmolscript1 Jmol script BEFORE -s # new feature: application -j --jmolscript2 Jmol script AFTER -s not accepting values # Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-12-09 15:30:38 UTC (rev 10471) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-12-09 16:08:04 UTC (rev 10472) @@ -895,12 +895,6 @@ continue; switch (token.tok) { case Token.nada: - if (!isSyntaxCheck && !viewer.isApplet() - && parameterAsString(0).equalsIgnoreCase("exitjmol")) { - Logger.debug("#exitJmol -- exiting"); - System.out.flush(); - System.exit(0); - } break; case Token.elseif: case Token.ifcmd: @@ -5246,8 +5240,15 @@ if (isSyntaxCheck && !isScriptCheck) return; String name = (String) getToken(0).value; - if (compiler.getFunction(name) == null) + if (compiler.getFunction(name) == null) { + if (!isSyntaxCheck && !viewer.isApplet() + && name.equalsIgnoreCase("exitjmol")) { + Logger.debug("#exitJmol -- exiting"); + System.out.flush(); + System.exit(0); + } error(ERROR_commandExpected); + } Vector params = (statementLength == 1 || statementLength == 3 && tokAt(1) == Token.leftparen && tokAt(2) == Token.rightparen ? null : (Vector) parameterExpression(1, 0, null, true)); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 15:30:38 UTC (rev 10471) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-09 16:08:04 UTC (rev 10472) @@ -3,6 +3,13 @@ version=11.7.18_dev +# new feature: new command "exitJmol" does just that -- application only; +# can be overridden by user defining the function "exitJmol" +# +# new feature: application -d --debug sets loglevel to 5 +# new feature: application -J --jmolscript1 Jmol script BEFORE -s +# new feature: application -j --jmolscript2 Jmol script AFTER -s not accepting values +# # new feature: (embedded application method of JmolViewer): # # public Object viewer.getImageAs(String type, @@ -42,11 +49,6 @@ # # sends image (null parameter) or text to clipboard # -# new feature: #exitJmol does that. -# new feature: application -d --debug sets loglevel to 5 -# new feature: application -J --jmolscript1 Jmol script BEFORE -s -# new feature: application -j --jmolscript2 Jmol script AFTER -s not accepting values -# # ----------------------------------------------------------------------------- #version=11.7.17 Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 15:30:38 UTC (rev 10471) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-09 16:08:04 UTC (rev 10472) @@ -548,42 +548,46 @@ haveConsole = false; } - //no display (and exit) - if (line.hasOption("n")) { - // this ensures that noDisplay also exits - commandOptions += "-n-x"; - haveDisplay = false; - script2 = "#exitJmol"; + //run pre Jmol script + if (line.hasOption("J")) { + commandOptions += "-J"; + script1 = line.getOptionValue("J"); } - //check script only -- don't open files - if (line.hasOption("c")) { - commandOptions += "-c"; - } else if (line.hasOption("C")) { - commandOptions += "-C"; - } - - //run script + //run script from file if (line.hasOption("s")) { commandOptions += "-s"; scriptFilename = line.getOptionValue("s"); - if (!haveDisplay) - script2 = "#exitJmol"; } + //run post Jmol script if (line.hasOption("j")) { commandOptions += "-j"; - script1 = line.getOptionValue("j"); - if (!haveDisplay) - script2 += ";#exitJmol"; + script2 = line.getOptionValue("j"); } + //no display (and exit) + if (line.hasOption("n")) { + // this ensures that noDisplay also exits + commandOptions += "-n-x"; + haveDisplay = false; + script2 += ";exitJmol"; + } + //exit when script completes (or file is read) if (line.hasOption("x")) { commandOptions += "-x"; - script2 += ";#exitJmol"; + if (haveDisplay) + script2 += ";exitJmol"; } + //check script only -- don't open files + if (line.hasOption("c")) { + commandOptions += "-c"; + } else if (line.hasOption("C")) { + commandOptions += "-C"; + } + //menu file if (line.hasOption("m")) { menuFile = line.getOptionValue("m"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-12-15 15:35:09
|
Revision: 10493 http://jmol.svn.sourceforge.net/jmol/?rev=10493&view=rev Author: hansonr Date: 2008-12-15 15:35:04 +0000 (Mon, 15 Dec 2008) Log Message: ----------- version=11.7.19_dev # bug fix: recent application changes do not work with -w option Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-15 06:43:25 UTC (rev 10492) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-12-15 15:35:04 UTC (rev 10493) @@ -3,6 +3,8 @@ version=11.7.19_dev +# bug fix: recent application changes do not work with -w option + # ----------------------------------------------------------------------------- #version=11.7.18 Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-15 06:43:25 UTC (rev 10492) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-12-15 15:35:04 UTC (rev 10493) @@ -308,7 +308,6 @@ return isPreviewOnly; } - private String writeInfo; boolean autoExit = false; private boolean haveDisplay = true; private boolean mustRender = true; @@ -359,13 +358,7 @@ haveDisplay = (display != null && str.indexOf("-n") < 0); if (!haveDisplay) display = null; - writeInfo = null; - if (str.indexOf("-w") >= 0) { - i = str.indexOf("\1"); - int j = str.lastIndexOf("\1"); - writeInfo = str.substring(i + 1, j); - } - mustRender = (haveDisplay || writeInfo != null); + mustRender = haveDisplay; cd("."); } isPreviewOnly = (str.indexOf("#previewOnly") >= 0); @@ -3668,10 +3661,6 @@ if (!isQuiet) scriptStatus("Jmol script terminated", strErrorMessage, 1 + eval.getExecutionWalltime(), strErrorMessageUntranslated); - if (writeInfo != null) { // had "isScriptFile" - writeImage(writeInfo); - writeInfo = null; - } } else { scriptStatus(strErrorMessage); scriptStatus("Jmol script terminated", @@ -6847,53 +6836,6 @@ // image and file export // /////////////////////////////////////////////////////////////// - /** - * only from application with -w flag - * - * @param type_name TYPE:filename\twidth\theight\tquality - */ - private void writeImage(String type_name) { - - int quality, width, height; - if (type_name == null) - return; - if (type_name.length() == 0) - type_name = "JPG:jmol.jpg"; - if (type_name.indexOf(":") < 0) - type_name += ":jmol.jpg"; - int i = type_name.indexOf(":"); - String type = type_name.substring(0, i).toUpperCase(); - String fileName = type_name.substring(i + 1); - String swidth = "-1"; - String sheight = "-1"; - String squality = (type.equals("PNG") ? "2" : "75"); - i = fileName.indexOf('\t'); - if (i > 0) { - swidth = fileName.substring(i + 1); - fileName = fileName.substring(0, i); - } - i = swidth.indexOf('\t'); - if (i > 0) { - sheight = swidth.substring(i + 1); - swidth = swidth.substring(0, i); - } - i = sheight.indexOf('\t'); - if (i > 0) { - squality = sheight.substring(i + 1); - sheight = sheight.substring(0, i); - } - try { - width = Integer.parseInt(swidth); - height = Integer.parseInt(sheight); - quality = Integer.parseInt(squality); - createImage(fileName, type, null, quality, width, height); - } catch (Exception e) { - Logger.error(setErrorMessage("error processing write request: " + type_name + " "+ e)); - } catch (Error er) { - Logger.error(setErrorMessage("error processing write request: " + type_name + " "+ er)); - } - } - public void writeTextFile(String fileName, String data) { createImage(fileName, "txt", data, Integer.MIN_VALUE, 0, 0); } Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-15 06:43:25 UTC (rev 10492) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-12-15 15:35:04 UTC (rev 10493) @@ -442,7 +442,6 @@ // OptionBuilder.withDescription(GT._("overall window width x height, e.g. {0}", "-g512x616")); OptionBuilder.withDescription(GT._("window width x height, e.g. {0}", "-g500x500")); - OptionBuilder.withValueSeparator(); OptionBuilder.hasArg(); options.addOption(OptionBuilder.create("g")); @@ -451,14 +450,12 @@ OptionBuilder .withDescription(GT ._("JPG image quality (1-100; default 75) or PNG image compression (0-9; default 2, maximum compression 9)")); - OptionBuilder.withValueSeparator(); OptionBuilder.hasArg(); options.addOption(OptionBuilder.create("q")); OptionBuilder.withLongOpt("write"); OptionBuilder.withDescription(GT._("{0} or {1}:filename", new Object[] { "CLIP", "GIF|JPG|JPG64|PNG|PPM" })); - OptionBuilder.withValueSeparator(); OptionBuilder.hasArg(); options.addOption(OptionBuilder.create("w")); @@ -523,6 +520,12 @@ isSilent = true; } + //output to sysout + if (line.hasOption("o")) { + commandOptions += "-o"; + haveConsole = false; + } + // transparent background if (line.hasOption("b")) { commandOptions += "-b"; @@ -538,12 +541,18 @@ commandOptions += "-l"; } - //output to sysout - if (line.hasOption("o")) { - commandOptions += "-o"; - haveConsole = false; + //check script only -- don't open files + if (line.hasOption("c")) { + commandOptions += "-c"; + } else if (line.hasOption("C")) { + commandOptions += "-C"; } + //menu file + if (line.hasOption("m")) { + menuFile = line.getOptionValue("m"); + } + //run pre Jmol script if (line.hasOption("J")) { commandOptions += "-J"; @@ -562,6 +571,85 @@ script2 = line.getOptionValue("j"); } + Dimension size; + String vers = System.getProperty("java.version"); + if (vers.compareTo("1.1.2") < 0) { + System.out.println("!!!WARNING: Swing components require a " + + "1.1.2 or higher version VM!!!"); + } + + size = historyFile.getWindowSize(JMOL_WINDOW_NAME); + if (size != null && haveDisplay) { + startupWidth = size.width; + startupHeight = size.height; + } + + //OUTER window dimensions + /* + if (line.hasOption("g") && haveDisplay) { + String geometry = line.getOptionValue("g"); + int indexX = geometry.indexOf('x'); + if (indexX > 0) { + startupWidth = parseInt(geometry.substring(0, indexX)); + startupHeight = parseInt(geometry.substring(indexX + 1)); + } + } + */ + + Point b = historyFile.getWindowBorder(JMOL_WINDOW_NAME); + //first one is just approximate, but this is set in doClose() + //so it will reset properly -- still, not perfect + //since it is always one step behind. + if (b == null) + border = new Point(12, 116); + else + border = new Point(b.x, b.y); + //note -- the first time this is run after changes it will not work + //because there is a bootstrap problem. + + int width = -1; + int height = -1; + //INNER frame dimensions + if (line.hasOption("g")) { + String geometry = line.getOptionValue("g"); + int indexX = geometry.indexOf('x'); + if (indexX > 0) { + width = Parser.parseInt(geometry.substring(0, indexX)); + height = Parser.parseInt(geometry.substring(indexX + 1)); + //System.out.println("setting geometry to " + geometry + " " + border + " " + startupWidth + startupHeight); + } + if (haveDisplay) { + startupWidth = width + border.x; + startupHeight = height + border.y; + } + } + + if (startupWidth <= 0 || startupHeight <= 0) { + startupWidth = 500 + border.x; + startupHeight = 500 + border.y; + } + + //write image to clipboard or image file + if (line.hasOption("w")) { + int quality = -1; + if (line.hasOption("q")) + quality = Parser.parseInt(line.getOptionValue("q")); + String type_name = line.getOptionValue("w"); + if (type_name != null) { + if (type_name.length() == 0) + type_name = "JPG:jmol.jpg"; + if (type_name.indexOf(":") < 0) + type_name += ":jmol.jpg"; + int i = type_name.indexOf(":"); + String type = type_name.substring(0, i).toUpperCase(); + type_name = " \"" + type_name.substring(i + 1) + "\""; + if (type.indexOf(" ") < 0) + type += " " + quality; + script2 += ";write image " + width + " " + height + " " + type + type_name; + } + } + + //no display (and exit) if (line.hasOption("n")) { // this ensures that noDisplay also exits @@ -577,90 +665,7 @@ script2 += ";exitJmol"; } - //check script only -- don't open files - if (line.hasOption("c")) { - commandOptions += "-c"; - } else if (line.hasOption("C")) { - commandOptions += "-C"; - } - - //menu file - if (line.hasOption("m")) { - menuFile = line.getOptionValue("m"); - } - - String imageType_name = null; - //write image to clipboard or image file - if (line.hasOption("w")) { - imageType_name = line.getOptionValue("w"); - } - - Dimension size; try { - String vers = System.getProperty("java.version"); - if (vers.compareTo("1.1.2") < 0) { - System.out.println("!!!WARNING: Swing components require a " - + "1.1.2 or higher version VM!!!"); - } - - size = historyFile.getWindowSize(JMOL_WINDOW_NAME); - if (size != null && haveDisplay) { - startupWidth = size.width; - startupHeight = size.height; - } - - //OUTER window dimensions - /* - if (line.hasOption("g") && haveDisplay) { - String geometry = line.getOptionValue("g"); - int indexX = geometry.indexOf('x'); - if (indexX > 0) { - startupWidth = parseInt(geometry.substring(0, indexX)); - startupHeight = parseInt(geometry.substring(indexX + 1)); - } - } - */ - - Point b = historyFile.getWindowBorder(JMOL_WINDOW_NAME); - //first one is just approximate, but this is set in doClose() - //so it will reset properly -- still, not perfect - //since it is always one step behind. - if (b == null) - border = new Point(12, 116); - else - border = new Point(b.x, b.y); - //note -- the first time this is run after changes it will not work - //because there is a bootstrap problem. - - int width = -1; - int height = -1; - int quality = 75; - //INNER frame dimensions - if (line.hasOption("g")) { - String geometry = line.getOptionValue("g"); - int indexX = geometry.indexOf('x'); - if (indexX > 0) { - width = Parser.parseInt(geometry.substring(0, indexX)); - height = Parser.parseInt(geometry.substring(indexX + 1)); - //System.out.println("setting geometry to " + geometry + " " + border + " " + startupWidth + startupHeight); - } - if (haveDisplay) { - startupWidth = width + border.x; - startupHeight = height + border.y; - } - } - - if (line.hasOption("q")) - quality = Parser.parseInt(line.getOptionValue("q")); - - if (imageType_name != null) - commandOptions += "-w\1" + imageType_name + "\t" + width + "\t" - + height + "\t" + quality + "\1"; - - if (startupWidth <= 0 || startupHeight <= 0) { - startupWidth = 500 + border.x; - startupHeight = 500 + border.y; - } JFrame jmolFrame = new JFrame(); Point jmolPosition = historyFile.getWindowPosition(JMOL_WINDOW_NAME); if (jmolPosition != null) { @@ -712,6 +717,7 @@ t.printStackTrace(); } + if (haveConsole) { Point location = jmol.frame.getLocation(); size = jmol.frame.getSize(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ahe...@us...> - 2009-01-17 17:22:11
|
Revision: 10555 http://jmol.svn.sourceforge.net/jmol/?rev=10555&view=rev Author: aherraez Date: 2009-01-17 17:22:07 +0000 (Sat, 17 Jan 2009) Log Message: ----------- copyright updated to 2009 Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/JmolConstants.java trunk/Jmol/src/org/openscience/jmol/app/About.html trunk/Jmol/src/org/openscience/jmol/app/About_ca.html trunk/Jmol/src/org/openscience/jmol/app/About_cs.htm trunk/Jmol/src/org/openscience/jmol/app/About_de.html trunk/Jmol/src/org/openscience/jmol/app/About_es.html trunk/Jmol/src/org/openscience/jmol/app/About_fr.html trunk/Jmol/src/org/openscience/jmol/app/About_hu.html trunk/Jmol/src/org/openscience/jmol/app/About_nl.html trunk/Jmol/src/org/openscience/jmol/app/About_tr.html trunk/Jmol/src/org/openscience/jmol/images/Jmol_splash.jpg Modified: trunk/Jmol/src/org/jmol/viewer/JmolConstants.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JmolConstants.java 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/jmol/viewer/JmolConstants.java 2009-01-17 17:22:07 UTC (rev 10555) @@ -36,7 +36,7 @@ final public class JmolConstants { - public final static String copyright = "(C) 2008 Jmol Development"; + public final static String copyright = "(C) 2009 Jmol Development"; public final static String version; static { Modified: trunk/Jmol/src/org/openscience/jmol/app/About.html =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About.html 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About.html 2009-01-17 17:22:07 UTC (rev 10555) @@ -6,7 +6,7 @@ <center><img src="../images/Jmol_splash.jpg" alt="Jmol"></center> <p>Jmol is an opensource molecular viewer.</p> - <p>Copyright © 1999-2008 by the Jmol Development Team.</p> + <p>Copyright © 1999-2009 by the Jmol Development Team.</p> <p>External libraries used:</p> <ul> Modified: trunk/Jmol/src/org/openscience/jmol/app/About_ca.html =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About_ca.html 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About_ca.html 2009-01-17 17:22:07 UTC (rev 10555) @@ -6,7 +6,7 @@ <center><img src="../images/Jmol_splash.jpg" alt="Jmol"></center> <p>Jmol és un visualitzador molecular de codi obert.</p> - <p>Copyright © 1999-2008 per l'equip de desenvolupament del Jmol (Jmol Development Team).</p> + <p>Copyright © 1999-2009 per l'equip de desenvolupament del Jmol (Jmol Development Team).</p> <p>Biblioteques externes que s'hi utilitzen:</p> <ul> Modified: trunk/Jmol/src/org/openscience/jmol/app/About_cs.htm =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About_cs.htm 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About_cs.htm 2009-01-17 17:22:07 UTC (rev 10555) @@ -5,7 +5,7 @@ <BODY bgColor=#ffffff> <CENTER><img src="../images/Jmol_splash.jpg" alt="Jmol"></CENTER> <P>Jmol je volně dostupný prohlížeč molekul.</P> -<P>Copyright © 1999-2008 by the Jmol Development Team.</P> +<P>Copyright © 1999-2009 by the Jmol Development Team.</P> <P>Použité externí knihovny:</P> <UL> <LI><A href="http://www.junit.org/">JUnit</A> (http://www.junit.org/)<BR>by Modified: trunk/Jmol/src/org/openscience/jmol/app/About_de.html =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About_de.html 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About_de.html 2009-01-17 17:22:07 UTC (rev 10555) @@ -8,7 +8,7 @@ <center><img src="../images/Jmol_splash.jpg" alt="Jmol"></center> <p>Jmol ist ein freier Molekülbetrachter.</p> - <p>Copyright © 1999-2008 Jmol Entwicklerteam.</p> + <p>Copyright © 1999-2009 Jmol Entwicklerteam.</p> <p>Externe Bibliotheken, die genutzt werden:</p> <ul> Modified: trunk/Jmol/src/org/openscience/jmol/app/About_es.html =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About_es.html 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About_es.html 2009-01-17 17:22:07 UTC (rev 10555) @@ -6,7 +6,7 @@ <center><img src="../images/Jmol_splash.jpg" alt="Jmol"></center> <p>Jmol es un programa de código abierto para visualizar moléculas.</p> - <p>Copyright © 1999-2008 por el equipo de desarrollo de Jmol (Jmol Development Team).</p> + <p>Copyright © 1999-2009 por el equipo de desarrollo de Jmol (Jmol Development Team).</p> <p>Usa estas bibliotecas externas:</p> <ul> Modified: trunk/Jmol/src/org/openscience/jmol/app/About_fr.html =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About_fr.html 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About_fr.html 2009-01-17 17:22:07 UTC (rev 10555) @@ -6,7 +6,7 @@ <center><img src="../images/Jmol_splash.jpg" alt="Jmol"></center> <p>Jmol est un afficheur moléculaire opensource.</p> - <p>Copyright © 1999-2008 by the Jmol Development Team.</p> + <p>Copyright © 1999-2009 by the Jmol Development Team.</p> <p>Librairies externes utilisées:</p> <ul> Modified: trunk/Jmol/src/org/openscience/jmol/app/About_hu.html =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About_hu.html 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About_hu.html 2009-01-17 17:22:07 UTC (rev 10555) @@ -7,7 +7,7 @@ <center><img src="../images/Jmol_splash.jpg" alt="Jmol"></center> <p>A Jmol egy nyílt forráskódú molekula-megjelenítő.</p> - <p>Copyright © 1999-2008 a Jmol Fejlesztői Csapat.</p> + <p>Copyright © 1999-2009 a Jmol Fejlesztői Csapat.</p> <p>A következő külső kódkönyvtárak kerültek alkalmazásra:</p> <ul> Modified: trunk/Jmol/src/org/openscience/jmol/app/About_nl.html =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About_nl.html 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About_nl.html 2009-01-17 17:22:07 UTC (rev 10555) @@ -6,7 +6,7 @@ <center><img src="../images/Jmol_splash.jpg" alt="Jmol"></center> <p>Jmol is een opensource visualisatieprogramma voor moleculen.</p> - <p>Copyright © 1999-2008 ligt bij de Jmol-ontwikkelaars.</p> + <p>Copyright © 1999-2009 ligt bij de Jmol-ontwikkelaars.</p> <p>Gebruikte externe bibliotheken:</p> <ul> Modified: trunk/Jmol/src/org/openscience/jmol/app/About_tr.html =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/About_tr.html 2009-01-13 17:13:44 UTC (rev 10554) +++ trunk/Jmol/src/org/openscience/jmol/app/About_tr.html 2009-01-17 17:22:07 UTC (rev 10555) @@ -7,7 +7,7 @@ <center><img src="../images/Jmol_splash.jpg" alt="Jmol"></center> <p>Jmol a\xE7\xFDk kaynak kodlu bir molek\xFCler g\xF6r\xFCnt\xFCleyicidir.</p> - <p>Telif Hakk\xFD © 1999-2008 Jmol Geli\xFEtirme Ekibi'ne aittir.</p> + <p>Telif Hakk\xFD © 1999-2009 Jmol Geli\xFEtirme Ekibi'ne aittir.</p> <p>Kullan\xFDlan harici k\xFCt\xFCphaneler:</p> <ul> Modified: trunk/Jmol/src/org/openscience/jmol/images/Jmol_splash.jpg =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-02-06 05:36:30
|
Revision: 10620 http://jmol.svn.sourceforge.net/jmol/?rev=10620&view=rev Author: hansonr Date: 2009-02-06 05:36:26 +0000 (Fri, 06 Feb 2009) Log Message: ----------- version=11.7.25_dev ASimpleJvxlWriter.java # new application: org.openscience.app.jvxl.simplewriter.ASimpleJvxlWriter.java # -- streamlined methods for converting CUBE data to JVXL files Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Jmol.properties Added Paths: ----------- trunk/Jmol/src/org/openscience/jvxl/simplewriter/ trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlData.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/VolumeData.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/VoxelDataCreator.java Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-05 21:52:15 UTC (rev 10619) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-06 05:36:26 UTC (rev 10620) @@ -1,8 +1,11 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=11.7.25_dev +version=11.7.25_dev ASimpleJvxlWriter.java +# new application: org.openscience.app.jvxl.simplewriter.ASimpleJvxlWriter.java +# -- streamlined methods for converting CUBE data to JVXL files + # ----------------------------------------------------------------------------- #version=11.7.24 Added: trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java (rev 0) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java 2009-02-06 05:36:26 UTC (rev 10620) @@ -0,0 +1,82 @@ +/* $RCSfile$ + * $Author: nicove $ + * $Date: 2007-03-25 06:09:49 -0500 (Sun, 25 Mar 2007) $ + * $Revision: 7221 $ + * + * Copyright (C) 2000-2005 The Jmol Development Team + * + * Contact: jmo...@li... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.openscience.jvxl.simplewriter; + +import java.io.BufferedWriter; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class ASimpleJvxlWriter { + + // example for how to create simple JVXL files from cube data + // no color mapping, no planes, just simple surfaces. + + public static void main(String[] args) { + + VolumeData volumeData = new VolumeData(); + + // parameters that need setting: + + String outputFile = "c:/temp/simple.jvxl"; + float cutoff = 0.0f; + boolean isCutoffAbsolute = false; + int nX = 10; + int nY = 10; + int nZ = 10; + volumeData.setVolumetricOrigin(0, 0, 0); + volumeData.setVolumetricVector(0, 1f, 0f, 0f); + volumeData.setVolumetricVector(1, 0f, 1f, 0f); + volumeData.setVolumetricVector(2, 0f, 0f, 1f); + + volumeData.setVoxelCounts(nX, nY, nZ); + volumeData.setVoxelData(new float[nX][nY][nZ]); + VoxelDataCreator vdc = new VoxelDataCreator(); + vdc.createVoxelData(volumeData); + JvxlData jvxlData = new JvxlData(); + jvxlData.cutoff = cutoff; + jvxlData.isCutoffAbsolute = isCutoffAbsolute; + StringBuffer sb = new StringBuffer("created by SimpleJvxlWriter " + + new SimpleDateFormat("yyyy-MM-dd', 'HH:mm").format(new Date()) + + "\naddional comment line\n"); + writeFile(outputFile, JvxlWrite.jvxlGetData(jvxlData, volumeData, sb)); + System.out.flush(); + System.exit(0); + } + + static void writeFile(String fileName, String text) { + try { + FileOutputStream os = new FileOutputStream(fileName); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os), 8192); + bw.write(text); + bw.close(); + os = null; + } catch (IOException e) { + System.out.println("IO Exception: " + e.toString()); + } + } + +} \ No newline at end of file Added: trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlData.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlData.java (rev 0) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlData.java 2009-02-06 05:36:26 UTC (rev 10620) @@ -0,0 +1,179 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2007-03-30 11:40:16 -0500 (Fri, 30 Mar 2007) $ + * $Revision: 7273 $ + * + * Copyright (C) 2007 Miguel, Bob, Jmol Development + * + * Contact: ha...@st... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + +/* + + * The JVXL file format + * -------------------- + * + * as of 3/29/07 this code is COMPLETELY untested. It was hacked out of the + * Jmol code, so there is probably more here than is needed. + * + * + * + * see http://www.stolaf.edu/academics/chemapps/jmol/docs/misc/JVXL-format.pdf + * + * The JVXL (Jmol VoXeL) format is a file format specifically designed + * to encode an isosurface or planar slice through a set of 3D scalar values + * in lieu of a that set. A JVXL file can contain coordinates, and in fact + * it must contain at least one coordinate, but additional coordinates are + * optional. The file can contain any finite number of encoded surfaces. + * However, the compression of 300-500:1 is based on the reduction of the + * data to a SINGLE surface. + * + * + * The original Marching Cubes code was written by Miguel Howard in 2005. + * The classes Parser, ArrayUtil, and TextFormat are condensed versions + * of the classes found in org.jmol.util. + * + * All code relating to JVXL format is copyrighted 2006/2007 and invented by + * Robert M. Hanson, + * Professor of Chemistry, + * St. Olaf College, + * 1520 St. Olaf Ave. + * Northfield, MN. 55057. + * + * Implementations of the JVXL format should reference + * "Robert M. Hanson, St. Olaf College" and the opensource Jmol project. + * + * + * implementing marching squares; see + * http://www.secam.ex.ac.uk/teaching/ug/studyres/COM3404/COM3404-2006-Lecture15.pdf + * + * lines through coordinates are identical to CUBE files + * after that, we have a line that starts with a negative number to indicate this + * is a JVXL file: + * + * line1: (int)-nSurfaces (int)edgeFractionBase (int)edgeFractionRange + * (nSurface lines): (float)cutoff (int)nBytesData (int)nBytesFractions + * + * definition1 + * edgedata1 + * fractions1 + * colordata1 + * .... + * definition2 + * edgedata2 + * fractions2 + * colordata2 + * .... + * + * definitions: a line with detail about what sort of compression follows + * + * edgedata: a list of the count of vertices ouside and inside the cutoff, whatever + * that may be, ordered by nested for loops for(x){for(y){for(z)}}}. + * + * nOutside nInside nOutside nInside... + * + * fractions: an ascii list of characters represting the fraction of distance each + * encountered surface point is along each voxel cube edge found to straddle the + * surface. The order written is dictated by the reader algorithm and is not trivial + * to describe. Each ascii character is constructed by taking a base character and + * adding onto it the fraction times a range. This gives a character that can be + * quoted EXCEPT for backslash, which MAY be substituted for by '!'. Jmol uses the + * range # - | (35 - 124), reserving ! and } for special meanings. + * + * colordata: same deal here, but with possibility of "double precision" using two bytes. + * + * + * + * THIS READER + * ----------- + * + * This is a first attempt at a generic JVXL file reader and writer class. + * It is an extraction of Jmol org.jmol.viewer.Isosurface.Java and related pieces. + * + * The goal of the reader is to be able to read CUBE-like data and + * convert that data to JVXL file data. + * + * + */ + +package org.openscience.jvxl.simplewriter; + +import javax.vecmath.Point4f; + +import org.jmol.jvxl.readers.JvxlReader; + +public class JvxlData { + public JvxlData() { + } + + //for now, all public, no accessors + + public boolean wasJvxl; + public boolean wasCubic; + + public String jvxlFileTitle; + public String jvxlFileMessage; + public String jvxlFileHeader; + public String jvxlExtraLine; + public String jvxlDefinitionLine; + public String jvxlSurfaceData; + public String jvxlEdgeData; + public String jvxlColorData; + public String jvxlInfoLine; + + public Point4f jvxlPlane; + + public int jvxlCompressionRatio; + public boolean isJvxlPrecisionColor; + public boolean jvxlDataIsColorMapped; + public boolean jvxlDataIs2dContour; + public boolean isColorReversed; + + public int edgeFractionBase = JvxlReader.defaultEdgeFractionBase; + public int edgeFractionRange = JvxlReader.defaultEdgeFractionRange; + public int colorFractionBase = JvxlReader.defaultColorFractionBase; + public int colorFractionRange = JvxlReader.defaultColorFractionRange; + + public boolean isCutoffAbsolute; + public boolean insideOut; + public boolean isXLowToHigh; + public boolean isContoured; + public boolean isBicolorMap; + public boolean isTruncated; + public boolean vertexDataOnly; + public float mappedDataMin; + public float mappedDataMax; + public float valueMappedToRed; + public float valueMappedToBlue; + public float cutoff; + public float pointsPerAngstrom; + public int nPointsX, nPointsY, nPointsZ; + public int nBytes; + public int nContours; + public int nEdges; + public int nSurfaceInts; + public int vertexCount; + + public short minColorIndex = -1; + public short maxColorIndex = 0; + + public String[] title; + public String version; + +} + Added: trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java (rev 0) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java 2009-02-06 05:36:26 UTC (rev 10620) @@ -0,0 +1,268 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2007-03-30 11:40:16 -0500 (Fri, 30 Mar 2007) $ + * $Revision: 7273 $ + * + * Copyright (C) 2007 Miguel, Bob, Jmol Development + * + * Contact: ha...@st... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.openscience.jvxl.simplewriter; + +import javax.vecmath.Point3f; + +public class JvxlWrite { + + /* + * methods here are condensed versions of those in org.jmol.jvxl.JvxlReader.java + * -- no support for color mapped data + * -- voxel-based surfaces only, no planes + */ + private final static String JVXL_VERSION = "2.0"; + + final private static int defaultEdgeFractionBase = 35; //#$%....... + final private static int defaultEdgeFractionRange = 90; + + public JvxlWrite() { + } + + public static String jvxlGetData(JvxlData jvxlData, VolumeData volumeData, StringBuffer sb) { + // if the StringBuffer is not empty, it should have two comment lines + // that do not start with # already present. + Point3f[] atomXYZ = null; + int[] atomNo = null; + int nAtoms = Integer.MAX_VALUE; + jvxlCreateHeader(volumeData, nAtoms, atomXYZ, atomNo, sb); + jvxlData.jvxlFileHeader = sb.toString(); + int[] counts = volumeData.getVoxelCounts(); + jvxlCreateSurfaceData(jvxlData, volumeData.getVoxelData(), jvxlData.cutoff, + jvxlData.isCutoffAbsolute, counts); + SimpleMarchingCubes mc = new SimpleMarchingCubes(volumeData, + jvxlData.cutoff, jvxlData.isCutoffAbsolute); + jvxlData.jvxlEdgeData = mc.getEdgeData(); + jvxlData.jvxlDefinitionLine = jvxlGetDefinitionLine(jvxlData); + return jvxlGetFile(jvxlData); + } + + static char jvxlFractionAsCharacter(float fraction) { + return jvxlFractionAsCharacter(fraction, defaultEdgeFractionBase, + defaultEdgeFractionRange); + } + + private static String jvxlGetFile(JvxlData jvxlData) { + StringBuffer data = new StringBuffer(); + String s = jvxlData.jvxlFileHeader + jvxlExtraLine(jvxlData, 1); + if (s.indexOf("#JVXL") != 0) + data.append("#JVXL").append(jvxlData.isXLowToHigh ? "+" : "").append( + " VERSION ").append(JVXL_VERSION).append("\n"); + data.append(s); + data.append("# ").append('\n'); + data.append(jvxlData.jvxlDefinitionLine).append('\n'); + StringBuffer sb = new StringBuffer(); + sb.append(jvxlData.jvxlSurfaceData); + sb.append(jvxlCompressString(jvxlData.jvxlEdgeData)); + data.append(sb); + return data.toString(); + } + + // #comments (optional) + // info line1 + // info line2 + // -na originx originy originz [ANGSTROMS/BOHR] optional; BOHR assumed + // n1 x y z + // n2 x y z + // n3 x y z + // a1 a1.0 x y z + // a2 a2.0 x y z + // a3 a3.0 x y z + // a4 a4.0 x y z + // etc. -- na atoms + // -ns 35 90 35 90 Jmol voxel format version 1.0 + // # more comments + // cutoff +/-nEdges +/-nVertices [more here] + // integer inside/outside edge data + // ascii-encoded fractional edge data + // ascii-encoded fractional color data + // # optional comments + + private static void setSurfaceInfo(JvxlData jvxlData, int nSurfaceInts, StringBuffer surfaceData) { + jvxlData.jvxlSurfaceData = surfaceData.toString(); + if (jvxlData.jvxlSurfaceData.indexOf("--") == 0) + jvxlData.jvxlSurfaceData = jvxlData.jvxlSurfaceData.substring(2); + jvxlData.nSurfaceInts = nSurfaceInts; + } + + //// methods for creating the JVXL code + + private static void jvxlCreateHeader(VolumeData v, int nAtoms, + Point3f[] atomXyz, int[] atomNo, + StringBuffer sb) { + // if the StringBuffer comes in non-empty, it should have two lines + // that do not start with # already present. + if (sb.length() == 0) + sb.append("Line 1\nLine 2\n"); + sb.append(nAtoms == Integer.MAX_VALUE ? -2 : -nAtoms).append(' ').append( + v.volumetricOrigin.x).append(' ').append(v.volumetricOrigin.y).append( + ' ').append(v.volumetricOrigin.z).append(" ANGSTROMS\n"); + for (int i = 0; i < 3; i++) + sb.append(v.voxelCounts[i]).append(' ').append(v.volumetricVectors[i].x) + .append(' ').append(v.volumetricVectors[i].y).append(' ').append( + v.volumetricVectors[i].z).append('\n'); + if (nAtoms == Integer.MAX_VALUE) { + jvxlAddDummyAtomList(v, sb); + return; + } + nAtoms = Math.abs(nAtoms); + for (int i = 0, n = 0; i < nAtoms; i++) + sb.append((n = Math.abs(atomNo[i])) + " " + n + ".0 " + atomXyz[i].x + + " " + atomXyz[i].y + " " + atomXyz[i].z + "\n"); + } + + private static void jvxlAddDummyAtomList(VolumeData v, StringBuffer bs) { + Point3f pt = new Point3f(v.volumetricOrigin); + bs.append("1 1.0 ").append(pt.x).append(' ').append(pt.y).append(' ') + .append(pt.z).append(" //BOGUS H ATOM ADDED FOR JVXL FORMAT\n"); + for (int i = 0; i < 3; i++) + pt.scaleAdd(v.voxelCounts[i] - 1, v.volumetricVectors[i], pt); + bs.append("2 2.0 ").append(pt.x).append(' ').append(pt.y).append(' ') + .append(pt.z).append(" //BOGUS He ATOM ADDED FOR JVXL FORMAT\n"); + } + + private static int jvxlCreateSurfaceData(JvxlData jvxlData, + float[][][] voxelData, float cutoff, + boolean isCutoffAbsolute, + int counts[]) { + StringBuffer sb = new StringBuffer(); + boolean inside = false; + int dataCount = 0; + int nDataPoints = 0; + int nSurfaceInts = 0; + int nX = counts[0]; + int nY = counts[1]; + int nZ = counts[2]; + for (int x = 0; x < nX; ++x) + for (int y = 0; y < nY; ++y) + for (int z = 0; z < nZ; ++z) { + ++nDataPoints; + if (inside == isInside(voxelData[x][y][z], cutoff, isCutoffAbsolute)) { + dataCount++; + } else { + if (dataCount != 0) { + sb.append(' ').append(dataCount); + ++nSurfaceInts; + } + dataCount = 1; + inside = !inside; + } + } + sb.append(' ').append(dataCount).append('\n'); + ++nSurfaceInts; + setSurfaceInfo(jvxlData, nSurfaceInts, sb); + return nDataPoints; + } + + private static boolean isInside(float voxelValue, float max, + boolean isAbsolute) { + return SimpleMarchingCubes.isInside(voxelValue, max, isAbsolute); + } + + private static String jvxlGetDefinitionLine(JvxlData jvxlData) { + String definitionLine = jvxlData.cutoff + " "; + + // cutoff nInts (+/-)bytesEdgeData (+/-)bytesColorData + // param1 param2 param3 + // | | | + // when | | > 0 ==> jvxlDataIsColorMapped + // when | | == -1 ==> not color mapped + // when | | < -1 ==> jvxlDataIsPrecisionColor + // when == -1 && == -1 ==> noncontoured plane + // when == -1 &kg& == -2 ==> contourable plane + // when < -1* && > 0 ==> contourable functionXY + // when > 0 && < 0 ==> jvxlDataisBicolorMap + + // * nInts saved as -1 - nInts + + if (jvxlData.jvxlSurfaceData == null) + return ""; + int nSurfaceInts = jvxlData.nSurfaceInts;//jvxlData.jvxlSurfaceData.length(); + int bytesUncompressedEdgeData = jvxlData.jvxlEdgeData.length() - 1; + definitionLine += nSurfaceInts + " " + bytesUncompressedEdgeData + + " -1 0 0 0 0"; + return definitionLine; + } + + private static String jvxlExtraLine(JvxlData jvxlData, int n) { + return (-n) + " " + jvxlData.edgeFractionBase + " " + + jvxlData.edgeFractionRange + " " + jvxlData.colorFractionBase + " " + + jvxlData.colorFractionRange + " Jmol voxel format version " + + JVXL_VERSION + "\n"; + } + + // to ascii-encoded data + + private static char jvxlFractionAsCharacter(float fraction, int base, + int range) { + if (fraction > 0.9999f) + fraction = 0.9999f; + else if (Float.isNaN(fraction)) + fraction = 1.0001f; + int ich = (int) (fraction * range + base); + if (ich < base) + return (char) base; + if (ich == 92) + return 33; // \ --> ! + //if (logCompression) + //Logger.info("fac: " + fraction + " --> " + ich + " " + (char) ich); + return (char) ich; + } + + static String jvxlCompressString(String data) { + /* just a simple compression, but allows 2000-6000:1 CUBE:JVXL for planes! + * + * "X~nnn " means "nnn copies of character X" + * + * ########## becomes "#~10 " + * ~ becomes "~~" + * + */ + StringBuffer dataOut = new StringBuffer(); + char chLast = '\0'; + data += '\0'; + int nLast = 0; + for (int i = 0; i < data.length(); i++) { + char ch = data.charAt(i); + if (ch == chLast) { + ++nLast; + if (ch != '~') + ch = '\0'; + } else if (nLast > 0) { + if (nLast < 4 || chLast == '~' || chLast == ' ' || chLast == '\t') + while (--nLast >= 0) + dataOut.append(chLast); + else + dataOut.append("~" + nLast + " "); + nLast = 0; + } + if (ch != '\0') { + dataOut.append(ch); + chLast = ch; + } + } + return dataOut.toString(); + } + +} Added: trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java (rev 0) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java 2009-02-06 05:36:26 UTC (rev 10620) @@ -0,0 +1,465 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2007-03-30 11:40:16 -0500 (Fri, 30 Mar 2007) $ + * $Revision: 7273 $ + * + * Copyright (C) 2007 Miguel, Bob, Jmol Development + * + * Contact: ha...@st... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.openscience.jvxl.simplewriter; + +import javax.vecmath.Point3i; + +public class SimpleMarchingCubes { + + /* + * An adaptation of Marching Cubes to include data slicing and the option + * for progressive reading of the data. Associated SurfaceReader and VoxelData + * structures are required to store the sequential values in the case of a plane + * and to deliver the sequential vertex numbers in any case. + * + * Author: Bob Hanson, ha...@st... + * + * The "Simple" version does not create triangle data, + * just the JVXL fractionData string + * + */ + + private VolumeData volumeData; + private float cutoff; + private boolean isCutoffAbsolute; + private boolean isXLowToHigh; + StringBuffer fractionData = new StringBuffer(); + + private int cubeCountX, cubeCountY, cubeCountZ; + + public SimpleMarchingCubes(VolumeData volumeData, float cutoff, + boolean isCutoffAbsolute) { + + // when just creating a JVXL file all you really need are: + // + // volumeData.voxelData[x][y][z] + // cutoff + // + + this.volumeData = volumeData; + this.cutoff = cutoff; + this.isCutoffAbsolute = isCutoffAbsolute; + + cubeCountX = volumeData.voxelData.length - 1; + cubeCountY = volumeData.voxelData[0].length - 1; + cubeCountZ = volumeData.voxelData[0][0].length - 1; + xyCount = (cubeCountX + 1) * (cubeCountY + 1); + + } + + private final float[] vertexValues = new float[8]; + private final Point3i[] vertexPoints = new Point3i[8]; + { + for (int i = 8; --i >= 0;) + vertexPoints[i] = new Point3i(); + } + int xyCount; + int edgeCount; + + /* Note to Jason from Bob: + * + * To just create a JVXL file, you need these five methods. + * Their output is the fractionData string buffer and the + * number of surface points + * + * inputs required: + * + * 1) volumeData.voxelData[x][y][z] + * 2) cutoff + * 3) values created in MarchingCubes constructor + * + * The first four methods are in org.jmol.jvxl.calc.MarchingCubes.java + * + * generateSurfaceData -- isXLowToHigh false; isContoured false + * -- triangle stuff at end not needed + * propagateNeighborPointIndexes -- EXACTLY as is, no changes allowed + * isInside -- EXACTLY as is -- defines what "inside" means + * processOneCubical -- EXACTLY as is, no changes at all + * SurfaceReader.getSurfacePointIndex -- your job + * -- receives the point value data and positions + * -- responsible for creating the fractionData character buffer + * -- just return 0 since you are not creating triangles + * + */ + + public String getEdgeData() { + + // set up the set of edge points in the YZ plane + // these are indexes into an array of Point3f values + // They will be initialized as -1 whenever a vertex is needed. + // But if just creating a JVXL file, all you need to do + // is set them to 0, not an index into any actual array. + + int[][] isoPointIndexes = new int[cubeCountY * cubeCountZ][12]; + + edgeCount = 0; + + int x0, x1, xStep; + if (isXLowToHigh) { + x0 = 0; + x1 = cubeCountX; + xStep = 1; + } else { + x0 = cubeCountX - 1; + x1 = -1; + xStep = -1; + } + for (int x = x0; x != x1; x += xStep) { + for (int y = cubeCountY; --y >= 0;) { + for (int z = cubeCountZ; --z >= 0;) { + + // set up the list of indices that need checking + + int[] voxelPointIndexes = propagateNeighborPointIndexes(x, y, z, + isoPointIndexes); + + // create the bitset mask indicating which vertices are inside. + // 0xFF here means "all inside"; 0x00 means "all outside" + + int insideMask = 0; + for (int i = 8; --i >= 0;) { + + // cubeVertexOffsets just gets us the specific grid point relative + // to our base x,y,z cube position + + Point3i offset = cubeVertexOffsets[i]; + if (isInside( + (vertexValues[i] = volumeData.voxelData[x + offset.x][y + + offset.y][z + offset.z]), cutoff, isCutoffAbsolute)) + insideMask |= 1 << i; + } + + if (insideMask == 0) { + continue; + } + if (insideMask == 0xFF) { + continue; + } + // This cube is straddling the cutoff. We must check all edges + + processOneCubical(insideMask, voxelPointIndexes, x, y, z); + } + } + } + return fractionData.toString(); + } + + public static boolean isInside(float voxelValue, float max, boolean isAbsolute) { + return ((max > 0 && (isAbsolute ? Math.abs(voxelValue) : voxelValue) >= max) || (max <= 0 && voxelValue <= max)); + } + + private final int[] nullNeighbor = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1 }; + + private int[] propagateNeighborPointIndexes(int x, int y, int z, + int[][] isoPointIndexes) { + /* Y + * 4 --------4--------- 5 + * /| /| + * / | / | + * / | / | + * 7 8 5 | + * / | / 9 + * / | / | + * 7 --------6--------- 6 | + * | | | | + * | 0 ---------0--|----- 1 X + * | / | / + * 11 / 10 / + * | 3 | 1 + * | / | / + * | / | / + * 3 ---------2-------- 2 + * Z + * + * + * We are running through the grid points in yz planes from high x --> low x + * and within those planes along strips from high y to low y + * and within those strips, from high z to low z. The "leading vertex" is 0, + * and the "leading edges" are {0,3,8}. + * + * For each such cube, edges are traversed from high to low (11-->0) + * + * Each edge has the potential to be "critical" and cross the surface. + * Setting -1 in voxelPointIndexes indicates that this edge needs checking. + * Otherwise, the crossing point for this edge is taken from the value + * already determined, because it has already been determined to be critical. + * + * The above model, because it starts at HIGH x, requires that all x,y,z points + * be in memory from the beginning. We could have instead used a progressive + * streaming model, where we only pull in the slice of data that we need. In + * that case, each edge corresponds to a specific pair of indices in our slice. + * + * Say we have a 51 x 11 x 21 block of data. This represents a 50 x 10 x 20 set + * of cubes. If, instead of reading all the data, we pull in just the first two + * "slices" x=0(10x20), x=1(10x20), that is just 400 points. Once a slice of + * data is used, we can flush it -- it is never used again. + * + * When color mapping, we can do the same thing; we just have to put the verticies + * into bins based on which pair of slices will be relevant, and then make sure we + * process the verticies based on these bins. + * + * The JVXL format depends on a specific order of reading of the edge data. The + * progressive model completely messes this up. The vertices will be read in the + * same order around the cube, but the "leading edges" will be {0,1,9}, not {0,3,8}. + * We do know which edge is which, so we could construct a progressive model from + * a nonprogressive one, if necessary. + * + * All we are really talking about is the JVXL reader, because we can certainly + * switch to progressive mode in all the other readers. + * + * + */ + + /* DO NOT EVER CHANGE THIS */ + + int cellIndex = y * cubeCountZ + z; + int[] voxelPointIndexes = isoPointIndexes[cellIndex]; + + boolean noXNeighbor = (x == cubeCountX - 1); + if (isXLowToHigh) { + // reading x from low to high + if (noXNeighbor) { + voxelPointIndexes[3] = -1; + voxelPointIndexes[8] = -1; + voxelPointIndexes[7] = -1; + voxelPointIndexes[11] = -1; + } else { + voxelPointIndexes[3] = voxelPointIndexes[1]; + voxelPointIndexes[7] = voxelPointIndexes[5]; + voxelPointIndexes[8] = voxelPointIndexes[9]; + voxelPointIndexes[11] = voxelPointIndexes[10]; + } + } else { + // reading x from high to low + if (noXNeighbor) { + // the x neighbor is myself from my last pass through here + voxelPointIndexes[1] = -1; + voxelPointIndexes[9] = -1; + voxelPointIndexes[5] = -1; + voxelPointIndexes[10] = -1; + } else { + voxelPointIndexes[1] = voxelPointIndexes[3]; + voxelPointIndexes[5] = voxelPointIndexes[7]; + voxelPointIndexes[9] = voxelPointIndexes[8]; + voxelPointIndexes[10] = voxelPointIndexes[11]; + } + } + //from the y neighbor pick up the top + boolean noYNeighbor = (y == cubeCountY - 1); + int[] yNeighbor = noYNeighbor ? nullNeighbor : isoPointIndexes[cellIndex + + cubeCountZ]; + + voxelPointIndexes[4] = yNeighbor[0]; + voxelPointIndexes[6] = yNeighbor[2]; + + if (isXLowToHigh) { + voxelPointIndexes[5] = yNeighbor[1]; + if (noXNeighbor) + voxelPointIndexes[7] = yNeighbor[3]; + } else { + voxelPointIndexes[7] = yNeighbor[3]; + if (noXNeighbor) + voxelPointIndexes[5] = yNeighbor[1]; + } + // from my z neighbor + boolean noZNeighbor = (z == cubeCountZ - 1); + int[] zNeighbor = noZNeighbor ? nullNeighbor + : isoPointIndexes[cellIndex + 1]; + + voxelPointIndexes[2] = zNeighbor[0]; + if (noYNeighbor) + voxelPointIndexes[6] = zNeighbor[4]; + if (isXLowToHigh) { + if (noXNeighbor) + voxelPointIndexes[11] = zNeighbor[8]; + voxelPointIndexes[10] = zNeighbor[9]; + } else { + if (noXNeighbor) + voxelPointIndexes[10] = zNeighbor[9]; + voxelPointIndexes[11] = zNeighbor[8]; + } + // these must always be calculated + voxelPointIndexes[0] = -1; + if (isXLowToHigh) { + voxelPointIndexes[1] = -1; + voxelPointIndexes[9] = -1; + } else { + voxelPointIndexes[3] = -1; + voxelPointIndexes[8] = -1; + } + return voxelPointIndexes; + } + + private boolean processOneCubical(int insideMask, int[] voxelPointIndexes, + int x, int y, int z) { + + // the key to the algorithm is that we have a catalog that + // maps the inside-vertex mask to an edge mask. + + int edgeMask = insideMaskTable[insideMask]; + boolean isNaN = false; + for (int iEdge = 12; --iEdge >= 0;) { + + // bit set to one means it's a relevant edge + + if ((edgeMask & (1 << iEdge)) == 0) + continue; + + // if we have a point already, we don't need to check this edge. + // for triangles, this will be an index into an array; + // for just creating JVXL files, this can just be 0 + + if (voxelPointIndexes[iEdge] >= 0) + continue; // propagated from neighbor + + // here's an edge that has to be checked. + + ++edgeCount; + + // get the vertex numbers 0 - 7 + + int vertexA = edgeVertexes[2 * iEdge]; + int vertexB = edgeVertexes[2 * iEdge + 1]; + + // pick up the actual value at each vertex + // this array of 8 values is updated as we go. + + float valueA = vertexValues[vertexA]; + float valueB = vertexValues[vertexB]; + + // we allow for NaN values -- missing triangles + + if (Float.isNaN(valueA) || Float.isNaN(valueB)) + isNaN = true; + + // the exact point position -- not important for just + // creating the JVXL file. In that case, all you + // need are the two values valueA and valueB and the cutoff. + // from those you can define the fractional offset + + // here is where we get the value and assign the point for that edge + // it is where the JVXL surface data line is appended + + voxelPointIndexes[iEdge] = 0; + fractionData.append(JvxlWrite.jvxlFractionAsCharacter((cutoff - valueA) / (valueB - valueA))); + } + return !isNaN; + } + + final static Point3i[] cubeVertexOffsets = { new Point3i(0, 0, 0), + new Point3i(1, 0, 0), new Point3i(1, 0, 1), new Point3i(0, 0, 1), + new Point3i(0, 1, 0), new Point3i(1, 1, 0), new Point3i(1, 1, 1), + new Point3i(0, 1, 1) }; + + + + /* Y + * 4 --------4--------- 5 +z --------4--------- +yz+z + * /| /| /| /| + * / | / | / | / | + * / | / | / | / | + * 7 8 5 | 7 8 5 | + * / | / 9 / | / 9 + * / | / | / | / | + * 7 --------6--------- 6 | +z+1 --------6--------- +yz+z+1| + * | | | | | | | | + * | 0 ---------0--|----- 1 X | 0 ---------0--|----- +yz X(outer) + * | / | / | / | / + * 11 / 10 / 11 / 10 / + * | 3 | 1 | 3 | 1 + * | / | / | / | / + * | / | / | / | / + * 3 ---------2-------- 2 +1 ---------2-------- +yz+1 + * Z Z (inner) + * + * streaming data offsets + * type 0: x-edges: 0 2 4 6 + * type 1: y-edges: 8 9 10 11 + * type 2: z-edges: 1 3 5 7 + * + * Data stream offsets for vertices, relative to point 0, based on reading + * loops {for x {for y {for z}}} 0-->n-1 + * y and z are numbers of grid points in those directions: + * + * 0 1 2 3 4 5 6 7 + * 0 +yz +yz+1 +1 +z +yz+z +yz+z+1 +z+1 + * + * These are just looked up in a table. After the first set of cubes, + * we are only adding points 1, 2, 5 or 6. This means that initially + * we need two data slices, but after that only one (slice 1): + * + * base + * offset 0 1 2 3 4 5 6 7 + * slice[0] 0 +1 +z +z+1 + * slice[1] +yz 0 +1 +z +z+1 + * + * slice: 0 1 1 0 0 1 1 0 + * + * We can request reading of two slices (2*nY*nZ data points) first, then + * from then on, just nY*nZ points. "Reading" is really just being handed a + * pointer into an array. Perhaps that array is already filled completely; + * perhaps it is being read incrementally. + * + * As it is now, the JVXL data are just read into an [nX][nY][nZ] array anyway, + * so we can continue to do that with NON progressive files. + */ + + private final static byte edgeVertexes[] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, + /* 0 1 2 3 4 */ + 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; + /* 5 6 7 8 9 10 11 */ + + private final static short insideMaskTable[] = { 0x0000, 0x0109, 0x0203, + 0x030A, 0x0406, 0x050F, 0x0605, 0x070C, 0x080C, 0x0905, 0x0A0F, 0x0B06, + 0x0C0A, 0x0D03, 0x0E09, 0x0F00, 0x0190, 0x0099, 0x0393, 0x029A, 0x0596, + 0x049F, 0x0795, 0x069C, 0x099C, 0x0895, 0x0B9F, 0x0A96, 0x0D9A, 0x0C93, + 0x0F99, 0x0E90, 0x0230, 0x0339, 0x0033, 0x013A, 0x0636, 0x073F, 0x0435, + 0x053C, 0x0A3C, 0x0B35, 0x083F, 0x0936, 0x0E3A, 0x0F33, 0x0C39, 0x0D30, + 0x03A0, 0x02A9, 0x01A3, 0x00AA, 0x07A6, 0x06AF, 0x05A5, 0x04AC, 0x0BAC, + 0x0AA5, 0x09AF, 0x08A6, 0x0FAA, 0x0EA3, 0x0DA9, 0x0CA0, 0x0460, 0x0569, + 0x0663, 0x076A, 0x0066, 0x016F, 0x0265, 0x036C, 0x0C6C, 0x0D65, 0x0E6F, + 0x0F66, 0x086A, 0x0963, 0x0A69, 0x0B60, 0x05F0, 0x04F9, 0x07F3, 0x06FA, + 0x01F6, 0x00FF, 0x03F5, 0x02FC, 0x0DFC, 0x0CF5, 0x0FFF, 0x0EF6, 0x09FA, + 0x08F3, 0x0BF9, 0x0AF0, 0x0650, 0x0759, 0x0453, 0x055A, 0x0256, 0x035F, + 0x0055, 0x015C, 0x0E5C, 0x0F55, 0x0C5F, 0x0D56, 0x0A5A, 0x0B53, 0x0859, + 0x0950, 0x07C0, 0x06C9, 0x05C3, 0x04CA, 0x03C6, 0x02CF, 0x01C5, 0x00CC, + 0x0FCC, 0x0EC5, 0x0DCF, 0x0CC6, 0x0BCA, 0x0AC3, 0x09C9, 0x08C0, 0x08C0, + 0x09C9, 0x0AC3, 0x0BCA, 0x0CC6, 0x0DCF, 0x0EC5, 0x0FCC, 0x00CC, 0x01C5, + 0x02CF, 0x03C6, 0x04CA, 0x05C3, 0x06C9, 0x07C0, 0x0950, 0x0859, 0x0B53, + 0x0A5A, 0x0D56, 0x0C5F, 0x0F55, 0x0E5C, 0x015C, 0x0055, 0x035F, 0x0256, + 0x055A, 0x0453, 0x0759, 0x0650, 0x0AF0, 0x0BF9, 0x08F3, 0x09FA, 0x0EF6, + 0x0FFF, 0x0CF5, 0x0DFC, 0x02FC, 0x03F5, 0x00FF, 0x01F6, 0x06FA, 0x07F3, + 0x04F9, 0x05F0, 0x0B60, 0x0A69, 0x0963, 0x086A, 0x0F66, 0x0E6F, 0x0D65, + 0x0C6C, 0x036C, 0x0265, 0x016F, 0x0066, 0x076A, 0x0663, 0x0569, 0x0460, + 0x0CA0, 0x0DA9, 0x0EA3, 0x0FAA, 0x08A6, 0x09AF, 0x0AA5, 0x0BAC, 0x04AC, + 0x05A5, 0x06AF, 0x07A6, 0x00AA, 0x01A3, 0x02A9, 0x03A0, 0x0D30, 0x0C39, + 0x0F33, 0x0E3A, 0x0936, 0x083F, 0x0B35, 0x0A3C, 0x053C, 0x0435, 0x073F, + 0x0636, 0x013A, 0x0033, 0x0339, 0x0230, 0x0E90, 0x0F99, 0x0C93, 0x0D9A, + 0x0A96, 0x0B9F, 0x0895, 0x099C, 0x069C, 0x0795, 0x049F, 0x0596, 0x029A, + 0x0393, 0x0099, 0x0190, 0x0F00, 0x0E09, 0x0D03, 0x0C0A, 0x0B06, 0x0A0F, + 0x0905, 0x080C, 0x070C, 0x0605, 0x050F, 0x0406, 0x030A, 0x0203, 0x0109, + 0x0000 }; + +} Added: trunk/Jmol/src/org/openscience/jvxl/simplewriter/VolumeData.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/VolumeData.java (rev 0) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/VolumeData.java 2009-02-06 05:36:26 UTC (rev 10620) @@ -0,0 +1,346 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2007-03-30 11:40:16 -0500 (Fri, 30 Mar 2007) $ + * $Revision: 7273 $ + * + * Copyright (C) 2007 Miguel, Bob, Jmol Development + * + * Contact: ha...@st... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* + + * The JVXL file format + * -------------------- + * + * as of 3/29/07 this code is COMPLETELY untested. It was hacked out of the + * Jmol code, so there is probably more here than is needed. + * + * + * + * see http://www.stolaf.edu/academics/chemapps/jmol/docs/misc/JVXL-format.pdf + * + * The JVXL (Jmol VoXeL) format is a file format specifically designed + * to encode an isosurface or planar slice through a set of 3D scalar values + * in lieu of a that set. A JVXL file can contain coordinates, and in fact + * it must contain at least one coordinate, but additional coordinates are + * optional. The file can contain any finite number of encoded surfaces. + * However, the compression of 300-500:1 is based on the reduction of the + * data to a SINGLE surface. + * + * + * The original Marching Cubes code was written by Miguel Howard in 2005. + * The classes Parser, ArrayUtil, and TextFormat are condensed versions + * of the classes found in org.jmol.util. + * + * All code relating to JVXL format is copyrighted 2006/2007 and invented by + * Robert M. Hanson, + * Professor of Chemistry, + * St. Olaf College, + * 1520 St. Olaf Ave. + * Northfield, MN. 55057. + * + * Implementations of the JVXL format should reference + * "Robert M. Hanson, St. Olaf College" and the opensource Jmol project. + * + * + * implementing marching squares; see + * http://www.secam.ex.ac.uk/teaching/ug/studyres/COM3404/COM3404-2006-Lecture15.pdf + * + * lines through coordinates are identical to CUBE files + * after that, we have a line that starts with a negative number to indicate this + * is a JVXL file: + * + * line1: (int)-nSurfaces (int)edgeFractionBase (int)edgeFractionRange + * (nSurface lines): (float)cutoff (int)nBytesData (int)nBytesFractions + * + * definition1 + * edgedata1 + * fractions1 + * colordata1 + * .... + * definition2 + * edgedata2 + * fractions2 + * colordata2 + * .... + * + * definitions: a line with detail about what sort of compression follows + * + * edgedata: a list of the count of vertices ouside and inside the cutoff, whatever + * that may be, ordered by nested for loops for(x){for(y){for(z)}}}. + * + * nOutside nInside nOutside nInside... + * + * fractions: an ascii list of characters represting the fraction of distance each + * encountered surface point is along each voxel cube edge found to straddle the + * surface. The order written is dictated by the reader algorithm and is not trivial + * to describe. Each ascii character is constructed by taking a base character and + * adding onto it the fraction times a range. This gives a character that can be + * quoted EXCEPT for backslash, which MAY be substituted for by '!'. Jmol uses the + * range # - | (35 - 124), reserving ! and } for special meanings. + * + * colordata: same deal here, but with possibility of "double precision" using two bytes. + * + * + * + * THIS READER + * ----------- + * + * This is a first attempt at a generic JVXL file reader and writer class. + * It is an extraction of Jmol org.jmol.viewer.Isosurface.Java and related pieces. + * + * The goal of the reader is to be able to read CUBE-like data and + * convert that data to JVXL file data. + * + * + */ + +package org.openscience.jvxl.simplewriter; + +import javax.vecmath.Point3i; +import javax.vecmath.Point3f; +import javax.vecmath.Point4f; +import javax.vecmath.Vector3f; +import javax.vecmath.Matrix3f; + +import org.jmol.api.VolumeDataInterface; + +public class VolumeData implements VolumeDataInterface { + + public VolumeData() { + volumetricVectors[0] = new Vector3f(); + volumetricVectors[1] = new Vector3f(); + volumetricVectors[2] = new Vector3f(); + unitVolumetricVectors[0] = new Vector3f(); + unitVolumetricVectors[1] = new Vector3f(); + unitVolumetricVectors[2] = new Vector3f(); + } + + public final Point3f volumetricOrigin = new Point3f(); + + public void setVolumetricOrigin(float x, float y, float z) { + volumetricOrigin.set(x, y, z); + } + + public final float[] origin = new float[3]; + + public float[] getOriginFloat() { + return origin; + } + + public float[] getVolumetricVectorLengths() { + return volumetricVectorLengths; + } + + public final Vector3f[] volumetricVectors = new Vector3f[3]; + + public void setVolumetricVector(int i, float x, float y, float z) { + volumetricVectors[i].x = x; + volumetricVectors[i].y = y; + volumetricVectors[i].z = z; + } + + public final int[] voxelCounts = new int[3]; + + public int[] getVoxelCounts() { + return voxelCounts; + } + + public void setVoxelCounts(int nPointsX, int nPointsY, int nPointsZ) { + voxelCounts[0] = nPointsX; + voxelCounts[1] = nPointsY; + voxelCounts[2] = nPointsZ; + } + + public float[][][] voxelData; + + public float[][][] getVoxelData() { + return voxelData; + } + + public void setVoxelData(float[][][] voxelData) { + this.voxelData = voxelData; + } + + public final float[] volumetricVectorLengths = new float[3]; + public final Vector3f[] unitVolumetricVectors = new Vector3f[3]; + + private final Matrix3f volumetricMatrix = new Matrix3f(); + + public void setMatrix() { + for (int i = 0; i < 3; i++) + volumetricMatrix.setColumn(i, volumetricVectors[i]); + } + + public void transform(Vector3f v1, Vector3f v2) { + volumetricMatrix.transform(v1, v2); + } + + Point4f thePlane; + private float thePlaneNormalMag; + + public void setPlaneParameters(Point4f plane) { + thePlane = plane; + thePlaneNormalMag = (new Vector3f(plane.x, plane.y, plane.z)).length(); + } + + private final Point3f ptXyzTemp = new Point3f(); + + public float calcVoxelPlaneDistance(int x, int y, int z) { + voxelPtToXYZ(x, y, z, ptXyzTemp); + return (thePlane.x * ptXyzTemp.x + thePlane.y * ptXyzTemp.y + thePlane.z + * ptXyzTemp.z + thePlane.w) + / thePlaneNormalMag; + } + + public float distancePointToPlane(Point3f pt) { + return (thePlane.x * pt.x + thePlane.y * pt.y + thePlane.z * pt.z + thePlane.w) + / thePlaneNormalMag; + } + + public void voxelPtToXYZ(int x, int y, int z, Point3f pt) { + pt.scaleAdd(x, volumetricVectors[0], volumetricOrigin); + pt.scaleAdd(y, volumetricVectors[1], pt); + pt.scaleAdd(z, volumetricVectors[2], pt); + } + + public void setUnitVectors() { + for (int i = 0; i < 3; i++) { + volumetricVectorLengths[i] = volumetricVectors[i].length(); + unitVolumetricVectors[i].normalize(volumetricVectors[i]); + } + origin[0] = volumetricOrigin.x; + origin[1] = volumetricOrigin.y; + origin[2] = volumetricOrigin.z; + } + + private final Vector3f pointVector = new Vector3f(); + + private float scaleByVoxelVector(Vector3f vector, int voxelVectorIndex) { + // ORTHOGONAL ONLY!!! -- required for creating planes + return (vector.dot(unitVolumetricVectors[voxelVectorIndex]) / volumetricVectorLengths[voxelVectorIndex]); + } + + public void xyzToVoxelPt(float x, float y, float z, Point3i pt3i) { + pointVector.set(x, y, z); + setVoxelPoint(); + pt3i.set((int) ptXyzTemp.x, (int) ptXyzTemp.y, (int) ptXyzTemp.z); + } + + private void setVoxelPoint() { + pointVector.sub(volumetricOrigin); + ptXyzTemp.x = scaleByVoxelVector(pointVector, 0); + ptXyzTemp.y = scaleByVoxelVector(pointVector, 1); + ptXyzTemp.z = scaleByVoxelVector(pointVector, 2); + } + + public float lookupInterpolatedVoxelValue(Point3f point) { + //ARGH!!! ONLY FOR ORTHOGONAL AXES!!!!! + //the dot product presumes axes are PERPENDICULAR. + pointVector.set(point); + setVoxelPoint(); + return getInterpolatedVoxelValue(ptXyzTemp); + } + + private float getInterpolatedVoxelValue(Point3f pt) { + int iMax; + int xDown = indexDown(pt.x, iMax = voxelCounts[0] - 1); + int xUp = xDown + (pt.x < 0 || xDown == iMax ? 0 : 1); + int yDown = indexDown(pt.y, iMax = voxelCounts[1] - 1); + int yUp = yDown + (pt.y < 0 || yDown == iMax ? 0 : 1); + int zDown = indexDown(pt.z, iMax = voxelCounts[2] - 1); + int zUp = zDown + (pt.z < 0 || zDown == iMax ? 0 : 1); + float v1 = getFractional2DValue(pt.x - xDown, pt.y - yDown, + voxelData[xDown][yDown][zDown], voxelData[xUp][yDown][zDown], + voxelData[xDown][yUp][zDown], voxelData[xUp][yUp][zDown]); + float v2 = getFractional2DValue(pt.x - xDown, pt.y - yDown, + voxelData[xDown][yDown][zUp], voxelData[xUp][yDown][zUp], + voxelData[xDown][yUp][zUp], voxelData[xUp][yUp][zUp]); + return v1 + (pt.z - zDown) * (v2 - v1); + } + + public static float getFractional2DValue(float fx, float fy, float x11, + float x12, float x21, float x22) { + float v1 = x11 + fx * (x12 - x11); + float v2 = x21 + fx * (x22 - x21); + return v1 + fy * (v2 - v1); + } + + private static int indexDown(float value, int iMax) { + if (value < 0) + return 0; + int floor = (int) value; + return (floor > iMax ? iMax : floor); + } + + void offsetCenter(Point3f center) { + Point3f pt = new Point3f(); + pt.scaleAdd((voxelCounts[0] - 1) / 2f, volumetricVectors[0], pt); + pt.scaleAdd((voxelCounts[1] - 1) / 2f, volumetricVectors[1], pt); + pt.scaleAdd((voxelCounts[2] - 1) / 2f, volumetricVectors[2], pt); + volumetricOrigin.sub(center, pt); + } + + public void setDataDistanceToPlane(Point4f plane) { + setPlaneParameters(plane); + int nx = voxelCounts[0]; + int ny = voxelCounts[1]; + int nz = voxelCounts[2]; + voxelData = new float[nx][ny][nz]; + for (int x = 0; x < nx; x++) + for (int y = 0; y < ny; y++) + for (int z = 0; z < nz; z++) + voxelData[x][y][z] = calcVoxelPlaneDistance(x, y, z); + } + + public void filterData(boolean isSquared, float invertCutoff) { + boolean doInvert = (!Float.isNaN(invertCutoff)); + int nx = voxelCounts[0]; + int ny = voxelCounts[1]; + int nz = voxelCounts[2]; + if (isSquared) + for (int x = 0; x < nx; x++) + for (int y = 0; y < ny; y++) + for (int z = 0; z < nz; z++) + voxelData[x][y][z] = voxelData[x][y][z] * voxelData[x][y][z]; + if (doInvert) + for (int x = 0; x < nx; x++) + for (int y = 0; y < ny; y++) + for (int z = 0; z < nz; z++) + voxelData[x][y][z] = invertCutoff - voxelData[x][y][z]; + } + + public void capData(Point4f plane, float cutoff) { + int nx = voxelCounts[0]; + int ny = voxelCounts[1]; + int nz = voxelCounts[2]; + Vector3f normal = new Vector3f(plane.x, plane.y, plane.z); + normal.normalize(); + float f = 1f; + for (int x = 0; x < nx; x++) + for (int y = 0; y < ny; y++) + for (int z = 0; z < nz; z++) { + float value = voxelData[x][y][z] - cutoff; + voxelPtToXYZ(x, y, z, ptXyzTemp); + float d = (ptXyzTemp.x * normal.x + ptXyzTemp.y * normal.y + ptXyzTemp.z * normal.z + plane.w - cutoff) / f; + if (d >= 0 || d > value) + voxelData[x][y][z] = d; + } + } + +} Added: trunk/Jmol/src/org/openscience/jvxl/simplewriter/VoxelDataCreator.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/VoxelDataCreator.java (rev 0) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/VoxelDataCreator.java 2009-02-06 05:36:26 UTC (rev 10620) @@ -0,0 +1,33 @@ +package org.openscience.jvxl.simplewriter; + +import javax.vecmath.Point3f; + +public class VoxelDataCreator { + + VoxelDataCreator() { + } + + /** + * Developer must customize this method + * + * @param volumeData + */ + + void createVoxelData(VolumeData volumeData) { + float[][][] voxelData = volumeData.getVoxelData(); + int[] counts = volumeData.getVoxelCounts(); + int nX = counts[0]; + int nY = counts[1]; + int nZ = counts[2]; + // whatever method here that is desired; + Point3f pt = new Point3f(); + for (int x = 0; x < nX; ++x) + for (int y = 0; y < nY; ++y) + for (int z = 0; z < nZ; ++z) { + volumeData.voxelPtToXYZ(x, y, z, pt); + // for instance... + voxelData[x][y][z] = pt.x * pt.x + pt.y * pt.y - pt.z * pt.z; + } + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-02-06 18:35:53
|
Revision: 10622 http://jmol.svn.sourceforge.net/jmol/?rev=10622&view=rev Author: hansonr Date: 2009-02-06 18:35:48 +0000 (Fri, 06 Feb 2009) Log Message: ----------- version=11.7.25_dev jvxl update # bug fix: isosurface plane improperly coloring nonmapped planes # code: rewritten code for JvxlReader saves nx*ny*nz*8 bytes of memory on loading JVXL files # because there is no need for voxelData = float[nx][ny][nz]. Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/VolumeDataInterface.java trunk/Jmol/src/org/jmol/jvxl/calc/MarchingCubes.java trunk/Jmol/src/org/jmol/jvxl/data/VolumeData.java trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java trunk/Jmol/src/org/jmol/jvxl/readers/VolumeFileReader.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java Modified: trunk/Jmol/src/org/jmol/api/VolumeDataInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/VolumeDataInterface.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/jmol/api/VolumeDataInterface.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -9,7 +9,7 @@ public abstract void setVoxelData(float[][][] voxelData); - public abstract void setVoxelCounts(int nPointsX, int nPointsY, int nPointsZ); + public abstract int setVoxelCounts(int nPointsX, int nPointsY, int nPointsZ); public abstract void setVolumetricVector(int i, float x, float y, float z); Modified: trunk/Jmol/src/org/jmol/jvxl/calc/MarchingCubes.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/calc/MarchingCubes.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/jmol/jvxl/calc/MarchingCubes.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -23,12 +23,15 @@ */ package org.jmol.jvxl.calc; +import java.util.BitSet; + import javax.vecmath.Point3f; import javax.vecmath.Point3i; import javax.vecmath.Vector3f; import org.jmol.jvxl.api.VertexDataServer; import org.jmol.jvxl.data.VolumeData; +//import org.jmol.util.Base64; public class MarchingCubes { @@ -50,9 +53,22 @@ private boolean isCutoffAbsolute; private int cubeCountX, cubeCountY, cubeCountZ; + private int nY, nZ; + private BitSet bsVoxels; + + /* this was an idea .... but it results in 3x the file size + + private StringBuffer maskData = new StringBuffer(); + + public String getMaskData() { + return Base64.getBase64(maskData).toString(); + } + + */ + public MarchingCubes(VertexDataServer surfaceReader, VolumeData volumeData, - boolean isContoured, int contourType, float cutoff, + BitSet bsVoxels, boolean isContoured, int contourType, float cutoff, boolean isCutoffAbsolute) { // when just creating a JVXL file all you really need are: @@ -67,11 +83,17 @@ this.cutoff = cutoff; this.isCutoffAbsolute = isCutoffAbsolute; this.contourType = contourType; - - cubeCountX = volumeData.voxelData.length - 1; - cubeCountY = volumeData.voxelData[0].length - 1; - cubeCountZ = volumeData.voxelData[0][0].length - 1; - xyCount = (cubeCountX + 1) * (cubeCountY + 1); + if (bsVoxels == null) { + cubeCountX = volumeData.voxelData.length - 1; + cubeCountY = (nY = volumeData.voxelData[0].length) - 1; + cubeCountZ = (nZ = volumeData.voxelData[0][0].length) - 1; + } else { + cubeCountX = volumeData.voxelCounts[0] - 1; + cubeCountY = (nY = volumeData.voxelCounts[1]) - 1; + cubeCountZ = (nZ = volumeData.voxelCounts[2]) - 1; + this.bsVoxels = bsVoxels; + } + yzCount = nY * nZ; // calcVoxelVertexVectors is unnecessary if just creating a JVXL file: @@ -88,15 +110,13 @@ for (int i = 8; --i >= 0;) vertexPoints[i] = new Point3i(); } - private final int[] linearOffsets = new int[8]; - int xyCount; boolean isXLowToHigh; int edgeCount; private void calcVoxelVertexVectors() { - setLinearOffsets(); //only used for associating normals + setLinearOffsets(); volumeData.setMatrix(); for (int i = 8; --i >= 0;) volumeData.transform(cubeVertexVectors[i], @@ -132,11 +152,11 @@ * -- just return 0 since you are not creating triangles * */ - + public int generateSurfaceData(boolean isXLowToHigh) { // generally ixXLowToHigh is FALSE - + this.isXLowToHigh = isXLowToHigh; // set up the set of edge points in the YZ plane @@ -144,47 +164,64 @@ // They will be initialized as -1 whenever a vertex is needed. // But if just creating a JVXL file, all you need to do // is set them to 0, not an index into any actual array. - + int[][] isoPointIndexes = new int[cubeCountY * cubeCountZ][12]; int insideCount = 0, outsideCount = 0, surfaceCount = 0; edgeCount = 0; - int x0, x1, xStep; + int x0, x1, xStep, ptStep, pt, ptX; if (isXLowToHigh) { x0 = 0; x1 = cubeCountX; xStep = 1; + ptStep = yzCount; + pt = ptX = (yzCount - 1) - nZ - 1; + // we are starting at the top corner, in the next to last + // cell on the next to last row of the first plane } else { x0 = cubeCountX - 1; x1 = -1; xStep = -1; + ptStep = -yzCount; + pt = ptX = (cubeCountX * yzCount - 1) - nZ - 1; + // we are starting at the top corner, in the next to last + // cell on the next to last row of the next to last plane(!) } - for (int x = x0; x != x1; x += xStep) { - for (int y = cubeCountY; --y >= 0;) { - for (int z = cubeCountZ; --z >= 0;) { - + for (int x = x0; x != x1; x += xStep, ptX += ptStep, pt = ptX) { + for (int y = cubeCountY; --y >= 0; pt--) { + for (int z = cubeCountZ; --z >= 0; pt--) { + // set up the list of indices that need checking - + int[] voxelPointIndexes = propagateNeighborPointIndexes(x, y, z, isoPointIndexes); - + // create the bitset mask indicating which vertices are inside. // 0xFF here means "all inside"; 0x00 means "all outside" - + int insideMask = 0; for (int i = 8; --i >= 0;) { - + // cubeVertexOffsets just gets us the specific grid point relative // to our base x,y,z cube position - - Point3i offset = cubeVertexOffsets[i]; - if (isInside( - (vertexValues[i] = volumeData.voxelData[x + offset.x][y - + offset.y][z + offset.z]), cutoff, isCutoffAbsolute)) + + boolean isInside; + if (bsVoxels == null) { + Point3i offset = cubeVertexOffsets[i]; + vertexValues[i] = volumeData.voxelData[x + offset.x][y + offset.y][z + + offset.z]; + isInside = isInside(vertexValues[i], cutoff, isCutoffAbsolute); + } else { + isInside = bsVoxels.get(pt + linearOffsets[i]); + vertexValues[i] = (isInside ? 1 : 0); + } + if (isInside) insideMask |= 1 << i; } + //maskData.append((char) insideMask); + if (insideMask == 0) { ++outsideCount; continue; @@ -194,24 +231,35 @@ continue; } ++surfaceCount; - + // This cube is straddling the cutoff. We must check all edges - + if (!processOneCubical(insideMask, voxelPointIndexes, x, y, z) || isContoured) continue; // the inside mask serves to define the triangles necessary // if just creating JVXL files, this step is unnecessary - + byte[] triangles = triangleTable2[insideMask]; for (int i = triangles.length; (i -= 4) >= 0;) surfaceReader.addTriangleCheck(voxelPointIndexes[triangles[i]], voxelPointIndexes[triangles[i + 1]], - voxelPointIndexes[triangles[i + 2]], triangles[i + 3], isCutoffAbsolute); + voxelPointIndexes[triangles[i + 2]], triangles[i + 3], + isCutoffAbsolute); } } } + + + //System.out.println("marchingCubes: " + // + maskData.length() + // + " " + // + org.jmol.jvxl.readers.JvxlReader.jvxlCompressString( + // Base64.getBase64(maskData).toString()).length()); + // this came out about 3 times the length of what we have now + // could be a hair faster, but the files size cost is high, I think + return edgeCount; } @@ -219,21 +267,6 @@ return ((max > 0 && (isAbsolute ? Math.abs(voxelValue) : voxelValue) >= max) || (max <= 0 && voxelValue <= max)); } - /* set the linear offsets for unique cell ID. Add offset to 0: z * (nX * nY) + y * nX + x */ - void setLinearOffsets() { - linearOffsets[0] = 0; - linearOffsets[1] = 1; - linearOffsets[5] = 1 + (linearOffsets[4] = (cubeCountX + 1)); - linearOffsets[6] = linearOffsets[5] + xyCount; - linearOffsets[7] = linearOffsets[4] + xyCount; - linearOffsets[3] = linearOffsets[0] + xyCount; - linearOffsets[2] = linearOffsets[1] + xyCount; - } - - public int getLinearOffset(int x, int y, int z, int offset) { - return z * (xyCount) + y * cubeCountX + y + x + linearOffsets[offset]; - } - private final int[] nullNeighbor = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; @@ -446,11 +479,38 @@ pt.add(pt0, voxelVertexVectors[vertex]); } - final static Point3i[] cubeVertexOffsets = { new Point3i(0, 0, 0), - new Point3i(1, 0, 0), new Point3i(1, 0, 1), new Point3i(0, 0, 1), - new Point3i(0, 1, 0), new Point3i(1, 1, 0), new Point3i(1, 1, 1), - new Point3i(0, 1, 1) }; + final static Point3i[] cubeVertexOffsets = { + new Point3i(0, 0, 0), //0 pt + new Point3i(1, 0, 0), //1 pt + yz + new Point3i(1, 0, 1), //2 pt + yz + 1 + new Point3i(0, 0, 1), //3 pt + 1 + new Point3i(0, 1, 0), //4 pt + z + new Point3i(1, 1, 0), //5 pt + yz + z + new Point3i(1, 1, 1), //6 pt + yz + z + 1 + new Point3i(0, 1, 1) //7 pt + z + 1 + }; + private final int[] linearOffsets = new int[8]; + int yzCount; + /* set the linear offsets for unique cell ID + * and for pointing into the inside/outside BitSet. + * Add offset to 0: x * (nY * nZ) + y * nZ + z + */ + void setLinearOffsets() { + linearOffsets[0] = 0; + linearOffsets[1] = yzCount; + linearOffsets[2] = yzCount + 1; + linearOffsets[3] = 1; + linearOffsets[4] = nZ; + linearOffsets[5] = yzCount + nZ; + linearOffsets[6] = yzCount + nZ + 1; + linearOffsets[7] = nZ + 1; + } + + public int getLinearOffset(int x, int y, int z, int offset) { + return x * yzCount + y * nZ + z + linearOffsets[offset]; + } + static Vector3f[] cubeVertexVectors = { new Vector3f(0, 0, 0), new Vector3f(1, 0, 0), new Vector3f(1, 0, 1), new Vector3f(0, 0, 1), new Vector3f(0, 1, 0), new Vector3f(1, 1, 0), new Vector3f(1, 1, 1), @@ -505,17 +565,23 @@ * pointer into an array. Perhaps that array is already filled completely; * perhaps it is being read incrementally. * - * As it is now, the JVXL data are just read into an [nX][nY][nZ] array anyway, - * so we can continue to do that with NON progressive files. + * As it is now, the JVXL data are read into a BitSet + * so we can continue to do that with NON progressive files. + * + * */ + + - private final static int edgeTypeTable[] = { 0, 2, 0, 2, 0, 2, 0, 2, 1, 1, 1, - 1 }; + private final static int edgeTypeTable[] = { + 0, 2, 0, 2, 0, 2, 0, 2, 1, 1, 1, 1 }; + // 0=along X, 1=along Y, 2=along Z - private final static byte edgeVertexes[] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, - /* 0 1 2 3 4 */ - 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; - /* 5 6 7 8 9 10 11 */ + private final static byte edgeVertexes[] = { + 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, + /*0 1 2 3 4 */ + 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; + /*5 6 7 8 9 10 11 */ private final static short insideMaskTable[] = { 0x0000, 0x0109, 0x0203, 0x030A, 0x0406, 0x050F, 0x0605, 0x070C, 0x080C, 0x0905, 0x0A0F, 0x0B06, Modified: trunk/Jmol/src/org/jmol/jvxl/data/VolumeData.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/data/VolumeData.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/jmol/jvxl/data/VolumeData.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -122,6 +122,20 @@ public class VolumeData implements VolumeDataInterface { + public final Point3f volumetricOrigin = new Point3f(); + public final float[] origin = new float[3]; + public final Vector3f[] volumetricVectors = new Vector3f[3]; + public final int[] voxelCounts = new int[3]; + public int nPoints; + public float[][][] voxelData; + public final float[] volumetricVectorLengths = new float[3]; + public final Vector3f[] unitVolumetricVectors = new Vector3f[3]; + private final Matrix3f volumetricMatrix = new Matrix3f(); + private Point4f thePlane; + private float thePlaneNormalMag; + private final Point3f ptXyzTemp = new Point3f(); + private final Vector3f pointVector = new Vector3f(); + public VolumeData() { volumetricVectors[0] = new Vector3f(); volumetricVectors[1] = new Vector3f(); @@ -131,14 +145,10 @@ unitVolumetricVectors[2] = new Vector3f(); } - public final Point3f volumetricOrigin = new Point3f(); - public void setVolumetricOrigin(float x, float y, float z) { volumetricOrigin.set(x, y, z); } - public final float[] origin = new float[3]; - public float[] getOriginFloat() { return origin; } @@ -147,28 +157,23 @@ return volumetricVectorLengths; } - public final Vector3f[] volumetricVectors = new Vector3f[3]; - public void setVolumetricVector(int i, float x, float y, float z) { volumetricVectors[i].x = x; volumetricVectors[i].y = y; volumetricVectors[i].z = z; } - public final int[] voxelCounts = new int[3]; - public int[] getVoxelCounts() { return voxelCounts; } - public void setVoxelCounts(int nPointsX, int nPointsY, int nPointsZ) { + public int setVoxelCounts(int nPointsX, int nPointsY, int nPointsZ) { voxelCounts[0] = nPointsX; voxelCounts[1] = nPointsY; voxelCounts[2] = nPointsZ; + return nPoints = nPointsX * nPointsY * nPointsZ; } - public float[][][] voxelData; - public float[][][] getVoxelData() { return voxelData; } @@ -177,11 +182,6 @@ this.voxelData = voxelData; } - public final float[] volumetricVectorLengths = new float[3]; - public final Vector3f[] unitVolumetricVectors = new Vector3f[3]; - - private final Matrix3f volumetricMatrix = new Matrix3f(); - public void setMatrix() { for (int i = 0; i < 3; i++) volumetricMatrix.setColumn(i, volumetricVectors[i]); @@ -191,16 +191,11 @@ volumetricMatrix.transform(v1, v2); } - Point4f thePlane; - private float thePlaneNormalMag; - public void setPlaneParameters(Point4f plane) { thePlane = plane; thePlaneNormalMag = (new Vector3f(plane.x, plane.y, plane.z)).length(); } - private final Point3f ptXyzTemp = new Point3f(); - public float calcVoxelPlaneDistance(int x, int y, int z) { voxelPtToXYZ(x, y, z, ptXyzTemp); return (thePlane.x * ptXyzTemp.x + thePlane.y * ptXyzTemp.y + thePlane.z @@ -229,8 +224,6 @@ origin[2] = volumetricOrigin.z; } - private final Vector3f pointVector = new Vector3f(); - private float scaleByVoxelVector(Vector3f vector, int voxelVectorIndex) { // ORTHOGONAL ONLY!!! -- required for creating planes return (vector.dot(unitVolumetricVectors[voxelVectorIndex]) / volumetricVectorLengths[voxelVectorIndex]); Modified: trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -27,6 +27,7 @@ import javax.vecmath.Vector3f; import javax.vecmath.Point4f; import java.io.BufferedReader; +import java.util.BitSet; import org.jmol.util.*; import org.jmol.jvxl.data.JvxlData; @@ -39,6 +40,8 @@ // 1.4 adds -nContours to indicate contourFromZero for MEP data mapped onto planes // 2.0 adds vertex/triangle compression when no grid is present + // Jmol 11.7.25 -- recoded so that we do not create voxelData[nx][ny][nz] and instead + // simply create a BitSet of length nx * ny * nz. This saves memory hugely. // NEVER change the numbers for these next defaults @@ -394,7 +397,7 @@ return str; } - static String jvxlCompressString(String data) { + public static String jvxlCompressString(String data) { /* just a simple compression, but allows 2000-6000:1 CUBE:JVXL for planes! * * "X~nnn " means "nnn copies of character X" @@ -409,6 +412,8 @@ int nLast = 0; for (int i = 0; i < data.length(); i++) { char ch = data.charAt(i); + if (ch == '\n' || ch == '\r') + continue; if (ch == chLast) { ++nLast; if (ch != '~') @@ -463,6 +468,37 @@ return dataOut.toString(); } + protected BitSet getVoxelBitSet(int nPoints, StringBuffer sb) throws Exception { + BitSet bs = new BitSet(); + int bsVoxelPtr = 0; + if (surfaceDataCount <= 0) + return bs; //unnecessary -- probably a plane + int nThisValue = 0; + while (bsVoxelPtr < nPoints) { + nThisValue = parseInt(); + if (nThisValue == Integer.MIN_VALUE) { + line = br.readLine(); + // note -- does not allow for empty lines; + // must be a continuous block of numbers. + if (line == null || (nThisValue = parseInt(line)) == Integer.MIN_VALUE) { + if (!endOfData) + Logger.error("end of file in JvxlReader?" + " line=" + line); + endOfData = true; + nThisValue = 10000; + //throw new NullPointerException(); + } else if (sb != null) { + sb.append(line).append('\n'); + } + } + thisInside = !thisInside; + ++jvxlNSurfaceInts; + if (thisInside) + bs.set(bsVoxelPtr, bsVoxelPtr + nThisValue); + bsVoxelPtr += nThisValue; + } + return bs; + } + protected float getNextVoxelValue(StringBuffer sb) throws Exception { //called by VolumeFileReader.readVoxelData @@ -649,10 +685,10 @@ } private void jvxlSkipDataBlock(int nPoints, boolean isInt) throws Exception { - int iV = 0; - while (iV < nPoints) { + int n = 0; + while (n < nPoints) { line = br.readLine(); - iV += (isInt ? countData(line) : jvxlUncompressString(line).length()); + n += (isInt ? countData(line) : jvxlUncompressString(line).length()); } } @@ -714,11 +750,14 @@ int dataCount = 0; int nDataPoints = 0; int nSurfaceInts = 0; + BitSet bs = new BitSet(); //TESTING for (int x = 0; x < nX; ++x) for (int y = 0; y < nY; ++y) for (int z = 0; z < nZ; ++z) { + boolean itest = isInside(voxelData[x][y][z], cutoff, isCutoffAbsolute); + if (itest)bs.set(nDataPoints); ++nDataPoints; - if (inside == isInside(voxelData[x][y][z], cutoff, isCutoffAbsolute)) { + if (inside == itest) { dataCount++; } else { if (dataCount != 0) { @@ -731,6 +770,8 @@ } sb.append(' ').append(dataCount).append('\n'); ++nSurfaceInts; + //System.out.println("JvxlReader: " + sb.length() + " " + nDataPoints); + setSurfaceInfo(jvxlData,null, nSurfaceInts, sb); return nDataPoints; } @@ -889,7 +930,7 @@ sb.append(jvxlCompressString(jvxlData.jvxlEdgeData + jvxlData.jvxlColorData)); } else { - sb.append(jvxlCompressString(jvxlData.jvxlColorData)); + sb.append(jvxlCompressString(jvxlData.jvxlColorData)).append('\n'); } int len = sb.length(); if (len > 0) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -876,6 +876,11 @@ surfaceReader.createIsosurface(true);//but don't read volume data yet if (meshDataServer != null) meshDataServer.notifySurfaceGenerationCompleted(); + if (params.dataType == Parameters.SURFACE_NOMAP) { + // just a simple plane + surfaceReader.discardTempData(true); + return; + } params.mappedDataMin = Float.MAX_VALUE; surfaceReader.readVolumeData(true); } else if (!params.colorBySets) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -253,6 +253,7 @@ protected StringBuffer fractionData; protected String jvxlEdgeDataRead = ""; protected String jvxlColorDataRead = ""; + protected BitSet jvxlVoxelBitSet; protected boolean jvxlDataIsColorMapped; protected boolean jvxlDataIsPrecisionColor; protected boolean jvxlDataIs2dContour; @@ -360,6 +361,7 @@ abstract protected void readSurfaceData(boolean isMapData) throws Exception; protected void gotoAndReadVoxelData(boolean isMapData) { + //overloaded in jvxlReader initializeVolumetricData(); if (nPointsX <= 0 || nPointsY <= 0 || nPointsZ <= 0) return; @@ -412,8 +414,8 @@ params.valueMappedToBlue); } - marchingCubes = new MarchingCubes(this, volumeData, params.isContoured, - contourType, params.cutoff, params.isCutoffAbsolute); + marchingCubes = new MarchingCubes(this, volumeData, jvxlVoxelBitSet, params.isContoured, + contourType, params.cutoff, params.isCutoffAbsolute); edgeCount = marchingCubes.generateSurfaceData(isXLowToHigh); Modified: trunk/Jmol/src/org/jmol/jvxl/readers/VolumeFileReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/VolumeFileReader.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/jmol/jvxl/readers/VolumeFileReader.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -24,6 +24,7 @@ package org.jmol.jvxl.readers; import java.io.BufferedReader; +import java.util.BitSet; import javax.vecmath.Vector3f; import org.jmol.util.Logger; @@ -169,6 +170,9 @@ * It is possible to map a QM orbital onto a plane. In the first pass we defined * the plane; in the second pass we just calculate the new voxel values and return. * + * Starting with Jmol 11.7.25, JVXL files do not create voxelData[][][] + * and instead just fill a bitset, thus saving nx*ny*nz*8 - (nx*ny*nz/32) bytes in memory + * */ next[0] = 0; @@ -181,82 +185,91 @@ } else if (isJvxl) { params.cutoff = (params.isBicolorMap || params.colorBySign ? 0.01f : 0.5f); } - voxelData = new float[nPointsX][][]; nDataPoints = 0; line = ""; StringBuffer sb = new StringBuffer(); jvxlNSurfaceInts = 0; - boolean collectData = (!isJvxl && params.thePlane == null); - int nSkipX = 0; - int nSkipY = 0; - int nSkipZ = 0; - if (isDownsampled) { - nSkipX = downsampleFactor - 1; - nSkipY = downsampleRemainders[2] + (downsampleFactor - 1) - * (nSkipZ = (nPointsZ * downsampleFactor + downsampleRemainders[2])); - nSkipZ = downsampleRemainders[1] * nSkipZ + (downsampleFactor - 1) * nSkipZ - * (nPointsY * downsampleFactor + downsampleRemainders[1]); - //System.out.println(nSkipX + " " + nSkipY + " " + nSkipZ); - } + if (isJvxl) { + nDataPoints = volumeData.setVoxelCounts(nPointsX, nPointsY, nPointsZ); + jvxlVoxelBitSet = getVoxelBitSet(nDataPoints, sb); + voxelData = null; + } else { + voxelData = new float[nPointsX][][]; + boolean collectData = (!isJvxl && params.thePlane == null); + int nSkipX = 0; + int nSkipY = 0; + int nSkipZ = 0; + if (isDownsampled) { + nSkipX = downsampleFactor - 1; + nSkipY = downsampleRemainders[2] + + (downsampleFactor - 1) + * (nSkipZ = (nPointsZ * downsampleFactor + downsampleRemainders[2])); + nSkipZ = downsampleRemainders[1] * nSkipZ + (downsampleFactor - 1) + * nSkipZ * (nPointsY * downsampleFactor + downsampleRemainders[1]); + //System.out.println(nSkipX + " " + nSkipY + " " + nSkipZ); + } - if (isMapData || isJvxl && params.thePlane == null) { - for (int x = 0; x < nPointsX; ++x) { - float[][] plane = new float[nPointsY][]; - voxelData[x] = plane; - for (int y = 0; y < nPointsY; ++y) { - float[] strip = new float[nPointsZ]; - plane[y] = strip; - for (int z = 0; z < nPointsZ; ++z) { - strip[z] = getNextVoxelValue(sb); - ++nDataPoints; + //Note downsampling not allowed for JVXL files + + if (isMapData) { + for (int x = 0; x < nPointsX; ++x) { + float[][] plane = new float[nPointsY][]; + voxelData[x] = plane; + for (int y = 0; y < nPointsY; ++y) { + float[] strip = new float[nPointsZ]; + plane[y] = strip; + for (int z = 0; z < nPointsZ; ++z) { + strip[z] = getNextVoxelValue(sb); + ++nDataPoints; + if (isDownsampled) + skipVoxels(nSkipX); + } if (isDownsampled) - skipVoxels(nSkipX); + skipVoxels(nSkipY); } if (isDownsampled) - skipVoxels(nSkipY); + skipVoxels(nSkipZ); } - if (isDownsampled) - skipVoxels(nSkipZ); - } - } else { - float cutoff = params.cutoff; - boolean isCutoffAbsolute = params.isCutoffAbsolute; - for (int x = 0; x < nPointsX; ++x) { - float[][] plane; - plane = new float[nPointsY][]; - voxelData[x] = plane; - for (int y = 0; y < nPointsY; ++y) { - float[] strip = new float[nPointsZ]; - plane[y] = strip; - for (int z = 0; z < nPointsZ; ++z) { - float voxelValue = getNextVoxelValue(sb); - strip[z] = voxelValue; - ++nDataPoints; - if (inside == isInside(voxelValue, cutoff, isCutoffAbsolute)) { - dataCount++; - } else { - if (collectData && dataCount != 0) { - sb.append(' ').append(dataCount); - ++jvxlNSurfaceInts; + } else { + float cutoff = params.cutoff; + boolean isCutoffAbsolute = params.isCutoffAbsolute; + for (int x = 0; x < nPointsX; ++x) { + float[][] plane; + plane = new float[nPointsY][]; + voxelData[x] = plane; + for (int y = 0; y < nPointsY; ++y) { + float[] strip = new float[nPointsZ]; + plane[y] = strip; + for (int z = 0; z < nPointsZ; ++z) { + float voxelValue = getNextVoxelValue(sb); + strip[z] = voxelValue; + ++nDataPoints; + if (inside == isInside(voxelValue, cutoff, isCutoffAbsolute)) { + dataCount++; + } else { + if (collectData && dataCount != 0) { + sb.append(' ').append(dataCount); + ++jvxlNSurfaceInts; + } + dataCount = 1; + inside = !inside; } - dataCount = 1; - inside = !inside; + if (isDownsampled) + skipVoxels(nSkipX); } if (isDownsampled) - skipVoxels(nSkipX); + skipVoxels(nSkipY); } if (isDownsampled) - skipVoxels(nSkipY); + skipVoxels(nSkipZ); } - if (isDownsampled) - skipVoxels(nSkipZ); } + //Jvxl getNextVoxelValue records the data read on its own. + if (collectData) { + sb.append(' ').append(dataCount).append('\n'); + ++jvxlNSurfaceInts; + } } - //Jvxl getNextVoxelValue records the data read on its own. - if (collectData) { - sb.append(' ').append(dataCount).append('\n'); - ++jvxlNSurfaceInts; - } if (!isMapData) JvxlReader .setSurfaceInfo(jvxlData, params.thePlane, jvxlNSurfaceInts, sb); @@ -264,10 +277,16 @@ } private void skipVoxels(int n) throws Exception { - for (int i = n; --i >= 0; ) + // not allowed for JVXL data + for (int i = n; --i >= 0;) getNextVoxelValue(null); } + protected BitSet getVoxelBitSet(int nPoints, StringBuffer sb) throws Exception { + // jvxlReader will use this to read the surface voxel data + return null; + } + protected float getNextVoxelValue(StringBuffer sb) throws Exception { //overloaded in JvxlReader, where sb is appended to float voxelValue = 0; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-06 18:35:48 UTC (rev 10622) @@ -3,6 +3,9 @@ version=11.7.25_dev +# bug fix: isosurface plane improperly coloring nonmapped planes +# code: rewritten code for JvxlReader saves nx*ny*nz*8 bytes of memory on loading JVXL files +# because there is no need for voxelData = float[nx][ny][nz]. # new application: org.openscience.app.jvxl.simplewriter.ASimpleJvxlWriter.java # -- streamlined methods for converting CUBE data to JVXL files Modified: trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -54,6 +54,9 @@ SimpleMarchingCubes mc = new SimpleMarchingCubes(volumeData, jvxlData.cutoff, jvxlData.isCutoffAbsolute); jvxlData.jvxlEdgeData = mc.getEdgeData(); + String jvxlMaskData = mc.getMaskData(); + System.out.println(jvxlMaskData.length() + " " + + (jvxlMaskData = jvxlCompressString(jvxlMaskData)).length() + " " + jvxlData.jvxlSurfaceData.length()); jvxlData.jvxlDefinitionLine = jvxlGetDefinitionLine(jvxlData); return jvxlGetFile(jvxlData); } @@ -245,6 +248,8 @@ int nLast = 0; for (int i = 0; i < data.length(); i++) { char ch = data.charAt(i); + if (ch == '\n' || ch == '\r') + continue; if (ch == chLast) { ++nLast; if (ch != '~') Modified: trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java 2009-02-06 13:30:15 UTC (rev 10621) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java 2009-02-06 18:35:48 UTC (rev 10622) @@ -25,6 +25,8 @@ import javax.vecmath.Point3i; +import org.jmol.util.Base64; + public class SimpleMarchingCubes { /* @@ -44,8 +46,13 @@ private float cutoff; private boolean isCutoffAbsolute; private boolean isXLowToHigh; - StringBuffer fractionData = new StringBuffer(); - + private StringBuffer fractionData = new StringBuffer(); + private StringBuffer maskData = new StringBuffer(); + + public String getMaskData() { + return Base64.getBase64(maskData).toString(); + } + private int cubeCountX, cubeCountY, cubeCountZ; public SimpleMarchingCubes(VolumeData volumeData, float cutoff, @@ -150,6 +157,7 @@ insideMask |= 1 << i; } + maskData.append((char)insideMask); if (insideMask == 0) { continue; } @@ -426,10 +434,11 @@ * so we can continue to do that with NON progressive files. */ - private final static byte edgeVertexes[] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, - /* 0 1 2 3 4 */ - 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; - /* 5 6 7 8 9 10 11 */ + private final static byte edgeVertexes[] = { + 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, + /*0 1 2 3 4 */ + 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; + /*5 6 7 8 9 10 11 */ private final static short insideMaskTable[] = { 0x0000, 0x0109, 0x0203, 0x030A, 0x0406, 0x050F, 0x0605, 0x070C, 0x080C, 0x0905, 0x0A0F, 0x0B06, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-02-08 14:55:02
|
Revision: 10627 http://jmol.svn.sourceforge.net/jmol/?rev=10627&view=rev Author: hansonr Date: 2009-02-08 14:54:57 +0000 (Sun, 08 Feb 2009) Log Message: ----------- version=11.7.25_dev # code: rewritten code for ASimpleJvxlWriter allows streaming data Modified Paths: -------------- trunk/Jmol/src/org/jmol/jvxl/api/VertexDataServer.java trunk/Jmol/src/org/jmol/jvxl/calc/MarchingCubes.java trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoFxyReader.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoPlaneReader.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java trunk/Jmol/src/org/jmol/jvxl/readers/VolumeDataReader.java trunk/Jmol/src/org/jmol/jvxl/readers/VolumeFileReader.java trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/VolumeData.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/VoxelDataCreator.java Modified: trunk/Jmol/src/org/jmol/jvxl/api/VertexDataServer.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/api/VertexDataServer.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/api/VertexDataServer.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -59,15 +59,16 @@ * @param pointA * @param edgeVector vector from A to B * @param isContourType + * @param fReturn * @return new vertex index or Integer.MAX_VALUE */ - public abstract int getSurfacePointIndex(float cutoff, + public abstract int getSurfacePointIndexAndFraction(float cutoff, boolean isCutoffAbsolute, int x, int y, int z, Point3i offset, int vertexA, int vertexB, float valueA, float valueB, Point3f pointA, Vector3f edgeVector, - boolean isContourType); + boolean isContourType, float[] fReturn); /** * addVertexCopy is used by the Marching Squares algorithm to @@ -96,5 +97,16 @@ * @param isAbsolute */ public abstract void addTriangleCheck(int iA, int iB, int iC, int check, - boolean isAbsolute); + boolean isAbsolute); + + /** + * + * for readers only + * + * @param x + * @param y + * @param z + * @return value[x][y][z] + */ + public float getValue(int x, int y, int z); } Modified: trunk/Jmol/src/org/jmol/jvxl/calc/MarchingCubes.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/calc/MarchingCubes.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/calc/MarchingCubes.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -31,6 +31,8 @@ import org.jmol.jvxl.api.VertexDataServer; import org.jmol.jvxl.data.VolumeData; +import org.jmol.jvxl.readers.JvxlReader; + //import org.jmol.util.Base64; public class MarchingCubes { @@ -43,6 +45,26 @@ * * Author: Bob Hanson, ha...@st... * + * inputs: surfaceReader: interface to other methods + * volumeData, containing all information relating to origin, axes, etc. + * + * MODE_CUBE volumeData.voxelData possibly with 3D voxel data + * MODE_BITSET bsVoxels -- optional alternative, JVXL-type BitSet indicating which vertices are inside and which outside + * in order for(x 0 to nX){for(y 0 to nY){for(z 0 to nZ){}}} + * MODE_GETXYZ If BOTH voxelData and bsVoxels are null, + * then we assume we can get the voxelData on the fly + * using surfaceReader.getValue(x, y, z) + * + * surfaceReader.getSurfacePointIndex gets the actual Point3f vertex points and + * returns the fraction information. It is exported here, because the JVXL reader may use this + * as an opportunity to deliver the fractional information, thus providing the + * actual position of the vertex point on the isosurface. + * + * outputs: Point3f positions of isosurface intersections with grid via SurfaceReader.addVertex() + * Point4f triangle data via surfaceReader.addTriangleCheck() + * bsVoxels -- returned same (JVXL file data) or filled (otherwise) + * edgeData -- encoded fraction data as a string + * */ private VertexDataServer surfaceReader; @@ -51,56 +73,69 @@ private boolean isContoured; private float cutoff; private boolean isCutoffAbsolute; + private boolean isSquared; + private boolean isXLowToHigh; private int cubeCountX, cubeCountY, cubeCountZ; private int nY, nZ; private BitSet bsVoxels; - /* this was an idea .... but it results in 3x the file size + private StringBuffer edgeData = new StringBuffer(); - private StringBuffer maskData = new StringBuffer(); + public BitSet getBsVoxels() { + return bsVoxels; + } - public String getMaskData() { - return Base64.getBase64(maskData).toString(); - } + /* this was an idea .... but it results in 3x the file size + + private StringBuffer maskData = new StringBuffer(); + + public String getMaskData() { + return Base64.getBase64(maskData).toString(); + } - */ - + */ + public MarchingCubes(VertexDataServer surfaceReader, VolumeData volumeData, BitSet bsVoxels, boolean isContoured, int contourType, float cutoff, - boolean isCutoffAbsolute) { - - // when just creating a JVXL file all you really need are: + boolean isCutoffAbsolute, boolean isSquared, boolean isXLowToHigh) { + + // If just creating a JVXL file, see org.openscience.jmol.jvxl.simplewriter.SimpleMarchingCubes.java // - // volumeData.voxelData[x][y][z] - // cutoff - // - + this.surfaceReader = surfaceReader; this.volumeData = volumeData; this.isContoured = isContoured; this.cutoff = cutoff; this.isCutoffAbsolute = isCutoffAbsolute; this.contourType = contourType; - if (bsVoxels == null) { - cubeCountX = volumeData.voxelData.length - 1; - cubeCountY = (nY = volumeData.voxelData[0].length) - 1; - cubeCountZ = (nZ = volumeData.voxelData[0][0].length) - 1; + this.isSquared = isSquared; + this.isXLowToHigh = isXLowToHigh; // generally ixXLowToHigh is FALSE + + cubeCountX = volumeData.voxelCounts[0] - 1; + cubeCountY = (nY = volumeData.voxelCounts[1]) - 1; + cubeCountZ = (nZ = volumeData.voxelCounts[2]) - 1; + if (volumeData.voxelData != null) { + mode = MODE_CUBE; } else { - cubeCountX = volumeData.voxelCounts[0] - 1; - cubeCountY = (nY = volumeData.voxelCounts[1]) - 1; - cubeCountZ = (nZ = volumeData.voxelCounts[2]) - 1; + mode = (bsVoxels == null ? MODE_GETXYZ : MODE_BITSET); this.bsVoxels = bsVoxels; } yzCount = nY * nZ; - + if (this.bsVoxels == null) + this.bsVoxels = new BitSet(); // calcVoxelVertexVectors is unnecessary if just creating a JVXL file: - + calcVoxelVertexVectors(); } - public final Vector3f[] voxelVertexVectors = new Vector3f[8]; + private int mode; + private final static int MODE_CUBE = 1; + private final static int MODE_BITSET = 2; + private final static int MODE_GETXYZ = 3; + + private final Vector3f[] voxelVertexVectors = new Vector3f[8]; private final float[] vertexValues = new float[8]; private final Point3i[] vertexPoints = new Point3i[8]; private final Vector3f[] edgeVectors = new Vector3f[12]; @@ -111,12 +146,10 @@ vertexPoints[i] = new Point3i(); } - boolean isXLowToHigh; int edgeCount; - private void calcVoxelVertexVectors() { - setLinearOffsets(); + setLinearOffsets(); volumeData.setMatrix(); for (int i = 8; --i >= 0;) volumeData.transform(cubeVertexVectors[i], @@ -125,48 +158,43 @@ edgeVectors[i].sub(voxelVertexVectors[edgeVertexes[i + i + 1]], voxelVertexVectors[edgeVertexes[i + i]]); } - - - /* Note to Jason from Bob: + + /* see also org.openscience.jmol.jvxl.simplewriter.SimpleMarchingCubes.java + * for a streamlined version of this method that does simple writing + * of JVXL files from cube data. * - * To just create a JVXL file, you need these five methods. - * Their output is the fractionData string buffer and the - * number of surface points - * - * inputs required: - * - * 1) volumeData.voxelData[x][y][z] - * 2) cutoff - * 3) values created in MarchingCubes constructor - * - * The first four methods are in org.jmol.jvxl.calc.MarchingCubes.java - * - * generateSurfaceData -- isXLowToHigh false; isContoured false - * -- triangle stuff at end not needed - * propagateNeighborPointIndexes -- EXACTLY as is, no changes allowed - * isInside -- EXACTLY as is -- defines what "inside" means - * processOneCubical -- EXACTLY as is, no changes at all - * SurfaceReader.getSurfacePointIndex -- your job - * -- receives the point value data and positions - * -- responsible for creating the fractionData character buffer - * -- just return 0 since you are not creating triangles - * */ - public int generateSurfaceData(boolean isXLowToHigh) { + private static int[] xyPlanePts = new int[] { 0, 1, 1, 0, 0, 1, 1, 0 }; - // generally ixXLowToHigh is FALSE + public String getEdgeData() { - this.isXLowToHigh = isXLowToHigh; - + /* The Marching Cubes code creates a (nY-1)(nZ-1)(12) array + * to track all 12 edges of a full slice of cubes. I don't think that is + * necessary -- really each vertex is associated with at most three + * edges. We should be able to do this with an (nY)(nZ)(3) array. + * + * For now, I've left it as is. + * + * The changes introduced here But the other aspect of this is that + * we really only need (nY)(nZ)(2) points ever. So we now allow for the + * method to query another method to + */ + + + /* isoPointIndexes // set up the set of edge points in the YZ plane // these are indexes into an array of Point3f values // They will be initialized as -1 whenever a vertex is needed. // But if just creating a JVXL file, all you need to do // is set them to 0, not an index into any actual array. + * + */ int[][] isoPointIndexes = new int[cubeCountY * cubeCountZ][12]; + float[][] xyPlanes = (mode == MODE_GETXYZ ? new float[2][yzCount] : null); + int insideCount = 0, outsideCount = 0, surfaceCount = 0; edgeCount = 0; @@ -188,14 +216,21 @@ // we are starting at the top corner, in the next to last // cell on the next to last row of the next to last plane(!) } - for (int x = x0; x != x1; x += xStep, ptX += ptStep, pt = ptX) { + int cellIndex0 = cubeCountY * cubeCountZ - 1; + int cellIndex = cellIndex0; + for (int x = x0; x != x1; x += xStep, ptX += ptStep, pt = ptX, cellIndex = cellIndex0) { + if (mode == MODE_GETXYZ) { + float[] plane = xyPlanes[0]; + xyPlanes[0] = xyPlanes[1]; + xyPlanes[1] = plane; + } for (int y = cubeCountY; --y >= 0; pt--) { - for (int z = cubeCountZ; --z >= 0; pt--) { + for (int z = cubeCountZ; --z >= 0; pt--, cellIndex--) { // set up the list of indices that need checking int[] voxelPointIndexes = propagateNeighborPointIndexes(x, y, z, - isoPointIndexes); + isoPointIndexes, cellIndex); // create the bitset mask indicating which vertices are inside. // 0xFF here means "all inside"; 0x00 means "all outside" @@ -207,17 +242,30 @@ // to our base x,y,z cube position boolean isInside; - if (bsVoxels == null) { - Point3i offset = cubeVertexOffsets[i]; + Point3i offset = cubeVertexOffsets[i]; + int pti = pt + linearOffsets[i]; + switch (mode) { + case MODE_GETXYZ: + vertexValues[i] = getValue(i, x + offset.x, y + offset.y, z + + offset.z, pti, xyPlanes[xyPlanePts[i]]); + isInside = bsVoxels.get(pti); + break; + case MODE_BITSET: + isInside = bsVoxels.get(pti); + vertexValues[i] = (isInside ? 1 : 0); + break; + default: + case MODE_CUBE: vertexValues[i] = volumeData.voxelData[x + offset.x][y + offset.y][z + offset.z]; + if (isSquared) + vertexValues[i] *= vertexValues[i]; isInside = isInside(vertexValues[i], cutoff, isCutoffAbsolute); - } else { - isInside = bsVoxels.get(pt + linearOffsets[i]); - vertexValues[i] = (isInside ? 1 : 0); + bsVoxels.set(pti); } - if (isInside) + if (isInside) { insideMask |= 1 << i; + } } //maskData.append((char) insideMask); @@ -234,6 +282,7 @@ // This cube is straddling the cutoff. We must check all edges + //System.out.print( " pt=" + pt + " "); if (!processOneCubical(insideMask, voxelPointIndexes, x, y, z) || isContoured) continue; @@ -251,7 +300,6 @@ } } - //System.out.println("marchingCubes: " // + maskData.length() // + " " @@ -259,10 +307,25 @@ // Base64.getBase64(maskData).toString()).length()); // this came out about 3 times the length of what we have now // could be a hair faster, but the files size cost is high, I think - - return edgeCount; + + return edgeData.toString(); } - + + private BitSet bsValues = new BitSet(); + + private float getValue(int i, int x, int y, int z, int pt, float[] tempValues) { + if (bsValues.get(pt)) + return tempValues[pt % yzCount]; + bsValues.set(pt); + float value = surfaceReader.getValue(x, y, z); + if (isSquared) + value *= value; + tempValues[pt % yzCount] = value; + if (isInside(value, cutoff, isCutoffAbsolute)) + bsVoxels.set(pt); + return value; + } + public static boolean isInside(float voxelValue, float max, boolean isAbsolute) { return ((max > 0 && (isAbsolute ? Math.abs(voxelValue) : voxelValue) >= max) || (max <= 0 && voxelValue <= max)); } @@ -271,7 +334,8 @@ -1, -1 }; private int[] propagateNeighborPointIndexes(int x, int y, int z, - int[][] isoPointIndexes) { + int[][] isoPointIndexes, + int cellIndex) { /* Y * 4 --------4--------- 5 * /| /| @@ -329,169 +393,153 @@ * * */ - + /* DO NOT EVER CHANGE THIS */ - - int cellIndex = y * cubeCountZ + z; + + //int cellIndex = y * cubeCountZ + z; int[] voxelPointIndexes = isoPointIndexes[cellIndex]; - boolean noXNeighbor = (x == cubeCountX - 1); + boolean noYNeighbor = (y == cubeCountY - 1); + int[] yNeighbor = noYNeighbor ? nullNeighbor + : isoPointIndexes[cellIndex + cubeCountZ]; + boolean noZNeighbor = (z == cubeCountZ - 1); + int[] zNeighbor = noZNeighbor ? nullNeighbor + : isoPointIndexes[cellIndex + 1]; + voxelPointIndexes[0] = -1; + voxelPointIndexes[2] = zNeighbor[0]; + voxelPointIndexes[4] = yNeighbor[0]; + voxelPointIndexes[6] = (noYNeighbor ? zNeighbor[4] : yNeighbor[2]); + if (isXLowToHigh) { // reading x from low to high - if (noXNeighbor) { + if (x == 0) { voxelPointIndexes[3] = -1; voxelPointIndexes[8] = -1; - voxelPointIndexes[7] = -1; - voxelPointIndexes[11] = -1; + voxelPointIndexes[7] = yNeighbor[3]; + voxelPointIndexes[11] = zNeighbor[8]; } else { voxelPointIndexes[3] = voxelPointIndexes[1]; voxelPointIndexes[7] = voxelPointIndexes[5]; voxelPointIndexes[8] = voxelPointIndexes[9]; voxelPointIndexes[11] = voxelPointIndexes[10]; } + voxelPointIndexes[1] = -1; + voxelPointIndexes[5] = yNeighbor[1]; + voxelPointIndexes[9] = -1; + voxelPointIndexes[10] = zNeighbor[9]; } else { // reading x from high to low - if (noXNeighbor) { - // the x neighbor is myself from my last pass through here + if (x == cubeCountX - 1) { voxelPointIndexes[1] = -1; + voxelPointIndexes[5] = yNeighbor[1]; voxelPointIndexes[9] = -1; - voxelPointIndexes[5] = -1; - voxelPointIndexes[10] = -1; + voxelPointIndexes[10] = zNeighbor[9]; } else { voxelPointIndexes[1] = voxelPointIndexes[3]; voxelPointIndexes[5] = voxelPointIndexes[7]; voxelPointIndexes[9] = voxelPointIndexes[8]; voxelPointIndexes[10] = voxelPointIndexes[11]; } - } - //from the y neighbor pick up the top - boolean noYNeighbor = (y == cubeCountY - 1); - int[] yNeighbor = noYNeighbor ? nullNeighbor : isoPointIndexes[cellIndex - + cubeCountZ]; - - voxelPointIndexes[4] = yNeighbor[0]; - voxelPointIndexes[6] = yNeighbor[2]; - - if (isXLowToHigh) { - voxelPointIndexes[5] = yNeighbor[1]; - if (noXNeighbor) - voxelPointIndexes[7] = yNeighbor[3]; - } else { + voxelPointIndexes[3] = -1; voxelPointIndexes[7] = yNeighbor[3]; - if (noXNeighbor) - voxelPointIndexes[5] = yNeighbor[1]; + voxelPointIndexes[8] = -1; + voxelPointIndexes[11] = zNeighbor[8]; } - // from my z neighbor - boolean noZNeighbor = (z == cubeCountZ - 1); - int[] zNeighbor = noZNeighbor ? nullNeighbor - : isoPointIndexes[cellIndex + 1]; - voxelPointIndexes[2] = zNeighbor[0]; - if (noYNeighbor) - voxelPointIndexes[6] = zNeighbor[4]; - if (isXLowToHigh) { - if (noXNeighbor) - voxelPointIndexes[11] = zNeighbor[8]; - voxelPointIndexes[10] = zNeighbor[9]; - } else { - if (noXNeighbor) - voxelPointIndexes[10] = zNeighbor[9]; - voxelPointIndexes[11] = zNeighbor[8]; - } - // these must always be calculated - voxelPointIndexes[0] = -1; - if (isXLowToHigh) { - voxelPointIndexes[1] = -1; - voxelPointIndexes[9] = -1; - } else { - voxelPointIndexes[3] = -1; - voxelPointIndexes[8] = -1; - } return voxelPointIndexes; } private final Point3f pt0 = new Point3f(); private final Point3f pointA = new Point3f(); - + + private static final int[] Pwr2 = new int[] { 1, 2, 4, 8, 16, 32, 64, 128, + 256, 512, 1024, 2048 }; + private boolean processOneCubical(int insideMask, int[] voxelPointIndexes, int x, int y, int z) { - + // the key to the algorithm is that we have a catalog that // maps the inside-vertex mask to an edge mask. - + int edgeMask = insideMaskTable[insideMask]; boolean isNaN = false; for (int iEdge = 12; --iEdge >= 0;) { - + // bit set to one means it's a relevant edge - - if ((edgeMask & (1 << iEdge)) == 0) + + if ((edgeMask & Pwr2[iEdge]) == 0) continue; - + // if we have a point already, we don't need to check this edge. // for triangles, this will be an index into an array; // for just creating JVXL files, this can just be 0 - + if (voxelPointIndexes[iEdge] >= 0) continue; // propagated from neighbor - + // here's an edge that has to be checked. - + ++edgeCount; - + // get the vertex numbers 0 - 7 - - int vertexA = edgeVertexes[2 * iEdge]; - int vertexB = edgeVertexes[2 * iEdge + 1]; - + + int vertexA = edgeVertexes[iEdge << 1]; + int vertexB = edgeVertexes[(iEdge << 1) + 1]; + // pick up the actual value at each vertex // this array of 8 values is updated as we go. - + float valueA = vertexValues[vertexA]; float valueB = vertexValues[vertexB]; - + // we allow for NaN values -- missing triangles - + if (Float.isNaN(valueA) || Float.isNaN(valueB)) isNaN = true; - + // the exact point position -- not important for just // creating the JVXL file. In that case, all you // need are the two values valueA and valueB and the cutoff. // from those you can define the fractional offset - + volumeData.voxelPtToXYZ(x, y, z, pt0); pointA.add(pt0, voxelVertexVectors[vertexA]); - + // here is where we get the value and assign the point for that edge // it is where the JVXL surface data line is appended + + //System.out.print("edge" + iEdge); + voxelPointIndexes[iEdge] = surfaceReader.getSurfacePointIndexAndFraction(cutoff, + isCutoffAbsolute, x, y, z, cubeVertexOffsets[vertexA], vertexA, + vertexB, valueA, valueB, pointA, edgeVectors[iEdge], + edgeTypeTable[iEdge] == contourType, fReturn); - voxelPointIndexes[iEdge] = surfaceReader.getSurfacePointIndex( - cutoff, isCutoffAbsolute, x, y, z, cubeVertexOffsets[vertexA], - vertexA, vertexB, valueA, valueB, pointA, edgeVectors[iEdge], - edgeTypeTable[iEdge] == contourType); + edgeData.append(JvxlReader.jvxlFractionAsCharacter(fReturn[0])); } + //System.out.println(""); return !isNaN; } + private float[] fReturn = new float[1]; + public void calcVertexPoint(int x, int y, int z, int vertex, Point3f pt) { volumeData.voxelPtToXYZ(x, y, z, pt0); pt.add(pt0, voxelVertexVectors[vertex]); } - final static Point3i[] cubeVertexOffsets = { - new Point3i(0, 0, 0), //0 pt - new Point3i(1, 0, 0), //1 pt + yz - new Point3i(1, 0, 1), //2 pt + yz + 1 - new Point3i(0, 0, 1), //3 pt + 1 - new Point3i(0, 1, 0), //4 pt + z - new Point3i(1, 1, 0), //5 pt + yz + z - new Point3i(1, 1, 1), //6 pt + yz + z + 1 - new Point3i(0, 1, 1) //7 pt + z + 1 - }; + final static Point3i[] cubeVertexOffsets = { new Point3i(0, 0, 0), //0 pt + new Point3i(1, 0, 0), //1 pt + yz + new Point3i(1, 0, 1), //2 pt + yz + 1 + new Point3i(0, 0, 1), //3 pt + 1 + new Point3i(0, 1, 0), //4 pt + z + new Point3i(1, 1, 0), //5 pt + yz + z + new Point3i(1, 1, 1), //6 pt + yz + z + 1 + new Point3i(0, 1, 1) //7 pt + z + 1 + }; private final int[] linearOffsets = new int[8]; int yzCount; + /* set the linear offsets for unique cell ID * and for pointing into the inside/outside BitSet. * Add offset to 0: x * (nY * nZ) + y * nZ + z @@ -506,17 +554,15 @@ linearOffsets[6] = yzCount + nZ + 1; linearOffsets[7] = nZ + 1; } - + public int getLinearOffset(int x, int y, int z, int offset) { return x * yzCount + y * nZ + z + linearOffsets[offset]; } - + static Vector3f[] cubeVertexVectors = { new Vector3f(0, 0, 0), new Vector3f(1, 0, 0), new Vector3f(1, 0, 1), new Vector3f(0, 0, 1), new Vector3f(0, 1, 0), new Vector3f(1, 1, 0), new Vector3f(1, 1, 1), new Vector3f(0, 1, 1) }; - - /* Y * 4 --------4--------- 5 +z --------4--------- +yz+z @@ -570,17 +616,14 @@ * * */ - - - private final static int edgeTypeTable[] = { - 0, 2, 0, 2, 0, 2, 0, 2, 1, 1, 1, 1 }; + private final static int edgeTypeTable[] = { 0, 2, 0, 2, 0, 2, 0, 2, 1, 1, 1, + 1 }; // 0=along X, 1=along Y, 2=along Z - private final static byte edgeVertexes[] = { - 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, + private final static byte edgeVertexes[] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, /*0 1 2 3 4 */ - 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; + 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 }; /*5 6 7 8 9 10 11 */ private final static short insideMaskTable[] = { 0x0000, 0x0109, 0x0203, Modified: trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -312,7 +312,9 @@ } void setValue(float value, VolumeData volumeData) { - this.value = volumeData.voxelData[voxelLocation.x][voxelLocation.y][voxelLocation.z] = value; + this.value = value; + if (volumeData.voxelData != null) + volumeData.voxelData[voxelLocation.x][voxelLocation.y][voxelLocation.z] = value; } void setPixelLocation(Point3i pt) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoFxyReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoFxyReader.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoFxyReader.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -58,7 +58,7 @@ JvxlReader.jvxlCreateHeaderWithoutTitleOrAtoms(volumeData, jvxlFileHeaderBuffer); } - protected float getValue(int x, int y, int z) { + public float getValue(int x, int y, int z) { //System.out.println("isofxyreader getValue x y z " + x + " " + y + " " + z + " zreal " + (volumeData.origin[2] + z * volumeData.volumetricVectors[2].z) + " data " + data[x][y] + " diff " + ((volumeData.origin[2] + z * volumeData.volumetricVectors[2].z)-data[x][y])); return (isPlanarMapping ? data[x][y] : data[x][y] - (volumeData.origin[2] + z * volumeData.volumetricVectors[2].z)); } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoPlaneReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoPlaneReader.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoPlaneReader.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -39,7 +39,7 @@ params.cutoff = 0; } - protected float getValue(int x, int y, int z) { + public float getValue(int x, int y, int z) { return volumeData.calcVoxelPlaneDistance(x, y, z); } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -108,7 +108,7 @@ setHeader(type + "\n"); } - protected float getValue(int x, int y, int z) { + public float getValue(int x, int y, int z) { volumeData.voxelPtToXYZ(x, y, z, ptPsi); ptPsi.sub(center); if (isEccentric) Modified: trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -468,7 +468,7 @@ return dataOut.toString(); } - protected BitSet getVoxelBitSet(int nPoints, StringBuffer sb) throws Exception { + protected BitSet getVoxelBitSet(int nPoints) throws Exception { BitSet bs = new BitSet(); int bsVoxelPtr = 0; if (surfaceDataCount <= 0) @@ -486,8 +486,6 @@ endOfData = true; nThisValue = 10000; //throw new NullPointerException(); - } else if (sb != null) { - sb.append(line).append('\n'); } } thisInside = !thisInside; @@ -526,6 +524,27 @@ return (thisInside ? 1f : 0f); } + public static void setSurfaceInfoFromBitSet(JvxlData jvxlData, BitSet bs, + Point4f thePlane) { + boolean inside = false; + int dataCount = 0; + StringBuffer sb = new StringBuffer(); + int nSurfaceInts = 0; + int nPoints = jvxlData.nPointsX * jvxlData.nPointsY * jvxlData.nPointsZ; + for (int i = 0; i < nPoints; ++i) { + if (inside == bs.get(i)) { + dataCount++; + } else { + sb.append(' ').append(dataCount); + nSurfaceInts++; + dataCount = 1; + inside = !inside; + } + } + sb.append(' ').append(dataCount).append('\n'); + setSurfaceInfo(jvxlData, thePlane, nSurfaceInts, sb); + } + protected static void setSurfaceInfo(JvxlData jvxlData, Point4f thePlane, int nSurfaceInts, StringBuffer surfaceData) { jvxlData.jvxlSurfaceData = surfaceData.toString(); if (jvxlData.jvxlSurfaceData.indexOf("--") == 0) @@ -534,14 +553,16 @@ jvxlData.nSurfaceInts = nSurfaceInts; } - protected float readSurfacePoint(float cutoff, boolean isCutoffAbsolute, float valueA, + protected float getSurfacePointAndFraction(float cutoff, boolean isCutoffAbsolute, float valueA, float valueB, Point3f pointA, Vector3f edgeVector, float[] fReturn, Point3f ptReturn) { if (edgeDataCount <= 0) - return super.readSurfacePoint(cutoff, isCutoffAbsolute, valueA, valueB, + return super.getSurfacePointAndFraction(cutoff, isCutoffAbsolute, valueA, valueB, pointA, edgeVector, fReturn, ptReturn); ptReturn.scaleAdd(fReturn[0] = jvxlGetNextFraction(edgeFractionBase, edgeFractionRange, 0.5f), edgeVector, pointA); + //System.out.println(" jvxl: f=" + fReturn[0]); + return fReturn[0]; } @@ -551,12 +572,9 @@ private float jvxlGetNextFraction(int base, int range, float fracOffset) { if (fractionPtr >= strFractionTemp.length()) { if (!endOfData) - Logger.error("end of file reading compressed fraction data at point " - + fractionData.length()); + Logger.error("end of file reading compressed fraction data"); endOfData = true; strFractionTemp = "" + (char) base; - fractionData.append(strFractionTemp); - fractionData.append('\n'); fractionPtr = 0; } return jvxlFractionFromCharacter(strFractionTemp.charAt(fractionPtr++), @@ -571,7 +589,6 @@ int vertexCount = jvxlData.vertexCount = meshData.vertexCount; short[] colixes = meshData.vertexColixes; float[] vertexValues = meshData.vertexValues; - fractionData = new StringBuffer(); strFractionTemp = (isJvxl ? jvxlColorDataRead : ""); if (isJvxl && strFractionTemp.length() == 0) { Logger @@ -744,38 +761,6 @@ .append(pt.z).append(" //BOGUS He ATOM ADDED FOR JVXL FORMAT\n"); } - public static int jvxlCreateSurfaceData(JvxlData jvxlData, float[][][] voxelData, float cutoff, boolean isCutoffAbsolute, int nX, int nY, int nZ) { - StringBuffer sb = new StringBuffer(); - boolean inside = false; - int dataCount = 0; - int nDataPoints = 0; - int nSurfaceInts = 0; - BitSet bs = new BitSet(); //TESTING - for (int x = 0; x < nX; ++x) - for (int y = 0; y < nY; ++y) - for (int z = 0; z < nZ; ++z) { - boolean itest = isInside(voxelData[x][y][z], cutoff, isCutoffAbsolute); - if (itest)bs.set(nDataPoints); - ++nDataPoints; - if (inside == itest) { - dataCount++; - } else { - if (dataCount != 0) { - sb.append(' ').append(dataCount); - ++nSurfaceInts; - } - dataCount = 1; - inside = !inside; - } - } - sb.append(' ').append(dataCount).append('\n'); - ++nSurfaceInts; - //System.out.println("JvxlReader: " + sb.length() + " " + nDataPoints); - - setSurfaceInfo(jvxlData,null, nSurfaceInts, sb); - return nDataPoints; - } - public static String jvxlGetDefinitionLine(JvxlData jvxlData, boolean isInfo) { String definitionLine = jvxlData.cutoff + " "; @@ -972,6 +957,7 @@ return 0.999999f; //if (logCompression) //Logger.info("ffc: " + fraction + " <-- " + ich + " " + (char) ich); + //System.out.println("ffc: " + fraction + " <-- " + ich + " " + (char) ich); return fraction; } @@ -1002,6 +988,10 @@ return jvxlFractionAsCharacter(fraction, base, range); } + public static char jvxlFractionAsCharacter(float fraction) { + return jvxlFractionAsCharacter(fraction, defaultEdgeFractionBase, defaultEdgeFractionRange); + } + protected static char jvxlFractionAsCharacter(float fraction, int base, int range) { if (fraction > 0.9999f) fraction = 0.9999f; @@ -1475,5 +1465,5 @@ private static void setNext(String data, String what, int[] next, int offset) { next[0] = data.indexOf(what, next[0]) + what.length() + offset; } - + } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -183,6 +183,7 @@ protected MeshData meshData; protected JvxlData jvxlData; protected VolumeData volumeData; + private String edgeData; protected boolean isProgressive = false; protected boolean isXLowToHigh = false; //can be overridden in some readers by --progressive @@ -226,6 +227,7 @@ voxelCounts = v.voxelCounts; voxelData = v.voxelData; volumeData = v; + /* if (mustCalcPoint) v.setDataSource(this); */ } @@ -292,7 +294,7 @@ jvxlData.pointsPerAngstrom = 1f/volumeData.volumetricVectorLengths[0]; jvxlData.jvxlColorData = ""; jvxlData.jvxlPlane = params.thePlane; - jvxlData.jvxlEdgeData = fractionData.toString(); + jvxlData.jvxlEdgeData = edgeData; jvxlData.isBicolorMap = params.isBicolorMap; jvxlData.isContoured = params.isContoured; jvxlData.nContours = (params.contourFromZero @@ -390,22 +392,26 @@ protected MarchingSquares marchingSquares; private MarchingCubes marchingCubes; + public float getValue(int x, int y, int z) { + return volumeData.voxelData[x][y][z]; + } + private void generateSurfaceData() { - fractionData = new StringBuffer(); + edgeData = ""; if (vertexDataOnly) { try { readSurfaceData(false); } catch (Exception e) { e.printStackTrace(); - Logger.error("Exception in SurfaceReader::readSurfaceData: " + e.getMessage()); + Logger.error("Exception in SurfaceReader::readSurfaceData: " + + e.getMessage()); } return; } contourVertexCount = 0; int contourType = -1; marchingSquares = null; - if (params.isSquared) - volumeData.filterData(params.isSquared, Float.NaN); + if (params.thePlane != null || params.isContoured) { marchingSquares = new MarchingSquares(this, volumeData, params.thePlane, params.nContours, params.thisContour, params.contourFromZero); @@ -413,34 +419,27 @@ marchingSquares.setMinMax(params.valueMappedToRed, params.valueMappedToBlue); } - - marchingCubes = new MarchingCubes(this, volumeData, jvxlVoxelBitSet, params.isContoured, - contourType, params.cutoff, params.isCutoffAbsolute); - - edgeCount = marchingCubes.generateSurfaceData(isXLowToHigh); - + marchingCubes = new MarchingCubes(this, volumeData, jvxlVoxelBitSet, + params.isContoured, contourType, params.cutoff, + params.isCutoffAbsolute, params.isSquared, isXLowToHigh); + edgeData = marchingCubes.getEdgeData(); + if (volumeData.voxelData == null) + JvxlReader.setSurfaceInfoFromBitSet(jvxlData, + marchingCubes.getBsVoxels(), params.thePlane); if (isJvxl) - fractionData = new StringBuffer(jvxlEdgeDataRead); - fractionData.append('\n'); + edgeData = jvxlEdgeDataRead; } - protected static boolean isInside(float voxelValue, float max, - boolean isAbsolute) { - return MarchingCubes.isInside(voxelValue, max, isAbsolute); - } - ///////////////// MarchingReader Interface Methods /////////////////// protected final Point3f ptTemp = new Point3f(); - final float[] fReturn = new float[1]; - - public int getSurfacePointIndex(float cutoff, boolean isCutoffAbsolute, + public int getSurfacePointIndexAndFraction(float cutoff, boolean isCutoffAbsolute, int x, int y, int z, Point3i offset, int vA, int vB, float valueA, float valueB, Point3f pointA, Vector3f edgeVector, - boolean isContourType) { - float thisValue = readSurfacePoint(cutoff, isCutoffAbsolute, valueA, + boolean isContourType, float[] fReturn) { + float thisValue = getSurfacePointAndFraction(cutoff, isCutoffAbsolute, valueA, valueB, pointA, edgeVector, fReturn, ptTemp); /* * from MarchingCubes @@ -460,7 +459,7 @@ : MarchingSquares.CONTOUR_POINT); if (assocVertex >= 0) assocVertex = marchingCubes.getLinearOffset(x, y, z, assocVertex); - int iV = addVertexCopy(ptTemp, thisValue, assocVertex); + int n = addVertexCopy(ptTemp, thisValue, assocVertex); if (params.iAddGridPoints) { marchingCubes.calcVertexPoint(x, y, z, vB, ptTemp); addVertexCopy(valueA < valueB ? pointA : ptTemp, Float.NaN, @@ -468,17 +467,16 @@ addVertexCopy(valueA < valueB ? ptTemp : pointA, Float.NaN, MarchingSquares.EDGE_POINT); } - return iV; + return n; } - protected float readSurfacePoint(float cutoff, boolean isCutoffAbsolute, + protected float getSurfacePointAndFraction(float cutoff, boolean isCutoffAbsolute, float valueA, float valueB, Point3f pointA, - Vector3f edgeVector, - float[] fReturn, Point3f ptReturn) { + Vector3f edgeVector, float[] fReturn, + Point3f ptReturn) { //JvxlReader may or may not call this - float diff = valueB - valueA; float fraction = (cutoff - valueA) / diff; if (isCutoffAbsolute && (fraction < 0 || fraction > 1)) @@ -490,10 +488,6 @@ fraction = Float.NaN; } fReturn[0] = fraction; - if (!isJvxl) - fractionData.append(JvxlReader.jvxlFractionAsCharacter(fraction, - edgeFractionBase, edgeFractionRange)); - ptReturn.scaleAdd(fraction, edgeVector, pointA); //System.out.println("SurfaceReader " + ptReturn + " " + (valueA + fraction * diff)); return valueA + fraction * diff; @@ -793,7 +787,4 @@ meshDataServer.fillMeshData(meshData, MeshData.MODE_PUT_SETS); } - public void getCalcPoint(Point3f pt) { - // for VertexDataServer - isoShapeReader only - } } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/VolumeDataReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/VolumeDataReader.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/readers/VolumeDataReader.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -104,46 +104,22 @@ protected void readVoxelDataIndividually(boolean isMapData) throws Exception { if (isMapData && !allowMapData) return; //not applicable - boolean inside = false; - int dataCount = 0; - voxelData = new float[nPointsX][nPointsY][nPointsZ]; - nDataPoints = 0; - int nSurfaceInts = 0; - StringBuffer sb = new StringBuffer(); - float cutoff = params.cutoff; - boolean isCutoffAbsolute = params.isCutoffAbsolute; + voxelData = (isMapData ? new float[nPointsX][nPointsY][nPointsZ] : null); + volumeData.setVoxelData(voxelData); + if (!isMapData) + return; for (int x = 0; x < nPointsX; ++x) { float[][] plane = new float[nPointsY][]; voxelData[x] = plane; for (int y = 0; y < nPointsY; ++y) { float[] strip = plane[y] = new float[nPointsZ]; for (int z = 0; z < nPointsZ; ++z) { - float voxelValue = strip[z] = getValue(x, y, z); - ++nDataPoints; - if (inside == isInside(voxelValue, cutoff, isCutoffAbsolute)) { - dataCount++; - } else { - if (!isMapData) - sb.append(' ').append(dataCount); - ++nSurfaceInts; - dataCount = 1; - inside = !inside; - } + strip[z] = getValue(x, y, z); } } } - //Jvxl getNextVoxelValue records the data read on its own. - if (!isMapData) { - sb.append(' ').append(dataCount).append('\n'); - JvxlReader.setSurfaceInfo(jvxlData, params.thePlane, nSurfaceInts, sb); - } - volumeData.setVoxelData(voxelData); } - protected float getValue(int x, int y, int z) { - return 0; - } - protected int setVoxelRange(int index, float min, float max, float ptsPerAngstrom, int gridMax) { if (min >= max) { @@ -196,14 +172,10 @@ protected void readSurfaceData(boolean isMapData) throws Exception { //precalculated -- just creating the JVXL equivalent - if (!precalculateVoxelData) { + if (precalculateVoxelData) + generateCube(); + else readVoxelDataIndividually(isMapData); - return; - } - generateCube(); - if (isMapData) - return; - nDataPoints = JvxlReader.jvxlCreateSurfaceData(jvxlData, volumeData.voxelData, params.cutoff, params.isCutoffAbsolute, nPointsX, nPointsY, nPointsZ); } protected void generateCube() { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/VolumeFileReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/VolumeFileReader.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/jvxl/readers/VolumeFileReader.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -176,10 +176,8 @@ */ next[0] = 0; - boolean inside = false; int downsampleFactor = params.downsampleFactor; boolean isDownsampled = canDownsample && (downsampleFactor > 0); - int dataCount = 0; if (params.thePlane != null) { params.cutoff = 0f; } else if (isJvxl) { @@ -187,15 +185,13 @@ } nDataPoints = 0; line = ""; - StringBuffer sb = new StringBuffer(); jvxlNSurfaceInts = 0; if (isJvxl) { nDataPoints = volumeData.setVoxelCounts(nPointsX, nPointsY, nPointsZ); - jvxlVoxelBitSet = getVoxelBitSet(nDataPoints, sb); + jvxlVoxelBitSet = getVoxelBitSet(nDataPoints); voxelData = null; } else { voxelData = new float[nPointsX][][]; - boolean collectData = (!isJvxl && params.thePlane == null); int nSkipX = 0; int nSkipY = 0; int nSkipZ = 0; @@ -211,83 +207,40 @@ //Note downsampling not allowed for JVXL files - if (isMapData) { - for (int x = 0; x < nPointsX; ++x) { - float[][] plane = new float[nPointsY][]; - voxelData[x] = plane; - for (int y = 0; y < nPointsY; ++y) { - float[] strip = new float[nPointsZ]; - plane[y] = strip; - for (int z = 0; z < nPointsZ; ++z) { - strip[z] = getNextVoxelValue(sb); - ++nDataPoints; - if (isDownsampled) - skipVoxels(nSkipX); - } + for (int x = 0; x < nPointsX; ++x) { + float[][] plane = new float[nPointsY][]; + voxelData[x] = plane; + for (int y = 0; y < nPointsY; ++y) { + float[] strip = new float[nPointsZ]; + plane[y] = strip; + for (int z = 0; z < nPointsZ; ++z) { + strip[z] = getNextVoxelValue(); if (isDownsampled) - skipVoxels(nSkipY); + skipVoxels(nSkipX); } if (isDownsampled) - skipVoxels(nSkipZ); + skipVoxels(nSkipY); } - } else { - float cutoff = params.cutoff; - boolean isCutoffAbsolute = params.isCutoffAbsolute; - for (int x = 0; x < nPointsX; ++x) { - float[][] plane; - plane = new float[nPointsY][]; - voxelData[x] = plane; - for (int y = 0; y < nPointsY; ++y) { - float[] strip = new float[nPointsZ]; - plane[y] = strip; - for (int z = 0; z < nPointsZ; ++z) { - float voxelValue = getNextVoxelValue(sb); - strip[z] = voxelValue; - ++nDataPoints; - if (inside == isInside(voxelValue, cutoff, isCutoffAbsolute)) { - dataCount++; - } else { - if (collectData && dataCount != 0) { - sb.append(' ').append(dataCount); - ++jvxlNSurfaceInts; - } - dataCount = 1; - inside = !inside; - } - if (isDownsampled) - skipVoxels(nSkipX); - } - if (isDownsampled) - skipVoxels(nSkipY); - } - if (isDownsampled) - skipVoxels(nSkipZ); - } + if (isDownsampled) + skipVoxels(nSkipZ); } //Jvxl getNextVoxelValue records the data read on its own. - if (collectData) { - sb.append(' ').append(dataCount).append('\n'); - ++jvxlNSurfaceInts; - } } - if (!isMapData) - JvxlReader - .setSurfaceInfo(jvxlData, params.thePlane, jvxlNSurfaceInts, sb); volumeData.setVoxelData(voxelData); } private void skipVoxels(int n) throws Exception { // not allowed for JVXL data for (int i = n; --i >= 0;) - getNextVoxelValue(null); + getNextVoxelValue(); } - protected BitSet getVoxelBitSet(int nPoints, StringBuffer sb) throws Exception { + protected BitSet getVoxelBitSet(int nPoints) throws Exception { // jvxlReader will use this to read the surface voxel data return null; } - protected float getNextVoxelValue(StringBuffer sb) throws Exception { + protected float getNextVoxelValue() throws Exception { //overloaded in JvxlReader, where sb is appended to float voxelValue = 0; if (nSurfaces > 1 && !params.blockCubeData) { Modified: trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -733,11 +733,11 @@ ///////////// VertexDataServer interface methods //////////////// - public int getSurfacePointIndex(float cutoff, boolean isCutoffAbsolute, + public int getSurfacePointIndexAndFraction(float cutoff, boolean isCutoffAbsolute, int x, int y, int z, Point3i offset, int vA, int vB, float valueA, float valueB, Point3f pointA, Vector3f edgeVector, - boolean isContourType) { + boolean isContourType, float[] fReturn) { return 0; } @@ -752,6 +752,7 @@ boolean isAbsolute) { if (isAbsolute && !MeshData.checkCutoff(iA, iB, iC, thisMesh.vertexValues)) return; + //System.out.println(" isosurface triangle check : " + iA + " " + iB + " " + iC); thisMesh.addTriangleCheck(iA, iB, iC, check); } @@ -844,4 +845,8 @@ String colors = viewer.getColorSchemeList(schemeName, false); return "\"" + (colors.length() == 0 ? schemeName : colors) + "\""; } + + public float getValue(int x, int y, int z) { + return 0; + } } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-08 14:54:57 UTC (rev 10627) @@ -3,6 +3,8 @@ version=11.7.25_dev +# code: rewritten code for ASimpleJvxlWriter allows streaming data +# code: rewritten code for Marching Cubes no longer requires 3D array of data # new feature: CTRL-K toggles keystrokes with display; ALT-K or CTRL_ALT_K same without display # color of frank displays condition -- blue (unsigned) or orange (signed) indicates keystrokes enabled # bug fix: PDB load filter broken for ANISOU Modified: trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -37,32 +37,61 @@ public static void main(String[] args) { - VolumeData volumeData = new VolumeData(); // parameters that need setting: String outputFile = "c:/temp/simple.jvxl"; - float cutoff = 0.0f; + float cutoff = 0.01f; boolean isCutoffAbsolute = false; - int nX = 10; - int nY = 10; - int nZ = 10; + int nX = 30; + int nY = 30; + int nZ = 30; + String title = "created by SimpleJvxlWriter " + + new SimpleDateFormat("yyyy-MM-dd', 'HH:mm").format(new Date()) + + "\naddional comment line\n"; + + VolumeData volumeData; + VoxelDataCreator vdc; + JvxlData jvxlData; + + volumeData = new VolumeData(); volumeData.setVolumetricOrigin(0, 0, 0); volumeData.setVolumetricVector(0, 1f, 0f, 0f); volumeData.setVolumetricVector(1, 0f, 1f, 0f); volumeData.setVolumetricVector(2, 0f, 0f, 1f); + volumeData.setUnitVectors(); + volumeData.setVoxelCounts(nX, nY, nZ); volumeData.setVoxelData(new float[nX][nY][nZ]); - VoxelDataCreator vdc = new VoxelDataCreator(); - vdc.createVoxelData(volumeData); - JvxlData jvxlData = new JvxlData(); + vdc = new VoxelDataCreator(volumeData); + vdc.createVoxelData(); + jvxlData = new JvxlData(); jvxlData.cutoff = cutoff; jvxlData.isCutoffAbsolute = isCutoffAbsolute; - StringBuffer sb = new StringBuffer("created by SimpleJvxlWriter " - + new SimpleDateFormat("yyyy-MM-dd', 'HH:mm").format(new Date()) - + "\naddional comment line\n"); - writeFile(outputFile, JvxlWrite.jvxlGetData(jvxlData, volumeData, sb)); + jvxlData.isXLowToHigh = true; + writeFile(outputFile + jvxlData.isXLowToHigh , JvxlWrite.jvxlGetData(null, jvxlData, volumeData, title)); + +/* + volumeData = new VolumeData(); + volumeData.setVolumetricOrigin(2, 2, 2); + volumeData.setVolumetricVector(0, 1f, 0f, 0f); + volumeData.setVolumetricVector(1, 0f, 1f, 0f); + volumeData.setVolumetricVector(2, 0f, 0f, 1f); + volumeData.setUnitVectors(); + + + volumeData.setVoxelCounts(nX, nY, nZ); + volumeData.setVoxelData(new float[nX][nY][nZ]); + vdc = new VoxelDataCreator(volumeData); + vdc.createVoxelData(); + jvxlData = new JvxlData(); + jvxlData.cutoff = cutoff; + jvxlData.isCutoffAbsolute = isCutoffAbsolute; + jvxlData.isXLowToHigh = true; + writeFile(outputFile+ "B", JvxlWrite.jvxlGetData(vdc, jvxlData, volumeData, title)); + + */ System.out.flush(); System.exit(0); } Modified: trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -23,7 +23,10 @@ */ package org.openscience.jvxl.simplewriter; +import java.util.BitSet; + import javax.vecmath.Point3f; +import javax.vecmath.Point4f; public class JvxlWrite { @@ -40,32 +43,84 @@ public JvxlWrite() { } - public static String jvxlGetData(JvxlData jvxlData, VolumeData volumeData, StringBuffer sb) { + public static String jvxlGetData(VoxelDataCreator vdc, JvxlData jvxlData, VolumeData volumeData, String title) { // if the StringBuffer is not empty, it should have two comment lines // that do not start with # already present. + StringBuffer sb = new StringBuffer(); + if (title != null) + sb.append(title); Point3f[] atomXYZ = null; int[] atomNo = null; int nAtoms = Integer.MAX_VALUE; - jvxlCreateHeader(volumeData, nAtoms, atomXYZ, atomNo, sb); + jvxlCreateHeader(volumeData, nAtoms, atomXYZ, atomNo, jvxlData.isXLowToHigh, sb); jvxlData.jvxlFileHeader = sb.toString(); int[] counts = volumeData.getVoxelCounts(); - jvxlCreateSurfaceData(jvxlData, volumeData.getVoxelData(), jvxlData.cutoff, - jvxlData.isCutoffAbsolute, counts); - SimpleMarchingCubes mc = new SimpleMarchingCubes(volumeData, - jvxlData.cutoff, jvxlData.isCutoffAbsolute); + jvxlData.nPointsX = counts[0]; + jvxlData.nPointsY = counts[1]; + jvxlData.nPointsZ = counts[2]; + SimpleMarchingCubes mc = new SimpleMarchingCubes(vdc, volumeData, + jvxlData.cutoff, jvxlData.isCutoffAbsolute, jvxlData.isXLowToHigh); jvxlData.jvxlEdgeData = mc.getEdgeData(); - String jvxlMaskData = mc.getMaskData(); - System.out.println(jvxlMaskData.length() + " " - + (jvxlMaskData = jvxlCompressString(jvxlMaskData)).length() + " " + jvxlData.jvxlSurfaceData.length()); + setSurfaceInfoFromBitSet(jvxlData, mc.getBsVoxels(), null); jvxlData.jvxlDefinitionLine = jvxlGetDefinitionLine(jvxlData); return jvxlGetFile(jvxlData); } + public static void setSurfaceInfoFromBitSet(JvxlData jvxlData, BitSet bs, + Point4f thePlane) { + boolean inside = false; + int dataCount = 0; + StringBuffer sb = new StringBuffer(); + int nSurfaceInts = 0; + int nPoints = jvxlData.nPointsX * jvxlData.nPointsY * jvxlData.nPointsZ; + for (int i = 0; i < nPoints; ++i) { + if (inside == bs.get(i)) { + dataCount++; + } else { + sb.append(' ').append(dataCount); + nSurfaceInts++; + dataCount = 1; + inside = !inside; + } + } + sb.append(' ').append(dataCount).append('\n'); + setSurfaceInfo(jvxlData, thePlane, nSurfaceInts, sb); + } + static char jvxlFractionAsCharacter(float fraction) { + //char ch = jvxlFractionAsCharacter(fraction, defaultEdgeFractionBase, + // defaultEdgeFractionRange); + //System.out.println(fraction + " " + ch + " " + jvxlFractionFromCharacter((int) ch, defaultEdgeFractionBase, + //defaultEdgeFractionRange,0)); return jvxlFractionAsCharacter(fraction, defaultEdgeFractionBase, defaultEdgeFractionRange); } + protected static float jvxlFractionFromCharacter(int ich, int base, int range, + float fracOffset) { + if (ich == base + range) + return Float.NaN; + if (ich < base) + ich = 92; // ! --> \ + float fraction = (ich - base + fracOffset) / range; + if (fraction < 0f) + return 0f; + if (fraction > 1f) + return 0.999999f; + //if (logCompression) + //Logger.info("ffc: " + fraction + " <-- " + ich + " " + (char) ich); + return fraction; + } + + + protected static void setSurfaceInfo(JvxlData jvxlData, Point4f thePlane, int nSurfaceInts, StringBuffer surfaceData) { + jvxlData.jvxlSurfaceData = surfaceData.toString(); + if (jvxlData.jvxlSurfaceData.indexOf("--") == 0) + jvxlData.jvxlSurfaceData = jvxlData.jvxlSurfaceData.substring(2); + jvxlData.jvxlPlane = thePlane; + jvxlData.nSurfaceInts = nSurfaceInts; + } + private static String jvxlGetFile(JvxlData jvxlData) { StringBuffer data = new StringBuffer(); String s = jvxlData.jvxlFileHeader + jvxlExtraLine(jvxlData, 1); @@ -102,23 +157,20 @@ // ascii-encoded fractional color data // # optional comments - private static void setSurfaceInfo(JvxlData jvxlData, int nSurfaceInts, StringBuffer surfaceData) { - jvxlData.jvxlSurfaceData = surfaceData.toString(); - if (jvxlData.jvxlSurfaceData.indexOf("--") == 0) - jvxlData.jvxlSurfaceData = jvxlData.jvxlSurfaceData.substring(2); - jvxlData.nSurfaceInts = nSurfaceInts; - } //// methods for creating the JVXL code private static void jvxlCreateHeader(VolumeData v, int nAtoms, Point3f[] atomXyz, int[] atomNo, + boolean isXLowToHigh, StringBuffer sb) { // if the StringBuffer comes in non-empty, it should have two lines // that do not start with # already present. if (sb.length() == 0) sb.append("Line 1\nLine 2\n"); - sb.append(nAtoms == Integer.MAX_VALUE ? -2 : -nAtoms).append(' ').append( + sb.append(isXLowToHigh ? "+" : "-"); + sb.append(nAtoms == Integer.MAX_VALUE ? 2 : Math.abs(nAtoms)); + sb.append(' ').append( v.volumetricOrigin.x).append(' ').append(v.volumetricOrigin.y).append( ' ').append(v.volumetricOrigin.z).append(" ANGSTROMS\n"); for (int i = 0; i < 3; i++) @@ -145,44 +197,6 @@ .append(pt.z).append(" //BOGUS He ATOM ADDED FOR JVXL FORMAT\n"); } - private static int jvxlCreateSurfaceData(JvxlData jvxlData, - float[][][] voxelData, float cutoff, - boolean isCutoffAbsolute, - int counts[]) { - StringBuffer sb = new StringBuffer(); - boolean inside = false; - int dataCount = 0; - int nDataPoints = 0; - int nSurfaceInts = 0; - int nX = counts[0]; - int nY = counts[1]; - int nZ = counts[2]; - for (int x = 0; x < nX; ++x) - for (int y = 0; y < nY; ++y) - for (int z = 0; z < nZ; ++z) { - ++nDataPoints; - if (inside == isInside(voxelData[x][y][z], cutoff, isCutoffAbsolute)) { - dataCount++; - } else { - if (dataCount != 0) { - sb.append(' ').append(dataCount); - ++nSurfaceInts; - } - dataCount = 1; - inside = !inside; - } - } - sb.append(' ').append(dataCount).append('\n'); - ++nSurfaceInts; - setSurfaceInfo(jvxlData, nSurfaceInts, sb); - return nDataPoints; - } - - private static boolean isInside(float voxelValue, float max, - boolean isAbsolute) { - return SimpleMarchingCubes.isInside(voxelValue, max, isAbsolute); - } - private static String jvxlGetDefinitionLine(JvxlData jvxlData) { String definitionLine = jvxlData.cutoff + " "; Modified: trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java 2009-02-07 05:32:40 UTC (rev 10626) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java 2009-02-08 14:54:57 UTC (rev 10627) @@ -23,10 +23,10 @@ */ package org.openscience.jvxl.simplewriter; +import java.util.BitSet; + import javax.vecmath.Point3i; -import org.jmol.util.Base64; - public class SimpleMarchingCubes { /* @@ -47,16 +47,25 @@ private boolean isCutoffAbsolute; private boolean isXLowToHigh; private StringBuffer fractionData = new StringBuffer(); - private StringBuffer maskData = new... [truncated message content] |
From: <ha...@us...> - 2009-02-13 04:17:15
|
Revision: 10646 http://jmol.svn.sourceforge.net/jmol/?rev=10646&view=rev Author: hansonr Date: 2009-02-13 04:17:12 +0000 (Fri, 13 Feb 2009) Log Message: ----------- version=11.7.26 isosurface VOLUME # new feature: isosurface VOLUME reports the volume of an isosurface and stores the number in variable isosurfaceVolume # new feature: ASimpleJvxlWriter can calculate the volume of the surface Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-13 04:02:21 UTC (rev 10645) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-13 04:17:12 UTC (rev 10646) @@ -1,9 +1,10 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=11.7.26_dev +version=11.7.26 # new feature: isosurface VOLUME reports the volume of an isosurface and stores the number in variable isosurfaceVolume +# new feature: ASimpleJvxlWriter can calculate the volume of the surface # new feature: isosurface AREA reports the area of an isosurface and stores the number in variable isosurfaceArea # new feature: ASimpleJvxlWriter can calculate the area of the surface # bug fix: Spartan reader reads MOs improperly when only a partials set of MOs is included in the file Modified: trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java 2009-02-13 04:02:21 UTC (rev 10645) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/ASimpleJvxlWriter.java 2009-02-13 04:17:12 UTC (rev 10646) @@ -79,24 +79,26 @@ jvxlData.cutoff = cutoff; jvxlData.isCutoffAbsolute = isCutoffAbsolute; - // areaReturn and surfacePointsReturn are optional + // areaVolumeReturn and surfacePointsReturn are optional // -- set to null for faster calculation of JVXL data - float[] areaReturn = new float[1]; // or null; + float[] areaVolumeReturn = new float[2]; // or null; Vector surfacePointsReturn = new Vector(); // or null; jvxlData.isXLowToHigh = false; writeFile(outputFile + "A", JvxlWrite.jvxlGetData(null, jvxlData, - volumeData, title, surfacePointsReturn, areaReturn)); + volumeData, title, surfacePointsReturn, areaVolumeReturn)); - if (areaReturn != null) - System.out.println("calc area = " + areaReturn[0] + " for " + surfacePointsReturn.size() + " surface points"); - + if (areaVolumeReturn != null) + System.out.println("calculated area = " + areaVolumeReturn[0] + + " volume = " + areaVolumeReturn[1] + + " for " + surfacePointsReturn.size() + + " surface points"); // streaming option: null voxelData volumeData.setVoxelData(null); jvxlData.isXLowToHigh = true; writeFile(outputFile + "B", JvxlWrite.jvxlGetData(vdc, jvxlData, - volumeData, title, surfacePointsReturn, areaReturn)); + volumeData, title, surfacePointsReturn, areaVolumeReturn)); System.out.flush(); System.exit(0); Modified: trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java 2009-02-13 04:02:21 UTC (rev 10645) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/JvxlWrite.java 2009-02-13 04:17:12 UTC (rev 10646) @@ -46,7 +46,7 @@ public static String jvxlGetData(VoxelDataCreator vdc, JvxlData jvxlData, VolumeData volumeData, String title, Vector surfacePointsReturn, - float[] areaReturn) { + float[] areaVolumeReturn) { // if the StringBuffer is not empty, it should have two comment lines // that do not start with # already present. StringBuffer sb = new StringBuffer(); @@ -62,15 +62,17 @@ jvxlData.nPointsX = counts[0]; jvxlData.nPointsY = counts[1]; jvxlData.nPointsZ = counts[2]; - boolean doCalcArea = (areaReturn != null); + boolean doCalcArea = (areaVolumeReturn != null); SimpleMarchingCubes mc = new SimpleMarchingCubes(vdc, volumeData, jvxlData.cutoff, jvxlData.isCutoffAbsolute, jvxlData.isXLowToHigh, surfacePointsReturn, doCalcArea); jvxlData.jvxlEdgeData = mc.getEdgeData(); setSurfaceInfoFromBitSet(jvxlData, mc.getBsVoxels()); jvxlData.jvxlDefinitionLine = jvxlGetDefinitionLine(jvxlData); - if (doCalcArea) - areaReturn[0] = mc.getCalculatedArea(); + if (doCalcArea) { + areaVolumeReturn[0] = mc.getCalculatedArea(); + areaVolumeReturn[1] = mc.getCalculatedVolume(); + } return jvxlGetFile(jvxlData); } Modified: trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java =================================================================== --- trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java 2009-02-13 04:02:21 UTC (rev 10645) +++ trunk/Jmol/src/org/openscience/jvxl/simplewriter/SimpleMarchingCubes.java 2009-02-13 04:17:12 UTC (rev 10646) @@ -54,6 +54,7 @@ private boolean doCalcArea; private boolean doSaveSurfacePoints; private float calculatedArea = Float.NaN; + private float calculatedVolume = Float.NaN; private Vector surfacePoints; @@ -61,6 +62,10 @@ return calculatedArea; } + public float getCalculatedVolume() { + return calculatedVolume; + } + private StringBuffer fractionData = new StringBuffer(); private int cubeCountX, cubeCountY, cubeCountZ; @@ -198,6 +203,7 @@ edgeCount = 0; calculatedArea = 0; + calculatedVolume = 0; if (doSaveSurfacePoints) surfacePoints.clear(); @@ -310,6 +316,8 @@ } Vector3f vTemp = new Vector3f(); + Vector3f vAC = new Vector3f(); + Vector3f vAB = new Vector3f(); private void addTriangle(int ia, int ib, int ic, int edgeType) { @@ -323,14 +331,17 @@ Point3f ptb = (Point3f) surfacePoints.get(edgePointIndexes[ib]); Point3f ptc = (Point3f) surfacePoints.get(edgePointIndexes[ic]); - Vector3f ab = new Vector3f(ptb); - ab.sub(pta); - Vector3f ac = new Vector3f(ptc); - ac.sub(pta); - vTemp.cross(ab, ac); + vAB.sub(ptb, pta); + vAC.sub(ptc, pta); + vTemp.cross(vAB, vAC); float area = vTemp.length() / 2; calculatedArea += area; + vAB.set(ptb); + vAC.set(ptc); + vTemp.cross(vAB, vAC); + vAC.set(pta); + calculatedVolume += vAC.dot(vTemp) / 6; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-02-26 12:58:28
|
Revision: 10684 http://jmol.svn.sourceforge.net/jmol/?rev=10684&view=rev Author: hansonr Date: 2009-02-26 12:15:50 +0000 (Thu, 26 Feb 2009) Log Message: ----------- version=11.7.27_dev # bug fix: (Application) measurements toolbar icon does not stay shaded Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-26 12:00:39 UTC (rev 10683) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-26 12:15:50 UTC (rev 10684) @@ -3,6 +3,7 @@ version=11.7.27_dev +# bug fix: (Application) measurements toolbar icon does not stay shaded # bug fix: very subtle code error on lines and cylinders rasterization not completing line end pixel in most cases # bug fix: (Application) measurement icon measures angles, not distances. # new feature: JVXL format supports polygonColixes[] Modified: trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties =================================================================== --- trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties 2009-02-26 12:00:39 UTC (rev 10683) +++ trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties 2009-02-26 12:15:50 UTC (rev 10684) @@ -217,6 +217,7 @@ home - - \ animateRewindScript animatePrevScript animateNextScript animateLastScript viewMeasurementTableImage=rulerButton.gif +viewMeasurementTableToggle=true rotateScriptImage=rotateButton.gif rotateScriptToggle=true rotateScriptToggleSelected=true This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-02-26 13:01:45
|
Revision: 10685 http://jmol.svn.sourceforge.net/jmol/?rev=10685&view=rev Author: hansonr Date: 2009-02-26 13:01:41 +0000 (Thu, 26 Feb 2009) Log Message: ----------- version=11.7.27_dev application measurements # bug fix: toolbar icon for pickMeasure tied to tools "measurements..." item # bug fix: (Application) meaurement table not updating properly Modified Paths: -------------- trunk/Jmol/src/org/jmol/shape/Measures.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java trunk/Jmol/src/org/openscience/jmol/app/MeasurementTable.java Modified: trunk/Jmol/src/org/jmol/shape/Measures.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Measures.java 2009-02-26 12:15:50 UTC (rev 10684) +++ trunk/Jmol/src/org/jmol/shape/Measures.java 2009-02-26 13:01:41 UTC (rev 10685) @@ -400,17 +400,19 @@ measurements = (Measurement[]) ArrayUtil.setLength(measurements, measurementCount + measurementGrowthIncrement); } + int n = measurementCount; + measurements[measurementCount++] = measureNew; viewer.setStatusMeasuring("measureCompleted", - measurementCount, measureNew.toVector().toString()); - measurements[measurementCount++] = measureNew; + n, measureNew.toVector().toString()); } private void deleteMeasurement(int i) { - viewer.setStatusMeasuring("measureDeleted", i, measurements[i].toVector().toString()); + String msg = measurements[i].toVector().toString(); System.arraycopy(measurements, i + 1, measurements, i, measurementCount - i - 1); --measurementCount; measurements[measurementCount] = null; + viewer.setStatusMeasuring("measureDeleted", i, msg); } private void nextMeasure(int thispt, int ptLastAtom, Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-26 12:15:50 UTC (rev 10684) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-26 13:01:41 UTC (rev 10685) @@ -3,6 +3,8 @@ version=11.7.27_dev +# bug fix: toolbar icon for pickMeasure tied to tools "measurements..." item +# bug fix: (Application) meaurement table not updating properly # bug fix: (Application) measurements toolbar icon does not stay shaded # bug fix: very subtle code error on lines and cylinders rasterization not completing line end pixel in most cases # bug fix: (Application) measurement icon measures angles, not distances. Modified: trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties =================================================================== --- trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties 2009-02-26 12:15:50 UTC (rev 10684) +++ trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties 2009-02-26 13:01:41 UTC (rev 10685) @@ -213,11 +213,11 @@ # with the menu items. # toolbar=open - export toweb povray write print - - \ - rotateScript pickScript viewMeasurementTable - - \ + rotateScript pickScript pickMeasureScript - - \ home - - \ animateRewindScript animatePrevScript animateNextScript animateLastScript -viewMeasurementTableImage=rulerButton.gif -viewMeasurementTableToggle=true +pickMeasureScriptImage=rulerButton.gif +pickMeasureScriptToggle=true rotateScriptImage=rotateButton.gif rotateScriptToggle=true rotateScriptToggleSelected=true @@ -231,6 +231,7 @@ pickScript=select none;selectionHalos on;set pickingstyle drag;set picking select atom rotateScript=selectionHalos off;set pickingstyle toggle;set picking identify +pickMeasureScript=set picking measure distance;set pickingstyle measure #showMeasurementTable # # AtomSetChooser Modified: trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java 2009-02-26 12:15:50 UTC (rev 10684) +++ trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java 2009-02-26 13:01:41 UTC (rev 10685) @@ -142,7 +142,6 @@ labels.put("tools", GT._("&Tools")); labels.put("gauss", GT._("&Gaussian...")); labels.put("viewMeasurementTable", GT._("&Measurements")+"..."); - labels.put("viewMeasurementTableTip", GT._("Click atoms to measure distances")); labels.put("distanceUnitsMenu", GT._("Distance &Units")); labels.put("distanceNanometersScript", GT._("&Nanometers 1E-9")); labels.put("distanceAngstromsScript", GT._("&Angstroms 1E-10")); @@ -186,6 +185,7 @@ labels.put("Prefs.isBondAtomColor", GT._("Use Atom Color")); labels.put("rotateScriptTip", GT._("Rotate molecule.")); labels.put("pickScriptTip", GT._("Select a set of atoms using SHIFT-LEFT- DRAG.")); + labels.put("pickMeasureDistanceTip", GT._("Click atoms to measure distances")); labels.put("homeTip", GT._("Return molecule to home position.")); return labels; Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2009-02-26 12:15:50 UTC (rev 10684) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2009-02-26 13:01:41 UTC (rev 10685) @@ -1663,7 +1663,6 @@ } public void actionPerformed(ActionEvent e) { - viewer.script("set picking measure distance;set pickingstyle measure"); measurementTable.activate(); } } @@ -1730,8 +1729,10 @@ else if (status.indexOf("Completed") >= 0) sendConsoleEcho(strInfo.substring(strInfo.lastIndexOf(",") + 2, strInfo.length() - 1)); - if (status.indexOf("Pending") < 0) + if (status.indexOf("Pending") < 0) { + //System.out.println("jmol callback measure" + status); measurementTable.updateTables(); + } break; case JmolConstants.CALLBACK_MESSAGE: sendConsoleMessage(data == null ? null : strInfo); @@ -1971,7 +1972,11 @@ } public void actionPerformed(ActionEvent e) { - viewer.evalStringQuiet(e.getActionCommand()); + String script = e.getActionCommand(); + if (script.indexOf("#showMeasurementTable") >= 0) + measurementTable.activate(); + // viewer.script("set picking measure distance;set pickingstyle measure"); + viewer.evalStringQuiet(script); } } Modified: trunk/Jmol/src/org/openscience/jmol/app/MeasurementTable.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/MeasurementTable.java 2009-02-26 12:15:50 UTC (rev 10684) +++ trunk/Jmol/src/org/openscience/jmol/app/MeasurementTable.java 2009-02-26 13:01:41 UTC (rev 10685) @@ -210,12 +210,13 @@ return stringClass; } public Object getValueAt(int row, int col) { + //System.out.println("meata " + row + " " + col); if (col == 0) { deleteAllButton.setEnabled(true); return viewer.getMeasurementStringValue(row); } int[] countPlusIndices = viewer.getMeasurementCountPlusIndices(row); - if (col > countPlusIndices[0]) + if (countPlusIndices == null || col > countPlusIndices[0]) return null; int atomIndex = countPlusIndices[col]; return (viewer.getAtomInfo(atomIndex >= 0 ? atomIndex : -row * 10 - col)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-02-26 16:58:07
|
Revision: 10687 http://jmol.svn.sourceforge.net/jmol/?rev=10687&view=rev Author: hansonr Date: 2009-02-26 16:57:57 +0000 (Thu, 26 Feb 2009) Log Message: ----------- version=11.7.27_dev JmolCallbackListener # code: JmolCallbackListener implemented, extended by JmolStatusListener # code: JmolViewer now includes setJmolCallbackListener Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolStatusListener.java trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StatusManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Added Paths: ----------- trunk/Jmol/src/org/jmol/api/JmolCallbackListener.java Added: trunk/Jmol/src/org/jmol/api/JmolCallbackListener.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolCallbackListener.java (rev 0) +++ trunk/Jmol/src/org/jmol/api/JmolCallbackListener.java 2009-02-26 16:57:57 UTC (rev 10687) @@ -0,0 +1,42 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2008-11-27 09:48:39 -0600 (Thu, 27 Nov 2008) $ + * $Revision: 10382 $ + * + * Copyright (C) 2002-2005 The Jmol Development Team + * + * Contact: jmo...@li... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jmol.api; + +public interface JmolCallbackListener { +/* + * These methods specifically provide notification from + * Viewer.StatusManager for callback methods. + * + * See Jmol.java for implementation examples. + * + */ + + public void setCallbackFunction(String callbackType, String callbackFunction); + + public void notifyCallback(int type, Object[] data); + + public boolean notifyEnabled(int callback_pick); + +} Modified: trunk/Jmol/src/org/jmol/api/JmolStatusListener.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolStatusListener.java 2009-02-26 14:11:53 UTC (rev 10686) +++ trunk/Jmol/src/org/jmol/api/JmolStatusListener.java 2009-02-26 16:57:57 UTC (rev 10687) @@ -26,7 +26,7 @@ import java.util.Hashtable; -public interface JmolStatusListener { +public interface JmolStatusListener extends JmolCallbackListener { /* * These methods specifically provide notification from * Viewer.StatusManager to the two main classes, applet or app. @@ -37,12 +37,6 @@ * */ - public void setCallbackFunction(String callbackType, String callbackFunction); - - public void notifyCallback(int type, Object[] data); - - public boolean notifyEnabled(int callback_pick); - public String eval(String strEval); public float[][] functionXY(String functionName, int x, int y); Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2009-02-26 14:11:53 UTC (rev 10686) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2009-02-26 16:57:57 UTC (rev 10687) @@ -128,6 +128,8 @@ abstract public String generateOutput(String type, String fileName, int width, int height); + abstract public void setJmolCallbackListener(JmolCallbackListener jmolCallbackListener); + abstract public void setJmolStatusListener(JmolStatusListener jmolStatusListener); abstract public void setAppletContext(String htmlName, URL documentBase, URL codeBase, Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-26 14:11:53 UTC (rev 10686) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-02-26 16:57:57 UTC (rev 10687) @@ -3,6 +3,8 @@ version=11.7.27_dev +# code: JmolCallbackListener implemented, extended by JmolStatusListener +# code: JmolViewer now includes setJmolCallbackListener # bug fix: measure n1 n2 n3 n4 with just numbers selecting atoms in frame 1 rather than current frame. # bug fix: toolbar icon for pickMeasure tied to tools "measurements..." item # bug fix: (Application) meaurement table not updating properly Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2009-02-26 14:11:53 UTC (rev 10686) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2009-02-26 16:57:57 UTC (rev 10687) @@ -30,7 +30,9 @@ import java.util.Hashtable; import java.util.Vector; -import org.jmol.api.*; +import org.jmol.api.JmolCallbackListener; +import org.jmol.api.JmolStatusListener; + import org.jmol.i18n.GT; /** * @@ -82,6 +84,7 @@ private Viewer viewer; private JmolStatusListener jmolStatusListener; + private JmolCallbackListener jmolCallbackListener; private String statusList = ""; String getStatusList() { @@ -272,10 +275,15 @@ return true; } - synchronized void setJmolStatusListener(JmolStatusListener jmolStatusListener) { + synchronized void setJmolStatusListener(JmolStatusListener jmolStatusListener, JmolCallbackListener jmolCallbackListener) { this.jmolStatusListener = jmolStatusListener; + this.jmolCallbackListener = (jmolCallbackListener == null ? (JmolCallbackListener) jmolStatusListener : jmolCallbackListener); } + synchronized void setJmolCallbackListener(JmolCallbackListener jmolCallbackListener) { + this.jmolCallbackListener = jmolCallbackListener; + } + private String[] jmolScriptCallbacks = new String[JmolConstants.CALLBACK_COUNT]; private String jmolScriptCallback(int iCallback) { @@ -299,12 +307,12 @@ jmolScriptCallbacks[iCallback] = (pt == 0 ? null : callbackFunction .substring(pt).trim()); } - if (jmolStatusListener != null) - jmolStatusListener.setCallbackFunction(callbackType, callbackFunction); + if (jmolCallbackListener != null) + jmolCallbackListener.setCallbackFunction(callbackType, callbackFunction); } private boolean notifyEnabled(int type) { - return jmolStatusListener != null && jmolStatusListener.notifyEnabled(type); + return jmolCallbackListener != null && jmolCallbackListener.notifyEnabled(type); } synchronized void setStatusAtomPicked(int atomIndex, String strInfo) { @@ -312,21 +320,21 @@ Logger.info("setStatusAtomPicked(" + atomIndex + "," + strInfo + ")"); setStatusChanged("atomPicked", atomIndex, strInfo, false); if (notifyEnabled(JmolConstants.CALLBACK_PICK)) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_PICK, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_PICK, new Object[] { sJmol, strInfo, new Integer(atomIndex) }); } synchronized void setStatusResized(int width, int height){ String sJmol = jmolScriptCallback(JmolConstants.CALLBACK_RESIZE); if (notifyEnabled(JmolConstants.CALLBACK_RESIZE)) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_RESIZE, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_RESIZE, new Object[] { sJmol, new Integer(width), new Integer(height) }); } synchronized void setStatusAtomHovered(int iatom, String strInfo) { String sJmol = jmolScriptCallback(JmolConstants.CALLBACK_HOVER); if (notifyEnabled(JmolConstants.CALLBACK_HOVER)) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_HOVER, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_HOVER, new Object[] {sJmol, strInfo, new Integer(iatom) }); } @@ -339,7 +347,7 @@ setStatusChanged("fileLoadError", ptLoad, errorMsg, false); String sJmol = jmolScriptCallback(JmolConstants.CALLBACK_LOADSTRUCT); if (doCallback && notifyEnabled(JmolConstants.CALLBACK_LOADSTRUCT)) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_LOADSTRUCT, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_LOADSTRUCT, new Object[] { sJmol, fullPathName, fileName, modelName, errorMsg, new Integer(ptLoad) }); } @@ -357,7 +365,7 @@ .getModelNumberDotted(f) : ""), false); String sJmol = jmolScriptCallback(JmolConstants.CALLBACK_ANIMFRAME); if (notifyEnabled(JmolConstants.CALLBACK_ANIMFRAME)) { - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_ANIMFRAME, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_ANIMFRAME, new Object[] { sJmol, new int[] { frameNo, fileNo, modelNo, firstNo, lastNo } }); } @@ -370,7 +378,7 @@ setStatusChanged("scriptEcho", 0, strEcho, false); String sJmol = jmolScriptCallback(JmolConstants.CALLBACK_ECHO); if (notifyEnabled(JmolConstants.CALLBACK_ECHO)) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_ECHO, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_ECHO, new Object[] { sJmol, strEcho, new Integer(isScriptQueued ? 1 : 0) }); } @@ -386,7 +394,7 @@ } if (notifyEnabled(JmolConstants.CALLBACK_MEASURE)) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_MEASURE, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_MEASURE, new Object[] { sJmol, strMeasure, new Integer(intInfo), status }); } @@ -394,7 +402,7 @@ String errMsgUntranslated) { String sJmol = jmolScriptCallback(JmolConstants.CALLBACK_ERROR); if (notifyEnabled(JmolConstants.CALLBACK_ERROR)) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_ERROR, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_ERROR, new Object[] { sJmol, errType, errMsg, viewer.getShapeErrorState(), errMsgUntranslated }); } @@ -403,7 +411,7 @@ Float minEnergy, Float minEnergyDiff) { String sJmol = jmolScriptCallback(JmolConstants.CALLBACK_MINIMIZATION); if (notifyEnabled(JmolConstants.CALLBACK_MINIMIZATION)) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_MINIMIZATION, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_MINIMIZATION, new Object[] { sJmol, minStatus, minSteps, minEnergy, minEnergyDiff }); } @@ -435,12 +443,12 @@ if (jmolStatusListener != null) { if (isScriptCompletion && viewer.getMessageStyleChime() && viewer.getDebugScript()) { - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_SCRIPT, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_SCRIPT, new Object[] { null, "script <exiting>", statusMessage, new Integer(-1), strErrorMessageUntranslated }); strStatus = "Jmol script completed."; } - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_SCRIPT, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_SCRIPT, new Object[] { sJmol, strStatus, statusMessage, new Integer(isScriptCompletion ? -1 : msWalltime), strErrorMessageUntranslated }); @@ -527,7 +535,7 @@ void syncSend(String script, String appletName) { // no jmolscript option for syncSend if (jmolStatusListener != null) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_SYNC, + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_SYNC, new Object[] { null, script, appletName }); } @@ -542,7 +550,7 @@ synchronized void clearConsole() { if (jmolStatusListener != null) - jmolStatusListener.notifyCallback(JmolConstants.CALLBACK_MESSAGE, null); + jmolCallbackListener.notifyCallback(JmolConstants.CALLBACK_MESSAGE, null); } synchronized void showConsole(boolean showConsole) { Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2009-02-26 14:11:53 UTC (rev 10686) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2009-02-26 16:57:57 UTC (rev 10687) @@ -4013,8 +4013,12 @@ // //////////////status manager dispatch////////////// + public void setJmolCallbackListener(JmolCallbackListener jmolCallbackListener) { + statusManager.setJmolCallbackListener(jmolCallbackListener); + } + public void setJmolStatusListener(JmolStatusListener jmolStatusListener) { - statusManager.setJmolStatusListener(jmolStatusListener); + statusManager.setJmolStatusListener(jmolStatusListener, null); } public Hashtable getMessageQueue() { Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2009-02-26 14:11:53 UTC (rev 10686) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2009-02-26 16:57:57 UTC (rev 10687) @@ -1687,6 +1687,30 @@ class MyStatusListener implements JmolStatusListener { + /* starting with Jmol 11.7.27, JmolStatusListener extends JmolCallbackListener + * + * providing a simpler interface if all that is wanted is callback functionality. + * + * Only three methods are involved: + * + * boolean notifyEnabled(int type) + * -- lets the statusManager know if there is an implementation + * of a given callback type + * + * void notifyCallback(int type, Object[] data) + * -- callback action; data varies with callback type + * -- see org.jmol.viewer.StatusManager for details + * + * void setCallbackFunction(String callbackType, String callbackFunction) + * -- called by statusManager in response to the + * "set callback" script command + * -- also used by the Jmol application to change menus and languages + * -- can remain unimplemented if no such user action is intended + * + */ + + /// JmolCallbackListener interface /// + public boolean notifyEnabled(int type) { switch (type) { case JmolConstants.CALLBACK_ANIMFRAME: @@ -1767,27 +1791,6 @@ } } - public String eval(String strEval) { - if (strEval.startsWith("_GET_MENU")) - return (jmolpopup == null ? "" : jmolpopup.getMenu("Jmol version " - + Viewer.getJmolVersion() + "|" + strEval)); - sendConsoleMessage("javascript: " + strEval); - return "# 'eval' is implemented only for the applet."; - } - - /** - * - * @param fileName - * @param type - * @param text_or_bytes - * @param quality - * @return null (canceled) or a message starting with OK or an error message - */ - public String createImage(String fileName, String type, Object text_or_bytes, - int quality) { - return createImageStatus(fileName, type, text_or_bytes, quality); - } - public void setCallbackFunction(String callbackType, String callbackFunction) { if (callbackType.equalsIgnoreCase("menu")) { menuStructure = callbackFunction; @@ -1807,9 +1810,31 @@ } setupNewFrame(viewer.getStateInfo()); } + } + + /// end of JmolCallbackListener interface /// + public String eval(String strEval) { + if (strEval.startsWith("_GET_MENU")) + return (jmolpopup == null ? "" : jmolpopup.getMenu("Jmol version " + + Viewer.getJmolVersion() + "|" + strEval)); + sendConsoleMessage("javascript: " + strEval); + return "# 'eval' is implemented only for the applet."; } + /** + * + * @param fileName + * @param type + * @param text_or_bytes + * @param quality + * @return null (canceled) or a message starting with OK or an error message + */ + public String createImage(String fileName, String type, Object text_or_bytes, + int quality) { + return createImageStatus(fileName, type, text_or_bytes, quality); + } + private void notifyAtomPicked(String info) { if (scriptWindow != null) { scriptWindow.sendConsoleMessage(info); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-04-09 14:40:13
|
Revision: 10784 http://jmol.svn.sourceforge.net/jmol/?rev=10784&view=rev Author: hansonr Date: 2009-04-09 14:40:10 +0000 (Thu, 09 Apr 2009) Log Message: ----------- version=11.6.21_dev # bug fix: (application) animation tooltips incorrect # bug fix: V3000 reader chokes on CHG=n and does not recognize MASS=n Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/more/V3000Reader.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/more/V3000Reader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/more/V3000Reader.java 2009-04-09 10:50:10 UTC (rev 10783) +++ trunk/Jmol/src/org/jmol/adapter/readers/more/V3000Reader.java 2009-04-09 14:40:10 UTC (rev 10784) @@ -25,6 +25,7 @@ package org.jmol.adapter.readers.more; import org.jmol.adapter.smarter.*; +import org.jmol.api.JmolAdapter; import java.io.BufferedReader; @@ -94,13 +95,17 @@ atom.atomSerial = parseInt(tokens[2]); atom.elementSymbol = tokens[3]; atom.set(parseFloat(tokens[4]), parseFloat(tokens[5]), parseFloat(tokens[6])); - parseInt(); // discard aamap - while (true) { - String option = parseToken(); - if (option == null) + for (int j = 8; j < tokens.length; j++) { + String token = tokens[j]; + if (token.startsWith("CHG=")) { + int charge = parseInt(token, 4); + atom.formalCharge = (charge > 3 ? 4 - charge : charge); break; - if (option.startsWith("CHG=")) - atom.formalCharge = parseInt(option, 4); + } else if (token.startsWith("MASS=")) { + int isotope = parseInt(token, 5); + atom.elementNumber = (short) ((isotope << 7) + JmolAdapter + .getElementNumber(atom.elementSymbol)); + } } atomSetCollection.addAtomWithMappedSerialNumber(atom); } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-04-09 10:50:10 UTC (rev 10783) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-04-09 14:40:10 UTC (rev 10784) @@ -3,6 +3,7 @@ version=11.7.32_dev +# bug fix: V3000 reader chokes on CHG=n and does not recognize MASS=n # bug fix: Spartan SMOL file reader failure (coded & instead of && in if statement!) # new feature: CML "isotope" and CML "partial12" bond order. # new feature: GAMESS reader reads NBOs using Modified: trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java 2009-04-09 10:50:10 UTC (rev 10783) +++ trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java 2009-04-09 14:40:10 UTC (rev 10784) @@ -41,153 +41,158 @@ Hashtable labels = null; private Hashtable setupLabels() { - Hashtable labels = new Hashtable(); - labels.put("macros", GT._("&Macros")); - labels.put("file", GT._("&File")); - labels.put("newwin", GT._("&New")); - labels.put("open", GT._("&Open")); - labels.put("openTip", GT._("Open a file.")); - labels.put("openurl", GT._("Open &URL")); - labels.put("script", GT._("Scrip&t...")); - labels.put("atomsetchooser", GT._("AtomSet&Chooser...")); - labels.put("saveas", GT._("&Save As...")); - labels.put("exportMenu", GT._("&Export")); - labels.put("export", GT._("Export &Image...")); - labels.put("exportTip", GT._("Save current view as an image.")); - labels.put("toweb", GT._("Export to &Web Page...")); - labels.put("towebTip", GT._("Export one or more views to a web page.")); - labels.put("povray", GT._("Render in POV-&Ray...")); - labels.put("povrayTip", GT._("Render in POV-Ray")); - labels.put("write", GT._("Write &State...")); - labels.put("writeTip", GT._("Save current view as a Jmol state script.")); - labels.put("print", GT._("&Print...")); - labels.put("printTip", GT._("Print view.")); - labels.put("close", GT._("&Close")); - labels.put("exit", GT._("E&xit")); - labels.put("recentFiles", GT._("Recent &Files...")); - labels.put("edit", GT._("&Edit")); - //labels.put("makecrystal", GT. _("Make crystal...")); - labels.put("selectall", GT._("Select &All")); - labels.put("deselectall", GT._("Deselect All")); - labels.put("copyImage", GT._("Copy &Image")); - labels.put("copyScript", GT._("Copy Script")); - labels.put("prefs", GT._("Pr&eferences...")); - labels.put("pasteClipboard", GT._("&Paste")); - labels.put("editSelectAllScript", GT._("Select &All")); - labels.put("selectMenu", GT._("&Select")); - labels.put("selectAllScript", GT._("&All")); - labels.put("selectNoneScript", GT._("&None")); - labels.put("selectHydrogenScript", GT._("Hydrogen")); - labels.put("selectCarbonScript", GT._("Carbon")); - labels.put("selectNitrogenScript", GT._("Nitrogen")); - labels.put("selectOxygenScript", GT._("Oxygen")); - labels.put("selectPhosphorusScript", GT._("Phosphorus")); - labels.put("selectSulfurScript", GT._("Sulfur")); - labels.put("selectAminoScript", GT._("Amino")); - labels.put("selectNucleicScript", GT._("Nucleic")); - labels.put("selectWaterScript", GT._("Water")); - labels.put("selectHeteroScript", GT._("Hetero")); - labels.put("display", GT._("&Display")); - labels.put("atomMenu", GT._("&Atom")); - labels.put("atomNoneScript", GT._("&None")); - labels.put("atom15Script", GT._("{0}% van der Waals", "15")); - labels.put("atom20Script", GT._("{0}% van der Waals", "20")); - labels.put("atom25Script", GT._("{0}% van der Waals", "25")); - labels.put("atom100Script", GT._("{0}% van der Waals","100")); - labels.put("bondMenu", GT._("&Bond")); - labels.put("bondNoneScript", GT._("&None")); - labels.put("bondWireframeScript", GT._("&Wireframe")); - labels.put("bond100Script", GT._("{0} \u00C5", "0.10")); - labels.put("bond150Script", GT._("{0} \u00C5", "0.15")); - labels.put("bond200Script", GT._("{0} \u00C5", "0.20")); - labels.put("labelMenu", GT._("&Label")); - labels.put("labelNoneScript", GT._("&None")); - labels.put("labelSymbolScript", GT._("&Symbol")); - labels.put("labelNameScript", GT._("&Name")); - labels.put("labelNumberScript", GT._("&Number")); - labels.put("labelCenteredScript", GT._("&Centered")); - labels.put("labelUpperRightScript", GT._("&Upper right")); - labels.put("vectorMenu", GT._("&Vector")); - labels.put("vectorOffScript", GT._("&None")); - labels.put("vectorOnScript", GT._("&On")); - labels.put("vector3Script", GT._("{0} pixels", "3" )); - labels.put("vector005Script", GT._("{0} \u00C5", "0.05" )); - labels.put("vector01Script", GT._("{0} \u00C5", "0.1" )); - labels.put("vectorScale02Script", GT._("Scale {0}", "0.2" )); - labels.put("vectorScale05Script", GT._("Scale {0}", "0.5" )); - labels.put("vectorScale1Script", GT._("Scale {0}", "1" )); - labels.put("vectorScale2Script", GT._("Scale {0}", "2" )); - labels.put("vectorScale5Script", GT._("Scale {0}", "5" )); - labels.put("zoomMenu", GT._("&Zoom")); - labels.put("zoom100Script", GT._("{0}%", "100" )); - labels.put("zoom150Script", GT._("{0}%", "150" )); - labels.put("zoom200Script", GT._("{0}%", "200" )); - labels.put("zoom400Script", GT._("{0}%", "400" )); - labels.put("zoom800Script", GT._("{0}%", "800" )); - labels.put("perspectiveCheck", GT._("&Perspective Depth")); - labels.put("axesCheck", GT._("A&xes")); - labels.put("boundboxCheck", GT._("B&ounding Box")); - labels.put("hydrogensCheck", GT._("&Hydrogens")); - labels.put("vectorsCheck", GT._("V&ectors")); - labels.put("measurementsCheck", GT._("&Measurements")); - labels.put("view", GT._("&View")); - labels.put("front", GT._("&Front")); - labels.put("top", GT._("&Top")); - labels.put("bottom", GT._("&Bottom")); - labels.put("right", GT._("&Right")); - labels.put("left", GT._("&Left")); - labels.put("transform", GT._("Tr&ansform...")); - labels.put("definecenter", GT._("Define &Center")); - labels.put("tools", GT._("&Tools")); - labels.put("gauss", GT._("&Gaussian...")); - labels.put("viewMeasurementTable", GT._("&Measurements")+"..."); - labels.put("distanceUnitsMenu", GT._("Distance &Units")); - labels.put("distanceNanometersScript", GT._("&Nanometers 1E-9")); - labels.put("distanceAngstromsScript", GT._("&Angstroms 1E-10")); - labels.put("distancePicometersScript", GT._("&Picometers 1E-12")); - labels.put("animateMenu", GT._("&Animate...")); - labels.put("vibrateMenu", GT._("&Vibrate...")); - labels.put("graph", GT._("&Graph...")); - labels.put("chemicalShifts", GT._("Calculate chemical &shifts...")); - labels.put("crystprop", GT._("&Crystal Properties")); - labels.put("animateOnceScript", GT._("&Once")); - labels.put("animateLoopScript", GT._("&Loop")); - labels.put("animatePalindromeScript", GT._("P&alindrome")); - labels.put("animateStopScript", GT._("&Stop animation")); - labels.put("animateRewindScript", GT._("&Rewind to first frame")); - labels.put("animateRewindScriptTip",GT._("Rewind to first frame")); - labels.put("animateNextScript", GT._("Go to &next frame")); - labels.put("animateNextScriptTip", GT._("Go to next frame")); - labels.put("animatePrevScript", GT._("Go to &previous frame")); - labels.put("animatePrevScriptTip", GT._("Go to previous frame")); - labels.put("animateLastScript", GT._("Go to &last frame")); - labels.put("animateLastScriptTip", GT._("Go to last frame")); - labels.put("vibrateStartScript", GT._("Start &vibration")); - labels.put("vibrateStopScript", GT._("&Stop vibration")); - labels.put("vibrateRewindScript", GT._("&First frequency")); - labels.put("vibrateNextScript", GT._("&Next frequency")); - labels.put("vibratePrevScript", GT._("&Previous frequency")); - labels.put("help", GT._("&Help")); - labels.put("about", GT._("About Jmol")); - labels.put("uguide", GT._("User Guide")); - labels.put("whatsnew", GT._("What's New")); - labels.put("console", GT._("Jmol Java &Console")); - labels.put("Prefs.showHydrogens", GT._("Hydrogens")); - labels.put("Prefs.showMeasurements", GT._("Measurements")); - labels.put("Prefs.perspectiveDepth", GT._("Perspective Depth")); - labels.put("Prefs.showAxes", GT._("Axes")); - labels.put("Prefs.showBoundingBox", GT._("Bounding Box")); - labels.put("Prefs.axesOrientationRasmol", GT._("RasMol/Chime compatible axes orientation/rotations")); - labels.put("Prefs.openFilePreview", GT._("File Preview (requires restarting Jmol)")); - labels.put("Prefs.clearConsoleButton", GT._("Clear console button (requires restarting Jmol)")); - labels.put("Prefs.isLabelAtomColor", GT._("Use Atom Color")); - labels.put("Prefs.isBondAtomColor", GT._("Use Atom Color")); - labels.put("rotateScriptTip", GT._("Rotate molecule.")); - labels.put("pickScriptTip", GT._("Select a set of atoms using SHIFT-LEFT-DRAG.")); - labels.put("pickMeasureDistanceTip", GT._("Click atoms to measure distances")); - labels.put("homeTip", GT._("Return molecule to home position.")); + Hashtable labels = new Hashtable(); + labels.put("macros", GT._("&Macros")); + labels.put("file", GT._("&File")); + labels.put("newwin", GT._("&New")); + labels.put("open", GT._("&Open")); + labels.put("openTip", GT._("Open a file.")); + labels.put("openurl", GT._("Open &URL")); + labels.put("script", GT._("Scrip&t...")); + labels.put("atomsetchooser", GT._("AtomSet&Chooser...")); + labels.put("saveas", GT._("&Save As...")); + labels.put("exportMenu", GT._("&Export")); + labels.put("export", GT._("Export &Image...")); + labels.put("exportTip", GT._("Save current view as an image.")); + labels.put("toweb", GT._("Export to &Web Page...")); + labels.put("towebTip", GT._("Export one or more views to a web page.")); + labels.put("povray", GT._("Render in POV-&Ray...")); + labels.put("povrayTip", GT._("Render in POV-Ray")); + labels.put("write", GT._("Write &State...")); + labels.put("writeTip", GT._("Save current view as a Jmol state script.")); + labels.put("print", GT._("&Print...")); + labels.put("printTip", GT._("Print view.")); + labels.put("close", GT._("&Close")); + labels.put("exit", GT._("E&xit")); + labels.put("recentFiles", GT._("Recent &Files...")); + labels.put("edit", GT._("&Edit")); + // labels.put("makecrystal", GT. _("Make crystal...")); + labels.put("selectall", GT._("Select &All")); + labels.put("deselectall", GT._("Deselect All")); + labels.put("copyImage", GT._("Copy &Image")); + labels.put("copyScript", GT._("Copy Script")); + labels.put("prefs", GT._("Pr&eferences...")); + labels.put("pasteClipboard", GT._("&Paste")); + labels.put("editSelectAllScript", GT._("Select &All")); + labels.put("selectMenu", GT._("&Select")); + labels.put("selectAllScript", GT._("&All")); + labels.put("selectNoneScript", GT._("&None")); + labels.put("selectHydrogenScript", GT._("Hydrogen")); + labels.put("selectCarbonScript", GT._("Carbon")); + labels.put("selectNitrogenScript", GT._("Nitrogen")); + labels.put("selectOxygenScript", GT._("Oxygen")); + labels.put("selectPhosphorusScript", GT._("Phosphorus")); + labels.put("selectSulfurScript", GT._("Sulfur")); + labels.put("selectAminoScript", GT._("Amino")); + labels.put("selectNucleicScript", GT._("Nucleic")); + labels.put("selectWaterScript", GT._("Water")); + labels.put("selectHeteroScript", GT._("Hetero")); + labels.put("display", GT._("&Display")); + labels.put("atomMenu", GT._("&Atom")); + labels.put("atomNoneScript", GT._("&None")); + labels.put("atom15Script", GT._("{0}% van der Waals", "15")); + labels.put("atom20Script", GT._("{0}% van der Waals", "20")); + labels.put("atom25Script", GT._("{0}% van der Waals", "25")); + labels.put("atom100Script", GT._("{0}% van der Waals", "100")); + labels.put("bondMenu", GT._("&Bond")); + labels.put("bondNoneScript", GT._("&None")); + labels.put("bondWireframeScript", GT._("&Wireframe")); + labels.put("bond100Script", GT._("{0} \u00C5", "0.10")); + labels.put("bond150Script", GT._("{0} \u00C5", "0.15")); + labels.put("bond200Script", GT._("{0} \u00C5", "0.20")); + labels.put("labelMenu", GT._("&Label")); + labels.put("labelNoneScript", GT._("&None")); + labels.put("labelSymbolScript", GT._("&Symbol")); + labels.put("labelNameScript", GT._("&Name")); + labels.put("labelNumberScript", GT._("&Number")); + labels.put("labelCenteredScript", GT._("&Centered")); + labels.put("labelUpperRightScript", GT._("&Upper right")); + labels.put("vectorMenu", GT._("&Vector")); + labels.put("vectorOffScript", GT._("&None")); + labels.put("vectorOnScript", GT._("&On")); + labels.put("vector3Script", GT._("{0} pixels", "3")); + labels.put("vector005Script", GT._("{0} \u00C5", "0.05")); + labels.put("vector01Script", GT._("{0} \u00C5", "0.1")); + labels.put("vectorScale02Script", GT._("Scale {0}", "0.2")); + labels.put("vectorScale05Script", GT._("Scale {0}", "0.5")); + labels.put("vectorScale1Script", GT._("Scale {0}", "1")); + labels.put("vectorScale2Script", GT._("Scale {0}", "2")); + labels.put("vectorScale5Script", GT._("Scale {0}", "5")); + labels.put("zoomMenu", GT._("&Zoom")); + labels.put("zoom100Script", GT._("{0}%", "100")); + labels.put("zoom150Script", GT._("{0}%", "150")); + labels.put("zoom200Script", GT._("{0}%", "200")); + labels.put("zoom400Script", GT._("{0}%", "400")); + labels.put("zoom800Script", GT._("{0}%", "800")); + labels.put("perspectiveCheck", GT._("&Perspective Depth")); + labels.put("axesCheck", GT._("A&xes")); + labels.put("boundboxCheck", GT._("B&ounding Box")); + labels.put("hydrogensCheck", GT._("&Hydrogens")); + labels.put("vectorsCheck", GT._("V&ectors")); + labels.put("measurementsCheck", GT._("&Measurements")); + labels.put("view", GT._("&View")); + labels.put("front", GT._("&Front")); + labels.put("top", GT._("&Top")); + labels.put("bottom", GT._("&Bottom")); + labels.put("right", GT._("&Right")); + labels.put("left", GT._("&Left")); + labels.put("transform", GT._("Tr&ansform...")); + labels.put("definecenter", GT._("Define &Center")); + labels.put("tools", GT._("&Tools")); + labels.put("gauss", GT._("&Gaussian...")); + labels.put("viewMeasurementTable", GT._("&Measurements") + "..."); + labels.put("distanceUnitsMenu", GT._("Distance &Units")); + labels.put("distanceNanometersScript", GT._("&Nanometers 1E-9")); + labels.put("distanceAngstromsScript", GT._("&Angstroms 1E-10")); + labels.put("distancePicometersScript", GT._("&Picometers 1E-12")); + labels.put("animateMenu", GT._("&Animate...")); + labels.put("vibrateMenu", GT._("&Vibrate...")); + labels.put("graph", GT._("&Graph...")); + labels.put("chemicalShifts", GT._("Calculate chemical &shifts...")); + labels.put("crystprop", GT._("&Crystal Properties")); + labels.put("animateOnceScript", GT._("&Once")); + labels.put("animateLoopScript", GT._("&Loop")); + labels.put("animatePalindromeScript", GT._("P&alindrome")); + labels.put("animateStopScript", GT._("&Stop animation")); + labels.put("animateRewindScript", GT._("&Rewind to first frame")); + labels.put("animateRewindScriptTip", GT._("Rewind to first frame")); + labels.put("animateNextScript", GT._("Go to &next frame")); + labels.put("animateNextScriptTip", GT._("Go to next frame")); + labels.put("animatePrevScript", GT._("Go to &previous frame")); + labels.put("animatePrevScriptTip", GT._("Go to previous frame")); + labels.put("animateLastScript", GT._("Go to &last frame")); + labels.put("animateLastScriptTip", GT._("Go to last frame")); + labels.put("vibrateStartScript", GT._("Start &vibration")); + labels.put("vibrateStopScript", GT._("&Stop vibration")); + labels.put("vibrateRewindScript", GT._("&First frequency")); + labels.put("vibrateNextScript", GT._("&Next frequency")); + labels.put("vibratePrevScript", GT._("&Previous frequency")); + labels.put("help", GT._("&Help")); + labels.put("about", GT._("About Jmol")); + labels.put("uguide", GT._("User Guide")); + labels.put("whatsnew", GT._("What's New")); + labels.put("console", GT._("Jmol Java &Console")); + labels.put("Prefs.showHydrogens", GT._("Hydrogens")); + labels.put("Prefs.showMeasurements", GT._("Measurements")); + labels.put("Prefs.perspectiveDepth", GT._("Perspective Depth")); + labels.put("Prefs.showAxes", GT._("Axes")); + labels.put("Prefs.showBoundingBox", GT._("Bounding Box")); + labels.put("Prefs.axesOrientationRasmol", GT + ._("RasMol/Chime compatible axes orientation/rotations")); + labels.put("Prefs.openFilePreview", GT + ._("File Preview (requires restarting Jmol)")); + labels.put("Prefs.clearConsoleButton", GT + ._("Clear console button (requires restarting Jmol)")); + labels.put("Prefs.isLabelAtomColor", GT._("Use Atom Color")); + labels.put("Prefs.isBondAtomColor", GT._("Use Atom Color")); + labels.put("rotateScriptTip", GT._("Rotate molecule.")); + labels.put("pickScriptTip", GT + ._("Select a set of atoms using SHIFT-LEFT-DRAG.")); + labels.put("pickMeasureDistanceTip", GT + ._("Click atoms to measure distances")); + labels.put("homeTip", GT._("Return molecule to home position.")); - return labels; + return labels; } String getLabel(String key) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pim...@us...> - 2009-04-14 20:42:39
|
Revision: 10805 http://jmol.svn.sourceforge.net/jmol/?rev=10805&view=rev Author: pimpimpim Date: 2009-04-14 20:42:28 +0000 (Tue, 14 Apr 2009) Log Message: ----------- autoBonds were not written away correctly to the jmol configuration file, nor did the autoBond=false show up correctly in the properties menu. Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/PreferencesDialog.java Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-04-14 19:11:42 UTC (rev 10804) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-04-14 20:42:28 UTC (rev 10805) @@ -3,6 +3,7 @@ version=11.7.33_dev +# Bug fix: autoBond option in Preference menu was not writing to properties file in $HOME/.jmol # new feature: preliminary NBO support for Gaussian and QChem needs checking # code: subclassing Gaussian, QChem, NWChem, Gamess, Jaguar, Psi readers all into MOReader class Modified: trunk/Jmol/src/org/openscience/jmol/app/PreferencesDialog.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/PreferencesDialog.java 2009-04-14 19:11:42 UTC (rev 10804) +++ trunk/Jmol/src/org/openscience/jmol/app/PreferencesDialog.java 2009-04-14 20:42:28 UTC (rev 10805) @@ -344,6 +344,7 @@ c.weightx = 1.0; c.weighty = 1.0; + // Automatic calculation of bonds upon molecule load JPanel autobondPanel = new JPanel(); autobondPanel.setLayout(new BoxLayout(autobondPanel, BoxLayout.Y_AXIS)); autobondPanel.setBorder(new TitledBorder(GT._("Compute Bonds"))); @@ -359,14 +360,17 @@ abYes.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - viewer.setBooleanProperty("autoBond", true); + viewer.setBooleanProperty("autoBond", true); + currentProperties.put("autoBond", "" + "true"); } }); + abNo.setSelected(!viewer.getAutoBond()); abNo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { viewer.setBooleanProperty("autoBond", false); + currentProperties.put("autoBond", "" + "false"); } }); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-05-04 21:57:18
|
Revision: 10848 http://jmol.svn.sourceforge.net/jmol/?rev=10848&view=rev Author: hansonr Date: 2009-05-04 21:57:00 +0000 (Mon, 04 May 2009) Log Message: ----------- version=11.7.35_dev data "append" bugs # bug fix: data "append" does not set model the way load "append" does # bug fix: application frame arrows do not work after loading multiple models Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2009-05-04 21:56:13 UTC (rev 10847) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2009-05-04 21:57:00 UTC (rev 10848) @@ -4064,7 +4064,14 @@ char newLine = viewer.getInlineChar(); if (dataString.length() > 0 && dataString.charAt(0) != newLine) newLine = '\0'; + int modelCount = viewer.getModelCount() + - (viewer.getFileName().equals("zapped") ? 1 : 0); + boolean appendNew = viewer.getAppendNew(); viewer.loadInline(dataString, newLine, isAppend); + if (isAppend && appendNew) { + viewer.setAnimationRange(-1, -1); + viewer.setCurrentModelIndex(modelCount); + } } if (isSyntaxCheck && !processModel) return; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-05-04 21:56:13 UTC (rev 10847) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-05-04 21:57:00 UTC (rev 10848) @@ -3,6 +3,9 @@ version=11.7.35_dev +# bug fix: data "append" does not set model the way load "append" does +# bug fix: application frame arrows do not work after loading multiple models + # ----------------------------------------------------------------------------- #version=11.7.34 Modified: trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties =================================================================== --- trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties 2009-05-04 21:56:13 UTC (rev 10847) +++ trunk/Jmol/src/org/openscience/jmol/Properties/Jmol-resources.properties 2009-05-04 21:57:00 UTC (rev 10848) @@ -173,10 +173,10 @@ animateLoopScript=script inline "frame " + _firstFrame; anim mode loop; anim on animatePalindromeScript=script inline "frame " + _firstFrame; anim mode palindrome; anim on animateStopScript=anim off -animateRewindScript=script inline "frame " + _firstFrame +animateRewindScript=script inline "frame 0.0;frame " + _firstFrame animateNextScript=frame next animatePrevScript=frame prev -animateLastScript=frame last +animateLastScript=frame 0.0;frame last animateOnceScriptImage=playOnceButton.png animateLoopScriptImage=playLoopButton.png This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-05-27 17:15:20
|
Revision: 10911 http://jmol.svn.sourceforge.net/jmol/?rev=10911&view=rev Author: hansonr Date: 2009-05-27 17:15:14 +0000 (Wed, 27 May 2009) Log Message: ----------- version=11.7.39_dev # new feature: application flag -L --nosplash no splash screen (For Jmol in Sun Wonderland dev. 5) # new feature: load XYZ ... loads just the XYZ coordinates, in sequence, based on selected atoms. # lots of potential uses for this: # --NMR files where you want just one model at a time and, once loaded, want to save the positions # --basically anywhere you want a "trajectory" but don't want to save all that data Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/JmolConstants.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java trunk/Jmol/src/org/openscience/jmol/app/Splash.java Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2009-05-25 06:59:57 UTC (rev 10910) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2009-05-27 17:15:14 UTC (rev 10911) @@ -1171,20 +1171,36 @@ Point3f pt = new Point3f(); Point3f v = new Point3f(); float tolerance = ((Float) viewer.getParameter("loadAtomDataTolerance")).floatValue(); + int i = -1; + int n = 0; + int imax = (tokType == Token.xyz ? BitSetUtil.length(bsSelected) : 0); for (JmolAdapter.AtomIterator iterAtom = adapter .getAtomIterator(atomSetCollection); iterAtom.hasNext();) { float x = iterAtom.getX(); float y = iterAtom.getY(); float z = iterAtom.getZ(); - pt.set(x, y, z); if (Float.isNaN(x + y + z)) continue; + + if (tokType == Token.xyz) { + while (++i < imax && !bsSelected.get(i)) { + // continue + } + if ( i == imax) + break; + n++; + if (Logger.debugging) + Logger.debug("atomIndex = " + i+ ": " + (Point3f)atoms[i] + " --> (" + x + "," + y + "," + z); + setAtomCoord(i, x, y, z); + continue; + } + pt.set(x, y, z); BitSet bs = new BitSet(); getAtomsWithin(-tolerance, pt, bs, -1); getAtomsWithin(tolerance, pt, bs, -1); bs.and(bsSelected); if (BitSetUtil.cardinalityOf(bsSelected) == viewer.getAtomCount()) { - int n = BitSetUtil.cardinalityOf(bs); + n = BitSetUtil.cardinalityOf(bs); if (n == 0) { Logger.warn("createAtomDataSet: no atom found at position " + pt); continue; @@ -1225,6 +1241,10 @@ Logger.info("_vibrationName = " + vibName); viewer.setStringProperty("_vibrationName", vibName); break; + case Token.xyz: + Logger.info(n + " atom positions read"); + recalculateLeadMidpointsAndWingVectors(-1); + break; } } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-05-25 06:59:57 UTC (rev 10910) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-05-27 17:15:14 UTC (rev 10911) @@ -3,6 +3,12 @@ version=11.7.39_dev +# new feature: application flag -L --nosplash no splash screen (For Jmol in Sun Wonderland dev. 5) + +# new feature: load XYZ ... loads just the XYZ coordinates, in sequence, based on selected atoms. +# lots of potential uses for this: +# --NMR files where you want just one model at a time and, once loaded, want to save the positions +# --basically anywhere you want a "trajectory" but don't want to save all that data # bug fix: QchemReader reading second set of MOs with spherical basis problem (at end of optimization) # ----------------------------------------------------------------------------- Modified: trunk/Jmol/src/org/jmol/viewer/JmolConstants.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JmolConstants.java 2009-05-25 06:59:57 UTC (rev 10910) +++ trunk/Jmol/src/org/jmol/viewer/JmolConstants.java 2009-05-27 17:15:14 UTC (rev 10911) @@ -2959,7 +2959,7 @@ SHELL_F_CARTESIAN, SHELL_F_SPHERICAL }; - public static final String LOAD_ATOM_DATA_TYPES = "vibration;temperature;occupancy;partialcharge"; + public static final String LOAD_ATOM_DATA_TYPES = "xyz;vxyz;vibration;temperature;occupancy;partialcharge"; final public static int getQuantumShellTagID(String tag) { for (int i = quantumShellTags.length; --i >= 0;) Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2009-05-25 06:59:57 UTC (rev 10910) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2009-05-27 17:15:14 UTC (rev 10911) @@ -348,7 +348,7 @@ if (haveDisplay) { ImageIcon splash_image = JmolResourceHandler.getIconX("splash"); report("splash_image=" + splash_image); - splash = new Splash(frame, splash_image); + splash = new Splash((commandOptions.indexOf("-L") >= 0 ? null : frame), splash_image); splash.setCursor(new Cursor(Cursor.WAIT_CURSOR)); splash.showStatus(GT._("Creating main window...")); splash.showStatus(GT._("Initializing Swing...")); @@ -408,6 +408,8 @@ options.addOption("i", "silent", false, GT._("silent startup operation")); options.addOption("l", "list", false, GT ._("list commands during script execution")); + options.addOption("L", "nosplash", false, GT + ._("start with no splash screen")); options.addOption("o", "noconsole", false, GT ._("no console -- all output to sysout")); options.addOption("t", "threaded", false, GT @@ -549,6 +551,11 @@ commandOptions += "-l"; } + // no splash screen + if (line.hasOption("L")) { + commandOptions += "-L"; + } + // check script only -- don't open files if (line.hasOption("c")) { commandOptions += "-c"; Modified: trunk/Jmol/src/org/openscience/jmol/app/Splash.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Splash.java 2009-05-25 06:59:57 UTC (rev 10910) +++ trunk/Jmol/src/org/openscience/jmol/app/Splash.java 2009-05-27 17:15:14 UTC (rev 10911) @@ -54,6 +54,8 @@ splashImage = ii.getImage(); imgWidth = splashImage.getWidth(this); imgHeight = splashImage.getHeight(this); + if (parent == null) + return; showSplashScreen(); parent.addWindowListener(new WindowListener()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-06-05 06:54:06
|
Revision: 10955 http://jmol.svn.sourceforge.net/jmol/?rev=10955&view=rev Author: hansonr Date: 2009-06-05 06:54:03 +0000 (Fri, 05 Jun 2009) Log Message: ----------- version=11.7.40 flow control { } and inline IF ( ... ? .... : .... ) # new feature: complete freedom from lines and "end if, end for, end while" -- # just use standard { } notation. If no braces are used, then END must be used: # # for (var x = 1; x < {*}; x = x + 1) # if ({*}[x].temperature < 10) # ({*}[x]).radius = 1 # else # ({*}[x]).radius = 0 # end if # end for # # same as: # # for (var x = 1; x < {*}; x = x + 1){ # if ({*}[x].temperature < 10) { # ({*}[x]).radius = 1 # } else { # ({*}[x]).radius = 0 # } # } # # same as: # # for (var x = 1; x < {*}; x = x + 1){ # {{*}[x]}.radius = ({*}[x].temperature < 10 ? 1 : 0) # } # # same as: # # for (var x = 1; x < {*}; x = x + 1){{{*}[x]}.radius = ({*}[x].temperature < 10 ? 1 : 0)} # # new feature: standard { ... ? ... : ... ) notation in Jmol math: # # print ({*} < 100 ? "a small molecule" : "at least 100 atoms") # Modified Paths: -------------- trunk/Jmol/src/org/jmol/viewer/Compiler.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Function.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Token.java trunk/Jmol/src/org/openscience/jmol/app/ScriptWindow.java Modified: trunk/Jmol/src/org/jmol/viewer/Compiler.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Compiler.java 2009-06-04 02:43:32 UTC (rev 10954) +++ trunk/Jmol/src/org/jmol/viewer/Compiler.java 2009-06-05 06:54:03 UTC (rev 10955) @@ -76,7 +76,6 @@ private boolean isShowScriptOutput; private boolean isCheckOnly; private Hashtable contextVariables; - private boolean logMessages = false; /* @@ -327,6 +326,7 @@ private int ichToken; private int cchToken; private int iCommand; + private int ichBrace; private int ichCurrentCommand; private boolean isNewSet; @@ -334,7 +334,11 @@ private int ptNewSetModifier; private boolean iHaveQuotedString = false; + private int parenCount; + private int braceCount; + private int nTokens; private Vector ltoken; + private Vector lltoken; private Token lastToken; private void addTokenToPrefix(Token token) { if (logMessages) @@ -343,6 +347,9 @@ lastToken = token; } + private Vector vBraces = new Vector(); + private int iBrace; + private boolean compile0() { lineNumbers = null; lineIndices = null; @@ -355,25 +362,31 @@ cchScript = script.length(); ichToken = 0; ichCurrentCommand = 0; + ichBrace = 0; lineCurrent = 1; iCommand = 0; lastToken = Token.tokenOff; + vBraces = new Vector(); + iBrace = 0; + braceCount = 0; + parenCount = 0; int lnLength = 8; - int braceCount = 0; - int parenCount = 0; - int bracketCount = 0; lineNumbers = new short[lnLength]; lineIndices = new int[lnLength]; isNewSet = isSetBrace = false; ptNewSetModifier = 1; isShowScriptOutput = false; - Vector lltoken = new Vector(); + lltoken = new Vector(); ltoken = new Vector(); - int tokCommand = Token.nada; + tokCommand = Token.nada; + int tok = 0; + int setBraceCount = 0; + int bracketCount = 0; String comment = null; boolean endOfLine = false; + boolean isEndOfCommand = false; for (; true; ichToken += cchToken) { - int nTokens = ltoken.size(); + nTokens = ltoken.size(); if (nTokens == 0 && thisFunction != null && thisFunction.chpt0 == 0) thisFunction.chpt0 = ichToken; if (lookingAtLeadingWhitespace()) @@ -388,32 +401,38 @@ if ((endOfLine = lookingAtEndOfLine()) || lookingAtEndOfStatement()) cchToken += nChar; ichToken = ichCurrentCommand; + isEndOfCommand = true; } else { endOfLine = lookingAtEndOfLine(); } - if (nTokens == 0) { - isNewSet = isSetBrace = false; - ptNewSetModifier = 1; - nSemiSkip = 0; - braceCount = 0; - bracketCount = 0; - } - if (comment != null || endOfLine || lookingAtEndOfStatement()) { + isEndOfCommand = isEndOfCommand || endOfLine || lookingAtEndOfStatement(); + if (isEndOfCommand) { + isEndOfCommand = false; if (nTokens > 0 || comment != null) { if (nTokens == 0) { + // just a comment ichCurrentCommand = ichToken; if (comment != null) addTokenToPrefix(new Token(Token.nada, (comment.length() == 1 ? comment : comment.substring(1)))); } + // end of command or comment iCommand = lltoken.size(); if (thisFunction != null && thisFunction.cmdpt0 < 0) { thisFunction.cmdpt0 = iCommand; } - if (parenCount > 0 || bracketCount > 0 || braceCount > 0) - return error(ERROR_endOfCommandUnexpected); + if (bracketCount > 0 || setBraceCount > 0 || parenCount > 0) + return error(nTokens == 1 ? ERROR_commandExpected + : ERROR_endOfCommandUnexpected); + if (braceCount == 1 && !checkFlowStartBrace(true)) + return error(nTokens == 1 ? ERROR_commandExpected + : ERROR_endOfCommandUnexpected); if (!compileCommand()) return false; + if (logMessages) { + Logger.debug("-------------------------------------"); + } + if (!Token.tokAttr(tokCommand, Token.noeval) || atokenInfix[0].intValue <= 0) { if (iCommand == lnLength) { @@ -434,6 +453,9 @@ tokCommand = Token.nada; tokenCommand = null; iHaveQuotedString = false; + isNewSet = isSetBrace = false; + ptNewSetModifier = 1; + nSemiSkip = 0; comment = null; } if (ichToken < cchScript) { @@ -443,7 +465,18 @@ ichCurrentCommand = ichToken + cchToken; continue; } - break; + // check for end of all brace work + tokenCommand = Token.tokenAll; + tokCommand = 1; + tok = checkFlowEndBrace(); + if (tok == Token.nada) + return false; + else if (tok == -1) { + isEndOfCommand = true; + cchToken = 0; + continue; + } + break; // main for loop } char ch; if (nTokens > 0) { @@ -451,9 +484,12 @@ ch = script.charAt(ichToken); if (tokCommand == Token.set || Token.tokAttr(tokCommand, Token.setparam)) { - // axes, background, define, display, echo, frank, hbond, history, set, var - // can all appear with or without "set" in front of them. These are then - // both commands and parameters for the SET command, but only if they are + // axes, background, define, display, echo, frank, hbond, history, + // set, var + // can all appear with or without "set" in front of them. These + // are then + // both commands and parameters for the SET command, but only if + // they are // the FIRST parameter of the set command. if (Token.tokAttr(tokCommand, Token.setparam) && ch == '=' || (isNewSet || isSetBrace) @@ -498,8 +534,7 @@ if (nTokens == 1 && lookingAtLoadFormat()) { String strFormat = script.substring(ichToken, ichToken + cchToken); strFormat = strFormat.toLowerCase(); - if (Parser - .isOneOf(strFormat, LOAD_TYPES)) + if (Parser.isOneOf(strFormat, LOAD_TYPES)) addTokenToPrefix(new Token(Token.identifier, strFormat)); else if (strFormat.indexOf("=") == 0) { addTokenToPrefix(new Token(Token.string, strFormat)); @@ -538,11 +573,11 @@ } if (tokCommand == Token.write) { int pt = cchToken; - //write image spt filename - //write script filename - //write spt filename - //write jpg filename - //write filename + // write image spt filename + // write script filename + // write spt filename + // write jpg filename + // write filename if (nTokens == 2 && lastToken.tok == Token.frame) iHaveQuotedString = true; if (nTokens > 2 && !iHaveQuotedString && lookingAtSpecialString()) { @@ -578,7 +613,8 @@ if (lookingAtDecimal()) { value = // can't use parseFloat with jvm 1.1 - // Float.parseFloat(script.substring(ichToken, ichToken + cchToken)); + // Float.parseFloat(script.substring(ichToken, ichToken + + // cchToken)); Float.valueOf(script.substring(ichToken, ichToken + cchToken)) .floatValue(); int intValue = (modelValue(script.substring(ichToken, ichToken @@ -615,13 +651,15 @@ FlowContext f = getBreakableContext(val = Math.abs(val)); if (f == null) return error(ERROR_badContext, (String) tokenCommand.value); - ((Token) ltoken.get(0)).intValue = f.pt0; //copy + ((Token) ltoken.get(0)).intValue = f.pt0; // copy } addTokenToPrefix(new Token(Token.integer, val, intString)); continue; } - if (tokCommand == Token.structure && nTokens == 2 - || tokCommand == Token.frame && nTokens == 2 + if (tokCommand == Token.structure + && nTokens == 2 + || tokCommand == Token.frame + && nTokens == 2 || lastToken.tok == Token.select || lastToken.tok == Token.within || !(lastToken.tok == Token.identifier || tokenAttr(lastToken, @@ -632,14 +670,15 @@ // structure helix ({...}) // NOT myfunc({...}) // NOT mathFunc({...}) - // if you want to use a bitset there, you must use + // if you want to use a bitset there, you must use // bitsets properly: x.distance( ({1 2 3}) ) boolean isBond = (script.charAt(ichToken) == '['); BitSet bs = lookingAtBitset(); if (bs != null) { if (isBond) addTokenToPrefix(new Token(Token.bitset, new BondSet(bs))); - // occasionally BondSet appears unknown in Eclipse even though it is defined + // occasionally BondSet appears unknown in Eclipse even though it + // is defined // in Eval.java -- doesn't seem to matter. else addTokenToPrefix(new Token(Token.bitset, bs)); @@ -667,22 +706,47 @@ else token = new Token(Token.identifier, ident); } - int tok = token.tok; + tok = token.tok; switch (tok) { + case Token.leftbrace: + braceCount++; + if (braceCount == 1 && parenCount == 0 && checkFlowStartBrace(false)) { + isEndOfCommand = true; + continue; + } + + // fall through case Token.leftparen: - case Token.leftbrace: parenCount++; // the select() function uses dual semicolon notation - // but we must differentiate from isosurface select(...) and set picking select - if (nTokens > 1 && (lastToken.tok == Token.select || lastToken.tok == Token.forcmd || lastToken.tok == Token.ifcmd)) + // but we must differentiate from isosurface select(...) and set + // picking select + if (nTokens > 1 + && (lastToken.tok == Token.select + || lastToken.tok == Token.forcmd || lastToken.tok == Token.ifcmd)) nSemiSkip += 2; break; + case Token.rightbrace: + if (iBrace > 0 && parenCount == 0 && braceCount == 0) { + ichBrace = ichToken; + if (nTokens == 0) { + braceCount = parenCount = 1; + } else { + braceCount = parenCount = nSemiSkip = 0; + vBraces.add(token); + iBrace++; + isEndOfCommand = true; + continue; + } + } + braceCount--; + // fall through case Token.rightparen: - case Token.rightbrace: parenCount--; if (parenCount < 0) return error(ERROR_tokenUnexpected, (String) token.value); - // we need to remove the semiskip if parentheses or braces have been closed. 11.5.46 + // we need to remove the semiskip if parentheses or braces have been + // closed. 11.5.46 if (parenCount == 0) nSemiSkip = 0; break; @@ -697,77 +761,55 @@ switch (tokCommand) { // special cases case Token.nada: + // first token in command lastToken = Token.tokenOff; ichCurrentCommand = ichToken; tokenCommand = token; tokCommand = tok; + + // checking first here for a flow command because + // if (......) {.....} ELSE if (Token.tokAttr(tokCommand, Token.flowCommand)) { - int pt = lltoken.size(); - boolean isEnd = false; - boolean isNew = true; - switch (tok) { - case Token.end: - if (flowContext == null) - return error(ERROR_badContext, "end"); - isEnd = true; - if (flowContext.token.tok != Token.function) - token = new Token(tok, -flowContext.pt0, token.value); //copy - break; - case Token.ifcmd: - case Token.forcmd: - case Token.whilecmd: - break; - case Token.endifcmd: - isEnd = true; - if (flowContext == null || flowContext.token.tok != Token.ifcmd - && flowContext.token.tok != Token.elsecmd - && flowContext.token.tok != Token.elseif) - return error(ERROR_badContext, "endif"); - break; - case Token.elsecmd: - if (flowContext == null || flowContext.token.tok != Token.ifcmd - && flowContext.token.tok != Token.elseif) - return error(ERROR_badContext, "else"); - flowContext.token.intValue = flowContext.pt0 = pt; - break; - case Token.breakcmd: - case Token.continuecmd: - isNew = false; - FlowContext f = getBreakableContext(0); - if (f == null) - return error(ERROR_badContext, (String) token.value); - token = new Token(tok, f.pt0, token.value); //copy - break; - case Token.elseif: - if (flowContext == null || flowContext.token.tok != Token.ifcmd - && flowContext.token.tok != Token.elseif - && flowContext.token.tok != Token.elsecmd) - return error(ERROR_badContext, "elseif"); - flowContext.token.intValue = flowContext.pt0 = pt; - break; - case Token.function: - if (flowContext != null) - return error(ERROR_badContext, "function"); - break; + if (iBrace > 0 + && Token.tokAttrOr(tokCommand, Token.elsecmd, Token.elseif)) { + if (((Token) vBraces.get(iBrace - 1)).tok == Token.rightbrace) { + vBraces.remove(--iBrace); + vBraces.remove(--iBrace); + } } - if (isEnd) { - flowContext.token.intValue = pt; - if (tok == Token.endifcmd) - flowContext = flowContext.parent; - } else if (isNew) { - token = new Token(tok, token.value); //copy - if (tok == Token.elsecmd || tok == Token.elseif) - flowContext.token = token; - else - flowContext = new FlowContext(token, pt, flowContext); - } + } + // before processing this command, check to see if we have completed + // a right-brace. + int ret = checkFlowEndBrace(); + if (ret == Token.nada) + return false; + else if (ret == -1) { + // yes, so re-read this one + isEndOfCommand = true; + cchToken = 0; + continue; + } + + if (Token.tokAttr(tokCommand, Token.flowCommand)) { + if (!checkFlowCommand((String) tokenCommand.value)) + return false; + token = tokenCommand; break; } + + if (tok == Token.rightbrace) { + // if }, just push onto vBrace, but NOT onto ltoken + vBraces.add(tokenCommand); + iBrace++; + tokCommand = Token.nada; + continue; + } if (Token.tokAttr(tokCommand, Token.command)) break; + // not the standard command - // either {xxx}.yyy = - // or xxx = + // either {xxx}.yyy = + // or xxx = // but not xxx = where xxx is a known "set xxx" variant // such as "set hetero" or "set hydrogen" or "set solvent" isSetBrace = (tok == Token.leftbrace); @@ -776,38 +818,39 @@ return commandExpected(); tokCommand = Token.set; isNewSet = !isSetBrace; - braceCount = (isSetBrace ? 1 : 0); + setBraceCount = (isSetBrace ? 1 : 0); bracketCount = 0; ptNewSetModifier = (isNewSet ? 1 : Integer.MAX_VALUE); break; case Token.function: if (tokenCommand.intValue == 0) { if (nTokens != 1) - break; + break; // anything after name is ok // user has given macro command tokenCommand.value = ident; - continue; + continue; // don't store name in stack } if (nTokens == 1) { flowContext.setFunction(thisFunction = new Function(ident)); - break; + break; // function f } if (nTokens == 2) { if (tok != Token.leftparen) return error(ERROR_tokenExpected, "("); - break; + break; // function f ( } if (nTokens == 3 && tok == Token.rightparen) - break; + break; // function f ( ) if (nTokens % 2 == 0) { + // function f ( x , y ) if (tok != Token.comma && tok != Token.rightparen) - return error(ERROR_tokenExpected, ", / )"); + return error(ERROR_tokenExpected, ", )"); break; } thisFunction.addVariable(ident, true); break; case Token.elsecmd: - if (nTokens != 1 || tok != Token.ifcmd) + if (nTokens != 1 || tok != Token.ifcmd && tok != Token.leftbrace) return error(ERROR_badArgumentCount); ltoken.removeElementAt(0); ltoken.addElement(token = new Token(Token.elseif, "elseif")); @@ -825,28 +868,10 @@ case Token.end: if (nTokens != 1) return error(ERROR_badArgumentCount); - if (flowContext == null || flowContext.token.tok != tok) - if (tok != Token.ifcmd || flowContext.token.tok != Token.elsecmd - && flowContext.token.tok != Token.elseif) - return error(ERROR_badContext, "end " + ident); - switch (tok) { - case Token.ifcmd: - case Token.forcmd: - case Token.whilecmd: - break; - case Token.function: - if (!isCheckOnly) - addTokenToPrefix(new Token(Token.function, thisFunction)); - flowContext.setFunction(script, ichCurrentCommand, lltoken.size(), - lineNumbers, lineIndices, lltoken); - thisFunction = null; - tokenCommand.intValue = 0; - flowContext = flowContext.parent; + if (!checkFlowEnd(tok, ident, ichCurrentCommand)) + return false; + if (tok == Token.function) continue; - default: - return error(ERROR_unrecognizedToken, "end " + ident); - } - flowContext = flowContext.parent; break; case Token.forcmd: if (nTokens == 1) { @@ -858,17 +883,17 @@ break; case Token.set: if (tok == Token.leftbrace) - braceCount++; + setBraceCount++; else if (tok == Token.rightbrace) { - braceCount--; - if (isSetBrace && braceCount == 0 + setBraceCount--; + if (isSetBrace && setBraceCount == 0 && ptNewSetModifier == Integer.MAX_VALUE) ptNewSetModifier = nTokens + 1; } if (nTokens == ptNewSetModifier) { // 1 when { is not present boolean isSetArray = false; if (tok == Token.opEQ || tok == Token.leftsquare) { - // x = or x[n] = + // x = or x[n] = token = (Token) ltoken.get(0); ltoken.removeElementAt(0); isSetArray = (tok == Token.leftsquare); @@ -937,7 +962,7 @@ if (nTokens == 2) { if (tok == Token.opEQ) { // we are looking at @x =.... just insert a SET command - // and ignore the =. It's the same as set @x ... + // and ignore the =. It's the same as set @x ... ltoken.insertElementAt(Token.tokenSet, 0); continue; } @@ -970,6 +995,141 @@ return true; } + private boolean checkFlowStartBrace(boolean atEnd) { + if (!Token.tokAttr(tokCommand, Token.flowCommand) + || tokCommand == Token.breakcmd || tokCommand == Token.continuecmd) + return false; + if (atEnd) { + //ltoken.remove(--nTokens); + vBraces.add(tokenCommand); + iBrace++; + parenCount = braceCount = 0; + } + return true; + } + + private int checkFlowEndBrace() { + if (iBrace <= 0 + || ((Token) vBraces.get(iBrace - 1)).tok != Token.rightbrace) + return tokCommand; + // time to execute end + Token t0 = tokenCommand; + vBraces.remove(--iBrace); + Token token = (Token) vBraces.remove(--iBrace); + tokenCommand = new Token(Token.end, "end"); + tokCommand = tokenCommand.tok; + if (!checkFlowCommand("end")) + return Token.nada; + addTokenToPrefix(tokenCommand); + switch (token.tok) { + case Token.ifcmd: + case Token.elsecmd: + case Token.elseif: + token = Token.tokenIf; + break; + default: + token = Token.getTokenFromName((String)token.value); + break; + } + if (!checkFlowEnd(token.tok, (String)token.value, ichBrace)) + return Token.nada; + if (token.tok != Token.function) + addTokenToPrefix(token); + tokenCommand = t0; + tokCommand = tokenCommand.tok; + return -1; + } + + private boolean checkFlowCommand(String ident) { + int pt = lltoken.size(); + boolean isEnd = false; + boolean isNew = true; + switch (tokCommand) { + case Token.end: + if (flowContext == null) + return error(ERROR_badContext, ident); + isEnd = true; + if (flowContext.token.tok != Token.function) + tokenCommand = new Token(tokCommand, -flowContext.pt0, ident); //copy + break; + case Token.ifcmd: + case Token.forcmd: + case Token.whilecmd: + break; + case Token.endifcmd: + isEnd = true; + if (flowContext == null || flowContext.token.tok != Token.ifcmd + && flowContext.token.tok != Token.elsecmd + && flowContext.token.tok != Token.elseif) + return error(ERROR_badContext, ident); + break; + case Token.elsecmd: + if (flowContext == null || flowContext.token.tok != Token.ifcmd + && flowContext.token.tok != Token.elseif) + return error(ERROR_badContext, ident); + flowContext.token.intValue = flowContext.pt0 = pt; + break; + case Token.breakcmd: + case Token.continuecmd: + isNew = false; + FlowContext f = getBreakableContext(0); + if (f == null) + return error(ERROR_badContext, ident); + tokenCommand = new Token(tokCommand, f.pt0, ident); //copy + break; + case Token.elseif: + if (flowContext == null || flowContext.token.tok != Token.ifcmd + && flowContext.token.tok != Token.elseif + && flowContext.token.tok != Token.elsecmd) + return error(ERROR_badContext, "elseif"); + flowContext.token.intValue = flowContext.pt0 = pt; + break; + case Token.function: + if (flowContext != null) + return error(ERROR_badContext, "function"); + break; + } + if (isEnd) { + flowContext.token.intValue = pt; + if (tokCommand == Token.endifcmd) + flowContext = flowContext.parent; + } else if (isNew) { + tokenCommand = new Token(tokCommand, tokenCommand.value); //copy + if (tokCommand == Token.elsecmd || tokCommand == Token.elseif) + flowContext.token = tokenCommand; + else + flowContext = new FlowContext(tokenCommand, pt, flowContext); + } + tokCommand = tokenCommand.tok; + return true; + } + + private boolean checkFlowEnd(int tok, String ident, int pt1) { + if (flowContext == null || flowContext.token.tok != tok) + if (tok != Token.ifcmd || flowContext.token.tok != Token.elsecmd + && flowContext.token.tok != Token.elseif) + return error(ERROR_badContext, "end " + ident); + switch (tok) { + case Token.ifcmd: + case Token.forcmd: + case Token.whilecmd: + break; + case Token.function: + if (!isCheckOnly) + addTokenToPrefix(new Token(Token.function, thisFunction)); + flowContext.setFunction(script, pt1, lltoken.size(), + lineNumbers, lineIndices, lltoken); + thisFunction = null; + tokenCommand.intValue = 0; + flowContext = flowContext.parent; + return true; + default: + return error(ERROR_unrecognizedToken, "end " + ident); + } + flowContext = flowContext.parent; + return true; + } + private FlowContext getBreakableContext(int nLevelsUp) { FlowContext f = flowContext; while (f != null && (f.token.tok != Token.forcmd @@ -1571,13 +1731,18 @@ atokenInfix = new Token[ltoken.size()]; ltoken.copyInto(atokenInfix); if (logMessages) { + Logger.debug("token list:"); for (int i = 0; i < atokenInfix.length; i++) Logger.debug(i + ": " + atokenInfix[i]); + Logger.debug("vBraces list:"); + for (int i = 0; i < vBraces.size(); i++) + Logger.debug(i + ": " + vBraces.get(i)); + Logger.debug("-------------------------------------"); } //compile expressions - isEmbeddedExpression = (tokCommand != Token.nada && tokCommand != Token.function + isEmbeddedExpression = (tokCommand != Token.nada && tokCommand != Token.function && tokCommand != Token.end && !Token.tokAttrOr(tokCommand, Token.atomExpressionCommand, Token.implicitStringCommand)); boolean checkExpression = isEmbeddedExpression || (Token.tokAttr(tokCommand, Token.atomExpressionCommand)); Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2009-06-04 02:43:32 UTC (rev 10954) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2009-06-05 06:54:03 UTC (rev 10955) @@ -30,7 +30,6 @@ import org.jmol.util.ArrayUtil; import org.jmol.util.BitSetUtil; import org.jmol.util.ColorEncoder; -import org.jmol.util.CommandHistory; import org.jmol.util.Escape; import org.jmol.util.Logger; import org.jmol.util.Measure; @@ -863,25 +862,29 @@ pcEnd = Integer.MAX_VALUE; if (lineEnd == 0) lineEnd = Integer.MAX_VALUE; + String lastCommand = ""; for (; pc < aatoken.length && pc < pcEnd; pc++) { if (!checkContinue()) break; if (lineNumbers[pc] > lineEnd) break; + //System.out.println("pc line " + pc + " " + lineNumbers[pc]); Token token = (aatoken[pc].length == 0 ? null : aatoken[pc][0]); // when checking scripts, we can't check statments // containing @{...} - thisCommand = getCommand(pc); if (!historyDisabled && !isSyntaxCheck && scriptLevel <= commandHistoryLevelMax && !tQuiet) { - //System.out.println(scriptLevel + " " + thisCommand); - viewer.addCommand(thisCommand); + thisCommand = getCommand(pc, true); + if(token != null && !thisCommand.equals(lastCommand) + && !Token.tokAttr(token.tok, Token.flowCommand) + && thisCommand.length() > 0) + viewer.addCommand(lastCommand = thisCommand); } if (!setStatement(pc)) { - Logger.info(getCommand(pc) + " -- STATEMENT CONTAINING @{} SKIPPED"); + Logger.info(getCommand(pc, true) + " -- STATEMENT CONTAINING @{} SKIPPED"); continue; } - thisCommand = getCommand(pc); + thisCommand = getCommand(pc, false); fullCommand = thisCommand + getNextComment(); iToken = 0; String script = viewer.getInterruptScript(); @@ -1342,9 +1345,18 @@ return lineNumbers[pc]; } - private String getCommand(int pc) { + private String getCommand(int pc, boolean allThisLine) { if (pc >= lineIndices.length) return ""; + if (allThisLine) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < lineNumbers.length; i++) + if (lineNumbers[i] == lineNumbers[pc]) + sb.append(getCommand(i, false)); + else if (lineNumbers[i] == 0 || lineNumbers[i] > lineNumbers[pc]) + break; + return sb.toString(); + } int ichBegin = lineIndices[pc]; int ichEnd = (pc + 1 == lineIndices.length || lineIndices[pc + 1] == 0 ? script .length() @@ -1361,7 +1373,7 @@ s = s.substring(0, i); if ((i = s.indexOf("\r")) >= 0) s = s.substring(0, i); - if (!s.endsWith(";")) + if (s.length() > 0 && !s.endsWith(";")) s += ";"; } catch (Exception e) { Logger.error("darn problem in Eval getCommand: ichBegin=" + ichBegin @@ -1388,7 +1400,7 @@ strbufLog.append(s).append(statementAsString()); viewer.scriptStatus(strbufLog.toString()); } else { - String cmd = getCommand(pc); + String cmd = getCommand(pc, false); if (cmd.length() > 0 && cmd.lastIndexOf(";") == cmd.length() - 1) cmd = cmd.substring(0, cmd.length() - 1); viewer.scriptStatus(cmd); @@ -10623,7 +10635,7 @@ } private String getNextComment() { - String nextCommand = getCommand(pc + 1); + String nextCommand = getCommand(pc + 1, false); return (nextCommand.startsWith("#") ? nextCommand : ""); } @@ -11539,8 +11551,8 @@ if (ignoreError) throw new NullPointerException(); if (!isSyntaxCheck) { - String s = viewer.removeCommand(); - viewer.addCommand(s + CommandHistory.ERROR_FLAG); + //String s = viewer.getSetHistory(1); + //viewer.addCommand(s + CommandHistory.ERROR_FLAG); viewer.setCursor(Viewer.CURSOR_DEFAULT); viewer.setRefreshing(true); } @@ -12095,6 +12107,8 @@ dumpStacks(); Logger.info("\naddX: " + x); } + if (xPt >= 0 && xStack[xPt].tok == Token.expressionEnd) + return wasX = true; //skipping if (xPt + 1 == maxLevel) stackOverflow(); if (wasX && x.tok == Token.integer && x.intValue < 0) { @@ -12106,8 +12120,6 @@ x = new Token(Token.decimal, new Float(-Token.fValue(x))); } xStack[++xPt] = x; - if (logMessages) - Logger.info("addX token " + xStack[xPt]); return wasX = true; } @@ -12198,10 +12210,34 @@ // Do we have the appropriate context for this operator? + boolean skipping = (xPt >= 0 && xStack[xPt].tok == Token.expressionEnd); + if (logMessages) { dumpStacks(); - Logger.info("\naddOp: " + op); + Logger.info("\naddOp: " + op + " skipping=" + skipping + " wasX=" + wasX); } + + // check for ( ? : ) skipping first or second phrase + int tok0 = (oPt >= 0 ? oStack[oPt].tok : 0); + if (skipping) { + switch (op.tok) { + case Token.rightparen: + if (tok0 == op.tok) { + xPt--; + oPt--; + } + break; + case Token.colon: + if (tok0 == op.tok) { + xPt--; + oPt--; + } + wasX = false; + return true; + } + } + + Token newOp = null; int tok; boolean isLeftOp = false; @@ -12214,13 +12250,16 @@ // the word "plane" can also appear alone, not as a function if (oPt >= 1 && op.tok != Token.leftparen - && oStack[oPt].tok == Token.plane) - oPt--; + && tok0 == Token.plane) + tok0 = oStack[--oPt].tok; // math functions as arguments appear without a prefixing operator - boolean isArgument = (oPt >= 1 && oStack[oPt].tok == Token.leftparen); + boolean isArgument = (oPt >= 1 && tok0 == Token.leftparen); switch (op.tok) { + case Token.colon: + skipping = true; + break; case Token.comma: if (!wasX) return false; @@ -12228,11 +12267,12 @@ case Token.min: case Token.max: case Token.minmaxmask: - tok = oPt < 0 ? Token.nada : oStack[oPt].tok; + tok = (oPt < 0 ? Token.nada : tok0); if (!wasX || !(tok == Token.propselector || tok == Token.bonds || tok == Token.atoms)) return false; - oStack[oPt].intValue |= op.tok; + if (!skipping) + oStack[oPt].intValue |= op.tok; return true; case Token.leftsquare: // {....}[n][m] isLeftOp = true; @@ -12248,8 +12288,8 @@ op = new Token(Token.unaryMinus, "-"); break; case Token.rightparen: // () without argument allowed only for math funcs - if (!wasX && oPt >= 1 && oStack[oPt].tok == Token.leftparen - && !isOpFunc(oStack[oPt - 1])) + if (!wasX && oPt >= 1 && tok0 == Token.leftparen + && !isOpFunc(oStack[oPt - 1]) && !skipping) return false; break; case Token.opNot: @@ -12270,31 +12310,31 @@ //do we need to operate? - while (oPt >= 0 - && (!(isLeftOp || op.tok == Token.leftsquare) || (op.tok == Token.propselector || op.tok == Token.leftsquare) - && oStack[oPt].tok == Token.propselector) - && Token.getPrecedence(oStack[oPt].tok) >= Token - .getPrecedence(op.tok)) { + while (oPt >= 0 && !skipping + && (!(isLeftOp || op.tok == Token.leftsquare) + || (op.tok == Token.propselector || op.tok == Token.leftsquare) + && tok0 == Token.propselector) + && Token.getPrecedence(tok0) >= Token.getPrecedence(op.tok)) { if (logMessages) { dumpStacks(); Logger.info("\noperating, oPt=" + oPt + " isLeftOp=" + isLeftOp - + " oStack[oPt]=" + Token.nameOf(oStack[oPt].tok) - + " prec=" + Token.getPrecedence(oStack[oPt].tok) + + " oStack[oPt]=" + Token.nameOf(tok0) + + " prec=" + Token.getPrecedence(tok0) + " pending op=\"" + Token.nameOf(op.tok) + "\" prec=" + Token.getPrecedence(op.tok)); } // ) and ] must wait until matching ( or [ is found - if (op.tok == Token.rightparen && oStack[oPt].tok == Token.leftparen) { + if (op.tok == Token.rightparen && tok0 == Token.leftparen) { // (x[2]) finalizes the selection if (xPt >= 0) xStack[xPt] = Token.selectItem(xStack[xPt]); break; } - if (op.tok == Token.rightsquare && oStack[oPt].tok == Token.array) { + if (op.tok == Token.rightsquare && tok0 == Token.array) { break; } - if (op.tok == Token.rightsquare && oStack[oPt].tok == Token.leftsquare) { + if (op.tok == Token.rightsquare && tok0 == Token.leftsquare) { if (xPt == 0 && isAssignment) { addX(Token.tokenArraySelector); break; @@ -12310,7 +12350,7 @@ if (!operate()) return false; - + tok0 = (oPt >= 0 ? oStack[oPt].tok : 0); } // now add a marker on the xStack if necessary @@ -12322,13 +12362,21 @@ // right ) and ] are not added to the stack switch (op.tok) { - + case Token.opIf: + if (!skipping) { + boolean isFirst = Token.bValue(getX()); + oStack[++oPt] = Token.tokenColon; + addX(isFirst ? Token.tokenExpressionBegin : Token.tokenExpressionEnd); + } + wasX = false; + return true; case Token.comma: wasX = false; return true; case Token.leftparen: parenCount++; wasX = false; + skipping = false; break; case Token.leftsquare: squareCount++; @@ -12364,8 +12412,26 @@ wasX = false; } + // check for end of ( ? : ) first-phrase reading + + // check for ( ? : ) reading only first phrase + + if (xPt >= 1 && xStack[xPt - 1].tok == Token.expressionBegin) { + switch (op.tok) { + case Token.colon: + if (oStack[oPt].tok == Token.colon) { + xStack[xPt - 1] = xStack[xPt]; + xStack[xPt] = Token.tokenExpressionEnd; + oStack[oPt] = Token.tokenRightParen; + return true; + } + } + } + //add the operator if possible - + + if (skipping) + return true; if (++oPt >= maxLevel) stackOverflow(); oStack[oPt] = op; @@ -12432,7 +12498,6 @@ //we cannot know what variables are real //if this is a property selector, as in x.func(), then we //just exit; otherwise we add a new TRUE to xStack - System.out.println("eval func " + Integer.toHexString(tok) + " " + Integer.toHexString(Token.label)); if (isScriptCheck) return (op.tok == Token.propselector ? true : addX(true)); switch (tok) { @@ -13413,12 +13478,14 @@ private boolean operate() throws ScriptException { + + Token op = oStack[oPt--]; + if (logMessages) { - Logger.info("\noperate:"); + Logger.info("\noperate: " + op); dumpStacks(); } - - Token op = oStack[oPt--]; + if (oPt < 0 && op.tok == Token.opEQ && isAssignment) { return (xPt == 2); } Modified: trunk/Jmol/src/org/jmol/viewer/Function.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Function.java 2009-06-04 02:43:32 UTC (rev 10954) +++ trunk/Jmol/src/org/jmol/viewer/Function.java 2009-06-05 06:54:03 UTC (rev 10955) @@ -65,11 +65,12 @@ s.append(", "); s.append(names.get(i)); } - s.append (");\n"); - s.append(script); + s.append (") {\n"); + if (script != null) + s.append(script); if (script == null || script.length() > 0 && script.charAt(script.length() - 1) != '\n') s.append("\n"); - s.append("end function;\n\n"); + s.append("}\n\n"); return s.toString(); } } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-06-04 02:43:32 UTC (rev 10954) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-06-05 06:54:03 UTC (rev 10955) @@ -3,6 +3,41 @@ version=11.7.40 +# new feature: complete freedom from lines and "end if, end for, end while" -- +# just use standard { } notation. If no braces are used, then END must be used: +# +# for (var x = 1; x < {*}; x = x + 1) +# if ({*}[x].temperature < 10) +# ({*}[x]).radius = 1 +# else +# ({*}[x]).radius = 0 +# end if +# end for +# +# same as: +# +# for (var x = 1; x < {*}; x = x + 1){ +# if ({*}[x].temperature < 10) { +# ({*}[x]).radius = 1 +# } else { +# ({*}[x]).radius = 0 +# } +# } +# +# same as: +# +# for (var x = 1; x < {*}; x = x + 1){ +# {{*}[x]}.radius = ({*}[x].temperature < 10 ? 1 : 0) +# } +# +# same as: +# +# for (var x = 1; x < {*}; x = x + 1){{{*}[x]}.radius = ({*}[x].temperature < 10 ? 1 : 0)} +# +# new feature: standard { ... ? ... : ... ) notation in Jmol math: +# +# print ({*} < 100 ? "a small molecule" : "at least 100 atoms") +# # new feature: load "@x" -- inline load of data contained in variable x. # # new feature: {*}.label = xxx and {*}.label("%[label]") and select label="xxx" Modified: trunk/Jmol/src/org/jmol/viewer/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Token.java 2009-06-04 02:43:32 UTC (rev 10954) +++ trunk/Jmol/src/org/jmol/viewer/Token.java 2009-06-05 06:54:03 UTC (rev 10955) @@ -360,7 +360,6 @@ final static int all = expression | 3; final public static int branch = expression | 4; - final static int colon = expression | 5; final static int coord = expression | 6; final static int dollarsign = expression | 7; final static int dot = expression | 8; @@ -416,6 +415,8 @@ final static int rightparen = 1 | mathop | 0 << 4; final static int comma = 0 | mathop | 1 << 4; + final static int opIf = 1 | mathop | 1 << 4; + final static int colon = 2 | mathop | 1 << 4; final static int leftsquare = 0 | mathop | 2 << 4; final static int rightsquare = 1 | mathop | 2 << 4; @@ -1089,8 +1090,10 @@ final static Token tokenOn = new Token(on, 1, "on"); final static Token tokenOff = new Token(off, 0, "off"); final static Token tokenAll = new Token(all, "all"); + final static Token tokenIf = new Token(ifcmd, "if"); final public static Token tokenAnd = new Token(opAnd, "and"); final public static Token tokenOr = new Token(opOr, "or"); + final public static Token tokenOpIf = new Token(opIf, "?"); final public static Token tokenComma = new Token(comma, ","); final static Token tokenPlus = new Token(plus, "+"); final static Token tokenMinus = new Token(minus, "-"); @@ -1106,6 +1109,7 @@ final public static Token tokenExpressionEnd = new Token(expressionEnd, "expressionEnd"); final static Token tokenCoordinateBegin = new Token(leftbrace, "{"); final static Token tokenCoordinateEnd = new Token(rightbrace, "}"); + final static Token tokenColon = new Token(colon, ':'); final static Token tokenSet = new Token(set, '=', ""); final static Token tokenSetArray = new Token(set, '[', ""); final static Token tokenSetProperty = new Token(set, '.', ""); @@ -1320,6 +1324,7 @@ "&", null, "&&", null, "or", tokenOr, + "?", tokenOpIf, "|", null, "||", null, ",", tokenComma, @@ -1347,7 +1352,7 @@ "}", new Token(rightbrace), "$", new Token(dollarsign), "%", new Token(percent), - ":", new Token(colon), + ":", tokenColon, ";", new Token(semicolon), "+", tokenPlus, "-", tokenMinus, Modified: trunk/Jmol/src/org/openscience/jmol/app/ScriptWindow.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/ScriptWindow.java 2009-06-04 02:43:32 UTC (rev 10954) +++ trunk/Jmol/src/org/openscience/jmol/app/ScriptWindow.java 2009-06-05 06:54:03 UTC (rev 10955) @@ -529,10 +529,12 @@ /** * Recall command history. * - * @param up - history up or down + * @param up + * - history up or down */ - void recallCommand(boolean up) { - String cmd = viewer.getSetHistory(up ? -1 : 1); + void recallCommand(boolean up) { + String cmd = viewer.getSetHistory(up ? -1 : 1); + System.out.println(cmd); if (cmd == null) { return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |