translateablecanvas
[PyX/mjg.git] / examples / graphstyles / insert.py
blob9f01e4bf660c71dde96f1f35b4b2d9e7c588e463
1 from pyx import *
3 class insertstyle(graph.style.symbol):
4 """a graph style which calls a translate_pt method of the symbol to insert
5 the result instead of calling the symbol to get a path to be drawn"""
7 def selectstyle(self, privatedata, sharedata, graph, selectindex, selecttotal):
8 privatedata.symbol = attr.selectattr(self.symbol, selectindex, selecttotal)
9 privatedata.size_pt = unit.topt(attr.selectattr(self.size, selectindex, selecttotal))
10 privatedata.insertcanvas = canvas.translateablecanvas()
11 if self.symbolattrs is not None:
12 privatedata.symbolattrs = attr.selectattrs(self.defaultsymbolattrs + self.symbolattrs, selectindex, selecttotal)
13 else:
14 privatedata.symbolattrs = None
15 # stroke symbol on insertcanvas instead of symbolcanvas
16 privatedata.symbol(privatedata.insertcanvas, 0, 0, privatedata.size_pt, privatedata.symbolattrs)
18 def drawpoint(self, privatedata, sharedata, graph, point):
19 if sharedata.vposvalid and privatedata.symbolattrs is not None:
20 x_pt, y_pt = graph.vpos_pt(*sharedata.vpos)
21 # use more efficient version of privatedata.symbolcanvas.insert(privatedata.insertcanvas,[trafo.translate_pt(x_pt, y_pt)])
22 privatedata.symbolcanvas.insert(privatedata.insertcanvas.translate_pt(x_pt, y_pt))
24 # key_pt is inherited from graph.style.symbol because reimplementing would save only one instance
28 g = graph.graphxy(width=8)
29 g.plot(graph.data.function("y(x)=x*x", min=-1, max=1, points=1000),
30 # [graph.style.symbol(graph.style.symbol.circle, symbolattrs=[deco.filled,color.rgb.blue, deco.stroked.clear])])
31 [insertstyle(graph.style.symbol.circle, symbolattrs=[deco.filled,color.rgb.blue, deco.stroked.clear])])
32 g.writeEPSfile("insert")