明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5003|回复: 5

[几何] 获取 Curve 坐标方法

[复制链接]
发表于 2009-12-9 15:39:00 | 显示全部楼层 |阅读模式
  1. /// <summary>
  2.         /// 获取线对象上的坐标集和突度集
  3.         /// </summary>
  4.         /// <param name="curve">Curve对象</param>
  5.         /// <param name="Point3dColl">坐标集</param>
  6.         /// <param name="Bulges">突度集</param>
  7.         public static void GetPolylinePoint3dsAndBulge(this Curve curve,ref Point3dCollection Point3dColl,ref DoubleCollection Bulges)
  8.         {
  9.             try
  10.             {
  11.                
  12.                 Point3dColl.Clear();
  13.                 Bulges.Clear();
  14.                 switch (curve.GetEntityType())
  15.                 {
  16.                     case "Polyline":
  17.                         Polyline polylineObject = (Polyline)curve;
  18.                         int NumberOfVertices = polylineObject.NumberOfVertices;
  19.                         for (int i = 0; i < NumberOfVertices; i++)
  20.                         {
  21.                             Point3dColl.Add(polylineObject.GetPoint3dAt(i));
  22.                             Bulges.Add(polylineObject.GetBulgeAt(i));
  23.                         }
  24.                         break;
  25.                     case "Line":
  26.                         Point3dColl.Add(curve.StartPoint);
  27.                         Point3dColl.Add(curve.EndPoint);
  28.                         Bulges.Add(0);
  29.                         Bulges.Add(0);
  30.                         break;
  31.                     case "Arc":
  32.                         Point3dColl.Add(curve.StartPoint);
  33.                         Point3dColl.Add(curve.EndPoint);
  34.                         Bulges.Add(((Arc)curve).GetBulge(true));
  35.                         Bulges.Add(0);
  36.                         break;
  37.                     case "Polyline2d":
  38.                         Polyline2d polyline2dObject = (Polyline2d)curve;
  39.                         using (Transaction trans = AcadPropers.Tm.StartTransaction())
  40.                         {
  41.                             foreach (ObjectId objId in polyline2dObject)
  42.                             {
  43.                                 Vertex2d v2d = (Vertex2d)objId.GetEntity(trans, OpenMode.ForRead, false, false);
  44.                                 Point3dColl.Add(v2d.Position);
  45.                                 Bulges.Add(v2d.Bulge);
  46.                             }
  47.                             trans.Commit();
  48.                         }
  49.                         break;
  50.                 }
  51.             }
  52.             catch
  53.             {
  54.                 Point3dColl.Clear();
  55.                 Bulges.Clear();
  56.             }
  57.         }
  58. public static Point3dCollection GetPolylinePoint3ds(this Curve curve)
  59.         {
  60.             try
  61.             {
  62.                 Point3dCollection Point3dColl = new Point3dCollection();
  63.                 switch (curve.GetEntityType())
  64.                 {
  65.                     case "Polyline":
  66.                         Polyline polylineObject = (Polyline)curve;
  67.                         int NumberOfVertices = polylineObject.NumberOfVertices;
  68.                         for (int i = 0; i < NumberOfVertices; i++)
  69.                         {
  70.                             Point3dColl.Add(polylineObject.GetPoint3dAt(i));
  71.                         }
  72.                         break;
  73.                     case "Line":
  74.                         Point3dColl.Add(curve.StartPoint);
  75.                         Point3dColl.Add(curve.EndPoint);
  76.                         break;
  77.                     case "Arc":
  78.                         Point3dColl.Add(curve.StartPoint);
  79.                         Point3dColl.Add(curve.EndPoint);
  80.                         break;
  81.                     case "Polyline2d":
  82.                         Polyline2d polyline2dObject = (Polyline2d)curve;
  83.                         using (Transaction trans = AcadPropers.Tm.StartTransaction())
  84.                         {
  85.                             foreach (ObjectId objId in polyline2dObject)
  86.                             {
  87.                                 Vertex2d v2d = (Vertex2d)objId.GetEntity(trans, OpenMode.ForRead, false, false);
  88.                                 Point3dColl.Add(v2d.Position);
  89.                             }
  90.                             trans.Commit();
  91.                         }
  92.                         break;
  93.                 }
  94.                 return Point3dColl;
  95.             }
  96.             catch
  97.             {
  98.                 return null;
  99.             }
  100.         }
  101.         /// <summary>
  102.         /// 返回CAD对象类型
  103.         /// </summary>
  104.         /// <param name="ent">对象名称</param>
  105.         /// <returns></returns>
  106.         public static string GetEntityType(this Entity ent)
  107.         {
  108.             try
  109.             {
  110.                 return ent.GetType().ToString().Replace("Autodesk.AutoCAD.DatabaseServices.", "");
  111.             }
  112.             catch
  113.             {
  114.                 return "";
  115.             }
  116.         }
  117. /// <summary>
  118.         /// 获取ObjectId的Entity
  119.         /// </summary>
  120.         /// <param name="ObjId">对象ID</param>
  121.         /// <param name="trans">事务处理对象</param>
  122.         /// <param name="openmode">读取模式</param>
  123.         /// <returns></returns>
  124.         public static DBObject GetEntity(this ObjectId ObjId, Transaction trans, OpenMode openmode, bool openErased, bool forceOpenOnLockeDLayer)
  125.         {
  126.             try
  127.             {
  128.                 return (DBObject)trans.GetObject(ObjId, openmode, openErased, forceOpenOnLockeDLayer);
  129.             }
  130.             catch (Exception)
  131.             {
  132.                 return null;
  133.             }
  134.         }
  135. ///后面部分是抄的,原来自己写的方向有时候有问题
  136. ///忘记哪里了,急用没留地址,找不到了
  137. ///希望这位朋友不要介意啊,哈哈
  138.         //计算凸起值
  139.         public static double GetBulge(this Arc A, bool SEbo)
  140.         {
  141.             double Bulge = 0;
  142.             double L1 = GetDistance(A.StartPoint, A.EndPoint);
  143.             double Angle = A.EndAngle - A.StartAngle;
  144.             if (Angle < 0)
  145.             {
  146.                 Angle = Math.PI * 2 + Angle;
  147.                 //计算圆弧总角度
  148.             }
  149.             if (Angle > Math.PI)
  150.             {
  151.                 //判断是否大于180度
  152.                 Bulge = A.Radius + Math.Sqrt(Math.Pow(A.Radius, 2) - Math.Pow((L1 / 2), 2));
  153.                 //计算凸起值
  154.             }
  155.             else
  156.             {
  157.                 Bulge = A.Radius - Math.Sqrt(Math.Pow(A.Radius, 2) - Math.Pow((L1 / 2), 2));
  158.                 //计算凸起值
  159.             }
  160.             Point3d Pt2 = A.GetPointAtDist(A.GetDistanceAtParameter(A.EndParam) / 2);
  161.             //取中点
  162.             double TempDouble = 0;
  163.             if (SEbo == true)
  164.             {
  165.                 //判断方向
  166.                 TempDouble = PtSide(A.StartPoint, Pt2, A.EndPoint);
  167.             }
  168.             else
  169.             {
  170.                 TempDouble = PtSide(A.EndPoint, Pt2, A.StartPoint);
  171.             }
  172.             if (TempDouble > 0)
  173.             {
  174.                 //判断圆弧是凸向哪边
  175.                 return -Bulge / (L1 / 2);
  176.             }
  177.             else
  178.             {
  179.                 return Bulge / (L1 / 2);
  180.             }
  181.         }
  182.         //判断圆弧是凸向哪边
  183.         private static double PtSide(Point3d pt1, Point3d pt2, Point3d pt3)
  184.         {
  185.             Vector3d vect1 = pt1.GetVectorTo(pt2);
  186.             Vector3d vect2 = pt1.GetVectorTo(pt3);
  187.             return vect2.X * vect1.Y - vect1.X * vect2.Y;
  188.         }
扩展方法需要放在静态类里面

评分

参与人数 2威望 +2 明经币 +3 金钱 +20 贡献 +5 激情 +5 收起 理由
雪山飞狐_lzh + 1 + 2 + 20 + 5 + 5 【精华】好程序
lzx838 + 1 + 1 【好评】表扬一下

查看全部评分

本帖被以下淘专辑推荐:

  • · c#|主题: 6, 订阅: 2
发表于 2009-12-9 17:34:00 | 显示全部楼层

小狼兄发贴啦

大家快来支持啊

发表于 2009-12-10 17:33:00 | 显示全部楼层

好东西,支持下,收藏啦

发表于 2009-12-13 22:06:00 | 显示全部楼层

收藏一下先。以后有用的时候来再来

发表于 2009-12-17 21:48:00 | 显示全部楼层

谢谢。

我这几一正在看ployline

再次谢谢!!

发表于 2013-8-5 16:00:50 | 显示全部楼层
终于找到了。支持下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-22 21:44 , Processed in 0.203015 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表