005. UG二次开发, A型孔草图算法封装

为了保证草图的健壮性,算法的核心在于准确计算切点。在草图中,圆弧的起始角和终止角必须基于草图坐标系(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();//完成草图
      }
  }

结果如下,无论我们输入的条件是什么,他都会自动计算草图各项尺寸,位置角度等,可见写的好的算法一劳永逸,也不一定要完全约束,,全部会精确自动计算无误也可以不用复杂的约束技术