在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)凸台面-外表面