fix(resample,formula,clone): 重采样面板拖动/关闭失效 + 统计频率与输入框不一致 + 派生烘焙接入公式映射 + 克隆拆分
一、「重采样」浮动面板拖不动 / ✕ 关不掉(两个独立缺陷)
1. 拖不动:OnLButtonDown 的 resampleMode 分支处理完条目与按钮后无条件 return true,
而「标题栏 -> EDGE_PANEL_MOVE」的判定在面板分支最末尾 => 标题栏按下被吞掉。
改为只消费 insideContent 之内的点击。
2. 拖不动(第二处):OnMouseMove 的 EDGE_PANEL_MOVE -> switch (m_edgePanelDragKind)
漏了 case RESAMPLE => 位置写进 edgePanel、又从 resamplePanel 读 => 纹丝不动。
3. ✕ 关不掉:OnLButtonUp 的 m_pendingPanelClose -> switch (kind) 漏了 RESAMPLE
=> 落进 default 关掉的是「边沿计数」。补 SetLaneResample(lane,false)。
二、统计「最小数据间隔」与「重采样频率」输入框不一致(用户报告)
实例 MF4-Record.MF4 / m_MOT_Current_DCom[0]:最小间隔 0.003696631s
- 统计行先舍入到 3 位有效数字(3.70ms)再换算 => 270.27 Hz;
- 输入框用未舍入原值换算 => 270.517 Hz。
真值 270.5166 Hz,两条路径基准不同。修法:频率一律由 RoundIntervalForDisplay
之后的同一份显示值换算 => 输入框与统计行同为 270.27 Hz、间隔文本同为 3ms 700us。
未改动面板行数与任何 UI 布局。
三、派生烘焙接入「公式映射」
BuildDerivedSignal 与 CloneSignal 各写了一份
gain!=1 || absolute || mirrorVertical || offsetY!=0,漏掉 HasFormula()
=> 带公式的信号派生/克隆后公式被静默丢弃。改为含 HasFormula() 的统一判定。
BuildResampledSignal 本就走 ApplyDrawTransform 全程烘值,天然包含公式。
四、信号右键菜单:克隆拆成两个语义(均不烘焙采样值)
- 「克隆该信号」:原始数据 + 外观 + 仅保留时间轴偏移,其余调整复位;
- 「克隆该信号(带调整)」:原始数据 + 外观 + 整套调整参数。
新增 Application::CloneSignalAdjusted、CMD_SIGNAL_CLONE_ADJUSTED=6、
kMessageCloneSignalAdjusted=WM_APP+6。
五、教训:离屏探针崩溃会经 MemProbe::OnTerminate 弹模态「内存不足」框,
反复重跑即反复弹窗(用户看到十几次报警,真实进程并无内存问题)。
探针应避免 Initialize+Render,或只做数据层验证;必须无缓冲输出阶段标记。
验证:.preflight/r26 三个探针(真实 MF4 数据一致性 SAME;逻辑 7/7;端到端 12/12);
make release 零 warning。
This commit is contained in:
1 parent
74456b9305
commit
9fdbf49841
9 files changed
+278
-37
No files matched your search
@@ -1728,6 +1728,12 @@ namespace jdi
|
||||
lane.freeMarkerPanel.x = left;
|
||||
lane.freeMarkerPanel.y = top;
|
||||
break;
|
||||
case EdgePanelKind::RESAMPLE:
|
||||
// ⚠️ 同类缺陷:漏掉这一支会让「重采样」面板**拖不动**(用户 2026-11-03 报告)。
|
||||
// 位置必须写进它自己的 `resamplePanel`,布局也只从那里读。
|
||||
lane.resamplePanel.x = left;
|
||||
lane.resamplePanel.y = top;
|
||||
break;
|
||||
case EdgePanelKind::COUNT:
|
||||
default:
|
||||
lane.edgePanel.x = left;
|
||||
@@ -2566,8 +2572,16 @@ namespace jdi
|
||||
m_dragMode = PlotDragMode::NONE;
|
||||
return true;
|
||||
}
|
||||
m_dragMode = PlotDragMode::NONE;
|
||||
return true; // 面板内的其它位置:消费点击,不穿透
|
||||
// ⚠️⚠️ 这里**不能**无条件 `return true`:标题栏的「拖动面板」判定在
|
||||
// 面板分支的**最末尾**(`if (UiPointInRect(layout.title, ...))`),
|
||||
// 若无条件吞掉本次按下,标题栏永远进不了 `EDGE_PANEL_MOVE`
|
||||
// ⇒ 「重采样」面板**拖不动**(用户 2026-11-03 报告)。
|
||||
// 因此只消费**内容区之内**的点击(含半截滚出的行),标题栏留给下面。
|
||||
if (insideContent)
|
||||
{
|
||||
m_dragMode = PlotDragMode::NONE;
|
||||
return true; // 面板内的其它位置:消费点击,不穿透
|
||||
}
|
||||
}
|
||||
// 「弱峰调整」:两行滑块 = 调整幅度(-400% … +400%)/ 迭代次数(1 … 自定上限)。
|
||||
// 语义与该面板旧式排版完全一致,只是外观改成与均值滤波同款的可滚动列表。
|
||||
@@ -3306,6 +3320,11 @@ namespace jdi
|
||||
case EdgePanelKind::MARK:
|
||||
SetLaneFreeMarker(lane, false);
|
||||
break;
|
||||
case EdgePanelKind::RESAMPLE:
|
||||
// ⚠️ 漏掉这一支时 ✕ 点了没反应(落进 `default` 关掉的是「边沿计数」),
|
||||
// 用户只能改走右键菜单取消功能(用户 2026-11-03 报告)。
|
||||
SetLaneResample(lane, false);
|
||||
break;
|
||||
case EdgePanelKind::COUNT:
|
||||
default:
|
||||
SetLaneEdgeCount(lane, false);
|
||||
|
||||
@@ -5495,13 +5495,19 @@ namespace jdi
|
||||
{
|
||||
// 非编辑态:自适应单位 + 小数(与「最大/最小数据间隔」同一套单位形式)。
|
||||
// 编辑态:只显示**秒**数值(不带单位),由 `PaintEditField` 绘制。
|
||||
// ⚠️ 间隔文本必须与统计行**同一份舍入值**(`RoundIntervalForDisplay`),
|
||||
// 否则统计行显示 `3ms 700us` 而输入框显示 `3ms 696.631us`(用户 2026-11-03)。
|
||||
paintInputRow(layout.rowIntervalField[rowIndex], kResampleIntervalLabel,
|
||||
FormatIntervalText(interval), editingInterval);
|
||||
}
|
||||
if (rowIndex < layout.rowFrequencyField.size())
|
||||
{
|
||||
const double hertz =
|
||||
(interval > 0.0) ? (1.0 / interval) : 0.0;
|
||||
// ⚠️ 频率必须由**与间隔输入框同一份显示值**换算(`RoundIntervalForDisplay`),
|
||||
// 否则统计行写 `270.27 Hz`(3.70ms 换算)而这一行写 `270.517 Hz`
|
||||
// (3.696631ms 换算)—— 用户 2026-11-03 报告的"两者不一致"。
|
||||
const double shownInterval =
|
||||
(interval > 0.0) ? RoundIntervalForDisplay(interval) : 0.0;
|
||||
const double hertz = (shownInterval > 0.0) ? (1.0 / shownInterval) : 0.0;
|
||||
// 非编辑态:频率单位自适应(Hz/kHz/MHz/GHz);编辑态:只显示 Hz 数值。
|
||||
paintInputRow(layout.rowFrequencyField[rowIndex], kResampleFrequencyLabel,
|
||||
(hertz > 0.0) ? FormatFrequencyText(hertz) : L"—",
|
||||
|
||||
Reference in new issue
Block a user