[Revit API Task] Tạo Addin RebarBeam - Phần 1: Chọn đối tượng | Vietbimcoder.com
C# căn bản Revit API Revit structure 

[REVIT API TASK] TẠO ADD-IN REBAR BEAM – TẠO THÉP DẦM TỰ ĐỘNG (PHẦN 1: CHỌN ĐỐI TƯỢNG)

Mình xin chia sẻ một series bài viết về dự án Add-in RebarBeam (Tạo thép dầm tự động).

Qua series này, các bạn sẽ nắm được trình tự tạo thành một add-in, tư duy thuật toán cũng như các ý tưởng phát triển dự án.

Các bài còn lại trong series:

Phần 2: Truy xuất kích thước hình học

Phần 3: Truy xuất trục tọa độ

Phần 4: Truy xuất tọa độ tiết diện

Khởi tạo dự án

Các bạn có thể tham khảo bài viết sau để nằm được các bước khởi tạo dự án: https://vietbimcoder.com/revitapifirststep/

(Lưu ý: Ở dự án này mình sử dụng framework 4.7.2 và thư viện RevitAPI ở phiên bản 2019)

Truy xuất dữ liệu cần thiết

UIApplication uiapp = commandData.Application;  
Application app = uiapp.Application;  
UIDocument uidoc = uiapp.ActiveUIDocument;  
Document doc = uidoc.Document;

Các kiểu dữ liệu Application và Document là các kiễu dữ liệu định nghĩa đối tượng ở mức quản lý cao nhất trong tổ chức dữ liệu Revit API.

Application là đối tượng đại diện cho ứng dụng Revit đang mở (Revit session), cung cấp khả truy cập vào các document hiện hành, thiết lập tùy chọn và truy xuất dữ liệu chung.

Document là đối tượng đại diện cho hồ sơ mô hình một dự án trong Revit, cung cấp khả năng truy cập và xử lý dữ liệu trong một dự án.

Sử dụng Selection để chọn đối tượng dầm

Selection.PickObject()

Selection là kiểu dữ liệu được định nghĩa một tập hợp gồm các Element được chọn theo yêu cầu người dùng. Phương thức Selection.PickObject() hỗ trợ người dung chọn một Element theo ý muốn bằng chuột.

ISelectionFilter

Để tránh người sử dụng chọn các đối tượng không theo ý muốn, ta cần khởi tạo kiểu dữ liệu BeamSelectionFilter chỉ cho phép các đối tượng loại dầm được chọn.

public class BeamSelectionFilter: ISelectionFilter 
{  
    public bool AllowElement(Element elem) 
    {  
        if (elem.Category.Id.IntegerValue == (int)BuiltInCategory.OST_StructuralFraming) 
             return true;  
        return false;  
    }  
    public bool AllowReference(Reference reference, XYZ position) 
    {  
        return false;  
    }  
}

 

ISelectionFilter là một Interface để thực hiện việc lọc các đối tượng thõa mãn yêu cầu người dùng trong quá trình chọn.

Bạn có tham khảo bài viết sau có giải thích rõ hơn về ISelectionFilter: https://vietbimcoder.com/huong-dan-tao-add-in-filterselectionrebar.

Trả về đối tượng cần truy xuất thông tin

Phương thức Selection.PickObject() sẽ trả về một Reference tham chiếu đến đối tượng gốc.

Ta cần dùng phương thức Document.GetElement() để lấy giá trị đối tượng.

Selection sel = uidoc.Selection;
Reference rf = sel.PickObject(ObjectType.Element, new BeamSelectionFilter());
Element elem = doc.GetElement(rf);

Kết quả

Ta dùng phương thức TaskDialog.Show() để hiện thị hộp thoại thông tin đối tượng ra màn hình.

TaskDialog.Show("Revit", $"Cấu kiện được chọn tên là: {elem.Name}");

Kết quả khá ổn đúng không nào? Test thử thôi.

Phần tiếp theo mình sẽ mô tả cách lấy thông tin hình học của đối tượng. Các bạn nhớ theo dõi nhé.

Đoạn code hoàn chỉnh:

using Autodesk.Revit.ApplicationServices;  
using Autodesk.Revit.Attributes;  
using Autodesk.Revit.DB;  
using Autodesk.Revit.UI;  
using Autodesk.Revit.UI.Selection;  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
namespace RebarBeam_Example 
{  
    [Transaction(TransactionMode.Manual)] 
    public class Command: IExternalCommand 
    {  
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) 
        {  
            UIApplication uiapp = commandData.Application;  
            Application app = uiapp.Application;  
            UIDocument uidoc = uiapp.ActiveUIDocument;  
            Document doc = uidoc.Document;  
            Selection sel = uidoc.Selection;  
            Reference rf = sel.PickObject(ObjectType.Element, new BeamSelectionFilter());  
            Element elem = doc.GetElement(rf);  
            TaskDialog.Show("Revit", $"Cấu kiện được chọn tên là: {elem.Name}");  
            return Result.Succeeded;  
        }  
    }  
    public class BeamSelectionFilter: ISelectionFilter 
    {  
        public bool AllowElement(Element elem) 
        {   
            if (elem.Category.Id.IntegerValue == (int)BuiltInCategory.OST_StructuralFraming) 
                  return true;  
            return false;  
        }  
        public bool AllowReference(Reference reference, XYZ position) 
        {  
            return false;  
        }  
    }  
}

Bài viết liên quan