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

281 lines
12 KiB
C#

using Aurora.Api;
using Aurora.View;
using VisionCommon;
using Matrox.MatroxImagingLibrary;
using MilPattern;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using VisionCommonUI;
using VisionCommonUI.Resources;
using MilCommon;
using Aurora.Api.DataType;
namespace MilUI {
public class TrainOriginSyncViewModel : NotifyPropertyChangedBase {
private Logger _logger = new Logger("TrainOriginSyncVM");
public ICommand CMD_Clear { get; }
public ICommand CMD_Find { get; }
public ICommand CMD_SyncXY { get; }
public ICommand CMD_SyncT { get; }
public ICommand CMD_Cancel { get; }
private bool _enableSyncT;
public bool EnableSyncT { get => _enableSyncT; set => SetProperty(ref _enableSyncT, value); }
public ObservableCollection<TrainOriginInfo> TrainOriginInfos { get; set; }
private int _selectedPatternIndex;
public int SelectedPatternIndex {
get => _selectedPatternIndex;
set {
_selectedPatternIndex = value;
CalcOriginOffset(value);
}
}
private PatternAgentBase _patternAgent;
private PatternInfo _patternInfo;
private CameraDisplay _milCameraDisplay;
public TrainOriginSyncViewModel(
PatternAgentBase patternAgent, PatternInfo patternInfo, ICameraDisplay cameraDisplay) {
_patternAgent = patternAgent;
_patternInfo = patternInfo;
_milCameraDisplay = cameraDisplay as CameraDisplay;
CMD_Clear = new DelegateCommand(Clear);
CMD_Find = new DelegateCommand(Find);
CMD_SyncXY = new DelegateCommand(SyncXY);
CMD_SyncT = new DelegateCommand(SyncT);
CMD_Cancel = new DelegateCommand(Cancel);
SetEnableSyncT();
InitTrainOriginInfos(0);
}
public void SetEnableSyncT() {
EnableSyncT = _patternInfo.PatternType == ePatternType.ImageModelFinder;
}
public void InitTrainOriginInfos(int initIndex) {
try {
Application.Current.Dispatcher.Invoke(
new Action(() => {
if (TrainOriginInfos == null) {
TrainOriginInfos = new ObservableCollection<TrainOriginInfo>();
}
TrainOriginInfos.Clear();
var existingPatternInfos = _patternAgent.GetMainSubPatterns(_patternInfo);
foreach (var patternInfo in existingPatternInfos) {
var trainOriginInfo = new TrainOriginInfo(
patternInfo, GetSolidColorBrush(patternInfo.GetPatternSubId()));
TrainOriginInfos.Add(trainOriginInfo);
}
SelectedPatternIndex = initIndex;
}));
}
catch (Exception e) {
_logger.FuncE(e.Message);
}
}
private void CalcOriginOffset(int selectedIndex) {
if (TrainOriginInfos.Count <= selectedIndex) {
_logger.FuncE($"TrainOriginInfos does not contain the index [{selectedIndex}].");
return;
}
if (0 < TrainOriginInfos.Count && 0 <= selectedIndex) {
var newTrainOriginInfos = new ObservableCollection<TrainOriginInfo>();
var origin = TrainOriginInfos[selectedIndex].OriginPoint.Clone() as ImagePoint;
var t = TrainOriginInfos[selectedIndex].T.Clone() as Angle;
foreach (var trainOriginInfo in TrainOriginInfos) {
var toi = trainOriginInfo.Clone();
toi.OriginOffset = origin - trainOriginInfo.OriginPoint as ImagePoint;
toi.TOffset = t - trainOriginInfo.T;
newTrainOriginInfos.Add(toi);
}
TrainOriginInfos = newTrainOriginInfos;
NotifyPropertyChanged("TrainOriginInfos");
_selectedPatternIndex = selectedIndex;
NotifyPropertyChanged("SelectedPatternIndex");
}
}
private void Clear(object obj) {
_milCameraDisplay.ClearMeasureGraphics();
InitTrainOriginInfos(0);
}
private void Find(object obj) {
_milCameraDisplay.ClearMeasureGraphics();
var lastSelectedPatternIndex = _selectedPatternIndex;
var newTrainOriginInfos = new ObservableCollection<TrainOriginInfo>();
var notFoundPatternSubIds = new List<int>();
var patternInfos = _patternAgent.GetMainSubPatterns(_patternInfo);
foreach (var patternInfo in patternInfos) {
var runParam = _patternAgent.GetRunParam(patternInfo);
_patternAgent.SetRunParam(patternInfo, runParam);
var patternResult = _patternAgent.Find(patternInfo, _milCameraDisplay.GetImage());
if (patternResult.Status != eFoundStatus.NotFound) {
var result = patternResult.Results.ToList()[0];
_milCameraDisplay.AddCross(
new Cross(result.ImagePosition.Clone() as ImagePoint, -result.Angle, 50),
GetDrawingColor(patternInfo.GetPatternSubId()));
newTrainOriginInfos.Add(
new TrainOriginInfo(patternInfo, GetSolidColorBrush(patternInfo.GetPatternSubId())) {
OriginPoint = result.ImagePosition,
T = result.Angle.Clone() as Angle
});
}
else {
notFoundPatternSubIds.Add(patternInfo.GetPatternSubId());
}
}
TrainOriginInfos = newTrainOriginInfos;
CalcOriginOffset(lastSelectedPatternIndex);
if (0 < notFoundPatternSubIds.Count) {
string strIds = string.Empty;
for (int i = 0; i < notFoundPatternSubIds.Count; i++) {
strIds += notFoundPatternSubIds[i].ToString();
if (i != notFoundPatternSubIds.Count - 1) {
strIds += ", ";
}
}
MessageBoxUtil.ShowMessageBoxWarning(
string.Format(StrTokens.MSG_W_PatternNotFoundFormat, strIds));
}
}
private void SyncXY(object obj) {
var result = MessageBoxUtil.ShowMessageBoxQuestion(
string.Format(StrTokens.MSG_Q_SyncPatternOriginFormat, SelectedPatternIndex));
if (result == MessageBoxResult.Yes) {
foreach (var trainOriginInfo in TrainOriginInfos) {
if (trainOriginInfo.PaternInfo == TrainOriginInfos[SelectedPatternIndex].PaternInfo) {
continue;
}
var patternTrain = _patternAgent.GetPattern(trainOriginInfo.PaternInfo) as IPatternTrain;
var trainParam = patternTrain.GetTrainParam() as ImageTrainParam;
var newTrainOrigin = new Cross(new ImagePoint(
Math.Round(trainParam.TrainOriginInModel.Origin.X + trainOriginInfo.OriginOffset.X, 1),
Math.Round(trainParam.TrainOriginInModel.Origin.Y + trainOriginInfo.OriginOffset.Y, 1)));
_logger.I($"oldTrainOrigin : {trainParam.TrainOriginInModel}, offset : {trainOriginInfo.OriginOffset}");
_logger.I($"newTrainOrigin : {newTrainOrigin.Origin}");
((IPatternMask)patternTrain).SetTrainOrigin(newTrainOrigin);
((IPatternFinder)patternTrain).Save();
}
MessageBoxUtil.ShowMessageBoxOk(StrTokens.MSG_O_SaveCompleted);
}
}
private void SyncT(object obj) {
var result = MessageBoxUtil.ShowMessageBoxQuestion(
string.Format(StrTokens.MSG_Q_SyncPatternOriginFormat, SelectedPatternIndex));
if (result == MessageBoxResult.Yes) {
foreach (var trainOriginInfo in TrainOriginInfos) {
if (trainOriginInfo.PaternInfo == TrainOriginInfos[SelectedPatternIndex].PaternInfo) {
continue;
}
var pattern = _patternAgent.GetPattern(trainOriginInfo.PaternInfo);
var patternTrain = pattern as IPatternTrain;
var patternMask = pattern as IPatternMask;
var trainParam = patternTrain.GetTrainParam() as ImageTrainParam;
var runParam = pattern.GetRunParam() as ModelFinderRunParam;
var modelImage = patternMask.GetGrayModelImage();
var maskImage = patternMask.GetMaskImage();
MIL.MimRotate(
maskImage, maskImage, trainOriginInfo.TOffset.Degree * -1,
trainParam.TrainOriginInModel.Origin.X, trainParam.TrainOriginInModel.Origin.Y,
trainParam.TrainOriginInModel.Origin.X, trainParam.TrainOriginInModel.Origin.Y,
MIL.M_NEAREST_NEIGHBOR);
var trainImageSize = new ImageSize() {
Width = (int)(trainParam.TrainRoi.Right + 100),
Height = (int)(trainParam.TrainRoi.Bottom + 100),
Channel = 1,
BitDepth = 8
};
var trainImage = MilEnvironment.GetCompatibleGrayImageBuffer(
trainImageSize, MilEnvironment.GetSystemOfBuffer(maskImage));
MIL.MbufCopyClip(modelImage, trainImage, (int)trainParam.TrainRoi.Left, (int)trainParam.TrainRoi.Top);
trainParam.TrainImage = trainImage;
trainParam.TrainRoi.Angle = Angle.CreateWithDegree(trainOriginInfo.TOffset.Degree);
patternTrain.Train(trainParam);
patternMask.SetMaskImage(maskImage);
pattern.SetRunParam(runParam);
pattern.Save();
MilEnvironment.FreeImage(modelImage);
MilEnvironment.FreeImage(maskImage);
MilEnvironment.FreeImage(trainImage);
}
MessageBoxUtil.ShowMessageBoxOk(StrTokens.MSG_O_SaveCompleted);
}
}
private SolidColorBrush GetSolidColorBrush(int patternSubId) {
switch (patternSubId) {
case 0:
return new SolidColorBrush(Color.FromRgb(0, 0xFF, 0xFF)); // Cyan
case 1:
return new SolidColorBrush(Color.FromRgb(0xFF, 0, 0xFF)); // Magenta
case 2:
return new SolidColorBrush(Color.FromRgb(0xFF, 0x5F, 0x1F)); // Neon Orange
case 3:
return new SolidColorBrush(Color.FromRgb(0xFF, 0xFF, 0)); // Yellow
case 4:
default:
return new SolidColorBrush(Color.FromRgb(0, 0xFF, 0)); // Green
}
}
private MIL_INT GetDrawingColor(int patternSubId) {
switch (patternSubId) {
case 0:
return MIL.M_COLOR_CYAN;
case 1:
return MIL.M_COLOR_MAGENTA;
case 2:
return MIL.M_RGB888(0xFF, 0x5F, 0x1F); // Neon Orange
case 3:
return MIL.M_RGB888(0xFF, 0xFF, 0); // Yellow
case 4:
default:
return MIL.M_COLOR_GREEN;
}
}
private void Cancel(object obj) {
CloseWindow(obj);
}
private void CloseWindow(object obj) {
var window = obj as Window;
if (window != null) {
window.Close();
}
}
}
}