feat(export): batch wafer-map PNG export from file list

- BatchExport worker + BatchExportController (threaded, busy flag)
- SourcePanel: Export Maps button → FolderDialog → batch export
  with progress/summary banner (dismissible)
- StreamControlPanel: name single export after loaded CSV + timestamp
This commit is contained in:
jack
2026-07-11 23:53:45 -07:00
parent c26de492d7
commit 7d98759b43
9 changed files with 448 additions and 8 deletions
+93
View File
@@ -0,0 +1,93 @@
"""Tests for src/pygui/backend/wafer/batch_export.py."""
import pytest
pytestmark = pytest.mark.usefixtures("qapp")
def _write_single_frame_csv(path, wafer_id="F12"):
lines = [
f"Wafer ID={wafer_id}",
"Acquisition Date=03/26/2025",
"Label,1,2,3",
"X (mm),0,10,20",
"Y (mm),0,10,20",
"data",
"0.0,149.0,150.0,151.0",
]
path.write_text("\n".join(lines) + "\n", encoding="utf-8")
def test_export_batch_writes_png_for_valid_file(tmp_path):
from pygui.backend.wafer.batch_export import export_batch
csv_path = tmp_path / "f_run.csv"
_write_single_frame_csv(csv_path)
out_dir = tmp_path / "out"
out_dir.mkdir()
results = export_batch([str(csv_path)], str(out_dir), timestamp="20260101_000000")
assert len(results) == 1
assert results[0].success is True
expected_png = out_dir / "f_run_20260101_000000.png"
assert expected_png.exists()
assert results[0].output_path == str(expected_png)
def test_export_batch_skips_bad_file_and_continues(tmp_path):
from pygui.backend.wafer.batch_export import export_batch
bad_csv = tmp_path / "corrupt.csv"
bad_csv.write_text("not a valid wafer csv\n", encoding="utf-8")
good_csv = tmp_path / "f_run.csv"
_write_single_frame_csv(good_csv)
out_dir = tmp_path / "out"
out_dir.mkdir()
results = export_batch(
[str(bad_csv), str(good_csv)], str(out_dir), timestamp="20260101_000000"
)
assert len(results) == 2
assert results[0].success is False
assert results[0].error != ""
assert not (out_dir / "corrupt_20260101_000000.png").exists()
assert results[1].success is True
assert (out_dir / "f_run_20260101_000000.png").exists()
def _write_two_frame_csv(path, wafer_id="F12"):
lines = [
f"Wafer ID={wafer_id}",
"Acquisition Date=03/26/2025",
"Label,1,2,3",
"X (mm),0,10,20",
"Y (mm),0,10,20",
"data",
"0.0,100.0,101.0,102.0",
"1.0,149.0,150.0,151.0",
]
path.write_text("\n".join(lines) + "\n", encoding="utf-8")
def test_export_batch_renders_last_frame_of_multiframe_file(tmp_path):
from pygui.backend.wafer.batch_export import export_batch
multi_csv = tmp_path / "multi.csv"
_write_two_frame_csv(multi_csv)
single_csv = tmp_path / "single.csv"
_write_single_frame_csv(single_csv) # same values as multi's 2nd (last) row
out_dir = tmp_path / "out"
out_dir.mkdir()
export_batch([str(multi_csv)], str(out_dir), timestamp="20260101_000000")
export_batch([str(single_csv)], str(out_dir), timestamp="20260101_000000")
multi_png = (out_dir / "multi_20260101_000000.png").read_bytes()
single_png = (out_dir / "single_20260101_000000.png").read_bytes()
assert multi_png == single_png