Skip to main content
Cập nhật lần cuối: 14/05/2026

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.

Ghi chú lộ trình

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ố

ComponentTác dụng
SeriesDãy số: start, step, count → {0, 1, 2, ...}
RangeChia đều [domain]: {0, 0.1, 0.2, ..., 1.0}
RandomSố ngẫu nhiên trong khoảng
Repeat DataLặ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ờ
Hình minh họa

[Ả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
Nhận biết khi cần Flatten

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ứngNguyên nhân có thểThử
Kết quả ít hơn mong đợiTree matching saiFlatten input
Component báo lỗi đỏTree structure không khớpParam Viewer để xem
Loft tạo nhiều surface nhỏ thay vì 1 lớnCurves ở branches khác nhauFlatten curves trước Loft
Hình minh họa

[Ả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:

  1. Divide Surface → 8×8 = 64 frames
  2. Dùng Cull Pattern với pattern {T,T,F,T} để bỏ 1/4 số panel
  3. Dùng Random để tạo pattern random thay vì cố định
  4. Dùng Param Viewer xem cấu trúc dữ liệu trước và sau Flatten
  5. Thêm Panel ở nhiều điểm trong definition để theo dõi dữ liệu
Ghi nhớ

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