Files
orisys-sensor-design/tests/test_stroke_texture_cli.py
T
ykcheungab e8d231ec39 改用相机网格生成笔画纹理
统一笔画配置与彩色 patch 的投影网格,替换旧脚本及产物。
已验证 Blender 导出、16 项相关测试、文档与 lint 门禁。
2026-10-06 10:51:56 +08:00

66 lines
2.5 KiB
Python

"""The stroke CLI uses the texture geometry job and verifies its outputs."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from orisys_sensor_design import cli
from orisys_sensor_design.manifest import RevisionPaths, sha256_file
REVISION = Path(__file__).resolve().parents[1] / "sensors" / "finger-xynova" / "r01"
def _args(job: Path, output_dir: Path, views=False) -> argparse.Namespace:
return argparse.Namespace(
views=views, source_job=job, output_dir=output_dir,
width_ratio=0.4, length_ratio=0.8, orientation_mode=None,
proposals=None, seed=13,
)
def _job(tmp_path: Path) -> Path:
paths = RevisionPaths.from_revision_dir(REVISION)
job = tmp_path / "_texture_job.json"
job.write_text(json.dumps({
"schema": "orisys-sensor-design/texture-job-v3",
"revision_dir": str(paths.root), "source_blend": str(paths.source_blend),
"settings": {"nx": 80, "ny": 80},
"objects": {"mesh": "sensing_surface", "camera": "cam_sensor"},
"outputs": [{"uv_map": "compute"}],
}), encoding="utf-8")
return job
def test_exports_from_geometry_job(tmp_path, monkeypatch):
job = _job(tmp_path)
output_dir = tmp_path / "strokes"
calls = []
def run_blender(script, blend, args):
calls.append((script, blend, args))
for fmt in ("png", "svg", "pdf"):
(output_dir / f"stroke_texture_compute.{fmt}").write_bytes(fmt.encode())
return 0
monkeypatch.setattr(cli, "_run_blender_script", run_blender)
assert cli.cmd_stroke_texture(REVISION, _args(job, output_dir)) == 0
assert calls[0][0] == "camera_grid_stroke.py"
params_path = Path(calls[0][2][calls[0][2].index("--params") + 1])
params = json.loads(params_path.read_text(encoding="utf-8"))
assert params["seed"] == 13
assert params["width_ratio"] == 0.4
manifest = json.loads((output_dir / "stroke_texture_manifest.json").read_text())
assert manifest["schema"] == "orisys-sensor-design/stroke-texture-manifest-v2"
assert manifest["source_job"]["sha256"] == sha256_file(job)
assert set(manifest["outputs"][0]["artifacts"]) == {"png", "svg", "pdf"}
assert cli.cmd_stroke_texture(REVISION, _args(job, output_dir)) == 2
assert len(calls) == 1
def test_rejects_multiview(tmp_path, monkeypatch):
job = _job(tmp_path)
monkeypatch.setattr(cli, "_run_blender_script", lambda *_: 99)
assert cli.cmd_stroke_texture(REVISION, _args(job, tmp_path / "out", views=True)) == 2