1
2
3
4
5
6
7
8
9
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
16 import numpy
17
18 from rdkit.Chem.Draw.canvasbase import 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
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
81
82 return (tw,th,0)
83
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