Module 3 — Lists và Data Trees
Thời lượng: ~5 giờ · Độ khó: Cơ bản–Trung bình
Mục tiêu: Nắm vững cách GH lưu trữ và xử lý dữ liệu — từ list đơn giản đến Tree phân cấp. Đây là nền tảng để tránh 90% bugs trong Grasshopper.
3A — Lists
Tạo Lists
Series: Start + Step + Count → list tăng dần đều
Ví dụ: 0, 5, 10 → {0, 5, 10, 15, ...}
Range: Domain (From..To) + Steps → list chia đều trong khoảng
Ví dụ: 0..1 với 5 steps → {0, 0.2, 0.4, 0.6, 0.8, 1.0}
Random: Seed + Range + Count → list ngẫu nhiên có thể tái tạo
Đọc và Xử Lý List
List Item: List + Index → item tại vị trí đó
List Length: List → số items
Sort: List → sắp xếp tăng dần
Reverse: List → đảo ngược thứ tự
Shift List: List + Shift amount → xoay vòng list
Lọc List
Cull Index: List + Index list → xóa items tại các vị trí đó
Cull Pattern: List + Pattern (True/False) → giữ items có True
Dispatch: List + Pattern → chia thành 2 lists (True/False)
Hình minh họa
3B — List Matching (Khớp Lists)
Khi 2 inputs có số lượng items khác nhau, GH tự xử lý theo chế độ:
Longest List (mặc định):
List A: {1, 2, 3}
List B: {10, 20}
Kết quả: {11, 22, 23} ← B lặp item cuối
Shortest List:
Kết quả: {11, 22} ← dừng tại list ngắn nhất
Cross Reference:
Kết quả: {11, 21, 12, 22, 13, 23} ← mọi cặp kết hợp
Đổi chế độ: Nhấp phải vào component → chọn "Matching" → chọn chế độ
3C — Data Trees
Tree là gì?
Tree = cấu trúc dữ liệu phân cấp — nhiều lists được tổ chức theo "branches":
Cây phẳng (flat list):
{0}: item0, item1, item2, ...
Cây phân cấp (tree):
{0}: item0, item1
{1}: item2, item3
{2}: item4, item5
...
Path Notation
{A;B;C}(i)
A, B, C → branch path (vị trí trong cấu trúc cây)
i → index của item trong branch
Ví dụ:
{0}(3) = branch đầu tiên, item thứ 4
{0;1}(0) = branch con đầu tiên của branch 0, item đầu tiên
Xem cấu trúc Tree: Param Viewer
Kết nối bất kỳ data → Param Viewer
→ Hiển thị: số branches, paths, số items mỗi branch
Dùng nhiều Param Viewers → theo dõi Tree thay đổi qua từng bước
Khi Nào Tree Tự Xuất Hiện?
3 curves → Divide Curve (N=5 mỗi curve)
→ Tree: {0}: 6 points, {1}: 6 points, {2}: 6 points
(GH tự tạo 1 branch cho mỗi curve)
3D — Flatten, Graft, Simplify
Flatten — Phẳng Hóa
Tất cả branches → 1 branch {0}
Trước Flatten:
{0}: {A, B}
{1}: {C, D}
Sau Flatten:
{0}: {A, B, C, D}
Khi dùng: Cần xử lý tất cả items như 1 nhóm (ví dụ: Loft qua tất cả curves)
Graft — Phân Tách
Mỗi item → 1 branch riêng
Trước Graft:
{0}: {A, B, C}
Sau Graft:
{0}: {A}
{1}: {B}
{2}: {C}
Khi dùng: Cần xử lý từng item độc lập, tạo "per-item" operations
Simplify — Bỏ Prefix Thừa
Bỏ phần đầu path chung:
{0;0}: {A} {0;1}: {B} → Simplify → {0}: {A} {1}: {B}
Bài Tập Module 3 — Debug Definition với Tree
Yêu cầu:
Setup:
1. 4 curves (draw in Rhino, reference vào GH)
2. Divide Curve (N=8) → Tree: 4 branches × 9 points
3. Param Viewer → xác nhận structure
Thí nghiệm:
A. Circle tại mỗi điểm (radius=100) → hoạt động bình thường
B. Loft qua tất cả points (không flatten) → sai!
C. Flatten points → Loft → đúng? Sai? → giải thích
D. Graft curves → Divide Curve → Param Viewer → so sánh với ban đầu
Bài tập Cull Pattern:
5. Series 0..20 (step 1) → 21 số
6. Pattern: {T,F,T,F,...} (xen kẽ) → Cull Pattern
7. Kết quả: chỉ giữ số lẻ
8. Circle tại các điểm tương ứng với số giữ lại
→ Checkerboard pattern
Liên kết kiến thức
Nền tảng cần nắm
Chủ đề liên quan