7 Commits

Author SHA1 Message Date
李启源
dcc27a88be perf(chart): isolate hover rendering
All checks were successful
Package component / package (push) Successful in 3m59s
2026-07-24 16:10:02 +08:00
李启源
faa9695bc0 chore(deps): 调整组件运行时依赖
All checks were successful
Package component / package (push) Successful in 4m15s
2026-07-23 13:21:04 +08:00
李启源
f102e9c661 fix(tooltip): 保持数值与单位单行显示
All checks were successful
Package component / package (push) Successful in 2m52s
2026-07-23 11:59:27 +08:00
liqiyuan
dc3ce66308 feat(demo): replace source waveforms with simulated data
All checks were successful
Package component / package (push) Successful in 6m25s
2026-07-22 22:37:45 +08:00
liqiyuan
dc0cc2e0d7 fix(demo): hide axis lines by default
All checks were successful
Package component / package (push) Successful in 4m12s
2026-07-22 21:56:11 +08:00
liqiyuan
3ed17eb061 feat(chart): add axis and dotted frame controls
All checks were successful
Package component / package (push) Successful in 5m34s
2026-07-22 21:22:26 +08:00
李启源
c258c11795 feat(chart): support per-track legend positions 2026-07-22 19:53:00 +08:00
28 changed files with 750 additions and 53242 deletions

106
README.md
View File

@@ -3,6 +3,8 @@
基于 Vue 3、TypeScript 和 D3 的响应式 SVG 波形图组件。适合展示单通道、多通道和大规模采样
数据内置缩放、tooltip、图例、误差棒、标注、分页和多 Y 轴叠加。
当前稳定版本:`v0.1.15`
组件使用不可变数据模型:替换 `data` 引用后会重新计算数据域和视口;大数据会按当前可见范围
和屏幕像素自动保峰降采样,而 tooltip、最近点查询和标注仍使用完整原始数据。
@@ -16,18 +18,16 @@
- 采样值、显式坐标点和多系列数据模型
- `independent``separated``compact` 三种布局模式
- 曲线、阶梯线、点符号和对称/非对称误差棒
- 实线、虚线和点划线,可按系列独立配置
- 缩放过程事件、缩放结束按可视区间加载和视口重置
- 可选的空格拖拽平移,默认关闭并隔离多图表实例
- 多系列图例、受控显隐、网格分页和最多四根 Y 轴
- 按轨道控制水平/垂直网格线的显隐与颜色
- 受控标注、右键编辑、拖拽避让和自定义颜色
- 标题、图框、坐标轴、时间单位和降采样参数可配置
- 标题、图框、坐标轴、零值参考线、净图和渲染参数可配置
## 安装
```bash
pnpm install
pnpm dev
```
组件库将 Vue、D3、Ant Design Vue 和 vue3-colorpicker 作为 peer dependency直接安装到业务项目时请一并
安装这些依赖:
@@ -39,12 +39,14 @@ pnpm add waveform-analysis vue d3 ant-design-vue vue3-colorpicker
组件库支持以下运行时版本:
| 依赖 | 支持版本 |
| -------------- | ------------- |
| Vue | `>=3.2.33 <4` |
| Ant Design Vue | `>=3.2.20 <4` |
| 依赖 | 支持版本 |
| ---------------- | ------------- |
| Vue | `>=3.2.33 <4` |
| Ant Design Vue | `>=3.2.20 <4` |
| D3 | `>=7.9.0 <8` |
| vue3-colorpicker | `>=2.3.0 <3` |
安装时请确保业务项目中的 Vue 与 Ant Design Vue 版本满足上述范围。
安装时请确保业务项目中的 peer dependency 版本满足上述范围。
## 发布
@@ -96,24 +98,32 @@ const data = ref<WaveformData>({
| `displayMode` | `'independent' \| 'separated' \| 'compact'` | `'independent'` | 图框布局 |
| `overlayMode` | `'single-axis' \| 'multi-axis'` | `'single-axis'` | 叠加曲线的 Y 轴模式 |
| `timeUnit` | `'s' \| 'ms'` | `'ms'` | 坐标轴和 tooltip 展示单位 |
| `xLabel` / `yLabel` | `string` | `时间timeUnit` / `'幅值'` | 坐标轴名称 |
| `lineColor` | `string` | `'#0960bd'` | 单波形默认颜色 |
| `width` / `height` | `number` | 自适应 | 组件总尺寸,单位为 CSS 像素 |
| `zoomable` / `showTooltip` | `boolean` | `true` / `true` | 缩放和数值 tooltip 开关 |
| `pannable` | `boolean` | `false` | 空格拖拽平移开关 |
| `minZoomSpan` | `number` | 未设置 | 最小缩放跨度,使用原始 X 数据单位 |
| `minVisiblePoints` | `number` | `0` | 缩放后至少保留的不同 X 坐标数 |
| `initialXDomain` | `[number, number]` | 未设置 | 所有图框的初始 X 范围 |
| `initialXDomains` | `Record<string, [number, number]>` | 未设置 | 按 track/series ID 配置初始范围 |
| `grid` | `WaveformGridOptions` | `{ rowCount: 2, columnCount: 1, showPagination: true }` | 网格和分页 |
| `axes` | `WaveformAxesOptions` | 轴线均显示 | X/Y 轴基线显隐 |
| `rendering` | `WaveformRenderingOptions` | `{}` | 降采样与点/误差棒间距 |
| `title` / `legend` / `frameStyle` | 对应公开类型 | 未设置 | 标题、图例和图框样式 |
| `frameNumber` | `string \| number` | 未设置 | 图框水印内容 |
| `zeroLine` | `WaveformZeroLineOptions` | `{ visible: false }` | 零值参考线显隐与样式 |
| `cleanView` | `boolean` | `false` | 仅保留波形的净图模式 |
| `annotations` | `WaveformAnnotation[]` | `[]` | 受控标注数据 |
| `annotationsVisible` | `boolean` | `true` | 标注图层显隐 |
| `interactionMode` | `'zoom' \| 'annotation'` | `'zoom'` | 左键交互模式 |
| `hiddenSeriesIds` | `string[]` | 未设置 | 受控隐藏系列 ID |
| `defaultHiddenSeriesIds` | `string[]` | `[]` | 非受控模式的初始隐藏系列 |
所有公开类型均可从包入口导入,例如 `WaveformData``WaveformSeries`
`WaveformAnnotation``WaveformRenderingOptions``WaveformZeroLineOptions`
`WaveformGridOptions`
`WaveformAnnotation``WaveformLineStyle``WaveformRenderingOptions`
`WaveformAxesOptions``WaveformZeroLineOptions``WaveformGridOptions`
`WaveformGridTrackLines`
### 数据结构
@@ -157,7 +167,8 @@ const chartData: WaveformData = {
```vue
<script setup lang="ts">
import { WaveformChart } from './index'
import { WaveformChart } from 'waveform-analysis'
import 'waveform-analysis/style.css'
</script>
<template>
@@ -311,28 +322,6 @@ const series = {
`width``height` 始终表示组件总尺寸。标题显示后会从总高度中扣除标题区域,剩余高度
用于 SVG 绘图区,因此启用标题不会扩大组件或破坏父容器布局。
宿主已有全局标题配置时,可以在未来接入组件库绘图链路时按以下方式映射:
```ts
const waveformTitle = {
visible: hasQueried && !cleanViewEnabled && titleStyle.enabled,
text: titleStyle.titleName.trim() || defaultTitleText,
align: titleStyle.align,
textStyle: {
color: titleStyle.color,
fontSize: titleStyle.fontSize,
fontFamily: titleStyle.fontFamily,
rotation: titleStyle.rotation,
fontWeight: titleStyle.bold ? 700 : 400,
fontStyle: titleStyle.italic ? 'italic' : 'normal',
textDecoration: titleStyle.underline ? 'underline' : 'none',
},
} satisfies WaveformTitleOptions
```
宿主的抽屉折叠状态不需要传给组件。替换绘图链路时应同步移除宿主外层标题,避免重复
渲染;当前宿主实现无需修改。
Demo 左侧控制面板提供标题实时预览,可配置标题名称、显隐、对齐、字体、字号、粗体、
斜体、下划线、旋转和颜色。字号范围为 `872px`,旋转范围为 `-180180°`;样式栏中的
`A` 用于恢复常规字重、非斜体和无下划线,关闭标题不会清除已经填写的配置。
@@ -353,6 +342,8 @@ Demo 左侧控制面板提供标题实时预览,可配置标题名称、显隐
/>
```
`frameStyle.borderStyle` 支持 `solid`(实线)、`dashed`(虚线)和 `dotted`(点虚线)。
对应的公开类型为 `WaveformFrameStyle`。默认边框颜色为 `#1f2937`、线宽为 `1`、线型为
`solid`,背景透明。`borderWidth``0` 时隐藏边框;非有限值或负数会回退到默认线宽。
@@ -373,6 +364,10 @@ const hiddenSeriesIds = ref<string[]>([])
v-model:hidden-series-ids="hiddenSeriesIds"
:legend="{
position: 'top-right',
trackPositions: {
'group-1': 'top-left',
'group-2': 'bottom',
},
orientation: 'auto',
backgroundColor: 'rgba(255, 255, 255, 0.45)',
interactive: true,
@@ -380,6 +375,11 @@ const hiddenSeriesIds = ref<string[]>([])
/>
```
`legend.trackPositions` 按图框 ID 单独覆盖图例位置;同一个 `trackId` 组成的图框以该
`trackId` 为键,未设置 `trackId` 时以规范化后的 `series.id` 为键。未命中的图框继续使用
`legend.position`,两者都未配置时使用 `top-right`。当 `orientation``auto` 时,每个图框
会根据最终位置独立选择排列方向:`top``bottom` 为水平排列,其余位置为垂直排列。
未配置或传入空字符串时,图例背景默认使用 `rgba(255, 255, 255, 0.7)`
`legend.interactive` 默认为 `false`;开启后可以单击或使用键盘操作图例项切换曲线显隐。
调用方可通过 `hiddenSeriesIds``update:hidden-series-ids` 控制状态,也可使用
@@ -445,6 +445,29 @@ tooltip 仍然可用,切换回普通模式后原有配置和标注不会丢失
/>
```
`axes` 可以分别隐藏 X/Y 轴的基线,同时保留刻度短线、刻度数字、科学计数倍率、单位和轴标题。
与关闭网格线、设置 `frameStyle` 组合后,可以只使用图框边框围住绘图区:
```vue
<WaveformChart
:data="chartData"
:axes="{
x: { lineVisible: false },
y: { lineVisible: false },
}"
:grid="{
trackLines: {
voltage: { horizontal: false, vertical: false },
},
}"
:frame-style="{
borderColor: '#1f2937',
borderWidth: 1,
borderStyle: 'solid',
}"
/>
```
`interactionMode` 可选 `zoom``annotation`,默认使用缩放模式。右键绘图区可直接打开
标注编辑器,无需切换交互模式。`zoomable``pannable``showTooltip` 可分别控制缩放、
空格拖拽平移和 tooltip平移默认关闭。
@@ -455,8 +478,8 @@ tooltip 仍然可用,切换回普通模式后原有配置和标注不会丢失
组件按不可变数据处理:替换 `data` 引用会重新过滤、排序和缓存坐标域,并重置视口;
原地修改已有数组不会触发缓存刷新。建议通过 `shallowRef` 保存大数据并整体替换引用。
规范化始终保留所有有效点坐标域、误差棒、tooltip 和标注均使用完整数据;绘制路径会根据
当前视口和 `rendering` 配置自动降采样。如需在传入组件前主动压缩数据,可使用公开的
`downsampleLTTB``downsampleMinMax``adaptiveSampling` 工具
当前视口和 `rendering` 配置自动降采样。调用方如需在传入组件前主动压缩数据,应自行保留
原始数据,以免影响 tooltip、标注和误差范围的精度
默认在可见点超过 2,000 时进行降采样,每个像素最多渲染 4 个保峰点。可按业务调整:
@@ -496,7 +519,8 @@ import {
WaveformChart,
type WaveformAnnotation,
type WaveformInteractionMode,
} from './index'
} from 'waveform-analysis'
import 'waveform-analysis/style.css'
const annotations = ref<WaveformAnnotation[]>([])
const annotationsVisible = ref(true)
@@ -542,7 +566,7 @@ X、Y 轴会根据各自完整显示域选择格式:最大绝对值在 `[0.01,
| --------------------------------------------------------------- | -------------------------------------------------------------- |
| `point-hover` | 当前最近点变化时触发,离开图表时传入 `null` |
| `zoom-change` | 缩放过程中触发,参数为 `[start, end]` |
| `zoom-end` | 滚轮放大结束后触发;独立分图模式附带 `trackIndex``seriesIds` |
| `zoom-end` | 滚轮或框选结束后触发;`gesture` 区分二者,独立模式附带轨道信息 |
| `zoom-reset` | 双击重置视口时触发,调用方应恢复首次完整数据 |
| `page-change` | 分页变化,参数为当前页和总页数 |
| `series-visibility-change` | 图例切换曲线显隐时触发 |
@@ -585,7 +609,7 @@ pnpm build
发布由推送版本 tag 触发。先将 `package.json``version` 更新为目标版本并提交,再创建同版本 tag
```bash
git tag -a v0.1.7 -m "Release v0.1.7"
git tag -a v0.1.15 -m "Release v0.1.15"
git push origin main --follow-tags
```

View File

@@ -1,6 +1,6 @@
{
"name": "waveform-analysis",
"version": "0.1.15",
"version": "0.1.21",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/types/index.d.ts",
@@ -34,11 +34,14 @@
"test": "vitest run",
"test:coverage": "vitest run --coverage"
},
"dependencies": {
"d3": "^7.9.0",
"vue3-colorpicker": "^2.3.0",
"ant-design-vue": "4.2.6"
},
"peerDependencies": {
"ant-design-vue": ">=3.2.20 <4",
"d3": ">=7.9.0 <8",
"vue": ">=3.2.33 <4",
"vue3-colorpicker": ">=2.3.0 <3"
"vue": ">=3.2.33 <4"
},
"devDependencies": {
"@eslint/js": "10.0.1",
@@ -47,8 +50,6 @@
"@vitejs/plugin-vue": "6.0.8",
"@vitest/coverage-v8": "4.1.10",
"@vue/test-utils": "2.4.11",
"ant-design-vue": "4.2.6",
"d3": "7.9.0",
"eslint": "10.7.0",
"eslint-config-prettier": "10.1.8",
"eslint-plugin-vue": "10.9.2",
@@ -60,7 +61,6 @@
"vite": "8.1.5",
"vitest": "4.1.10",
"vue": "3.5.40",
"vue-tsc": "3.3.7",
"vue3-colorpicker": "2.3.0"
"vue-tsc": "3.3.7"
}
}

19
pnpm-lock.yaml generated
View File

@@ -7,6 +7,16 @@ settings:
importers:
.:
dependencies:
ant-design-vue:
specifier: 4.2.6
version: 4.2.6(vue@3.5.40(typescript@6.0.3))
d3:
specifier: ^7.9.0
version: 7.9.0
vue3-colorpicker:
specifier: ^2.3.0
version: 2.3.0(@aesoper/normal-utils@0.1.5)(@popperjs/core@2.11.8)(@vueuse/core@10.11.1(vue@3.5.40(typescript@6.0.3)))(gradient-parser@1.2.0)(lodash-es@4.18.1)(tinycolor2@1.6.0)(vue-types@4.2.1(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3))
devDependencies:
'@eslint/js':
specifier: 10.0.1
@@ -26,12 +36,6 @@ importers:
'@vue/test-utils':
specifier: 2.4.11
version: 2.4.11(@vue/compiler-dom@3.5.40)(@vue/server-renderer@3.5.40)(vue@3.5.40(typescript@6.0.3))
ant-design-vue:
specifier: 4.2.6
version: 4.2.6(vue@3.5.40(typescript@6.0.3))
d3:
specifier: 7.9.0
version: 7.9.0
eslint:
specifier: 10.7.0
version: 10.7.0
@@ -68,9 +72,6 @@ importers:
vue-tsc:
specifier: 3.3.7
version: 3.3.7(typescript@6.0.3)
vue3-colorpicker:
specifier: 2.3.0
version: 2.3.0(@aesoper/normal-utils@0.1.5)(@popperjs/core@2.11.8)(@vueuse/core@10.11.1(vue@3.5.40(typescript@6.0.3)))(gradient-parser@1.2.0)(lodash-es@4.18.1)(tinycolor2@1.6.0)(vue-types@4.2.1(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3))
packages:

View File

@@ -46,6 +46,8 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
expect(gridSizeInputs[1]?.props('value')).toBe(1)
expect(panel.find('[aria-label="显示水平网格线"]').exists()).toBe(true)
expect(panel.find('[aria-label="显示垂直网格线"]').exists()).toBe(true)
expect(panel.find('[aria-label="显示横轴线"]').exists()).toBe(true)
expect(panel.find('[aria-label="显示纵轴线"]').exists()).toBe(true)
expect(panel.find('[aria-label="水平网格线颜色"]').exists()).toBe(true)
expect(panel.find('[aria-label="垂直网格线颜色"]').exists()).toBe(true)
expect(panel.find('[aria-label="净图模式"]').exists()).toBe(true)
@@ -62,6 +64,9 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
expect(frameControls.text()).toContain('背景颜色')
expect(frameControls.find('[aria-label="图框线宽"]').exists()).toBe(true)
expect(frameControls.find('[aria-label="图框线型"]').exists()).toBe(true)
expect(
frameControls.get('[aria-label="图框线型"]').getComponent(Select).props('options'),
).toContainEqual({ label: '点虚线', value: 'dotted' })
expect(frameControls.find('[aria-label="显示图框水印"]').exists()).toBe(true)
expect(frameControls.get('.frame-style-control--switch .ant-switch').classes()).toContain(
'ant-switch-small',
@@ -129,6 +134,27 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
wrapper.unmount()
})
it('passes independent X and Y axis-line controls to the chart', async () => {
const wrapper = mount(App)
await flushPromises()
const chart = wrapper.getComponent(WaveformChart)
expect(chart.props('axes')).toEqual({
x: { lineVisible: false },
y: { lineVisible: false },
})
await wrapper.get('[aria-label="显示横轴线"]').trigger('click')
await wrapper.get('[aria-label="显示纵轴线"]').trigger('click')
await flushPromises()
expect(chart.props('axes')).toEqual({
x: { lineVisible: true },
y: { lineVisible: true },
})
wrapper.unmount()
})
it('passes tooltip and per-series line-style controls to the chart', async () => {
const wrapper = mount(App)
await flushPromises()
@@ -175,7 +201,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
wrapper.unmount()
})
it('keeps only one error-bar series in the first frame', async () => {
it('keeps the primary simulated signal in the first frame', async () => {
const wrapper = mount(App)
await flushPromises()
@@ -183,10 +209,10 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
const firstFrameSeries = firstFrame.findAll('.waveform-chart__series')
expect(firstFrameSeries.map((series) => series.attributes('data-series-name'))).toEqual([
'BT2_2M',
'正弦基波',
])
const triangleSeries = firstFrame.get('.waveform-chart__series[data-series-name="BT2_2M"]')
const triangleSeries = firstFrame.get('.waveform-chart__series[data-series-name="正弦基波"]')
expect(triangleSeries.find('.waveform-chart__line').exists()).toBe(false)
expect(triangleSeries.get('.waveform-chart__points').attributes('data-point-type')).toBe(
'triangle',
@@ -196,7 +222,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
wrapper.unmount()
})
it('splits the attached ENG channels across the remaining first-page frames', async () => {
it('keeps the simulated channels across the paginated frames', async () => {
const wrapper = mount(App)
await flushPromises()
@@ -206,7 +232,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
tracks.map((track) =>
track.findAll('.waveform-chart__series').map((item) => item.attributes('data-series-name')),
),
).toEqual([['BT2_2M'], ['ENG6KV1'], ['ENG4F2YIb3'], ['ENG8KJXAc']])
).toEqual([['正弦基波'], ['谐波扰动'], ['阻尼振荡'], ['阶跃响应']])
expect(
tracks
.slice(1)
@@ -220,10 +246,16 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
WaveformData,
{ kind: 'series' }
>
const frameTwoSeries = chartData.series.filter((item) => item.trackId?.startsWith('frame-two-'))
expect(frameTwoSeries.map((item) => item.name)).toEqual(['ENG6KV1', 'ENG4F2YIb3', 'ENG8KJXAc'])
expect(frameTwoSeries.map((item) => item.unit)).toEqual(['KV', 'KA', 'A'])
frameTwoSeries.forEach((item) => {
const simulatedSeries = chartData.series
expect(simulatedSeries.map((item) => item.name)).toEqual([
'正弦基波',
'谐波扰动',
'阻尼振荡',
'阶跃响应',
'脉冲响应',
'带噪信号',
])
simulatedSeries.forEach((item) => {
expect(item.data.kind).toBe('points')
if (item.data.kind === 'points') {
expect(item.data.points).toHaveLength(1000)
@@ -237,7 +269,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
wrapper
.findAll('.waveform-chart__track')
.map((track) => track.get('.waveform-chart__series').attributes('data-series-name')),
).toEqual(['BT1_2M', 'TEST_CH_2'])
).toEqual(['脉冲响应', '带噪信号'])
wrapper.unmount()
})
@@ -247,7 +279,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
await flushPromises()
const renderedTitle = () => wrapper.get('.waveform-chart__title-text')
expect(renderedTitle().text()).toMatch(/^Shot:\d+$/)
expect(renderedTitle().text()).toBe('模拟波形分析')
expect(renderedTitle().attributes('style')).toContain('Microsoft YaHei')
expect(renderedTitle().attributes('style')).toContain('font-size: 14px')
expect(renderedTitle().attributes('style')).toContain('font-weight: 400')

View File

@@ -7,6 +7,7 @@ import 'vue3-colorpicker/style.css'
import {
WaveformChart,
type WaveformAnnotation,
type WaveformAxesOptions,
type WaveformData,
type WaveformDisplayMode,
type WaveformFrameStyle,
@@ -16,57 +17,29 @@ import {
type WaveformLegendOrientation,
type WaveformLegendPosition,
type WaveformOverlayMode,
type WaveformSeries,
type WaveformTitleOptions,
type WaveformZoomEndPayload,
type WaveformZeroLineOptions,
} from './components'
import chartWaveformsJson from './data/chartWaveforms.json'
import frameTwoWaveformsJson from './data/frameTwoWaveforms.json'
import { normalizeWaveformSeries } from './core'
import { createSimulatedWaveformData } from './data/simulatedWaveforms'
interface WaveformSourcePoint {
x: number
y: number
error?: number
lowerError?: number
upperError?: number
}
interface WaveformSourceRow {
chnl: string
chnl_id: number
dat_unit: string
data: WaveformSourcePoint[]
dev: number
shot: number
time?: number[]
time_unit: 'ms'
}
interface FrameTwoWaveformRow {
chnl: string
chnl_id: number
dat_unit: string
data: number[]
time: number[]
time_unit: 'ms'
}
const sourceRows = chartWaveformsJson as unknown as WaveformSourceRow[]
const fullChartData = createSimulatedWaveformData()
const displayMode = ref<WaveformDisplayMode>('independent')
const overlayMode = ref<WaveformOverlayMode>('single-axis')
const rowCount = ref(4)
const columnCount = ref(1)
const frameBorderColor = ref('#1f2937')
const frameBorderWidth = ref(1)
const frameBorderStyle = ref<'solid' | 'dashed'>('solid')
const frameBorderStyle = ref<NonNullable<WaveformFrameStyle['borderStyle']>>('solid')
const frameBackgroundColor = ref('rgba(255, 255, 255, 0)')
const frameWatermarkVisible = ref(true)
const horizontalGridVisible = ref(true)
const horizontalGridColor = ref('#dfe5ef')
const verticalGridVisible = ref(true)
const verticalGridColor = ref('#dfe5ef')
const xAxisLineVisible = ref(false)
const yAxisLineVisible = ref(false)
const annotations = ref<WaveformAnnotation[]>([])
const annotationsVisible = ref(true)
const cleanView = ref(false)
@@ -81,7 +54,7 @@ const legendOrientation = ref<WaveformLegendOrientation>('auto')
const legendBackgroundColor = ref('rgba(255, 255, 255, 0.7)')
const hiddenSeriesIds = ref<string[]>([])
const titleVisible = ref(true)
const titleText = ref(`Shot:${sourceRows[0]?.shot ?? 4712}`)
const titleText = ref('模拟波形分析')
const titleAlign = ref<NonNullable<WaveformTitleOptions['align']>>('center')
const titleFontFamily = ref('"Microsoft YaHei", "微软雅黑", sans-serif')
const titleFontSize = ref(14)
@@ -109,6 +82,7 @@ const legendOrientationOptions: Array<{ label: string; value: WaveformLegendOrie
const frameBorderStyleOptions = [
{ label: '实线', value: 'solid' },
{ label: '虚线', value: 'dashed' },
{ label: '点虚线', value: 'dotted' },
]
const zeroLineDashOptions = [
{ label: '虚线', value: '6 4' },
@@ -136,6 +110,10 @@ const frameStyle = computed<WaveformFrameStyle>(() => ({
borderStyle: frameBorderStyle.value,
backgroundColor: frameBackgroundColor.value,
}))
const axes = computed<WaveformAxesOptions>(() => ({
x: { lineVisible: xAxisLineVisible.value },
y: { lineVisible: yAxisLineVisible.value },
}))
const zeroLine = computed<WaveformZeroLineOptions>(() => ({
visible: zeroLineVisible.value,
color: zeroLineColor.value,
@@ -143,62 +121,6 @@ const zeroLine = computed<WaveformZeroLineOptions>(() => ({
dash: zeroLineDash.value,
}))
const seriesStylePresets: Array<Pick<WaveformSeries, 'lineType' | 'pointType' | 'errorBar'>> = [
{ lineType: 'none', pointType: 'triangle', errorBar: { visible: true } },
{ lineType: 'linear', pointType: 'none' },
{ lineType: 'step-after', pointType: 'circle', errorBar: { visible: true } },
{ lineType: 'linear', pointType: 'diamond', errorBar: { visible: true } },
]
const waveformSeries: WaveformSeries[] = sourceRows.map((row, seriesIndex) => {
const presetStyle = seriesStylePresets[seriesIndex % seriesStylePresets.length]!
const style: Pick<WaveformSeries, 'lineType' | 'pointType' | 'errorBar'> =
row.chnl === 'TEST_CH_4'
? { lineType: 'linear', pointType: 'circle', errorBar: { visible: false } }
: presetStyle
return {
id: String(row.chnl_id),
trackId:
row.chnl.startsWith('TEST_CH_') && row.chnl !== 'TEST_CH_2'
? String(sourceRows[0]?.chnl_id ?? row.chnl_id)
: undefined,
name: row.chnl,
unit: row.dat_unit,
...style,
data: {
kind: 'points',
points: row.data,
},
}
})
const frameTwoWaveforms = frameTwoWaveformsJson as FrameTwoWaveformRow[]
const frameTwoSeries: WaveformSeries[] = frameTwoWaveforms.map((series) => ({
id: String(series.chnl_id),
trackId: `frame-two-${series.chnl_id}`,
name: series.chnl,
unit: series.dat_unit.trim(),
lineType: 'linear',
pointType: 'none',
data: {
kind: 'points',
points: series.data.flatMap((y, index) => {
const time = series.time[index]
return Number.isFinite(time) && Number.isFinite(y) ? [{ x: time! / 1000, y }] : []
}),
},
}))
const frameOneTrackId = String(sourceRows[0]?.chnl_id ?? 'frame-one')
const frameOneCandidates = waveformSeries.filter(
(series) => series.id === frameOneTrackId || series.trackId === frameOneTrackId,
)
const frameOneSeries = frameOneCandidates.filter((series) => series.errorBar?.visible).slice(0, 1)
const remainingSeries = waveformSeries.filter((series) => !frameOneCandidates.includes(series))
const fullChartData: WaveformData = {
kind: 'series',
series: [...frameOneSeries, ...frameTwoSeries, ...remainingSeries],
}
const initialXValues = normalizeWaveformSeries(fullChartData).flatMap((series) =>
series.points.map((point) => point.x),
)
@@ -217,7 +139,9 @@ const initialXDomainValue: [number, number] | undefined =
const initialXDomain = ref<[number, number] | undefined>(initialXDomainValue)
const chartData = ref<WaveformData>(fullChartData)
const lineStyleOverrides = ref<Record<string, WaveformLineStyle>>({})
const selectedSeriesId = ref(String(sourceRows[0]?.chnl_id ?? ''))
const selectedSeriesId = ref(
fullChartData.kind === 'series' ? (fullChartData.series[0]?.id ?? '') : '',
)
const lineStyleOptions: Array<{ label: string; value: WaveformLineStyle }> = [
{ label: '实线', value: 'solid' },
{ label: '虚线', value: 'dashed' },
@@ -510,7 +434,7 @@ onBeforeUnmount(() => window.removeEventListener('keydown', handleWindowKeydown)
</section>
<section class="control-section">
<h2>网格线</h2>
<h2>网格与轴线</h2>
<div class="grid-line-controls">
<div class="grid-line-control">
<span>水平网格</span>
@@ -548,6 +472,14 @@ onBeforeUnmount(() => window.removeEventListener('keydown', handleWindowKeydown)
/>
</span>
</div>
<div class="grid-line-control grid-line-control--switch-only">
<span>横轴线</span>
<Switch v-model:checked="xAxisLineVisible" size="small" aria-label="显示横轴线" />
</div>
<div class="grid-line-control grid-line-control--switch-only">
<span>纵轴线</span>
<Switch v-model:checked="yAxisLineVisible" size="small" aria-label="显示纵轴线" />
</div>
</div>
</section>
@@ -773,6 +705,7 @@ onBeforeUnmount(() => window.removeEventListener('keydown', handleWindowKeydown)
interactive: true,
}"
:frame-style="frameStyle"
:axes="axes"
:clean-view="cleanView"
:show-tooltip="showTooltip"
:zero-line="zeroLine"

View File

@@ -349,6 +349,75 @@ describe('WaveformChart', () => {
expect(zeroLines[0].attributes('y1')).not.toBe(zeroLines[1].attributes('y1'))
})
it('hides X and Y axis lines independently while preserving axis text and the frame', async () => {
const wrapper = await mountSizedChart({
kind: 'series',
series: [
{
id: 'channel',
name: 'Voltage',
data: {
kind: 'points',
points: [
{ x: 0, y: -1 },
{ x: 1, y: 1 },
],
},
},
],
})
const xAxis = wrapper.get('.waveform-chart__axis--x')
const yAxis = wrapper.get('.waveform-chart__axis--y')
expect(xAxis.classes()).not.toContain('waveform-track__axis--line-hidden')
expect(yAxis.classes()).not.toContain('waveform-track__axis--line-hidden')
await wrapper.setProps({ axes: { x: { lineVisible: false } } })
await flushPromises()
expect(xAxis.classes()).toContain('waveform-track__axis--line-hidden')
expect(yAxis.classes()).not.toContain('waveform-track__axis--line-hidden')
expect(xAxis.get('path.domain').attributes('display')).toBe('none')
expect(
xAxis.findAll('.tick line').every((line) => line.attributes('display') === undefined),
).toBe(true)
expect(yAxis.get('path.domain').attributes('display')).toBeUndefined()
await wrapper.setProps({
axes: {
x: { lineVisible: false },
y: { lineVisible: false },
},
grid: {
rowCount: 1,
columnCount: 1,
trackLines: { channel: { horizontal: false, vertical: false } },
},
frameStyle: { borderColor: '#dc2626', borderWidth: 2 },
})
await flushPromises()
expect(xAxis.classes()).toContain('waveform-track__axis--line-hidden')
expect(yAxis.classes()).toContain('waveform-track__axis--line-hidden')
expect(yAxis.get('path.domain').attributes('display')).toBe('none')
expect(
yAxis.findAll('.tick line').every((line) => line.attributes('display') === undefined),
).toBe(true)
expect(xAxis.findAll('text').length).toBeGreaterThan(0)
expect(yAxis.findAll('text').length).toBeGreaterThan(0)
expect(wrapper.findAll('.waveform-chart__axis-endpoint')).toHaveLength(2)
expect(wrapper.get('.waveform-chart__y-axis-label').text()).toBe('Voltage')
expect(wrapper.findAll('[data-grid-direction]')).toHaveLength(0)
expect(wrapper.get('.waveform-chart__plot-frame').attributes()).toMatchObject({
stroke: '#dc2626',
'stroke-width': '2',
})
await wrapper.setProps({ axes: { x: { lineVisible: true }, y: { lineVisible: true } } })
await flushPromises()
expect(xAxis.get('path.domain').attributes('display')).toBeUndefined()
expect(yAxis.get('path.domain').attributes('display')).toBeUndefined()
})
it('preserves a titled multi-axis plot and hides auxiliary layers in clean view', async () => {
const data: WaveformData = {
kind: 'series',
@@ -1079,6 +1148,61 @@ describe('WaveformChart', () => {
expect(wrapper.attributes('data-chart-left-margin')).toBe('64')
})
it('resolves legend positions by stable track id across pages', async () => {
const wrapper = await mountSizedChart(
{
kind: 'series',
series: Array.from({ length: 8 }, (_, index) => ({
id: `series-${index}`,
trackId: `frame-${Math.floor(index / 2)}`,
name: `series ${index}`,
data: {
kind: 'points' as const,
points: [
{ x: 0, y: index },
{ x: 1, y: index + 1 },
],
},
})),
},
{
grid: { rowCount: 2, columnCount: 1, showPagination: true },
legend: {
position: 'left',
orientation: 'auto',
trackPositions: {
'frame-0': 'top',
'frame-1': 'bottom-right',
'frame-2': 'bottom',
},
},
},
)
const legendForTrack = (trackId: string) =>
wrapper.get(`[data-legend-track-id="${trackId}"] .waveform-chart__legend`)
expect(legendForTrack('frame-0').attributes('data-position')).toBe('top')
expect(legendForTrack('frame-0').attributes('data-orientation')).toBe('horizontal')
expect(legendForTrack('frame-1').attributes('data-position')).toBe('bottom-right')
expect(legendForTrack('frame-1').attributes('data-orientation')).toBe('vertical')
await wrapper.setProps({
legend: {
position: 'left',
orientation: 'vertical',
trackPositions: { 'frame-0': 'top', 'frame-1': 'bottom-right', 'frame-2': 'bottom' },
},
})
expect(legendForTrack('frame-0').attributes('data-orientation')).toBe('vertical')
await wrapper.get('.ant-pagination-next button').trigger('click')
expect(legendForTrack('frame-2').attributes('data-position')).toBe('bottom')
expect(legendForTrack('frame-2').attributes('data-orientation')).toBe('vertical')
expect(legendForTrack('frame-3').attributes('data-position')).toBe('left')
expect(legendForTrack('frame-3').attributes('data-orientation')).toBe('vertical')
})
it('applies a configurable alpha background to every visible legend', async () => {
const wrapper = await mountSizedChart(
{
@@ -2208,6 +2332,44 @@ describe('WaveformChart', () => {
expect(pendingAnimationFrameCount()).toBe(0)
})
it('isolates hover rendering from the chart, track, and waveform path subtrees', async () => {
const wrapper = await mountSizedChart(
{
kind: 'points',
points: [
{ x: 0, y: 0 },
{ x: 1, y: 5 },
],
},
{ grid: { rowCount: 1, columnCount: 1 } },
)
const overlay = wrapper.get('.waveform-chart__overlay')
const overlayWidth = Number(overlay.attributes('width'))
Object.defineProperty(overlay.element, 'getBoundingClientRect', {
value: () => ({ left: 0, top: 0, width: overlayWidth, height: 290 }),
})
const track = wrapper.getComponent({ name: 'WaveformTrack' })
const seriesLayer = wrapper.getComponent({ name: 'WaveformSeriesLayer' })
const chartUpdate = vi.spyOn(wrapper.vm.$, 'update')
const trackUpdate = vi.spyOn(track.vm.$, 'update')
const seriesLayerUpdate = vi.spyOn(seriesLayer.vm.$, 'update')
const pathBeforeHover = wrapper.get('.waveform-chart__line').element
overlay.element.dispatchEvent(
new MouseEvent('pointermove', { clientX: overlayWidth, clientY: 120, bubbles: true }),
)
flushAnimationFrames()
await flushPromises()
expect(wrapper.get('.waveform-chart__tooltip').text()).toContain('ms: 1,000.0000')
expect(wrapper.findAll('.waveform-chart__crosshair line')).toHaveLength(1)
expect(wrapper.get('.waveform-chart__line').element).toBe(pathBeforeHover)
expect(chartUpdate).not.toHaveBeenCalled()
expect(trackUpdate).not.toHaveBeenCalled()
expect(seriesLayerUpdate).not.toHaveBeenCalled()
})
it('renders reference grid styling and an optional frame watermark', async () => {
const wrapper = await mountSizedChart(
{
@@ -2329,6 +2491,17 @@ describe('WaveformChart', () => {
expect(wrapper.get('.waveform-chart__plot-frame').attributes('stroke-width')).toBe('1')
})
it('renders a dotted frame with rounded dots', async () => {
const wrapper = await mountSizedChart(gridSeries(1), {
frameStyle: { borderStyle: 'dotted' },
})
expect(wrapper.get('.waveform-chart__plot-frame').attributes()).toMatchObject({
'stroke-dasharray': '1 3',
'stroke-linecap': 'round',
})
})
it('continues minor x-grid lines beyond the final major tick to the exact endpoint', async () => {
const wrapper = await mountSizedChart({
kind: 'points',

View File

@@ -21,6 +21,7 @@ import {
onBeforeUnmount,
onMounted,
ref,
shallowReactive,
shallowRef,
watch,
type CSSProperties,
@@ -28,6 +29,7 @@ import {
import {
type WaveformAnnotation,
type WaveformAxesOptions,
type WaveformData,
type WaveformDisplayMode,
type WaveformFrameStyle,
@@ -57,8 +59,8 @@ import {
type AnnotationSeriesInfo,
type AnnotationTrackLayout,
} from './annotation'
import { WaveformTooltip } from './interaction'
import { WaveformLegend, WaveformTrack } from './rendering'
import { WaveformHoverHost } from './interaction'
import { WaveformHoverLayer, WaveformLegend, WaveformTrack } from './rendering'
import {
channelColors,
margin as chartMargin,
@@ -87,7 +89,13 @@ import {
X_AXIS_BAND,
type WaveformGridOptions,
} from './core/grid'
import type { DisplaySeries, DisplayTrack, HoveredSeriesPoint, TrackLayout } from './core/types'
import type {
DisplaySeries,
DisplayTrack,
HoveredSeriesPoint,
TrackLayout,
WaveformHoverState,
} from './core/types'
import {
buildTrackLayouts,
findClosestTrackAtPointer,
@@ -121,6 +129,7 @@ const props = withDefaults(
timeUnit?: 's' | 'ms'
frameNumber?: string | number
frameStyle?: WaveformFrameStyle
axes?: WaveformAxesOptions
annotations?: WaveformAnnotation[]
annotationsVisible?: boolean
interactionMode?: WaveformInteractionMode
@@ -190,9 +199,11 @@ const sharedTransform = shallowRef<ZoomTransform>(zoomIdentity)
const independentTransforms = shallowRef<ZoomTransform[]>([])
const sharedYDomains = ref<Record<string, [number, number]>>({})
const independentYDomains = ref<Record<number, [number, number]>>({})
const hoveredSeriesPoints = ref<HoveredSeriesPoint[]>([])
const hoveredTrackIndex = ref<number | null>(null)
const hoverPosition = ref({ x: 0, y: 0 })
const hoverState = shallowReactive<WaveformHoverState>({
points: [],
trackIndex: null,
position: { x: 0, y: 0 },
})
const suppressHoverUntilMove = ref(false)
const currentPage = ref(1)
const resizeObserver = shallowRef<ResizeObserver>()
@@ -251,7 +262,9 @@ function handleInteractionKeyDown(event: KeyboardEvent) {
const target = event.target
if (
target instanceof Element &&
target.closest('button, input, select, textarea, [contenteditable]:not([contenteditable="false"])')
target.closest(
'button, input, select, textarea, [contenteditable]:not([contenteditable="false"])',
)
) {
return
}
@@ -265,15 +278,6 @@ function handleInteractionKeyUp(event: KeyboardEvent) {
}
}
// 用于传递给 WaveformTooltip 的接口
interface TooltipSeriesPoint {
trackIndex: number
name: string
color: string
unit?: string
point: WaveformPoint
}
const fixedWidth = computed(() =>
Number.isFinite(props.width) ? Math.max(0, props.width ?? 0) : undefined,
)
@@ -290,14 +294,16 @@ const containerStyle = computed(() => ({
width: fixedWidth.value === undefined ? '100%' : `${fixedWidth.value}px`,
height: fixedHeight.value === undefined ? '100%' : `${fixedHeight.value}px`,
}))
const legendPosition = computed<WaveformLegendPosition>(() => props.legend?.position ?? 'top-right')
const isCleanView = computed(() => props.cleanView === true)
const resolvedZeroLine = computed(() => {
const width = props.zeroLine?.width
return {
visible: props.zeroLine?.visible === true,
color: props.zeroLine?.color || ZERO_LINE_DEFAULTS.COLOR,
width: typeof width === 'number' && Number.isFinite(width) && width > 0 ? width : ZERO_LINE_DEFAULTS.WIDTH,
width:
typeof width === 'number' && Number.isFinite(width) && width > 0
? width
: ZERO_LINE_DEFAULTS.WIDTH,
dash: props.zeroLine?.dash ?? ZERO_LINE_DEFAULTS.DASH,
}
})
@@ -311,13 +317,17 @@ const hiddenSeriesIdSet = computed(() =>
: new Set(props.hiddenSeriesIds),
)
const resolvedHiddenSeriesIds = computed(() => Array.from(hiddenSeriesIdSet.value))
const legendOrientation = computed<Exclude<WaveformLegendOrientation, 'auto'>>(() => {
function resolveLegendPosition(trackId: string): WaveformLegendPosition {
return props.legend?.trackPositions?.[trackId] ?? props.legend?.position ?? 'top-right'
}
function resolveLegendOrientation(
position: WaveformLegendPosition,
): Exclude<WaveformLegendOrientation, 'auto'> {
const orientation = props.legend?.orientation ?? 'auto'
if (orientation !== 'auto') return orientation
return legendPosition.value === 'top' || legendPosition.value === 'bottom'
? 'horizontal'
: 'vertical'
})
return position === 'top' || position === 'bottom' ? 'horizontal' : 'vertical'
}
const resolvedTitleText = computed(() => props.title?.text.trim() ?? '')
const titleAreaReserved = computed(
() =>
@@ -326,7 +336,9 @@ const titleAreaReserved = computed(
const titleVisible = computed(() => titleAreaReserved.value && !isCleanView.value)
const titleFontSize = computed(() => {
const fontSize = props.title?.textStyle?.fontSize
return Number.isFinite(fontSize) && (fontSize ?? 0) > 0 ? (fontSize as number) : TITLE_DEFAULT_FONT_SIZE
return Number.isFinite(fontSize) && (fontSize ?? 0) > 0
? (fontSize as number)
: TITLE_DEFAULT_FONT_SIZE
})
const titleRotation = computed(() => {
const rotation = props.title?.textStyle?.rotation
@@ -351,7 +363,10 @@ const estimatedTitleWidth = computed(() => {
const spacingWidth = Number.isFinite(letterSpacing)
? Math.max(0, resolvedTitleText.value.length - 1) * letterSpacing
: 0
return Math.max(1, resolvedTitleText.value.length * titleFontSize.value * TITLE_CHAR_WIDTH_RATIO + spacingWidth)
return Math.max(
1,
resolvedTitleText.value.length * titleFontSize.value * TITLE_CHAR_WIDTH_RATIO + spacingWidth,
)
})
const titleAvailableWidth = computed(() => {
const measuredAvailableWidth = chartWidth.value - TITLE_AREA_HORIZONTAL_PADDING * 2
@@ -554,7 +569,6 @@ const yAxisLayout = computed(() => {
}
})
const hasWaveformData = computed(() => chartSeries.value.length > 0)
const hoveredPoint = computed(() => hoveredSeriesPoints.value[0]?.point ?? null)
const hasChartArea = computed(() => innerWidth.value > 0 && innerHeight.value > 0)
const resolvedXLabel = computed(() => props.xLabel ?? `时间(${props.timeUnit}`)
const activeInteractionMode = computed(() => props.interactionMode)
@@ -563,17 +577,6 @@ const isZoomMode = computed(
() => activeInteractionMode.value === 'zoom' || activeInteractionMode.value === undefined,
)
// 转换为 Tooltip 组件需要的格式
const tooltipSeriesPoints = computed<TooltipSeriesPoint[]>(() => {
return hoveredSeriesPoints.value.map((item) => ({
trackIndex: item.trackIndex,
name: item.name,
color: item.color,
unit: item.unit,
point: item.point,
}))
})
const sharedXDomain = computed(() => {
const values: number[] = []
chartTracks.value.forEach((track) => {
@@ -863,10 +866,14 @@ function clearZoomBindings() {
function resolveMaximumZoomScale(domain: [number, number]): number {
const minZoomSpan = props.minZoomSpan
if (!Number.isFinite(minZoomSpan) || (minZoomSpan ?? 0) <= 0) return ZOOM_CONSTRAINTS.DEFAULT_MAX_SCALE
if (!Number.isFinite(minZoomSpan) || (minZoomSpan ?? 0) <= 0)
return ZOOM_CONSTRAINTS.DEFAULT_MAX_SCALE
const domainSpan = Math.abs(domain[1] - domain[0])
if (!Number.isFinite(domainSpan) || domainSpan <= 0) return ZOOM_CONSTRAINTS.MIN_SCALE
return Math.min(ZOOM_CONSTRAINTS.DEFAULT_MAX_SCALE, Math.max(ZOOM_CONSTRAINTS.MIN_SCALE, domainSpan / (minZoomSpan ?? domainSpan)))
return Math.min(
ZOOM_CONSTRAINTS.DEFAULT_MAX_SCALE,
Math.max(ZOOM_CONSTRAINTS.MIN_SCALE, domainSpan / (minZoomSpan ?? domainSpan)),
)
}
function canZoomTrack(track: TrackLayout): boolean {
@@ -967,9 +974,9 @@ function scheduleHover(update: () => void) {
function hoveredPointsMatch(nextPoints: HoveredSeriesPoint[]): boolean {
return (
hoveredSeriesPoints.value.length === nextPoints.length &&
hoverState.points.length === nextPoints.length &&
nextPoints.every((point, index) => {
const current = hoveredSeriesPoints.value[index]
const current = hoverState.points[index]
return (
current?.id === point.id &&
current.trackIndex === point.trackIndex &&
@@ -984,20 +991,34 @@ function commitHover(
trackIndex: number | null,
position: { x: number; y: number },
) {
if (!hoveredPointsMatch(nextPoints)) hoveredSeriesPoints.value = nextPoints
hoveredTrackIndex.value = trackIndex
hoverPosition.value = position
// Emit using the updated hoveredSeriesPoints to avoid race condition
emit('point-hover', hoveredSeriesPoints.value[0]?.point ?? null)
if (!hoveredPointsMatch(nextPoints)) hoverState.points = nextPoints
hoverState.trackIndex = trackIndex
hoverState.position = position
emit('point-hover', hoverState.points[0]?.point ?? null)
}
function clearHover() {
cancelPendingHover()
hoveredSeriesPoints.value = []
hoveredTrackIndex.value = null
hoverState.points = []
hoverState.trackIndex = null
emit('point-hover', null)
}
function createHoveredSeriesPoint(
series: DisplaySeries,
trackIndex: number,
point: WaveformPoint,
): HoveredSeriesPoint {
return {
id: series.id,
name: series.name,
color: series.color,
unit: series.unit,
trackIndex,
point,
}
}
function beginAnnotationDrag() {
suppressHoverUntilMove.value = true
clearHover()
@@ -1315,7 +1336,7 @@ function handleIndependentPointerMove(event: PointerEvent, trackIndex: number) {
const xValue = track.xScale.invert(Math.max(0, Math.min(innerWidth.value, pointerX)))
const nextPoints = track.seriesList.flatMap((series) => {
const point = nearestPoint(series, xValue)
return point ? [{ ...series, trackIndex, point }] : []
return point ? [createHoveredSeriesPoint(series, trackIndex, point)] : []
})
commitHover(nextPoints, trackIndex, {
x: resolvedChartLeftMargin.value + track.left + pointerX,
@@ -1345,7 +1366,7 @@ function handleSharedPointerMove(event: PointerEvent) {
const nextPoints = trackLayouts.value.flatMap((track) =>
track.seriesList.flatMap((series) => {
const point = nearestPoint(series, xValue)
return point ? [{ ...series, trackIndex: track.index, point }] : []
return point ? [createHoveredSeriesPoint(series, track.index, point)] : []
}),
)
commitHover(nextPoints, null, {
@@ -1920,17 +1941,16 @@ onBeforeUnmount(() => {
:track="track"
:clip-path-id="clipPathId"
:inner-width="innerWidth"
:show-tooltip="showTooltip"
:zoomable="zoomable"
:display-mode="displayMode"
:interaction-mode="activeInteractionMode"
:frame-number="resolveFrameNumber(track.index)"
:frame-style="frameStyle"
:axes="axes"
:clean-view="isCleanView"
:zero-line="resolvedZeroLine"
:time-unit="timeUnit"
:y-label="yLabel"
:hovered-point="hoveredSeriesPoints.find((p) => p.trackIndex === track.index)"
@pointer-move="handleIndependentPointerMove($event, track.index)"
@pointer-down="beginViewportDrag($event, track.index, true)"
@pointer-up="finishViewportDrag"
@@ -1940,6 +1960,13 @@ onBeforeUnmount(() => {
@contextmenu="handleAnnotationContextMenu($event, track.index)"
/>
<WaveformHoverLayer
:state="hoverState"
:tracks="trackLayouts"
:clip-path-id="clipPathId"
:visible="showTooltip"
/>
<rect
v-if="selectionBox && selection?.mode === 'box'"
class="waveform-chart__zoom-selection"
@@ -1966,13 +1993,14 @@ onBeforeUnmount(() => {
:key="`legend-${track.index}-${track.series.name}`"
class="waveform-chart__legend-track"
:data-legend-track-index="track.index"
:data-legend-track-id="track.id"
:transform="`translate(${track.left}, ${track.top})`"
>
<WaveformLegend
v-if="!track.isEmpty && track.legendSeries.length > 1"
:series="track.legendSeries"
:position="legendPosition"
:orientation="legendOrientation"
:position="resolveLegendPosition(track.id)"
:orientation="resolveLegendOrientation(resolveLegendPosition(track.id))"
:background-color="legendBackgroundColor"
:interactive="legendInteractive"
:hidden-series-ids="resolvedHiddenSeriesIds"
@@ -2040,13 +2068,10 @@ onBeforeUnmount(() => {
@close="annotationInteraction.closeContextMenu"
/>
<!-- Tooltip -->
<WaveformTooltip
:visible="showTooltip && hoveredPoint !== null"
:position="hoverPosition"
<WaveformHoverHost
:state="hoverState"
:visible="showTooltip"
:time-unit="timeUnit"
:hovered-point="hoveredPoint"
:series-points="tooltipSeriesPoints"
:container-width="chartWidth"
:container-height="chartHeight"
/>

View File

@@ -371,6 +371,7 @@ export function buildTrackLayouts(options: BuildTrackLayoutsOptions): TrackLayou
})
return {
id: displayTrack.id,
index,
series,
seriesList: displayTrack.visibleSeries,

View File

@@ -63,15 +63,27 @@ export interface WaveformYAxisLayout {
/**
* 悬浮的系列点
*/
export interface HoveredSeriesPoint extends DisplaySeries {
export interface HoveredSeriesPoint {
id: string
name: string
unit?: string
color: string
trackIndex: number
point: WaveformPoint
}
export interface WaveformHoverState {
points: HoveredSeriesPoint[]
trackIndex: number | null
position: { x: number; y: number }
}
/**
* 轨道布局
*/
export interface TrackLayout {
/** Stable track key derived from trackId, or from the series id when trackId is omitted. */
id: string
index: number
series: DisplaySeries
/** Visible series used by rendering and interaction code. */

View File

@@ -19,6 +19,7 @@ export type {
WaveformLegendOrientation,
WaveformLegendOptions,
WaveformFrameStyle,
WaveformAxesOptions,
WaveformZeroLineOptions,
SingleWaveformData,
WaveformLineType,

View File

@@ -17,6 +17,7 @@ export type {
WaveformLegendOrientation,
WaveformLegendOptions,
WaveformFrameStyle,
WaveformAxesOptions,
WaveformZeroLineOptions,
WaveformPoint,
WaveformSeries,

View File

@@ -0,0 +1,28 @@
<script setup lang="ts">
import { computed } from 'vue'
import type { WaveformHoverState } from '../core/types'
import WaveformTooltip from './WaveformTooltip.vue'
const props = defineProps<{
state: WaveformHoverState
visible: boolean
timeUnit: 's' | 'ms'
containerWidth: number
containerHeight: number
}>()
const hoveredPoint = computed(() => props.state.points[0]?.point ?? null)
</script>
<template>
<WaveformTooltip
:visible="visible && hoveredPoint !== null"
:position="state.position"
:time-unit="timeUnit"
:hovered-point="hoveredPoint"
:series-points="state.points"
:container-width="containerWidth"
:container-height="containerHeight"
/>
</template>

View File

@@ -66,6 +66,31 @@ describe('WaveformTooltip', () => {
expect(wrapper.get('.waveform-tooltip__series small').text()).toBe('(+2 / -1)')
})
it('keeps a formatted value and its unit in one value container', () => {
const hoveredPoint = { x: 1, y: -1405.4932 }
const wrapper = mount(WaveformTooltip, {
props: {
visible: true,
position: { x: 10, y: 10 },
timeUnit: 'ms',
hoveredPoint,
seriesPoints: [
{
trackIndex: 0,
name: 'ENG8KJXAc(10001)',
color: '#ffb43b',
unit: 'A',
point: hoveredPoint,
},
],
containerWidth: 400,
containerHeight: 300,
},
})
expect(wrapper.get('.waveform-tooltip__value').text()).toBe('-1,405.4932 A')
})
it('omits the error label when both resolved errors are zero', () => {
const point = { x: 1, y: 12 }
const wrapper = mount(WaveformTooltip, {

View File

@@ -77,7 +77,7 @@ function formatError(point: WaveformPoint): string | null {
>
<i :style="{ backgroundColor: seriesPoint.color }" />
<strong v-if="seriesPoint.name">{{ seriesPoint.name }}:</strong>
<span>
<span class="waveform-tooltip__value">
{{ formatTooltipNumber(seriesPoint.point.y)
}}{{ seriesPoint.unit ? ` ${seriesPoint.unit}` : '' }}
<small v-if="formatError(seriesPoint.point)">{{ formatError(seriesPoint.point) }}</small>
@@ -116,7 +116,7 @@ function formatError(point: WaveformPoint): string | null {
.waveform-tooltip__series {
display: grid;
grid-template-columns: 8px auto minmax(0, 1fr);
grid-template-columns: 8px minmax(0, 1fr) auto;
gap: 6px;
align-items: center;
}
@@ -134,6 +134,10 @@ function formatError(point: WaveformPoint): string | null {
white-space: nowrap;
}
.waveform-tooltip__value {
white-space: nowrap;
}
.waveform-tooltip__series small {
color: #667085;
white-space: nowrap;

View File

@@ -1 +1,2 @@
export { default as WaveformTooltip } from './WaveformTooltip.vue'
export { default as WaveformHoverHost } from './WaveformHoverHost.vue'

View File

@@ -0,0 +1,60 @@
<script setup lang="ts">
import { computed } from 'vue'
import type { HoveredSeriesPoint, TrackLayout, WaveformHoverState } from '../core/types'
const props = defineProps<{
state: WaveformHoverState
tracks: TrackLayout[]
clipPathId: string
visible: boolean
}>()
interface Crosshair {
point: HoveredSeriesPoint
track: TrackLayout
x: number
}
const crosshairs = computed<Crosshair[]>(() => {
if (!props.visible) return []
const pointByTrack = new Map<number, HoveredSeriesPoint>()
props.state.points.forEach((point) => {
if (!pointByTrack.has(point.trackIndex)) pointByTrack.set(point.trackIndex, point)
})
return props.tracks.flatMap((track) => {
const point = pointByTrack.get(track.index)
return point && !track.isEmpty && track.hasVisibleSeries
? [{ point, track, x: track.xScale(point.point.x) }]
: []
})
})
</script>
<template>
<g class="waveform-chart__hover-layer" pointer-events="none" aria-hidden="true">
<g
v-for="crosshair in crosshairs"
:key="crosshair.track.index"
class="waveform-track__crosshair waveform-chart__crosshair"
:clip-path="`url(#${clipPathId}-${crosshair.track.index})`"
:transform="`translate(${crosshair.track.left ?? 0}, ${crosshair.track.top})`"
>
<line :x1="crosshair.x" :x2="crosshair.x" y1="0" :y2="crosshair.track.height" />
</g>
</g>
</template>
<style scoped>
.waveform-track__crosshair {
pointer-events: none;
}
.waveform-track__crosshair line {
stroke: #57617b;
stroke-width: 1;
stroke-dasharray: 4 3;
}
</style>

View File

@@ -2,14 +2,9 @@
import { computed, nextTick, onMounted, ref, watch } from 'vue'
import { axisBottom, axisLeft, axisRight, select } from 'd3'
import { formatAxisTime, formatScientificAxisLabel } from '../../utils'
import type { WaveformFrameStyle, WaveformZeroLineOptions } from '../../types'
import type { WaveformAxesOptions, WaveformFrameStyle, WaveformZeroLineOptions } from '../../types'
import type { WaveformDisplayMode, WaveformInteractionMode } from '../data/types'
import type {
DisplaySeries,
HoveredSeriesPoint,
TrackLayout,
WaveformYAxisLayout,
} from '../core/types'
import type { DisplaySeries, TrackLayout, WaveformYAxisLayout } from '../core/types'
import WaveformSeriesLayer from './WaveformSeriesLayer.vue'
interface Props {
@@ -19,8 +14,6 @@ interface Props {
clipPathId: string
/** 内部宽度 */
innerWidth: number
/** 是否显示 tooltip */
showTooltip: boolean
/** 是否可缩放 */
zoomable: boolean
/** 显示模式 */
@@ -31,10 +24,10 @@ interface Props {
frameNumber?: string | number
/** 图框样式 */
frameStyle?: WaveformFrameStyle
/** 坐标轴线显示选项 */
axes?: WaveformAxesOptions
/** 时间单位 */
timeUnit: 's' | 'ms'
/** 悬浮点(用于显示十字线) */
hoveredPoint?: HoveredSeriesPoint
/** Y 轴标签回退值 */
yLabel?: string
/** Hide visual aids while keeping chart interaction active. */
@@ -72,7 +65,10 @@ const resolvedFrameStyle = computed(() => {
typeof borderWidth === 'number' && Number.isFinite(borderWidth) && borderWidth >= 0
? borderWidth
: 1,
borderStyle: props.frameStyle?.borderStyle === 'dashed' ? 'dashed' : 'solid',
borderStyle:
props.frameStyle?.borderStyle === 'dashed' || props.frameStyle?.borderStyle === 'dotted'
? props.frameStyle.borderStyle
: 'solid',
backgroundColor: props.frameStyle?.backgroundColor || 'transparent',
}
})
@@ -105,20 +101,6 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
return trackIndex % labelSpacing === 0
}
function crosshairX(): number {
return props.hoveredPoint && props.hoveredPoint.trackIndex === props.track.index
? props.track.xScale(props.hoveredPoint.point.x)
: 0
}
function hasCrosshair(): boolean {
return (
props.showTooltip &&
props.hoveredPoint !== undefined &&
props.hoveredPoint.trackIndex === props.track.index
)
}
function zeroLineY(axis: WaveformYAxisLayout): number | null {
const [minimum, maximum] = axis.scale.domain()
if (!props.zeroLine.visible || minimum > 0 || maximum < 0) return null
@@ -138,11 +120,16 @@ function renderAxes() {
yAxis.tickValues(axis.tickValues)
select(element).call(yAxis)
const selection = select(element)
selection.call(yAxis)
selection
.selectAll('path.domain')
.attr('display', props.axes?.y?.lineVisible === false ? 'none' : null)
})
if (xAxisElement.value) {
select(xAxisElement.value).call(
const selection = select(xAxisElement.value)
selection.call(
axisBottom(props.track.xScale)
.tickValues(props.track.xAxisTickValues)
.tickFormat((value) =>
@@ -156,6 +143,9 @@ function renderAxes() {
.tickPadding(7)
.tickSizeOuter(0),
)
selection
.selectAll('path.domain')
.attr('display', props.axes?.x?.lineVisible === false ? 'none' : null)
}
}
@@ -171,6 +161,8 @@ watch(
() => props.track.xAxisTickValues,
() => props.track.yAxisTickValues,
() => props.timeUnit,
() => props.axes?.x?.lineVisible,
() => props.axes?.y?.lineVisible,
],
async () => {
await nextTick()
@@ -307,6 +299,7 @@ watch(
v-if="track.showXAxis && !cleanView"
ref="xAxisElement"
class="waveform-track__axis waveform-track__axis--x waveform-chart__axis waveform-chart__axis--x"
:class="{ 'waveform-track__axis--line-hidden': axes?.x?.lineVisible === false }"
:transform="`translate(0, ${track.height})`"
/>
<g
@@ -353,7 +346,10 @@ watch(
:key="`y-axis-${track.index}-${axis.index}`"
:ref="(element) => setYAxisElement(element, axis.index)"
class="waveform-track__axis waveform-track__axis--y waveform-chart__axis waveform-chart__axis--y"
:class="`waveform-track__axis--${axis.side}`"
:class="[
`waveform-track__axis--${axis.side}`,
{ 'waveform-track__axis--line-hidden': axes?.y?.lineVisible === false },
]"
:data-y-axis-index="axis.index"
:data-y-axis-side="axis.side"
:transform="`translate(${axis.x}, 0)`"
@@ -439,22 +435,20 @@ watch(
fill="none"
:stroke="resolvedFrameStyle.borderColor"
:stroke-width="resolvedFrameStyle.borderWidth"
:stroke-dasharray="resolvedFrameStyle.borderStyle === 'dashed' ? '6 4' : undefined"
:stroke-dasharray="
resolvedFrameStyle.borderStyle === 'dashed'
? '6 4'
: resolvedFrameStyle.borderStyle === 'dotted'
? '1 3'
: undefined
"
:stroke-linecap="resolvedFrameStyle.borderStyle === 'dotted' ? 'round' : undefined"
aria-hidden="true"
/>
<!-- 波形系列隔离在静态子组件中,避免 hover 更新遍历大量 SVG 节点。 -->
<WaveformSeriesLayer :track="track" :clip-path-id="clipPathId" />
<!-- 十字线 -->
<g
v-if="!track.isEmpty && track.hasVisibleSeries && hasCrosshair()"
class="waveform-track__crosshair waveform-chart__crosshair"
:clip-path="`url(#${clipPathId}-${track.index})`"
>
<line :x1="crosshairX()" :x2="crosshairX()" y1="0" :y2="track.height" />
</g>
<!-- 交互覆盖层(仅在独立模式下) -->
<rect
v-if="!track.isEmpty && track.hasVisibleSeries && displayMode === 'independent'"
@@ -561,16 +555,6 @@ watch(
cursor: crosshair;
}
.waveform-track__crosshair {
pointer-events: none;
}
.waveform-track__crosshair line {
stroke: #57617b;
stroke-width: 1;
stroke-dasharray: 4 3;
}
.waveform-track__zero-line {
fill: none;
pointer-events: none;

View File

@@ -1,3 +1,4 @@
export { default as WaveformTrack } from './WaveformTrack.vue'
export { default as WaveformLegend } from './WaveformLegend.vue'
export { default as WaveformHoverLayer } from './WaveformHoverLayer.vue'
export { waveformPointSymbolPath } from './seriesStyle'

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
import { describe, expect, it } from 'vitest'
import { createSimulatedWaveformData } from './simulatedWaveforms'
describe('simulated waveform data', () => {
it('creates deterministic, finite six-channel data', () => {
const first = createSimulatedWaveformData()
const second = createSimulatedWaveformData()
expect(first).toEqual(second)
expect(first.kind).toBe('series')
if (first.kind !== 'series') return
expect(first.series).toHaveLength(6)
expect(new Set(first.series.map((series) => series.id)).size).toBe(6)
first.series.forEach((series) => {
expect(series.data.kind).toBe('points')
if (series.data.kind !== 'points') return
expect(series.data.points).toHaveLength(1_000)
expect(series.data.points[0]?.x).toBe(-5)
expect(series.data.points.at(-1)?.x).toBe(5)
series.data.points.forEach((point) => {
expect(Number.isFinite(point.x)).toBe(true)
expect(Number.isFinite(point.y)).toBe(true)
if (point.error !== undefined) expect(point.error).toBeGreaterThanOrEqual(0)
if (point.lowerError !== undefined) expect(point.lowerError).toBeGreaterThanOrEqual(0)
if (point.upperError !== undefined) expect(point.upperError).toBeGreaterThanOrEqual(0)
})
})
})
})

View File

@@ -0,0 +1,121 @@
import type { WaveformData, WaveformPoint, WaveformSeries } from '../types'
const POINT_COUNT = 1_000
const START_TIME = -5
const END_TIME = 5
const TWO_PI = Math.PI * 2
type SignalGenerator = (time: number, noise: number) => number
type ErrorGenerator = (time: number, value: number) => Pick<
WaveformPoint,
'error' | 'lowerError' | 'upperError'
>
interface SimulatedSeriesDefinition
extends Pick<
WaveformSeries,
'id' | 'name' | 'unit' | 'lineType' | 'pointType' | 'errorBar'
> {
signal: SignalGenerator
errors?: ErrorGenerator
}
function createSeededNoise(seed: number) {
let state = seed >>> 0
return () => {
state = (Math.imul(state, 1_664_525) + 1_013_904_223) >>> 0
return state / 0x1_0000_0000 - 0.5
}
}
function createPoints(
signal: SignalGenerator,
noise: () => number,
errors?: ErrorGenerator,
): WaveformPoint[] {
return Array.from({ length: POINT_COUNT }, (_, index) => {
const time = START_TIME + (index * (END_TIME - START_TIME)) / (POINT_COUNT - 1)
const value = signal(time, noise())
return {
x: time,
y: value,
...(errors?.(time, value) ?? {}),
}
})
}
const seriesDefinitions: SimulatedSeriesDefinition[] = [
{
id: 'simulated-sine',
name: '正弦基波',
unit: 'V',
lineType: 'none',
pointType: 'triangle',
errorBar: { visible: true },
signal: (time) => 1.2 * Math.sin(TWO_PI * 0.8 * time),
errors: (time) => ({
lowerError: 0.06 + 0.015 * Math.abs(Math.sin(time)),
upperError: 0.08 + 0.02 * Math.abs(Math.cos(time)),
}),
},
{
id: 'simulated-harmonic',
name: '谐波扰动',
unit: 'V',
lineType: 'linear',
pointType: 'none',
signal: (time) =>
0.9 * Math.sin(TWO_PI * 0.55 * time) + 0.28 * Math.sin(TWO_PI * 2.2 * time + 0.4),
},
{
id: 'simulated-damped',
name: '阻尼振荡',
unit: 'A',
lineType: 'linear',
pointType: 'none',
signal: (time) => {
const elapsed = time + 5
return 2.4 * Math.exp(-elapsed * 0.28) * Math.sin(TWO_PI * 1.25 * elapsed)
},
},
{
id: 'simulated-step',
name: '阶跃响应',
unit: 'V',
lineType: 'linear',
pointType: 'none',
signal: (time) => (time < 0 ? 0 : 1 - Math.exp(-time * 2.4)),
},
{
id: 'simulated-pulse',
name: '脉冲响应',
unit: 'V',
lineType: 'linear',
pointType: 'none',
signal: (time) => 1.8 * Math.exp(-((time - 0.75) ** 2) / 0.12),
},
{
id: 'simulated-noise',
name: '带噪信号',
unit: 'A',
lineType: 'linear',
pointType: 'diamond',
errorBar: { visible: true },
signal: (time, noise) => 0.7 * Math.sin(TWO_PI * 0.45 * time) + noise * 0.36,
errors: () => ({ error: 0.12 }),
},
]
export function createSimulatedWaveformData(): WaveformData {
const noise = createSeededNoise(0x5eed1234)
return {
kind: 'series',
series: seriesDefinitions.map(({ signal, errors, ...series }) => ({
...series,
data: {
kind: 'points',
points: createPoints(signal, noise, errors),
},
})),
}
}

View File

@@ -1,813 +0,0 @@
[
{
"chnl": "BT2_2M",
"chnl_id": 4742,
"dat_unit": "T",
"data": [
0.00037805046304129064, -0.0007567321881651878, -0.00037805046304129064,
-0.00037805046304129064, -6.31265379524848e-7, -6.31265379524848e-7, -6.31265379524848e-7,
-6.31265379524848e-7, -6.31265379524848e-7, -6.31265379524848e-7, -6.31265379524848e-7,
-6.31265379524848e-7, -6.31265379524848e-7, -6.31265379524848e-7, -6.31265379524848e-7,
-6.31265379524848e-7, -0.00037805046304129064, -6.31265379524848e-7, -6.31265379524848e-7,
-0.00037931298720650375, -0.00037805046304129064, -6.31265379524848e-7,
-0.00037805046304129064, -0.00037805046304129064, -0.00037805046304129064,
-0.00037805046304129064, -0.0007567321881651878, -6.31265379524848e-7,
-0.00037805046304129064, -0.00037805046304129064, -6.31265379524848e-7, -6.31265379524848e-7,
-0.00037805046304129064, -0.00037805046304129064, -0.00037805046304129064,
-0.0007567321881651878, -6.31265379524848e-7, -6.31265379524848e-7, -6.31265379524848e-7,
-0.00037805046304129064, -0.00037931298720650375, -0.0007567321881651878,
-0.00037931298720650375, -0.00037931298720650375, -0.00037805046304129064,
-0.00037931298720650375, -6.31265379524848e-7, -0.00037805046304129064,
-0.00037805046304129064, -6.31265379524848e-7, -0.0007567321881651878,
-0.00037805046304129064, -0.00037805046304129064, -0.00037805046304129064,
-0.00037805046304129064, -0.00037805046304129064, -0.00037805046304129064,
-0.00037805046304129064, -0.00037805046304129064, -0.00037931298720650375,
-6.31265379524848e-7, -6.31265379524848e-7, -0.00037805046304129064, -0.0007567321881651878,
-0.0007567321881651878, -0.00037805046304129064, -0.00037931298720650375,
-0.0007567321881651878, -0.0007567321881651878, -0.00037805046304129064,
-0.0007567321881651878, -0.00037805046304129064, -0.00037805046304129064,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.00037931298720650375, -0.00037805046304129064, -0.00037931298720650375,
-0.00037805046304129064, -0.0007567321881651878, -0.0007567321881651878, -6.31265379524848e-7,
-0.0007567321881651878, -0.0007567321881651878, -0.00037805046304129064,
-0.0007567321881651878, -0.0007567321881651878, -0.00037931298720650375,
-0.00037931298720650375, -6.31265379524848e-7, -0.0007567321881651878, -0.0007567321881651878,
-6.31265379524848e-7, -0.00037931298720650375, -0.0007567321881651878, -0.0007567321881651878,
-6.31265379524848e-7, -0.00037931298720650375, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.00037805046304129064,
-0.00037805046304129064, -0.00037931298720650375, -0.0007567321881651878,
-6.31265379524848e-7, -0.0007567321881651878, -0.00037805046304129064, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.00037931298720650375, -0.00037931298720650375, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.00037805046304129064, -6.31265379524848e-7,
-0.0007567321881651878, -0.0011354138841852546, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.00037805046304129064,
-0.0011354138841852546, -0.00037931298720650375, -0.00037931298720650375,
-0.0007567321881651878, -0.0007567321881651878, -6.31265379524848e-7, -0.0011354138841852546,
-0.0011354138841852546, -0.00037931298720650375, -0.0007567321881651878,
-0.00037931298720650375, -0.00037931298720650375, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.00037805046304129064,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007554696639999747, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0011354138841852546, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0011354138841852546,
-0.0007567321881651878, -0.0007567321881651878, -0.0011354138841852546,
-0.0011354138841852546, -0.0007567321881651878, -0.0011341513600200415,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0011354138841852546, -0.0007567321881651878, -0.0011354138841852546,
-0.0007567321881651878, -0.0011354138841852546, -0.00037931298720650375,
-0.0007567321881651878, -0.00151283317245543, -0.0011354138841852546, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0011354138841852546,
-0.0011354138841852546, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0011354138841852546, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0007567321881651878,
-0.0007567321881651878, -0.0007567321881651878, -0.0011354138841852546,
-0.0007567321881651878, -0.0007567321881651878, -0.0011341513600200415,
-0.0007567321881651878, -0.0007567321881651878, -0.0011341513600200415,
-0.0011354138841852546, -0.00151283317245543, -0.0011354138841852546, -0.0007567321881651878,
-0.0007567321881651878, -0.0011354138841852546, -0.0007567321881651878,
-0.0011354138841852546, -0.0011354138841852546, -0.0011354138841852546,
-0.0011354138841852546, -0.0011354138841852546, -0.0007567321881651878,
-0.0007567321881651878, -0.00151283317245543, -0.0011354138841852546, -0.0011354138841852546,
-0.0011354138841852546, -0.0007567321881651878, -0.0007567321881651878,
-0.0011354138841852546, -0.0011354138841852546, -0.0011354138841852546,
-0.0011341513600200415, -0.0011354138841852546, -0.0011354138841852546,
-0.0007567321881651878, -0.0007567321881651878, -0.0011354138841852546,
-0.0011354138841852546, -0.0011354138841852546, -0.0007567321881651878, -0.00151283317245543,
-0.0011354138841852546, -0.0011341513600200415, -0.0007567321881651878, -0.00151283317245543,
-0.00151283317245543, -0.00151283317245543, -0.0011354138841852546, -0.0007567321881651878,
-0.00151283317245543, -0.0011354138841852546, -0.0011354138841852546, -0.0011354138841852546,
-0.00151283317245543, -0.0011341513600200415, -0.0011341513600200415, -0.0011354138841852546,
-0.0011354138841852546, -0.0011354138841852546, -0.0011354138841852546,
-0.0007567321881651878, -0.00151283317245543, -0.00151283317245543, -0.0011354138841852546,
-0.00151283317245543, -0.00151283317245543, -0.0015140956966206431, -0.00151283317245543,
-0.0011354138841852546, -0.0011354138841852546, -0.0011354138841852546,
-0.0011354138841852546, -0.0011354138841852546, -0.0011341513600200415,
-0.0011354138841852546, -0.0011341513600200415, -0.0011354138841852546,
-0.0011354138841852546, -0.0011354138841852546, -0.0011354138841852546,
-0.0011354138841852546, -0.0011354138841852546, -0.0011354138841852546,
-0.0007567321881651878, -0.0015140956966206431, -0.0011354138841852546, -0.00151283317245543,
-0.00151283317245543, -0.0011354138841852546, -0.0011354138841852546, -0.00151283317245543,
-0.0007567321881651878, -0.0011354138841852546, -0.0011354138841852546,
-0.0007567321881651878, -0.00037931298720650375, -6.31265379524848e-7, 0.00037678793887607753,
0.0011328888358548284, 0.0022676715161651373, 0.0030237725004553795, 0.004535974469035864,
0.00566949462518096, 0.007181696128100157, 0.00831521674990654, 0.009828681126236916,
0.010962201282382011, 0.012474402785301208, 0.013986604288220406, 0.015876226127147675,
0.018144529312849045, 0.019656730815768242, 0.021925034001469612, 0.024193335324525833,
0.026839058846235275, 0.028729941695928574, 0.030998244881629944, 0.03591226786375046,
0.0385579913854599, 0.041582394391298294, 0.043850697576999664, 0.04725378379225731,
0.04989950358867645, 0.05292264744639397, 0.05594705045223236, 0.058972716331481934,
0.0623745396733284, 0.06577636301517487, 0.06917944550514221, 0.07258126884698868,
0.07598309218883514, 0.07976359874010086, 0.08354410529136658, 0.0873246043920517,
0.09110511094331741, 0.09488435089588165, 0.09904354065656662, 0.10358014702796936,
0.10736065357923508, 0.11113989353179932, 0.11529907584190369, 0.11983442306518555,
0.12437102943658829, 0.12853021919727325, 0.1330668181180954, 0.13722474873065948,
0.14251744747161865, 0.14743147790431976, 0.15158939361572266, 0.15688210725784302,
0.16141870617866516, 0.16671141982078552, 0.17162543535232544, 0.17653946578502655,
0.1818321794271469, 0.18712487816810608, 0.1920389086008072, 0.19733160734176636,
0.20338042080402374, 0.2086731195449829, 0.21358714997768402, 0.2196359634399414,
0.22492866218090057, 0.23097620904445648, 0.23626892268657684, 0.24193903803825378,
0.24836653470993042, 0.25403666496276855, 0.25932934880256653, 0.2653781771659851,
0.271425724029541, 0.27785319089889526, 0.28390201926231384, 0.289572149515152,
0.29599836468696594, 0.3024258613586426, 0.3084734082221985, 0.31490087509155273,
0.3220832049846649, 0.32850944995880127, 0.33493566513061523, 0.3413618803024292,
0.34778937697410583, 0.35459303855895996, 0.3610205054283142, 0.36782416701316833,
0.3742503821849823, 0.38143399357795715, 0.38861632347106934, 0.3950425386428833,
0.40260353684425354, 0.40940719842910767, 0.41659078001976013, 0.4230169951915741,
0.4305780231952667, 0.4377603530883789, 0.4449426829814911, 0.45250368118286133,
0.46006467938423157, 0.4668683409690857, 0.47442933917045593, 0.4816129505634308,
0.48917269706726074, 0.496733695268631, 0.5042946934700012, 0.5114770531654358,
0.5190380215644836, 0.526976466178894, 0.5341587662696838, 0.5424758791923523,
0.5496582388877869, 0.5579753518104553, 0.565536379814148, 0.5734747648239136,
0.581413209438324, 0.5889742374420166, 0.5969126224517822, 0.6048510670661926,
0.6131681799888611, 0.6207292079925537, 0.6290450692176819, 0.6366060376167297,
0.645300567150116, 0.6536176800727844, 0.660800039768219, 0.6698732376098633,
0.6774329543113708, 0.6857500672340393, 0.7020056247711182, 0.7099440693855286,
0.7186398506164551, 0.7265782952308655, 0.7345166802406311, 0.7428337931632996,
0.7515283226966858, 0.7598454356193542, 0.7677838802337646, 0.7768570780754089,
0.7847955226898193, 0.7934900522232056, 0.801428496837616, 0.8101230263710022,
0.8188175559043884, 0.8263785243034363, 0.8346956372261047, 0.843390166759491,
0.8513286113739014, 0.8600231409072876, 0.868340253829956, 0.8759012818336487,
0.8845958113670349, 0.8929129242897034, 0.9012300372123718, 0.9087897539138794,
0.9178629517555237, 0.9258013963699341, 0.9329850077629089, 0.9416795372962952,
0.9496179223060608, 0.9568015336990356, 0.9651173949241638, 0.9722996950149536,
0.9802393913269043, 0.9878004193305969, 0.9949827194213867, 1.0021663904190063,
1.0097260475158691, 1.0169097185134888, 1.0237133502960205, 1.0308955907821655,
1.037321925163269, 1.0433707237243652, 1.0497969388961792, 1.0558457374572754,
1.0615158081054688, 1.0679420232772827, 1.0732347965240479, 1.079283595085144,
1.0845762491226196, 1.0898690223693848, 1.094783067703247, 1.0996969938278198,
1.1053683757781982, 1.1102824211120605, 1.1151964664459229, 1.1193556785583496,
1.124269723892212, 1.1284288167953491, 1.1325868368148804, 1.1375008821487427,
1.1420373916625977, 1.1458178758621216, 1.1503545045852661, 1.15413498878479,
1.1582930088043213, 1.1620746850967407, 1.1666101217269897, 1.1707680225372314,
1.1749272346496582, 1.1790851354599, 1.1832430362701416, 1.1870235204696655,
1.1908040046691895, 1.1949632167816162, 1.199121117591858, 1.2032791376113892,
1.207059621810913, 1.210840106010437, 1.214620590209961, 1.2187784910202026,
1.2221803665161133, 1.226338267326355, 1.2304974794387817, 1.2338992357254028,
1.237302303314209, 1.2414603233337402, 1.2452408075332642, 1.249021291732788,
1.2524243593215942, 1.2562048435211182, 1.2599841356277466, 1.2633872032165527,
1.2671676874160767, 1.2713255882263184, 1.2743500471115112, 1.2777519226074219,
1.281153678894043, 1.2845567464828491, 1.2879586219787598, 1.2917391061782837,
1.2947635650634766, 1.2985440492630005, 1.3019458055496216, 1.3049702644348145,
1.3083733320236206, 1.3117750883102417, 1.3147995471954346, 1.3178240060806274,
1.3219819068908691, 1.3276519775390625, 1.3306764364242554, 1.3337007761001587,
1.3371026515960693, 1.3401269912719727, 1.3431514501571655, 1.3461757898330688,
1.3488215208053589, 1.3522247076034546, 1.354870319366455, 1.3575160503387451,
1.360540509223938, 1.363186240196228, 1.3658331632614136, 1.369613766670227,
1.371504545211792, 1.3745276927947998, 1.377174735069275, 1.3794430494308472,
1.3820887804031372, 1.3847345113754272, 1.3870028257369995, 1.3900271654129028,
1.392674207687378, 1.395319938659668, 1.3975881338119507, 1.4002338647842407,
1.4021247625350952, 1.4047704935073853, 1.4070388078689575, 1.4093071222305298,
1.411575436592102, 1.4138437509536743, 1.4164894819259644, 1.4183803796768188,
1.4206485748291016, 1.4225382804870605, 1.4248065948486328, 1.4266961812973022,
1.4297205209732056, 1.4312328100204468, 1.4331237077713013, 1.4350132942199707,
1.4365254640579224, 1.4387937784194946, 1.441062092781067, 1.4425742626190186,
1.4444639682769775, 1.4459761381149292, 1.4482444524765015, 1.450135350227356,
1.4516475200653076, 1.453537106513977, 1.4550492763519287, 1.45656156539917,
1.4584511518478394, 1.459963321685791, 1.4614756107330322, 1.4629877805709839,
1.4648773670196533, 1.4660121202468872, 1.4671469926834106, 1.4690377712249756,
1.4705500602722168, 1.4716835021972656, 1.4735743999481201, 1.4747079610824585,
1.475464105606079, 1.4773536920547485, 1.4781097173690796, 1.4796220064163208,
1.4803780317306519, 1.4815115928649902, 1.4826463460922241, 1.4841586351394653,
1.4849146604537964, 1.485670804977417, 1.4868042469024658, 1.4879378080368042,
1.488316535949707, 1.489451289176941, 1.4902074337005615, 1.4909634590148926,
1.4913408756256104, 1.4924744367599487, 1.4932305812835693, 1.4939866065979004,
1.4947439432144165, 1.495498776435852, 1.4958775043487549, 1.4966336488723755,
1.4973896741867065, 1.4977670907974243, 1.498523235321045, 1.4992793798446655,
1.4989006519317627, 1.4992793798446655, 1.5004128217697144, 1.5004128217697144,
1.5007915496826172, 1.5015476942062378, 1.5023037195205688, 1.5015476942062378,
1.5023037195205688, 1.5026824474334717, 1.5023037195205688, 1.503061056137085,
1.5034384727478027, 1.5034372806549072, 1.5030598640441895, 1.5030598640441895,
1.5038158893585205, 1.5038158893585205, 1.5038158893585205, 1.5045720338821411,
1.5034384727478027, 1.5041946172714233, 1.5038158893585205, 1.5038158893585205,
1.5038158893585205, 1.5038158893585205, 1.5034372806549072, 1.5034384727478027,
1.5030598640441895, 1.5030598640441895, 1.5026824474334717, 1.5026824474334717,
1.5023037195205688, 1.5023037195205688, 1.5015476942062378, 1.50117027759552,
1.5015476942062378, 1.5007915496826172, 1.5004141330718994, 1.5000367164611816,
1.4996579885482788, 1.4989019632339478, 1.498523235321045, 1.4981458187103271,
1.4977684020996094, 1.4973896741867065, 1.4966336488723755, 1.4958775043487549,
1.4958775043487549, 1.4951213598251343, 1.4951213598251343, 1.4939879179000854,
1.4939879179000854, 1.4932317733764648, 1.492097020149231, 1.4917196035385132,
1.4909634590148926, 1.4905848503112793, 1.4898287057876587, 1.4890738725662231,
1.488316535949707, 1.4871829748153687, 1.4871829748153687, 1.486426830291748,
1.4860494136810303, 1.4849146604537964, 1.4841586351394653, 1.4837812185287476,
1.4826463460922241, 1.481890320777893, 1.4815129041671753, 1.480000615119934,
1.479244589805603, 1.4788658618927002, 1.4777323007583618, 1.4769762754440308,
1.4762201309204102, 1.475464105606079, 1.4747079610824585, 1.473951816558838,
1.4731957912445068, 1.4724396467208862, 1.4709274768829346, 1.4705500602722168,
1.4697939157485962, 1.4686591625213623, 1.467525601387024, 1.4667695760726929,
1.4656360149383545, 1.4648798704147339, 1.4648798704147339, 1.4633677005767822,
1.4626115560531616, 1.4626115560531616, 1.46109938621521, 1.4607206583023071,
1.4595859050750732, 1.4588298797607422, 1.4580737352371216, 1.4569401741027832,
1.4558054208755493, 1.454671859741211, 1.453537106513977, 1.4524036645889282,
1.4520249366760254, 1.4508901834487915, 1.450135350227356, 1.4493792057037354,
1.4482444524765015, 1.4474883079528809, 1.4463547468185425, 1.4459773302078247,
1.4448425769805908, 1.4440877437591553, 1.4429529905319214, 1.4421968460083008,
1.441063404083252, 1.4399298429489136, 1.4395511150360107, 1.438417673110962,
1.4376615285873413, 1.4369053840637207, 1.435393214225769, 1.4342596530914307,
1.4338810443878174, 1.4327462911605835, 1.432747483253479, 1.4301005601882935,
1.4293444156646729, 1.4278322458267212, 1.4266986846923828, 1.4259425401687622,
1.4244303703308105, 1.4229182004928589, 1.4206498861312866, 1.419137716293335,
1.4176255464553833, 1.415357232093811, 1.413467526435852, 1.4111992120742798,
1.4081748723983765, 1.4055278301239014, 1.403638243675232, 1.4006139039993286,
1.3975894451141357, 1.3949437141418457, 1.3919193744659424, 1.3892723321914673,
1.3866266012191772, 1.383602261543274, 1.381712555885315, 1.3783107995986938,
1.3756637573242188, 1.3730180263519287, 1.3707497119903564, 1.3677253723144531,
1.365078330039978, 1.362432599067688, 1.3597856760025024, 1.3571399450302124,
1.3541154861450195, 1.3518472909927368, 1.3492015600204468, 1.346177101135254,
1.3439087867736816, 1.3416404724121094, 1.338616132736206, 1.3363478183746338,
1.3337020874023438, 1.3310550451278687, 1.3284093141555786, 1.3257637023925781,
1.3234953880310059, 1.3208483457565308, 1.3182026147842407, 1.3159343004226685,
1.3129099607467651, 1.3106416463851929, 1.3083733320236206, 1.3061050176620483,
1.3034592866897583, 1.3008123636245728, 1.2981666326522827, 1.2958983182907104,
1.2936300039291382, 1.2906055450439453, 1.2887159585952759, 1.2868250608444214,
1.2841793298721313, 1.281154990196228, 1.2788866758346558, 1.2766183614730835,
1.2739713191986084, 1.2717043161392212, 1.2690573930740356, 1.2671676874160767,
1.2645207643508911, 1.261875033378601, 1.2596067190170288, 1.2573384046554565,
1.2546913623809814, 1.252801775932312, 1.250156044960022, 1.2478877305984497,
1.2459968328475952, 1.2433512210845947, 1.2410829067230225, 1.2388145923614502,
1.2361688613891602, 1.233900547027588, 1.2316322326660156, 1.2293639183044434,
1.2267169952392578, 1.224449872970581, 1.2221815586090088, 1.2202907800674438,
1.2176450490951538, 1.2157541513442993, 1.2138644456863403, 1.2112187147140503,
1.2093279361724854, 1.2066822052001953, 1.2040351629257202, 1.2021455764770508,
1.2002546787261963, 1.1972302198410034, 1.195340633392334, 1.1930723190307617,
1.1908040046691895, 1.1885356903076172, 1.1862674951553345, 1.1839991807937622,
1.18173086643219, 1.179841160774231, 1.1779515743255615, 1.1756820678710938,
1.1730363368988037, 1.1707680225372314, 1.1666101217269897, 1.1647192239761353,
1.1620734930038452, 1.159805178642273, 1.1579155921936035, 1.1564033031463623,
1.1537563800811768, 1.1518667936325073, 1.149598479270935, 1.14695143699646,
1.1450618505477905, 1.1427935361862183, 1.1412813663482666, 1.1390130519866943,
1.136744737625122, 1.134099006652832, 1.1322081089019775, 1.130318522453308,
1.1280502080917358, 1.1265380382537842, 1.1238923072814941, 1.1216239929199219,
1.1201118230819702, 1.1182209253311157, 1.1159526109695435, 1.1140629053115845,
1.1117947101593018, 1.1099050045013428, 1.107635498046875, 1.105745792388916,
1.1034775972366333, 1.1015878915786743, 1.099319577217102, 1.0978074073791504,
1.0951604843139648, 1.0932707786560059, 1.0917586088180542, 1.089490294456482,
1.0872219800949097, 1.0853310823440552, 1.083064079284668, 1.0815519094467163,
1.0789048671722412, 1.0777714252471924, 1.0755031108856201, 1.0732347965240479,
1.0709664821624756, 1.069454312324524, 1.0671859979629517, 1.0656737089157104,
1.0634055137634277, 1.0607597827911377, 1.0592474937438965, 1.0577353239059448,
1.0554670095443726, 1.053954839706421, 1.0516865253448486, 1.0494182109832764,
1.048284649848938, 1.0452589988708496, 1.043748140335083, 1.0422358512878418,
1.0403449535369873, 1.0380767583847046, 1.0365644693374634, 1.0342961549758911,
1.0320279598236084, 1.0301382541656494, 1.0286260843276978, 1.0263577699661255,
1.0248456001281738, 1.0229547023773193, 1.02106511592865, 1.019175410270691,
1.0172845125198364, 1.0153937339782715, 1.0135040283203125, 1.0119918584823608,
1.0097248554229736, 1.0078339576721191, 1.0063217878341675, 1.0040534734725952,
1.0021637678146362, 1.0006515979766846, 0.9983832836151123, 0.9968711137771606,
0.9949802160263062, 0.9930905699729919, 0.9911997318267822, 0.9900661706924438,
0.9874204993247986, 0.9855296015739441, 0.9840173721313477, 0.9817490577697754,
0.9802368879318237, 0.9783472418785095, 0.9768350720405579, 0.9745667576789856,
0.9730545282363892, 0.9715423583984375, 0.9692740440368652, 0.9681405425071716,
0.9658722281455994, 0.9647374153137207, 0.9620917439460754, 0.960579514503479,
0.9590673446655273, 0.9567990303039551, 0.9549093842506409, 0.9533972144126892,
0.9515063166618347
],
"dev": 4,
"shot": 4712,
"time": [
-8000, -7987.099999999999, -7974.2, -7961.299999999999, -7948.400000000001, -7935.5, -7922.6,
-7909.7, -7896.8, -7883.9, -7871, -7858.1, -7845.2, -7832.3, -7819.4, -7806.5,
-7793.599999999999, -7780.700000000001, -7767.8, -7754.900000000001, -7742,
-7729.099999999999, -7716.2, -7703.299999999999, -7690.400000000001, -7677.5, -7664.6,
-7651.7, -7638.8, -7625.9, -7613, -7600.1, -7587.2, -7574.3, -7561.4, -7548.5,
-7535.599999999999, -7522.700000000001, -7509.8, -7496.900000000001, -7484,
-7471.099999999999, -7458.2, -7445.299999999999, -7432.400000000001, -7419.5, -7406.6,
-7393.7, -7380.8, -7367.9, -7355, -7342.1, -7329.2, -7316.3, -7303.4, -7290.5,
-7277.599999999999, -7264.700000000001, -7251.8, -7238.900000000001, -7226,
-7213.099999999999, -7200.2, -7187.299999999999, -7174.400000000001, -7161.5, -7148.6,
-7135.7, -7122.8, -7109.9, -7097, -7084.1, -7071.2, -7058.3, -7045.4, -7032.5,
-7019.599999999999, -7006.700000000001, -6993.8, -6980.900000000001, -6968,
-6955.099999999999, -6942.2, -6929.299999999999, -6916.400000000001, -6903.5, -6890.6,
-6877.7, -6864.8, -6851.9, -6839, -6826.1, -6813.2, -6800.3, -6787.4, -6774.5,
-6761.599999999999, -6748.700000000001, -6735.8, -6722.900000000001, -6710,
-6697.099999999999, -6684.2, -6671.299999999999, -6658.400000000001, -6645.5, -6632.6,
-6619.7, -6606.8, -6593.9, -6581, -6568.1, -6542.3, -6529.4, -6516.5, -6503.599999999999,
-6490.700000000001, -6477.8, -6464.9, -6452, -6439.099999999999, -6426.2, -6413.299999999999,
-6400.400000000001, -6387.5, -6374.6, -6361.7, -6348.8, -6335.9, -6323, -6310.1, -6297.2,
-6284.3, -6271.4, -6258.5, -6245.599999999999, -6232.700000000001, -6219.8, -6206.9, -6194,
-6181.099999999999, -6168.2, -6155.3, -6142.400000000001, -6129.5, -6116.6, -6103.7, -6090.8,
-6077.9, -6065, -6052.1, -6039.2, -6026.3, -6013.4, -6000.5, -5987.599999999999,
-5974.700000000001, -5961.8, -5948.9, -5936, -5923.099999999999, -5910.2, -5897.3,
-5884.400000000001, -5871.5, -5858.6, -5845.7, -5832.8, -5819.9, -5807, -5794.1, -5781.2,
-5768.3, -5755.4, -5742.5, -5729.599999999999, -5716.700000000001, -5703.8, -5690.9, -5678,
-5665.099999999999, -5652.2, -5639.3, -5626.400000000001, -5613.5, -5600.6, -5587.7, -5574.8,
-5561.9, -5549, -5536.1, -5523.2, -5510.3, -5497.4, -5484.5, -5471.599999999999,
-5458.700000000001, -5445.8, -5432.9, -5420, -5407.099999999999, -5394.2, -5381.3,
-5368.400000000001, -5355.5, -5342.6, -5329.7, -5316.8, -5303.9, -5291, -5278.1, -5265.2,
-5252.3, -5239.4, -5226.5, -5213.599999999999, -5200.700000000001, -5187.8, -5174.9, -5162,
-5149.099999999999, -5136.2, -5123.3, -5097.5, -5084.6, -5071.7, -5058.8, -5045.9, -5033,
-5020.1, -5007.2, -4994.3, -4981.4, -4968.5, -4955.599999999999, -4942.700000000001, -4929.8,
-4916.9, -4904, -4891.099999999999, -4878.2, -4865.3, -4852.400000000001, -4839.5, -4826.6,
-4813.7, -4800.8, -4787.9, -4775, -4762.1, -4749.2, -4736.3, -4723.4, -4710.5, -4697.6,
-4684.700000000001, -4671.8, -4658.9, -4646, -4633.099999999999, -4620.2, -4607.3,
-4594.400000000001, -4581.5, -4568.6, -4555.7, -4542.799999999999, -4529.9, -4517, -4504.1,
-4491.2, -4478.3, -4465.4, -4452.5, -4439.6, -4426.700000000001, -4413.8, -4400.9, -4388,
-4375.099999999999, -4362.2, -4349.3, -4336.400000000001, -4323.5, -4310.6, -4297.7,
-4284.799999999999, -4271.9, -4259, -4246.1, -4233.2, -4220.3, -4207.4, -4194.5, -4181.6,
-4168.700000000001, -4155.8, -4142.9, -4130, -4117.099999999999, -4104.2, -4091.3, -4078.4,
-4065.5, -4052.6, -4039.7, -4026.7999999999997, -4013.8999999999996, -4001.0000000000005,
-3988.1000000000004, -3975.2000000000003, -3962.2999999999997, -3949.3999999999996, -3936.5,
-3923.6, -3910.7, -3897.8, -3884.9, -3872, -3859.1000000000004, -3846.2000000000003,
-3833.2999999999997, -3820.3999999999996, -3807.5, -3794.6, -3781.7, -3768.8, -3755.9, -3743,
-3730.1000000000004, -3717.2000000000003, -3704.2999999999997, -3691.3999999999996, -3678.5,
-3652.7, -3639.8, -3626.9, -3614, -3601.1000000000004, -3588.2000000000003,
-3575.2999999999997, -3562.3999999999996, -3549.5, -3536.6, -3523.7, -3510.8, -3497.9, -3485,
-3472.1000000000004, -3459.2000000000003, -3446.2999999999997, -3433.3999999999996, -3420.5,
-3407.6, -3394.7, -3381.8, -3368.9, -3356, -3343.1000000000004, -3330.2000000000003,
-3317.2999999999997, -3304.3999999999996, -3291.5, -3278.6, -3265.7, -3252.8, -3239.9, -3227,
-3214.1000000000004, -3201.2, -3188.2999999999997, -3175.3999999999996, -3162.5, -3149.6,
-3136.7, -3123.8, -3110.9, -3098, -3085.1000000000004, -3072.2, -3059.2999999999997, -3046.4,
-3033.5, -3020.6, -3007.7, -2994.8, -2981.9, -2969, -2956.1000000000004, -2943.2,
-2930.2999999999997, -2917.4, -2904.5, -2891.6, -2878.7, -2865.8, -2852.9, -2840,
-2827.1000000000004, -2814.2, -2801.2999999999997, -2788.4, -2775.5, -2762.6, -2749.7,
-2736.8, -2723.9, -2711, -2698.1000000000004, -2685.2, -2672.2999999999997, -2659.4, -2646.5,
-2633.6, -2620.7, -2607.8, -2594.9, -2582, -2569.1000000000004, -2556.2, -2543.2999999999997,
-2530.4, -2517.5, -2504.6, -2491.7, -2478.8, -2465.9, -2453, -2440.1000000000004, -2427.2,
-2414.2999999999997, -2401.4, -2388.5, -2375.6, -2362.7, -2349.8, -2336.9, -2324,
-2311.1000000000004, -2298.2, -2285.2999999999997, -2272.4, -2259.5, -2246.6, -2233.7,
-2207.9, -2195, -2182.1000000000004, -2169.2, -2156.2999999999997, -2143.4, -2130.5, -2117.6,
-2104.7, -2091.8, -2078.9, -2066, -2053.1000000000004, -2040.2, -2027.3, -2014.4, -2001.5,
-1988.6, -1975.7, -1962.8000000000002, -1949.8999999999999, -1937, -1924.1, -1911.2,
-1898.3000000000002, -1885.3999999999999, -1872.5, -1859.6, -1846.7, -1833.8000000000002,
-1820.8999999999999, -1808, -1795.1, -1782.2, -1769.3000000000002, -1756.3999999999999,
-1743.5, -1730.6, -1717.7, -1704.8000000000002, -1691.8999999999999, -1679, -1666.1, -1653.2,
-1640.3000000000002, -1627.3999999999999, -1614.5, -1601.6, -1588.7, -1575.8000000000002,
-1562.8999999999999, -1550, -1537.1, -1524.2, -1511.3000000000002, -1498.3999999999999,
-1485.5, -1472.6, -1459.7, -1446.8000000000002, -1433.8999999999999, -1421, -1408.1, -1395.2,
-1382.3000000000002, -1369.3999999999999, -1356.5, -1343.6, -1330.7, -1317.8000000000002,
-1304.8999999999999, -1292, -1279.1, -1266.2, -1253.3000000000002, -1240.3999999999999,
-1227.5, -1214.6, -1201.7, -1188.8000000000002, -1175.8999999999999, -1163, -1150.1, -1137.2,
-1124.3000000000002, -1111.3999999999999, -1098.5, -1085.6, -1072.7, -1059.8000000000002,
-1046.8999999999999, -1034, -1021.0999999999999, -1008.1999999999999, -995.3,
-982.4000000000001, -969.5, -956.6, -943.6999999999999, -930.8, -917.9000000000001, -905,
-892.1, -879.1999999999999, -866.3, -853.4000000000001, -840.5, -827.6, -814.6999999999999,
-801.8, -788.9000000000001, -763.1, -750.1999999999999, -737.3, -724.4000000000001, -711.5,
-698.6, -685.6999999999999, -672.8, -659.9000000000001, -647, -634.1, -621.1999999999999,
-608.3, -595.4000000000001, -582.5, -569.6, -556.6999999999999, -543.8, -530.9000000000001,
-518, -505.09999999999997, -492.20000000000005, -479.3, -466.4, -453.5, -440.59999999999997,
-427.70000000000005, -414.8, -401.9, -389, -376.09999999999997, -363.20000000000005, -350.3,
-337.4, -324.5, -311.59999999999997, -298.70000000000005, -285.8, -272.9, -260, -247.1,
-234.2, -221.29999999999998, -208.4, -195.5, -182.60000000000002, -169.7, -156.79999999999998,
-143.9, -131, -118.1, -105.2, -92.3, -79.39999999999999, -66.5, -53.6, -40.7,
-27.799999999999997, -14.9, -2, 10.9, 23.8, 36.7, 49.6, 62.5, 75.39999999999999, 88.3, 101.2,
114.1, 127, 139.9, 152.79999999999998, 165.7, 178.60000000000002, 191.5, 204.4,
217.29999999999998, 230.2, 243.10000000000002, 256, 268.9, 281.8, 294.70000000000005,
307.59999999999997, 320.5, 333.4, 346.3, 359.20000000000005, 372.09999999999997, 385, 397.9,
410.8, 423.70000000000005, 436.59999999999997, 449.5, 462.4, 475.3, 488.20000000000005,
501.09999999999997, 514, 526.9000000000001, 539.8, 552.6999999999999, 565.6, 578.5,
591.4000000000001, 604.3, 617.1999999999999, 630.1, 643, 655.9000000000001, 681.6999999999999,
694.6, 707.5, 720.4000000000001, 733.3, 746.1999999999999, 759.1, 772, 784.9000000000001,
797.8, 810.6999999999999, 823.6, 836.5, 849.4000000000001, 862.3, 875.1999999999999, 888.1,
901, 913.9000000000001, 926.8, 939.6999999999999, 952.6, 965.5, 978.4000000000001, 991.3,
1004.1999999999999, 1017.0999999999999, 1030, 1042.8999999999999, 1055.8000000000002, 1068.7,
1081.6, 1094.5, 1107.3999999999999, 1120.3000000000002, 1133.2, 1146.1, 1159,
1171.8999999999999, 1184.8000000000002, 1197.7, 1210.6, 1223.5, 1236.3999999999999,
1249.3000000000002, 1262.2, 1275.1, 1288, 1300.8999999999999, 1313.8000000000002, 1326.7,
1339.6, 1352.5, 1365.3999999999999, 1378.3000000000002, 1391.2, 1404.1, 1417,
1429.8999999999999, 1442.8000000000002, 1455.7, 1468.6, 1481.5, 1494.3999999999999,
1507.3000000000002, 1520.2, 1533.1, 1546, 1558.8999999999999, 1571.8000000000002, 1584.7,
1597.6, 1610.5, 1623.3999999999999, 1636.3000000000002, 1649.2, 1662.1, 1675,
1687.8999999999999, 1700.8000000000002, 1713.7, 1726.6, 1739.5, 1752.3999999999999,
1765.3000000000002, 1778.2, 1791.1, 1804, 1816.8999999999999, 1829.8000000000002, 1842.7,
1855.6, 1868.5, 1881.3999999999999, 1894.3000000000002, 1907.2, 1920.1, 1933,
1945.8999999999999, 1958.8000000000002, 1971.7, 1984.6, 1997.5, 2010.4, 2023.3, 2036.2,
2049.1000000000004, 2062, 2074.9, 2087.8, 2100.7, 2126.5, 2139.4, 2152.2999999999997, 2165.2,
2178.1000000000004, 2191, 2203.9, 2216.8, 2229.7, 2242.6, 2255.5, 2268.4, 2281.2999999999997,
2294.2, 2307.1000000000004, 2320, 2332.9, 2345.8, 2358.7, 2371.6, 2384.5, 2397.4,
2410.2999999999997, 2423.2, 2436.1000000000004, 2449, 2461.9, 2474.8, 2487.7, 2500.6, 2513.5,
2526.4, 2539.2999999999997, 2552.2, 2565.1000000000004, 2578, 2590.9, 2603.8, 2616.7, 2629.6,
2642.5, 2655.4, 2668.2999999999997, 2681.2, 2694.1000000000004, 2707, 2719.9, 2732.8, 2745.7,
2758.6, 2771.5, 2784.4, 2797.2999999999997, 2810.2, 2823.1000000000004, 2836, 2848.9, 2861.8,
2874.7, 2887.6, 2900.5, 2913.4, 2926.2999999999997, 2939.2, 2952.1000000000004, 2965, 2977.9,
2990.8, 3003.7, 3016.6, 3029.5, 3042.4, 3055.2999999999997, 3068.2, 3081.1000000000004, 3094,
3106.9, 3119.8, 3132.7, 3145.6, 3158.5, 3171.4, 3184.2999999999997, 3197.2,
3210.1000000000004, 3223, 3235.9, 3248.8, 3261.7, 3274.6, 3287.5, 3300.3999999999996,
3313.2999999999997, 3326.2, 3339.1000000000004, 3352, 3364.9, 3377.8, 3390.7, 3403.6, 3416.5,
3429.3999999999996, 3442.2999999999997, 3455.2000000000003, 3468.1000000000004, 3481, 3493.9,
3506.8, 3519.7, 3532.6, 3545.5, 3571.2999999999997, 3584.2000000000003, 3597.1000000000004,
3610, 3622.9, 3635.8, 3648.7, 3661.6, 3674.5, 3687.3999999999996, 3700.2999999999997,
3713.2000000000003, 3726.1000000000004, 3739, 3751.9, 3764.8, 3777.7, 3790.6, 3803.5,
3816.3999999999996, 3829.2999999999997, 3842.2000000000003, 3855.1000000000004, 3868, 3880.9,
3893.8, 3906.7, 3919.6, 3932.5, 3945.3999999999996, 3958.2999999999997, 3971.2000000000003,
3984.1000000000004, 3997, 4009.9, 4022.8, 4035.7000000000003, 4048.6000000000004,
4061.4999999999995, 4074.3999999999996, 4087.2999999999997, 4100.2, 4113.1, 4126, 4138.9,
4151.799999999999, 4164.7, 4177.6, 4190.5, 4203.400000000001, 4216.3, 4229.2,
4242.099999999999, 4255, 4267.9, 4280.8, 4293.700000000001, 4306.6, 4319.5, 4332.4, 4345.3,
4358.2, 4371.1, 4384, 4396.9, 4409.799999999999, 4422.7, 4435.6, 4448.5, 4461.400000000001,
4474.3, 4487.2, 4500.099999999999, 4513, 4525.9, 4538.8, 4551.700000000001, 4564.6, 4577.5,
4590.4, 4603.3, 4616.2, 4629.1, 4642, 4654.9, 4667.799999999999, 4680.7, 4693.6, 4706.5,
4719.400000000001, 4732.3, 4745.2, 4758.099999999999, 4771, 4783.9, 4796.8, 4809.700000000001,
4822.6, 4835.5, 4848.4, 4861.3, 4874.2, 4887.1, 4900, 4912.9, 4925.8, 4938.7, 4951.6, 4964.5,
4977.400000000001, 4990.3
],
"time_unit": "ms"
},
{
"chnl": "BT1_2M",
"chnl_id": 4741,
"dat_unit": "T",
"data": [
0.0003748245071619749, -0.00037091693957336247, 9.768938298293506e-7, -0.0003728707379195839,
-0.00037091693957336247, 9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7,
9.768938298293506e-7, 9.768938298293506e-7, -0.00037091693957336247, -0.00037091693957336247,
-0.00037091693957336247, 9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7,
9.768938298293506e-7, 9.768938298293506e-7, -0.00037091693957336247, 9.768938298293506e-7,
9.768938298293506e-7, -0.0003728707379195839, -0.00037091693957336247,
-0.00037091693957336247, 9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7,
9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7, -0.0003728707379195839,
9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7,
9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7,
-0.00037091693957336247, 9.768938298293506e-7, -0.0003728707379195839,
-0.00037091693957336247, 9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7,
0.000002930681375801214, 0.0003748245071619749, 9.768938298293506e-7, 9.768938298293506e-7,
9.768938298293506e-7, 0.0003748245071619749, -0.00037091693957336247, 9.768938298293506e-7,
9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7, 0.0003728707379195839,
9.768938298293506e-7, -0.0003728707379195839, 9.768938298293506e-7, 9.768938298293506e-7,
0.0003748245071619749, 9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7,
9.768938298293506e-7, 0.0003748245071619749, 9.768938298293506e-7, 9.768938298293506e-7,
-0.00037091693957336247, 0.0003748245071619749, 0.0003728707379195839,
-0.00037091693957336247, 9.768938298293506e-7, 0.0003748245071619749, 0.0003748245071619749,
0.0003748245071619749, 0.0003728707379195839, 0.0003748245071619749, 0.0003748245071619749,
0.0003748245071619749, 0.0003748245071619749, 9.768938298293506e-7, 0.0003748245071619749,
0.0003728707379195839, 9.768938298293506e-7, 9.768938298293506e-7, 9.768938298293506e-7,
9.768938298293506e-7, 0.0003728707379195839, 9.768938298293506e-7, 9.768938298293506e-7,
0.0003748245071619749, 9.768938298293506e-7, 0.0003748245071619749, 0.0003748245071619749,
0.0003748245071619749, 9.768938298293506e-7, 0.0003748245071619749, 9.768938298293506e-7,
0.0007467183750122786, 0.0003748245071619749, 0.0003728707379195839, 0.0007467183750122786,
9.768938298293506e-7, 0.0007467183750122786, 9.768938298293506e-7, 0.0007467183750122786,
9.768938298293506e-7, 0.0007467183750122786, 9.768938298293506e-7, 0.0007467183750122786,
0.0003748245071619749, 0.0007467183750122786, 0.0007467183750122786, 9.768938298293506e-7,
0.0003728707379195839, 0.0011205659247934818, 9.768938298293506e-7, 0.0003748245071619749,
0.0007467183750122786, 0.0003748245071619749, 0.0011205659247934818, 0.0007467183750122786,
0.0007467183750122786, 0.0003748245071619749, 0.0007467183750122786, 9.768938298293506e-7,
0.0003748245071619749, 9.768938298293506e-7, 9.768938298293506e-7, 0.0003748245071619749,
0.0003748245071619749, 0.0007467183750122786, 0.0007467183750122786, 0.0003748245071619749,
9.768938298293506e-7, 0.0003748245071619749, 0.0007467183750122786, 0.0007467183750122786,
0.0003748245071619749, 0.0003748245071619749, 0.0003748245071619749, 9.768938298293506e-7,
0.0003748245071619749, 0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786,
0.0003748245071619749, 0.0003728707379195839, 0.0003748245071619749, 0.0003748245071619749,
0.0007467183750122786, 0.0011205659247934818, 0.0007467183750122786, 0.0007467183750122786,
0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786,
0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786, 0.0003748245071619749,
0.0007467183750122786, 0.0003748245071619749, 0.0003748245071619749, 0.0007467183750122786,
0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786, 0.0003748245071619749,
0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786, 0.0003748245071619749,
0.0003748245071619749, 0.0007467183750122786, 0.0007467183750122786, 0.0003748245071619749,
0.0007467183750122786, 0.0003748245071619749, 0.0003748245071619749, 0.0007467183750122786,
0.0011205659247934818, 0.0003748245071619749, 0.0011205659247934818, 0.0007467183750122786,
0.0007467183750122786, 0.0011205659247934818, 0.0011205659247934818, 0.0007467183750122786,
0.0007467183750122786, 0.0011205659247934818, 0.0003748245071619749, 0.0007467183750122786,
0.0007486721151508391, 0.0007467183750122786, 0.0007467183750122786, 0.0011205659247934818,
0.0003748245071619749, 0.0007467183750122786, 0.0003748245071619749, 0.0007486721151508391,
0.0003748245071619749, 0.0007467183750122786, 0.0007467183750122786, 0.0003748245071619749,
0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786,
0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786, 0.0014924597926437855,
0.0011186121264472604, 0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786,
0.0011205659247934818, 0.0007467183750122786, 0.0011205659247934818, 0.0007467183750122786,
0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786,
0.0007467183750122786, 0.0007467183750122786, 0.0011205659247934818, 0.0011205659247934818,
0.0007467183750122786, 0.0007467183750122786, 0.0014924597926437855, 0.0011205659247934818,
0.0007467183750122786, 0.0007467183750122786, 0.0014924597926437855, 0.0007467183750122786,
0.0007467183750122786, 0.0007467183750122786, 0.0011205659247934818, 0.0007467183750122786,
0.0007467183750122786, 0.0014924597926437855, 0.0011205659247934818, 0.0007467183750122786,
0.0007467183750122786, 0.0011205659247934818, 0.0011205659247934818, 0.0014924597926437855,
0.0007467183750122786, 0.0007467183750122786, 0.0007467183750122786, 0.0011186121264472604,
0.0011186121264472604, 0.0011186121264472604, 0.0014924597926437855, 0.0011205659247934818,
0.0011205659247934818, 0.0007467183750122786, 0.0011205659247934818, 0.0011186121264472604,
0.0007467183750122786, 0.0011205659247934818, 0.0014924597926437855, 0.0011205659247934818,
0.0011186121264472604, 0.0007467183750122786, 0.0011205659247934818, 0.0011186121264472604,
0.0011205659247934818, 0.0011205659247934818, 0.0011205659247934818, 0.0011186121264472604,
0.0007467183750122786, 0.0011186121264472604, 0.0014924597926437855, 0.0014924597926437855,
0.0007467183750122786, 0.0007467183750122786, 0.0011205659247934818, 0.0014924597926437855,
0.0011205659247934818, 0.0014924597926437855, 0.0011205659247934818, 0.0007467183750122786,
0.0011186121264472604, 0.0014924597926437855, 0.0007467183750122786, 0.0011186121264472604,
0.0011205659247934818, 0.0018663074588403106, 0.0007467183750122786, 0.0014924597926437855,
0.0011186121264472604, 0.0011186121264472604, 0.0014924597926437855, 0.0011205659247934818,
0.0014924597926437855, 0.0014924597926437855, 0.0007467183750122786, 0.0014924597926437855,
0.0011205659247934818, 0.0011186121264472604, 0.0014924597926437855, 0.0011186121264472604,
0.0014924597926437855, 0.0018663074588403106, 0.0022382012102752924, 0.0022382012102752924,
0.0029839426279067993, 0.00372968427836895, 0.0041015781462192535, 0.005221167113631964,
0.005966908764094114, 0.0070864977315068245, 0.008204133249819279, 0.009695615619421005,
0.010815205052495003, 0.01230668742209673, 0.01379817072302103, 0.01566154696047306,
0.01752687804400921, 0.01901836134493351, 0.02050984464585781, 0.022747067734599113,
0.024984292685985565, 0.026849623769521713, 0.029086846858263016, 0.03132406994700432,
0.03356129676103592, 0.03915337845683098, 0.04139255732297897, 0.044375523924827576,
0.04735849052667618, 0.05034145712852478, 0.05295252799987793, 0.05593549460172653,
0.05929035320878029, 0.06190142408013344, 0.06563013046979904, 0.06935884058475494,
0.0727156549692154, 0.075698621571064, 0.0794273242354393, 0.08278413861989975,
0.08651284873485565, 0.0906153991818428, 0.0943441092967987, 0.09844470769166946,
0.10217536985874176, 0.10590407997369766, 0.11037852615118027, 0.11485297977924347,
0.11858168244361877, 0.12268424034118652, 0.12790443003177643, 0.13200698792934418,
0.13648143410682678, 0.1409558802843094, 0.14580418169498444, 0.15027862787246704,
0.15549881756305695, 0.160347118973732, 0.1648215651512146, 0.1700417548418045,
0.17489004135131836, 0.18011023104190826, 0.18533042073249817, 0.19092446565628052,
0.19539891183376312, 0.20099295675754547, 0.20695888996124268, 0.21217907965183258,
0.21777310967445374, 0.22336715459823608, 0.22896118462085724, 0.2345532774925232,
0.2397734671831131, 0.24536749720573425, 0.25133344531059265, 0.2576732039451599,
0.2636391520500183, 0.2696050703525543, 0.27594485878944397, 0.2815389037132263,
0.28750482201576233, 0.29421648383140564, 0.30018436908721924, 0.3065222203731537,
0.3124881386756897, 0.31957367062568665, 0.3259134292602539, 0.3326251208782196,
0.3385910391807556, 0.3453027307987213, 0.3516424894332886, 0.3591018617153168,
0.36506780982017517, 0.3725252151489258, 0.3792368769645691, 0.38557666540145874,
0.39228832721710205, 0.39974576234817505, 0.40645939111709595, 0.4135448932647705,
0.42062845826148987, 0.4277139902114868, 0.4347994923591614, 0.4422569274902344,
0.4497162997722626, 0.45679986476898193, 0.4638834297657013, 0.47097089886665344,
0.4788002073764801, 0.4862595796585083, 0.49334314465522766, 0.5011743903160095,
0.5086318254470825, 0.5164631009101868, 0.5235486030578613, 0.5317517518997192,
0.5392091870307922, 0.5470404624938965, 0.5544978380203247, 0.562329113483429,
0.569786548614502, 0.5779896974563599, 0.5861948132514954, 0.5936521887779236,
0.6014834642410278, 0.6096866130828857, 0.6178917288780212, 0.6253491640090942,
0.6335523128509521, 0.6413835883140564, 0.6495867371559143, 0.6577898859977722,
0.6659930348396301, 0.673826277256012, 0.6824012994766235, 0.690606415271759,
0.7066388726234436, 0.7152158617973328, 0.723047137260437, 0.7316241264343262,
0.7394554018974304, 0.748404324054718, 0.7562355399131775, 0.7648125886917114,
0.7730157375335693, 0.7815927267074585, 0.7897958755493164, 0.7983728647232056,
0.8065779805183411, 0.814781129360199, 0.8233581781387329, 0.8315613269805908,
0.8397644758224487, 0.8490872383117676, 0.856918454170227, 0.865495502948761,
0.8733248114585876, 0.8819018006324768, 0.889733076095581, 0.8983080983161926,
0.9065132141113281, 0.9143444895744324, 0.9225456714630127, 0.9307507872581482,
0.9378362894058228, 0.9467852115631104, 0.9546164870262146, 0.9620738625526428,
0.9702770113945007, 0.978108286857605, 0.985565721988678, 0.9933969974517822,
1.0008543729782104, 1.0079379081726074, 1.0150234699249268, 1.0221070051193237,
1.029192566871643, 1.0355323553085327, 1.0422459840774536, 1.0489577054977417,
1.0549235343933105, 1.0612633228302002, 1.0672292709350586, 1.0731971263885498,
1.0791630744934082, 1.084383249282837, 1.0907230377197266, 1.095569372177124,
1.1004177331924438, 1.1056379079818726, 1.1112319231033325, 1.115706443786621,
1.1205546855926514, 1.1250290870666504, 1.129503607749939, 1.133978009223938,
1.1384525299072266, 1.1429269313812256, 1.1466556787490845, 1.1515039205551147,
1.1556065082550049, 1.160080909729004, 1.1638096570968628, 1.1682840585708618,
1.1720128059387207, 1.1761153936386108, 1.1809617280960083, 1.1843185424804688,
1.1884210109710693, 1.192895531654358, 1.1966242790222168, 1.2007248401641846,
1.2044554948806763, 1.208556056022644, 1.2126586437225342, 1.2167612314224243,
1.2204898595809937, 1.224590539932251, 1.2286930084228516, 1.2320479154586792,
1.2365243434906006, 1.2398791313171387, 1.2436078786849976, 1.2477104663848877,
1.2510672807693481, 1.255167841911316, 1.2585246562957764, 1.2626252174377441,
1.2656102180480957, 1.2697107791900635, 1.2726937532424927, 1.2767963409423828,
1.2801531553268433, 1.2838817834854126, 1.2876105308532715, 1.290967345237732,
1.2946960926055908, 1.298050880432129, 1.301033854484558, 1.3043906688690186,
1.3081194162368774, 1.3107304573059082, 1.3148311376571655, 1.3178139925003052,
1.3207969665527344, 1.324527621269226, 1.3275105953216553, 1.3342223167419434,
1.3372052907943726, 1.3398163318634033, 1.3431731462478638, 1.3465280532836914,
1.3491390943527222, 1.3521220684051514, 1.3554788827896118, 1.3580880165100098,
1.3606990575790405, 1.3636820316314697, 1.3674107789993286, 1.3692760467529297,
1.3722590208053589, 1.375241994857788, 1.3774791955947876, 1.3804621696472168,
1.383445143699646, 1.3860561847686768, 1.3882935047149658, 1.391276478767395,
1.3938875198364258, 1.3964966535568237, 1.3987338542938232, 1.4009710550308228,
1.4039559364318848, 1.4061912298202515, 1.4088022708892822, 1.4110395908355713,
1.413650631904602, 1.4155139923095703, 1.418125033378601, 1.420734167098999,
1.4225995540618896, 1.4248367547988892, 1.4270739555358887, 1.4289393424987793,
1.4311745166778564, 1.4334137439727783, 1.4352771043777466, 1.437514305114746,
1.4393796920776367, 1.4416168928146362, 1.4434822797775269, 1.4457194805145264,
1.4475828409194946, 1.4494481086730957, 1.450939655303955, 1.4531768560409546,
1.454668402671814, 1.456533670425415, 1.4583970308303833, 1.460262417793274,
1.4613800048828125, 1.4628715515136719, 1.4651087522506714, 1.4666022062301636,
1.4680936336517334, 1.4695851802825928, 1.471448540687561, 1.4721941947937012,
1.4736857414245605, 1.4755491018295288, 1.4766687154769897, 1.4777863025665283,
1.479651689529419, 1.4807692766189575, 1.4818888902664185, 1.4833803176879883,
1.4844999313354492, 1.4859914779663086, 1.4867371320724487, 1.4878548383712769,
1.4893462657928467, 1.4900920391082764, 1.490837812423706, 1.4923292398452759,
1.4930750131607056, 1.4941946268081665, 1.4949404001235962, 1.4956860542297363,
1.4968056678771973, 1.4975494146347046, 1.4982951879501343, 1.4986690282821655,
1.500160574913025, 1.500160574913025, 1.5012800693511963, 1.502025842666626,
1.5027716159820557, 1.503143548965454, 1.5038892030715942, 1.5042630434036255,
1.5046368837356567, 1.5053826570510864, 1.5057545900344849, 1.5065003633499146,
1.5065003633499146, 1.5072460174560547, 1.5072460174560547, 1.5079917907714844,
1.5079917907714844, 1.5079917907714844, 1.508737564086914, 1.5091114044189453,
1.5094833374023438, 1.5094833374023438, 1.5094833374023438, 1.509857177734375,
1.5102289915084839, 1.5106009244918823, 1.5102289915084839, 1.5106009244918823,
1.5102289915084839, 1.5106009244918823, 1.5106028318405151, 1.5106009244918823,
1.5106009244918823, 1.5106009244918823, 1.5102289915084839, 1.5102289915084839,
1.5102289915084839, 1.5102289915084839, 1.5098551511764526, 1.5094833374023438,
1.5094833374023438, 1.5094833374023438, 1.509109377861023, 1.5083637237548828,
1.5079917907714844, 1.5079917907714844, 1.507619857788086, 1.5072460174560547,
1.5068721771240234, 1.5068721771240234, 1.5065003633499146, 1.5061265230178833,
1.5050069093704224, 1.5046368837356567, 1.5038892030715942, 1.5042630434036255,
1.5035173892974854, 1.5027716159820557, 1.5023977756500244, 1.5016520023345947,
1.5012800693511963, 1.5005344152450562, 1.4997867345809937, 1.4994148015975952,
1.4990428686141968, 1.4982951879501343, 1.4979232549667358, 1.4971776008605957,
1.4960579872131348, 1.4960579872131348, 1.4949404001235962, 1.4941946268081665,
1.4938207864761353, 1.4927011728286743, 1.4923292398452759, 1.4915835857391357,
1.490837812423706, 1.4900920391082764, 1.4893462657928467, 1.488228678703308,
1.4878548383712769, 1.4863632917404175, 1.4859914779663086, 1.4856176376342773,
1.4848718643188477, 1.4833803176879883, 1.4833803176879883, 1.482260823249817,
1.4811431169509888, 1.4803974628448486, 1.4792778491973877, 1.4789040088653564,
1.4777863025665283, 1.4770406484603882, 1.4762948751449585, 1.4755491018295288,
1.4744294881820679, 1.474057674407959, 1.4725642204284668, 1.47182035446167,
1.4714465141296387, 1.4699550867080688, 1.4692093133926392, 1.4695812463760376,
1.4680917263031006, 1.4669721126556396, 1.4666001796722412, 1.4654825925827026,
1.4643629789352417, 1.463617205619812, 1.4624996185302734, 1.4621257781982422,
1.4606342315673828, 1.4595166444778442, 1.459142804145813, 1.458023190498352,
1.4569056034088135, 1.4569056034088135, 1.455414056777954, 1.4542945623397827,
1.4531749486923218, 1.4520572423934937, 1.4513115882873535, 1.4505658149719238,
1.4501919746398926, 1.4490723609924316, 1.4475809335708618, 1.4468351602554321,
1.4464632272720337, 1.4449697732925415, 1.4442260265350342, 1.4434783458709717,
1.4423606395721436, 1.4416149854660034, 1.4412411451339722, 1.4393776655197144,
1.439003825187683, 1.4371404647827148, 1.4363948106765747, 1.4349013566970825,
1.4337836503982544, 1.4326660633087158, 1.4315464496612549, 1.4293092489242554,
1.427817702293396, 1.425952434539795, 1.4240890741348267, 1.422223687171936,
1.4203603267669678, 1.417749285697937, 1.4155120849609375, 1.4125291109085083,
1.409917950630188, 1.4069350957870483, 1.4046977758407593, 1.4013429880142212,
1.3987318277359009, 1.3961207866668701, 1.3935116529464722, 1.390528678894043,
1.3879176378250122, 1.3853065967559814, 1.382325530052185, 1.3797144889831543,
1.3774772882461548, 1.3741204738616943, 1.3715113401412964, 1.3692741394042969,
1.3662911653518677, 1.363680124282837, 1.3614428043365479, 1.3580859899520874,
1.355848789215088, 1.35323965549469, 1.3506286144256592, 1.3483914136886597,
1.3457822799682617, 1.343171238899231, 1.3405601978302002, 1.337577223777771,
1.335339903831482, 1.3331027030944824, 1.3301197290420532, 1.3278825283050537,
1.325271487236023, 1.3222885131835938, 1.3204251527786255, 1.3178139925003052,
1.3152029514312744, 1.312965750694275, 1.310356616973877, 1.3077455759048462,
1.3055083751678467, 1.3025254011154175, 1.3006620407104492, 1.298050880432129,
1.2954398393630981, 1.2928307056427002, 1.2909654378890991, 1.2883563041687012,
1.2857471704483032, 1.28313410282135, 1.2805249691009521, 1.2782877683639526,
1.2760505676269531, 1.2738133668899536, 1.2708303928375244, 1.268593192100525,
1.2663559913635254, 1.263744831085205, 1.2615076303482056, 1.259270429611206,
1.2574050426483154, 1.2547959089279175, 1.2518130540847778, 1.2499476671218872,
1.2477104663848877, 1.2454732656478882, 1.2428621053695679, 1.2406249046325684,
1.2387615442276, 1.2365243434906006, 1.2339133024215698, 1.2316759824752808, 1.22906494140625,
1.2272015810012817, 1.2249643802642822, 1.2223533391952515, 1.2201160192489624,
1.217878818511963, 1.2156416177749634, 1.2134044170379639, 1.2111672163009644,
1.2089298963546753, 1.2066926956176758, 1.2044554948806763, 1.2022182941436768,
1.1996071338653564, 1.1981157064437866, 1.194760799407959, 1.192895531654358,
1.1914039850234985, 1.1884210109710693, 1.1865557432174683, 1.1843185424804688,
1.1817094087600708, 1.1798440217971802, 1.1776068210601807, 1.1731324195861816,
1.171267032623291, 1.1697756052017212, 1.1667945384979248, 1.1645554304122925,
1.163063883781433, 1.1608266830444336, 1.158589482307434, 1.1563522815704346,
1.1541149616241455, 1.1522496938705444, 1.1503863334655762, 1.147403359413147,
1.1459099054336548, 1.1433007717132568, 1.1410635709762573, 1.139200210571289,
1.1373348236083984, 1.135097622871399, 1.133606195449829, 1.13136887550354,
1.1287578344345093, 1.1265206336975098, 1.1246552467346191, 1.1220461130142212,
1.1209285259246826, 1.1186892986297607, 1.115706443786621, 1.114588737487793,
1.1123496294021606, 1.1104861497879028, 1.1082489490509033, 1.1060117483139038,
1.104520320892334, 1.101911187171936, 1.099673867225647, 1.0985543727874756,
1.0959432125091553, 1.0944517850875854, 1.092214584350586, 1.0903512239456177,
1.0877400636672974, 1.0858747959136963, 1.084011435508728, 1.0821460485458374,
1.0802826881408691, 1.0780454874038696, 1.0758082866668701, 1.0739428997039795,
1.0720795392990112, 1.0702141523361206, 1.067976951599121, 1.0664855241775513,
1.064622163772583, 1.062384843826294, 1.0605195760726929, 1.0586562156677246,
1.056790828704834, 1.0545536279678345, 1.0526883602142334, 1.0508248805999756,
1.0489596128463745, 1.046722412109375, 1.0448590517044067, 1.0429936647415161,
1.0411303043365479, 1.0392649173736572, 1.0373996496200562, 1.035536289215088,
1.0332990884780884, 1.0314356088638306, 1.0295703411102295, 1.0280787944793701,
1.026213526725769, 1.0243501663208008, 1.0221129655838013, 1.0202475786209106,
1.0187561511993408, 1.0165188312530518, 1.015027403831482, 1.0127902030944824,
1.011298656463623, 1.0090614557266235, 1.006824254989624, 1.0053327083587646,
1.0038412809371948, 1.0016040802001953, 1.000112533569336, 0.9978753328323364,
0.9956381320953369, 0.994518518447876, 0.9922813177108765, 0.9900440573692322,
0.9885525703430176, 0.987061083316803, 0.9851957559585571, 0.9833323955535889,
0.981467068195343, 0.9799755811691284, 0.9777383804321289, 0.9762468934059143,
0.9743815660476685, 0.9728900790214539, 0.9710266590118408, 0.969535231590271,
0.9672979712486267, 0.9654326438903809, 0.9635692834854126, 0.9617039561271667,
0.9602124691009521, 0.9583491086959839
],
"dev": 4,
"shot": 4712,
"time": [
-8000, -7987.099999999999, -7974.2, -7961.299999999999, -7948.400000000001, -7935.5, -7922.6,
-7909.7, -7896.8, -7883.9, -7871, -7858.1, -7845.2, -7832.3, -7819.4, -7806.5,
-7793.599999999999, -7780.700000000001, -7767.8, -7754.900000000001, -7742,
-7729.099999999999, -7716.2, -7703.299999999999, -7690.400000000001, -7677.5, -7664.6,
-7651.7, -7638.8, -7625.9, -7613, -7600.1, -7587.2, -7574.3, -7561.4, -7548.5,
-7535.599999999999, -7522.700000000001, -7509.8, -7496.900000000001, -7484,
-7471.099999999999, -7458.2, -7445.299999999999, -7432.400000000001, -7419.5, -7406.6,
-7393.7, -7380.8, -7367.9, -7355, -7342.1, -7329.2, -7316.3, -7303.4, -7290.5,
-7277.599999999999, -7264.700000000001, -7251.8, -7238.900000000001, -7226,
-7213.099999999999, -7200.2, -7187.299999999999, -7174.400000000001, -7161.5, -7148.6,
-7135.7, -7122.8, -7109.9, -7097, -7084.1, -7071.2, -7058.3, -7045.4, -7032.5,
-7019.599999999999, -7006.700000000001, -6993.8, -6980.900000000001, -6968,
-6955.099999999999, -6942.2, -6929.299999999999, -6916.400000000001, -6903.5, -6890.6,
-6877.7, -6864.8, -6851.9, -6839, -6826.1, -6813.2, -6800.3, -6787.4, -6774.5,
-6761.599999999999, -6748.700000000001, -6735.8, -6722.900000000001, -6710,
-6697.099999999999, -6684.2, -6671.299999999999, -6658.400000000001, -6645.5, -6632.6,
-6619.7, -6606.8, -6593.9, -6581, -6568.1, -6542.3, -6529.4, -6516.5, -6503.599999999999,
-6490.700000000001, -6477.8, -6464.9, -6452, -6439.099999999999, -6426.2, -6413.299999999999,
-6400.400000000001, -6387.5, -6374.6, -6361.7, -6348.8, -6335.9, -6323, -6310.1, -6297.2,
-6284.3, -6271.4, -6258.5, -6245.599999999999, -6232.700000000001, -6219.8, -6206.9, -6194,
-6181.099999999999, -6168.2, -6155.3, -6142.400000000001, -6129.5, -6116.6, -6103.7, -6090.8,
-6077.9, -6065, -6052.1, -6039.2, -6026.3, -6013.4, -6000.5, -5987.599999999999,
-5974.700000000001, -5961.8, -5948.9, -5936, -5923.099999999999, -5910.2, -5897.3,
-5884.400000000001, -5871.5, -5858.6, -5845.7, -5832.8, -5819.9, -5807, -5794.1, -5781.2,
-5768.3, -5755.4, -5742.5, -5729.599999999999, -5716.700000000001, -5703.8, -5690.9, -5678,
-5665.099999999999, -5652.2, -5639.3, -5626.400000000001, -5613.5, -5600.6, -5587.7, -5574.8,
-5561.9, -5549, -5536.1, -5523.2, -5510.3, -5497.4, -5484.5, -5471.599999999999,
-5458.700000000001, -5445.8, -5432.9, -5420, -5407.099999999999, -5394.2, -5381.3,
-5368.400000000001, -5355.5, -5342.6, -5329.7, -5316.8, -5303.9, -5291, -5278.1, -5265.2,
-5252.3, -5239.4, -5226.5, -5213.599999999999, -5200.700000000001, -5187.8, -5174.9, -5162,
-5149.099999999999, -5136.2, -5123.3, -5097.5, -5084.6, -5071.7, -5058.8, -5045.9, -5033,
-5020.1, -5007.2, -4994.3, -4981.4, -4968.5, -4955.599999999999, -4942.700000000001, -4929.8,
-4916.9, -4904, -4891.099999999999, -4878.2, -4865.3, -4852.400000000001, -4839.5, -4826.6,
-4813.7, -4800.8, -4787.9, -4775, -4762.1, -4749.2, -4736.3, -4723.4, -4710.5, -4697.6,
-4684.700000000001, -4671.8, -4658.9, -4646, -4633.099999999999, -4620.2, -4607.3,
-4594.400000000001, -4581.5, -4568.6, -4555.7, -4542.799999999999, -4529.9, -4517, -4504.1,
-4491.2, -4478.3, -4465.4, -4452.5, -4439.6, -4426.700000000001, -4413.8, -4400.9, -4388,
-4375.099999999999, -4362.2, -4349.3, -4336.400000000001, -4323.5, -4310.6, -4297.7,
-4284.799999999999, -4271.9, -4259, -4246.1, -4233.2, -4220.3, -4207.4, -4194.5, -4181.6,
-4168.700000000001, -4155.8, -4142.9, -4130, -4117.099999999999, -4104.2, -4091.3, -4078.4,
-4065.5, -4052.6, -4039.7, -4026.7999999999997, -4013.8999999999996, -4001.0000000000005,
-3988.1000000000004, -3975.2000000000003, -3962.2999999999997, -3949.3999999999996, -3936.5,
-3923.6, -3910.7, -3897.8, -3884.9, -3872, -3859.1000000000004, -3846.2000000000003,
-3833.2999999999997, -3820.3999999999996, -3807.5, -3794.6, -3781.7, -3768.8, -3755.9, -3743,
-3730.1000000000004, -3717.2000000000003, -3704.2999999999997, -3691.3999999999996, -3678.5,
-3652.7, -3639.8, -3626.9, -3614, -3601.1000000000004, -3588.2000000000003,
-3575.2999999999997, -3562.3999999999996, -3549.5, -3536.6, -3523.7, -3510.8, -3497.9, -3485,
-3472.1000000000004, -3459.2000000000003, -3446.2999999999997, -3433.3999999999996, -3420.5,
-3407.6, -3394.7, -3381.8, -3368.9, -3356, -3343.1000000000004, -3330.2000000000003,
-3317.2999999999997, -3304.3999999999996, -3291.5, -3278.6, -3265.7, -3252.8, -3239.9, -3227,
-3214.1000000000004, -3201.2, -3188.2999999999997, -3175.3999999999996, -3162.5, -3149.6,
-3136.7, -3123.8, -3110.9, -3098, -3085.1000000000004, -3072.2, -3059.2999999999997, -3046.4,
-3033.5, -3020.6, -3007.7, -2994.8, -2981.9, -2969, -2956.1000000000004, -2943.2,
-2930.2999999999997, -2917.4, -2904.5, -2891.6, -2878.7, -2865.8, -2852.9, -2840,
-2827.1000000000004, -2814.2, -2801.2999999999997, -2788.4, -2775.5, -2762.6, -2749.7,
-2736.8, -2723.9, -2711, -2698.1000000000004, -2685.2, -2672.2999999999997, -2659.4, -2646.5,
-2633.6, -2620.7, -2607.8, -2594.9, -2582, -2569.1000000000004, -2556.2, -2543.2999999999997,
-2530.4, -2517.5, -2504.6, -2491.7, -2478.8, -2465.9, -2453, -2440.1000000000004, -2427.2,
-2414.2999999999997, -2401.4, -2388.5, -2375.6, -2362.7, -2349.8, -2336.9, -2324,
-2311.1000000000004, -2298.2, -2285.2999999999997, -2272.4, -2259.5, -2246.6, -2233.7,
-2207.9, -2195, -2182.1000000000004, -2169.2, -2156.2999999999997, -2143.4, -2130.5, -2117.6,
-2104.7, -2091.8, -2078.9, -2066, -2053.1000000000004, -2040.2, -2027.3, -2014.4, -2001.5,
-1988.6, -1975.7, -1962.8000000000002, -1949.8999999999999, -1937, -1924.1, -1911.2,
-1898.3000000000002, -1885.3999999999999, -1872.5, -1859.6, -1846.7, -1833.8000000000002,
-1820.8999999999999, -1808, -1795.1, -1782.2, -1769.3000000000002, -1756.3999999999999,
-1743.5, -1730.6, -1717.7, -1704.8000000000002, -1691.8999999999999, -1679, -1666.1, -1653.2,
-1640.3000000000002, -1627.3999999999999, -1614.5, -1601.6, -1588.7, -1575.8000000000002,
-1562.8999999999999, -1550, -1537.1, -1524.2, -1511.3000000000002, -1498.3999999999999,
-1485.5, -1472.6, -1459.7, -1446.8000000000002, -1433.8999999999999, -1421, -1408.1, -1395.2,
-1382.3000000000002, -1369.3999999999999, -1356.5, -1343.6, -1330.7, -1317.8000000000002,
-1304.8999999999999, -1292, -1279.1, -1266.2, -1253.3000000000002, -1240.3999999999999,
-1227.5, -1214.6, -1201.7, -1188.8000000000002, -1175.8999999999999, -1163, -1150.1, -1137.2,
-1124.3000000000002, -1111.3999999999999, -1098.5, -1085.6, -1072.7, -1059.8000000000002,
-1046.8999999999999, -1034, -1021.0999999999999, -1008.1999999999999, -995.3,
-982.4000000000001, -969.5, -956.6, -943.6999999999999, -930.8, -917.9000000000001, -905,
-892.1, -879.1999999999999, -866.3, -853.4000000000001, -840.5, -827.6, -814.6999999999999,
-801.8, -788.9000000000001, -763.1, -750.1999999999999, -737.3, -724.4000000000001, -711.5,
-698.6, -685.6999999999999, -672.8, -659.9000000000001, -647, -634.1, -621.1999999999999,
-608.3, -595.4000000000001, -582.5, -569.6, -556.6999999999999, -543.8, -530.9000000000001,
-518, -505.09999999999997, -492.20000000000005, -479.3, -466.4, -453.5, -440.59999999999997,
-427.70000000000005, -414.8, -401.9, -389, -376.09999999999997, -363.20000000000005, -350.3,
-337.4, -324.5, -311.59999999999997, -298.70000000000005, -285.8, -272.9, -260, -247.1,
-234.2, -221.29999999999998, -208.4, -195.5, -182.60000000000002, -169.7, -156.79999999999998,
-143.9, -131, -118.1, -105.2, -92.3, -79.39999999999999, -66.5, -53.6, -40.7,
-27.799999999999997, -14.9, -2, 10.9, 23.8, 36.7, 49.6, 62.5, 75.39999999999999, 88.3, 101.2,
114.1, 127, 139.9, 152.79999999999998, 165.7, 178.60000000000002, 191.5, 204.4,
217.29999999999998, 230.2, 243.10000000000002, 256, 268.9, 281.8, 294.70000000000005,
307.59999999999997, 320.5, 333.4, 346.3, 359.20000000000005, 372.09999999999997, 385, 397.9,
410.8, 423.70000000000005, 436.59999999999997, 449.5, 462.4, 475.3, 488.20000000000005,
501.09999999999997, 514, 526.9000000000001, 539.8, 552.6999999999999, 565.6, 578.5,
591.4000000000001, 604.3, 617.1999999999999, 630.1, 643, 655.9000000000001, 681.6999999999999,
694.6, 707.5, 720.4000000000001, 733.3, 746.1999999999999, 759.1, 772, 784.9000000000001,
797.8, 810.6999999999999, 823.6, 836.5, 849.4000000000001, 862.3, 875.1999999999999, 888.1,
901, 913.9000000000001, 926.8, 939.6999999999999, 952.6, 965.5, 978.4000000000001, 991.3,
1004.1999999999999, 1017.0999999999999, 1030, 1042.8999999999999, 1055.8000000000002, 1068.7,
1081.6, 1094.5, 1107.3999999999999, 1120.3000000000002, 1133.2, 1146.1, 1159,
1171.8999999999999, 1184.8000000000002, 1197.7, 1210.6, 1223.5, 1236.3999999999999,
1249.3000000000002, 1262.2, 1275.1, 1288, 1300.8999999999999, 1313.8000000000002, 1326.7,
1339.6, 1352.5, 1365.3999999999999, 1378.3000000000002, 1391.2, 1404.1, 1417,
1429.8999999999999, 1442.8000000000002, 1455.7, 1468.6, 1481.5, 1494.3999999999999,
1507.3000000000002, 1520.2, 1533.1, 1546, 1558.8999999999999, 1571.8000000000002, 1584.7,
1597.6, 1610.5, 1623.3999999999999, 1636.3000000000002, 1649.2, 1662.1, 1675,
1687.8999999999999, 1700.8000000000002, 1713.7, 1726.6, 1739.5, 1752.3999999999999,
1765.3000000000002, 1778.2, 1791.1, 1804, 1816.8999999999999, 1829.8000000000002, 1842.7,
1855.6, 1868.5, 1881.3999999999999, 1894.3000000000002, 1907.2, 1920.1, 1933,
1945.8999999999999, 1958.8000000000002, 1971.7, 1984.6, 1997.5, 2010.4, 2023.3, 2036.2,
2049.1000000000004, 2062, 2074.9, 2087.8, 2100.7, 2126.5, 2139.4, 2152.2999999999997, 2165.2,
2178.1000000000004, 2191, 2203.9, 2216.8, 2229.7, 2242.6, 2255.5, 2268.4, 2281.2999999999997,
2294.2, 2307.1000000000004, 2320, 2332.9, 2345.8, 2358.7, 2371.6, 2384.5, 2397.4,
2410.2999999999997, 2423.2, 2436.1000000000004, 2449, 2461.9, 2474.8, 2487.7, 2500.6, 2513.5,
2526.4, 2539.2999999999997, 2552.2, 2565.1000000000004, 2578, 2590.9, 2603.8, 2616.7, 2629.6,
2642.5, 2655.4, 2668.2999999999997, 2681.2, 2694.1000000000004, 2707, 2719.9, 2732.8, 2745.7,
2758.6, 2771.5, 2784.4, 2797.2999999999997, 2810.2, 2823.1000000000004, 2836, 2848.9, 2861.8,
2874.7, 2887.6, 2900.5, 2913.4, 2926.2999999999997, 2939.2, 2952.1000000000004, 2965, 2977.9,
2990.8, 3003.7, 3016.6, 3029.5, 3042.4, 3055.2999999999997, 3068.2, 3081.1000000000004, 3094,
3106.9, 3119.8, 3132.7, 3145.6, 3158.5, 3171.4, 3184.2999999999997, 3197.2,
3210.1000000000004, 3223, 3235.9, 3248.8, 3261.7, 3274.6, 3287.5, 3300.3999999999996,
3313.2999999999997, 3326.2, 3339.1000000000004, 3352, 3364.9, 3377.8, 3390.7, 3403.6, 3416.5,
3429.3999999999996, 3442.2999999999997, 3455.2000000000003, 3468.1000000000004, 3481, 3493.9,
3506.8, 3519.7, 3532.6, 3545.5, 3571.2999999999997, 3584.2000000000003, 3597.1000000000004,
3610, 3622.9, 3635.8, 3648.7, 3661.6, 3674.5, 3687.3999999999996, 3700.2999999999997,
3713.2000000000003, 3726.1000000000004, 3739, 3751.9, 3764.8, 3777.7, 3790.6, 3803.5,
3816.3999999999996, 3829.2999999999997, 3842.2000000000003, 3855.1000000000004, 3868, 3880.9,
3893.8, 3906.7, 3919.6, 3932.5, 3945.3999999999996, 3958.2999999999997, 3971.2000000000003,
3984.1000000000004, 3997, 4009.9, 4022.8, 4035.7000000000003, 4048.6000000000004,
4061.4999999999995, 4074.3999999999996, 4087.2999999999997, 4100.2, 4113.1, 4126, 4138.9,
4151.799999999999, 4164.7, 4177.6, 4190.5, 4203.400000000001, 4216.3, 4229.2,
4242.099999999999, 4255, 4267.9, 4280.8, 4293.700000000001, 4306.6, 4319.5, 4332.4, 4345.3,
4358.2, 4371.1, 4384, 4396.9, 4409.799999999999, 4422.7, 4435.6, 4448.5, 4461.400000000001,
4474.3, 4487.2, 4500.099999999999, 4513, 4525.9, 4538.8, 4551.700000000001, 4564.6, 4577.5,
4590.4, 4603.3, 4616.2, 4629.1, 4642, 4654.9, 4667.799999999999, 4680.7, 4693.6, 4706.5,
4719.400000000001, 4732.3, 4745.2, 4758.099999999999, 4771, 4783.9, 4796.8, 4809.700000000001,
4822.6, 4835.5, 4848.4, 4861.3, 4874.2, 4887.1, 4900, 4912.9, 4925.8, 4938.7, 4951.6, 4964.5,
4977.400000000001, 4990.3
],
"time_unit": "ms"
}
]

View File

@@ -23,6 +23,7 @@ export type {
WaveformLegendOrientation,
WaveformLegendOptions,
WaveformFrameStyle,
WaveformAxesOptions,
WaveformZeroLineOptions,
// 数据类型
SingleWaveformData,

View File

@@ -130,6 +130,10 @@ body {
font-size: 12px;
}
.grid-line-control--switch-only {
grid-template-columns: minmax(0, 1fr) auto;
}
.grid-line-color-picker,
.grid-line-color-picker .vc-color-wrap {
width: 48px;

View File

@@ -104,6 +104,8 @@ export type WaveformLegendOrientation = 'auto' | 'horizontal' | 'vertical'
/** Options shared by legends in every multi-series track. */
export interface WaveformLegendOptions {
position?: WaveformLegendPosition
/** Per-track position overrides keyed by trackId, or by series id when trackId is omitted. */
trackPositions?: Record<string, WaveformLegendPosition>
orientation?: WaveformLegendOrientation
/** CSS color used by the legend panel; alpha controls background transparency. */
backgroundColor?: string
@@ -115,10 +117,20 @@ export interface WaveformLegendOptions {
export interface WaveformFrameStyle {
borderColor?: string
borderWidth?: number
borderStyle?: 'solid' | 'dashed'
borderStyle?: 'solid' | 'dashed' | 'dotted'
backgroundColor?: string
}
/** Controls axis baseline visibility while preserving tick marks and axis text. */
export interface WaveformAxesOptions {
x?: {
lineVisible?: boolean
}
y?: {
lineVisible?: boolean
}
}
/** Styling and visibility options for the horizontal zero-value reference line. */
export interface WaveformZeroLineOptions {
visible?: boolean

View File

@@ -18,6 +18,7 @@ export type {
WaveformLegendOrientation,
WaveformLegendOptions,
WaveformFrameStyle,
WaveformAxesOptions,
WaveformZeroLineOptions,
} from './chart'