4 Commits

Author SHA1 Message Date
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
21 changed files with 512 additions and 53134 deletions

100
README.md
View File

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

View File

@@ -1,6 +1,6 @@
{ {
"name": "waveform-analysis", "name": "waveform-analysis",
"version": "0.1.15", "version": "0.1.18",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
"types": "./dist/types/index.d.ts", "types": "./dist/types/index.d.ts",

View File

@@ -46,6 +46,8 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
expect(gridSizeInputs[1]?.props('value')).toBe(1) 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) 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.text()).toContain('背景颜色')
expect(frameControls.find('[aria-label="图框线宽"]').exists()).toBe(true) expect(frameControls.find('[aria-label="图框线宽"]').exists()).toBe(true)
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.find('[aria-label="显示图框水印"]').exists()).toBe(true)
expect(frameControls.get('.frame-style-control--switch .ant-switch').classes()).toContain( expect(frameControls.get('.frame-style-control--switch .ant-switch').classes()).toContain(
'ant-switch-small', 'ant-switch-small',
@@ -129,6 +134,27 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
wrapper.unmount() 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 () => { it('passes tooltip and per-series line-style controls to the chart', async () => {
const wrapper = mount(App) const wrapper = mount(App)
await flushPromises() await flushPromises()
@@ -175,7 +201,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
wrapper.unmount() 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) const wrapper = mount(App)
await flushPromises() await flushPromises()
@@ -183,10 +209,10 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
const firstFrameSeries = firstFrame.findAll('.waveform-chart__series') const firstFrameSeries = firstFrame.findAll('.waveform-chart__series')
expect(firstFrameSeries.map((series) => series.attributes('data-series-name'))).toEqual([ 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.find('.waveform-chart__line').exists()).toBe(false)
expect(triangleSeries.get('.waveform-chart__points').attributes('data-point-type')).toBe( expect(triangleSeries.get('.waveform-chart__points').attributes('data-point-type')).toBe(
'triangle', 'triangle',
@@ -196,7 +222,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
wrapper.unmount() 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) const wrapper = mount(App)
await flushPromises() await flushPromises()
@@ -206,7 +232,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
tracks.map((track) => tracks.map((track) =>
track.findAll('.waveform-chart__series').map((item) => item.attributes('data-series-name')), track.findAll('.waveform-chart__series').map((item) => item.attributes('data-series-name')),
), ),
).toEqual([['BT2_2M'], ['ENG6KV1'], ['ENG4F2YIb3'], ['ENG8KJXAc']]) ).toEqual([['正弦基波'], ['谐波扰动'], ['阻尼振荡'], ['阶跃响应']])
expect( expect(
tracks tracks
.slice(1) .slice(1)
@@ -220,10 +246,16 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
WaveformData, WaveformData,
{ kind: 'series' } { kind: 'series' }
> >
const frameTwoSeries = chartData.series.filter((item) => item.trackId?.startsWith('frame-two-')) const simulatedSeries = chartData.series
expect(frameTwoSeries.map((item) => item.name)).toEqual(['ENG6KV1', 'ENG4F2YIb3', 'ENG8KJXAc']) expect(simulatedSeries.map((item) => item.name)).toEqual([
expect(frameTwoSeries.map((item) => item.unit)).toEqual(['KV', 'KA', 'A']) '正弦基波',
frameTwoSeries.forEach((item) => { '谐波扰动',
'阻尼振荡',
'阶跃响应',
'脉冲响应',
'带噪信号',
])
simulatedSeries.forEach((item) => {
expect(item.data.kind).toBe('points') expect(item.data.kind).toBe('points')
if (item.data.kind === 'points') { if (item.data.kind === 'points') {
expect(item.data.points).toHaveLength(1000) expect(item.data.points).toHaveLength(1000)
@@ -237,7 +269,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
wrapper wrapper
.findAll('.waveform-chart__track') .findAll('.waveform-chart__track')
.map((track) => track.get('.waveform-chart__series').attributes('data-series-name')), .map((track) => track.get('.waveform-chart__series').attributes('data-series-name')),
).toEqual(['BT1_2M', 'TEST_CH_2']) ).toEqual(['脉冲响应', '带噪信号'])
wrapper.unmount() wrapper.unmount()
}) })
@@ -247,7 +279,7 @@ describe('App workspace layout', { timeout: 20_000 }, () => {
await flushPromises() await flushPromises()
const renderedTitle = () => wrapper.get('.waveform-chart__title-text') 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('Microsoft YaHei')
expect(renderedTitle().attributes('style')).toContain('font-size: 14px') expect(renderedTitle().attributes('style')).toContain('font-size: 14px')
expect(renderedTitle().attributes('style')).toContain('font-weight: 400') expect(renderedTitle().attributes('style')).toContain('font-weight: 400')

View File

@@ -7,6 +7,7 @@ import 'vue3-colorpicker/style.css'
import { import {
WaveformChart, WaveformChart,
type WaveformAnnotation, type WaveformAnnotation,
type WaveformAxesOptions,
type WaveformData, type WaveformData,
type WaveformDisplayMode, type WaveformDisplayMode,
type WaveformFrameStyle, type WaveformFrameStyle,
@@ -16,57 +17,29 @@ import {
type WaveformLegendOrientation, type WaveformLegendOrientation,
type WaveformLegendPosition, type WaveformLegendPosition,
type WaveformOverlayMode, type WaveformOverlayMode,
type WaveformSeries,
type WaveformTitleOptions, type WaveformTitleOptions,
type WaveformZoomEndPayload, type WaveformZoomEndPayload,
type WaveformZeroLineOptions, type WaveformZeroLineOptions,
} from './components' } from './components'
import chartWaveformsJson from './data/chartWaveforms.json'
import frameTwoWaveformsJson from './data/frameTwoWaveforms.json'
import { normalizeWaveformSeries } from './core' import { normalizeWaveformSeries } from './core'
import { createSimulatedWaveformData } from './data/simulatedWaveforms'
interface WaveformSourcePoint { const fullChartData = createSimulatedWaveformData()
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 displayMode = ref<WaveformDisplayMode>('independent') const displayMode = ref<WaveformDisplayMode>('independent')
const overlayMode = ref<WaveformOverlayMode>('single-axis') const overlayMode = ref<WaveformOverlayMode>('single-axis')
const rowCount = ref(4) const rowCount = ref(4)
const columnCount = ref(1) const columnCount = ref(1)
const frameBorderColor = ref('#1f2937') const frameBorderColor = ref('#1f2937')
const frameBorderWidth = ref(1) 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 frameBackgroundColor = ref('rgba(255, 255, 255, 0)')
const frameWatermarkVisible = ref(true) const frameWatermarkVisible = ref(true)
const horizontalGridVisible = ref(true) const horizontalGridVisible = ref(true)
const horizontalGridColor = ref('#dfe5ef') const horizontalGridColor = ref('#dfe5ef')
const verticalGridVisible = ref(true) const verticalGridVisible = ref(true)
const verticalGridColor = ref('#dfe5ef') const verticalGridColor = ref('#dfe5ef')
const xAxisLineVisible = ref(false)
const yAxisLineVisible = ref(false)
const annotations = ref<WaveformAnnotation[]>([]) const annotations = ref<WaveformAnnotation[]>([])
const annotationsVisible = ref(true) const annotationsVisible = ref(true)
const cleanView = ref(false) const cleanView = ref(false)
@@ -81,7 +54,7 @@ const legendOrientation = ref<WaveformLegendOrientation>('auto')
const legendBackgroundColor = ref('rgba(255, 255, 255, 0.7)') const legendBackgroundColor = ref('rgba(255, 255, 255, 0.7)')
const hiddenSeriesIds = ref<string[]>([]) const hiddenSeriesIds = ref<string[]>([])
const titleVisible = ref(true) const titleVisible = ref(true)
const titleText = ref(`Shot:${sourceRows[0]?.shot ?? 4712}`) const titleText = ref('模拟波形分析')
const titleAlign = ref<NonNullable<WaveformTitleOptions['align']>>('center') const titleAlign = ref<NonNullable<WaveformTitleOptions['align']>>('center')
const titleFontFamily = ref('"Microsoft YaHei", "微软雅黑", sans-serif') const titleFontFamily = ref('"Microsoft YaHei", "微软雅黑", sans-serif')
const titleFontSize = ref(14) const titleFontSize = ref(14)
@@ -109,6 +82,7 @@ const legendOrientationOptions: Array<{ label: string; value: WaveformLegendOrie
const frameBorderStyleOptions = [ const frameBorderStyleOptions = [
{ label: '实线', value: 'solid' }, { label: '实线', value: 'solid' },
{ label: '虚线', value: 'dashed' }, { label: '虚线', value: 'dashed' },
{ label: '点虚线', value: 'dotted' },
] ]
const zeroLineDashOptions = [ const zeroLineDashOptions = [
{ label: '虚线', value: '6 4' }, { label: '虚线', value: '6 4' },
@@ -136,6 +110,10 @@ const frameStyle = computed<WaveformFrameStyle>(() => ({
borderStyle: frameBorderStyle.value, borderStyle: frameBorderStyle.value,
backgroundColor: frameBackgroundColor.value, backgroundColor: frameBackgroundColor.value,
})) }))
const axes = computed<WaveformAxesOptions>(() => ({
x: { lineVisible: xAxisLineVisible.value },
y: { lineVisible: yAxisLineVisible.value },
}))
const zeroLine = computed<WaveformZeroLineOptions>(() => ({ const zeroLine = computed<WaveformZeroLineOptions>(() => ({
visible: zeroLineVisible.value, visible: zeroLineVisible.value,
color: zeroLineColor.value, color: zeroLineColor.value,
@@ -143,62 +121,6 @@ const zeroLine = computed<WaveformZeroLineOptions>(() => ({
dash: zeroLineDash.value, 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) => const initialXValues = normalizeWaveformSeries(fullChartData).flatMap((series) =>
series.points.map((point) => point.x), series.points.map((point) => point.x),
) )
@@ -217,7 +139,9 @@ const initialXDomainValue: [number, number] | undefined =
const initialXDomain = ref<[number, number] | undefined>(initialXDomainValue) const initialXDomain = ref<[number, number] | undefined>(initialXDomainValue)
const chartData = ref<WaveformData>(fullChartData) const chartData = ref<WaveformData>(fullChartData)
const lineStyleOverrides = ref<Record<string, WaveformLineStyle>>({}) 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 }> = [ const lineStyleOptions: Array<{ label: string; value: WaveformLineStyle }> = [
{ label: '实线', value: 'solid' }, { label: '实线', value: 'solid' },
{ label: '虚线', value: 'dashed' }, { label: '虚线', value: 'dashed' },
@@ -510,7 +434,7 @@ onBeforeUnmount(() => window.removeEventListener('keydown', handleWindowKeydown)
</section> </section>
<section class="control-section"> <section class="control-section">
<h2>网格线</h2> <h2>网格与轴线</h2>
<div class="grid-line-controls"> <div class="grid-line-controls">
<div class="grid-line-control"> <div class="grid-line-control">
<span>水平网格</span> <span>水平网格</span>
@@ -548,6 +472,14 @@ onBeforeUnmount(() => window.removeEventListener('keydown', handleWindowKeydown)
/> />
</span> </span>
</div> </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> </div>
</section> </section>
@@ -773,6 +705,7 @@ onBeforeUnmount(() => window.removeEventListener('keydown', handleWindowKeydown)
interactive: true, interactive: true,
}" }"
:frame-style="frameStyle" :frame-style="frameStyle"
:axes="axes"
:clean-view="cleanView" :clean-view="cleanView"
:show-tooltip="showTooltip" :show-tooltip="showTooltip"
:zero-line="zeroLine" :zero-line="zeroLine"

View File

@@ -349,6 +349,75 @@ describe('WaveformChart', () => {
expect(zeroLines[0].attributes('y1')).not.toBe(zeroLines[1].attributes('y1')) 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 () => { it('preserves a titled multi-axis plot and hides auxiliary layers in clean view', async () => {
const data: WaveformData = { const data: WaveformData = {
kind: 'series', kind: 'series',
@@ -1079,6 +1148,61 @@ describe('WaveformChart', () => {
expect(wrapper.attributes('data-chart-left-margin')).toBe('64') 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 () => { it('applies a configurable alpha background to every visible legend', async () => {
const wrapper = await mountSizedChart( const wrapper = await mountSizedChart(
{ {
@@ -2329,6 +2453,17 @@ describe('WaveformChart', () => {
expect(wrapper.get('.waveform-chart__plot-frame').attributes('stroke-width')).toBe('1') 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 () => { it('continues minor x-grid lines beyond the final major tick to the exact endpoint', async () => {
const wrapper = await mountSizedChart({ const wrapper = await mountSizedChart({
kind: 'points', kind: 'points',

View File

@@ -28,6 +28,7 @@ import {
import { import {
type WaveformAnnotation, type WaveformAnnotation,
type WaveformAxesOptions,
type WaveformData, type WaveformData,
type WaveformDisplayMode, type WaveformDisplayMode,
type WaveformFrameStyle, type WaveformFrameStyle,
@@ -121,6 +122,7 @@ const props = withDefaults(
timeUnit?: 's' | 'ms' timeUnit?: 's' | 'ms'
frameNumber?: string | number frameNumber?: string | number
frameStyle?: WaveformFrameStyle frameStyle?: WaveformFrameStyle
axes?: WaveformAxesOptions
annotations?: WaveformAnnotation[] annotations?: WaveformAnnotation[]
annotationsVisible?: boolean annotationsVisible?: boolean
interactionMode?: WaveformInteractionMode interactionMode?: WaveformInteractionMode
@@ -251,7 +253,9 @@ function handleInteractionKeyDown(event: KeyboardEvent) {
const target = event.target const target = event.target
if ( if (
target instanceof Element && target instanceof Element &&
target.closest('button, input, select, textarea, [contenteditable]:not([contenteditable="false"])') target.closest(
'button, input, select, textarea, [contenteditable]:not([contenteditable="false"])',
)
) { ) {
return return
} }
@@ -290,14 +294,16 @@ const containerStyle = computed(() => ({
width: fixedWidth.value === undefined ? '100%' : `${fixedWidth.value}px`, width: fixedWidth.value === undefined ? '100%' : `${fixedWidth.value}px`,
height: fixedHeight.value === undefined ? '100%' : `${fixedHeight.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 isCleanView = computed(() => props.cleanView === true)
const resolvedZeroLine = computed(() => { const resolvedZeroLine = computed(() => {
const width = props.zeroLine?.width const width = props.zeroLine?.width
return { return {
visible: props.zeroLine?.visible === true, visible: props.zeroLine?.visible === true,
color: props.zeroLine?.color || ZERO_LINE_DEFAULTS.COLOR, 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, dash: props.zeroLine?.dash ?? ZERO_LINE_DEFAULTS.DASH,
} }
}) })
@@ -311,13 +317,17 @@ const hiddenSeriesIdSet = computed(() =>
: new Set(props.hiddenSeriesIds), : new Set(props.hiddenSeriesIds),
) )
const resolvedHiddenSeriesIds = computed(() => Array.from(hiddenSeriesIdSet.value)) 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' const orientation = props.legend?.orientation ?? 'auto'
if (orientation !== 'auto') return orientation if (orientation !== 'auto') return orientation
return legendPosition.value === 'top' || legendPosition.value === 'bottom' return position === 'top' || position === 'bottom' ? 'horizontal' : 'vertical'
? 'horizontal' }
: 'vertical'
})
const resolvedTitleText = computed(() => props.title?.text.trim() ?? '') const resolvedTitleText = computed(() => props.title?.text.trim() ?? '')
const titleAreaReserved = computed( const titleAreaReserved = computed(
() => () =>
@@ -326,7 +336,9 @@ const titleAreaReserved = computed(
const titleVisible = computed(() => titleAreaReserved.value && !isCleanView.value) const titleVisible = computed(() => titleAreaReserved.value && !isCleanView.value)
const titleFontSize = computed(() => { const titleFontSize = computed(() => {
const fontSize = props.title?.textStyle?.fontSize 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 titleRotation = computed(() => {
const rotation = props.title?.textStyle?.rotation const rotation = props.title?.textStyle?.rotation
@@ -351,7 +363,10 @@ const estimatedTitleWidth = computed(() => {
const spacingWidth = Number.isFinite(letterSpacing) const spacingWidth = Number.isFinite(letterSpacing)
? Math.max(0, resolvedTitleText.value.length - 1) * letterSpacing ? Math.max(0, resolvedTitleText.value.length - 1) * letterSpacing
: 0 : 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 titleAvailableWidth = computed(() => {
const measuredAvailableWidth = chartWidth.value - TITLE_AREA_HORIZONTAL_PADDING * 2 const measuredAvailableWidth = chartWidth.value - TITLE_AREA_HORIZONTAL_PADDING * 2
@@ -863,10 +878,14 @@ function clearZoomBindings() {
function resolveMaximumZoomScale(domain: [number, number]): number { function resolveMaximumZoomScale(domain: [number, number]): number {
const minZoomSpan = props.minZoomSpan 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]) const domainSpan = Math.abs(domain[1] - domain[0])
if (!Number.isFinite(domainSpan) || domainSpan <= 0) return ZOOM_CONSTRAINTS.MIN_SCALE 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 { function canZoomTrack(track: TrackLayout): boolean {
@@ -1926,6 +1945,7 @@ onBeforeUnmount(() => {
:interaction-mode="activeInteractionMode" :interaction-mode="activeInteractionMode"
:frame-number="resolveFrameNumber(track.index)" :frame-number="resolveFrameNumber(track.index)"
:frame-style="frameStyle" :frame-style="frameStyle"
:axes="axes"
:clean-view="isCleanView" :clean-view="isCleanView"
:zero-line="resolvedZeroLine" :zero-line="resolvedZeroLine"
:time-unit="timeUnit" :time-unit="timeUnit"
@@ -1966,13 +1986,14 @@ onBeforeUnmount(() => {
:key="`legend-${track.index}-${track.series.name}`" :key="`legend-${track.index}-${track.series.name}`"
class="waveform-chart__legend-track" class="waveform-chart__legend-track"
:data-legend-track-index="track.index" :data-legend-track-index="track.index"
:data-legend-track-id="track.id"
:transform="`translate(${track.left}, ${track.top})`" :transform="`translate(${track.left}, ${track.top})`"
> >
<WaveformLegend <WaveformLegend
v-if="!track.isEmpty && track.legendSeries.length > 1" v-if="!track.isEmpty && track.legendSeries.length > 1"
:series="track.legendSeries" :series="track.legendSeries"
:position="legendPosition" :position="resolveLegendPosition(track.id)"
:orientation="legendOrientation" :orientation="resolveLegendOrientation(resolveLegendPosition(track.id))"
:background-color="legendBackgroundColor" :background-color="legendBackgroundColor"
:interactive="legendInteractive" :interactive="legendInteractive"
:hidden-series-ids="resolvedHiddenSeriesIds" :hidden-series-ids="resolvedHiddenSeriesIds"

View File

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

View File

@@ -72,6 +72,8 @@ export interface HoveredSeriesPoint extends DisplaySeries {
* 轨道布局 * 轨道布局
*/ */
export interface TrackLayout { export interface TrackLayout {
/** Stable track key derived from trackId, or from the series id when trackId is omitted. */
id: string
index: number index: number
series: DisplaySeries series: DisplaySeries
/** Visible series used by rendering and interaction code. */ /** Visible series used by rendering and interaction code. */

View File

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

View File

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

View File

@@ -2,7 +2,7 @@
import { computed, nextTick, onMounted, ref, watch } from 'vue' import { computed, nextTick, onMounted, ref, watch } from 'vue'
import { axisBottom, axisLeft, axisRight, select } from 'd3' import { axisBottom, axisLeft, axisRight, select } from 'd3'
import { formatAxisTime, formatScientificAxisLabel } from '../../utils' 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 { WaveformDisplayMode, WaveformInteractionMode } from '../data/types'
import type { import type {
DisplaySeries, DisplaySeries,
@@ -31,6 +31,8 @@ interface Props {
frameNumber?: string | number frameNumber?: string | number
/** 图框样式 */ /** 图框样式 */
frameStyle?: WaveformFrameStyle frameStyle?: WaveformFrameStyle
/** 坐标轴线显示选项 */
axes?: WaveformAxesOptions
/** 时间单位 */ /** 时间单位 */
timeUnit: 's' | 'ms' timeUnit: 's' | 'ms'
/** 悬浮点(用于显示十字线) */ /** 悬浮点(用于显示十字线) */
@@ -72,7 +74,10 @@ const resolvedFrameStyle = computed(() => {
typeof borderWidth === 'number' && Number.isFinite(borderWidth) && borderWidth >= 0 typeof borderWidth === 'number' && Number.isFinite(borderWidth) && borderWidth >= 0
? borderWidth ? borderWidth
: 1, : 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', backgroundColor: props.frameStyle?.backgroundColor || 'transparent',
} }
}) })
@@ -138,11 +143,16 @@ function renderAxes() {
yAxis.tickValues(axis.tickValues) 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) { if (xAxisElement.value) {
select(xAxisElement.value).call( const selection = select(xAxisElement.value)
selection.call(
axisBottom(props.track.xScale) axisBottom(props.track.xScale)
.tickValues(props.track.xAxisTickValues) .tickValues(props.track.xAxisTickValues)
.tickFormat((value) => .tickFormat((value) =>
@@ -156,6 +166,9 @@ function renderAxes() {
.tickPadding(7) .tickPadding(7)
.tickSizeOuter(0), .tickSizeOuter(0),
) )
selection
.selectAll('path.domain')
.attr('display', props.axes?.x?.lineVisible === false ? 'none' : null)
} }
} }
@@ -171,6 +184,8 @@ watch(
() => props.track.xAxisTickValues, () => props.track.xAxisTickValues,
() => props.track.yAxisTickValues, () => props.track.yAxisTickValues,
() => props.timeUnit, () => props.timeUnit,
() => props.axes?.x?.lineVisible,
() => props.axes?.y?.lineVisible,
], ],
async () => { async () => {
await nextTick() await nextTick()
@@ -307,6 +322,7 @@ watch(
v-if="track.showXAxis && !cleanView" v-if="track.showXAxis && !cleanView"
ref="xAxisElement" ref="xAxisElement"
class="waveform-track__axis waveform-track__axis--x waveform-chart__axis waveform-chart__axis--x" 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})`" :transform="`translate(0, ${track.height})`"
/> />
<g <g
@@ -353,7 +369,10 @@ watch(
:key="`y-axis-${track.index}-${axis.index}`" :key="`y-axis-${track.index}-${axis.index}`"
:ref="(element) => setYAxisElement(element, 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 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-index="axis.index"
:data-y-axis-side="axis.side" :data-y-axis-side="axis.side"
:transform="`translate(${axis.x}, 0)`" :transform="`translate(${axis.x}, 0)`"
@@ -439,7 +458,14 @@ watch(
fill="none" fill="none"
:stroke="resolvedFrameStyle.borderColor" :stroke="resolvedFrameStyle.borderColor"
:stroke-width="resolvedFrameStyle.borderWidth" :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" aria-hidden="true"
/> />

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, WaveformLegendOrientation,
WaveformLegendOptions, WaveformLegendOptions,
WaveformFrameStyle, WaveformFrameStyle,
WaveformAxesOptions,
WaveformZeroLineOptions, WaveformZeroLineOptions,
// 数据类型 // 数据类型
SingleWaveformData, SingleWaveformData,

View File

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

View File

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

View File

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