Thứ Tư, 26 tháng 3, 2025

Jig là gì | Cơ bản về Jig trong AutoCad | AutoCad dotNet

Ứng dụng được phát triển/Sưu tầm bởi đội ngũ AutoLISP Thật là đơn giản
   

Thông tin thêm: 👉👉👉

Giới thiệu về EntityJig trong AutoCAD dotNet với C#

Người thực hiện: AJS
Đối tượng: Cộng đồng lập trình AutoCAD dotNet
Thời gian dự kiến: 60-90 phút


Phần 1: Jig là gì? (10 phút)

  • Định nghĩa Jig:
    Jig là một công cụ trong AutoCAD API cho phép người dùng tương tác trực tiếp với đối tượng đồ họa (entity) trong quá trình vẽ hoặc chỉnh sửa. Jig hoạt động như một "trình diễn trực tiếp" (preview) giúp người dùng thấy trước kết quả trước khi hoàn tất lệnh.
  • Ứng dụng của Jig:
    • Tạo trải nghiệm người dùng mượt mà, trực quan.
    • Hỗ trợ các thao tác như kéo thả, di chuyển, xoay, hoặc sao chép đối tượng trong thời gian thực.
  • Hai loại Jig chính trong AutoCAD dotNet:
    1. EntityJig: Dùng để thao tác trên một đối tượng cụ thể (entity) đã tồn tại.
    2. DrawJig: Dùng để vẽ hoặc tạo mới đối tượng từ đầu.

Phần 2: Kiến thức cơ bản về Jig (20 phút)

  • EntityJig:
    • Là lớp cơ sở để chỉnh sửa một entity hiện có (ví dụ: Line, Circle, Polyline).
    • Yêu cầu kế thừa từ lớp EntityJig và override các phương thức như Update() để cập nhật trạng thái entity trong quá trình tương tác.
    • Ví dụ: Di chuyển một đường thẳng bằng cách kéo thả.
    • Cấu trúc cơ bản:
      Code:
      public class MyEntityJig : EntityJig
      {
          private Point3d _basePoint;
          public MyEntityJig(Entity entity, Point3d basePoint) : base(entity)
          {
              _basePoint = basePoint;
          }
      
          protected override bool Update()
          {
              // Cập nhật vị trí hoặc thuộc tính của entity
              return true;
          }
      }

  • DrawJig:
    • Dùng để vẽ entity mới trong thời gian thực, dựa trên đầu vào từ người dùng (chuột, bàn phím).
    • Kế thừa từ lớp DrawJig và override các phương thức như WorldDraw() để hiển thị đối tượng tạm thời.
    • Ví dụ: Vẽ một đường thẳng hoặc sao chép một đối tượng.
    • Cấu trúc cơ bản:
      Code:
      public class MyDrawJig : DrawJig
      {
          private Point3d _startPoint, _endPoint;
          public MyDrawJig(Point3d startPoint)
          {
              _startPoint = startPoint;
          }
      
          protected override SamplerStatus Sampler(JigPrompts prompts)
          {
              // Lấy vị trí từ người dùng
              return SamplerStatus.OK;
          }
      
          protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
          {
              // Vẽ đối tượng tạm thời
              return true;
          }
      }


Phần 3: Ví dụ thực tế - CopyJig (DrawJig) (30 phút)

  • Mục tiêu: Tạo một công cụ sao chép đối tượng (entity) trong AutoCAD, cho phép người dùng kéo thả để xác định vị trí bản sao.
  • Ý tưởng:
    • Chọn một entity (ví dụ: Line, Circle).
    • Sử dụng DrawJig để hiển thị bản sao trong thời gian thực khi người dùng di chuyển chuột.
    • Xác nhận vị trí cuối cùng để thêm bản sao vào bản vẽ.
  • Code mẫu - CopyJig:
    Code:
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Geometry;
    using Autodesk.AutoCAD.Runtime;
    
    public class CopyJig : DrawJig
    {
        private Entity _entity;
        private Point3d _basePoint, _currentPoint;
        public Entity CopiedEntity { get; private set; }
    
        public CopyJig(Entity entity, Point3d basePoint)
        {
            _entity = entity;
            _basePoint = basePoint;
        }
    
        protected override SamplerStatus Sampler(JigPrompts prompts)
        {
            JigPromptPointOptions options = new JigPromptPointOptions("\nChọn vị trí mới: ");
            options.BasePoint = _basePoint;
            options.UseBasePoint = true;
            PromptPointResult result = prompts.AcquirePoint(options);
    
            if (result.Status == PromptStatus.OK)
            {
                _currentPoint = result.Value;
                return SamplerStatus.OK;
            }
            return SamplerStatus.Cancel;
        }
    
        protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
        {
            Vector3d displacement = _currentPoint - _basePoint;
            Entity tempEntity = (Entity)_entity.Clone();
            tempEntity.TransformBy(Matrix3d.Displacement(displacement));
            draw.Geometry.Draw(tempEntity);
            CopiedEntity = tempEntity;
            return true;
        }
    
        [CommandMethod("COPYJIG")]
        public static void RunCopyJig()
        {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            PromptEntityResult entityResult = ed.GetEntity("\nChọn đối tượng để sao chép: ");
            if (entityResult.Status != PromptStatus.OK) return;
    
            PromptPointResult basePointResult = ed.GetPoint("\nChọn điểm cơ sở: ");
            if (basePointResult.Status != PromptStatus.OK) return;
    
            using (Transaction tr = ed.Document.Database.TransactionManager.StartTransaction())
            {
                Entity entity = tr.GetObject(entityResult.ObjectId, OpenMode.ForRead) as Entity;
                CopyJig jig = new CopyJig(entity, basePointResult.Value);
                PromptResult jigResult = ed.Drag(jig);
    
                if (jigResult.Status == PromptStatus.OK)
                {
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(
                        ed.Document.Database.CurrentSpaceId, OpenMode.ForWrite);
                    btr.AppendEntity(jig.CopiedEntity);
                    tr.AddNewlyCreatedDBObject(jig.CopiedEntity, true);
                }
                tr.Commit();
            }
        }
    }

  • Giải thích:
    • Sampler(): Lấy vị trí chuột từ người dùng.
    • WorldDraw(): Vẽ bản sao tạm thời của entity.
    • Command COPYJIG: Chạy lệnh để sao chép đối tượng.

Phần 4: Quà tặng cho người tham gia (10 phút)

  • Solution CopyJig:
    • Một dự án Visual Studio hoàn chỉnh chứa code CopyJig như trên, sẵn sàng để người tham gia tải về, chạy thử và tùy chỉnh.
  • Hàm vẽ CreateTable từ List<List<string>>:
    • Hàm tạo bảng (Table) trong AutoCAD từ dữ liệu dạng danh sách.
    • Code mẫu:
      Code:
      public static void CreateTable(Point3d position, List<List<string>> data)
      {
          using (Transaction tr = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
          {
              BlockTableRecord btr = (BlockTableRecord)tr.GetObject(
                  Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.CurrentSpaceId, OpenMode.ForWrite);
              Table table = new Table();
              table.Position = position;
              table.SetSize(data.Count, data[0].Count);
      
              for (int i = 0; i < data.Count; i++)
              {
                  for (int j = 0; j < data[i].Count; j++)
                  {
                      table.Cells[i, j].TextString = data[i][j];
                  }
              }
      
              btr.AppendEntity(table);
              tr.AddNewlyCreatedDBObject(table, true);
              tr.Commit();
          }
      }

    • Cách sử dụng: Truyền vào vị trí đặt bảng và dữ liệu dạng danh sách lồng nhau (List<List<string>>).

Phần 5: Kết luận và Hỏi đáp (10-20 phút)

  • Tóm tắt:
    • Jig là công cụ mạnh mẽ để tạo trải nghiệm tương tác trong AutoCAD.
    • EntityJig và DrawJig có vai trò riêng biệt nhưng đều dễ tiếp cận với C#.
  • Mời người tham gia thử nghiệm code, đặt câu hỏi hoặc đề xuất ý tưởng ứng dụng Jig trong dự án thực tế.

Tài liệu bổ sung

  • File tải về: Solution CopyJig + Hàm CreateTable.
  • Liên hệ: AJS (cung cấp email hoặc kênh cộng đồng nếu cần).

Hy vọng bài giảng này sẽ giúp cộng đồng AutoCAD dotNet hiểu rõ hơn về Jig và áp dụng hiệu quả trong công việc!


Link tải (Cập nhật trong Livestream)
Code:



Link nhóm AutoCad dotNet



---------------------------------------------------------------------------------------------
Ứng dụng được phát triển bởi đội ngũ AutoLISP Thật là đơn giản - Tác giả ứng dụng in D2P

    

Mọi thông tin xin liên hệ Fanpage AutoLISP Thật là đơn giản!
Cảm ơn bạn đã theo dõi!

Không có nhận xét nào:

Đăng nhận xét

Tạo Hatch boundary bằng API | Generate Hatch boundaries by API | AutoCAD dotNet

Ứng dụng được phát triển/Sưu tầm bởi đội ngũ AutoLISP Thật là đơn giản     Thông tin thêm: 👉👉👉