Skip to content
Snippets Groups Projects
profilevisualization.py 77.2 KiB
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 collections import OrderedDict
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
Benjamin Jakimow's avatar
Benjamin Jakimow committed
from timeseriesviewer.pixelloader import PixelLoader, PixelLoaderTask
from timeseriesviewer.sensorvisualization import SensorListModel
from timeseriesviewer.temporalprofiles import *
Benjamin Jakimow's avatar
Benjamin Jakimow committed
from pyqtgraph import functions as fn
from pyqtgraph import AxisItem


import datetime

from osgeo import gdal, gdal_array
import numpy as np

DEBUG = False

OPENGL_AVAILABLE = False

try:
    import OpenGL
    OPENGL_AVAILABLE = True

    from pyqtgraph.opengl import GLViewWidget


    class ViewWidget3D(GLViewWidget):

        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()

        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)))


        def renderAnnotations(self):

            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...