找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2160|回复: 3

[原创] 练习 自相交Pline在自交点处断开

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-7-19 09:36:37 | 显示全部楼层 |阅读模式

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

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

×
两个判断函数

  1.         /// <summary>
  2.         /// 判断Polyline是否自相交
  3.         /// </summary>
  4.         /// <param name="cv">Curve (Polyline)</param>
  5.         /// <returns>true of false</returns>
  6.         private bool SelfInters(Curve cv)
  7.         {
  8.             Curve3d c3d = cv.GetGeCurve();
  9.             Plane plan = cv.GetPlane();
  10.             Vector3d vec = plan.Normal;
  11.             CurveCurveIntersector3d cci3d = new CurveCurveIntersector3d(c3d, c3d, vec);
  12.             if (cci3d.NumberOfIntersectionPoints > 0)
  13.             {
  14.                 return true;
  15.             }
  16.             else
  17.             {
  18.                 return false;
  19.             }
  20.         }

获取自交点参数

  1.         /// <summary>
  2.         /// 返回自相交Polyline自相交点Params
  3.         /// </summary>
  4.         /// <param name="cv">Curve(Polyline)</param>
  5.         /// <returns>DoubleCollection or null</returns>
  6.         private static  object  PolylineSelfIntersPams(Curve cv)
  7.         {
  8.             Curve3d c3d = cv.GetGeCurve();
  9.             Plane plan = cv.GetPlane();
  10.             Vector3d vec = plan.Normal;
  11.             CurveCurveIntersector3d cci3d = new CurveCurveIntersector3d(c3d, c3d, vec);
  12.             int n = cci3d.NumberOfIntersectionPoints;
  13.             if (n > 0)
  14.             {
  15.                 List<double> lpams = new List<double>();
  16.                 for (int i = 0; i < n; i++)
  17.                 {
  18.                     double[] pams = cci3d.GetIntersectionParameters(i);
  19.                     for (int j = 0; j < pams.Length; j++)
  20.                     {
  21.                         lpams.Add(pams[j]);
  22.                     }
  23.                 }
  24.                 lpams.Sort();
  25.                 DoubleCollection iCol = new DoubleCollection();
  26.                 iCol.Add(cv.GetParameterAtDistance(lpams[0]));
  27.                 for (int i = 1; i < lpams.Count; i++)
  28.                 {
  29.                     if (lpams[i] - iCol[i - 1] > 1e-6)
  30.                     {
  31.                         iCol.Add(cv.GetParameterAtDistance( lpams[i]));
  32.                     }
  33.                 }
  34.                 return iCol;
  35.             }
  36.             else
  37.             {
  38.                 return null;
  39.             }
  40.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-7-19 09:38:09 | 显示全部楼层
两个 LispFunction

  1.         /// <summary>
  2.         /// 判断Pline是否自相交
  3.         /// </summary>
  4.         /// <param name="rb">Entity (pline)</param>
  5.         /// <returns>T or nil </returns>
  6.         [LispFunction("IsSelfInters")]
  7.         public object PolylineSelfInters(ResultBuffer rb)
  8.         {
  9.             Document doc = Application.DocumentManager.MdiActiveDocument;
  10.             TypedValue[] values = rb.AsArray();
  11.             if (values.Length == 1 && values[0].TypeCode == (int)LispDataType.ObjectId)
  12.             {
  13.                 ObjectId id = (ObjectId)values[0].Value;
  14.                 if (id.ObjectClass == RXClass.GetClass(typeof(Polyline)))
  15.                 {
  16.                     using (Transaction tr = doc.TransactionManager .StartTransaction() )
  17.                     {
  18.                         Entity ent = (Entity)id.GetObject(OpenMode.ForRead);
  19.                         Curve cv = (Curve)ent;
  20.                         if (SelfInters(cv))
  21.                         {
  22.                             tr.Commit();
  23.                             return true;
  24.                         }
  25.                         else
  26.                         {
  27.                             return null;
  28.                         }
  29.                     }
  30.                 }
  31.             }
  32.             return null;
  33.         }

断开函数

  1.         /// <summary>
  2.         /// 自相交Pline在自交点处断开
  3.         /// </summary>
  4.         /// <param name="rb">pline</param>
  5.         /// <returns>成功 T ,失败 nil</returns>
  6.         [LispFunction("PolylineXTrim")]
  7.         public static object   MyPolylineXTrim(ResultBuffer rb)
  8.         {
  9.             TypedValue[] values = rb.AsArray();
  10.             if (values .Length == 1 && values[0].TypeCode == (int)LispDataType .ObjectId )
  11.             {
  12.                 ObjectId id = (ObjectId) values[0].Value;
  13.                 Document doc = Application.DocumentManager.MdiActiveDocument;
  14.                 if (id.ObjectClass == RXClass .GetClass( typeof (Polyline )))
  15.                 {
  16.                     using (Transaction tr = doc.TransactionManager .StartTransaction())
  17.                     {
  18.                         Entity ent = (Entity) id.GetObject(OpenMode.ForRead);
  19.                         Curve cv = (Curve) ent;
  20.                         var pams = PolylineSelfIntersPams(cv);
  21.                         if (pams  is DoubleCollection )
  22.                         {
  23.                             Database cdb = doc.Database;
  24.                             BlockTableRecord btr = (BlockTableRecord) tr.GetObject(cdb.CurrentSpaceId , OpenMode.ForWrite);
  25.                             cv.UpgradeOpen();
  26.                             DBObjectCollection dbs = cv.GetSplitCurves((DoubleCollection) pams);
  27.                             foreach (Curve  db in dbs)
  28.                             {
  29.                                 btr.AppendEntity(db);
  30.                                 tr.AddNewlyCreatedDBObject(db, true);
  31.                             }
  32.                             cv.Erase();
  33.                             tr.Commit();
  34.                             return true;
  35.                         }
  36.                         tr.Commit();
  37.                         return null;
  38.                     }
  39.                 }
  40.             }
  41.             return null;
  42.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-1-6 13:21:41 | 显示全部楼层
没看懂,这是lisp吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 20:50 , Processed in 0.189224 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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