Menu

#1163 rendering with CompactAtom and Shape.SQUARE is broken

cdk-1.4.x
open
9
2013-11-10
2011-07-03
No

Rendering with Shape.OVAL is working, but not as Shape.SQUARE.

Discussion

  • Egon Willighagen

    Example (Groovy) code which will not draw any squares for me:

    import java.util.List;
    import java.awt.;
    import java.awt.image.
    ;
    import javax.imageio.;
    import org.openscience.cdk.
    ;
    import org.openscience.cdk.interfaces.;
    import org.openscience.cdk.layout.
    ;
    import org.openscience.cdk.renderer.;
    import org.openscience.cdk.renderer.font.
    ;
    import org.openscience.cdk.renderer.generators.;
    import org.openscience.cdk.renderer.visitor.
    ;
    import org.openscience.cdk.templates.*;
    import org.openscience.cdk.renderer.generators.BasicAtomGenerator.CompactAtom;
    import org.openscience.cdk.renderer.generators.BasicAtomGenerator.CompactShape;
    import org.openscience.cdk.renderer.generators.BasicAtomGenerator.Shape;
    import org.openscience.cdk.renderer.generators.BasicSceneGenerator.Margin;

    int WIDTH = 200;
    int HEIGHT = 200;
    // the draw area and the image should be the same size
    Rectangle drawArea = new Rectangle(WIDTH, HEIGHT);
    Image image = new BufferedImage(
    WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB
    );
    IMolecule triazole = MoleculeFactory.make123Triazole();
    StructureDiagramGenerator sdg = new StructureDiagramGenerator();
    sdg.setMolecule(triazole);
    sdg.generateCoordinates();
    triazole = sdg.getMolecule();
    // generators make the image elements
    List<IGenerator> generators = new ArrayList<IGenerator>();
    generators.add(new BasicSceneGenerator());
    generators.add(new BasicBondGenerator());
    generators.add(new BasicAtomGenerator());
    // the renderer needs to have a toolkit-specific font manager
    AtomContainerRenderer renderer =
    new AtomContainerRenderer(generators, new AWTFontManager());
    model = renderer.getRenderer2DModel();
    model.set(Margin.class, (double)0.0);
    model.set(CompactAtom.class, true);
    model.set(CompactShape.class, Shape.SQUARE);
    // the call to 'setup' only needs to be done on the first paint
    renderer.setup(triazole, drawArea);
    // paint the background
    Graphics2D g2 = (Graphics2D)image.getGraphics();
    g2.setColor(Color.WHITE);
    g2.fillRect(0, 0, WIDTH, HEIGHT);
    // the paint method also needs a toolkit-specific renderer
    renderer.paint(triazole, new AWTDrawVisitor(g2));
    ImageIO.write(
    (RenderedImage)image, "PNG",
    new File("CompactAtomParam.png")
    );

     
  • gilleain maclean torrance

    I will look into it.

     
  • Brendan T. Reilly

    fixed code for visit(RectangleElement rectangle) in class AWTDrawVisitor.

    Will correctly draw square atoms for compact style. (Previous code was attempting to draw the rectangle with a negative height and thus not being painted correctly)/

        this.graphics.setColor(rectangle.color);
        int width = scaleX(rectangle.width);
        int height = scaleX(rectangle.height);
    
        if (rectangle.filled) {
            this.graphics.fillRect(transformX(rectangle.xCoord) ,
                        transformY(rectangle.yCoord) - height ,
                        width,
                        height );
        } else { 
            this.graphics.drawRect(transformX(rectangle.xCoord) - width,
                    transformY(rectangle.yCoord) - height,
                    width,
                    height );
        }
    
     

    Last edit: Brendan T. Reilly 2013-11-10
  • John May

    John May - 2013-11-10

    Thanks - patch awaiting review: https://sourceforge.net/p/cdk/patches/704/