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

342 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using Aurora.Api;
using Aurora.Api.DataType;
using Aurora.View;
using VisionLight;
using MilCommon;
using VisionCommon;
using MilPattern;
using VisionCommonUI;
using VisionCommonUI.Resources;
using Hermes;
using Matrox.MatroxImagingLibrary;
using System.Reactive.Linq;
namespace MilUI {
public class LineSettingAllViewModel : NotifyPropertyChangedBase, IGraEventSubscriber {
private Logger _logger = new Logger("LineSettingViewModel");
public ICommand CMD_VisibleChanged { get; }
public ICommand CMD_Copy { get; }
public ICommand CMD_Create { get; }
public ICommand CMD_Save { get; }
public ICommand CMD_Cancel { get; }
public ICommand CMD_Delete { get; }
public ICommand CMD_SetLight { get; }
public ICommand CMD_SetPreProc { get; }
public ICommand CMD_SetFindROI { get; }
public ICommand CMD_FindPattern { get; }
public bool IsSubPattern { get; set; }
private bool _isPatternRegistered;
public bool IsPatternRegistered { get => _isPatternRegistered; set => SetProperty(ref _isPatternRegistered, value); }
private bool _isSubPatternRegistered;
public bool IsSubPatternRegistered { get => _isSubPatternRegistered; set => SetProperty(ref _isSubPatternRegistered, value); }
private bool _isSubPatternNotRegistered;
public bool IsSubPatternNotRegistered { get => _isSubPatternNotRegistered; set => SetProperty(ref _isSubPatternNotRegistered, value); }
private PatternInfo _patternInfo;
public PatternInfo PatternInfo { get => _patternInfo; set => SetProperty(ref _patternInfo, value); }
private LineFinderRunParam _runParam;
public LineFinderRunParam RunParam { get => _runParam; set => SetProperty(ref _runParam, value); }
private string _idx;
public string IDX { get => _idx; set => SetProperty(ref _idx, value); }
private IEnumerable<int> _fixturePatterns;
public IEnumerable<int> FixturePatterns { get => _fixturePatterns; set => SetProperty(ref _fixturePatterns, value); }
public IEnumerable<eModelType> ModelTypeItems { get; } = Enum.GetValues(typeof(eModelType)).Cast<eModelType>();
public IEnumerable<eMilSpeed> SpeedItems { get; } = Enum.GetValues(typeof(eMilSpeed)).Cast<eMilSpeed>();
public IEnumerable<eMilDetailLevel> DetailLevelItems { get; } = Enum.GetValues(typeof(eMilDetailLevel)).Cast<eMilDetailLevel>();
public IEnumerable<eMilAccuracy> AccuracyItems { get; } = Enum.GetValues(typeof(eMilAccuracy)).Cast<eMilAccuracy>();
private PatternAgentBase _patternAgent;
private CameraDisplay _cameraDisplay;
private FovInfo _fovInfo;
private Window _childWindow = null;
private Dictionary<int, MIL_INT> roi_num;
public LineSettingAllViewModel(
PatternAgentBase patternAgent, PatternInfo patternInfo, CameraDisplay milcameraDisplay, FovInfo fovInfo) {
_patternAgent = patternAgent;
_patternInfo = patternInfo;
_cameraDisplay = milcameraDisplay;
_fovInfo = fovInfo;
IsSubPattern = PatternConstants.IsSubPattern(_patternInfo.GetPatternIndex());
CMD_VisibleChanged = new DelegateCommand(VisibleChanged);
CMD_Copy = new DelegateCommand(Copy);
CMD_Create = new DelegateCommand(Create);
CMD_Save = new DelegateCommand(Save);
CMD_Cancel = new DelegateCommand(Cancel);
CMD_Delete = new DelegateCommand(Delete);
CMD_SetLight = new DelegateCommand(SetLight);
CMD_SetPreProc = new DelegateCommand(SetPreProc);
CMD_SetFindROI = new DelegateCommand(SetFindROI);
CMD_FindPattern = new DelegateCommand(FindPattern);
Update();
VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.PATTERN_EDITTING).Subscribe(subid => UpdateIdx(subid));
}
private object UpdateIdx(EventMessage subid) {
int id = Convert.ToInt32(subid.Param);
IDX = id.ToString();
var lst_main = _patternAgent.GetMainPatterns(_patternInfo);
var lst_sub = _patternAgent.GetSubPatterns(_patternInfo);
var lst_all = new List<PatternInfo>();
lst_all.AddRange(lst_main);
lst_all.AddRange(lst_sub);
if (_patternAgent.IsPatternExist(_patternInfo.GetPatternIndex())) {
RunParam = _patternAgent.GetRunParam(lst_all[id]) as LineFinderRunParam;
_cameraDisplay.SetGraEventSubscriber(lst_all[id], this);
}
else {
RunParam = new LineFinderRunParam();
}
return null;
}
private void Update() {
InitRegistered();
InitRunParam();
InitFixturePatterns();
UpdateControlButtons(IsPatternRegistered);
_cameraDisplay.ClearAllGraphics();
}
public void InitRegistered() {
IsPatternRegistered = _patternAgent.IsPatternExist(_patternInfo.GetPatternIndex());
}
public void InitRunParam() {
if (_patternAgent.IsPatternExist(_patternInfo.GetPatternIndex())) {
RunParam = _patternAgent.GetRunParam(_patternInfo) as LineFinderRunParam;
}
else {
RunParam = new LineFinderRunParam();
}
}
public void InitFixturePatterns() {
FixturePatterns = _patternAgent.GetFixturePatternIndexListForFov(_patternInfo);
}
private void UpdateControlButtons(bool isPatternRegistered) {
IsPatternRegistered = isPatternRegistered;
IsSubPatternRegistered = IsSubPattern && isPatternRegistered;
IsSubPatternNotRegistered = IsSubPattern && !isPatternRegistered;
}
private void VisibleChanged(object obj) {
bool visible = (bool)obj;
if (visible == false) {
CloseChildWindow();
ClosingWindow();
_cameraDisplay.ClearMeasureGraphics();
_cameraDisplay.RemoveMultiRoiChangedEvent();
}
else {
_cameraDisplay.ClearFindGraphics();
_cameraDisplay.ClearMeasureGraphics();
}
}
private void Copy(object obj) {
var result = MessageBoxUtil.ShowMessageBoxQuestion(StrTokens.MSG_Q_CopyPatternZero);
if (result == MessageBoxResult.Yes) {
var mainPatternInfo = _patternAgent.GetMainPatternInfo(_patternInfo.GetPatternIndex());
if (E1.OK == _patternAgent.CopyPattern(mainPatternInfo.GetPatternIndex(), _patternInfo.GetPatternIndex())) {
InitRunParam();
InitFixturePatterns();
UpdateControlButtons(true);
MessageBoxUtil.ShowMessageBoxOk(StrTokens.MSG_O_CopyCompleted);
}
}
}
private void Create(object obj) {
if (!_patternAgent.IsPatternExist(_patternInfo.GetPatternIndex())) {
if (E1.OK == _patternAgent.Create(_patternInfo) &&
E1.OK == _patternAgent.Save(_patternInfo)) {
InitRunParam();
InitFixturePatterns();
UpdateControlButtons(true);
MessageBoxUtil.ShowMessageBoxOk(StrTokens.MSG_O_RegisterCompleted);
}
}
}
private void Save(object obj) {
Save();
MessageBoxUtil.ShowMessageBoxOk(StrTokens.MSG_O_SaveCompleted);
}
public void Save() {
var lst_main = _patternAgent.GetMainPatterns(_patternInfo);
var lst_sub = _patternAgent.GetSubPatterns(_patternInfo);
var lst_all = new List<PatternInfo>();
lst_all.AddRange(lst_main);
lst_all.AddRange(lst_sub);
for (int i = 0; i < lst_all.Count; i++) {
var rp = _patternAgent.GetRunParam(lst_all[i]) as LineFinderRunParam;
rp.FindROI = _cameraDisplay.GetFindRoi(roi_num[i]).Clone() as ROI;
_patternAgent.SetRunParam(lst_all[i], rp);
_patternAgent.Save(lst_all[i]);
}
SetFindROI(null);
}
private void Cancel(object obj) {
CloseChildWindow();
ClosingWindow();
CloseWindow(obj);
}
private void Delete(object obj) {
var result = MessageBoxUtil.ShowMessageBoxQuestion(StrTokens.MSG_Q_Delete);
if (result == MessageBoxResult.Yes) {
if (_patternAgent.IsPatternExist(_patternInfo.GetPatternIndex())) {
if (E1.OK == _patternAgent.Remove(_patternInfo)) {
UpdateControlButtons(false);
}
}
}
}
private void ClosingWindow() {
_cameraDisplay.ClearFindGraphics();
}
private void CloseWindow(object obj) {
var window = obj as Window;
if (window != null) {
window.Close();
}
}
private void CloseChildWindow() {
if (_childWindow != null) {
_childWindow.Close();
}
}
private void SetLight(object obj) {
PatternLightWindowManager.ShowLightSettingWindow(_fovInfo, _patternInfo);
}
private void SetPreProc(object obj) {
if (_childWindow == null) {
_childWindow = new PreProcessingWindow(_patternInfo, _cameraDisplay);
(_childWindow as IPatternSettingWindow).ResetPosition();
_childWindow.Closed += OnWindowClosed;
_childWindow.Owner = Application.Current.MainWindow;
_childWindow.Show();
}
else {
ResetWindow();
}
}
private void ResetWindow() {
if (_childWindow.WindowState == WindowState.Minimized) {
_childWindow.WindowState = WindowState.Normal;
}
(_childWindow as IPatternSettingWindow).ResetPosition();
}
private void OnWindowClosed(object sender, EventArgs e) {
_childWindow = null;
}
private void SetFindROI(object obj) {
_cameraDisplay.SetCurrentPatternInfo(_patternInfo);
_cameraDisplay.ClearAllGraphics();
var milImage = _cameraDisplay.GetImage();
if (milImage != 0) {
var imageSize = MilEnvironment.GetImageSize(milImage);
var findRois = new List<(int, ROI)>();
var lst_main = _patternAgent.GetMainPatterns(_patternInfo).Where(x=> x.GetPatternId() ==_patternInfo.GetPatternId()).FirstOrDefault();
var lst_sub = _patternAgent.GetSubPatterns(_patternInfo);
var lst_all = new List<PatternInfo>();
lst_all.Add(lst_main);
lst_all.AddRange(lst_sub);
foreach (var pt in lst_all) {
var rp = _patternAgent.GetRunParam(pt) as LineFinderRunParam;
var findRoi = GetFindROIFromRunParam(imageSize, rp);
var msgs = new List<string>();
msgs.Add(string.Format("{0}", pt.GetPatternSubId()));
findRois.Add((pt.GetPatternSubId(),findRoi));
_cameraDisplay.AddTextList(
GraphicColors.SkyBlue, new ImagePoint(findRoi.LeftTop.X + 45, findRoi.LeftTop.Y - 45), msgs);
}
_cameraDisplay.AddFindMultiRoi(findRois, out roi_num, true);
}
}
private ROI GetFindROIFromRunParam(ImageSize imageSize, LineFinderRunParam runParam) {
if ((0 < runParam.FindROI.Width && runParam.FindROI.Width < imageSize.Width) &&
(0 < runParam.FindROI.Height && runParam.FindROI.Height < imageSize.Height)) {
return runParam.FindROI.Clone() as ROI;
}
return new ROI(
new ImagePoint(imageSize.Width * 0.5, imageSize.Height * 0.5),
100, 300,
Angle.CreateWithDegree(0));
}
public void UpdateAngleOfFindRoi(double roiAngle) {
_cameraDisplay.UpdateAngleOfFindRoi(roiAngle);
}
private void FindPattern(object obj) {
if (!_patternInfo.IsActivated) {
MessageBoxUtil.ShowMessageBoxError(StrTokens.MSG_E_PatternNotActivated);
return;
}
if (_cameraDisplay != null) {
var image = _cameraDisplay.GetImage();
if (image == null) {
MessageBoxUtil.ShowMessageBoxError(StrTokens.MSG_E_ImageNotReady);
return;
}
//if (_cameraDisplay.HasFindRoi()) {
// RunParam.FindROI = _cameraDisplay.GetFindRoi().Clone() as ROI;
//}
_cameraDisplay.ClearFindGraphics();
_cameraDisplay.ClearMeasureGraphics();
//_patternAgent.SetRunParam(_patternInfo, RunParam);
var patternResult = _patternAgent.Find(_patternInfo, image, _cameraDisplay);
_patternAgent.Draw(_patternInfo, patternResult, _cameraDisplay);
if (patternResult.Status == eFoundStatus.NotFound) {
MessageBoxUtil.ShowMessageBoxError(StrTokens.MSG_E_PatternNotFound);
}
}
}
public void UpdateAngleOfRoi(eGraRoiType graRoiType, object param) {
if (graRoiType == eGraRoiType.FindRoi) {
RunParam.FindROI.Angle.Degree = Math.Round((double)param, 1);
NotifyPropertyChanged(nameof(RunParam));
}
}
}
}