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: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.1.11
current_version = 0.1.12
commit = True
tag = True

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "quickview"
version = "0.1.11"
version = "0.1.12"
description = "An application to explore/analyze data for atmosphere component for E3SM"
authors = [
{name = "Kitware Inc."},
Expand Down
2 changes: 1 addition & 1 deletion quickview/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""QuickView: Visual Analysis for E3SM Atmosphere Data."""

__version__ = "0.1.11"
__version__ = "0.1.12"
__author__ = "Kitware Inc."
__license__ = "Apache-2.0"
99 changes: 78 additions & 21 deletions quickview/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

# Build color cache here
from quickview.view_manager import build_color_information
from quickview.view_manager import ViewManager
from quickview.view_manager import ViewManager, ViewContext

from paraview.simple import ImportPresets, GetLookupTableNames

Expand Down Expand Up @@ -295,7 +295,52 @@ def update_state_from_config(self, initstate):
self.midpoint_vars_state = np.array(selection_midpoint)
self.interface_vars_state = np.array(selection_interface)

# Build registry and populate with saved configuration
self.viewmanager.registry = build_color_information(initstate)

# Sync loaded configuration to contexts
if "variables" in initstate:
for i, var in enumerate(initstate["variables"]):
context = self.viewmanager.registry.get_view(var)
if not context:
context = ViewContext(var, i)
self.viewmanager.registry.register_view(var, context)

# Populate context from loaded state
context.colormap = (
initstate.get("varcolor", [])[i]
if i < len(initstate.get("varcolor", []))
else None
)
context.use_log_scale = (
initstate.get("uselogscale", [])[i]
if i < len(initstate.get("uselogscale", []))
else False
)
context.invert_colors = (
initstate.get("invert", [])[i]
if i < len(initstate.get("invert", []))
else False
)
context.min_value = (
initstate.get("varmin", [])[i]
if i < len(initstate.get("varmin", []))
else None
)
context.max_value = (
initstate.get("varmax", [])[i]
if i < len(initstate.get("varmax", []))
else None
)
context.override_range = (
initstate.get("override_range", [])[i]
if i < len(initstate.get("override_range", []))
else False
)
context.has_been_configured = (
True # Mark as configured since we're loading saved state
)

self.load_variables(use_cached_layout=True)

@trigger("layout_changed")
Expand Down Expand Up @@ -445,14 +490,37 @@ def load_variables(self, use_cached_layout=False):
# Tracking variables to control camera and color properties
with self.state as state:
state.variables = vars
state.varcolor = [self.get_default_colormap()] * len(vars)

# Initialize arrays with proper size
state.varcolor = [""] * len(vars)
state.uselogscale = [False] * len(vars)
state.invert = [False] * len(vars)
state.varmin = [np.nan] * len(vars)
state.varmax = [np.nan] * len(vars)
state.varmin = [0] * len(vars)
state.varmax = [1] * len(vars)
state.override_range = [False] * len(vars)
state.colorbar_images = [""] * len(vars) # Initialize empty images
state.varaverage = [np.nan] * len(vars)
state.varaverage = [0] * len(vars)

# Check if variables already have contexts (still selected, just updating)
# Preserve configuration for variables that remain selected
for i, var in enumerate(vars):
context = self.viewmanager.registry.get_view(var)
if context and context.has_been_configured:
# Variable is still selected, preserve its configuration
state.varcolor[i] = context.colormap or self.get_default_colormap()
state.uselogscale[i] = context.use_log_scale
state.invert[i] = context.invert_colors
state.varmin[i] = (
context.min_value if context.min_value is not None else 0
)
state.varmax[i] = (
context.max_value if context.max_value is not None else 1
)
state.override_range[i] = context.override_range
else:
# New variable or was deselected, use defaults
state.varcolor[i] = self.get_default_colormap()
# Other values remain as initialized defaults

# Only use cached layout when explicitly requested (i.e., when loading state)
layout_to_use = self._cached_layout if use_cached_layout else None
Expand Down Expand Up @@ -644,7 +712,7 @@ def ui(self) -> SinglePageWithDrawerLayout:
self._ui = SinglePageWithDrawerLayout(self.server)
with self._ui as layout:
# layout.footer.clear()
layout.title.set_text(f"QuickView {version}")
layout.title.set_text(f"v{version}")

with layout.toolbar as toolbar:
Toolbar(
Expand Down Expand Up @@ -751,17 +819,6 @@ def ui(self) -> SinglePageWithDrawerLayout:
)
client.ClientTriggers(
beforeDestroy="trigger('view_gc', [vref])",
# mounted="""
# $nextTick(() => setTimeout(() => trigger('resetview', [
# idx,
# {
# width: Math.floor($refs[vref].vtkContainer.getBoundingClientRect().width),
# height: Math.floor($refs[vref].vtkContainer.getBoundingClientRect().height)
# }
# ]), 500))
# """,
# mounted="$nextTick(() => setTimeout(() => console.log($refs[vref].vtkContainer.getBoundingClientRect()), 500))",
# mounted="$nextTick(() => setTimeout(() => $refs[vref].render(), 500))",
# mounted=(self.viewmanager.reset_specific_view, '''[idx,
# {width: $refs[vref].vtkContainer.getBoundingClientRect().width,
# height: $refs[vref].vtkContainer.getBoundingClientRect().height}]
Expand Down Expand Up @@ -811,7 +868,7 @@ def ui(self) -> SinglePageWithDrawerLayout:
html.Div(
(
"(avg: {{ "
"varaverage[idx] !== null && !isNaN(varaverage[idx]) ? "
"varaverage[idx] !== null && varaverage[idx] !== undefined && !isNaN(varaverage[idx]) && typeof varaverage[idx] === 'number' ? "
"varaverage[idx].toExponential(2) : "
"'N/A' "
"}})"
Expand All @@ -837,7 +894,7 @@ def ui(self) -> SinglePageWithDrawerLayout:
html.Span(
(
"{{ "
"varmin[idx] !== null && !isNaN(varmin[idx]) ? ("
"varmin[idx] !== null && varmin[idx] !== undefined && !isNaN(varmin[idx]) && typeof varmin[idx] === 'number' ? ("
"uselogscale[idx] && varmin[idx] > 0 ? "
"'10^(' + Math.log10(varmin[idx]).toFixed(1) + ')' : "
"varmin[idx].toExponential(1)"
Expand Down Expand Up @@ -886,7 +943,7 @@ def ui(self) -> SinglePageWithDrawerLayout:
"Math.log10(varmin[idx]) + "
"(Math.log10(varmax[idx]) - Math.log10(varmin[idx])) * probe_location[2]"
").toFixed(2) + ')' : "
"(varmin[idx] + (varmax[idx] - varmin[idx]) * probe_location[2]).toExponential(3)"
"((varmin[idx] || 0) + ((varmax[idx] || 1) - (varmin[idx] || 0)) * probe_location[2]).toExponential(3)"
") : '' "
"}}"
),
Expand All @@ -895,7 +952,7 @@ def ui(self) -> SinglePageWithDrawerLayout:
html.Span(
(
"{{ "
"varmax[idx] !== null && !isNaN(varmax[idx]) ? ("
"varmax[idx] !== null && varmax[idx] !== undefined && !isNaN(varmax[idx]) && typeof varmax[idx] === 'number' ? ("
"uselogscale[idx] && varmax[idx] > 0 ? "
"'10^(' + Math.log10(varmax[idx]).toFixed(1) + ')' : "
"varmax[idx].toExponential(1)"
Expand Down
Loading
Loading