UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面

在UG NX二次开发过程中,为了判断一张面是否是孔的面还是凸台的面,就要判断面是外表面还是内表面。本文介绍下如何判断一张圆柱面或者圆锥面是外表面还是内表面。

以如下图所示的两个面为例:

UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面

左侧的面是内表面,右侧的为外表面。

首先要判断面的类型,采用如下代码:

string faceType =  face.SolidFaceType;

 圆柱面:

UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面

然后采用 uFModl.AskFaceData(face.Tag, out type, point, dir, box, out radius, out rad_data, out norm_dir);来获得面的数据,其具体含义为:

UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面

 UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面

我们主要用到的是点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)孔面-内表面

UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面

b)凸台面-外表面

UG NX二次开发(C#)-建模-判断一张面是孔面还是凸台面

 

 

上一篇:C++ 关于字符串分割函数split封装


下一篇:用 three.js 绘制三维带箭头线要了我半条命