Dynamo應用秘籍:5:連綴作祟,慎用IF
當數據簡單時,連綴的變化影響不明顯,IF節點的表現會是非常自然的。但是當數據比較多,且數據結構比較複雜時,IF節點的輸出可能會是完全另外一幅樣子。下面我們先舉個例子來測試一下。
例如需要給軸網編號,我們直接構建了一個數字的和一個字母的列表,但是因為方案中水平和垂直軸網的數量不同,因此兩個表的長度不一樣,我們假定數字的軸號為1..15,字母的軸號為A..G。這樣我們在使用時需要判斷這一組軸網是水平的垂直的,因此我們會有一個數據列表,其中都是True或者False。跟我們的設定匹配,水平軸網應該有7個,垂直軸網應該有15個。我們通過直接構造True列表來傳給IF,看會發生什麼:
很明顯,無論我們傳遞含有15個True的列表,還是7個True的列表,最後的返回值只有7個,明顯是受制於True和False條件中長度最短的那個,即使我們把輸入改成一個單獨的True或者False,其返回值也一樣只有7個:
這就很明顯, IF是永遠按照兩個返回值的長度關係按照最短的連綴原則產生結果。再深入的測試還可以發現,如果返回值列表中還有子列表,其返回值在子列表的層級上也依然是相互對應按最短來取。因此在使用IF需要返回列表時,我們要非常小心,除非True/False兩種情況的返回值一一相互對應,否則及其容易造成數據丟失。尤其是圖NNN,按照自然的理解關係,需要True時返回15個數字而False時返回7個字母,但是因為傳入數據的長度問題,在需要數字時只能得到7個,丟失了大量的數據。
這個問題如何解決呢?有兩個方法:
- 強制匹配長度,保證True和Flase條件下的返回值都有對應關係。可以通過給短的列表增加null來增長到相互對應。
- 直接寫個Python Script,三個輸入埠與IF節點一致,裡面的內容也異常簡單:
import clrclr.AddReference(ProtoGeometry)from Autodesk.DesignScript.Geometry import *if IN[0]== True: OUT= IN[1]else: OUT=IN[2]
因為Python Script是不支持連綴的,通過這樣簡單的代碼處理,就可以解決單一層級True/False判斷時的數據對應問題。
這個方案也是Chynamo軟體包中SafeIF節點的核心。
連載鏈接:上一篇 << ooo >> 下一篇
推薦閱讀:
※不做什麼事情能讓BIM更順利實施?
※自學 Revit 需要一台什麼樣配置的電腦?
※為何沒有RevitServer2014的RSN.ini文件?
※建築設計學生和從業建築師一般用revit architecture 還是autocad(或天正)畫平立剖呢?
※Revit 的前景如何?
TAG:Dynamo | AutoDeskRevit | 参数化设计 |