2026-06-05 13:44:39 +09:00

277 lines
10 KiB
C#

using System.Collections.Generic;
using Aurora.Api;
using VisionCommon;
using VisionSequence.Pattern;
using Hermes;
using VisionCommonUI;
using VisionCommonUI.Resources;
using VisionSequence.Aligner;
namespace VisionSequence.Inspector {
/// <summary>
/// 패턴 유무 검사 시퀀스 파라미터
/// </summary>
public class InspSeqParams_PatternExist {
/// <summary>FOV 키 정보</summary>
public FovInfo FovInfo { get; set; }
/// <summary>Align 키 정보</summary>
public AlignInfo AlignInfo { get; set; }
/// <summary>메인 화면 타입</summary>
public eDisplayType DisplayType { get; set; }
/// <summary>
/// 생성자
/// </summary>
/// <param name="fovInfo">FOV 키 정보</param>
/// <param name="displayType">메인 화면 타입</param>
public InspSeqParams_PatternExist(
FovInfo fovInfo,
eDisplayType displayType = eDisplayType.Main_1) {
this.FovInfo = fovInfo;
this.DisplayType = displayType;
}
}
/// <summary>
/// 패턴 유무 검사 (서브시퀀스로 호출해서 사용)
/// </summary>
public class InspSeq_PatternExist : SubSeqBase {
private readonly Logger LOG = new Logger(typeof(InspSeq_PatternExist).Name);
private InspSeqParams_PatternExist _Params;
private SubSysInfo _SubSysInfo;
private ImageManager _ImageManager = new ImageManager();
private PatternAgentBase _PatternAgent;
private FovRecipe _FovRecipe;
private AlignInfo _AlignInfo;
private string _SeqName;
#region Sequence Id
private const string SEQ_ID_INIT = "INIT";
private const string SEQ_ID_CLEAR = "CLEAR";
// Dry Run
private const string SEQ_CHECK_DRY_RUN = "CHECK_DRY_RUN";
private const string SEQ_ID_SET_DRY_RUN_SEQ_PARAMS = "SET_DRY_RUN_SEQ_PARAMS";
private const string SEQ_ID_DRY_RUN_SEQ = "DRY_RUN_SEQ";
private const string SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS = "SET_GRAB_FIND_PROC_SEQ_PARAMS";
private const string SEQ_ID_GRAB_FIND_PROC_SEQ = "GRAB_FIND_PROC_SEQ";
private const string SEQ_ID_UPDATE_UI = "UPDATE_UI";
private const string SEQ_ID_SAVE_SCREENSHOT = "SAVE_SCREENSHOT";
private const string SEQ_ID_SEQ_COMPLETE = "SEQ_COMPLETE";
#endregion
/// <summary>
/// 생성자
/// </summary>
public InspSeq_PatternExist() {
}
private void SetActions(SequenceBuilder sb) {
SequenceBuilder dryRunSeqBuilder = SubSeqManager.CreateSubSeqBuilder(new AlignSeq_DryRun(), typeof(AlignSeq_DryRun).Name);
SequenceBuilder grabFindProcSeqBuilder = SubSeqManager.CreateSubSeqBuilder(new GrabFindProcSeq(), typeof(GrabFindProcSeq).Name);
sb.AddAction(SEQ_ID_INIT, Init);
sb.AddAction(SEQ_ID_CLEAR, Clear);
// Dry Run
sb.AddDecision(SEQ_CHECK_DRY_RUN, CheckDryRun);
sb.AddAction(SEQ_ID_SET_DRY_RUN_SEQ_PARAMS, SetDryRunSeqParams);
sb.AddSubsequence(SEQ_ID_DRY_RUN_SEQ, dryRunSeqBuilder);
sb.AddAction(SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS, SetGrabFindProcSeqParams);
sb.AddSubsequence(SEQ_ID_GRAB_FIND_PROC_SEQ, grabFindProcSeqBuilder);
sb.AddAction(SEQ_ID_UPDATE_UI, UpdateUI);
sb.AddAction(SEQ_ID_SAVE_SCREENSHOT, SaveScreenShot);
sb.AddAction(SEQ_ID_SEQ_COMPLETE, SeqComplete);
}
public override SequenceBuilder Builder(string seqName) {
_SeqName = seqName;
SequenceBuilder sb = new SequenceBuilder(1000);
SetActions(sb);
sb.OnStopped(OnStopped);
sb.OnForceError(OnForceError);
sb.Flows(
sb.Init
> sb[SEQ_ID_INIT]
> sb[SEQ_ID_CLEAR]
> sb[SEQ_CHECK_DRY_RUN]
> sb[SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS]
> sb[SEQ_ID_GRAB_FIND_PROC_SEQ]
> sb[SEQ_ID_UPDATE_UI]
> sb[SEQ_ID_SAVE_SCREENSHOT]
> sb[SEQ_ID_SEQ_COMPLETE]
);
sb.Flows(
sb[SEQ_CHECK_DRY_RUN] // Dry Run
> sb[SEQ_ID_SET_DRY_RUN_SEQ_PARAMS]
> sb[SEQ_ID_DRY_RUN_SEQ]
> sb[SEQ_ID_SEQ_COMPLETE]
);
sb.Flows(
sb[SEQ_ID_SEQ_COMPLETE]
> sb.Final
);
#if SEQ_DRAW
sb.Draw($"{GetType().Name}.pdf");
#endif
return sb;
}
private SequenceActionResult Init(
SequenceContext context,
string id,
SequenceActionResult param) {
if (param.Param != null) {
_Params = param.Param as InspSeqParams_PatternExist;
}
else {
MessageBoxUtil.ShowMessageBoxError(
string.Format(StrTokens.MSG_E_ParamIsNull));
return SequenceAction.Error(E1.ARGUMENT);
}
_SubSysInfo = _Params.FovInfo.ToSubSysInfo();
_FovRecipe = VisionRecipeManager.GetFovRecipe(_Params.FovInfo);
_PatternAgent = FovPatternAgentManager.GetAgent(_SubSysInfo);
_AlignInfo = _Params.AlignInfo;
return SequenceAction.Ok();
}
private SequenceActionResult Clear(
SequenceContext context,
string id,
SequenceActionResult param) {
var milCameraDisplay = CameraDisplayManager.GetDisplay(_Params.FovInfo, _Params.DisplayType);
milCameraDisplay.ClearAllGraphics();
GrabFindSeqUtil.Clear(_SubSysInfo);
return SequenceAction.Ok();
}
#region Dry Run
private string CheckDryRun(
SequenceContext context,
string id,
ICollection<string> branches,
SequenceActionResult param) {
if (EquipAdapter.Instance.EquipMode.IsDryrunOrTransferMode()) {
return SEQ_ID_SET_DRY_RUN_SEQ_PARAMS;
}
else {
return SEQ_ID_SET_GRAB_FIND_PROC_SEQ_PARAMS;
}
}
private SequenceActionResult SetDryRunSeqParams(
SequenceContext context,
string id,
SequenceActionResult param) {
var alignInfo = VisionRecipeManager.GetAlignInfo(_SubSysInfo.UnitId, _SubSysInfo.SubSysId, eAlignId.Align1);
var fovInfos = new Dictionary<eFovId, FovInfo>();
foreach (var fovInfo in VisionRecipeManager.GetFovInfos(_SubSysInfo)) {
fovInfos.Add(fovInfo.FovId, fovInfo);
}
return SequenceAction.Ok(new AlignSeqParams_DryRun(alignInfo, fovInfos));
}
#endregion
private SequenceActionResult SetGrabFindProcSeqParams(
SequenceContext context,
string id,
SequenceActionResult param) {
var procPatternInfo = VisionRecipeManager.GetProcPatternInfo(_Params.FovInfo, _AlignInfo.AlignId.ToString(), eProcPatternId.ProcPattern1);
var patternInfo = _PatternAgent.GetPatternInfo(_Params.FovInfo, procPatternInfo.PatternId);
patternInfo.PatternName = procPatternInfo.PatternName;
return SequenceAction.Ok(new GrabFindProcSeqParams(_Params.FovInfo, patternInfo, _Params.DisplayType));
}
private SequenceActionResult UpdateUI(
SequenceContext context,
string id,
SequenceActionResult param) { // Param : PatternResult
var patternResult = param.Param as PatternResult;
context.PutValue(string.Format(VisionContextKeys.CNTXT_KEY_PATTERN_EXIST_RESULT, _Params.FovInfo.GetKey()), patternResult);
return SequenceAction.Ok();
}
private SequenceActionResult SaveScreenShot(
SequenceContext context,
string id,
SequenceActionResult param) {
if (EquipAdapter.Instance.EquipMode.IsNotDryrunAndTransferMode()) {
var patternResult = context.GetValue<PatternResult>(string.Format(VisionContextKeys.CNTXT_KEY_PATTERN_EXIST_RESULT, _Params.FovInfo.GetKey()));
var materialInfo = context.GetValue<MaterialInfo>(VisionContextKeys.CNTXT_KEY_MATERIAL_INFO);
if (IsFoundStatusNG(patternResult.Status) || VisionSettingManager.VisionSetting.SaveOkSceenShotImage) {
_ImageManager.SaveScreenShot(_Params.FovInfo, patternResult.Status.ToString(), materialInfo, _Params.DisplayType);
}
}
return SequenceAction.Ok();
}
private bool IsFoundStatusNG(eFoundStatus status) {
switch (status) {
case eFoundStatus.None:
case eFoundStatus.NotFound:
return true;
default:
return false;
}
}
private SequenceActionResult SeqComplete(
SequenceContext context,
string id,
SequenceActionResult param) {
PatternResult patternResult = null;
if (EquipAdapter.Instance.EquipMode.IsDryrunOrTransferMode()) {
patternResult = new PatternResult() {
PatternName = "DryRun",
Status = eFoundStatus.None,
Results = new List<BaseResult>()
};
context.PutValue(string.Format(VisionContextKeys.CNTXT_KEY_PATTERN_EXIST_RESULT, _Params.FovInfo.GetKey()), patternResult);
}
patternResult = context.GetValue<PatternResult>(string.Format(VisionContextKeys.CNTXT_KEY_PATTERN_EXIST_RESULT, _Params.FovInfo.GetKey()));
return SequenceAction.Ok(patternResult);
}
private void OnStopped(SequenceContext context) {
LOG.I($"{context.SequenceId} - STOP Handler");
HandleAbnormalFinish(context);
}
private void OnForceError(SequenceContext context, string id) {
LOG.E($"{context.SequenceId} - FORCE ERROR Handler");
HandleAbnormalFinish(context);
}
void HandleAbnormalFinish(SequenceContext context) {
}
}
}