找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 11738|回复: 66

[原创] 程序 喷淋覆盖率

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-22 15:21:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
讨论帖 http://bbs.xdcad.net/forum.php?m ... &extra=page%3D1

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.EditorInput;

  9. [assembly: CommandClass(typeof(PenLin.MyCommands))]

  10. namespace PenLin
  11. {
  12.     public class MyCommands
  13.     {
  14.         [CommandMethod("Penlin")]
  15.         public void PenLinArea()
  16.         {
  17.             Document doc = Application.DocumentManager.MdiActiveDocument;
  18.             Editor ed = doc.Editor;
  19.             Database db = doc.Database;
  20.             Transaction tr = db.TransactionManager.StartTransaction();
  21.             //选择圆
  22.             PromptEntityOptions peo = new PromptEntityOptions("\nPick curve");
  23.             peo.SetRejectMessage("\nOnly Circle!");
  24.             peo.AddAllowedClass(typeof(Circle), true);

  25.             PromptEntityResult per = ed.GetEntity(peo);
  26.             if (per.Status != PromptStatus.OK)
  27.             {
  28.                 return;
  29.             }
  30.             PromptDoubleResult pdr = ed.GetDistance("\nRadius");
  31.             if (pdr.Status != PromptStatus.OK) return;

  32.             double radius = pdr.Value;
  33.             ObjectId id = per.ObjectId;
  34.             using (tr)
  35.             {
  36.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  37.                 Curve cv = (Curve)id.GetObject(OpenMode.ForRead);
  38.                 Circle ccv = (Circle)cv;
  39.                 //判断质心在圆内
  40.                 CircularArc3d c3d = new CircularArc3d(ccv.Center, ccv.Normal, ccv.Radius);
  41.                 //构造 WP 选择点表
  42.                 PointOnCurve3d[] pts = cv.GetGeCurve().GetSamplePoints(0, cv.EndParam, Tolerance.Global.EqualPoint);
  43.                 Point3d[] npts = new Point3d[pts.Length];
  44.                 for (int i = 0; i < pts.Length; i++)
  45.                 {
  46.                     npts[i] = pts[i].Point;
  47.                 }
  48.                 Point3dCollection wpts = new Point3dCollection(npts);
  49.                 TypedValue[] filter = new TypedValue[1]
  50.                 {
  51.                     new TypedValue(0, "CIRCLE")
  52.                 };

  53.                 PromptSelectionResult psr = ed.SelectWindowPolygon(wpts, new SelectionFilter(filter));
  54.                 if (psr.Status != PromptStatus.OK) return;
  55.                 SelectionSet ss = psr.Value;
  56.                 ObjectId[] ids = ss.GetObjectIds();

  57.                 ObjectId[] clst = new ObjectId[ids.Length + 1];
  58.                 //圆心列表
  59.                 List<Point3d> cPoints = new List<Point3d>();

  60.                 for (int i = 0; i < ids.Length; i++)
  61.                 {
  62.                     Circle circle = (Circle)ids[i].GetObject(OpenMode.ForRead);
  63.                     Circle ncircle = new Circle(circle.Center, circle.Normal, radius);
  64.                     cPoints.Add(circle.Center);
  65.                     clst[i + 1] = btr.AppendEntity(ncircle);//先要加入数据库才可以进行交点断开
  66.                 }
  67.                 clst[0] = id;
  68.                 //对圆交点断开返回断开后的曲线集合
  69.                 List<Curve> ncvs = CurveBreakAtInters(clst);

  70.                 DBObjectCollection rCollection = new DBObjectCollection();
  71.                 for (int i = 0; i < ncvs.Count; i++)
  72.                 {
  73.                     rCollection.Add(ncvs[i]);
  74.                 }
  75.                 //由断开的曲线生成 Region
  76.                 DBObjectCollection regions = Region.CreateFromCurves(rCollection);
  77.                 /*
  78.                  * 删除最大Region,没有成功
  79.                 DBObject[] nrs = new DBObject[regions.Count];
  80.                 regions.CopyTo(nrs, 0);
  81.                 List<DBObject> lrs = nrs.ToList();
  82.                 lrs.OrderBy(r => ((Region)r).Area);
  83.                 */
  84.                 foreach (Region region in regions)
  85.                 {

  86.                     Point3d po = new Point3d();
  87.                     Vector3d vx = new Vector3d(1, 0, 0);
  88.                     Vector3d vy = new Vector3d(0, 1, 0);
  89.                     RegionAreaProperties ars = region.AreaProperties(ref po, ref vx, ref vy);
  90.                     Point2d cp = ars.Centroid;
  91.                     Point3d cp1 = new Point3d(cp.X, cp.Y, 0);
  92.                     //质心在圆外或者面积大于范围的丢弃
  93.                     if (!c3d.IsInside(cp1, Tolerance.Global) || region .Area > cv.Area )
  94.                     {
  95.                         region.Dispose();
  96.                     }
  97.                     else
  98.                     {
  99.                         ////*
  100.                         /// 判断质心在几个园内
  101.                         var quray = cPoints.Where(p => p.DistanceTo(cp1) < radius);

  102.                         int j = 0;
  103.                         foreach (var point3D in quray)
  104.                         {
  105.                             j++;
  106.                         }
  107.                         if (j > 1)
  108.                         {
  109.                             region.ColorIndex = j;
  110.                         }
  111.                         ////*/
  112.                         DBObjectCollection res = new DBObjectCollection();
  113.                         //Region要先加入 BlockTableRecord 才可以作为 HatchLoop
  114.                         ObjectId  ren = btr.AppendEntity(region);
  115.                         
  116.                         ObjectIdCollection   loopids = new ObjectIdCollection( );
  117.                         loopids.Add(ren);
  118.                         Hatch hatch = new Hatch();

  119.                         hatch.SetHatchPattern(HatchPatternType.PreDefined, "solid");
  120.                         hatch.Associative = false;
  121.                         hatch.ColorIndex = j; ;
  122.                         btr.AppendEntity(hatch);
  123.                         tr.AddNewlyCreatedDBObject(hatch, true);
  124.                         tr.AddNewlyCreatedDBObject(region, true);
  125.                         //HatchLoop 需要 Loop 都加入 btr并显示时才可以 AppendLoodp
  126.                         hatch.AppendLoop(HatchLoopTypes.Outermost, loopids );
  127.                         hatch.EvaluateHatch(true);//重新计算 Hatch
  128.                     }

  129.                 }
  130.                 //断开的曲线没用了,删除
  131.                 for (int i = 1; i < clst.Length; i++)
  132.                 {
  133.                     Entity ent = (Entity)clst[i].GetObject(OpenMode.ForWrite);
  134.                     ent.Erase();
  135.                 }
  136.                 tr.Commit();
  137.             }
  138.         }
  139.         /// <summary>
  140.         /// 曲线集交点断开
  141.         /// </summary>
  142.         /// <param name="curves">List<Curve></param>
  143.         /// <returns>DBObjectCollection</returns>
  144.         private static DBObjectCollection CreatRegions(List<Curve> curves)
  145.         {
  146.             DBObjectCollection cvs = new DBObjectCollection();
  147.             for (int i = 0; i < curves.Count; i++)
  148.             {
  149.                 cvs.Add(curves[i]);
  150.             }
  151.             return Region.CreateFromCurves(cvs);
  152.         }
  153.         private static List<Curve> CurveBreakAtInters(ObjectId[] ssbrk)
  154.         {
  155.             List<Curve> ret = new List<Curve>();
  156.             Dictionary<Curve, List<double>> objpts;
  157.             objpts = new Dictionary<Curve, List<double>>(ssbrk.Length);
  158.             Curve[] cvs = new Curve[ssbrk.Length];
  159.             for (int i = ssbrk.Length - 1; i > -1; i--)
  160.             {
  161.                 Curve cv = ssbrk[i].GetObject(OpenMode.ForWrite) as Curve;
  162.                 cvs[i] = cv;
  163.                 objpts.Add(cv, new List<double>());
  164.             }

  165.             for (int cur = ssbrk.Count() - 1; cur > -1; cur--)
  166.             {
  167.                 Curve cv1 = cvs[cur];
  168.                 List<double> cv1ps = objpts[cv1];
  169.                 for (int n = cur - 1; n > -1; n--)
  170.                 {
  171.                     Curve cv2 = cvs[n];
  172.                     List<double> cv2ps = objpts[cv2];
  173.                     Point3dCollection points = new Point3dCollection();
  174.                     cv1.IntersectWith(cv2, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
  175.                     foreach (Point3d pt in points)
  176.                     {
  177.                         cv1ps.Add(cv1.GetParameterAtPoint(pt));
  178.                         cv2ps.Add(cv2.GetParameterAtPoint(pt));
  179.                     }
  180.                 }
  181.             }
  182.             foreach (KeyValuePair<Curve, List<double>> var in objpts)
  183.             {
  184.                 Curve cv = var.Key;
  185.                 if (var.Value.Count == 0) //没有交点
  186.                 {
  187.                     continue;
  188.                 }
  189.                 else
  190.                 {
  191.                     if (var.Value.Count == 1 && cv.IsPeriodic && cv.IsPersistent)
  192.                     {
  193.                         continue;
  194.                     }
  195.                     var.Value.Sort();
  196.                     double[] arrpt = new double[var.Value.Count];
  197.                     var.Value.CopyTo(arrpt);
  198.                     DoubleCollection pts = new DoubleCollection(arrpt);
  199.                     DBObjectCollection objs = cv.GetSplitCurves(pts);
  200.                     foreach (DBObject dbobj in objs)
  201.                     {
  202.                         Curve brks = (Curve)dbobj;
  203.                         if (cv.GetDistanceAtParameter(brks.EndParam) > 1e-6)
  204.                         {
  205.                             ret.Add(brks);
  206.                         }
  207.                     }
  208.                 }
  209.             }
  210.             return ret;
  211.         }
  212.     }
  213. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-26 08:14:00 | 显示全部楼层
本帖最后由 csharp 于 2014-8-26 08:39 编辑
雪山飞狐(lzh) 发表于 2014-8-25 22:42
还有一种Bug。。。
如果对一堆曲线 反复打断的话 第一次正常,第二次出现0长度直线 第三次挂掉,,,

这回测试 Ok,只不过对闭合曲线处理不如 DB 的 GetSplitCurves 完美,起点作为了一个交点,生成了两段,另外可以判断长度,为 0 的不进行处理

感觉转 Ge 断开效率要高

20140826081648.jpg
20140826081914.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

发表于 2014-8-23 10:28:57 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2014-8-23 10:31 编辑

打断曲线的部分 我记得以前直接打断DB库的Curve有些曲线的交点有误
我是先转换成GeCompositeCurve3d再打断,最后生成DBCurve的

  1. public static List<Curve> BreakCurve(ref List<Curve> curves)
  2.         {
  3.             List<CompositeCurve3d> geCurves = new List<CompositeCurve3d>();
  4.             List<List<double>> paramss = new List<List<double>>();
  5.             for (int i = 0; i < curves.Count; i++)
  6.             {
  7.                 geCurves.Add(curves.ToCompositeCurve3d());
  8.                 paramss.Add(new List<double>());
  9.             }

  10.             List<Curve> oldCurves = new List<Curve>();
  11.             List<Curve> newCurves = new List<Curve>();
  12.             CurveCurveIntersector3d cci3d = new CurveCurveIntersector3d();

  13.             for (int i = 0; i < curves.Count; i++)
  14.             {
  15.                 CompositeCurve3d gc1 = geCurves;
  16.                 List<double> pars1 = paramss;
  17.                 for (int j = i; j < curves.Count; j++)
  18.                 {
  19.                     CompositeCurve3d gc2 = geCurves[j];
  20.                     List<double> pars2 = paramss[j];

  21.                     cci3d.Set(gc1, gc2, Vector3d.ZAxis);

  22.                     for (int k = 0; k < cci3d.NumberOfIntersectionPoints; k++)
  23.                     {
  24.                         double[] pars = cci3d.GetIntersectionParameters(k);
  25.                         pars1.Add(pars[0]);
  26.                         pars2.Add(pars[1]);
  27.                     }
  28.                 }

  29.                 if (pars1.Count > 0)
  30.                 {

  31.                     List<CompositeCurve3d> c3ds = gc1.GetSplitCurves(pars1);
  32.                     if (c3ds.Count > 1)
  33.                     {
  34.                         foreach (CompositeCurve3d c3d in c3ds)
  35.                         {
  36.                             Curve c = c3d.ToCurve();
  37.                             c.SetPropertiesFrom(curves);
  38.                             newCurves.Add(c);
  39.                         }
  40.                         oldCurves.Add(curves);
  41.                     }
  42.                 }
  43.             }
  44.             curves = oldCurves;
  45.             return newCurves;
  46.         }


  1. public static List<CompositeCurve3d> GetSplitCurves(this CompositeCurve3d c3d, List<double> pars)
  2.         {
  3.             Interval inter = c3d.GetInterval();
  4.             Curve3d[] c3ds = c3d.GetCurves();

  5.             if (c3ds.Length == 1 && c3ds[0].IsCircular())
  6.             {
  7.                 pars.Sort();
  8.                 pars.Add(pars[0]);
  9.             }
  10.             else
  11.             {
  12.                 if (!pars.Contains(inter.LowerBound))
  13.                     pars.Add(inter.LowerBound);
  14.                 if (!pars.Contains(inter.UpperBound))
  15.                     pars.Add(inter.UpperBound);
  16.                 pars.Sort();
  17.             }

  18.             List<CompositeCurve3d> curves = new List<CompositeCurve3d>();
  19.             for (int i = 0; i < pars.Count - 1; i++)
  20.             {
  21.                 List<Curve3d> cc3ds = new List<Curve3d>();
  22.                 if (pars != pars[i + 1])
  23.                 {
  24.                     CompositeParameter cp1 = c3d.GlobalToLocalParameter(pars);
  25.                     CompositeParameter cp2 = c3d.GlobalToLocalParameter(pars[i + 1]);
  26.                     if (cp1.SegmentIndex == cp2.SegmentIndex)
  27.                     {
  28.                         cc3ds.Add(
  29.                             c3ds[cp1.SegmentIndex].GetSubCurve(
  30.                                 cp1.LocalParameter,
  31.                                 cp2.LocalParameter));
  32.                     }
  33.                     else
  34.                     {
  35.                         inter = c3ds[cp1.SegmentIndex].GetInterval();
  36.                         cc3ds.Add(
  37.                             c3ds[cp1.SegmentIndex].GetSubCurve(
  38.                                 cp1.LocalParameter,
  39.                                 inter.UpperBound));

  40.                         for (int j = cp1.SegmentIndex + 1; j < cp2.SegmentIndex; j++)
  41.                         {
  42.                             cc3ds.Add((Curve3d)c3ds[j].Clone());
  43.                         }

  44.                         inter = c3ds[cp2.SegmentIndex].GetInterval();
  45.                         cc3ds.Add(
  46.                             c3ds[cp2.SegmentIndex].GetSubCurve(
  47.                                 inter.LowerBound,
  48.                                 cp2.LocalParameter));

  49.                     }

  50.                     curves.Add(new CompositeCurve3d(cc3ds.ToArray()));

  51.                 }
  52.             }

  53.             return curves;

  54.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-23 10:35:47 | 显示全部楼层
  1. public static bool IsCircular(this Curve3d curve)
  2.         {

  3.             if (curve is CircularArc3d || curve is EllipticalArc3d)
  4.             {
  5.                 return curve.IsClosed();
  6.             }
  7.             return false;

  8.         }

  9.         public static List<double> GetParamsAtIntersectionPoints(this Curve3d c3d)
  10.         {
  11.             CurveCurveIntersector3d cci = new CurveCurveIntersector3d(c3d, c3d, Vector3d.ZAxis);
  12.             List<double> pars = new List<double>();
  13.             for (int i = 0; i < cci.NumberOfIntersectionPoints; i++)
  14.             {
  15.                 pars.AddRange(cci.GetIntersectionParameters(i));
  16.             }
  17.             pars.Sort();
  18.             return pars;
  19.         }

  20.         public static Curve3d GetSubCurve(this Curve3d curve, double from, double to)
  21.         {
  22.             if (curve is NurbCurve3d)
  23.             {

  24.                 NurbCurve3d nc3d = (NurbCurve3d)curve.Clone();
  25.                 Interval inter = curve.GetInterval();

  26.                 bool atStart = inter.LowerBound == from;
  27.                 bool atEnd = inter.UpperBound == to;

  28.                 if (atStart && atEnd)
  29.                 {
  30.                     return nc3d;
  31.                 }
  32.                 else if (atStart)
  33.                 {
  34.                     Curve3d[] cs = nc3d.GetSplitCurves(to);
  35.                     NurbCurve3d c = (NurbCurve3d)cs[0];
  36.                     return c;
  37.                 }
  38.                 else if (atEnd)
  39.                 {
  40.                     Curve3d[] cs = nc3d.GetSplitCurves(from);
  41.                     NurbCurve3d c = (NurbCurve3d)cs[1];
  42.                     return c;
  43.                 }
  44.                 else
  45.                 {
  46.                     Curve3d[] cs = nc3d.GetSplitCurves(to);
  47.                     NurbCurve3d c = (NurbCurve3d)cs[0];
  48.                     c.MakePeriodic();
  49.                     cs = c.GetSplitCurves(from);
  50.                     return cs[1];
  51.                 }
  52.             }
  53.             else
  54.             {
  55.                 Curve3d c3d = (Curve3d)curve.Clone();
  56.                 c3d.SetInterval(new Interval(from, to, 0));
  57.                 return c3d;
  58.             }
  59.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-23 10:45:26 | 显示全部楼层
可能 Spline 化的 Pline 会有问题,用 xdrxapi 时遇到过,Ge 的 GetSplitCurves 只接受一个 Pam 不如 DB 的方便
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-23 10:50:33 | 显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-8-23 10:53 编辑

我上面的
public static List<CompositeCurve3d> GetSplitCurves(this CompositeCurve3d c3d, List<double> pars)
可以接受N个param 呵呵

另外 我说的面域边数应该是用brep库的相关类

点评

还差 ToCompositeCurve3d 和 ToCurve  详情 回复 发表于 2014-8-23 11:35
我试试你这个看效率能提高吗  详情 回复 发表于 2014-8-23 10:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-23 10:53:18 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-23 10:50
我上面的
public static List GetSplitCurves(this CompositeCurve3d c3d, List pars)
可以接受N个param  ...

我试试你这个看效率能提高吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-23 11:35:13 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-23 10:50
我上面的
public static List GetSplitCurves(this CompositeCurve3d c3d, List pars)
可以接受N个param  ...

还差 ToCompositeCurve3d 和 ToCurve
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-23 11:36:36 | 显示全部楼层
另外 Cad的集合转换 我一般是直接写成函数调用

  1. public static ObjectIdCollection ToCollection(this IEnumerable<ObjectId> ids)
  2.         {
  3.             ObjectIdCollection idCol = new ObjectIdCollection();
  4.             foreach (ObjectId id in ids)
  5.                 idCol.Add(id);
  6.             return idCol;
  7.         }

  8.         public static DBObjectCollection ToCollection<T>(this IEnumerable<T> objs) where T : DBObject
  9.         {
  10.             DBObjectCollection objCol = new DBObjectCollection();
  11.             foreach (T obj in objs)
  12.                 objCol.Add(obj);
  13.             return objCol;
  14.         }

  15.         public static DoubleCollection ToCollection(this IEnumerable<double> doubles)
  16.         {
  17.             DoubleCollection doubleCol = new DoubleCollection();
  18.             foreach (double d in doubles)
  19.                 doubleCol.Add(d);
  20.             return doubleCol;
  21.         }

  22.         public static Point2dCollection ToCollection(this IEnumerable<Point2d> pts)
  23.         {
  24.             Point2dCollection ptCol = new Point2dCollection();
  25.             foreach (Point2d pt in pts)
  26.                 ptCol.Add(pt);
  27.             return ptCol;
  28.         }

  29.         public static Point3dCollection ToCollection(this IEnumerable<Point3d> pts)
  30.         {
  31.             Point3dCollection ptCol = new Point3dCollection();
  32.             foreach (Point3d pt in pts)
  33.                 ptCol.Add(pt);
  34.             return ptCol;
  35.         }


反向的转换就不用了
用Linq的Cast
比如ObjectIdCollection到List<ObjectId>
            ids.Cast<ObjectId>().ToList();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-23 11:39:17 | 显示全部楼层
0.0 2014直接由GetGe/DbCurve

  1. public static CompositeCurve3d ToCompositeCurve3d(this Curve curve)
  2.         {
  3.             if (curve is Line)
  4.             {
  5.                 return
  6.                     new CompositeCurve3d(
  7.                         new Curve3d[] { ToCurve3d((Line)curve) });
  8.             }
  9.             else if (curve is Circle)
  10.             {
  11.                 return
  12.                     new CompositeCurve3d(
  13.                         new Curve3d[] { ToCurve3d((Circle)curve) });
  14.             }
  15.             else if (curve is Arc)
  16.             {
  17.                 return
  18.                     new CompositeCurve3d(
  19.                         new Curve3d[] { ToCurve3d((Arc)curve) });
  20.             }
  21.             else if (curve is Ellipse)
  22.             {
  23.                 return
  24.                     new CompositeCurve3d(
  25.                         new Curve3d[] { ToCurve3d((Ellipse)curve) });
  26.             }
  27.             else if (curve is Polyline)
  28.             {
  29.                 return ToCurve3d((Polyline)curve);
  30.             }
  31.             else if (curve is Polyline2d)
  32.             {
  33.                 Polyline2d pl2d = (Polyline2d)curve;
  34.                 switch (pl2d.PolyType)
  35.                 {
  36.                     case Poly2dType.SimplePoly:
  37.                         return
  38.                             new CompositeCurve3d(
  39.                                 new Curve3d[] { ToPolylineCurve3d(pl2d) });
  40.                     case Poly2dType.FitCurvePoly:
  41.                         Polyline pl = new Polyline();
  42.                         pl.ConvertFrom(pl2d, false);
  43.                         return ToCurve3d(pl);
  44.                     case Poly2dType.QuadSplinePoly:
  45.                     case Poly2dType.CubicSplinePoly:
  46.                         return
  47.                             new CompositeCurve3d(
  48.                                 new Curve3d[] { ToNurbCurve3d(pl2d) });
  49.                 }
  50.             }
  51.             else if (curve is Polyline3d)
  52.             {
  53.                 Polyline3d pl3d = (Polyline3d)curve;
  54.                 switch (pl3d.PolyType)
  55.                 {
  56.                     case Poly3dType.SimplePoly:
  57.                         return
  58.                             new CompositeCurve3d(
  59.                                 new Curve3d[] { ToPolylineCurve3d(pl3d) });
  60.                     case Poly3dType.QuadSplinePoly:
  61.                     case Poly3dType.CubicSplinePoly:
  62.                         return
  63.                             new CompositeCurve3d(
  64.                                 new Curve3d[] { ToNurbCurve3d(pl3d) });
  65.                 }
  66.             }
  67.             else if (curve is Spline)
  68.             {
  69.                 return
  70.                     new CompositeCurve3d(
  71.                         new Curve3d[] { ToCurve3d((Spline)curve) });
  72.             }

  73.             return null;
  74.         }

点评

在 2014 上测试这个 Ge 打断, 遇到闭合 Spline 直接把 CAD 干掉了 BreakCurves 中用 GetGeCurve 代替 ToCurve3d  详情 回复 发表于 2014-8-23 21:19
内容太多,需要慢慢消化下  详情 回复 发表于 2014-8-23 11:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-23 11:49:35 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-23 11:39
0.0 2014直接由GetGe/DbCurve

内容太多,需要慢慢消化下
什么时候把你那个库升级到 14 15 啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-23 21:19:49 | 显示全部楼层
本帖最后由 csharp 于 2014-8-23 21:22 编辑
雪山飞狐(lzh) 发表于 2014-8-23 11:39
0.0 2014直接由GetGe/DbCurve

在 2014 上测试这个 Ge 打断, 遇到闭合 Spline 直接把 CAD 干掉了,其它曲线正常也很快

  1. using System.Collections.Generic;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;


  6. [assembly: CommandClass(typeof(GeCurvesBreak.MyCommands))]

  7. namespace GeCurvesBreak
  8. {
  9.     public class MyCommands
  10.     {
  11.         [CommandMethod("Breakss")]
  12.         public void CurvesIntersecBreak()
  13.         {
  14.             Document doc = Application.DocumentManager.MdiActiveDocument;
  15.             Editor ed = doc.Editor;
  16.             Database db = doc.Database;
  17.             Transaction tr = db.TransactionManager.StartTransaction();

  18.             PromptSelectionOptions pso = new PromptSelectionOptions();
  19.             pso.MessageForAdding = "\n选择曲线";
  20.             PromptSelectionResult psr = ed.GetSelection(pso,
  21.                 new SelectionFilter(new TypedValue[] { new TypedValue(0, "arc,circle,ellipse,*line") }));
  22.             if (psr.Status != PromptStatus.OK) return;
  23.             SelectionSet ss = psr.Value;
  24.             ObjectId[] ids = ss.GetObjectIds();
  25.             using (tr)
  26.             {
  27.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  28.                 List<Curve> cvs = new List<Curve>();
  29.                 for (int i = 0; i < ids.Length; i++)
  30.                 {
  31.                     cvs.Add((Curve)ids[i].GetObject(OpenMode.ForRead));
  32.                 }
  33.                 List<Curve> ncvs = CurveEx.BreakCurve(ref cvs);
  34.                 for (int i = 0; i < ncvs.Count; i++)
  35.                 {
  36.                     btr.AppendEntity(ncvs[i]);
  37.                     tr.AddNewlyCreatedDBObject(ncvs[i], true);
  38.                 }
  39.                 foreach (Curve curve in cvs)
  40.                 {
  41.                     curve.UpgradeOpen();
  42.                     curve.Erase();
  43.                 }
  44.                 tr.Commit();
  45.             }
  46.         }
  47.     }
  48. }

BreakCurves 中用 GetGeCurve 代替 ToCurve3d

  1.         public static List<Curve> BreakCurve(ref List<Curve> curves)
  2.         {
  3.             List<CompositeCurve3d> geCurves = new List<CompositeCurve3d>();
  4.             List<List<double>> paramss = new List<List<double>>();
  5.             for (int i = 0; i < curves.Count; i++)
  6.             {
  7.                 geCurves.Add(new CompositeCurve3d(new []{ curves[i].GetGeCurve( )}));
  8.                 paramss.Add(new List<double>());
  9.             }
  10.             List<Curve> oldCurves = new List<Curve>();
  11.             List<Curve> newCurves = new List<Curve>();
  12.             CurveCurveIntersector3d cci3d = new CurveCurveIntersector3d();
  13.             for (int i = 0; i < curves.Count; i++)
  14.             {
  15.                 CompositeCurve3d gc1 = geCurves[i];
  16.                 List<double> pars1 = paramss[i];
  17.                 for (int j = i; j < curves.Count; j++)
  18.                 {
  19.                     CompositeCurve3d gc2 = geCurves[j];
  20.                     List<double> pars2 = paramss[j];
  21.                     cci3d.Set(gc1, gc2, Vector3d.ZAxis);
  22.                     for (int k = 0; k < cci3d.NumberOfIntersectionPoints; k++)
  23.                     {
  24.                         double[] pars = cci3d.GetIntersectionParameters(k);
  25.                         pars1.Add(pars[0]);
  26.                         pars2.Add(pars[1]);
  27.                     }
  28.                 }
  29.                 if (pars1.Count > 0)
  30.                 {
  31.                     List<CompositeCurve3d> c3ds = gc1.GetSplitCurves(pars1);
  32.                     if (c3ds.Count > 1)
  33.                     {
  34.                         foreach (CompositeCurve3d c3d in c3ds)
  35.                         {
  36.                             Curve c = Curve.CreateFromGeCurve(c3d);
  37.                             c.SetPropertiesFrom(curves[i]);
  38.                             newCurves.Add(c);
  39.                         }
  40.                         oldCurves.Add(curves[i]);
  41.                     }
  42.                 }
  43.             }
  44.             curves = oldCurves;
  45.             return newCurves;
  46.         }
复制代码


另外 C#  代码用 [ code ] [/ code] 才能保持原样,不然 代码中 [ i ] 可能都隐掉了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-23 21:51:05 来自手机 | 显示全部楼层
我的2008测试倒不会挂 但是闭合spl会少掉一部分 以前高飞也说过我的曲线转换类有点小bug 呵呵 =忙过这阵仔细看看

点评

只要有 Spline 就会挂掉,其它 Line Circle Ellipse Pline Arc 测试都正常,再找找是哪段出错的  详情 回复 发表于 2014-8-23 22:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-23 21:51:05 来自手机 | 显示全部楼层
我的2008测试倒不会挂 但是闭合spl会少掉一部分 以前高飞也说过我的曲线转换类有点小bug 呵呵 =忙过这阵仔细看看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-23 22:10:10 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-23 21:51
我的2008测试倒不会挂 但是闭合spl会少掉一部分 以前高飞也说过我的曲线转换类有点小bug 呵呵 =忙过这阵仔 ...

只要有 Spline 就会挂掉,其它 Line Circle Ellipse Pline Arc 测试都正常,再找找是哪段出错的

点评

看看,要保证点在SPLINE上,并且不是端点。  详情 回复 发表于 2014-8-24 21:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-23 22:34:12 来自手机 | 显示全部楼层
这个代码写的有点早了。。。现在再看有有点陌生了 而且估计还是第一版。。。后面的版本都不知到哪去了 过了这段时间我再看吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 16:54 , Processed in 0.434574 second(s), 72 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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