[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 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; } } }
[…] https://vietbimcoder.com/revit-api-task-tao-addin-rebar-beam-phan-1-chon-doi-tuong/ […]
[…] Phần 1: Chọn đối tượng […]