//构建特征中Face的角度属性邻接图 public AngleGraph(MyNewDefineFeature Feature1) { int FaceNum = Feature1.FaceNumber; NumOfFace = FaceNum;//记录图中面的个数 //初始化邻接矩阵和顶点数组 adjmatrix = new double[FaceNum, FaceNum]; Tag[] shared_edges; double FaceAngle; //将代表邻接矩阵的表全初始化为0 for (int i = 0; i < FaceNum; i++) { for (int j = 0; j < FaceNum; j++) { if (i == j) { adjmatrix[i, j] = 0; continue; } //判断两个面是否相邻 ufmodel.AskSharedEdges(Feature1.MyNewFeature[i].FaceTag, Feature1.MyNewFeature[j].FaceTag, out shared_edges); if (shared_edges.Length == 0)//不相邻的情况取-1 { adjmatrix[i, j] = -1.0; } else { MyFace.AskAngleOfFace(Feature1.MyNewFeature[i].FaceTag, Feature1.MyNewFeature[j].FaceTag, out FaceAngle); adjmatrix[i, j] = Math.Round(FaceAngle, 2);//四舍五入,保留2位小数 } } } }
//判断一个特征是否为一个盲孔 public static bool IsCounterboreHole(MyNewDefineFeature Feature1) { //单独的盲孔,边数为3的盲孔是存在阶梯孔的情况 if (Feature1.FaceNumber == 2 && (Feature1.EdgeNumber >= 2) && Feature1.VertexNumber == 0) { //先计算两面之间的夹角 double Angle; MyFace.AskAngleOfFace(Feature1.MyNewFeature[0].FaceTag, Feature1.MyNewFeature[1].FaceTag, out Angle); if (Angle != 90.0) { return(false); } if (Feature1.MyNewFeature[0].NodeFaceType == MyNewFaceType.Cylindrical && Feature1.MyNewFeature[1].NodeFaceType == MyNewFaceType.Planar) { //判断盲孔:一个面为凹圆柱面,一个面为平面,且两面的交线为凹边 Tag[] SharedEdges; Program.theUfmodel.AskSharedEdges(Feature1.MyNewFeature[0].FaceTag, Feature1.MyNewFeature[1].FaceTag, out SharedEdges); if (MyEdges.IsConcaveEdge(SharedEdges[0]) && (MyFace.IsConcaveFace(Feature1.MyNewFeature[0].FaceTag) == 2)) { return(true); } } else if (Feature1.MyNewFeature[1].NodeFaceType == MyNewFaceType.Cylindrical && Feature1.MyNewFeature[0].NodeFaceType == MyNewFaceType.Planar) { //判断盲孔:一个面为凹圆柱面,一个面为平面,且两面的交线为凹边 Tag[] SharedEdges; Program.theUfmodel.AskSharedEdges(Feature1.MyNewFeature[0].FaceTag, Feature1.MyNewFeature[1].FaceTag, out SharedEdges); if (MyEdges.IsConcaveEdge(SharedEdges[0]) && (MyFace.IsConcaveFace(Feature1.MyNewFeature[1].FaceTag) == 2)) { return(true); } } } return(false); }
//获取模型中的凹边 public static void GetConcaveEdge(out Tag[] Edges) { Part workPart = theSession.Parts.Work; BodyCollection bodis = workPart.Bodies; Body[] bodys = bodis.ToArray(); Tag [] egde_list; ufmodel.AskBodyEdges(bodys[0].Tag, out egde_list); Tag[] face_list; double Angle; int i = 0; Tag[] TemEdges = new Tag[egde_list.Length]; foreach (Tag egde in egde_list) { ufmodel.AskEdgeFaces(egde, out face_list); MyFace.AskAngleOfFace(face_list[0], face_list[1], out Angle); if (Angle < 180.0) { TemEdges[i] = egde; ++i; } } Edges = new Tag[i]; for (int j = 0; j < Edges.Length; ++j) { Edges[j] = TemEdges[j]; } }
//判断边是否为凹边 public static bool IsConcaveEdge(Tag edge1) { Tag[] face_list; ufmodel.AskEdgeFaces(edge1, out face_list); bool IsConcave = true; double Angle; MyFace.AskAngleOfFace(face_list[0], face_list[1], out Angle); if (Angle >= 180.0) { IsConcave = false; } return(IsConcave); }
public static EdgeConcavity GetEdgeConca(Tag edge) { Tag[] face_list; Program.theUfmodel.AskEdgeFaces(edge, out face_list); EdgeConcavity edgeType; double Angle; MyFace.AskAngleOfFace(face_list[0], face_list[1], out Angle); if (Angle == 180.0) { edgeType = EdgeConcavity.TangentLiner;//相切 } else if (Angle > 180.0) { edgeType = EdgeConcavity.Convexity;//凸边 } else { edgeType = EdgeConcavity.Concavity;//凹边 } return(edgeType); }