source: coopr.gui.coopr/trunk/coopr/gui/coopr/Chart.py @ 2135

Last change on this file since 2135 was 2135, checked in by wehart, 10 years ago

Adding Jython GUI components.

  • Property svn:executable set to *
File size: 4.9 KB
Line 
1from pawt import swing, awt, colors, GridBag
2RIGHT = swing.JLabel.RIGHT
3APPROVE_OPTION = swing.JFileChooser.APPROVE_OPTION
4
5
6default_setup = """from math import *
7def squarewave(x,order):
8    total = 0.0
9    for i in range(1, order*2+1, 2):
10        total = total + sin(x*i/10.0)/(float(i))
11    return total
12"""
13default_expression = "squarewave(x, order=3)"
14
15class Chart(awt.Canvas):
16    color = colors.darkturquoise
17    style = 'Filled'
18
19    def getPreferredSize(self):
20        return awt.Dimension(600,300)
21
22    def paint(self, graphics):
23        clip = self.bounds
24        graphics.color = colors.white
25        graphics.fillRect(0, 0, clip.width, clip.height)
26
27        width = int(clip.width * .8)
28        height = int(clip.height * .8)
29        x_offset = int(clip.width * .1)
30        y_offset = clip.height - int(clip.height * .1)
31
32        N = len(self.data); xs = [0]*N; ys = [0]*N
33
34        xmin, xmax = 0, N-1
35        ymax = max(self.data)
36        ymin = min(self.data)
37
38        zero_y = y_offset - int(-ymin/(ymax-ymin)*height)
39        zero_x = x_offset + int(-xmin/(xmax-xmin)*width)
40
41        for i in range(N):
42            xs[i] = int(float(i)*width/N) + x_offset
43            ys[i] = y_offset - int((self.data[i]-ymin)/(ymax-ymin)*height)
44        graphics.color = self.color
45        if self.style == "Line":
46            graphics.drawPolyline(xs, ys, len(xs))
47        else:
48            xs.insert(0, xs[0]); ys.insert(0, zero_y)
49            xs.append(xs[-1]); ys.append(zero_y)
50            graphics.fillPolygon(xs, ys, len(xs))
51
52        # draw axes
53        graphics.color = colors.black
54        graphics.drawLine(x_offset,zero_y, x_offset+width, zero_y)
55        graphics.drawLine(zero_x, y_offset, zero_x, y_offset-height)
56
57        # draw labels
58        leading = graphics.font.size
59        graphics.drawString("%.3f" % xmin, x_offset, zero_y+leading)
60        graphics.drawString("%.3f" % xmax, x_offset+width, zero_y+leading)
61        graphics.drawString("%.3f" % ymin, zero_x-50, y_offset)
62        graphics.drawString("%.3f" % ymax, zero_x-50, y_offset-height+leading)
63
64def create_chart(self, bag):
65
66        self.numelements = 100
67        # create widgets
68        self.chart = Chart(visible=1)
69        self.execentry = swing.JTextArea(default_setup, 8, 60)
70        self.evalentry = swing.JTextField(default_expression,
71                                          actionPerformed = self.update)
72        # create options panel
73        optionsPanel = swing.JPanel(awt.FlowLayout(
74            alignment=awt.FlowLayout.LEFT))
75
76        # whether the plot is a line graph or a filled graph
77        self.filled = swing.JRadioButton("Filled",
78                                         actionPerformed=self.set_filled)
79        optionsPanel.add(self.filled)
80        self.line = swing.JRadioButton("Line",
81                                       actionPerformed=self.set_line)
82        optionsPanel.add(self.line)
83        styleGroup = swing.ButtonGroup()
84        styleGroup.add(self.filled)
85        styleGroup.add(self.line)
86
87        # color selection
88        optionsPanel.add(swing.JLabel("Color:", RIGHT))
89        colorlist = filter(lambda x: x[0] != '_', dir(colors))
90        self.colorname = swing.JComboBox(colorlist)
91        self.colorname.itemStateChanged = self.set_color
92        optionsPanel.add(self.colorname)
93
94        # number of points
95        optionsPanel.add(swing.JLabel("Number of Points:", RIGHT))
96        self.sizes = [50, 100, 200, 500]
97        self.numpoints = swing.JComboBox(self.sizes)
98        self.numpoints.selectedIndex = self.sizes.index(self.numelements)
99        self.numpoints.itemStateChanged = self.set_numpoints
100        optionsPanel.add(self.numpoints)
101
102        bag.add(swing.JLabel("Setup Code: ", RIGHT))
103        bag.addRow(swing.JScrollPane(self.execentry), weighty=10.0)
104        bag.add(swing.JLabel("Expression: ", RIGHT))
105        bag.addRow(self.evalentry, weighty=2.0)
106        bag.add(swing.JLabel("Output: ", RIGHT))
107        bag.addRow(self.chart, weighty=20.0)
108        bag.add(swing.JLabel("Options: ", RIGHT))
109        bag.addRow(optionsPanel, weighty=2.0)
110
111        self.update(None)
112
113def set_color(self, event):
114        self.chart.color = getattr(colors, event.item)
115        self.chart.repaint()
116
117def set_numpoints(self, event):
118        self.numelements = event.item
119        self.update(None)
120
121def set_filled(self, event):
122        self.chart.style = 'Filled'
123        self.chart.repaint()
124
125def set_line(self, event):
126        self.chart.style = 'Line'
127        self.chart.repaint()
128
129def update(self, event):
130        context = {}
131        exec self.execentry.text in context
132        each = compile(self.evalentry.text, '<input>', 'eval')
133        numbers = [0]*self.numelements
134        for x in xrange(self.numelements):
135            context['x'] = float(x)
136            numbers[x] = eval(each, context)
137        self.chart.data = numbers
138        if self.chart.style == 'Line':
139            self.line.setSelected(1)
140        else:
141            self.filled.setSelected(1)
142        self.chart.repaint()
143
Note: See TracBrowser for help on using the repository browser.