Files
AohDrllTools/SlotHoleCalculatorExamples.cs
2025-12-07 20:25:27 +08:00

241 lines
9.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using DrillTools;
namespace DrillTools.Examples
{
/// <summary>
/// 槽孔计算器使用示例
/// </summary>
public class SlotHoleCalculatorExamples
{
/// <summary>
/// 示例1计算线段槽孔孔数
/// </summary>
public static void CalculateLineSlotHoleCountExample()
{
Console.WriteLine("=== 线段槽孔孔数计算示例 ===");
// 创建线段槽孔参考readme.md中的测试数据
var slot = new LineSlot(
new Point2D(-69.659, 16.450), // 起点
new Point2D(-94.159, 16.450), // 终点
1.601 // 孔径
);
// 计算孔数
int holeCount = SlotHoleCalculator.CalculateLineSlotHoleCount(slot);
Console.WriteLine($"槽孔长度: {slot.Length:F3} mm");
Console.WriteLine($"槽孔宽度: {slot.Width} mm");
Console.WriteLine($"计算孔数: {holeCount}");
Console.WriteLine($"预期孔数: 88 (CAM350标准)");
Console.WriteLine($"结果验证: {(holeCount == 88 ? " " : " ")}");
Console.WriteLine();
}
/// <summary>
/// 示例2从G85命令解析并计算
/// </summary>
public static void ParseFromG85Example()
{
Console.WriteLine("=== G85命令解析示例 ===");
// G85命令字符串来自钻带文件
string g85Command = "X-069659Y016450G85X-094159Y016450";
double width = 1.601;
try
{
// 解析G85命令
var slot = SlotHoleCalculator.ParseLineSlotFromG85(g85Command, width);
// 计算孔数
int holeCount = SlotHoleCalculator.CalculateLineSlotHoleCount(slot);
Console.WriteLine($"G85命令: {g85Command}");
Console.WriteLine($"解析起点: ({slot.StartPoint.X}, {slot.StartPoint.Y})");
Console.WriteLine($"解析终点: ({slot.EndPoint.X}, {slot.EndPoint.Y})");
Console.WriteLine($"槽孔宽度: {slot.Width} mm");
Console.WriteLine($"计算孔数: {holeCount}");
Console.WriteLine();
}
catch (Exception ex)
{
Console.WriteLine($"解析失败: {ex.Message}");
}
}
/// <summary>
/// 示例3计算钻孔位置
/// </summary>
public static void CalculateHolePositionsExample()
{
Console.WriteLine("=== 钻孔位置计算示例 ===");
// 创建线段槽孔
var slot = new LineSlot(
new Point2D(0, 0),
new Point2D(10, 0),
1.0
);
// 计算钻孔位置
var positions = SlotHoleCalculator.CalculateLineSlotHolePositions(slot);
Console.WriteLine($"槽孔长度: {slot.Length} mm");
Console.WriteLine($"钻孔数量: {positions.Count}");
Console.WriteLine("钻孔位置列表:");
for (int i = 0; i < positions.Count; i++)
{
Console.WriteLine($" 孔 {i + 1}: ({positions[i].X:F3}, {positions[i].Y:F3})");
}
Console.WriteLine();
}
/// <summary>
/// 示例4弧段槽孔计算
/// </summary>
public static void CalculateArcSlotExample()
{
Console.WriteLine("=== 弧段槽孔计算示例 ===");
// 创建弧段槽孔(半圆)
var arcSlot = new ArcSlot(
new Point2D(10, 0), // 起点
new Point2D(0, 10), // 终点
new Point2D(0, 0), // 圆心
1.0, // 宽度
false // 顺时针
);
// 计算孔数
int holeCount = SlotHoleCalculator.CalculateArcSlotHoleCount(arcSlot);
// 计算钻孔位置
var positions = SlotHoleCalculator.CalculateArcSlotHolePositions(arcSlot);
Console.WriteLine($"弧段半径: {arcSlot.Radius:F3} mm");
Console.WriteLine($"弧段长度: {SlotHoleCalculator.CalculateArcLength(arcSlot):F3} mm");
Console.WriteLine($"计算孔数: {holeCount}");
Console.WriteLine($"钻孔位置数量: {positions.Count}");
Console.WriteLine();
}
/// <summary>
/// 示例5批量计算不同孔径的槽孔
/// </summary>
public static void BatchCalculationExample()
{
Console.WriteLine("=== 批量计算示例 ===");
// 不同孔径的槽孔参考readme.md中的测试数据
var diameters = new[] { 1.601, 1.701, 1.801, 1.901, 2.001, 1.501, 1.401, 1.301, 1.201, 1.101, 1.001, 0.706, 0.506 };
var expectedCounts = new[] { 88, 85, 83, 81, 79, 91, 94, 97, 101, 106, 111, 132, 156 };
Console.WriteLine("孔径(mm)\t计算孔数\t预期孔数\t验证结果");
Console.WriteLine("----------------------------------------");
for (int i = 0; i < diameters.Length; i++)
{
var slot = new LineSlot(
new Point2D(-69.659, 16.450),
new Point2D(-94.159, 16.450),
diameters[i]
);
int actualCount = SlotHoleCalculator.CalculateLineSlotHoleCount(slot);
int expectedCount = expectedCounts[i];
bool passed = actualCount == expectedCount;
Console.WriteLine($"{diameters[i]}\t{actualCount}\t{expectedCount}\t{(passed ? "" : "")}");
}
Console.WriteLine();
}
/// <summary>
/// 示例6自定义凸位高度值
/// </summary>
public static void CustomToleranceExample()
{
Console.WriteLine("=== 自定义凸位高度值示例 ===");
var slot = new LineSlot(
new Point2D(0, 0),
new Point2D(10, 0),
1.0
);
// 使用默认凸位高度值
int defaultHoleCount = SlotHoleCalculator.CalculateLineSlotHoleCount(slot);
// 使用自定义凸位高度值
double customTolerance = 0.01; // 0.01mm
int customHoleCount = SlotHoleCalculator.CalculateLineSlotHoleCount(slot, customTolerance);
Console.WriteLine($"默认凸位高度值 (0.0127mm): {defaultHoleCount} 个孔");
Console.WriteLine($"自定义凸位高度值 (0.01mm): {customHoleCount} 个孔");
Console.WriteLine($"差异: {Math.Abs(defaultHoleCount - customHoleCount)} 个孔");
Console.WriteLine();
}
/// <summary>
/// 示例7处理实际钻带数据
/// </summary>
public static void ProcessRealDrillTapeExample()
{
Console.WriteLine("=== 处理实际钻带数据示例 ===");
// 模拟钻带数据中的槽孔命令
var g85Commands = new[]
{
"X-069659Y016450G85X-094159Y016450", // T01 - 1.601mm
"X-181341Y195550G85X-156841Y195550", // T02 - 1.601mm
"X-181341Y389550G85X-156841Y389550", // T03 - 1.601mm
};
var toolDiameters = new[] { 1.601, 1.601, 1.601 };
var expectedHoleCounts = new[] { 88, 88, 88 };
Console.WriteLine("刀具\t孔径(mm)\tG85命令\t\t\t\t计算孔数\t预期孔数\t验证结果");
Console.WriteLine("--------------------------------------------------------------------------------");
for (int i = 0; i < g85Commands.Length; i++)
{
try
{
var slot = SlotHoleCalculator.ParseLineSlotFromG85(g85Commands[i], toolDiameters[i]);
int holeCount = SlotHoleCalculator.CalculateLineSlotHoleCount(slot);
bool passed = holeCount == expectedHoleCounts[i];
Console.WriteLine($"T{i + 1:D2}\t{toolDiameters[i]}\t{g85Commands[i]}\t{holeCount}\t\t{expectedHoleCounts[i]}\t\t{(passed ? "" : "")}");
}
catch (Exception ex)
{
Console.WriteLine($"T{i + 1:D2}\t{toolDiameters[i]}\t{g85Commands[i]}\t解析失败: {ex.Message}");
}
}
Console.WriteLine();
}
/// <summary>
/// 运行所有示例
/// </summary>
public static void RunAllExamples()
{
Console.WriteLine("槽孔计算器使用示例");
Console.WriteLine("==================");
Console.WriteLine();
CalculateLineSlotHoleCountExample();
ParseFromG85Example();
CalculateHolePositionsExample();
CalculateArcSlotExample();
BatchCalculationExample();
CustomToleranceExample();
ProcessRealDrillTapeExample();
Console.WriteLine("所有示例运行完成!");
}
}
}