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

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