Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
3 replies to this topic

#1 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 03 April 2014 - 03:43 PM

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

      }
}
}

 


  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#2 Skywings

Skywings

    biết lệnh erase

  • Members
  • PipPipPip
  • 102 Bài viết
Điểm đánh giá: 46 (tàm tạm)

Đã gửi 03 April 2014 - 10:37 PM

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

  • 1

#3 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1434 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 04 April 2014 - 01:17 PM

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

  • 2

#4 isuzu viet nam

isuzu viet nam

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 04 April 2014 - 01:28 PM

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í

 


  • 0