e8d231ec39
统一笔画配置与彩色 patch 的投影网格,替换旧脚本及产物。 已验证 Blender 导出、16 项相关测试、文档与 lint 门禁。
66 lines
2.5 KiB
Python
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
|