Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
nguyentuyen6

[ C# ] Cách sắp xếp lại ObjectIDCollection?

Các bài được khuyến nghị

[ c#]

 

Đoạn code dưới đây tạo ra 2 đường tròn :

 

acCirc1 (5,0,0).............. bán kính : 5

acCirc1 (0,5,0).............. bán kính : 7

 

Rồi cho cả 2 vào: acObjIdColl (là 1ObjectIdCollection)

 

acObjIdColl = new ObjectIdCollection();
acObjIdColl.Add(acCirc1.ObjectId);
acObjIdColl.Add(acCirc2.ObjectId);

 

Các bác có cách nào sắp xếp thứ tự các ObjectId trong acObjIdColl theo trục X , hoặc Y, hoặc theo bán kính không?

Ví dụ:

 Sắp xếp theo X: acObjIdColl = (acCirc1--->acCirc2)

 Sắp xếp theo Y: acObjIdColl = (acCirc2--->acCirc1)

 Sắp xếp bán kính  : acObjIdColl = (acCirc2--->acCirc1)

 

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
 public static void Test()
{
  ObjectIdCollection acObjIdColl = new ObjectIdCollection();
 // Get the current document and database
  Document acDoc = Application.DocumentManager.MdiActiveDocument;
  Database acCurDb = acDoc.Database; 
 // Lock the current document
  using (DocumentLock acLckDocCur = acDoc.LockDocument())
  {
      // Start a transaction
      using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
      {
          // Open the Block table record for read
          BlockTable acBlkTbl;
          acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                       OpenMode.ForRead) as BlockTable;
          // Open the Block table record Model space for write
          BlockTableRecord acBlkTblRec;
          acBlkTblRec = acTrans.GetObject(acBlkTbl[blockTableRecord.ModelSpace],
                                          OpenMode.ForWrite) as BlockTableRecord;
          // Create a circle that is at (0,0,0) with a radius of 5
          Circle acCirc1 = new Circle();
          acCirc1.SetDatabaseDefaults();
          acCirc1.Center = new Point3d(5, 0, 0);
          acCirc1.Radius = 5;
          // Add the new object to the block table record and the transaction
          acBlkTblRec.AppendEntity(acCirc1);
          acTrans.AddNewlyCreatedDBObject(acCirc1, true);
          // Create a circle that is at (0,0,0) with a radius of 7
          Circle acCirc2 = new Circle();
          acCirc2.SetDatabaseDefaults();
          acCirc2.Center = new Point3d(0, 5, 0);
          acCirc2.Radius = 7;
          // Add the new object to the block table record and the transaction
          acBlkTblRec.AppendEntity(acCirc2);
          acTrans.AddNewlyCreatedDBObject(acCirc2, true);

 

          // Add all the objects to copy to the new document
          acObjIdColl = new ObjectIdCollection();
          acObjIdColl.Add(acCirc1.ObjectId);
          acObjIdColl.Add(acCirc2.ObjectId);

 

          // Save the new objects to the database

          acTrans.Commit();

      }
}
}

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn chuyển ObjectIDCollection -> List Object -> Array -> dùng hàm sort của Array với một hàm so sánh.

Đây là ví dụ sort DBText theo trục X

 

...
// Sort DBText by X
                    List<DBText> DBTextLst = new List<DBText>();
                    foreach (SelectedObject acSSobj in acSSet)
                    {
                        DBText txt = tr.GetObject(acSSobj.ObjectId, OpenMode.ForRead) as DBText;
                        if (txt != null)
                        {
                            DBTextLst.Add(txt);
                        }
                    }
                    DBText[] DBTextArr = DBTextLst.ToArray();
                    Array.Sort(DBTextArr, new sortDBTextByX());
...

internal class sortByX
    {
        protected static bool IsZero(double a)
        {
            return Math.Abs(a) < Tolerance.Global.EqualPoint;
        }
        protected static bool IsEqual(double a, double b)
        {
            return IsZero(b - a);
        }
        protected int Compare(double aX, double bX)
        {
            if (IsEqual(aX, bX)) return 0; // ==

            if (aX < bX) return -1; // <

            return 1; // >
        }
    }

internal class sortDBTextByX : sortByX, IComparer<DBText>
    {
        public int Compare(DBText a, DBText b)
        {
            return base.Compare(a.Position.X, b.Position.X);
        }
    }

 

internal class sortByX
    {
        protected static bool IsZero(double a)
        {
            return Math.Abs(a) < Tolerance.Global.EqualPoint;
        }
        protected static bool IsEqual(double a, double B)
        {
            return IsZero(b - a);
        }
        protected int Compare(double aX, double bX)
        {
            if (IsEqual(aX, bX)) return 0; // ==
 
            if (aX < bX) return -1; // <
 
            return 1; // >
        }
    }

 

                    // Sort DBText by X
                    List<DBText> DBTextLst = new List<DBText>();
                    foreach (SelectedObject acSSobj in acSSet)
                    {
                        DBText txt = tr.GetObject(acSSobj.ObjectId, OpenMode.ForRead) as DBText;
                        if (txt != null)
                        {
                            DBTextLst.Add(txt);
                        }
                    }
                    DBText[] DBTextArr = DBTextLst.ToArray();
                    Array.Sort(DBTextArr, new sortDBTextByX());
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hoặc dùng List<T> kết hợp với Linq.

Tham khảo  :

using System.Linq;
using System.Collections.Generic;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;

namespace GiaBach
{
    public class sortex
    {
        [CommandMethod("sortCircle")]
        public void sortCircle()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                TypedValue[] filter = { new TypedValue(0, "Circle") };
                PromptSelectionResult psr = ed.GetSelection(new SelectionFilter(filter));
                if (psr.Status != PromptStatus.OK) return;

                List<Circle> circleLst = new List<Circle>();
                foreach (ObjectId obj in psr.Value.GetObjectIds())
                    circleLst.Add(tr.GetObject(obj, OpenMode.ForRead) as Circle);

                PromptKeywordOptions pko = new PromptKeywordOptions("\nSort By: [Center/Radius] ", "Center Radius");
                pko.AllowNone = true;
                pko.Keywords.Default = "Center";
                PromptResult pr = ed.GetKeywords(pko);
                if (pr.StringResult == "Center") // sort by Center
                    circleLst = circleLst.OrderBy(p => p.Center.X).ThenBy(p => p.Center.Y).ToList();
                else // sort by Radius
                    circleLst = circleLst.OrderBy(cir => cir.Radius).ToList();

                BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                int stt = 1;
                foreach (Circle cir in circleLst)
                {
                    DBText txt = new DBText();
                    txt.Position = cir.Center;
                    txt.TextString = stt.ToString();
                    btr.AppendEntity(txt);
                    tr.AddNewlyCreatedDBObject(txt, true);
                    stt++;
                }
                tr.Commit();
            }
        }
    }
}
  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
CÔNG TY TNHH ISUZU VIỆT NAM
1691/3N QUỐC LỘ 1A, KP3, P.AN PHÚ ĐÔNG. QUẬN 12,HCM
0909 799 740 - 0988 044 999 Mr Trí
 

 800px-ISUZU_GIGA,_Full-cab_Aluminum-Wing

CÔNG TY TNHH ISUZU VIỆT NAM
Đại lý phân phối chính hãng Xe tải ISUZU EURO2, TURBO mới 100%:

Xe tải ISUZU 1,4 tấn:

btr1380695085.png
Kích thước tổng thể (DxRxC)(mm): 4740 x 1815 x 2170
Kích thước thùng (DxRxC)(mm): 3250x1800x1730
Dung tích xilanh: 2.771cc
Tổng trọng tải: 3,4 tấn
Tự trọng của xe: 1,715 tấn
Lốp xe: Trước 6.50 – 15 ; Sau 5.50 – 13


Xe Tải ISUZU 1 tấn 9:

 msm1380695213.png

Kích thước tổng thể (DxRxC)(mm): 6030 x 1860 x 2210
Kích thước thùng (DxRxC)(mm): 4600x1950x1900
Dung tích xilanh: 2.999cc
Tổng trọng tải: 4,7 tấn
Tự trọng của xe: 2,090 tấn
Lốp xe: Trước 7.00 – 16 ; Sau 7.00 – 16


Xe Tải ISUZU 3,95 tấn:

 dxn1380695802.jpg

Kích thước tổng thể (DxRxC)(mm): 6750 x 2060 x 2300
Kích thước thùng (DxRxC)(mm): 5400x2100x2230
Dung tích xilanh: 2.999cc
Tổng trọng tải: 7 tấn
Tự trọng của xe: 2,345 tấn
Lốp xe: Trước 7.50 – 16 ; Sau 7.50 – 16


Xe Tải ISUZU 5,5 tấn:
jjh1380696002.png
Kích thước tổng thể (DxRxC)(mm): 7355 x 2165 x 2335
Kích thước thùng (DxRxC)(mm): 6000x2250x2230
Dung tích xilanh: 5.193cc
Tổng trọng tải: 8,850 tấn
Tự trọng của xe: 2,645 tấn
Lốp xe: Trước 8.25 – 16 ; Sau 8.25 – 16


ISUZU 6,2 tấn:
umh1380696046.png
Kích thước tổng thể (DxRxC)(mm): 8330 x 2175 x 2540
Kích thước thùng (DxRxC)(mm): 6830x2360x2430
Dung tích xilanh: 5.193cc
Tổng trọng tải: 10,4 tấn
Tự trọng của xe: 3,1 tấn
Lốp xe: Trước 8.25 – 16 ; Sau 8.25 – 16


Xe tải ISUZU 9 tấn (thùng ngắn):

Kích thước tổng thể (DxRxC)(mm): 7460 x 2445 x 2815
Kích thước thùng (DxRxC)(mm): 5440x2450x2530
Dung tích xilanh: 7.790cc
Tổng trọng tải: 15,1 tấn
Tự trọng của xe: 4,630 tấn
Lốp xe: Trước 10.00 – 20 ; Sau 10.00 – 20


ISUZU 9 tấn (thùng dài):
cfz1380696261.png
Kích thước tổng thể (DxRxC)(mm): 9770 x 2445 x 2815
Kích thước thùng (DxRxC)(mm): 7750x2450x2530
Dung tích xilanh: 7.790cc
Tổng trọng tải: 15,1 tấn
Tự trọng của xe: 4,820 tấn
Lốp xe: Trước 10.00 – 20 ; Sau 10.00 – 20


Xe tải ISUZU 16 tấn (thùng ngắn):
zjc1380696105.png
Kích thước tổng thể (DxRxC)(mm): 9730 x 2440 x 2876
Kích thước thùng (DxRxC)(mm): 8255x2450x2530
Dung tích xilanh: 7.790cc
Tổng trọng tải: 24 tấn
Tự trọng của xe: 6,680 tấn
Lốp xe: Trước 11.00 – 20 ; Sau 11.00 – 20


Xe tải ISUZU 16 tấn (thùng dài):
ypq1380696416.png
Kích thước tổng thể (DxRxC)(mm): 11275 x 2440 x 2876
Kích thước thùng (DxRxC)(mm): 9255x2450x2530
Dung tích xilanh: 7.790cc
Tổng trọng tải: 24 tấn
Tự trọng của xe: 6,880 tấn
Lốp xe: Trước 11.00 – 20 ; Sau 11.00 – 20

NHẬN THIẾT KẾ CÁC LOẠI THÙNG THEO YÊU CẦU:

  • Thùng mui kín (tôn kẽm, nhôm, inox, composite)
  • Thùng mui bạt (tôn kẽm, nhôm, inox)
  • Thùng kín, thùng bảo ôn, thùng kèo mui bạt (tôn kẽm, INOX, nhôm)
  • Thùng đông lạnh
  • Thùng xe ben: 2m3 – 15m3
  • Thùng xe chở xe máy
  • Thùng xe vận chuyển ô tô
  •  

Đặc biệt bán trả góp: Quý khách chỉ cần trả trước 20 – 50%, từ 2 – 5 năm, không cần thế chấp. Giao xe ngay!

Thủ tục mua xe trả góp: CMND + Sổ Hộ khẩu ( Photo). – Đối với cá nhân

                                    Giấy phép kinh doanh ( Bản sao). – Đối với Công ty, DN.

Bán xe tải trả góp: Trả trước 20 – 50%, từ 2 – 5 năm, ko cần thế chấp. Giao xe ngay!

Thông tin khuyến mãi vui lòng liên hệ: 0909 799 740 Mr Trí

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×