明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 21324|回复: 31

[选集] 用曲线选择集A,于交点处打断选择集B

    [复制链接]
发表于 2009-12-25 22:07:00 | 显示全部楼层 |阅读模式
程序功能:
用曲线选择集A,于交点处打断选择集B(当A,B相同则自相打断)
程序在2006,2010上测试通过。
请多指教!
  1. using System.Collections.Generic;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.Runtime;
  7. using Acad = Autodesk.AutoCAD.ApplicationServices.Application;
  8. [assembly:CommandClass(typeof (FsxmAcad.BrkAtInt))]
  9. namespace FsxmAcad
  10. {
  11.     public class BrkAtInt : IExtensionApplication
  12.     {
  13.         #region IExtensionApplication 成員
  14.         void IExtensionApplication.Initialize()
  15.         {
  16.             ed.WriteMessage("\n飞诗CAD - 交点打断(BrkInt)");
  17.         }
  18.         void IExtensionApplication.Terminate() { }
  19.         #endregion
  20.         
  21.         Document doc = Acad.DocumentManager.MdiActiveDocument;
  22.         Editor ed = Acad.DocumentManager.MdiActiveDocument.Editor;
  23.         [CommandMethod("BrkInt", CommandFlags.UsePickSet)]
  24.         public void BlkInt()
  25.         {
  26.             PromptSelectionOptions sop = new PromptSelectionOptions();
  27.             try { sop.RejectObjectsOnLockedLayers = true; }
  28.             catch { }
  29.             SelectionFilter fil = new SelectionFilter
  30.                 (new TypedValue[] { new TypedValue(0, "*line,arc,circle,ellipse,ray") });
  31.             sop.MessageForAdding = "\n选择边界曲线集:";
  32.             PromptSelectionResult ss1 = ed.GetSelection(sop, fil);
  33.             if (ss1.Status != PromptStatus.OK) return;
  34.             sop.MessageForAdding = "\n选择要打断的曲线集<同边界>:";
  35.             PromptSelectionResult ss2 = ed.GetSelection(sop, fil);
  36.             if (ss2.Status == PromptStatus.Error)
  37.                 ss2 = ss1;
  38.             else if (ss2.Status != PromptStatus.OK)
  39.                 return;
  40.             SelectionSet ssbrk = ss2.Value;
  41.             SelectionSet ssedge = ss1.Value;
  42.             ed.WriteMessage("\n程序正在执行请稍候...");
  43.             using (Transaction tr = doc.TransactionManager.StartTransaction())
  44.             {
  45.                 ObjectId id = tr.GetObject(ss2.Value[0].ObjectId, OpenMode.ForRead).OwnerId;
  46.                 BlockTableRecord Spase = (BlockTableRecord)tr.GetObject(id, OpenMode.ForWrite);
  47.                 Dictionary<Curve, List<double>> objpts;
  48.                 objpts = new Dictionary<Curve, List<double>>(ssbrk.Count);
  49.                 if (ss1 != ss2)
  50.                 {
  51.                     #region 边界与打断不同
  52.                     foreach (ObjectId sid in ssbrk.GetObjectIds())
  53.                     {
  54.                         Curve cv1 = tr.GetObject(sid, OpenMode.ForWrite) as Curve;
  55.                         List<double> pas = new List<double>();
  56.                         objpts.Add(cv1, pas);
  57.                         foreach (SelectedObject sobj2 in ssedge)
  58.                         {
  59.                             Curve cv2 = tr.GetObject(sobj2.ObjectId, OpenMode.ForRead) as Curve;
  60.                             Point3dCollection points = new Point3dCollection();
  61.                             cv1.IntersectWith(cv2, Intersect.OnBothOperands, points, 0, 0);
  62.                             foreach (Point3d pt in points)
  63.                             {
  64.                                 pas.Add(cv1.GetParameterAtPoint(pt));
  65.                             }
  66.                         }
  67.                     }
  68.                     #endregion
  69.                 }
  70.                 else
  71.                 {
  72.                     #region 边界与打断相同(优化)
  73.                     Curve[] cvs = new Curve[ssbrk.Count];
  74.                     for (int i = ssbrk.Count - 1; i > -1; i--)
  75.                     {
  76.                         Curve cv = tr.GetObject(ssbrk[i].ObjectId, OpenMode.ForWrite) as Curve;
  77.                         cvs[i] = cv; objpts.Add(cv, new List<double>());
  78.                     }
  79.                     for (int cur = cvs.Length - 1; cur > -1; cur--)
  80.                     {
  81.                         Curve cv1 = cvs[cur];
  82.                         List<double> cv1ps = objpts[cv1];
  83.                         for (int n = cur - 1; n > -1; n--)
  84.                         {
  85.                             Curve cv2 = cvs[n];
  86.                             List<double> cv2ps = objpts[cv2];
  87.                             Point3dCollection points = new Point3dCollection();
  88.                             cv1.IntersectWith(cv2, Intersect.OnBothOperands, points, 0, 0);
  89.                             foreach (Point3d pt in points)
  90.                             {
  91.                                 cv1ps.Add(cv1.GetParameterAtPoint(pt));
  92.                                 cv2ps.Add(cv2.GetParameterAtPoint(pt));
  93.                             }
  94.                         }
  95.                     }
  96.                     #endregion
  97.                 }
  98.                 foreach (KeyValuePair<Curve, List<double>> var in objpts)
  99.                 {
  100.                     Curve cv = var.Key;
  101.                     if (var.Value.Count == 0) continue;
  102.                     if (var.Value.Count == 1 && cv.IsPeriodic && cv.IsPersistent)
  103.                         continue;
  104.                     var.Value.Sort();
  105.                     double[] arrpt = new double[var.Value.Count];
  106.                     var.Value.CopyTo(arrpt);
  107.                     DoubleCollection pts = new DoubleCollection(arrpt);
  108.                     DBObjectCollection objs = cv.GetSplitCurves(pts);
  109.                     int brkn = 0;
  110.                     foreach (DBObject dbobj in objs)
  111.                     {
  112.                         Curve brks = (Curve)dbobj;
  113.                         if (cv.GetDistanceAtParameter(brks.EndParam) > 1e-6)
  114.                         {
  115.                             brkn++;
  116.                             Spase.AppendEntity(brks);
  117.                             tr.AddNewlyCreatedDBObject(brks, true);
  118.                         }
  119.                     }
  120.                     cv.Erase();
  121.                 }
  122.                 tr.Commit();
  123.             }
  124.         }
  125.     }
  126. }

点评

yjr111老兄,这个版块貌似是:“AutoCAD.net/VB.net/C# 编程技术” 嘿嘿~  发表于 2011-10-20 23:08
希望不要发与lsp无关的程序,让我等出洋相::::}}}}}  发表于 2011-10-20 17:25

评分

参与人数 1威望 +1 明经币 +2 金钱 +20 贡献 +5 激情 +5 收起 理由
雪山飞狐_lzh + 1 + 2 + 20 + 5 + 5 【精华】好程序

查看全部评分

发表于 2017-12-30 16:03:48 | 显示全部楼层
还要去找那么多库函数dll,在C#里编译,封装到dll
发表于 2021-3-15 21:35:07 | 显示全部楼层
回帖是一种美德!感谢楼主的无私分享 谢谢
发表于 2020-4-2 11:55:51 | 显示全部楼层
回帖是一种美德!感谢楼主的无私分享 谢谢
发表于 2009-12-26 08:53:00 | 显示全部楼层

这个文件的后缀名是什么啊?.dll吗?

发表于 2009-12-26 15:40:00 | 显示全部楼层
收到了。飞诗兄
发表于 2010-10-3 22:15:00 | 显示全部楼层

不错!!!!

发表于 2011-6-7 08:47:03 | 显示全部楼层
有代码,但是怎么使用呢?新手诚心求教!!
发表于 2011-6-13 08:33:48 | 显示全部楼层
飞诗是个不错的工具集。我用过,不过我想自己学习学习
发表于 2011-8-25 22:58:20 | 显示全部楼层
有LISP的吗?
发表于 2011-10-7 18:53:21 | 显示全部楼层
好东东 顶起来!
发表于 2011-10-8 14:27:25 | 显示全部楼层
好东西,感谢分享
发表于 2011-10-10 22:31:52 | 显示全部楼层
这是.dll 还是运行.exe
?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 04:18 , Processed in 0.210425 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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