Add `Viz.bars_range()` (moved from chart API)
Call it from view kb loop.epoch_indexing_and_dataviz_layer
parent
6cacd7d18b
commit
5a0673d66f
|
@ -76,7 +76,6 @@ async def handle_viewmode_kb_inputs(
|
|||
pressed: set[str] = set()
|
||||
|
||||
last = time.time()
|
||||
trigger_mode: str
|
||||
action: str
|
||||
|
||||
on_next_release: Optional[Callable] = None
|
||||
|
@ -495,7 +494,7 @@ class ChartView(ViewBox):
|
|||
chart = self.linked.chart
|
||||
|
||||
# don't zoom more then the min points setting
|
||||
l, lbar, rbar, r = chart.bars_range()
|
||||
l, lbar, rbar, r = chart.get_viz(chart.name).bars_range()
|
||||
# vl = r - l
|
||||
|
||||
# if ev.delta() > 0 and vl <= _min_points_to_show:
|
||||
|
|
|
@ -129,12 +129,18 @@ def render_baritems(
|
|||
|
||||
ds_r, curve = self._render_table
|
||||
|
||||
# print(
|
||||
# f'r: {r.fmtr.xy_slice}\n'
|
||||
# f'ds_r: {ds_r.fmtr.xy_slice}\n'
|
||||
# )
|
||||
|
||||
# do checks for whether or not we require downsampling:
|
||||
# - if we're **not** downsampling then we simply want to
|
||||
# render the bars graphics curve and update..
|
||||
# - if instead we are in a downsamplig state then we to
|
||||
x_gt = 6
|
||||
uppx = curve.x_uppx()
|
||||
print(f'BARS UPPX: {uppx}')
|
||||
in_line = should_line = curve.isVisible()
|
||||
if (
|
||||
in_line
|
||||
|
@ -241,9 +247,6 @@ class Viz(msgspec.Struct): # , frozen=True):
|
|||
# to the underlying shm ref after startup?
|
||||
# _shm: Optional[ShmArray] = None # currently, may be filled in "later"
|
||||
|
||||
# last read from shm (usually due to an update call)
|
||||
_last_read: Optional[np.ndarray] = None
|
||||
|
||||
# cache of y-range values per x-range input.
|
||||
_mxmns: dict[tuple[int, int], tuple[float, float]] = {}
|
||||
|
||||
|
@ -263,6 +266,8 @@ class Viz(msgspec.Struct): # , frozen=True):
|
|||
if no range can be determined (yet).
|
||||
|
||||
'''
|
||||
# TODO: hash the slice instead maybe?
|
||||
# https://stackoverflow.com/a/29980872
|
||||
rkey = (lbar, rbar)
|
||||
cached_result = self._mxmns.get(rkey)
|
||||
if cached_result:
|
||||
|
@ -274,14 +279,27 @@ class Viz(msgspec.Struct): # , frozen=True):
|
|||
|
||||
arr = shm.array
|
||||
|
||||
# build relative indexes into shm array
|
||||
# get relative slice indexes into array
|
||||
(
|
||||
abs_slc,
|
||||
read_slc,
|
||||
mask,
|
||||
) = self.flume.slice_from_time(
|
||||
arr,
|
||||
start_t=lbar,
|
||||
stop_t=rbar,
|
||||
)
|
||||
|
||||
# TODO: should we just add/use a method
|
||||
# on the shm to do this?
|
||||
ifirst = arr[0]['index']
|
||||
slice_view = arr[
|
||||
lbar - ifirst:
|
||||
(rbar - ifirst) + 1
|
||||
]
|
||||
|
||||
# ifirst = arr[0]['index']
|
||||
# slice_view = arr[
|
||||
# lbar - ifirst:
|
||||
# (rbar - ifirst) + 1
|
||||
# ]
|
||||
|
||||
slice_view = arr[mask]
|
||||
|
||||
if not slice_view.size:
|
||||
return None
|
||||
|
@ -321,9 +339,18 @@ class Viz(msgspec.Struct): # , frozen=True):
|
|||
vr.right(),
|
||||
)
|
||||
|
||||
def bars_range(self) -> tuple[int, int, int, int]:
|
||||
'''
|
||||
Return a range tuple for the bars present in view.
|
||||
|
||||
'''
|
||||
start, l, datum_start, datum_stop, r, stop = self.datums_range()
|
||||
return l, datum_start, datum_stop, r
|
||||
|
||||
def datums_range(
|
||||
self,
|
||||
index_field: str = 'index',
|
||||
index_field: str = 'time',
|
||||
|
||||
) -> tuple[
|
||||
int, int, int, int, int, int
|
||||
]:
|
||||
|
@ -335,26 +362,39 @@ class Viz(msgspec.Struct): # , frozen=True):
|
|||
l = round(l)
|
||||
r = round(r)
|
||||
|
||||
# TODO: avoid this and have shm passed
|
||||
# in earlier.
|
||||
if self.shm is None:
|
||||
# haven't initialized the viz yet
|
||||
return (0, l, 0, 0, r, 0)
|
||||
# # TODO: avoid this and have shm passed
|
||||
# # in earlier.
|
||||
# if self.shm is None:
|
||||
# # haven't initialized the viz yet
|
||||
# return (0, l, 0, 0, r, 0)
|
||||
|
||||
array = self.shm.array
|
||||
index = array['index']
|
||||
index = array[index_field]
|
||||
start = index[0]
|
||||
end = index[-1]
|
||||
lbar = max(l, start)
|
||||
rbar = min(r, end)
|
||||
stop = index[-1]
|
||||
datum_start = max(l, start)
|
||||
datum_stop = min(r, stop)
|
||||
return (
|
||||
start, l, lbar, rbar, r, end,
|
||||
start,
|
||||
l, # left x-in-view
|
||||
datum_start,
|
||||
datum_stop,
|
||||
r, # right-x-in-view
|
||||
stop,
|
||||
)
|
||||
|
||||
def bars_range(self) -> tuple[int, int, int, int]:
|
||||
'''
|
||||
Return a range tuple for the bars present in view.
|
||||
|
||||
'''
|
||||
start, l, datum_start, datum_stop, r, stop = self.datums_range()
|
||||
return l, datum_start, datum_stop, r
|
||||
|
||||
def read(
|
||||
self,
|
||||
array_field: Optional[str] = None,
|
||||
index_field: str = 'index',
|
||||
index_field: str = 'time',
|
||||
|
||||
) -> tuple[
|
||||
int, int, np.ndarray,
|
||||
|
@ -370,30 +410,59 @@ class Viz(msgspec.Struct): # , frozen=True):
|
|||
# readable data
|
||||
array = self.shm.array
|
||||
|
||||
indexes = array[index_field]
|
||||
ifirst = indexes[0]
|
||||
ilast = indexes[-1]
|
||||
# indexes = array[index_field]
|
||||
# ifirst = indexes[0]
|
||||
# ilast = indexes[-1]
|
||||
|
||||
ifirst, l, lbar, rbar, r, ilast = self.datums_range()
|
||||
(
|
||||
ifirst,
|
||||
l,
|
||||
lbar,
|
||||
rbar,
|
||||
r,
|
||||
ilast,
|
||||
) = self.datums_range(index_field=index_field)
|
||||
|
||||
(
|
||||
abs_slc,
|
||||
read_slc,
|
||||
mask,
|
||||
) = self.flume.slice_from_time(
|
||||
array,
|
||||
start_t=lbar,
|
||||
stop_t=rbar,
|
||||
)
|
||||
|
||||
# (
|
||||
# abs_slc,
|
||||
# read_slc,
|
||||
# in_view,
|
||||
# ) = self.flume.view_data(
|
||||
# self.plot,
|
||||
# )
|
||||
# get read-relative indices adjusting
|
||||
# for master shm index.
|
||||
lbar_i = max(l, ifirst) - ifirst
|
||||
rbar_i = min(r, ilast) - ifirst
|
||||
# lbar_i = max(l, ifirst) - ifirst
|
||||
# rbar_i = min(r, ilast) - ifirst
|
||||
in_view = array[read_slc]
|
||||
|
||||
if array_field:
|
||||
array = array[array_field]
|
||||
|
||||
# TODO: we could do it this way as well no?
|
||||
# to_draw = array[lbar - ifirst:(rbar - ifirst) + 1]
|
||||
in_view = array[lbar_i: rbar_i + 1]
|
||||
# in_view = array[lbar_i: rbar_i + 1]
|
||||
|
||||
return (
|
||||
# abs indices + full data set
|
||||
ifirst, ilast, array,
|
||||
abs_slc.start,
|
||||
abs_slc.stop,
|
||||
array,
|
||||
|
||||
# relative indices + in view datums
|
||||
lbar_i, rbar_i, in_view,
|
||||
# relative (read) indices + in view data
|
||||
read_slc.start,
|
||||
read_slc.stop,
|
||||
in_view,
|
||||
)
|
||||
|
||||
def update_graphics(
|
||||
|
@ -495,6 +564,9 @@ class Viz(msgspec.Struct): # , frozen=True):
|
|||
),
|
||||
)
|
||||
|
||||
if isinstance(graphics, StepCurve):
|
||||
slice_to_head = -2
|
||||
|
||||
# ``Curve`` derivative case(s):
|
||||
array_key = array_key or self.name
|
||||
# print(array_key)
|
||||
|
@ -682,6 +754,21 @@ class Viz(msgspec.Struct): # , frozen=True):
|
|||
# print(f'updating NOT DS curve {self.name}')
|
||||
g.update()
|
||||
|
||||
def curve_width_pxs(
|
||||
self,
|
||||
) -> float:
|
||||
'''
|
||||
|
||||
Return the width of the current datums in view in pixel units.
|
||||
'''
|
||||
_, lbar, rbar, _ = self.bars_range()
|
||||
return self.view.mapViewToDevice(
|
||||
QLineF(
|
||||
lbar, 0,
|
||||
rbar, 0
|
||||
)
|
||||
).length()
|
||||
|
||||
|
||||
class Renderer(msgspec.Struct):
|
||||
|
||||
|
|
Loading…
Reference in New Issue