RDKit
Open-source cheminformatics and machine learning.
MolDraw2D.h
Go to the documentation of this file.
1//
2// Copyright (C) 2014-2021 David Cosgrove and other RDKit contributors
3//
4// @@ All Rights Reserved @@
5// This file is part of the RDKit.
6// The contents are covered by the terms of the BSD license
7// which is included in the file license.txt, found at the root
8// of the RDKit source tree.
9//
10// Original author: David Cosgrove (AstraZeneca)
11// 27th May 2014
12//
13// This class makes a 2D drawing of an RDKit molecule.
14// It draws heavily on $RDBASE/GraphMol/MolDrawing/MolDrawing.h.
15// One purpose of this is to make it easier to overlay annotations on top of
16// the molecule drawing, which is difficult to do from the output of
17// MolDrawing.h
18// The class design philosophy echoes a standard one:
19// a virtual base class defines the interface and does all
20// the heavy lifting and concrete derived classes implement
21// library-specific drawing code such as drawing lines, writing strings
22// etc.
23
24#include <RDGeneral/export.h>
25#ifndef RDKITMOLDRAW2D_H
26#define RDKITMOLDRAW2D_H
27
28#include <vector>
29
30#include <Geometry/point.h>
32#include <GraphMol/RDKitBase.h>
35
36// ****************************************************************************
37using RDGeom::Point2D;
38
39namespace RDKit {
40
41namespace MolDraw2D_detail {
42class DrawMol;
43class DrawText;
44} // namespace MolDraw2D_detail
45
46//! MolDraw2D is the base class for doing 2D renderings of molecules
48 public:
49 //! constructor for a particular size
50 /*!
51 \param width : width (in pixels) of the rendering
52 set this to -1 to have the canvas size set automatically
53 \param height : height (in pixels) of the rendering
54 set this to -1 to have the canvas size set automatically
55 \param panelWidth : (optional) width (in pixels) of a single panel
56 \param panelHeight : (optional) height (in pixels) of a single panel
57
58 The \c panelWidth and \c panelHeight arguments are used to provide the
59 sizes of the panels individual molecules are drawn in when
60 \c drawMolecules() is called.
61 */
62 MolDraw2D(int width, int height, int panelWidth, int panelHeight);
63 MolDraw2D(const MolDraw2D &rhs) = delete;
64 MolDraw2D(MolDraw2D &&rhs) = delete;
65 MolDraw2D &operator=(const MolDraw2D &rhs) = delete;
66 MolDraw2D &operator=(MolDraw2D &&rhs) = delete;
67 virtual ~MolDraw2D();
68
69 //! draw a single molecule
70 /*!
71 \param mol : the molecule to draw
72 \param legend : the legend (to be drawn under the molecule)
73 \param highlight_atoms : (optional) vector of atom ids to highlight
74 \param highlight_atoms : (optional) vector of bond ids to highlight
75 \param highlight_atom_map : (optional) map from atomId -> DrawColour
76 providing the highlight colors. If not provided the default highlight colour
77 from \c drawOptions() will be used.
78 \param highlight_bond_map : (optional) map from bondId -> DrawColour
79 providing the highlight colors. If not provided the default highlight colour
80 from \c drawOptions() will be used.
81 \param highlight_radii : (optional) map from atomId -> radius (in molecule
82 coordinates) for the radii of atomic highlights. If not provided the default
83 value from \c drawOptions() will be used.
84 \param confId : (optional) conformer ID to be used for atomic
85 coordinates
86
87 */
88 virtual void drawMolecule(
89 const ROMol &mol, const std::string &legend,
90 const std::vector<int> *highlight_atoms,
91 const std::vector<int> *highlight_bonds,
92 const std::map<int, DrawColour> *highlight_atom_map = nullptr,
93 const std::map<int, DrawColour> *highlight_bond_map = nullptr,
94 const std::map<int, double> *highlight_radii = nullptr, int confId = -1);
95
96 //! \overload
97 virtual void drawMolecule(
98 const ROMol &mol, const std::vector<int> *highlight_atoms = nullptr,
99 const std::map<int, DrawColour> *highlight_map = nullptr,
100 const std::map<int, double> *highlight_radii = nullptr, int confId = -1);
101
102 //! \overload
103 virtual void drawMolecule(
104 const ROMol &mol, const std::string &legend,
105 const std::vector<int> *highlight_atoms = nullptr,
106 const std::map<int, DrawColour> *highlight_map = nullptr,
107 const std::map<int, double> *highlight_radii = nullptr, int confId = -1);
108
109 //! \overload
110 virtual void drawMolecule(
111 const ROMol &mol, const std::vector<int> *highlight_atoms,
112 const std::vector<int> *highlight_bonds,
113 const std::map<int, DrawColour> *highlight_atom_map = nullptr,
114 const std::map<int, DrawColour> *highlight_bond_map = nullptr,
115 const std::map<int, double> *highlight_radii = nullptr, int confId = -1);
116
117 //! draw molecule with multiple colours allowed per atom.
118 /*!
119 \param mol : the molecule to draw
120 \param legend : the legend (to be drawn under the molecule)
121 \param highlight_atom_map : map from atomId -> DrawColours
122 providing the highlight colours.
123 \param highlight_bond_map : map from bondId -> DrawColours
124 providing the highlight colours.
125 \param highlight_radii : map from atomId -> radius (in molecule
126 coordinates) for the radii of atomic highlights. If not provided for an
127 index, the default value from \c drawOptions() will be used.
128 \param highlight_linewidth_multipliers : map from atomId -> int, used to
129 vary the width the highlight lines. Only active if
130 drawOptions().fillHighlights is false.
131 \param confId : (optional) conformer ID to be used for atomic
132 coordinates
133 */
135 const ROMol &mol, const std::string &legend,
136 const std::map<int, std::vector<DrawColour>> &highlight_atom_map,
137 const std::map<int, std::vector<DrawColour>> &highlight_bond_map,
138 const std::map<int, double> &highlight_radii,
139 const std::map<int, int> &highlight_linewidth_multipliers,
140 int confId = -1);
141
142 //! draw multiple molecules in a grid
143 /*!
144 \param mols : the molecules to draw
145 \param legends : (optional) the legends (to be drawn under the
146 molecules)
147 \param highlight_atoms : (optional) vectors of atom ids to highlight
148 \param highlight_atoms : (optional) vectors of bond ids to highlight
149 \param highlight_atom_map : (optional) maps from atomId -> DrawColour
150 providing the highlight colors. If not provided the default highlight colour
151 from \c drawOptions() will be used.
152 \param highlight_bond_map : (optional) maps from bondId -> DrawColour
153 providing the highlight colors. If not provided the default highlight colour
154 from \c drawOptions() will be used.
155 \param highlight_radii : (optional) maps from atomId -> radius (in molecule
156 coordinates) for the radii of atomic highlights. If not provided the default
157 value from \c drawOptions() will be used.
158 \param confId : (optional) conformer IDs to be used for atomic
159 coordinates
160
161 The \c panelWidth and \c panelHeight values will be used to determine the
162 number of rows and columns to be drawn. Theres not a lot of error checking
163 here, so if you provide too many molecules for the number of panes things
164 are likely to get screwed up.
165 If the number of rows or columns ends up being <= 1, molecules will be
166 being drawn in a single row/column.
167 */
168 virtual void drawMolecules(
169 const std::vector<ROMol *> &mols,
170 const std::vector<std::string> *legends = nullptr,
171 const std::vector<std::vector<int>> *highlight_atoms = nullptr,
172 const std::vector<std::vector<int>> *highlight_bonds = nullptr,
173 const std::vector<std::map<int, DrawColour>> *highlight_atom_maps =
174 nullptr,
175 const std::vector<std::map<int, DrawColour>> *highlight_bond_maps =
176 nullptr,
177 const std::vector<std::map<int, double>> *highlight_radii = nullptr,
178 const std::vector<int> *confIds = nullptr);
179
180 //! draw a ChemicalReaction
181 /*!
182 \param rxn : the reaction to draw
183 \param highlightByReactant : (optional) if this is set, atoms and bonds will
184 be highlighted based on which reactant they come from. Atom map numbers
185 will not be shown.
186 \param highlightColorsReactants : (optional) provide a vector of colors for
187 the
188 reactant highlighting.
189 \param confIds : (optional) vector of confIds to use for rendering. These
190 are numbered by reactants, then agents, then products.
191 */
192 virtual void drawReaction(
193 const ChemicalReaction &rxn, bool highlightByReactant = false,
194 const std::vector<DrawColour> *highlightColorsReactants = nullptr,
195 const std::vector<int> *confIds = nullptr);
196
197 //! clears the contents of the drawing
198 virtual void clearDrawing() = 0;
199 //! draws a line from \c cds1 to \c cds2 using the current drawing style
200 //! in atom coords. If rawCoords is passed as true,
201 //! the coordinates are used as is, if not they are assumed to be in
202 //! the molecule coordinate frame and converted with getDrawCoords
203 //! into canvas coords.
204 virtual void drawLine(const Point2D &cds1, const Point2D &cds2,
205 bool rawCoords = false) = 0;
206 //! draw a polygon. Note that if fillPolys() returns false, it
207 //! doesn't close the path. If you want it to in that case, you
208 //! do it explicitly yourself. If rawCoords is passed as true,
209 //! the coordinates are used as is, if not they are assumed to be in
210 //! the molecule coordinate frame and converted with getDrawCoords
211 //! into canvas coords.
212 virtual void drawPolygon(const std::vector<Point2D> &cds,
213 bool rawCoords = false) = 0;
214 //@}
215
216 //! A Whole bunch of drawing primitives. They may be over-ridden
217 //! by different renderers, or they may be implemented in terms of
218 //! drawLine and drawPolygon above. If rawCoords is passed as true,
219 // the coordinates are used as is, if not they are assumed to be in
220 // the molecule coordinate frame and converted with getDrawCoords
221 // into canvas coords.
222 //! draw a line where the ends are different colours
223 virtual void drawLine(const Point2D &cds1, const Point2D &cds2,
224 const DrawColour &col1, const DrawColour &col2,
225 bool rawCoords = false);
226 //! draw a triangle
227 virtual void drawTriangle(const Point2D &cds1, const Point2D &cds2,
228 const Point2D &cds3, bool rawCoords = false);
229 //! draw an ellipse
230 virtual void drawEllipse(const Point2D &cds1, const Point2D &cds2,
231 bool rawCoords = false);
232 // draw the arc of a circle between ang1 and ang2. Note that 0 is
233 // at 3 o-clock and 90 at 12 o'clock as you'd expect from your maths.
234 // ang2 must be > ang1 - it won't draw backwards. This is not enforced.
235 // Angles in degrees.
236 virtual void drawArc(const Point2D &centre, double radius, double ang1,
237 double ang2, bool rawCoords = false);
238 // and a general ellipse form
239 virtual void drawArc(const Point2D &centre, double xradius, double yradius,
240 double ang1, double ang2, bool rawCoords = false);
241 //! draw a rectangle given two opposite corners
242 virtual void drawRect(const Point2D &cds1, const Point2D &cds2,
243 bool rawCoords = false);
244 //! draw a line indicating the presence of an attachment point (normally a
245 //! squiggle line perpendicular to a bond)
246 virtual void drawAttachmentLine(const Point2D &cds1, const Point2D &cds2,
247 const DrawColour &col, double len = 1.0,
248 unsigned int nSegments = 16,
249 bool rawCoords = false);
250 //! draw a wavy line like that used to indicate unknown stereochemistry
251 virtual void drawWavyLine(const Point2D &cds1, const Point2D &cds2,
252 const DrawColour &col1, const DrawColour &col2,
253 unsigned int nSegments = 16,
254 double vertOffset = 0.05, bool rawCoords = false);
255 //! Draw an arrow with either lines or a filled head (when asPolygon is true)
256 virtual void drawArrow(const Point2D &cds1, const Point2D &cds2,
257 bool asPolygon = false, double frac = 0.05,
258 double angle = M_PI / 6,
259 const DrawColour &col = DrawColour(0.0, 0.0, 0.0),
260 bool rawCoords = false);
261 // draw a plus sign with lines at the given position.
262 virtual void drawPlus(const Point2D &cds, int plusWidth,
263 const DrawColour &col, bool rawCoords = false);
264
265 //! drawString centres the string on cds.
266 virtual void drawString(const std::string &str, const Point2D &cds,
267 bool rawCoords = false);
268 // unless the specific drawer over-rides this overload, it will just call
269 // the first one. SVG for one needs the alignment flag.
270 virtual void drawString(const std::string &str, const Point2D &cds,
272 bool rawCoords = false);
273
274 //! \name Transformations
275 //@{
276 // transform a set of coords in the molecule's coordinate system
277 // to drawing system coordinates and vice versa. Note that the coordinates
278 // have
279 // the origin in the top left corner, which is how Qt and Cairo have it, no
280 // doubt a holdover from X Windows. This means that a higher y value will be
281 // nearer the bottom of the screen. This doesn't really matter except when
282 // doing text superscripts and subscripts.
283
284 //! transform a point from the molecule coordinate system into the drawing
285 //! coordinate system.
286 //! Prefers globalDrawTrans_ if it exists, otherwise
287 //! uses drawMols_[activeMolIdx_].
288 virtual Point2D getDrawCoords(const Point2D &mol_cds) const;
289 //! returns the drawing coordinates of a particular atom
290 virtual Point2D getDrawCoords(int at_num) const;
291 //! Prefers globalDrawTrans_ if it exists, otherwise
292 //! uses drawMols_[activeMolIdx_].
293 virtual Point2D getAtomCoords(const std::pair<int, int> &screen_cds) const;
294 //! transform a point from drawing coordinates to the molecule coordinate
295 //! system. Prefers globalDrawTrans_ if it exists, otherwise
296 //! uses drawMols_[activeMolIdx_].
298 const std::pair<double, double> &screen_cds) const;
299 //! returns the molecular coordinates of a particular atom. at_num refers
300 //! to the atom in activeMolIdx_.
301 virtual Point2D getAtomCoords(int at_num) const;
302 //@}
303 //! returns the coordinates of the atoms of the activeMolIdx_ molecule in
304 //! molecular coordinates.
305 const std::vector<Point2D> &atomCoords() const;
306 //! returns the atomic symbols of the activeMolIdx_ molecule
307 const std::vector<std::pair<std::string, MolDraw2D_detail::OrientType>>
308 &atomSyms() const;
309
310 //! return the width of the drawing area.
311 virtual int width() const { return width_; }
312 //! return the height of the drawing area.
313 virtual int height() const { return height_; }
314 //! return the width of the drawing panels.
315 virtual int panelWidth() const { return panel_width_; }
316 //! return the height of the drawing panels.
317 virtual int panelHeight() const { return panel_height_; }
318 virtual int drawHeight() const { return panel_height_ - legend_height_; }
319 // returns the width to draw a line in draw coords.
320 virtual double getDrawLineWidth() const;
321
322 //! returns the drawing scale (conversion from molecular coords -> drawing
323 /// coords)
324 double scale() const;
325 //! explicitly sets the scaling factors for the drawing
326 void setScale(double newScale);
327 void setScale(int width, int height, const Point2D &minv, const Point2D &maxv,
328 const ROMol *mol = nullptr);
329 //! sets the drawing offset (in drawing coords)
330 void setOffset(int x, int y) {
331 x_offset_ = x;
332 y_offset_ = y;
333 }
334 //! returns the drawing offset (in drawing coords)
335 Point2D offset() const { return Point2D(x_offset_, y_offset_); }
336
337 //! returns the minimum point of the drawing (in molecular coords)
338 Point2D minPt() const;
339 //! returns the width and height of the grid (in molecular coords)
340 Point2D range() const;
341
342 //! font size in drawing coordinate units. That's probably pixels.
343 virtual double fontSize() const;
344 virtual void setFontSize(double new_size);
345
346 //! sets the current draw color
347 virtual void setColour(const DrawColour &col) { curr_colour_ = col; }
348 //! returns the current draw color
349 virtual DrawColour colour() const { return curr_colour_; }
350 //! sets the current dash pattern
351 virtual void setDash(const DashPattern &patt) { curr_dash_ = patt; }
352 //! returns the current dash pattern
353 virtual const DashPattern &dash() const { return curr_dash_; }
354
355 //! sets the current line width
356 virtual void setLineWidth(int width) { drawOptions().bondLineWidth = width; }
357 //! returns the current line width
358 virtual int lineWidth() const { return drawOptions().bondLineWidth; }
359
360 //! using the current scale, work out the size of the label in molecule
361 //! coordinates.
362 /*!
363 Bear in mind when implementing this, that, for example, NH2 will appear as
364 NH<sub>2</sub> to convey that the 2 is a subscript, and this needs to
365 accounted for in the width and height.
366 */
367 virtual void getStringSize(const std::string &label, double &label_width,
368 double &label_height) const;
369 // get the overall size of the label, allowing for it being split
370 // into pieces according to orientation.
371 void getLabelSize(const std::string &label,
372 MolDraw2D_detail::OrientType orient, double &label_width,
373 double &label_height) const;
374 // return extremes for string in molecule coords.
375 void getStringExtremes(const std::string &label,
377 const Point2D &cds, double &x_min, double &y_min,
378 double &x_max, double &y_max) const;
379
380 //! adds additional information about the atoms to the output. Does not make
381 //! sense for all renderers.
382 virtual void tagAtoms(const ROMol &mol) { RDUNUSED_PARAM(mol); }
383 //! set whether or not polygons are being filled
384 virtual bool fillPolys() const { return fill_polys_; }
385 //! returns either or not polygons should be filled
386 virtual void setFillPolys(bool val) { fill_polys_ = val; }
387
388 //! returns our current drawing options
389 MolDrawOptions &drawOptions() { return options_; }
390 //! \overload
391 const MolDrawOptions &drawOptions() const { return options_; }
392
393 virtual bool supportsAnnotations() const { return true; }
394
395 void setActiveMolIdx(int newIdx);
396 bool hasActiveAtmIdx() const { return activeAtmIdx1_ >= 0; }
397 int getActiveAtmIdx1() const { return activeAtmIdx1_; }
398 int getActiveAtmIdx2() const { return activeAtmIdx2_; }
399 void setActiveAtmIdx(int at_idx1 = -1, int at_idx2 = -1);
400 bool hasActiveBndIdx() const { return activeBndIdx_ >= 0; }
401 int getActiveBndIdx() const { return activeBndIdx_; }
402 void setActiveBndIdx(int bnd_idx = -1) {
403 activeBndIdx_ = (bnd_idx < 0 ? -1 : bnd_idx);
404 }
405 void setActiveClass(std::string actClass = std::string("")) {
406 d_activeClass = actClass;
407 }
408 std::string getActiveClass() const { return d_activeClass; }
409
410 protected:
411 std::unique_ptr<MolDraw2D_detail::DrawText> text_drawer_;
412 std::string d_activeClass;
413 bool needs_init_ = true;
414 std::vector<std::pair<std::string, std::string>> d_metadata;
415 unsigned int d_numMetadataEntries = 0;
416
417 private:
418 //! \name Methods that must be provided by child classes
419 //@{
420 virtual void initDrawing() = 0;
421 virtual void initTextDrawer(bool noFreetype) = 0;
422
423 // if the width or height of the DrawMol was -1, the new dimensions need to be
424 // transferred to MolDraw2D.
425 void fixVariableDimensions(const MolDraw2D_detail::DrawMol &drawMol);
426
427 // split the reaction up into the reagents, products and agents, each as
428 // a separate entity with its own scale.
429 void getReactionDrawMols(
430 const ChemicalReaction &rxn, bool highlightByReactant,
431 const std::vector<DrawColour> *highlightColorsReactants,
432 const std::vector<int> *confIds,
433 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &reagents,
434 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &products,
435 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &agents,
436 int &plusWidth);
437 // take the given components from the reaction (bits will be either
438 // reagents, products or agents) and create the corresponding DrawMols.
439 void makeReactionComponents(
440 std::vector<RDKit::ROMOL_SPTR> const &bits,
441 const std::vector<int> *confIds, int heightToUse,
442 std::map<int, DrawColour> &atomColours,
443 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &dms,
444 double &minScale, double &minFontScale);
445 // this puts a pointer to the DrawMol into _drawMols as well, hence the use
446 // of shared_ptr for reagents, products and agents above.
447 void makeReactionDrawMol(
448 RWMol &mol, int confId, int molHeight,
449 const std::vector<int> &highlightAtoms,
450 const std::vector<int> &highlightBonds,
451 const std::map<int, DrawColour> &highlightAtomMap,
452 const std::map<int, DrawColour> &highlightBondMap,
453 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &mols);
454 // Strictly speaking, this isn't actually a const function, although the
455 // compiler can't spot it, because the scales of reagents etc may be changed,
456 // and they are also in drawMols_.
457 void calcReactionOffsets(
458 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &reagents,
459 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &products,
460 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &agents,
461 int &plusWidth, std::vector<Point2D> &offsets, Point2D &arrowBeg,
462 Point2D &arrowEnd);
463 // returns the final offset. plusWidth of 0 means no pluses to be drawn.
464 int drawReactionPart(
465 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> &reactBit,
466 int plusWidth, int initOffset, const std::vector<Point2D> &offsets);
467 // returns a map of colours indexed by the atomMapNum. Each reagent gives
468 // a different colour.
469 void findReactionHighlights(
470 const ChemicalReaction &rxn, bool highlightByReactant,
471 const std::vector<DrawColour> *highlightColorsReactants,
472 std::map<int, DrawColour> &atomColours) const;
473
474 int width_, height_, panel_width_, panel_height_, legend_height_;
475 // if the user calls setScale() to explicitly force a scale on the
476 // DrawMols, this is set to true.
477 bool forceScale_ = false;
478 double scale_, fontScale_;
479 int x_offset_, y_offset_; // translation in screen coordinates
480 bool fill_polys_;
481 int activeMolIdx_;
482 int activeAtmIdx1_;
483 int activeAtmIdx2_;
484 int activeBndIdx_;
485 // these are shared_ptr rather than unique_ptr because the reactions
486 // keep their own copy.
487 std::vector<std::shared_ptr<MolDraw2D_detail::DrawMol>> drawMols_;
488 // this is for when we want to set up a MolDraw2D to a given scale and be
489 // able to draw molecules and arbitrary lines, arcs etc. onto it all to the
490 // same drawing transformation. If present, it will always be applied to
491 // any new drawMols_ before they are drawn. A separate class might have
492 // been better, but this is convenient.
493 std::unique_ptr<MolDraw2D_detail::DrawMol> globalDrawTrans_;
494
495 DrawColour curr_colour_;
496 DashPattern curr_dash_;
497 MolDrawOptions options_;
498
499 // Do the drawing, the new way
500 void startDrawing();
501 void drawTheMolecule(MolDraw2D_detail::DrawMol &drawMol);
502 void setupTextDrawer();
503
504 virtual void updateMetadata(const ROMol &mol, int confId) {
505 RDUNUSED_PARAM(mol);
506 RDUNUSED_PARAM(confId);
507 }
508 virtual void updateMetadata(const ChemicalReaction &rxn) {
509 RDUNUSED_PARAM(rxn);
510 }
511};
512
513inline void setDarkMode(MolDrawOptions &opts) {
515 opts.backgroundColour = DrawColour{0, 0, 0, 1};
516 opts.annotationColour = DrawColour{0.9, 0.9, 0.9, 1};
517 opts.legendColour = DrawColour{0.9, 0.9, 0.9, 1};
518 opts.symbolColour = DrawColour{0.9, 0.9, 0.9, 1};
519 opts.variableAttachmentColour = DrawColour{0.3, 0.3, 0.3, 1};
520}
521inline void setDarkMode(MolDraw2D &d2d) { setDarkMode(d2d.drawOptions()); }
522inline void setMonochromeMode(MolDrawOptions &opts, const DrawColour &fgColour,
523 const DrawColour &bgColour) {
524 opts.atomColourPalette.clear();
525 opts.atomColourPalette[-1] = fgColour;
526 opts.backgroundColour = bgColour;
527 opts.annotationColour = fgColour;
528 opts.legendColour = fgColour;
529 opts.symbolColour = fgColour;
530 opts.variableAttachmentColour = fgColour;
531}
532inline void setMonochromeMode(MolDraw2D &opts, const DrawColour &fgColour,
533 const DrawColour &bgColour) {
534 setMonochromeMode(opts.drawOptions(), fgColour, bgColour);
535}
536
537} // namespace RDKit
538
539#endif // RDKITMOLDRAW2D_H
#define RDUNUSED_PARAM(x)
Definition: Invariant.h:196
#define M_PI
Definition: MMFF/Params.h:27
pulls in the core RDKit functionality
This is a class for storing and applying general chemical reactions.
Definition: Reaction.h:121
MolDraw2D is the base class for doing 2D renderings of molecules.
Definition: MolDraw2D.h:47
virtual void drawMoleculeWithHighlights(const ROMol &mol, const std::string &legend, const std::map< int, std::vector< DrawColour > > &highlight_atom_map, const std::map< int, std::vector< DrawColour > > &highlight_bond_map, const std::map< int, double > &highlight_radii, const std::map< int, int > &highlight_linewidth_multipliers, int confId=-1)
draw molecule with multiple colours allowed per atom.
virtual void tagAtoms(const ROMol &mol)
Definition: MolDraw2D.h:382
void setActiveBndIdx(int bnd_idx=-1)
Definition: MolDraw2D.h:402
MolDraw2D & operator=(MolDraw2D &&rhs)=delete
void setScale(int width, int height, const Point2D &minv, const Point2D &maxv, const ROMol *mol=nullptr)
virtual int panelWidth() const
return the width of the drawing panels.
Definition: MolDraw2D.h:315
virtual ~MolDraw2D()
virtual void drawLine(const Point2D &cds1, const Point2D &cds2, const DrawColour &col1, const DrawColour &col2, bool rawCoords=false)
draw a line where the ends are different colours
virtual void drawMolecule(const ROMol &mol, const std::string &legend, const std::vector< int > *highlight_atoms, const std::vector< int > *highlight_bonds, const std::map< int, DrawColour > *highlight_atom_map=nullptr, const std::map< int, DrawColour > *highlight_bond_map=nullptr, const std::map< int, double > *highlight_radii=nullptr, int confId=-1)
draw a single molecule
virtual double getDrawLineWidth() const
virtual void setFontSize(double new_size)
virtual Point2D getAtomCoords(int at_num) const
virtual void getStringSize(const std::string &label, double &label_width, double &label_height) const
virtual void drawArrow(const Point2D &cds1, const Point2D &cds2, bool asPolygon=false, double frac=0.05, double angle=M_PI/6, const DrawColour &col=DrawColour(0.0, 0.0, 0.0), bool rawCoords=false)
Draw an arrow with either lines or a filled head (when asPolygon is true)
virtual void drawMolecule(const ROMol &mol, const std::vector< int > *highlight_atoms, const std::vector< int > *highlight_bonds, const std::map< int, DrawColour > *highlight_atom_map=nullptr, const std::map< int, DrawColour > *highlight_bond_map=nullptr, const std::map< int, double > *highlight_radii=nullptr, int confId=-1)
This is an overloaded member function, provided for convenience. It differs from the above function o...
bool hasActiveBndIdx() const
Definition: MolDraw2D.h:400
virtual void drawMolecules(const std::vector< ROMol * > &mols, const std::vector< std::string > *legends=nullptr, const std::vector< std::vector< int > > *highlight_atoms=nullptr, const std::vector< std::vector< int > > *highlight_bonds=nullptr, const std::vector< std::map< int, DrawColour > > *highlight_atom_maps=nullptr, const std::vector< std::map< int, DrawColour > > *highlight_bond_maps=nullptr, const std::vector< std::map< int, double > > *highlight_radii=nullptr, const std::vector< int > *confIds=nullptr)
draw multiple molecules in a grid
virtual int drawHeight() const
Definition: MolDraw2D.h:318
int getActiveAtmIdx2() const
Definition: MolDraw2D.h:398
virtual void drawReaction(const ChemicalReaction &rxn, bool highlightByReactant=false, const std::vector< DrawColour > *highlightColorsReactants=nullptr, const std::vector< int > *confIds=nullptr)
draw a ChemicalReaction
virtual void drawLine(const Point2D &cds1, const Point2D &cds2, bool rawCoords=false)=0
MolDraw2D(int width, int height, int panelWidth, int panelHeight)
constructor for a particular size
void getLabelSize(const std::string &label, MolDraw2D_detail::OrientType orient, double &label_width, double &label_height) const
virtual void drawMolecule(const ROMol &mol, const std::vector< int > *highlight_atoms=nullptr, const std::map< int, DrawColour > *highlight_map=nullptr, const std::map< int, double > *highlight_radii=nullptr, int confId=-1)
This is an overloaded member function, provided for convenience. It differs from the above function o...
std::unique_ptr< MolDraw2D_detail::DrawText > text_drawer_
Definition: MolDraw2D.h:411
void getStringExtremes(const std::string &label, MolDraw2D_detail::OrientType orient, const Point2D &cds, double &x_min, double &y_min, double &x_max, double &y_max) const
virtual bool fillPolys() const
set whether or not polygons are being filled
Definition: MolDraw2D.h:384
virtual void drawWavyLine(const Point2D &cds1, const Point2D &cds2, const DrawColour &col1, const DrawColour &col2, unsigned int nSegments=16, double vertOffset=0.05, bool rawCoords=false)
draw a wavy line like that used to indicate unknown stereochemistry
virtual void drawPlus(const Point2D &cds, int plusWidth, const DrawColour &col, bool rawCoords=false)
virtual bool supportsAnnotations() const
Definition: MolDraw2D.h:393
virtual void drawMolecule(const ROMol &mol, const std::string &legend, const std::vector< int > *highlight_atoms=nullptr, const std::map< int, DrawColour > *highlight_map=nullptr, const std::map< int, double > *highlight_radii=nullptr, int confId=-1)
This is an overloaded member function, provided for convenience. It differs from the above function o...
virtual void clearDrawing()=0
clears the contents of the drawing
virtual int height() const
return the height of the drawing area.
Definition: MolDraw2D.h:313
virtual void setDash(const DashPattern &patt)
sets the current dash pattern
Definition: MolDraw2D.h:351
virtual void drawString(const std::string &str, const Point2D &cds, bool rawCoords=false)
drawString centres the string on cds.
MolDraw2D(MolDraw2D &&rhs)=delete
virtual DrawColour colour() const
returns the current draw color
Definition: MolDraw2D.h:349
virtual void drawArc(const Point2D &centre, double radius, double ang1, double ang2, bool rawCoords=false)
virtual void setColour(const DrawColour &col)
sets the current draw color
Definition: MolDraw2D.h:347
const std::vector< Point2D > & atomCoords() const
int getActiveAtmIdx1() const
Definition: MolDraw2D.h:397
Point2D range() const
returns the width and height of the grid (in molecular coords)
MolDraw2D(const MolDraw2D &rhs)=delete
virtual Point2D getDrawCoords(const Point2D &mol_cds) const
virtual void drawTriangle(const Point2D &cds1, const Point2D &cds2, const Point2D &cds3, bool rawCoords=false)
draw a triangle
const MolDrawOptions & drawOptions() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: MolDraw2D.h:391
virtual void drawString(const std::string &str, const Point2D &cds, MolDraw2D_detail::TextAlignType align, bool rawCoords=false)
virtual Point2D getDrawCoords(int at_num) const
returns the drawing coordinates of a particular atom
virtual Point2D getAtomCoords(const std::pair< int, int > &screen_cds) const
std::string d_activeClass
Definition: MolDraw2D.h:412
virtual void drawAttachmentLine(const Point2D &cds1, const Point2D &cds2, const DrawColour &col, double len=1.0, unsigned int nSegments=16, bool rawCoords=false)
void setOffset(int x, int y)
sets the drawing offset (in drawing coords)
Definition: MolDraw2D.h:330
void setActiveClass(std::string actClass=std::string(""))
Definition: MolDraw2D.h:405
virtual Point2D getAtomCoords(const std::pair< double, double > &screen_cds) const
virtual int width() const
return the width of the drawing area.
Definition: MolDraw2D.h:311
virtual void setFillPolys(bool val)
returns either or not polygons should be filled
Definition: MolDraw2D.h:386
virtual void drawRect(const Point2D &cds1, const Point2D &cds2, bool rawCoords=false)
draw a rectangle given two opposite corners
virtual void drawPolygon(const std::vector< Point2D > &cds, bool rawCoords=false)=0
virtual void drawEllipse(const Point2D &cds1, const Point2D &cds2, bool rawCoords=false)
draw an ellipse
void setActiveMolIdx(int newIdx)
virtual int panelHeight() const
return the height of the drawing panels.
Definition: MolDraw2D.h:317
Point2D minPt() const
returns the minimum point of the drawing (in molecular coords)
const std::vector< std::pair< std::string, MolDraw2D_detail::OrientType > > & atomSyms() const
returns the atomic symbols of the activeMolIdx_ molecule
virtual void setLineWidth(int width)
sets the current line width
Definition: MolDraw2D.h:356
void setActiveAtmIdx(int at_idx1=-1, int at_idx2=-1)
Point2D offset() const
returns the drawing offset (in drawing coords)
Definition: MolDraw2D.h:335
virtual const DashPattern & dash() const
returns the current dash pattern
Definition: MolDraw2D.h:353
bool hasActiveAtmIdx() const
Definition: MolDraw2D.h:396
MolDraw2D & operator=(const MolDraw2D &rhs)=delete
std::vector< std::pair< std::string, std::string > > d_metadata
Definition: MolDraw2D.h:414
int getActiveBndIdx() const
Definition: MolDraw2D.h:401
virtual double fontSize() const
font size in drawing coordinate units. That's probably pixels.
std::string getActiveClass() const
Definition: MolDraw2D.h:408
double scale() const
void setScale(double newScale)
explicitly sets the scaling factors for the drawing
virtual void drawArc(const Point2D &centre, double xradius, double yradius, double ang1, double ang2, bool rawCoords=false)
MolDrawOptions & drawOptions()
returns our current drawing options
Definition: MolDraw2D.h:389
virtual int lineWidth() const
returns the current line width
Definition: MolDraw2D.h:358
RWMol is a molecule class that is intended to be edited.
Definition: RWMol.h:32
#define RDKIT_MOLDRAW2D_EXPORT
Definition: export.h:273
Std stuff.
Definition: Abbreviations.h:18
std::vector< double > DashPattern
void setMonochromeMode(MolDrawOptions &opts, const DrawColour &fgColour, const DrawColour &bgColour)
Definition: MolDraw2D.h:522
void assignDarkModePalette(ColourPalette &palette)
void setDarkMode(MolDrawOptions &opts)
Definition: MolDraw2D.h:513
DrawColour variableAttachmentColour
ColourPalette atomColourPalette