fix algining xynova texture to uv printing fixture.

This commit is contained in:
ykcheungab
2026-09-29 16:33:31 +08:00
parent 267334d543
commit 37e3e8400b
33 changed files with 758477 additions and 886701 deletions
+99
View File
@@ -430,6 +430,105 @@ def test_real_revisions_declare_the_seam_margin(real_revision: Path) -> None:
assert gap["total_mm"] == pytest.approx(0.2)
# ---------------------------------------------------------------- page sizing
def test_page_defaults_to_auto_at_the_shipped_density(tmp_path: Path) -> None:
revision = _write_revision(tmp_path, TWO_PAIRS)
paths = RevisionPaths.from_revision_dir(revision)
page = texture_views.resolve_page_settings(texture_views.load_views_block(paths))
assert page == {"mode": "auto", "px_per_mm": 200.0}
def test_page_density_reproduces_the_existing_rasters() -> None:
"""200 px/mm is what both revisions already use exactly, so only the proportion changes."""
assert texture_views.PAGE_DEFAULT_PX_PER_MM == 200.0
for raster, page_mm in ((3280, 16.4), (3200, 16.0), (3700, 18.5)):
assert raster / page_mm == pytest.approx(200.0)
def test_page_fixed_keeps_the_texture_patch_page(tmp_path: Path) -> None:
revision = _write_revision(tmp_path, TWO_PAIRS + " page:\n mode: fixed\n")
paths = RevisionPaths.from_revision_dir(revision)
settings = resolve_texture_settings(paths)
block = texture_views.load_views_block(paths)
pairs = texture_views.resolve_view_pairs(paths, settings, block)
job = texture_views.build_multiview_job(paths, settings, pairs, tmp_path / "o", block)
assert job["page"]["mode"] == "fixed"
assert all(pair["page"] == "fixed" for pair in job["pairs"])
def test_per_pair_page_override_wins(tmp_path: Path) -> None:
revision = _write_revision(tmp_path, _block(
" - id: uv_1\n camera: cam_uv_1\n uv_map: uv_1\n page: fixed\n"
" - id: uv_2\n camera: cam_uv_2\n uv_map: uv_2\n",
) + " page:\n mode: auto\n")
paths = RevisionPaths.from_revision_dir(revision)
settings = resolve_texture_settings(paths)
block = texture_views.load_views_block(paths)
pairs = texture_views.resolve_view_pairs(paths, settings, block)
assert [pair.page_mode for pair in pairs] == ["fixed", "auto"]
@pytest.mark.parametrize(
("page_yaml", "expected"),
[
(" page:\n mode: guessed\n", "mode"),
(" page:\n px_per_mm: 0\n", "px_per_mm"),
(" page:\n px_per_mm: -5\n", "px_per_mm"),
(" page:\n px_per_mm: thick\n", "px_per_mm"),
(" page:\n nope: 1\n", "unknown key"),
(" page: nope\n", "must be a mapping"),
(
" pairs:\n - {id: a, camera: c, uv_map: u, page: sideways}\n",
"page",
),
],
)
def test_page_block_rejects_bad_values(tmp_path: Path, page_yaml: str, expected: str) -> None:
if page_yaml.startswith(" pairs:"):
# This case replaces the pairs block rather than appending to it.
revision = _write_revision(
tmp_path,
"texture_patch_views:\n enabled: true\n" + page_yaml,
)
else:
revision = _write_revision(tmp_path, TWO_PAIRS + page_yaml)
paths = RevisionPaths.from_revision_dir(revision)
with pytest.raises(TextureConfigError) as excinfo:
texture_views.resolve_view_pairs(paths, resolve_texture_settings(paths))
assert expected in str(excinfo.value)
def test_real_revisions_size_the_page_per_view(real_revision: Path) -> None:
"""Both shipped revisions derive the page, at the density that preserves their raster."""
paths = RevisionPaths.from_revision_dir(real_revision)
block = texture_views.load_views_block(paths)
page = texture_views.resolve_page_settings(block)
assert page["mode"] == "auto"
assert page["px_per_mm"] == 200.0
assert all(pair.page_mode == "auto" for pair in texture_views.resolve_view_pairs(
paths, resolve_texture_settings(paths), block
))
def test_page_derivation_is_not_attempted_host_side(real_revision: Path) -> None:
"""The page needs the mesh and the camera, so the host carries the mode, not a number.
If the host ever starts printing a page it computed itself, this fails — which is the
point: the console must describe the page the run used, not one it guessed.
"""
paths = RevisionPaths.from_revision_dir(real_revision)
block = texture_views.load_views_block(paths)
settings = resolve_texture_settings(paths)
pairs = texture_views.resolve_view_pairs(paths, settings, block)
job = texture_views.build_multiview_job(paths, settings, pairs, paths.root / "o", block)
assert "page_mm" not in job
assert isinstance(job["page"]["mode"], str)
for pair in job["pairs"]:
assert pair["page"] in texture_views.PAGE_MODES
def test_authored_merge_block_resolves_into_the_job(tmp_path: Path) -> None:
revision = _write_revision(tmp_path, TWO_PAIRS + AUTHORED_MERGE)
paths = RevisionPaths.from_revision_dir(revision)