/// <summary> /// Finds candidate path edges from a side face with two edges on the profile face. /// </summary> /// <param name="face">The side face.</param> /// <param name="edge0">The edge on the profile face and the side face.</param> /// <param name="edge1">The edge on the profile face and the side face.</param> /// <returns>The potential path edges. Should at least have two path on one face</returns> private static List<Edge> FindCandidatePathEdge(Face face, Edge edge0, Edge edge1) { double vertexEps = ExporterCacheManager.Document.Application.VertexTolerance; Curve curve0 = edge0.AsCurveFollowingFace(face); Curve curve1 = edge1.AsCurveFollowingFace(face); XYZ[,] endPoints = new XYZ[2, 2] { { curve0.GetEndPoint(0), curve1.GetEndPoint(1) }, { curve0.GetEndPoint(1), curve1.GetEndPoint(0) } }; List<Edge> candidatePathEdges = new List<Edge>(); EdgeArray outerEdgeLoop = face.EdgeLoops.get_Item(0); foreach (Edge edge in outerEdgeLoop) { XYZ endPoint0 = edge.Evaluate(0); XYZ endPoint1 = edge.Evaluate(1); for (int i = 0; i < 2; i++) { bool found = false; for (int j = 0; j < 2; j++) { if (endPoint0.IsAlmostEqualTo(endPoints[i, j], vertexEps)) { int k = 1 - j; if (endPoint1.IsAlmostEqualTo(endPoints[i, k], vertexEps)) { candidatePathEdges.Add(edge); found = true; break; } } } if (found) break; } } return candidatePathEdges; }