2026-01-26 18:56:53 +09:00

153 lines
5.7 KiB
C#

/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora;
using Aurora.Api;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using VisionCommon;
using VisionCalibrator;
using VisionSequence.Setup;
using System.Linq;
using System.Reactive.Linq;
using VisionCommonUI;
using VisionCommonUI.Resources;
using System.Reactive.Disposables;
namespace VisionUI.Setup {
/// <summary>
/// 캘리브레이션 뷰 모델
/// </summary>
class CalViewModel : INotifyPropertyChanged {
private Logger Log = new Logger("CalViewModel");
private ISequence _CalSeq;
private SubSysInfo _SubSysInfo;
private List<CalResultItem> _CalItems;
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>캘리브레이션 세팅 뷰 모델</summary>
public CalSettingViewModel _CalSettingViewModel;
/// <summary>캘리브레이션 로그 뷰 모델</summary>
public CalLogViewModel _CalLogViewModel;
/// <summary>캘리브레이션 파라미터 뷰 모델</summary>
public CalParamViewModel _CalParamViewModel;
/// <summary>
/// 생성자
/// </summary>
/// <param name="subSysInfo">서브시스템 정보</param>
public CalViewModel(SubSysInfo subSysInfo) {
_SubSysInfo = subSysInfo;
_CalItems = new List<CalResultItem>();
var disposable = VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.UPDATE_CAL_SUB_SEQ_LOG)
//.Select(msg => ((ValueTuple<PlanItem>)msg.Param))
.Select(msg => msg.Param)
.ObserveOnDispatcher()
.Subscribe(x => UpdateLog((PlanItem)x));
DisposableManager.AddDisposable(eDpsGroupKey.SubMenu_Calibration, disposable);
}
/// <summary>
/// 캘리브레이션 세팅 뷰 모델 설정(할당 및 이벤트 연결)
/// </summary>
/// <param name="calSettingViewModel">캘리브레이션 세팅 뷰 모델</param>
public void SetCalSettingViewModel(CalSettingViewModel calSettingViewModel) {
_CalSettingViewModel = calSettingViewModel;
_CalSettingViewModel.CalPlanCreated += PlanCreated;
_CalSettingViewModel.CancelSequence += SequenceStop;
}
/// <summary>
/// 캘리브레이션 로그 뷰 모델 설정(할당)
/// </summary>
/// <param name="calLogViewModel">캘리브레이션 로그 뷰 모델</param>
public void SetCalLogViewModel(CalLogViewModel calLogViewModel) {
_CalLogViewModel = calLogViewModel;
}
/// <summary>
/// 캘리브레이션 파라미터 뷰 모델 설정(할당)
/// </summary>
/// <param name="calParamViewModel">캘리브레이션 파라미터 뷰 모델</param>
public void SetCalParamViewModel(CalParamViewModel calParamViewModel) {
_CalParamViewModel = calParamViewModel;
}
private void UpdateLog(PlanItem item) {
if(_CalLogViewModel != null) {
var planItem = item.Clone();
if (VisionSettingManager.VisionSetting.CoordUnit == eCoordUnit.UM) {
planItem.X = $"{MathUtil.ConvertUnitMilliToMicro(Double.Parse(planItem.X))}";
planItem.Y = $"{MathUtil.ConvertUnitMilliToMicro(Double.Parse(planItem.Y))}";
}
Application.Current.Dispatcher.Invoke(() => _CalLogViewModel.PlanListItems.Add(planItem));
UpdateCsvLog(planItem);
}
}
private void PlanCreated(object sender, CalSeqParams e) {
_CalLogViewModel.PlanListItems.Clear();
ClearCsvLog();
var InitParam = e;
CalSeqParams calProcSeqParam = new CalSeqParams();
calProcSeqParam.SubSysInfo = InitParam.SubSysInfo;
calProcSeqParam.DisplayType = InitParam.DisplayType;
calProcSeqParam.PlanItems = InitParam.PlanItems.ToList();
calProcSeqParam.CalSetupRecipe = InitParam.CalSetupRecipe;
_CalSeq = VisionEnv.AuroraEnv.SequenceEntry[VisionKeys.CalSeqKey];
_CalSeq?.Start(calProcSeqParam, OnCompleted);
}
private void OnCompleted(SequenceActionResult SeqResult) {
if (SeqResult.Param == null) {
MessageBoxUtil.ShowMessageBoxError(
string.Format(StrTokens.MSG_E_CalSeqStop));
return;
}
var results = SeqResult.Param as CalCalculateResultParams;
if (results.Results.Count > 0) {
_CalParamViewModel.SetCalResult(results.Results, _CalSettingViewModel.CalSetupRecipe);
SaveCsvLog();
}
else {
MessageBoxUtil.ShowMessageBoxError(
string.Format(StrTokens.MSG_E_CalCalculationStop));
}
}
private void ClearCsvLog() {
_CalItems.Clear();
}
private void UpdateCsvLog(PlanItem item) {
_CalItems.Add(CalItemManager.GetCalItem(_SubSysInfo, item));
}
private void SaveCsvLog() {
var csvManager = new CsvManager();
csvManager.SaveCsv(_SubSysInfo, _CalItems, eSaveDataType.Calibration);
}
private void SequenceStop(object sender, EventArgs e) {
if (_CalSeq == null)
return;
_CalSeq.EmergencyStop();
}
private void NotifyPropertyChanged(string propName) {
PropertyChanged?.Invoke(
this,
new PropertyChangedEventArgs(propName));
}
}
}