# 变更记录

## 0.1.1 — 2026-10-21

Mooncakes `mik1e80/stlkit@0.1.1`，源码标签 `v0.1.1`。此版本合并以下修订，兼容边界及固定版本复核方法见 [发布说明](docs/releases/0.1.1.md)。

### 2026-10-21

- 修复 CLI 同时指定 `--fix` / `--svg` 时提前返回、不生成 SVG 的问题：修复流程返回最终 Mesh 与复核状态，保存网格后继续用最终 Mesh 导出预览，严格模式在导出后按最终结果退出。
- 无需自动修复时也保存指定的网格输出；拒绝完全相同的网格与 SVG 输出路径。增加组合参数顺序、修复前后预览对照、无需改动、修复后仍薄壁及两类写入失败的真实 CLI 回归。同步帮助、README、申报说明，并修正流式声明法线校验的残留旧表述。

- 统一 STL 输入契约：二进制全量 / 整块流式 / 分块扫描严格匹配头部声明长度，拒绝任意多余尾字节与截断，流式路径同样校验有限声明法线；计数字段避免有符号截断。
- ASCII 全量与流式共用逐面状态机，支持制表符 / CRLF，统一拒绝错误顶点数、坏数字、嵌套 / 未结束面、错误记录顺序及未知非空行；solid 包装可省略，几何退化交给验证层。此前部分入口接受的坏输入现在会失败。
- 新增同一输入经直接解析、自动入口、不同分块尺寸、CLI 与网页的一致性回归，并覆盖所有单记录分割点。

- CLI / 网页共用新增 `PrintabilityReport::mass_properties_available()`，明确检查非空、闭合、无退化面、绕向一致及分量朝向可靠；不满足时重心 / 主惯量显示“未评估”，网页协议继续省略相应数值字段并新增质量属性状态 / 前提字段。底层质量属性 API 保留原行为，不自动验证几何。
- 增加闭合且正体积但含共线退化面的自制案例，以及合法值、开放 / 反向 / 局部绕向冲突、潜在重叠、修复恢复与薄壁不阻断质量属性的回归；同步 README 和申报边界。

- 修复 `Mesh::ray_cast()` 非单位方向下将射线参数误作为命中距离的问题；内部先按最大绝对分量缩放再归一化，`RayHit.distance` 统一为欧氏距离，并使用同一单位方向计算命中点。零 / 非有限方向及非有限起点返回 None，不输出非有限命中。
- `ray_triangle()` 保持底层参数 t 语义，更新源码注释与两份 README；旧调用方若把 ray_cast().distance 当 t 使用，需按新距离语义迁移。增加轴向、反向、斜向、极大 / 极小比例及无效输入回归。

- 收窄声明面法线检查的表述：仅统计已保留声明向量与几何法线点积 < 0 的情况；零或近零向量跳过，不检查单位长度、垂直性及精确一致性。
- 明确 OBJ 三顶点法线不完全相同时置零并跳过，不宣称完整平滑法线校验。同步 README、接口说明、申报材料、对比文档、源码注释及 CLI / 网页措辞，保留原算法与报告字段。
- 增加法线检查边界回归；“错误法线”继续作为兼容字段名，含义为声明面法线反向计数。

### 2026-10-20

- 新增 `MeshFormat::Obj`，CLI 与网页不再把 `Unknown` 标为 OBJ。对 `MeshFormat` 做穷尽匹配的调用方需增加 Obj 分支；依赖旧 Unknown=OBJ 语义的代码应改为 Obj。
- 文本格式探测改为按行首记录扫描至首个提示或文件末尾，修复超过 512 字节的 ASCII STL 文件头以及 OBJ 注释含 STL 关键字时的误判。未知文本在统一入口尝试 ASCII STL / OBJ，均失败时返回组合诊断；已识别的格式保留自身错误。
- 增加长文件头及关键字注释的自建样例，补齐库、CLI、网页回归，并重建网页编译产物。

- ASCII PLY 默认连续按 header 声明消费正文 token，修复共行及跨行记录被丢弃的问题；拒绝声明外的尾随值。新增显式 `lenient_ascii=true` 逐行兼容，不自动回退；依赖旧版隐式忽略行尾数据的调用方需迁移。未知属性 / 元素仍按声明消费，面先声明时延后验证索引；补齐库、CLI、网页与自建案例回归。
- `PrintabilityReport.inward_component_count()` 直接提供负体积分量数；CLI / 网页统一调用该接口。`needs_review()` 独立检查分量朝向，不再依赖厚度未评估来间接阻止朝向未定或可能重叠的报告通过；增加正总量下多个反向分量、修复后计数及已有厚度结果的回归。
- 绕向报告新增每个共享边连通分量的面索引、有符号体积与朝向状态；总正体积不再掩盖朝里的小零件。
- 独立闭合分量按各自符号统一方向；可能嵌套或重叠的壳层保留符号，避免把合法内腔全部翻成正体积。
- 新增 `RepairResult.reoriented_components` 并计入 `changed()`；CLI / 网页与厚度门禁改用分量结果。网页字段“整体朝内”改为“负体积分量”，内部文本协议调用方需更新。
- 自行用结构体字面量构造 `WindingReport` 或 `RepairResult` 的调用方需补齐新增字段；通常应使用检查与修复函数取得报告。

- PCA 定向包围盒改用完整 Jacobi 正交特征向量组，修复两重特征值可能产生零轴的问题；新增方柱、圆柱及特征方程 / 矩阵重建回归。
- 重写 README，集中说明使用方法、PCA 重根方向不唯一、采样及流式边界；旧单特征向量接口保留作兼容查询。

- 统一使用限定网格检查与采样最小厚度表述；报告明确列出未评估的工艺条件。
- 增加射线预算参数、只记录的喷嘴 / 支撑上下文及同模型原始报告；修复后沿用采样预算。
- 增加默认 1000 条射线漏掉 0.05 mm 薄板的确定性反例，不将样本值当成全局最薄处。
- 增加独立 `--stream-only` 入口和 `StlScanner::storage()` 逻辑计数，明确边记录包含重复边，存储随规模增长。
- 新增申报说明与案例文档，并把报告重新生成核对纳入 CI。
- 网页协议字段“最薄处”改为“采样最小厚度”；调用此内部文本协议的应用需同步改键。公开库 `ThicknessReport.min_thickness` 保留，语义为采样结果。
- 当日修订合并到 0.1.1，不作为单独版本发布。

### 2026-10-17

- 拒绝 STL / OBJ 非有限数；二进制与分块顶点路径一致拒绝无效坐标。
- 拒绝 3MF 非有限变换、运算溢出和未实现的必需扩展，保留可选扩展行为。
- 增加无效模型、库与真实入口回归。
- Pages 分发携带完整项目许可与来源说明。
- 当日修订合并到 0.1.1，不作为单独版本发布。

兼容约定：非法或未支持输入可能因正确性修复从成功变为明确失败，此类收紧会记录反例和原因；公开接口移除或含义改变必须说明迁移办法。
