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