找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1773|回复: 2

[分享] 练习 Lisp定义曲线选择集交点断开

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-7 06:23:13 | 显示全部楼层 |阅读模式

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

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

×
[ 本帖最后由 csharp 于 2014-5-7 06:25 编辑 ]\n\n改编自 飞诗 程序,原帖地址 [url=http://bbs.mjtd.com/thread-79764-1-1.html]http://bbs.mjtd.com/thread-79764-1-1.html[/url]

原本想尝试返回断开后的曲线选择集,对 DBObject 转 ObjectId 不得要领,继续学习

曲线在 ssget 过滤

(ssbrk (ssget '((0 . "*line,arc,circle,ray"))))

  1.         [LispFunction ("ssbrk")]   
  2.         public void   BlkInt(ResultBuffer rb)   
  3.         {
  4.             if (rb != null)
  5.             {
  6.                 TypedValue[] values = rb.AsArray();
  7.                 if (values.Count() == 1 && values[0].TypeCode == (int) LispDataType.SelectionSet)
  8.                 {
  9.                     Document doc = Application.DocumentManager.MdiActiveDocument;
  10.                     Editor ed = doc.Editor;
  11.                     Database db = doc.Database;
  12.                     Transaction tr = doc.TransactionManager.StartTransaction();
  13.                     BlockTableRecord Spase = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  14.                     using  ( tr)
  15.                     {
  16.                         try
  17.                         {
  18.                             SelectionSet ssSet = (SelectionSet)values[0].Value;
  19.                             ObjectId[] ssbrk = ssSet.GetObjectIds();
  20.                             Dictionary<Curve, List<double>> objpts;
  21.                             objpts = new Dictionary<Curve, List<double>>(ssbrk.Length);

  22.                             Curve[] cvs = new Curve[ssbrk.Length];
  23.                             Entity[] ents = new Entity[ssbrk.Length];
  24.                             for (int i = 0; i < ssbrk.Length; i++)
  25.                             {
  26.                                 ents[i] = ssbrk[i].GetObject(OpenMode.ForRead) as Entity;
  27.                             }
  28.                             for (int i = ssbrk.Length - 1; i > -1; i--)
  29.                             {
  30.                                 //Curve cv = tr.GetObject(ssbrk[i], OpenMode.ForWrite) as Curve;
  31.                                 Curve cv = ssbrk[i].GetObject(OpenMode.ForWrite ) as Curve;
  32.                                 cvs[i] = cv;
  33.                                 objpts.Add(cv, new List<double>());
  34.                             }

  35.                             for (int cur = cvs.Length - 1; cur > -1; cur--)
  36.                             {
  37.                                 Curve cv1 = cvs[cur];
  38.                                 Entity ent1 = ents[cur];
  39.                                 List<double> cv1ps = objpts[cv1];
  40.                                 for (int n = cur - 1; n > -1; n--)
  41.                                 {
  42.                                     Curve cv2 = cvs[n];
  43.                                     Entity ent2 = ents[n];
  44.                                     List<double> cv2ps = objpts[cv2];
  45.                                     Point3dCollection points = new Point3dCollection();
  46.                                     //cv1.IntersectWith(cv2, Intersect.OnBothOperands, points, 0, 0);
  47.                                     ent1.IntersectWith(ent2, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
  48.                                     foreach (Point3d pt in points)
  49.                                     {
  50.                                         cv1ps.Add(cv1.GetParameterAtPoint(pt));
  51.                                         cv2ps.Add(cv2.GetParameterAtPoint(pt));
  52.                                     }
  53.                                 }

  54.                             }
  55.                             foreach (KeyValuePair<Curve, List<double>> var in objpts)
  56.                             {
  57.                                 Curve cv = var.Key;
  58.                                 if (var.Value.Count == 0)//没有交点
  59.                                 {
  60.                                     continue;
  61.                                 }
  62.                                 else
  63.                                 {
  64.                                     if (var.Value.Count == 1 && cv.IsPeriodic && cv.IsPersistent)
  65.                                     {
  66.                                         continue;
  67.                                     }
  68.                                     var.Value.Sort();
  69.                                     double[] arrpt = new double[var.Value.Count];
  70.                                     var.Value.CopyTo(arrpt);
  71.                                     DoubleCollection pts = new DoubleCollection(arrpt);
  72.                                     DBObjectCollection objs = cv.GetSplitCurves(pts);
  73.                                     //int brkn = 0;
  74.                                     foreach (DBObject dbobj in objs)
  75.                                     {
  76.                                         Curve brks = (Curve)dbobj;
  77.                                         if (cv.GetDistanceAtParameter(brks.EndParam) > 1e-6)
  78.                                         {
  79.                                             //brkn++;
  80.                                             Entity ent = (Entity)dbobj;
  81.                                             Spase.AppendEntity(ent);
  82.                                             tr.AddNewlyCreatedDBObject(ent, true);
  83.                                         }
  84.                                     }
  85.                                     cv.Erase();
  86.                                 }
  87.                             }
  88.                             tr.Commit();
  89.                         }
  90.                         catch (Exception)
  91.                         {
  92.                             throw;
  93.                         }
  94.                         }
  95.                     }
  96.                 }
  97.             }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-5-7 07:02:54 来自手机 | 显示全部楼层
本帖最后由 csharp 于 2014-5-7 08:00 编辑

多余了几个if

在2014下,IntersectWith是 Entity 方法,Curve 要 AcGeCurve 类才有IntersectWith

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

使用道具 举报

已领礼包: 104个

财富等级: 日进斗金

发表于 2020-6-9 03:48:34 | 显示全部楼层
正是一直在寻找的,曲线在交点处断开!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 11:38 , Processed in 0.185132 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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