# STLKIT 0.1.1

- Mooncakes：[`mik1e80/stlkit@0.1.1`](https://mooncakes.io/docs/mik1e80/stlkit@0.1.1/)
- 源码：[`v0.1.1`](https://github.com/mik1e80/stlkit/tree/v0.1.1)。该标签固定本次修订，不随 main 后续变化。
- 实现基线：[`16d665d7275f0f37a3c6156c81163ab80c5c5770`](https://github.com/mik1e80/stlkit/commit/16d665d7275f0f37a3c6156c81163ab80c5c5770)。正式标签还包含本次发布文档整理。
- 验证工具链：moonc `0.10.14+7d59c7ec9`；四个后端各 316 项库测试，以及真实 CLI 和网页回归。测试通过不表示完整格式认证或可打印保证。

## 安装与固定源码

已有 MoonBit 项目中执行：

```sh
moon add mik1e80/stlkit@0.1.1
```

源码复核使用标签，并保存解析出的完整 commit SHA：

```sh
git clone --branch v0.1.1 --depth 1 https://github.com/mik1e80/stlkit
cd stlkit
git rev-parse HEAD
moon update
moon check --target all --deny-warn
moon test --target wasm
moon test --target wasm-gc
moon test --target js
moon test --target native
node cmd/main/smoke.cjs
bash web/build.sh
node web/smoke.cjs
node scripts/review-cases.cjs
git diff --exit-code -- examples/review
```

MoonBit 使用最小版本选择；若项目其他依赖要求更高版本，应检查实际解析结果。独立复核项目只声明上述版本，核对 `.mooncakes/mik1e80/stlkit/moon.mod` 的版本及本轮新增接口，避免把旧缓存或工作区本地依赖当成已安装的新包。

## 本次修订内容

- PLY 连续按声明读取 ASCII token；OBJ 显式格式识别；长头 ASCII STL 与含关键字 OBJ 注释不再依赖 512 字节探测窗。
- STL 全量与流式使用统一输入契约，拒绝尾部多余字节、截断、非有限声明法线 / 顶点和不完整的 ASCII facet。
- 按共享边连通分量报告绕向、体积符号与潜在重叠；正总量不能掩盖反向小零件。
- 质量属性有统一输出前提，异常时明确显示“未评估”；射线距离按欧氏距离解释。
- PCA 使用完整正交特征向量组；CLI `--fix` / `--svg` 可组合，预览来自最终网格。
- 分块统计明确保留顶点及边记录，采样厚度不承诺全局最薄处；重新整理格式、几何和工艺边界。
- 包含完整项目许可与第三方 3MF 样例的 BSD-2-Clause 条款及免责声明。

## 从 0.1.0 迁移

- 穷尽匹配 `MeshFormat` 时新增 `Obj` 分支，不能继续把 `Unknown` 当作 OBJ。
- 手工构造 `WindingReport`、`RepairResult` 的调用方需补齐新增字段；优先使用检查与修复函数取得报告。
- 非单位方向的 `ray_cast().distance` 现在是欧氏距离，不再作为原方向的参数 t；直接使用 `hit.point` 读取命中点。底层 `ray_triangle()` 保持参数 t 语义。
- ASCII PLY 默认拒绝未声明尾随值，需要逐行兼容时显式传入 `lenient_ascii=true`；STL 不增加忽略尾部垃圾的宽松模式。
- 声明面法线仅检查与几何法线点积 < 0 的保留向量，不代表完整法线正确性校验。
- 网页协议使用“采样最小厚度”“负体积分量”，质量属性未评估时省略重心与主惯量数值字段，另给状态及前提字段。

完整差异见 [CHANGELOG](../../CHANGELOG.md)，能力范围见 [README](../../README.md) 与 [申报说明](../submission.md)。申报材料应填写 `0.1.1`、`v0.1.1` 及标签解析后的完整 commit SHA；更新仓库不会自动替换已经提交的附件。
