posts - 431,  comments - 344,  trackbacks - 0

          import Java.awt.Dimension;
          import Java.awt.Graphics2D;
          import Java.awt.geom.Rectangle2D;
          import Java.awt.image.BufferedImage;
          import Java.io.OutputStream;
          import Java.io.StringReader;
          import Java.util.Iterator;

          import javax.servlet.http.HttpServletResponse;
          import javax.vecmath.Point2d;

          import org.apache.log4j.Logger;
          import org.openscience.cdk.Molecule;
          import org.openscience.cdk.interfaces.IAtom;
          import org.openscience.cdk.interfaces.IMolecule;
          import org.openscience.cdk.io.MDLReader;
          import org.openscience.cdk.layout.StructureDiagramGenerator;
          import org.openscience.cdk.renderer.Renderer2DModel;
          import org.openscience.cdk.renderer.SimpleRenderer2D;

          public class ImageTypeExporterUtil {
           private static final Logger logger = Logger.getLogger(ImageTypeExporterUtil.class);
           
           /**
            * show molecule structure to image type (png, jpeg)
            *
            * @param mol String molecule stucture
            * @param length width and height
            * @param response HttpServletResponse object
            * @throws Exception
            *             if occurred exception ,then throw Exception
            */
           public static void showAsImage(String stucture, Integer length, HttpServletResponse response) throws Exception {
            logger.debug("ImageTypeExporterUtil.showAsImage..");
            
            StringReader mdl = new StringReader(stucture);
            MDLReader cdkMDL = new MDLReader(mdl);
            Molecule mol = new Molecule();
            cdkMDL.read(mol);
            // null coordinates
            Iterator<IAtom> itatoms = mol.atoms();
            while (itatoms.hasNext()) {
             IAtom atom = itatoms.next();
             atom.setPoint2d(null);
             atom.setPoint3d(null);
            }
            // generate 2D coordinates
            StructureDiagramGenerator sdg = new StructureDiagramGenerator();
            sdg.setMolecule(mol);
            try {
             sdg.generateCoordinates();
            } catch (Exception ex) {
             ex.printStackTrace();
            }
            IMolecule layedOutMol = sdg.getMolecule();
            // scale molecule
            final double UNDEF_POS = 100000;
            double minX = UNDEF_POS, minY = UNDEF_POS, maxX = UNDEF_POS, maxY = UNDEF_POS;
            itatoms = layedOutMol.atoms();
            while (itatoms.hasNext()) {
             IAtom atom = itatoms.next();
             Point2d point2d = atom.getPoint2d();
             if (minX == UNDEF_POS || minX > point2d.x)
              minX = point2d.x;
             if (minY == UNDEF_POS || minY > point2d.y)
              minY = point2d.y;
             if (maxX == UNDEF_POS || maxX < point2d.x)
              maxX = point2d.x;
             if (maxY == UNDEF_POS || maxY < point2d.y)
              maxY = point2d.y;
            }
            double scaleX = length / (maxX - minX + 1);
            double scaleY = length / (maxY - minY + 1);
            double scale = scaleX > scaleY ? scaleY : scaleX;
            double centreX = scale * (maxX + minX) / 2.;
            double centreY = scale * (maxY + minY) / 2.;
            double offsetX = length / 2. - centreX;
            double offsetY = length / 2. - centreY;
            itatoms = layedOutMol.atoms();
            while (itatoms.hasNext()) {
             IAtom atom = itatoms.next();
             Point2d a = atom.getPoint2d();
             Point2d b = new Point2d();
             b.x = a.x * scale + offsetX;
             b.y = a.y * scale + offsetY;
             atom.setPoint2d(b);
            }
            // set rendering properties
            Renderer2DModel r2dm = new Renderer2DModel();
            r2dm.setDrawNumbers(false);
            r2dm.setUseAntiAliasing(true);
            r2dm.setColorAtomsByType(true);
            r2dm.setShowAtomTypeNames(false);
            r2dm.setShowAromaticity(true);
            r2dm.setShowImplicitHydrogens(false);
            r2dm.setShowReactionBoxes(false);
            r2dm.setKekuleStructure(false);
            Dimension dim = new Dimension();
            dim.setSize(length, length);
            r2dm.setBackgroundDimension(dim);
            r2dm.setBackColor(java.awt.Color.WHITE);
            // render the image
            SimpleRenderer2D renderer = new SimpleRenderer2D();
            renderer.setRenderer2DModel(r2dm);
            BufferedImage bufferedImage = new BufferedImage(length, length,
              BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = bufferedImage.createGraphics();
            graphics.setPaint(java.awt.Color.WHITE);
            Rectangle2D.Float rectangle = new Rectangle2D.Float(0, 0, length, length);
            graphics.fill(rectangle);
            renderer.paintMolecule(layedOutMol, graphics);
            // write the image to response
            response.setContentType("image/png");
            OutputStream out = response.getOutputStream();
            try {
             javax.imageio.ImageIO.write(bufferedImage, "png", out);
            } finally {
             out.close();
            }
           }
          }

          posted on 2009-10-22 08:51 周銳 閱讀(774) 評(píng)論(0)  編輯  收藏 所屬分類: ChemistryJavaCDK
          主站蜘蛛池模板: 江源县| 靖西县| 探索| 泊头市| 江西省| 清水河县| 绥江县| 水城县| 东方市| 理塘县| 平凉市| 达州市| 琼结县| 黄龙县| 玛沁县| 门源| 涞源县| 绥滨县| 孟村| 旅游| 错那县| 平湖市| 定襄县| 贡觉县| 中阳县| 西青区| 布拖县| 兰西县| 牟定县| 诸暨市| 武胜县| 平乡县| 怀化市| 吉林市| 平果县| 沽源县| 应城市| 锦屏县| 嘉义市| 包头市| 东辽县|