在UG NX二次开发过程中,为了判断一张面是否是孔的面还是凸台的面,就要判断面是外表面还是内表面。本文介绍下如何判断一张圆柱面或者圆锥面是外表面还是内表面。
以如下图所示的两个面为例:
左侧的面是内表面,右侧的为外表面。
首先要判断面的类型,采用如下代码:
string faceType = face.SolidFaceType;
圆柱面:
然后采用 uFModl.AskFaceData(face.Tag, out type, point, dir, box, out radius, out rad_data, out norm_dir);来获得面的数据,其具体含义为:
我们主要用到的是点point,在圆柱面中,输出的point是double[]类型的,表示圆柱面轴线上的某个参考点。
然后再用uFModl.AskFaceProps(face.Tag, param, point1, u1, v1, u2, v2, unit_norm, radii);来获得曲面上参数为param[]的点point1和其所在面的法矢unit_norm[]。
通过计算点point到point1的矢量与法矢点乘的正负来判断其实外表面还是内表面。
如果是正值,则是内表面,如果是负值,则是外表面。
完整代码如下:
/// <summary>
/// 圆柱面或者圆柱面是孔面还是凸台面,如果是孔面,返回true,如果是凸台面,返回false
/// </summary>
/// <param name="face"></param>
/// <returns></returns>
public static bool IsInnerHoleFace(Face face)
{
double[] param = new double[2] { 0.5, 0.5 };
double[] point1 = new double[3];
double[] u1 = new double[3];
double[] v1 = new double[3];
double[] u2 = new double[3];
double[] v2 = new double[3];
double[] unit_norm = new double[3];
double[] radii = new double[2];
uFModl.AskFaceProps(face.Tag, param, point1, u1, v1, u2, v2, unit_norm, radii);
int type;
double[] point = new double[3];
double[] dir = new double[3];
double[] box = new double[6];
double radius;
double rad_data;
int norm_dir;
uFModl.AskFaceData(face.Tag, out type, point, dir, box, out radius, out rad_data, out norm_dir);
double[] vec1 = new double[3] { point[0] - point1[0], point[1] - point1[1], point[2] - point1[2] };
double med = vec1[0] * unit_norm[0] + vec1[1] * unit_norm[1] + vec1[2] * unit_norm[2];
if(med<0)
{
return false;
}
else
{
return true;
}
}
实现上面的示例如下:
a)孔面-内表面
b)凸台面-外表面