I now was able to adapt the GitHub c++ example to Python with some adaption 
(enhancement).


The code in the sample on GitHub generates images of different sizes depending 
on the molecule. For my use-case the image size should be fixed (else I will 
get layout /design issues) but the molecule should take up only as much space 
as needed (depending on the desired size, dots per angstrom for example) and if 
it is too large it should shrink to fit the image and also center it.


Here the code ( 2 functions from my class):


def molToImage(self, mol, image_width = 300, image_height = 150, dpa=30, 
kekulize=True):
        mol = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=kekulize)
        w, h, minV, maxV = self.getScaleForDrawing(mol, image_width, 
image_height, dpa)
        drawer = rdMolDraw2D.MolDraw2DSVG(image_width, image_height) #fixed 
image size
        drawer.SetScale(w, h, minV, maxV)
        # re-center image
        x_offset = int((image_width - w) / 2)
        y_offset = int((image_height - h) / 2)
        drawer.SetOffset(x_offset, y_offset)
        #draw
        drawer.DrawMolecule(mol)
        drawer.FinishDrawing()
        svg = drawer.GetDrawingText()
        # It seems that the svg renderer used doesn't quite hit the spec.
        # Here are some fixes to make it work in the notebook, although I think
        # the underlying issue needs to be resolved at the generation step
        return svg.replace('svg:','')




def getScaleForDrawing(self, mol, image_width, image_height, dpa):

        minV = Point2D()
        maxV = Point2D()
        cnf = mol.GetConformer()

        minV.x = maxV.x = cnf.GetAtomPosition(0).x
        minV.y = maxV.y = cnf.GetAtomPosition(0).y

        for i in range(mol.GetNumAtoms()):
            minV.x = min(minV.x, cnf.GetAtomPosition(i).x)
            minV.y = min(minV.y, cnf.GetAtomPosition(i).y)
            maxV.x = max(maxV.x, cnf.GetAtomPosition(i).x)
            maxV.y = max(maxV.y, cnf.GetAtomPosition(i).y)

        w = int(dpa * (maxV.x - minV.x))
        h = int(dpa * (maxV.y - minV.y))

        #shrink to fit
        if w > image_width or h > image_height:

            rw = w/image_width
            rh = h/image_height

            ratio = max(rw,rh)

            w = int(w/ratio)
            h = int(h/ratio)
        return (w, h, minV, maxV)


Best Regards,

Thomas


________________________________
Von: Thomas Strunz <[email protected]>
Gesendet: Mittwoch, 13. Juni 2018 14:28
An: [email protected]
Betreff: [Rdkit-discuss] New Drawing code: Fixed sized molecules


When using the "new" drawing code according to


http://rdkit.blogspot.com/2015/02/new-drawing-code.html<http://rdkit.blogspot.com/2015/02/new-drawing-code.htm>


I also want to be able to control the size of the molecule (not image) so if 
for example I have to depict multiple molecules smaller ones are not drawn in 
an oversized fashion. Therefore I would want to control the font size and bond 
length, somewhat similar to shown here:


https://iwatobipen.wordpress.com/2017/11/03/draw-high-quality-molecular-image-in-rdkit-rdkit/


Also this would be for a web service hence drawer.GetDrawingText() is for sure 
preferred vs Draw.MolToFile and then reading in the temp file again.


I did find this sample showing this:


https://github.com/rdkit/rdkit/pull/1355/commits/8141baaa7a990e68632ab1b8445671fbcc3ca2f6


But it's in c++ and not python and not very understandable. So how can this be 
done in Python? Is there a convenience function i haven't found yet?

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Rdkit-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss

Reply via email to