using MainShell.Common;
using MainShell.Log;
using MainShell.Motion;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MainShell.PageCalib.OriginCalib.Service
{
///
/// 示例后处理器:用于在标定轴移动到位后拍照
///
public class VisionCapturePostProcessor : ICalibrationPostProcessor
{
public string Name => "VisionCapture";
public async Task ExecuteAsync(OriginCalibrationExecutionResult calibrationResult, CancellationToken cancellationToken,object pars= null)
{
"执行拍照后处理逻辑...".LogInfo();
// 在此处添加拍照逻辑
// 例如:await _visionService.CaptureAsync(cancellationToken);
await Task.Delay(100, cancellationToken);
"拍照后处理完成。".LogInfo();
}
}
///
/// 逼近对齐后处理器:用于在标定轴移动到位后执行逼近对齐
///
public class ApproachAlignmentPostProcessor : ICalibrationPostProcessor
{
private readonly ApproachAlignmentService _approachAlignmentService;
private readonly IReadOnlyList _alignmentAxes;
private readonly CameraType _camera;
///
/// 构造函数
///
/// 逼近对齐服务
/// 需要对齐的轴配置列表
/// 相机类型,默认为上相机
public ApproachAlignmentPostProcessor(
ApproachAlignmentService approachAlignmentService,
IEnumerable alignmentAxes,
CameraType camera = CameraType.TopPositionCamera)
{
_approachAlignmentService = approachAlignmentService ?? throw new ArgumentNullException(nameof(approachAlignmentService));
if (alignmentAxes == null)
{
throw new ArgumentNullException(nameof(alignmentAxes));
}
_alignmentAxes = alignmentAxes.ToList().AsReadOnly();
if (_alignmentAxes.Count == 0)
{
throw new ArgumentException("至少需要一个对齐轴。", nameof(alignmentAxes));
}
_camera = camera;
}
public string Name => "ApproachAlignment";
public async Task ExecuteAsync(OriginCalibrationExecutionResult calibrationResult, CancellationToken cancellationToken,object pars= null)
{
"执行逼近对齐后处理逻辑...".LogInfo();
try
{
ApproachAlignmentRequest alignmentRequest = new ApproachAlignmentRequest(_alignmentAxes, _camera);
if(pars is CenterRecognitionParameters centerRecognitionParameters)
{
alignmentRequest.RecognitionParameters = centerRecognitionParameters;
}
ApproachAlignmentResult alignmentResult = await _approachAlignmentService.ApproachAlignmentAsync(
alignmentRequest,
cancellationToken).ConfigureAwait(false);
if (alignmentResult.Succeeded)
{
string.Format("逼近对齐完成,迭代次数:{0}", alignmentResult.CompletedIterations).LogInfo();
}
else
{
string.Format("逼近对齐失败:{0}", alignmentResult.Message).LogInfo();
throw alignmentResult.Exception ?? new InvalidOperationException(alignmentResult.Message);
}
}
catch (OperationCanceledException)
{
"逼近对齐后处理被取消。".LogInfo();
throw;
}
catch (Exception ex)
{
string.Format("逼近对齐后处理异常:{0}", ex.Message).LogInfo();
throw;
}
}
}
///
/// 单次对位后处理器:用于在标定轴移动到位后执行一次识别、转换与运动
///
public class SingleAlignmentPostProcessor : ICalibrationPostProcessor
{
private readonly ApproachAlignmentService _approachAlignmentService;
private readonly IReadOnlyList _alignmentAxes;
private readonly CameraType _camera;
public SingleAlignmentPostProcessor(
ApproachAlignmentService approachAlignmentService,
IEnumerable alignmentAxes,
CameraType camera = CameraType.TopPositionCamera)
{
_approachAlignmentService = approachAlignmentService ?? throw new ArgumentNullException(nameof(approachAlignmentService));
if (alignmentAxes == null)
{
throw new ArgumentNullException(nameof(alignmentAxes));
}
_alignmentAxes = alignmentAxes.ToList().AsReadOnly();
if (_alignmentAxes.Count == 0)
{
throw new ArgumentException("至少需要一个对齐轴。", nameof(alignmentAxes));
}
_camera = camera;
}
public string Name => "SingleAlignment";
public async Task ExecuteAsync(OriginCalibrationExecutionResult calibrationResult, CancellationToken cancellationToken, object pars = null)
{
"执行单次对位后处理逻辑...".LogInfo();
try
{
ApproachAlignmentRequest alignmentRequest = new ApproachAlignmentRequest(_alignmentAxes, _camera);
if (pars is CenterRecognitionParameters centerRecognitionParameters)
{
alignmentRequest.RecognitionParameters = centerRecognitionParameters;
}
ApproachAlignmentResult alignmentResult = await _approachAlignmentService.SingleAlignmentAsync(
alignmentRequest,
cancellationToken).ConfigureAwait(false);
if (alignmentResult.Succeeded)
{
string.Format("单次对位完成,执行次数:{0}", alignmentResult.CompletedIterations).LogInfo();
}
else
{
string.Format("单次对位失败:{0}", alignmentResult.Message).LogInfo();
throw alignmentResult.Exception ?? new InvalidOperationException(alignmentResult.Message);
}
}
catch (OperationCanceledException)
{
"单次对位后处理被取消。".LogInfo();
throw;
}
catch (Exception ex)
{
string.Format("单次对位后处理异常:{0}", ex.Message).LogInfo();
throw;
}
}
}
}