Skip to content

Instantly share code, notes, and snippets.

@gilleain
Created February 25, 2009 18:48
Show Gist options
  • Save gilleain/70342 to your computer and use it in GitHub Desktop.
Save gilleain/70342 to your computer and use it in GitHub Desktop.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.io.iterator.IteratingMDLReader;
import org.openscience.cdk.layout.StructureDiagramGenerator;
import org.openscience.cdk.nonotify.NoNotificationChemObjectBuilder;
import org.openscience.cdk.renderer.Renderer;
import org.openscience.cdk.renderer.RenderingParameters;
import org.openscience.cdk.renderer.font.AWTFontManager;
import org.openscience.cdk.renderer.generators.AtomContainerBoundsGenerator;
import org.openscience.cdk.renderer.generators.BasicAtomGenerator;
import org.openscience.cdk.renderer.generators.BasicBondGenerator;
import org.openscience.cdk.renderer.generators.IGenerator;
import org.openscience.cdk.renderer.visitor.AWTDrawVisitor;
/**
* @author maclean
*
*/
public class SDFPanel extends JPanel {
private ArrayList<IMolecule> molecules;
private ArrayList<Renderer> renderers;
private ArrayList<Rectangle> bounds;
private int rows;
private int cols;
private int boxWidth = 80;
private int boxHeight = 80;
private int boxGap = 10;
private StructureDiagramGenerator sdg = new StructureDiagramGenerator();
public SDFPanel() {
this.molecules = new ArrayList<IMolecule>();
this.renderers = new ArrayList<Renderer>();
this.bounds = new ArrayList<Rectangle>();
this.cols = 0;
this.rows = 0;
this.setBackground(Color.WHITE);
}
public void add(IMolecule molecule) {
sdg.setMolecule(molecule);
try {
sdg.generateCoordinates();
} catch (Exception e) {
e.printStackTrace();
}
this.molecules.add(sdg.getMolecule());
this.renderers.add(new Renderer(getGenerators(), new AWTFontManager()));
}
public void layoutBoxes() {
int s = this.molecules.size();
int width = this.getWidth();
this.cols = (int) ((float)width / (float)(boxWidth + (boxGap * 2)));
this.rows = s / this.cols;
int height = boxGap + (this.rows * (boxHeight + boxGap));
int x = boxGap;
int y = boxGap;
for (int row = 0; row < this.rows; row++) {
for (int col = 0; col < this.cols; col++) {
this.bounds.add(new Rectangle(x, y, boxWidth, boxHeight));
x += boxWidth + boxGap;
}
y += boxHeight + boxGap;
x = boxGap;
}
this.setPreferredSize(new Dimension(width, height));
}
public List<IGenerator> getGenerators() {
List<IGenerator> generators = new ArrayList<IGenerator>();
generators.add(new AtomContainerBoundsGenerator());
generators.add(new BasicBondGenerator());
generators.add(new BasicAtomGenerator());
return generators;
}
public void setModelParameters() {
for (Renderer renderer : this.renderers) {
renderer.getRenderer2DModel().setIsCompact(true);
renderer.getRenderer2DModel().setCompactShape(RenderingParameters.AtomShape.OVAL);
renderer.getRenderer2DModel().setAtomRadius(5);
renderer.getRenderer2DModel().setBondWidth(2);
renderer.getRenderer2DModel().setBondDistance(2);
renderer.getRenderer2DModel().setFitToScreen(true);
}
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
AWTDrawVisitor drawVisitor = new AWTDrawVisitor(g2);
for (int i = 0; i < molecules.size(); i++) {
if (i >= this.bounds.size()) return;
IMolecule molecule = this.molecules.get(i);
Renderer renderer = this.renderers.get(i);
Rectangle bound = this.bounds.get(i);
renderer.paintMolecule(molecule, drawVisitor, bound, true);
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
SDFPanel panel = new SDFPanel();
try {
IteratingMDLReader reader =
new IteratingMDLReader(new FileInputStream(args[0]),
NoNotificationChemObjectBuilder.getInstance());
while (reader.hasNext()) {
IMolecule molecule = (IMolecule) reader.next();
panel.add(molecule);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
panel.setModelParameters();
f.add(panel);
panel.setPreferredSize(new Dimension(1100, 900));
f.pack();
panel.layoutBoxes();
f.setVisible(true);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment