各种排序分组

简易排序方法如下: 

  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();
     



  }
 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;
 }
 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;
 }

调整后的效果:

   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);
           }
       }
   }
  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;
  }

之字形排序:

 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);
         }
         }
         
     }
 }
 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);
                  }
              }
          }

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

[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();
    }
}

end

  public static class PersonGrouping
  {
      
      public static List<List<Person>> GroupPersons(List<Person> persons)
      {
          List<List<Person>> groups = new List<List<Person>>();
          HashSet<Person> visited = new HashSet<Person>();

          foreach (var person in persons)
          {
              if (!visited.Contains(person))
              {
                  List<Person> group = new List<Person>();
                  DFS(person, group, visited);
                  groups.Add(group);
              }
          }

          return groups;
      }

      private static void DFS(Person person, List<Person> group, HashSet<Person> visited)
      {
          if (person == null || visited.Contains(person)) return;

          group.Add(person);
          visited.Add(person);

          foreach (var friend in person.Friends)
          {
              DFS(friend, group, visited);
          }
      }

      public static void PrintGroups(List<List<Person>> groups)
      {
          foreach (var group in groups)
          {
              Console.WriteLine("Group:");
              foreach (var person in group)
              {
                  Console.WriteLine($" - {person.Name}");
              }
              Console.WriteLine();
          }
      }
  }
  public class Person
  {
      public string Name { get; }
      public List<Person> Friends { get; } = new List<Person>();

      public Person(string name)
      {
          Name = name;
      }

      public override string ToString()
      {
          return Name;
      }
  }
  public class PersonG
  {
      public static void Go()
      {
          int k = 0;
          var circles = Z.db.SelectEntities<Entity>();
          List<List<Entity>> bigteam = Z.GroupEntities<Entity>(circles, Z.IsHorizontalOverlap);
          bigteam = bigteam.OrderByDescending(x => x[0].Bounds.Value.MinPoint.Y).ToList();
          for (int i = 0; i < bigteam.Count; i++)
          {
              bigteam[i] = bigteam[i].OrderBy(x => x.Bounds.Value.MinPoint.X).ToList();
              for (int j = 0; j < bigteam[i].Count; j++)
              {
                  k = k + 1;
                  DBText text = new DBText()
                  { Position = new Point3d((bigteam[i][j].Bounds.Value.MinPoint.X+ bigteam[i][j].Bounds.Value.MaxPoint.X)/2,
                  (bigteam[i][j].Bounds.Value.MinPoint.Y + bigteam[i][j].Bounds.Value.MaxPoint.Y)/2,0.0), TextString = k.ToString(), 
                      Height = 0.8, ColorIndex = 1,
                      VerticalMode = TextVerticalMode.TextVerticalMid,
                      HorizontalMode = TextHorizontalMode.TextMid,
                      AlignmentPoint = new Point3d((bigteam[i][j].Bounds.Value.MinPoint.X + bigteam[i][j].Bounds.Value.MaxPoint.X) / 2,
                  (bigteam[i][j].Bounds.Value.MinPoint.Y + bigteam[i][j].Bounds.Value.MaxPoint.Y) / 2, 0.0),
                  };
                  Z.db.AddEntityToModeSpace(text);
              }
          }
      }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山水CAD插件定制

你的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值