清單是我們組織資料的方式。在您電腦的作業系統上,您具有檔案和資料夾。在 Dynamo 中,我們可以分別將這些視為項目和清單。與您的作業系統類似,有許多方式可建立、修改和查詢資料。在本章中,我們將詳細說明 Dynamo 中管理清單的方式。
清單是元素 (即項目) 的集合。例如一束香蕉。每個香蕉都是清單 (即香蕉束) 中的項目。揀選一束香蕉比分別揀選每個香蕉更容易,依據資料結構中的參數式關係對元素進行分組也是如此。
相片由 Augustus Binu 拍攝。
購買雜貨時,我們會將購買的所有商品放入袋中。這個袋子也是清單。如果要製作香蕉麵包,我們需要 3 束香蕉 (我們將製作 大量 香蕉麵包)。袋子表示香蕉束的清單,而每束香蕉表示香蕉的清單。袋子是清單的清單 (二維),而香蕉束是清單 (一維)。
在 Dynamo 中,清單資料具有順序,每個清單中第一個項目的索引都是「0」。以下我們將討論在 Dynamo 中如何定義清單,以及多個清單如何彼此相關。
起初有一點可能看起來很奇怪,那就是清單的第一個索引始終是 0,而不是 1。因此,在談到清單的第一個項目時,實際指的是索引 0 對應的項目。
例如,如果您數數右手手指的數量,很可能會從 1 數到 5。但是,如果將手指放在清單中,Dynamo 會為其指定從 0 至 4 的索引。雖然這對於程式設計的初學者而言可能有些奇怪,但從零開始的索引是多數運算系統中的標準做法。
請注意,我們的清單中仍有 5 個項目,清單恰好使用從零開始的計數系統。清單中正在儲存的項目不一定是數字。它們可以是 Dynamo 支援的任何資料類型,例如點、曲線、曲面、族群等。
a.索引
b.點
c.項目
通常,查看清單中所儲存資料類型的最簡單方法,是將觀看節點連接至另一個節點的輸出。依預設,觀看節點會在清單的左側自動展示所有索引,並在右側展示資料項目。
使用清單時,這些索引是非常重要的元素。
對清單而言,輸入與輸出視使用的 Dynamo 節點而有所不同。例如,接下來我們使用包含 5 個點的清單,並將此輸出連接至兩個不同的 Dynamo 節點:PolyCurve.ByPoints 與 Circle.ByCenterPointRadius:
PolyCurve.ByPoints 的 points 輸入是尋找 「Point[]」。這表示點清單
PolyCurve.ByPoints 的輸出是從一個包含五個點的清單建立的一條 PolyCurve。
Circle.ByCenterPointRadius 的 centerPoint 輸入要求 「Point」。
Circle.ByCenterPointRadius 的輸出是一個包含五個圓的清單,其中圓的中心對應於點的原始清單。
PolyCurve.ByPoints 與 Circle.ByCenterPointRadius 的輸入資料相同,但是 Polycurve.ByPoints 節點的結果是一條 PolyCurve,而 Circle.ByCenterPointRadius 節點的結果是中心位於每個點的 5 個圓。以直觀方式很容易理解這一點:polycurve 繪製為連接 5 個點的曲線,而圓會在每個點建立不同的圓。資料出現什麼情況?
將游標懸停在 Polycurve.ByPoints 的 points 輸入上方,可以看到輸入在尋找 「Point[]」。注意末尾的中括號。這表示點的清單,若要建立 polycurve,輸入需要是每個 polycurve 的清單。因此,此節點會將每個清單濃縮到一條 polycurve 中。
另一方面,Circle.ByCenterPointRadius 的 centerPoint 輸入要求 「Point」。此節點會尋找一個點,做為項目以定義圓的中心點。因此輸入資料會產生五個圓。辨識 Dynamo 中這些輸入的差異可協助您更好地瞭解在管理資料時節點的作業方式。
資料相符是沒有明確解決方案的問題。在節點對大小不同的輸入具有存取權時,會發生此問題。變更資料相符演算法會產生截然不同的結果。
想像在點之間建立直線段的節點 (Line.ByStartPointEndPoint)。它有兩個輸入參數,都提供點座標:
最簡單的方式是逐一連接輸入,直到其中一個串流結束為止。這稱為「最短清單」演算法。這是 Dynamo 節點的預設行為:
「最長清單」演算法會保持連接輸入,重複使用元素,直到所有串流結束為止:
最後,「笛卡兒積」方法會產生所有可能的連接:
您可以看到,可以採用不同方法在這組點之間繪製直線。在節點的中心按一下右鍵,然後選擇「交織」功能表,可以找到「交織」選項。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
為了示範下面的交織作業,我們將使用此基準檔案來定義最短清單、最長清單及笛卡兒積。
我們將變更 Point.ByCoordinates 的交織,但不會變更上述圖表的任何其他內容。
選擇 最短清單 做為交織選項 (也是預設選項),我們會得到一條由五個點組成的基本對角線。五個點是較短清單的長度,因此最短清單交織會在到達一個清單的結尾後停止。
如果將交織變更為 最長清單,我們會得到一條垂直延伸的對角線。運用與概念圖相同的方法,含 5 個項目的清單中的最後一個項目將重複,以達到較長清單的長度。
如果將交織變更為 笛卡兒積,我們會得到各個清單之間的每種組合,產生一個 5x10 的點格線。這個資料結構等同於上面的概念圖顯示的笛卡兒積,只是現在資料是一個清單的清單。如果連接 polycurve,我們可以看到每個清單都由其 X 值定義,因此產生一列垂直線。
現在我們已建立清單,接下來討論可以對清單執行哪些作業。將清單想像為一副紙牌。這副紙牌是清單,而其中每張紙牌都代表一個項目。
我們可以對清單執行哪些查詢?這將存取既有性質。
這副紙牌有多少張?52 張。
有幾種花色?4 種。
用哪種材料製成?紙。
長度是多少?3.5" 或 89mm。
寬度是多少?2.5" 或 64mm。
我們可以對清單執行哪些動作?這會根據指定的作業變更清單。
我們可以重新洗牌。
我們可以根據點數對紙牌排序。
我們可以根據花色對紙牌排序。
我們可以拆分紙牌。
我們可以雙手各握一部分紙牌。
我們可以選取其中特定的某張牌。
以上列示的所有作業都有類似的 Dynamo 節點,供您使用一般資料的清單。以下課程將展示我們可以對清單執行的一些基本作業。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
以下影像是基礎圖表,我們在兩個圓之間繪製線以表示基本清單作業。我們將探究如何管理清單內的資料,並透過以下清單動作示範視覺結果。
首先使用一個 Code Block,值為
500;
插入 Point.ByCoordinates 節點的 x 輸入。
將上一步驟的節點插入 Plane.ByOriginNormal 節點的 origin 輸入。
使用 Circle.ByPlaneRadius 節點,將上一步驟的節點插入 plane 輸入。
使用 Code Block,為 radius 指定
50;
的值。這是我們要建立的第一個圓。使用 Geometry.Translate 節點,在 Z 方向將圓上移 100 個單位。
使用 Code Block 節點,透過以下程式碼定義 10 個 0 和 1 之間的數字:
0..1..#10;
將上一步驟的 Code Block 插入兩個 Curve.PointAtParameter 節點的 param 輸入。將 Circle.ByPlaneRadius 插入頂部節點的 curve 輸入,將 Geometry.Translate 插入下方節點的 curve 輸入。
使用 Line.ByStartPointEndPoint,連接兩個 Curve.PointAtParameter 節點。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.Count 節點很簡單:它會對清單中的值進行計數,並傳回該數量。使用清單的清單時,此節點將更為精細,不過我們將在後續章節示範該內容。
**List.Count ****** 節點會傳回 Line.ByStartPointEndPoint 節點中的線數。在此案例中,該值為 10,這與從原始 Code Block 節點建立的點數一致。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.GetItemAtIndex 是對清單中的項目進行查詢的基本方式。
首先,在 Line.ByStartPointEndPoint 節點上按一下右鍵以關閉其預覽。
使用 List.GetItemAtIndex 節點,我們將選取索引 0 或線清單中的第一個項目。
變更介於 0 到 9 之間的滑棒值,以使用 List.GetItemAtIndex 選取其他項目。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.Reverse 會反轉清單中所有項目的順序。
若要正確顯示反轉的線清單,請將 Code Block 變更為
0..1..#50;
以建立更多條線複製 Line.ByStartPointEndPoint 節點,在 Curve.PointAtParameter 與第二個 Line.ByStartPointEndPoint 之間插入 List.Reverse 節點
使用 Watch3D 節點可預覽兩個不同的結果。第一個節點顯示無反轉清單的結果。線垂直連接至相鄰的點。但是,反轉清單會以另一個清單中的相反順序連接所有點。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.ShiftIndices 是建立扭轉或螺旋樣式或任何其他類似資料處理的良好工具。此節點會將清單中的項目移位指定數量的索引。
採用對反轉清單的相同程序,將 List.ShiftIndices 插入 Curve.PointAtParameter 與 Line.ByStartPointEndPoint。
使用 Code Block,指定值「1」將清單移位一個索引。
請注意,變更很小,但下方 Watch3D 節點中所有的線在連接至其他組點時已移位一個索引。
將 Code Block 變更為較大的值 (例如 30),我們發現對角線有顯著不同。在此範例中,此移位的作用類似於相機的光圈,對原始圓柱形產生了扭轉。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.FilterByBooleanMask 將根據一系列布林值或者「True」或「False」值移除某些項目。
為了建立一系列「True」或「False」值,我們需要多做一些工作...
使用 Code Block,採用以下語法定義表示式:
0..List.Count(list);
。將 Curve.PointAtParameter 節點連接至 list 輸入。我們將在程式碼區塊一章中更詳細地講解此設置,但此案例中的程式碼行將產生代表 Curve.PointAtParameter 節點每個索引的清單。使用 _ % _ ** (模數)** 節點,將 Code Block 的輸出連接至 x 輸入,將值 4 連接至 y 輸入。這會產生索引清單除以 4 時的餘數。模數在建立樣式時是非常有用的節點。4 的所有可能餘數包括:0、1、2、3。
從 %** (模數)** 節點,我們知道值 0 表示索引可由 4 整除 (0、4、8 等)。使用 == 節點,我們可以測試餘數的值是否為 0,以測試是否能整除。
Watch 節點顯示此狀況:True/False 樣式為:true,false,false,false...。
使用此 True/False 樣式,連接至兩個 List.FilterByBooleanMask 節點的 mask 輸入。
將 Curve.PointAtParameter 節點連接至 List.FilterByBooleanMask 的每個 list 輸入。
Filter.ByBooleanMask 的輸出為 in 與 out。in 表示遮罩值為 true 的值,而 out 表示遮罩值為 false 的值。透過將 in 輸出插入 Line.ByStartPointEndPoint 節點的 startPoint 與 endPoint 輸入,我們建立出經過篩選的線清單。
Watch3D 節點顯示出線比點少。我們只篩選了 True 值,因此只選取了 25% 的節點。
接下來在階層中再加入一層。我們以最初範例中的一副紙牌為例,如果製作容納多副紙牌的盒子,那麼現在盒子就代表各副紙牌的清單,而每副紙牌代表紙牌的清單。這是清單的清單。為了說明本節內容,我們進行類比,以下影像包含多疊硬幣,每疊包含多個一美分硬幣。
我們可以對清單的清單執行哪些查詢?這將存取既有性質。
有幾種硬幣類型?2.
硬幣類型值?1 美分和 25 美分。
25 美分硬幣的材料是什麼?75% 的銅與 25% 的鎳。
一美分硬幣的材料是什麼?97.5% 的鋅與 2.5% 的銅。
我們可以對清單的清單執行哪些動作?這會根據指定的作業變更清單的清單。
選取特定的一疊 25 美分硬幣或一美分硬幣。
選取特定的一枚 25 美分硬幣或一美分硬幣。
重新排列各疊 25 美分硬幣與一美分硬幣。
攪亂各疊硬幣。
再說一次,對於上述每項作業,Dynamo 都有類比節點。由於我們使用的是抽象資料,而不是實際物件,因此需要採用一組規則以管理資料階層上下移動的方式。
處理清單的清單時,資料分層放置且非常複雜,但是您可藉此執行某些良好的參數式作業。在以下課程中,我們將分類講解基礎知識,並討論更多作業。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
本節將瞭解的基本概念:Dynamo 將清單視為其本身的物件。此由上而下的階層在開發時,考慮到以物件為導向的程式設計。Dynamo 並非使用類似於 List.GetItemAtIndex 的指令選取子元素,而是選取資料結構中的主要清單索引。項目可以是另一個清單。接下來我們使用範例影像進行分解說明:
我們使用 Code Block 定義了兩個範圍:
0..2; 0..3;
這些範圍連接至 Point.ByCoordinates 節點,交織設定為 「笛卡兒積」。這會建立點的格線,也會傳回清單的清單作為輸出。
請注意,Watch 節點可產生 3 個清單,每個清單中包含 4 個項目。
使用 List.GetItemAtIndex 時,透過索引 0,Dynamo 會選取第一個清單及其所有內容。其他程式可能會在資料結構中選取每個清單的第一個項目,但 Dynamo 在處理資料時,採用由上而下的階層。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
平坦化會移除資料結構中的所有資料層。若您的作業不需要資料階層,這會很有用,但是存在風險,因為它會移除資訊。以下範例將展示對資料清單進行平坦化的結果。
在 Code Block 中插入一行程式碼以定義範圍:
-250..-150..#4;
透過將 Code Block 插入 Point.ByCoordinates 節點的 x 與 y 輸入,我們將交織設定為 「笛卡兒積」 以取得點的格線。
Watch 節點顯示我們有一個清單的清單。
PolyCurve.ByPoints 節點將參考每個清單,並建立各自的 polycurve。請注意,在 Dynamo 預覽中有四個 polycurve,分別代表格線的每一列。
透過在 polycurve 節點前插入 平坦化,我們建立了一個所有點的清單。PolyCurve.ByPoints 節點會參考清單來建立一條曲線,由於所有點都在一個清單上,因此我們將得到通過整個清單中所有點的一條曲折 polycurve。
此外,還提供對隔離層的資料進行平坦化的選項。使用 List.Flatten 節點,您可以定義從階層頂部進行平坦化的資料層數量。如果您對運用複雜的資料結構感到吃力,而這些資料結構不一定與您的工作流程相關,則該工具確實非常有用。其他選項會將平坦化節點用作 List.Map 中的函數。我們將在下面詳細討論 List.Map。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
執行參數式塑型時,有時您也會想要對既有清單修改資料結構。有許多節點可用於實現此功能,細分是最基本的版本。使用細分,我們可以將清單分割為包含一定數量項目的子清單。
「細分」指令可根據指定的清單長度分割清單。在某種程度上,細分與平坦化恰恰相反:細分不是移除資料結構,而是在其中加入新層。對於諸如以下範例等幾何圖形作業,此工具很有用。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
List.Map/Combine 會對輸入清單套用一個設定好的函數,但下一階層的清單。組合與對映相同,只是組合可以有多個輸入對應於給定函數的輸入。
我們回顧上一節的 List.Count 節點來快速介紹。
List.Count 節點會對清單中的所有項目進行計數。我們將使用此節點示範 List.Map 的運作方式。
在 Code Block 中插入兩行程式碼:
-50..50..#Nx; -50..50..#Ny;
輸入此程式碼後,Code Block 會建立 Nx 與 Ny 兩個輸入。
使用兩個 Integer Slider 連接至 Code Block 以定義 Nx 與 Ny 值。
將 Code Block 每一行分別連接至 Point.ByCoordinates 節點的 X 與 Y 輸入。在節點上按一下右鍵,選取「交織」,然後選擇 「笛卡兒積」。這會建立點的格線。由於我們定義的範圍是從 -50 到 50,因此將跨越預設的 Dynamo 格線。
Watch 節點會顯示已建立的點。請注意資料結構。我們已建立一個清單的清單。每個清單都代表格線的一列點。
將 List.Count 節點連接至上一步驟中 Watch 節點的輸出。
將 Watch 節點連接至 List.Count 輸出。
請注意,List.Count 節點提供的值為 5。這等於 Code Block 中定義的「Nx」變數。為何會發生這種情況?
首先,Point.ByCoordinates 節點使用「x」輸入作為建立清單的主要輸入。若 Nx 為 5 且 Ny 為 3,我們會得到一個 5 個清單的清單,每個清單有 3 個項目。
因為 Dynamo 單獨只把清單視為對象,因此 List.Count 節點是套用到階層中的主要清單。結果值為 5,即主要清單中的清單數量。
使用 List.Map 節點,我們進到階層的下一層,並在此層級執行 function。
請注意,List.Count 節點沒有輸入。它是當作一個函數,因此會將 List.Count 節點套用至階層中下一層級的每個清單。List.Count 的空白輸入對應於 List.Map 的清單輸入。
現在 List.Count 的結果提供一個 5 個項目的清單,每個項目的值為 3。這代表每個子清單的長度。
在本練習中,我們將使用 List.Combine 示範如何對不同物件清單中套用函數。
首先設定兩個點清單。
使用 Sequence 節點產生 10 個值,每個值都有 10 個步長增量。
將結果連接至 Point.ByCoordinates 節點的 x 輸入。這會在 Dynamo 中建立一個點清單。
在工作區中增加第二個 Point.ByCoordinates 節點,使用相同的 Sequence 輸出做為其 x 輸入,但使用 Interger Slider 做為其 y 輸入,並將其值設定為 31 (可以是任何值,只要不與第一組點重疊即可),讓兩組點不會彼此重疊。
接下來,我們使用 List.Combine 對 2 個單獨清單中的物件套用函數。在此範例中,是一個簡單的繪製線條函數。
在工作區中加入 List.Combine,連接 2 組點做為其 list0 與 list1 輸入。
使用 Line.ByStartPointEndPoint 做為 List.Combine 的輸入函數。
完成後,2 組點會透過 Line.ByStartPointEndPoint 函數配對,並在 Dynamo 中傳回 10 條線。
請參閱 n 維清單中的練習,以查看使用 List.Combine 的另一個範例。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
比 List.Map 更好的是,List@Level 功能可讓您在節點的輸入埠直接選取要使用的清單層級。此功能可套用至節點的任何輸入,您可藉此較其他方法更快更輕鬆地存取清單的層級。您只需向節點告知要用作輸入的清單層級,節點會執行其餘作業。
在本練習中,我們將使用 List@Level 功能隔離特定層級的資料。
我們將從簡單的 3D 點格線開始。
格線是使用 X、Y 與 Z 的範圍建構而成,我們知道資料的結構包含 3 層:X 清單、Y 清單及 Z 清單。
這些層處於不同的層級。預覽標示圈底部指出了層級。清單的層級欄對應於上面的清單資料,可協助識別工作所在的層級。
清單層級以反轉順序排列,因此最低層級的資料始終位於「L1」。這有助於確保圖表按計劃工作,即使上游發生變更,也是如此。
若要使用 List@Level 函數,請按一下「>」。在此功能表中,您會看到兩個勾選方塊。
使用層級 - 這會啟用 List@Level 功能。按一下此選項後,您就能在當中點按,然後選取希望節點使用的輸入清單層級。透過此功能表,您就能按一下向上或向下,快速試用不同的層級選項。
保留清單結構 - 如果啟用,您可以選擇保留該輸入的層級結構。有時,您可能會特意將資料組織到子清單中。勾選此選項,可以保持清單組織不變,確保不會遺失任何資訊。
使用簡單的 3D 格線,我們可以切換清單層級,以存取與視覺化清單結構。清單層級與索引的每個組合都會從原始的 3D 點集傳回一組不同的點。
透過 DesignScript 中的「@L2」,我們可以只選取層級 2 的清單。層級 2 的清單 (索引為 0) 只會包括第一組 Y 點,只傳回 XZ 格線。
如果將層級篩選變更為「L1」,我們可以看到第一個清單層級內的所有內容。層級 1 的清單 (索引為 0) 會以一個展開清單包括所有 3D 點。
如果我們嘗試改成「L3」並執行相同作業,只會看到第三個清單層級的點。層級 3 的清單 (索引為 0) 只會包括第一組 Z 點,只傳回 XY 格線。
如果我們嘗試改成「L4」並執行相同作業,只會看到第三個清單層級的點。層級 4 的清單 (索引為 0) 只會包括第一組 X 點,只傳回 YZ 格線。
雖然我們也可以使用 List.Map 建立此特定範例,但是 List@Level 能夠大幅簡化互動方式,讓存取節點資料更輕鬆。請看下面 List.Map 與 List@Level 方法的比較:
雖然使用兩種方法都可以存取相同的點,但是使用 List@Level 方法可以在單一節點內輕鬆切換不同資料層。
若要使用 List.Map 存取點格線,我們需要一起使用 List.GetItemAtIndex 節點和 List.Map。如果我們要下移每個清單層級,都必須額外使用一個 List.Map 節點。視清單的複雜性而定,您可能需要在圖表中加入大量 List.Map 節點,才能存取適當層級的資訊。
在此範例中,List.GetItemAtIndex 節點搭配 List.Map 節點,與 List.GetItemAtIndex (選取「@L3」) 傳回相同清單結構的相同一組點。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
轉置是處理清單的清單時的基本功能。正如在試算表程式中,轉置會翻轉資料結構的欄與列。我們將使用以下的基本矩陣示範這一點,在之後的一節中,我們將示範如何使用轉置建立幾何關係。
接下來刪除上一個練習中的 List.Count 節點,而改用某些幾何圖形以查看資料的構建方式。
將 PolyCurve.ByPoints 從 Point.ByCoordinates 連接至 Watch 節點的輸出。
輸出顯示 5 條 PolyCurve,我們可以在 Dynamo 預覽中看到這些曲線。Dynamo 節點將尋找點清單 (在此案例中是點清單的清單),並根據點清單建立單一 polycurve。實質上,每個清單都已轉換為資料結構中的曲線。
List.Transpose 節點會切換所有項目,以及清單的清單中的所有清單。這似乎很複雜,但其邏輯與 Microsoft Excel 中的轉置相同:切換資料結構中的欄與列。
請注意摘要結果:轉置會將清單結構從 5 個清單 (每個含 3 個項目) 變更為 3 個清單 (每個含 5 個項目)。
請注意幾何圖形結果:使用 PolyCurve.ByPoints,會在原始曲線的垂直方向產生 3 條 PolyCurve。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
此練習將使用上一個練習中建立的一些邏輯以編輯曲面。我們在這裡的目標非常直觀,但資料結構導覽較為複雜。我們要透過移動控制點來連接曲面。
先從上述節點的字串開始。我們將建立跨越預設 Dynamo 格線的基本曲面。
使用 Code Block,插入這兩行程式碼,然後分別連接到 Surface.PointAtParameter 的 u 與 v 輸入:
-50..50..#3;
-50..50..#5;
請確保將 Surface.PointAtParameter 的「交織」設定為 「笛卡兒積」。
Watch 節點顯示我們有一個 3 個清單的清單,每個清單有 5 個項目。
在這一步,我們要查詢所建立格線內的中心點。為了執行此作業,我們將選取中間清單內的中間點。很合理,對嗎?
為了確認這是否為正確的點,也可以在 Watch 節點項目中到處按一下,以確認我們針對的是正確的點。
使用 Code Block,我們將編寫一行基本程式碼來查詢清單的清單:
points[1][2];
使用 Geometry.Translate,我們將選取的點沿 Z 方向上移 20 個單位。
我們也使用 List.GetItemAtIndex 節點選取中間列的點。注意:與上一個步驟類似,我們也可以透過 Code Block,使用
points[1];
這一行查詢清單
到目前為止,我們已成功查詢到中心點,並將其上移。現在,我們需要將移動的該點重新插入原始資料結構。
首先,我們要更換上一步驟中所隔離清單的項目。
使用 List.ReplaceItemAtIndex,我們將運用索引 2,將中間項目更換為連接至移動點的更換項目 (Geometry.Translate)。
輸出顯示出我們已將移動點輸入至清單的中間項目。
現在,我們已修改清單,需要將此清單重新插入原始資料結構:清單的清單。
採用相同的邏輯,使用 List.ReplaceItemAtIndex 將中間清單更換為我們修改後的清單。
請注意,對這兩個節點定義索引的 Code Block 為 1 與 2,這與 Code Block (points[1][2]) 中的原始查詢相符。
透過選取位於 索引 1 的清單,我們可以在 Dynamo 預覽中看到亮顯的資料結構。我們已成功將移動點合併至原始資料結構中。
有許多方式可以使用這組點建立曲面。在此案例中,我們將對曲線進行斷面混成,以建立曲面。
建立 NurbsCurve.ByPoints 節點,並連接新資料結構以建立三條 nurbs 曲線。
將 Surface.ByLoft 連接至 NurbsCurve.ByPoints 的輸出。現在我們已修改曲面。我們可以變更幾何圖形的原始 Z 值。平移並查看幾何圖形更新!
進一步深入探討,接下來我們在階層中加入更多層。資料結構的擴展範圍遠超二維清單的清單。由於在 Dynamo 中清單是其本身的項目,因此我們可以建立維度儘可能多的資料。
我們在此將使用的類比是俄羅斯套娃。可將每個清單視為包含多個項目的一個容器。每個清單都有自己的性質,也可將每個清單視為自己的物件。
一組俄羅斯套娃 (相片由 拍攝) 可類比為 n 維清單。每層代表一個清單,每個清單包含其內部的項目。在 Dynamo 的案例中,每個容器內部可以有多個容器 (表示每個清單的項目)。
很難以視覺方式解釋 n 維清單,但我們在本章設置了一些練習,以著重說明使用超過二維的清單。
對映可能是 Dynamo 中資料管理最複雜的部分,在使用複雜的清單階層時尤其重要。透過以下的一系列練習,我們將展示在資料變成多維時,何時使用對映與組合。
上一節提供了 List.Map 與 List.Combine 的初步介紹。在以下最後一個練習中,我們將對複雜的資料結構使用這些節點。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
此練習是一系列三個練習中的第一個,著重講解匯入的幾何圖形。在這一系列練習中,每個部分的資料結構複雜性都有提升。
先從練習檔案資料夾中的 .sat 檔案開始。我們可以使用 File Path 節點擷取此檔案。
使用 Geometry.ImportFromSAT,將幾何圖形匯入為 Dynamo 預覽中的兩個曲面。
對於此練習,我們希望執行簡單作業,並使用其中一個曲面。
接下來選取索引 1 以擷取上方的曲面。我們使用 List.GetItemAtIndex 節點執行此作業。
關閉 Geometry.ImportFromSAT 預覽的幾何圖形預覽。
下一步是將曲面分割為點的格線。
1.使用 Code Block,插入以下兩行程式碼:
0..1..#10;
0..1..#5;
2.使用 Surface.PointAtParameter,將兩個 Code Block 的值連接至 u 與 v。將此節點的 交織 變更為 「笛卡兒積」。
3.輸出顯示了資料結構,在 Dynamo 預覽中也可以看到資料結構。
接下來,使用上一步的「點」沿曲面產生十條曲線。
為了查看資料結構的組織方式,接下來將 NurbsCurve.ByPoints 連接至 Surface.PointAtParameter 的輸出。
您現在可以關閉 List.GetItemAtIndex 節點的預覽,以便看到更清楚的結果。
對於清單的清單,基本 List.Transpose 會翻轉欄與列。
將 List.Transpose 的輸出連接至 NurbsCurve.ByPoints,現在曲面上有五條曲線處於水平狀態。
您可以關閉上一步 NurbsCurve.ByPoints 節點的預覽,得到與影像相同的結果。
接下來提高複雜性。假設我們要對上一個練習中建立的曲線執行作業。我們可能希望讓這些曲線與另一個曲面相關,並在這些曲線之間執行斷面混成。這需要更多注意資料結構,但基本邏輯是相同的。
從上一個練習的步驟開始,使用 List.GetItemAtIndex 節點隔離所匯入幾何圖形的上方曲面。
使用 Surface.Offset,將曲面偏移值 10。
使用上一個練習中的相同方式,定義包含以下兩行程式碼的 Code Block:
0..1..#10;
0..1..#5;
將這些輸出連接至兩個 Surface.PointAtParameter 節點 (每個節點的 交織 設定為 「笛卡兒積」 )。其中一個節點連接至原始曲面,而另一個連接至偏移曲面。
關閉這些曲面的預覽。
與上一個練習中相同,將輸出連接至兩個 NurbsCurve.ByPoints 節點。結果會顯示與兩個曲面對應的曲線。
使用 List.Create,可以將兩組曲線合併至一個清單的清單中。
請注意輸出包含兩個清單,每個清單包含十個項目,表示每個清單連接一組 Nurbs 曲線。
透過執行 Surface.ByLoft,我們能以視覺方式瞭解該資料結構。節點會對每個子清單中的所有曲線執行斷面混成。
關閉上一步 Surface.ByLoft 節點的預覽。
記住,使用 List.Transpose,我們將翻轉所有欄與列。此節點會將各包含十條曲線的兩個清單轉換為各包含兩條曲線的十個清單。現在,我們的每條 NURBS 曲線都與另一個曲面上的相鄰曲線相關。
使用 Surface.ByLoft,我們將產生稜紋結構。
接下來,我們將示範實現此結果的替代程序
在開始之前,請關閉上一步的 Surface.ByLoft 預覽,以避免混淆。
List.Transpose 的替代方法是 List.Combine。此作業會對每個子清單使用 「結合器」。
在此案例中,我們將 List.Create 用作 「結合器」,它將建立包含子清單中所有項目的清單。
使用 Surface.ByLoft 節點,我們將取得與上一步驟中相同的曲面。在此案例中,轉置更易於使用,但是在資料結構變得更複雜時,List.Combine 更可靠。
後退幾個步驟,如果我們要切換稜紋結構中曲線的方位,需要在連接至 NurbsCurve.ByPoints 之前,使用 List.Transpose。這將翻轉欄與列,產生 5 個水平肋。
現在,我們要更進一步。在本練習中,我們將使用兩個匯入的曲面建立複雜的資料階層。我們的目標仍是使用相同的基本邏輯完全相同的作業。
從上一個練習中所匯入的檔案開始。
與上一個練習中相同,使用 Surface.Offset 節點以偏移值 10。
請注意,輸出顯示我們已使用偏移節點建立了兩個曲面。
使用上一個練習中的相同方式,定義包含以下兩行程式碼的 Code Block:
0..1..#20;
0..1..#20;
將這些輸出連接至兩個 Surface.PointAtParameter 節點 (每個節點的交織設定為 「笛卡兒積」 )。其中一個節點連接至原始曲面,而另一個連接至偏移曲面。
與上一個練習中相同,將輸出連接至兩個 NurbsCurve.ByPoints 節點。
查看 NurbsCurve.ByPoints 的輸出,請注意這是包含兩個清單的清單,較上一個練習更複雜。資料由基本曲面進行分類,因此我們將另一個層加入至構建的資料。
請注意,Surface.PointAtParameter 節點中的狀況變得更複雜。在此案例中,將產生清單的清單的清單。
在繼續之前,請先關閉既有曲面的預覽。
使用 List.Create 節點,將多條 Nurbs 曲線合併為一個資料結構,建立清單的清單的清單。
透過連接 Surface.ByLoft 節點,將取得原始曲面的某個版本,因為每個曲面都位於自己從原始資料結構建立的清單中。
在上一個練習中,我們可以使用 List.Transpose 建立稜紋結構。在本練習中,此方法將無效。轉置應該用於二維清單,而由於我們使用的是三維清單,因此「翻轉欄與列」的作業無法輕鬆執行。請記住,清單是物件,因此 List.Transpose 會翻轉無子清單的清單,但不會翻轉 NURBS 曲線與階層中下一層級內的一個清單。
List.Combine 在本練習中更有效。面對更複雜的資料結構時,我們會使用 List.Map 與 List.Combine 節點。
將 List.Create 用作 「結合器」 會建立更有效的資料結構。
資料結構仍需要在階層中的下一層級進行轉置。若要執行此作業,我們將使用 List.Map。此工作類似於 List.Combine,只是使用一個輸入清單,而不是至少兩個。
我們將套用至 List.Map 的函數是 List.Transpose,它將翻轉主要清單中子清單的欄與列。
最後,我們可以使用正確的資料階層對 Nurbs 曲線進行斷面混成,從而產生稜紋結構。
我們使用 Surface.Thicken 節點,使用如圖所示的輸入設定,對幾何圖形加入一些深度。
加入一個支撐這兩個結構的曲面會很好,因此請加入另一個 Surface.ByLoft 節點,並使用較早步驟中的第一個 NurbsCurve.ByPoints 輸出做為輸入。
預覽變得雜亂時,請在每個節點上按一下右鍵,然後取消勾選「預覽」來關閉這些節點的預覽,以更清楚地查看結果。
增厚這些所選曲面,我們的連接即可完成。
這並不是最舒服的搖椅,但是會取得大量資料。
最後一步,我們將反轉帶條紋部分的方向。在上一個練習中使用轉置時,我們曾執行過與此類似的作業。
由於階層中還有一層,因此我們需要搭配使用 List.Map 與 List.Tranpose 函數來變更 Nurbs 曲線的方向。
我們希望提高踏板數量,因此可以將 Code Block 變更為
0..1..#20;
0..1..#30;
第一個版本的搖椅造型優美,因此我們的第二個模型將作為運動設備提供在野外的休息功能。
相片由 拍攝
相片由 拍攝。
注意:此練習使用舊版本的 Dynamo 建立。大部分 List.Map 功能已透過增加 List@Level 功能解決。如需更多資訊,請參閱以下的 。
注意:此練習使用舊版本的 Dynamo 建立。大部分 List.Map 功能已透過增加 List@Level 功能解決。如需更多資訊,請參閱以下的 。
程式碼區塊速寫使用「[]」定義清單。與 List.Create 節點相比,這是更快速更流暢的清單建立方式。在 中會更詳細地討論程式碼區塊。參考以下影像,請注意使用程式碼區塊如何定義具有多個表示式的清單。
程式碼區塊速寫使用「[]」是一個快速輕鬆的方式,可從複雜的資料結構中選取所需的特定項目。在會更詳細地討論程式碼區塊。參考以下影像,請注意使用程式碼區塊如何查詢具有多種資料類型的清單。