Skip to content

Instantly share code, notes, and snippets.

@mojaie
Last active December 10, 2015 01:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mojaie/4359371 to your computer and use it in GitHub Desktop.
Save mojaie/4359371 to your computer and use it in GitHub Desktop.
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.openscience.cdk.Molecule;
import org.openscience.cdk.atomtype.CDKAtomTypeMatcher;
import org.openscience.cdk.exception.CDKException;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IAtomType;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.io.MDLV2000Reader;
import org.openscience.cdk.layout.StructureDiagramGenerator;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;
import org.openscience.jchempaint.renderer.AtomContainerRenderer;
import org.openscience.jchempaint.renderer.font.AWTFontManager;
import org.openscience.jchempaint.renderer.generators.BasicBondGenerator;
import org.openscience.jchempaint.renderer.generators.ExtendedAtomGenerator;
import org.openscience.jchempaint.renderer.generators.IGenerator;
import org.openscience.jchempaint.renderer.visitor.AWTDrawVisitor;
public class JCPtest {
public static void main(String[] args) {
Runnable runnable = new AppMainRun();
SwingUtilities.invokeLater(runnable);
}
}
class AppMainRun implements Runnable {
public void run() {
// sdfファイルから分子を読み込む
Reader reader = null;
try {
reader = new FileReader(new File("./temp/test/zinc_3929508.sdf"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
MDLV2000Reader mdl = new MDLV2000Reader(reader);
IMolecule molecule = null;
try {
molecule = (IMolecule)mdl.read(new Molecule());
} catch (CDKException e) {
e.printStackTrace();
}
// 3D座標系の場合は2Dに変換
StructureDiagramGenerator sdg = new StructureDiagramGenerator();
sdg.setMolecule(molecule);
try {
sdg.generateCoordinates();
} catch (CDKException e) {
e.printStackTrace();
}
molecule = sdg.getMolecule();
// 水素原子の削除
molecule = (IMolecule) AtomContainerManipulator.removeHydrogens((IAtomContainer) molecule);
// 末端、ヘテロ原子上の水素のみ表示
CDKAtomTypeMatcher matcher = CDKAtomTypeMatcher.getInstance(molecule.getBuilder());
for (IAtom atom : molecule.atoms()) {
try {
IAtomType type = matcher.findMatchingAtomType(molecule, atom);
atom.setImplicitHydrogenCount(
type.getFormalNeighbourCount() - molecule.getConnectedAtomsCount(atom));
} catch (CDKException e) {
e.printStackTrace();
}
}
// 描画キャンパスの設定
Rectangle drawArea = new Rectangle(20, 20, 360, 360);
BufferedImage img = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = img.createGraphics();
g2.fillRect(0, 0, 400, 400);
// ジェネレーターの設定
List<IGenerator> generators = new ArrayList<IGenerator>();
generators.add(new BasicBondGenerator());
generators.add(new ExtendedAtomGenerator());
// レンダリング
AtomContainerRenderer renderer = new AtomContainerRenderer(generators, new AWTFontManager(), true);
renderer.paintMolecule(molecule, new AWTDrawVisitor(g2), drawArea, true);
// パネルに構造式を表示
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(0, 0, 400, 400);
frame.setTitle("Oseltamivir");
JPanel panel = new JPanel();
JLabel label = new JLabel();
ImageIcon icon = new ImageIcon();
icon.setImage(img);
label.setIcon(icon);
panel.add(label);
frame.add(panel);
frame.setVisible(true);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment