明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 17605|回复: 29

[几何] 曲线转换类

  [复制链接]
发表于 2009-8-17 12:45 | 显示全部楼层 |阅读模式
本帖最后由 雪山飞狐_lzh 于 2014-8-29 19:15 编辑

Ge库曲线在Net中见到的很少,ObjectArx有很多,在XD找到过
下面的代码有小部分是参考XD的代码移植来的:)
参考
http://www.xdcad.net/forum/showthread.php?s=&threadid=57844&perpage=15&display=&pagenumber=1
http://www.xdcad.net/forum/showthread.php?s=&threadid=19335&perpage=15&display=&pagenumber=1
http://www.xdcad.net/forum/showthread.php?postid=66202
2014/8/26更新版本 修正样条曲线的Bug
2014/8/29更新版本 修正Ge曲线打断





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2018-9-28 21:54 | 显示全部楼层
收获满满,共享伟大
发表于 2009-8-17 17:54 | 显示全部楼层

学一学!谢斑竹!

不知道能不能用得上!

以前碰到过CircularArc2d或还是别的圆弧类,记不清了,认为有Bug,是StartAngle和EndAnlge角度方面的,AutoCAD 2006版本

 楼主| 发表于 2009-8-17 23:35 | 显示全部楼层
发几个使用的例子:)
1、Ge创建圆弧(中点、起点,圆心)
同理实现起点,弧上点、中点,GeArc有相应的构筑函数
  1.         [CommandMethod("CCicByDb")]
  2.         public static void CCicByDb()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Point3d p1 = new Point3d(10,0,10);
  7.             Point3d p2 = new Point3d(0,200,0);
  8.             Plane plane = new Plane(p1, Point3d.Origin, p2);
  9.             Matrix3d mat = Matrix3d.WorldToPlane(plane);
  10.             p1 = p1.TransformBy(mat);
  11.             p2 = p2.TransformBy(mat);
  12.             
  13.             using (Transaction tr = db.TransactionManager.StartTransaction())
  14.             {
  15.                 Curve arc = new Arc(Point3d.Origin, p1.GetAsVector().Length, p1.GetAsVector().AngleOnPlane(new Plane()), p2.GetAsVector().AngleOnPlane(new Plane()));
  16.                 arc.TransformBy(mat.Inverse());
  17.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  18.                 btr.AppendEntity(arc);
  19.                 tr.AddNewlyCreatedDBObject(arc,true);
  20.                 tr.Commit();
  21.             }
  22.         }
  23.         [CommandMethod("CCirByGe")]
  24.         public static void CCirByGe()
  25.         {
  26.             Document doc = Application.DocumentManager.MdiActiveDocument;
  27.             Database db = doc.Database;
  28.             Vector3d startvec = new Vector3d(10, 0, 10);
  29.             Vector3d endvec = new Vector3d(0, 200, 0);
  30.             endvec = endvec.GetNormal() * startvec.Length;
  31.             Vector3d othervec = startvec + endvec;
  32.             othervec = othervec.GetNormal() * startvec.Length;
  33.             CircularArc3d ca3d = new CircularArc3d(Point3d.Origin + startvec, Point3d.Origin + othervec, Point3d.Origin + endvec);
  34.             using (Transaction tr = db.TransactionManager.StartTransaction())
  35.             {
  36.                 Curve arc = ConvertCurve.ToArc(ca3d);
  37.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  38.                 btr.AppendEntity(arc);
  39.                 tr.AddNewlyCreatedDBObject(arc, true);
  40.                 tr.Commit();
  41.             }
  42.         }
 楼主| 发表于 2009-8-17 23:37 | 显示全部楼层
2、填充边界(以前发过)
  1.         [CommandMethod("ht")]
  2.         public static void HatchLoop()
  3.         {
  4.             PromptSelectionResult res = Helper.Editor.GetSelection(
  5.                 new PromptSelectionOptions(),
  6.                 new SelectionFilter(new TypedValue[] { new TypedValue(0, "Hatch") }));
  7.             if (res.Status != PromptStatus.OK)
  8.                 return;
  9.             Document doc = Application.DocumentManager.MdiActiveDocument;
  10.             Database db = doc.Database;
  11.             using (Transaction tr = db.TransactionManager.StartTransaction())
  12.             {
  13.                 BlockTableRecord btr =
  14.                     (BlockTableRecord)tr.GetObject(
  15.                         db.CurrentSpaceId,
  16.                         OpenMode.ForWrite,
  17.                         false);
  18.                 foreach (ObjectId id in res.Value.GetObjectIds())
  19.                 {
  20.                     Hatch h = (Hatch)tr.GetObject(id, OpenMode.ForRead);
  21.                     Matrix3d mat = Matrix3d.PlaneToWorld(h.GetPlane());
  22.                     for (int i = 0; i < h.NumberOfLoops; i++)
  23.                     {
  24.                         HatchLoop loop = h.GetLoopAt(i);
  25.                         if (loop.IsPolyline)
  26.                         {
  27.                             BulgeVertexCollection bvs = loop.Polyline;
  28.                             Autodesk.AutoCAD.DatabaseServices.Polyline pl = new Autodesk.AutoCAD.DatabaseServices.Polyline();
  29.                             for (int j = 0; j < bvs.Count; j++)
  30.                             {
  31.                                 BulgeVertex bv = bvs[j];
  32.                                 pl.AddVertexAt(j, bv.Vertex, bv.Bulge, 0, 0);
  33.                             }
  34.                             pl.TransformBy(mat);
  35.                             btr.AppendEntity(pl);
  36.                             tr.AddNewlyCreatedDBObject(pl, true);
  37.                         }
  38.                         else
  39.                         {
  40.                             foreach (Curve2d curve in loop.Curves)
  41.                             {
  42.                                 Curve c = ConvertCurve.ToCurve(curve, mat);
  43.                                 btr.AppendEntity(c);
  44.                                 tr.AddNewlyCreatedDBObject(c, true);
  45.                             }
  46.                         }
  47.                     }
  48.                 }
  49.                 tr.Commit();
  50.             }
  51.         }
发表于 2009-9-21 22:43 | 显示全部楼层

没用过,看不明白

还请楼主多多指教

 楼主| 发表于 2010-1-13 18:33 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2014-8-26 20:44 编辑

试着用扩展方法重写了,调用起来确实很简单
 楼主| 发表于 2010-1-13 18:37 | 显示全部楼层
简单的示例,直接把飞诗的代码改写了
  1.         [CommandMethod("tt")]
  2.         public static void Test()
  3.         {
  4.             PromptEntityResult rt1 = Helper.Editor.GetEntity("\n选择曲线1:");
  5.             if (rt1.Status != PromptStatus.OK) return;
  6.             PromptEntityResult rt2 = Helper.Editor.GetEntity("\n选择曲线2:");
  7.             if (rt2.Status != PromptStatus.OK) return;
  8.             using (DBTransaction tr = new DBTransaction())
  9.             {
  10.                 Curve cv1 = rt1.ObjectId.GetObject<Curve>();
  11.                 if (cv1 == null) return;
  12.                 Curve cv2 = rt2.ObjectId.GetObject<Curve>();
  13.                 if (cv2 == null || cv1 == cv2) return;
  14.                
  15.                 Helper.Editor.WriteMessage("距离是:{0}", cv1.ToCurve3d().GetDistanceTo(cv2.ToCurve3d()));
  16.                 PointOnCurve3d[] pocs = cv1.ToCurve3d().GetClosestPointTo(cv2.ToCurve3d());
  17.                 Line l = new Line(pocs[0].Point, pocs[1].Point);
  18.                 tr.OpenCurrentSpace(OpenMode.ForWrite);
  19.                 tr.AddEntity(l);
  20.             }
  21.         }
发表于 2010-1-20 21:39 | 显示全部楼层

看不大明白!

版主能否解释一下什么是Ge库曲线和Db曲线,有什么区别和联系,分别用于什么场合?

发表于 2010-1-26 13:33 | 显示全部楼层

感谢楼主!

发表于 2010-6-9 23:31 | 显示全部楼层
看不太懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 14:59 , Processed in 0.552967 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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