From: <ha...@us...> - 2013-04-03 17:38:06
|
Revision: 18067 http://sourceforge.net/p/jmol/code/18067 Author: hansonr Date: 2013-04-03 17:38:01 +0000 (Wed, 03 Apr 2013) Log Message: ----------- ___JmolVersion="13.1.15_dev_2013.04.03" new feature: Jmol/JmolData application -I flag accepts input from System.in and command piping: type t.spt | jmol -I start Jmol with this script Note: if you use a pipe, be sure to make "exitJmol" the last command of the script Add -o for output to System.out. Without the pipe, we are going to control Jmol from a Jmol> prompt on the command line console jmol -Io see messages on input console ...mesages from Jmol Jmol>background red;load 1crn.pdb;.... ...messages from Jmol Jmol>exitJmol Add -n for headless operation (will not exit automatically). type t.spt | jmol -Ion Note: if you use a pipe, be sure to make "exitJmol" the last command of the script Add -i for silent operation (no writing to System.output). bug fix: {;...;} syntax does not work in 13.1 Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptContext.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/Jmol.java trunk/Jmol/src/org/openscience/jmol/app/JmolApp.java trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java Added Paths: ----------- trunk/Jmol/src/org/openscience/jmol/app/InputScannerThread.java Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2013-04-03 03:39:45 UTC (rev 18066) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2013-04-03 17:38:01 UTC (rev 18067) @@ -96,6 +96,8 @@ if (!isOK) handleError(); ScriptContext sc = new ScriptContext(); + isOK = (iBrace == 0 && parenCount == 0 && braceCount == 0 && bracketCount == 0); + sc.isComplete = isOK; sc.script = script; sc.scriptExtensions = scriptExtensions; sc.errorType = errorType; @@ -635,7 +637,7 @@ parenCount = setBraceCount = braceCount = 0; ltoken.remove(0); iBrace++; - T t = ContextToken.newContext(false); + T t = ContextToken.newContext(true); addTokenToPrefix(setCommand(t)); pushCount++; vPush.addLast(t); Modified: trunk/Jmol/src/org/jmol/script/ScriptContext.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptContext.java 2013-04-03 03:39:45 UTC (rev 18066) +++ trunk/Jmol/src/org/jmol/script/ScriptContext.java 2013-04-03 17:38:01 UTC (rev 18067) @@ -70,5 +70,6 @@ public boolean allowJSThreads; public boolean displayLoadErrorsSave; public int tryPt; + public boolean isComplete; } \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-04-03 03:39:45 UTC (rev 18066) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-04-03 17:38:01 UTC (rev 18067) @@ -9,8 +9,34 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="13.1.15_dev_01.05.2013e" +___JmolVersion="13.1.15_dev_2013.04.03" +new feature: Jmol/JmolData application -I flag accepts input from System.in and command piping: + + type t.spt | jmol -I start Jmol with this script + + Note: if you use a pipe, be sure to make "exitJmol" the last command of the script + + Add -o for output to System.out. Without the pipe, we are going to control Jmol + from a Jmol> prompt on the command line console + + jmol -Io see messages on input console + ...mesages from Jmol + Jmol>background red;load 1crn.pdb;.... + ...messages from Jmol + Jmol>exitJmol + + Add -n for headless operation (will not exit automatically). + + type t.spt | jmol -Ion + + Note: if you use a pipe, be sure to make "exitJmol" the last command of the script + + Add -i for silent operation (no writing to System.output). + + +bug fix: {;...;} syntax does not work in 13.1 + new feature: dots IGNORE {atom set} ON; bug fix: PyMOL reader "backbone" (really a trace -- fixed width?) Added: trunk/Jmol/src/org/openscience/jmol/app/InputScannerThread.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/InputScannerThread.java (rev 0) +++ trunk/Jmol/src/org/openscience/jmol/app/InputScannerThread.java 2013-04-03 17:38:01 UTC (rev 18067) @@ -0,0 +1,87 @@ +package org.openscience.jmol.app; + +import java.util.Scanner; + +import org.jmol.api.JmolViewer; +import org.jmol.script.ScriptContext; + +public class InputScannerThread extends Thread { + + private JmolViewer viewer; + private Scanner scanner; + private boolean isSilent; + + InputScannerThread(JmolViewer viewer, boolean isSilent) { + this.viewer = viewer; + this.isSilent = isSilent; + start(); + } + + private StringBuilder buffer = new StringBuilder(); + @Override + public synchronized void start() { + scanner = new Scanner(System.in); + scanner.useDelimiter("\n"); + super.start(); + } + + @Override + public void run() { + try { + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); + say(null); + while (true) { + Thread.sleep(1); + if (scanner.hasNext()) { + String s = scanner.next(); + s = s.substring(0, s.length() - 1); + if (s.toLowerCase().equals("exitjmol")) + System.exit(0); + if (viewer.checkHalt(s, false)) { + buffer = new StringBuilder(); + s = ""; + } + buffer.append(s).append('\n'); + if (!checkCommand() && buffer.length() == 1) { + say(null); + } + } + } + } catch (InterruptedException e) { + System.exit(1); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + } + + private void say(String msg) { + if (msg == null) + msg = "Enter: \nexitJmol to exit Jmol\nquit to stop processing and re-initialize input\n!exit to stop all script processing\nJmol>"; + if (!isSilent) + System.out.print(msg); + System.out.flush(); + } + + private boolean checkCommand() { + String strCommand = buffer.toString(); + if (strCommand.length() == 1 || strCommand.charAt(0) == '!' + || viewer.isScriptExecuting() + || viewer.getBooleanProperty("executionPaused")) + return false; + Object ret = viewer.scriptCheck(strCommand); + if (ret instanceof String) { + say((String) ret); + return false; + } + if (ret instanceof ScriptContext) { + ScriptContext c = (ScriptContext) ret; + if (!c.isComplete) { + return true; + } + } + buffer = new StringBuilder(); + viewer.script(strCommand); + return true; + } +} Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2013-04-03 03:39:45 UTC (rev 18066) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2013-04-03 17:38:01 UTC (rev 18067) @@ -41,7 +41,7 @@ public static void main(String[] args) { JmolApp jmolApp = new JmolApp(args); - startJmol(jmolApp); + startJmol(jmolApp); } public static Jmol getJmol(JFrame baseframe, Modified: trunk/Jmol/src/org/openscience/jmol/app/JmolApp.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/JmolApp.java 2013-04-03 03:39:45 UTC (rev 18066) +++ trunk/Jmol/src/org/openscience/jmol/app/JmolApp.java 2013-04-03 17:38:01 UTC (rev 18067) @@ -74,6 +74,7 @@ private String scriptFilename; private String script1 = ""; private String script2 = ""; + private boolean scanInput; //private JmolViewer viewer; @@ -144,6 +145,7 @@ ._("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("I", "input", false, GT._("allow piping of input from System.Input")); options.addOption("k", "kiosk", false, GT ._("kiosk mode -- no frame")); options.addOption("l", "list", false, GT @@ -452,16 +454,21 @@ if (GraphicsEnvironment.isHeadless()) info.put("headlistMaxTimeMs", Integer.valueOf(1000 * (line.hasOption("T") ? Parser.parseInt(line.getOptionValue("T")) : 60))); - // the next two are coupled -- if the -n command line option is - // given, then the -x is added, but not vice-versa. + // the next three are coupled -- if the -n command line option is + // given, but -I is not, then the -x is added, but not vice-versa. // however, if this is an application-embedded object, then // it is ok to have no display and no exit. + // scanner input + if (line.hasOption("I")) + scanInput = true; + + boolean exitUponCompletion = false; if (line.hasOption("n")) { // no display (and exit) haveDisplay = false; - exitUponCompletion = true; + exitUponCompletion = !scanInput; } if (line.hasOption("x")) // exit when script completes (or file is read) @@ -532,7 +539,12 @@ if (splash != null) splash.showStatus(GT._("Executing script 2...")); runScript(script2, isJmolData, viewer); - } + } + + // scanner input + if (scanInput) { + new InputScannerThread(viewer, isSilent); + } } private void runScript(String script, boolean outputResults, JmolViewer viewer) { Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2013-04-03 03:39:45 UTC (rev 18066) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/JmolPanel.java 2013-04-03 17:38:01 UTC (rev 18067) @@ -580,16 +580,14 @@ @Override public void windowClosing(WindowEvent e) { - doClose(false); + doClose(); } } - protected boolean doClose(boolean isExit) { - if ((isExit || numWindows == 1) && JOptionPane.showConfirmDialog(frame, GT._("Exit Jmol?"), + protected boolean doClose() { + if (numWindows == 1 && JOptionPane.showConfirmDialog(frame, GT._("Exit Jmol?"), "Exit", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) return false; - if (isExit) - System.exit(0); dispose(frame); return true; } @@ -1014,7 +1012,7 @@ } public void actionPerformed(ActionEvent e) { - if (!doClose(false)) { + if (!doClose()) { viewer.script("zap"); } } @@ -1253,7 +1251,7 @@ } public void actionPerformed(ActionEvent e) { - doClose(true); + System.exit(0); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |