当前位置: 首页 > news >正文

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

一.草图类

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

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

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

FindObject("SKETCH(2)");//将草图2拉伸为实体

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

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

public NXOpen.NXObject NxObject { get; set; }

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

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

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

3.完整草图类如下:

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.传入一个草图对象

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

2.将草图拉伸为实体

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

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

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

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的草图生成实体 }
http://www.zskr.cn/news/1429268.html

相关文章:

  • 别再为数据发愁:用Simulink批量仿真,为你的电力系统AI模型造一个专属数据集
  • 5月26日每日60秒读懂世界:人口城市治理、劳动权益、医药监管与国际动态
  • UE5 Lumen流明引擎实战:手把手教你配置实时全局光照,告别漫长的光照烘焙
  • GsonFormatPlus深度解析:如何3分钟内实现JSON到Java对象的智能转换
  • 拍秋衣不用再找模特,AI上身图直出
  • 5.30 武汉黄金回收,今日克价直接报 - 资讯纵览
  • CO₂激光管怎么用?这份使用+维护指南请收好!
  • 临沂本地靠谱推荐高分口碑好漏电漏水检测商家-星瀚漏电漏水检测- 消防/热力/自来水/地埋电缆/卫生间漏水 - 资讯热点
  • 2026年平顶山本地六大装修品牌真实实力全面对比解析 - 国麟测评
  • 算力的理性回归:自动驾驶下半场的算力之争
  • 《Turing Complete》通关笔记:我是如何通过游戏理解‘图灵完备’与处理器架构核心的
  • 从脚本到自动化:用Python和Shell封装YARN应用管理,实现一键终止与巡检
  • 基于Arduino的防酒驾系统:从传感器到物联网的嵌入式实战
  • 2026成都花园户型装修设计榜单|一楼庭院+顶楼露台花园专属装企推荐,避坑首选 - 资讯纵览
  • 2026年新闻稿发布平台TOP10权威测评报告 - 资讯纵览
  • 2026年企业如何鉴别一家靠谱的AI搜索GEO服务商 - 品牌报告
  • DS4Windows终极指南:让PS4/PS5手柄在Windows电脑上完美运行
  • 5.30 天津黄金回收,今日大盘价无套路 - 资讯纵览
  • 步进梁加热炉炉温综合优化控制策略【附仿真】
  • 终极指南:如何快速解包Godot游戏资源文件
  • HotSpot VM源码剖析2026版开源!
  • 【信息融合】自适应集成粒子滤波算法的磁图与惯性导航融合算法【含Matlab源码 15579期】
  • 5步将键盘鼠标变专业游戏手柄:vJoy虚拟手柄完整使用指南
  • 不同国家发稿合规要求不同,平台能帮处理吗?媒介易一站式合规发稿能力解析 - 一搜百应
  • 2026年徐州企业AI获客效率提升3倍,怎么做到的?
  • Linux 基金会征集 DNS - AID 项目贡献,让 AI 代理借 DNS 通信无需新基建
  • 抖音评论区图标
  • 2026石家庄品牌首饰回收哪里快 ?添价收秒到账资质全 - 薛定谔的梨花猫
  • 2026郴州黄金奢侈品回收避坑攻略!Top5精选 郴奢汇万宝店领衔 - 小仙贝贝
  • BilibiliDown视频下载器终极使用指南:轻松保存B站高清视频的完整秘籍