015. UG 二次开发,拉伸草图生成实体类,高级草图类封装

一.草图类

草图类在前面的章节都有多次详细的讲解,用法实践,本节内容只演示优化代码的新内容.

在西门子官方宏中,草图类的命名规则由ug内部自动编写,如下图,虽然我们创建了两个草图,自定义草图的tag标签为SKETCH_001和SKETCH_002,但这个自定义的tag只是一个显示标签,他并不能被调用,ug内部会自动生成SKETCH(1)和SKETCH(2)的名称(草图(1) 草图(2) 这是软件汉化问题),

如下图,拉伸命令如果直接使用这些写死的名字会有致命的问题

cs 复制代码
FindObject("SKETCH(2)");//将草图2拉伸为实体

为了解决这一问题,使得在二次开发后台调用草图可控,我们需对草图类进行优化,思路如下,

1.增加一个NX软件通用object属性NxObject

cs 复制代码
public NXOpen.NXObject NxObject { get; set; }

2.获取本次new的草图构造器,转为NxObject格式,赋值给NxObject

cs 复制代码
 NxObject = sketchBuilder.Commit();//Commit()它返回一个 NXObject(NX 中的通用对象类型),代表刚刚创建的草图

到了这一步NxObject存储的就是我们本次新建的草图对象

3.完整草图类如下:

cs 复制代码
using NXOpen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UG_API.NX.sketch
{
    /// <summary>
    /// UG高级草图类
    /// </summary>
    public class UG_Sketch
    {
        NXOpen.Session theSession ;  // 获取当前会话和工作部件
        NXOpen.Part workPart ;
        NXOpen.SketchInPlaceBuilder sketchBuilder;
        private NXOpen.Sketch sketch;
        public NXOpen.NXObject NxObject { get; set; }//存储草图对象,这个对象可以是草图,也可以是其他特征,根据需要进行强制转换



        public UG_Sketch() 
        {
           theSession = NXOpen.Session.GetSession();
             workPart = theSession.Parts.Work;
            NXOpen.Part displayPart = theSession.Parts.Display;


            NXOpen.Sketch nullNXOpen_Sketch = null;//1.new一个草图对象
           
            //3.将草图对象装入草图构造器
            sketchBuilder = workPart.Sketches.CreateSketchInPlaceBuilder2(nullNXOpen_Sketch);
            NXOpen.Vector3d normal1 = new NXOpen.Vector3d(1.0, 0.0, 0.0);//定义一个法向,垂直于z轴;

            NXOpen.Point3d origin1 = new NXOpen.Point3d(0.0, 0.0, 0.0);//定义一个坐标(0,0,0)的点作为中心点


            NXOpen.Plane plane1;//定义一个面对象
            //构造面对象时传入一个坐标系原点和一个面的法向,
            plane1 = workPart.Planes.CreatePlane(origin1, normal1, NXOpen.SmartObject.UpdateOption.WithinModeling);

            sketchBuilder.PlaneReference = plane1;//定义的面对象做为草图平面

            theSession.Preferences.Sketch.CreateInferredConstraints = true;//开启自动判断约束


            NxObject = sketchBuilder.Commit();//Commit()它返回一个 NXObject(NX 中的通用对象类型),代表刚刚创建的草图

            sketch= (NXOpen.Sketch)NxObject;//将NX通用对象NxObject 强制转换为NXOpen.Sketch草图对象,赋值给草图对象sketch1
            NXOpen.Features.Feature feature1;//定义一个nx特征Feature,草图,拉伸,旋转等等命令操作在西门子中其实都被当成一个特征Feature
            feature1 = sketch.Feature;//将草图对象的特征赋值给西门子特征

            sketch.Activate(NXOpen.Sketch.ViewReorient.True);//激活草图

            sketchBuilder.Destroy();//销毁构造器,释放缓存

        }


        /// <summary>
        /// 完成并更新退出草图,退出草图必须调用
        /// </summary>
        public void Esc_Sketch()
        {
            try
            {
                // 更新草图
                theSession.ActiveSketch.Update();

                // 完成草图
                theSession.ActiveSketch.Deactivate(NXOpen.Sketch.ViewReorient.True, NXOpen.Sketch.UpdateLevel.Model);

                // 销毁草图构建器,释放资源
                sketchBuilder.Destroy();

                // 结束任务环境
                theSession.EndTaskEnvironment();
            }
            catch (Exception)
            {

            }
           
        }


        /// <summary>
        /// 根据三点绘制圆弧算法
        /// </summary>
        /// <param name="center"></param>
        /// <param name="R"></param>
        /// <param name="StarAngl"></param>
        /// <param name="EndAngl"></param>
        ///  NXOpen.Point3d 对象的定义方法  NXOpen.Point3d center1 = new NXOpen.Point3d(10, 10, 0.0);
        public void Arc(double x, double y, double R, double StarAngl, double EndAngl)
        {

            NXOpen.NXMatrix nXMatrix1 = theSession.ActiveSketch.Orientation;//设置将圆弧画在草图平面内(设置为非空间圆弧)
            NXOpen.Arc arc1;//构建一个圆弧对象
            NXOpen.Point3d center = new NXOpen.Point3d(x, y, 0.0);//圆心坐标
            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,防止圆弧变形出错

        }


    }
}

二.拉伸类的封装

ug的拉伸命令是将一个封闭草图拉伸为实体,他有很多高级功能,如拔模,偏置,布尔,等等,这里我们先不涉及高级功能,只封装基础拉伸功能,

拉伸命令核心属性是,传入一个草图对象作为拉伸截面,然后就是控制拉伸的开始高度和结束高度,拉伸方向也有高级选项,这里只默认法向拉伸,布尔类型有 无布尔,合并,减去,相交,高级功能封装需要大量算法代码,为了类简单这里默认使用无布尔的模式

1.传入一个草图对象

cs 复制代码
 public class UG_Rest_X
 {
     public NXOpen.NXObject NxObject { get; set; }//接收一个NXObject对象

     //构造类时接收一个nx通用对象,前面我们已经把草图对象存进这个nx通用对象里了,
     //所以,它传进来的是一个草图对象
     public UG_Rest_X(NXOpen.NXObject _NxObject)
     {
         NxObject = _NxObject;
     }
}

2.将草图拉伸为实体

cs 复制代码
 //拉伸,接收的草图对象
 NXOpen.Features.SketchFeature sketchFeature1 = (NXOpen.Features.SketchFeature)workPart.Features.GetAssociatedFeature(NxObject);

3.完整的拉伸类,及详细注释

cs 复制代码
using NXOpen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UG_API.NX
{
    /// <summary>
    /// 拉伸传入的草图,生成实体类
    /// </summary>
    public class UG_Rest_X
    {
        public NXOpen.NXObject NxObject { get; set; }//接收一个NXObject对象,这个对象可以是草图,也可以是其他特征,根据需要进行强制转换
        public UG_Rest_X(NXOpen.NXObject _NxObject)
        {
            NxObject = _NxObject;
        }

        /// <summary>
        /// 传入一个草图,将草图拉伸成实体,start起始位置,end拉伸结束位置,单位为毫米
        /// </summary>
        /// <param name="sketchName"></param>
        public void x(string sketchName,double start,double end)
        {
            NXOpen.Session theSession = NXOpen.Session.GetSession();
            NXOpen.Part workPart = theSession.Parts.Work;
            NXOpen.Part displayPart = theSession.Parts.Display;
           
            //   菜单:插入(S)->设计特征(E)->拉伸(X)...
           

            NXOpen.Features.Feature nullNXOpen_Features_Feature = null;// 创建一个空的特征变量,用于后续存储拉伸特征
            NXOpen.Features.ExtrudeBuilder extrudeBuilder1= workPart.Features.CreateExtrudeBuilder(nullNXOpen_Features_Feature); // 创建拉伸构建器(ExtrudeBuilder)
            NXOpen.Section section1= workPart.Sections.CreateSection(0.00095, 0.001, 0.050000000000000003);// 创建一个截面(Section),用于定义拉伸的轮廓,括号内为面域闭合精度(默认不要改)
            extrudeBuilder1.Section = section1;
            extrudeBuilder1.AllowSelfIntersectingSection(true);// 允许自相交截面

           
            extrudeBuilder1.DistanceTolerance = 0.001;//设置距离公差

            extrudeBuilder1.BooleanOperation.Type = NXOpen.GeometricUtilities.BooleanOperation.BooleanType.Create;// 设置布尔操作类型为"无"(即新建实体)

            // 设置布尔操作的目标体(此处设为 null,表示新建)
            NXOpen.Body[] targetBodies1 = new NXOpen.Body[1];
            NXOpen.Body nullNXOpen_Body = null;
            targetBodies1[0] = nullNXOpen_Body;
            extrudeBuilder1.BooleanOperation.SetTargetBodies(targetBodies1);

            // 设置拉伸的起始和结束范围
            extrudeBuilder1.Limits.StartExtend.Value.RightHandSide = start.ToString();//拉伸起始位置

            extrudeBuilder1.Limits.EndExtend.Value.RightHandSide = end.ToString();//拉伸终点位置

            // 再次设置布尔操作(冗余代码,但保证逻辑)
            extrudeBuilder1.BooleanOperation.Type = NXOpen.GeometricUtilities.BooleanOperation.BooleanType.Create;

            NXOpen.Body[] targetBodies2 = new NXOpen.Body[1];
            targetBodies2[0] = nullNXOpen_Body;
            extrudeBuilder1.BooleanOperation.SetTargetBodies(targetBodies2);

            // 设置拔模角度(前侧和后侧)
            extrudeBuilder1.Draft.FrontDraftAngle.RightHandSide = "20";
            extrudeBuilder1.Draft.BackDraftAngle.RightHandSide = "2";

            // 设置偏置量
            extrudeBuilder1.Offset.StartOffset.RightHandSide = "0";
            extrudeBuilder1.Offset.EndOffset.RightHandSide = "-1.5";

            // 配置智能体积轮廓选项
            NXOpen.GeometricUtilities.SmartVolumeProfileBuilder smartVolumeProfileBuilder1;
            smartVolumeProfileBuilder1 = extrudeBuilder1.SmartVolumeProfile;

            smartVolumeProfileBuilder1.OpenProfileSmartVolumeOption = false;

            smartVolumeProfileBuilder1.CloseProfileRule = NXOpen.GeometricUtilities.SmartVolumeProfileBuilder.CloseProfileRuleType.Fci;


            // 设置截面的公差和规则
            section1.DistanceTolerance = 0.001;
            section1.ChainingTolerance = 0.00095;


            // 查找名为 "SKETCH(2)" 的草图特征,并将其添加到截面中
            NXOpen.Features.Feature[] features1 = new NXOpen.Features.Feature[1];//ug特征对象
            /*
             * FindObject(sketchName)拉伸命令只能接收规定命名的string
             * 规定的命名 sketchName="SKETCH(1)" /  "SKETCH(2)" /"SKETCH(3)"等等
             * SKETCH(2)在ug中看到就是"草图(2)"这是软件汉化的原因
             */
            NXOpen.Features.SketchFeature sketchFeature1 = (NXOpen.Features.SketchFeature)workPart.Features.GetAssociatedFeature(NxObject);
                //FindObject(sketchName);//sketchName="SKETCH(1)" /  "SKETCH(2)" /"SKETCH(3)"等等
            features1[0] = sketchFeature1;
            NXOpen.CurveFeatureRule curveFeatureRule1;
            curveFeatureRule1 = workPart.ScRuleFactory.CreateRuleCurveFeature(features1);

            section1.AllowSelfIntersection(true);

            NXOpen.SelectionIntentRule[] rules1 = new NXOpen.SelectionIntentRule[1];
            rules1[0] = curveFeatureRule1;
            NXOpen.NXObject nullNXOpen_NXObject = null;
            NXOpen.Point3d helpPoint1 = new NXOpen.Point3d(0.0, 0.0, 0.0);
            section1.AddToSection(rules1, nullNXOpen_NXObject, nullNXOpen_NXObject, nullNXOpen_NXObject, helpPoint1, NXOpen.Section.Mode.Create, false); // 将草图曲线加入截面

            extrudeBuilder1.Direction = workPart.Directions.CreateDirection( new Point3d(0, 0, 0), new Vector3d(0, 0, 1), SmartObject.UpdateOption.WithinModeling); //设置拉伸的方向(z轴)




            // 创建偏移量的辅助表达式
            NXOpen.Unit unit2;
            unit2 = extrudeBuilder1.Offset.StartOffset.Units;
         
            extrudeBuilder1.ParentFeatureInternal = false;

            NXOpen.Features.Feature feature1 = extrudeBuilder1.CommitFeature(); // 提交特征,正式在模型中创建拉伸实体




            NXOpen.Expression expression4 = extrudeBuilder1.Limits.StartExtend.Value;
            NXOpen.Expression expression5 = extrudeBuilder1.Limits.EndExtend.Value;
            extrudeBuilder1.Destroy();

         

         

          

            
        }
    }
}

三.怎么使用

在主程序按键事件中,new一个草图对象dwg,当我们需要使用拉伸命令时,new拉伸类UG_Rest_X时将草图类存储的nxobject属性传给拉伸类,

这样,当我们使用拉伸类的x方法时,他就会将草图对象拉伸为实体,x(-10,10)设置的是拉伸的深度开始-10结束10,实体的总高度为20

cs 复制代码
 public void rest(double china_d,double china_d2 ,double A0 ,double z1,double d1,double step,double b1)
 {
     
     //绘制链节滚子草图
     UG_Sketch dwg = new UG_Sketch();//ug高级草图类
     dwg.Arc(x1, y1, d1 / 2, 0, 360);//画滚子圆1
     double y1_add = step * my_math.sin(angle);
     double y1_rest = y1_add + y1;//滚子圆2圆心坐标y
     double x1_add = step * my_math.cos(angle);
     double x1_rest = x1_add + x1;//滚子圆2圆心坐标x
     dwg.Arc(x1_rest, y1_rest, d1 / 2, 0, 360);//画滚子圆2
     dwg.Esc_Sketch();//退出草图

     //拉伸宽度b1
     UG_Rest_X x = new UG_Rest_X(dwg.NxObject);
     x.x(-10,10);//ug拉伸名为草图2的草图生成实体
 }
相关推荐
Eric 辰东2 小时前
【C 语言程序的编译和链接】详解编译链接过程
c语言·笔记·算法·学习方法
迈巴赫车主2 小时前
蓝桥杯21247弹跳鞋java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
jghhh012 小时前
基于 Weiler-Atherton 算法的多边形裁剪程序实现
算法
不爱吃糖の糖糖2 小时前
RAG 04:向量数据库与索引算法
数据库·算法
MegaDataFlowers2 小时前
226.翻转二叉树
算法
alphaTao2 小时前
LeetCode 每日一题 2026/5/25-2026/5/31
算法·leetcode
菜菜的顾清寒2 小时前
力扣HOT100(41)动态规划-杨辉三角
算法·leetcode·动态规划
Cthy_hy3 小时前
Python算法竞赛:集合去重+字典映射 核心用法一站式整理
数据结构·python·算法
Deepoch3 小时前
Deepoc数学大模型:驱动发动机行业数智化转型的底层解
人工智能·算法·deepoc·数学大模型