机械设计中,核心且严谨的态度就是设计的部件有规定运动的约束,对部件基本草图要有完全约束,
虽然西门子放弃了机械设计模块,草图求解器也采用了不严谨的松弛尺寸和推断约束,但我们自己二次开发的工具尽量往专业.严谨的方向摸索,即使为达这些严谨目的,不惜调用旧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();//完成草图
}
}
新版本,完全约束的线会自动变为蓝色
