Created
February 25, 2009 18:48
-
-
Save gilleain/70342 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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