fix algining xynova texture to uv printing fixture.
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user