281 lines
12 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|