If hacking the SVG isn't to your taste, you can pass into DrawMolecule a
list of bonds for highlighting, and the colour of highlight for each bond.
This will put a coloured band alongside each bond.  Also,
DrawMoleculeWithHighlights allows you to put multiple coloured highlights
for each bond, so you could colour code the highlights with more than 1
property, and this method also allows you to alter the width of the
highlights if you wish.  Coming in time for the next release, I am planning
to implement a highlighting method that just changes the colour of the
bonds, and with that and the first method you will be able to do what you
want directly.  And yes, Christian, at the same time I will implement your
highlight by lasso method that you've been waiting some time for!

Dave


On Tue, Jul 5, 2022 at 9:21 PM Paolo Tosco <paolo.tosco.m...@gmail.com>
wrote:

> Hi Joey,
>
> not sure if by "color" you mean text labelling or actually mapping a
> property to a color.
> Anyway, here's some code for either use case.
> The text labelling is easy, the individual bond coloring can be done by
> fiddling with the SVG text.
>
> import re
> import xml.etree.ElementTree as ET
> import colorsys
> from rdkit import Chem
> from rdkit.Chem.Draw import rdMolDraw2D, rdDepictor
> from IPython.display import SVG
>
> mol =
> Chem.MolFromSmiles('CN1C(=O)C2=C(ON=C2c2ccccc2Cl)C(Cl)=C1c1cnc(N2CCC(C)(N)CC2)nn1')
> rdDepictor.Compute2DCoords(mol)
> rdDepictor.NormalizeDepiction(mol)
> rdDepictor.StraightenDepiction(mol)
>
> # this is to assign a text label to each bond
> for b in mol.GetBonds():
>     bond_prop = int(b.GetBondType())
>     b.SetIntProp("bondNote", bond_prop)
>
> drawer = rdMolDraw2D.MolDraw2DSVG(600, 300)
> drawer.DrawMolecule(mol)
> drawer.FinishDrawing()
> svg = drawer.GetDrawingText()
>
> SVG(svg)
> [image: image.png]
> # this is to assign a color to each bond
> for b in mol.GetBonds():
>     b.ClearProp("bondNote")
>
> int_bond_types = sorted(map(int, Chem.BondType.values))
> min_bond_type = int_bond_types[0]
> max_bond_type = int_bond_types[-1]
> bond_type_range = max_bond_type - min_bond_type
>
> def bond_type_to_rgb(bt):
>     rgb = colorsys.hsv_to_rgb((int(bt) - min_bond_type) / bond_type_range,
> .8, .8)
>     return "#" + "".join("{0:02x}".format(round(c * 255.0)) for c in rgb)
>
> bond_colors = [bond_type_to_rgb(b.GetBondType()) for b in mol.GetBonds()]
> drawer = rdMolDraw2D.MolDraw2DSVG(600, 300)
> drawer.drawOptions().bondLineWidth = 3
> drawer.DrawMolecule(mol)
> drawer.FinishDrawing()
>
> def set_bond_colors(svg_text, bond_colors):
>     path_class_regex = re.compile(r"bond-(\d+) atom-(\d+) atom-(\d+)")
>     path_style_regex = re.compile(r"^(.*stroke:)(#[0-9A-F]{6})(;.*)$")
>     svg_tree = ET.fromstring(svg_text)
>     for path in svg_tree.findall("{http://www.w3.org/2000/svg}path";):
>         path_class = path.get("class")
>         if not path_class:
>             continue
>         m = path_class_regex.match(path_class)
>         if not m:
>             continue
>         bi = int(m.group(1))
>         if bi >= len(bond_colors):
>             continue
>         path_style = path.get("style")
>         if not path_style:
>             continue
>         path_style =
> path_style_regex.sub(f"\\g<1>{bond_colors[bi]}\\g<3>", path_style)
>         path.set("style", path_style)
>     return ET.tostring(svg_tree)
>
> svg_text = drawer.GetDrawingText()
> svg_text = set_bond_colors(svg_text, bond_colors)
> SVG(svg_text)
> [image: 1fa303ba-bc21-489c-af57-5324e07d7cb5.png]
>
> Hope this helps, cheers
> p.
>
> On Tue, Jul 5, 2022 at 5:12 PM Storer, Joey (J) via Rdkit-discuss <
> rdkit-discuss@lists.sourceforge.net> wrote:
>
>> Hi all,
>>
>>
>>
>> I would like to color all bonds with a value.  Does anyone have a snippet
>> for this?
>>
>>
>>
>> Many thanks!
>>
>> Joey Storer
>>
>> Dow Inc.
>>
>> Core R&D
>>
>> General Business
>> _______________________________________________
>> Rdkit-discuss mailing list
>> Rdkit-discuss@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
>>
> _______________________________________________
> Rdkit-discuss mailing list
> Rdkit-discuss@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
>


-- 
David Cosgrove
Freelance computational chemistry and chemoinformatics developer
http://cozchemix.co.uk
_______________________________________________
Rdkit-discuss mailing list
Rdkit-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss

Reply via email to