找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: csharp

[原创] 程序 喷淋覆盖率

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-25 21:01:07 | 显示全部楼层
本帖最后由 csharp 于 2014-8-25 21:02 编辑
雪山飞狐(lzh) 发表于 2014-8-25 20:24
来了 这个试下 应该是这里搞错了 嘿嘿
public static Curve3d GetSubCurve(this Curve3d curve, double fr ...

刚看了下2015手册,Curve3d 包括

        Autodesk.AutoCAD.Geometry.CircularArc3d
        Autodesk.AutoCAD.Geometry.CompositeCurve3d
        Autodesk.AutoCAD.Geometry.EllipticalArc3d
        Autodesk.AutoCAD.Geometry.ExternalCurve3d
        Autodesk.AutoCAD.Geometry.LinearEntity3d
        Autodesk.AutoCAD.Geometry.OffsetCurve3d
        Autodesk.AutoCAD.Geometry.SplineEntity3d

HardTrimByParams 方法不在 Curve3d 类里,2015 下是 NurbCurve3d/MirbCirve2d 的 Method ,可能还是有问题

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

使用道具 举报

发表于 2014-8-25 22:30:42 | 显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-8-25 22:47 编辑

  HardTrimByParams我的代码只针对NurbCurve3d,这也是Curve3d的一种
又一个修改版本 呵呵
我修正了自己的曲线转换类 基本没出很大的问题了
      public static Curve3d GetSubCurve(this Curve3d curve, double from, double to)
        {

            Interval inter = curve.GetInterval();
            bool atStart = inter.LowerBound == from;
            bool atEnd = inter.UpperBound == to;
            Curve3d clone = (Curve3d)curve.Clone();
            if (atStart && atEnd)
                return clone;

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

使用道具 举报

发表于 2014-8-25 22:42:29 | 显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-8-25 22:45 编辑

还有一种Bug。。。
如果对一堆曲线 反复打断的话 第一次正常,第二次出现0长度直线 第三次挂掉,,,

点评

这回测试 Ok,只不过对闭合曲线处理不如 DB 的 GetSplitCurves 完美,起点作为了一个交点,生成了两段,另外可以判断长度,为 0 的不进行处理  详情 回复 发表于 2014-8-26 08:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【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-26 08:35:46 | 显示全部楼层
修正版,消除0长度曲线出现的可能,测试了一下,是由于容差未设置的原因,,,
  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.             foreach(var curve in curves)
  6.             {
  7.                 var cc3d = curve.ToCompositeCurve3d();
  8.                 if (cc3d != null)
  9.                 {
  10.                     geCurves.Add(cc3d);
  11.                     paramss.Add(new List<double>());
  12.                 }
  13.             }

  14.             List<Curve> oldCurves = new List<Curve>();
  15.             List<Curve> newCurves = new List<Curve>();
  16.             CurveCurveIntersector3d cci3d = new CurveCurveIntersector3d();

  17.             for (int i = 0; i < curves.Count; i++)
  18.             {
  19.                 CompositeCurve3d gc1 = geCurves[i];
  20.                 List<double> pars1 = paramss[i];
  21.                 for (int j = i; j < curves.Count; j++)
  22.                 {
  23.                     CompositeCurve3d gc2 = geCurves[j];
  24.                     List<double> pars2 = paramss[j];

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

  26.                     for (int k = 0; k < cci3d.NumberOfIntersectionPoints; k++)
  27.                     {
  28.                         double[] pars = cci3d.GetIntersectionParameters(k);
  29.                         pars1.Add(pars[0]);
  30.                         pars2.Add(pars[1]);
  31.                     }
  32.                 }


  33.                 if (pars1.Count > 0)
  34.                 {
  35.                     List<CompositeCurve3d> c3ds = gc1.GetSplitCurves(pars1);
  36.                     if (c3ds.Count > 1)
  37.                     {
  38.                         foreach (CompositeCurve3d c3d in c3ds)
  39.                         {
  40.                             Curve c = c3d.ToCurve();
  41.                             if (c != null)
  42.                             {
  43.                                 c.SetPropertiesFrom(curves[i]);
  44.                                 newCurves.Add(c);
  45.                             }
  46.                         }
  47.                         oldCurves.Add(curves[i]);
  48.                     }
  49.                 }
  50.             }
  51.             curves = oldCurves;
  52.             return newCurves;
  53.         }
复制代码


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

  5.             pars.Sort();

  6.             for (int i = pars.Count - 1; i > 0; i--)
  7.             {
  8.                 if (Math.Abs(pars[i] - pars[i - 1]) < Tolerance.Global.EqualPoint)
  9.                     pars.RemoveAt(i);
  10.             }


  11.             if (pars.Count == 0)
  12.             {
  13.                 return new List<CompositeCurve3d>();
  14.             }
  15.             else if (c3ds[0].IsCircular())
  16.             {
  17.                 //圆/椭圆不允许2点以下的打断
  18.                 if (pars.Count < 2)
  19.                     return new List<CompositeCurve3d>();
  20.                 else
  21.                     pars.Add(pars[0]);
  22.             }
  23.             else
  24.             {
  25.                 //其他曲线加入起点和终点
  26.                 if (Math.Abs(pars[0] - inter.LowerBound) < Tolerance.Global.EqualPoint)
  27.                     pars[0] = inter.LowerBound;
  28.                 else
  29.                     pars.Insert(0, inter.LowerBound);

  30.                 if (Math.Abs(pars[pars.Count - 1] - inter.UpperBound) < Tolerance.Global.EqualPoint)
  31.                     pars[pars.Count - 1] = inter.UpperBound;
  32.                 else
  33.                     pars.Add(inter.UpperBound);
  34.             }
  35.          
  36.             List<CompositeCurve3d> curves = new List<CompositeCurve3d>();
  37.             for (int i = 0; i < pars.Count - 1; i++)
  38.             {
  39.                 List<Curve3d> cc3ds = new List<Curve3d>();
  40.                 if (pars[i] != pars[i + 1])
  41.                 {
  42.                     //复合曲线参数转换到包含曲线参数
  43.                     CompositeParameter cp1 = c3d.GlobalToLocalParameter(pars[i]);
  44.                     CompositeParameter cp2 = c3d.GlobalToLocalParameter(pars[i + 1]);
  45.                     if (cp1.SegmentIndex == cp2.SegmentIndex)
  46.                     {
  47.                         cc3ds.Add(
  48.                             c3ds[cp1.SegmentIndex].GetSubCurve(
  49.                                 cp1.LocalParameter,
  50.                                 cp2.LocalParameter));
  51.                     }
  52.                     else
  53.                     {
  54.                         inter = c3ds[cp1.SegmentIndex].GetInterval();
  55.                         cc3ds.Add(
  56.                             c3ds[cp1.SegmentIndex].GetSubCurve(
  57.                                 cp1.LocalParameter,
  58.                                 inter.UpperBound));

  59.                         for (int j = cp1.SegmentIndex + 1; j < cp2.SegmentIndex; j++)
  60.                         {
  61.                             cc3ds.Add((Curve3d)c3ds[j].Clone());
  62.                         }

  63.                         inter = c3ds[cp2.SegmentIndex].GetInterval();
  64.                         cc3ds.Add(
  65.                             c3ds[cp2.SegmentIndex].GetSubCurve(
  66.                                 inter.LowerBound,
  67.                                 cp2.LocalParameter));

  68.                     }
  69.                     curves.Add(new CompositeCurve3d(cc3ds.ToArray()));
  70.                 }
  71.             }

  72.             return curves;

  73.         }

点评

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

使用道具 举报

发表于 2014-8-26 08:40:50 | 显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-8-26 08:42 编辑

封闭曲线的问题,估计不好改
NurbCurve3d只支持正向参数打断 ,反向打断估计要先分别打断第一点到终点、起点到第二点,然后再Join
优化多段线 我程序里直接把他当做复合曲线了
先这样吧 基本可以满足大多数应用了

圆和椭圆我这边一直很正常 和你的描述不一样

点评

知道为什么不一样了,你用了 ToPolyline 有个连接,我注释掉直接用 Curve.CreateFromCurve3d 按段生成的,所以起点处分成了两部分  详情 回复 发表于 2014-8-27 17:32
看了CurveCurveIntersector3d也用过 XDAPI 的曲线布尔,包括一些讨论,还是对 相交区间 比较迷糊,看了上面代码有了一点光明,高手都不屑说,自己摸索摸索  详情 回复 发表于 2014-8-26 18:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-26 08:43:57 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-26 08:35
修正版,消除0长度曲线出现的可能,测试了一下,是由于容差未设置的原因,,,

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-26 18:03:02 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-26 08:40
封闭曲线的问题,估计不好改
NurbCurve3d只支持正向参数打断 ,反向打断估计要先分别打断第一点到终点、起 ...

看了CurveCurveIntersector3d也用过 XDAPI 的曲线布尔,包括一些讨论,还是对 相交区间 比较迷糊,看了上面代码有了一点光明,高手都不屑说,自己摸索摸索
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-26 19:22:18 | 显示全部楼层
区域构建应该是属于较复杂的算法内容了 呵呵

点评

相对而言,那些界面(WPF FORM)还一点都不了解,这个直接些  详情 回复 发表于 2014-8-26 20:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-26 20:58:59 来自手机 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-26 19:22
区域构建应该是属于较复杂的算法内容了 呵呵

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-27 17:32:33 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-8-26 08:40
封闭曲线的问题,估计不好改
NurbCurve3d只支持正向参数打断 ,反向打断估计要先分别打断第一点到终点、起 ...

知道为什么不一样了,你用了 ToPolyline 有个连接,我注释掉直接用 Curve.CreateFromCurve3d 按段生成的,所以起点处分成了两部分
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-27 19:17:06 来自手机 | 显示全部楼层
我试了下teigha的getgecurve pl直接生成comp...复合曲线 和我的处理一样的 你上面的代码不知考虑这个问题没

点评

你处理闭合Curve3d先在起点处断开了,所以会出现上面情况  详情 回复 发表于 2014-8-27 19:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-8-27 19:38:01 来自手机 | 显示全部楼层
本帖最后由 csharp 于 2014-8-27 19:41 编辑
雪山飞狐(lzh) 发表于 2014-8-27 19:17
我试了下teigha的getgecurve pl直接生成comp...复合曲线 和我的处理一样的 你上面的代码不知考虑这个问题没


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

使用道具 举报

发表于 2014-8-27 19:53:22 | 显示全部楼层
除了圆和椭圆 其他的闭合曲线都不支持大参数向小参数的打断 可能是以前遇到过这个问题 所以避开了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-28 22:33:27 | 显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-8-28 22:38 编辑

如果画一条开口spl 再强行将起点终点合在一起 我这里测试会出问题 改成这样正常

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

  3.             Interval inter = curve.GetInterval();
  4.             bool atStart = inter.LowerBound == from;
  5.             bool atEnd = inter.UpperBound == to;
  6.             Curve3d clone = (Curve3d)curve.Clone();
  7.             if (atStart && atEnd)
  8.                 return clone;

  9.             if (curve is NurbCurve3d)
  10.             {
  11.                 NurbCurve3d nc3d = (NurbCurve3d)clone;
  12.                 if(atStart || atEnd)
  13.                 {
  14.                     nc3d.HardTrimByParams(from, to);
  15.                 }
  16.                 else
  17.                 {
  18.                     nc3d.HardTrimByParams(inter.LowerBound, to);
  19.                     nc3d.HardTrimByParams(from, to);
  20.                 }


  21.                 return nc3d;
  22.             }
  23.             else
  24.             {
  25.                 clone.SetInterval(new Interval(from, to, 0));
  26.                 return clone;
  27.             }
  28.         }


但是如果由两条Spl 通过Join连接的spl,好像两部分连接的地方有问题

点评

经测试 2014 上 Circle Ellipse 都可以了,不过有个问题是不是没有优化,对交点仅是 起点、终点 的 返回 Clone,这样重新 ToCurve 就没有必要了  详情 回复 发表于 2014-8-29 07:47
Join的Spline还没有试过  详情 回复 发表于 2014-8-28 23:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 21:17 , Processed in 0.248979 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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