Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
程式碼區塊是 DesignScript 中的深層視窗,是 Dynamo 程式設計語言的核心。DesignScript 可用於從頭開始進行建置以支援探索式設計工作流程,它是一個可讀且簡要的語言,可為較小的位元碼提供即時意見以也可以用於大型且複雜的互動。DesignScript 還形成在後台驅動 Dynamo 大多數方面之引擎的基礎。因為幾乎 Dynamo 節點的所有功能和互動都與指令碼撰寫語言有一對一的關係,所以有獨特的機會以流暢方式在節點式互動與指令碼撰寫之間轉換。
對於初學者,節點可以自動轉換為文字語法,以協助學習 DesignScript,或單純只是為了縮小較大的圖表部分。使用稱為「要編碼的節點」的流程即可達成。在 DesignScript 語法一節會說明更多詳細資訊。經驗更豐富的使用者可以使用程式碼區塊,建立既有功能以及使用許多標準編碼範例的使用者編寫關係的自訂組合。對於初學者和進階使用者之間的使用者,提供了大量的捷徑和程式碼片段可加快您的設計。雖然術語「程式碼區塊」可能會讓非程式設計師覺得有點難以理解,但它其實很容易使用,而且功能強大。初學者可以在進行最少編碼的情況下使用程式碼區塊,進階使用者可定義在 Dynamo 定義的其他位置可進行呼叫的指令碼型定義。
簡而言之,程式碼區塊是視覺指令碼撰寫環境中的文字指令碼撰寫介面。它們可以用作數字、字串、公式和其他資料類型。程式碼區塊是專為 Dynamo 設計的,因此可以在程式碼區塊中定義任意變數,且這些變數會自動新增至節點的輸入:
程式碼區塊可讓使用者靈活決定如何指定輸入。下面提供了幾種不同方式來使用座標建立基本點 (10,5,0):
在您進一步瞭解資源庫中可用的函數後,您可能甚至會發現,鍵入「Point.ByCoordinates」的速度比在資源庫中搜尋和找出正確的節點更快。例如當您鍵入 Point. 時,Dynamo 會顯示一個可能函數的清單以套用到點。這可使得指令碼撰寫更直覺,並協助學習如何在 Dynamo 中套用函數。
您可以透過 Core>Input>Actions>Code Block 找到程式碼區塊。但更快的方式是在圖元區按兩下,程式碼區塊就會出現。此節點因為經常使用,所以被賦予完整的按兩下權限。
程式碼區塊對於資料類型也可以很靈活。使用者可以快速定義數字、字串和公式,程式碼區塊將提供所需的輸出。
在以下圖像中,您可以看到以「舊」的方式進行的作業有點冗長,使用者在介面中搜尋所需的節點,將節點新增至畫布,然後輸入資料。使用程式碼區塊時,使用者可以按兩下畫布以拉取節點,然後使用基本語法鍵入正確資料類型。
number、string 和 formula 節點是 Dynamo 節點的三個範例,與 Code Block 相比可以說是舊式節點。
舊式
程式碼區塊
程式碼區塊有一些基本的速寫方法,簡言之,這些方法可以 顯著 降低資料管理的難度。以下我們將分類講解基本知識,並討論如何使用此速寫來建立與查詢資料。
定義範圍與序列的方法可以精簡為基本速寫。使用以下影像作為「..」語法的指南,以使用程式碼區塊定義一系列數值資料。瞭解此標記法後,建立數值資料就會非常有效率:
在此範例中,數字範圍由定義
beginning..end..step-size;
的基本 Code Block 語法所取代。以數字方式表示,我們得到:0..10..1;
請注意,語法
0..10..1;
相當於0..10;
步長大小 1 是速寫標記法的預設值。因此0..10;
將產生從 0 到 10 且步長大小為 1 的序列。序列 範例很類似,只是我們使用「#」來說明希望清單包含 15 個值,而非清單中的值不超過 15。在此範例中,我們將定義:
beginning..#ofSteps..step-size:
序列的實際語法為0..#15..2
使用上一步的 #,現在將其放在語法的 step-size 部分。現在,我們產生一個從 beginning 到 end 的 數字範圍,step-size 標記將許多值均勻分佈在這兩個值之間:
beginning..end..#ofSteps
藉由建立進階範圍,我們能以簡單方式使用清單的清單。在以下範例中,我們將隔離變數與主要範圍標記,並建立該清單的另一個範圍。
1.建立巢狀範圍,對含與不含「#」的標記進行比較。套用基本範圍內的相同邏輯,只是變得稍複雜一些。
2.可以在主要範圍內的任何位置定義子範圍,請注意我們可以有兩個子範圍。
3.透過控制範圍內的「end」值,我們可以建立長度不同的多個範圍。
比較以上兩個速寫,並嘗試剖析 子範圍 與 # 標記如何產生結果輸出,來作為邏輯練習。
除了使用速寫建立清單外,我們也可以快速建立清單。這些清單可以包含多種元素類型,也可以進行查詢 (請記住,清單本身就是物件)。總而言之,使用程式碼區塊,您將使用括號 (方括號) 建立清單和查詢清單中的項目:
1.使用字串快速建立清單,並使用項目索引查詢清單。
2.使用變數建立清單,並使用範圍速寫標記查詢清單。
使用巢狀清單進行管理是類似的程序。請注意清單順序,並使用多組方括號呼叫:
1.定義清單的清單。
2.使用單邊括號查詢清單。
3.使用雙邊括號查詢項目。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
在本練習中,我們將靈活運用新的速寫技能,以建立由範圍與公式定義的炫酷蛋殼曲面。在本練習中,請注意我們如何搭配使用程式碼區塊與既有 Dynamo 節點:我們對處理大量資料的工作使用程式碼區塊,而以視覺方式配置 Dynamo 節點以實現定義的易讀性。
首先,透過連接以上節點以建立曲面。不是使用數字節點來定義寬度與長度,而是按兩下圖元區,然後在程式碼區塊中輸入 100;
。
在 Code Block 中輸入
0..1..#50
,定義介於 0 至 1 之間且分為 50 份的範圍。將該範圍連接至 Surface.PointAtParameter,這會在曲面內為 u 與 v 指定介於 0 與 1 之間的值。請記得在 Surface.PointAtParameter 節點上按一下右鍵,將「交織」變更為「笛卡兒積」。
在此步驟中,我們使用第一個函數在 Z 方向將點的格線上移。此格線將根據基本函數驅動產生的曲面。如以下影像所示新增節點
我們不使用公式節點,而是使用包含
(0..Math.Sin(x*360)..#50)*5;
這一行的 Code Block。為了快速詳細說明這一點,我們將定義內含公式的範圍。此公式是正弦函數。正弦函數會接收 Dynamo 中輸入的角度,因此為了取得完整的正弦波形,我們將 x 值 (這是 0 到 1 的範圍輸入) 乘以 360。接下來,我們希望份數與每列的控制格線點數量相同,所以使用 #50 定義五十份。最後,乘數 5 只是為了增加平移的振幅,方便我們在 Dynamo 預覽中查看效果。
雖然上一個 Code Block 運作地很好,但它並非完全是參數式方法。我們要動態驅動其參數,因此我們將上一步的程式碼行取代為
(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;
。藉此我們能根據輸入定義這些值。
透過變更滑棒 (範圍從 0 到 10),我們得到一些有趣的結果。
透過對數字範圍執行轉置,我們反轉窗簾波浪的方向:
transposeList = List.Transpose(sineList);
加入 sineList 與 tranposeList 後會得到一個扭曲的蛋殼曲面:
eggShellList = sineList+transposeList;
變更下面指定的滑棒值,將此演算法「變平靜」。
最後,我們使用程式碼區塊查詢資料的隔離部分。若要重新產生具有特定範圍點的曲面,請在 Geometry.Translate 與 NurbsSurface.ByPoints 節點之間加入以上程式碼區塊。這包括文字行:sineStrips[0..15..1];
。這將選取前 16 列的點 (從 50 個點中)。重新建立曲面,我們可以看到已產生點格線的隔離部分。
在最後一個步驟中,為了讓此 Code Block 的參數式程度更高,我們使用範圍從 0 至 1 的滑棒來驅動該查詢。我們使用這一行程式碼執行此作業:
sineStrips[0..((List.Count(sineStrips)-1)*u)];
。這可能有些混亂,但使用該行程式碼可以快速運用介於 0 和 1 之間的乘數來擴充清單長度。
若使用滑棒值 0.53
,會建立一個剛好通過格線中點的曲面。
與預期一致,使用滑棒值 1
時,會從完整的點格線建立一個曲面。
查看視覺圖表,我們可以亮顯程式碼區塊,並查看其中的每項函數。
1.第一個 Code Block 取代 Number 節點。
2.第二個 Code Block 取代 Number Range 節點。
3.第三個 Code Block 取代 Formula 節點 (以及 List.Transpose、List.Count 與 Number Range)。
4 種。第四個 Code Block 查詢清單的清單,取代 List.GetItemAtIndex 節點。
Dynamo 標準幾何圖形資源庫中最簡單的幾何圖形物件是一個點。所有幾何圖形都是使用稱作建構函式的特殊函數建立的,每個建構函式都會傳回一個該特定幾何圖形類型的新實體。在 Dynamo 中,建構函式以物件類型的名稱 (在此案例中為 Point) 為開頭,後接建構的方法。若要建立一個以 x、y、z 直角座標指定的三維點,請使用 ByCoordinates 建構函式:
Dynamo 中的建構函式通常以「By」字首指定,呼叫這些函數會傳回該類型新建立的物件。這個新建立的物件以等號左邊命名的變數儲存。
大多數物件都有許多不同的建構函式,我們可以使用 BySphericalCoordinates 建構函式,指定圓球的半徑、第一個旋轉角度和第二個旋轉角度 (以度為單位指定) 建立一個圓球上的點:
點可以用來建構更高維度的幾何圖形,例如直線。我們可以使用 ByStartPointEndPoint 建構函式在兩個點之間建立一個 Line 物件:
同樣的,直線也可以用來建立更高維度的曲面幾何圖形,例如使用 Loft 建構函式,用一系列直線或曲線,在這之間內插一個曲面。
曲面也可以用來建立更高維度的實體幾何圖形,例如把曲面加厚指定的距離。許多物件都會附加稱為方法的函數,程式設計師可以對該特定物件執行指令。所有幾何圖形都通用的方法包括 Translate 和 Rotate,分別將幾何圖形平移 (移動) 和旋轉指定的量。曲面有一個 Thicken 方法,它採用一個單一的數字輸入,指定曲面的新厚度。
Intersection 指令可以從較高維度的物件萃取出較低維度的幾何圖形。在建立、萃取和重新建立幾何圖形的循環過程中,萃取出的較低維度幾何圖形可以形成較高維度幾何圖形的基礎。在此範例中,我們使用產生的實體 (Solid) 來建立一個曲面 (Surface),並使用曲面 (Surface) 來建立一條曲線 (Curve)。
雖然 Dynamo 能夠建立各種複雜幾何形狀,但是簡單的幾何基本型是構成任何計算設計的骨架:無論是以最終設計的形式直接表示,或是用來做為產生更複雜幾何圖形的鷹架。
雖然 CoordinateSystem 嚴格來說不算是一個幾何圖形,但卻是建構幾何圖形的一個重要工具。一個 CoordinateSystem 物件可以同時追蹤位置和幾何的轉換,例如旋轉、切變和調整比例。
建立一個中心點位於 x=0,y=0,z=0 的 CoordinateSystem (沒有旋轉、調整比例或切變轉換),只需要呼叫 Identity 建構函式:
具有幾何轉換的 CoordinateSystem 超出本章節的範圍,不過有另一個建構函式 CoordinateSystem.ByOriginVectors 可以讓您在特定的點建立座標系統:
最簡單的幾何基本型是一個點 (Point),代表三維空間中的一個零維位置。如先前所述,在特定座標系統中建立一個點有幾種不同的方式:Point.ByCoordinates 以指定的 x、y、z 座標建立一個點;Point.ByCartesianCoordinates 在特定座標系統中以指定的 x、y、z 座標建立一個點;Point.ByCylindricalCoordinates 在有半徑、旋轉角度和高度的圓柱上建立一個點;Point.BySphericalCoordinates 在有半徑和兩個旋轉角度的圓球上建立一個點。
本範例會顯示在各種座標系統建立的點:
下一個較高維度的 Dynamo 基本型是線段,代表兩個端點之間有無限個點。使用 Line.ByStartPointEndPoint 建構函式明確指出兩個邊界點,或使用 Line.ByStartPointDirectionLength 建構函式指定起點、方向和沿著該方向的長度,可以建立直線。
Dynamo 有幾個物件,代表三維的幾何基本型的最基本類型:使用 Cuboid.ByLengths 建立的立方體 (Cuboid);使用 Cone.ByPointsRadius 和 Cone.ByPointsRadii 建立的圓錐 (Cone);使用 Cylinder.ByRadiusHeight 建立的圓柱 (Cylinder);以及使用 Sphere.ByCenterPointRadius 建立的圓球 (Sphere)。
程式碼區塊是 Dynamo 中的獨有功能,用於動態連接視覺程式設計環境與文字型環境。程式碼區塊可存取所有 Dynamo 節點,並可以在一個節點定義整個圖形。請仔細閱讀本章,因為程式碼區塊是 Dynamo 中的基礎建置材料。
在本節中,您將會學習一系列如何使用 DesignScript 建立幾何圖形的課程。請將範例 DesignScript 複製到 Dynamo 程式碼區塊逐步進行。
資料類型
標準 Dynamo
Code Block 對等項
數字
字串
序列
範圍
取得索引處的項目
建立清單
連接字串
條件陳述式
節點
Code Block 對等項
附註
任何運算子 (+、&&、>=、Not... 等等)
+、&&、>=、!... 等等
請注意,「Not」變成「!」,但節點稱為「Not」以便與「階乘」區分
Boolean True
true;
請注意小寫
Boolean False
false;
請注意小寫
在 Dynamo 中有兩種基本方法可以建立自由形式的曲線:指定一些點,讓 Dynamo 在這些點之間插出一條平滑的曲線,另一個比較低階的方法是指定某個次數的曲線的基本控制點。如果設計師很清楚知道要產生的線條形狀,或如果設計有一些特定的約束讓曲線可以或無法通過,內插的曲線會很好用。透過控制點指定的曲線實際上是一系列的直線段,演算法會將這些線段平滑產生一條最終的曲線形狀。如果是要探索各種不同平滑程度的曲線形狀,或者當曲線段之間的平滑連續性很重要時,透過控制點指定曲線就很好用。
若要建立內插的曲線,只要將一些點傳入 NurbsCurve.ByPoints 方法即可。
產生的曲線會分別與每個輸入點相交,從第一個點開始,在最後一個點結束。這裡可以使用一個選擇性的週期性參數,用來建立一條週期性的封閉曲線。Dynamo 會自動填入缺少的線段,因此不需要複製終點 (與起點相同)。
NurbsCurve 以幾乎相同的方式產生,輸入點代表直線段的端點,第二個參數稱為次數,指定平滑化曲線的量和類型。* 1 次的曲線沒有平滑化;它是一條聚合線。
2 次的曲線會平滑化讓曲線相交,而且會與聚合線線段的中點相切:
Dynamo 支援最高到 20 次的 NURBS (非均勻的有理 B 雲形線) 曲線,以下腳本說明增加平滑程度對曲線造型的影響:
請注意,至少要比曲線的次數多一個控制點。
透過控制頂點來建構曲線的另一個好處是,能夠在個別的曲線段之間維持相切。只要萃取出最後兩個控制點之間的方向,然後讓後續曲線的前兩個控制點繼續沿著此方向即可。以下範例會建立兩條獨立的 NURBS 曲線,不過這兩條曲線如一條曲線般平滑:
*這是一個非常簡化的 NURBS 曲線幾何圖形說明,如需更準確更詳細的討論,請參閱參考資料中的 Pottmann, et al, 2007。
計算設計中的物件很少會以其最終的位置和形狀明確建立,幾乎都是以既有的幾何圖形為基礎,將它們經過平移、旋轉,或以其他任何方式放在適當位置。向量數學是一種以幾何搭建鷹架的方式,對幾何圖形提供方向和方位,並且將整個 3D 空間的移動概念化而不提供視覺表現法。
從最基礎來說,一個向量代表 3D 空間中的一個位置,而且通常視為從位置 (0,0,0) 到該位置的一個箭頭終點。向量可以使用 ByCoordinates 建構函式建立,採用新建立的向量物件的 x、y、z 位置。請注意,向量物件不是幾何物件,不會出現在 Dynamo 視窗中。但是在主控台視窗中可以列印出新建立或修改過的向量的相關資訊:
向量物件定義了一組數學運算,讓您可以在 3D 空間中相加、相減、相乘,或以其他任何方式移動物件,就像您在 1D 空間中的數線上移動實數一樣。
向量相加是定義為兩個向量的分量總和,可以視為是兩個分量的向量箭頭以尖端接著尾端的方式放置而得到的向量。 向量相加是使用 Add 方法執行,以左圖表示。
同樣的,兩個向量物件可以使用 Subtract 方法相減。向量相減可以視為是從第一個向量到第二個向量的方向。
向量相乘可以視為將一個向量的終點沿著自己的方向移動給定的比例係數。
如果要調整一個向量的大小,讓產生的向量長度完全等於調整的量,就經常會這樣做。只要先將一個向量正規化,也就是將向量的長度設定為等於 1,就可以輕鬆達成目標。
c 還是指向與 (1, 2, 3) 相同的方向,但是現在長度等於 5。
向量數學中還有其他兩個與 1D 數學無關的方法,分別是外積和內積。外積是一種從兩個既有向量產生一個與這兩個向量成正交 (90 度) 的向量的方法。例如,x 軸和 y 軸的外積是 z 軸,不過兩個輸入向量不必然要互相正交。外積向量是透過 Cross 方法計算。
向量數學另外一個更進階的函數是內積。二個向量的內積是一個與兩個向量之間的角度有關但不是完全相同的一個實數 (不是 Vector 物件)。內積一個有用的性質是,如果兩個向量互相垂直,則兩個向量之間的內積將為 0。內積使用 Dot 方法計算。
您可能發現 Dynamo 中節點名稱有一個常見現象:每個節點都使用 . 語法而不含空格。這是因為每個節點頂部的文字都表示指令碼撰寫的實際語法,而 . (或 點標記法 ) 將元素與我們可能呼叫的方法分開。這樣可以從視覺指令碼輕鬆轉換為文字型指令碼。
如果將點標記法做一般的類比,在 Dynamo 中如何處理一個參數式蘋果呢?以下是我們在決定吃蘋果之前先對蘋果執行的一些方法。(注意:這些方法不是實際的 Dynamo 方法)。
人類用語 | 點標記法 | 輸出 |
---|---|---|
我不知道您覺得如何,但根據以上表格的輸出來判斷,這似乎是一個美味的蘋果。我認為我會執行 Apple.eat()。
記住蘋果的類比,我們來看看 Point.ByCoordinates,並示範如何使用程式碼區塊建立一個點。
在 Dynamo 中,程式碼區塊 語法 Point.ByCoordinates(0,10);
產生的結果與 Point.ByCoordinates 節點相同,只是我們可以使用一個節點來建立點。比起將不同節點連接至 X 與 Y,此方法更有效率。
在程式碼區塊中使用 Point.ByCoordinates,我們就是以內建節點 (X,Y) 的順序指定輸入。
您可以透過 Code Block 呼叫資源庫中的任何一般節點,只要該節點不是特殊的 「使用者介面」節點 (具有特殊的使用者介面功能) 即可。例如,您可以呼叫 Circle.ByCenterPointRadius,但是呼叫 Watch 3D 節點意義不大。
一般節點 (資源庫中的大多數節點) 通常分為三種類型。您會發現資源庫在組織時也考慮到了這些品類。在 Code Block 中呼叫時,對這三種類型方法 (或節點) 的處理方式不同。
建立 - 建立 (或建構) 項目
動作 - 對某項目執行動作
查詢 - 取得既有項目的性質
「建立」品類將從零開始建構幾何圖形。我們在程式碼區塊中以從左至右的順序輸入值。這些輸入的順序與節點中從上到下的輸入順序相同。
將 Line.ByStartPointEndPoint 節點與程式碼區塊中對應的語法做比較,可以獲得相同結果。
動作是您對該類型的物件執行的行為。Dynamo 使用許多程式語言中通用的 點標記法 對物件套用動作。確定物件後,輸入點,後接動作名稱。動作類型方法的輸入將放置在括號中,類似於建立類型的方法,只是您不必指定對應節點上看到的第一個輸入。我們改為指定執行動作時所依據的元素:
Point.Add 節點是動作類型節點,因此語法稍有不同。
輸入是 (1) point 以及要加上去的 (2) vector。在 Code Block 中,我們已將點 (物件) 命名為 pt。為了將命名為 vec 的向量加入 pt,我們會編寫 pt.Add(vec) 或採用「物件, 點, 動作」的格式。加入動作僅有一個輸入,也就是 Point.Add 節點的所有輸入減去第一個輸入。Point.Add 節點的第一個輸入是點本身。
查詢類型的方法會取得物件的性質。由於物件本身就是輸入,因此您不必指定任何輸入。不需要使用括號。
節點的交織與程式碼區塊的交織稍有不同。如果是節點,使用者會在節點上按一下右鍵,然後選取要執行的交織選項。如果是程式碼區塊,使用者對於資料的建構方式會有更多的控制。程式碼區塊速寫方法使用 複製指南 設定幾個一維清單應採用的配對方式。角括號 <> 中的數字定義所產生巢狀清單的階層:<1>、<2>、<3> 等。
在此範例中,我們使用速寫來定義兩個範圍 (本章的下一節將講述速寫的更多內容)。簡單來說,
0..1;
相當於{0,1}
,-3..-7
相當於{-3,-4,-5,-6,-7}
。結果將產生包含 2 個 x 值與 5 個 y 值的清單。如果我們不對這些不相符的清單使用複製指南,則會得到包含兩個點的清單,這是長度最短的清單。使用複製指南,我們可以找出 2 個座標與 5 個座標所有可能的組合 (即笛卡兒積)。使用語法 Point.ByCoordinates
(x_vals<1>,y_vals<2>);
,可以得到 兩個 清單,每個清單有 五個 項目。使用語法 Point.ByCoordinates
(x_vals<2>,y_vals<1>);
,可以得到 五個 清單,每個清單有 兩個 項目。
使用此標記法,我們也可以指定哪個清單佔優勢:2 個清單 (各包含 5 個項目) 還是 5 個清單 (各包含 2 個項目)。在此範例中,若變更複製指南的順序,結果將在格線中產生一列點清單或一欄點清單。
以上程式碼區塊方法可能花一點時間才能習慣,而 Dynamo 中提供稱為「要編碼的節點」功能,可以讓程序更輕鬆。若要使用此功能,請在 Dynamo 圖表中選取一系列節點,在圖元區上按一下右鍵,然後選取「要編碼的節點」。Dynamo 會將這些節點及所有輸入與輸出濃縮到一個程式碼區塊中!這不僅是一個強大的工具可學習程式碼區塊,也能讓您處理更高效的參數式 Dynamo 圖表。我們將使用「要編碼的節點」結束以下練習,因此請勿錯過。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
為了展示程式碼區塊的強大功能,我們要將既有的牽引欄位定義轉換為程式碼區塊形式。使用既有定義可示範程式碼區塊與視覺指令碼如何具有相關性,有助於學習 DesignScript 語法。
先重新建立以上影像中的定義 (或開啟範例檔案)。
請注意,Point.ByCoordinates 的交織已設定為 「笛卡兒積」。
格線中的每個點都會根據其與參考點的距離而沿著 Z 方向上移。
重新建立並增厚曲面,同時在幾何圖形上建立相對於距參考點距離的凸度。
從頭開始,我們先定義參考點:Point.ByCoordinates
(x,y,0);
我們使用的 Point.ByCoordinates 語法與參考點節點上方指定的語法相同。將變數 x 與 y 插入 Code Block,以便我們可以使用滑棒動態更新這些內容。
在 Code Block 的輸入加入一些 滑棒,範圍從 -50 到 50。這樣我們可以跨越整個預設 Dynamo 格線。
在 Code Block 的第二行,我們定義速寫以取代數字序列節點:
coordsXY = (-50..50..#11);
我們將在下一節詳細討論此內容。現在,請注意此速寫相當於視覺指令碼中的 Number Sequence 節點。
現在,我們將從 coordsXY 序列建立點的格線。為了執行此作業,我們要使用 Point.ByCoordinates 語法,但還需要使用我們在視覺指令碼中採用的方式,創造一個清單的 笛卡兒積。為了執行此作業,我們鍵入行:
gridPts = Point.ByCoordinates(coordsXY<1>,coordsXY<2>,0);
角括號表示笛卡兒積參考。請注意,在 Watch3D 節點中,我們有一個橫越 Dynamo 格線的點格線。
現在講解困難的部分:我們希望根據點距參考點的距離,將這些點的格線上移。首先,我們呼叫這一組新點 transPts。由於平移是針對既有元素的動作,因此我們不用
Geometry.Translate...
,而是使用gridPts.Translate
從圖元區上的實際節點,我們可以看到有三個輸入。要平移的 geometry 已經宣告,因為我們正對該元素執行動作 (使用 gridPts.Translate)。其餘兩個輸入將插入函數 direction 與 distance 的括號內。
direction 很簡單,我們使用
Vector.ZAxis()
垂直移動。參考點與每個格線點之間的距離仍需要計算,因此我們使用相同方式對參考點執行此動作:
refPt.DistanceTo(gridPts)
程式碼的最後一行得出平移後的點:
transPts=gridPts.Translate(Vector.ZAxis(),refPt.DistanceTo(gridPts));
我們現在已經有資料結構適當的點格線,可以建立 Nurbs 曲面。我們使用
srf = NurbsSurface.ByControlPoints(transPts);
建構曲面
最後,為了對取面增加一些深度,我們使用
solid = srf.Thicken(5);
建構實體。在此案例中,我們在程式碼中將曲面變厚了 5 個單位,不過也可以將其宣告為變數 (例如將其稱為 thickness),然後使用滑棒控制該值。
只需按一下按鈕,「要編碼的節點」功能即可自動執行我們剛剛完成的整個練習。這不僅在建立自訂定義及可重複使用的程式碼區塊時很有威力,也是瞭解如何在 Dynamo 中編寫指令碼非常有用的工具。
先使用練習的步驟 1 中使用的既有視覺指令碼。選取所有節點,在圖元區上按一下右鍵,然後選取 「要編碼的節點」。非常簡單。
Dynamo 已自動建立文字版本的視覺圖表、交織與全部項目。在您的視覺指令碼上試試看,體驗程式碼區塊的強大功能!
可以在程式碼塊中建立函數,然後在 Dynamo 定義中的其他位置重新呼叫函數。此作業會在參數式檔案中建立另一個控制層,可視為自訂節點的文字版本。在此案例中,「父系」程式碼區塊可隨時存取,可在圖表中的任何位置找到。無需使用線路!
第一行包含關鍵字「def」,然後依次是函數名稱與輸入的名稱 (在括號中)。大括號定義函數的本體。使用「return =」傳回值。定義函數的程式碼區塊沒有輸入或輸出埠,因為會從其他程式碼區塊呼叫。
使用同一檔案中的其他程式碼區塊,只需提供名稱與相同數量的引數即可呼叫函數。其工作方式類似於資源庫中的現成節點。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
在本練習中,我們將進行根據輸入點清單建立圓球的一般定義。這些圓球的半徑由每個點的 Z 性質驅動。
接下來先建立介於 0 到 100 之間的一系列十個值。將這些值插入 Point.ByCoordinates 節點,以建立對角線。
建立 Code Block 並介紹我們的定義。
使用以下程式碼行:
inputPt 是我們為了表示驅動函數的點而提供的名稱。到現在為止,函數不會執行任何作業,但我們將在後續步驟中建置此函數。
加入 Code Block 函數後,我們加上註解和 sphereRadius 變數,它會查詢每個點的 Z 位置。請記住,inputPt.Z 是一個方法,不需要括號。這是 查詢 既有元素的性質,因此不需要任何輸入:
現在,我們呼叫在另一個 Code Block 中建立的函數。如果在圖元區上按兩下以建立新的 Code Block,然後鍵入 sphereB,我們發現 Dynamo 建議使用我們定義的 sphereByZ 函數。您的函數已加入 intellisense 資源庫!太酷了。
現在,我們呼叫函數,並建立一個稱為 Pt 的變數以插入先前步驟中建立的點:
我們看到輸出全部都是空值。為何會發生這種情況?定義函數時,我們會計算 sphereRadius 變數,但沒有定義函數應 傳回 哪些項目做為 輸出。我們可以在下一步修正此問題。
我們需要在 sphereByZ 函數中加入
return = sphereRadius;
行定義函數的輸出,這是重要的步驟。現在,我們可以看到程式碼區塊的輸出提供每個點的 Z 座標。
現在,我們要編輯 父系 函數以建立實際的圓球。
我們首先使用以下程式碼行定義圓球:
sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);
接下來,我們將傳回值變更為 sphere,而不是 sphereRadius:
return = sphere;
這會在 Dynamo 預覽中產生一些巨大的圓球!
1.若要調整這些圓球的大小,我們加入圓規來更新圓球半徑值:
sphereRadius = inputPt.Z/20;
現在,我們可以看到分開的圓球,並開始了解半徑與 Z 值之間的關係。
在 Point.ByCoordinates 節點上,透過將交織從「最短清單」變更為「笛卡兒積」,我們建立點的格線。sphereByZ 函數仍完全有效,因此所有點會建立半徑以 Z 值為基礎的圓球。
為了進行測試,我們將原始數字清單插入 Point.ByCoordinates 的 X 輸入。我們現在有一個立方塊的圓球。
注意:如果在您的電腦上需要花很長時間執行此計算,請嘗試將 #10 變更為諸如 #5 等數字。
請記住,我們建立的 sphereByZ 函數是一般函數,因此可以回顧先前課程中的螺旋線,並對其套用函數。
最後一步:運用使用者定義的參數驅動半徑比。若要執行,我們需要為函數建立新輸入,並使用參數取代除數 20。
將 sphereByZ 定義更新為:
在輸入
sphereByZ(Pt,ratio);
中加入 ratio 變數以更新子系 Code Block。將滑棒插入新建立的 Code Block 輸入,並根據半徑比變更半徑的大小。
Dynamo 是 AEC 領域開始撰寫程式碼的絕佳之門。您可以從以下各節開始撰寫程式碼:
透過在三維空間中明確指出 x、y、z 座標,可以建立某些幾何圖形物件。但是,我們更常對物件本身或對其基本的 CoordinateSystem 使用幾何轉換,將幾何圖形移動到最終位置。
最簡單的幾何轉換是平移,亦即將一個物件沿著 x、y、z 方向移動指定的單位數。
在 Dynamo 中,雖然可以在物件名稱的結尾附加 .Translate 方法平移所有物件,但是還有更複雜的轉換需要將物件從一個基本的 CoordinateSystem 轉換到新的 CoordinateSystem。例如,若要讓物件繞 x 軸旋轉 45 度,我們要使用 .Transform 方法,將物件從其既有無旋轉的 CoordinateSystem,轉換到一個已經繞 x 軸旋轉 45 度的 CoordinateSystem:
除了平移和旋轉,也可以用調整比例或切變方式建立 CoordinateSystem。CoordinateSystem 可以使用 .Scale 方法調整比例:
在 CoordinateSystem 建構函式中輸入非正交的向量可以建立切變的 CoordinateSystem。
比起旋轉和平移,調整比例和切變是相對比較複雜的幾何轉換,所以並非每個 Dynamo 物件都能經過這些轉換。下表概述哪些 Dynamo 物件可以有非等比例調整的 CoordinateSystem,以及切變的 CoordinateSystem。
以下 Python 指令碼會為多個範例產生點陣列。請將這些指令碼貼至 Python Script 節點,如下所示:
python_points_1
python_points_2
python_points_3
python_points_4
python_points_5
到目前為止,許多範例都將重點放在從較低維度的物件建構較高維度的幾何圖形。交集的方法允許這種較高維度的幾何圖形產生較低維度的物件,而修剪和選取修剪的指令則允許腳本在建立幾何圖形後大幅修改幾何形狀。
Dynamo 針對所有幾何圖形都定義了 Intersect 方法,表示理論上,任何幾何圖形部分都可以與其他任何幾何圖形部分相交。某些交集本來就沒有意義,例如牽涉到點 (Point) 的交集,因為產生的物件永遠都是輸入點本身。下表概述物件之間其他可能的交集組合。下表概述各種交集運算的結果:
下面這個非常簡單的範例示範一個平面與一個 NurbsSurface 的交集。交集產生一個 NurbsCurve 陣列,可以像任何其他 NurbsCurve 一樣使用這個陣列。
Trim 方法與 Intersect 方法非常類似之處在於幾乎是針對每個幾何圖形定義。不過,Trim 的限制遠比 Intersect 還多。
請注意,Trim 方法一定要有「選取」點,這個點決定要捨棄哪個幾何圖形,要保留哪些部份。Dynamo 會找出並捨棄最接近選取點且經過修剪的幾何圖形。
NurbsCurve 的二維類比是 NurbsSurface,就像自由形式的 NurbsCurve,您可以使用兩種基本方法建構 NurbsSurface:一個是輸入一組基準點,讓 Dynamo 在這些點之間內插,另一個是明確指定曲面的控制點。就像自由形式的曲線,如果設計師很清楚知道要產生的曲面形狀,或如果設計需要曲面通過約束點,內插的曲面會很好用。相反地,如果是要探索各種平滑程度的設計,透過控制點建立的曲面就比較有用。
若要建立內插的曲面,只要產生一些近似曲面形狀的二維點即可。這些點必須是矩形,亦即不是鋸齒狀。NurbsSurface.ByPoints 方法會從這些點建構一個曲面。
指定曲面的基本控制點,也可以建立自由形式的 NurbsSurface。就像 NurbsCurve 一樣,控制點可以視為是代表一個有直線段的四邊形網格,這會根據曲面的次數,平滑化成最終的曲面形狀。若要使用控制點來建立 NurbsSurface,請在 NurbsSurface.ByPoints 中包含另外兩個參數,指出基本曲線在曲面兩個方向的次數。
我們可以增加 NurbsSurface 的次數,來變更產生的曲面幾何圖形:
就像我們可以在一組輸入點之間內插來建立 Surface,也可以在一組基準曲線之間內插來建立 Surface。這稱為斷面混成。使用 Surface.ByLoft 建構函式可以建立斷面混成的曲線,一組輸入曲線是唯一的參數。
迴轉的曲面是另外一種曲面類型,環繞一個中心軸掃掠一條基準曲線可以建立這種曲面。如果內插曲面是內插曲線的二維類比,則迴轉的曲面就是圓和弧的二維類比。
迴轉的曲面是由基準曲線 (代表曲面的「邊緣」)、軸原點 (曲面的基準點)、軸方向 (中央「核心」方向)、掃掠起始角度和掃掠結束角度指定。這些是用來做為 Surface.Revolve 建構函式的輸入。
Python 是使用廣泛的程式設計語言,其備受青睞與其語法樣式有很大關係。Python 的可讀性很高,因此較許多其他語言更容易瞭解。Python 支援模組與套件,可嵌入至既有應用程式中。如需如何正常使用 Python 的資訊, 上的 頁面是良好的資源。
為什麼要在 Dynamo 的視覺程式設計環境中使用文字程式設計?有許多優點。您可藉此在直覺的視覺介面中建立程式,不必學習特殊語法。但是,視覺程式可能會變得雜亂,有時會缺少功能。例如,Python 為編寫條件陳述式 (if/then) 及迴圈提供更容易達到目標的方法。Python 是功能強大的工具,可以延伸 Dynamo 的功能,您可藉此使用幾行簡潔的程式碼來取代許多節點。
視覺程式:
文字程式:
與程式碼區塊類似,Python 節點是視覺程式設計環境中的指令碼撰寫介面。Python 節點位於資源庫中的「Script」>「Editor」>「Python Script」下。
按兩下節點會開啟 Python Script 編輯器 (您也可以在節點上按一下右鍵,然後選取 「編輯...」 )。您會發現頂部有一些模板文字,目的是協助您參考您會需要的資源庫。輸入儲存於 IN 陣列中。為 OUT 變數指定值,值就會傳回到 Dynamo 中
這些方法包括建構函式 (例如 ByCoordinates)、動作 (例如 Add) 以及查詢 (例如 X、Y、Z 座標)。
按一下下方的連結下載範例檔案。
附錄中提供完整的範例檔案清單。
在此範例中,我們將編寫從實體模組建立樣式的 Python 指令碼,然後將其轉換為自訂節點。首先,使用 Dynamo 節點建立實體模組。
Rectangle.ByWidthLength: 建立將做為實體基礎的矩形。
Surface.ByPatch: 將矩形連接至 closedCurve 輸入以建立底部曲面。
Geometry.Translate: 將矩形連接至 geometry 輸入以將其上移,使用程式碼區塊指定實體的基礎厚度。
Polygon.Points: 查詢平移的矩形以擷取角點。
Geometry.Translate: 使用程式碼區塊建立對應到四個點的四個值清單,同時將實體的一個角點上移。
Polygon.ByPoints: 使用平移的點重新建構頂部多邊形。
Surface.ByPatch: 連接多邊形以建立頂部曲面。
現在我們已建立頂部與底部曲面,接下來在兩個輪廓之間進行斷面混成,以建立實體的側面。
List.Create: 將底部矩形與頂部多邊形連接至索引輸入。
Surface.ByLoft: 對兩個輪廓進行斷面混成,以建立實體的側面。
List.Create: 將頂部、側面與底部的曲面連接至索引輸入,以建立曲面清單。
Solid.ByJoinedSurfaces: 接合曲面以建立實體模組。
現在我們已建立實體,接下來將 Python Script 節點放入工作區。
若要在節點中加入其他輸入,請按一下節點上的「+」圖示。輸入命名為 IN[0]、IN[1] 等等,以指出它們代表清單中的項目。
我們先定義輸入與輸出。按兩下節點以開啟 python 編輯器。請依照下面的程式碼,在編輯器中修改程式碼。
在我們進行練習時,此程式碼會更容易理解。接下來,我們需要考慮需要哪些資訊以排列實體模組。首先,我們需要知道實體的標註,以確定平移距離。由於存在邊界框錯誤,我們不得不使用邊曲線幾何圖形來建立邊界框。
看一下 Dynamo 中的 Python 節點。請注意,我們使用的語法與 Dynamo 節點標題中的語法相同。查看下面加上註解的程式碼。
由於我們將平移並旋轉實體模組,因此接下來使用 Geometry.Transform 作業。看一下 Geometry.Transform 節點,我們知道需要來源座標系統與目標座標系統,以平移實體。來源是實體的關聯座標系統,而目標是所排列每個模組的不同座標系統。這表示我們必須循環使用 x 值與 y 值,以便每次以不同方式平移座標系統。
按一下「執行」,然後儲存程式碼。將 Python 節點與既有的指令碼連接,如下所示。
將 Solid.ByJoinedSurfaces 的輸出連接為 Python 節點的第一個輸入,並使用 Code Block 定義其他輸入。
建立 Topology.Edges 節點,並使用 Python 節點的輸出做為其輸入。
最後,建立 Edge.CurveGeometry 節點,並使用 Topology.Edges 的輸出做為其輸入。
請嘗試變更種子值以建立不同的樣式。您也可以變更實體模組本身的參數,以取得不同的效果。
現在我們已建立有用的 Python 指令碼,接下來將其另存成自訂節點。選取 Python Script 節點,在「工作區」上按一下右鍵,然後選取「建立自訂節點」。
指定名稱、描述與品類。
這會開啟一個新的工作區,可從中編輯自訂節點。
Input: 變更輸入名稱以更具描述性,然後加入資料類型及預設值。
Output: 變更輸出名稱
將節點儲存為 .dyf 檔案,您應該會看到自訂節點反映我們剛才所做的變更。
現在我們已經示範了如何在 Dynamo 中使用 Python 指令碼,接下來瞭解將 Revit 資源庫連接至指令碼撰寫環境。請記住,我們使用以下程式碼區塊的前四行匯入了 Python 標準和 Dynamo 核心節點。若要匯入 Revit 節點、Revit 元素及 Revit 文件管理員,我們只需再加入幾行程式碼:
這會提供 Revit API 的存取權,以及適用於 Revit 工作的自訂指令碼。透過合併視覺程式設計程序與 Revit API 指令碼,將大幅改進協同合作與工具開發。例如,BIM 管理員與線路圖設計者可以針對同一圖表進行合作。透過這種協同合作,他們可以改善模型的設計與執行。
建立新的 Revit 專案。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
在以下練習中,我們將探索 Dynamo for Revit 中的基本 Python 指令碼。此練習重點是處理 Revit 檔案及元素,以及 Revit 與 Dynamo 之間的通訊。
這是對連結至 Dynamo 階段作業的 Revit 檔案擷取 doc、uiapp 及 app 的現成方法。先前使用 Revit API 的程式設計人員可能會注意到觀看清單中的項目。如果對這些項目不熟悉,沒有問題,我們會在以下練習中使用其他範例。
以下將講述在 Dynamo 中如何匯入 Revit 服務及擷取文件資料。
看一下 Dynamo 中的 Python 節點。您也可以從下方找到程式碼:
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
在本練習中,我們將在 Revit 內使用 Dynamo Python 節點建立簡單的模型曲線。
首先,在 Revit 中建立新的概念量體族群。
開啟 「概念量體」資料夾,然後使用 公制量體.rft 樣板檔。
在 Revit 中,使用鍵盤快速鍵 un
帶出「專案單位」設定,將長度單位變更為公尺。
啟動 Dynamo,然後建立以下影像中的一組節點。我們先在 Revit 中從 Dynamo 節點建立兩個參考點。
建立 Code Block,提供
"0;"
的值將此值插入 ReferencePoint.ByCoordinates 節點做為 X、Y 與 Z 輸入。
建立三個滑棒,讓其範圍介於 -100 與 100 之間,且步長大小為 1。
將每個滑棒連接至 ReferencePoint.ByCoordinates 節點。
在工作區中加入 Python 節點,按一下節點上的「+」按鈕以加入另一個輸入,然後將兩個參考點插入每個輸入。開啟 Python 節點。
看一下 Dynamo 中的 Python 節點。在下方尋找完整的程式碼。
System.Array:Revit 需要一個系統陣列做為輸入 (而非 Python 清單)。這只是又一行程式碼,但注意引數類型將有助於在 Revit 中進行 Python 程式設計。
我們已在 Dynamo 中使用 Python 建立以直線連接的兩個參考點。接下來在下一個練習中更進一步。
按一下下方的連結下載範例檔案。
附錄中提供範例檔案的完整清單。
此練習仍很簡單,但講述了在 Revit 與 Dynamo 之間連接資料與幾何圖形的主題。我們從開啟 Revit-StructuralFraming.rvt 開始。開啟後,啟動 Dynamo,並開啟檔案 Revit-StructuralFraming.dyn。
此 Revit 檔案是一個非常基本的檔案。兩條參考曲線:一條繪製在 Level 1 上,另一條繪製在 Level 2 上。我們要將這些曲線匯入 Dynamo 並保持即時連結。
在此檔案中,我們將一組節點插入 Python 節點的五個輸入。
Select Model Element 節點: 按一下每個節點的選取按鈕,然後選取 Revit 中的對應曲線。
Code Block: 使用語法
0..1..#x;
, 將介於 0 與 20 之間的整數滑棒連接至 x 輸入。此作業會指定在兩條曲線之間繪製的樑數量。Structural Framing Types: 在此我們將從下拉式功能表中選擇預設的 W12x26 樑。
Levels: 選取「Level 1」。
此 Python 程式碼稍多一些,但程式碼中的註解描述程序的狀況
在 Revit 中,我們有一個跨越兩條曲線的樑陣列做為結構元素。注意:這不是真實範例...結構元素是用做從 Dynamo 所建立原生 Revit 例證的範例。
在 Dynamo 中也可以看到結果。Watch3D 節點中的樑是指從 Revit 元素查詢的幾何圖形。
請注意,我們有一套連續的程序,將資料從 Revit 環境轉換到 Dynamo 環境。總之,程序的工作方式如下:
選取 Revit 元素
將 Revit 元素轉換為 Dynamo 曲線
將 Dynamo 曲線分割為一系列 Dynamo 點
使用兩條曲線之間的 Dynamo 點建立 Dynamo 線
透過參考 Dynamo 線建立 Revit 樑
透過查詢 Revit 樑的幾何圖形,輸出 Dynamo 曲面
這聽上去可能有點笨拙,但指令碼可讓該作業非常簡單,只需在 Revit 中編輯曲線並重新執行解析器即可 (雖然在執行此作業時,您可能不得不刪除先前的樑)。這是因為我們是以 Python 放置樑,因此破壞了 OOTB 節點所擁有的關聯。
在 Revit 中更新參考曲線後,我們得到一個新的樑陣列。
Intersect、Trim 和 SelectTrim 主要是用在較低維度的幾何圖形 (例如點、曲線和曲面)。而立體幾何圖形則有額外的一組方法,可以透過類似 Trim 的方法減去材料,然後將元素合併在一起形成較大的元素,在建構幾何圖形後修改形狀。
Union 方法使用兩個實體物件,從兩個物件都涵蓋到的空間建立單一實體物件。物件之間重疊的空間會合併成最終的形狀。此範例將一個圓球和一個立方體合併成一個單一的立體圓球-立方塊造型:
Difference 方法與 Trim 類似,從基準實體減去輸入工具實體的內容。在此範例中,我們從一個圓球切掉一個小凹口:
Intersect 方法傳回兩個實體輸入之間重疊的實體。在以下範例中,Difference 已變成 Intersect,產生的實體是一開始切掉不見的空洞:
在 Dynamo 2.0 中,我們可以在第一次開啟 Python 視窗時,指定要使用的預設樣板 (.py extension)
。這是一個大家期待已久的功能,因為可以加快在 Dynamo 中使用 Python 的速度。使用樣板,可以讓我們在想要開發自訂 Python 指令碼時,有預設的匯入值可以隨時開始。
此樣板的位置位於 Dynamo 安裝的 APPDATA
位置。
這通常如下所示 ( %appdata%\Dynamo\Dynamo Core\{version}\ )
。
若要使用此功能,我們必須在 DynamoSettings.xml
檔案中加入下列一行。(以記事本編輯)
我們會在當中看到 <PythonTemplateFilePath />
,可以直接將它替換為以下內容:
注意:請使用您的使用者名稱替換 CURRENTUSER
接下來,我們需要建置一個樣板,當中含有我們要使用的內建功能。在此範例中,我們嵌入 Revit 相關的匯入,和一些在處理 Revit 時的其他典型項目。
您可以開啟一份空白的記事本文件,在當中貼上以下程式碼:
完成後,請在 APPDATA
位置將此檔案儲存為 PythonTemplate.py
。
定義 Python 樣板之後,每當放置了 Python 節點,Dynamo 都會尋找這裡。如果找不到,看起來就會是預設的 Python 視窗。
如果發現 Python 樣板 (例如我們的 Revit),您會看到您內建的所有預設項目。
您可以在下列位置找到有關此絕佳額外功能 (由 Radu Gidei 提供) 的其他資訊。https://github.com/DynamoDS/Dynamo/pull/8122
類別 | 非等比例調整的 CoordinateSystem | 切變的 CoordinateSystem |
---|
藉由 Autodesk.DesignScript.Geometry 資源庫,您可以使用與程式碼區塊類似的點標記法。如需有關 Dynamo 語法的更多資訊,請參閱 以及 (若要下載此 PDF 文件,請在連結上按一下右鍵,然後選擇「另存連結為...」)。鍵入幾何圖形類型 (例如「Point.」) 將顯示建立和查詢點的方法清單。
Dynamo 專案的潛在宗旨是拓寬平台的實作範圍。隨著 Dynamo 加入更多程式至事項表,使用者可以從 Python 指令碼撰寫環境存取平台特定 API。雖然在本節中只是對 Revit 進行案例研究,但我們可以預期在將來的更多章節中,會針對在其他平台撰寫指令碼提供全面的自學課程。此外,現在還可以存取許多 資源庫,您可以將這些資源庫匯入 Dynamo!
以下範例示範使用 Python 從 Dynamo 實作 Revit 特定作業的方式。若要更詳細地檢閱 Python 與 Dynamo 及 Revit 之間的關係,請參閱。Python 與 Revit 的另一項有用資源是 專案。
Arc | 否 | 否 |
NurbsCurve | 是 | 是 |
NurbsSurface | 否 | 否 |
Circle | 否 | 否 |
Line | 是 | 是 |
Plane | 否 | 否 |
Point | 是 | 是 |
Polygon | 否 | 否 |
Solid | 否 | 否 |
Surface | 否 | 否 |
Text | 否 | 否 |
使用: Point | Curve | Plane | Surface | Solid |
對: Curve | 是 | 否 | 否 | 否 | 否 |
Polygon | - | 否 | 是 | 否 | 否 |
Surface | - | 是 | 是 | 是 | 是 |
Solid | - | - | 是 | 是 | 是 |
蘋果的顏色是什麼?
Apple.color
紅色
蘋果成熟了嗎?
Apple.isRipe
true
蘋果有多重?
Apple.weight
6 盎司。
蘋果來自何處?
Apple.parent
樹
蘋果建立哪些項目?
Apple.children
種子
這個蘋果是本地生長的嗎?
Apple.distanceFromOrchard
60 英里。
與: | Surface | Curve | Plane | Solid |
Surface | Curve | Point | Point、Curve | Surface |
Curve | Point | Point | Point | Curve |
Plane | Curve | Point | Curve | Curve |
Solid | Surface | Curve | Curve | Solid |
計算設計中經常會使用曲線和曲面做為後續建構幾何圖形的基礎。為了讓這個早期的幾何圖形能夠做為後期幾何圖形的基礎,腳本必須要能夠萃取品質,例如物件整個區域的位置和方位。曲線與曲面兩種都支援這類萃取,這就是所謂的參數化。
一條曲線上所有的點都可以視為在 0 到 1 的範圍內具有唯一的參數。如果我們根據幾個控制點或內插點建立 NurbsCurve,第一個點的參數會是 0,最後一個點的參數會是 1。我們無法事先知道所有中間點的確切參數是多少,這聽起來像是很嚴重的限制,不過透過一系列的公用程式函數,這個狀況會減輕許多。曲面的參數化與曲線類似,但是有兩個分別稱為 u 和 v 的參數,而不是一個。如果我們要建立一個包含以下幾點的曲面:
p1 會有 u = 0 v = 0 的參數,p9 會有 u = 1 v = 1 的參數。
決定用來產生曲線的點時,參數化並不是特別好用,它的主要用途是決定由 NurbsCurve 和 NurbsSurface 建構函式所產生的中間點的位置。
曲線 (Curve) 有一個 PointAtParameter 方法,採用 0 到 1 之間的一個雙精確度引數,並傳回位於該參數的 Point 物件。例如,此腳本會找出參數 0、.1、.2、.3、.4、.5、.6、.7、.8、.9 和 1 的點 (Point):
同樣的,曲面 (Surface) 有一個 PointAtParameter 方法,採用兩個引數:產生的點的 u 和 v 參數。
在萃取曲線和曲面上的各個點時雖然很好用,但是腳本通常需要知道位於某個參數的特定幾何特性,例如曲線或曲面是朝向哪個方向。CoordinateSystemAtParameter 方法不只會找出位置,也會找出位於曲線或曲面的參數處有方向的 CoordinateSystem。例如,以下腳本會沿著一個迴轉的曲面 (Surface) 萃取出有方向的 CoordinateSystem,並使用 CoordinateSystem 的方位產生插在曲面法線方向上的線條:
如先前所述,參數化在整個曲線或曲面的長度不一定都是均勻的,這表示參數 0.5 不一定會永遠對應到曲線或曲面的中點,0.25 不一定會永遠對應到曲線或曲面四分之一的點。若要避開這種限制,曲線還有另外一組參數化指令,可讓您沿著曲線找出位於特定長度的點。