Files
OrpaonVision/OrpaonVision.Core/PositionValidation/IPositionValidationService.cs
2026-04-06 22:04:05 +08:00

1164 lines
30 KiB
C#

using OrpaonVision.Core.LayerRecognition;
using OrpaonVision.Core.PartRecognition;
using OrpaonVision.Core.Results;
using OrpaonVision.Core.Common;
namespace OrpaonVision.Core.PositionValidation;
/// <summary>
/// 位置校验服务接口。
/// </summary>
public interface IPositionValidationService
{
/// <summary>
/// 校验槽位位置。
/// </summary>
/// <param name="parts">部件列表。</param>
/// <param name="slots">槽位列表。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>槽位校验结果。</returns>
Task<Result<SlotValidationResult>> ValidateSlotsAsync(IReadOnlyList<MappedPart> parts, IReadOnlyList<SlotDefinition> slots, CancellationToken cancellationToken = default);
/// <summary>
/// 校验重叠率。
/// </summary>
/// <param name="parts">部件列表。</param>
/// <param name="maxOverlapRatio">最大重叠率。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>重叠率校验结果。</returns>
Task<Result<OverlapValidationResult>> ValidateOverlapAsync(IReadOnlyList<MappedPart> parts, double maxOverlapRatio, CancellationToken cancellationToken = default);
/// <summary>
/// 校验中心点位置。
/// </summary>
/// <param name="parts">部件列表。</param>
/// <param name="expectedPositions">期望位置列表。</param>
/// <param name="tolerance">位置容差。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>中心点校验结果。</returns>
Task<Result<CenterPointValidationResult>> ValidateCenterPointsAsync(IReadOnlyList<MappedPart> parts, IReadOnlyList<ExpectedPosition> expectedPositions, double tolerance, CancellationToken cancellationToken = default);
/// <summary>
/// 校验边界框位置。
/// </summary>
/// <param name="parts">部件列表。</param>
/// <param name="expectedBoundingBoxes">期望边界框列表。</param>
/// <param name="tolerance">位置容差。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>边界框校验结果。</returns>
Task<Result<BoundingBoxValidationResult>> ValidateBoundingBoxesAsync(IReadOnlyList<MappedPart> parts, IReadOnlyList<ExpectedBoundingBox> expectedBoundingBoxes, double tolerance, CancellationToken cancellationToken = default);
/// <summary>
/// 校验角度偏差。
/// </summary>
/// <param name="parts">部件列表。</param>
/// <param name="expectedAngles">期望角度列表。</param>
/// <param name="tolerance">角度容差。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>角度校验结果。</returns>
Task<Result<AngleValidationResult>> ValidateAnglesAsync(IReadOnlyList<MappedPart> parts, IReadOnlyList<ExpectedAngle> expectedAngles, double tolerance, CancellationToken cancellationToken = default);
/// <summary>
/// 批量位置校验。
/// </summary>
/// <param name="parts">部件列表。</param>
/// <param name="validationRules">校验规则列表。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>批量校验结果。</returns>
Task<Result<BatchPositionValidationResult>> BatchValidatePositionAsync(IReadOnlyList<MappedPart> parts, IReadOnlyList<PositionValidationRule> validationRules, CancellationToken cancellationToken = default);
/// <summary>
/// 计算几何特征。
/// </summary>
/// <param name="parts">部件列表。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>几何特征。</returns>
Task<Result<GeometricFeatures>> CalculateGeometricFeaturesAsync(IReadOnlyList<MappedPart> parts, CancellationToken cancellationToken = default);
/// <summary>
/// 获取位置校验统计信息。
/// </summary>
/// <param name="startTime">开始时间。</param>
/// <param name="endTime">结束时间。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>统计信息。</returns>
Task<Result<PositionValidationStatistics>> GetValidationStatisticsAsync(DateTime startTime, DateTime endTime, CancellationToken cancellationToken = default);
/// <summary>
/// 创建位置校验规则。
/// </summary>
/// <param name="rule">校验规则。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>创建结果。</returns>
Task<Result<PositionValidationRule>> CreateValidationRuleAsync(PositionValidationRule rule, CancellationToken cancellationToken = default);
/// <summary>
/// 更新位置校验规则。
/// </summary>
/// <param name="rule">校验规则。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>更新结果。</returns>
Task<Result> UpdateValidationRuleAsync(PositionValidationRule rule, CancellationToken cancellationToken = default);
/// <summary>
/// 删除位置校验规则。
/// </summary>
/// <param name="ruleId">规则ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>删除结果。</returns>
Task<Result> DeleteValidationRuleAsync(Guid ruleId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取位置校验规则列表。
/// </summary>
/// <param name="productTypeCode">产品类型编码(可选)。</param>
/// <param name="layerNumber">层级编号(可选)。</param>
/// <param name="validationType">校验类型(可选)。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>规则列表。</returns>
Task<Result<IReadOnlyList<PositionValidationRule>>> GetValidationRulesAsync(string? productTypeCode = null, int? layerNumber = null, PositionValidationType? validationType = null, CancellationToken cancellationToken = default);
}
/// <summary>
/// 槽位校验结果。
/// </summary>
public sealed class SlotValidationResult
{
/// <summary>
/// 是否通过校验。
/// </summary>
public bool IsValid { get; init; }
/// <summary>
/// 总槽位数量。
/// </summary>
public int TotalSlots { get; init; }
/// <summary>
/// 已占用槽位数量。
/// </summary>
public int OccupiedSlots { get; init; }
/// <summary>
/// 空闲槽位数量。
/// </summary>
public int EmptySlots { get; init; }
/// <summary>
/// 槽位占用率。
/// </summary>
public double SlotOccupancyRate => TotalSlots > 0 ? (double)OccupiedSlots / TotalSlots * 100 : 0.0;
/// <summary>
/// 槽位匹配结果列表。
/// </summary>
public IReadOnlyList<SlotMatch> SlotMatches { get; init; } = Array.Empty<SlotMatch>();
/// <summary>
/// 未匹配的部件列表。
/// </summary>
public IReadOnlyList<MappedPart> UnmatchedParts { get; init; } = Array.Empty<MappedPart>();
/// <summary>
/// 未占用的槽位列表。
/// </summary>
public IReadOnlyList<SlotDefinition> UnoccupiedSlots { get; init; } = Array.Empty<SlotDefinition>();
/// <summary>
/// 校验时间。
/// </summary>
public DateTime ValidationTimeUtc { get; init; }
/// <summary>
/// 详细信息。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 槽位匹配结果。
/// </summary>
public sealed class SlotMatch
{
/// <summary>
/// 匹配的部件。
/// </summary>
public MappedPart Part { get; init; } = new();
/// <summary>
/// 匹配的槽位。
/// </summary>
public SlotDefinition Slot { get; init; } = new();
/// <summary>
/// 匹配置信度。
/// </summary>
public double MatchConfidence { get; init; }
/// <summary>
/// 位置偏差。
/// </summary>
public double PositionDeviation { get; init; }
/// <summary>
/// 大小偏差。
/// </summary>
public double SizeDeviation { get; init; }
/// <summary>
/// 是否为最佳匹配。
/// </summary>
public bool IsBestMatch { get; init; }
/// <summary>
/// 匹配质量。
/// </summary>
public MatchQuality MatchQuality { get; init; }
}
/// <summary>
/// 重叠率校验结果。
/// </summary>
public sealed class OverlapValidationResult
{
/// <summary>
/// 是否通过校验。
/// </summary>
public bool IsValid { get; init; }
/// <summary>
/// 最大重叠率。
/// </summary>
public double MaxOverlapRatio { get; init; }
/// <summary>
/// 平均重叠率。
/// </summary>
public double AverageOverlapRatio { get; init; }
/// <summary>
/// 重叠对数量。
/// </summary>
public int OverlapPairCount { get; init; }
/// <summary>
/// 重叠对列表。
/// </summary>
public IReadOnlyList<OverlapPair> OverlapPairs { get; init; } = Array.Empty<OverlapPair>();
/// <summary>
/// 允许的最大重叠率。
/// </summary>
public double AllowedMaxOverlapRatio { get; init; }
/// <summary>
/// 校验时间。
/// </summary>
public DateTime ValidationTimeUtc { get; init; }
/// <summary>
/// 详细信息。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 重叠对信息。
/// </summary>
public sealed class OverlapPair
{
/// <summary>
/// 部件1。
/// </summary>
public MappedPart Part1 { get; init; } = new();
/// <summary>
/// 部件2。
/// </summary>
public MappedPart Part2 { get; init; } = new();
/// <summary>
/// 重叠率。
/// </summary>
public double OverlapRatio { get; init; }
/// <summary>
/// 重叠面积。
/// </summary>
public double OverlapArea { get; init; }
/// <summary>
/// 重叠区域。
/// </summary>
public BoundingBox OverlapRegion { get; init; } = new();
}
/// <summary>
/// 中心点校验结果。
/// </summary>
public sealed class CenterPointValidationResult
{
/// <summary>
/// 是否通过校验。
/// </summary>
public bool IsValid { get; init; }
/// <summary>
/// 总部件数量。
/// </summary>
public int TotalParts { get; init; }
/// <summary>
/// 匹配部件数量。
/// </summary>
public int MatchedParts { get; init; }
/// <summary>
/// 平均位置偏差。
/// </summary>
public double AveragePositionDeviation { get; init; }
/// <summary>
/// 最大位置偏差。
/// </summary>
public double MaxPositionDeviation { get; init; }
/// <summary>
/// 允许的位置容差。
/// </summary>
public double AllowedTolerance { get; init; }
/// <summary>
/// 中心点匹配结果列表。
/// </summary>
public IReadOnlyList<CenterPointMatch> CenterPointMatches { get; init; } = Array.Empty<CenterPointMatch>();
/// <summary>
/// 未匹配的部件列表。
/// </summary>
public IReadOnlyList<MappedPart> UnmatchedParts { get; init; } = Array.Empty<MappedPart>();
/// <summary>
/// 校验时间。
/// </summary>
public DateTime ValidationTimeUtc { get; init; }
/// <summary>
/// 详细信息。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 中心点匹配结果。
/// </summary>
public sealed class CenterPointMatch
{
/// <summary>
/// 匹配的部件。
/// </summary>
public MappedPart Part { get; init; } = new();
/// <summary>
/// 期望位置。
/// </summary>
public ExpectedPosition ExpectedPosition { get; init; } = new();
/// <summary>
/// 实际中心点。
/// </summary>
public Point ActualCenterPoint { get; init; }
/// <summary>
/// 期望中心点。
/// </summary>
public Point ExpectedCenterPoint { get; init; }
/// <summary>
/// 位置偏差。
/// </summary>
public double PositionDeviation { get; init; }
/// <summary>
/// 是否在容差范围内。
/// </summary>
public bool IsWithinTolerance { get; init; }
/// <summary>
/// 匹配质量。
/// </summary>
public MatchQuality MatchQuality { get; init; }
}
/// <summary>
/// 边界框校验结果。
/// </summary>
public sealed class BoundingBoxValidationResult
{
/// <summary>
/// 是否通过校验。
/// </summary>
public bool IsValid { get; init; }
/// <summary>
/// 总部件数量。
/// </summary>
public int TotalParts { get; init; }
/// <summary>
/// 匹配部件数量。
/// </summary>
public int MatchedParts { get; init; }
/// <summary>
/// 平均位置偏差。
/// </summary>
public double AveragePositionDeviation { get; init; }
/// <summary>
/// 平均大小偏差。
/// </summary>
public double AverageSizeDeviation { get; init; }
/// <summary>
/// 允许的位置容差。
/// </summary>
public double AllowedTolerance { get; init; }
/// <summary>
/// 边界框匹配结果列表。
/// </summary>
public IReadOnlyList<BoundingBoxMatch> BoundingBoxMatches { get; init; } = Array.Empty<BoundingBoxMatch>();
/// <summary>
/// 未匹配的部件列表。
/// </summary>
public IReadOnlyList<MappedPart> UnmatchedParts { get; init; } = Array.Empty<MappedPart>();
/// <summary>
/// 校验时间。
/// </summary>
public DateTime ValidationTimeUtc { get; init; }
/// <summary>
/// 详细信息。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 边界框匹配结果。
/// </summary>
public sealed class BoundingBoxMatch
{
/// <summary>
/// 匹配的部件。
/// </summary>
public MappedPart Part { get; init; } = new();
/// <summary>
/// 期望边界框。
/// </summary>
public ExpectedBoundingBox ExpectedBoundingBox { get; init; } = new();
/// <summary>
/// 实际边界框。
/// </summary>
public BoundingBox ActualBoundingBox { get; init; } = new();
/// <summary>
/// 位置偏差。
/// </summary>
public double PositionDeviation { get; init; }
/// <summary>
/// 大小偏差。
/// </summary>
public double SizeDeviation { get; init; }
/// <summary>
/// 是否在容差范围内。
/// </summary>
public bool IsWithinTolerance { get; init; }
/// <summary>
/// 匹配质量。
/// </summary>
public MatchQuality MatchQuality { get; init; }
}
/// <summary>
/// 角度校验结果。
/// </summary>
public sealed class AngleValidationResult
{
/// <summary>
/// 是否通过校验。
/// </summary>
public bool IsValid { get; init; }
/// <summary>
/// 总部件数量。
/// </summary>
public int TotalParts { get; init; }
/// <summary>
/// 匹配部件数量。
/// </summary>
public int MatchedParts { get; init; }
/// <summary>
/// 平均角度偏差。
/// </summary>
public double AverageAngleDeviation { get; init; }
/// <summary>
/// 最大角度偏差。
/// </summary>
public double MaxAngleDeviation { get; init; }
/// <summary>
/// 允许的角度容差。
/// </summary>
public double AllowedTolerance { get; init; }
/// <summary>
/// 角度匹配结果列表。
/// </summary>
public IReadOnlyList<AngleMatch> AngleMatches { get; init; } = Array.Empty<AngleMatch>();
/// <summary>
/// 未匹配的部件列表。
/// </summary>
public IReadOnlyList<MappedPart> UnmatchedParts { get; init; } = Array.Empty<MappedPart>();
/// <summary>
/// 校验时间。
/// </summary>
public DateTime ValidationTimeUtc { get; init; }
/// <summary>
/// 详细信息。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 角度匹配结果。
/// </summary>
public sealed class AngleMatch
{
/// <summary>
/// 匹配的部件。
/// </summary>
public MappedPart Part { get; init; } = new();
/// <summary>
/// 期望角度。
/// </summary>
public ExpectedAngle ExpectedAngle { get; init; } = new();
/// <summary>
/// 实际角度。
/// </summary>
public double ActualAngle { get; init; }
/// <summary>
/// 期望角度。
/// </summary>
public double ExpectedAngleValue { get; init; }
/// <summary>
/// 角度偏差。
/// </summary>
public double AngleDeviation { get; init; }
/// <summary>
/// 是否在容差范围内。
/// </summary>
public bool IsWithinTolerance { get; init; }
/// <summary>
/// 匹配质量。
/// </summary>
public MatchQuality MatchQuality { get; init; }
}
/// <summary>
/// 批量位置校验结果。
/// </summary>
public sealed class BatchPositionValidationResult
{
/// <summary>
/// 校验结果列表。
/// </summary>
public IReadOnlyList<PositionValidationResult> ValidationResults { get; init; } = Array.Empty<PositionValidationResult>();
/// <summary>
/// 总规则数量。
/// </summary>
public int TotalRules { get; init; }
/// <summary>
/// 通过的规则数量。
/// </summary>
public int PassedRules { get; init; }
/// <summary>
/// 失败的规则数量。
/// </summary>
public int FailedRules { get; init; }
/// <summary>
/// 总体通过率。
/// </summary>
public double OverallPassRate => TotalRules > 0 ? (double)PassedRules / TotalRules * 100 : 0.0;
/// <summary>
/// 批量处理时间。
/// </summary>
public DateTime BatchProcessingTimeUtc { get; init; }
/// <summary>
/// 总耗时(毫秒)。
/// </summary>
public long TotalElapsedMs { get; init; }
/// <summary>
/// 详细信息。
/// </summary>
public string? Details { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 几何特征。
/// </summary>
public sealed class GeometricFeatures
{
/// <summary>
/// 部件数量。
/// </summary>
public int PartCount { get; init; }
/// <summary>
/// 总面积。
/// </summary>
public double TotalArea { get; init; }
/// <summary>
/// 平均面积。
/// </summary>
public double AverageArea { get; init; }
/// <summary>
/// 最大面积。
/// </summary>
public double MaxArea { get; init; }
/// <summary>
/// 最小面积。
/// </summary>
public double MinArea { get; init; }
/// <summary>
/// 面积标准差。
/// </summary>
public double AreaStandardDeviation { get; init; }
/// <summary>
/// 平均长宽比。
/// </summary>
public double AverageAspectRatio { get; init; }
/// <summary>
/// 中心点分布。
/// </summary>
public IReadOnlyList<Point> CenterPoints { get; init; } = Array.Empty<Point>();
/// <summary>
/// 中心点分布密度。
/// </summary>
public double CenterPointDensity { get; init; }
/// <summary>
/// 重叠率统计。
/// </summary>
public OverlapStatistics OverlapStatistics { get; init; } = new();
/// <summary>
/// 计算时间。
/// </summary>
public DateTime CalculationTimeUtc { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 重叠统计信息。
/// </summary>
public sealed class OverlapStatistics
{
/// <summary>
/// 重叠对数量。
/// </summary>
public int OverlapPairCount { get; init; }
/// <summary>
/// 平均重叠率。
/// </summary>
public double AverageOverlapRatio { get; init; }
/// <summary>
/// 最大重叠率。
/// </summary>
public double MaxOverlapRatio { get; init; }
/// <summary>
/// 重叠率分布。
/// </summary>
public IReadOnlyList<OverlapDistribution> Distribution { get; init; } = Array.Empty<OverlapDistribution>();
}
/// <summary>
/// 重叠分布信息。
/// </summary>
public sealed class OverlapDistribution
{
/// <summary>
/// 重叠率范围。
/// </summary>
public string Range { get; init; } = string.Empty;
/// <summary>
/// 数量。
/// </summary>
public int Count { get; init; }
/// <summary>
/// 百分比。
/// </summary>
public double Percentage { get; init; }
}
/// <summary>
/// 位置校验统计信息。
/// </summary>
public sealed class PositionValidationStatistics
{
/// <summary>
/// 总校验次数。
/// </summary>
public int TotalValidations { get; init; }
/// <summary>
/// 成功校验次数。
/// </summary>
public int SuccessfulValidations { get; init; }
/// <summary>
/// 失败校验次数。
/// </summary>
public int FailedValidations { get; init; }
/// <summary>
/// 总体成功率。
/// </summary>
public double OverallSuccessRate => TotalValidations > 0 ? (double)SuccessfulValidations / TotalValidations * 100 : 0.0;
/// <summary>
/// 按校验类型分组的统计。
/// </summary>
public Dictionary<PositionValidationType, ValidationTypeStatistics> ByValidationType { get; init; } = new();
/// <summary>
/// 按部件类型分组的统计。
/// </summary>
public Dictionary<PartType, PartTypeValidationStatistics> ByPartType { get; init; } = new();
/// <summary>
/// 按产品类型分组的统计。
/// </summary>
public Dictionary<string, ProductTypeValidationStatistics> ByProductType { get; init; } = new();
/// <summary>
/// 按层级分组的统计。
/// </summary>
public Dictionary<int, LayerValidationStatistics> ByLayer { get; init; } = new();
/// <summary>
/// 统计开始时间。
/// </summary>
public DateTime StartTimeUtc { get; init; }
/// <summary>
/// 统计结束时间。
/// </summary>
public DateTime EndTimeUtc { get; init; }
}
/// <summary>
/// 位置校验结果基类。
/// </summary>
public abstract class PositionValidationResult
{
/// <summary>
/// 规则ID。
/// </summary>
public Guid RuleId { get; init; }
/// <summary>
/// 规则名称。
/// </summary>
public string RuleName { get; init; } = string.Empty;
/// <summary>
/// 校验类型。
/// </summary>
public PositionValidationType ValidationType { get; init; }
/// <summary>
/// 是否通过校验。
/// </summary>
public bool IsValid { get; init; }
/// <summary>
/// 校验时间。
/// </summary>
public DateTime ValidationTimeUtc { get; init; }
/// <summary>
/// 错误消息。
/// </summary>
public string? ErrorMessage { get; init; }
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 位置校验规则。
/// </summary>
public sealed class PositionValidationRule
{
/// <summary>
/// 规则ID。
/// </summary>
public Guid RuleId { get; init; }
/// <summary>
/// 规则名称。
/// </summary>
public string RuleName { get; init; } = string.Empty;
/// <summary>
/// 规则描述。
/// </summary>
public string RuleDescription { get; init; } = string.Empty;
/// <summary>
/// 产品类型编码。
/// </summary>
public string ProductTypeCode { get; init; } = string.Empty;
/// <summary>
/// 层级编号。
/// </summary>
public int LayerNumber { get; init; }
/// <summary>
/// 校验类型。
/// </summary>
public PositionValidationType ValidationType { get; init; }
/// <summary>
/// 位置容差。
/// </summary>
public double PositionTolerance { get; init; }
/// <summary>
/// 大小容差。
/// </summary>
public double SizeTolerance { get; init; }
/// <summary>
/// 角度容差。
/// </summary>
public double AngleTolerance { get; init; }
/// <summary>
/// 最大重叠率。
/// </summary>
public double MaxOverlapRatio { get; init; }
/// <summary>
/// 是否启用。
/// </summary>
public bool IsEnabled { get; init; } = true;
/// <summary>
/// 优先级。
/// </summary>
public int Priority { get; init; } = 1;
/// <summary>
/// 创建时间。
/// </summary>
public DateTime CreatedAtUtc { get; init; }
/// <summary>
/// 更新时间。
/// </summary>
public DateTime UpdatedAtUtc { get; init; }
/// <summary>
/// 版本号。
/// </summary>
public string Version { get; init; } = "1.0";
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 槽位定义。
/// </summary>
public sealed class SlotDefinition
{
/// <summary>
/// 槽位ID。
/// </summary>
public Guid SlotId { get; init; }
/// <summary>
/// 槽位名称。
/// </summary>
public string SlotName { get; init; } = string.Empty;
/// <summary>
/// 槽位区域。
/// </summary>
public BoundingBox SlotRegion { get; init; } = new();
/// <summary>
/// 期望部件类型。
/// </summary>
public PartType? ExpectedPartType { get; init; }
/// <summary>
/// 期望部件编码。
/// </summary>
public string? ExpectedPartCode { get; init; }
/// <summary>
/// 是否为必需槽位。
/// </summary>
public bool IsRequired { get; init; } = true;
/// <summary>
/// 槽位权重。
/// </summary>
public double Weight { get; init; } = 1.0;
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 期望位置。
/// </summary>
public sealed class ExpectedPosition
{
/// <summary>
/// 位置ID。
/// </summary>
public Guid PositionId { get; init; }
/// <summary>
/// 期望中心点。
/// </summary>
public Point ExpectedCenterPoint { get; init; }
/// <summary>
/// 期望部件类型。
/// </summary>
public PartType? ExpectedPartType { get; init; }
/// <summary>
/// 期望部件编码。
/// </summary>
public string? ExpectedPartCode { get; init; }
/// <summary>
/// 位置权重。
/// </summary>
public double Weight { get; init; } = 1.0;
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 期望边界框。
/// </summary>
public sealed class ExpectedBoundingBox
{
/// <summary>
/// 边界框ID。
/// </summary>
public Guid BoundingBoxId { get; init; }
/// <summary>
/// 期望边界框。
/// </summary>
public BoundingBox BoundingBox { get; init; } = new();
/// <summary>
/// 期望部件类型。
/// </summary>
public PartType? ExpectedPartType { get; init; }
/// <summary>
/// 期望部件编码。
/// </summary>
public string? ExpectedPartCode { get; init; }
/// <summary>
/// 边界框权重。
/// </summary>
public double Weight { get; init; } = 1.0;
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 期望角度。
/// </summary>
public sealed class ExpectedAngle
{
/// <summary>
/// 角度ID。
/// </summary>
public Guid AngleId { get; init; }
/// <summary>
/// 期望角度(度)。
/// </summary>
public double ExpectedAngleValue { get; init; }
/// <summary>
/// 期望部件类型。
/// </summary>
public PartType? ExpectedPartType { get; init; }
/// <summary>
/// 期望部件编码。
/// </summary>
public string? ExpectedPartCode { get; init; }
/// <summary>
/// 角度权重。
/// </summary>
public double Weight { get; init; } = 1.0;
/// <summary>
/// 扩展属性。
/// </summary>
public Dictionary<string, object> ExtendedProperties { get; init; } = new();
}
/// <summary>
/// 点坐标。
/// </summary>
public sealed class Point
{
/// <summary>
/// X坐标。
/// </summary>
public double X { get; init; }
/// <summary>
/// Y坐标。
/// </summary>
public double Y { get; init; }
/// <summary>
/// 计算到另一个点的距离。
/// </summary>
public double DistanceTo(Point other) => Math.Sqrt(Math.Pow(X - other.X, 2) + Math.Pow(Y - other.Y, 2));
}
/// <summary>
/// 位置校验类型枚举。
/// </summary>
public enum PositionValidationType
{
/// <summary>
/// 槽位校验。
/// </summary>
Slot = 0,
/// <summary>
/// 重叠率校验。
/// </summary>
Overlap = 1,
/// <summary>
/// 中心点校验。
/// </summary>
CenterPoint = 2,
/// <summary>
/// 边界框校验。
/// </summary>
BoundingBox = 3,
/// <summary>
/// 角度校验。
/// </summary>
Angle = 4
}