004. UG二次开发, 草图绘制圆并固定圆心约束+半径约束

机械设计中,核心且严谨的态度就是设计的部件有规定运动的约束,对部件基本草图要有完全约束,

虽然西门子放弃了机械设计模块,草图求解器也采用了不严谨的松弛尺寸和推断约束,但我们自己二次开发的工具尽量往专业.严谨的方向摸索,即使为达这些严谨目的,不惜调用旧api混用,目的只有一个,既要能在新版本软件中兼容跑起我们的插件,又要保留机械设计严谨行为习惯的一些功能,将新旧API封装兼容新版本,

一.绘制圆的api

与旧版本api一致,基础功能,未更新,新版本api延续了旧api的用法,未做改动,用法一致

圆对象api为 NXOpen.Arc

cs 复制代码
        /// <summary>
        /// 根据3点绘制圆弧
        /// </summary>
        /// <param name="center">中心点坐标</param>
        /// <param name="R">半径</param>
        /// <param name="StarAngl"> 开始角度</param>
        /// <param name="EndAngl">结束角度</param>
        public void Arc(NXOpen.Point3d center, double R, double StarAngl, double EndAngl)
        {
            nXMatrix1 = theSession.ActiveSketch.Orientation;//设置将圆弧画在草图平面内(设置为非空间圆弧)
            NXOpen.Part workPart = theSession.Parts.Work;
            NXOpen.Arc arc1;//构建一个圆弧对象
            //workPart.Curves.CreateArc()这是 NX Open 中创建圆弧的方法,******center1: 圆心。***nXMatrix1: 圆弧所在的平面矩阵,,R: 圆弧的半径。
            arc1 = workPart.Curves.CreateArc(center, nXMatrix1, R, (StarAngl * Math.PI / 180.0), (EndAngl * Math.PI / 180.0));
            theSession.ActiveSketch.AddGeometry(arc1, NXOpen.Sketch.InferConstraintsOption.InferNoConstraints);//将圆弧添加到草图中,设置不要为圆弧添加约束InferNoConstraints,防止圆弧变形出错

        }

当我们绘制一个圆时,即使我们在api中输入了坐标和半径,位置和尺寸虽然是对的,但它还是未被约束的,一旦我们拖到它,他就可能变形,移动位置,如下图

二.圆的完全约束

上图是纯算法画出来圆草图,虽然他的位置和尺寸都是准确的,但任何操作都可能发生变形和位移,假如要画两圆和切线,这种纯靠算法的缺点就是,画每一种几何图形都需要写一个专用的数学解析算法,工作量惊人,

所以,我们需要用西门子自带的解析器加约束的概念,让他自动帮我们进行这些几何算法运算,我们只需要写好他们的约束条件

1.圆完全约束的条件:圆心固定且半径尺寸确定

cs 复制代码
  public void Arc(double x,double y,double R)
  {            

      // 创建圆
      nXMatrix1 = theSession.ActiveSketch.Orientation;
      NXOpen.Point3d center1 = new NXOpen.Point3d(x, y, 0.0);
      NXOpen.Arc arc1 = workPart.Curves.CreateArc(center1, nXMatrix1, R, 0.0, 2.0 * Math.PI);
      theSession.ActiveSketch.AddGeometry(arc1, NXOpen.Sketch.InferConstraintsOption.InferNoConstraints);
      theSession.ActiveSketch.Update();

     
      // 1.构件一个固定约束构造器
      NXOpen.SketchFixObjectsBuilder fixBuilder = workPart.Sketches.CreateSketchFixObjectsBuilder();
      //2.创建一个约束对象转换器(点,线,圆等等线不能直接被约束器识别,需要转换器转为可识别)
      NXOpen.Sketch.ConstraintGeometry fixGeo = new NXOpen.Sketch.ConstraintGeometry();     
      fixGeo.Geometry = arc1; //3.圆对象给转换器,转换为被约束对象
      //4.固定约束的点设置为圆心模式
      fixGeo.PointType = NXOpen.Sketch.ConstraintPointType.ArcCenter;
      fixGeo.SplineDefiningPointIndex = 0;//初始化,防内存出错用

      //5.转换器被约束对象传给固定约束构造器
      fixBuilder.AddObject(fixGeo);
      
      fixBuilder.Commit();//6.上传约束构造器
      fixBuilder.Destroy();//销毁构造器,释放内存


      // 尺寸约束
      NXOpen.SketchRapidDimensionBuilder dimBuilder = workPart.Sketches.CreateRapidDimensionBuilder();

      // 设置为直径测量
      dimBuilder.Measurement.Method = NXOpen.Annotations.DimensionMeasurementBuilder.MeasurementMethod.Diametral;

      dimBuilder.FirstAssociativity.SetValue(arc1, null, center1); //将约束直径尺寸关联到 arc1

      // 设置尺寸值(直径)
      dimBuilder.Driving.DimensionValue = R*2;

      // 提交
      NXOpen.Session.UndoMarkId markId = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "CreateSketchDimension");//记号点,高级编程用,可删
      dimBuilder.Commit();//提交尺寸约束
      dimBuilder.Destroy();//销毁尺寸约束构造器


      // 5. 保持环境状态
      theSession.ActiveSketch.CalculateStatus();//强制刷新草图求解器
      theSession.ActiveSketch.Update();//立即更新草图
  }

三.使用测试

cs 复制代码
 public class chain_return
 {
     ZC_Sketch sketch=new ZC_Sketch();//新建草图

     /// <summary>
     /// 生成模型
     /// </summary>
     public void dwg() 
     {
         sketch.cad.Line(0,0,100,0);//绘制直线
         sketch.cad.LinePolar(10,10,100,30);//根据极坐标绘制直线
         sketch.cad.Arc(20,20,30,60,240);
         sketch.cad.Arc(0.0, 0.0,30);
         sketch.cad.Arc(10, 10, 50);
         sketch.end();//完成草图
     }
 }

新版本,完全约束的线会自动变为蓝色