明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: chpmould

[几何] 实现多条线一起合并

  [复制链接]
发表于 2010-12-22 13:13:03 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-22 13:16 编辑

还是把代码贴上吧,简单的注释了下
注意先引用我的TlsBasal.dll(重贴了一次)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75701&page=1&extra=#pid403883
  1.         [CommandMethod("tttt")]
  2.         public static void tttt()
  3.         {
  4.             var doc = Application.DocumentManager.MdiActiveDocument;
  5.             var db = doc.Database;
  6.             var ed = doc.Editor;

  7.             //获取直线选集
  8.             SelectionFilter sf = new ResultTree{ { 0, "line" } };
  9.             var resSel = ed.GetSelection(sf);
  10.             
  11.             using (var tr = new DBTransaction())
  12.             {

  13.                 //遍历选择集,按方向将直线分组
  14.                 var dict = new Dictionary<LineSegment3d, List<Line>>();
  15.                 foreach (Line line in resSel.Value.GetEntitys<Line>(tr))
  16.                 {

  17.                     //转换DBLine为GeLineSegment3d
  18.                     bool flag = false;
  19.                     LineSegment3d ls = line.ToCurve3d();
  20.                     //遍历分组字典
  21.                     foreach (var lls in dict)
  22.                     {
  23.                         //如果共线,加入当前组
  24.                         if (lls.Key.IsColinearTo(ls))
  25.                         {
  26.                             flag = true;
  27.                             lls.Value.Add(line);
  28.                             break;
  29.                         }
  30.                     }

  31.                     //如果没有找到,新建一个组
  32.                     if (!flag)
  33.                         dict.Add(ls, new List<Line> { line });
  34.                 }
  35.                 //遍历分组字典
  36.                 foreach (var lls in dict)
  37.                 {
  38.                     var lines = lls.Value;
  39.                     if (lines.Count > 1)
  40.                     {

  41.                         //将直线的起点终点放入同一集合
  42.                         var pts = new List<Point3d>();
  43.                         foreach (var line in lines)
  44.                         {
  45.                             pts.Add(line.StartPoint);
  46.                             pts.Add(line.EndPoint);
  47.                         }

  48.                         //按XYZ排序方式找到最小点和最大点
  49.                         var ptarr = pts.FindByExt(GeometryEx.CompareTo);

  50.                         //删除原直线,并生成新的
  51.                         tr.Erase(lines);
  52.                         var btr = tr.OpenCurrentSpace();
  53.                         tr.AddEntity(btr, new Line(ptarr[0], ptarr[1]));

  54.                     }
  55.                 }
  56.             }
  57.         }
发表于 2010-12-22 15:32:32 | 显示全部楼层
1,这是哪个版本的代码?var 类型真给力
2,if (lls.Key.IsColinearTo(ls)) 这个没有公差
3,var ptarr = pts.FindByExt(GeometryEx.CompareTo); 这个没见过
4,tr.AddEntity(btr, new Line(ptarr[0], ptarr[1])); 把其中一条直线延伸到这两点怎么样?
发表于 2010-12-22 15:41:16 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-22 15:45 编辑

1、var -> VS2008
2、IsColinearTo没有公差 -> 使用默认公差
3、pts.FindByExt(GeometryEx.CompareTo); -> TlsBasal.dll自带扩展
4、可以,不过删除,添加代码要简单些:)
先引用TlsBasal.dll,在代码中加入下列
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Reflection;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.Geometry;
  10. using Autodesk.AutoCAD.Runtime;
  11. using TlsCad.Collections;
  12. using TlsCad.ExtendMethods;
  13. using TlsCad.MTextTranslation;
  14. using TlsCad.Runtime;
  15. using TlsCad.Trans;

 楼主| 发表于 2010-12-22 19:12:58 | 显示全部楼层
请问老师我已引用你提供TlsBasal.dll类,但在调试中以下两句通不过,请帮看一下我错在那里
  1.                        //按XYZ排序方式找到最小点和最大点
  2.                         var ptarr = pts.FindByExt(GeometryEx.CompareTo);
  3.                         //删除原直线,并生成新的
  4.                         tr.Erase(lines);
复制代码
 楼主| 发表于 2010-12-22 19:14:19 | 显示全部楼层
以下是调试中提示

本帖子中包含更多资源

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

x
发表于 2010-12-22 23:34:40 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-22 23:53 编辑

看11楼(2012/12/22)
发表于 2010-12-23 13:01:11 | 显示全部楼层
在链接的帖子里我重新上传了更新版,你要再下载一次
 楼主| 发表于 2010-12-23 19:22:56 | 显示全部楼层
本帖最后由 chpmould 于 2010-12-23 19:25 编辑

老师我重新下载了,但以下两句中红色函数调不通。。。如果可以将此功能单独写出来,不用调用TlsBasal.dll类的那就更便于学习了。。。

  1.                        //按XYZ排序方式找到最小点和最大点
  2.                         var ptarr = pts.FindByExt(GeometryEx.CompareTo);
  3.                         //删除原直线,并生成新的
  4.                         tr.Erase(lines);
复制代码
发表于 2010-12-26 22:49:36 | 显示全部楼层
你的基础太薄弱了,闭关修行一段时间吧
 楼主| 发表于 2010-12-27 12:30:00 | 显示全部楼层
谢谢提示,后期我将多点时间消化一些基础的东西。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 14:47 , Processed in 0.178399 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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