Newer
Older
# -*- coding: utf-8 -*-
"""
/***************************************************************************
HUB TimeSeriesViewer
-------------------
begin : 2017-08-04
git sha : $Format:%H$
copyright : (C) 2017 by HU-Berlin
email : benjamin.jakimow@geo.hu-berlin.de
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
"""
# noinspection PyPep8Naming
import os, sys, pickle, datetime
from qgis.gui import *
from qgis.core import *
from qgis.core import QgsExpression
from PyQt5.QtCore import *
from PyQt5.QtXml import *
from PyQt5.QtGui import *
from timeseriesviewer import jp, SETTINGS
from timeseriesviewer.timeseries import *
from timeseriesviewer.utils import SpatialExtent, SpatialPoint, px2geo
from timeseriesviewer.ui.docks import TsvDockWidgetBase, loadUI
from timeseriesviewer.plotstyling import PlotStyle, PlotStyleButton
from timeseriesviewer.pixelloader import PixelLoader, PixelLoaderTask
from timeseriesviewer.sensorvisualization import SensorListModel
from timeseriesviewer.temporalprofiles import *
import pyqtgraph as pg
from pyqtgraph import functions as fn
from pyqtgraph import AxisItem
import datetime
from osgeo import gdal, gdal_array
import numpy as np
OPENGL_AVAILABLE = False
try:
import OpenGL
OPENGL_AVAILABLE = True
from pyqtgraph.opengl import GLViewWidget
class ViewWidget3D(GLViewWidget):
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
def __init__(self, parent=None):
super(ViewWidget3D, self).__init__(parent)
self.mousePos = QPoint(-1,-1)
self.setBackgroundColor(QColor('black'))
self.setMouseTracking(True)
self.glAxes = gl.GLAxisItem()
self.glAxes.setSize(1,1,1)
self.glAxesNames = ['X','Y','Z']
self.glGridItemXY = gl.GLGridItem()
self.glGridItemXZ = gl.GLGridItem()
self.glGridItemYZ = gl.GLGridItem()
x, y, z = self.glAxes.size()
self.glGridItemXZ.rotate(90, 0, 1, 0)
self.glGridItemYZ.rotate(90, 1, 0, 0)
#self.glGridItemXY.setSpacing(x/10., y/10., 1)
#self.glGridItemXZ.setSpacing(x / 10., z / 10., 1)
#self.glGridItemYZ.setSpacing(y / 10., z / 10., 1)
self.glGridItemXY.scale(x/10,y/10, 1)
self.glGridItemXZ.scale(x/10,z/10, 1)
self.glGridItemYZ.scale(y/10,z/10, 1)
self.mBasicItems = [self.glGridItemXY, self.glGridItemXZ, self.glGridItemYZ, self.glAxes]
for item in self.mBasicItems:
item.setDepthValue(-10)
self.addItem(item) # draw grid/axis after surfaces since they may be translucent
def clearItems(self):
for item in self.items:
if item not in self.mBasicItems:
self.removeItem()
def paintGL(self, *args, **kwds):
GLViewWidget.paintGL(self, *args, **kwds)
self.qglColor(Qt.white)
self.renderAnnotations()
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
def update(self):
super(ViewWidget3D, self).update()
def mouseMoveEvent(self, ev):
assert isinstance(ev, QMouseEvent)
""" Allow Shift to Move and Ctrl to Pan.
Example taken from https://gist.github.com/blink1073/7406607
"""
shift = ev.modifiers() & QtCore.Qt.ShiftModifier
ctrl = ev.modifiers() & QtCore.Qt.ControlModifier
if shift:
y = ev.pos().y()
if not hasattr(self, '_prev_zoom_pos') or not self._prev_zoom_pos:
self._prev_zoom_pos = y
return
dy = y - self._prev_zoom_pos
def delta():
return -dy * 5
ev.delta = delta
self._prev_zoom_pos = y
self.wheelEvent(ev)
elif ctrl:
pos = ev.pos().x(), ev.pos().y()
if not hasattr(self, '_prev_pan_pos') or not self._prev_pan_pos:
self._prev_pan_pos = pos
return
dx = pos[0] - self._prev_pan_pos[0]
dy = pos[1] - self._prev_pan_pos[1]
self.pan(dx, dy, 0, relative=True)
self._prev_pan_pos = pos
else:
super(ViewWidget3D, self).mouseMoveEvent(ev)
#items = self.itemsAt((pos.x(), pos.y(), 3, 3))
def mousePressEvent(self, event):
super(ViewWidget3D, self).mousePressEvent(event)
self.mousePos = event.pos()
if event.button() == 2:
self.select = True
else:
self.select = False
print(self.itemsAt((self.mousePos.x(), self.mousePos.y(), 3, 3)))
if self.glAxes.visible():
x, y, z = self.glAxes.size()
self.renderText(x, 0, 0, self.glAxesNames[0])
self.renderText(0, y, 0, self.glAxesNames[1])
self.renderText(0, 0, z, self.glAxesNames[2])
self.renderText(0.8, 0.8, 0.8, 'text 3D')
self.renderText(5, 10, 'text 2D fixed')
def contextMenuEvent(self, event):
assert isinstance(event, QContextMenuEvent)
menu = QMenu()
m = menu.addMenu('Grids')
a = m.addAction('XY')
a.setCheckable(True)
a.setChecked(self.glGridItemXY.visible())
a.toggled.connect(self.glGridItemXY.setVisible)
a = m.addAction('XZ')
a.setCheckable(True)
a.setChecked(self.glGridItemXY.visible())
a.toggled.connect(self.glGridItemXZ.setVisible)
a = m.addAction('YZ')
a.setCheckable(True)
a.setChecked(self.glGridItemXY.visible())
a.toggled.connect(self.glGridItemYZ.setVisible)
menu.exec_(self.mapToGlobal(event.pos()))
if DEBUG:
print('unable to import package OpenGL')
def getTextColorWithContrast(c):
assert isinstance(c, QColor)
if c.lightness() < 0.5:
Loading
Loading full blame...