找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1240|回复: 0

[原创] 练习 Lisp定义选择集交点

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-6 00:29:45 | 显示全部楼层 |阅读模式

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

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

×
[ 本帖最后由 csharp 于 2014-5-6 06:36 编辑 ]\n\n
  1.         [LispFunction("ssInters")]
  2.         public ResultBuffer GeSelectionsetInters(ResultBuffer rb)
  3.         {
  4.             Document document = Application.DocumentManager.MdiActiveDocument;
  5.             Transaction transaction = document.TransactionManager.StartTransaction();
  6.             if (rb != null)
  7.             {
  8.                 TypedValue[] values = rb.AsArray();
  9.                 if (values.Count() == 1 && values[0].TypeCode == (int) LispDataType.SelectionSet)
  10.                 {
  11.                     using (transaction)
  12.                     {
  13.                         try
  14.                         {
  15.                             SelectionSet ss = (SelectionSet) values[0].Value;
  16.                             ObjectId[] ids = ss.GetObjectIds() ;
  17.                             int count = ids.Count();
  18.                             Entity[] ents = new Entity[count];
  19.                             for (int i = 0; i < count; i++)
  20.                             {
  21.                                 ents[i] = (Entity) ids[i].GetObject(OpenMode.ForRead);//Entity Array
  22.                             }
  23.                             if (count > 1)
  24.                             {
  25.                                 List<Point3dCollection> pnts = new List<Point3dCollection>();
  26.                                 for (int i = 0; i < count ; i++)
  27.                                 {
  28.                                     Entity ent = ents[i];
  29.                                     for (int j = i + 1; j < count; j++)
  30.                                     {
  31.                                         Point3dCollection npts = new Point3dCollection();
  32.                                         Entity ent1 = ents[j];
  33.                                         ent.IntersectWith(ent1, Intersect.OnBothOperands,npts,IntPtr.Zero ,IntPtr .Zero );
  34.                                         if (npts.Count > 0)
  35.                                         {
  36.                                                 pnts.Add(npts);
  37.                                         }
  38.                                     }
  39.                                 }
  40.                                 
  41.                                 int tl = pnts.Count;
  42.                                 if (tl > 0)
  43.                                 {
  44.                                     int listTotleLenth = 0;
  45.                                     for (int i = 0; i < tl; i++)
  46.                                     {
  47.                                         listTotleLenth += pnts[i].Count;
  48.                                     }
  49.                                     TypedValue[] nvalues = new TypedValue[listTotleLenth + 2];
  50.                                     nvalues [0]= new TypedValue((int)LispDataType .ListBegin );
  51.                                     int m = 1;
  52.                                     for (int k = 0; k < tl ; k++)
  53.                                     {
  54.                                         Point3dCollection tmpPoint3DCollection = pnts[k];
  55.                                         Point3d [] pntArr = new Point3d[tmpPoint3DCollection .Count ];
  56.                                         pnts[k].CopyTo(pntArr,0);
  57.                                         for (int j = 0; j < pntArr  .Length  ; j++)
  58.                                         {
  59.                                             nvalues[m] = new TypedValue((int)LispDataType.Point3d, pntArr  [j]);
  60.                                             m++;
  61.                                         }
  62.                                        
  63.                                     }
  64.                                     nvalues[listTotleLenth + 1] = new TypedValue((int)LispDataType.ListEnd);
  65.                                     ResultBuffer ret = new ResultBuffer(nvalues);
  66.                                     return ret;
  67.                                 }
  68.                                 else
  69.                                 {
  70.                                     return null;
  71.                                 }
  72.                             }
  73.                             else
  74.                             {
  75.                                 return null;
  76.                             }
  77.                            
  78.                         }
  79.                         catch (Exception)
  80.                         {
  81.                             throw;
  82.                             return null;
  83.                         }
  84.                     }
  85.                 }
  86.                 else
  87.                 {
  88.                     return null;
  89.                 }
  90.             }
  91.             else
  92.             {
  93.                 return null;
  94.             }
  95.         }

命令: (setq l (length (ssinters (ssget))))(princ l)(princ)
选择对象: 指定对角点: 找到 2575 个选择对象:
GetInters Time Used: 5524
TypeValue Time Used: 195
ResultBuffer time used: 5
32745
IntersectWith 和 List<T> 是比较耗时间的!(测试全部 为 Line)时间为毫秒(千分之一秒)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-17 22:15 , Processed in 0.153524 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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