Class ReactionRenderer

java.lang.Object
org.openscience.cdk.renderer.AbstractRenderer<IReaction>
org.openscience.cdk.renderer.ReactionRenderer
All Implemented Interfaces:
IRenderer<IReaction>

public class ReactionRenderer extends AbstractRenderer<IReaction> implements IRenderer<IReaction>
A general renderer for IChemModels, IReactions, and IAtomContainers. The chem object is converted into a 'diagram' made up of IRenderingElements. It takes an IDrawVisitor to do the drawing of the generated diagram. Various display properties can be set using the RendererModel.

This class has several usage patterns. For just painting fit-to-screen do:

   renderer.paintMolecule(molecule, visitor, drawArea)
 
for painting at a scale determined by the bond length in the RendererModel:
   if (moleculeIsNew) {
     renderer.setup(molecule, drawArea);
   }
   Rectangle diagramSize = renderer.paintMolecule(molecule, visitor);
   // ...update scroll bars here
 
to paint at full screen size, but not resize with each change:
   if (moleculeIsNew) {
     renderer.setScale(molecule);
     Rectangle diagramBounds = renderer.calculateDiagramBounds(molecule);
     renderer.setZoomToFit(diagramBounds, drawArea);
     renderer.paintMolecule(molecule, visitor);
   } else {
     Rectangle diagramSize = renderer.paintMolecule(molecule, visitor);
   // ...update scroll bars here
   }
 
finally, if you are scrolling, and have not changed the diagram:
   renderer.repaint(visitor)
 
will just repaint the previously generated diagram, at the same scale.

There are two sets of methods for painting IChemObjects - those that take a Rectangle that represents the desired draw area, and those that return a Rectangle that represents the actual draw area. The first are intended for drawing molecules fitted to the screen (where 'screen' means any drawing area) while the second type of method are for drawing bonds at the length defined by the RendererModel parameter bondLength.

There are two numbers used to transform the model so that it fits on screen. The first is scale, which is used to map model coordinates to screen coordinates. The second is zoom which is used to, well, zoom the on screen coordinates. If the diagram is fit-to-screen, then the ratio of the bounds when drawn using bondLength and the bounds of the screen is used as the zoom.

So, if the bond length on screen is set to 40, and the average bond length of the model is 2 (unitless, but roughly Ångstrom scale) then the scale will be 20. If the model is 10 units wide, then the diagram drawn at 100% zoom will be 10 * 20 = 200 in width on screen. If the screen is 400 pixels wide, then fitting it to the screen will make the zoom 200%. Since the zoom is just a floating point number, 100% = 1 and 200% = 2.

Author:
maclean
Source code:
main
Belongs to CDK module:
renderextra
  • Constructor Details

  • Method Details

    • setup

      public void setup(IReaction reaction, Rectangle screen)
      Setup the transformations necessary to draw this Reaction.
      Specified by:
      setup in interface IRenderer<IReaction>
      Parameters:
      reaction -
      screen -
    • setScale

      public void setScale(IReaction reaction)
      Set the scale for an IReaction. It calculates the average bond length of the model and calculates the multiplication factor to transform this to the bond length that is set in the RendererModel.
      Specified by:
      setScale in interface IRenderer<IReaction>
      Parameters:
      reaction -
    • paint

      public Rectangle paint(IReaction reaction, IDrawVisitor drawVisitor)
      Paint an IChemObject.
      Specified by:
      paint in interface IRenderer<IReaction>
      Parameters:
      reaction - the chem object to paint
      drawVisitor - the class that visits the generated elements
      Returns:
      the rectangular area where was drawn
    • paint

      public void paint(IReaction reaction, IDrawVisitor drawVisitor, Rectangle2D bounds, boolean resetCenter)
      Paint a reaction.
      Specified by:
      paint in interface IRenderer<IReaction>
      Parameters:
      reaction - the reaction to paint
      drawVisitor - the visitor that does the drawing
      bounds - the bounds on the screen
      resetCenter - if true, set the draw center to be the center of bounds
    • calculateDiagramBounds

      public Rectangle calculateDiagramBounds(IReaction reaction)
      Given a IChemObject, calculates the bounding rectangle in screen space.
      Specified by:
      calculateDiagramBounds in interface IRenderer<IReaction>
      Parameters:
      reaction - the IChemObject to draw.
      Returns:
      a rectangle in screen space.
    • calculateScaleForBondLength

      public double calculateScaleForBondLength(double modelBondLength)
      Given a bond length for a model, calculate the scale that will transform this length to the on screen bond length in RendererModel.
      Specified by:
      calculateScaleForBondLength in class AbstractRenderer<IReaction>
      Parameters:
      modelBondLength - the wanted model bond length in screen length
      Returns:
      returns the scale that causes the drawn bond lengths in pixels to match the given model bond length
    • generateDiagram

      public IRenderingElement generateDiagram(IReaction reaction)
      The main method of the renderer, that uses each of the generators to create a different set of IRenderingElements grouped together into a tree.
      Specified by:
      generateDiagram in interface IRenderer<IReaction>
      Overrides:
      generateDiagram in class AbstractRenderer<IReaction>
      Parameters:
      reaction - the object of type T to draw
      Returns:
      the diagram as a tree of IRenderingElements
    • getGenerators

      public List<IGenerator<IReaction>> getGenerators()
      Returns a List of IGenerators for this renderer.
      Specified by:
      getGenerators in interface IRenderer<IReaction>
      Returns:
      the list of generators for this renderer.