各种排序分组

简易排序方法如下:

cs 复制代码
  public static  void XX()
  {
      var circles = Z.db.SelectEntities<Circle>();

      circles = circles.OrderByDescending(x => x.Center.Y).ThenBy(x => x.Center.X).ToList();
      for (int i = 0; i < circles.Count; i++)
      {
          DBText text = new DBText() { Position = circles[i].Center, TextString = i.ToString(),Height = 1,ColorIndex= 1 };
          Z.db.AddEntityToModeSpace(text);
      }
      
      //Debugger.Break();
     



  }
cs 复制代码
 public static List<T> SelectEntities<T>(this Database db ) where T : Entity
 {
     List<T> result = new List<T>();
     Editor editor = Application.DocumentManager.MdiActiveDocument.Editor;
     var pso = new PromptSelectionOptions();
     pso.MessageForAdding = "\n请选择:";
     PromptSelectionResult psr = editor.GetSelection(pso);
     if (psr.Status == PromptStatus.OK)
     {
         ObjectId[] objectids = psr.Value.GetObjectIds();
         Database database = HostApplicationServices.WorkingDatabase;
         using (Transaction tran = database.TransactionManager.StartTransaction())
         {
             foreach (var item in objectids)
             {
                 Entity entity = item.GetObject(OpenMode.ForRead) as Entity;
                 if (entity is T)
                 {
                     result.Add(entity as T);
                 }

             }
         }
     }
     return result;
 }
cs 复制代码
 public static ObjectId AddEntityToModeSpace(this Database db, Entity ent)
 {
     // 声明ObjectId 用于返回
     ObjectId entId = ObjectId.Null;
     // 开启事务处理
     using (Transaction trans = db.TransactionManager.StartTransaction())
     {
         // 打开块表
         BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
         // 打开块表记录
         BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
         // 添加图形到块表记录
         entId = btr.AppendEntity(ent);
         // 更新数据信息
         trans.AddNewlyCreatedDBObject(ent, true);
         // 提交事务
         trans.Commit();
     }
     return entId;
 }

调整后的效果:

cs 复制代码
   public static  void XX()
   {
       int k = 0;
       var circles = Z.db.SelectEntities<Circle>();
       List < List < Circle >> bigteam = Z.GroupEntities<Circle>(circles,Z.IsHorizontalOverlap);
       bigteam = bigteam.OrderByDescending(x => x[0].Center.Y).ToList();
       for (int i = 0; i < bigteam.Count; i++)
       {
           bigteam[i] = bigteam[i].OrderBy(x => x.Center.X).ToList();
           for ( int j = 0; j < bigteam[i].Count; j++)
           {
               k = k + 1;
               DBText text = new DBText() { Position = bigteam[i][j].Center, TextString = k.ToString(), Height = 0.8, ColorIndex = 1 };
               Z.db.AddEntityToModeSpace(text);
           }
       }
   }
cs 复制代码
  public static List<List<T>> GroupEntities<T>(List<T> entities,Func<Entity,Entity,bool>
      func)where T : Entity
  {
      List<List<T>> result = new List<List<T>>();
      List<Friend> friends = new List<Friend>();
      for (int i = 0; i < entities.Count; i++)
      {
          Friend friend = new Friend(i);
          friends.Add(friend);
      }
      for (int i = 0; i < entities.Count - 1; i++)
      {
          for (int j = 0; j < entities.Count; j++)
          {
              if (func(entities[i], entities[j]))
              {
                  friends[i].Friends.Add(friends[j]);
                  friends[j].Friends.Add(friends[i]);
              }
          }
      }
      while (friends.Count > 0)
      {
          List<T> list = new List<T>();
          Queue<Friend> queue = new Queue<Friend>();
          queue.Enqueue(friends[0]);
          friends.RemoveAt(0);
         *****
          result.Add(list);
      }

      return result;
  }

之字形排序:

cs 复制代码
 public static  void XX()
 {
     int k = 0;
     var circles = Z.db.SelectEntities<Circle>();
     List < List < Circle >> bigteam = Z.GroupEntities<Circle>(circles,Z.IsHorizontalOverlap);
     bigteam = bigteam.OrderByDescending(x => x[0].Center.Y).ToList();
     for (int i = 0; i < bigteam.Count; i++)
     {
         if (i % 2 != 0)
         {
             bigteam[i] = bigteam[i].OrderByDescending(x => x.Center.X).ToList();
             for (int j = 0; j < bigteam[i].Count; j++)
             {
                 k = k + 1;
                 DBText text = new DBText() { Position = bigteam[i][j].Center, TextString = k.ToString(), Height = 0.8, ColorIndex = 1 };
                 Z.db.AddEntityToModeSpace(text);
             }
         }
         else
         {
             bigteam[i] = bigteam[i].OrderBy(x => x.Center.X).ToList();
         for ( int j = 0; j < bigteam[i].Count; j++)
         {
             k = k + 1;
             DBText text = new DBText() { Position = bigteam[i][j].Center, TextString = k.ToString(), Height = 0.8, ColorIndex = 1 };
             Z.db.AddEntityToModeSpace(text);
         }
         }
         
     }
 }
cs 复制代码
 while (queue.Count > 0)
          {
              Friend friend = queue.Dequeue();
              list.Add(entities[friend.Id]);
              foreach (Friend f in friend.Friends)
              {
                  if (friends.Contains(f))
                  {
                      queue.Enqueue(f);
                      friends.Remove(f);
                  }
              }
          }

规定组数分组法,区别与横向碰撞分组,一刀切分组。

cs 复制代码
[CommandMethod("CirsOrderBy")]
public void CirsOrderBy()
{
    double fenShu = 5;
    List<Circle> cirs = new List<Circle>();
    Editor ed = Tool.GetEditor();
    PromptSelectionOptions selectionOptions = new PromptSelectionOptions();
    SelectionFilter sf = new SelectionFilter(new TypedValue[] { new TypedValue((int)DxfCode.Start,"Circle")});
    PromptSelectionResult psr = ed.SelectAll(sf);
    if (psr == null) return;
    using (Transaction tr = Tool.GetCurDatabse().TransactionManager.StartTransaction())
    {
        ObjectId[] ids=psr.Value.GetObjectIds();
        for (int i = 0; i < ids.Length; i++) 
        {
            Circle cir= tr.GetObject(ids[i],OpenMode.ForRead)as Circle;
            cirs.Add(cir);
        }
        tr.Commit();
    }
    cirs=cirs.OrderBy(c => c.Center.Y).ToList();
    double totalHeight=cirs.Last().Center.Y-cirs.First().Center.Y;
    double quJian = totalHeight / fenShu;
    int quJianShu =(int)Math.Ceiling(totalHeight / fenShu);
    List<List<Circle>>cirGroups= new List<List<Circle>>();
    List<Circle>cirGroup= new List<Circle>();
    for (int i = 0; i < quJianShu; i++) 
    {
        cirGroup=cirs.Where(c=>c.Center.Y>=cirs.First().Center.Y+i*quJian&& c.Center.Y < cirs.First().Center.Y + (i+1) * quJian).ToList();
        if (i % 2 == 0)
        {
            cirGroup = cirGroup.OrderBy(c => c.Center.X).ToList();
        }
        else
        {
            cirGroup = cirGroup.OrderByDescending(c => c.Center.X).ToList();
        }
        cirGroups.Add(cirGroup);
    }
    cirs.Clear();
    foreach (var item in cirGroups)
    {
        foreach (var circle in item)
        { 
            cirs.Add(circle);
        }
    }
    Database db = Tool.GetCurDatabse();
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        BlockTable bt=tr.GetObject(db.BlockTableId,OpenMode.ForRead)as BlockTable;
        BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;
        for (int i = 0; i < cirs.Count; i++) 
        {
            DBText txt= new DBText();
            txt.Position = cirs[i].Center;
            txt.VerticalMode = TextVerticalMode.TextVerticalMid;
            txt.HorizontalMode = TextHorizontalMode.TextMid;
            txt.AlignmentPoint = cirs[i].Center;
            txt.TextString=(i+1).ToString();
            txt.Height = 50;
            txt.ColorIndex = 2;
            btr.AppendEntity(txt);
            tr.AddNewlyCreatedDBObject(txt, true);
        }
        tr.Commit();
    }
}
相关推荐
boy快快长大1 分钟前
【MySQL】InnoDB记录存储结构
数据库·mysql
yaoxtao2 分钟前
neo4j数据库的导入和导出
数据库
卓码软件测评5 分钟前
CMA/CNAS软件测评机构:【Gatling数据库性能关联测试JDBC连接和SQL执行时间监控】
数据库·sql·测试工具·性能优化·测试用例
郑州光合科技余经理10 分钟前
实战分享:如何构建东南亚高并发跑腿配送系统
java·开发语言·javascript·spring cloud·uni-app·c#·php
爱装代码的小瓶子11 分钟前
【c++进阶】C++11新特性:一切皆可{}初始化
开发语言·c++·visual studio
lixora12 分钟前
备份指定oracle block 防止误操作
数据库
yaoxin52112314 分钟前
273. Java Stream API - Stream 中的中间操作:Mapping 操作详解
java·开发语言·python
技术小甜甜15 分钟前
[Python实战] 告别浏览器驱动烦恼:用 Playwright 优雅实现网页自动化
开发语言·python·自动化
vortex515 分钟前
Bash 替换机制(一):命令替换与进程替换
开发语言·chrome·bash
一念一花一世界17 分钟前
Arbess从基础到实践(25) - 集成GitLab+阿里云OSS实现Java项目自动化构建并将制品上传Aliyun OSS
java·阿里云·gitlab·cicd·arbess