using Aurora; using Aurora.Api; using System; using System.Windows; using System.Windows.Controls; using System.Collections.Generic; using VisionCommon; using VisionLight; using VisionCommonUI; using VisionCommonUI.Resources; namespace VisionUI.Pattern { /// /// 패턴 리스트 뷰 /// PatternListView.xaml behind code /// public partial class PatternListView : UserControl { private Logger _Logger = new Logger(typeof(PatternListView).Name); private FovInfo _FovInfo; private FovRecipe _FovRecipe; private ContextMenu _ContextMenu_Root = new ContextMenu(); /// /// 생성자 /// /// fov 정보 public PatternListView(FovInfo fovInfo) { _FovInfo = fovInfo; _FovRecipe = VisionRecipeManager.GetFovRecipe(fovInfo); InitializeComponent(); AddContextMenu(); } private void AddContextMenu() { AddContextMenu_CopyPattern(); } private void AddContextMenu_CopyPattern() { // Copy Pattern var menuItem_Copy = new MenuItem(); menuItem_Copy.Header = StrTokens.Copy; // Unit foreach (UnitInfo unitInfo in VisionRecipeManager.GetUnitInfos()) { var menuItem_Unit = new MenuItem() { Header = unitInfo.UnitName }; // SubSys foreach (SubSysInfo subSysInfo in VisionRecipeManager.GetSubSysInfos(unitInfo)) { var menuItem_SubSys = new MenuItem() { Header = subSysInfo.SubSysName }; // Fov foreach (FovInfo fovInfo in VisionRecipeManager.GetFovInfos(subSysInfo)) { if (_FovInfo.Equals(fovInfo)) { continue; } var menuItem_Fov = new MenuItem() { Header = fovInfo.FovName, CommandParameter = fovInfo }; menuItem_Fov.Click += MenuItem_Fov_Click; menuItem_SubSys.Items.Add(menuItem_Fov); } menuItem_Unit.Items.Add(menuItem_SubSys); } menuItem_Copy.Items.Add(menuItem_Unit); } _ContextMenu_Root.Items.Add(menuItem_Copy); lbPatternList.ContextMenu = _ContextMenu_Root; } /// /// 현재 선택된 패턴을 다른 FOV로 복사 /// private void MenuItem_Fov_Click(object sender, RoutedEventArgs e) { try { var patternId = lbPatternList.SelectedIndex; var menuItem_Fov = sender as MenuItem; var srcFovInfo = _FovInfo; var srcFovRecipe = _FovRecipe; var dstFovInfo = menuItem_Fov.CommandParameter as FovInfo; var dstFovRecipe = VisionRecipeManager.GetFovRecipe(dstFovInfo); PatternAgentBase srcPatternAgent = null; PatternAgentBase dstPatternAgent = null; PatternInfo dstPatternInfo = null; PatternInfo srcPatternInfo = null; if (VisionSettingManager.VisionSetting.UseCamPattern) { srcPatternAgent = CamPatternAgentManager.GetAgent(srcFovRecipe.CamRecipe.CamId); srcPatternInfo = srcPatternAgent.GetPatternInfo(srcFovInfo, patternId); dstPatternAgent = CamPatternAgentManager.GetAgent(dstFovRecipe.CamRecipe.CamId); dstPatternInfo = srcPatternInfo.Clone() as PatternInfo; var dstCamPatternInfo = dstPatternInfo as CamPatternInfo; dstCamPatternInfo.PatternIndex = new CamPatternIndex(dstFovRecipe.CamRecipe.CamId, patternId); } else { srcPatternAgent = FovPatternAgentManager.GetAgent(srcFovInfo.ToSubSysInfo()); srcPatternInfo = srcPatternAgent.GetPatternInfo(srcFovInfo, patternId); dstPatternAgent = FovPatternAgentManager.GetAgent(dstFovInfo.ToSubSysInfo()); dstPatternInfo = srcPatternInfo.Clone() as PatternInfo; var dstFovPatternInfo = dstPatternInfo as FovPatternInfo; dstFovPatternInfo.PatternIndex = new FovPatternIndex(dstFovInfo.ToSubSysInfo(), dstFovInfo.FovId, patternId); } var result = MessageBoxResult.None; if (dstPatternAgent.IsPatternExist(dstFovInfo, patternId)) { result = MessageBoxUtil.ShowMessageBoxQuestion(string.Format( StrTokens.MSG_Q_DeleteAndCopyPattern, patternId, dstFovInfo.FovName, dstFovInfo.SubSysName)); if (result == MessageBoxResult.Yes) { dstPatternAgent.Remove(dstPatternInfo); } } if (result != MessageBoxResult.No) { CopyPatterns(srcPatternAgent, dstPatternAgent, srcPatternInfo, dstPatternInfo, dstFovRecipe); } } catch (Exception ex) { _Logger.FuncE(ex.Message); } } private void ResetLightInfo(PatternInfo dstPatternInfo, FovRecipe dstFovRecipe) { for (int i = 0; i < dstPatternInfo.LightInfo.LightParams.Count; i++) { List lightConfigInfos = LightHub.Instance.GetLightConfigInfo(dstFovRecipe.CamRecipe.CamId); if (lightConfigInfos?.Count > i) { LightParam lightParam = dstPatternInfo.LightInfo.LightParams[i]; if (lightParam.LightId != lightConfigInfos[i].LightId) { // 복사될 FOV의 조명 디바이스가 다를 경우, 해당 FOV의 조명 ID를 Set해준다. lightParam.LightId = lightConfigInfos[i].LightId; lightParam.Ch = lightConfigInfos[i].ChConfig.Ch; } } } } /// /// 선택된 소스 패턴의 메인/서브 패턴들을 모두 복사한다. /// private void CopyPatterns( PatternAgentBase srcPatternAgent, PatternAgentBase dstPatternAgent, PatternInfo srcPatternInfo, PatternInfo dstPatternInfo, FovRecipe dstFovRecipe) { var srcPatternInfos = srcPatternAgent.GetMainSubPatterns(srcPatternInfo); for (int i = 0; i < srcPatternInfos.Count; i++) { var curSrcPatternInfo = srcPatternInfos[i]; var curDstPatternInfo = dstPatternInfo.Clone() as PatternInfo; curDstPatternInfo.GetPatternIndex().PatternSubId = i; srcPatternAgent.CopyPattern(curSrcPatternInfo, curDstPatternInfo); dstPatternAgent.LoadPatterns(); ResetLightInfo(curDstPatternInfo, dstFovRecipe); dstPatternAgent.Save(curDstPatternInfo); } MessageBoxUtil.ShowMessageBoxOk(StrTokens.MSG_O_CopyCompleted); } private void uc_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { bool isVisible = (bool)e.NewValue; if (isVisible == true) { UpdateVisionRecipes(); } } private void UpdateVisionRecipes() { _FovRecipe = VisionRecipeManager.GetFovRecipe(_FovInfo); } } }