style: increase ReadoutPanel font sizes and add CSV test fixture for data logging
This commit is contained in:
@@ -12,7 +12,7 @@ from pygui.backend.wafer.zwafer_models import Sensor
|
||||
class CsvRecorder:
|
||||
def __init__(self) -> None:
|
||||
self._file_handle: Optional[TextIO] = None
|
||||
self._path: Optional[str] = None
|
||||
self._oath: Optional[str] = None
|
||||
|
||||
|
||||
@property
|
||||
@@ -47,9 +47,15 @@ class CsvRecorder:
|
||||
return path
|
||||
|
||||
@staticmethod
|
||||
def write_segment(file_path: str, source_path: str, start_frame: int, end_frame: int) ->bool:
|
||||
def write_segment(file_path: str, source_path: str, start_frame: int, end_frame: int) -> bool:
|
||||
"""Copy a range of frames from source CSV into a new file.
|
||||
|
||||
Preserves the source's header structure so the segment re-imports
|
||||
through FileBrowser unchanged: official CSVs keep their sensor-name
|
||||
row, Z-wafer CSVs keep every metadata line through the "data"
|
||||
sentinel. Frame indices count only valid data rows, matching how
|
||||
the readers in data_records.py number frames.
|
||||
|
||||
Args:
|
||||
file_path: Output CSV path.
|
||||
source_path: Source CSV path with full wafer data
|
||||
@@ -57,11 +63,53 @@ class CsvRecorder:
|
||||
end_frame: Last frame index (inclusive)
|
||||
|
||||
Returns:
|
||||
True on success.
|
||||
True on success (at least one frame written).
|
||||
"""
|
||||
import pandas as pd
|
||||
df = pd.read_csv(source_path)
|
||||
segment = df.iloc[start_frame:end_frame + 1]
|
||||
segment.to_csv(file_path, index=False)
|
||||
from pygui.backend.data.data_records import is_official_csv
|
||||
|
||||
if start_frame < 0 or end_frame < start_frame:
|
||||
return False
|
||||
|
||||
def _is_data_row(stripped: str) -> bool:
|
||||
cols = [c.strip() for c in stripped.split(",") if c.strip()]
|
||||
if not cols:
|
||||
return False
|
||||
try:
|
||||
[float(c) for c in cols]
|
||||
except ValueError:
|
||||
return False
|
||||
return True
|
||||
|
||||
with open(source_path, "r", encoding="utf-8") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
out: list[str] = []
|
||||
written = 0
|
||||
frame_idx = -1
|
||||
in_data = is_official_csv(source_path)
|
||||
|
||||
for i, line in enumerate(lines):
|
||||
stripped = line.rstrip().rstrip(",").strip()
|
||||
if not in_data:
|
||||
out.append(line)
|
||||
if stripped and stripped.split(",")[0].lower() == "data":
|
||||
in_data = True
|
||||
continue
|
||||
if i == 0:
|
||||
# official format: row 0 is the sensor-name header
|
||||
out.append(line)
|
||||
continue
|
||||
if not stripped or not _is_data_row(stripped):
|
||||
continue
|
||||
frame_idx += 1
|
||||
if start_frame <= frame_idx <= end_frame:
|
||||
out.append(line if line.endswith("\n") else line + "\n")
|
||||
written += 1
|
||||
|
||||
if written == 0:
|
||||
return False
|
||||
Path(file_path).parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(file_path, "w", encoding="utf-8", newline="") as f:
|
||||
f.writelines(out)
|
||||
return True
|
||||
|
||||
|
||||
Reference in New Issue
Block a user