Add Scalar Bar Range Dialog with clim preservation across time steps#6
Add Scalar Bar Range Dialog with clim preservation across time steps#6eskandarih merged 2 commits intomainfrom
Conversation
- New ScalarBarRangeDialog with per-scalar-bar manual min/max editors and 'Auto From All Time Steps' button that scans all time points for global range - Auto button shows confirmation warning before potentially long scan - Plotter helpers: compute_scalar_bar_data_range, apply_scalar_bar_range, get_scalar_bar_ranges, _register_scalar_bar_source, and supporting methods - Preserve clim across re-renders (time step changes) in _plot_scalar_field and _plot_vector_field by reading existing scalar bar / actor ranges - Fix vector glyph scalar_bar_args: moved from glyph() to add_mesh() - Register glyph scalar bar source (GlyphScale) for vector plot range dialog - New toolbar action 'Scalar Bar Range' adjacent to 'Scalar Bars' - Remove duplicate _open_scalar_bar_settings_dialog in qt_window.py - New toolbar icons for display toolbar actions - 11 focused tests (6 dialog, 5 clim preservation)
Architecture & Workflow Documentation
|
| Method | Purpose |
|---|---|
_register_scalar_bar_source(bar_name, array_name, assoc) |
Stores the mapping from a rendered scalar bar name to its mesh array source |
_range_from_array(values) |
Computes finite (min, max) from scalar or vector (magnitude) arrays |
_infer_scalar_bar_source(bar_name) |
Fallback inference — searches _scalar_props, _contour_props, _vector_props against visible blocks |
_resolve_scalar_bar_source(bar_name) |
Returns cached source or falls back to inference; raises if neither works |
_current_scalar_range(array_name, assoc) |
Computes visible (min, max) across all visible blocks for the current time step |
get_scalar_bar_ranges() |
Reads live lookup table ranges from all active scalar bars |
compute_scalar_bar_data_range(bar_name) |
Iterates all time steps, calls _current_scalar_range at each, returns global (min, max) |
apply_scalar_bar_range(bar_name, min, max) |
Updates both the plotter scalar bar range and the VTK lookup table |
_iter_visible_blocks(skip_empty) |
Yields blocks that are currently set to visible (used by range computation) |
Summary
Adds a new Scalar Bar Range dialog for customizing scalar bar color ranges, with manual min/max editing and automatic range computation across all time steps. Also fixes a critical issue where changing time steps would reset the scalar bar range, and fixes vector glyph rendering.
New Features
Scalar Bar Range Dialog (
scalar_bar_range_dialog.py)QDoubleSpinBoxeditors for manual range controlclim Preservation Across Time Steps
_plot_scalar_field(): Before re-plotting, reads the existing scalar bar's lookup table range and passes it asclimtoadd_mesh(). On first render (no scalar bar yet),clim=Nonelets PyVista auto-compute._plot_vector_field(): Same pattern — reads existing vector actor'smapper.scalar_rangeand injects asclim.Bug Fixes
Vector glyph
scalar_bar_argserrorscalar_bar_argswas incorrectly passed toblock.glyph(), which doesn't accept it →TypeError: DataSetFilters.glyph() got an unexpected keyword argument 'scalar_bar_args'scalar_bar_argstoplotter.add_mesh()where it belongsVector glyph scalar bar source registration
_plot_vector_field()now registers the glyph's active scalars name (e.g.,"GlyphScale") as a scalar bar source mapped back to the original vector array. This allows the Scalar Bar Range dialog to resolve vector plot scalar bars.Duplicate method removal
_open_scalar_bar_settings_dialog()definition inqt_window.pyPlotter Helpers Added (
plotter.py)_register_scalar_bar_source()_range_from_array()_infer_scalar_bar_source()_scalar_props,_contour_props,_vector_props_resolve_scalar_bar_source()_current_scalar_range()get_scalar_bar_ranges()plotter.scalar_barscompute_scalar_bar_data_range()apply_scalar_bar_range()update_scalar_bar_rangeANDGetLookupTable().SetRange()explicitly_iter_visible_blocks()New Toolbar Icons
Blocks.svg,EditScalarBar.svg,EditScalarRange.svg,ScalarBar.svgTests
test_scalar_bar_range_dialog.py(6 tests)test_clim_preservation.py(5 tests)render()path preserves clim across time step changeAll 11 tests pass.