Multi Page Images

Multi-page images can be generated by the usage of the OEMultiPageImageFile class. After generating a multi-page object by specifying the orientation and the size of its pages, the individual pages can be accessed by calling the OEMultiPageImageFile::NewPage method. The returned OEImage then can be used to depict molecule(s) as demonstrated in the previous chapters. The image created by Listing 1 is shown in Figure: Example multi-page depiction.

Listing 1: Example of multi-page depiction

  const vector<string> smiles = { "C1CC(C)CCC1", "C1CC(O)CCC1", "C1CC(Cl)CCC1",
                                  "C1CC(F)CCC1", "C1CC(Br)CCC1", "C1CC(N)CCC1" };

  OEMultiPageImageFile multi(OEPageOrientation::Landscape, OEPageSize::US_Letter);

  OE2DMolDisplayOptions opts;

  const auto rows = 2u;
  const auto cols = 2u;

  std::unique_ptr<OEImageGrid> grid(nullptr);
  OEIter<OEImageBase> cell;

  for (const auto& smi : smiles)
  {
    if (!cell)
    { // go to next page
      OEImage& image = multi.NewPage();
      grid.reset(new OEImageGrid(image, rows, cols));
      grid->SetCellGap(20);
      grid->SetMargins(20);
      cell = grid->GetCells();
    }

    OEGraphMol mol;
    OESmilesToMol(mol, smi);
    OEPrepareDepiction(mol);

    opts.SetDimensions(cell->GetWidth(), cell->GetHeight(), OEScale::AutoScale);
    OE2DMolDisplay disp(mol, opts);
    OERenderMolecule(cell, disp);
    OEDrawBorder(cell, OERedPen);

    ++cell;
  }

  OEWriteMultiPageImage("MultiPage.pdf", multi);
Example multi-page depiction (The pages are reduced here for visualization convenience)
page 1 page 2
../_images/MultiPage-1.png ../_images/MultiPage-2.png

The Listing 1 example creates a PDF multi-page image file, the multi-page image types supported by OEDepict TK can be accessed by calling the OEGetSupportedMultiPageImageFileExtensions function. It returns an iterator over the file extensions that can be used when writing a multi-page image file by the OEWriteMultiPageImage function.

Multi Page Reports

The Listing 1 example illustrates how depict a set of molecules in a multi-page PDF using the OEImageGrid and OEMultiPageImageFile classes. OEDepict TK also provides the OEReport class to do this task in a more convenient way. The OEReport class is a multi-page layout manager that handles the page generation and the positioning of information (such as text and molecule depiction).

In the Listing 2 example, first a OEReportOptions object is created that stores all properties that determine the layout of a documentation. After generating the OEReport object a molecule can be positioned on a cell that is returned by the OEReport::NewCell method. The OEReport::NewCell method creates cells from left to right and top to bottom order on each page. If no more cells are left on the page, then a new page is created before returning the first cell of this new page.

After the document is generated, i.e all molecule are depicted, the OEWriteReport function writes the multi-page documentation into into a file with the given name. The image created by the Listing 2 example is the same as depicted in Figure: Example multi-page depiction.

Listing 2: Example of multi-page depiction using OEReportOptions

  const vector<string> smiles = { "C1CC(C)CCC1", "C1CC(O)CCC1", "C1CC(Cl)CCC1",
                                  "C1CC(F)CCC1", "C1CC(Br)CCC1", "C1CC(N)CCC1" };

  const auto rows = 2u;
  const auto cols = 2u;
  OEReportOptions reportopts(rows, cols);
  reportopts.SetPageOrientation(OEPageOrientation::Landscape);
  reportopts.SetCellGap(20);
  reportopts.SetPageMargins(20);
  OEReport report(reportopts);

  OE2DMolDisplayOptions opts(report.GetCellWidth(), report.GetCellHeight(), OEScale::AutoScale);

  for (const auto& smi : smiles)
  {
    OEGraphMol mol;
    OESmilesToMol(mol, smi);
    OEPrepareDepiction(mol);

    OEImageBase* cell = report.NewCell();
    OE2DMolDisplay disp(mol, opts);
    OERenderMolecule(*cell, disp);
    OEDrawBorder(*cell, OERedPen);
  }

  OEWriteReport("MultiPageReport.pdf", report);

See also