为了保证草图的健壮性,算法的核心在于准确计算切点。在草图中,圆弧的起始角和终止角必须基于草图坐标系(Sketch Coordinate System)。
为了让算法完全动态化,我们需要引入**角度归一化(Normalization)**处理,确保所有角度都在 $[0, 360)$ 或 $(-\pi, \pi]$ 范围内。
以下是优化后的完整代码,包含了计算逻辑和草图绘制方法:
完整的 C# 算法实现
/// <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; }使用方法
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();//完成草图 } }结果如下,无论我们输入的条件是什么,他都会自动计算草图各项尺寸,位置角度等,可见写的好的算法一劳永逸,也不一定要完全约束,,全部会精确自动计算无误也可以不用复杂的约束技术