明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9453|回复: 14

[几何] 修剪穿过所有的实体

  [复制链接]
发表于 2010-12-9 21:10:48 | 显示全部楼层 |阅读模式
本帖最后由 chpmould 于 2010-12-12 08:27 编辑

请教老师:
例如:我用程序画两条线的时候自动修剪所有穿过线...
谢谢狐哥,已通过测试...
发表于 2010-12-10 20:06:13 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-10 20:10 编辑

  1.         [CommandMethod("t3")]
  2.         public static void Test3()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Editor ed = doc.Editor;
  6.             Database db = doc.Database;

  7.             var resPt1 = ed.GetPoint("\n选择第一点");
  8.             if (resPt1.Status != PromptStatus.OK) return;
  9.             var pt1 = resPt1.Value;

  10.             var optPt2 = new PromptPointOptions("\n选择第二点");
  11.             optPt2.UseBasePoint = true;
  12.             optPt2.BasePoint = pt1;
  13.             var resPt2 = ed.GetPoint(optPt2);
  14.             if (resPt2.Status != PromptStatus.OK) return;
  15.             var pt2 = resPt2.Value;

  16.             //栏选
  17.             var resSel =
  18.                 ed.SelectFence(
  19.                     new Point3dCollection { pt1, pt2 },
  20.                     new ResultList { { 0, "line" } });
  21.             if (resSel.Status != PromptStatus.OK) return;

  22.             using (Transaction tr = db.TransactionManager.StartTransaction())
  23.             {

  24.                 //按两点生成一条直线,并两侧偏移
  25.                 Line line = new Line(pt1, pt2);
  26.                 Line line1 = line.GetOffsetCurves(5)[0] as Line;
  27.                 Line line2 = line.GetOffsetCurves(-5)[0] as Line;

  28.                 BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;

  29.                 //遍历选择集
  30.                 SelectionSet ss = resSel.Value;
  31.                 for (int i = 0; i < ss.Count; i++ )
  32.                 {
  33.                     FenceSelectedObject selObj = ss[i] as FenceSelectedObject;

  34.                     //获取被栏选的直线和栏选点
  35.                     Line iline = tr.GetObject(selObj.ObjectId, OpenMode.ForWrite) as Line;
  36.                     Point3d pt = selObj.GetIntersectionPoints()[0].PointOnLine;

  37.                     //获取直线和偏移界线的交点集合
  38.                     Point3dCollection pts = new Point3dCollection();
  39.                     iline.IntersectWith(line1, Intersect.ExtendArgument, pts, 0, 0);
  40.                     iline.IntersectWith(line2, Intersect.ExtendArgument, pts, 0, 0);
  41.                     if (pts.Count > 0)
  42.                     {

  43.                         //按交点在直线上的位置排序,并转换为参数集合
  44.                         var pars =
  45.                             pts.Cast<Point3d>()
  46.                             .Select(pnt => iline.GetParameterAtPoint(iline.GetClosestPointTo(pnt, false)))
  47.                             .OrderBy(par => par);

  48.                         //按参数集合打断,并排除掉包含栏选点的直线
  49.                         var lines =
  50.                             from Line l in iline.GetSplitCurves(new DoubleCollection(pars.ToArray()))
  51.                             let ls3d = new LineSegment3d(l.StartPoint, l.EndPoint)
  52.                             where !ls3d.IsOn(pt, new Tolerance(1e-4, 1e-4))
  53.                             select l;

  54.                         AddEntity(tr, btr, lines);
  55.                         iline.Erase();

  56.                     }

  57.                 }

  58.                 AddEntity(tr, btr, line1);
  59.                 AddEntity(tr, btr, line2);

  60.                 tr.Commit();
  61.             }

  62.         }

  63.         public static ObjectId AddEntity(Transaction tr, BlockTableRecord btr, Entity ent)
  64.         {
  65.             ObjectId id = btr.AppendEntity(ent);
  66.             tr.AddNewlyCreatedDBObject(ent, true);
  67.             return id;
  68.         }
  69.         public static List<ObjectId> AddEntity<T>(Transaction tr, BlockTableRecord btr, IEnumerable<T> ents) where T : Entity
  70.         {
  71.             List<ObjectId> ids = new List<ObjectId>();
  72.             foreach (T ent in ents)
  73.             {
  74.                 ids.Add(AddEntity(tr, btr, ent));
  75.             }
  76.             return ids;
  77.         }
}
回复 支持 2 反对 0

使用道具 举报

发表于 2024-4-9 10:02:23 | 显示全部楼层

谢谢大佬。打断直线已调试成功。。认真学习一下。。
发表于 2020-5-17 17:34:18 | 显示全部楼层

好东西,留名留存了!!!!
发表于 2010-12-9 22:17:22 | 显示全部楼层
Editor.SelectFence Method (Point3dCollection)
 楼主| 发表于 2010-12-10 07:34:03 | 显示全部楼层
谢谢老师,这个"Editor.SelectFence Method (Point3dCollection)"怎么用,目前还不理解,能否再详细一点...
 楼主| 发表于 2010-12-10 20:36:58 | 显示全部楼层
本帖最后由 chpmould 于 2010-12-10 20:37 编辑

回复 lzh741206 的帖子

测试的时候调试没有成功,请帮看一下我错在那里...(请看以下图片中的提示)

本帖子中包含更多资源

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

x
发表于 2010-12-10 20:39:36 | 显示全部楼层
 楼主| 发表于 2010-12-10 20:48:23 | 显示全部楼层
调试中还是这句where !ls3d.IsOn(pt, new Tolerance(1e-4, 1e-4))通不过...我错在那里
发表于 2010-12-10 21:30:24 | 显示全部楼层
cad2008类库的问题,我一般是用2010/11的类库编译,再在2008里加载的
这句改成:
  1.                         //按参数集合打断,并排除掉包含栏选点的直线
  2.                         var lines =
  3.                             from Line l in iline.GetSplitCurves(pars)
  4.                             let ls3d = new LineSegment3d(l.StartPoint, l.EndPoint) as Curve3d
  5.                             where !ls3d.IsOn(pt, new Tolerance(1e-4, 1e-4))
  6.                             select l;
复制代码
 楼主| 发表于 2010-12-10 21:49:08 | 显示全部楼层
谢谢狐哥! 现在已经调试通过了,只是这些代码的意思目前有很多没有理解,后续还要多花点时间慢慢的去理解。。。
发表于 2011-10-12 11:15:48 | 显示全部楼层
雪山飞狐_lzh 发表于 2010-12-10 20:06
}

貌似只能对直线进行裁剪   能否讲解下 怎么对其他图形进行裁剪
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 03:26 , Processed in 1.752292 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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