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) 評論(0)  編輯  收藏 所屬分類: ChemistryJavaCDK
          主站蜘蛛池模板: 洛隆县| 明光市| 永靖县| 长治市| 江华| 南江县| 郑州市| 临沧市| 青岛市| 资溪县| 永福县| 花莲县| 合作市| 曲靖市| 西畴县| 郧西县| 昌乐县| 平和县| 阳高县| 加查县| 齐河县| 游戏| 大港区| 罗平县| 邳州市| 乌鲁木齐市| 嵊泗县| 定结县| 浦东新区| 静宁县| 乌兰浩特市| 类乌齐县| 无锡市| 石屏县| 黄骅市| 章丘市| 双流县| 武隆县| 营山县| 景洪市| 丽江市|