到此為止,我們用Dynamo實現(xiàn)的功能還和一個嵌套陣列族差不多。
不過,每次建立一個程序,我們都要思考,能不能再它的基礎上,用抽象思維去解決更多的事?
這個操作就叫異化。
比如這個案例,可以思考一下:能不能任意形狀都能自動生成?
這里我將把上面這個腳本做一種異化,修改為根據(jù)任意 N 條 Revit 中的線,生成自適應異形幕墻。
? 首先,在 Revit 中,使用模型線
工具繪制 4條 三維曲線
:
注意:這些線可以足夠異型,但不可以在同一標高上,這樣才能構(gòu)成正確的拓撲關(guān)系。
? 下面,我們在 Dynamo 中使用 Select Model Elements
節(jié)點,將這四條線由下至上(你看,順序真的很重要)選進 Dynamo 中。
? 接下來,再使用 Element.Geometry
的方式讓這些線在 Dynamo 中可見,且能被處理。
? 關(guān)于參數(shù)的設置,因為目前是弧線且不等長的緣故,再想讓嵌板數(shù)量
與嵌板長度
兼得可調(diào)是不可能了,所以我們可以僅要嵌板長度
這一個可調(diào)參數(shù)。
還沒完,嵌板數(shù)量
也是一個很重要的參數(shù),我們該怎樣獲取呢?
這時候就要請出高等數(shù)學了!
呃,是小學數(shù)學,就是取個平均值啦
? 先算出四條線的平均長度,再使用平均長度除以嵌板長度
,便是我們的嵌板數(shù)量
。可是由于這個值除出來之后很有可能是小數(shù),我們可以取最接近這個值的整數(shù),作為每條邊的嵌板數(shù)量
。
這一步是怎么來的呢?
你還需要明白一個重要知識點:樣條曲線的parameter
。
parameter
是把樣條曲線的起點值當作 0
,終點值當作 1
,不管樣條曲線多長,多曲折,都具有這樣的屬性。
比如,任何一條樣條曲線中點的 parameter
都為 0.5
,三分點無限趨近于 0.333 或 0.666。
知道了這樣的一個特性,那么我們想把一條樣條曲線均分為 嵌板個數(shù)
段,只要把 0 到 1 均分為長度為嵌板個數(shù)
的數(shù)組就好了。
使用 Code Block
代碼:
0..1..#steps
? 再將嵌板個數(shù)輸入進 steps
中,就做到了。
? 然后再使用針對樣條曲線的節(jié)點 Curve.PointAtParameter
獲得在這些值上的點,便得到了我們需要的點陣
。
? 有了這樣一個點陣
,便可以使用剛剛的 Python
代碼,把這些點處理為含有正確拓撲關(guān)系
的點組
。
剛剛編寫代碼的時候,是用的抽象方法,所以不用改一個字,就能直接讓新的腳本用上它,這就是抽象的好處。
? 最后使用 AdaptiveComponents.ByPoints
節(jié)點,就能在 Revit 中找到做好的嵌板了。
同樣,這個結(jié)果也是實時可調(diào)的,不過由于樣條曲線運算復雜,調(diào)整起來會有點卡。
我們把到此為止的成果儲存為「異化版.dyn」,下載鏈接見文末。
寫到這兒有點放飛自我了,差點把小姐姐最初的需求給忘了
之前我們實現(xiàn)的是方方正正的族和奇奇怪怪的族,而這個案例最終還要解決圖紙上窗戶族兩側(cè)的三角形。
實現(xiàn)它并不復雜,也就是兩端的點有些許偏移而已。
按照我們的順序,是第一塊嵌板的最后一點,與第最后一塊嵌板的第二點。
只需要在初始版成果的基礎上,加多兩個參數(shù):左端偏移
與右端偏移
就可以解決問題了。
? 先打開初始版.dyn
,加兩個參數(shù):
? 再回到我們第一次用 Python
處理完成之后的點組位置:
? 由于 Dynamo 自帶的節(jié)點更改數(shù)據(jù)十分麻煩,所以我們再請出 Python
寫一個腳本,修改目前點數(shù)組
中,第一組第4點,以及最后一組第2點的值,給它們做一個偏移。
Python代碼如下:(同樣,看不懂沒關(guān)系,看看藍字中文說明了解個大概)
# 啟用 Python 支持和加載 DesignScript 庫
import clr
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
# 該節(jié)點的輸入內(nèi)容將存儲為 IN 變量中的一個列表。
dataEnteringNode = IN
# 將代碼放在該行下面
__author__ = ‘Vctcn93’
__date__ = 20190706
__publisher__ = ‘ArchiPython’
data = IN[0] # 將剛剛的數(shù)據(jù),賦予到變量 data 中
left_offset = IN[1] # 左端偏移值
right_offset = IN[2] # 右端偏移值
point1 = data[0][3] # 拿取第一組最后一點的點坐標
point2 = data[-1][1] # 拿取最后一組第二點的點坐標
data[0][3] = Point.ByCoordinates(point1.X – left_offset, point1.Y, point1.Z) # 重新創(chuàng)造偏移后的點,取代原先的點
data[-1][1] = Point.ByCoordinates(point2.X + right_offset, point2.Y, point2.Z) # 重新創(chuàng)造偏移后的點,取代原先的點
# 將輸出內(nèi)容指定給 OUT 變量。
OUT = data # 輸出結(jié)果
在Dynamo里形成這樣一個腳本,它有IN[0]
、IN[1]
、IN[2]
三個預留的輸入,作用就是「輸入一組數(shù),然后修改其中的兩個,再輸出」。
隨后將我們原始點陣
連接到 IN[0]
; 左端偏移
連接到 IN[1]
; 右端偏
移連接到 IN[2]
。這樣就生成了我們所需要的新點陣
。
? 新點陣通過AdaptiveComponents.ByPoints
節(jié)點,輸入到 Revit 中,我們便得到了左端偏移
、右端偏移
、嵌板個數(shù)
、嵌板長度
、嵌板高度
,這五個數(shù)值可調(diào)的參數(shù)化構(gòu)件了。
我們把最終的成果儲存為「小姐姐版.dyn」,下載鏈接見文末。
Vctcn93的教程結(jié)束了,最后來給你總結(jié)一下,說說我們的觀點。
這個教程主要幫你梳理了三個知識點:
· 拓撲關(guān)系與自適應族的概念
· 樣條曲線的 Parameter
· 如何有效地使用 Python 為自己加速
打通了這幾個思路,再遇到類似的幕墻、描述規(guī)律等問題,都不再會是難點了,也為今后參數(shù)化設計打下堅實的基礎。
這也是他為之前在知乎上免費開源寫的一系列文章《Dynamo速成大法》填的一個坑。
說起這個系列,Vctcn93已經(jīng)停止更新了,原因是本來希望做開源分享的事。結(jié)果被人抄襲,還申請了原創(chuàng)保護,維權(quán)很難,Vctcn93一氣之下就把對方還沒來得及抄襲的內(nèi)容全刪了。
▲截圖隱掉部分不代表BOX觀點的內(nèi)容
侵權(quán)真的會讓人傷心的。
BIMBOX長期以來對版權(quán)非常重視,既不抄襲轉(zhuǎn)發(fā),也對抄襲者絕不姑息,加上我們有強大的小伙伴們長期幫忙投訴抄襲者,Vctcn93才愿意把這篇心血之作發(fā)布在這里。
大家最終看到的這篇東西,來自于社群里每一個人的高質(zhì)量提問、不撕逼的交流氛圍、對版權(quán)的共同維護、還有小伙伴們像朋友一樣的彼此信任。
謝謝大家了。
發(fā)文多了,我們也會經(jīng)常收到這樣的評論:「你的這個不行,XXX用XXX早就實現(xiàn)了?!?/span>
我們一般對這類回復的態(tài)度是不抬杠、也不理會。
原因并非因為他說的不對,而是我們覺得,人的表達分為兩種:
第一種是告訴你「這件事我知道」;第二種是「我想告訴給你,讓你也知道。」
高水平的人,也會有低水平的分享,而我們更關(guān)注「分享」的水平。
因此,我們踐行的始終是第二種表達方法。這也是從不轉(zhuǎn)發(fā)、對投稿審核極嚴的我們愿意精編和發(fā)布這篇文章的原因。
正如Vctcn93自己所說:拒絕嘴遁,從我做起。
學習今天的教程,關(guān)于Dynamo部分如果感覺有點吃力,可以知乎搜索(一怒斷更的)「Dynamo速成大法」,也可以支持一下Vctcn93與我們共同發(fā)布的視頻教程《Dynamo信息可視化腳本實戰(zhàn)》,里面有大量基礎知識給你學習。
如果對Python感興趣,想深入學習,知乎上搜索「九章Python」,是Vctcn93寫的入門學習教程。
最近群里也常聊Python和Dynamo,網(wǎng)上動輒100G的教程資料讓人望而卻步,我們正在和Vctcn93計劃,一起做一系列的好教程,留下最有用的東西,幫大家節(jié)省時間。
當然,也會收點費,畢竟——
今天的教程完全免費,建議收藏隨時看。Vctcn93做的三個Dynamo成果也免費分享給大家,下載地址:https://pan.baidu.com/s/1sSEfsQK_VVdFzk88RZgIsw
提取碼:z808
注:
· 本文章已經(jīng)Vctcn93授權(quán),對原稿中的文本、圖片做了精排和修改,在BIMBOX公眾號、知乎專欄、騰訊開放平臺、今日頭條等平臺發(fā)布。如需轉(zhuǎn)載,請聯(lián)系BIMBOX小編。
· 但請大家知悉主要原創(chuàng)工作為Vctcn93做出,本篇原創(chuàng)已授權(quán)Vctcn93在其個人名下的平臺號轉(zhuǎn)發(fā)。
· 所有經(jīng)過我們授權(quán)的平臺轉(zhuǎn)發(fā),會在文章底部顯示本文「轉(zhuǎn)發(fā)自公眾號BIM清流BIMBOX」的鏈接,各位小伙伴們看到善意轉(zhuǎn)載的不要投訴啦~