小狼 发表于 2009-12-9 15:39:00

获取 Curve 坐标方法

/// <summary>
      /// 获取线对象上的坐标集和突度集
      /// </summary>
      /// <param name="curve">Curve对象</param>
      /// <param name="Point3dColl">坐标集</param>
      /// <param name="Bulges">突度集</param>
      public static void GetPolylinePoint3dsAndBulge(this Curve curve,ref Point3dCollection Point3dColl,ref DoubleCollection Bulges)
      {
            try
            {
               
                Point3dColl.Clear();
                Bulges.Clear();
                switch (curve.GetEntityType())
                {
                  case "Polyline":
                        Polyline polylineObject = (Polyline)curve;
                        int NumberOfVertices = polylineObject.NumberOfVertices;
                        for (int i = 0; i < NumberOfVertices; i++)
                        {
                            Point3dColl.Add(polylineObject.GetPoint3dAt(i));
                            Bulges.Add(polylineObject.GetBulgeAt(i));
                        }
                        break;
                  case "Line":
                        Point3dColl.Add(curve.StartPoint);
                        Point3dColl.Add(curve.EndPoint);
                        Bulges.Add(0);
                        Bulges.Add(0);
                        break;
                  case "Arc":
                        Point3dColl.Add(curve.StartPoint);
                        Point3dColl.Add(curve.EndPoint);
                        Bulges.Add(((Arc)curve).GetBulge(true));
                        Bulges.Add(0);
                        break;
                  case "Polyline2d":
                        Polyline2d polyline2dObject = (Polyline2d)curve;
                        using (Transaction trans = AcadPropers.Tm.StartTransaction())
                        {
                            foreach (ObjectId objId in polyline2dObject)
                            {
                              Vertex2d v2d = (Vertex2d)objId.GetEntity(trans, OpenMode.ForRead, false, false);
                              Point3dColl.Add(v2d.Position);
                              Bulges.Add(v2d.Bulge);
                            }
                            trans.Commit();
                        }
                        break;
                }
            }
            catch
            {
                Point3dColl.Clear();
                Bulges.Clear();
            }
      }

public static Point3dCollection GetPolylinePoint3ds(this Curve curve)
      {
            try
            {
                Point3dCollection Point3dColl = new Point3dCollection();
                switch (curve.GetEntityType())
                {
                  case "Polyline":
                        Polyline polylineObject = (Polyline)curve;
                        int NumberOfVertices = polylineObject.NumberOfVertices;
                        for (int i = 0; i < NumberOfVertices; i++)
                        {
                            Point3dColl.Add(polylineObject.GetPoint3dAt(i));
                        }
                        break;
                  case "Line":
                        Point3dColl.Add(curve.StartPoint);
                        Point3dColl.Add(curve.EndPoint);
                        break;
                  case "Arc":
                        Point3dColl.Add(curve.StartPoint);
                        Point3dColl.Add(curve.EndPoint);
                        break;
                  case "Polyline2d":
                        Polyline2d polyline2dObject = (Polyline2d)curve;
                        using (Transaction trans = AcadPropers.Tm.StartTransaction())
                        {
                            foreach (ObjectId objId in polyline2dObject)
                            {
                              Vertex2d v2d = (Vertex2d)objId.GetEntity(trans, OpenMode.ForRead, false, false);
                              Point3dColl.Add(v2d.Position);
                            }
                            trans.Commit();
                        }
                        break;
                }
                return Point3dColl;
            }
            catch
            {
                return null;
            }
      }
      /// <summary>
      /// 返回CAD对象类型
      /// </summary>
      /// <param name="ent">对象名称</param>
      /// <returns></returns>
      public static string GetEntityType(this Entity ent)
      {
            try
            {
                return ent.GetType().ToString().Replace("Autodesk.AutoCAD.DatabaseServices.", "");
            }
            catch
            {
                return "";
            }
      }

/// <summary>
      /// 获取ObjectId的Entity
      /// </summary>
      /// <param name="ObjId">对象ID</param>
      /// <param name="trans">事务处理对象</param>
      /// <param name="openmode">读取模式</param>
      /// <returns></returns>
      public static DBObject GetEntity(this ObjectId ObjId, Transaction trans, OpenMode openmode, bool openErased, bool forceOpenOnLockeDLayer)
      {
            try
            {
                return (DBObject)trans.GetObject(ObjId, openmode, openErased, forceOpenOnLockeDLayer);
            }
            catch (Exception)
            {
                return null;
            }
      }
///后面部分是抄的,原来自己写的方向有时候有问题
///忘记哪里了,急用没留地址,找不到了
///希望这位朋友不要介意啊,哈哈
      //计算凸起值
      public static double GetBulge(this Arc A, bool SEbo)
      {
            double Bulge = 0;
            double L1 = GetDistance(A.StartPoint, A.EndPoint);
            double Angle = A.EndAngle - A.StartAngle;
            if (Angle < 0)
            {
                Angle = Math.PI * 2 + Angle;
                //计算圆弧总角度
            }
            if (Angle > Math.PI)
            {
                //判断是否大于180度
                Bulge = A.Radius + Math.Sqrt(Math.Pow(A.Radius, 2) - Math.Pow((L1 / 2), 2));
                //计算凸起值
            }
            else
            {
                Bulge = A.Radius - Math.Sqrt(Math.Pow(A.Radius, 2) - Math.Pow((L1 / 2), 2));
                //计算凸起值
            }
            Point3d Pt2 = A.GetPointAtDist(A.GetDistanceAtParameter(A.EndParam) / 2);
            //取中点
            double TempDouble = 0;
            if (SEbo == true)
            {
                //判断方向
                TempDouble = PtSide(A.StartPoint, Pt2, A.EndPoint);
            }
            else
            {
                TempDouble = PtSide(A.EndPoint, Pt2, A.StartPoint);
            }
            if (TempDouble > 0)
            {
                //判断圆弧是凸向哪边
                return -Bulge / (L1 / 2);
            }
            else
            {
                return Bulge / (L1 / 2);
            }
      }
      //判断圆弧是凸向哪边
      private static double PtSide(Point3d pt1, Point3d pt2, Point3d pt3)
      {
            Vector3d vect1 = pt1.GetVectorTo(pt2);
            Vector3d vect2 = pt1.GetVectorTo(pt3);
            return vect2.X * vect1.Y - vect1.X * vect2.Y;
      }

扩展方法需要放在静态类里面

lzx838 发表于 2009-12-9 17:34:00

<p>小狼兄发贴啦</p><p>大家快来支持啊</p>

liminnet 发表于 2009-12-10 17:33:00

<p>好东西,支持下,收藏啦</p>

游天居士 发表于 2009-12-13 22:06:00

<p>收藏一下先。以后有用的时候来再来</p>

游天居士 发表于 2009-12-17 21:48:00

<p>谢谢。</p><p>我这几一正在看ployline </p><p>再次谢谢!!</p>

gruand 发表于 2013-8-5 16:00:50

终于找到了。支持下
页: [1]
查看完整版本: 获取 Curve 坐标方法