Chào mừng các bác đã ghé thăm blog của mình.😄

Mở đầu

Khi nào thì mình cần sử dụng cái này, đó là lúc mình lấy ra các đối tượng nhưng lại muốn chúng sắp xếp theo một parameter nào đó, ví dụ mình muốn sắp xếp các room theo diện tích chẳng hạn, vân vân và mây mây. Dưới đây sẽ giải quyết thắc mắc của nhiều bác .


Dynamo

Mình sẽ sử dụng List.SortByFunction và sắp xếp lại chúng theo paramter, đầu vào chính là một list Element, đầu ra chính là những phòng có diện tích từ lớn đến bé nhờ List.Reverse.

SortPraDynamo

Revit API C-Sharp

Mình sử dụng thư viện Linq với OrderBy để làm được điều này, các bác lưu ý là OrderBy có thể sử dụng khi mình chuyển qua list trước nhé .

FilteredElementCollector Rooms = new FilteredElementCollector(xdoc);
temc.WherePasses(rmfilter).WhereElementIsNotElementType();
IOrderedEnumerable<Element> rooom =
Rooms.ToList().OrderBy(x => x.get_Parameter(BuiltInParameter.ROOM_AREA).AsDouble());
IEnumerable<Element> RoomSort = rooom.Reverse();
view raw sortroomarea.cs hosted with ❤ by GitHub

Python

Đối với python thì ngắn gọn và mình sẽ dùng với cú pháp lambda như thế này và sorted theo Funtion

RoomSort = sorted(Room, key = lambda x:x.get_Parameter(BuiltInParameter.ROOM_AREA).AsDouble())
OUT = RoomSort.reverse()

Một mẫu khác sắp xếp theo Point để các bác dễ hình dung hơn

import clr
input = IN[0]
result = []
def sortbyZXY(point):
point.sort(key = lambda points: (point.Z, point.X, point.Y))
return points
for i in input:
result.append(sortbyZXY(i))
OUT = result
view raw sortbyZXY.py hosted with ❤ by GitHub

Tổng kết

Vậy là mình đã kể cho các bác nghe xong hết câu chuyện nữa rồi đó, cứ thấy gì đó vui vui hay hay là mình lại viết lên cho a e tham khảo và góp ý, nếu có ý tưởng gì giúp cải thiện nhanh hơn thì các bác bình luận bên dưới nhé, mình sẽ bổ sung để bài viết được hoàn thiện hơn.Cám ơn các bác đã ghé thăm blog của mình !

Mở rộng

Trả lời câu hỏi của một bác trên diễn đàn muốn sort đối tượng theo số phía sau kèm chữ để đánh lại sheet.

import re
def sort(x):
convertText = lambda text: int(text) if text.isdigit() else text.lower()
Textkey = lambda key: [ convertText(c) for c in re.split('([0-9]+)', key) ]
return sorted(x, key = Textkey)
OUT = sort(IN[0])
view raw sort.py hosted with ❤ by GitHub

Kết quả

119815405 10223553221205501 5036553852174112923 o

Tham khảo :

stackoverflow