2026-03-30 17:09:29 +09:00

201 lines
8.2 KiB
C#

using Aurora.Api;
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace VisionCommon {
public class CameraViewManager {
private static Logger _Logger = new Logger("CameraViewManager");
private static readonly object _Lock = new object();
public static CameraViewManager _Instance;
public static CameraViewManager Instance {
get {
lock (_Lock) {
try {
if (_Instance == null)
_Instance = new CameraViewManager();
return _Instance;
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
return null;
}
}
}
#region Same FovUiPos FovInfos
private Dictionary<eDisplayType, Dictionary<eFovUiPos, List<FovInfo>>> _SameFovUiPosFovInfos =
new Dictionary<eDisplayType, Dictionary<eFovUiPos, List<FovInfo>>>();
public void SetSameUiPosFovInfos(eDisplayType displayType, eFovUiPos fovUiPos, FovInfo fovInfo) {
if (!CamCommon.IsMainType(displayType) || fovUiPos == eFovUiPos.None) {
return;
}
if (!_SameFovUiPosFovInfos.ContainsKey(displayType)) {
_SameFovUiPosFovInfos.Add(displayType, new Dictionary<eFovUiPos, List<FovInfo>>());
}
if (!_SameFovUiPosFovInfos[displayType].ContainsKey(fovUiPos)) {
_SameFovUiPosFovInfos[displayType].Add(fovUiPos, new List<FovInfo>());
}
if (!_SameFovUiPosFovInfos[displayType][fovUiPos].Contains(fovInfo)) {
_SameFovUiPosFovInfos[displayType][fovUiPos].Add(fovInfo);
}
}
public List<FovInfo> GetSameUiPosFovInfos(eDisplayType displayType, eFovUiPos fovUiPos) {
if (_SameFovUiPosFovInfos.ContainsKey(displayType)) {
if (_SameFovUiPosFovInfos[displayType].ContainsKey(fovUiPos)) {
return _SameFovUiPosFovInfos[displayType][fovUiPos];
}
}
return null;
}
#endregion
#region Camera Views
private static Dictionary<eDisplayType, Dictionary<FovInfo, UserControl>> _CameraViews =
new Dictionary<eDisplayType, Dictionary<FovInfo, UserControl>>();
public void SetCameraView(eDisplayType displayType, FovInfo fovInfo, UserControl camView) {
if (!_CameraViews.ContainsKey(displayType)) {
_CameraViews.Add(displayType, new Dictionary<FovInfo, UserControl>());
}
if (!_CameraViews[displayType].ContainsKey(fovInfo)) {
_CameraViews[displayType].Add(fovInfo, null);
}
_CameraViews[displayType][fovInfo] = camView;
}
public UserControl GetCameraView(eDisplayType displayType, FovInfo fovInfo) {
if (_CameraViews.ContainsKey(displayType)) {
if (_CameraViews[displayType].ContainsKey(fovInfo)) {
return _CameraViews[displayType][fovInfo];
}
}
return null;
}
#endregion
#region 메인 화면에 겹쳐져있는 화면 보이기/숨기기
public void InitVisibilities() {
// 겹치는 메인 화면들을 모두 숨기고, 기본 화면만 보이기
Application.Current.Dispatcher.BeginInvoke(
new Action(() => {
SetVisibility_AllOff();
SetVisibility_BasicOn();
}));
}
public void SetVisibilities(FovInfo fovInfo, eFovUiPos fovUiPos, eDisplayType displayType) {
if (!CamCommon.IsMainType(displayType)) {
return; // 메인 화면이 아니면 Skip
}
if (IsAlreadyVisible(fovInfo, displayType)) {
return; // 이미 화면이 활성화되어 있으면 Skip
}
// 현재 fovUiPos에 겹치는 화면들을 숨기고, 기본 화면만 보이기
Application.Current.Dispatcher.BeginInvoke(
new Action(() => {
SetVisibility_GrpOff(fovUiPos, displayType);
SetVisibility_EachOn(fovInfo, displayType);
}));
}
private bool IsAlreadyVisible(FovInfo fovInfo, eDisplayType displayType) {
if (_CameraViews[displayType].ContainsKey(fovInfo)) {
UserControl camView = _CameraViews[displayType][fovInfo];
if (camView.Visibility == Visibility.Visible) {
return true;
}
}
return false;
}
public void SetVisibility_AllOff() {
// 모든 메인 화면 숨기기
foreach (eDisplayType displayType in _CameraViews.Keys) {
if (!CamCommon.IsMainType(displayType)) {
continue;
}
foreach (FovInfo fovInfo in _CameraViews[displayType].Keys) {
UserControl camView = _CameraViews[displayType][fovInfo];
camView.Visibility = Visibility.Collapsed;
}
}
}
public void SetVisibility_BasicOn() {
// 기본 메인 화면만 보이기
foreach (eDisplayType displayType in _CameraViews.Keys) {
var basicFovKeys = new List<eFovUiPos>();
if (!CamCommon.IsMainType(displayType)) {
continue;
}
foreach (FovInfo fovInfo in _CameraViews[displayType].Keys) {
UserControl camView = _CameraViews[displayType][fovInfo];
FovRecipe fovRecipe = VisionRecipeManager.GetFovRecipe(fovInfo);
if (fovRecipe == null) {
continue;
}
var fovUiPos = VisionRecipeManager.GetFovUiPos(fovRecipe, displayType);
// 겹치는 Layout 중에 가장 먼저 등록된 화면만 보이기
if (!basicFovKeys.Contains(fovUiPos)) {
camView.Visibility = Visibility.Visible;
basicFovKeys.Add(fovUiPos);
}
}
}
}
public void SetVisibility_GrpOff(eFovUiPos fovUiPos, eDisplayType displayType) {
// 현재 fovUiPos에 겹치는 화면들 모두 숨기기
foreach (FovInfo fovInfo in _CameraViews[displayType].Keys) {
UserControl camView = _CameraViews[displayType][fovInfo];
FovRecipe fovRecipe = VisionRecipeManager.GetFovRecipe(fovInfo);
if (fovRecipe == null) {
continue;
}
var _fovUiPos = VisionRecipeManager.GetFovUiPos(fovRecipe, displayType);
if (_fovUiPos.Equals(fovUiPos)) {
camView.Visibility = Visibility.Collapsed;
}
}
}
public void SetVisibility_EachOn(FovInfo fovInfo, eDisplayType displayType) {
// 현재 fovInfo에 해당하는 화면만 보이기
if (_CameraViews[displayType].ContainsKey(fovInfo)) {
UserControl camView = _CameraViews[displayType][fovInfo];
camView.Visibility = Visibility.Visible;
}
}
#endregion
public void Remove(eDisplayType displayType, eFovUiPos fovUiPos, FovInfo fovInfo) {
if (CamCommon.IsMainType(displayType)) {
if (_SameFovUiPosFovInfos.ContainsKey(displayType)) {
if (_SameFovUiPosFovInfos[displayType].ContainsKey(fovUiPos)) {
if (_SameFovUiPosFovInfos[displayType][fovUiPos].Contains(fovInfo)) {
_SameFovUiPosFovInfos[displayType][fovUiPos].Remove(fovInfo);
}
}
}
}
if (_CameraViews.ContainsKey(displayType)) {
if (_CameraViews[displayType].ContainsKey(fovInfo)) {
_CameraViews[displayType].Remove(fovInfo);
}
}
}
}
}