User commands in OpenAstexViewer
OpenAstexViewer provides support for extending the scripting language with arbitrary commands. This document covers an example of this.If the command part of a scripting command is not recognized a class file of that name is search for. If this is found an instance is created using reflection, and the static method handleCommand is called with a reference to the MoleculeViewer, the MoleculeRenderer and the argument list.
The command can do quite complicated things. The example below creates an instance of itself which is a subclass of GraphicalObject. This starts a thread which will animate the renderer. The object steps through the atoms that were passed as part of the command, and draws a green sphere in turn at the position of each atom.
The command would be used something like
animated -name calpha -atoms { atom CA };
Note the '{' and '}' characters that enclose the atom selection. These are important for the parser in commands that have arbitrary argument lists.
// Source code for the class animated
import astex.*;
public class animated extends GraphicalObject implements Runnable {
/** The MoleculeRenderer we will animate. */
public MoleculeRenderer moleculeRenderer = null;
/** The atoms. */
public DynamicArray atoms = null;
/** The step we are on. */
public int step = 0;
/** The Thread that animates us. */
public Thread thread = null;
/** Handle a command. */
public static void handleCommand(MoleculeViewer mv,
MoleculeRenderer mr,
Arguments args){
if(args.defined("-atoms")){
animated animationObject = new animated();
animationObject.atoms = (DynamicArray)args.get("-atoms");
String name = args.getString("-name", "animationObject");
animationObject.setName(name);
animationObject.moleculeRenderer = mr;
mr.renderer.addTmesh(animationObject);
animationObject.thread = new Thread(animationObject);
animationObject.thread.start();
}else{
System.out.println("animated: no atoms specified");
}
}
/** Extend the render method. */
public void render(){
Renderer renderer = getRenderer();
// if we get deleted, our Renderer will get set to null
// and we should stop the thread
if(renderer == null){
thread.stop();
return;
}
if(atoms != null){
Atom atom = (Atom)atoms.get(step);
renderer.drawSphere(atom.x, atom.y, atom.z, 2.0, Color32.green, 128);
}
}
/** Implement the Runnable interface. */
public void run(){
while(true){
if(atoms != null){
if(step >= atoms.size()){
step = 0;
}
moleculeRenderer.repaint();
step++;
}
try {
Thread.sleep(2000);
}catch(InterruptedException e){
}
}
}
}
AstexViewer™ Copyright (C) 1999-2007 Astex Therapeutics Ltd.
OpenAstexViewer Copyright (C) 2007-2017 Mike Hartshorn