Files
Just-DataInspector/Utilities/Inc/DataLoader.hpp
T
DeepSeek-V4.1-Flash 5b24dacee0 悬停高亮恢复旧版外延观感 + 支持 MATLAB .mat(v7.3 / HDF5,嵌套分组)
一、悬停高亮「几乎看不到、只是曲线换了颜色」(对比提交 f845616 的旧版观感)
根因:调色板第 1 色就是主题强调色(0xFF268BD2),而上一轮为提速把稠密信号的光晕改成
「按包络带原始几何 FillPath」——与曲线**逐像素同形**,于是曲线上的那层半透明强调色
完全看不出变化;旧版观感来自「lineWidth+4 的描边笔向两侧各外扩 2~3px」。
修法(PlotViewPaint.cpp::PaintSignalHaloFor):
1) 逐列成对填四边形,上下左右都外扩 grow = (lineWidth + 4) * scale / 2
   (竖向跃变处旧版 5px 笔涂出的正是那条整高色带);
2) 不能把整条包络拼成一个多边形:满幅方波相邻列区间互相交叉,缠绕填充规则会在交叠处
   相互抵消 ⇒ 填充变成一条条竖缝(实测只覆盖约一半带宽);
3) alpha 从 0x55 调回 0x66(与旧版描边笔一致)。
代价仍只在「换信号/换视界/改样式」时付一次,此后每帧只 AlphaBlend。
三维对照(新增 haloshot 探针 + f845616 工作树构建):变化像素 旧 73726 / 上一轮 13529 /
本轮 74916,目视与旧版一致(跃变处的整高色带恢复)。

二、MATLAB .mat(v7.3 = HDF5)支持,含嵌套分组
新增只读 HDF5 子集(不引第三方库):Utilities/Inc/MatH5.hpp + Utilities/Src/MatH5.cpp
- 超级块 v0/v2;对象头 v1(含续块,主块长度以 headerSize 为准);符号表(B-tree v1 +
  本地堆)与 link 消息;数据空间 v1/v2;数据类型 v1;数据布局 v3(紧凑/连续/分块);
  分块数据集支持 deflate(zlib);地址一律相对基地址解析。
新增 MATLAB 语义层:Utilities/Inc/MatLoader.hpp + Utilities/Src/MatLoader.cpp
1) Simulink SDI / SimulationData.Dataset(识别 #refs# + #sigstream#):
   · #refs# 元素有 ElementType(signal/dataset)、Name、Values;
   · timeseries 的 Values/DataR2、Values/TimeR2 是 #sigstream#/<n> 的流编号;
     #data# 是 uint8 字节流,按 8 字节一组解释为 double(与 #length#/#sampleSize# 一致);
   · 子数据集的 Values 是对象引用数组(子元素)⇒ 还原嵌套树;
   · 分组名 = 从根到信号的各级数据集名用 - 连接(如 A/A1/XYZ → 组 A-A1、信号 XYZ),
     信号名取元素 Name(空则退回 timeseries 的 Name,再退回 信号N)。
2) 普通 v7.3 变量:顶层数值矩阵按「列 = 信号、行 = 采样」读取(时间轴 = 采样序号),
   结构体按字段递归。
加载管线扩成多分组:新增 LoadSignalSourceGroups()(DataLoader)→
AsyncLoadState::groups → Application::LoadFile 逐个 AddGroup;其它格式仍只有一个分组。
文件对话框与 IsSupportedSignalFile 增加 .mat。

三、验证(全部离屏,不占用鼠标/键盘/屏幕)
- 新增 haloshot(截图对照 f845616)、matcheck(15/15:4 组 8 信号、时间轴单调、采样数正确)、
  matui(11/11:Application::LoadFile 端到端把 4 个分组加进数据层与信号列表);
- 回归 verify 49/49、panelanim 158/158、gridanim 93/93、hoverdrag 20/20、lanescroll 23/23、
  datacheck 69/69、edgecheck 46/46、errcheck 19/19、halocheck 16/16、panflash 19/19、
  panelstutter 8/8、stress 6/6;
- make release / make debug 零警告;Makefile 与探针构建脚本补 -lz。

文档:Documents/agent_mem.md 追加本轮小节(含 4 条新规则:叠加层必须自带外扩、
缠绕填充不可用于自交包络带、HDF5 主消息块长度看 headerSize、
MATLAB 分块维度可能比数据空间多一维、按右侧补 1 对齐)。
2026-10-19 00:52:41 +08:00

73 lines
2.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef __DATA_LOADER_HPP__
#define __DATA_LOADER_HPP__
#include <string>
#include <vector>
#include "DataTable.hpp"
namespace jdi
{
/**
* @brief 一个文件加载后的**命名分组**(多数格式只有一个,名字取文件名)。
*/
struct LoadedSourceGroup
{
std::wstring name; /**< 分组名(空表示"用源文件名")。 */
LoadedSource source; /**< 该分组的数据。 */
};
/**
* @brief 判断路径是否为应用当前支持的测量文件(按扩展名判断,不访问文件内容)。
* @param [IN] filePath 文件路径。
* @return 支持返回 true。
*/
bool IsSupportedSignalFile(const std::wstring& filePath);
/**
* @brief 供「打开文件」对话框使用的过滤器文本(`GetOpenFileNameW` 的 `lpstrFilter` 格式)。
* @return 双 NUL 结尾的过滤器文本。
*/
const wchar_t* SignalFileDialogFilter();
/**
* @brief 按扩展名选择加载器并读入一个测量文件(**唯一的文件加载入口**)。
*
* 上层(数据模型与界面)只依赖本函数返回的 `LoadedSource`,因此新增格式时
* **只需新增一个加载器并在这里登记**,其余代码完全不用改。
*
* 当前支持的格式:
* * CSV 文本(`.csv` / `.txt`):支持多个 `time` 列(多时间轴)与各时间轴不等长;
* * ASAM MDF v4(`.mf4` / `.mdf`):每个通道组(CG)是一个时间轴。
*
* @param [IN] filePath 文件完整路径。
* @param [OUT] source 解析结果(若干时间轴块)。
* @param [OUT] error 失败原因描述(成功时清空)。
* @param [IN] progress 进度回调,可为空。
* @return 加载成功返回 true。
*/
bool LoadSignalSource(const std::wstring& filePath, LoadedSource& source, std::wstring& error,
const LoadProgress& progress = LoadProgress());
/**
* @brief 与 `LoadSignalSource` 相同,但允许一个文件产出**多个命名分组**。
*
* 绝大多数格式只有一个分组(`groups.size() == 1`,`name` 为空 ⇒ 用文件名)。
* `.mat`(MATLAB 7.3)里的嵌套数据集会产生多个分组:分组名由"从顶层数据集到信号"
* 的路径用 `-` 连接而成(用户 2026-10-18 要求)。
*
* @param [IN] filePath 文件完整路径。
* @param [OUT] groups 读出的分组(至少一个)。
* @param [OUT] error 失败原因描述(成功时清空)。
* @param [IN] progress 进度回调,可为空。
* @return 加载成功返回 true。
*/
bool LoadSignalSourceGroups(const std::wstring& filePath, std::vector<LoadedSourceGroup>& groups,
std::wstring& error,
const LoadProgress& progress = LoadProgress());
} // namespace jdi
#endif // __DATA_LOADER_HPP__