ksj09406 c517993e1a RCC 패턴 변경 알림(B2506/B2409), 서브 패턴 10개 확장 및 현장 소스 동기화
- 오토런 시작 시 RCC 패턴 폴더 변경 감지 → B2506 ON, PLC ACK(B2409) 수신 시 OFF
- 서브 패턴 1~10, 패턴 목록에 서브 썸네일 표시(행 내 좌우 스크롤)
- 서브 패턴 등록 직후 활성화 OFF
- 패턴 파일이 다른 프로그램에서 열려 있으면 삭제하지 않고 안내
- 현장 소스 반영: Train ROI 슬라이더, KS 조명 밝기 저장/적용, 조명 ID 분리,
  스캔 후 카메라 라이브 재시작, 레시피 21 RCC NG 우회, 오토런 상태 판단
2026-10-15 14:36:29 +09:00

183 lines
7.3 KiB
C#

/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using System;
using Aurora.Api;
using Aurora.Api.DataType;
using Aurora.View;
using VisionCommon;
using MilPattern;
using Hermes;
using MilCommon;
using VisionCommonUI;
using VisionCommonUI.Resources;
namespace MilUI {
public class MultiLineParamSettingViewModel : NotifyPropertyChangedBase, IGraEventSubscriber, IDisposable {
private Logger _logger = new Logger(typeof(MultiLineParamSettingViewModel).Name);
#region Binding Properties
private PatternInfo _PatternInfo;
public PatternInfo PatternInfo { get => _PatternInfo; set => SetProperty(ref _PatternInfo, value); }
private eRoiIdx _RoiIdx;
public eRoiIdx RoiIdx { get => _RoiIdx; set => SetProperty(ref _RoiIdx, value); }
private eColor _RoiColor = eColor.Cyan;
public eColor RoiColor { get => _RoiColor; set => SetProperty(ref _RoiColor, value); }
private LineFinderRunParam _runParam;
public LineFinderRunParam RunParam { get => _runParam; set => SetProperty(ref _runParam, value); }
#endregion
private PatternAgentBase _patternAgent;
private CameraDisplay _cameraDisplay;
private FovInfo _fovInfo;
public MultiLineParamSettingViewModel(
PatternAgentBase patternAgent, PatternInfo subPatternInfo, CameraDisplay cameraDisplay, FovInfo fovInfo, eRoiIdx roiIdx) {
_patternAgent = patternAgent;
_cameraDisplay = cameraDisplay;
_fovInfo = fovInfo;
PatternInfo = subPatternInfo;
RoiIdx = roiIdx;
CreatePattern();
_cameraDisplay.SetGraEventSubscriber(PatternInfo, this);
}
public void SetEnabled(bool isActivated) {
PatternInfo.IsActivated = isActivated;
}
public void CreatePattern() {
if (!_patternAgent.IsPatternExist(PatternInfo.GetPatternIndex())) {
if (E1.OK == _patternAgent.Create(PatternInfo)) {
PatternInfo.IsActivated = false;
RunParam = new LineFinderRunParam();
_patternAgent.SetRunParam(PatternInfo, RunParam);
if (E1.OK != _patternAgent.Save(PatternInfo)) {
_logger.FuncE("Failed to save multi line.");
}
}
else {
_logger.FuncE("Failed to create multi line.");
}
}
else {
RunParam = (_patternAgent.GetRunParam(PatternInfo) as LineFinderRunParam).Clone() as LineFinderRunParam;
}
RoiColor = RunParam.MrkParamExt.FindROI.RoiColor;
RunParam.MrkParamExt.FindROI.RoiIdx = RoiIdx;
RunParam.MrkParamExt.FindROI.Angle.Degree = ConvertDegreeDecimalPlaces(RunParam.MrkParamExt.FindROI.Angle.Degree);
}
public void ShowFindROI() {
RunParam.MrkParamExt.FindROI.RoiIdx = RoiIdx;
RunParam.MrkParamExt.FindROI.RoiColor = RoiColor;
_cameraDisplay.SetPatternInfo(PatternInfo, RunParam.MrkParamExt.FindROI.RoiIdx);
var milImage = _cameraDisplay.GetImage();
if (milImage != 0) {
var imageSize = MilEnvironment.GetImageSize(milImage);
var findRoi = GetFindROIFromRunParam(imageSize, RunParam);
_cameraDisplay.AddFindRoi(findRoi, true);
}
}
public void HideFindROI() {
_cameraDisplay.ClearFindRoi(RunParam.MrkParamExt.FindROI.RoiIdx);
_cameraDisplay.ClearFindLabelNumGraphics(RunParam.MrkParamExt.FindROI.RoiIdx);
}
public void Clear() {
var subPatternIndex = PatternInfo.GetPatternIndex();
PatternInfo = _patternAgent.GetPatternInfo(subPatternIndex).Clone() as PatternInfo;
RunParam = (_patternAgent.GetRunParam(PatternInfo) as LineFinderRunParam).Clone() as LineFinderRunParam;
RoiIdx = RunParam.MrkParamExt.FindROI.RoiIdx;
RoiColor = RunParam.MrkParamExt.FindROI.RoiColor;
RunParam.MrkParamExt.FindROI.Angle.Degree = ConvertDegreeDecimalPlaces(RunParam.MrkParamExt.FindROI.Angle.Degree);
if (PatternInfo.IsActivated) {
ShowFindROI();
}
}
public void Save() {
if (_cameraDisplay.HasFindRoi(RunParam.MrkParamExt.FindROI.RoiIdx)) {
RunParam.MrkParamExt.FindROI = _cameraDisplay.GetFindRoi(RunParam.MrkParamExt.FindROI.RoiIdx).Clone() as ROI;
}
RunParam.MrkParamExt.FindROI.RoiIdx = RoiIdx;
RunParam.MrkParamExt.FindROI.RoiColor = RoiColor;
_patternAgent.SetRunParam(PatternInfo, RunParam);
_patternAgent.Save(PatternInfo);
}
public void Find() {
var image = _cameraDisplay.GetImage();
if (image == null) {
MessageBoxUtil.ShowMessageBoxError(StrTokens.MSG_E_ImageNotReady);
return;
}
if (PatternInfo.IsActivated) {
_cameraDisplay.ClearMeasureGraphics();
if (_cameraDisplay.HasFindRoi(RunParam.MrkParamExt.FindROI.RoiIdx)) {
RunParam.MrkParamExt.FindROI = _cameraDisplay.GetFindRoi(RunParam.MrkParamExt.FindROI.RoiIdx).Clone() as ROI;
}
var oldRunParam = _patternAgent.GetRunParam(PatternInfo) as LineFinderRunParam;
_patternAgent.SetRunParam(PatternInfo, RunParam);
var patternResult = _patternAgent.Find(PatternInfo, image);
_patternAgent.Draw(PatternInfo, patternResult, _cameraDisplay);
_patternAgent.SetRunParam(PatternInfo, oldRunParam); // Find가 끝난 후, 원본 RunParam으로 복원
}
}
private ROI GetFindROIFromRunParam(ImageSize imageSize, LineFinderRunParam runParam) {
if ((0 < runParam.MrkParamExt.FindROI.Width && runParam.MrkParamExt.FindROI.Width < imageSize.Width) &&
(0 < runParam.MrkParamExt.FindROI.Height && runParam.MrkParamExt.FindROI.Height < imageSize.Height)) {
return runParam.MrkParamExt.FindROI.Clone() as ROI;
}
int pixelOffset = (int)runParam.MrkParamExt.FindROI.RoiIdx * 50;
return new ROI(
new ImagePoint(imageSize.Width * 0.5 + pixelOffset, imageSize.Height * 0.5 + pixelOffset),
100, 300,
Angle.CreateWithDegree(0),
RoiIdx,
RoiColor);
}
public void UpdateAngleOfFindRoi(double roiAngle) {
_cameraDisplay.UpdateAngleOfFindRoi(roiAngle, RunParam.MrkParamExt.FindROI.RoiIdx);
}
public void UpdateAngleOfRoi(eGraRoiType graRoiType, object param) {
if (graRoiType == eGraRoiType.FindRoi) {
RunParam.MrkParamExt.FindROI.Angle.Degree = ConvertDegreeDecimalPlaces((double)param);
NotifyPropertyChanged(nameof(RunParam));
}
}
public void UpdateRadiusOfRoi(eGraRoiType graRoiType, double radius) {
}
private double ConvertDegreeDecimalPlaces(double degree) {
return Math.Round(degree, 1);
}
public void Dispose() {
}
}
}