乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 243|回复: 10

修剪穿过所有的实体

[复制链接]

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-9 21:10:00 | 显示全部楼层 |阅读模式
请教老师:
例如:我用程序画两条线的时候自动修剪所有穿过线...
谢谢狐哥,已通过测试...
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-12-10 20:06:00 | 显示全部楼层
  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  0)
  32.                     {
  33.                         //按交点在直线上的位置排序,并转换为参数集合
  34.                         var pars =
  35.                             pts.Cast()
  36.                             .Select(pnt => iline.GetParameterAtPoint(iline.GetClosestPointTo(pnt, false)))
  37.                             .OrderBy(par => par);
  38.                         //按参数集合打断,并排除掉包含栏选点的直线
  39.                         var lines =
  40.                             from Line l in iline.GetSplitCurves(new DoubleCollection(pars.ToArray()))
  41.                             let ls3d = new LineSegment3d(l.StartPoint, l.EndPoint)
  42.                             where !ls3d.IsOn(pt, new Tolerance(1e-4, 1e-4))
  43.                             select l;
  44.                         AddEntity(tr, btr, lines);
  45.                         iline.Erase();
  46.                     }
  47.                 }
  48.                 AddEntity(tr, btr, line1);
  49.                 AddEntity(tr, btr, line2);
  50.                 tr.Commit();
  51.             }
  52.         }
  53.         public static ObjectId AddEntity(Transaction tr, BlockTableRecord btr, Entity ent)
  54.         {
  55.             ObjectId id = btr.AppendEntity(ent);
  56.             tr.AddNewlyCreatedDBObject(ent, true);
  57.             return id;
  58.         }
  59.         public static List AddEntity(Transaction tr, BlockTableRecord btr, IEnumerable ents) where T : Entity
  60.         {
  61.             List ids = new List();
  62.             foreach (T ent in ents)
  63.             {
  64.                 ids.Add(AddEntity(tr, btr, ent));
  65.             }
  66.             return ids;
  67.         }
}
回复

使用道具 举报

11

主题

92

帖子

10

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2020-5-17 17:34:00 | 显示全部楼层

好东西,留名留存了!!!!
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2020-4-10 16:22:00 | 显示全部楼层

厉害
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-12-9 22:17:00 | 显示全部楼层
Editor.SelectFence Method (Point3dCollection)
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-10 07:34:00 | 显示全部楼层
谢谢老师,这个"Editor.SelectFence Method (Point3dCollection)"怎么用,目前还不理解,能否再详细一点...
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-10 20:36:00 | 显示全部楼层

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

xze5taq43ek.gif

xze5taq43ek.gif

回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-10 20:48:00 | 显示全部楼层
调试中还是这句where !ls3d.IsOn(pt, new Tolerance(1e-4, 1e-4))通不过...我错在那里
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-12-10 21:30:00 | 显示全部楼层
cad2008类库的问题,我一般是用2010/11的类库编译,再在2008里加载的
这句改成:复制代码
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-10 21:49:00 | 显示全部楼层
谢谢狐哥! 现在已经调试通过了,只是这些代码的意思目前有很多没有理解,后续还要多花点时间慢慢的去理解。。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 01:11 , Processed in 0.270128 second(s), 75 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表