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.
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(); |
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 |
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]) |
Kết quả