生成直线的算法实际上是都是用到空间坐标点对象来生成空间直线,显然,草图中是不应该出现空间曲线的,实际上是通过内部一些代码识别将,某种坐标完全归零,例如直线的开始点star_poit(x,y,0.0),和结束点end_poit(x,y,0.0),两点的z坐标都归0,这样草图就被约束在ZC平面内了
一.优化任务草图类,增加生成直线算法
接008篇任务草图类编写
(一).增加绘制空间直线方法Spatial_L()
cs
/// <summary>
/// 绘制空间直线
/// </summary>
public void Spatial_L(NXOpen.Point3d startPoint, NXOpen.Point3d endPoint)
{
try
{
Line_Algorithm(startPoint, endPoint);// 开始绘空间直线
Esc_Sketch();//完成草图
}
catch (Exception ex)
{
}
}
同样的,这个中继方法是为了管理草图,释放缓存而建,真正调用执行的是Line_Algorithm()绘制空间直线算法,
编写绘制空间直线算法方法
这个方法需要传入两个NX软件专用点空间坐标,作为直线的起点和终点,内部命令工具两点生成一条直线
cs
/// <summary>
/// 绘制空间直线算法,
/// </summary>
public void Line_Algorithm(NXOpen.Point3d startPoint, NXOpen.Point3d endPoint)
{
NXOpen.Part workPart = theSession.Parts.Work;
NXOpen.Line line1 =workPart.Curves.CreateLine(startPoint, endPoint);
theSession.ActiveSketch.AddGeometry(line1, NXOpen.Sketch.InferConstraintsOption.InferNoConstraints);//直线添加到草图中
}
使用方法
在按键等触发事件中执行以下代码,先构造一个草图对象,再new两个nx软件专业点坐标对象,设置两点的空间坐标,再调用草图类的绘制空间直线方法
cs
public void rest()
{
Sketch SKETCH3 = new Sketch();//草图对象3
NXOpen.Point3d star_poit = new NXOpen.Point3d(10, 10, 0.0);//NX软件空间点坐标对象,直线开始点
NXOpen.Point3d end_poit = new NXOpen.Point3d(30, 50, 0.0);//NX软件空间点坐标对象,直线结束点
SKETCH3.Spatial_L(star_poit, end_poit);//绘制空间直线
}
运行结果:
直线正确生成,并且约束在ZC平面类,因为我们把两个z坐标都设置为0,这是正确的做法,草图中绝不允许生成一条空间曲线,不管是x平面还z平面,或是z平面草图,必须有一个平面约束为0,做为草图的法向(本套教程默认所有草图都约束在ZC平面)

画线(直线,弧形)算法一般不会单独使用,但是作为我们理解直线草图算法入门以及后面高级草图功能,掌握他必又是必须的,所以还是有必要学习掌握,
(二).直线的方向约束(垂直/水平)
前面的内容我们已经掌握了怎样绘制一条空间直线(实际上我们必须将他控制位草图平面内的直线),现在,我们已经拥有了一条如上图的斜直线,他的两个首位坐标如上图,已知两个点,直线的长度已经是确定的,如果我们把一条已知长度的直线约束为垂直会发生什么呢
首先,学习控制直线竖直约束的api
NX软件控制直线约束为竖直约束的步骤如下:
cs
NXOpen.Sketch.ConstraintGeometry geom3 = new NXOpen.Sketch.ConstraintGeometry(); //设置用于垂直约束的几何对象
geom3.Geometry = line1;//指定垂直约束对象为直线line1
geom3.PointType = NXOpen.Sketch.ConstraintPointType.None;// 垂直约束作用于整条线,无需指定点
geom3.SplineDefiningPointIndex = 0;
NXOpen.SketchGeometricConstraint sketchGeometricConstraint2 = theSession.ActiveSketch.CreateVerticalConstraint(geom3);//创建垂直约束:强制该直线在草图中保持垂直(相对于草图坐标系的Y轴)
theSession.ActiveSketch.Update();//更新草图
1.新建一个草图几何约束类NXOpen.Sketch.ConstraintGeometry对象,草图几何约束可以放各种约束关系(竖直,水平,相切,重合等等)
cs
//草图几何约束对象
NXOpen.Sketch.ConstraintGeometry geom3 = new NXOpen.Sketch.ConstraintGeometry();
2.指定一条之前已经创建好的空间直线line1为被约束的几何体,
cs
geom3.Geometry = line1;//指定垂直约束对象为直线line1
3.整条线都要被控制为竖直,无需确定控制约束点,设置为None
cs
geom3.PointType = NXOpen.Sketch.ConstraintPointType.None;
4.创建:强制约束几何为竖直类NXOpen.SketchGeometricConstraint
创建强制约束几何为竖直类时,需传入一个几何约束类对象,如上面的geom3,当我们强制建几何约束为竖直时,它将相对于草图y轴竖直
cs
//创建垂直约束:强制该直线在草图中保持垂直(相对于草图坐标系的Y轴)
NXOpen.SketchGeometricConstraint sketchGeometricConstraint2 = theSession.ActiveSketch.CreateVerticalConstraint(geom3);
完整代码如下:
cs
/// <summary>
/// 绘制竖直直线算法
/// </summary>
public void Vertical_Algorithm(NXOpen.Point3d startPoint, NXOpen.Point3d endPoint)
{
NXOpen.Part workPart = theSession.Parts.Work;
// NXOpen.Point3d startPoint = new NXOpen.Point3d(4.0, 1.0, 0.0);
// NXOpen.Point3d endPoint = new NXOpen.Point3d(5.8500000000000023, 4.2042939940024215, 0.0);
NXOpen.Line line1 = workPart.Curves.CreateLine(startPoint, endPoint);
theSession.ActiveSketch.AddGeometry(line1, NXOpen.Sketch.InferConstraintsOption.InferNoConstraints);//直线添加到草图中
//直线约束为竖直
NXOpen.Sketch.ConstraintGeometry geom3 = new NXOpen.Sketch.ConstraintGeometry(); //设置用于垂直约束的几何对象
geom3.Geometry = line1;//指定垂直约束对象为直线line1
geom3.PointType = NXOpen.Sketch.ConstraintPointType.None;// 垂直约束作用于整条线,无需指定点
geom3.SplineDefiningPointIndex = 0;//如果该线非样条线,默认为0
NXOpen.SketchGeometricConstraint sketchGeometricConstraint2 = theSession.ActiveSketch.CreateVerticalConstraint(geom3);//创建垂直约束:强制该直线在草图中保持垂直(相对于草图坐标系的Y轴)
theSession.ActiveSketch.Update();//更新草图
}
使用方法和生成空间直线一样,我们绘制了两个一样的直线,后一个草图是用竖直约束算法绘制的,我们运行结果看发生了什么
cs
public void rest()
{
Sketch SKETCH3 = new Sketch();//草图对象3
NXOpen.Point3d star_poit = new NXOpen.Point3d(10, 10, 0.0);//NX软件空间点坐标对象,直线开始点
NXOpen.Point3d end_poit = new NXOpen.Point3d(30, 50, 0.0);//NX软件空间点坐标对象,直线结束点
SKETCH3.Spatial_L(star_poit, end_poit);//绘制空间直线
Sketch SKETCH4 = new Sketch();//草图对象4
NXOpen.Point3d star_poit1 = new NXOpen.Point3d(10, 10, 0.0);//NX软件空间点坐标对象,直线开始点
NXOpen.Point3d end_poit1 = new NXOpen.Point3d(30, 50, 0.0);//NX软件空间点坐标对象,直线结束点
SKETCH4.Vertical_L(star_poit1, end_poit1);//绘制竖直直线
}
(三).运行测试
我们可以看到,线的长度没有发生变形,都是44.7,而且他们的中点是重合的,约束竖直的线只是绕线的中点旋转,

结论:
1.竖直约束是将直线绕中点旋转为竖直,线的长度不变,两个点的坐标发生了改变,
2.实际上我们在ug界面上画草图时,我们将一条斜线约束为竖直线时,ug软件会花费几倍甚至数十倍的算力去重新推断出直线新的首位两个点坐标位置,而我们用算法画图时,我们都可以精准控制线的点坐标,
3.用算法画图时,如果我们要画一条竖直线,我们直接用点坐标精准画一条竖直的线,这条线就是我们最终想要的线,约不约束都无所谓,画好的竖直线,再加上竖直约束并不是脱裤子放屁,而是为锁定直线提供了一份安全锁定,如果直线后期不是纯算法画图,有了约束等参与,如直线端点还和其他圆弧等其他几何相切,重合等等约束时,如果直线不是锁定竖直的,它可能被拉扯变形
4.如果掌握了尺寸约束技能,最好将竖直线再加上尺寸约束锁,确保直线完全约束
5.纯算法画图 其实是不需要加任何约束的,但他对算法公式计算结果要求没有任何误差,如果算法写的好,不加任何约束当然最好,它能避免线发生变形,但很多时候,我们写解析草图的算法并没有那么厉害,一个有误差的解可能画出来的草图不是一个封闭的截面等等,这就需要用到各种约束来辅助了,虽然,加了约束的草图控制代码可能会增加几倍甚至几十倍,但对于不聪明的我们确属无奈备选
标准使用方法:
直接画一条竖直的线,但我们还是调用了绘制竖直直线的方法,目的是为我们的线加一条竖直约束
cs
Sketch SKETCH4 = new Sketch();//草图对象4
NXOpen.Point3d star_poit1 = new NXOpen.Point3d(10, 10, 0.0);//NX软件空间点坐标对象,直线开始点
NXOpen.Point3d end_poit1 = new NXOpen.Point3d(10, 50, 0.0);//NX软件空间点坐标对象,直线结束点
SKETCH4.Vertical_L(star_poit1, end_poit1);//绘制竖直直线


(四).直线的水平约束
直线的水平约束写法和垂直约束完全一样,只不过最后的约束控制类调用水平约束来控制
cs
public void Horizontal_Algorithm(NXOpen.Point3d startPoint, NXOpen.Point3d endPoint)
{
NXOpen.Part workPart = theSession.Parts.Work;
NXOpen.Line line1 = workPart.Curves.CreateLine(startPoint, endPoint);
theSession.ActiveSketch.AddGeometry(line1, NXOpen.Sketch.InferConstraintsOption.InferNoConstraints);
//直线约束为水平
NXOpen.Sketch.ConstraintGeometry geom3 = new NXOpen.Sketch.ConstraintGeometry();
geom3.Geometry = line1;//指定垂直约束对象为直线line1
geom3.PointType = NXOpen.Sketch.ConstraintPointType.None;
geom3.SplineDefiningPointIndex = 0;
//强制约束为水平直线,相对于x轴,唯一更改的地方
NXOpen.SketchGeometricConstraint sketchGeometricConstraint1= theSession.ActiveSketch.CreateHorizontalConstraint(geom3);
theSession.ActiveSketch.Update();//更新草图
}