Source code for pyrocko.gui.sparrow.elements.plates

# https://pyrocko.org - GPLv3
#
# The Pyrocko Developers, 21st Century
# ---|P------/S----------~Lg----------

import numpy as num

from pyrocko import table, geometry, cake
from pyrocko.guts import Bool, Float
from pyrocko.gui.qt_compat import qw, qc

from pyrocko.dataset.tectonics import PeterBird2003
from pyrocko.gui import vtk_util
import vtk
from matplotlib.pyplot import cm

from .base import Element, ElementState

guts_prefix = 'sparrow'

km = 1e3
COLOR_PLATES = (0.1, 0.0, .0)


def plates_to_points(plates):
    num_all_nodes = 0
    for plate in plates:
        num_all_nodes = num_all_nodes + len(plate.points)
    coords = num.zeros((num_all_nodes, 3))
    x = []
    y = []

    for plate in plates:
        num_nodes = len(plate.points)
        for i in range(0, num_nodes):
            x.append(plate.points[i][0])
            y.append(plate.points[i][1])
    for i in range(0, num_all_nodes):
        coords[i, :] = x[i], y[i], -10*km
    station_table = table.Table()

    station_table.add_col(('coords', '', ('lat', 'lon', 'depth')), coords)

    return geometry.latlondepth2xyz(
        station_table.get_col('coords'),
        planetradius=cake.earthradius)


def plates_to_color(plates):
    colors = []
    colors_iter_map = iter(cm.terrain(num.linspace(0, 1, len(plates))))
    for plate in plates:
        color = next(colors_iter_map)
        colors.append(color)
    return num.array(colors)


[docs]class PlatesBoundsState(ElementState): visible = Bool.T(default=True) opacity = Float.T(default=1.0) color_by_slip_type = Bool.T(default=False) lines = Bool.T(default=True) def create(self): element = PlatesBoundsElement() return element
class PlatelinesPipe(object): def __init__(self, plates=None): self.mapper = vtk.vtkDataSetMapper() self._polyline_grid = {} self._opacity = 1.0 self.plates = plates actor = vtk.vtkActor() actor.SetMapper(self.mapper) prop = actor.GetProperty() prop.SetDiffuseColor(1, 1, 1) self.prop = prop self.actor = actor def plate_to_lines(self, plate): lines = [] poly = [] num_nodes = len(plate.points) for i in range(0, num_nodes): poly.append((plate.points[i][0], plate.points[i][1])) lines.append(num.asarray(poly)) self._polyline_grid[0] = vtk_util.make_multi_polyline( lines_latlon=lines, depth=-100.) vtk_util.vtk_set_input(self.mapper, self._polyline_grid[0]) def set_opacity(self, opacity): opacity = float(opacity) if self._opacity != opacity: self.prop.SetOpacity(opacity) self._opacity = opacity class PlatesBoundsElement(Element): def __init__(self): Element.__init__(self) self._parent = None self._state = None self._pipe = None self._controls = None self._plates = None self._plate_line = None self._plate_lines = [] def bind_state(self, state): Element.bind_state(self, state) self.talkie_connect(state, ['visible', 'opacity'], self.update) def get_name(self): return 'Plate bounds' def set_parent(self, parent): self._parent = parent if not self._plates: PB = PeterBird2003() self._plates = PB.get_plates() self._parent.add_panel( self.get_title_label(), self._get_controls(), visible=True, title_controls=[ self.get_title_control_remove(), self.get_title_control_visible()]) self.update() def unset_parent(self): self.unbind_state() if self._plate_lines: for i, plate in enumerate(self._plate_lines): self._parent.remove_actor(plate.actor) self._pipe = None if self._controls: self._parent.remove_panel(self._controls) self._controls = None self._parent.update_view() self._parent = None def update(self, *args): state = self._state if state.visible: colors = plates_to_color(self._plates) for i, plate in enumerate(self._plates): self._plate_line = PlatelinesPipe(plates=plate) self._plate_line.plate_to_lines(plate) self._parent.add_actor(self._plate_line.actor) prop = self._plate_line.actor.GetProperty() prop.SetDiffuseColor(colors[i][0:3]) self._plate_line.set_opacity(state.opacity) self._plate_lines.append(self._plate_line) if not state.visible and self._plate_lines: for i, plate in enumerate(self._plate_lines): self._parent.remove_actor(plate.actor) self._parent.update_view() def _get_controls(self): if self._controls is None: from ..state import state_bind_slider frame = qw.QFrame() layout = qw.QGridLayout() layout.setAlignment(qc.Qt.AlignTop) frame.setLayout(layout) layout.addWidget(qw.QLabel('Opacity'), 0, 0) slider = qw.QSlider(qc.Qt.Horizontal) slider.setSizePolicy( qw.QSizePolicy( qw.QSizePolicy.Expanding, qw.QSizePolicy.Fixed)) slider.setMinimum(0) slider.setMaximum(10) slider.setSingleStep(1) slider.setPageStep(1) layout.addWidget(slider, 0, 1) state_bind_slider(self, self._state, 'opacity', slider) layout.addWidget(qw.QFrame(), 1, 0, 1, 2) self._controls = frame return self._controls __all__ = [ 'PlatesBoundsElement', 'PlatesBoundsState' ]