Module 6 — Lists & Data Trees Cơ bản
Thời lượng: ~4 giờ · Độ khó: Cơ bản–Trung bình
Mục tiêu: Hiểu tại sao GH xử lý nhiều đối tượng đồng thời, thao tác được với List, và nhận biết Data Tree khi nó xuất hiện.
Data Tree nâng cao (Path Mapper, Weave, Entwine, debug Tree phức tạp) sẽ được học kỹ trong Khóa Nâng cao — Module 2. Module này tập trung vào nền tảng đủ để bạn làm việc hiệu quả và không bị bối rối.
6A — Lists
List là gì?
Trong Grasshopper, hầu hết component không làm việc với 1 giá trị mà làm việc với một danh sách (List) các giá trị cùng lúc.
Slider "N" = 5
Series: start=0, step=1, count=N → {0, 1, 2, 3, 4}
= List of 5 numbers, index 0 đến 4
Tương tự với geometry:
Divide Curve (N=10) → List of 10 points
Divide Surface → List of 80 frames (nếu U=10, V=8)
Tạo List số
| Component | Tác dụng |
|---|---|
Series | Dãy số: start, step, count → {0, 1, 2, ...} |
Range | Chia đều [domain]: {0, 0.1, 0.2, ..., 1.0} |
Random | Số ngẫu nhiên trong khoảng |
Repeat Data | Lặp lại một giá trị N lần |
Ví dụ so sánh:
Series (0, 1, 5) → {0, 1, 2, 3, 4}
Range (0 to 1, N=5) → {0, 0.25, 0.5, 0.75, 1.0}
Thao tác với List
Truy cập phần tử:
List Item → lấy phần tử tại index i (0-based)
List Item (i=0) → phần tử đầu
List Item (i=-1) → phần tử cuối (negative index)
Thông tin về List:
List Length → số phần tử trong list
Sắp xếp và đảo ngược:
Sort List → sắp xếp tăng dần (kéo theo key list)
Reverse List → đảo ngược thứ tự
Lọc:
Cull Index → xóa phần tử tại các index chỉ định
Cull Pattern → xóa theo pattern T/F (True=giữ, False=bỏ)
Pattern {T,F,T,F} → giữ index 0,2,4,6,...
Dispatch → chia list thành 2 theo pattern T/F
Ví dụ Cull Pattern — tạo hiệu ứng "cách 1 bỏ 1":
Divide Surface → 100 frames
Cull Pattern {T,F} → 50 frames (bỏ các frame chẵn)
Rectangle tại 50 frames → pattern ô bàn cờ
[Ảnh: Divide Surface 10×10 với Cull Pattern tạo pattern bàn cờ]
List Matching — Khi 2 list có độ dài khác nhau
Đây là nguồn gốc của nhiều lỗi GH:
List A: {1, 2, 3, 4, 5} (5 phần tử)
List B: {10, 20} (2 phần tử)
Shortest List: kết quả 2 phần tử {1×10, 2×20}
Longest List: kết quả 5 phần tử {1×10, 2×20, 3×20, 4×20, 5×20}
Cross Reference: kết quả 5×2=10 phần tử (mọi cặp kết hợp)
Thay đổi matching: Right-click input → "Longest List" / "Shortest List" / "Cross Reference".
6B — Data Tree Cơ bản
Data Tree là gì?
Khi làm việc với geometry nhiều tầng, GH tự động tổ chức dữ liệu thành Data Tree (cây dữ liệu) thay vì một list phẳng.
Ví dụ:
3 curves → Divide Curve (N=5) mỗi curve
→ KHÔNG phải 1 list 15 điểm
→ MÀ LÀ Tree với 3 branches, mỗi branch có 5 điểm:
Branch {0}: {pt0, pt1, pt2, pt3, pt4}
Branch {1}: {pt0, pt1, pt2, pt3, pt4}
Branch {2}: {pt0, pt1, pt2, pt3, pt4}
Path Notation
Mỗi branch trong Tree có một path (đường dẫn):
{0} → branch 0 (level 1)
{0;1} → branch 0, sub-branch 1 (level 2)
{0;1;2} → level 3 (hiếm gặp ở level cơ bản)
Cách đọc: {0;1}(3) = branch 0, sub-branch 1, item index 3.
Xem Data Tree — Param Viewer
Thêm component Param Viewer → kết nối vào bất kỳ output nào → thấy cấu trúc Tree.
Param Viewer shows:
Branch {0}: 5 items
Branch {1}: 5 items
Branch {2}: 5 items
Total: 15 items in 3 branches
Flatten — Dẹp Tree thành List
Khi bạn cần 1 list phẳng thay vì Tree có nhiều branches:
Flatten → chuyển toàn bộ Tree thành 1 list phẳng {0}
Ví dụ: 3 branches × 5 items → 1 list 15 items
Cách Flatten: Right-click input → Flatten, hoặc dùng component Flatten Tree.
Graft — Thêm Branch cho mỗi item
Ngược với Flatten — mỗi item trong list được đặt vào Branch riêng:
Graft → mỗi item thành 1 branch riêng
List {a, b, c} → Tree {0}:{a}, {1}:{b}, {2}:{c}
Cách Graft: Right-click input → Graft.
Khi nào cần Flatten vs Graft?
Flatten khi:
Bạn muốn Loft qua TẤT CẢ curves (không phải từng nhóm riêng).
3 groups × 4 curves → Flatten → Loft 12 curves thành 1 surface
Graft khi:
Bạn muốn GH xử lý TỪNG item trong list một cách độc lập.
5 points → Graft → Circle tại TỪNG điểm = 5 circles riêng biệt
Nếu bạn thấy kết quả ít hơn mong đợi, hoặc chỉ có 1 output thay vì nhiều → thử Flatten input.
Lỗi thường gặp do Tree
| Triệu chứng | Nguyên nhân có thể | Thử |
|---|---|---|
| Kết quả ít hơn mong đợi | Tree matching sai | Flatten input |
| Component báo lỗi đỏ | Tree structure không khớp | Param Viewer để xem |
| Loft tạo nhiều surface nhỏ thay vì 1 lớn | Curves ở branches khác nhau | Flatten curves trước Loft |
[Ảnh: Param Viewer cho thấy 3 branches, mỗi branch 5 items]
[Ảnh: Trước và sau Flatten — Tree vs List]
Bài tập Module 6
Đề bài: Từ mái vòm Module 5 (hoặc bất kỳ surface nào), áp dụng Cull Pattern để tạo hiệu ứng missing panels.
Yêu cầu:
- Divide Surface → 8×8 = 64 frames
- Dùng
Cull Patternvới pattern{T,T,F,T}để bỏ 1/4 số panel - Dùng
Randomđể tạo pattern random thay vì cố định - Dùng
Param Viewerxem cấu trúc dữ liệu trước và sau Flatten - Thêm
Panelở nhiều điểm trong definition để theo dõi dữ liệu
Grasshopper không có khái niệm "sai tuyệt đối" về Tree — chỉ có "có đúng với ý định của bạn không". Param Viewer là công cụ số 1 để kiểm tra ý định đó.
Liên kết kiến thức
Nền tảng cần nắm
Chủ đề liên quan