using Aurora.Api; using VisionCommon; using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using VisionCommonUI; using VisionCommonUI.Resources; using Aurora.View; using System.Security.Cryptography; namespace VisionUI.Pattern { /// /// 패턴 콤보박스 정보 키 /// public class PatternCbInfoKey { /// Fov Id public eFovId FovId { get; set; } /// Proc 패턴 Id public eProcPatternId ProcPatternId { get; set; } /// /// 생성자 /// /// Fov Id /// Proc 패턴 Id public PatternCbInfoKey(eFovId fovId, eProcPatternId procPatternId) { this.FovId = fovId; this.ProcPatternId = procPatternId; } } /// /// 패턴 콤보박스 정보 값 /// public class PatternCbInfoValue { /// 패턴 이름 public string PatternName { get; set; } /// 패턴 콤보박스 public ComboBox PatternComboBox { get; set; } /// /// 생성자 /// /// 패턴이름 /// 패턴 콤보박스 public PatternCbInfoValue(string patternName, ComboBox patternComboBox) { this.PatternName = patternName; this.PatternComboBox = patternComboBox; } } /// /// 패턴 리스트에 등록된 패턴을 공정 패턴으로 지정 /// public partial class ProcPatternSettingView : UserControl { private const string PATTERN_UNDEFINED = "Undefined"; private Logger _Logger; private SubSysInfo _SubSysInfo; private SubSysRecipe _SubSysRecipe; private PatternAgentBase _FovPatternAgent = null; private Dictionary _PatternCbInfos = new Dictionary(); private Dictionary> _PatternIndexesAll = new Dictionary>(); private string _ProcId; /// /// 생성자 /// /// 서브시스템 정보 /// Proc Id public ProcPatternSettingView(SubSysInfo subSysInfo, string procId) { _Logger = new Logger(typeof(ProcPatternSettingView).Name); _SubSysInfo = subSysInfo; _SubSysRecipe = VisionRecipeManager.GetSubSysRecipe(_SubSysInfo); _FovPatternAgent = FovPatternAgentManager.GetAgent(_SubSysInfo); _ProcId = procId; InitializeComponent(); CreateViews(); } //public ProcPatternSettingView() { // _Logger = new Logger(typeof(ProcPatternSettingView).Name); // InitializeComponent(); //} ///// ///// 초기 생성 후 한번만 설정 해 줄 것 ///// ///// ///// //public void InitView(SubSysInfo subSysInfo, string procId) { // _SubSysInfo = subSysInfo; // _SubSysRecipe = VisionRecipeManager.GetSubSysRecipe(_SubSysInfo); // _FovPatternAgent = FovPatternAgentManager.GetAgent(_SubSysInfo); // _ProcId = procId; // CreateViews(); //} private void CreateViews() { gridProcPatterns.Children.Add(CreateProcPatternScrollView()); } private ScrollViewer CreateProcPatternScrollView() { var scrollViewer = new ScrollViewer(); scrollViewer.Visibility = Visibility.Visible; scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; scrollViewer.CanContentScroll = true; scrollViewer.Margin = new Thickness(5); StackPanel spOtherFov = new StackPanel(); spOtherFov.Orientation = Orientation.Vertical; try { foreach (FovRecipe fovRecipe in _SubSysRecipe.FovRecipes) { eFovId fovId = fovRecipe.FovId; StackPanel spSameFov = new StackPanel(); spSameFov.Orientation = Orientation.Vertical; if (fovRecipe.PatternRecipe.ProcPatternInfos.Count > 0) { // Align Subsystem의 경우 ProcId를 통해 어떤 Align의 ProcPattern을 가져와야 하는지 파악한다. var alignRecipe = new AlignRecipe(); foreach (var recipe in _SubSysRecipe.AlignRecipes) { if (recipe.AlignId.ToString().Equals(_ProcId)) { alignRecipe = recipe; } } foreach (var procPatternInfo in fovRecipe.PatternRecipe.ProcPatternInfos) { if (procPatternInfo.ProcPatternId == eProcPatternId.ProcPattern1 && procPatternInfo.ProcId.Equals(_ProcId)) { AddNewCb(procPatternInfo, fovId, spSameFov); } } // Align의 종류가 하나의 Fov에서 여러개의 패턴을 가져와야 하는 경우 ProcPattern을 더 가져온다. if (alignRecipe.ProcParams.ProcFovType == eProcFovType.C1_F1_M2R || alignRecipe.ProcParams.ProcFovType == eProcFovType.C1_F1_AP2_A2 || _SubSysRecipe.SubSysType == eSubSysType.Inspect) { foreach (var procPatternInfo in fovRecipe.PatternRecipe.ProcPatternInfos) { if (procPatternInfo.ProcPatternId == eProcPatternId.ProcPattern2 && procPatternInfo.ProcId.Equals(_ProcId)) { AddNewCb(procPatternInfo, fovId, spSameFov); } } } } else { PrintRecipeError(fovRecipe, spSameFov); } spOtherFov.Children.Add(spSameFov); } } catch (Exception e) { _Logger.FuncE(e.Message); } scrollViewer.Content = spOtherFov; return scrollViewer; } private void AddNewCb(ProcPatternInfo procPatternInfo, eFovId fovId, StackPanel spSameFov) { var spSameFovInside = new StackPanel(); spSameFovInside.Orientation = Orientation.Horizontal; spSameFovInside.Margin = new Thickness(5, 3, 5, 3); TextBlock tbPatternName = GetPatternName(procPatternInfo.PatternName); tbPatternName.TextAlignment = TextAlignment.Left; //tbPatternName.Width = 130; //tbPatternName.Width = 155; spSameFovInside.Children.Add(tbPatternName); ComboBox cbPattern = new ComboBox(); spSameFovInside.Children.Add(cbPattern); SetPatternCbInfos(fovId, procPatternInfo, cbPattern); spSameFov.Children.Add(spSameFovInside); } private TextBlock GetPatternName(string patternName) { var tbPatternName = new TextBlock(); tbPatternName.FontSize = 13; tbPatternName.Style = FindResource("styleTextBlockSubTitleSmall") as Style; tbPatternName.Margin = new Thickness(5, 5, 15, 5); tbPatternName.HorizontalAlignment = HorizontalAlignment.Left; tbPatternName.Text = patternName; return tbPatternName; } private void SetPatternCbInfos(eFovId fovId, ProcPatternInfo procPatternInfo, ComboBox patternComboBox) { var infoKey = new PatternCbInfoKey(fovId, procPatternInfo.ProcPatternId); if (!_PatternCbInfos.ContainsKey(infoKey)) { _PatternCbInfos.Add(infoKey, new PatternCbInfoValue(procPatternInfo.PatternName, patternComboBox)); } } private void InitPatternItemsList() { try { foreach (var key in _PatternCbInfos.Keys.Select((value, index) => (value, index))) { PatternCbInfoKey infoKey = key.value; var index = key.index; AddComboBoxeItems(infoKey); SelectComboBoxItem(infoKey, index); } } catch (Exception e) { _Logger.FuncE(e.Message); } } // 콤보박스 항목 추가 private void AddComboBoxeItems(PatternCbInfoKey infoKey) { try { ComboBox cb = _PatternCbInfos[infoKey].PatternComboBox; cb.Items.Clear(); var fovInfo = VisionRecipeManager.GetFovInfo(_SubSysInfo.UnitId, _SubSysInfo.SubSysId, infoKey.FovId); var fovRecipe = VisionRecipeManager.GetFovRecipe(_SubSysInfo.UnitId, _SubSysInfo.SubSysId, infoKey.FovId); var fovPatternInfos = _FovPatternAgent.GetMainPatterns(_SubSysInfo, infoKey.FovId); List patternIndexes = new List(); for (int i = 0; i < fovPatternInfos.Count; i++) { patternIndexes.Add(new FovPatternIndex(_SubSysInfo, fovRecipe.FovId, fovPatternInfos[i].GetPatternId())); cb.Items.Add(PatternUtil.GetPatternDescription(fovPatternInfos[i])); } if (VisionSettingManager.VisionSetting.UseCamPattern) { var camPatternAgent = CamPatternAgentManager.GetAgent(fovRecipe.CamRecipe.CamId); if (camPatternAgent != null) { var camPatternInfos = camPatternAgent.GetMainPatterns(fovInfo); for (int i = 0; i < camPatternInfos.Count; i++) { patternIndexes.Add(new CamPatternIndex(fovRecipe.CamRecipe.CamId, camPatternInfos[i].GetPatternId())); cb.Items.Add(PatternUtil.GetPatternDescription(camPatternInfos[i])); } } } if (!_PatternIndexesAll.ContainsKey(infoKey)) { _PatternIndexesAll.Add(infoKey, patternIndexes); } else { _PatternIndexesAll[infoKey] = patternIndexes; } } catch (Exception e) { _Logger.FuncE(e.Message); } } // 콤보박스 항목 선택 private void SelectComboBoxItem(PatternCbInfoKey infoKey, int index) { try { var procPatternInfos = _SubSysRecipe.FovRecipes[(int)infoKey.FovId].PatternRecipe.ProcPatternInfos; var procPatternInfo = procPatternInfos.Where(p => p.ProcPatternId.Equals(infoKey.ProcPatternId) && p.ProcId.Equals(_ProcId)).FirstOrDefault().Clone(); var fovPatternInfos = _FovPatternAgent.GetMainPatterns(_SubSysInfo, infoKey.FovId); if (VisionSettingManager.VisionSetting.UseCamPattern) { var startIndex = 0; var endIndex = fovPatternInfos.Count; if (!procPatternInfo.IsFovPattern) { startIndex = fovPatternInfos.Count; endIndex = _PatternIndexesAll[infoKey].Count(); } for (int i = startIndex; i < endIndex; i++) { if (_PatternIndexesAll[infoKey][i].PatternId == procPatternInfo.PatternId) { _PatternCbInfos[infoKey].PatternComboBox.SelectedIndex = i; } } } else { for (int i = 0; i < _PatternIndexesAll[infoKey].Count(); i++) { if (_PatternIndexesAll[infoKey][i].PatternId == procPatternInfo.PatternId) { _PatternCbInfos[infoKey].PatternComboBox.SelectedIndex = i; } } } } catch (NullReferenceException e) { MessageUtil.ShowErrorToast($"[{_SubSysInfo.SubSysId}][{infoKey.FovId}][{infoKey.ProcPatternId}] Not Found in ProcPatternInfos."); _Logger.FuncE(e.Message); } catch (Exception e) { _Logger.FuncE(e.Message); } } private void PrintRecipeError(FovRecipe fovRecipe, StackPanel spSameFov) { var errMsg = string.Format(StrTokens.RecipeErrorMessage, $"PatternRecipe.ProcPatternInfos of {fovRecipe.FovId}"); spSameFov.Children.Add(new UCRecipeErrorTextBlock(errMsg) { Margin = new Thickness(5), HorizontalContentAlignment = HorizontalAlignment.Left }); ; } private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { bool isVisible = (bool)e.NewValue; if (isVisible == true) { RefreshVisionRecipes(); InitPatternItemsList(); } } /// /// 비전 레시피 Refresh /// public void RefreshVisionRecipes() { _SubSysRecipe = VisionRecipeManager.GetSubSysRecipe(_SubSysInfo); } /// /// UI로 부터 레시피 업데이트 /// public void UpdateRecipeFromUI() { try { foreach (var key in _PatternCbInfos.Keys.Select((value, index) => (value, index))) { PatternCbInfoKey infoKey = key.value; var patternRecipe = VisionRecipeManager.GetPatternRecipe(_SubSysInfo, infoKey.FovId); var procPatternInfos = patternRecipe.ProcPatternInfos; var procPatternInfo = procPatternInfos.Where(p => p.ProcPatternId.Equals(infoKey.ProcPatternId) && p.ProcId.Equals(_ProcId)).FirstOrDefault(); if (_PatternCbInfos[infoKey].PatternName == procPatternInfo.PatternName) { int cbSelectedIdx = _PatternCbInfos[infoKey].PatternComboBox.SelectedIndex; if (!_PatternIndexesAll.ContainsKey(infoKey) || _PatternIndexesAll[infoKey].Count <= cbSelectedIdx) { AddComboBoxeItems(infoKey); } List patternIndexes = _PatternIndexesAll[infoKey]; PatternIndex patternIndex = patternIndexes[cbSelectedIdx]; procPatternInfo.PatternId = patternIndex.PatternId; if (patternIndex is FovPatternIndex) { procPatternInfo.IsFovPattern = true; } else { procPatternInfo.IsFovPattern = false; } } } } catch (Exception e) { _Logger.FuncE(e.Message); } } } }