Kyungshin-Welder/AuroraVision/VisionUI/Pattern/PatternListViewModel.cs
2026-01-26 14:51:28 +09:00

365 lines
15 KiB
C#

using Aurora.Api;
using VisionCommon;
using VisionSequence.Pattern;
using VisionCommonUI;
using VisionCommonUI.Resources;
using Aurora.View;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using VisionLight;
#if USE_COGNEX
using CogUI;
#else
using MilUI;
#endif
namespace VisionUI {
public class PatternListViewModel : NotifyPropertyChangedBase {
private readonly Logger _logger = new Logger(typeof(PatternListViewModel).Name);
private SubSysInfo _SubSysInfo;
private FovInfo _FovInfo;
private FovRecipe _FovRecipe;
private eCamId _CamId;
protected Window _window = null;
protected PatternAgentBase _PatternAgent = null;
protected readonly int _PatternCnt;
public ICameraView CamViewBase { get; set; }
public ICommand CMD_VisibleChanged { get; }
public ICommand CMD_GrabFind { get; }
public ICommand CMD_Find { get; }
public ICommand CMD_Register { get; }
public ICommand CMD_Edit { get; }
public ICommand CMD_Delete { get; }
public ICommand CMD_Apply { get; }
public ICommand CMD_Tracking { get; }
public ICommand CMD_PatternTest { get; }
public ObservableCollection<PatternInfo> Patterns { get; set; }
private int _selectedPatternIndex;
public int SelectedPatternIndex {
get => _selectedPatternIndex;
set {
SetProperty(ref _selectedPatternIndex, value);
if (SelectedPatternIndex != -1) {
IsSelectedPatternRegistered = Patterns[SelectedPatternIndex].IsRegistered();
}
}
}
private bool _isViewEnabled = true;
public bool IsViewEnabled { get => _isViewEnabled; set => SetProperty(ref _isViewEnabled, value); }
private bool _isSelectedPatternRegistered;
public bool IsSelectedPatternRegistered { get => _isSelectedPatternRegistered; set => SetProperty(ref _isSelectedPatternRegistered, value); }
private bool _UseCamPattern = false;
public bool UseCamPattern { get => _UseCamPattern; set => SetProperty(ref _UseCamPattern, value); }
private bool _isRegistered;
public bool IsRegistered { get => _isRegistered; set => SetProperty(ref _isRegistered, value); }
public PatternListViewModel(
FovInfo fovInfo, CameraView cameraView) {
_SubSysInfo = fovInfo.ToSubSysInfo();
_FovInfo = fovInfo;
_FovRecipe = VisionRecipeManager.GetFovRecipe(fovInfo);
_CamId = VisionRecipeManager.GetCamRecipe(fovInfo).CamId;
_PatternCnt = PatternConstants.FOV_PATTERN_COUNT;
UseCamPattern = VisionSettingManager.VisionSetting.UseCamPattern;
CMD_VisibleChanged = new DelegateCommand(VisibleChanged);
CMD_GrabFind = new DelegateCommand(GrabFind);
CMD_Find = new DelegateCommand(Find);
CMD_Register = new DelegateCommand(Register);
CMD_Edit = new DelegateCommand(Edit);
CMD_Delete = new DelegateCommand(Delete);
CMD_Apply = new DelegateCommand(Apply);
CMD_Tracking = new DelegateCommand(Tracking);
CMD_PatternTest = new DelegateCommand(PatternTest);
var unitInfo = VisionRecipeManager.GetUnitInfo(_FovInfo.UnitId);
CamViewBase = cameraView;
_PatternAgent = PatternAgentManager.GetAgent(fovInfo);
InitPatternList(0);
}
private void ResetPatternAgent() {
_PatternAgent = PatternAgentManager.GetAgent(_FovInfo);
}
public PatternInfo CreateDefaultPatternInfo(int patternId) {
return new PatternInfo() {
PatternIndex = new PatternIndex(_FovInfo, _FovRecipe.FovName, patternId),
PatternType = ePatternType.None,
MilSystemId = _PatternAgent.GetMilSystemId(_FovRecipe.CamRecipe.CamId),
LightInfo = GetDefaultLightInfo()
};
}
public LightInfo GetDefaultLightInfo() {
var lightParams = LightHub.Instance.GetLightParams(_FovRecipe.CamRecipe.CamId);
return new LightInfo() { LightParams = lightParams };
}
public void InitPatternList(int initIndex) {
try {
Application.Current.Dispatcher.Invoke(
new Action(() => {
if (Patterns == null) {
Patterns = new ObservableCollection<PatternInfo>();
}
Patterns.Clear();
//_window = new Window();
var existingPatterns = GetExistingPatterns();
var existingPatternKeys = existingPatterns.Select(ep => ep.GetPatternId()).ToList();
for (int i = 0; i < 20; i++) {
if (existingPatternKeys.Contains(i)) {
Patterns.Add(existingPatterns.FirstOrDefault(ep => i == ep.GetPatternId()));
var curPatternInfo = Patterns[Patterns.Count - 1];
curPatternInfo.Thumbnail = _PatternAgent.GetThumbnail(curPatternInfo);
}
else {
Patterns.Add(CreateDefaultPatternInfo(i));
}
}
SelectedPatternIndex = initIndex;
}));
}
catch (Exception e) {
_logger.FuncE(e.Message);
}
}
public List<PatternInfo> GetExistingPatterns() {
if (_PatternAgent == null) {
ResetPatternAgent();
}
if (VisionSettingManager.VisionSetting.UseCamPattern) {
// CamPattern을 사용하는 경우에는 Pattern Agent들마다 동기화를 해줘야 하므로 패턴을 다시 불러온다.
_PatternAgent.LoadPatterns();
}
return _PatternAgent.GetMainPatterns(CreateDefaultPatternInfo(0));
}
private void VisibleChanged(object obj) {
bool isVisible = (bool)obj;
if (isVisible) {
InitPatternList(0);
NotifyPropertyChanged("Patterns");
}
else {
_window?.Close();
}
}
public void GrabFind(object obj) {
var cameraAgent = CameraAgentManager.GetCameraAgent(_FovInfo);
if (cameraAgent.IsLiveRunning()) {
cameraAgent.StopLive();
}
_logger.FuncI($"SelectedPatternIndex : {SelectedPatternIndex}");
if (0 <= SelectedPatternIndex) {
var patternInfo = Patterns[SelectedPatternIndex];
if (IsFindSupported(patternInfo.PatternType)) {
StartGrabFindSeq(patternInfo);
}
else {
MessageBoxUtil.ShowMessageBoxError(
string.Format(StrTokens.MSG_E_PatternFindingNotSupported, patternInfo.PatternType));
}
}
}
private bool IsFindSupported(ePatternType patternType) {
return patternType != ePatternType.EdgeFinder;
}
public void Find(object obj) {
if (0 <= SelectedPatternIndex) {
var patternInfo = Patterns[SelectedPatternIndex];
if (IsFindSupported(patternInfo.PatternType)) {
StartFindSeq(patternInfo);
}
else {
MessageBoxUtil.ShowMessageBoxError(
string.Format(StrTokens.MSG_E_PatternFindingNotSupported, patternInfo.PatternType));
}
}
}
private void Register(object obj) {
_logger.FuncI($"SelectedPatternIndex : {SelectedPatternIndex}");
var param = new Tuple<PatternAgentBase, PatternInfo, Window, PatternListViewModel, int>(
_PatternAgent, Patterns[SelectedPatternIndex].Clone() as PatternInfo, _window, this, SelectedPatternIndex);
VisionEnv.AuroraEnv.EventPublisher.Publish(
new EventMessage(string.Empty, VisionEventId.SHOW_REGISTER_PATTERN_WINDOW, param));
}
public void ResetWindow() {
if (_window.WindowState == WindowState.Minimized) {
_window.WindowState = WindowState.Normal;
}
if(_window is IPatternSettingWindow) {
(_window as IPatternSettingWindow).ResetPosition();
}
else if(_window is VisionImageTestWindow) {
(_window as VisionImageTestWindow).ResetPosition();
}
}
private void Edit(object obj) {
_logger.FuncI($"SelectedPatternIndex : {SelectedPatternIndex}");
var param = new Tuple<PatternAgentBase, PatternInfo, ICameraDisplay, FovInfo, Window, PatternListViewModel, int>(
_PatternAgent, Patterns[SelectedPatternIndex].Clone() as PatternInfo, CamViewBase.GetDisplay(), _FovInfo, _window, this, SelectedPatternIndex);
VisionEnv.AuroraEnv.EventPublisher.Publish(
new EventMessage(string.Empty, VisionEventId.SHOW_PATTERN_SETTING_WINDOW, param));
}
private void Delete(object obj) {
_logger.FuncI($"SelectedPatternIndex : {SelectedPatternIndex}");
if (Patterns[SelectedPatternIndex].PatternType == ePatternType.LineFinder) {
foreach (var patternInfo in Patterns) {
if(patternInfo.PatternType == ePatternType.LineIntersection || patternInfo.PatternType == ePatternType.LineWidth) {
if(!_PatternAgent.IsDeletable(patternInfo, SelectedPatternIndex)) {
MessageBoxUtil.ShowMessageBoxError(
string.Format(StrTokens.MSG_E_NotDeletablePattern, patternInfo.GetPatternId()));
return;
}
}
}
}
var lastSelectedPatternIndex = SelectedPatternIndex;
var result = MessageBoxUtil.ShowMessageBoxQuestion(
string.Format(StrTokens.MSG_Q_DeletePatternFormat, SelectedPatternIndex));
if (result == MessageBoxResult.Yes) {
Application.Current.Dispatcher.Invoke(() => {
DeleteSubPatterns(Patterns[SelectedPatternIndex]);
DeleteMainPattern(Patterns[SelectedPatternIndex]);
Patterns[SelectedPatternIndex] = CreateDefaultPatternInfo(SelectedPatternIndex);
InitPatternList(lastSelectedPatternIndex);
});
}
}
private void DeleteSubPatterns(PatternInfo patternInfo) {
var subPatternList = _PatternAgent.GetSubPatterns(patternInfo);
foreach (var subPatternInfo in subPatternList) {
_PatternAgent.Remove(subPatternInfo);
}
}
private void DeleteMainPattern(PatternInfo patternInfo) {
_PatternAgent.Remove(patternInfo);
}
private void Apply(object obj) {
_logger.FuncI($"SelectedPatternIndex : {SelectedPatternIndex}");
var patternRecipe = VisionRecipeManager.GetPatternRecipe(_SubSysInfo, _FovInfo.FovId);
var options = new string[(int)eProcPatternId.Max];
for (int i = 0; i < patternRecipe.ProcPatternInfos.Count; i++) {
options[i] = patternRecipe.ProcPatternInfos[i].ProcPatternId.ToString();
}
var msgResult = MessageBoxUtil.ShowMessageBoxQuestionOption(
string.Format(StrTokens.MSG_Q_ApplyPatternAsProcessPatternFormat, SelectedPatternIndex),
StrTokens.MSG_I_SelectProcessPatternId,
options);
if (msgResult.Result == MessageBoxResult.Yes) {
Application.Current.Dispatcher.Invoke(() => {
var patternInfo = Patterns[SelectedPatternIndex];
var procPatternId = (eProcPatternId)msgResult.SelIndex;
var procPatternInfo = patternRecipe.ProcPatternInfos.Where(p => p.ProcPatternId.Equals(procPatternId)).FirstOrDefault();
if (procPatternInfo == null) {
_logger.FuncE("procPatternInfo is null.");
}
procPatternInfo.PatternId = patternInfo.GetPatternId();
procPatternInfo.ProcPatternId = procPatternId;
RecipeFileManager.SaveVisionRecipe();
});
}
}
private void Tracking(object obj) {
var window = new PatternTrackingSettingWindow(_FovInfo);
window?.Show();
}
public void StartGrabFindSeq(PatternInfo patternInfo) {
var manualFixtureProcSeq = ManualGrabFindSeqManager.GetSeq(_FovInfo);
if (manualFixtureProcSeq == null) {
_logger.FuncE("manualFixtureProcSeq is null.");
}
else if (manualFixtureProcSeq.RunState == SequenceRunState.Running) {
_logger.FuncE("manualFixtureProcSeq is running.");
}
else if (manualFixtureProcSeq.RunState == SequenceRunState.Idle) {
GrabFindSeqUtil.Clear(_SubSysInfo);
var fixtureSeqParam = new GrabFindProcSeqParams(
_FovInfo, patternInfo, eDisplayType.Pattern, seqMode: eSeqMode.Manual);
manualFixtureProcSeq.Start(fixtureSeqParam);
}
else {
_logger.FuncE("manualFixtureProcSeq is not idle.");
}
}
public void StartFindSeq(PatternInfo patternInfo) {
var manualFindSeq = VisionEnv.AuroraEnv.SequenceEntry[VisionKeys.ManualFindSeqKey];
if (manualFindSeq != null && manualFindSeq.RunState == SequenceRunState.Idle) {
var cameraDisplay = (CamViewBase as CameraView).GetDisplay() as CameraDisplay;
cameraDisplay.ClearMeasureGraphics();
var image = cameraDisplay.GetImage();
if (image == null) {
MessageBoxUtil.ShowMessageBoxError(StrTokens.MSG_E_ImageNotReady);
return;
}
var findSeqParam = new FindSeqParams(
image, _FovInfo, patternInfo, eDisplayType.Pattern, seqMode: eSeqMode.Manual);
manualFindSeq.Start(findSeqParam);
}
}
public void PatternTest(object obj) {
if (_window != null) {
_window.Close();
}
IsViewEnabled = false;
_window = new VisionImageTestWindow(_FovInfo, eVisionTestType.Pattern, Patterns[SelectedPatternIndex].Clone() as PatternInfo, this);
(_window as VisionImageTestWindow).ResetPosition();
_window.Show();
}
}
}