#!/usr/bin/env python

# The Python version of qwt-*/examples/curvdemo2/curvdemo2.cpp,
# using curveData() instead of the un-Pythonic setRawData().


import sys
from qt import *
from qwt import *
from Numeric import *

Size=15
USize=13

class CurveDemo(QFrame):

    def __init__(self, *args):
        apply(QFrame.__init__, (self,) + args)

        self.setFrameStyle(QFrame.Box | QFrame.Raised)
        self.setLineWidth(2)
        self.setMidLineWidth(3)

        p = QPalette()
        p.setColor(QPalette.Normal, QColorGroup.Background, QColor(30,30,50))
        self.setPalette(p)
        # make curves and maps
        self.tuples = []
        # curve 1
        curve = QwtCurve()
        curve.setPen(QPen(QColor(150, 150, 200), 2))
        curve.setStyle(QwtCurve.Spline, QwtCurve.Xfy),
        curve.setSymbol(QwtSymbol(
            QwtSymbol.Cross, QBrush(), QPen(Qt.yellow, 2), QSize(7, 7)))
        self.tuples.append((curve,
                            QwtDiMap(0, 100, -1.5, 1.5, False),
                            QwtDiMap(0, 100, 0.0, 2*pi, False)))
        # curve 2
        curve = QwtCurve()
        curve.setPen(QPen(QColor(200, 150, 50), 1, Qt.DashDotDotLine))
        curve.setStyle(QwtCurve.Sticks)
        curve.setSymbol(QwtSymbol(
            QwtSymbol.Ellipse, QBrush(Qt.blue), QPen(Qt.yellow), QSize(5, 5)))
        self.tuples.append((curve,
                            QwtDiMap(0, 100, 0.0, 2*pi, False),
                            QwtDiMap(0, 100, -3.0, 1.1, False)))
        # curve 3
        curve = QwtCurve()
        curve.setPen(QPen(QColor(100, 200, 150)))
        curve.setStyle(
            QwtCurve.Spline, QwtCurve.Periodic | QwtCurve.Parametric)
        self.tuples.append((curve,
                            QwtDiMap(0, 100, -1.1, 3.0, False),
                            QwtDiMap(0, 100, -1.1, 3.0, False)))
        # curve 4
        curve = QwtCurve()
        curve.setPen(QPen(Qt.red))
        curve.setStyle(QwtCurve.Spline)
        curve.setSplineSize(200)
        self.tuples.append((curve,
                            QwtDiMap(0, 100, -5.0, 1.1, False),
                            QwtDiMap(0, 100, -1.1, 5.0, False)))
        # data
        self.phase = 0.0
        self.base = arrayrange(0.0, 2.01*pi, 2*pi/(USize-1))
        self.uval = cos(self.base)
        self.vval = sin(self.base)
        self.uval[1::2] *= 0.5
        self.vval[1::2] *= 0.5
        self.newValues()
        # start timer
        self.tid = self.startTimer(250)

    def drawContents(self, painter):
        r = self.contentsRect()
        for curve, xMap, yMap in self.tuples:
            xMap.setIntRange(r.left(), r.right())
            yMap.setIntRange(r.top(), r.bottom())
            curve.draw(painter, xMap, yMap)

    def timerEvent(self, event):
        self.newValues()
        self.repaint()
        
    def newValues(self):
        phase = self.phase
        
        self.xval = arrayrange(0, 2.01*pi, 2*pi/(Size-1))
        self.yval = sin(self.xval - phase)
        self.zval = cos(3*(self.xval + phase))
    
        s = 0.25 * sin(phase)
        c = sqrt(1.0 - s*s)
        u = self.uval
        self.uval = c*self.uval-s*self.vval
        self.vval = c*self.vval+s*u

        self.tuples[0][0].setData(self.yval, self.xval)
        self.tuples[1][0].setData(self.xval, self.zval)
        self.tuples[2][0].setData(self.yval, self.zval)
        self.tuples[3][0].setData(self.uval, self.vval)
        
        self.phase += 2*pi/100
        if self.phase>2*pi:
            self.phase = 0.0


def make():
    demo = CurveDemo()
    demo.resize(300, 300)
    demo.show()
    return demo


def main(args):
    app = QApplication(args)
    demo = make()
    app.setMainWidget(demo)
    app.exec_loop()
 
# Admire!         
if __name__ == '__main__':
    main(sys.argv)