Files
Just-DataInspector/Utilities/Src/DataLoader.cpp
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

77 lines
2.3 KiB
C++

#include "DataLoader.hpp"
#include "CsvLoader.hpp"
#include "MatLoader.hpp"
#include "Mf4Loader.hpp"
#include "Utf8Util.hpp"
#include <algorithm>
namespace jdi
{
namespace
{
/** @brief 取小写扩展名(含点)。 */
std::wstring ExtensionOf(const std::wstring& filePath)
{
const std::size_t dot = filePath.find_last_of(L'.');
if (dot == std::wstring::npos)
{
return std::wstring();
}
return ToLowerAscii(filePath.substr(dot));
}
} // namespace
bool IsSupportedSignalFile(const std::wstring& filePath)
{
const std::wstring extension = ExtensionOf(filePath);
return extension == L".csv" || extension == L".txt" || extension == L".mf4" ||
extension == L".mdf" || extension == L".dat" || extension == L".mat";
}
const wchar_t* SignalFileDialogFilter()
{
// GetOpenFileNameW 要求:每个过滤器一对「说明\0通配符\0」,最后以空字符串结束。
return L"测量数据文件 (*.csv;*.txt;*.mf4;*.mdf;*.dat;*.mat)\0*.csv;*.txt;*.mf4;*.mdf;*.dat;*.mat\0"
L"CSV 文本 (*.csv;*.txt)\0*.csv;*.txt\0"
L"ASAM MDF v4 (*.mf4;*.mdf)\0*.mf4;*.mdf\0"
L"MATLAB 数据 (*.mat)\0*.mat\0"
L"全部文件 (*.*)\0*.*\0";
}
bool LoadSignalSourceGroups(const std::wstring& filePath, std::vector<LoadedSourceGroup>& groups,
std::wstring& error, const LoadProgress& progress)
{
error.clear();
groups.clear();
const std::wstring extension = ExtensionOf(filePath);
if (extension == L".mat")
{
return LoadMatSourceGroups(filePath, groups, error, progress);
}
LoadedSourceGroup group;
if (!LoadSignalSource(filePath, group.source, error, progress))
{
return false;
}
groups.push_back(std::move(group));
return true;
}
bool LoadSignalSource(const std::wstring& filePath, LoadedSource& source, std::wstring& error,
const LoadProgress& progress)
{
const std::wstring extension = ExtensionOf(filePath);
if (extension == L".mf4" || extension == L".mdf")
{
return LoadMf4Source(filePath, source, error, progress);
}
// 其余(含未知扩展名)一律按 CSV 文本尝试解析:文本格式的容错性最好,
// 而未知扩展名在「打开文件」对话框里也只能由用户显式指定。
return LoadCsvSource(filePath, source, error, progress);
}
} // namespace jdi