diff --git a/Code/GraphMol/MolDraw2D/DrawMol.cpp b/Code/GraphMol/MolDraw2D/DrawMol.cpp index 147e82a10..69e00561c 100755 --- a/Code/GraphMol/MolDraw2D/DrawMol.cpp +++ b/Code/GraphMol/MolDraw2D/DrawMol.cpp @@ -2389,7 +2389,7 @@ void DrawMol::makeWedgedBond(Bond *bond, auto at2 = bond->getEndAtom(); auto col1 = cols.first; auto col2 = cols.second; - if (drawOptions_.singleColourWedgeBonds) { + if (drawOptions_.singleColourWedgeBonds || drawOptions_.singleColourBonds) { col1 = drawOptions_.symbolColour; col2 = drawOptions_.symbolColour; } @@ -2574,8 +2574,12 @@ std::pair DrawMol::getBondColours(Bond *bond) { col2 = bondColours_[bond->getIdx()].second; } else { if (!highlight_bond || drawOptions_.continuousHighlight) { - col1 = getColour(bond->getBeginAtomIdx()); - col2 = getColour(bond->getEndAtomIdx()); + if (drawOptions_.singleColourBonds) { + col1 = col2 = drawOptions_.symbolColour; + } else { + col1 = getColour(bond->getBeginAtomIdx()); + col2 = getColour(bond->getEndAtomIdx()); + } } else { if (highlightBondMap_.find(bond->getIdx()) != highlightBondMap_.end()) { col1 = col2 = highlightBondMap_.find(bond->getIdx())->second; diff --git a/Code/GraphMol/MolDraw2D/MolDraw2DHelpers.h b/Code/GraphMol/MolDraw2D/MolDraw2DHelpers.h index 077bab9e1..a4793f21b 100644 --- a/Code/GraphMol/MolDraw2D/MolDraw2DHelpers.h +++ b/Code/GraphMol/MolDraw2D/MolDraw2DHelpers.h @@ -322,6 +322,9 @@ struct RDKIT_MOLDRAW2D_EXPORT MolDrawOptions { false; // if true wedged and dashed bonds are drawn // using symbolColour rather than inheriting // their colour from the atoms + bool singleColourBonds = false; // if true all bonds are drawn using + // symbolColour rather than inheriting their + // colour from the atoms bool useMolBlockWedging = false; // If the molecule came from a MolBlock, // prefer the wedging information that // provides. If false, use RDKit rules. diff --git a/Code/GraphMol/MolDraw2D/MolDrawOptionsJSONParsers.cpp b/Code/GraphMol/MolDraw2D/MolDrawOptionsJSONParsers.cpp index 5cd2c6758..25db9f4b6 100644 --- a/Code/GraphMol/MolDraw2D/MolDrawOptionsJSONParsers.cpp +++ b/Code/GraphMol/MolDraw2D/MolDrawOptionsJSONParsers.cpp @@ -182,6 +182,7 @@ void updateMolDrawOptionsFromJSON(MolDrawOptions &opts, PT_OPT_GET(simplifiedStereoGroupLabel); PT_OPT_GET(unspecifiedStereoIsUnknown); PT_OPT_GET(singleColourWedgeBonds); + PT_OPT_GET(singleColourBonds); PT_OPT_GET(useMolBlockWedging); PT_OPT_GET(scalingFactor); PT_OPT_GET(drawMolsSameScale); @@ -213,7 +214,8 @@ void updateMolDrawOptionsFromJSON(MolDrawOptions &opts, const auto drawingExtentsIncludeIt = pt.find("drawingExtentsInclude"); if (drawingExtentsIncludeIt != pt.not_found()) { bool haveDrawElementFlags = false; - auto drawingExtentsInclude = flagsFromJson(drawingExtentsIncludeIt->second, &haveDrawElementFlags); + auto drawingExtentsInclude = flagsFromJson( + drawingExtentsIncludeIt->second, &haveDrawElementFlags); if (haveDrawElementFlags) { opts.drawingExtentsInclude = drawingExtentsInclude; } diff --git a/Code/GraphMol/MolDraw2D/Wrap/rdMolDraw2D.cpp b/Code/GraphMol/MolDraw2D/Wrap/rdMolDraw2D.cpp index 377505a94..40d39cad5 100644 --- a/Code/GraphMol/MolDraw2D/Wrap/rdMolDraw2D.cpp +++ b/Code/GraphMol/MolDraw2D/Wrap/rdMolDraw2D.cpp @@ -926,11 +926,10 @@ BOOST_PYTHON_MODULE(rdMolDraw2D) { .def_readwrite( "legendFraction", &RDKit::MolDrawOptions::legendFraction, "fraction of the draw panel to be used for the legend if present") - .def_readwrite( - "legendPosition", &RDKit::MolDrawOptions::legendPosition, - "legend position enum. Default=Bottom. " - "Values: LegendPosition.Bottom, LegendPosition.Top, " - "LegendPosition.Left, LegendPosition.Right.") + .def_readwrite("legendPosition", &RDKit::MolDrawOptions::legendPosition, + "legend position enum. Default=Bottom. " + "Values: LegendPosition.Bottom, LegendPosition.Top, " + "LegendPosition.Left, LegendPosition.Right.") .def_readwrite( "legendVerticalText", &RDKit::MolDrawOptions::legendVerticalText, "when legend is Left or Right, draw text vertically (one char per line)") @@ -1072,6 +1071,11 @@ BOOST_PYTHON_MODULE(rdMolDraw2D) { "if true wedged and dashed bonds are drawn using symbolColour " "rather than inheriting their colour from the atoms. " "Default is false.") + .def_readwrite("singleColourBonds", + &RDKit::MolDrawOptions::singleColourBonds, + "if true all bonds are drawn using symbolColour " + "rather than inheriting their colour from the atoms. " + "Default is false.") .def_readwrite("useMolBlockWedging", &RDKit::MolDrawOptions::useMolBlockWedging, "If the molecule came from a MolBlock, prefer the wedging" @@ -1203,8 +1207,8 @@ BOOST_PYTHON_MODULE(rdMolDraw2D) { .def("FillPolys", &RDKit::MolDraw2D::fillPolys, python::args("self"), "returns whether or not polygons are being filled") .def("DrawLine", - (void(RDKit::MolDraw2D::*)(const Point2D &, const Point2D &, bool)) & - RDKit::MolDraw2D::drawLine, + (void (RDKit::MolDraw2D::*)(const Point2D &, const Point2D &, + bool))&RDKit::MolDraw2D::drawLine, (python::arg("self"), python::arg("cds1"), python::arg("cds2"), python::arg("rawCoords") = false), "draws a line with the current drawing style. The coordinates " @@ -1253,9 +1257,8 @@ BOOST_PYTHON_MODULE(rdMolDraw2D) { "are in the molecule frame unless rawCoords is true, " "in which case the coordinates are in pixels.") .def("DrawArc", - (void(RDKit::MolDraw2D::*)(const Point2D &, double, double, double, - bool)) & - RDKit::MolDraw2D::drawArc, + (void (RDKit::MolDraw2D::*)(const Point2D &, double, double, double, + bool))&RDKit::MolDraw2D::drawArc, (python::arg("self"), python::arg("center"), python::arg("radius"), python::arg("angle1"), python::arg("angle2"), python::arg("rawCoords") = false), @@ -1284,9 +1287,9 @@ BOOST_PYTHON_MODULE(rdMolDraw2D) { "are in the molecule frame unless rawCoords is true, " "in which case the coordinates are in pixels.") .def("DrawString", - (void(RDKit::MolDraw2D::*)(const std::string &, - const RDGeom::Point2D &, bool)) & - RDKit::MolDraw2D::drawString, + (void (RDKit::MolDraw2D::*)(const std::string &, + const RDGeom::Point2D &, + bool))&RDKit::MolDraw2D::drawString, (python::arg("self"), python::arg("string"), python::arg("pos"), python::arg("rawCoords") = false), "add text to the canvas. The coordinates " @@ -1301,14 +1304,14 @@ BOOST_PYTHON_MODULE(rdMolDraw2D) { "are in the molecule frame unless rawCoords is true, " "in which case the coordinates are in pixels.") .def("GetDrawCoords", - (RDGeom::Point2D(RDKit::MolDraw2D::*)(const RDGeom::Point2D &) + (RDGeom::Point2D (RDKit::MolDraw2D::*)(const RDGeom::Point2D &) const) & RDKit::MolDraw2D::getDrawCoords, (python::arg("self"), python::arg("point")), "get the coordinates in drawing space for a particular point in " "molecule space") .def("GetDrawCoords", - (RDGeom::Point2D(RDKit::MolDraw2D::*)(int) const) & + (RDGeom::Point2D (RDKit::MolDraw2D::*)(int) const) & RDKit::MolDraw2D::getDrawCoords, (python::arg("self"), python::arg("atomIndex")), "get the coordinates in drawing space for a particular atom") @@ -1338,7 +1341,7 @@ BOOST_PYTHON_MODULE(rdMolDraw2D) { python::args("self"), "add the last bits of SVG to finish the drawing") .def("AddMoleculeMetadata", - (void(RDKit::MolDraw2DSVG::*)(const RDKit::ROMol &, int) const) & + (void (RDKit::MolDraw2DSVG::*)(const RDKit::ROMol &, int) const) & RDKit::MolDraw2DSVG::addMoleculeMetadata, ((python::arg("self"), python::arg("mol")), python::arg("confId") = -1), @@ -1591,10 +1594,9 @@ https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Chemistry/Structure_draw (python::arg("mol"), python::arg("confId") = -1), "Calculate the mean bond length for the molecule."); python::def("SetDarkMode", - (void (*)(RDKit::MolDrawOptions &)) & RDKit::setDarkMode, + (void (*)(RDKit::MolDrawOptions &))&RDKit::setDarkMode, python::args("d2d"), "set dark mode for a MolDrawOptions object"); - python::def("SetDarkMode", - (void (*)(RDKit::MolDraw2D &)) & RDKit::setDarkMode, + python::def("SetDarkMode", (void (*)(RDKit::MolDraw2D &))&RDKit::setDarkMode, python::args("d2d"), "set dark mode for a MolDraw2D object"); python::def("SetMonochromeMode", RDKit::setMonochromeMode_helper1, (python::arg("options"), python::arg("fgColour"), diff --git a/Code/GraphMol/MolDraw2D/Wrap/testMolDraw2D.py b/Code/GraphMol/MolDraw2D/Wrap/testMolDraw2D.py index dcaba58b7..8469c7e35 100644 --- a/Code/GraphMol/MolDraw2D/Wrap/testMolDraw2D.py +++ b/Code/GraphMol/MolDraw2D/Wrap/testMolDraw2D.py @@ -891,6 +891,7 @@ M END''') d2d.drawOptions().addAtomIndices = True d2d.drawOptions().addBondIndices = True d2d.drawOptions().singleColourWedgeBonds = True # test symbolColour + d2d.drawOptions().singleColourBonds = True # just test it's settable setattr(d2d.drawOptions(), attr, val) aval = getattr(d2d.drawOptions(), attr) for idx in range(4): diff --git a/Code/GraphMol/MolDraw2D/catch_tests.cpp b/Code/GraphMol/MolDraw2D/catch_tests.cpp index a14b7ef95..c6a7e253a 100644 --- a/Code/GraphMol/MolDraw2D/catch_tests.cpp +++ b/Code/GraphMol/MolDraw2D/catch_tests.cpp @@ -11454,4 +11454,32 @@ TEST_CASE("Github 9280 - font scaling bug") { CHECK(text.find("font-size:6px") != std::string::npos); check_file_hash("test_Github9280_0.2.svg"); } +} +TEST_CASE("Uniform bond colour") { + auto m1 = "F[C@@H](Cl)Oc1ccc(N2CCc3nccc(C(=O)Nc4ccccn4)c3C2)nc1"_smiles; + REQUIRE(m1); + MolDraw2DSVG drawer(400, 400, -1, -1, NO_FREETYPE); + MolDraw2DUtils::prepareMolForDrawing(*m1); + drawer.drawOptions().addBondIndices = true; + drawer.drawOptions().singleColourBonds = true; + drawer.drawMolecule(*m1); + drawer.finishDrawing(); + std::string text = drawer.getDrawingText(); + std::ofstream outs("testUniformBondColour_1.svg"); + outs << text; + outs.close(); + // Bond 2 is C-O so in normal mode would have 2 lines, a black one and a + // red one. Make sure there's only one. + const static std::regex bond2("