Esempio n. 1
0
        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 不是整数
        }
Esempio n. 2
0
        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();
            }
        }
Esempio n. 3
0
        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);
        }