{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "chem-bla-ics",
  "description": "Chemblaics (pronounced chem-bla-ics) is the science that uses open science and computers to solve problems in chemistry, biochemistry and related fields.",
  "home_page_url": "https://chem-bla-ics.linkedchemistry.info/",
  "feed_url": "https://chem-bla-ics.linkedchemistry.info/2010/04/05/cdk-jchempaint-2-rendering-reactions.json",
  "icon": "https://chem-bla-ics.linkedchemistry.info/assets/images/chem-bla-ics_logo.png",
  "language": "en",
  "authors": [
    {
      "name": "Egon Willighagen",
      "url": "https://orcid.org/0000-0001-7542-0286",
      "_orcid": "0000-0001-7542-0286"
    }
  ],
  "items": [

    {
      "id": "https://doi.org/10.59350/wyfzs-jsm57",
      "url": "https://chem-bla-ics.linkedchemistry.info/2010/04/05/cdk-jchempaint-2-rendering-reactions.html",
      "title": "CDK-JChemPaint #2: rendering reactions",
      "content_html": "<p>I posted earlier today <a href=\"https://chem-bla-ics.linkedchemistry.info/2010/04/05/cdk-jchempaint-1-rendering-molecules.html\">a Groovy script to render molecules <i class=\"fa-solid fa-recycle fa-xs\"></i></a>\nwith CDK-JChemPaint 8. Now, the new JChemPaint rendering engine also contains the functionality to render reactions. So, I can also do:</p>\n\n<div class=\"language-shell highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ </span>groovy renderReaction.groovy\n</code></pre></div></div>\n\n<p><img src=\"/assets/images/reaction.png\" alt=\"\" /></p>\n\n<p>The matching script:</p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import</span> <span class=\"nn\">java.util.List</span><span class=\"o\">;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">java.awt.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">java.awt.image.*</span><span class=\"o\">;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">javax.imageio.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">javax.vecmath.*</span><span class=\"o\">;</span>\n\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.geometry.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.interfaces.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.layout.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.renderer.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.renderer.font.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.renderer.generators.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.renderer.visitor.*</span><span class=\"o\">;</span>\n<span class=\"kn\">import</span> <span class=\"nn\">org.openscience.cdk.templates.*</span><span class=\"o\">;</span>\n\n<span class=\"kt\">int</span> <span class=\"no\">WIDTH</span> <span class=\"o\">=</span> <span class=\"mi\">600</span><span class=\"o\">;</span>\n<span class=\"kt\">int</span> <span class=\"no\">HEIGHT</span> <span class=\"o\">=</span> <span class=\"mi\">600</span><span class=\"o\">;</span>\n\n<span class=\"c1\">// the draw area and the image should be the same size</span>\n<span class=\"nc\">Rectangle</span> <span class=\"n\">drawArea</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">Rectangle</span><span class=\"o\">(</span><span class=\"no\">WIDTH</span><span class=\"o\">,</span> <span class=\"no\">HEIGHT</span><span class=\"o\">);</span>\n<span class=\"nc\">Image</span> <span class=\"n\">image</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">BufferedImage</span><span class=\"o\">(</span>\n  <span class=\"no\">WIDTH</span><span class=\"o\">,</span> <span class=\"no\">HEIGHT</span><span class=\"o\">,</span> <span class=\"nc\">BufferedImage</span><span class=\"o\">.</span><span class=\"na\">TYPE_INT_RGB</span>\n<span class=\"o\">);</span>\n\n<span class=\"nc\">IMolecule</span> <span class=\"n\">benzene</span> <span class=\"o\">=</span> <span class=\"nc\">MoleculeFactory</span><span class=\"o\">.</span><span class=\"na\">makeBenzene</span><span class=\"o\">();</span>\n<span class=\"nc\">IMolecule</span> <span class=\"n\">triazole</span> <span class=\"o\">=</span> <span class=\"nc\">MoleculeFactory</span><span class=\"o\">.</span><span class=\"na\">make123Triazole</span><span class=\"o\">();</span>\n<span class=\"nc\">IReaction</span> <span class=\"n\">reaction</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">Reaction</span><span class=\"o\">();</span>\n\n<span class=\"nc\">StructureDiagramGenerator</span> <span class=\"n\">sdg</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">StructureDiagramGenerator</span><span class=\"o\">();</span>\n<span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">setMolecule</span><span class=\"o\">(</span><span class=\"n\">triazole</span><span class=\"o\">);</span>\n<span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">generateCoordinates</span><span class=\"o\">();</span>\n<span class=\"n\">triazole</span> <span class=\"o\">=</span> <span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">getMolecule</span><span class=\"o\">();</span>\n<span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">setMolecule</span><span class=\"o\">(</span><span class=\"n\">benzene</span><span class=\"o\">);</span>\n<span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">generateCoordinates</span><span class=\"o\">();</span>\n<span class=\"n\">benzene</span> <span class=\"o\">=</span> <span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">getMolecule</span><span class=\"o\">();</span>\n<span class=\"k\">try</span> <span class=\"o\">{</span>\n<span class=\"nc\">GeometryTools</span><span class=\"o\">.</span><span class=\"na\">translate2DCenterTo</span><span class=\"o\">(</span><span class=\"n\">benzene</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">Point2d</span><span class=\"o\">(-</span><span class=\"mi\">4</span><span class=\"o\">,</span><span class=\"mi\">0</span><span class=\"o\">))</span>\n<span class=\"nc\">GeometryTools</span><span class=\"o\">.</span><span class=\"na\">translate2DCenterTo</span><span class=\"o\">(</span><span class=\"n\">triazole</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">Point2d</span><span class=\"o\">(</span><span class=\"mi\">4</span><span class=\"o\">,</span><span class=\"mi\">0</span><span class=\"o\">))</span>\n<span class=\"o\">}</span> <span class=\"k\">catch</span> <span class=\"o\">(</span><span class=\"nc\">Exception</span> <span class=\"n\">e</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"na\">printStackTrace</span><span class=\"o\">();</span>\n<span class=\"o\">}</span>\n\n<span class=\"n\">reaction</span><span class=\"o\">.</span><span class=\"na\">addReactant</span><span class=\"o\">(</span><span class=\"n\">benzene</span><span class=\"o\">);</span>\n<span class=\"n\">reaction</span><span class=\"o\">.</span><span class=\"na\">addProduct</span><span class=\"o\">(</span><span class=\"n\">triazole</span><span class=\"o\">);</span>\n\n<span class=\"c1\">// generators make the image elements</span>\n<span class=\"nc\">List</span> <span class=\"n\">generators</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">ArrayList</span><span class=\"o\">();</span>\n<span class=\"n\">generators</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"k\">new</span> <span class=\"nc\">BasicSceneGenerator</span><span class=\"o\">());</span>\n<span class=\"n\">generators</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"k\">new</span> <span class=\"nc\">BasicBondGenerator</span><span class=\"o\">());</span>\n<span class=\"n\">generators</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"k\">new</span> <span class=\"nc\">BasicAtomGenerator</span><span class=\"o\">());</span>\n\n <span class=\"nc\">List</span> <span class=\"n\">reactiongenerators</span> <span class=\"o\">=</span>\n  <span class=\"k\">new</span> <span class=\"nf\">ArrayList</span><span class=\"o\">();</span>\n<span class=\"n\">reactiongenerators</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"k\">new</span> <span class=\"nc\">ReactionArrowGenerator</span><span class=\"o\">());</span>\n<span class=\"n\">reactiongenerators</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"k\">new</span> <span class=\"nc\">ReactionPlusGenerator</span><span class=\"o\">());</span>\n\n<span class=\"c1\">// the renderer needs to have a toolkit-specific font manager</span>\n<span class=\"nc\">Renderer</span> <span class=\"n\">renderer</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">Renderer</span><span class=\"o\">(</span>\n  <span class=\"n\">generators</span><span class=\"o\">,</span> <span class=\"n\">reactiongenerators</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">AWTFontManager</span><span class=\"o\">()</span>\n<span class=\"o\">);</span>\n\n<span class=\"c1\">// the call to 'setup' only needs to be done on the first paint</span>\n<span class=\"n\">renderer</span><span class=\"o\">.</span><span class=\"na\">setup</span><span class=\"o\">(</span><span class=\"n\">reaction</span><span class=\"o\">,</span> <span class=\"n\">drawArea</span><span class=\"o\">);</span>\n\n<span class=\"c1\">// paint the background</span>\n<span class=\"nc\">Graphics2D</span> <span class=\"n\">g2</span> <span class=\"o\">=</span> <span class=\"o\">(</span><span class=\"nc\">Graphics2D</span><span class=\"o\">)</span><span class=\"n\">image</span><span class=\"o\">.</span><span class=\"na\">getGraphics</span><span class=\"o\">();</span>\n<span class=\"n\">g2</span><span class=\"o\">.</span><span class=\"na\">setColor</span><span class=\"o\">(</span><span class=\"nc\">Color</span><span class=\"o\">.</span><span class=\"na\">WHITE</span><span class=\"o\">);</span>\n<span class=\"n\">g2</span><span class=\"o\">.</span><span class=\"na\">fillRect</span><span class=\"o\">(</span><span class=\"mi\">0</span><span class=\"o\">,</span> <span class=\"mi\">0</span><span class=\"o\">,</span> <span class=\"no\">WIDTH</span><span class=\"o\">,</span> <span class=\"no\">HEIGHT</span><span class=\"o\">);</span>\n\n<span class=\"c1\">// the paint method also needs a toolkit-specific renderer</span>\n<span class=\"n\">renderer</span><span class=\"o\">.</span><span class=\"na\">paintReaction</span><span class=\"o\">(</span><span class=\"n\">reaction</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">AWTDrawVisitor</span><span class=\"o\">(</span><span class=\"n\">g2</span><span class=\"o\">));</span>\n\n<span class=\"nc\">ImageIO</span><span class=\"o\">.</span><span class=\"na\">write</span><span class=\"o\">(</span>\n  <span class=\"o\">(</span><span class=\"nc\">RenderedImage</span><span class=\"o\">)</span><span class=\"n\">image</span><span class=\"o\">,</span> <span class=\"s\">\"PNG\"</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">File</span><span class=\"o\">(</span><span class=\"s\">\"reaction.png\"</span><span class=\"o\">)</span>\n<span class=\"o\">);</span>\n</code></pre></div></div>",
      "summary": "I posted earlier today a Groovy script to render molecules with CDK-JChemPaint 8. Now, the new JChemPaint rendering engine also contains the functionality to render reactions. So, I can also do:",
      "image": "https://chem-bla-ics.linkedchemistry.info/assets/images/reaction.png",
      "date_published": "2010-04-05T00:10:00+00:00",
      "date_modified": "2026-07-05T00:00:00+00:00",
      "tags": ["cdk","jchempaint"],
      
      
      
      
      
      
        "authors": [ { "name": "Egon Willighagen", "url": "https://orcid.org/0000-0001-7542-0286" } ]
      
    }

  ]
}
