Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
作為一種視覺程式設計環境,Dynamo 可讓您設計資料的處理方式。資料是數字或文字,幾何圖形也是如此。從計算機的角度來說,幾何圖形或有時稱為計算幾何圖形是可以用於建立精美、複雜或效能驅動模型的資料。若要執行此作業,我們需要瞭解可使用的各種幾何圖形的輸入和輸出。
幾何圖形是設計的語言。若程式設計語言或環境的核心是幾何圖形核心,則在設計精確健全的模型、自動化設計常式及使用演算法產生設計迭代方面將帶來無限可能。
透過瞭解幾何圖形類型及其相關方式,我們可以導覽資源庫中提供的幾何圖形節點集合。幾何圖形節點依字母順序排列,與階層順序 (其顯示類似於在 Dynamo 介面中的配置) 截然不同。
此外,在 Dynamo 中製作模型,以及將我們在背景預覽中看到的預覽連接至圖表中的資料流,這兩項功能隨時間演進將變得更直觀。
請注意由格線與彩色軸呈現的假設座標系統
選取的節點會以亮顯顏色彩現背景中的對應幾何圖形 (若該節點建立幾何圖形)
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
幾何圖形一直以來的定義是對形狀、大小、圖形相對位置以及空間性質的研究。此領域具有數千年的悠久發展歷史。隨著電腦的問世與普及,我們在定義、探索及產生幾何圖形方面擁有了功能強大的工具。現在,可以很輕鬆地計算複雜幾何互動的結果,這種狀況幾乎隨處可見。
如果您很想瞭解各種複雜幾何圖形在運用電腦的力量後可以得到的結果,請在網路上快速搜尋 Stanford Bunny,這是用於測試演算法的權威模型。
在滿是演算法、運算與複雜性的環境中瞭解幾何圖形聽起來似乎讓人膽怯,但是存在一些關鍵且相對簡單的原則,我們可以以此為基礎開始開發更進階的應用:
幾何圖形是資料 - 對電腦與 Dynamo 而言,一隻兔子和一個數字沒有太大差別。
幾何圖形依賴於抽象 - 基本上,幾何元素是由指定空間座標系統中的數字、關係與公式來描述。
幾何圖形具有階層 - 許多點共同構成線,許多線共同構成面,依此類推
幾何圖形可以同時描述部分與整體 - 曲線既是指形狀,也是指曲線上的所有點
實際上,這些原則意味著我們需要了解我們正在使用的幾何圖形 (幾何圖形的類型、幾何圖形的建立方式等),我們才能在開發更複雜的模型時流暢地建構、分解和重新建構不同的幾何圖形。
接下來花一些時間看一下幾何圖形的抽象描述與階層描述之間的關係。由於這兩個概念彼此相關,但起初並不總是很明顯,因此我們在開始開發更深入的工作流程或模型後,會很快遇到概念障礙。對於初學者,接下來將使用維度來簡單描述模型的「內容」。透過描述一個形狀所需的維數,可以了解幾何圖形所屬的階層。
點 (由座標定義) 沒有任何維度,它只是描述每個座標的數字
直線 (由兩個點定義) 現在有 一個 維度 - 我們可以沿直線向前 (正方向) 或向後 (負方向)「行走」
平面 (由兩條直線定義) 有 兩個 維度 - 現在可以向左或向右行走
方塊 (由兩個平面定義) 有 三個 維度 - 我們可以相對於上下來定義位置
開始對幾何圖形分類時,維度是便利的方式,但不一定是最佳方式。畢竟我們不能只用點、直線、平面與方塊來塑型,如果需要彎曲的東西該怎麼辦呢?此外,還有其他完全抽象的幾何圖形類型品類。它們定義性質,例如方位、體積或零件之間的關係。我們無法真正抓住一個「向量」,那要如何相對於我們在空間中看到的東西來定義它呢?幾何階層的更詳細分類應考慮到抽象類型或「協助工具」之間的差異,我們可以根據協助行為以及對描述模型元素形狀進行協助的類型來對每種抽象類型或協助工具分組。
在 Dynamo 中建立模型並不限於使用節點可以產生的項目。以下是一些關鍵的方式,您可藉此運用幾何圖形讓程序更上一層樓:
Dynamo 允許您匯入檔案 - 請嘗試對點雲使用 CSV,或使用 SAT 以引入曲面
使用 Revit 時,可以參考要在 Dynamo 中使用的 Revit 元素
Dynamo Package Manager 可對延伸的幾何圖形類型及作業提供其他功能 - 請查看 Mesh Toolkit 套件
在本節中,我們將介紹 Dynamo 資源庫中提供的基本節點,這些節點將協助您像專業人士一樣建立自己的視覺程式。
用於計算設計的幾何圖形:如何在 Dynamo 中使用幾何元素?探索從基本圖元建立簡單或複雜幾何圖形的多種方法。
建置程式的區塊:什麼是「資料」?我可以在程式中開始使用哪些基本類型?此外,進一步瞭解如何在設計工作流程中納入數學和邏輯運算。
使用清單設計:如何管理和協調資料結構?進一步瞭解「清單」的概念,並使用它來有效地管理您的設計資料。
Dynamo 中的字典:什麼是字典?瞭解如何使用字典從既有結果中尋找特定資料和值。
向量是一種大小和方向的表現法,您可以將其視為以指定速度向特定方向加速的箭頭。在 Dynamo 中,向量是模型的關鍵元件。請注意,由於向量屬於「協助工具」抽象品類,因此我們在建立向量時,不會在背景預覽中看到任何內容。
進行向量預覽時,我們可以使用直線代替向量。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
平面是一個二維表面,您可以將其視為無限延伸的平面。每個平面都有原點、X 方向、Y 方向和 Z (向上) 方向。
雖然平面是抽象的,但是具有原點位置,因此我們可以在空間中對其定位。
在 Dynamo 中,會在背景預覽中彩現平面。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
座標系統是一個決定點或其他幾何元素位置的系統。下圖說明座標系統在 Dynamo 中的外觀,以及每種顏色代表的意義。
雖然座標系統是抽象的,但是也具有原點位置,因此我們可以在空間中對其定位。
在 Dynamo 中,會在背景預覽中將座標系統彩現為一點 (原點) 與定義軸的直線 (遵循慣例,X 軸為紅色,Y 軸為綠色,Z 軸為藍色)。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
向量、平面與座標系統構成抽象幾何圖形類型的主要群組。它們能協助我們定義位置、方位以及對造型進行描述的其他幾何圖形空間環境。如果我說我在紐約城第 42 號街,位於百老匯 (座標系統),站在街面上 (平面),面向北方 (向量),這是使用了「協助工具」以定義我的位置。這同樣適用於手機殼產品或摩天大樓 - 我們需要此環境來開發模型。
向量是描述方向與大小的幾何量。向量是抽象的;亦即,它們代表數量,而非幾何元素。向量與點很容易混淆,因為兩者都由一系列值構成。但是兩者之間存在關鍵差異:點描述的是指定座標系統中的位置,而向量描述的是位置的相對差異,與「方向」相同。
若相對差異的概念讓您混淆,請將向量 AB 想像為「我站在 A 點,面向 B 點」。 從這裡 (A) 到那裏 (B) 的方向就是向量。
以下將使用上述 AB 表示法進一步詳細說明向量的各部分:
向量的起點稱為底端。
向量的終點稱為頂端或指向。
向量 AB 與向量 BA 不同,兩者指向相反方向。
如果您需要喜劇慈善相關的向量 (及其抽象定義),請觀看經典喜劇 Airplane,聽聽那句膾炙人口的幽默台詞:
Roger, Roger.What's our vector, Victor?
平面是二維抽象「協助工具」。 更具體地說,平面在概念上是「平」的,在兩個方向無限延伸。平面通常會以原點附近的小矩形呈現。
您可能會想,「等等!原點?聽上去像是座標系統...就像我在 CAD 軟體中用於塑型的工具!」
您想得對!大多數塑型軟體會利用建構平面或「水平面」來定義用於繪圖的局部二維環境。平面採用 XY、YZ、XZ 或北、東南等表述,聽上去可能更熟悉。這些都是定義無限「平」環境的平面。平面沒有深度,但它們也同樣能幫助我們描述方向。
如果我們能夠自如地使用平面,距離理解座標系統就不遠了。平面都有相同的部分,那就是座標系統 (只要是標準的「歐幾里得」或「XYZ」座標系統即可)。
但是,還有其他替代座標系統,例如圓柱座標系統或圓球座標系統。在稍後各節中我們可以看到,也可以將座標系統套用至其他幾何圖形類型,以定義該幾何圖形上的位置。
增加替代座標系統 - 圓柱座標系統,圓球座標系統
點只是利用稱為座標的一個值或多個值來定義。定義點需要的座標值數目取決於點所在的座標系統或環境。
Dynamo 中最常見的一種點存在於我們的三維世界座標系統中,有三個座標 [X,Y,Z] (Dynamo 中的 3D 點)。
Dynamo 中的 2D 點有兩個座標 [X,Y]。
曲線和曲面的參數是連續的,且會延伸到給定幾何圖形的邊緣之外。由於定義參數空間的形狀位於三維世界座標系統中,我們可以一律將參數式座標轉換為「世界」座標。例如,平面上的點 [0.2,0.5] 等同於世界座標中的點 [1.8,2.0,4.1]。
假定世界 XYZ 座標中的點
相對於給定座標系統 (圓柱) 的點
平面上 UV 座標中的點
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
如果幾何圖形是模型的語言,那麼點就是字母。點是建立所有其他幾何圖形的基礎 - 我們需要至少兩個點以建立曲線,我們需要至少三個點以使多邊形或網格面等。定義點之間位置、順序和關係 (嘗試正弦函數) 可讓我們定義高階的幾何圖形,例如圓或曲線。
使用函數
x=r*cos(t)
和y=r*sin(t)
的圓使用函數
x=(t)
和y=r*sin(t)
的正弦曲線
點也可以存在於二維座標系統中。根據我們處理的空間種類,依慣例具有不同的字母表示法,如果在平面上,我們可能會使用 [X,Y],如果在曲面上,我們會使用 [U,V]。
歐幾里得座標系統中的點:[X,Y,Z]
曲線參數座標系統中的點:[t]
曲面參數座標系統中的點:[U,V]
我們在模型中使用來表示我們在三維世界中看到的物件。雖然曲線不一定在同一個平面上 (亦即三維曲線),但它們定義的空間始終是一個維度。曲面多了一個維度,並具有一系列其他性質,可供我們用於其他塑型作業。
在 Dynamo 中匯入曲面,並演算某個參數處的曲面,以瞭解我們可以擷取哪類資訊。
Surface.PointAtParameter 會傳回給定 UV 座標處的點
Surface.NormalAtParameter 會傳回給定 UV 座標處的法線向量
Surface.GetIsoline 會傳回 U 或 V 座標處的等參數曲線 - 注意 isoDirection 輸入。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
曲面是由函數與兩個參數定義的數學造型,我們不使用曲線的 t
,而是使用 U
與 V
來描述對應的參數空間。這意味著我們使用此類型的幾何圖形時,需要提取更多的幾何資料。例如,曲線具有切線向量與法向平面 (可以沿曲線長度旋轉或扭轉),而曲面具有方位一致的法線向量與相切平面。
曲面
U 等角曲線
V 等角曲線
UV 座標
互垂平面
法線向量
曲面範圍:曲面範圍定義為對該曲面上的三維點進行演算的 (U,V) 參數的範圍。每個維度 (U 或 V) 的範圍通常描述為兩個數字,即 U 最小值到 U 最大值與 V 最小值到 V 最大值。
雖然曲面的造型看上去可能不是「矩形」,而且局部可能存在更緊密或更鬆散的一組等角曲線,但曲面範圍所定義的「空間」始終是二維空間。在 Dynamo 中,我們都知道曲面範圍定義為在 U 與 V 兩個方向上從最小值 0.0 到最大值 1.0。平面曲面或修剪過的曲面可能有不同的範圍。
等角曲線 (即等參數曲線):由曲面上固定的 U 或 V 值以及所對應其他 U 或 V 方向的值範圍所定義的曲線。
UV 座標:UV 參數空間中由 U、V (有時還有 W) 定義的點。
互垂平面:在給定 UV 座標處與 U 及 V 等角曲線互垂的平面。
法線向量:相對於互垂平面定義「向上」方向的向量。
NURBS 曲面非常類似於 NURBS 曲線。您可以將 NURBS 曲面視為 NURBS 曲線在兩個方向構成的網格。NURBS 曲面的造型由許多控制點以及該曲面在 U 與 V 方向的度來定義。根據控制點、權重與次數來計算造型、法線、切線、曲率及其他性質採用的演算法相同。
對於 NURBS 曲面,幾何圖形會指示兩個方向,因為 NURBS 曲面不論造型為何,都是控制點的矩形網格。即使這些方向相對於世界座標系統而言通常是任意方向,但我們可以頻繁使用這些方向來分析模型,或根據曲面產生其他幾何圖形。
次數 (U,V) = (3,3)
階數 (U,V) = (3,1)
階數 (U,V) = (1,2)
階數 (U,V) = (1,1)
Polysurfaces 由跨邊接合的曲面構成。PolySurface 提供超過二維的 UV 定義,現在我們可以由此透過拓樸在連接的造型中移動。
雖然「拓樸」通常描述有關部分如何連接及/或相關的概念,但 Dynamo 中的拓樸也是幾何圖形的類型。確切地說,它是曲面、Polysurface 及實體的父系品類。
以有時稱為「修補」的方式接合曲面,我們可以製作更複雜的造型,並定義跨接縫的詳細資料。我們可以便利地將圓角或倒角作業套用至 PolySurface 的邊。
曲線是我們討論的第一種幾何資料類型,具有我們更熟悉的一組形狀描述性質 - 多彎或多直?多長或多短?請記住,點仍然是我們的基礎材料,用於定義從直線到雲形線的所有項目,以及所有曲線類型。
直線
聚合線
弧
圓
橢圓
NURBS 曲線
Polycurve
NURBS 是一個用於精確表示曲線和曲面的模型。Dynamo 中的正弦曲線使用兩種不同方法建立 NURBS 曲線以比較結果。
NurbsCurve.ByControlPoints 使用點清單做為控制點
NurbsCurve.ByPoints 繪製一條通過點清單的曲線
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
曲線一詞通常是所有不同彎曲 (甚至筆直) 造型的統稱。曲線是所有這些造型類型 (直線、圓、雲形線等) 的父系分類。若以更具技術性的語言來表述,一條曲線描述在一系列函數 (這些函數包含從諸如 x = -1.26*t, y = t
的簡單函數到涉及微積分的複雜函數) 中輸入「t」即可找到的每個可能點。不論使用何種類型的曲線,這個稱為「t」的參數是我們可以演算的性質。此外,不論造型外觀為何,所有曲線都有起點與終點,兩者分別對應於建立曲線所使用的最小 t 值與最大 t 值。這也有助於我們瞭解其方向性。
請務必注意,Dynamo 假設曲線「t」值的範圍是 0.0 到 1.0。
所有曲線還具有許多性質或特性,可用於對其進行描述或分析。若起點與終點之間的距離是零,則曲線是「封閉」曲線。 此外,每條曲線都有許多控制點,若所有這些點都位於同一平面上,則該曲線是「平面」曲線。 有些性質會套用至曲線的整體,而其他性質只會套用至曲線上的特定點。例如,平面性是曲線的整體性質,而指定 t 值處的切線向量是局部性質。
直線是形式最簡單的曲線。直線看上去可能並不彎曲,但實際上屬於曲線,只是沒有曲率而已。有幾種不同方式可以建立直線,最直觀的方式是從點 A 到點 B 畫線。直線 AB 的造型包含兩點之間的點,但在數學上,該直線在兩個方向無限延伸。
將兩條直線連接在一起,就產生聚合線。我們有一個簡單的方法可以表示什麼是控制點。編輯其中任何點的位置都將變更聚合線的造型。若聚合線是封閉的,則會產生多邊形。若多邊形所有邊長都相等,稱為正多邊形。
正如我們對定義造型的參數式函數提高複雜度一樣,我們可以在直線的基礎上更進一步,透過描述一或兩個半徑來建立弧、圓、橢圓弧或橢圓。弧與對應的圓或橢圓之間的差異只在於造型是否封閉。
NURBS (非均勻有理 B 雲形線) 是數學表述,可以對從簡單的二維直線、圓、弧或矩形到最複雜的三維自由形式基本曲線的任何造型進行準確塑型。由於具備靈活性 (控制點相對較少,但根據次數設定可以平滑內插) 與精確度 (受強大數學功能約束),因此 NURBS 模型可用於從插圖與動畫到製造的任何程序。
次數:曲線的次數決定控制點對曲線的影響範圍,次數越高,範圍越大。次數是正整數。該數通常是 1、2、3 或 5,但可以是任意正整數。NURBS 直線與聚合線通常是 1 次,而多數自由曲線是 3 或 5 次。
控制點:控制點是至少包含 (次數+1) 個點的清單變更 NURBS 曲線造型最簡單的方式之一,是移動控制點。
權重:控制點有一個稱為「權重」的關聯數字。權重通常是正數。若曲線控制點具有相同的權值 (通常為 1),則曲線稱為不合理曲線,否則稱為合理曲線。多數 NURBS 曲線都是非有理曲線。
節點:節點是 (次數+N-1) 個數字的清單,其中 N 是控制點的數量。節點與權重搭配使用,可控制控制點對結果曲線的影響。節點的一項用途是在曲線的特定點處建立扭折。
次數 = 1
次數 = 2
次數 = 3
請注意,次數值越高,內插產生的曲線所用的控制點就越多。
在我們已準備好要更深入瞭解如何開發視覺程式時,我們將需要更深入理解將使用的建置區塊。本章提供有關資料的基礎概念 - 透過 Dynamo 程式線路傳遞的物件。
在運算塑型領域,是 3D 幾何圖形最普遍的表現形式之一。網格幾何圖形通常由一系列四邊形或三角形組成,可以做為使用 NURBS 輕量靈活的替代方案,從彩現和視覺化到數位製造和 3D 列印的所有領域,都會使用網格。
Dynamo 使用面-頂點資料結構定義網格。在最基本的層級,此結構只是歸入多邊形的點集合。網格的點稱為頂點,而類似於曲面的多邊形稱為面。
若要建立網格,我們需要頂點清單,以及將這些頂點歸入面的系統 (稱為索引群組)。
頂點清單
將定義面的索引群組清單
該資源庫還提供工具來修改網格、修復網格,或萃取水平切片,以用於加工。
網格是表示曲面或實體幾何圖形的一系列四邊形與三角形。與實體相似,網格物件的結構包括頂點、邊與面。另外也有讓網格獨一無二的其他性質,例如法線。
網格頂點
網面邊 *只有一個相鄰面的邊稱為「裸露邊」。 所有其他邊稱為「覆蓋邊」
網格面
網格的頂點只是一系列點。在建構網格或取得網格結構的相關資訊時,頂點的索引非常重要。對於每個頂點,還有對應的頂點法線 (向量),可描述所貼附面的平均方向,並有助於我們瞭解網格的「向內」與「向外」方位。
頂點
頂點法線
面是按順序排列的三或四個頂點。因此,會根據編製索引的頂點位置指示網格面的「曲面」表現法。我們已擁有構成網格的頂點清單,因此不提供個別點以定義面,只需使用頂點索引即可。我們藉此也可以對多個面使用相同的頂點。
由索引 0、1、2、3 構成的四邊形面
由索引 1、4、2 構成的三角形面 注意可以轉換索引群組的順序 - 只要序列的順序採用逆時鐘方式,就會正確定義面
網格幾何圖形與 NURBS 幾何圖形有什麼不同?您什麼時候需要擇其一而使用?
在上一章,我們看到 NURBS 曲面由兩個方向的一系列 NURBS 曲線定義。這些方向標示為 U
與 V
,可藉此根據二維曲面範圍對 NURBS 曲面執行參數化。在電腦中,曲線本身儲存為方程式,藉此可採用任意小的精確度計算產生的曲面。但是,合併多個 NURBS 曲面會很困難。接合兩個 NURBS 曲面將產生 Polysurface,該幾何圖形的不同部分會有不同的 UV 參數與曲線定義。
曲面
等參數 (結構線) 曲線
曲面控制點
曲面控制多邊形
等參數點
曲面框
網格
裸露邊
網格網路
網格邊
頂點法線
網格面/網格面法線
另一方面,網格由離散數量的精確定義頂點及面構成。頂點的網路一般無法由簡單的 UV
座標定義,由於面是離散的,因此精確度內建於網格中,只能透過細化網格及加入更多面來變更。由於缺少數學描述,因此網格可以更靈活地處理單一網格中的複雜幾何圖形。
另一項重要差異在於網格或 NURBS 幾何圖形的局部變更對整體形狀的影響程度。移動網格的一個頂點只會影響該頂點相鄰的面。在 NURBS 曲面中,影響程度較複雜,取決於曲面的度以及控制點的權值與節點。但是,一般而言,在 NURBS 曲面中移動單一控制點會提高幾何圖形的平滑度,並對幾何圖形產生更廣泛的變化。
NURBS 曲面 - 移動控制點會對整個造型範圍產生影響
網格幾何圖形 - 移動頂點只對相鄰元素產生影響
向量影像 (由直線與曲線構成) 與點陣式影像 (由個別像素構成) 的對比有助於您理解這一點。若拉近向量影像,曲線仍清晰鮮明,而拉近點陣式影像時,會看到個別像素變得更大。在此類比中,NURBS 曲面相當於向量影像,因為存在平滑的數學關係,而網格的行為方式類似於具有固定解析度的點陣式影像。
如果我們要建構無法從單個平面建立的更複雜模型,或如果我們要定義明確的體積,我們現在必須瞭解 (和 Polysurface) 領域。即使一個簡單的立方塊就夠複雜了,需要六個平面,每一面一個平面。實體提供了兩個平面不提供的關鍵概念 - 更細化的拓樸說明 (面、邊、頂點) 和布林作業。
您可以使用來修改實體。讓我們使用幾個布林運算建立一個尖刺球。
Sphere.ByCenterPointRadius:建立基礎實體。
Topology.Faces、Face.SurfaceGeometry:查詢實體的面並將其轉換為曲面幾何圖形 - 在此情況下,圓球只有一個面。
Cone.ByPointsRadii:使用曲面上的點建構圓錐。
Solid.UnionAll:將「圓錐」和「球」做聯集。
Topology.Edges:查詢新實體的邊
Solid.Fillet:對尖刺球的邊執行「圓角」作業
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
布林作業很複雜且可降低計算速度。您可以使用「凍結」功能暫停執行選取的節點和受影響的下游節點。
1. 使用右鍵關聯式功能表來凍結「實體聯集」作業
2.選取的節點和所有下游節點將以淺灰色重影模式預覽,受影響的線路將以虛線顯示。受影響的幾何圖像預覽也將被重像。現在,您可以變更上游值,而不計算布林聯集。
3.若要解凍節點,請按一下右鍵,然後取消勾選「凍結」。
4.所有受影響的節點和關聯的幾何圖像預覽將更新並回復至標準預覽模式。
實體由一個或多個曲面組成,以定義「內」或「外」的封閉邊界表示其體積。 無論有多少平面,它們必須形成一個「無縫」體積才會被視為實體。可透過連結平面或多面體來建立實體圖像,或透過使用作業 (例如,斷面混成、掃掠和迴轉) 來建立。圓球、立方體、圓錐與圓柱基本型也是實體。將立方塊至少一個面移除所得的圖像為 Polysurface,它有實體的某些相似性質,但不是實體。
平面是由單一曲面組成,不是實體。
圓球是由一個曲面組成,但 是 實體。
圓錐是由兩個曲面接合在一起而建立的實體。
圓柱是由三個表面接合在一起而建立的實體。
立方塊是由六個平面接合在一起而建立的實體。
實體由三種類型的元素組成:頂點、邊和面。面是構成實體的平面。邊是定義相鄰面之間連結的曲線,頂點是這些曲線的起點和終點。這些元素可以使用拓樸節點進行查詢。
面
邊
頂點
可透過對邊執行圓角或倒角作業來消除急轉角和角,從而對實體進行修改。「倒角」作業會在兩個面之間建立符合規則的曲面,而「圓角」作業會混合兩個面使其保持相切。
實體立方塊
倒角的立方塊
圓角的立方塊
實體布林作業是結合兩個或多個實體的方式。單一布林作業實際意味著執行四個作業:
讓兩個或多個物件交集。
讓它們在交集處分離。
刪除不需要的幾何圖形部分。
將所有物件重新接合在一起。
聯集: 移除實體的重疊部分並將它們接合為單一實體。
差集: 從一個實體減去另一個。要被減去的實體稱為工具。請注意,您可以切換作為工具的實體,以保留相反的部分。
交集: 僅保留兩個實體的交集部分。
UnionAll: 對球和向外圓錐進行「聯集」作業
DifferenceAll: 對球和向內圓錐進行「差集」作業
資料是程式的內容。它會通過線路向節點提供輸入,並在節點中經過處理變為新形式的輸出資料。接下來我們將檢閱資料的定義、構建方式,並開始在 Dynamo 中使用資料。
資料是一組定性或定量變數的值。資料最簡單的形式是數字,例如 0
、3.14
或 17
。但是資料也有許多不同類型:表示變動數字的變數 (height
)、字元 (myName
)、幾何圖形 (Circle
),或資料項目的清單 (1,2,3,5,8,13,...
)。
在 Dynamo 中,我們將資料加入/饋入節點的輸入埠 - 我們可以有資料而不採取動作,但必須有資料才能處理節點所代表的動作。將節點加入工作區後,如果未提供任何輸入,則結果將是函數,而不是動作本身的結果。
簡單資料
資料與動作 (節點) 已成功執行
無資料輸入的動作 (節點) 將傳回一般函數
注意空值 'null'
類型表示沒有資料。雖然這是抽象概念,但是您在使用視覺程式設計時可能已瞭解這一點。若某動作無法建立有效的結果,該節點會傳回空值。
測試空值及移除資料結構中的空值是建立功能強大的程式至關重要的構成部分。
執行視覺程式設計時,會很快產生大量資料,需要對其階層採用某種管理方式。承擔此角色的是資料結構,即我們儲存資料所採用的組織配置。資料結構的詳細資料及使用方法視程式設計語言而不同。
在 Dynamo 中,我們透過清單將階層加入至資料。我們將在後續章節中深入探索這一功能,不過接下來先從簡單的內容開始:
清單代表一種資料結構中放置的一系列項目:
我的手 (清單) 有五根手指 (項目)。
我所在的街道 (清單) 有十棟房子 (項目)。
Number Sequence 節點使用 start、amount 及 step 輸入來定義數字清單。使用這些節點,我們已建立兩個包含十個數字的獨立清單,其中一個清單的範圍是 100-109,另一個的範圍是 0-9。
List.GetItemAtIndex 節點會以特定的索引選取清單中的項目。若選擇 0,即可取得清單中的第一個項目 (在此案例中是 100)。
對第二個清單套用相同的程序,取得值 0,即清單中的第一個項目。
現在,我們使用 List.Create 節點將兩個清單合二為一。請注意,節點會建立 清單的清單。這會變更資料結構。
再次使用 List.GetItemAtIndex 時,將索引設定為 0,即可取得清單之清單中的第一個清單。這意味著將清單視為項目,這與其他指令碼撰寫語言略有不同。在稍後的章節中,我們將透過清單操控與資料結構取得更進階的結果。
理解 Dynamo 中資料階層的關鍵概念:對資料結構而言,會將清單視為項目。換言之,Dynamo 採用由上而下的程序瞭解資料結構。這意味著什麼?接下來我們舉例說明。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
在這第一個範例中,我們將組裝薄殼圓柱,這將使用我們在本節中討論的幾何圖形階層。
1. 加入 Point.ByCoordinates - 在圖元區加入節點後,我們會在 Dynamo 預覽格線的原點看到某個點。x、y 與 z 輸入的預設值是 0.0,給我們此位置的點。
2.Plane.ByOriginNormal - 幾何圖形階層的下一步是平面。有數種方式可以建構平面,我們將使用原點與法線作為輸入。原點是上一步驟中建立的點節點。
Vector.ZAxis - 這是 z 方向的單位化向量。請注意,沒有輸入,只有值為 [0,0,1] 的向量。我們將此用作 Plane.ByOriginNormal 節點的 normal 輸入。這會在 Dynamo 預覽中產生矩形平面。
3.Circle.ByPlaneRadius - 接下來是階層,現在我們使用上一步驟中建立的平面來建立曲線。插入節點後,我們得到一個位於原點的圓。節點的預設半徑值為 1。
4.Curve.Extrude - 現在我們指定深度與第三個延伸方向,讓其成為比較常見的形狀。此節點將以擠出方式根據曲線建立曲面。節點上的預設距離為 1,我們應該會在視埠中看到圓柱。
5.Surface.Thicken - 此節點會將曲面偏移指定的距離並封閉外形,以產生封閉實體。預設厚度值為 1,我們應該會在視埠中看到符合這些值的薄殼圓柱。
6.Number Slider - 我們接下來不使用所有這些輸入的預設值,而是對模型加入一些參數式控制。
Domain Edit - 在圖元區加入數字滑棒後,按一下左上方的脫字字元以顯示範圍選項。
Min/Max/Step - 分別將 min、max 與 step 值變更為 0、2 與 0.01。我們這樣做是為了控制整體幾何圖形的大小。
7.Number Sliders - 在所有的預設輸入中,我們多次複製並貼上此數字滑棒 (選取滑棒,按一下 Ctrl+C,然後按一下 Ctrl+V),直到具有預設值的所有輸入都改用滑棒為止。某些滑棒值必須大於零,以便讓定義生效 (例如:若要增厚曲面,需要有擠出深度)。
8.現在我們已使用這些滑棒建立參數式薄殼圓柱。嘗試調整其中某些參數,即可在 Dynamo 視埠中看到幾何圖形的動態更新。
Number Sliders - 在此基礎上更進一步,我們在圖元區上加入了許多滑棒,並需要清理剛剛建立的工具介面。在滑棒上按一下右鍵,選取「更名...」,然後變更每個滑棒的名稱以適當描述其參數 (厚度、半徑、高度等等)。
9.現在,我們已建立良好的增厚圓柱。這目前只是一個物件,接下來我們瞭解如何建立保持動態連結的一系列圓柱。為了實現這一點,我們將建立圓柱清單,而不是使用單一項目。
加 (+) - 我們的目標是在已建立的圓柱旁,加入一列圓柱。若要在與目前圓柱相鄰的位置加入一個圓柱,需要考慮圓柱的半徑以及薄殼的厚度。我們將滑棒的兩個值相加,即可得到此數值。
10.此步驟較複雜,接下來我們慢慢完成:最終目標是建立數字清單,這些數字會定義圓柱列中每個圓柱的位置。
a.乘 - 首先,我們要將上一步驟中的值乘以 2。上一步驟中的值表示半徑,我們要將圓柱移動完整直徑的距離。
b.Number Sequence - 我們使用此節點建立一系列數字。乘 節點的第一個輸入是上一步驟中的 step 值。可以使用 Number 節點將 start 值設定為 0.0。
c.Integer Slider - 對於 amount 值,我們連接整數滑棒。這會定義所建立圓柱的數量。
d.輸出 - 此清單會顯示每個圓柱在陣列中的移動距離,並由原始滑棒進行參數式驅動。
11.此步驟足夠簡單 - 將上一步驟中定義的序列插入原始 Point.ByCoordinates 的 x 輸入。這將取代我們可以刪除的 pointX 滑棒。現在,我們將在視埠中看到一系列圓柱 (請確保整數滑棒大於 0)。
12.圓柱鏈仍動態連結至所有滑棒。調整每個滑棒可以查看定義更新!
如果資料最簡單的形式是數字,則關聯這些數字最簡單的方式就是透過數學運算。從諸如除號等簡單運算子到三角函數,再到更複雜的公式,數學是開始探索數字關係與樣式的良好方式。
運算子是一組元件 (加、減、乘、除等),使用代數函數與兩個數字輸入值,產生一個輸出值。在「運算子」>「動作」下可以找到這些運算子。
圖示 | 名稱 (語法) | 輸入 | 輸出 |
---|
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
透過公式結合運算子和變數,以構成更複雜的關係。使用滑棒建立可透過輸入參數控制的公式。
1. 建立表示參數式方程式中「t」的數字序列,因此,我們希望使用大到足以定義螺旋線的清單。
Number Sequence: 根據以下三項輸入定義數字序列:start、amount 與 step。
2.上述步驟已建立用於定義參數範圍的數字清單。接下來,建立表示黃金螺旋線方程式的節點群組。
定義黃金螺旋線的方程式如下:
以下影像以視覺程式設計形式表示黃金螺旋線。逐步檢查節點群組時,請盡可能注意視覺程式與書寫方程式之間的對應。
a.Number Slider:在圖元區加入兩個數字滑棒。這些滑棒代表參數式方程式中的 a 與 b 變數。這些表示彈性的常數,或表示我們可以針對所需結果進行調整的參數。
b.相乘 (*):相乘節點由星號表示。我們會重複使用此符號連接相乘的變數
c.Math.RadiansToDegrees:「t」值需要轉換為度,才能在三角函數中演算。請記住,Dynamo 預設使用度來運算這些函數。
d.Math.Pow:以「t」與數字「e」表示的函數,此函數會建立 Fibonacci 序列。
e.Math.Cos 與 Math.Sin:這兩個三角函數將分別區分每個參數式點的 X 座標與 Y 座標。
f.Watch:現在可以看到輸出是兩個清單,分別是產生螺旋線所用點的 x 與 y 座標。
Point.ByCoordinates: 將上方的相乘節點連接到「x」輸入,將下方的節點連接到「y」輸入。我們現在可以在螢幕上看到點的參數式螺旋線。
Polycurve.ByPoints: 將上一步的 Point.ByCoordinates 連接到 points。我們可以保留 connectLastToFirst 無輸入,因為不打算繪製封閉曲線。這會建立一條穿過上一步定義的每個點的螺旋線。
我們現在完成了 Fibonacci 螺旋線!接下來進一步將此分為兩個單獨的練習,我們分別稱之為鸚鵡螺與向日葵。這些是自然系統的抽象名稱,但可以充分呈現 Fibonacci 螺旋線的兩種不同應用。
Circle.ByCenterPointRadius: 我們在此處將使用圓節點,採用與上一步相同的輸入。半徑的預設值為 1.0,所以我們可以立即看到輸出的圓。它會立即清晰展示點如何進一步偏離原點。
Number Sequence: 這是「t」的原始陣列。將此序列插入 Circle.ByCenterPointRadius 的半徑值後,圓心仍會離原點越來越遠,但半徑會增加,因而產生很酷的 Fibonacci 圓形。
如果您使用 3D 製作會更酷!
一開始,我們先執行上一個練習中的相同步驟:使用 Point.ByCoordinates 節點建立點的螺旋線陣列。
![](../images/5-3/2/math-part IV-01.jpg)
接下來,依照這些小步驟,以各種旋轉產生一系列螺旋線。
a.Geometry.Rotate: 有幾個 Geometry.Rotate 選項,請確保選擇以 geometry、basePlane 和 degrees 為輸入的節點。將 Point.ByCoordinates 連接至 geometry 輸入。在此節點上按一下右鍵,並確保將交織設定為「笛卡兒積」
b.Plane.XY: 連接至 basePlane 輸入。我們將繞原點旋轉,此原點的位置與螺旋線的基準位置相同。
c.Number Range: 對於角度輸入,我們希望建立多個旋轉。使用 Number Range 元件可以快速達成。將其連接至 degrees 輸入。
d.Number: 為了定義數字範圍,在圖元區以垂直順序加入三個數字節點。從上到下分別指定值為 0.0、360.0 與 120.0。這些值將驅動螺旋線旋轉。請注意將三個數字節點連接至 Number Range 節點後的輸出結果。
輸出開始形成一個漩渦。接下來調整某些 Number Range 參數,並查看結果的變化。
將 Number Range 節點的步長大小從 120.0 變更為 36.0。請注意,這會建立更多旋轉,因此會產生更密的格線。
將 Number Range 節點的步長大小從 36.0 變更為 3.6。現在,這會產生密度大得多的格線,螺旋線的方向性變得不清楚。各位,我們產生了一朵向日葵。
直線由一組點組成,每條直線至少有 2 個點。在 Dynamo 中建立直線最常使用的其中一個方法是使用 Line.ByStartPointEndPoint
。
透過安裝 ,可以延伸 Dynamo 的網格功能。Dynamo Mesh Toolkit 可提供工具,以匯入外部檔案格式的網格、根據 Dynamo 幾何圖形物件建立網格,並根據網格的頂點與索引手動建置網格。
請造訪 ,取得使用此套件的範例。
您可以在一節閱讀有關凍結節點的更多資訊。
這樣可使實體布林運算成為功能強大且節省時間的流程。有三種實體布林運算,可區分要保留幾何圖形的哪些部分。
除了這三個作業,Dynamo 有 Solid.DifferenceAll 和 Solid.UnionAll 節點用於對多個實體執行「差集」和「聯集」作業。
圖示 | 名稱/語法 | 輸入 | 輸出 |
---|
現在,上一步的眾多節點都沒問題,但工作量很大。若要建立更有效率的工作流程,請參閱 將 Dynamo 表示式的字串定義為一個節點。在接下來的一系列步驟中,我們將瞭解使用參數式方程式來繪製 Fibonacci 螺旋線。
現在我們已經建立圓形的鸚鵡螺殼,接下來使用參數式格線。我們將對 Fibonacci 螺旋線使用基本旋轉,以建立 Fibonacci 格線,並在對結果進行塑型。
建立 |
Color.ByARGB 依 Alpha、紅色、綠色與藍色等組成來建構顏色。 |
Color Range 從開始顏色與結束顏色之間的顏色漸層取得顏色。 |
動作 |
Color.Brightness 取得此顏色的亮度值。 |
Color.Components 依照以下順序列示顏色組成:Alpha、紅色、綠色、藍色。 |
Color.Saturation 取得此顏色的飽和度值 |
Color.Hue 取得此顏色的色相值。 |
查詢 |
Color.Alpha 找出顏色的 Alpha 組成 (0 到 255)。 |
Color.Blue 找出顏色的藍色組成 (0 到 255)。 |
Color.Green 找出顏色的綠色組成 (0 到 255)。 |
Color.Red 找出顏色的紅色組成 (0 到 255)。 |
建立 |
GeometryColor.ByGeometryColor 使用顏色顯示幾何圖形。 |
動作 |
View.Watch 視覺化節點的輸出。 |
View.Watch 3D 展示幾何圖形的動態預覽。 |
動作 |
Boolean 在 true 與 false 之間進行選取。 |
Code Block 允許直接編寫 DesignScript 程式碼。 |
Directory Path 可讓您選取系統上的目錄,以取得其路徑 |
File Path 可讓您選取系統中的檔案,以取得其檔名 |
Integer Slider 產生整數值的滑棒。 |
編號 建立數字。 |
Number Slider 產生數值的滑棒。 |
String 建立字串。 |
Object.IsNull 判定給定物件是否為空值。 |
建立 |
List.Create 從給定的輸入製作新清單。 |
List.Combine 將結合器套用至兩個序列中的每個元素 |
Number Range 建立指定範圍內的一系列數字 |
Number Sequence 建立一系列數字。 |
動作 |
List.Chop 將一個清單細分為一組清單 (其中每個清單包含指定數量的項目)。 |
List.Count 傳回給定清單中儲存的項目數目。 |
List.Flatten 依特定數量展開清單的巢狀清單。 |
List.FilterByBoolMask 查看個別布林清單中的對應索引來篩選順序。 |
List.GetItemAtIndex 取得給定清單中位於指定索引處的項目。 |
List.Map 將函數套用至清單的所有元素,從結果產生新清單 |
List.Reverse 建立新的清單,其中包含給定清單的項目,但以逆向順序排列 |
List.ReplaceItemAtIndex 取代給定清單中位於指定索引處的項目。 |
List.ShiftIndices 將清單中的索引向右移動給定數量 |
List.TakeEveryNthItem 在給定的偏移之後,擷取給定清單中索引是給定值倍數的項目。 |
List.Transpose 在清單的清單中交換列與欄。如果某些列短於其他列,會在結果陣列中插入空值作為預留位置,以便其永遠為矩形 |
動作 |
If 條件陳述式。檢查測試輸入的布林值。如果測試輸入為 true,結果會輸出真實的輸入,否則結果會輸出虛假的輸入。 |
動作 |
Math.Cos 計算角度的餘弦值。 |
Math.DegreesToRadians 將以度表示的角度轉換為以弳度表示的角度。 |
Math.Pow 計算數值的指定次方。 |
Math.RadiansToDegrees 將以弳度表示的角度轉換為以度表示的角度。 |
Math.RemapRange 調整數字清單的範圍,同時保留分配比率。 |
Math.Sin 計算角度的正弦值。 |
Formula 運算數學公式。使用 NCalc 進行運算。請參閱http://ncalc.codeplex.com |
Map 將值對映到輸入範圍 |
動作 |
String.Concat 將多個字串連接成單一字串。 |
String.Contains 判定給定的字串是否包含給定的子字串。 |
String.Join 將多個字串連接成單一字串,同時在接合的每個字串之間插入給定的分隔符號。 |
String.Split 將單一字串分割為字串清單,分割位置由給定的分隔符號字串決定。 |
String.ToNumber 將字串轉換為整數或倍精數。 |
建立 |
Circle.ByCenterPointRadius 使用輸入中心點和世界 XY 平面中的半徑,並以世界 Z 為法線,來建立一個圓。 |
Circle.ByPlaneRadius 在輸入平面建立一個中心點在輸入平面原點 (根)、具有給定半徑的圓。 |
建立 |
CoordinateSystem.ByOrigin 建立一個原點在輸入點、X 與 Y 軸分別設定為 WCS X 軸與 Y 軸的座標系統 |
CoordinateSystem.ByCyclindricalCoordinates 以相對於指定座標系統的指定圓柱座標參數,建立一個座標系統 |
建立 |
Cuboid.ByLengths 建立一個中心點在 WCS 原點,且具有長度、寬度、高度的立方體。 |
Cuboid.ByLengths (origin) 建立一個中心點在輸入點,具有指定寬度、長度及高度的立方體。 |
Cuboid.ByLengths (coordinateSystem) 建立一個中心點在 WCS 原點,且具有長度、寬度、高度的立方體。 |
Cuboid.ByCorners 建立一個從低點跨距到高點的立方體。 |
Cuboid.Length 傳回立方體的輸入尺寸,而不是實際世界的空間尺寸。 |
Cuboid.Width 傳回立方體的輸入尺寸,而不是實際世界的空間尺寸。 |
Cuboid.Height 傳回立方體的輸入尺寸,而不是實際世界的空間尺寸。 |
BoundingBox.ToCuboid 取得邊界框做為實體立方體 |
動作 |
Curve.Extrude (distance) 在法線向量的方向擠出曲線。 |
Curve.PointAtParameter 取得曲線上位於 StartParameter() 與 EndParameter() 之間指定參數處的點。 |
動作 |
Geometry.DistanceTo 取得此幾何圖形與另一個幾何圖形的距離。 |
Geometry.Explode 將複合元素或非單獨元素分開為組成部分 |
Geometry.ImportFromSAT 匯入的幾何圖形的清單 |
Geometry.Rotate (basePlane) 繞平面原點及法線將物件旋轉指定度數。 |
Geometry.Translate 將任何幾何圖形類型在給定方向平移給定距離。 |
建立 |
Line.ByBestFitThroughPoints 建立一條與點的散射圖最近似的線。 |
Line.ByStartPointDirectionLength 建立一條從某點開始,沿向量方向延伸指定長度的直線。 |
Line.ByStartPointEndPoint 在兩個輸入點之間建立一條直線。 |
Line.ByTangency 建立一條在輸入曲線的參數點位置與輸入曲線相切的線。 |
查詢 |
Line.Direction 曲線的方向。 |
建立 |
NurbsCurve.ByControlPoints 使用明確控制點建立 BSplineCurve。 |
NurbsCurve.ByPoints 透過在點之間進行內插來建立 BSplineCurve |
建立 |
NurbsSurface.ByControlPoints 使用明確控制點建立一個具有指定 U 與 V 次數的 NurbsSurface。 |
NurbsSurface.ByPoints 建立一個具有指定內插點及 U 與 V 次數的 NurbsSurface。產生的曲面將通過所有點。 |
建立 |
Plane.ByOriginNormal 建立一個中心點在根點,具有輸入法線向量的平面。 |
Plane.XY 在世界 XY 建立一個平面 |
建立 |
Point.ByCartesianCoordinates 在有 3 個直角座標的給定座標系統中產生一點 |
Point.ByCoordinates (2d) 在 XY 平面中給定 2 個直角座標產生一點。Z 分量是 0。 |
Point.ByCoordinates (3d) 給定 3 個直角座標產生一點。 |
Point.Origin 取得原點 (0,0,0) |
動作 |
Point.Add 對點加入向量。與 Translate (Vector) 相同。 |
查詢 |
Point.X 取得點的 X 分量 |
Point.Y 取得點的 Y 分量 |
Point.Z 取得點的 Z 分量 |
建立 |
Polycurve.ByPoints 根據連接點的一系列線建立 PolyCurve。若要取得封閉的曲線,最後一個點應該與起點位於相同的位置。 |
建立 |
Rectangle.ByWidthLength (Plane) 建立一個中心點在輸入平面根,具有輸入寬度 (平面 X 軸長度) 與長度 (平面 Y 軸長度) 的矩形。 |
建立 |
Sphere.ByCenterPointRadius 建立一個中心點在輸入點,具有給定半徑的實體圓球。 |
建立 |
Surface.ByLoft 透過在輸入斷面曲線之間進行斷面混成來建立曲面 |
Surface.ByPatch 透過填滿輸入曲線所定義之封閉邊界的內部來建立曲面。 |
動作 |
Surface.Offset 沿曲面法線方向,將曲面偏移指定的距離 |
Surface.PointAtParameter 傳回指定的 U 與 V 參數處的點。 |
Surface.Thicken 將曲面增厚為實體,沿曲面法線的方向朝曲面兩側擠出。 |
建立 |
UV.ByCoordinates 從兩個倍精數建立 UV。 |
建立 |
Vector.ByCoordinates 由 3 個歐幾里得座標形成一個向量 |
Vector.XAxis 取得標準 X 軸向量 (1,0,0) |
Vector.YAxis 取得標準 Y 軸向量 (0,1,0) |
Vector.ZAxis 取得標準 Z 軸向量 (0,0,1) |
動作 |
Vector.Normalized 取得向量的正規化版本 |
建立 |
CoordinateSystem.ByOrigin 建立一個原點在輸入點、X 與 Y 軸分別設定為 WCS X 軸與 Y 軸的座標系統 |
CoordinateSystem.ByCyclindricalCoordinates 以相對於指定座標系統的指定圓柱座標參數,建立一個座標系統 |
+ 加 |
- 減 |
* 乘 |
/ 除 |
% 模除會計算第一個輸入除以第二個輸入後的餘數 |
< 小於 |
> 大於 |
== 相等性會測試兩個值是否相等。 |
Object.IsNull | obj | 布林 |
加 (+) | var[]...[]、var[]...[] | var[]...[] |
減 (-) | var[]...[]、var[]...[] | var[]...[] |
乘 (*) | var[]...[]、var[]...[] | var[]...[] |
除 (/) | var[]...[]、var[]...[] | var[]...[] |
清單是我們組織資料的方式。在您電腦的作業系統上,您具有檔案和資料夾。在 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 值定義,因此產生一列垂直線。
正式的說法是,字串是字元的序列,表示文字常數或某些類型的變數。非正式的說法是,字串是文字式的程式設計行話。我們曾使用數字 (整數與小數) 來驅動參數,現在使用文字也可以做到這一點。
字串可以用於多種應用,包括定義自訂參數、註解文件集,以及剖析文字式資料集。字串節點位於 Core > Input 。
以上範例節點是字串。數字可以表示為字串、字母或文字陣列。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
透過查詢字串,您可以快速剖析大量資料。我們將討論一些基本作業,這些作業可以加快工作流程,有助於提高軟體互通性。
以下影像將考慮來自外部工作表的資料字串。該字串表示 XY 平面內某矩形的頂點。接下來在小練習中詳細瞭解某些字串分割作業:
「;」分隔符號分隔矩形的每個頂點。這會建立清單,每個頂點有 3 個項目。
透過按一下節點中部的「+」,可以建立新分隔符號。
在圖元區加入「,」字串,並插入新的分隔符號輸入。
現在結果將產生含十個項目的清單。節點會先根據 separator0 進行分割,然後根據 separator1 進行分割。
雖然以上項目清單可能看起來像數字,但是在 Dynamo 中,仍將其視為單獨的字串。若要建立點,需要將其資料類型從字串轉換為數字。我們使用 String.ToNumber 節點來達成
本節點非常簡單。將 String.Split 的結果插入輸入。輸出看上去似乎相同,但現在資料類型是 number 而不是 string。
透過其他某些基本作業,我們現在已根據原始字串輸入,在原點繪製了三角形。
由於字串是一般文字物件,因此可以適用於多種應用。接下來我們看一下在 Dynamo 的 Core > String 中的一些主要動作:
這種方法可以按順序合併兩個字串。它會提取清單中的每個文字字串,然後建立一個合併後的字串。
以下表示連接三個字串:
按一下節點中心的「+/-」按鈕,可以加上或減去連接的字串。
輸出是一個連接後的字串,其中包括空格與標點。
接合方法非常類似於連接,只是會加入標點。
如果您曾使用 Excel,可能會遇到 CSV 檔案。CSV 表示以逗號分隔的值。可以使用逗號 (或此案例中的兩條虛線) 做為分隔符號搭配 String.Join 節點,以建立類似的資料結構。
以下影像表示接合兩個字串:
藉由分隔符號輸入,可以建立對接合後的字串進行分割的字串。
在此練習中,我們將使用字串的查詢與操控方法解構 Robert Frost 的 Stopping By Woods on a Snowy Evening 的最後一節。這並不是字串最實用的應用,但將其套用至清晰的節奏與韻律時,將有助於我們掌握概念字串的動作。
接下來從這一節的基本字串分割開始。首先,我們注意到書寫格式的依據是逗號。我們將使用此格式將每行分隔為個別項目。
將基準字串貼至 String 節點。
另一個 String 節點用來表示分隔符號。在此案例中,我們將使用逗號。
將 String.Split 節點加入圖元區,並連接至兩個字串。
輸出顯示我們現在已將各行分隔為個別元素。
現在,我們來到詩詞美妙的部分:最後兩行。原始的一節是一個資料項目。在第一步,我們已將此資料分隔為個別項目。現在,我們需要搜尋要尋找的文字。雖然我們 可以 透過選取清單中的最後兩個項目來實現這一點,但是如果是整本書,我們不希望通讀所有內容然後手動隔離元素。
我們不是手動搜尋,而是使用 String.Contains 節點對一組字元執行搜尋。這類似於文字處理器中的「尋找」指令。在此案例中,會傳回「true」,若項目中找到該子字串,會傳回「false」。
在 searchFor 輸入中,我們會定義將在該節中尋找的子字串。接下來使用 String 節點搭配文字「And miles」。
輸出是 false 與 true 的清單。在下一步中,我們使用此布林邏輯對元素進行篩選。
我們將使用 List.FilterByBoolMask 節點篩選出 false 與 true。「in」輸出會傳回「遮罩」輸入為「true」的陳述式,而「out」輸出會傳回「遮罩」輸入為「false」的陳述式。
「in」的輸出與預期相同,是該節詩句的最後兩行。
現在,我們希望合併這兩行,以重複這節詩句。檢視上一步的輸出時,我們注意有清單中有兩個項目:
透過兩個 List.GetItemAtIndex 節點,我們可以使用值 0 與 1 做為索引輸入以隔離項目。
每個節點的輸出依序提供最後兩行。
為了將這兩個項目合併為一個,我們使用 String.Join 節點:
加入 String.Join 節點後,我們注意到需要分隔符號。
為了建立分隔符號,我們在圖元區加入 String 節點,然後鍵入逗號。
最終的輸出已將最後兩個項目合併為一個。
這看起來似乎要執行很多工作才能隔離最後兩行,的確,字串作業通常需要某些前置工作。但這些作業可擴充,而且可以相對輕鬆地套用至大型資料集。如果您以參數方式使用工作表與互通性,請確保考慮到字串作業。
對於營造引人注目的視覺效果以及彩現視覺程式輸出的差異而言,顏色是很棒的資料類型。使用抽象資料及不同的數字時,有時很難查看變更的項目與變更程度。顏色在這裡大有用武之地。
在 Dynamo 中使用 ARGB 輸入建立顏色。這對應於 Alpha、紅色、綠色與藍色通道。Alpha 代表顏色的 透明度,而其他三項用作主要顏色以協同產生顏色的整個光譜。
圖示 | 名稱 (語法) | 輸入 | 輸出 |
---|---|---|---|
以下表格中的顏色會查詢用於定義顏色的性質:Alpha、紅色、綠色與藍色。請注意,Color.Components 節點會提供所有四項作為不同輸出,因此該節點更適合查詢顏色的性質。
圖示 | 名稱 (語法) | 輸入 | 輸出 |
---|---|---|---|
以下表格中的顏色對應於 HSB 顏色空間。將顏色分為色相、飽和度與亮度可以更直觀地解譯顏色:顏色應該是怎樣的?顏色是什麼色彩?顏色的明暗程度應該是怎樣的?這是分別劃分的色相、飽和度與亮度。
圖示 | 名稱 (語法) | 輸入 | 輸出 |
---|---|---|---|
顏色範圍類似於#part-ii-from-logic-to-geometry練習的 Remap Range 節點:可將數字清單重新對映到其他範圍。但它並非對映到 數字 範圍,而是根據介於 0 至 1 的輸入數字對映到 顏色漸層。
目前的節點運作正常,但第一次就要讓所有內容正常運作可能會有些困難。熟悉顏色漸層的最佳方式是以互動方式對其進行測試。接下來我們進行快速練習,以檢閱如何設置輸出顏色對應於數字的漸層。
定義三種顏色:使用 Code Block 節點,透過插入 0 與 255 的適當組合來定義 red、green 與 blue。
建立清單: 將三種顏色合併到一個清單中。
定義索引:建立清單以定義每種顏色的掣點位置 (從 0 至 1)。請注意值 0.75 為綠色。這會在顏色範圍滑棒上,將綠色置於水平漸層長度的 3/4 處。
Code Block:要轉換為顏色的輸入值 (介於 0 至 1 之間)。
使用 Display.ByGeometry 節點可以在 Dynamo 視埠中查看顏色幾何圖形。這有助於區分不同類型的幾何圖形、展示參數式概念,或定義模擬的分析圖例。輸入很簡單:幾何圖形與顏色。若要建立類似上面影像的漸層,請將顏色輸入連接至 Color Range 節點。
透過 Display.BySurfaceColors 節點,我們可以使用顏色對映整個曲面上的資料!此功能帶來某些振奮人心的可能性,可以對透過離散分析 (例如日光、能源及鄰近) 取得的資料進行視覺化。在 Dynamo 中將顏色套用至曲面類似於在其他 CAD 環境中將材質套用至材料。接下來在以下簡短練習中示範如何使用此工具。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
本練習的內容主要是以參數式方法控制顏色及幾何圖形。幾何圖形是一個基本螺旋線,我們下面使用 Code Block 定義。這是快速輕鬆的參數式函數建立方式,由於我們的焦點是顏色 (而不是幾何圖形),因此我們使用程式碼區塊高效建立螺旋線,而不贅述圖元區。隨著手冊改用更先進的材料,我們將更頻繁地使用程式碼區塊。
Code Block: 定義包含上述公式的兩個程式碼區塊。這是快速建立螺旋線的參數式方法。
Point.ByCoordinates:將程式碼區塊的三項輸出插入節點的座標。
現在我們可以看到建立螺旋線的一系列點。下一步是建立通過這些點的曲線,以便能看到螺旋。
PolyCurve.ByPoints: 將 Point.ByCoordinates 輸出連接至節點的 points 輸入。我們會得到一條螺旋曲線。
Curve.PointAtParameter: 將 PolyCurve.ByPoints 輸出連接至 curve 輸入。此步驟的目的是建立沿曲線滑動的參數式牽引點。由於曲線透過參數對點進行演算,因此我們需要輸入 0 與 1 之間的 param 值。
Number Slider: 加入圖元區後,將 min 值變更為 0.0,max 值變更為 1.0,step 值變更為 0.01。將滑棒輸出插入 Curve.PointAtParameter 的 param 輸入。現在,我們將看到沿螺旋線的長度由滑棒的百分比表示的點 (0 表示起點,1 表示終點)。
建立參考點後,現在我們比較從參考點到螺旋原始定義點的距離。此距離值將驅動幾何圖形與顏色。
Geometry.DistanceTo: 將 Curve.PointAtParameter 輸出連接至 輸入。將 Point.ByCoordinates 連接至 geometry 輸入。
Watch: 產生的結果將顯示從每個螺旋點至曲線上參考點之距離的清單。
下一步驟是使用從螺旋點至參考點之距離的清單來驅動參數。我們將使用這些距離值來定義曲線上一系列圓球的半徑。若要讓圓球保持合適的大小,我們需要 重新對映 距離值。
Math.RemapRange: 將 Geometry.DistanceTo 輸出連接至數字輸入。
Code Block: 將值為 0.01 的程式碼區塊連接至 newMin 輸入,將值為 1 的程式碼區塊連接至 newMax 輸入。
Watch: 將 Math.RemapRange 輸出連接至一個節點,將 Geometry.DistanceTo 輸出連接至另一個節點。比較結果。
此步驟已將距離清單重新對映到較小的範圍。我們可以採用合適的任何方式編輯 newMin 與 newMax 值。這些值將重新對映,並在整個範圍內具有相同的 分配比率
Sphere.ByCenterPointRadius: 將 Math.RemapRange 輸出連接至 radius 輸入,將原始 Point.ByCoordinates 輸出連接至 centerPoint 輸入。
變更數字滑棒的值,查看圓球大小更新。我們現在有一個參數式波浪
圓球的大小展示出由曲線上的參考點定義的參數式陣列。接下來我們應用相同的概念,使用圓球半徑來驅動其顏色。
Color Range: 加入圖元區頂部。懸停在 value 輸入上時,我們會注意到要求的數字介於 0 與 1 之間。我們需要重新對映 Geometry.DistanceTo 輸出中的數字,以便其與此範圍相容。
Sphere.ByCenterPointRadius: 我們暫時停用此節點的預覽 (按一下右鍵 >「預覽」)
Math.RemapRange: 此程序似乎應該很熟悉。將 Geometry.DistanceTo 輸出連接至數字輸入。
Code Block: 與之前的步驟類似,為 newMin 輸入建立值 0,為 newMax 輸入建立值 1。請注意,在此案例中,我們可以從一個程式碼區塊定義兩個輸出。
Color Range: 將 Math.RemapRange 輸出連接至 value 輸入。
Color.ByARGB: 這是我們為了建立兩種顏色將執行的作業。雖然此程序可能貌似有些難,但是它與其他軟體中的 RGB 顏色相同,我們只是剛剛使用視覺程式設計來執行此作業而已。
Code Block: 建立 0 與 255 兩個值。將兩個輸出插入與以上影像相同的兩個 Color.ByARGB 輸入 (或建立您最愛的兩種顏色)。
Color Range:colors 輸入要求提供顏色清單。我們需要使用上一步驟中建立的兩種顏色建立此清單。
List.Create: 將兩種顏色合併到一個清單中。將輸出插入 Color Range 的 colors 輸入。
Display.ByGeometryColor: 將 Sphere.ByCenterPointRadius 連接至 geometry 輸入,將 Color Range 連接至 color 輸入。現在,我們已在整個曲線範圍內建立平滑的漸層。
如果我們變更之前定義中 Number Slider 的值,顏色與大小就會更新。在此案例中,顏色與半徑大小直接相關:我們現在已在兩個參數之間建立視覺連結!
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
首先,我們需要建立 (或參考) 將用作 Display.BySurfaceColors 節點輸入的曲面。在此範例中,我們將在正弦及餘弦曲線之間進行斷面混成。
此節點群組將沿 Z 軸建立點,然後根據正弦及餘弦函數將其取代。然後,使用兩點清單產生 NURBS 曲線。
Surface.ByLoft:在清單的 NURBS 曲線之間產生內插曲面。
File Path:選取將針對下游像素資料進行取樣的影像檔案
使用 File.FromPath 將檔案路徑轉換為檔案,然後傳送至 Image.ReadFromFile 以輸出供取樣的影像
Image.Pixels:輸入影像,並提供沿影像的 x 和 y 維度將使用的取樣值。
滑棒:提供 Image.Pixels 的取樣值
Display.BySurfaceColors:分別沿 X 與 Y 軸在整個曲面內對映一系列顏色值
取樣解析度為 400x300 之輸出曲面的特寫預覽
現在我們已建立清單,接下來討論可以對清單執行哪些作業。將清單想像為一副紙牌。這副紙牌是清單,而其中每張紙牌都代表一個項目。
相片由 Christian Gidlöf 拍攝
我們可以對清單執行哪些查詢?這將存取既有性質。
這副紙牌有多少張?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% 的節點。
字典代表與另外一組資料 (稱為鍵) 相關的資料集合。字典可讓您搜尋資料、刪除資料,以及將資料插入集合。
基本上,我們可以將字典想成是一種查詢內容相當聰明的方法。
雖然字典功能在 Dynamo 中已經存在好一段時間,但是 Dynamo 2.0 引入了新的方式來管理此資料類型。
Dynamo 2.0 引入將字典資料類型與清單資料類型分開的概念。此變更可能會對您如何在工作流程中建立和使用資料造成一些重大變更。在 2.0 版之前,字典和清單合併成一種資料類型。簡單來說,清單實際上是有整數鍵的字典。
字典是一種由鍵 - 值對的集合所組成的資料類型,其中每個鍵在每個集合中都是唯一的。字典沒有順序,基本上您可以使用鍵值而不是清單中的索引值「查詢」內容。在 Dynamo 2.0 中,鍵只能是字串。
清單是一種由有序值的集合所組成的資料類型。在 Dynamo 中,清單使用整數做為索引值。
將字典與清單分開,是為了讓字典成為頭等物件,您可以使用它們快速輕鬆地儲存和查詢值,無需記住索引值或在整個工作流程中維護嚴格的清單結構。在使用者測試期間,我們看到當使用字典而不是數個 GetItemAtIndex
節點時,很明顯縮小了圖表大小。
語法 發生了變化,改變您在程式碼區塊中初始化和使用字典與清單的方式。
字典使用以下語法 {key:value}
清單使用以下語法 [value,value,value]
資源庫引入了 新節點,以協助您建立、修改和查詢字典。
在 1.x 版的程式碼區塊中建立的清單,在載入腳本時會自動移轉成使用方括號 [ ]
而不是大括號 { }
的新清單語法 \
在電腦科學中,字典 (像是清單) 是物件的集合。清單有特定的順序,而字典則是 沒有順序 的集合。字典不依賴有順序的數字 (索引),而是使用 鍵。
在下面的影像中,我們示範字典的可能使用案例。字典通常是用來讓兩組可能沒有直接關聯的資料建立關係。在我們的範例中,我們要將西班牙版本的某個字連接到英文版本,以供稍後進行查詢。
建置字典以關聯兩個資料。
取得具有給定索引的值。
Dynamo 2.0 公開各種字典節點供我們使用。這包括 建立、動作和查詢 節點。
Dictionary.ByKeysValues
將使用提供的值和鍵建立字典。(項目數目會是最短的清單輸入)
Dictionary.Components
將產生輸入字典的元件。(這是建立節點的反轉過程)。
Dictionary.RemoveKeys
將產生新的字典物件但移除輸入鍵。
Dictionary.SetValueAtKeys
將根據輸入鍵與值產生新字典,以取代對應鍵處的目前值。
Dictionary.ValueAtKey
會傳回輸入鍵處的值。
Dictionary.Count
會告訴您字典中有多少個鍵值對。
Dictionary.Keys
會傳回字典中目前儲存哪些鍵。
Dictionary.Values
會傳回字典中目前儲存哪些值。
字典的整體相關資料是處理索引和清單的舊方法的重要替代方法。
藉由邏輯,或者更明確地說,藉由條件邏輯,我們可以根據測試指定單一或一組動作。在評估測試時,我們可以使用表示 True
或 False
的布林值控制程式流程。
數值變數可以儲存所有範圍的不同數字。布林變數只能儲存兩個值,稱為 True 或 False、是或否、0 或 1。由於布林值範圍有限,因此很少使用布林值執行計算。
「If」陳述式是程式設計中的關鍵概念:「如果 這 是真的,則會發生 那件事,否則會發生 其他事。」陳述式所產生的動作由布林值驅動。在 Dynamo 中,可以採用多種方式定義「if」陳述式:
圖示 | 名稱 (語法) | 輸入 | 輸出 |
---|
接下來瞭解使用條件「if」陳述式的三種有效節點中每種節點的簡單範例。
在此影像中,boolean 設為 true,這意味著結果是字串 「this is the result if true」。建立 If 陳述式的三個節點在這裡的工作方式完全相同。
再說一次,節點的工作方式完全相同。若 boolean 變更為 false,則結果是數字 Pi,如原始 If 陳述式所定義。
在下方的連結按一下,下載範例檔案。
附錄中提供完整的範例檔案清單。
接下來使用邏輯將數字清單分隔為偶數清單與奇數清單。
a.Number Range - 在圖元區加入一個數字範圍。
b.Numbers - 在圖元區加入三個數字節點。每個數字節點的值應為:0.0 (start)、10.0 (end) 與 1.0 (step)。
c.輸出 - 輸出是一個 11 個數字 (從 0 到 10) 的清單。
d.模除 (%)- 將 Number Range 連接至 x,將 2.0 連接至 y。這會計算清單中的每個數字除以 2 產生的餘數。此清單的輸出是 0 與 1 交替顯示的數值清單。
e.相等性測試 (==) - 在圖元區加入相等性測試。將 模除 輸出插入 x 輸入,將 0.0 插入 y 輸入。
f.Watch - 相等性測試的輸出是 true 與 false 交替顯示的清單。這些值用於分隔清單中的項目。0 (或 true) 表示偶數,1 (或 false) 表示奇數。
g.List.FilterByBoolMask - 此節點將根據輸入的布林值,將這些值篩選到兩個不同清單中。將原始的 Number Range 插入 list 輸入,將 相等性測試 輸出插入 mask 輸入。輸出 in 表示 true 值,而輸出 out 表示 false 值。
h.Watch - 結果是我們現在產生了偶數清單與奇數清單。我們已使用邏輯運算子將清單分隔為多種樣式!
接下來我們將建置第一個練習中建立的邏輯,將此設置套用到塑型作業中。
2.我們從上一個練習開始,採用相同的節點。唯一的例外 (除了變更格式) 是:
a.使用 Sequence 節點搭配這些輸入值。
b.我們取消插入 List.FilterByBoolMask 的 list 輸入。暫時將這些節點放在一旁,這在稍後的練習中會有用。
3.我們先為圖表建立不同群組,如以上影像所示。此節點群組表示定義曲線所用的參數式方程式。一些註記如下:
a.第一個 Number Slider 表示波浪的頻率,最小值為 1,最大值為 4,步長為 0.01。
b.第二個 Number Slider 表示波浪的振幅,最小值為 0,最大值為 1,步長為 0.01。
c.PolyCurve.ByPoints - 若複製以上節點圖,在 Dynamo 預覽視埠中的結果將是一條正弦曲線。
此處採用的輸入方式:對比較靜態的性質使用數字節點,對比較彈性的性質使用數字滑棒。我們希望保留在這一步開始時定義的原始數字範圍。但是,我們在此建立的正弦曲線應具有某些彈性。我們可以移動這些滑棒以觀看曲線對其頻率與振幅的更新。
4.我們將對定義進行一些調整,因此接下來看一下最終結果,以便可以參考得到的結果。之前,前兩個步驟是分別執行的,現在我們要連接兩者。我們將使用基準正弦曲線以驅動拉鍊元件的位置,並使用 true/false 邏輯實現大小方塊的交替變化。
a.Math.RemapRange - 接下來使用步驟 02 中建立的數字序列,透過重新對映範圍建立新的數字系列。步驟 01 的原始數字介於 0-100 之間。這些數字的範圍分別由 newMin 與 newMax 輸入限制為從 0 到 1。
5.建立 Curve.PointAtParameter 節點,然後連接步驟 04 的 Math.RemapRange 輸出做為其 param 輸入。
此步驟將沿曲線建立點。我們將數字重新對映到從 0 至 1 的範圍,因為 param 的輸入會尋找此範圍內的值。0 值表示起點,1 值表示終點。這當中的所有數字都會在 [0,1] 範圍內運算。
6.將 Curve.PointAtParameter 的輸出連接至 List.FilterByBoolMask,以分隔奇數和偶數索引的清單。
a.List.FilterByBoolMask - 將上一步的 Curve.PointAtParameter 插入 list 輸入。
b.Watch - in 的 Watch 節點與 out 的 Watch 節點顯示我們有兩個分別代表偶數索引與奇數索引的清單。這些點按照在曲線上的位置順序排序,我們將在下一步示範。
7.接下來,我們將使用步驟 05 中 List.FilterByBoolMask 的輸出結果,根據其索引產生不同大小的幾何圖形。
Cuboid.ByLengths - 重新建立以上影像顯示的連接,以產生一條沿正弦曲線的拉鍊。立方體在這裡只是方塊,我們將根據方塊中心的曲線點定義其大小。現在,模型中應該已清晰呈現偶數/奇數的區分邏輯。
a.偶數索引處的立方體清單。
b.奇數索引處的立方體清單。
瞧!您剛剛根據本練習示範的邏輯作業,以程式設計了定義幾何圖形維度的過程。
進一步深入探討,接下來我們在階層中加入更多層。資料結構的擴展範圍遠超二維清單的清單。由於在 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;
第一個版本的搖椅造型優美,因此我們的第二個模型將作為運動設備提供在野外的休息功能。
接下來在階層中再加入一層。我們以最初範例中的一副紙牌為例,如果製作容納多副紙牌的盒子,那麼現在盒子就代表各副紙牌的清單,而每副紙牌代表紙牌的清單。這是清單的清單。為了說明本節內容,我們進行類比,以下影像包含多疊硬幣,每疊包含多個一美分硬幣。
我們可以對清單的清單執行哪些查詢?這將存取既有性質。
有幾種硬幣類型?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 建立。大部分 List.Map 功能已透過增加 List@Level 功能解決。如需更多資訊,請參閱以下的 。
注意:此練習使用舊版本的 Dynamo 建立。大部分 List.Map 功能已透過增加 List@Level 功能解決。如需更多資訊,請參閱以下的 。
程式碼區塊速寫使用「[]」定義清單。與 List.Create 節點相比,這是更快速更流暢的清單建立方式。在 中會更詳細地討論程式碼區塊。參考以下影像,請注意使用程式碼區塊如何定義具有多個表示式的清單。
程式碼區塊速寫使用「[]」是一個快速輕鬆的方式,可從複雜的資料結構中選取所需的特定項目。在會更詳細地討論程式碼區塊。參考以下影像,請注意使用程式碼區塊如何查詢具有多種資料類型的清單。
ARGB 顏色 (Color.ByARGB)
A、R、G、B
color
Alpha (Color.Alpha)
color
A
紅色 (Color.Red)
color
R
綠色 (Color.Green)
color
G
藍色 (Color.Blue)
color
B
組成 (Color.Components)
color
A、R、G、B
色相 (Color.Hue)
color
色相
飽和度 (Color.Saturation)
color
飽和度
亮度 (Color.Brightness)
color
亮度
If (If) | test、true、false | result |
Formula (IF(x,y,z)) | x、y、z | result |
Code Block ((x?y:z);) | x? y, z | result |
Dynamo 2.0 不只為字典引入先前討論的節點,程式碼區塊中也同樣有針對字典的新功能!
您可以使用類似於下方的語法,或節點的 DesignScript 式表現法。
由於字典在 Dynamo 中是一種物件類型,因此我們可以對其執行以下動作。
維持這類互動在將 Revit 資料與字串建立關係時會特別有用。接著,我們來看看一些 Revit 使用情況。
您是否曾想要依據 Revit 包含的資料片段查看其中的一些內容?
如果您完成了類似下列作業,就可能達到這個目的。
在下面的影像中,我們收集 Revit 模型中的所有房間、取得所需房間的索引 (依房間號碼),最後取得索引處的房間。
收集模型中所有的房間。
要尋找的房間號碼。
得到房間號碼,並尋找其所在的索引。
得到索引處的房間。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
現在讓我們使用字典重新創造這個構想。首先我們必須收集 Revit 模型中所有的房間。
我們選擇我們想要使用的 Revit 品類 (在本案例中,我們使用房間)。
我們告訴 Dynamo 收集所有這些元素
接著,我們必須決定要使用哪些鍵來查詢此資料。(在什麼是字典?一節可以找到鍵的相關資訊)。
我們要使用的資料是房間號碼。
現在,我們要使用給定的鍵和元素建立字典。
Dictionary.ByKeysValues 節點會在給定適當輸入的狀況下建立字典。
Keys
必須是字串,而values
可以是各種物件類型。
最後,我們現在可以從字典中使用房間號碼擷取房間。
String
是我們要用來從字典中查詢物件的鍵。Dictionary.ValueAtKey 現在會從字典中取得物件。
使用同樣的字典邏輯,我們也可以使用群組的物件建立字典。如果我們想要查詢給定樓層的所有房間,可以修改上面的圖表,如下所示。
我們現在不使用房間號碼做為鍵,而是使用參數值 (在此案例中,我們將使用樓層)。
現在,我們可以依據房間所在的樓層將房間分組。
有了依樓層分組的元素,我們現在可以使用共用鍵 (唯一鍵) 做為字典的鍵,使用房間的清單做為元素。
最後,使用 Revit 模型中的樓層,我們可以在字典中查詢哪些房間位於該樓層。
Dictionary.ValueAtKey
會採用樓層名稱,然後傳回該樓層的房間物件。
使用字典的時機非常多。將 Revit 中的 BIM 資料與元素本身建立關係,就可以產生各種使用情況。