using Aurora.Api;
using PropertyTools.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
namespace VisionCommon {
public abstract class VisionDef {
/// 현재 SW의 레시피 버전
public const double RECIPE_VERSION_CURRENT = 0.1;
/// 레시피 최초 버전
public const double RECIPE_VERSION_INITIAL = 0.1; // 수정 금지
private Logger _logger = new Logger(typeof(VisionDef).Name);
[System.ComponentModel.ReadOnly(true)]
public double Version { get; set; } = RECIPE_VERSION_INITIAL;
public ObservableCollection UnitRecipes { get; set; } = new ObservableCollection();
public VisionDef() {
UnitRecipes.CollectionChanged += UnitRecipes_CollectionChanged;
}
#region UnitRecipes CollectionChanged Event
private void UnitRecipes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
try {
var unitRecipes = sender as ObservableCollection;
if (e.Action == NotifyCollectionChangedAction.Add) {
var newUnitReicpe = e.NewItems[0] as UnitRecipe;
if (unitRecipes == null || unitRecipes.Count == 0) {
return;
}
else {
newUnitReicpe.UnitId = (eUnitId)unitRecipes.Count - 1;
if (string.IsNullOrEmpty(newUnitReicpe.UnitName)) {
newUnitReicpe.UnitName = newUnitReicpe.UnitId.ToString();
}
}
}
else if (e.Action == NotifyCollectionChangedAction.Remove) {
int index = 0;
foreach (UnitRecipe unitRecipe in unitRecipes) {
if (index == (int)eUnitId.Max) {
break;
}
unitRecipe.UnitId = (eUnitId)index++;
if (string.IsNullOrEmpty(unitRecipe.UnitName) || unitRecipe.UnitName.Contains("Unit")) {
unitRecipe.UnitName = unitRecipe.UnitId.ToString();
}
}
}
}
catch (Exception ex) {
}
}
#endregion
public List GetUnitInfos() {
return UnitRecipes
.Select(vu => new UnitInfo(vu.UnitId, vu.UnitName))
.OrderBy(vu => vu.UnitId)
.ToList();
}
public UnitInfo GetUnitInfo(eUnitId unitId) {
return new UnitInfo(unitId, GetUnitName(unitId));
}
public List GetUnitIds() {
return UnitRecipes
.Select(vu => vu.UnitId)
.OrderBy(unitId => unitId)
.ToList();
}
public string GetUnitName(eUnitId unitId) {
if (IsValidId(unitId)) {
var unitRecipe = GetUnitRecipe(unitId);
if (unitRecipe != null) {
return unitRecipe.UnitName;
}
}
return string.Empty;
}
public ObservableCollection GetUnitRecipes() {
return UnitRecipes;
}
public UnitRecipe GetUnitRecipe(eUnitId unitId) {
return UnitRecipes.Where(x => x.UnitId == unitId).FirstOrDefault();
}
public SubSysRecipe GetSubSysRecipe(SubSysInfo subSysInfo) {
return GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
}
public SubSysRecipe GetSubSysRecipe(eUnitId unitId, eSubSysId subSysId) {
if (IsValidId(unitId, subSysId)) {
var unitRecipe = GetUnitRecipe(unitId);
if (unitRecipe != null) {
return unitRecipe.SubSysRecipes.Where(x => x.SubSysId == subSysId).FirstOrDefault();
}
}
return null;
}
public List GetFovRecipes(List fovInfos) {
List fovRecipes = new List();
foreach (var fovinfo in fovInfos) {
fovRecipes.Add(GetFovRecipe(fovinfo.UnitId, fovinfo.SubSysId, fovinfo.FovId));
}
return fovRecipes;
}
public FovRecipe GetFovRecipe(eUnitId unitId, eSubSysId subSysId, eFovId fovId) {
if (IsValidId(unitId, subSysId, fovId)) {
var subSysRecipe = GetSubSysRecipe(unitId, subSysId);
if (subSysRecipe != null) {
return subSysRecipe.FovRecipes.Where(x => x.FovId == fovId).FirstOrDefault();
}
}
return null;
}
public AlignRecipe GetAlignRecipe(eUnitId unitId, eSubSysId subSysId, eAlignId alignId) {
if (IsValidId(unitId, subSysId, alignId)) {
var subSysRecipe = GetSubSysRecipe(unitId, subSysId);
if (subSysRecipe != null) {
return subSysRecipe.AlignRecipes.Where(x => x.AlignId == alignId).FirstOrDefault();
}
}
return null;
}
public InspRecipe GetInspRecipe(eUnitId unitId, eSubSysId subSysId) {
if (IsValidId(unitId, subSysId)) {
var subSysRecipe = GetSubSysRecipe(unitId, subSysId);
if (subSysRecipe != null) {
return subSysRecipe.InspRecipe;
}
}
return null;
}
public AttachInspRecipe GetAttachInspRecipe(SubSysInfo subSysInfo) {
if (IsValidId(subSysInfo.UnitId, subSysInfo.SubSysId)) {
var inspRecipe = GetInspRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (inspRecipe?.AttachInspRecipe != null) {
return inspRecipe.AttachInspRecipe;
}
}
return null;
}
public AttachInspParam GetAttachInspParam(FovInfo fovInfo) {
if (IsValidId(fovInfo.UnitId, fovInfo.SubSysId, fovInfo.FovId)) {
var inspRecipe = GetInspRecipe(fovInfo.UnitId, fovInfo.SubSysId);
if (inspRecipe?.AttachInspRecipe?.AttachInspParams != null) {
return inspRecipe.AttachInspRecipe.AttachInspParams[(int)fovInfo.FovId];
}
}
return null;
}
private bool IsValidId(eUnitId unitId, eSubSysId subSysId, eFovId fovId) {
if (IsValidId(unitId, subSysId)) {
return fovId != eFovId.None &&
(int)fovId < GetFovCnt(unitId, subSysId);
}
return false;
}
private bool IsValidId(eUnitId unitId, eSubSysId subSysId, eAlignId alignId) {
if (IsValidId(unitId, subSysId)) {
return alignId != eAlignId.None &&
(int)alignId < GetAlignCnt(unitId, subSysId);
}
return false;
}
private bool IsValidId(eUnitId unitId, eSubSysId subSysId) {
if (IsValidId(unitId)) {
return subSysId != eSubSysId.None &&
(int)subSysId < GetSubSysCount(unitId);
}
return false;
}
private bool IsValidId(eUnitId unitId) {
return eUnitId.None != unitId && (int)unitId < UnitRecipes.Count;
}
public int GetSubSysCount(eUnitId unitId) {
if (IsValidId(unitId)) {
var unitRecipe = GetUnitRecipe(unitId);
if (unitRecipe != null) {
return unitRecipe.SubSysRecipes.Count;
}
}
return 0;
}
public List GetSubSysInfos(UnitInfo unitInfo) {
return GetSubSysInfos(unitInfo.UnitId);
}
public List GetSubSysInfos(eUnitId unitId) {
var subSysInfos = new List();
if (IsValidId(unitId)) {
var unitRecipe = GetUnitRecipe(unitId);
if (unitRecipe != null) {
foreach (var subSystem in unitRecipe.SubSysRecipes) {
subSysInfos.Add(GetSubSysInfo(unitId, subSystem.SubSysId));
}
}
}
return subSysInfos.OrderBy(subSysRecipe => subSysRecipe.SubSysId).ToList();
}
public List GetSubSysInfos() {
List subSysInfos = new List();
foreach(var unitInfo in GetUnitInfos()) {
foreach(var subSysInfo in GetSubSysInfos(unitInfo)) {
subSysInfos.Add(subSysInfo);
}
}
return subSysInfos;
}
public SubSysInfo GetSubSysInfo(eUnitId unitId, eSubSysId subSysId) {
if (IsValidId(unitId, subSysId)) {
var unitInfo = new UnitInfo(unitId, GetUnitName(unitId));
return new SubSysInfo(unitInfo, subSysId, GetSubSysName(unitId, subSysId));
}
return null;
}
public List GetSubSysNames(eUnitId unitId) {
var subSysInfos = GetSubSysInfos(unitId);
return subSysInfos.Select(subSysInfo => subSysInfo.SubSysName).ToList();
}
public string GetSubSysName(eUnitId unitId, eSubSysId subSysId) {
if (IsValidId(unitId, subSysId)) {
var unitRecipe = GetUnitRecipe(unitId);
if (unitRecipe != null) {
foreach (var subSystem in unitRecipe.SubSysRecipes) {
if (subSystem.SubSysId == subSysId) {
return subSystem.SubSysName;
}
}
}
}
return string.Empty;
}
public List GetSubSysIds(eUnitId unitId) {
var subSysInfos = GetSubSysInfos(unitId);
return subSysInfos.Select(subSysInfo => subSysInfo.SubSysId).ToList();
}
public List GetFovInfos(eCamId camId) {
var fovInfosSharingCamId = new List();
foreach (var unitId in GetUnitIds()) {
var fovInfos = GetFovInfos(unitId);
foreach (var fovInfo in fovInfos) {
var camRecipe = GetCamRecipe(fovInfo.UnitId, fovInfo.SubSysId, fovInfo.FovId);
if (camRecipe.CamId.Equals(camId)) {
fovInfosSharingCamId.Add(fovInfo);
}
}
}
return fovInfosSharingCamId;
}
public List GetFovInfos() {
var fovInfos = new List();
foreach (var unitId in GetUnitIds()) {
fovInfos.AddRange(GetFovInfos(unitId));
}
return fovInfos;
}
public List GetFovInfos(eUnitId unitId) {
var fovInfos = new List();
if (IsValidId(unitId)) {
foreach (var subSysInfo in GetSubSysInfos(unitId)) {
fovInfos.AddRange(GetFovInfos(unitId, subSysInfo.SubSysId));
}
}
return fovInfos;
}
public List GetFovInfos(eUnitId unitId, eSubSysId subSysId) {
var fovInfos = new List();
if (IsValidId(unitId, subSysId)) {
var subSysRecipe = GetSubSysRecipe(unitId, subSysId);
if (subSysRecipe != null) {
foreach (var fovRecipe in subSysRecipe.FovRecipes) {
fovInfos.Add(new FovInfo(
GetSubSysInfo(unitId, subSysId),
fovRecipe.FovId,
fovRecipe.FovName));
}
}
}
return fovInfos.OrderBy(fovInfo => fovInfo.FovId).ToList();
}
public FovInfo GetFovInfo(eUnitId unitId, eSubSysId subSysId, eFovId fovId) {
if (IsValidId(unitId, subSysId, fovId)) {
return new FovInfo(
GetSubSysInfo(unitId, subSysId),
fovId,
GetFovName(unitId, subSysId, fovId));
}
return null;
}
public string GetFovName(eUnitId unitId, eSubSysId subSysId, eFovId fovId) {
if (IsValidId(unitId, subSysId, fovId)) {
var fovRecipe = GetFovRecipe(unitId, subSysId, fovId);
if (fovRecipe != null) {
return fovRecipe.FovName;
}
}
return string.Empty;
}
public int GetFovCnt(eUnitId unitId, eSubSysId subSysId) {
var subSysRcp = GetSubSysRecipe(unitId, subSysId);
if (subSysRcp != null) {
return subSysRcp.FovRecipes.Count;
}
return 0;
}
public List GetCamIds(List fovRecipes) {
HashSet camList = new HashSet();
camList = fovRecipes.Select(fovRecipe => fovRecipe.CamRecipe.CamId).ToHashSet();
return camList.ToList();
}
public List GetAlignInfos() {
var alignInfos = new List();
foreach (var unitId in GetUnitIds()) {
alignInfos.AddRange(GetAlignInfos(unitId));
}
return alignInfos;
}
public List GetAlignInfos(eUnitId unitId) {
var alignInfos = new List();
if (IsValidId(unitId)) {
foreach (var subSysInfo in GetSubSysInfos(unitId)) {
alignInfos.AddRange(GetAlignInfos(unitId, subSysInfo.SubSysId));
}
}
return alignInfos;
}
public List GetAlignInfos(eUnitId unitId, eSubSysId subSysId) {
var alignInfos = new List();
if (IsValidId(unitId, subSysId)) {
var subSysRecipe = GetSubSysRecipe(unitId, subSysId);
if (subSysRecipe != null) {
foreach (var alignRecipe in subSysRecipe.AlignRecipes) {
alignInfos.Add(new AlignInfo(
GetSubSysInfo(unitId, subSysId),
alignRecipe.AlignId,
alignRecipe.AlignName));
}
}
}
return alignInfos.OrderBy(alignInfo => alignInfo.AlignId).ToList();
}
public AlignInfo GetAlignInfo(eUnitId unitId, eSubSysId subSysId, eAlignId alignId) {
if (IsValidId(unitId, subSysId, alignId)) {
return new AlignInfo(
GetSubSysInfo(unitId, subSysId),
alignId,
GetAlignName(unitId, subSysId, alignId));
}
return null;
}
public string GetAlignName(eUnitId unitId, eSubSysId subSysId, eAlignId alignId) {
if (IsValidId(unitId, subSysId, alignId)) {
var alignRecipe = GetAlignRecipe(unitId, subSysId, alignId);
if (alignRecipe != null) {
return alignRecipe.AlignName;
}
}
return string.Empty;
}
public int GetAlignCnt(eUnitId unitId, eSubSysId subSysId) {
if (IsValidId(unitId, subSysId)) {
var subSysRecipe = GetSubSysRecipe(unitId, subSysId);
if (subSysRecipe != null) {
return subSysRecipe.AlignRecipes.Count;
}
}
return 0;
}
public CamRecipe GetCamRecipe(eUnitId unitId, eSubSysId subSysId, eFovId fovId) {
var fovRecipe = GetFovRecipe(unitId, subSysId, fovId);
if (fovRecipe != null) {
return fovRecipe.CamRecipe;
}
return null;
}
public PatternRecipe GetPatternRecipe(eUnitId unitId, eSubSysId subSysId, eFovId fovId) {
var fovRecipe = GetFovRecipe(unitId, subSysId, fovId);
if (fovRecipe != null) {
return fovRecipe.PatternRecipe;
}
return null;
}
public CalRecipe GetCalRecipe(eUnitId unitId, eSubSysId subSysId) {
var subSysRecipe = GetSubSysRecipe(unitId, subSysId);
if (subSysRecipe != null) {
return subSysRecipe.CalRecipe;
}
return null;
}
public CalFovRecipe GetCalFovRecipe(eUnitId unitId, eSubSysId subSysId, eFovId fovId) {
var fovRecipe = GetFovRecipe(unitId, subSysId, fovId);
if (fovRecipe != null) {
return fovRecipe.CalFovRecipe;
}
return null;
}
public RefPointRecipe GetRefPointRecipe(eUnitId unitId, eSubSysId subSysId, eFovId fovId) {
var fovRecipe = GetFovRecipe(unitId, subSysId, fovId);
if (fovRecipe != null) {
return fovRecipe.RefPointRecipe;
}
return null;
}
public DirectorRecipe GetTeachingDirectorRecipe(SubSysInfo subSysInfo) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe != null && subSysRecipe.TeachingDirectorRecipe != null) {
return subSysRecipe.TeachingDirectorRecipe;
}
return null;
}
public DirectorRecipe GetAlignDirectorRecipe(SubSysInfo subSysInfo) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe != null && subSysRecipe.AlignDirectorRecipe != null) {
return subSysRecipe.AlignDirectorRecipe;
}
return null;
}
public LightRetryParams GetLightRetryParams(SubSysInfo subSysInfo, eAlignId alignId)
{
var alignRecipe = GetAlignRecipe(subSysInfo.UnitId, subSysInfo.SubSysId, alignId);
if (alignRecipe != null)
{
return alignRecipe.ProcParams.LightRetryParams;
}
return null;
}
public bool IsLightRetryEnaled(SubSysInfo subSysInfo, eAlignId alignId) {
var alignRecipe = GetAlignRecipe(subSysInfo.UnitId, subSysInfo.SubSysId, alignId);
if (alignRecipe != null) {
return alignRecipe.ProcParams.LightRetryParams.LightRetryEnabled;
}
return false;
}
public bool IsForceOkEnaled(SubSysInfo subSysInfo, eAlignId alignId) {
var alignRecipe = GetAlignRecipe(subSysInfo.UnitId, subSysInfo.SubSysId, alignId);
if (alignRecipe != null) {
return alignRecipe.ProcParams.ForceOkEnabled;
}
return false;
}
public CoordConvRecipe GetCoordConvRecipe(SubSysInfo subSysInfo) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe != null) {
return subSysRecipe.CoordConvRecipe;
}
return null;
}
public eSubSysType GetSubSysType(SubSysInfo subSysInfo) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe != null) {
return subSysRecipe.SubSysType;
}
return eSubSysType.None;
}
public bool ContainsAlignSystem(UnitInfo unitInfo) {
foreach (SubSysInfo subSysInfo in GetSubSysInfos(unitInfo)) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe?.SubSysType == eSubSysType.Align) {
return true;
}
}
return false;
}
public bool ContainsInspSystem(UnitInfo unitInfo) {
foreach (SubSysInfo subSysInfo in GetSubSysInfos(unitInfo)) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe?.SubSysType == eSubSysType.Inspect) {
return true;
}
}
return false;
}
public bool ContainsReviewSystem(UnitInfo unitInfo) {
foreach (SubSysInfo subSysInfo in GetSubSysInfos(unitInfo)) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe?.SubSysType == eSubSysType.Review) {
return true;
}
}
return false;
}
#region Setup Recipe for SubSystem
public CalSetupRecipe GetCalSetupRecipe(SubSysInfo subSysInfo) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe != null) {
return subSysRecipe.SubSysSetupRecipe?.CalSetupRecipe;
}
return null;
}
public CenterTuningRecipe GetCenterTuningRecipe(SubSysInfo subSysInfo) {
var subSysRecipe = GetSubSysRecipe(subSysInfo.UnitId, subSysInfo.SubSysId);
if (subSysRecipe != null) {
return subSysRecipe.SubSysSetupRecipe?.CenterTuningRecipe;
}
return null;
}
#endregion
#region Setup Recipe for Fov
public AutoFocusRecipe GetAutoFocusRecipe(FovInfo fovInfo) {
var fovRecipe = GetFovRecipe(fovInfo.UnitId, fovInfo.SubSysId, fovInfo.FovId);
if (fovRecipe != null) {
return fovRecipe.FovSetupRecipe?.AutoFocusRecipe;
}
return null;
}
public VisionRepeatRecipe GetVisionRepeatRecipe(FovInfo fovInfo) {
var fovRecipe = GetFovRecipe(fovInfo.UnitId, fovInfo.SubSysId, fovInfo.FovId);
if (fovRecipe != null) {
return fovRecipe.FovSetupRecipe?.VisionRepeatRecipe;
}
return null;
}
#endregion
}
}