雪山飞狐_lzh 发表于 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
      
      public static void tttt()
      {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;

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

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

                  //转换DBLine为GeLineSegment3d
                  bool flag = false;
                  LineSegment3d ls = line.ToCurve3d();
                  //遍历分组字典
                  foreach (var lls in dict)
                  {
                        //如果共线,加入当前组
                        if (lls.Key.IsColinearTo(ls))
                        {
                            flag = true;
                            lls.Value.Add(line);
                            break;
                        }
                  }

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

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

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

                        //删除原直线,并生成新的
                        tr.Erase(lines);
                        var btr = tr.OpenCurrentSpace();
                        tr.AddEntity(btr, new Line(ptarr, ptarr));

                  }
                }
            }
      }

sieben 发表于 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, ptarr)); 把其中一条直线延伸到这两点怎么样?

雪山飞狐_lzh 发表于 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,在代码中加入下列
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using TlsCad.Collections;
using TlsCad.ExtendMethods;
using TlsCad.MTextTranslation;
using TlsCad.Runtime;
using TlsCad.Trans;

chpmould 发表于 2010-12-22 19:12:58

请问老师我已引用你提供TlsBasal.dll类,但在调试中以下两句通不过,请帮看一下我错在那里                     //按XYZ排序方式找到最小点和最大点
                        var ptarr = pts.FindByExt(GeometryEx.CompareTo);
                        //删除原直线,并生成新的
                        tr.Erase(lines);

chpmould 发表于 2010-12-22 19:14:19

以下是调试中提示

雪山飞狐_lzh 发表于 2010-12-22 23:34:40

本帖最后由 lzh741206 于 2010-12-22 23:53 编辑

看11楼(2012/12/22)

雪山飞狐_lzh 发表于 2010-12-23 13:01:11

在链接的帖子里我重新上传了更新版,你要再下载一次

chpmould 发表于 2010-12-23 19:22:56

本帖最后由 chpmould 于 2010-12-23 19:25 编辑

老师我重新下载了,但以下两句中红色函数调不通。。。如果可以将此功能单独写出来,不用调用TlsBasal.dll类的那就更便于学习了。。。
                     //按XYZ排序方式找到最小点和最大点
                        var ptarr = pts.FindByExt(GeometryEx.CompareTo);
                        //删除原直线,并生成新的
                        tr.Erase(lines);

sxpd 发表于 2010-12-26 22:49:36

你的基础太薄弱了,闭关修行一段时间吧

chpmould 发表于 2010-12-27 12:30:00

谢谢提示,后期我将多点时间消化一些基础的东西。。。
页: 1 [2] 3
查看完整版本: 实现多条线一起合并