fix cli redundant images
finger-xynova first design completed
This commit is contained in:
@@ -52,6 +52,59 @@ texture_patch:
|
||||
thickness_px: 3
|
||||
color: [1.0, 0.0, 0.0, 1.0] # red reference cross
|
||||
|
||||
# Multi-view production textures (`orisys-design texture-views`).
|
||||
#
|
||||
# `cam_uv_1` / `cam_uv_2` already existed in this blend; `uv_1` / `uv_2` and the seam were
|
||||
# added to `sensing_surface`. Verified: the marked seam is a valid cut — 45 edges splitting
|
||||
# the surface into 2 components of 308.314 / 308.311 mm^2 (50.0 / 50.0) — and at the default
|
||||
# 62 degree limit the partition leaves 0.100 mm^2 of hole (fraction 0.0002), well inside
|
||||
# max_hole_fraction. Coverage: 4960/5007 triangles owned, 20454 + 21483 fragments emitted.
|
||||
#
|
||||
# NOTE: this revision contains SIX sensing-surface variants (`sensing_surface`, `_0`, `_0918`,
|
||||
# `_0928`, `_45`, `_918_s`). `_0928` is the only one carrying the seam and `uv_1`/`uv_2`, so
|
||||
# `sensing_surface` is a copy of it. Two consequences to be aware of:
|
||||
# 1. `_0928` is a COINCIDENT duplicate of `sensing_surface` at identical coordinates. The
|
||||
# `EXCLUDE` collection has `exclude=False`, so it is not actually excluded from the view
|
||||
# layer, and the raycast hits the duplicate instead of the target. That rejects every
|
||||
# fragment and the region cameras return 0 — `texture-views` now fails loudly and names
|
||||
# the intercepting object rather than writing blank textures. `_0928` is hidden.
|
||||
# 2. The probe/render baseline (`build/probe/finger-xynova/r01/probe_frames.npz`) was built
|
||||
# from the 2508-vertex `sensing_surface_918_s`, while `sensing_surface` has 2584 vertices.
|
||||
# `tests/test_render.py::test_end_to_end_render_manifest` therefore fails on the vertex
|
||||
# count. That is a fixture/stale-baseline mismatch, not a texture bug: either regenerate
|
||||
# the probe frames for the current surface, or author the seam and the extra UV layouts
|
||||
# on whichever surface is canonical. `expected.*` below would have caught this and is
|
||||
# still read by nothing.
|
||||
texture_patch_views:
|
||||
enabled: true
|
||||
pattern_camera: cam_sensor # the pattern every layout carries, same source as `compute`
|
||||
pairs:
|
||||
- id: uv_1
|
||||
camera: cam_uv_1 # REGION camera
|
||||
uv_map: uv_1
|
||||
- id: uv_2
|
||||
camera: cam_uv_2
|
||||
uv_map: uv_2
|
||||
merge:
|
||||
mode: authored # honour the 45-edge seam marked on the mesh
|
||||
incidence_limit_deg: 62.0 # measured on this part: hole fraction 0.0002 at 62 deg
|
||||
min_footprint_mm2: 2.0e-3
|
||||
min_triangle_coverage: 0.60
|
||||
max_hole_fraction: 0.02
|
||||
component_policy: best_coverage
|
||||
seam:
|
||||
boundary: use_seam
|
||||
pins: []
|
||||
# Empty band along the seam, to absorb two-pass registration error. Default total width is
|
||||
# 2 x alignment_tolerance_mm = 0.2 mm, half per file; `total_mm` overrides the derivation.
|
||||
gap:
|
||||
enabled: false # false = hard butt at the seam, no band at all
|
||||
apply: post_process # post_process = straight edge | geometry_trim = sawtooth
|
||||
treatment: no_print # the band carries nothing
|
||||
alignment_tolerance_mm: 0.1 # per-pass placement accuracy, mm
|
||||
print:
|
||||
base_fill: owned # white ground, clipped by the seam
|
||||
|
||||
# Post-generation printability inspection (`orisys-design inspect`). Advisory
|
||||
# only: it reports a verdict but never blocks generation or changes exit codes.
|
||||
# Millimetres are measured on the vector page declared above.
|
||||
|
||||
Binary file not shown.
@@ -50,35 +50,74 @@ texture_patch:
|
||||
thickness_px: 3
|
||||
color: [1.0, 0.0, 0.0, 1.0] # red reference cross
|
||||
|
||||
# Multi-view production textures (`orisys-design texture-views`). STEP 1 ONLY: each pair
|
||||
# writes its own independent PNG/SVG/PDF. There is no ownership partition, no seam handling
|
||||
# and no merge, so the two layouts may cover the same surface region and that overlap is
|
||||
# deliberately left unresolved.
|
||||
# Multi-view production textures (`orisys-design texture-views`).
|
||||
#
|
||||
# The PATTERN is grounded on the sensing camera, not on the production views. `uv_1` and
|
||||
# `uv_2` are two different *parameterisations* of the one surface pattern that
|
||||
# `texture_compute` carries, so the printed marker stays a single pattern across the whole
|
||||
# surface. `cam_uv_1` / `cam_uv_2` are the AUTHORING cameras used in Blender (Project from
|
||||
# View (Bounds)) to create those layouts — they are not pattern sources. Passing cam_sensor
|
||||
# as the projection camera with uv_1 / uv_2 as the interpolated layers is exactly what
|
||||
# patch_projection.build_patch_geometry already supports.
|
||||
# surface. `cam_uv_1` / `cam_uv_2` authored those layouts in Blender (Project from View
|
||||
# (Bounds)) and now serve as each pair's REGION camera: they decide which surface that pair
|
||||
# may own. Neither is a pattern source.
|
||||
#
|
||||
# OWNERSHIP closes the overlap. `uv_1` and `uv_2` are both full-surface layouts, so printing
|
||||
# both would double-ink essentially the whole part. Every loop triangle is assigned to
|
||||
# exactly one pair and each file emits only its own triangles, which makes zero double ink a
|
||||
# property of the partition rather than something to measure after printing.
|
||||
#
|
||||
# Rendering settings (page size, grid, palette, seed) come from `texture_patch` above,
|
||||
# because they are decisions about the printed page rather than about a particular layout.
|
||||
# `produce`/`compute` and `orisys-design texture` are untouched.
|
||||
#
|
||||
# Scope note: `uv_1`/`uv_2` are related by roughly a 90 degree rotation with a flip — no
|
||||
# rigid or affine transform maps one onto the other, because each is a different projection
|
||||
# of a curved surface. Resolving the overlap therefore has to happen in surface space and is
|
||||
# a later step; see src/orisys_sensor_design/texture_views.py.
|
||||
texture_patch_views:
|
||||
enabled: true
|
||||
pattern_camera: cam_sensor # same pattern source as `compute`
|
||||
pattern_camera: cam_sensor # the pattern every layout carries, same source as `compute`
|
||||
pairs:
|
||||
- id: uv_1 # layout authored from cam_uv_1
|
||||
camera: cam_uv_1 # REGION camera: what this pair may own
|
||||
uv_map: uv_1
|
||||
- id: uv_2 # layout authored from cam_uv_2
|
||||
- id: uv_2
|
||||
camera: cam_uv_2
|
||||
uv_map: uv_2
|
||||
merge:
|
||||
# `authored` honours the seam marked on the mesh: 32 edges on y = 0, which cuts the
|
||||
# surface into 2 components of 177.882 / 177.885 mm^2 (50.0 / 50.0). Because the two
|
||||
# cameras are mirrored about XZ that plane is also where incidence_uv1 == incidence_uv2,
|
||||
# so the hand-drawn seam coincides with the metric-optimal boundary: measured coverage
|
||||
# differs from `computed` by 0.0014 at 60 deg and by nothing from 62 deg up.
|
||||
mode: authored
|
||||
# Calibrated on this mesh (355.767 mm^2, 1977 tris): 60 deg leaves 0.0218 holes and FAILS
|
||||
# max_hole_fraction, 62 deg leaves 0.0000. 65 deg was an earlier estimate from the
|
||||
# pre-edit mesh; 62 is the measured threshold.
|
||||
incidence_limit_deg: 62.0
|
||||
min_footprint_mm2: 2.0e-3 # ~1 printer dot at 600 dpi, squared x 1.1
|
||||
min_triangle_coverage: 0.60
|
||||
max_hole_fraction: 0.02
|
||||
component_policy: best_coverage # not `pinned`: both views qualify, so let the metric rank
|
||||
seam:
|
||||
boundary: use_seam # read mesh.edges[].use_seam as a hard graph cut
|
||||
pins: [] # {component, view, reason} to override a component's owner
|
||||
# Empty band along the seam, to absorb two-pass registration error. Without it the two
|
||||
# files butt exactly at the seam and any placement error makes them overlap there, which
|
||||
# is the delamination case.
|
||||
#
|
||||
# The width is derived, not guessed. Each pass is placed to within
|
||||
# `alignment_tolerance_mm`, so the two can close on each other by twice that; the band
|
||||
# must be at least that wide. Default total = 2 x tolerance = 0.2 mm, half per file, and
|
||||
# `total_mm` overrides the derivation if a different margin is wanted.
|
||||
gap:
|
||||
enabled: true # false = hard butt at the seam, no band at all
|
||||
apply: post_process # post_process = straight edge | geometry_trim = sawtooth
|
||||
treatment: no_print # the band carries nothing
|
||||
alignment_tolerance_mm: 0.1 # per-pass placement accuracy, mm
|
||||
# total_mm: 0.2 # default: 2 x alignment_tolerance_mm
|
||||
print:
|
||||
# Every artifact carries a full-page black `<rect id="background-fill">`. That background
|
||||
# is itself a print element, so it cannot be used as the "no print" marker: the split is
|
||||
# expressed by WHERE the white mesh layer is drawn and where the colour patches are.
|
||||
#
|
||||
# `owned` keeps the same white ground the `compute` texture carries, but clipped to the
|
||||
# triangles this view owns. So white is split by the seam exactly like the pattern is,
|
||||
# and neither file paints white over the other's territory.
|
||||
base_fill: owned
|
||||
|
||||
# Post-generation printability inspection (`orisys-design inspect`). Advisory
|
||||
# only: it reports a verdict but never blocks generation or changes exit codes.
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user