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

Module 2 — Data Trees Nâng cao

Thời lượng: ~7 giờ · Độ khó: Nâng cao

Mục tiêu: Kiểm soát hoàn toàn cấu trúc dữ liệu trong GH — từ Tree đơn giản đến tái cấu trúc phức tạp với Path Mapper. Ai master được Trees, master được Grasshopper.


2.1 — Ôn lại Tree cơ bản

Path Notation chi tiết

{A;B;C}(i)
│ │ │ └─ index của item trong branch
│ └──┘─── sub-branch path
└────────── branch path

Ví dụ:
{0}(3) = branch 0, item index 3
{0;1}(0) = branch 0, sub-branch 1, item 0

Khi nào Tree tự động xuất hiện

Tree được tạo bất cứ khi nào GH áp dụng một operation lên nhiều objects khác nhau:

3 surfaces → Divide Surface (U=5, V=5)
→ Tree với 3 branches, mỗi branch 25 frames

Surface Brep → Deconstruct Brep
→ Tree: {0} = Faces, {1} = Edges, {2} = Vertices

2.2 — Flatten, Graft, Simplify

Flatten — Phẳng hóa

Tất cả branches → 1 branch {0}
Tree: {0}: {A,B,C} {1}: {D,E,F} {2}: {G,H,I}
Flat: {0}: {A,B,C,D,E,F,G,H,I}

Khi dùng Flatten:

  • Loft qua TẤT CẢ curves (không phải từng nhóm)
  • Tính tổng (Mass Addition) toàn bộ giá trị
  • Khi cần 1 list phẳng để xử lý tuần tự

Graft — Phân tách

Mỗi item → 1 branch riêng
List: {0}: {A,B,C}
Graft: {0}: {A} {1}: {B} {2}: {C}

Khi dùng Graft:

  • Xử lý từng item một cách độc lập
  • Tạo cross-reference giữa 2 lists

Simplify — Bỏ prefix thừa

Tree: {0;0}: {A}  {0;1}: {B}  {0;2}: {C}
Simplify: {0}: {A} {1}: {B} {2}: {C}
(bỏ phần đầu chung {0})

2.3 — Path Mapper

Path Mapper là công cụ mạnh nhất để tái cấu trúc Tree tùy ý bằng pattern syntax.

Cú pháp cơ bản

Source: {A;B}(i)   →   Target: {B;A}(i)
= hoán đổi level A và B

Source: {A}(i) → Target: {i}(A)
= đảo items và branches

Ví dụ thực tế

Transpose lưới:

Bài toán: Có grid 5×8 surfaces (5 cột, 8 hàng)
Tree hiện tại: 5 branches × 8 items
Muốn: 8 branches × 5 items (để loft theo hàng thay vì cột)

Path Mapper:
Source: {A}(i)
Target: {i}(A)
→ Kết quả: 8 branches × 5 items

Nhóm lại theo pattern:

Source: {A}(i)
Target: {A; i%3}(i)
= Nhóm items thành nhóm 3
Hình minh họa

[Ảnh: Path Mapper dialog với source/target pattern và kết quả Param Viewer trước/sau]


2.4 — Entwine, Merge, Weave

Entwine — Kết hợp nhiều Trees thành 1 Tree có nhiều branches

Input A: {0}: {1,2,3}
Input B: {0}: {4,5,6}
Entwine: {0}: {1,2,3} {1}: {4,5,6}
(giữ cấu trúc, mỗi input thành 1 branch riêng)

Khác với Merge:

Merge: gộp tất cả vào cùng branch
Entwine: giữ riêng, chỉ đặt vào level mới

Weave — Đan xen các lists

Pattern: {0,1,0,1,...} = xen kẽ A và B
Input A: {1,3,5}
Input B: {2,4,6}
Weave (pattern {0,1}): {1,2,3,4,5,6}

Ứng dụng: Tạo pattern "brickwork"

Row A (offset=0): lưới chính
Row B (offset=0.5): lưới lệch nửa ô
Weave xen kẽ Row A và Row B → brick pattern

2.5 — Tree Statistics

Tree Statistics component:
Output:
Paths → list các paths trong Tree
Length → số items trong mỗi branch
Count → tổng số branches

2.6 — Tree Mathematics

Phép toán áp dụng song song theo cùng Tree structure:

Tree A: {0}: {1,2,3}  {1}: {4,5,6}
Tree B: {0}: {10,20,30} {1}: {40,50,60}
Addition: {0}: {11,22,33} {1}: {44,55,66}
(cộng từng item theo đúng branch và index)

Lưu ý: Trees phải có cùng cấu trúc để operation chạy đúng. Nếu khác cấu trúc → dùng Path Mapper để align trước.


2.7 — Debug Workflow

Quy trình debug Tree

1. Thêm Param Viewer sau TỪNG component nghi ngờ
2. Đọc số branches và items
3. So sánh với kết quả mong đợi
4. Tìm điểm phân kỳ → áp dụng Flatten/Graft/Path Mapper

Nhận biết lỗi qua màu sắc

Màu ComponentNghĩa
XámOK
VàngWarning (hoạt động nhưng có vấn đề)
ĐỏError (không hoạt động)

Đọc error message: Hover vào component đỏ → tooltip hiện lý do.


Bài tập Module 2 — Debug 5 Definitions lỗi Tree

File cần thiết: Tải module-02-debug-exercises.gh từ tài nguyên khóa học.

File chứa 5 definitions có lỗi Tree phổ biến. Nhiệm vụ:

  1. Exercise A: Loft tạo ra nhiều surface nhỏ thay vì 1 — sửa bằng Flatten
  2. Exercise B: Scale chỉ ảnh hưởng 1 object thay vì tất cả — sửa bằng Graft
  3. Exercise C: Addition cho kết quả sai — Tree structure không khớp
  4. Exercise D: Orient panel bị đặt nhầm vị trí — path mismatch
  5. Exercise E: Path Mapper cần thiết để transpose grid 5×8 → 8×5
Hình minh họa

[Ảnh: Param Viewer so sánh trước/sau sửa lỗi cho Exercise A]

Liên kết kiến thức

Nền tảng cần nắm

Mở rộng từ

Chủ đề liên quan