[REVIT API Task] Tạo Addin RebarBeam - Phần 3: Truy xuất trục tọa độ | Vietbimcoder.com
blog C# căn bản Revit API Revit structure test 1 test 2 

[REVIT API TASK] TẠO ADD-IN REBAR BEAM – TẠO THÉP DẦM TỰ ĐỘNG (PHẦN 3: TRUY XUẤT TRỤC TỌA ĐỘ)

Tiếp tục series add-in Rebar Beam, ở phần 3 mình sẽ hướng dẫn truy xuất trục tọa độ 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 2: Truy xuất kích thước hình học

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

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

Width, Heigth, 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.2, ta tìm hiểu cách để truy xuất tọa độ địa phương đối tượng.

Khái niệm về hình học không gian

Thư viện Revit API xây dựng một hệ thống các kiểu dữ liệu, công cụ mạnh mẽ để truy xuất và xử lý thông tin hình học đối tượng Element trong không gian ba chiều.

  • Các kiểu dữ liệu là nền tảng hình học không gian: XYZ, UV, Plane,…
  • Các kiểu dữ liệu định nghĩa đối tượng hình học cụ thể trong mô hình dự án: Line, Circle, Solid…
  • Các kiểu dữ liệu là công cụ hỗ trợ truy xuất và xử lý thông tin: JoinGeometryUtils, GeometryCreationUtilities…

Nhờ vào thư viện mạnh mẽ Revit, ta có thể sử dụng để truy xuất, xử lý các thông tin hình học trong đối tượng hiệu quả và nhanh chóng. Ngoài ra, ta có thể xây dựng các thư viện không gian tự định nghĩa để xử lý các trường hợp chuyên biệt.

Location

Location là kiểu dữ liệu xác định vị trí thực thể của đối tượng trong không gian.

Location có các kiểu dữ liệu con là LocationPoint và LocationCurve để xác định định vị trí là một điểm đặt (đối với cột, room, generic model..) hay một đường dóng (đối với dầm, tường, …)

Định nghĩa LocationCurve kế thừa từ Location trong thư viện Revit API:

namespace Autodesk.Revit.DB 
{  
    public class LocationCurve: Location 
    {  
        public Curve Curve { get; set; }  
        public ElementArray get_ElementsAtJoin(int end);  
        public JoinType get_JoinType(int end);  
        public void set_ElementsAtJoin(int end, ElementArray elements);  
        public void set_JoinType(int end, JoinType newType);  
    }  
}

Truy xuất thuộc tính Location từ Element:

Location loc = elem.Location;

Ép kiểu Location sang kiểu LocationCurve để lấy thông tin đường dóng dầm.

LocationCurve locCur = loc as LocationCurve;

Curve

Curve là kiểu dữ liệu định nghĩa một đường hình học, có thể là đường thẳng, đường tròn, ellipse…

Curve cũng có các kiểu dữ liệu con là Line, Arc, Ellipse … đại diện cho các loại đường hình học có trong Revit.

Định nghĩa Line kế thừa từ Curve trong thư viện Revit API:

namespace Autodesk.Revit.DB 
{  
    public class Line: Curve 
    {  
        public XYZ Direction { get; }  
        public XYZ Origin { get; }  
        public static Line CreateBound(XYZ endpoint1, XYZ endpoint2);  
        public static Line CreateUnbound(XYZ origin, XYZ direction);  
    }  
}

Truy xuất thuộc tính Curve có trong đối tượng LocationCurve:

Curve curve = locCur.Curve;

Ép kiểu Curve sang kiểu Line để lấy thông tin đường thẳng.

Line line = curve as Line;

Truy xuất hệ tọa độ

Trục OX của dầm chạy song song chiều dài dầm, trùng với vector chỉ phương của đối tượng Line đã truy xuất.

XYZ vectorX = line.Direction;

Trục OZ của dầm chạy song song chiều cao dầm, sẽ phụ thuộc vào cao độ điểm đầu và cuối của dầm.

Để đơn giản hóa bài toán trong ví dụ này, ta chấp nhận giả thiết cao độ dầm không đổi, nghĩa là cao độ điểm đầu và điểm cuối dầm giống nhau. Khi đó, trục OZ song song với trục Z của mô hình dự án, tương ứng với vector (0,0,1).

XYZ vectorZ = XYZ.BasisZ;

Bây giờ ta đã có hai trục trong hệ trục tọa độ không gian, ta hoàn toàn có thể xác định trục còn lại theo quy tắc tam diện thuận trong hình học.

 

 

 

 

 

 

 

 

 

VectorY sẽ có giá trị bằng tích có hướng giữa VectorX và VectorZ, Revit API cung cấp phương thức XYZ.CrossProduct() để xử lý công thức trên.

XYZ vectorY = vectorZ.CrossProduct(vectorX);

Kết quả

Sử dụng TaskDialog.Show() để xuất kết quả qua hộp thoại trong giao diện Revit, tương tự các phần trước.

TaskDialog.Show("Revit", $"Hệ trục tọa độ cấu kiện:
      \nVectorX: {vectorX}\nVectorY: {vectorY}\nVectorZ: {vectorZ}");

Phần tiếp theo mình sẽ hướng dẫn cách truy xuất vị trí các điểm biên của dầm. 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); 
 
            Location loc = elem.Location;  
            LocationCurve locCur = loc as LocationCurve;  
            Curve curve = locCur.Curve;  
            Line line = curve as Line;  

            XYZ vectorX = line.Direction;  
            XYZ vectorZ = XYZ.BasisZ;  
            XYZ vectorY = vectorZ.CrossProduct(vectorX);  
            TaskDialog.Show("Revit", $"Hệ trục tọa độ cấu kiện:
                \nVectorX: {vectorX}\nVectorY: {vectorY}\nVectorZ: {vectorZ}");  
            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