Chào mừng các bạn đã ghé thăm blog của mình.😄
Mục đích
- Hôm trước có một bạn hỏi mình về vấn đề này , đó là tại sao dùng List.UniqueItems không thể loại bỏ được các Point trùng năm trong List, mặc dù nó có loại bỏ.Lý do ở đây là Point có một điểm khác Vector so với Point Còn lại .Vậy thì bây giờ vấn đề sẽ xử lí như thế nào ?
Cách xử lý
Cách 1 : Duỗi List sang String với node StringFromObject Và sử dụng lại List.UniqueItems.Nhưng vấn đề ở đây ta sẽ tốn thêm rất nhiều công đoạn cho xử lý phía sau .Vì vậy cách này rườm rà và không hiệu quả cho lắm.
Cách 2 : Sử dụng node Point.PruneDuplicates
Với node này sẽ loại bỏ đi những điểm trùng trong một List đưa vào, vấn đề là các bạn chưa hề biết đến sự tồn tại của node này mà thôi.
Cách 3 : Viết Scripts tuỳ chỉnh
#Thanks Author Package Springs | |
import clr | |
from itertools import groupby | |
from operator import itemgetter | |
clr.AddReference('ProtoGeometry') | |
from Autodesk.DesignScript.Geometry import Point | |
def p2t(p) : return round(p.X,4), round(p.Y,4), round(p.Z,4) | |
pts = map(p2t, IN[0]) | |
unique_pts = set(pts) | |
if not IN[1]: | |
same_z = [(i[:2],i[-1]) for i in unique_pts] | |
same_z.sort(key = itemgetter(0) ) | |
unique_pts = [] | |
for k, g in groupby(same_z, itemgetter(0) ): | |
coord = list(k) | |
coord.append(max([i[-1] for i in g]) ) | |
unique_pts.append(coord) | |
OUT = [Point.ByCoordinates(*i) for i in unique_pts] |
Mở rộng
Có một câu hỏi mở rộng rất hay là nếu có một đám danh sách dãy số trùng muốn lấy ra những số không trùng nhau thì làm thế nào?Cũng không có mấy đâu minh sẽ chỉ bạn 3 cách để lấy ra luôn.Ví dụ mình sẽ làm cho một danh sách các số như này nhé và ta sẽ it ra mỗi dòng với mỗi cách lọc khác nhau, bạn muốn sài cách nào cũng được.
Tổng kết
Hôm nay là một ngày đẹp trời, bệnh dịch Corona đang hoành hành, các bạn hãy bảo trọng sức khoẻ và tránh ra đường tiếp xúc, rửa tay thường xuyên nhé.Cám ơn các bạn đã ghé thăm blog của mình .