[Revit API] Hướng dẫn tạo add-in FilterSelectionRebar | Vietbimcoder

[Revit API Task] Hướng dẫn tạo add-in Rebar SelectionFilter (Quét chọn đối tượng Revit và trả về đối tượng Rebar)

Bài viết này hướng dẫn cách lọc đối tượng trong tập hợp trong Revit. Cụ thể ở ví dụ bên dưới là lọc Rebar Element từ một bộ quét chọn

Lưu ý là ở đây chúng ta không đi quá sâu về C# mà chỉ tập trung đến Revit API, mọi kiến thứ chuyên sâu bên C# trong bài viết nếu bạn đọc chưa rõ vui lòng để lại comment chúng tôi sẽ giải đáp. Và vì là những phần tương đối khó bạn đọc vui lòng đọc thật kĩ và làm theo từng thao tác.

Bước 1: Tạo một dự án RevitAPI

Các bạn  có thể tham khảo cách khởi tạo dự án tại đây: https://vietbimcoder.com/revitapifirststep/

Bước 2: Tạo một class thực thi Interface ISelectionFilter:

 

Giao diện ISectionFilter là giao diện được xây dựng sẵn trong RevitAPI, cho phép người dùng lọc khi quét chọn đối tượng. Nhờ vậy, mà developers có thể hướng người sử dụng đến một nhóm đối tượng cụ thể nào đó để xử lý (hạn chế lỗi, pick nhầm đối tượng).

Bạn có thể chọn ISelectionFilter, nhấp phải -> chọn Go To Definition để xem định nghĩa của giao diện (xem hình mình họa bên dưới)

Có thể thấy giao diện ISelectionFilter có 2 phương thức trả về kiểu bool:

  • bool AllowElement(DB.Element elem): Cho phép element (Lưu ý mọi đối tượng trong môi trường Revit đều được định nghĩa là Element) đủ kiển kiện lọt qua (true) hoặc chặn lại (false)
  • bool AllowReference(Reference reference, DB.XYZ position): cho phép reference (reference là một tham chiếu một đối tượng nào đó trong Revit, có thể là Element, cũng có thể là hình học của đối tượng đó (Solid, Face, Edge…)) đủ điều kiện lọt qua (true) hoặc chặn lại (false)

Vậy chúng ta đã hiểu được giao diện ISelectionFilter là gì rồi phải không nào, bắt đầu tạo class thực thi giao diện nào (Ở đây mình đặt tên class là RebarSelectionFilter).

Tới đây là hoàn thành 70% mục tiêu rồi nhé, thấy đơn giản không nào!

 

Bước 3: Thực hiện các phần còn lại của class chính (ở đây là class Command nhé)

Nếu mọi người đã hiểu rõ và quen với các thuật toán Revit, ta có thể viết gọn dòng lệnh như sau:

Bước 4: Build và Test Code

Các bạn có thể tham khảo cách hoàn tất một dự án tại đây: https://vietbimcoder.com/revitapifirststep/

Hoàn tất mọi thứ, ta và Revit test thử thôi:

 

#region Namespaces
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
// Các bạn phải thêm 2 namespace sau:
using System.Linq;
using Autodesk.Revit.DB.Structure;
#endregion

namespace SelectRebars
{
[Transaction(TransactionMode.Manual)]
public class Command : IExternalCommand
{
  public Result Execute(ExternalCommandData commandData,ref string message,ElementSet elements)
  {
    UIApplication uiapp = commandData.Application;
    UIDocument uidoc = uiapp.ActiveUIDocument;
    Application app = uiapp.Application;
    Document doc = uidoc.Document;

    //1. Tạo biến rebarSelFil của class RebarSelectionFilter
    RebarSelectionFilter rebarSelFil = new RebarSelectionFilter();

    //2. Tạo biến sel: đây là biến để pick chọn đối tượng
    Selection sel = uidoc.Selection;

    //3. Thực thi phương thức sel.PickElementsByRectangle(rebarSelFil)
    // để yêu cầu người dùng quét chọn các đối tượng trong ActiveView
    // các đối tượng sẽ qua bộ lọc rebarSelFil để trả về các đối tượng là rebar

    //4. Gán các đối tượng vào một mảng động List<Element> để lưu trữ dữ liệu,
    // Mọi người chú ý phải ép về kiểu List<Element>
    // phương thực PickElementsByRectangle() trả về giao diện IList<Element>
    List<Element> elems = sel.PickElementsByRectangle(rebarSelFil) as List<Element>;

    //5. Sử dụng vòng lặp đề lấy ra mảng List<ElementId>
    //Cách 1:
    //Khởi tạo mảng
    List<ElementId> elemIds = new List<ElementId>();
    //Lặp các đối tượng trong mảng elems, lấy và add Id vào mảng elemIds
    foreach (Element e in elems)
    {
      elemIds.Add(e.Id);
    }

    //Cách 2: sử dụng namespace "using System.Linq;" phía trên
    //Linq là tập hợp các thuật toán để xử lý nhanh các mảng dữ liệu
    //tương tự với cách 1 nhưng đơn giản hóa dòng lệnh
    elemIds = elems.Select(x => x.Id).ToList();

    //6. Gán mảng ElementId vào Selection bằng phương thức sel.SetElementIds(elemIds)
    //lúc này Revit sẽ tự động cập nhập và pick chọn các đối tượng
    sel.SetElementIds(elemIds);

    //7. Thoát khỏi phương thức
    return Result.Succeeded;
  }
}
public class RebarSelectionFilter : ISelectionFilter
{
  public bool AllowElement(Element elem)
  {
    if (elem is Rebar) return true; //Nếu đối tượng là Rebar trả về true (cho phép lọt qua) và thoát phương thức
    return false; //Đối tượng không phải Rebar, trả về false (chặn lại)
  }
  public bool AllowReference(Reference reference, XYZ position)
  {
     return false; // Ở ví dụ này, chúng ta xử lý các đối tượng Revit (Rebar), nên ta sẽ loại bỏ hoàn toàn các tham chiếu
  }
}
}

Các bước tiếp theo đã được trình bày ở bài Khởi Tạo Add-in Revit, xin được vắn tắt qua đoạn video bên dưới

  • Bây giờ chúng ta có thể đặt lệnh tắt cho nó và sử dụng như một công cụ rất hữu hiệu cho việc lọc nhanh cốt thép trong Revit
  • Đây là Add-in sử dụng rất nhiều trong việc dựng hình về triển khai thép bằng Revit, hi vọng các bạn sẽ thành công với Add-in này.

Chúc các bạn thành công!

Mọi thắc mắc vui lòng comment bên dưới hoặc phản hồi vào fanpage vietbimcoder

Bài viết liên quan