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);
}
}
}