Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ classifiers = [
[project.optional-dependencies]
viewer = [
"trame>=3.9",
"trame-client>=3.9.1",
"trame-vtk>=2.8.15",
"trame-vtklocal>=0.12.2",
"trame-vuetify>=3.0.1",
Expand All @@ -52,6 +53,7 @@ pangeo = [
all = [
# viewers/explorers
"trame>=3.9",
"trame-client>=3.9.1",
"trame-vtk>=2.8.15",
"trame-vtklocal>=0.12.2",
"trame-vuetify>=3.0.1",
Expand Down
70 changes: 19 additions & 51 deletions src/pan3d/explorers/analytics.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import vtkmodules.vtkRenderingOpenGL2 # noqa: F401
from vtkmodules.vtkCommonCore import vtkLookupTable
from vtkmodules.vtkFiltersGeometry import vtkDataSetSurfaceFilter

# VTK factory initialization
Expand All @@ -16,10 +15,11 @@

from pan3d.ui.analytics import Plotting
from pan3d.ui.preview import RenderingSettings
from pan3d.ui.vtk_view import Pan3DScalarBar, Pan3DView
from pan3d.ui.vtk_view import Pan3DView
from pan3d.utils.common import ControlPanel, Explorer, SummaryToolbar
from pan3d.utils.convert import to_float, to_image
from pan3d.utils.presets import set_preset
from pan3d.utils.convert import to_float
from pan3d.widgets.scalar_bar import ScalarBar
from pan3d.xarray.algorithm import vtkXArrayRectilinearSource
from trame.decorators import change
from trame.ui.vuetify3 import VAppLayout
from trame.widgets import html
Expand Down Expand Up @@ -47,6 +47,11 @@ def __init__(self, xarray=None, source=None, server=None, local_rendering=None):
"""Create an instance of the AnalyticsExplorer class."""
super().__init__(xarray, source, server, local_rendering)

if self.source is None:
self.source = vtkXArrayRectilinearSource(
input=self.xarray
) # To initialize the pipeline

self.ui = None
self._setup_vtk()
self._build_ui()
Expand All @@ -64,16 +69,14 @@ def _setup_vtk(self):
self.interactor.SetRenderWindow(self.render_window)
self.interactor.GetInteractorStyle().SetCurrentStyleToTrackballCamera()

self.lut = vtkLookupTable()

# Need explicit geometry extraction when used with WASM
self.geometry = vtkDataSetSurfaceFilter(
input_connection=self.source.output_port
)
self.mapper = vtkPolyDataMapper(
input_connection=self.geometry.output_port,
lookup_table=self.lut,
)

self.actor = vtkActor(mapper=self.mapper, visibility=0)

self.interactor.Initialize()
Expand Down Expand Up @@ -171,10 +174,10 @@ def _build_ui(self, **kwargs):
)

# Scalar bar
Pan3DScalarBar(
ScalarBar(
ctx_name="scalar_bar",
v_show="!control_expended",
v_if="color_by",
img_src="preset_img",
)

# # Summary toolbar
Expand All @@ -193,10 +196,11 @@ def _build_ui(self, **kwargs):
xr_update_info="xr_update_info",
panel_label="Analytics Explorer",
).ui_content:
self.ctrl.source_update_rendering_panel = RenderingSettings(
self.source,
self.update_rendering,
).update_from_source
RenderingSettings(
ctx_name="rendering",
source=self.source,
update_rendering=self.update_rendering,
)

with v3.VNavigationDrawer(
disable_resize_watcher=True,
Expand All @@ -215,45 +219,10 @@ def _build_ui(self, **kwargs):
# -----------------------------------------------------

@change("color_by")
def _on_color_by(self, color_by, **__):
if self.source.input is None:
return

ds = self.source()
if color_by in ds.point_data.keys(): # vtk is missing in iter
array = ds.point_data[color_by]
min_value, max_value = array.GetRange()

self.state.color_min = min_value
self.state.color_max = max_value

self.mapper.SelectColorArray(color_by)
self.mapper.SetScalarModeToUsePointFieldData()
self.mapper.InterpolateScalarsBeforeMappingOn()
self.mapper.SetScalarVisibility(1)
else:
self.mapper.SetScalarVisibility(0)
self.state.color_min = 0
self.state.color_max = 1

def _on_color_by_change_on(self, **kwargs):
super()._on_color_properties_change(**kwargs)
self.plotting.update_plot()

@change("color_preset", "color_min", "color_max", "nan_color")
def _on_color_preset(
self, nan_color, nan_colors, color_preset, color_min, color_max, **_
):
color_min = float(color_min)
color_max = float(color_max)
self.mapper.SetScalarRange(color_min, color_max)

color = nan_colors[nan_color]
self.lut.SetNanColor(color)

set_preset(self.lut, color_preset)
self.state.preset_img = to_image(self.lut, 255)

self.ctrl.view_update()

@change("scale_x", "scale_y", "scale_z")
def _on_scale_change(self, scale_x, scale_y, scale_z, **_):
self.actor.SetScale(
Expand Down Expand Up @@ -295,7 +264,6 @@ def update_rendering(self, reset_camera=False):


def main():
print("Launching analytics Explorer")
app = AnalyticsExplorer()
app.start()

Expand Down
71 changes: 22 additions & 49 deletions src/pan3d/explorers/contour.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import vtkmodules.vtkRenderingOpenGL2 # noqa: F401
from vtkmodules.vtkCommonCore import vtkLookupTable
from vtkmodules.vtkCommonDataModel import vtkDataObject, vtkDataSetAttributes
from vtkmodules.vtkFiltersCore import (
vtkAssignAttribute,
Expand All @@ -25,10 +24,11 @@
)

from pan3d.ui.contour import ContourRenderingSettings
from pan3d.ui.vtk_view import Pan3DScalarBar, Pan3DView
from pan3d.ui.vtk_view import Pan3DView
from pan3d.utils.common import ControlPanel, Explorer, SummaryToolbar
from pan3d.utils.convert import to_float, to_image
from pan3d.utils.presets import set_preset
from pan3d.utils.convert import to_float
from pan3d.widgets.scalar_bar import ScalarBar
from pan3d.xarray.algorithm import vtkXArrayRectilinearSource
from trame.decorators import change
from trame.ui.vuetify3 import VAppLayout
from trame.widgets import vuetify3 as v3
Expand All @@ -37,6 +37,12 @@
class ContourExplorer(Explorer):
def __init__(self, xarray=None, source=None, server=None, local_rendering=None):
super().__init__(xarray, source, server, local_rendering)

if self.source is None:
self.source = vtkXArrayRectilinearSource(
input=self.xarray
) # To initialize the pipeline

# setup
self.last_field = None
self.last_preset = None
Expand All @@ -51,8 +57,6 @@ def __init__(self, xarray=None, source=None, server=None, local_rendering=None):
def _setup_vtk(self):
ds = self.source()

self.lut = vtkLookupTable()

self.renderer = vtkRenderer(background=(0.8, 0.8, 0.8))
self.interactor = vtkRenderWindowInteractor()
self.render_window = vtkRenderWindow(off_screen_rendering=1)
Expand Down Expand Up @@ -86,7 +90,6 @@ def _setup_vtk(self):
input_connection=self.bands.output_port,
scalar_visibility=1,
interpolate_scalars_before_mapping=1,
lookup_table=self.lut,
)
self.mapper.SetScalarModeToUsePointFieldData()
self.actor = vtkActor(mapper=self.mapper)
Expand Down Expand Up @@ -141,10 +144,10 @@ def _build_ui(self, **_):
)

# Scalar bar
Pan3DScalarBar(
ScalarBar(
ctx_name="scalar_bar",
v_show="!control_expended",
v_if="color_by",
Comment thread
ayenpure marked this conversation as resolved.
img_src="preset_img",
)

# Save dialog
Expand Down Expand Up @@ -204,10 +207,11 @@ def _build_ui(self, **_):
xr_update_info="xr_update_info",
panel_label="Contour Explorer",
).ui_content:
self.ctrl.source_update_rendering_panel = ContourRenderingSettings(
self.source,
self.update_rendering,
).update_from_source
ContourRenderingSettings(
ctx_name="rendering",
source=self.source,
update_rendering=self.update_rendering,
)

def update_rendering(self, reset_camera=False):
self.renderer.ResetCamera()
Expand All @@ -217,15 +221,6 @@ def update_rendering(self, reset_camera=False):

self.ctrl.view_reset_camera()

def reset_color_range(self):
if self.state.color_by is None:
return

field_array = self.source.input[self.state.color_by].values
with self.state:
self.state.color_min = float(field_array.min())
self.state.color_max = float(field_array.max())

# -----------------------------------------------------
# State change callbacks
# -----------------------------------------------------
Expand All @@ -249,39 +244,17 @@ def _on_scale_change(self, scale_x, scale_y, scale_z, **_):

self.ctrl.view_reset_camera()

@change("color_by", "time_idx")
def _on_update_data(self, color_by, time_idx, **_):
if self.source.input is None:
return

self.source.t_index = time_idx
self.source.arrays = [color_by]
@change("color_by", "nb_contours", "color_min", "color_max")
def _on_color_by_change(
self, color_by, nb_contours, color_min, color_max, **kwargs
):
self.assign.Assign(
color_by,
vtkDataSetAttributes.SCALARS,
vtkDataObject.FIELD_ASSOCIATION_POINTS,
)
self.mapper.SelectColorArray(color_by)
self.mapper.Update()
# update range
if self.last_field != color_by:
self.last_field = color_by
self.reset_color_range()

self.ctrl.view_update()

@change("color_min", "color_max", "color_preset", "nan_color", "nb_contours")
def _on_update_color_range(
self, nb_contours, color_min, color_max, color_preset, **_
):
if self.last_preset != color_preset:
self.last_preset = color_preset
set_preset(self.lut, color_preset)
self.state.preset_img = to_image(self.lut, 255)

self.mapper.SetScalarRange(color_min, color_max)
self.bands.GenerateValues(nb_contours, [color_min, color_max])
Comment thread
ayenpure marked this conversation as resolved.
Comment thread
ayenpure marked this conversation as resolved.
self.ctrl.view_update()
super()._on_color_properties_change(**kwargs)


def main():
Expand Down
Loading