[REVIT API] BÀI 1- TƯƠNG TÁC CƠ BẢN VỚI ELEMENT | VIỆT BIM CODER
Revit API 

[Revit API] Bài 1- TƯƠNG TÁC CƠ BẢN VỚI REVIT ELEMENT

 TƯƠNG TÁC CƠ BẢN VỚI REVIT ELEMENT

FILTERING

  • Revit API cung cấp một phương thức để lọc và lấy đối tượng trong Revit Document. Đây là cách tốt nhất để lấy các đối tượng có mối liên quan với nhau, như Wall hay Door trong Document. Filter còn có thể sử dụng để tìm lọc tập hợp các đối tượng ví dụ như là tất cả các dầm có cùng kích thước
  • Các bước cơ bản để lấy các đối tượng (element) thỏa mãn điều kiện bộ lọc (filter) gồm
  • Tạo FilteredElementCollector
  • Gắn điều kiện lọc Filter vào Collector phía trên
  • Lấy các đối tượng được lọc hay ID của nó ( có nhiều phương thức)

A.Tạo FilteredElementCollector

  • Kiểu dữ liệu được sử dụng để lọc và lấy đối tượng được gọi là FilteredElementCollector. Nó được cấu trúc theo 3 cách:

+ From a document: Tìm và lọc một tập hợp các đối tượng từ một document

+ From a document and set of ElementIds: Tìm và lọc trong một tập hợp các đối tượng đã định sẵn trong một document

+ From a document and a view: Tìm và lọc đối tượng hiện hữu trong một view trong một document

B.Gắn Filter vào Collector

  • Bộ lọc được gắn vào FilteredElementCollector bằng class ElementFIlters, nguyên tắc hoạt động của Class này là kiểm tra đối tượng xem có thỏa điều kiện. Có 3 cách tạo bộ lọc Filter tương ứng với 3 Class con trong Class ElementFilters
  1. ElementQuickFilter: Lọc nhanh,  sử dụng  bộ nhớ thấp, những đối tượng ko thỏa điều kiện lọc sẽ không được mở rộng trong bộ nhớ

                                                                                         Những QuickFilter thường được sử dụng nhiều

  1. ElementSlowFilter: Các đối tượng được lọc yêu cầu phải ghi nhớ và mở rộng bộ nhớ trước (để Revit có thể tính toán các điều kiện của các bộ lọc. VD: diện tích, va chạm, điều kiện tham số …). Do đó sẽ tốt hơn khi ghép những slow filters với ít nhất 1 quick filter, điều đó sẽ giúp giảm thiểu số đối tượng lọc cần được mở rộng bộ nhớ để mô phỏng các điều kiện của các slow filter.

                                                                 SlowFilter thường được sử dụng

  • Trong đó ElementParameterFilter là một filter rất mạnh, nó có thể tìm các đối tượng thông qua giá trị của tham biến mà có thể so sánh lớn hơn hoặc nhỏ hơn giá trị
  1. Logical Filters: Kết hợp một hay nhiều Filters theo logic gồm hai class:
  • LogicalAndFilter: đối tượng thỏa mãn đồng thời 2 hoặc nhiều điều kiện được phép qua bộ lọc.

Các phương thức tắt: WherePasses(): thêm vào các điều kiện lọc vào tập hợp đối tượng cần lọc

IntersectWith(): phép giao giữa hai tập hợp bộ lọc khác nhau (lấy phần giao giữa hai bộ lọc đồng nghĩa các đối tượng được chọn phải thõa mãn các điều kiện của mỗi tập hợp lọc)

  • LogicalOrFilter: đối tượng thõa mãn một trong hai hay nhiều điều kiện được phép qua bộ lộc.

Các phương thức tắt: UnionWith(): phép hợp giữa hai tập hợp bộ lọc (thõa mãn một trong những điều kiện của các tập hợp lọc)

C.Lấy element hay ID của element từ Collector đã được gắn filter

  • Một khi filter (điều kiện lọc) được áp dụng vào một tập hợp các đối tượng, những đối tượng thõa mãn điều kiện lọc có thể được lấy bằng một trong 3 cách:

+ Lấy một bộ element hoặc elementIds

ToElements()- Trả về tập hợp các đối tượng thỏa mãn các điều kiện lọc

ToElementIds()- Trả về tập hợp các ID của tất cả elements thỏa mãn các điều kiện lọc

+ Lấy element hay Id của element đầu tiên

FirstElement()- Trả về đối tượng đầu tiên trong tập hợp thỏa mãn điều kiện lọc (thường dùng tắt với những tập hợp đối tượng  được lọc có chắc chắn chỉ một đối tượng)

FirstElementId()- Trả về ID của đối tượng đầu tiên thỏa mãn điều kiện lọc (thường dùng tắt với những tập hợp đối tượng  được lọc có chắc chắn chỉ một đối tượng)

+

Ví Dụ: Lọc các Dầm và xuất familyType của từng đối tượng ra màn hình

namespace AutoRebaringWall.Tuan
{
    [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;
            Selection sel = uidoc.Selection;

            //tạo SlowFilter chỉ gồm FamilyInstance 
            ElementClassFilter familyInstanceFilter = new ElementClassFilter(typeof(FamilyInstance));
            //Tạo QuickFilter chỉ gồm các đối tượng thuộc category Structural Framing
            ElementCategoryFilter beamCategoryFilter = new ElementCategoryFilter(BuiltInCategory.OST_StructuralFraming);
            //tạo LogicallFilter kết hợp 2 filter trên
            LogicalAndFilter beamInstancesFilter = new LogicalAndFilter(familyInstanceFilter, beamCategoryFilter);
            //Apply filter vào Collector
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            collector.WherePasses(beamCategoryFilter);
            //lấy element từ collector
            ICollection<Element> allbeam = collector.ToElements();
            //xuất ra màn hình type của element
            string promt = "Type của dầm là: \n";
            foreach (Element beam in allbeam)
            {
                // Ép kiểu Element về kiểu FamilyInstance
                FamilyInstance ft = beam as FamilyInstance;
                promt += ft.GetType().Name + "\n";
            }
            TaskDialog.Show("Revit", promt);
            return Result.Succeeded;
        }
    }
}

 

Bài viết liên quan

Leave a Comment