View difference between Paste ID: wszPr9km and f4b7e53d7
SHOW: | | - or go back to the newest paste.
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
import sys
4
5
from OpenGL.GL import *
6
from OpenGL.GLU import *
7
from PyQt4 import QtGui, QtCore
8
from PyQt4.QtOpenGL import *
9
10
class MyMainWindow(QtGui.QMainWindow):
11
    def __init__(self):
12
        QtGui.QMainWindow.__init__(self)
13
        widget = MyGlWidget(self)    
14
        self.setCentralWidget(widget)
15
16
class MyGlWidget(QGLWidget):
17
    def __init__(self, parent):
18
        QGLWidget.__init__(self, parent)
19
        self.setMinimumSize(500, 500)
20
        self.arrows = []
21
        
22
    def paintGL(self):
23
        glClearColor(1.0, 1.0, 1.0, 1.0)
24
        glClear(GL_COLOR_BUFFER_BIT)
25
        
26
        glEnable(GL_LINE_SMOOTH)
27
        glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)
28
        
29
        glLineWidth(1.2)
30
        glPointSize(1)
31
        
32
        for arrow in self.arrows:
33
            arrow.paint()
34
        
35
    def resizeGL(self, w, h):
36
        if(h == 0): 
37
            h = 1
38
        glViewport(0, 0, w, h)
39
        glMatrixMode(GL_PROJECTION)
40
        glLoadIdentity()
41
        aspectRatio = float(float(w) / float(h))
42
        
43
        if (w <= h): 
44
            glOrtho(0, 500.0, 0, 500.0/aspectRatio, 1.0, -1.0)
45
        else: 
46
            glOrtho(0, 500.0*aspectRatio, 0, 500.0, 1.0, -1.0)
47
            
48
        glMatrixMode(GL_MODELVIEW)
49
        glLoadIdentity()
50
        
51
    def mousePressEvent(self, event):
52
        if event.button() == QtCore.Qt.LeftButton:
53
            self.drawing = True
54
            self.current_arrow = Arrow(self)
55
            self.current_arrow.x1 = event.pos().x()
56
            self.current_arrow.y1 = event.pos().y()
57
            self.current_arrow.x2 = event.pos().x()
58
            self.current_arrow.y2 = event.pos().y()
59
            self.arrows.append(self.current_arrow)
60
        
61
    def mouseMoveEvent(self, event):
62
        if self.drawing == True:
63
            self.current_arrow.x2 = event.pos().x()
64
            self.current_arrow.y2 = event.pos().y()
65
            self.paintGL()
66
            
67
    def mouseReleaseEvent(self, event):
68
        if event.button() == QtCore.Qt.LeftButton and self.drawing:
69
            self.current_arrow.x2 = event.pos().x()
70
            self.current_arrow.y2 = event.pos().y()
71
            self.paintGL()
72
            self.drawing = False
73
        
74
class Arrow(object):
75
    def __init__(self, view):
76
        self.x1 = 0
77
        self.y1 = 0
78
        self.x2 = 0
79
        self.y2 = 0
80
        self.view = view
81
    
82
    def paint(self):
83
        x1 = self.x1
84
        y1 = self.y1
85
        x2 = self.x2
86
        y2 = self.y2
87
        
88
        y1 = self.view.height() - y1
89
        y2 = self.view.height() - y2
90
        
91
        bezscale = 20
92
        bezmiddle = abs(x2-x1)/1.5
93
        
94
        glEnable(GL_MAP1_VERTEX_3)
95
        ctrlpoints=[[x1, y1, 0.01], 
96
            [x1+bezscale, y1, 0.01], [x1+bezmiddle, y1, 0.01], 
97
            [x2-bezmiddle, y2, 0.01], [x2-bezscale, y2, 0.01], 
98
            [x2, y2, 0.01]]
99
        
100
        glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, ctrlpoints)
101
        glColor3f(0.4, 0.4, 0.4)
102
        glBegin(GL_LINE_STRIP)
103
        SEGS=20
104
        for p in range(0, SEGS+1): 
105
            glEvalCoord1f(float(p)/float(SEGS))
106
        glEnd()
107
        
108
        arrow_size = 5
109
        
110
        glBegin(GL_POLYGON)
111
        glVertex2i( x2, y2 )
112
        glVertex2i( x2-arrow_size, y2-arrow_size )
113
        glVertex2i( x2-arrow_size, y2+arrow_size )
114
        glEnd()
115
        glEnable(GL_BLEND)
116
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
117
        self.view.swapBuffers()
118
119
def main(argv):
120
    import sys
121
    app = QtGui.QApplication(sys.argv)
122
    window = MyMainWindow()
123
    window.show()
124
    app.exec_()
125
    
126
if __name__ == "__main__":
127
    main(sys.argv)