为了保证草图的健壮性,算法的核心在于准确计算切点。在草图中,圆弧的起始角和终止角必须基于草图坐标系(Sketch Coordinate System)。
为了让算法完全动态化,我们需要引入**角度归一化(Normalization)**处理,确保所有角度都在 \[0, 360) 或 (-\\pi, \\pi\] 范围内。
以下是优化后的完整代码,包含了计算逻辑和草图绘制方法:
完整的 C# 算法实现
cs
/// <summary>
/// A形孔绘制,根据中心点坐标,长度,宽度,角度
/// </summary>
/// <param name="center">中心点坐标</param>
/// <param name="length">中心距</param>
/// <param name="width">圆弧直径</param>
/// <param name="angleDegrees">极角</param>
public void A_hole(NXOpen.Point3d center, double length, double width, double angleDegrees)
{
double radius = width / 2.0;
double angleRad = angleDegrees * Math.PI / 180.0;
// 1. 计算两个圆心 P1 和 P2
double halfL = length / 2.0;
NXOpen.Point3d p1 = new NXOpen.Point3d(
center.X - halfL * Math.Cos(angleRad),
center.Y - halfL * Math.Sin(angleRad),
center.Z);
NXOpen.Point3d p2 = new NXOpen.Point3d(
center.X + halfL * Math.Cos(angleRad),
center.Y + halfL * Math.Sin(angleRad),
center.Z);
// 计算法线基准角
double baseAngle = angleDegrees;
// 动态计算圆弧角度
// 左侧圆弧:从 baseAngle + 90 到 baseAngle + 270
double start1 = NormalizeAngle(baseAngle + 90.0);
double end1 = NormalizeAngle(baseAngle + 270.0);
// 右侧圆弧:从 baseAngle + 270 到 baseAngle + 450 (即 baseAngle + 90)
double start2 = NormalizeAngle(baseAngle + 270.0);
double end2 = NormalizeAngle(baseAngle + 90.0);
// 绘制
Arc(p1, radius, start1, end1);
Arc(p2, radius, start2, end2);
// 画两条直线(连接切点)
double normalAngle = angleDegrees + 90.0;
double dx = radius * Math.Cos(normalAngle * Math.PI / 180.0);
double dy = radius * Math.Sin(normalAngle * Math.PI / 180.0);
// 直线1: P1a -> P2a
Line(new NXOpen.Point3d(p1.X + dx, p1.Y + dy, p1.Z), new NXOpen.Point3d(p2.X + dx, p2.Y + dy, p2.Z));
// 直线2: P1b -> P2b
Line(new NXOpen.Point3d(p1.X - dx, p1.Y - dy, p1.Z), new NXOpen.Point3d(p2.X - dx, p2.Y - dy, p2.Z));
}
/// <summary>
/// 辅助函数:将角度规范化到 0-360 之间
/// </summary>
/// <param name="angle"></param>
/// <returns></returns>
private double NormalizeAngle(double angle)
{
angle = angle % 360.0;
if (angle < 0) angle += 360.0;
return angle;
}
使用方法
cs
public class chain_return
{
ZC_Sketch sketch=new ZC_Sketch();//新建草图
/// <summary>
/// 生成模型
/// </summary>
public void dwg()
{
NXOpen.Point3d poit1=new NXOpen.Point3d(-20, -20, 0);//创建A型孔中心点
sketch.cad.A_hole(poit1,12,8,20);//创建A型孔草图
sketch.end();//完成草图
}
}
结果如下,无论我们输入的条件是什么,他都会自动计算草图各项尺寸,位置角度等,可见写的好的算法一劳永逸,也不一定要完全约束,,全部会精确自动计算无误也可以不用复杂的约束技术
