Dynamo應用秘籍:3:理解關聯式語法

Dynamo內置的Design Script語言的語法採用了關聯式的設計,這是基於「迭代計算」的概念及「計算設計」的設計方法的需求而採用的,她在運行上有非常與眾不同的邏輯特性。在自然的邏輯上,都是有因才有果,因決定果。不過在關聯式的Dynamo中,卻和量子世界一樣,因果並不是自然邏輯的;同時Design Script也支持符合自然邏輯的運行模式,這種模式在Design Script中被定義成命令式(或者指令式)運行。

關於關聯式與命令式的區別,可以通過下面的算式簡單解析:A = B + C

對於這個算式,命令式的語法將主要記錄A的最終數據值,在這種情況下,修改A的數據只能在後繼的語句中再次定義A=XXXXX,而且,後面修改A並不會影響前面的A,也就是說,在不同語句行定義的A,其數據可以不一樣;而關聯式語法將主要記錄A所代表的B+C的關係,確定其數據值時,需要實時對關係進行運算。後繼B和C有任何的變化,都將影響A,而且是前面的A。所有的A,因為其函數關係是唯一的,其數據值也會是唯一的,而無論它出現在代碼的哪一行。

這也許不太好理解,那麼我們把語句再擴充一下:

1 B=5 C=32 A=B+C3 B=104 確定A=?

首先看看再命令式下,第二條語句的A是多少,A=5+3=8,那麼第四條語句的A是多少呢,非常明顯,A還是A,那個第二條語句的A,因此A依然=8。完美地符合日常及自然的邏輯。

但是在關聯式語法驅動下,情況就變了:第二條語句中,雖然表面上A=5+3=8,但是因為第三條語句的賦值已經導致A的數據會變化,因此其返回值會是根據最新輸入數據的運算結果,即為A=10+3=13;到了第四條語句,A依然為A=10+3=13

那麼在Dynamo程序中,關聯式又是如何表現這種混亂的因果呢?可以參考附圖看到:

在左側的例子中,兩行代碼的結果都是變數a,因為在同一個Code Block裡面,相同的變數名,無論出現前後,其輸出數據一定是一樣的。因此儘管代碼只是1到5的列表,但是因為後面的代碼已經修改了變數,相當於已經對變數進行了迭代的計算,這條語句將直接返回最終結果而非中間過程值。

關聯式語法的這個特徵不太符合自然邏輯,為避免在Design Script代碼程序的編寫過程中因為關聯語法而造成的程序結果數據偏差,可以使用以下兩種方式來控制:

1: 使用特定格式強制Design Script按照命令式格式來解釋運行代碼

這個特定的格式如下:

varname = [Imperative]{### Design Script Codes;return = XXXXX;}

在此格式內部的代碼,將全部按照命令式的方式運行。與之對應的,強制返回關聯式運行方式的特定格式為:

varname = [Associative]{### Design Script Codes;return = XXXXX;}

下面的代碼是很好的在命令式與關聯式之間進行切換:

cuboids = [Imperative]{c = {};cs = CoordinateSystem.Identity();c[0] = Cuboid.ByLengths(cs, 10, 10, 10);cs = cs.Translate(50, 0, 0);c[1] = Cuboid.ByLengths(cs, 10, 10, 10);rot = [Associative] {arr = 0..10;sqrts = Math.Sqrt(arr);return = Average(sqrts) * 40;}cs = cs.Rotate(rot, Vector.ByCoordinates(1, 1, 1));cs = cs.Translate(0, 50, 0);c[2] = Cuboid.ByLengths(cs, 10, 10, 10);return = c;}代碼摘自《DesignScript Language Manual》by Patrick Tierney

2: 避免使用變數的重複賦值定義

在這種情況下,避免出現同名變數的重複定義,即前面有了語句var=XXXX,後面不要再有var=YYYY。

連載鏈接:上一篇 << ooo >> 下一篇

推薦閱讀:

BIM一波流第十彈——利用dynamo自動放樁
BIM一波流第五彈——Civil3D導出橋樑數據到dynamo結合revit建模(一)

TAG:Dynamo | AutoDeskRevit | 参数化设计 |