static bool CheckPointIsVertex(Curve curve, Point3d point, double tolerance) { var param = CadUtils.SafeGetParameterAtPoint(curve, point); var paramBase = (int)Math.Floor(param); if (param - Math.Floor(param) > Math.Ceiling(param) - param) { paramBase = (int)Math.Ceiling(param); } var abs = Math.Abs(paramBase - param); return(abs < tolerance); // parameter 不是整数 }
static void EnsurePointIsVertex(Transaction tr, Curve curve, Point3d point, double tolerance) { var param = CadUtils.SafeGetParameterAtPoint(curve, point); var paramBase = (int)Math.Floor(param); if (param - Math.Floor(param) > Math.Ceiling(param) - param) { paramBase = (int)Math.Ceiling(param); } if (Math.Abs(paramBase - param) > tolerance) // parameter 不是整数 { curve.UpgradeOpen(); AddVertex.AddVertexFromPolyline(tr, curve, point); curve.DowngradeOpen(); } }
public static List <Point3d> FindPotentialNodes(Transaction tr, ObjectId id1, ObjectId id2) { var curve1 = tr.GetObject(id1, OpenMode.ForRead) as Curve; var curve2 = tr.GetObject(id2, OpenMode.ForRead) as Curve; if (curve1 == null || curve2 == null) { return(new List <Point3d>()); } var points = CadUtils.IntersectWith(curve1.Database, curve1.ObjectId, curve2.ObjectId); if (points.Count == 0) { return(new List <Point3d>()); } //CadUtils.AddName(database, tr, curve1, "curve1"); //CadUtils.AddName(database, tr, curve2, "curve2"); const double paramTolerance = 0.0001; var result = new List <Point3d>(); foreach (Point3d point in points) { // 如果这里tolerance非常小,会弹出异常,导致无法取得点的参数? var param = CadUtils.SafeGetParameterAtPoint(curve1, point); // 我们来看看这个点是不是三岔口 // 办法是看看左边一点点,或者右边一点点,是不是还在curve2上, // 如果是,那不是三岔口,是邻接边, // 如果不是,就是三岔口,不是邻接边 double param1 = param + paramTolerance; // 如果大于EndParam,用EndParam减了,这样的话,得到的是小于EndParam的参数 // 比如12.1 - 12 = 0.1 if (param1 > curve1.EndParam) { param1 = param1 - curve1.EndParam; } double param2 = param - paramTolerance; // 如果是负数,用EndParam加过去,这样的话,得到的是大于0的参数 // 比如-0.1 + 12 = 11.9 if (param2 < 0) { param2 = curve1.EndParam + param2; } // 取到两个相邻的点 var point1 = CadUtils.SafeGetPointAtParameter(curve1, param1); var point2 = CadUtils.SafeGetPointAtParameter(curve1, param2); // 如果偏移后的两个点不都在curve2上面,应该是三岔口。 // 注意:这里的容差不能是Tolerance.Global.EqualPoint,这个过于精确。 // 我们的经验值大概是0.001,也可以考虑给客户去设定。 if (!CadUtils.IsPointOnCurveGCP(curve2, point1) || !CadUtils.IsPointOnCurveGCP(curve2, point2)) { //CadUtils.DrawPoint(tr, database, point, 2); result.Add(point); } } return(result); }