Hi Ekkehard, thanks a lot. Very useful indeed. We've been using a different library (from Apache project, I think) but it used to be quite a memory hog.
So, we could make a tool class from your code, if no one objects? Let's see what people think. Cheers, Chris [EMAIL PROTECTED] wrote: > > Hi, > > I am working in an analytical chemistry environment and recently found a > way to render structures in various vector formats. On the outset we > wanted to deliver EPS files to the software of our NMR spectrometers for > inclusion on spectra printout. I found the FreeHEP java library > containing a vector graphics package > (http://java.freehep.org/vectorgraphics/index.html) which nicely filled > the gap. > > After a recent question about SVG rendering I thought I send an example > to the list. Perhaps it is useful for others as well. It reads a MOL > file and can output EPS, PDF, SVG and PNG files. > > Regards, > Ekkehard > > > > -- vectorRender.java -- > > import java.io.File; > import java.io.BufferedReader; > import java.io.FileReader; > import java.io.StringReader; > > import javax.imageio.ImageIO; > > import java.awt.Image; > import java.awt.Color; > import java.awt.Dimension; > import java.awt.Graphics2D; > import java.awt.image.BufferedImage; > > import java.util.Properties; > > import org.freehep.graphics2d.VectorGraphics; > import org.freehep.graphicsio.ps.PSGraphics2D; > import org.freehep.graphicsio.pdf.PDFGraphics2D; > import org.freehep.graphicsio.svg.SVGGraphics2D; > > > import org.openscience.cdk.Molecule; > import org.openscience.cdk.aromaticity.HueckelAromaticityDetector; > import org.openscience.cdk.geometry.GeometryTools; > import org.openscience.cdk.io.MDLReader; > import org.openscience.cdk.renderer.Renderer2D; > import org.openscience.cdk.renderer.Renderer2DModel; > import org.openscience.cdk.tools.HydrogenAdder; > > > /* > * @author Ekkehard Goerlach > */ > > public class vectorRender { > > public static class ChemRenderer { > > private int vRenderSizeX = 600; > private int vRenderSizeY = 400; > private int vFontSize = 26; > > /* > * Creates a structure image based on a MOL string. The image > rendering is > * done with CDK. > */ > public final java.awt.Image getImage4MOL(String molfile) throws > Exception { > > // creates CDK Molecule object and get the renderer > Molecule mol = prepareMolecule(molfile); > Renderer2D renderer = prepareRenderer(mol); > > BufferedImage bimage = null; > try { > > // paint molecule to java.awt.BufferedImage > bimage = new BufferedImage(vRenderSizeX, vRenderSizeY, > BufferedImage.TYPE_BYTE_INDEXED); > Graphics2D g = bimage.createGraphics(); > g.setBackground(Color.WHITE); > g.setColor(Color.WHITE); > g.fillRect(0, 0, vRenderSizeX, vRenderSizeY); > renderer.paintMolecule(mol, g, false, true); > > } catch (Exception e) { > e.printStackTrace(); > throw new Exception("Rendering of structure(s) failed"); > } > > return bimage; > } > > /* > * Creates a structure EPS based on a MOL string > */ > public final void writeMOL2PNGFile(String MOLString, File > pngFile) throws Exception { > > BufferedImage bimage = null; > > try { > bimage = (BufferedImage) getImage4MOL(MOLString); > ImageIO.write(bimage, "png", pngFile); > > } catch (Exception e) { > e.printStackTrace(); > throw new Exception("EPS rendering of structure(s) failed"); > } > > } > > /* > * Creates a structure EPS based on a MOL string > */ > public final void writeMOL2EPSFile(String MOLString, File > epsFile) throws Exception { > > // creates CDK Molecule object and get the renderer > Molecule mol = prepareMolecule(MOLString); > Renderer2D renderer = prepareRenderer(mol); > > try { > > // paint molecule to java.awt.BufferedImage > VectorGraphics vg = new PSGraphics2D(epsFile, new > Dimension(vRenderSizeX, vRenderSizeY)); > > Properties p = new Properties(); > p.setProperty("PageSize","A5"); > vg.setProperties(p); > vg.startExport(); > renderer.paintMolecule(mol, vg, false, true); > vg.endExport(); > } catch (Exception e) { > e.printStackTrace(); > throw new Exception("EPS rendering of structure(s) failed"); > } > > } > > > /* > * Creates a structure PDF based on a MOL string > */ > public final void writeMOL2PDFFile(String MOLString, File > epsFile) throws Exception { > > // creates CDK Molecule object and get the renderer > Molecule mol = prepareMolecule(MOLString); > Renderer2D renderer = prepareRenderer(mol); > > try { > > // paint molecule to java.awt.BufferedImage > VectorGraphics vg = new PDFGraphics2D(epsFile, new > Dimension(vRenderSizeX, vRenderSizeY)); > > Properties p = new Properties(); > p.setProperty("PageSize","A5"); > vg.setProperties(p); > vg.startExport(); > renderer.paintMolecule(mol, vg, false, true); > vg.endExport(); > } catch (Exception e) { > e.printStackTrace(); > throw new Exception("PDF rendering of structure(s) failed"); > } > > } > > > > /* > * Creates a structure SVG based on a MOL string > */ > public final void writeMOL2SVGFile(String MOLString, File > epsFile) throws Exception { > > // creates CDK Molecule object and get the renderer > Molecule mol = prepareMolecule(MOLString); > Renderer2D renderer = prepareRenderer(mol); > > try { > > // paint molecule to java.awt.BufferedImage > VectorGraphics vg = new SVGGraphics2D(epsFile, new > Dimension(vRenderSizeX, vRenderSizeY)); > > Properties p = new Properties(); > p.setProperty("PageSize","A5"); > vg.setProperties(p); > vg.startExport(); > renderer.paintMolecule(mol, vg, false, true); > vg.endExport(); > } catch (Exception e) { > e.printStackTrace(); > throw new Exception("SVG rendering of structure(s) failed"); > } > > } > > > private org.openscience.cdk.renderer.Renderer2D > prepareRenderer(Molecule mol) > throws Exception { > > Renderer2DModel r2dm; > Renderer2D renderer; > Dimension imgSize; > > try { > r2dm = new Renderer2DModel(); > renderer = new Renderer2D(r2dm); > imgSize = new Dimension(vRenderSizeX, vRenderSizeY); // > 1200,900 > // create renderer to render MOLString into an java.awt.Image > // renders 2D structures > r2dm.setBackgroundDimension(imgSize); > r2dm.setBackColor(Color.WHITE); > r2dm.setDrawNumbers(false); > r2dm.setUseAntiAliasing(true); > r2dm.setColorAtomsByType(false); > r2dm.setShowImplicitHydrogens(true); > r2dm.setShowReactionBoxes(false); > r2dm.setKekuleStructure(false); > r2dm.setShowAromaticityInCDKStyle(true); > r2dm.setBondWidth(3); > r2dm.setFont(new java.awt.Font("SansSerif", > java.awt.Font.PLAIN, vFontSize)); > > // scale and center molecule on image > GeometryTools.translateAllPositive(mol, > r2dm.getRenderingCoordinates()); > GeometryTools.scaleMolecule(mol, imgSize, 1.0, r2dm > .getRenderingCoordinates()); > GeometryTools.center(mol, imgSize, > r2dm.getRenderingCoordinates()); > > } catch (Exception e) { > e.printStackTrace(); > throw new Exception("Creation of renderer failed"); > } > > return renderer; > } > > > private org.openscience.cdk.Molecule prepareMolecule(String > MOLString) throws Exception > { > > // creates CDK Molecule object > Molecule mol = null; > try { > > // reads MOL file > MDLReader mdlr = new MDLReader(new StringReader(MOLString)); > mol = (Molecule) mdlr.read(new Molecule()); > > // adds implicit H atoms to molecule > HydrogenAdder ha = new HydrogenAdder(); > ha.addImplicitHydrogensToSatisfyValency(mol); > > // detects aromaticity; used to display aromatic ring > systems correctly > HueckelAromaticityDetector.detectAromaticity(mol); > > } catch (Exception e) { > e.printStackTrace(); > throw new Exception("Rendering of structure(s) failed"); > } > > return mol; > } > > } > > > > public static final void main(final String[] args) { > > > String mf; > String molfile; > > try { > BufferedReader reader = new BufferedReader(new > FileReader("renderTest.mol")); > StringBuffer sbuff = new StringBuffer(); > String line; > > while ( (line = reader.readLine()) != null ) { > sbuff.append(line + "\n"); > } > reader.close(); > molfile = sbuff.toString(); > System.out.println(molfile); > > ChemRenderer crender = new ChemRenderer(); > > crender.writeMOL2SVGFile(molfile,new File("Output.svg")); > > } catch (Exception e) { > System.out.println("Error: " + e.getMessage() + "."); > e.printStackTrace(); > } > > } > > > } > _________________________ > > CONFIDENTIALITY NOTICE > > The information contained in this e-mail message is intended only for > the exclusive use of the individual or entity named above and may > contain information that is privileged, confidential or exempt from > disclosure under applicable law. If the reader of this message is not > the intended recipient, or the employee or agent responsible for > delivery of the message to the intended recipient, you are hereby > notified that any dissemination, distribution or copying of this > communication is strictly prohibited. If you have received this > communication in error, please notify the sender immediately by e-mail > and delete the material from any computer. Thank you. > > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > > > ------------------------------------------------------------------------ > > _______________________________________________ > Cdk-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/cdk-user -- Dr. Christoph Steinbeck Team Leader Chemoinformatics and Metabolism European Bioinformatics Institute (EBI) Wellcome Trust Genome Campus Hinxton, Cambridge CB10 1SD UK Phone +44 1223 49 2640 What is man but that lofty spirit - that sense of enterprise. ... Kirk, "I, Mudd," stardate 4513.3.. ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Cdk-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/cdk-user

