10 KiB
진단계측 변경 파일 목록 (배포용) — 2026-08-04
| 항목 | 내용 |
|---|---|
| 대상 | LGES-OC5-PtoP-Welder / ILSOS_PrismaticRD_PTOP |
| 목적 | 진단계측이 들어간 파일 5개를 현장/작업 PC로 옮기기 위한 목록 |
| 마커 | [진단계측 2026-08-04] |
| 적용 문서 | docs/작업지시서/2026-08-04_Laser_Recipe_Save_진단계측.md |
| 원복 문서 | docs/작업지시서/2026-08-04_Laser_Recipe_Save_진단계측_원복.md |
| 브랜치 | feature/ubisam-pptx-integration |
마커 규칙
계측으로 넣은 코드는 전부 아래 문자열을 포함합니다. 저장소에서 이 문자열만 검색하면 손댄 곳을 빠짐없이 찾을 수 있습니다.
[진단계측 2026-08-04]
소스 안에서는 시작/끝이 쌍을 이룹니다.
// ═══ [진단계측 2026-08-04] 시작 ═══
… 이 사이가 전부 계측 코드 …
// ═══ [진단계측 2026-08-04] 끝 ═══
각 블록 머리 주석에 원본 코드가 그대로 적혀 있습니다. 문서 없이 소스만 보고도 되돌릴 수 있습니다.
변경 파일 5개
경로는 저장소 루트(E:\Work\GIT\LGES-OC5-PtoP-Welder) 기준입니다.
| # | 파일 | 구분 | 마커 쌍 | 요지 |
|---|---|---|---|---|
| 1 | WeldingComponents\WeldingCommon\Utils\RecipeTrace.cs |
신규 | 파일 전체 | 계측 본체. 흔적 기록·지문·팝업 |
| 2 | WeldingComponents\WeldingCommon\WeldingCommon.csproj |
수정 | 1 (주석) | 위 신규 파일 빌드 등록 |
| 3 | WeldingComponents\WeldingCommon\Utils\RecipeHelper.cs |
수정 | 3 | 대상 변경·저장·내용 전환 계측 |
| 4 | WeldingComponents\LASA\GUI\Page\MainPage.cs |
수정 | 2 | Page(FieldHelper.json) 기록 훅 |
| 5 | WeldingComponents\WeldingCommon\Utils\CommonHelper.cs |
수정 | 1 | 위 훅 연결 |
프로젝트는 2개(WeldingCommon, LASAGUI)에 걸칩니다. ILSOS_PrismaticRD_PTOP 소스는 손대지 않았습니다.
파일별 상세
1. WeldingComponents\WeldingCommon\Utils\RecipeTrace.cs — 신규
파일 전체가 진단 전용입니다. 원복 시 파일째 삭제합니다.
| 공개 멤버 | 역할 |
|---|---|
Mark(evt, detail) |
한 줄 흔적 기록. 호출 시점의 선택/메모리/LASA마커/활성/설비상태/스레드/호출자를 함께 남김 |
BeforeSave(recipeName, targetPath) |
저장 직전 스냅샷. 신원 어긋남 3종(arg/path/marker) 판정 |
AfterSave(snap) |
저장 직후 재측정. 무엇이 무엇으로 바뀌었는지 판정 + 팝업 |
MemFingerprint() |
메모리(ScannerCanvasUserCtrl.ScannerParams) 지문 |
FileFingerprint(path) |
레시피 파일 지문 |
Attach() |
MainPage.Tracer 에 Mark 연결 (4번 파일용) |
동작 스위치 (파일 상단 상수)
| 상수 | 기본값 | 의미 |
|---|---|---|
ALWAYS_SHOW_ON_SAVE |
false |
true 면 저장할 때마다 팝업. 흐름을 눈으로 볼 때만 사용 |
SHOW_IN_AUTO |
false |
true 면 Auto 중에도 팝업. 양산 중에는 켜지 말 것 (모달이 시퀀스를 세움) |
출력 — D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\RecipeTrace.txt (append). 팝업을 놓쳐도 여기 남습니다.
2. WeldingComponents\WeldingCommon\WeldingCommon.csproj — 수정
위치: Utils\RecipeHelper.cs 항목 바로 뒤 (≈273행)
<!-- [진단계측 2026-08-04] 원복 시 이 1줄 삭제 -->
<Compile Include="Utils\RecipeTrace.cs" />
구식 csproj 라 이 등록이 없으면 신규 파일이 빌드에 포함되지 않습니다.
3. WeldingComponents\WeldingCommon\Utils\RecipeHelper.cs — 수정 (마커 3쌍)
| 블록 | 위치(현재) | 원본 | 넣은 것 |
|---|---|---|---|
| 3-1 | 18~32행 SelectedRecipe |
필드 1줄 | 필드 → 프로퍼티 전환. setter 에서 Mark("대상변경 SELECTED") |
| 3-2 | 51~65행 SaveRecipe |
본문 1줄 | 저장 전 BeforeSave / 저장 후 AfterSave |
| 3-3 | 90~115행 ReloadRecipe |
본문 3줄 | try/catch 로 감싸 성공·실패·무변화 구분 기록. throw; 로 예외 전파 보존 |
3-1이 핵심입니다. SelectedRecipe 대입은 저장소 전체에 4곳뿐이고 나머지는 전부 읽기라, setter 한 곳에서 4개 지점이 호출자까지 자동으로 잡힙니다.
| 대입 지점 | 경로 |
|---|---|
UCScannerObjectTeachingViewModel.cs:114 |
신규 레시피 생성 |
UCScannerObjectTeachingViewModel.cs:165 |
OnChanged |
UCScannerObjectTeachingViewModel.cs:172 |
Reloaded |
RecipeHelper.cs:76(원본 기준) |
OnActiveReloaded |
3-3에서 나오는 두 문구가 원인 확정의 근거입니다.
| 문구 | 의미 |
|---|---|
*** RELOAD 실패 *** |
선행문서 원인 (1) 확정. 대상만 바뀌고 내용은 직전 레시피에 남음 |
RELOAD 완료(내용무변화!) |
Recipe.cs:64 무동작 가설 확정. 경로 비교로는 못 잡는 케이스 |
4. WeldingComponents\LASA\GUI\Page\MainPage.cs — 수정 (마커 2쌍)
왜 필요한가 — FieldHelper.json(Page 데이터)을 실제로 쓰는 건 SaveAndLoadFieldScanFromLasaDb() 이고, 호출처 4곳 중 SaveRecipe 안에 있는 건 1곳뿐입니다. 나머지는 Save 없이도 파일을 씁니다.
| 호출처 | Save 경로 안인가 |
|---|---|
MainPage.cs:433 — SaveRecipe |
✓ |
MainPage.cs:448,452 — ReloadSetting() |
✗ |
MainPage.cs:502,505 — UpdateScoutField() (Scout 필드 조작) |
✗ |
MainPage.cs:1433 — 콤보박스 SelectedIndexChanged (페이지 바꿀 때마다) |
✗ |
게다가 경로를 WorkRecipeFile 기준으로 정합니다(원본 :537). 즉 WorkRecipeFile 이 어긋난 상태에서 페이지를 넘기기만 해도 엉뚱한 레시피 폴더의 FieldHelper.json 이 덮어써질 수 있습니다. _suppressPageFieldSync 가드(:1422, 2026-06-20 추가)는 ReloadRecipe 도중의 발화만 막고 평상시 페이지 전환은 그대로 씁니다.
넣은 것
| 블록 | 위치(현재) | 내용 |
|---|---|---|
| 4-1 | ≈535~540행 (SaveAndLoadFieldScanFromLasaDb 바로 위) |
public static Action<string, string> Tracer; 필드 |
| 4-2 | ≈545~548행 (newpath 계산 직후, SaveFieldHelper 직전) |
Tracer?.Invoke("PAGE 저장 FieldHelper", …) |
함수 한 곳에 넣어 호출처 4곳이 전부 잡힙니다. 기록되는 값은 실제 기록 경로(newpath)와 그 경로가 WorkRecipeFile 에서 왔는지 인자로 지정됐는지입니다 — 오염 판정의 핵심입니다.
델리게이트를 쓰는 이유 — 참조 방향이
WeldingCommon→LASAGUI단방향이라MainPage에서RecipeTrace를 직접 부를 수 없습니다.Tracer는Action이라 역참조가 생기지 않고, 연결은 5번 파일에서 합니다.Tracer가 안 꽂히면?.로 조용히 무시되므로 계측이 없어도 원래대로 동작합니다.
5. WeldingComponents\WeldingCommon\Utils\CommonHelper.cs — 수정 (마커 1쌍)
위치: SetMainPage() 안, ≈17~20행
RecipeTrace.Attach(); // MainPage.Tracer 에 RecipeTrace.Mark 를 연결
SetMainPage 는 기동 시 MainPage 가 준비되는 시점에 호출되므로, 페이지 조작보다 먼저 훅이 걸립니다.
현장/작업 PC 배포 절차
[!] 소스 파일만 복사해서는 설비가 바뀌지 않습니다. 반드시 재빌드해야 합니다.
- 백업
D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_config_recipe폴더 통째로 복사- 덮어쓸 소스 4개(2·3·4·5번)의 현재 버전 백업 — 원복 시 대조용
- 파일 5개 복사 (위 표의 경로 그대로, 폴더 구조 유지)
- csproj 확인 — Visual Studio 솔루션 탐색기에
RecipeTrace.cs가 보이는지. 안 보이면 2번 파일이 제대로 안 갔거나 [기존 항목 추가]가 필요합니다. - 빌드 —
ILSOS_All.sln→ Release | x64. 실패 시 진행 중단. - 배포 — 빌드 산출물을 설비 실행 경로로 반영.
- 검증 (아래 체크리스트)
배포 후 확인 체크리스트
- 빌드 성공 (경고를 사소하게 넘기지 말 것)
SelectedRecipe관련 컴파일 에러 없음 — 있으면 튜플 멤버 직접 대입(SelectedRecipe.name = …)이나ref/out전달이 어딘가 있다는 뜻 (사전 조사 시점 0건)- Manual 상태에서 레시피 선택 → 파라미터 수정 → Save → 팝업이 뜨지 않고 정상 저장
D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\RecipeTrace.txt생성됨- 그 안에
SAVE 직전/SAVE 직후줄이 있음 → 3번 파일 계측 살아있음 - 페이지 콤보박스를 넘기면
PAGE 저장 FieldHelper줄이 찍힘 → 4·5번 파일 계측 살아있음 - 레시피 전환 시
대상변경 SELECTED/내용변경 RELOAD 진입/RELOAD 완료줄이 찍힘
마지막 두 항목이 안 찍히면 계측이 반만 동작하는 것입니다. PAGE 저장 FieldHelper 가 없으면 Tracer 연결(5번)이 안 된 것이니 CommonHelper.SetMainPage 수정분이 제대로 갔는지 확인하십시오.
현장 데이터 회수
사고(팝업) 발생 시:
- 팝업 화면 전체 촬영 — 맨 위
결론줄과무엇이 무엇으로 바뀌었나블록이 핵심 RecipeTrace.txt회수 (삭제 전 반드시 사본 확보)- 발생 시각, 직전 조작(레시피 전환/페이지 전환/Auto→Manual 등) 메모
_config_recipe폴더의 해당 시점 상태 보존
주의
- 이 계측은 저장을 막지 않습니다. 팝업이 뜨는 시점엔 파일이 이미 덮어써진 뒤입니다. 백업이 유일한 안전장치입니다.
- Save 1회당 레시피 파일 파싱이 4회 늘어 저장이 느려질 수 있습니다. 체감되면
BeforeSave/AfterSave의 활성 파일 지문 계산만 제거하십시오 (판정 하나만 약해집니다). - Auto 중에는 팝업이 뜨지 않고 파일에만 남습니다(
SHOW_IN_AUTO = false). - 계측은 버그 수정이 아닙니다. 원인 확정 후 원복하고, 실제 수정은 선행 문서
작업지시서_2026-08-03_Laser_Recipe_Save_교차오염.txt의 1~4단계를 따르십시오.