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的草图生成实体 }