Thread: [Rdkit-devel] [PATCH 01/17] Add new CanvasBase class with required interface
Open-Source Cheminformatics and Machine Learning
Brought to you by:
glandrum
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:33
|
--- rdkit/Chem/Draw/canvasbase.py | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) create mode 100644 rdkit/Chem/Draw/canvasbase.py diff --git a/rdkit/Chem/Draw/canvasbase.py b/rdkit/Chem/Draw/canvasbase.py new file mode 100644 index 0000000..86c13c5 --- /dev/null +++ b/rdkit/Chem/Draw/canvasbase.py @@ -0,0 +1,24 @@ +# Copyright (C) 2010 Gianluca Sforna +# +# All Rights Reserved +# +# This file is part of the RDKit. +# The contents are covered by the terms of the BSD license +# which is included in the file license.txt, found at the root +# of the RDKit source tree. + +class CanvasBase: + """ Base class for specialized canvas backends """ + + def addCanvasLine(self): + assert False, 'This should be implemented' + + def addCanvasText(self): + assert False, 'This should be implemented' + + def addCanvasPolygon(self): + assert False, 'This should be implemented' + + def addCanvasDashedWedge(self): + assert False, 'This should be implemented' + -- 1.7.4 |
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:36
|
---
rdkit/Chem/Draw/MolDrawing.py | 84 ++++++++++++----------------------------
rdkit/Chem/Draw/__init__.py | 26 ++++--------
2 files changed, 34 insertions(+), 76 deletions(-)
diff --git a/rdkit/Chem/Draw/MolDrawing.py b/rdkit/Chem/Draw/MolDrawing.py
index 0135968..55059e9 100644
--- a/rdkit/Chem/Draw/MolDrawing.py
+++ b/rdkit/Chem/Draw/MolDrawing.py
@@ -152,7 +152,7 @@ class MolDrawing(object):
lenFrac=lenFrac)
return fracP1,fracP2
- def _drawWedgedBond(self,canvas,bond,pos,nbrPos,
+ def _drawWedgedBond(self,bond,pos,nbrPos,
width=bondLineWidth,color=defaultColor,
dash=None):
perp,offsetX,offsetY = self._getBondOffset(pos,nbrPos)
@@ -163,14 +163,14 @@ class MolDrawing(object):
(nbrPos[0]-offsetX,nbrPos[1]-offsetY))
#canvas.drawPolygon(poly,edgeColor=color,edgeWidth=1,fillColor=color,closed=1)
if not dash:
- addCanvasPolygon(canvas,poly,color=color)
- elif self.wedgeDashedBonds and addCanvasDashedWedge:
- addCanvasDashedWedge(canvas,poly[0],poly[1],poly[2],color=color)
+ self.canvas.addCanvasPolygon(poly,color=color)
+ elif self.wedgeDashedBonds and self.canvas.addCanvasDashedWedge:
+ self.canvas.addCanvasDashedWedge(poly[0],poly[1],poly[2],color=color)
else:
- addCanvasLine(canvas,pos,nbrPos,linewidth=width*2,color=color,
+ self.canvas.addCanvasLine(pos,nbrPos,linewidth=width*2,color=color,
dashes=dash)
- def _drawBond(self,canvas,bond,atom,nbr,pos,nbrPos,conf,
+ def _drawBond(self,bond,atom,nbr,pos,nbrPos,conf,
width=bondLineWidth,color=defaultColor,color2=None):
bType=bond.GetBondType()
if bType == Chem.BondType.SINGLE:
@@ -183,35 +183,35 @@ class MolDrawing(object):
else:
p2,p1 = pos,nbrPos
if bDir==Chem.BondDir.BEGINWEDGE:
- self._drawWedgedBond(canvas,bond,p1,p2,color=(0,0,0),width=width)
+ self._drawWedgedBond(bond,p1,p2,color=(0,0,0),width=width)
elif bDir==Chem.BondDir.BEGINDASH:
- self._drawWedgedBond(canvas,bond,p1,p2,color=(0,0,0),width=width,
+ self._drawWedgedBond(bond,p1,p2,color=(0,0,0),width=width,
dash=self.dash)
else:
- addCanvasLine(canvas,pos,nbrPos,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(pos, nbrPos, linewidth=width, color=color, color2=color2)
elif bType == Chem.BondType.DOUBLE:
if bond.IsInRing() or (atom.GetDegree()!=1 and bond.GetOtherAtom(atom).GetDegree()!=1):
- addCanvasLine(canvas,pos,nbrPos,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(pos,nbrPos,linewidth=width,color=color,color2=color2)
fp1,fp2 = self._offsetDblBond(pos,nbrPos,bond,atom,nbr,conf)
- addCanvasLine(canvas,fp1,fp2,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(fp1,fp2,linewidth=width,color=color,color2=color2)
else:
fp1,fp2 = self._offsetDblBond(pos,nbrPos,bond,atom,nbr,conf,dir=.5,
lenFrac=1.0)
- addCanvasLine(canvas,fp1,fp2,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(fp1,fp2,linewidth=width,color=color,color2=color2)
fp1,fp2 = self._offsetDblBond(pos,nbrPos,bond,atom,nbr,conf,dir=-.5,
lenFrac=1.0)
- addCanvasLine(canvas,fp1,fp2,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(fp1,fp2,linewidth=width,color=color,color2=color2)
elif bType == Chem.BondType.AROMATIC:
- addCanvasLine(canvas,pos,nbrPos,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(pos,nbrPos,linewidth=width,color=color,color2=color2)
fp1,fp2 = self._offsetDblBond(pos,nbrPos,bond,atom,nbr,conf)
- addCanvasLine(canvas,fp1,fp2,linewidth=width,color=color,color2=color2,
+ self.canvas.addCanvasLine(fp1,fp2,linewidth=width,color=color,color2=color2,
dash=self.dash)
elif bType == Chem.BondType.TRIPLE:
- addCanvasLine(canvas,pos,nbrPos,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(pos,nbrPos,linewidth=width,color=color,color2=color2)
fp1,fp2 = self._offsetDblBond(pos,nbrPos,bond,atom,nbr,conf)
- addCanvasLine(canvas,fp1,fp2,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(fp1,fp2,linewidth=width,color=color,color2=color2)
fp1,fp2 = self._offsetDblBond(pos,nbrPos,bond,atom,nbr,conf,dir=-1)
- addCanvasLine(canvas,fp1,fp2,linewidth=width,color=color,color2=color2)
+ self.canvas.addCanvasLine(fp1,fp2,linewidth=width,color=color,color2=color2)
def scaleAndCenter(self,mol,conf,coordCenter=False,canvasSize=None,ignoreHs=False):
self.currDotsPerAngstrom=self.dotsPerAngstrom
@@ -264,7 +264,7 @@ class MolDrawing(object):
drawingTrans = canvasSize[0]/2,canvasSize[1]/2
self.drawingTrans = drawingTrans
- def _drawLabel(self,canvas,label,pos,font,color=None,
+ def _drawLabel(self,label,pos,font,color=None,
highlightIt=False):
if highlightIt:
color = self.selectColor
@@ -273,10 +273,10 @@ class MolDrawing(object):
x1 = pos[0]
y1 = pos[1]
labelP = x1,y1
- addCanvasText(canvas,label,(x1,y1),font,color)
+ self.canvas.addCanvasText(label,(x1,y1),font,color)
- def AddMol(self,mol,canvas=None,centerIt=True,molTrans=None,drawingTrans=None,
- highlightAtoms=[],confId=-1,flagCloseContactsDist=2,
+ def AddMol(self,mol,centerIt=True,molTrans=None,drawingTrans=None,
+ highlightAtoms=[],confId=-1,flagCloseContactsDist=2
ignoreHs=False):
"""
@@ -284,16 +284,6 @@ class MolDrawing(object):
- specifying centerIt will cause molTrans and drawingTrans to be ignored
"""
- try:
- dl = addCanvasLine
- except NameError:
- registerCanvas('sping')
- if canvas is None:
- canvas = self.canvas
- else:
- self.canvas = canvas
- self.canvasSize=canvas.size
-
conf = mol.GetConformer(confId)
if centerIt:
@@ -362,10 +352,10 @@ class MolDrawing(object):
# make sure we draw from the beginning to the end
# (this was Issue400)
if idx==bond.GetBeginAtomIdx():
- self._drawBond(canvas,bond,atom,nbr,pos,nbrPos,conf,
+ self._drawBond(bond,atom,nbr,pos,nbrPos,conf,
color=color,width=width,color2=color2)
else:
- self._drawBond(canvas,bond,nbr,atom,nbrPos,pos,conf,
+ self._drawBond(bond,nbr,atom,nbrPos,pos,conf,
color=color2,width=width,color2=color)
else:
nbrPos = self.atomPs[mol][nbrIdx]
@@ -408,7 +398,7 @@ class MolDrawing(object):
symbol = '%s%s%s'%(chg,hs,base)
color = elemDict.get(atom.GetAtomicNum(),(0,0,0))
- self._drawLabel(canvas,symbol,pos,font,color=color,
+ self._drawLabel(symbol,pos,font,color=color,
highlightIt=(highlightAtoms and idx in highlightAtoms))
if flagCloseContactsDist>0:
@@ -432,27 +422,6 @@ class MolDrawing(object):
fill=False,stroke=True)
-
-
-
-def registerCanvas(canvasNm):
- g= globals()
- if canvasNm in ('sping','SPING'):
- from spingCanvas import addCanvasLine,addCanvasText,addCanvasPolygon,addCanvasDashedWedge
- elif canvasNm in ('agg','AGG'):
- from aggCanvas import addCanvasLine,addCanvasText,addCanvasPolygon,addCanvasDashedWedge
- elif canvasNm in ('mpl','MPL'):
- from mplCanvas import addCanvasLine,addCanvasText,addCanvasPolygon
- addCanvasDashedWedge=None
- elif canvasNm in ('cairo','CAIRO'):
- from cairoCanvas import addCanvasLine,addCanvasText,addCanvasPolygon,addCanvasDashedWedge
- else:
- raise ValueError,'unrecognized canvas type'
- g['addCanvasLine']=addCanvasLine
- g['addCanvasText']=addCanvasText
- g['addCanvasPolygon']=addCanvasPolygon
- g['addCanvasDashedWedge']=addCanvasDashedWedge
-
if __name__=='__main__':
import sys
if len(sys.argv)<2:
@@ -467,7 +436,6 @@ if __name__=='__main__':
if 1:
from aggdraw import Draw
- registerCanvas('agg')
from PIL import Image
img = Image.new("RGBA",(300,300),"white")
canvas=Draw(img)
@@ -479,7 +447,6 @@ if __name__=='__main__':
elif 0:
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg
- registerCanvas('mpl')
fig = Figure(figsize=(3,3))
ax = fig.add_axes((0,0,1,1),xticks=[],yticks=[],frame_on=False)
xd = ax.get_xlim()
@@ -494,7 +461,6 @@ if __name__=='__main__':
else:
from rdkit.sping.PDF.pidPDF import PDFCanvas as Canvas
canvas = Canvas(size=(300,300),name='test.pdf')
- registerCanvas('sping')
drawer = MolDrawing(canvas)
drawer.AddMol(mol)
canvas.save()
diff --git a/rdkit/Chem/Draw/__init__.py b/rdkit/Chem/Draw/__init__.py
index dfa8fdf..0d32957 100644
--- a/rdkit/Chem/Draw/__init__.py
+++ b/rdkit/Chem/Draw/__init__.py
@@ -11,32 +11,24 @@ def MolToImage(mol,size=(300,300),kekulize=True, wedgeBonds=True,**kwargs):
if not mol:
raise ValueError,'Null molecule provided'
import MolDrawing
+ import Image
try:
- from aggdraw import Draw
- import Image
- MolDrawing.registerCanvas('agg')
- Canvas = Draw
+ from aggCanvas import Canvas
useAGG=True
- except:
+ except ImportError:
useAGG=False
try:
- import cairo
- import Image
- MolDrawing.registerCanvas('cairo')
from cairoCanvas import Canvas
useCAIRO=True
- except:
+ except ImportError:
useCAIRO=False
- from rdkit.sping.PIL.pidPIL import PILCanvas as Canvas
+ from spingCanvas import Canvas
canvas = Canvas(size=size,name='MolToImageFile')
img = canvas._image
- MolDrawing.registerCanvas('sping')
drawer = MolDrawing.MolDrawing(canvas)
if useAGG or useCAIRO:
img = Image.new("RGBA",size,"white")
canvas = Canvas(img)
- if useAGG:
- canvas.setantialias(True)
drawer = MolDrawing.MolDrawing(canvas)
if kekulize:
@@ -68,14 +60,14 @@ def MolToFile(mol,fileName,size=(300,300),kekulize=True, wedgeBonds=True,
if imageType is None:
imageType=os.path.splitext(fileName)[1][1:]
try:
- import cairo
- MolDrawing.registerCanvas('cairo')
- canvas=cairoCanvas.Canvas(size=size,imageType=imageType,
+ from cairoCanvas import Canvas
+ canvas = Canvas(size=size,imageType=imageType,
fileName=fileName)
useCAIRO=True
except ImportError:
+ # TODO Fix sping usage, probably needs to extend CanvasBase API
+ # to support other formats
useCAIRO=False
- MolDrawing.registerCanvas('sping')
if imageType=="pdf":
from rdkit.sping.PDF.pidPDF import PDFCanvas as Canvas
elif imageType=="ps":
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:35
|
---
rdkit/Chem/Draw/aggCanvas.py | 177 ++++++++++++++++++----------------
rdkit/Chem/Draw/cairoCanvas.py | 210 ++++++++++++++++++++--------------------
rdkit/Chem/Draw/spingCanvas.py | 146 +++++++++++++++------------
3 files changed, 282 insertions(+), 251 deletions(-)
diff --git a/rdkit/Chem/Draw/aggCanvas.py b/rdkit/Chem/Draw/aggCanvas.py
index 6709f19..dc18451 100644
--- a/rdkit/Chem/Draw/aggCanvas.py
+++ b/rdkit/Chem/Draw/aggCanvas.py
@@ -14,6 +14,9 @@ import math
from rdkit import RDConfig
import os
+from aggdraw import Draw
+from canvasbase import CanvasBase
+
faceMap={'sans':os.path.join(RDConfig.RDCodeDir,'Chem','Draw','FreeSans.ttf')}
#faceMap={'sans':os.path.join(os.path.dirname(__file__),'FreeSans.ttf')}
@@ -21,94 +24,104 @@ def convertColor(color):
color = (int(color[0]*255),int(color[1]*255),int(color[2]*255))
return color
-def _getLinePoints(p1,p2,dash):
- x1,y1=p1
- x2,y2=p2
- dx = x2-x1
- dy = y2-y1
- lineLen = math.sqrt(dx*dx+dy*dy)
- theta = math.atan2(dy,dx)
- cosT = math.cos(theta)
- sinT = math.sin(theta)
-
- pos = (x1,y1)
- pts = [pos]
- dist = 0
- currDash = 0
- while dist < lineLen:
- currL = dash[currDash%len(dash)]
- if(dist+currL > lineLen): currL = lineLen-dist
- endP = (pos[0] + currL*cosT, pos[1] + currL*sinT)
- pts.append(endP)
- pos = endP
- dist += currL
- currDash += 1
- return pts
+class Canvas(CanvasBase):
-def _doLine(canvas,p1,p2,pen,**kwargs):
- if kwargs.get('dashes',(0,0)) == (0,0):
- canvas.line((p1[0],p1[1],p2[0],p2[1]),pen)
- else:
- # the antialiasing makes the dashes appear too small
- dash = [x*4 for x in kwargs['dashes']]
- pts = _getLinePoints(p1,p2,dash)
+ def __init__(self, img):
+ self.image = Draw(img)
+ self.image.setantialias(True)
+ self.size = self.image.size
+
+ def _getLinePoints(self, p1, p2, dash):
+ x1,y1=p1
+ x2,y2=p2
+ dx = x2-x1
+ dy = y2-y1
+ lineLen = math.sqrt(dx*dx+dy*dy)
+ theta = math.atan2(dy,dx)
+ cosT = math.cos(theta)
+ sinT = math.sin(theta)
+ pos = (x1,y1)
+ pts = [pos]
+ dist = 0
currDash = 0
- dashOn = True
- while currDash<(len(pts)-1):
- if dashOn:
- p1 = pts[currDash]
- p2 = pts[currDash+1]
- canvas.line((p1[0],p1[1],p2[0],p2[1]),pen)
- currDash+=1
- dashOn = not dashOn
+ while dist < lineLen:
+ currL = dash[currDash%len(dash)]
+ if(dist+currL > lineLen): currL = lineLen-dist
+ endP = (pos[0] + currL*cosT, pos[1] + currL*sinT)
+ pts.append(endP)
+ pos = endP
+ dist += currL
+ currDash += 1
+ return pts
-def addCanvasLine(canvas,p1,p2,color=(0,0,0),color2=None,**kwargs):
- if color2 and color2!=color:
- mp = (p1[0]+p2[0])/2.,(p1[1]+p2[1])/2.
- color = convertColor(color)
- _doLine(canvas,p1,mp,Pen(color,kwargs.get('linewidth',1)),**kwargs)
- color2 = convertColor(color2)
- _doLine(canvas,mp,p2,Pen(color2,kwargs.get('linewidth',1)),**kwargs)
- else:
- color = convertColor(color)
- _doLine(canvas,p1,p2,Pen(color,kwargs.get('linewidth',1)),**kwargs)
+ def _doLine(self, p1, p2, pen, **kwargs):
+ if kwargs.get('dashes',(0,0)) == (0,0):
+ self.image.line((p1[0],p1[1],p2[0],p2[1]),pen)
+ else:
+ # the antialiasing makes the dashes appear too small
+ dash = [x*4 for x in kwargs['dashes']]
+ pts = _getLinePoints(p1,p2,dash)
-def addCanvasText(canvas,text,pos,font,color=(0,0,0),**kwargs):
- color = convertColor(color)
- font = Font(color,faceMap[font.face],size=font.size)
- w,h=canvas.textsize(text,font)
- bw,bh=w*1.1,h*1.1
- dPos = pos[0]-bw/2.,pos[1]-bh/2.
- bgColor=kwargs.get('bgColor',(1,1,1))
- bgColor = convertColor(bgColor)
- canvas.rectangle((dPos[0],dPos[1],dPos[0]+bw,dPos[1]+bh),
- None,Brush(bgColor))
- dPos = pos[0]-w/2.,pos[1]-h/2.
- canvas.text(dPos,text,font)
+ currDash = 0
+ dashOn = True
+ while currDash<(len(pts)-1):
+ if dashOn:
+ p1 = pts[currDash]
+ p2 = pts[currDash+1]
+ self.image.line((p1[0],p1[1],p2[0],p2[1]),pen)
+ currDash+=1
+ dashOn = not dashOn
-def addCanvasPolygon(canvas,ps,color=(0,0,0),fill=True,stroke=False,**kwargs):
- if not fill and not stroke: return
- dps = []
- for p in ps:
- dps.extend(p)
- color = convertColor(color)
- brush=None
- pen=None
- if fill:
- brush = Brush(color)
- if stroke:
- pen = Pen(color)
- canvas.polygon(dps,pen,brush)
+ def addCanvasLine(self, p1, p2, color=(0,0,0), color2=None, **kwargs):
+ if color2 and color2!=color:
+ mp = (p1[0]+p2[0])/2.,(p1[1]+p2[1])/2.
+ color = convertColor(color)
+ self._doLine(p1,mp,Pen(color,kwargs.get('linewidth',1)),**kwargs)
+ color2 = convertColor(color2)
+ self._doLine(mp,p2,Pen(color2,kwargs.get('linewidth',1)),**kwargs)
+ else:
+ color = convertColor(color)
+ self._doLine(p1,p2,Pen(color,kwargs.get('linewidth',1)),**kwargs)
+
+ def addCanvasText(self,text,pos,font,color=(0,0,0),**kwargs):
+ color = convertColor(color)
+ font = Font(color,faceMap[font.face],size=font.size)
+ w,h=self.image.textsize(text,font)
+ bw,bh=w*1.1,h*1.1
+ dPos = pos[0]-bw/2.,pos[1]-bh/2.
+ bgColor=kwargs.get('bgColor',(1,1,1))
+ bgColor = convertColor(bgColor)
+ self.image.rectangle((dPos[0],dPos[1],dPos[0]+bw,dPos[1]+bh),
+ None,Brush(bgColor))
+ dPos = pos[0]-w/2.,pos[1]-h/2.
+ self.image.text(dPos,text,font)
+
+ def addCanvasPolygon(self,ps,color=(0,0,0),fill=True,stroke=False,**kwargs):
+ if not fill and not stroke: return
+ dps = []
+ for p in ps:
+ dps.extend(p)
+ color = convertColor(color)
+ brush=None
+ pen=None
+ if fill:
+ brush = Brush(color)
+ if stroke:
+ pen = Pen(color)
+ self.image.polygon(dps,pen,brush)
+
+ def addCanvasDashedWedge(self,p1,p2,p3,dash=(2,2),color=(0,0,0),
+ color2=None,**kwargs):
+ pen = Pen(color,kwargs.get('linewidth',1))
+ dash = (3,3)
+ pts1 = self._getLinePoints(p1,p2,dash)
+ pts2 = self._getLinePoints(p1,p3,dash)
-def addCanvasDashedWedge(canvas,p1,p2,p3,dash=(2,2),color=(0,0,0),
- color2=None,**kwargs):
- pen = Pen(color,kwargs.get('linewidth',1))
- dash = (3,3)
- pts1 = _getLinePoints(p1,p2,dash)
- pts2 = _getLinePoints(p1,p3,dash)
+ if len(pts2)<len(pts1): pts2,pts1=pts1,pts2
- if len(pts2)<len(pts1): pts2,pts1=pts1,pts2
+ for i in range(len(pts1)):
+ self.image.line((pts1[i][0],pts1[i][1],pts2[i][0],pts2[i][1]),pen)
- for i in range(len(pts1)):
- canvas.line((pts1[i][0],pts1[i][1],pts2[i][0],pts2[i][1]),pen)
+ def flush(self):
+ self.image.flush()
diff --git a/rdkit/Chem/Draw/cairoCanvas.py b/rdkit/Chem/Draw/cairoCanvas.py
index c1284ae..71f1166 100644
--- a/rdkit/Chem/Draw/cairoCanvas.py
+++ b/rdkit/Chem/Draw/cairoCanvas.py
@@ -15,11 +15,13 @@ import rdkit.RDConfig
import os
import array
+from canvasbase import CanvasBase
+
#missing up to now
#faceMap={'sans':os.path.join(
# rdkit.RDConfig.RDCodeDir,'Chem','Draw','FreeSans.ttf')}
-class Canvas(object):
+class Canvas(CanvasBase):
def __init__(self,
image=None, # PIL image
size=None,
@@ -94,109 +96,109 @@ class Canvas(object):
return buffer
-def _getLinePoints(p1,p2,dash):
- x1,y1=p1
- x2,y2=p2
- dx = x2-x1
- dy = y2-y1
- lineLen = math.sqrt(dx*dx+dy*dy)
- theta = math.atan2(dy,dx)
- cosT = math.cos(theta)
- sinT = math.sin(theta)
-
- pos = (x1,y1)
- pts = [pos]
- dist = 0
- currDash = 0
- while dist < lineLen:
- currL = dash[currDash%len(dash)]
- if(dist+currL > lineLen): currL = lineLen-dist
- endP = (pos[0] + currL*cosT, pos[1] + currL*sinT)
- pts.append(endP)
- pos = endP
- dist += currL
- currDash += 1
- return pts
-
-def _doLine(canvas,p1,p2,**kwargs):
- if kwargs.get('dashes',(0,0)) == (0,0):
- canvas.ctx.move_to(p1[0],p1[1])
- canvas.ctx.line_to(p2[0],p2[1])
- else:
- # the antialiasing makes the dashes appear too small
- dash = [x*4 for x in kwargs['dashes']]
- pts = _getLinePoints(p1,p2,dash)
+ def _getLinePoints(self, p1, p2, dash):
+ x1,y1 = p1
+ x2,y2 = p2
+ dx = x2-x1
+ dy = y2-y1
+ lineLen = math.sqrt(dx*dx+dy*dy)
+ theta = math.atan2(dy,dx)
+ cosT = math.cos(theta)
+ sinT = math.sin(theta)
+ pos = (x1,y1)
+ pts = [pos]
+ dist = 0
currDash = 0
- dashOn = True
- while currDash<(len(pts)-1):
- if dashOn:
- p1 = pts[currDash]
- p2 = pts[currDash+1]
- canvas.ctx.move_to(p1[0],p1[1])
- canvas.ctx.line_to(p2[0],p2[1])
- currDash+=1
- dashOn = not dashOn
-
-def addCanvasLine(canvas,p1,p2,color=(0,0,0),color2=None,**kwargs):
- canvas.ctx.set_line_width(kwargs.get('linewidth',1))
- if color2 and color2!=color:
- mp = (p1[0]+p2[0])/2.,(p1[1]+p2[1])/2.
- canvas.ctx.set_source_rgb(*color)
- _doLine(canvas,p1,mp,**kwargs)
- canvas.ctx.stroke()
- canvas.ctx.set_source_rgb(*color2)
- _doLine(canvas,mp,p2,**kwargs)
- canvas.ctx.stroke()
- else:
- canvas.ctx.set_source_rgb(*color)
- _doLine(canvas,p1,p2,**kwargs)
- canvas.ctx.stroke()
-
-def addCanvasText(canvas,text,pos,font,color=(0,0,0),**kwargs):
- canvas.ctx.select_font_face("Georgia",
- cairo.FONT_SLANT_NORMAL,
- cairo.FONT_WEIGHT_BOLD)
- canvas.ctx.set_font_size(font.size)
- w,h=canvas.ctx.text_extents(text)[2:4]
- bw,bh=w*1.8,h*1.4
- dPos = pos[0]-bw/2.,pos[1]-bh/2.
- bgColor=kwargs.get('bgColor',(1,1,1))
- canvas.ctx.set_source_rgb(*bgColor)
- canvas.ctx.rectangle(dPos[0],dPos[1],bw,bh)
- canvas.ctx.fill()
- dPos = pos[0]-w/2.,pos[1]+h/2.
- canvas.ctx.set_source_rgb(*color)
- canvas.ctx.move_to(*dPos)
- canvas.ctx.show_text(text)
-
-def addCanvasPolygon(canvas,ps,color=(0,0,0),fill=True,stroke=False,**kwargs):
- if not fill and not stroke: return
- dps = []
- canvas.ctx.set_source_rgb(*color)
- canvas.ctx.move_to(ps[0][0],ps[0][1])
- for p in ps[1:]:
- canvas.ctx.line_to(p[0],p[1])
- canvas.ctx.close_path()
- if stroke:
- if fill:
- canvas.ctx.stroke_preserve()
+ while dist < lineLen:
+ currL = dash[currDash%len(dash)]
+ if(dist+currL > lineLen): currL = lineLen-dist
+ endP = (pos[0] + currL*cosT, pos[1] + currL*sinT)
+ pts.append(endP)
+ pos = endP
+ dist += currL
+ currDash += 1
+ return pts
+
+ def _doLine(self, p1, p2, **kwargs):
+ if kwargs.get('dashes',(0,0)) == (0,0):
+ self.ctx.move_to(p1[0],p1[1])
+ self.ctx.line_to(p2[0],p2[1])
else:
- canvas.ctx.stroke()
- if fill:
- canvas.ctx.fill()
-
-def addCanvasDashedWedge(canvas,p1,p2,p3,dash=(2,2),color=(0,0,0),
- color2=None,**kwargs):
- canvas.ctx.set_line_width(kwargs.get('linewidth',1))
- canvas.ctx.set_source_rgb(*color)
- dash = (3,3)
- pts1 = _getLinePoints(p1,p2,dash)
- pts2 = _getLinePoints(p1,p3,dash)
-
- if len(pts2)<len(pts1): pts2,pts1=pts1,pts2
-
- for i in range(len(pts1)):
- canvas.ctx.move_to(pts1[i][0],pts1[i][1])
- canvas.ctx.line_to(pts2[i][0],pts2[i][1])
- canvas.ctx.stroke()
+ # the antialiasing makes the dashes appear too small
+ dash = [x*4 for x in kwargs['dashes']]
+ pts = _getLinePoints(p1,p2,dash)
+
+ currDash = 0
+ dashOn = True
+ while currDash<(len(pts)-1):
+ if dashOn:
+ p1 = pts[currDash]
+ p2 = pts[currDash+1]
+ self.ctx.move_to(p1[0],p1[1])
+ self.ctx.line_to(p2[0],p2[1])
+ currDash+=1
+ dashOn = not dashOn
+
+ def addCanvasLine(self,p1,p2,color=(0,0,0),color2=None,**kwargs):
+ self.ctx.set_line_width(kwargs.get('linewidth',1))
+ if color2 and color2!=color:
+ mp = (p1[0]+p2[0])/2.,(p1[1]+p2[1])/2.
+ self.ctx.set_source_rgb(*color)
+ self._doLine(p1,mp,**kwargs)
+ self.ctx.stroke()
+ self.ctx.set_source_rgb(*color2)
+ self._doLine(mp,p2,**kwargs)
+ self.ctx.stroke()
+ else:
+ self.ctx.set_source_rgb(*color)
+ self._doLine(p1,p2,**kwargs)
+ self.ctx.stroke()
+
+ def addCanvasText(self,text,pos,font,color=(0,0,0),**kwargs):
+ self.ctx.select_font_face("Georgia",
+ cairo.FONT_SLANT_NORMAL,
+ cairo.FONT_WEIGHT_BOLD)
+ self.ctx.set_font_size(font.size)
+ w,h=self.ctx.text_extents(text)[2:4]
+ bw,bh=w*1.8,h*1.4
+ dPos = pos[0]-bw/2.,pos[1]-bh/2.
+ bgColor=kwargs.get('bgColor',(1,1,1))
+ self.ctx.set_source_rgb(*bgColor)
+ self.ctx.rectangle(dPos[0],dPos[1],bw,bh)
+ self.ctx.fill()
+ dPos = pos[0]-w/2.,pos[1]+h/2.
+ self.ctx.set_source_rgb(*color)
+ self.ctx.move_to(*dPos)
+ self.ctx.show_text(text)
+
+ def addCanvasPolygon(self,ps,color=(0,0,0),fill=True,stroke=False,**kwargs):
+ if not fill and not stroke: return
+ dps = []
+ self.ctx.set_source_rgb(*color)
+ self.ctx.move_to(ps[0][0],ps[0][1])
+ for p in ps[1:]:
+ self.ctx.line_to(p[0],p[1])
+ self.ctx.close_path()
+ if stroke:
+ if fill:
+ self.ctx.stroke_preserve()
+ else:
+ self.ctx.stroke()
+ if fill:
+ self.ctx.fill()
+
+ def addCanvasDashedWedge(self,p1,p2,p3,dash=(2,2),color=(0,0,0),
+ color2=None,**kwargs):
+ self.ctx.set_line_width(kwargs.get('linewidth',1))
+ self.ctx.set_source_rgb(*color)
+ dash = (3,3)
+ pts1 = self._getLinePoints(p1,p2,dash)
+ pts2 = self._getLinePoints(p1,p3,dash)
+
+ if len(pts2)<len(pts1): pts2,pts1=pts1,pts2
+
+ for i in range(len(pts1)):
+ self.ctx.move_to(pts1[i][0],pts1[i][1])
+ self.ctx.line_to(pts2[i][0],pts2[i][1])
+ self.ctx.stroke()
diff --git a/rdkit/Chem/Draw/spingCanvas.py b/rdkit/Chem/Draw/spingCanvas.py
index 9ed697a..98bbe3d 100644
--- a/rdkit/Chem/Draw/spingCanvas.py
+++ b/rdkit/Chem/Draw/spingCanvas.py
@@ -9,8 +9,12 @@
# of the RDKit source tree.
#
from rdkit.sping import pid
+
import math
+from rdkit.sping.PIL.pidPIL import PILCanvas
+from canvasbase import CanvasBase
+
faceMap={'sans':'helvetica'}
def convertColor(color):
@@ -41,70 +45,82 @@ def _getLinePoints(p1,p2,dash):
currDash += 1
return pts
-def addCanvasLine(canvas,p1,p2,color=(0,0,0),color2=None,**kwargs):
- if color2 and color2!=color:
- mp = (p1[0]+p2[0])/2.,(p1[1]+p2[1])/2.
- color = convertColor(color)
- canvas.drawLine(p1[0],p1[1],mp[0],mp[1],
- color=color,
- width=int(kwargs.get('linewidth',1)),
- dash=kwargs.get('dash',None))
- color2 = convertColor(color2)
- canvas.drawLine(mp[0],mp[1],p2[0],p2[1],
- color=color2,
- width=int(kwargs.get('linewidth',1)),
- dash=kwargs.get('dash',None))
- else:
+
+class Canvas(CanvasBase):
+
+ def __init__(self, size, name):
+ self.canvas = PILCanvas(size=size, name=name)
+ self._image = self.canvas._image
+ self.size = self._image.size
+
+ def addCanvasLine(self, p1,p2,color=(0,0,0),color2=None,**kwargs):
+ if color2 and color2!=color:
+ mp = (p1[0]+p2[0])/2.,(p1[1]+p2[1])/2.
+ color = convertColor(color)
+ self.canvas.drawLine(p1[0],p1[1],mp[0],mp[1],
+ color=color,
+ width=int(kwargs.get('linewidth',1)),
+ dash=kwargs.get('dash',None))
+ color2 = convertColor(color2)
+ self.canvas.drawLine(mp[0],mp[1],p2[0],p2[1],
+ color=color2,
+ width=int(kwargs.get('linewidth',1)),
+ dash=kwargs.get('dash',None))
+ else:
+ color = convertColor(color)
+ width=kwargs.get('linewidth',1)
+ self.canvas.drawLine(p1[0],p1[1],p2[0],p2[1],
+ color=color,
+ width=int(width),
+ dash=kwargs.get('dash',None))
+
+ def addCanvasText(self, text,pos,font,color=(0,0,0),**kwargs):
+ font = pid.Font(face=faceMap[font.face],size=font.size)
+ txtWidth,txtHeight=self.canvas.stringBox(text,font)
+ labelP = pos[0]-txtWidth/2,pos[1]+txtHeight/2
+ xPad = kwargs.get('xPadding',0)
+ yPad = kwargs.get('yPadding',0)
+ x1 = pos[0]-txtWidth/2 - xPad
+ y1 = pos[1]+txtHeight/2 + yPad
+ x2 = pos[0]+txtWidth/2 + xPad
+ y2 = pos[1]-txtHeight/2 - yPad
+ bgColor=kwargs.get('bgColor',(1,1,1))
+ bgColor = convertColor(bgColor)
+ self.canvas.drawRect(x1,y1,x2,y2,
+ edgeColor=pid.transparent,
+ edgeWidth=0,fillColor=bgColor)
color = convertColor(color)
- width=kwargs.get('linewidth',1)
- canvas.drawLine(p1[0],p1[1],p2[0],p2[1],
- color=color,
- width=int(width),
- dash=kwargs.get('dash',None))
-
-def addCanvasText(canvas,text,pos,font,color=(0,0,0),**kwargs):
- font = pid.Font(face=faceMap[font.face],size=font.size)
- txtWidth,txtHeight=canvas.stringBox(text,font)
- labelP = pos[0]-txtWidth/2,pos[1]+txtHeight/2
- xPad = kwargs.get('xPadding',0)
- yPad = kwargs.get('yPadding',0)
- x1 = pos[0]-txtWidth/2 - xPad
- y1 = pos[1]+txtHeight/2 + yPad
- x2 = pos[0]+txtWidth/2 + xPad
- y2 = pos[1]-txtHeight/2 - yPad
- bgColor=kwargs.get('bgColor',(1,1,1))
- bgColor = convertColor(bgColor)
- canvas.drawRect(x1,y1,x2,y2,
- edgeColor=pid.transparent,
- edgeWidth=0,fillColor=bgColor)
- color = convertColor(color)
- canvas.drawString(text,labelP[0],labelP[1],font,color=color)
-
-def addCanvasPolygon(canvas,ps,color=(0,0,0),fill=True,stroke=False,**kwargs):
- if not fill and not stroke: return
- color = convertColor(color)
- if not stroke:
- edgeWidth=0
+ self.canvas.drawString(text,labelP[0],labelP[1],font,color=color)
+
+ def addCanvasPolygon(self, ps,color=(0,0,0),fill=True,stroke=False,**kwargs):
+ if not fill and not stroke: return
+ edgeWidth=kwargs.get('lineWidth',0)
edgeColor=pid.transparent
- else:
- edgeWidth=kwargs.get('lineWidth',1)
- edgeColor=color
- if not fill:
- fillColor = pid.transparent
- else:
- fillColor = color
- canvas.drawPolygon(ps,edgeColor=edgeColor,edgeWidth=int(edgeWidth),fillColor=fillColor,
- closed=1)
-
-def addCanvasDashedWedge(canvas,p1,p2,p3,dash=(2,2),color=(0,0,0),
- color2=None,**kwargs):
- color = convertColor(color)
- dash = (4,4)
- pts1 = _getLinePoints(p1,p2,dash)
- pts2 = _getLinePoints(p1,p3,dash)
-
- if len(pts2)<len(pts1): pts2,pts1=pts1,pts2
-
- for i in range(len(pts1)):
- canvas.drawLine(pts1[i][0],pts1[i][1],pts2[i][0],pts2[i][1],
- color=color,width=1)
+ color = convertColor(color)
+ if not stroke:
+ edgeWidth=0
+ edgeColor=pid.transparent
+ else:
+ edgeWidth=kwargs.get('lineWidth',1)
+ edgeColor=color
+ if not fill:
+ fillColor = pid.transparent
+ else:
+ fillColor = color
+ self.canvas.drawPolygon(ps,edgeColor=edgeColor,edgeWidth=int(edgeWidth),fillColor=fillColor,closed=1)
+
+ def addCanvasDashedWedge(self,p1,p2,p3,dash=(2,2),color=(0,0,0),
+ color2=None,**kwargs):
+ color = convertColor(color)
+ dash = (4,4)
+ pts1 = _getLinePoints(p1,p2,dash)
+ pts2 = _getLinePoints(p1,p3,dash)
+
+ if len(pts2)<len(pts1): pts2,pts1=pts1,pts2
+
+ for i in range(len(pts1)):
+ self.canvas.drawLine(pts1[i][0],pts1[i][1],pts2[i][0],pts2[i][1],
+ color=color,width=1)
+
+ def flush(self):
+ self.canvas.flush()
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:37
|
---
rdkit/Chem/Draw/canvasbase.py | 14 ++++++++++++--
1 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/rdkit/Chem/Draw/canvasbase.py b/rdkit/Chem/Draw/canvasbase.py
index 86c13c5..bed4bd5 100644
--- a/rdkit/Chem/Draw/canvasbase.py
+++ b/rdkit/Chem/Draw/canvasbase.py
@@ -7,10 +7,18 @@
# which is included in the file license.txt, found at the root
# of the RDKit source tree.
+
class CanvasBase:
""" Base class for specialized canvas backends """
- def addCanvasLine(self):
+ def addCanvasLine(self, p1, p2, color=(0, 0, 0), color2=None, **kwargs):
+ """ Draw a single line on the canvas
+
+ This function will draw a line between p1 and p2 with the
+ given color.
+ If color2 is specified, it will be used to draw the second half
+ of the segment
+ """
assert False, 'This should be implemented'
def addCanvasText(self):
@@ -18,7 +26,9 @@ class CanvasBase:
def addCanvasPolygon(self):
assert False, 'This should be implemented'
-
+
def addCanvasDashedWedge(self):
assert False, 'This should be implemented'
+ def flush(self):
+ assert False, 'This should be implemented'
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:38
|
This way each MolDrawing instance can have a custom style
---
rdkit/Chem/Draw/MolDrawing.py | 28 +++++++++++++++-------------
1 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/rdkit/Chem/Draw/MolDrawing.py b/rdkit/Chem/Draw/MolDrawing.py
index 55059e9..0cc24b4 100644
--- a/rdkit/Chem/Draw/MolDrawing.py
+++ b/rdkit/Chem/Draw/MolDrawing.py
@@ -13,16 +13,7 @@ from rdkit import RDConfig
import numpy
import math
-elemDict={
- 7:(0,0,1),
- 8:(1,0,0),
- 9:(.2,.8,.8),
- 15:(1,.5,0),
- 16:(.8,.8,0),
- 17:(0,.8,0),
- 35:(.5,.3,.1),
- 0:(.5,.5,.5),
- }
+
class Font(object):
face='sans'
@@ -61,6 +52,17 @@ class MolDrawing(object):
wedgeDashedBonds=True
+ elemDict={
+ 7:(0,0,1),
+ 8:(1,0,0),
+ 9:(.2,.8,.8),
+ 15:(1,.5,0),
+ 16:(.8,.8,0),
+ 17:(0,.8,0),
+ 35:(.5,.3,.1),
+ 0:(.5,.5,.5),
+ }
+
def __init__(self,canvas=None):
self.canvas = canvas
if canvas:
@@ -343,8 +345,8 @@ class MolDrawing(object):
else:
width=self.bondLineWidth
if self.colorBonds:
- color = elemDict.get(atom.GetAtomicNum(),(0,0,0))
- color2 = elemDict.get(nbr.GetAtomicNum(),(0,0,0))
+ color = self.elemDict.get(atom.GetAtomicNum(),(0,0,0))
+ color2 = self.elemDict.get(nbr.GetAtomicNum(),(0,0,0))
else:
color = self.defaultColor
color2= color
@@ -397,7 +399,7 @@ class MolDrawing(object):
else:
symbol = '%s%s%s'%(chg,hs,base)
- color = elemDict.get(atom.GetAtomicNum(),(0,0,0))
+ color = self.elemDict.get(atom.GetAtomicNum(),(0,0,0))
self._drawLabel(symbol,pos,font,color=color,
highlightIt=(highlightAtoms and idx in highlightAtoms))
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:39
|
---
rdkit/Chem/Draw/aggCanvas.py | 24 ------------------------
rdkit/Chem/Draw/cairoCanvas.py | 24 ------------------------
rdkit/Chem/Draw/canvasbase.py | 24 ++++++++++++++++++++++++
rdkit/Chem/Draw/spingCanvas.py | 24 ------------------------
4 files changed, 24 insertions(+), 72 deletions(-)
diff --git a/rdkit/Chem/Draw/aggCanvas.py b/rdkit/Chem/Draw/aggCanvas.py
index dc18451..9d41858 100644
--- a/rdkit/Chem/Draw/aggCanvas.py
+++ b/rdkit/Chem/Draw/aggCanvas.py
@@ -31,30 +31,6 @@ class Canvas(CanvasBase):
self.image.setantialias(True)
self.size = self.image.size
- def _getLinePoints(self, p1, p2, dash):
- x1,y1=p1
- x2,y2=p2
- dx = x2-x1
- dy = y2-y1
- lineLen = math.sqrt(dx*dx+dy*dy)
- theta = math.atan2(dy,dx)
- cosT = math.cos(theta)
- sinT = math.sin(theta)
-
- pos = (x1,y1)
- pts = [pos]
- dist = 0
- currDash = 0
- while dist < lineLen:
- currL = dash[currDash%len(dash)]
- if(dist+currL > lineLen): currL = lineLen-dist
- endP = (pos[0] + currL*cosT, pos[1] + currL*sinT)
- pts.append(endP)
- pos = endP
- dist += currL
- currDash += 1
- return pts
-
def _doLine(self, p1, p2, pen, **kwargs):
if kwargs.get('dashes',(0,0)) == (0,0):
self.image.line((p1[0],p1[1],p2[0],p2[1]),pen)
diff --git a/rdkit/Chem/Draw/cairoCanvas.py b/rdkit/Chem/Draw/cairoCanvas.py
index 3c688a3..0e23e6f 100644
--- a/rdkit/Chem/Draw/cairoCanvas.py
+++ b/rdkit/Chem/Draw/cairoCanvas.py
@@ -96,30 +96,6 @@ class Canvas(CanvasBase):
return buffer
- def _getLinePoints(self, p1, p2, dash):
- x1,y1 = p1
- x2,y2 = p2
- dx = x2-x1
- dy = y2-y1
- lineLen = math.sqrt(dx*dx+dy*dy)
- theta = math.atan2(dy,dx)
- cosT = math.cos(theta)
- sinT = math.sin(theta)
-
- pos = (x1,y1)
- pts = [pos]
- dist = 0
- currDash = 0
- while dist < lineLen:
- currL = dash[currDash%len(dash)]
- if(dist+currL > lineLen): currL = lineLen-dist
- endP = (pos[0] + currL*cosT, pos[1] + currL*sinT)
- pts.append(endP)
- pos = endP
- dist += currL
- currDash += 1
- return pts
-
def _doLine(self, p1, p2, **kwargs):
if kwargs.get('dashes',(0,0)) == (0,0):
self.ctx.move_to(p1[0],p1[1])
diff --git a/rdkit/Chem/Draw/canvasbase.py b/rdkit/Chem/Draw/canvasbase.py
index 0a5801e..548c256 100644
--- a/rdkit/Chem/Draw/canvasbase.py
+++ b/rdkit/Chem/Draw/canvasbase.py
@@ -57,3 +57,27 @@ class CanvasBase:
saving it
"""
assert False, 'This should be implemented'
+
+ def _getLinePoints(self, p1, p2, dash):
+ x1, y1 = p1
+ x2, y2 = p2
+ dx = x2 - x1
+ dy = y2 - y1
+ lineLen = math.sqrt(dx * dx + dy * dy)
+ theta = math.atan2(dy, dx)
+ cosT = math.cos(theta)
+ sinT = math.sin(theta)
+
+ pos = (x1, y1)
+ pts = [pos]
+ dist = 0
+ currDash = 0
+ while dist < lineLen:
+ currL = dash[currDash % len(dash)]
+ if (dist + currL > lineLen): currL = lineLen - dist
+ endP = (pos[0] + currL * cosT, pos[1] + currL * sinT)
+ pts.append(endP)
+ pos = endP
+ dist += currL
+ currDash += 1
+ return pts
diff --git a/rdkit/Chem/Draw/spingCanvas.py b/rdkit/Chem/Draw/spingCanvas.py
index 98bbe3d..e656fd8 100644
--- a/rdkit/Chem/Draw/spingCanvas.py
+++ b/rdkit/Chem/Draw/spingCanvas.py
@@ -21,30 +21,6 @@ def convertColor(color):
color = pid.Color(color[0],color[1],color[2])
return color
-def _getLinePoints(p1,p2,dash):
- x1,y1=p1
- x2,y2=p2
- dx = x2-x1
- dy = y2-y1
- lineLen = math.sqrt(dx*dx+dy*dy)
- theta = math.atan2(dy,dx)
- cosT = math.cos(theta)
- sinT = math.sin(theta)
-
- pos = (x1,y1)
- pts = [pos]
- dist = 0
- currDash = 0
- while dist < lineLen:
- currL = dash[currDash%len(dash)]
- if(dist+currL > lineLen): currL = lineLen-dist
- endP = (pos[0] + currL*cosT, pos[1] + currL*sinT)
- pts.append(endP)
- pos = endP
- dist += currL
- currDash += 1
- return pts
-
class Canvas(CanvasBase):
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:39
|
---
rdkit/Chem/Draw/canvasbase.py | 44 +++++++++++++++++++++++++++++++++-------
1 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/rdkit/Chem/Draw/canvasbase.py b/rdkit/Chem/Draw/canvasbase.py
index bed4bd5..5ac81da 100644
--- a/rdkit/Chem/Draw/canvasbase.py
+++ b/rdkit/Chem/Draw/canvasbase.py
@@ -9,26 +9,54 @@
class CanvasBase:
- """ Base class for specialized canvas backends """
+ """Base class for specialized canvas backends"""
+
+ def __init__():
+ assert False, 'No objects of this type can be created'
def addCanvasLine(self, p1, p2, color=(0, 0, 0), color2=None, **kwargs):
- """ Draw a single line on the canvas
+ """Draw a single line on the canvas
- This function will draw a line between p1 and p2 with the
- given color.
- If color2 is specified, it will be used to draw the second half
+ This function will draw a line between `p1` and `p2` with the
+ given `color`.
+ If `color2` is specified, it will be used to draw the second half
of the segment
"""
assert False, 'This should be implemented'
- def addCanvasText(self):
+ def addCanvasText(self, text, pos, font, color=(0, 0, 0), **kwargs):
+ """Draw some text
+
+ The provided `text` is drawn at position `pos` using the given
+ `font` and the chosen `color`.
+ """
assert False, 'This should be implemented'
- def addCanvasPolygon(self):
+ def addCanvasPolygon(self, ps, color=(0, 0 ,0), **kwargs):
+ """Draw a polygon
+
+ Draw a polygon identified by vertexes given in `ps` using
+ the given `color`
+ """
assert False, 'This should be implemented'
- def addCanvasDashedWedge(self):
+ def addCanvasDashedWedge(self, p1, p2, p3, dash=(2, 2),
+ color=(0, 0, 0), color2=None, **kwargs):
+ """Draw a dashed wedge
+
+ The wedge is identified by the three points `p1`, `p2`, and `p3`.
+ It will be drawn using the given `color`; if `color2` is specified
+ it will be used for the second half of the wedge
+
+ TODO: fix comment, I'm not sure what `dash` does
+
+ """
assert False, 'This should be implemented'
def flush(self):
+ """Complete any remaining draw operation
+
+ This is supposed to be the last operation on the canvas before
+ saving it
+ """
assert False, 'This should be implemented'
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:40
|
---
rdkit/Chem/Draw/canvasbase.py | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/rdkit/Chem/Draw/canvasbase.py b/rdkit/Chem/Draw/canvasbase.py
index 5ac81da..0a5801e 100644
--- a/rdkit/Chem/Draw/canvasbase.py
+++ b/rdkit/Chem/Draw/canvasbase.py
@@ -11,9 +11,6 @@
class CanvasBase:
"""Base class for specialized canvas backends"""
- def __init__():
- assert False, 'No objects of this type can be created'
-
def addCanvasLine(self, p1, p2, color=(0, 0, 0), color2=None, **kwargs):
"""Draw a single line on the canvas
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:40
|
---
rdkit/Chem/Draw/__init__.py | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/rdkit/Chem/Draw/__init__.py b/rdkit/Chem/Draw/__init__.py
index 0d32957..cc2fe24 100644
--- a/rdkit/Chem/Draw/__init__.py
+++ b/rdkit/Chem/Draw/__init__.py
@@ -7,6 +7,12 @@ import os.path
def MolToImage(mol,size=(300,300),kekulize=True, wedgeBonds=True,**kwargs):
""" returns a PIL image containing a drawing of the molecule
+
+ Keyword arguments:
+ kekulize -- run kekulization routine on input `mol`
+ size -- final image size, in pixel (default (300,300))
+ wedgeBonds -- draw wedge (stereo) bonds (default True)
+ highlightAtoms -- list of atoms to highlight (default [])
"""
if not mol:
raise ValueError,'Null molecule provided'
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:41
|
---
rdkit/Chem/Draw/__init__.py | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/rdkit/Chem/Draw/__init__.py b/rdkit/Chem/Draw/__init__.py
index cc2fe24..19b9a7d 100644
--- a/rdkit/Chem/Draw/__init__.py
+++ b/rdkit/Chem/Draw/__init__.py
@@ -5,7 +5,9 @@
#
import os.path
-def MolToImage(mol,size=(300,300),kekulize=True, wedgeBonds=True,**kwargs):
+from MolDrawing import MolDrawing
+
+def MolToImage(mol, size=(300,300), kekulize=True, wedgeBonds=True, **kwargs):
""" returns a PIL image containing a drawing of the molecule
Keyword arguments:
@@ -16,7 +18,6 @@ def MolToImage(mol,size=(300,300),kekulize=True, wedgeBonds=True,**kwargs):
"""
if not mol:
raise ValueError,'Null molecule provided'
- import MolDrawing
import Image
try:
from aggCanvas import Canvas
@@ -31,11 +32,11 @@ def MolToImage(mol,size=(300,300),kekulize=True, wedgeBonds=True,**kwargs):
from spingCanvas import Canvas
canvas = Canvas(size=size,name='MolToImageFile')
img = canvas._image
- drawer = MolDrawing.MolDrawing(canvas)
+ drawer = MolDrawing(canvas)
if useAGG or useCAIRO:
img = Image.new("RGBA",size,"white")
canvas = Canvas(img)
- drawer = MolDrawing.MolDrawing(canvas)
+ drawer = MolDrawing(canvas)
if kekulize:
from rdkit import Chem
@@ -62,7 +63,6 @@ def MolToFile(mol,fileName,size=(300,300),kekulize=True, wedgeBonds=True,
if not mol:
raise ValueError,'Null molecule provided'
- import MolDrawing
if imageType is None:
imageType=os.path.splitext(fileName)[1][1:]
try:
@@ -83,7 +83,7 @@ def MolToFile(mol,fileName,size=(300,300),kekulize=True, wedgeBonds=True,
elif imageType=="png":
from rdkit.sping.PIL.pidPIL import PILCanvas as Canvas
canvas = Canvas(size=size,name=fileName)
- drawer = MolDrawing.MolDrawing(canvas)
+ drawer = MolDrawing(canvas)
if kekulize:
from rdkit import Chem
mol = Chem.Mol(mol.ToBinary())
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:38
|
---
rdkit/Chem/Draw/cairoCanvas.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/rdkit/Chem/Draw/cairoCanvas.py b/rdkit/Chem/Draw/cairoCanvas.py
index 71f1166..3c688a3 100644
--- a/rdkit/Chem/Draw/cairoCanvas.py
+++ b/rdkit/Chem/Draw/cairoCanvas.py
@@ -156,7 +156,7 @@ class Canvas(CanvasBase):
self.ctx.stroke()
def addCanvasText(self,text,pos,font,color=(0,0,0),**kwargs):
- self.ctx.select_font_face("Georgia",
+ self.ctx.select_font_face(font.face,
cairo.FONT_SLANT_NORMAL,
cairo.FONT_WEIGHT_BOLD)
self.ctx.set_font_size(font.size)
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:42
|
---
rdkit/Chem/Draw/MolDrawing.py | 32 ++++++++++++++++++++------------
rdkit/Chem/Draw/__init__.py | 3 ++-
2 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/rdkit/Chem/Draw/MolDrawing.py b/rdkit/Chem/Draw/MolDrawing.py
index 0cc24b4..8498704 100644
--- a/rdkit/Chem/Draw/MolDrawing.py
+++ b/rdkit/Chem/Draw/MolDrawing.py
@@ -266,11 +266,8 @@ class MolDrawing(object):
drawingTrans = canvasSize[0]/2,canvasSize[1]/2
self.drawingTrans = drawingTrans
- def _drawLabel(self,label,pos,font,color=None,
- highlightIt=False):
- if highlightIt:
- color = self.selectColor
- elif not color:
+ def _drawLabel(self,label,pos,font,color=None):
+ if color is None:
color = self.defaultColor
x1 = pos[0]
y1 = pos[1]
@@ -278,13 +275,16 @@ class MolDrawing(object):
self.canvas.addCanvasText(label,(x1,y1),font,color)
def AddMol(self,mol,centerIt=True,molTrans=None,drawingTrans=None,
- highlightAtoms=[],confId=-1,flagCloseContactsDist=2
- ignoreHs=False):
- """
+ highlightAtoms=[],confId=-1,flagCloseContactsDist=2,
+ highlightMap=None, ignoreHs=False):
+ """Set the molecule to be drawn.
+
+ Parameters:
+ hightlightAtoms -- list of atoms to highlight (default [])
+ highlightMap -- dictionary of (atom, color) pairs (default None)
Notes:
- specifying centerIt will cause molTrans and drawingTrans to be ignored
-
"""
conf = mol.GetConformer(confId)
@@ -342,6 +342,10 @@ class MolDrawing(object):
width=2.0*self.bondLineWidth
color = self.selectColor
color2 = self.selectColor
+ elif highlightMap is not None and idx in highlightMap and nbrIdx in highlightMap:
+ width=2.0*self.bondLineWidth
+ color = highlightMap[idx]
+ color2 = highlightMap[nbrIdx]
else:
width=self.bondLineWidth
if self.colorBonds:
@@ -399,9 +403,13 @@ class MolDrawing(object):
else:
symbol = '%s%s%s'%(chg,hs,base)
- color = self.elemDict.get(atom.GetAtomicNum(),(0,0,0))
- self._drawLabel(symbol,pos,font,color=color,
- highlightIt=(highlightAtoms and idx in highlightAtoms))
+ if highlightMap and idx in highlightMap:
+ color = highlightMap[idx]
+ elif highlightAtoms and idx in highlightAtoms:
+ color = self.selectColor
+ else:
+ color = self.elemDict.get(atom.GetAtomicNum(),(0,0,0))
+ self._drawLabel(symbol, pos, font, color=color)
if flagCloseContactsDist>0:
tol = flagCloseContactsDist*flagCloseContactsDist
diff --git a/rdkit/Chem/Draw/__init__.py b/rdkit/Chem/Draw/__init__.py
index 19b9a7d..e1ec134 100644
--- a/rdkit/Chem/Draw/__init__.py
+++ b/rdkit/Chem/Draw/__init__.py
@@ -11,10 +11,11 @@ def MolToImage(mol, size=(300,300), kekulize=True, wedgeBonds=True, **kwargs):
""" returns a PIL image containing a drawing of the molecule
Keyword arguments:
- kekulize -- run kekulization routine on input `mol`
+ kekulize -- run kekulization routine on input `mol` (default True)
size -- final image size, in pixel (default (300,300))
wedgeBonds -- draw wedge (stereo) bonds (default True)
highlightAtoms -- list of atoms to highlight (default [])
+ highlightMap -- dictionary of (atom, color) pairs (default None)
"""
if not mol:
raise ValueError,'Null molecule provided'
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:43
|
---
rdkit/Chem/Draw/canvasbase.py | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/rdkit/Chem/Draw/canvasbase.py b/rdkit/Chem/Draw/canvasbase.py
index 548c256..f7bb459 100644
--- a/rdkit/Chem/Draw/canvasbase.py
+++ b/rdkit/Chem/Draw/canvasbase.py
@@ -7,6 +7,7 @@
# which is included in the file license.txt, found at the root
# of the RDKit source tree.
+import math
class CanvasBase:
"""Base class for specialized canvas backends"""
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:44
|
---
rdkit/Chem/Draw/aggCanvas.py | 1 -
rdkit/Chem/Draw/cairoCanvas.py | 6 +-----
2 files changed, 1 insertions(+), 6 deletions(-)
diff --git a/rdkit/Chem/Draw/aggCanvas.py b/rdkit/Chem/Draw/aggCanvas.py
index 9d41858..ec96263 100644
--- a/rdkit/Chem/Draw/aggCanvas.py
+++ b/rdkit/Chem/Draw/aggCanvas.py
@@ -18,7 +18,6 @@ from aggdraw import Draw
from canvasbase import CanvasBase
faceMap={'sans':os.path.join(RDConfig.RDCodeDir,'Chem','Draw','FreeSans.ttf')}
-#faceMap={'sans':os.path.join(os.path.dirname(__file__),'FreeSans.ttf')}
def convertColor(color):
color = (int(color[0]*255),int(color[1]*255),int(color[2]*255))
diff --git a/rdkit/Chem/Draw/cairoCanvas.py b/rdkit/Chem/Draw/cairoCanvas.py
index 0e23e6f..ffe7acb 100644
--- a/rdkit/Chem/Draw/cairoCanvas.py
+++ b/rdkit/Chem/Draw/cairoCanvas.py
@@ -1,4 +1,4 @@
-#
+# $Id$
#
# Copyright (C) 2008 Greg Landrum
# Copyright (C) 2009 Uwe Hoffmann
@@ -17,10 +17,6 @@ import array
from canvasbase import CanvasBase
-#missing up to now
-#faceMap={'sans':os.path.join(
-# rdkit.RDConfig.RDCodeDir,'Chem','Draw','FreeSans.ttf')}
-
class Canvas(CanvasBase):
def __init__(self,
image=None, # PIL image
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:45
|
---
rdkit/Chem/Draw/canvasbase.py | 12 +++++++-----
1 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/rdkit/Chem/Draw/canvasbase.py b/rdkit/Chem/Draw/canvasbase.py
index f7bb459..2592e1d 100644
--- a/rdkit/Chem/Draw/canvasbase.py
+++ b/rdkit/Chem/Draw/canvasbase.py
@@ -1,3 +1,5 @@
+# $Id$
+#
# Copyright (C) 2010 Gianluca Sforna
#
# All Rights Reserved
@@ -20,7 +22,7 @@ class CanvasBase:
If `color2` is specified, it will be used to draw the second half
of the segment
"""
- assert False, 'This should be implemented'
+ raise NotImplementedError, 'This should be implemented'
def addCanvasText(self, text, pos, font, color=(0, 0, 0), **kwargs):
"""Draw some text
@@ -28,7 +30,7 @@ class CanvasBase:
The provided `text` is drawn at position `pos` using the given
`font` and the chosen `color`.
"""
- assert False, 'This should be implemented'
+ raise NotImplementedError, 'This should be implemented'
def addCanvasPolygon(self, ps, color=(0, 0 ,0), **kwargs):
"""Draw a polygon
@@ -36,7 +38,7 @@ class CanvasBase:
Draw a polygon identified by vertexes given in `ps` using
the given `color`
"""
- assert False, 'This should be implemented'
+ raise NotImplementedError, 'This should be implemented'
def addCanvasDashedWedge(self, p1, p2, p3, dash=(2, 2),
color=(0, 0, 0), color2=None, **kwargs):
@@ -49,7 +51,7 @@ class CanvasBase:
TODO: fix comment, I'm not sure what `dash` does
"""
- assert False, 'This should be implemented'
+ raise NotImplementedError, 'This should be implemented'
def flush(self):
"""Complete any remaining draw operation
@@ -57,7 +59,7 @@ class CanvasBase:
This is supposed to be the last operation on the canvas before
saving it
"""
- assert False, 'This should be implemented'
+ raise NotImplementedError, 'This should be implemented'
def _getLinePoints(self, p1, p2, dash):
x1, y1 = p1
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:46
|
---
rdkit/Chem/Draw/__init__.py | 13 ++-----------
rdkit/Chem/Draw/spingCanvas.py | 25 ++++++++++++++++++++-----
2 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/rdkit/Chem/Draw/__init__.py b/rdkit/Chem/Draw/__init__.py
index e1ec134..e42eb64 100644
--- a/rdkit/Chem/Draw/__init__.py
+++ b/rdkit/Chem/Draw/__init__.py
@@ -72,18 +72,9 @@ def MolToFile(mol,fileName,size=(300,300),kekulize=True, wedgeBonds=True,
fileName=fileName)
useCAIRO=True
except ImportError:
- # TODO Fix sping usage, probably needs to extend CanvasBase API
- # to support other formats
useCAIRO=False
- if imageType=="pdf":
- from rdkit.sping.PDF.pidPDF import PDFCanvas as Canvas
- elif imageType=="ps":
- from rdkit.sping.PS.pidPS import PSCanvas as Canvas
- elif imageType=="svg":
- from rdkit.sping.SVG.pidSVG import SVGCanvas as Canvas
- elif imageType=="png":
- from rdkit.sping.PIL.pidPIL import PILCanvas as Canvas
- canvas = Canvas(size=size,name=fileName)
+ from spingCanvas import Canvas
+ canvas = Canvas(size=size,name=fileName,imageType=imageType)
drawer = MolDrawing(canvas)
if kekulize:
from rdkit import Chem
diff --git a/rdkit/Chem/Draw/spingCanvas.py b/rdkit/Chem/Draw/spingCanvas.py
index e656fd8..c6260f6 100644
--- a/rdkit/Chem/Draw/spingCanvas.py
+++ b/rdkit/Chem/Draw/spingCanvas.py
@@ -23,11 +23,23 @@ def convertColor(color):
class Canvas(CanvasBase):
-
- def __init__(self, size, name):
- self.canvas = PILCanvas(size=size, name=name)
- self._image = self.canvas._image
- self.size = self._image.size
+ def __init__(self, size, name, imageType='png'):
+ if imageType=="pdf":
+ from rdkit.sping.PDF.pidPDF import PDFCanvas as Canvas
+ elif imageType=="ps":
+ from rdkit.sping.PS.pidPS import PSCanvas as Canvas
+ elif imageType=="svg":
+ from rdkit.sping.SVG.pidSVG import SVGCanvas as Canvas
+ elif imageType=="png":
+ from rdkit.sping.PIL.pidPIL import PILCanvas as Canvas
+ else:
+ raise ValueError,'unrecognized format: %s'%imageType
+ self.canvas = Canvas(size=size, name=name)
+ if hasattr(self.canvas,'_image'):
+ self._image = self.canvas._image
+ else:
+ self._image = None
+ self.size = size
def addCanvasLine(self, p1,p2,color=(0,0,0),color2=None,**kwargs):
if color2 and color2!=color:
@@ -100,3 +112,6 @@ class Canvas(CanvasBase):
def flush(self):
self.canvas.flush()
+
+ def save(self):
+ self.canvas.save()
--
1.7.4
|
|
From: Gianluca S. <gi...@gm...> - 2011-03-19 09:44:47
|
Use cairo based Canvas by default
---
rdkit/Chem/Draw/__init__.py | 31 ++++++++++++++++---------------
1 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/rdkit/Chem/Draw/__init__.py b/rdkit/Chem/Draw/__init__.py
index e42eb64..ac1df88 100644
--- a/rdkit/Chem/Draw/__init__.py
+++ b/rdkit/Chem/Draw/__init__.py
@@ -7,7 +7,8 @@ import os.path
from MolDrawing import MolDrawing
-def MolToImage(mol, size=(300,300), kekulize=True, wedgeBonds=True, **kwargs):
+def MolToImage(mol, size=(300,300), kekulize=True, wedgeBonds=True,
+ canvas=None, **kwargs):
""" returns a PIL image containing a drawing of the molecule
Keyword arguments:
@@ -19,25 +20,25 @@ def MolToImage(mol, size=(300,300), kekulize=True, wedgeBonds=True, **kwargs):
"""
if not mol:
raise ValueError,'Null molecule provided'
- import Image
- try:
- from aggCanvas import Canvas
- useAGG=True
- except ImportError:
+ if canvas is None:
+ import Image
useAGG=False
+ useCAIRO=False
try:
from cairoCanvas import Canvas
useCAIRO=True
except ImportError:
- useCAIRO=False
- from spingCanvas import Canvas
- canvas = Canvas(size=size,name='MolToImageFile')
- img = canvas._image
- drawer = MolDrawing(canvas)
- if useAGG or useCAIRO:
- img = Image.new("RGBA",size,"white")
- canvas = Canvas(img)
- drawer = MolDrawing(canvas)
+ try:
+ from aggCanvas import Canvas
+ useAGG=True
+ except ImportError:
+ from spingCanvas import Canvas
+ canvas = Canvas(size=size,name='MolToImageFile')
+ img = canvas._image
+ if useAGG or useCAIRO:
+ img = Image.new("RGBA",size,"white")
+ canvas = Canvas(img)
+ drawer = MolDrawing(canvas)
if kekulize:
from rdkit import Chem
--
1.7.4
|