OneBIM.vn
Kết Nối và Chia Sẻ

Bài 4:Hướng dẫn về List và các Node hay dùng trong Dynamo

Đúng ra trước bài này mình còn có 1 bài cơ bản về các loại hình học trong Dynamo nhưng mình thấy nó chưa thật sự cần thiết và cũng do cách diễn đạt của mình hơi khó hiểu nên mình hẹn các bạn bài sau và sẽ đi vào 1 bài rất quan trọng về “List” trong Dynamo.

1.List là gì ?

– List hay danh sách là 1 dạng cấu trúc dữ liệu trong Dynamo . Để dễ hình dung bạn có thể tưởng tượng nó giống như 1 mục lục của 1 quyển sách vậy ,  trong mục lục cũng có các chương , trong các chương lại có các bài , trong bài lại có các mục nhỏ hơn …  List cũng được phân cấp như mục lục và chúng ta có thể gọi là List đơn hay List có cấp bằng 0 , List cấp 1, List cấp 2 …. Bạn quan sát hình ảnh bên dưới  với List là 1 dãy số từ 1 đến 10:

2.Một số thao tác với List

-Trong trường hợp trên các phần tử trong List là các số nhưng List không chỉ chứa được số mà có thể chứa bất kì thứ gì, bất kì đối tượng nào trong Revit  cũng có thể là 1 phần tử của List .  Những bạn mới bắt đầu nên thao tác nhiều với dạng List đơn sẽ dễ hiểu hơn rất nhiều.

-Nếu không may bạn gặp 1 List có bậc cao thì có thể chuyển nó về List đơn bằng node Flatten như trong hình :

  • Các phần tử ở bên trong List là các đối tượng chúng ta cần làm việc ,  và tất nhiên phải có các cách thức làm việc với nó , điển hình nhất là lấy phần tử ra , xóa phần tử, chèn thêm phần tử …Trước khi mình ví dụ các thao tác ,nếu quan sát kĩ bạn sẽ thấy bên cạnh các phần tử có các số 0,1,2… .Các số đó được gọi là các chỉ mục  (Index) ,đơn giản bạn hình dung chỉ mục giống như mã số sinh viên hay số chứng minh nhân dân của bạn vậy , không cần biết bạn là ai , bạn là cái gì chỉ cần bạn cướp ngân hàng và để lại CMND thì người ta cũng sẽ tìm được chính xác bạn :v . Trong trường hợp này số 0 tương ứng chỉ mục 0 ,số 1 tương ứng chỉ mục 1 … và tất nhiên thao tác gọi ra sẽ như sau  :– Đầu tiên là về kí hiệu  “obj” , nó chỉ là 1 cái tên mà bạn đặt thế nào cũng được miễn là không phải những kí tự đặc biệt  như    *,^,(,@,#…… nếu không sẽ phát sinh lỗi :
  • Nói nôm na khi bạn viết cú pháp  “obj[1]” thì có nghĩa là  “ Này Dynamo,mày tạo ra một tham số có tên “obj” để lưu trữ dữ liệu khi tao đưa vào 1 list rồi lấy ra cho tao phần tử có chỉ mục 1 trong list đó” .Như đã nói “obj” chỉ là 1 cái tên ,bạn có thể thử như “ngoctrinh[1]”hay “love[1]” cũng được kết quả như nhau !

Bạn có thể kết hợp các cú pháp với dãy số đã học ở bài trước để gọi ra nhiều phần tử tùy ý :

*Ở phần này bạn nên chú ý chi tiết là chỉ mục (Index) trong List bắt đầu từ 0 chứ không phải 1 vì thế nếu bạn có  N phần tử thì phần tử cuối cùng sẽ có chỉ mục là N-1, việc này lúc đầu có thể gây khó chịu cho một số bạn mới bắt đầu nhưng dần dần bạn sẽ quen và thấy nó có ích .

**Một số node rất hay dùng khi làm việc với List trong Dynamo

List.Count : Có tác dụng đếm số phần tử trong 1 List  .

-List.Reverse : có tác dụng đảo ngược chiều của List ,kiểu như bạn có 1 dãy số : 1,2,3,4,5.Sau khi đưa dãy số này qua List.Reverse nó vẫn là dãy số đó nhưng thứ tự bị đảo ngược thành 5,4,3,2,1 . Và dãy số mà Dynamo hiểu chính là các chỉ mục (Index) của List.Bạn có thể ứng dụng cho bài toán hay dùng trong thực tế kiểu như cần lấy 4 điểm đầu và 4 điểm cuối của 1 List 100 điểm chả hạn !

List.FilterByBooleanMark : Có tác dụng lọc các phần tử tương ứng với các giá trị đúng sai , đầu vào lần lượt là 1 List cần lọc và 1 List các giá trị đúng sai để làm điều kiện lọc :

  • Trong Thực tế công việc bạn sẽ gặp rất nhiều trường hợp cần lọc đối tượng theo điều kiện nào đó ,cho dù điều kiện là gì thì bạn cũng cần chuyển nó thành dạng True , False nên bạn cần hiểu rõ cách hoạt động của node trên vì sẽ dùng rất nhiều.

–  List.Tranpose : Có tác dụng chuyển vị các phần tử trong List . Nói thế thì hơi khó hiểu ,bạn có thể tưởng tượng giống như chuyển ma trận hàng thành ma trận cột vậy . Bạn quan sát :

Bạn có thể dùng List.Tranpose để nhóm 3 phần tử của 3 List , 4 phần tử của 4 List ….. phần tử có thể là điểm , đường thẳng , mặt phẳng …

– List.Chop: Phân chia 1 List lớn thành các list nhỏ có chiều dài do người dùng nhập , thường thì chúng ta sẽ nhập giá trị là ước số của số lượng phần tử trong List lớn . Bạn quan sát hình bên dưới :

* Nếu để ý các bạn sẽ thấy hầu hết các Node đều có đầu vào bên trái và đầu ra bên phải , để dễ diễn đạt và để tỏ ra nguy hiểm giống lập trình viên :v, từ này mình sẽ gọi đầu vào bên trái là các đối số , bên phải là kết quả trả về nhé !

**Trước khi đi vào 1 số Node khó hiểu hơn có lẽ chúng ta nên hiểu 1 chút về thuộc tính “Lacing” (nếu có) của 1 Node bất kì .

-Hiểu 1 cách đơn giản ,đây là thuộc tính quyết định cách kết hợp giữa các List đóng vai trò là các đối số . thuộc tính này có 3 chế độ là  :  Shortest , Longest , Cross Product . Các bạn theo dõi hình và đọc chú thích để hiểu cách làm việc của 3 chế độ này .Mình thấy khá nhiều bạn bị nhầm lẫn ở đây và hỏi về vấn đề này .Thực tế cũng ứng dụng khá nhiều nên mọi người chú ý nhé !

Thường thì ta hay dùng 2 chế độ là Shortest  hoặc Cross Product .

  • Ví dụ khi bạn cần kiểm tra xem các phần tử tương ứng của 2 List có số lượng bằng nhau có bằng nhau không ? Nếu có cặp nào bằng nhau thì trả về giá trị, khi đó bạn dùng Shortest.
  • Hay khi bạn cần lọc ra 3 loại dầm A,B,C trong 100 cái dầm  ,  thường thì bạn sẽ làm kiểu như   :  Này dầm ! Mày có thuộc loại A không ?  Cái nào trả lời có thì đánh dấu True,ngược lại False . Cứ lần lượt đến hết 100 cái . Làm tương tự với B,C ta sẽ được 3 List gồm các giá trị True hay False  rồi dùng List.FilterByBooleanMark đã học để lọc dc 3 loại dầm . Bài toán này khá giống với Cross Product nhỉ ?

-Hazi bài List này dài quá , cố thêm 1 chút với vài nút nâng cao hơn nhưng cũng rất hay dùng nhé !

List.Map : Node này sẽ có tác dụng tạo một liên kết tới cấp cụ thể của 1 List , hay cách nói khác là giúp ta tham chiếu tới các phần tử thuộc một cấp cụ thể nào đó của 1 List cấp cao rồi thực hiện 1 công việc  tương ứng với đối số f(x) .Thực sự thì mình viết mình còn chả hiểu thì sao người khác hiểu được =)). Trước khi đòi chém mình thì mới bạn xem chút ví dụ nhé :

-Ở đây List.Count là hành động chúng ta cần thực hiện với các phần tử được tham chiếu được nối với đối số f(x) của List.Map, trong ví dụ này là đếm các phần tử bên trong các List đơn thành phần của một List cấp 1. Bạn có thể thử với một số hành động khác như xóa, chèn thêm ,tạo Line…

Các bạn tự khám phá khi điều chỉnh các @L của đối số nhé !

List.Combine : Đối số đầu tiên “comb”  nhận vào là đầu ra của 1 Node đóng vai trò là hành động thực hiện công việc , các đối số tiếp theo là các List chứa các phần tử , số lượng các đối số tiếp theo phải bằng số lượng đối số đầu vào của Node đóng vai trò là hành động . Hazi có vẻ càng ngày càng khó hiểu nhỉ , có vẻ các bạn nên xem hình rồi đọc lại .Chắc tại mình diễn đạt kém !

Ở đây chỉ xin lưu ý là thứ tự các đối số phải tương ứng với thứ  tự đối số đầu vào của Node đóng vai trò hành động .Nếu sai thứ tự thì List.Combie sẽ lỗi hoặc không đúng với mong muốn. Nếu Node đóng vai trò hành động có n số liệu đầu vào thì số liệu đầu vào của List.Combie giảm đi  n và các số liệu đầu vào của List.Combie sẽ tương ứng với đầu vào của Node đóng vai trò hành động đang thiếu . Node này khá hay bạn nên cố gắng hiểu để áp dụng ,khi hiểu được sẽ giúp bạn tiết kiệm rất nhiều thời gian và phát huy khả năng sáng tạo !

Nếu có phần nào khó hiểu hay bất kì phản hồi nào các bạn có thể trực tiếp bình luận tại bài viết hay tham gia đặt câu hỏi trên diễn đàn https://forum.onebim để mọi người cùng thảo luân và cùng nhau tiến bộ . Tham gia nhóm Facebook để cùng thảo luận và cập nhật thông tin về Dynamo https://www.facebook.com/groups/871336123015913/

Mọi ý kiến góp ý hay câu hỏi các bạn có thể gửi về mail hoặc Facebook tác giả  : danghuulamnd1992@gmail.com

https://www.facebook.com/lam.danghuu.3

Khóa học do tác giả trực tiếp giảng dạy các bạn tìm hiểu thêm tại  : https://redy.vn/course/ung-dung-revit-dynamo-bim/

 

Xem tiếp Series<< Bài 3: Hướng dẫn về kiểu dữ liệu chuỗi trong DynamoBài 5 :Tham chiếu đối tượng Revit trong Dynamo >>
Comments
Loading...