feat: Wafer Map integration
## Backend — Session & playback - Add SessionController (QML-facing live/review controller) with loadedFile property for active-file highlight binding - Add SessionModel, FramePlayer, and CsvRecorder for state machine, frame seek/step/speed, and CSV recording - Add SensorEditor for per-sensor value overrides (replace + offset)
This commit is contained in:
@@ -120,24 +120,37 @@ class FileBrowser(QObject):
|
||||
for csv_path in sorted(self._current_directory.glob("*.csv")):
|
||||
try:
|
||||
metadata = self._load_metadata(csv_path)
|
||||
wafer_type = metadata.get_wafer_type().upper() or (csv_path.stem[0].upper() if csv_path.stem else "")
|
||||
date_str = metadata.string_date_format()
|
||||
serial = metadata.wafer[1:] if len(metadata.wafer) > 1 else ""
|
||||
time_str = date_str[11:] if len(date_str) > 10 else ""
|
||||
self._files.append(
|
||||
{
|
||||
"selected": selected_state.get(str(csv_path), False),
|
||||
"baseName": csv_path.stem,
|
||||
"wafer": metadata.wafer,
|
||||
"date": metadata.string_date_format(),
|
||||
"waferType": wafer_type,
|
||||
"serialNumber": serial,
|
||||
"date": date_str,
|
||||
"timeStr": time_str,
|
||||
"chamber": metadata.chamber,
|
||||
"notes": metadata.notes,
|
||||
"masterType": master_state.get(str(csv_path), "") or metadata.master_type,
|
||||
"fileName": str(csv_path),
|
||||
"highlight": metadata.get_wafer_type() in {"A", "B", "C"},
|
||||
"highlight": wafer_type in {"A", "B", "C"},
|
||||
}
|
||||
)
|
||||
except Exception:
|
||||
stem = csv_path.stem
|
||||
self._files.append(
|
||||
{
|
||||
"selected": selected_state.get(str(csv_path), False),
|
||||
"wafer": csv_path.stem,
|
||||
"baseName": stem,
|
||||
"wafer": stem,
|
||||
"waferType": stem[0].upper() if stem else "",
|
||||
"serialNumber": stem[1:] if len(stem) > 1 else "",
|
||||
"date": "",
|
||||
"timeStr": "",
|
||||
"chamber": "",
|
||||
"notes": "Unable to parse metadata",
|
||||
"masterType": master_state.get(str(csv_path), ""),
|
||||
@@ -186,7 +199,7 @@ class FileBrowser(QObject):
|
||||
|
||||
def _metadata_from_filename(self, csv_path: Path) -> CSVFileMetadata:
|
||||
match = re.match(
|
||||
r"^(?P<wafer>[^-]+)-(?P<date>\d{8})(?:_(?P<run>\d+))?$",
|
||||
r"^(?P<wafer>[^-]+)-(?P<date>\d{8})(?:_(?P<time>\d{6}))?$",
|
||||
csv_path.stem,
|
||||
)
|
||||
if not match:
|
||||
@@ -194,7 +207,9 @@ class FileBrowser(QObject):
|
||||
|
||||
date_text = ""
|
||||
try:
|
||||
parsed = datetime.strptime(match.group("date"), "%Y%m%d")
|
||||
date_part = match.group("date")
|
||||
time_part = match.group("time") or "000000"
|
||||
parsed = datetime.strptime(date_part + time_part, "%Y%m%d%H%M%S")
|
||||
date_text = CSVFileMetadata.format_date(parsed)
|
||||
except ValueError:
|
||||
date_text = ""
|
||||
@@ -236,7 +251,7 @@ class FileBrowser(QObject):
|
||||
def showInfo(self, message: str) -> None:
|
||||
self._show_info(message)
|
||||
|
||||
@Slot(str, result="QVariantMap")
|
||||
@Slot(str, result=dict)
|
||||
def parseCsvMetadata(self, file_path: str) -> dict:
|
||||
from pathlib import Path as _Path
|
||||
|
||||
|
||||
Reference in New Issue
Block a user