waveform-analysis 0.1.74 → 0.1.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +422 -60
- package/dist/assets/workerRuntime-BJiRmIZD.js +2446 -0
- package/dist/index.cjs +1 -2
- package/dist/index.js +1 -7119
- package/dist/style.css +1 -1
- package/dist/types/animation/WaveformAnimationController.d.ts +30 -0
- package/dist/types/animation/core/Animation.d.ts +13 -0
- package/dist/types/animation/core/Animator.d.ts +23 -0
- package/dist/types/animation/core/easing.d.ts +3 -0
- package/dist/types/animation/core/errors.d.ts +4 -0
- package/dist/types/animation/core/handle.d.ts +7 -0
- package/dist/types/animation/core/owner.d.ts +3 -0
- package/dist/types/animation/core/propertyGroups.d.ts +17 -0
- package/dist/types/animation/core/task.d.ts +29 -0
- package/dist/types/animation/core/types.d.ts +74 -0
- package/dist/types/animation/core/validation.d.ts +30 -0
- package/dist/types/animation/core/values.d.ts +8 -0
- package/dist/types/animation/presets/annotation.d.ts +4 -0
- package/dist/types/animation/presets/lineDrawing.d.ts +7 -0
- package/dist/types/animation/presets/shared.d.ts +14 -0
- package/dist/types/animation/presets/transitions.d.ts +4 -0
- package/dist/types/animation/types.d.ts +84 -0
- package/dist/types/components/WaveformChart.vue.d.ts +3 -2
- package/dist/types/components/animation/annotationPresentation.d.ts +17 -0
- package/dist/types/components/animation/chartExportVersion.d.ts +2 -0
- package/dist/types/components/animation/config.d.ts +31 -0
- package/dist/types/components/animation/context.d.ts +20 -0
- package/dist/types/components/animation/geometry.d.ts +10 -0
- package/dist/types/components/animation/paginationPresentation.d.ts +13 -0
- package/dist/types/components/animation/pathBuffer.d.ts +4 -0
- package/dist/types/components/animation/trackPresentation.d.ts +35 -0
- package/dist/types/components/animation/useWaveformAnimations.d.ts +27 -0
- package/dist/types/components/annotation/WaveformAnnotationContextMenu.vue.d.ts +2 -2
- package/dist/types/components/annotation/types.d.ts +7 -0
- package/dist/types/components/controls/useChartImageExport.d.ts +2 -0
- package/dist/types/components/core/amplitudeLimits.d.ts +6 -0
- package/dist/types/components/core/layout.d.ts +6 -9
- package/dist/types/components/core/trackLayoutBuilder.d.ts +3 -1
- package/dist/types/components/core/types.d.ts +8 -0
- package/dist/types/components/core/useWaveformChartController.d.ts +26 -1
- package/dist/types/components/core/useWaveformData.d.ts +2 -2
- package/dist/types/components/core/useWaveformMeasurements.d.ts +4 -1
- package/dist/types/components/core/useWaveformRenderSampling.d.ts +2 -0
- package/dist/types/components/core/waveformChartTypes.d.ts +6 -3
- package/dist/types/components/core/xAxisTicks.d.ts +2 -0
- package/dist/types/components/core/yAxisLayoutMetrics.d.ts +2 -1
- package/dist/types/components/core/yAxisTicks.d.ts +6 -0
- package/dist/types/components/data/types.d.ts +1 -1
- package/dist/types/components/interaction/integerZoom.d.ts +3 -3
- package/dist/types/components/interaction/stepZoom.d.ts +5 -0
- package/dist/types/components/interaction/useWaveformViewport.d.ts +0 -3
- package/dist/types/components/interaction/useWaveformZoom.d.ts +0 -2
- package/dist/types/components/rendering/WaveformSeriesLayer.vue.d.ts +1 -0
- package/dist/types/components/rendering/WaveformTrack.vue.d.ts +4 -3
- package/dist/types/components/rendering/updateAxis.d.ts +5 -0
- package/dist/types/components/rendering/updateGrid.d.ts +3 -0
- package/dist/types/components/rendering/yAxisTickVisibility.d.ts +2 -0
- package/dist/types/components/utils/assignElement.d.ts +2 -0
- package/dist/types/core/data.d.ts +1 -1
- package/dist/types/demo/DemoChartHost.vue.d.ts +1 -1
- package/dist/types/demo/remoteWaveformLoader.d.ts +23 -0
- package/dist/types/demo/types.d.ts +11 -2
- package/dist/types/demo/useRemoteWaveformWindow.d.ts +22 -0
- package/dist/types/index.d.ts +10 -1
- package/dist/types/types/chart.d.ts +8 -1
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/utils/formatters.d.ts +4 -4
- package/dist/types/utils/xAxisNumber.d.ts +2 -0
- package/dist/types/views/AnimationDemo.vue.d.ts +3 -0
- package/package.json +5 -2
- package/src/App.vue +34 -100
- package/src/DemoRouterApp.vue +1 -0
- package/src/animation/WaveformAnimationController.ts +328 -0
- package/src/animation/core/Animation.ts +37 -0
- package/src/animation/core/Animator.ts +200 -0
- package/src/animation/core/easing.ts +74 -0
- package/src/animation/core/errors.ts +24 -0
- package/src/animation/core/handle.ts +34 -0
- package/src/animation/core/owner.ts +9 -0
- package/src/animation/core/propertyGroups.ts +143 -0
- package/src/animation/core/task.ts +153 -0
- package/src/animation/core/types.ts +81 -0
- package/src/animation/core/validation.ts +173 -0
- package/src/animation/core/values.ts +38 -0
- package/src/animation/presets/annotation.ts +66 -0
- package/src/animation/presets/lineDrawing.ts +51 -0
- package/src/animation/presets/shared.ts +58 -0
- package/src/animation/presets/transitions.ts +77 -0
- package/src/animation/types.ts +81 -0
- package/src/components/WaveformChart.vue +1 -0
- package/src/components/WaveformChartView.vue +13 -6
- package/src/components/animation/annotationPresentation.ts +145 -0
- package/src/components/animation/chartExportVersion.ts +5 -0
- package/src/components/animation/config.ts +87 -0
- package/src/components/animation/context.ts +56 -0
- package/src/components/animation/geometry.ts +148 -0
- package/src/components/animation/paginationPresentation.ts +114 -0
- package/src/components/animation/pathBuffer.ts +61 -0
- package/src/components/animation/trackPresentation.ts +172 -0
- package/src/components/animation/useWaveformAnimations.ts +420 -0
- package/src/components/annotation/WaveformAnnotationLayer.vue +43 -30
- package/src/components/annotation/types.ts +3 -0
- package/src/components/controls/useChartCommands.ts +12 -13
- package/src/components/controls/useChartImageExport.ts +4 -0
- package/src/components/core/amplitudeLimits.ts +44 -0
- package/src/components/core/layout.ts +22 -34
- package/src/components/core/trackLayoutBuilder.ts +21 -23
- package/src/components/core/types.ts +4 -0
- package/src/components/core/useWaveformChartController.ts +27 -23
- package/src/components/core/useWaveformChartLifecycle.ts +11 -2
- package/src/components/core/useWaveformData.ts +11 -5
- package/src/components/core/useWaveformLayout.ts +9 -4
- package/src/components/core/useWaveformMeasurements.ts +3 -0
- package/src/components/core/useWaveformRenderSampling.ts +23 -1
- package/src/components/core/useWaveformYAxisLayout.ts +2 -0
- package/src/components/core/waveformChartTypes.ts +6 -2
- package/src/components/core/xAxisTicks.ts +69 -0
- package/src/components/core/yAxisLayoutMetrics.ts +4 -0
- package/src/components/core/yAxisTicks.ts +39 -0
- package/src/components/data/types.ts +2 -0
- package/src/components/interaction/integerZoom.ts +31 -12
- package/src/components/interaction/remoteViewport.ts +26 -4
- package/src/components/interaction/stepZoom.ts +33 -0
- package/src/components/interaction/useWaveformViewport.ts +3 -26
- package/src/components/interaction/useWaveformZoom.ts +50 -157
- package/src/components/interaction/zoomConstraints.ts +5 -5
- package/src/components/rendering/WaveformSeriesLayer.vue +13 -1
- package/src/components/rendering/WaveformTrack.vue +6 -1
- package/src/components/rendering/WaveformTrackAxes.vue +64 -51
- package/src/components/rendering/WaveformTrackBackdrop.vue +35 -49
- package/src/components/rendering/updateAxis.ts +57 -0
- package/src/components/rendering/updateGrid.ts +42 -0
- package/src/components/rendering/yAxisTickVisibility.ts +45 -18
- package/src/components/utils/assignElement.ts +7 -0
- package/src/core/data.ts +5 -2
- package/src/data/simulatedWaveforms.ts +0 -10
- package/src/demo/DemoChartHost.vue +49 -4
- package/src/demo/remoteWaveformLoader.ts +114 -0
- package/src/demo/types.ts +11 -1
- package/src/demo/useRemoteWaveformWindow.ts +229 -0
- package/src/index.ts +54 -0
- package/src/router.ts +1 -0
- package/src/types/chart.ts +10 -1
- package/src/types/index.ts +2 -0
- package/src/utils/formatters.ts +10 -5
- package/src/utils/xAxisNumber.ts +36 -0
- package/src/views/AnimationDemo.vue +129 -0
- package/dist/assets/workerRuntime-5p-EI-GL.js +0 -1
- package/dist/types/data/sx2Channel.d.ts +0 -10
- package/src/data/sx2Channel.ts +0 -315
package/README.md
CHANGED
|
@@ -6,13 +6,29 @@
|
|
|
6
6
|
组件使用不可变数据模型:替换 `data` 引用后会重新计算数据域和视口;大数据会按当前可见范围
|
|
7
7
|
和屏幕像素自动保峰降采样,而 tooltip、最近点查询和标注仍使用完整原始数据。
|
|
8
8
|
|
|
9
|
+
## 0.1.76:移除实测通道示例
|
|
10
|
+
|
|
11
|
+
综合示例移除原第11个图框及其真实采样数据,默认保留10个图框;末页只显示实际图框,
|
|
12
|
+
不再补出编号11、12的空图框。README不再介绍该实测通道。
|
|
13
|
+
动画系统和分页淡入继续可用。
|
|
14
|
+
|
|
15
|
+
## 0.1.75:加入动画系统
|
|
16
|
+
|
|
17
|
+
本版本新增系列入场、数据更新、标注动画和分页淡入,动画默认开启。首次入场默认
|
|
18
|
+
1000ms,多系列交错100ms;数据更新、标注和分页淡入默认300ms,采用`cubicInOut`缓动。
|
|
19
|
+
切页仅淡入新页的波形、点、误差棒和标注,轴与网格立即更新;连续翻页只展示最新页。
|
|
20
|
+
|
|
21
|
+
通过`animation`、`animationUpdate`、`animationAnnotation`分别配置效果、时长、缓动和回调,
|
|
22
|
+
或设置`:animation-enabled="false"`恢复静态展示。支持31种D3缓动及公开动画引擎/预设接口。
|
|
23
|
+
总点数达到默认50,000阈值、系统启用减少动态效果或环境缺少RAF时自动静态展示。
|
|
24
|
+
动画不修改原始数据、秒坐标或受控标注;交互和图片导出先提交最终态。
|
|
25
|
+
|
|
26
|
+
详细用法见下文[动画](#动画),本次变更见[最新发布说明](RELEASE_NOTES.md)。
|
|
27
|
+
|
|
9
28
|
## 在线示例
|
|
10
29
|
|
|
11
30
|
线上 Demo:[波形分析组件在线示例](https://lqycustomsite.online/waveform-analysis/)。
|
|
12
31
|
|
|
13
|
-
综合示例第 11 个图框展示实测电压通道 `SX2_7_01`(炮号 `13300`),保留全部 1,000 个
|
|
14
|
-
原始采样点。默认每页四个图框,在第 3 页查看;原始毫秒时间转换为秒坐标后传入组件。
|
|
15
|
-
|
|
16
32
|
## 特性
|
|
17
33
|
|
|
18
34
|
- Vue 3 Composition API + TypeScript,支持按需导入 `WaveformChart`
|
|
@@ -25,6 +41,7 @@
|
|
|
25
41
|
- 多系列图例、受控显隐、网格分页和最多四根 Y 轴
|
|
26
42
|
- 自动 Y 轴范围,以及全局、按轨道或按系列配置的固定振幅范围
|
|
27
43
|
- 按轨道控制水平/垂直网格线的显隐与颜色
|
|
44
|
+
- 系列入场、数据更新、标注动画和分页淡入,支持独立配置与静态降级
|
|
28
45
|
- 受控标注、右键编辑、拖拽避让和自定义颜色
|
|
29
46
|
- 标题、图框、坐标轴、零值参考线、净图和渲染参数可配置
|
|
30
47
|
|
|
@@ -85,50 +102,244 @@ const data = ref<WaveformData>({
|
|
|
85
102
|
父容器需要有明确高度;未指定 `width` 或 `height` 时,组件会填充父容器,并保持最小高度
|
|
86
103
|
`180px`。`WaveformChart` 的正式入口为 `src/index.ts`,样式入口为 `waveform-analysis/style.css`。
|
|
87
104
|
|
|
105
|
+
## 动画
|
|
106
|
+
|
|
107
|
+
动画默认开启:系列整体入场 1000ms(cubicInOut),多系列交错 100ms,数据更新和标注
|
|
108
|
+
300ms。这改变首次完整显示和替换数据的时机;需要即时画面时关闭:
|
|
109
|
+
|
|
110
|
+
```vue
|
|
111
|
+
<WaveformChart :data="data" :animation-enabled="false" />
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
五个 props 为 `animationEnabled`、`animation`、`animationUpdate`、`animationAnnotation`、
|
|
115
|
+
`animationThreshold`。三个配置对象按字段合并,`undefined` 使用默认,`0` 和 `false` 保留。
|
|
116
|
+
非法组件字段回退并在开发环境告警;底层引擎非法配置则在注册前抛错。
|
|
117
|
+
|
|
118
|
+
```vue
|
|
119
|
+
<WaveformChart
|
|
120
|
+
:data="data"
|
|
121
|
+
:animation="{
|
|
122
|
+
enabled: true,
|
|
123
|
+
duration: 800,
|
|
124
|
+
delay: 100,
|
|
125
|
+
staggerDelay: 50,
|
|
126
|
+
direction: 'center-out',
|
|
127
|
+
}"
|
|
128
|
+
:animation-update="{ enabled: true, duration: 300, easing: 'cubicInOut' }"
|
|
129
|
+
:animation-annotation="{ enabled: true, type: 'bounce' }"
|
|
130
|
+
:animation-threshold="50000"
|
|
131
|
+
/>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
入场支持 `left-to-right`、`right-to-left`、`center-out`;标注支持 `fade-in`、`scale`(默认)、
|
|
135
|
+
`slide-in`、`bounce`。标注效果的默认 easing 分别为 cubicOut、backOut、cubicOut、bounceOut,
|
|
136
|
+
可显式覆盖。分类 `enabled: false` 只结束该类,恢复不重播;运行中修改时长/效果只影响
|
|
137
|
+
下次任务。`duration: 0` 同步到终态并忽略该阶段的延迟/交错。
|
|
138
|
+
|
|
139
|
+
总有效规范化点数 **>= threshold** 时静态,默认 threshold=50000,0 始终静态。
|
|
140
|
+
计数包括隐藏及非当前页系列,通过 source.length 读取,不按采样点数计算。
|
|
141
|
+
系统减少动态效果、缺少 RAF 或导出期间同样静态。页面后台暂停,返回扣除后台时间。
|
|
142
|
+
|
|
143
|
+
替换 `data` 引用后,成功采样的兼容 X/线型/点型/误差结构进行数值插值;结构不兼容时
|
|
144
|
+
整体交叉淡化,第三份几何需求直接落到最新目标。失败/回退采样静态展示已有后端策略结果。
|
|
145
|
+
动画只改独立展示状态:原始数据、秒坐标、完整数据查询和受控 annotations 不受改写。
|
|
146
|
+
交互、视口命令、布局变化及 PNG/SVG 导出先提交最新最终态;导出不等待无限动画,仍遵守
|
|
147
|
+
原有 busy/stale/cancelled/timeout 错误契约和 5 秒上限。Demo `#/animation` 提供分类和效果控制。
|
|
148
|
+
|
|
149
|
+
切换分页时,新页波形、散点、误差棒和标注同步淡入,坐标轴与网格立即更新。分页复用
|
|
150
|
+
`animationUpdate`(默认 300ms、cubicInOut),关闭该类别或设置 `duration: 0` 会直接显示新页;
|
|
151
|
+
全局关闭、减少动态效果和点数阈值同样生效。连续翻页只保留最新页,不做跨页形变或重播
|
|
152
|
+
长入场动画。自动页码重置与其他布局变更仍静态处理。
|
|
153
|
+
|
|
154
|
+
### 高级数值引擎
|
|
155
|
+
|
|
156
|
+
根入口导出 `Animation`、`Animator`、`globalAnimator`、`WaveformAnimationController`、
|
|
157
|
+
所有配置/轨道/帧/句柄/调度器/预设类型,以及六个纯预设工厂。无需 D3 selection 或深路径导入。
|
|
158
|
+
`Animator` 和控制器的终态句柄保留 ID/状态;重复控制调用无操作,句柄不再持有任务、轨道目标或调度器。
|
|
159
|
+
模块导入不启动 RAF,SSR 中没有 RAF 时直接完成;注入 `AnimationScheduler` 可控制时钟、RAF、定时器。
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
import { Animation, Animator, getEasingFunction } from 'waveform-analysis'
|
|
163
|
+
|
|
164
|
+
const target = {
|
|
165
|
+
x: 0,
|
|
166
|
+
coordinates: [
|
|
167
|
+
[0, 1],
|
|
168
|
+
[1, 2],
|
|
169
|
+
],
|
|
170
|
+
}
|
|
171
|
+
const animator = new Animator()
|
|
172
|
+
const handle = animator.animate({
|
|
173
|
+
duration: 1000,
|
|
174
|
+
delay: 100,
|
|
175
|
+
direction: 'alternate',
|
|
176
|
+
loop: 2,
|
|
177
|
+
easing: 'quadInOut',
|
|
178
|
+
tracks: [{ target, property: 'x', to: 10 }],
|
|
179
|
+
during: (progress, frame) => console.log(progress, frame.iteration, frame.terminal),
|
|
180
|
+
done: () => console.log('完成'),
|
|
181
|
+
aborted: () => console.log('中止'),
|
|
182
|
+
onError: (error) => console.error(error),
|
|
183
|
+
})
|
|
184
|
+
handle.pause()
|
|
185
|
+
handle.resume()
|
|
186
|
+
handle.finish() // 方向决定最后迭代终点;abort() 保留当前值
|
|
187
|
+
animator.pauseAll()
|
|
188
|
+
animator.resumeAll()
|
|
189
|
+
animator.clear()
|
|
190
|
+
animator.destroy()
|
|
191
|
+
|
|
192
|
+
// 累加只允许一次播放及兼容数值形状;to 表示期望的新合成目标。
|
|
193
|
+
animator.animate({ tracks: [{ target, property: 'x', to: 12 }], additive: true })
|
|
194
|
+
const manual = new Animation({ force: true, loop: true, during: () => {} })
|
|
195
|
+
manual.start(0)
|
|
196
|
+
manual.tick(500)
|
|
197
|
+
manual.pause(500)
|
|
198
|
+
manual.resume(800)
|
|
199
|
+
manual.finish()
|
|
200
|
+
getEasingFunction('quartIn')(0.5) // 0.0625
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
轨道接受 number、number[]、number[][],数组每帧替换,不原地改写输入;普通轨道冲突整体
|
|
204
|
+
中止旧任务并从当前合成值接续,累加贡献完成/中止后固定,不逐帧漂移。`loop: true` 无限,
|
|
205
|
+
数字为正整数,方向还支持 normal/reverse/alternate-reverse。`force: true` 让无变化或空轨道计时,
|
|
206
|
+
不能绕过组件禁用策略。31 个缓动是 linear 加 quad/cubic/quart/quint/sine/expo/circ/back/elastic/bounce
|
|
207
|
+
的 In/Out/InOut,来自 D3,也支持自定义函数。回弹可越界,域/opacity/裁剪各自安全限幅。
|
|
208
|
+
|
|
209
|
+
### 纯预设与 owner 控制器
|
|
210
|
+
|
|
211
|
+
工厂只构造配置,注册事务成功后才初始化;零时长跳过隐藏初态。绑定只读写数值状态:
|
|
212
|
+
|
|
213
|
+
路径预设在构造时快照 `from`、`to` 和 `compatible`。修改传入对象不会改变已构造配置的
|
|
214
|
+
端点或过渡模式;下一次构造配置时才使用新值。
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
import {
|
|
218
|
+
Animator,
|
|
219
|
+
WaveformAnimationController,
|
|
220
|
+
createLineDrawingAnimation,
|
|
221
|
+
createStaggeredLineDrawingAnimations,
|
|
222
|
+
createPathTransitionAnimation,
|
|
223
|
+
createYAxisScaleAnimation,
|
|
224
|
+
createAnnotationAppearAnimation,
|
|
225
|
+
createAnnotationDisappearAnimation,
|
|
226
|
+
} from 'waveform-analysis'
|
|
227
|
+
import type { AnnotationAnimationState, ClipAnimationState } from 'waveform-analysis'
|
|
228
|
+
|
|
229
|
+
let clip: ClipAnimationState = { x: 0, width: 100 }
|
|
230
|
+
const clipBinding = {
|
|
231
|
+
read: () => clip,
|
|
232
|
+
write: (value: ClipAnimationState) => {
|
|
233
|
+
clip = value
|
|
234
|
+
},
|
|
235
|
+
}
|
|
236
|
+
let style: AnnotationAnimationState = { opacity: 1, scale: 1, offsetY: 0 }
|
|
237
|
+
const styleBinding = {
|
|
238
|
+
read: () => style,
|
|
239
|
+
write: (value: AnnotationAnimationState) => {
|
|
240
|
+
style = value
|
|
241
|
+
},
|
|
242
|
+
}
|
|
243
|
+
let domain: [number, number] = [0, 100]
|
|
244
|
+
const domainBinding = {
|
|
245
|
+
read: () => domain,
|
|
246
|
+
write: (value: [number, number]) => {
|
|
247
|
+
domain = value
|
|
248
|
+
},
|
|
249
|
+
}
|
|
250
|
+
const animator = new Animator()
|
|
251
|
+
animator.animate(createLineDrawingAnimation(clipBinding, 100))
|
|
252
|
+
createStaggeredLineDrawingAnimations([{ binding: clipBinding, width: 100 }], { staggerDelay: 50 })
|
|
253
|
+
animator.animate(
|
|
254
|
+
createPathTransitionAnimation(
|
|
255
|
+
{
|
|
256
|
+
from: { points: [[0, 1]] },
|
|
257
|
+
to: { points: [[0, 2]] },
|
|
258
|
+
compatible: true,
|
|
259
|
+
},
|
|
260
|
+
(frame) => {
|
|
261
|
+
if (frame.kind === 'settled') console.log(frame.values) // 释放旧几何后再通知完成
|
|
262
|
+
},
|
|
263
|
+
),
|
|
264
|
+
)
|
|
265
|
+
animator.animate(createYAxisScaleAnimation(domainBinding, [49, 51], { easing: 'backOut' }))
|
|
266
|
+
animator.animate(createAnnotationAppearAnimation(styleBinding, { type: 'scale' }))
|
|
267
|
+
animator.animate(createAnnotationDisappearAnimation(styleBinding, { type: 'fade-in' }))
|
|
268
|
+
|
|
269
|
+
const controller = new WaveformAnimationController({
|
|
270
|
+
animator,
|
|
271
|
+
commitFinalState: () => {
|
|
272
|
+
clip = { x: 0, width: 100 }
|
|
273
|
+
},
|
|
274
|
+
})
|
|
275
|
+
controller.animateSeriesEnter('signal', clipBinding, 100)
|
|
276
|
+
controller.animateAnnotationAppear('note', styleBinding)
|
|
277
|
+
controller.pauseAll()
|
|
278
|
+
controller.resumeAll()
|
|
279
|
+
controller.cancel({ kind: 'annotation', id: 'note', scope: 'enter' })
|
|
280
|
+
controller.finishAll() // 移除 owner 任务,提交最新业务目标,然后通知 done
|
|
281
|
+
controller.destroy() // 仅清理此 owner,不销毁共享 animator
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
控制器还提供 `animateMultiSeriesEnter`、`animateDataUpdate`、`animateYAxisScale`、
|
|
285
|
+
`animateAnnotationDisappear`、通用 `animate(key, config)`、`cancelAll`、`setEnabled` 和
|
|
286
|
+
`getActiveAnimationCount`。key 包含对象 kind/id/scope;不同控制器同 ID 隔离。
|
|
287
|
+
批量结束期间同 owner 重入创建抛 `animation-terminating`;销毁后抛 `animation-disposed`。
|
|
288
|
+
完成通知可同步读取最终展示数据,DOM 查询需要 `await nextTick()`。
|
|
289
|
+
|
|
290
|
+
真实浏览器基准运行 `pnpm test:animation:browser`(首次需 `pnpm exec playwright install chromium`),
|
|
291
|
+
输出 OpenSpec evidence 目录。FPS/内存/gzip 是实测优化目标,不能由 jsdom 测试证明,
|
|
292
|
+
跨浏览器和移动设备结论只覆盖实际可用环境。
|
|
293
|
+
大点数更新和交叉淡化可能增加浏览器物理内存;原 10/20MB 优化目标尚未达到。
|
|
294
|
+
对内存敏感的应用可降低 `animationThreshold` 或关闭对应动画类别;卸载清理与几何数量限制
|
|
295
|
+
不等于跨设备的绝对内存上限。实际测量及验收条件见
|
|
296
|
+
[动画验收记录](openspec/changes/add-animation-system/evidence/final-acceptance-verification.json)。
|
|
297
|
+
|
|
88
298
|
## API 速查
|
|
89
299
|
|
|
90
300
|
### Props
|
|
91
301
|
|
|
92
|
-
| Prop | 类型
|
|
93
|
-
| -------------------------- |
|
|
94
|
-
| `data` | `WaveformData`
|
|
95
|
-
| `displayMode` | `'independent' \| 'separated' \| 'compact'`
|
|
96
|
-
| `overlayMode` | `'single-axis' \| 'multi-axis'`
|
|
97
|
-
| `layoutPreset` | `'default' \| 'edge-compact'`
|
|
302
|
+
| Prop | 类型 | 默认值 | 说明 |
|
|
303
|
+
| -------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------- |
|
|
304
|
+
| `data` | `WaveformData` | 必填 | 波形数据 |
|
|
305
|
+
| `displayMode` | `'independent' \| 'separated' \| 'compact'` | `'independent'` | 图框布局 |
|
|
306
|
+
| `overlayMode` | `'single-axis' \| 'multi-axis'` | `'single-axis'` | 叠加曲线的 Y 轴模式 |
|
|
307
|
+
| `layoutPreset` | `'default' \| 'edge-compact'` | `'default'` | 标题贴边、时间标签与响应式分页布局 |
|
|
98
308
|
| `unitDisplayMode` | `'axis' \| 'legend-single-series' \| 'channel-label' \| 'channel-label-or-legend'` | `'axis'` | 可选的图表级单位展示规则 |
|
|
99
|
-
| `timeUnit` | `'s' \| 'ms'`
|
|
100
|
-
| `xLabel` / `yLabel` | `string`
|
|
101
|
-
| `lineColor` | `string`
|
|
102
|
-
| `width` / `height` | `number`
|
|
103
|
-
| `zoomable` / `showTooltip` | `boolean`
|
|
104
|
-
| `pannable` | `boolean`
|
|
105
|
-
| `panXDomain` | `[number, number]`
|
|
106
|
-
| `minZoomSpan` | `number`
|
|
107
|
-
| `integerZoom` | `boolean`
|
|
108
|
-
| `minVisiblePoints` | `number`
|
|
109
|
-
| `maxZoomScale` | `number \| null`
|
|
110
|
-
| `initialXDomain` | `[number, number]`
|
|
111
|
-
| `initialXDomains` | `Record<string, [number, number]>`
|
|
112
|
-
| `xDomainStrategy` | `WaveformXDomainStrategy`
|
|
113
|
-
| `yDomain` | `[number, number]`
|
|
114
|
-
| `
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
117
|
-
| `
|
|
118
|
-
| `
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
122
|
-
| `
|
|
123
|
-
| `
|
|
124
|
-
| `
|
|
125
|
-
| `
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
130
|
-
| `
|
|
131
|
-
| `
|
|
309
|
+
| `timeUnit` | `'s' \| 'ms'` | `'ms'` | 坐标轴和 tooltip 展示单位 |
|
|
310
|
+
| `xLabel` / `yLabel` | `string` | `时间(timeUnit)` / `'幅值'` | 坐标轴名称 |
|
|
311
|
+
| `lineColor` | `string` | `'#0960bd'` | 单波形默认颜色 |
|
|
312
|
+
| `width` / `height` | `number` | 自适应 | 组件总尺寸,单位为 CSS 像素 |
|
|
313
|
+
| `zoomable` / `showTooltip` | `boolean` | `true` / `true` | 缩放和数值 tooltip 开关 |
|
|
314
|
+
| `pannable` | `boolean` | `false` | 空格拖拽平移开关 |
|
|
315
|
+
| `panXDomain` | `[number, number]` | 未设置 | 远端横向平移边界,使用秒坐标 |
|
|
316
|
+
| `minZoomSpan` | `number` | 未设置 | 最小缩放跨度,使用原始 X 数据单位 |
|
|
317
|
+
| `integerZoom` | `boolean` | `false` | 优先对齐整数,小于一个显示单位时保留小数 |
|
|
318
|
+
| `minVisiblePoints` | `number` | `0` | 缩放后至少保留的不同 X 坐标数 |
|
|
319
|
+
| `maxZoomScale` | `number \| null` | 未设置 | 最大缩放倍数;`null` 表示不限制 |
|
|
320
|
+
| `initialXDomain` | `[number, number]` | 未设置 | 所有图框的初始 X 范围(可超出数据,空白显示) |
|
|
321
|
+
| `initialXDomains` | `Record<string, [number, number]>` | 未设置 | 按 track/series ID 配置初始范围(可超出数据) |
|
|
322
|
+
| `xDomainStrategy` | `WaveformXDomainStrategy` | `{ type: 'integer-ms' }` | 自动 X 轴视口范围策略 |
|
|
323
|
+
| `yDomain` | `[number, number]` | 未设置 | 所有波形的固定 Y 轴范围 |
|
|
324
|
+
| `amplitudeLimits` | `WaveformAmplitudeLimits` | 未设置 | 按 normalized series ID 配置严格幅值边界 |
|
|
325
|
+
| `yDomains` | `Record<string, [number, number]>` | 未设置 | 按 track/series ID 配置固定范围 |
|
|
326
|
+
| `grid` | `WaveformGridOptions` | `{ rowCount: 2, columnCount: 1, showPagination: true, fillIncompleteLastRow: false }` | 网格和分页 |
|
|
327
|
+
| `axes` | `WaveformAxesOptions` | 轴线均显示 | X/Y 轴基线、Y 轴分割数与 X 轴 label 格式化 |
|
|
328
|
+
| `rendering` | `WaveformRenderingOptions` | `{}` | 降采样与点/误差棒间距 |
|
|
329
|
+
| `plotMargin` | `WaveformPlotMargin` | `{ top: 18, bottom: 52 }` | 绘图区上下边距,单位为 CSS 像素 |
|
|
330
|
+
| `title` / `frameStyle` | 对应公开类型 | 未设置 | 标题和图框样式 |
|
|
331
|
+
| `legend` | `WaveformLegendOptions` | `{ position: 'top-right', orientation: 'auto' }` | 图例位置、排列、背景和交互 |
|
|
332
|
+
| `frameNumber` | `string \| number` | 未设置 | 图框水印内容 |
|
|
333
|
+
| `frameNumbers` | `Record<string, string \| number>` | 未设置 | 按 `trackId` 覆盖图框水印内容 |
|
|
334
|
+
| `zeroLine` | `WaveformZeroLineOptions` | `{ visible: false }` | 零值参考线显隐与样式 |
|
|
335
|
+
| `cleanView` | `boolean` | `false` | 保留波形、图框和刻度的净图模式 |
|
|
336
|
+
| `presentationMode` | `boolean` | `false` | 禁用绘图区交互的展示模式 |
|
|
337
|
+
| `annotations` | `WaveformAnnotation[]` | `[]` | 受控标注数据 |
|
|
338
|
+
| `annotationsVisible` | `boolean` | `true` | 标注图层显隐 |
|
|
339
|
+
| `interactionMode` | `'zoom' \| 'pan' \| 'annotation' \| 'none'` | `'zoom'` | 左键模式;传入时由宿主控制 |
|
|
340
|
+
| `hiddenSeriesIds` | `string[]` | 未设置 | 受控隐藏系列 ID |
|
|
341
|
+
| `defaultHiddenSeriesIds` | `string[]` | `[]` | 非受控模式的初始隐藏系列 |
|
|
342
|
+
| `toolbar` | `boolean \| WaveformToolbarOptions` | `false` | 内置工具栏配置 |
|
|
132
343
|
|
|
133
344
|
所有公开类型均可从包入口导入,例如 `WaveformData`、`WaveformSeries`、`TypedSampleData`、
|
|
134
345
|
`TypedPointData`、`WaveformAnnotation`、`WaveformLineStyle`、`WaveformRenderingOptions`、
|
|
@@ -254,6 +465,45 @@ import 'waveform-analysis/style.css'
|
|
|
254
465
|
固定范围存在时,对应图框的 Y 轴不会被平移或视口重置覆盖;X 轴缩放、平移和重置保持原有
|
|
255
466
|
行为。运行时更新或移除 `yDomain` / `yDomains` 会立即重新布局,移除后恢复自动范围。
|
|
256
467
|
|
|
468
|
+
### 严格幅值显示上下限
|
|
469
|
+
|
|
470
|
+
`amplitudeLimits?: WaveformAmplitudeLimits` 按稳定的**规范化 series ID** 设置幅值显示边界,
|
|
471
|
+
不是按 `trackId` 配置,也不绘制阈值线。组件导出以下类型:
|
|
472
|
+
|
|
473
|
+
```ts
|
|
474
|
+
import type { WaveformAmplitudeLimit, WaveformAmplitudeLimits } from 'waveform-analysis'
|
|
475
|
+
|
|
476
|
+
// WaveformAmplitudeLimit = { lower?: number; upper?: number }
|
|
477
|
+
const amplitudeLimits: WaveformAmplitudeLimits = {
|
|
478
|
+
voltage: { lower: -73, upper: 86 },
|
|
479
|
+
current: { upper: 0 },
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
```vue
|
|
484
|
+
<WaveformChart :data="chartData" :amplitude-limits="amplitudeLimits" />
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
每边可选,`0` 有效;非有限值视为该边未配置。两个有效边界相等或倒置时,整个系列配置
|
|
488
|
+
停用,恢复原来的 `yDomain` / `yDomains` 或自动范围逻辑。
|
|
489
|
+
|
|
490
|
+
有效限幅优先于旧固定范围和手动 Y 视口:配置侧覆盖自动边界并关闭该侧留白,未配置侧
|
|
491
|
+
继续根据完整数据(含启用的误差棒)计算自动范围、留白和 nice 刻度。默认启用 nice,
|
|
492
|
+
但仅允许未配置侧向外扩展;双边 `[-73, 86]` 始终保持原端点,主刻度在其内部按漂亮步长
|
|
493
|
+
生成,边界不必是主刻度。`axes.y.nice: false` 时仍在最终范围上使用线性等分刻度。
|
|
494
|
+
|
|
495
|
+
单边限幅导致自动侧与配置侧相等或倒置时,只调整自动侧。回退跨度取原自动范围跨度、
|
|
496
|
+
配置值绝对值的 10%、`1` 三者的最大值。缩放、平移、复位、分页和替换 `data` 均不会覆盖
|
|
497
|
+
配置边界;有限幅时未配置侧始终自动计算。替换或移除配置立即生效。
|
|
498
|
+
|
|
499
|
+
共享 Y 轴按可见系列的有效配置合并:下限取最小值,上限取最大值,仅启用存在的边。
|
|
500
|
+
多值轴按各自系列配置;复用同一根轴的系列也按此规则合并。合并后的双边相等或倒置时
|
|
501
|
+
该轴限幅停用。全部系列隐藏时沿用组件按完整系列保留轴范围的规则;空数据沿用原来的
|
|
502
|
+
默认处理,不创建额外坐标轴。
|
|
503
|
+
|
|
504
|
+
越界曲线仅在绘图区裁剪,原始输入、完整规范化数据及数据导出不受影响。标签测量、轴槽
|
|
505
|
+
空间和实际渲染使用同一套范围及刻度规则。未使用有效限幅时,旧 API 的行为保持兼容。
|
|
506
|
+
|
|
257
507
|
### Y 轴自动等分
|
|
258
508
|
|
|
259
509
|
Y 轴默认显示 5 个主刻度(包含上下端点),并使用类似 ECharts 的 `1 / 2 / 5 × 10ⁿ` 漂亮
|
|
@@ -287,9 +537,103 @@ Y 轴会独立计算:
|
|
|
287
537
|
|
|
288
538
|
### 缩放后按可视区间加载数据
|
|
289
539
|
|
|
540
|
+
主 demo 已接入可替换的异步加载器:首次加载、缩放结束、平移结束和重置均通过同一接口
|
|
541
|
+
回填数据。默认模拟延迟为 80ms;加载期间显示状态,失败时显示错误并可重试当前范围。
|
|
542
|
+
请求使用 `AbortController` 取消,并校验请求版本,取消未生效的旧响应也不会覆盖新视口。
|
|
543
|
+
独立图框按稳定 `seriesIds` 分别合并,同次多图框命令可加载所有目标。
|
|
544
|
+
|
|
545
|
+
记录全域通过 `panXDomain` 固定;`initialXDomain` 是首次及重置窗口,可以是全域的一部分。
|
|
546
|
+
它们都不随响应的采样密度、覆盖范围或空结果变化。配置有效 `panXDomain` 时,空系列保留
|
|
547
|
+
身份、图框及交互能力,未加载区域可以继续缩放和平移;本地模式仍使用既有空数据行为。
|
|
548
|
+
公开 `normalizeWaveformSeries` 的空系列过滤行为不变。
|
|
549
|
+
|
|
550
|
+
远程 demo 默认开启整数缩放,使用
|
|
551
|
+
`xDomainStrategy: { type: 'integer-ms', includeExplicit: true }` 在首次显示及重置时向外扩展
|
|
552
|
+
整数毫秒范围;跨度达到一个显示单位时缩放优先对齐整数,小于一个显示单位时保留小数。
|
|
553
|
+
回填和单位切换不会重新对齐当前视口,平移保持窗口跨度。
|
|
554
|
+
Demo 的 `panXDomain` 同样使用扩展后的记录范围,避免尺寸变化或视口恢复将整数端点裁回
|
|
555
|
+
原始采样端点;加载器元数据和采样坐标仍保留原值。
|
|
556
|
+
它还设置 `minVisiblePoints: 2`、`maxZoomScale: null`,在已加载窗口内缩到两个真实采样点后停止放大。
|
|
557
|
+
最小跨度从完整模拟记录的相邻采样间隔固定计算,不会根据回填的点数重新计算;未加载或不足两点的
|
|
558
|
+
远程窗口仍沿用最小跨度限制。真实后端应通过元数据提供最小跨度;等间隔采样若至少需要 N 点,
|
|
559
|
+
可使用 `(N - 1) * sampleIntervalSeconds`。后端抽稀时不宜用返回点数限制原始采样尺度的进一步放大。
|
|
560
|
+
|
|
561
|
+
仓库内的 demo 接入方式如下。以下 composable 和加载器属于 demo 辅助模块,不是包的公开导出:
|
|
562
|
+
|
|
563
|
+
```vue
|
|
564
|
+
<script setup lang="ts">
|
|
565
|
+
import { computed, onMounted, ref, shallowRef } from 'vue'
|
|
566
|
+
import { WaveformChart } from '@/index'
|
|
567
|
+
import { createSimulatedWaveformData } from '@/data/simulatedWaveforms'
|
|
568
|
+
import { createMockWindowLoader } from '@/demo/remoteWaveformLoader'
|
|
569
|
+
import { useRemoteWaveformWindow } from '@/demo/useRemoteWaveformWindow'
|
|
570
|
+
import { applyXDomainStrategy } from '@/components/core/xDomain'
|
|
571
|
+
|
|
572
|
+
const chart = ref<{ resetViewport: (trackIndex?: number) => void }>()
|
|
573
|
+
const record = shallowRef(createSimulatedWaveformData())
|
|
574
|
+
const xDomainStrategy = { type: 'integer-ms' as const, includeExplicit: true }
|
|
575
|
+
const {
|
|
576
|
+
chartData,
|
|
577
|
+
recordDomain,
|
|
578
|
+
initialXDomain,
|
|
579
|
+
minZoomSpan,
|
|
580
|
+
loading,
|
|
581
|
+
errors,
|
|
582
|
+
handleZoomIntent,
|
|
583
|
+
handleZoomChange,
|
|
584
|
+
handleZoomEnd,
|
|
585
|
+
handlePanEnd,
|
|
586
|
+
resetWaveformViewport,
|
|
587
|
+
retry,
|
|
588
|
+
} = useRemoteWaveformWindow(record, {
|
|
589
|
+
loadWindow: createMockWindowLoader(() => record.value, { delayMs: 80 }),
|
|
590
|
+
resetViewport: (index) => chart.value?.resetViewport(index),
|
|
591
|
+
})
|
|
592
|
+
const panXDomain = computed(() => applyXDomainStrategy(recordDomain.value, xDomainStrategy, true))
|
|
593
|
+
onMounted(() => void resetWaveformViewport())
|
|
594
|
+
</script>
|
|
595
|
+
|
|
596
|
+
<template>
|
|
597
|
+
<p v-if="loading" role="status">正在加载当前时间范围…</p>
|
|
598
|
+
<p v-if="errors.length" role="alert">
|
|
599
|
+
{{ errors.join(';') }}
|
|
600
|
+
<button :disabled="loading" @click="retry()">重试</button>
|
|
601
|
+
</p>
|
|
602
|
+
<WaveformChart
|
|
603
|
+
ref="chart"
|
|
604
|
+
:data="chartData"
|
|
605
|
+
:pan-x-domain="panXDomain"
|
|
606
|
+
:initial-x-domain="initialXDomain"
|
|
607
|
+
:min-zoom-span="minZoomSpan"
|
|
608
|
+
:min-visible-points="2"
|
|
609
|
+
:max-zoom-scale="null"
|
|
610
|
+
:integer-zoom="false"
|
|
611
|
+
:x-domain-strategy="xDomainStrategy"
|
|
612
|
+
pannable
|
|
613
|
+
@zoom-intent="handleZoomIntent"
|
|
614
|
+
@zoom-change="handleZoomChange"
|
|
615
|
+
@zoom-end="handleZoomEnd"
|
|
616
|
+
@pan-end="handlePanEnd"
|
|
617
|
+
@zoom-reset="resetWaveformViewport"
|
|
618
|
+
/>
|
|
619
|
+
</template>
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
加载器签名为 `loadWindow({ start, end, seriesIds? }, signal): Promise<WaveformData>`,
|
|
623
|
+
坐标和事件端点始终是秒。模拟加载器还支持 `empty`、`fail` 和 `delayMs`,既可以传固定值,
|
|
624
|
+
也可以传按请求计算的函数,以验证空响应、失败和乱序。
|
|
625
|
+
主 demo 可通过 Vue `provide(remoteWindowLoaderKey, loadWindow)` 注入替代加载器。
|
|
626
|
+
连接真实接口时,在消费页面构造请求并将 `signal` 传给 `fetch`;不要在图表库内写死地址。
|
|
627
|
+
真实后端的记录元数据与原始数据请求应分开,模拟器持有完整记录仅用于生成响应。
|
|
628
|
+
|
|
629
|
+
业务若返回聚合或抽稀点,这些点只代表当前加载精度;需要精确原始点的悬浮查询、标注和
|
|
630
|
+
误差范围应另行加载。前端渲染抽稀仍以完整已加载数据进行查询,不能恢复后端未返回的点。
|
|
631
|
+
|
|
290
632
|
组件支持 Plotly 风格的矩形框选缩放:在 zoom 模式下按住鼠标左键拖拽,松开后同时缩放
|
|
291
633
|
X/Y 轴;设置 `pannable` 后,指针位于图表内时按住空格键拖拽可平移当前视口。
|
|
292
|
-
|
|
634
|
+
鼠标滚轮可放大和缩小,统一通过重置按钮恢复完整视口,双击不再重置。每次有效滚轮事件以鼠标所在的 X 位置为基准,
|
|
635
|
+
向上滚动将 X 范围缩小一半,向下滚动将 X 范围扩大一倍;滚动幅度不影响单次倍率。
|
|
636
|
+
滚轮与放大/缩小按钮共用边界、整数对齐及最小点数约束,按钮以视口中心为基准。
|
|
293
637
|
组件会在真实滚轮或框选确定目标范围时同步触发 `zoom-intent`,可立即取消过时请求并启动
|
|
294
638
|
新请求;缩放结束后仍会触发 `zoom-end`。独立分图模式还会包含 `trackIndex` 和稳定的
|
|
295
639
|
`seriesIds`。
|
|
@@ -335,7 +679,8 @@ X 轴且包含多个轨道时使用按稳定 track ID 索引的 `yRanges`。平
|
|
|
335
679
|
加载期间超出已加载数据的区域显示空白,加载状态和错误提示由业务页面提供。
|
|
336
680
|
|
|
337
681
|
配置远端边界时,滚轮、框选和 `setViewportDomain` 在记录范围内约束,最小缩放跨度及倍率
|
|
338
|
-
|
|
682
|
+
仍基于初始数据域;与已加载数据范围重叠的缩放窗口还会按 `minVisiblePoints` 保留真实采样点,
|
|
683
|
+
避免仅满足时间跨度却缩到一个点后停止。未加载区间没有真实点数,因此不会用点数约束将目标窗口拉回
|
|
339
684
|
已加载数据。回填时保留 X 范围,不重新应用点数约束。取消拖动或范围没有变化不会触发 `pan-end`。
|
|
340
685
|
平移过程中用 `zoom-change` 使旧请求失效,完成后用 `pan-end` 发起请求;对缩放仍使用
|
|
341
686
|
`zoom-intent`。业务页面应使用请求序号或取消机制,避免旧响应覆盖更新的目标窗口。
|
|
@@ -347,16 +692,20 @@ X 轴且包含多个轨道时使用按稳定 track ID 索引的 `yRanges`。平
|
|
|
347
692
|
`initialXDomains` 按 track ID 或 series ID 分别配置。`minZoomSpan` 使用原始 X 数据单位,
|
|
348
693
|
可防止每次区间数据回填后重新累计放大。未配置任何缩放约束时保留既有的 40 倍兜底;设置
|
|
349
694
|
`minVisiblePoints: 2` 可缩放到两个真实采样点,`maxZoomScale: null` 可显式关闭倍率上限。
|
|
695
|
+
最少点数约束检查缩放后的范围;当前已有两个可见点时,滚轮、按钮和框选仍可继续收窄,
|
|
696
|
+
直到达到真实最小范围。视口外用于延续折线的邻点不计入可见点数。
|
|
350
697
|
|
|
351
698
|
设置 `:integer-zoom="true"` 可开启整数缩放,默认关闭。开启后滚轮、框选和
|
|
352
|
-
`setViewportDomain`
|
|
353
|
-
`timeUnit='s'`
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
699
|
+
`setViewportDomain` 优先将开始时间向下取整、结束时间向上取整;`timeUnit='ms'` 时对齐整毫秒,
|
|
700
|
+
`timeUnit='s'` 时对齐整秒。若跨度小于一个显示单位,
|
|
701
|
+
则保留小数范围及小数标签、刻度,例如秒模式下 `1.2~1.8` 和 `1~1.4` 保留小数,
|
|
702
|
+
跨整数的 `1.8~2.2` 也保留原范围;负数采用相同规则。初始范围和重置范围也遵循此规则。
|
|
703
|
+
整数模式不额外限制最小跨度,配置的最小跨度、最大倍率和最少可见点数限制仍然生效。
|
|
704
|
+
平移时保持当前跨度;小数视窗跨越整数边界时仍保留小数。记录边界和最小跨度约束优先。
|
|
705
|
+
动态切换此开关会重置视口;切换时间单位只更新显示,不改变当前原始范围。demo 默认开启此开关。
|
|
357
706
|
原始采样坐标不会被修改,缩放事件仍以秒返回实际对齐后的范围;自定义 formatter 不影响对齐粒度。
|
|
358
707
|
关闭时 `timeUnit` 仍只影响展示,不改变缩放范围。
|
|
359
|
-
|
|
708
|
+
显式设置多种限制时采用最严格的一项。点击工具栏重置按钮会
|
|
360
709
|
重置组件内部缩放并触发 `zoom-reset`;调用方应在事件中取消区间请求并恢复首次完整数据。
|
|
361
710
|
外部重置按钮也可以通过模板引用调用组件公开的 `resetViewport()` 方法,然后执行相同的数据恢复逻辑。
|
|
362
711
|
|
|
@@ -402,9 +751,9 @@ chartRef.value?.setViewportDomain(trackDomain, trackIndex)
|
|
|
402
751
|
显式初始范围仍须通过 `includeExplicit` 开启,原始数据坐标不变。
|
|
403
752
|
|
|
404
753
|
独立坐标模式下,回填响应应只替换 `seriesIds` 对应的系列,并调用
|
|
405
|
-
`resetViewport(trackIndex)
|
|
406
|
-
`zoom-reset` payload 会包含该图框的 `trackIndex` 和 `seriesIds
|
|
407
|
-
|
|
754
|
+
`resetViewport(trackIndex)`;其他图框的数据和缩放状态应保持不变。独立模式下通过工具栏选择目标图框并点击重置,
|
|
755
|
+
`zoom-reset` payload 会包含该图框的 `trackIndex` 和 `seriesIds`;选择当前页全部时按图框分别触发事件。
|
|
756
|
+
共享 X 范围模式表示全局复位。忽略事件参数的既有监听器可以继续使用。
|
|
408
757
|
|
|
409
758
|
多通道数据应为每个 `WaveformSeries` 提供稳定的 `id`。内部时间坐标始终使用秒,
|
|
410
759
|
`timeUnit` 只控制坐标轴和 tooltip 的显示单位。
|
|
@@ -826,8 +1175,21 @@ scale 定位零线:
|
|
|
826
1175
|
/>
|
|
827
1176
|
```
|
|
828
1177
|
|
|
829
|
-
X
|
|
830
|
-
|
|
1178
|
+
X 轴主刻度参考 ECharts 数值轴算法,以当前可视域跨度除以目标分段数,选择
|
|
1179
|
+
`1 / 2 / 3 / 5 / 10 × 10ⁿ` 的漂亮步长。目标分段数按绘图区宽度自动计算
|
|
1180
|
+
(`max(2, floor(width / 100))`),实际数量可能不同。该算法只生成域内刻度,不扩展可视域;
|
|
1181
|
+
自动域、显式域、`xDomainStrategy` 及缩放和平移约束继续决定范围。
|
|
1182
|
+
左右端点标签仍独立显示,附近主刻度会避让;次网格线按完整主刻度间隔三等分生成。
|
|
1183
|
+
整数缩放在整数视口下使用至少一个显示单位的步长,小数视口仍允许小数刻度。
|
|
1184
|
+
极端数值或超出刻度安全上限时回退到 D3 刻度算法。回退结果同样会过滤非有限值、
|
|
1185
|
+
去重并规范化负零;若实际数量超过 3000,会降低目标数量重新生成等距刻度。
|
|
1186
|
+
无法生成有效刻度时只保留独立端点标签,不修改可视域。
|
|
1187
|
+
|
|
1188
|
+
X 轴刻度和左右端点默认先按 `timeUnit` 转换为秒或毫秒,再显示为无千分位的自适应精度
|
|
1189
|
+
数值。默认标签去除尾零、负零和浮点长尾,小窗口精度按
|
|
1190
|
+
`max(0, ceil(-log10(显示跨度)) + 1)` 计算,普通小数最多六位,更高精度使用科学计数法;
|
|
1191
|
+
两端标签仍相同时增加有效数字直到可区分。边界小数保留必要精度。
|
|
1192
|
+
可通过 `axes.x.labelFormatter` 对显示值做运算和格式化:
|
|
831
1193
|
|
|
832
1194
|
```vue
|
|
833
1195
|
<WaveformChart
|
|
@@ -855,7 +1217,7 @@ Demo 左侧“网格与轴线”支持直接切换数值或固定时间格式。
|
|
|
855
1217
|
`zoomable`、`pannable` 和 `showTooltip` 分别控制缩放、平移和 tooltip;平移默认关闭,
|
|
856
1218
|
启用后在 `pan` 模式直接拖拽,`zoom` 模式按 Space 临时平移。传入模式 prop 时请接入更新回传,详见工具栏章节。
|
|
857
1219
|
|
|
858
|
-
展示场景可启用 `presentationMode`,统一禁用绘图区的 tooltip
|
|
1220
|
+
展示场景可启用 `presentationMode`,统一禁用绘图区的 tooltip、缩放、平移和
|
|
859
1221
|
标注交互。该模式不会隐藏任何图形内容,也不会禁用图例切换或分页;关闭后恢复原交互配置。
|
|
860
1222
|
|
|
861
1223
|
```vue
|
|
@@ -999,7 +1361,7 @@ async function importAnnotationFile(file: File) {
|
|
|
999
1361
|
字段无效时会抛出 `TypeError`,不会返回部分结果。导入包含未知 `seriesId` 的标注是允许的,
|
|
1000
1362
|
对应曲线加载后会恢复显示。文件选择、错误提示和下载由业务层实现。
|
|
1001
1363
|
|
|
1002
|
-
X 轴刻度和左右端点先按 `timeUnit`
|
|
1364
|
+
X 轴刻度和左右端点先按 `timeUnit` 转换为秒或毫秒,再显示为不带分组符的自适应精度数值,并可通过 `axes.x.labelFormatter` 自定义。Y 轴根据完整显示域的最大绝对值选择格式:大于等于 `10³`,或大于 `0` 且小于等于 `10⁻³` 时,自动使用科学计数法,并在顶部刻度显示共享倍率 `E±NN`,倍率不参与左侧留白与通道名称定位;其他范围使用普通数字,零值不触发科学计数法。Y 轴标签先保留五位有效数字,再本地化为最多四位小数。科学计数法刻度不追加单位;普通刻度在 series 配置了 `unit` 时显示 `(单位)`,多 Y 轴分别使用对应轴首个 series 的单位。tooltip 使用最多 4 位小数的本地化普通数字并省略无意义尾零;标注编辑器的 X 坐标跟随 `timeUnit` 并固定 3 位小数,Y 坐标显示完整普通十进制。所有格式化都只发生在展示层,内部坐标值保持原始精度。
|
|
1003
1365
|
标注框默认布局在采样点正上方,只做绘图区边界裁剪;文本框通过连接箭头指向标注位置,多个标注重叠时可通过拖动手动避让。
|
|
1004
1366
|
|
|
1005
1367
|
## 事件
|
|
@@ -1013,7 +1375,7 @@ X 轴刻度和左右端点先按 `timeUnit` 转换为秒或毫秒,再显示为
|
|
|
1013
1375
|
| `zoom-change` | 缩放过程中触发,参数为 `[start, end]` |
|
|
1014
1376
|
| `pan-end` | 平移结束且范围变化时返回时间端点,独立模式附带轨道信息 |
|
|
1015
1377
|
| `zoom-end` | 滚轮、框选或新命令提交后触发;加载器需忽略 action=fit |
|
|
1016
|
-
| `zoom-reset` |
|
|
1378
|
+
| `zoom-reset` | 重置按钮或新对象 reset 恢复意图;独立模式标识目标图框 |
|
|
1017
1379
|
| `page-change` | 分页变化,参数为当前页和总页数 |
|
|
1018
1380
|
| `series-visibility-change` | 图例切换曲线显隐时触发 |
|
|
1019
1381
|
| `annotation-create` / `annotation-update` / `annotation-delete` | 标注新增、更新或删除 |
|
|
@@ -1108,12 +1470,12 @@ ESLint 的 Vue SFC、TypeScript ESLint 和 `max-lines` 规则;`pnpm lint:all`
|
|
|
1108
1470
|
|
|
1109
1471
|
`unit-display-mode="channel-label-or-legend"` 在左侧统一隐藏通道名称时,为每个非空图框
|
|
1110
1472
|
显示带单位的图例,包括只有一条通道曲线的图框。
|
|
1111
|
-
当前页所有图框均为单曲线时,左侧名称显示为 `
|
|
1473
|
+
当前页所有图框均为单曲线时,左侧名称显示为 `DEMO_VOLTAGE(V)`;当前页任一图框
|
|
1112
1474
|
包含两条及以上曲线时,整页隐藏左侧通道名称及多轴通道标题,保留坐标刻度。
|
|
1113
1475
|
当前页均为单曲线时,名称显示在左侧,图框不显示图例。
|
|
1114
1476
|
判断使用当前页原始曲线数量,隐藏曲线仍计数,其他页不会影响当前页。
|
|
1115
1477
|
单位去除首尾空白;缺失、空白或 `--` 时只显示名称。原始数据及 ID 保持不变。
|
|
1116
|
-
图例显示为 `
|
|
1478
|
+
图例显示为 `DEMO_VOLTAGE (V)`,设置 `:legend="{ interactive: true }"` 可点击显隐。
|
|
1117
1479
|
隐藏后保留图例条目,可全部隐藏后恢复;`cleanView` 隐藏名称和图例。
|
|
1118
1480
|
显隐状态可通过 `hiddenSeriesIds` 及 `update:hidden-series-ids` 控制;未传入时使用
|
|
1119
1481
|
组件内部状态,持久化仍由宿主应用负责。已有两种单位展示模式保留各自的单位规则,
|