[REVIT API Task] Tạo Addin RebarBeam - Phần 2: Kích thước hình học
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 2: TRUY XUẤT KÍCH THƯỚC HÌNH HỌC)

Tiếp tục series add-in Rebar Beam, ở phần 2 mình sẽ hướng dẫn truy xuất kích thước hình học của đối tượng dầm.

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

Phần 1: Chọn đối tượng

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

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

Khái niệm:

Thông tin hình học của dầm cần truy xuất gồm 2 phần: kích thước hình học và hệ tọa độ địa phương của dầm.

Kích thước hình học:

Width, Height, Length đại hiện cho chiều rộng, chiều cao và chiều dài của dầm.

Hệ tọa độ địa phương:

Kiểu dữ liệu XYZ chứa 3 giá trị X, Y, Z đại diện cho giá trị tọa độ một điểm, hoặc xác định một vector chỉ phương trong không gian ba chiều.

Origin: Gốc tọa độ của dầm

VectorX: Vector chỉ phương từ gốc tọa độ, song song với chiều dài dầm, có chiều dài là 1 đơn vị.

VectorY: Vector chỉ phương từ gốc tọa độ, song song với chiều rộng dầm, có chiều dài là 1 đơn vị.

VectorZ: Vector chỉ phương từ gốc tọa độ, song song với chiều cao dầm, có chiều dài là 1 đơn vị.

Ở phần 2.1, ta tìm hiểu cách để truy xuất kích thước hình học đối tượng.

Truy xuất kích thước

ElementType

Mỗi đối tượng thể hiện trong mô hình Revit đều tồn tại kiểu của chúng, trong Revit API định nghĩa kiểu dữ liệu ElementType là lớp con của kiểu dữ liệu Element. Ví dụ: dầm BVH1 thuộc loại 300x500mm, dầm BVH2 thuộc loại 200x600mm…

Ta dùng phương thức Element.GetTypeId() để lấy giá trị ElementId định nghĩa ElementType tương ứng. Sau đó dùng phương thức Document.GetElement() để lấy giá trị ElementType.

ElementId elemTypeId = elem.GetTypeId();  
Element elemType = doc.GetElement(elemTypeId);

Parameter

Thông tin ElementType được lưu trữ trong Parameter. Parameter là kiểu dữ liệu định nghĩa một tham biến thiết lập thông tin cũng như hình ảnh hiển thị của Element.

Thông tin chiều rộng, chiều cao dầm lưu trữ trong tham biến b, h trong bảng Parameter trong ElementType, giá trị kiểu số thực (double). (Lưu ý: tên tham biến có thể khác nhau tùy vào family dầm được định nghĩa)

Dùng phương thức Element.LookupParameter(), truyền vào tên tham biến để truy xuất Parameter tương ứng. Sau đó phương thức Parameter.AsDouble() để lấy giá trị của Parameter thuộc kiểu số thực.

Parameter bParam = elemType.LookupParameter("b");  
double width = bParam.AsDouble();  
Parameter hParam = elemType.LookupParameter("h");  
double height = hParam.AsDouble();

Thông tin chiều dài dầm lưu trữ trong tham biến Length trong bảng Parameter trong chính đối tượng Element, giá trị kiểu số thực (double). (Lưu ý: tên tham biến có thể khác nhau tùy vào family dầm được định nghĩa)

Lấy thông tin chiều dài tương tự như lấy chiều rộng và chiều cao của dầm.

Parameter lParam = elem.LookupParameter("Length");  
double length = lParam.AsDouble();

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", $"Kích thước cầu kiện:\nRộng: {width}mm\nCao: {height}mm\nDài: {length}mm");

Chuyển đổi đơn vị

Chạy khá ổn rồi nhỉ, nhưng giá trị kích thước hình như có vấn đề thì phải?

Nguyên nhân là Revit sử dụng hệ đo lường Imperial (inch, feet, ounce, pounch…), được sử dụng khá phổ biến ở Mỹ khác với TCVN sử dụng hệ đo lượng SI (millimeter, meter, kilogram…).

Để giá trị trên giao diện người dùng theo đúng hệ đo lường được chọn, Revit đã sử dụng một lệnh chuyển đổi đơn vị và hiển thị giá trị. Nhưng thực chất giá trị thực của đối tượng vẫn được lưu trữ theo hệ đo lượng Imperial.

Để hiển thị đúng giá trị, ta có thể sử dụng một biến để chứa hệ số chuyển đổi (search google: feet to millimeter là ra nhé các bạn). Ta nhân chiều rộng, chiều cao, chiều dài dầm với hệ số chuyển đổi để ra giá trị đơn vị millimeter.

double feet2millimeter = 304.8;  
width = width * feet2millimeter;  
heigth = heigth * feet2millimeter;  
length = length * feet2millimeter;

Khá chuẩn phải không nào? Các bạn nhớ theo dõi phần tiếp theo của series nhé, phần tiếp theo mình sẽ hướng dẫn cách truy xuất hệ tọa độ địa phương của dầm.

Đ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);  
            ElementId elemTypeId = elem.GetTypeId();  
            Element elemType = doc.GetElement(elemTypeId);  
            Parameter bParam = elemType.LookupParameter("b");  
            double width = bParam.AsDouble();  
            Parameter hParam = elemType.LookupParameter("h");  
            double heigth = hParam.AsDouble();  
            Parameter lParam = elem.LookupParameter("Length");  
            double length = lParam.AsDouble();  
            double feet2millimeter = 304.8;  
            width = width * feet2millimeter;  
            heigth = heigth * feet2millimeter;  
            length = length * feet2millimeter;  
            TaskDialog.Show("Revit", $"Kích thước cầu kiện:
                    \nRộng: {width}mm\nCao: {heigth}mm\nDài: {length}mm");  
            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