找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: csharp

[原创] 程序 喷淋覆盖率

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-28 23:21:18 来自手机 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-28 22:33
如果画一条开口spl 再强行将起点终点合在一起 我这里测试会出问题 改成这样正常



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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-29 07:47:18 | 显示全部楼层
本帖最后由 csharp 于 2014-8-29 07:48 编辑
雪山飞狐(lzh) 发表于 2014-8-28 22:33
如果画一条开口spl 再强行将起点终点合在一起 我这里测试会出问题 改成这样正常

经测试 2014 上 Circle Ellipse 都可以了,不过有个问题是不是没有优化,对交点仅是 起点、终点 的 返回 Clone,这样重新 ToCurve 就没有必要了

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-29 10:32:56 | 显示全部楼层
在用 AcDbArc 进行 GetSplitCurves 时,有几个问题会导致程序异常

1 求得交点后再用 GetParameterAtPoint(pt) 求得的如果是 EndParam, 有可能比源 Arc.EndParam 大一点点

2 如果有重复交点时就可能产生重复参数,这是 SplitCurves 就会异常,可能 CAD 允许有 0 长度 Line Polyline Spline ,不允许有 0 长度 Arc,Ellipse可能也是如此
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-29 11:25:39 来自手机 | 显示全部楼层
重复参数我的代码应该消除了 交点在起点终点的问题我记得代码有去除的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-29 11:36:06 | 显示全部楼层
本帖最后由 csharp 于 2014-8-29 11:37 编辑

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

使用道具 举报

发表于 2014-8-29 11:53:31 来自手机 | 显示全部楼层
这个代码里面有去除吧? 不过圆可能有这个问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-29 16:35:50 | 显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-8-29 19:02 编辑

应该是最终版了吧,,,基本修正了Bug 封闭曲线起点断开的问题也解决了
  1. public static bool IsEqual(this Tolerance tol,double d1, double d2)
  2.         {
  3.             return Math.Abs(d1 - d2) < tol.EqualPoint;
  4.         }

  5.         public static List<CompositeCurve3d> GetSplitCurves(this CompositeCurve3d c3d, List<double> pars)
  6.         {
  7.             Interval inter = c3d.GetInterval();
  8.             Curve3d[] c3ds = c3d.GetCurves();

  9.             pars.Sort();

  10.             for (int i = pars.Count - 1; i > 0; i--)
  11.             {
  12.                 if (Tolerance.Global.IsEqual(pars[i],pars[i - 1]))
  13.                     pars.RemoveAt(i);
  14.             }


  15.             if (pars.Count == 0)
  16.                 return new List<CompositeCurve3d>();

  17.             if (c3ds.Length == 1 && c3ds[0].IsClosed())
  18.             {
  19.                 //闭合曲线不允许打断于一点
  20.                 if (pars.Count > 1)
  21.                 {
  22.                     //如果包含起点
  23.                     if (Tolerance.Global.IsEqual(pars[0], inter.LowerBound))
  24.                     {
  25.                         pars[0] = inter.LowerBound;
  26.                         //又包含终点,去除终点
  27.                         if (Tolerance.Global.IsEqual(pars[pars.Count - 1], inter.UpperBound))
  28.                         {
  29.                             pars.RemoveAt(pars.Count - 1);
  30.                             if (pars.Count == 1)
  31.                                 return new List<CompositeCurve3d>();
  32.                         }
  33.                     }
  34.                     else if (Tolerance.Global.IsEqual(pars[pars.Count - 1], inter.UpperBound))
  35.                     {
  36.                         pars[pars.Count - 1] = inter.UpperBound;
  37.                     }

  38.                     //加入第一点以支持反向打断
  39.                     pars.Add(pars[0]);

  40.                 }
  41.                 else
  42.                 {
  43.                     return new List<CompositeCurve3d>();
  44.                 }
  45.             }
  46.             else
  47.             {
  48.                 //非闭合曲线加入起点和终点
  49.                 if (Tolerance.Global.IsEqual(pars[0], inter.LowerBound))
  50.                     pars[0] = inter.LowerBound;
  51.                 else
  52.                     pars.Insert(0, inter.LowerBound);

  53.                 if (Tolerance.Global.IsEqual(pars[pars.Count - 1], inter.UpperBound))
  54.                     pars[pars.Count - 1] = inter.UpperBound;
  55.                 else
  56.                     pars.Add(inter.UpperBound);
  57.             }
  58.          
  59.          
  60.             List<CompositeCurve3d> curves = new List<CompositeCurve3d>();
  61.             for (int i = 0; i < pars.Count - 1; i++)
  62.             {
  63.                 List<Curve3d> cc3ds = new List<Curve3d>();

  64.                 //复合曲线参数转换到包含曲线参数
  65.                 CompositeParameter cp1 = c3d.GlobalToLocalParameter(pars[i]);
  66.                 CompositeParameter cp2 = c3d.GlobalToLocalParameter(pars[i + 1]);
  67.                 if (cp1.SegmentIndex == cp2.SegmentIndex)
  68.                 {
  69.                     cc3ds.Add(
  70.                         c3ds[cp1.SegmentIndex].GetSubCurve(
  71.                             cp1.LocalParameter,
  72.                             cp2.LocalParameter));
  73.                 }
  74.                 else
  75.                 {
  76.                     inter = c3ds[cp1.SegmentIndex].GetInterval();
  77.                     cc3ds.Add(
  78.                         c3ds[cp1.SegmentIndex].GetSubCurve(
  79.                             cp1.LocalParameter,
  80.                             inter.UpperBound));

  81.                     for (int j = cp1.SegmentIndex + 1; j < cp2.SegmentIndex; j++)
  82.                     {
  83.                         cc3ds.Add((Curve3d)c3ds[j].Clone());
  84.                     }

  85.                     inter = c3ds[cp2.SegmentIndex].GetInterval();
  86.                     cc3ds.Add(
  87.                         c3ds[cp2.SegmentIndex].GetSubCurve(
  88.                             inter.LowerBound,
  89.                             cp2.LocalParameter));

  90.                 }
  91.                 curves.Add(new CompositeCurve3d(cc3ds.ToArray()));

  92.             }

  93.             if (c3d.IsClosed() && c3ds.Length > 1)
  94.             {
  95.                 var cs = curves[curves.Count - 1].GetCurves().ToList();
  96.                 cs.AddRange(curves[0].GetCurves());
  97.                 curves[curves.Count - 1] = new CompositeCurve3d(cs.ToArray());
  98.                 curves.RemoveAt(0);
  99.             }

  100.             return curves;

  101.         }

  1. public static Curve3d GetSubCurve(this Curve3d curve, double from, double to)
  2.         {

  3.             Interval inter = curve.GetInterval();
  4.             bool atStart = Tolerance.Global.IsEqual(inter.LowerBound, from);
  5.             bool atEnd = Tolerance.Global.IsEqual(inter.UpperBound, to);

  6.             if (atStart && atEnd)
  7.                 return (Curve3d)curve.Clone();

  8.             if (curve is NurbCurve3d)
  9.             {
  10.                
  11.                 if (from < to)
  12.                 {

  13.                     NurbCurve3d clone = (NurbCurve3d)curve.Clone();
  14.                     if (atStart || atEnd)
  15.                     {
  16.                         clone.HardTrimByParams(from, to);
  17.                         return clone;
  18.                     }
  19.                     else
  20.                     {
  21.                         clone.HardTrimByParams(inter.LowerBound, to);
  22.                         clone.HardTrimByParams(from, to);
  23.                         return clone;
  24.                     }

  25.                 }
  26.                 else
  27.                 {
  28.                     NurbCurve3d clone1 = (NurbCurve3d)curve.Clone();
  29.                     clone1.HardTrimByParams(from, inter.UpperBound);
  30.                     NurbCurve3d clone2 = (NurbCurve3d)curve.Clone();
  31.                     clone2.HardTrimByParams(inter.LowerBound, to);
  32.                     clone1.JoinWith(clone2);
  33.                     return clone1;
  34.                 }

  35.             }
  36.             else
  37.             {
  38.                 Curve3d clone = (Curve3d)curve.Clone();
  39.                 clone.SetInterval(new Interval(from, to, 0));
  40.                 return clone;
  41.             }
  42.         }

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

使用道具 举报

发表于 2014-8-29 16:39:15 | 显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-8-29 19:04 编辑
  1. /// <summary>
  2.         /// 转换GeCompositeCurve3d为Db曲线
  3.         /// </summary>
  4.         /// <param name="curve">GeCompositeCurve3d</param>
  5.         /// <returns>Db曲线</returns>
  6.         public static Curve ToCurve(this CompositeCurve3d curve)
  7.         {
  8.             Curve3d[] cs = curve.GetCurves();
  9.             if (cs.Length == 0)
  10.             {
  11.                 return null;
  12.             }
  13.             else if (cs.Length == 1)
  14.             {
  15.                 return ToCurve(cs[0]);
  16.             }
  17.             else
  18.             {
  19.                 if (cs[0] is NurbCurve3d)
  20.                 {
  21.                     NurbCurve3d nc3d = (NurbCurve3d)cs[0];
  22.                     for (int i = 1; i < cs.Length; i++)
  23.                         nc3d.JoinWith((NurbCurve3d)cs[i]);
  24.                     return ToCurve(nc3d);
  25.                 }
  26.                 else
  27.                 {
  28.                     return ToPolyline(curve);
  29.                 }
  30.             }

  31.         }




  32. public static NurbCurve3d ToCurve3d(this Spline spl)
  33.         {
  34.             NurbCurve3d nc3d;
  35.             NurbsData ndata = spl.NurbsData;
  36.             KnotCollection knots = new KnotCollection();
  37.             foreach (Double knot in ndata.GetKnots())
  38.                 knots.Add(knot);
  39.             if (ndata.Rational)
  40.             {
  41.                 nc3d =
  42.                     new NurbCurve3d(
  43.                         ndata.Degree,
  44.                         knots,
  45.                         ndata.GetControlPoints(),
  46.                         ndata.GetWeights(),
  47.                         ndata.Periodic);
  48.             }
  49.             else
  50.             {
  51.                 nc3d =
  52.                     new NurbCurve3d(
  53.                         ndata.Degree,
  54.                         knots,
  55.                         ndata.GetControlPoints(),
  56.                         ndata.Periodic);
  57.             }
  58.             if (spl.HasFitData)
  59.             {
  60.                 var fdata = spl.FitData;
  61.                 var vec = new Vector3d();
  62.                 if (fdata.TangentsExist && (fdata.StartTangent != vec || fdata.EndTangent != vec))
  63.                     nc3d.SetFitData(fdata.GetFitPoints(), fdata.StartTangent, fdata.EndTangent);
  64.             }
  65.             return nc3d;

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-29 16:45:20 | 显示全部楼层
一堆圆,断开,正常,再选再断开,有时能把 CAD 挂掉,原因查找中

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-29 17:15:48 | 显示全部楼层
本帖最后由 csharp 于 2014-8-29 17:19 编辑

VS 2012  Net 4.0 (2014) 这句编译不过去
            else if (cs.Length == 1)
            {
                return ToCurve((cs[0]);
            }
20140829171854.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-29 17:39:33 来自手机 | 显示全部楼层
这个函数你直接用createfromgecurve代替吧 估计还有点bug 晚上改

点评

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-29 18:26:39 来自手机 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-29 17:39
这个函数你直接用createfromgecurve代替吧 估计还有点bug 晚上改

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

使用道具 举报

发表于 2014-8-29 19:05:41 | 显示全部楼层
GetSplitCurves的Bug 上面的代码已修正

点评

改进的用 Db 曲线直接操作,目前测试还没有发现问题  详情 回复 发表于 2014-8-29 20:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-29 20:40:21 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-29 19:05
GetSplitCurves的Bug 上面的代码已修正

改进的用 Db 曲线直接操作,目前测试还没有发现问题

  1.         /// <summary>
  2.         /// 曲线集交点断开
  3.         /// </summary>
  4.         /// <param name="curves">List<Curve></param>
  5.         /// <returns>DBObjectCollection</returns>
  6.         private static List<Curve> CurveBreakAtInters(Curve[] cvs)
  7.         {
  8.             int tol = cvs.Length;
  9.             List<Curve> ret = new List<Curve>();//新曲线
  10.             List<List<double>> pamss = new List<List<double>>(tol);//每个曲线上交点参数
  11.             //List<Extents3d> extss = new List<Extents3d>(tol);//包围盒
  12.             for (int i = tol - 1; i > -1; i--)
  13.             {
  14.                 pamss.Add(new List<double>());
  15.                 //extss.Add(cvs[i].GeometricExtents);
  16.             }
  17.             for (int cur = tol - 1; cur > -1; cur--)
  18.             {
  19.                 Curve cv1 = cvs[cur];
  20.                 List<double> cv1ps = pamss[cur];
  21.                 //Extents3d ext1 = extss[cur];
  22.                 for (int n = cur - 1; n > -1; n--)
  23.                 {
  24.                     Curve cv2 = cvs[n];
  25.                     //Extents3d ext2 = extss[n];
  26.                     List<double> cv2ps = pamss[n];
  27.                     Point3dCollection points = new Point3dCollection();
  28.                     //if (RectIntersects(ext1, ext2) || RectIntersects(ext2, ext1))//包围盒相交的才求交点
  29.                     using (points)
  30.                     {
  31.                         cv1.IntersectWith(cv2, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
  32.                         foreach (Point3d pt in points)
  33.                         {
  34.                             cv1ps.Add(cv1.GetParameterAtPoint(pt));
  35.                             cv2ps.Add(cv2.GetParameterAtPoint(pt));
  36.                         }
  37.                     }
  38.                 }
  39.             }
  40.             for (int i = 0; i < tol; i++)
  41.             {
  42.                 Curve cv = cvs[i];
  43.                 List<double> value = pamss[i];
  44.                 if (value.Count == 0) //没有交点
  45.                 {
  46.                     continue;
  47.                 }
  48.                 else if (value.Count == 1 && cv.IsPeriodic && cv.IsPersistent)//闭合曲线只有一个交点
  49.                 {
  50.                     continue;
  51.                 }
  52.                 else
  53.                 {
  54.                     value.Sort();
  55.                     int vl = value.Count - 1;
  56.                     for (int j = vl; j > 0; j--)
  57.                     {
  58.                         if (IsEqual( value[j], value[j - 1]))
  59.                         {
  60.                             value.RemoveAt(j);
  61.                         }
  62.                     }
  63.                     bool atStart = IsEqual( cvs[i].StartParam , value[0]);
  64.                     bool atEnd = IsEqual( cvs[i].EndParam ,value[value.Count - 1]);
  65.                     if (cvs[i] is Circle && atEnd && atStart)
  66.                     {
  67.                         value.RemoveAt(0);
  68.                     }
  69.                     else
  70.                     {
  71.                         if (atEnd)
  72.                         {
  73.                             value.RemoveAt(value.Count - 1);
  74.                         }
  75.                         if (atStart)
  76.                         {
  77.                             value.RemoveAt(0);
  78.                         }
  79.                     }
  80.                     if (value == null || value.Count == 0)
  81.                     {
  82.                         continue;
  83.                     }
  84.                     else
  85.                     {
  86.                         double[] arrpt = value.ToArray();
  87.                         DoubleCollection pts = new DoubleCollection(arrpt);
  88.                         DBObjectCollection objs = cv.GetSplitCurves(pts);
  89.                         var lst =
  90.                             objs.Cast<Curve>().Where(c => c.GetDistanceAtParameter(c.EndParam) > 1e-6).ToList();
  91.                         if (lst.Count > 0)
  92.                         {
  93.                             ret.AddRange(lst);
  94.                             cvs[i].UpgradeOpen();
  95.                             cvs[i].Erase();//断开的就删除
  96.                         }
  97.                     }
  98.                 }
  99.             }
  100.             return ret;//仅包含新生成的曲线
  101.         }

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

使用道具 举报

发表于 2014-8-29 21:16:37 来自手机 | 显示全部楼层
你的没有考虑自相交?另按参数断开的部分最好做成函数 这应该是个通用的

点评

还在学习适应 Net 的思路,用 Db 曲线求交还有一个问题,因为存储原因,用 IntersectWith 求得的交点在转参数集时直接用 pams1.Add(cv1.GetParameterAtPoint(pt));  详情 回复 发表于 2014-8-30 10:46
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 21:44 , Processed in 0.235535 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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