Package rdkit :: Package Chem :: Package Draw :: Module mplCanvas

[hide private]
[frames] | no frames]

# Source Code for Module rdkit.Chem.Draw.mplCanvas

      1  # $Id$
      2  #
      3  #  Copyright (C) 2008 Greg Landrum
      4  #
      5  #   @@ All Rights Reserved @@
      6  #  This file is part of the RDKit.
      7  #  The contents are covered by the terms of the BSD license
      8  #  which is included in the file license.txt, found at the root
      9  #  of the RDKit source tree.
     10  #
     11  from matplotlib.lines import Line2D
     12  from matplotlib.patches import Polygon
     13  from matplotlib.axes import Axes
     14  from matplotlib.pyplot import figure
     15  #from matplotlib import textpath,font_manager
     16  import numpy
     17
     18  from rdkit.Chem.Draw.canvasbase import CanvasBase
     19 -class Canvas(CanvasBase):
     20 -  def __init__(self, size, name='', imageType='png'):
     21      self._name = name
     22      self.size=size
     23      dpi = max(size[0],size[1])
     24      figsize=(int(float(size[0])/dpi),int(float(size[1])/dpi))
     25      self._figure = figure(figsize=figsize)
     26      self._axes = self._figure.add_axes([0,0,2.5,2.5])
     27      self._axes.set_xticklabels('')
     28      self._axes.set_yticklabels('')
     29      self._dpi = dpi
     30
     31
     32 -  def rescalePt(self,p1):
     33      return [float(p1[0])/self._dpi,float(self.size[1]-p1[1])/self._dpi]
     34
     35 -  def addCanvasLine(self,p1,p2,color=(0,0,0),color2=None,**kwargs):
     36      canvas = self._axes
     37      p1 = self.rescalePt(p1)
     38      p2 = self.rescalePt(p2)
     39      if color2 and color2!=color:
     40        mp = (p1[0]+p2[0])/2.,(p1[1]+p2[1])/2.
     41        canvas.add_line(Line2D((p1[0],mp[0]),(p1[1],mp[1]),
     42                               color=color,**kwargs))
     43        canvas.add_line(Line2D((mp[0],p2[0]),(mp[1],p2[1]),
     44                               color=color2,**kwargs))
     45      else:
     46        canvas.add_line(Line2D((p1[0],p2[0]),(p1[1],p2[1]),
     47                               color=color,**kwargs))
     48
     49 -  def addCanvasText(self,text,pos,font,color=(0,0,0),**kwargs):
     50      import re
     51      pos = self.rescalePt(pos)
     52      canvas = self._axes
     53      text = re.sub(r'<.*?>','',text)
     54      orientation=kwargs.get('orientation','E')
     55      halign='center'
     56      valign='center'
     57      if orientation=='E':
     58        halign='left'
     59      elif orientation=='W':
     60        halign='right'
     61      elif orientation=='S':
     62        valign='top'
     63      elif orientation=='N':
     64        valign='bottom'
     65
     66
     67      annot=canvas.annotate(text,(pos[0],pos[1]),color=color,
     68                            verticalalignment=valign,
     69                            horizontalalignment=halign,
     70                            weight=font.weight,
     71                            size=font.size*2.0,
     72                            family=font.face,
     73                            backgroundcolor='white')
     74
     75      try:
     76        bb = annot.get_window_extent(renderer=self._figure.canvas.get_renderer())
     77        w,h = bb.width,bb.height
     78        tw,th=canvas.transData.inverted().transform((w,h))
     79      except AttributeError:
     80        tw,th = 0.1,0.1 # <- kludge
     81      #print annot.xytext,w,h,tw,th
     82      return (tw,th,0)
     83
     84 -  def addCanvasPolygon(self,ps,color=(0,0,0),**kwargs):
     85      canvas = self._axes
     86      ps = [self.rescalePt(x) for x in ps]
     87      canvas.add_patch(Polygon(ps,linewidth=0,facecolor=color))
     88
     89
     90 -  def addCanvasDashedWedge(self,p1,p2,p3,dash=(2,2),color=(0,0,0),
     91                             color2=None,**kwargs):
     92      canvas = self._axes
     93      dash= (3,3)
     94      pts1 = self._getLinePoints(p1,p2,dash)
     95      pts2 = self._getLinePoints(p1,p3,dash)
     96      pts1 = [self.rescalePt(p) for p in pts1]
     97      pts2 = [self.rescalePt(p) for p in pts2]
     98      if len(pts2)<len(pts1):
     99        pts2,pts1=pts1,pts2
    100      for i in range(len(pts1)):
    101        if color2 and color2!=color:
    102          mp = (pts1[i][0]+pts2[i][0])/2.,(pts1[i][1]+pts2[i][1])/2.
    103          canvas.add_line(Line2D((pts1[i][0],mp[0]),(pts1[i][1],mp[1]),color=color,**kwargs))
    104          canvas.add_line(Line2D((mp[0],pts2[i][0]),(mp[1],pts2[i][1]),color=color2,**kwargs))
    105        else:
    106          canvas.add_line(Line2D((pts1[i][0],pts2[i][0]),(pts1[i][1],pts2[i][1]),color=color,**kwargs))
    107