diff --git a/src/graph/__init__.py b/src/graph/__init__.py new file mode 100644 diff --git a/src/graph/app.py b/src/graph/app.py new file mode 100644 --- /dev/null +++ b/src/graph/app.py @@ -0,0 +1,47 @@ +from zope.interface import Interface +from zope.interface import implements + +from graph.components import BaseComponent, Image +from graph.interfaces import IAxis, IViewBox + + +class IPlotImage(Interface): + """ + Componante to plot a 2d graph of a given image + """ + + +class PlotImage( BaseComponent): + """ + Makes a 2D plot for an image + """ + implements(IPlotImage) + + def __init__(self, parent, image): + super(PlotImage, self).__init__(parent) + self.image = image + self.x_axis = IAxis(self) + self.x_axis.orientation='bottom' + self.x_axis.start=0 + self.x_axis.end=8 + + self.y_axis = IAxis(self) + self.y_axis.orientation='left' + self.y_axis.start=-5 + self.y_axis.end=3 + + self.vb = IViewBox(self) + + self.vb.addItem( self.x_axis ) + self.vb.addItem( self.y_axis ) + self.vb.addItem( self.image ) + + def render(self): + return self.vb.render() + + + +image = Image(None, None) +plot = PlotImage( None, image) +print( plot.render()) + diff --git a/src/graph/components.py b/src/graph/components.py new file mode 100644 --- /dev/null +++ b/src/graph/components.py @@ -0,0 +1,118 @@ + +from zope.interface import implements, implementsOnly, Interface +from zope.component import adapts, getGlobalSiteManager + +from graph.interfaces import ITickLabelAdapter +from graph.interfaces import IAxis +from graph.interfaces import IViewBox +from graph.interfaces import IImage +from graph.interfaces import IBaseAdapter + + +gsm = getGlobalSiteManager() + + +class BaseAdapter(object): + """ + Base for all Adapters + """ + implements(IBaseAdapter) + + def __init__(self, obj): + """ + Gets an Object to be adapted + """ + self.obj = obj + + +class BaseComponent(object): + """ + """ + + def __init__(self, parent): + self.parent = parent + + +class TickLabelAdapter(BaseAdapter): + """ + Generates Ticklabels for an axis + """ + implementsOnly(ITickLabelAdapter) + adapts(IAxis) + + def __init__(self, axis): + """ + Gets an Object to be adapted + """ + self.axis = axis + + def render(self): + return map(str, range(self.axis.start, self.axis.end)) + +gsm.registerAdapter(TickLabelAdapter) + + +class Axis(BaseComponent): + """ + Represents an axis + """ + + implements(IAxis) + adapts(Interface) + + def __init__(self, parent, orientation=None, start=None, end=None): + super(Axis, self).__init__(parent) + self.orientation = orientation + self.start = start + self.end = end + + def get_tick_labels(self): + return ITickLabelAdapter(self).render() + + def render(self): + return 'axis: ' + self.orientation + ':' + ' '.join(self.get_tick_labels()) + +gsm.registerAdapter(Axis) + + +class ViewBox(BaseComponent): + """ + Drawing area of a plot. THe drawing ares may have an unlimited number of axis + """ + implements(IViewBox) + adapts(Interface) + + + def __init__(self, parent): + super(ViewBox, self).__init__(parent) + self.items = [] + + def addItem(self, item): + self.items.append(item) + + def render(self): + result = [] + for item in self.items: + result.append(item.render()) + + return '\n'.join(result) + +gsm.registerAdapter(ViewBox) + + +class Image(BaseComponent): + """ + A image representing f(x,y) values + """ + implements(IImage) + adapts(Interface) + + + def __init__(self, parent, data): + super(Image, self).__init__(parent) + self.data = data + + def render(self): + return 'Image: Rendered image' + +gsm.registerAdapter(Image) diff --git a/src/graph/interfaces.py b/src/graph/interfaces.py new file mode 100644 --- /dev/null +++ b/src/graph/interfaces.py @@ -0,0 +1,38 @@ + +from zope.interface import Interface + +# ADAPTER BASE CLASSES +class IBaseAdapter(Interface): + """ + Base of all adapters + """ + def __init__(self, obj): + """ + Gets an Object to be adapted + """ + + +class IAxis(Interface): + """ + Axis interface + """ + def __init__(self, parent): + """ + createed with knowledge of its parent component + """ + +class ITickLabelAdapter(Interface): + """ + An adapter that produces tick labels for an axis + """ + +class IViewBox(Interface): + """ + Container to display some components + """ + +class IImage(Interface): + """ + Some xy data + """ +