Source code for pyrocko.gui.sparrow.elements.volcanoes
# 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.volcanoes import Volcanoes
from pyrocko.gui.vtk_util import ScatterPipe
from .base import Element, ElementState
guts_prefix = 'sparrow'
km = 1e3
COLOR_HOLOCENE = (0.98, 0.26, .32)
COLOR_PLEISTOCENE = (1., .41, .28)
def volcanoes_to_points(volcanoes):
coords = num.zeros((len(volcanoes), 3))
for i, v in enumerate(volcanoes):
coords[i, :] = v.lat, v.lon, -v.elevation - 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 volcanoes_to_color(volcanoes):
colors = []
for v in volcanoes:
if v.age == 'holocene':
colors.append(COLOR_HOLOCENE)
else:
colors.append(COLOR_PLEISTOCENE)
return num.array(colors)
[docs]class VolcanoesState(ElementState):
visible = Bool.T(default=True)
size = Float.T(default=3.0)
def create(self):
element = VolcanoesElement()
return element
class VolcanoesElement(Element):
def __init__(self):
Element.__init__(self)
self._pipe = None
self._controls = None
self._volcanoes = None
def bind_state(self, state):
Element.bind_state(self, state)
self.talkie_connect(state, ['visible', 'size'], self.update)
def get_name(self):
return 'Volcanoes'
def set_parent(self, parent):
self._parent = parent
if not self._volcanoes:
self._volcanoes = Volcanoes()
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 not self._parent:
return
if self._pipe:
self._parent.remove_actor(self._pipe.actor)
self._pipe = None
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:
if self._pipe is None:
points = volcanoes_to_points(self._volcanoes.volcanoes)
self._pipe = ScatterPipe(points)
colors = volcanoes_to_color(self._volcanoes.volcanoes)
self._pipe.set_colors(colors)
self._pipe.set_size(state.size)
self._pipe.set_symbol('sphere')
self._parent.add_actor(self._pipe.actor)
else:
if self._pipe is not None:
self._parent.remove_actor(self._pipe.actor)
self._parent.update_view()
def _get_controls(self):
if not self._controls:
from ..state import state_bind_slider
frame = qw.QFrame()
layout = qw.QGridLayout()
frame.setLayout(layout)
layout.addWidget(qw.QLabel('Size'), 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, 'size', slider)
layout.addWidget(qw.QFrame(), 1, 0, 1, 2)
self._controls = frame
return self._controls
__all__ = [
'VolcanoesElement',
'VolcanoesState'
]