From e9d4e088de0d8703df6cd1d6985b37cc35c32719 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andr=C3=A9=20Wobst?= Date: Fri, 9 Dec 2011 21:28:10 +0000 Subject: [PATCH] move plotitems to the graph styles git-svn-id: https://pyx.svn.sourceforge.net/svnroot/pyx/trunk/pyx@3235 069f4177-920e-0410-937b-c2a4a81bcd90 --- pyx/graph/graph.py | 96 +----------------------------------------------------- pyx/graph/style.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 95 deletions(-) diff --git a/pyx/graph/graph.py b/pyx/graph/graph.py index dfaa119a..6cba5e1c 100644 --- a/pyx/graph/graph.py +++ b/pyx/graph/graph.py @@ -31,100 +31,6 @@ from pyx.graph.axis import axis, positioner goldenmean = 0.5 * (math.sqrt(5) + 1) -class styledata: - """style data storage class - - Instances of this class are used to store data from the styles - and to pass point data to the styles by instances named privatedata - and sharedata. sharedata is shared between all the style(s) in use - by a data instance, while privatedata is private to each style and - used as a storage place instead of self to prevent side effects when - using a style several times.""" - pass - - -class plotitem: - - def __init__(self, graph, data, styles): - self.data = data - self.title = data.title - - addstyles = [None] - while addstyles: - # add styles to ensure all needs of the given styles - provided = [] # already provided sharedata variables - addstyles = [] # a list of style instances to be added in front - for s in styles: - for n in s.needsdata: - if n not in provided: - defaultprovider = style.getdefaultprovider(n) - addstyles.append(defaultprovider) - provided.extend(defaultprovider.providesdata) - provided.extend(s.providesdata) - styles = addstyles + styles - - self.styles = styles - self.sharedata = styledata() - self.privatedatalist = [styledata() for s in self.styles] - - # perform setcolumns to all styles - self.usedcolumnnames = [] - for privatedata, s in zip(self.privatedatalist, self.styles): - self.usedcolumnnames.extend(s.columnnames(privatedata, self.sharedata, graph, self.data.columnnames)) - - def selectstyles(self, graph, selectindex, selecttotal): - for privatedata, style in zip(self.privatedatalist, self.styles): - style.selectstyle(privatedata, self.sharedata, graph, selectindex, selecttotal) - - def adjustaxesstatic(self, graph): - for columnname, data in self.data.columns.items(): - for privatedata, style in zip(self.privatedatalist, self.styles): - style.adjustaxis(privatedata, self.sharedata, graph, columnname, data) - - def makedynamicdata(self, graph): - self.dynamiccolumns = self.data.dynamiccolumns(graph) - - def adjustaxesdynamic(self, graph): - for columnname, data in self.dynamiccolumns.items(): - for privatedata, style in zip(self.privatedatalist, self.styles): - style.adjustaxis(privatedata, self.sharedata, graph, columnname, data) - - def draw(self, graph): - for privatedata, style in zip(self.privatedatalist, self.styles): - style.initdrawpoints(privatedata, self.sharedata, graph) - point = {} - useitems = [] - for columnname in self.usedcolumnnames: - try: - useitems.append((columnname, self.dynamiccolumns[columnname])) - except KeyError: - useitems.append((columnname, self.data.columns[columnname])) - if not useitems: - raise ValueError("cannot draw empty data") - for i in xrange(len(useitems[0][1])): - for columnname, data in useitems: - point[columnname] = data[i] - for privatedata, style in zip(self.privatedatalist, self.styles): - style.drawpoint(privatedata, self.sharedata, graph, point) - for privatedata, style in zip(self.privatedatalist, self.styles): - style.donedrawpoints(privatedata, self.sharedata, graph) - - def key_pt(self, graph, x_pt, y_pt, width_pt, height_pt): - for privatedata, style in zip(self.privatedatalist, self.styles): - style.key_pt(privatedata, self.sharedata, graph, x_pt, y_pt, width_pt, height_pt) - - def __getattr__(self, attr): - # read only access to the styles privatedata - stylesdata = [getattr(styledata, attr) - for styledata in self.privatedatalist - if hasattr(styledata, attr)] - if len(stylesdata) > 1: - return stylesdata - elif len(stylesdata) == 1: - return stylesdata[0] - raise AttributeError("access to styledata attribute '%s' failed" % attr) - - class graph(canvas.canvas): def __init__(self): @@ -187,7 +93,7 @@ class graph(canvas.canvas): raise RuntimeError("defaultstyles differ") plotitems = [] for d in usedata: - plotitems.append(plotitem(self, d, styles)) + plotitems.append(style.plotitem(self, d, styles)) self.plotitems.extend(plotitems) if self.didranges: for aplotitem in plotitems: diff --git a/pyx/graph/style.py b/pyx/graph/style.py index da4771bf..4afc0477 100644 --- a/pyx/graph/style.py +++ b/pyx/graph/style.py @@ -30,6 +30,102 @@ from pyx import bitmap as bitmapmodule builtinrange = range +class styledata: + """style data storage class + + Instances of this class are used to store data from the styles + and to pass point data to the styles by instances named privatedata + and sharedata. sharedata is shared between all the style(s) in use + by a data instance, while privatedata is private to each style and + used as a storage place instead of self to prevent side effects when + using a style several times.""" + pass + + +class plotitem: + + def __init__(self, graph, data, styles): + self.data = data + self.title = data.title + + addstyles = [None] + while addstyles: + # add styles to ensure all needs of the given styles + provided = [] # already provided sharedata variables + addstyles = [] # a list of style instances to be added in front + for s in styles: + for n in s.needsdata: + if n not in provided: + defaultprovider = style.getdefaultprovider(n) + addstyles.append(defaultprovider) + provided.extend(defaultprovider.providesdata) + provided.extend(s.providesdata) + styles = addstyles + styles + + self.styles = styles + self.sharedata = styledata() + self.privatedatalist = [styledata() for s in self.styles] + + # perform setcolumns to all styles + self.usedcolumnnames = [] + for privatedata, s in zip(self.privatedatalist, self.styles): + self.usedcolumnnames.extend(s.columnnames(privatedata, self.sharedata, graph, self.data.columnnames)) + + def selectstyles(self, graph, selectindex, selecttotal): + for privatedata, style in zip(self.privatedatalist, self.styles): + style.selectstyle(privatedata, self.sharedata, graph, selectindex, selecttotal) + + def adjustaxesstatic(self, graph): + for columnname, data in self.data.columns.items(): + for privatedata, style in zip(self.privatedatalist, self.styles): + style.adjustaxis(privatedata, self.sharedata, graph, columnname, data) + + def makedynamicdata(self, graph): + self.dynamiccolumns = self.data.dynamiccolumns(graph) + + def adjustaxesdynamic(self, graph): + for columnname, data in self.dynamiccolumns.items(): + for privatedata, style in zip(self.privatedatalist, self.styles): + style.adjustaxis(privatedata, self.sharedata, graph, columnname, data) + + def draw(self, graph): + for privatedata, style in zip(self.privatedatalist, self.styles): + style.initdrawpoints(privatedata, self.sharedata, graph) + point = {} + useitems = [] + for columnname in self.usedcolumnnames: + try: + useitems.append((columnname, self.dynamiccolumns[columnname])) + except KeyError: + useitems.append((columnname, self.data.columns[columnname])) + if not useitems: + raise ValueError("cannot draw empty data") + for i in xrange(len(useitems[0][1])): + for columnname, data in useitems: + point[columnname] = data[i] + for privatedata, style in zip(self.privatedatalist, self.styles): + style.drawpoint(privatedata, self.sharedata, graph, point) + for privatedata, style in zip(self.privatedatalist, self.styles): + style.donedrawpoints(privatedata, self.sharedata, graph) + + def key_pt(self, graph, x_pt, y_pt, width_pt, height_pt): + for privatedata, style in zip(self.privatedatalist, self.styles): + style.key_pt(privatedata, self.sharedata, graph, x_pt, y_pt, width_pt, height_pt) + + def __getattr__(self, attr): + # read only access to the styles privatedata + # this is just a convenience method + # use case: access the path of a the line style + stylesdata = [getattr(styledata, attr) + for styledata in self.privatedatalist + if hasattr(styledata, attr)] + if len(stylesdata) > 1: + return stylesdata + elif len(stylesdata) == 1: + return stylesdata[0] + raise AttributeError("access to styledata attribute '%s' failed" % attr) + + class _style: """Interface class for graph styles -- 2.11.4.GIT