From 4a655ecefb2349e365bda6a9c8923eaf8991abfd Mon Sep 17 00:00:00 2001 From: to3796zw Date: Fri, 19 Jun 2026 17:44:35 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20ScoutNormal=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EB=B3=84=20=ED=95=84=EB=93=9C=20=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EC=A0=95=20(PageIndex=20=EC=A3=BC=EC=9E=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: 운전화면 페이지 이동 후에도 SeqScoutNormal이 이전 페이지(보통 0)의 스카우트 필드로 동작. 원인: LoadScoutField()가 GUI 캐시 selectedIndexNo 의존 — WinForms 티칭 콤보에서만 갱신되어 운전화면/자동운전 경로에선 stale. - SeqScoutNormal_InitParam에 PageIndex 추가, 실행 시점 라이브 페이지 (GetCurrentPageIndex)를 호출부(Recipe/Test VM)에서 명시 주입 - MainPage: LoadScoutField(int) 오버로드 + GetCurrentPageIndex() 추가 - 폴백: 페이지 없으면 selectedIndexNo 로드, 그래도 null이면 빈 리스트(NRE 방지) Co-Authored-By: Claude Opus 4.8 (1M context) --- WeldingComponents/LASA/GUI/Page/MainPage.cs | 18 ++++++++++++++++++ .../Sequences/Main/SeqScoutNormal.cs | 12 +++++++++++- ...ScannerObjectTeachingControlBoxViewModel.cs | 2 ++ .../Views/Test/UCTestSequenceViewModel.cs | 2 ++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/WeldingComponents/LASA/GUI/Page/MainPage.cs b/WeldingComponents/LASA/GUI/Page/MainPage.cs index aaa47b5..c8bb8c0 100644 --- a/WeldingComponents/LASA/GUI/Page/MainPage.cs +++ b/WeldingComponents/LASA/GUI/Page/MainPage.cs @@ -498,9 +498,27 @@ namespace GUI } public List LoadScoutField() { + // [기존 보존 2026-06-19] selectedIndexNo(GUI 캐시) 기반. 하위 호환용으로 남겨둠. return DB.RecipeFieldScan.Instance.GetPageFieldScan( DB.RecipeFieldScan.Instance.GetAutoPageName(selectedIndexNo)); } + // [추가 2026-06-19] 페이지 인덱스를 명시 지정해 스카우트 필드 로드 (시퀀스 PageIndex 주입용) + public List LoadScoutField(int pageIndex) + { + return DB.RecipeFieldScan.Instance.GetPageFieldScan( + DB.RecipeFieldScan.Instance.GetAutoPageName(pageIndex)); + } + // [추가 2026-06-19] 현재 화면에 표시 중인 페이지 인덱스(라이브). 콤보박스 우선, 없으면 ActiveLayer.No. + // 로드 키를 stale 캐시(selectedIndexNo) 대신 라이브 값으로 얻기 위함. + public int GetCurrentPageIndex() + { + int idx = toolStripComboBoxPage.SelectedIndex; + if (idx < 0) { + var active = ScannerCanvasCtrlTeaching?.Model?.ActiveLayer; + idx = active != null ? active.No : 0; + } + return idx; + } void SaveAndLoadFieldScanFromLasaDb(string inputStr = null) { string fullpath = inputStr == null ? DB.Dao.SystemRecipe.WorkRecipeFile : inputStr; diff --git a/WeldingComponents/WeldingCommon/Sequences/Main/SeqScoutNormal.cs b/WeldingComponents/WeldingCommon/Sequences/Main/SeqScoutNormal.cs index 591c8fb..e3208f5 100644 --- a/WeldingComponents/WeldingCommon/Sequences/Main/SeqScoutNormal.cs +++ b/WeldingComponents/WeldingCommon/Sequences/Main/SeqScoutNormal.cs @@ -148,7 +148,13 @@ namespace WeldingCommon.Sequences //CamConfig의 PosIndex 순서로 ScoutNoList를 파싱해서 사용하도록 함 //_ChildBufRowCols = _CamConfig.ChildImage.ChildBufRowCols; var mainPage = CommonHelper.GetMainPage(); - _ChildBufRowCols = mainPage.LoadScoutField(); + // [기존 2026-06-19 주석처리] GUI 전역 상태(selectedIndexNo)에 의존 → 페이지 정합성 버그 + //_ChildBufRowCols = mainPage.LoadScoutField(); + // [변경 2026-06-19] InitParam 으로 전달된 페이지 인덱스로 명시 로드 + // 폴백: 해당 페이지가 없으면(인덱스 초과 등) selectedIndexNo 기반 로드, 그래도 null이면 빈 리스트로 NRE 방지. + _ChildBufRowCols = mainPage.LoadScoutField(_InitParam.PageIndex) + ?? mainPage.LoadScoutField() + ?? new List(); _ScoutNoList = GenerateSortedScoutNoList(_ChildBufRowCols); _ScoutNo = 0; @@ -375,6 +381,10 @@ namespace WeldingCommon.Sequences public bool IsRealTimeScout { get; set; } public ScoutSeqParams ScoutSeqParams { get; set; } + // [추가 2026-06-19] 스카우트 필드를 불러올 페이지 인덱스(0-base). + // 기존: SeqScoutNormal 이 MainPage.selectedIndexNo(GUI 전역 상태)에만 의존 → 페이지 이동/자동운전 시 stale. + // 변경: 호출부가 "현재 처리/표시 중인 페이지 번호"를 명시 주입. + public int PageIndex { get; set; } = 0; } public class SeqScoutNormal_OutParam : OutParam diff --git a/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingControlBoxViewModel.cs b/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingControlBoxViewModel.cs index a4a5be5..0233159 100644 --- a/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingControlBoxViewModel.cs +++ b/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingControlBoxViewModel.cs @@ -251,6 +251,8 @@ namespace WeldingCommon.Views var param = new SeqScoutNormal_InitParam() { IsRealTimeScout = false, ScoutSeqParams = scoutSeqParams, + // [추가 2026-06-19] 현재 표시 중인 페이지의 스카우트 필드를 사용하도록 명시 주입 + PageIndex = CommonHelper.GetMainPage().GetCurrentPageIndex(), }; PopupSequenceDiagram(ref _WinSequenceDiagramScoutNormal, CommonSequenceIds.SeqScoutNormal, param); diff --git a/WeldingComponents/WeldingCommon/Views/Test/UCTestSequenceViewModel.cs b/WeldingComponents/WeldingCommon/Views/Test/UCTestSequenceViewModel.cs index 69e6fcc..98fba38 100644 --- a/WeldingComponents/WeldingCommon/Views/Test/UCTestSequenceViewModel.cs +++ b/WeldingComponents/WeldingCommon/Views/Test/UCTestSequenceViewModel.cs @@ -361,6 +361,8 @@ namespace WeldingCommon.Views var param = new SeqScoutNormal_InitParam() { IsRealTimeScout = false, ScoutSeqParams = new ScoutSeqParams(VisionRecipeManager.GetFovInfos()[0], eDisplayType.Machine_B), + // [추가 2026-06-19] 현재 표시 중인 페이지 인덱스 주입 + PageIndex = CommonHelper.GetMainPage().GetCurrentPageIndex(), }; IsSequenceRunning_SeqScoutNormal = true;