其他賬號(hào)登錄: 注冊(cè) 登錄
柏慕聯(lián)創(chuàng)BIM技術(shù)服務(wù)

點(diǎn)亮建筑新夢(mèng)想

LIGHT BUILDING NEW DREAM

企業(yè)BIM定制培訓(xùn)服務(wù)經(jīng)典案例
柏慕聯(lián)創(chuàng)為中國(guó)電建集團(tuán)成都勘測(cè)設(shè)計(jì)研究院有限公司提供全國(guó)BIM技能等級(jí)考試考前專場(chǎng)培訓(xùn)(一)
柏慕聯(lián)創(chuàng)為中國(guó)電建集團(tuán)成都勘測(cè)設(shè)計(jì)研究院有限公司提供全國(guó)BIM技能等級(jí)考試考前專場(chǎng)培訓(xùn)(二)
柏慕聯(lián)創(chuàng)為中國(guó)電建集團(tuán)成都勘測(cè)設(shè)計(jì)研究院有限公司提供全國(guó)BIM技能等級(jí)考試考前專場(chǎng)培訓(xùn)(三)
柏慕聯(lián)創(chuàng)為中國(guó)電建集團(tuán)成都勘測(cè)設(shè)計(jì)研究院有限公司提供全國(guó)BIM技能等級(jí)考試考前專場(chǎng)培訓(xùn)(四)
柏慕聯(lián)創(chuàng)為中國(guó)電建集團(tuán)成都勘測(cè)設(shè)計(jì)研究院有限公司提供全國(guó)BIM技能等級(jí)考試考前專場(chǎng)培訓(xùn)(五)
柏慕聯(lián)創(chuàng)為成都建工一建提供第四期BIM項(xiàng)目深入實(shí)踐應(yīng)用培訓(xùn)班(一)
柏慕聯(lián)創(chuàng)為成都建工一建提供第四期BIM項(xiàng)目深入實(shí)踐應(yīng)用培訓(xùn)班(二)
柏慕聯(lián)創(chuàng)為成都建工一建提供第四期BIM項(xiàng)目深入實(shí)踐應(yīng)用培訓(xùn)班(三)
柏慕聯(lián)創(chuàng)為中冶建工集團(tuán)提供基于Dynamo的市政路橋隧解決方案專項(xiàng)定制培訓(xùn)(一)
柏慕聯(lián)創(chuàng)為中冶建工集團(tuán)提供基于Dynamo的市政路橋隧解決方案專項(xiàng)定制培訓(xùn)(二)
柏慕聯(lián)創(chuàng)為中冶建工集團(tuán)提供基于Dynamo的市政路橋隧解決方案專項(xiàng)定制培訓(xùn)(三)
柏慕聯(lián)創(chuàng)為海南生態(tài)軟件園集團(tuán)有限公司提供企業(yè)BIM基礎(chǔ)定制培訓(xùn)(一)
柏慕聯(lián)創(chuàng)為海南生態(tài)軟件園集團(tuán)有限公司提供企業(yè)BIM基礎(chǔ)定制培訓(xùn)(二)
柏慕聯(lián)創(chuàng)為海南生態(tài)軟件園集團(tuán)有限公司提供企業(yè)BIM基礎(chǔ)定制培訓(xùn)(三)
柏慕聯(lián)創(chuàng)為海南生態(tài)軟件園集團(tuán)有限公司提供企業(yè)BIM基礎(chǔ)定制培訓(xùn)(四)
柏慕聯(lián)創(chuàng)為海南生態(tài)軟件園集團(tuán)有限公司提供企業(yè)BIM基礎(chǔ)定制培訓(xùn)(五)
柏慕聯(lián)創(chuàng)為中南建筑設(shè)計(jì)院股份有限公司提供2021年新員工入職BIM定制培訓(xùn)(線上/線下)(一)
柏慕聯(lián)創(chuàng)為中南建筑設(shè)計(jì)院股份有限公司提供2021年新員工入職BIM定制培訓(xùn)(線上/線下)(二)
柏慕聯(lián)創(chuàng)為中南建筑設(shè)計(jì)院股份有限公司提供2021年新員工入職BIM定制培訓(xùn)(線上/線下)(三)
柏慕聯(lián)創(chuàng)為中南建筑設(shè)計(jì)院股份有限公司提供2021年新員工入職BIM定制培訓(xùn)(線上/線下)(四)

BIMBOX | 自動(dòng)批量建族?nèng它!

 二維碼
作者:BIMBOX來(lái)源:BIMBOX網(wǎng)址:https://bimbox.top/3901.html

你好,這里是BIMBOX。

今天是臨時(shí)加餐,分享一個(gè)很有意思的教程給你,是我們和一位小伙伴兩個(gè)通宵的成果。

它能解決一個(gè)很麻煩的問(wèn)題,更重要的是它能啟發(fā)大家的思路:怎樣用盡量簡(jiǎn)單的自動(dòng)化,幫助我們?nèi)プ瞿切┲貜?fù)枯燥的工作。

事情的緣由是這樣的。

還記得@Vctcn93嗎?那個(gè)跟我們一起合作,出了《Dynamo信息可視化腳本實(shí)戰(zhàn)》的Dynamo小神仙。

最近他一直在琢磨怎么通過(guò)Python編程和Dynamo帶來(lái)更高的生產(chǎn)力,也經(jīng)常在群里和大家探討,回答教程問(wèn)題,已經(jīng)成了群寵。

上周三,在我們的BIMBOX萊茵河清流群里,小伙伴@Null提問(wèn),對(duì)于大量形狀類似、尺寸不同的族,有沒有辦法快速的建出來(lái)。

Vctcn93回答說(shuō),生成多個(gè)類似的族是有規(guī)律的,可以用Dynamo來(lái)實(shí)現(xiàn)。也有小伙伴提出,可以通過(guò)參數(shù)化建族來(lái)搞定,但用Dynamo能打開更多的思路。

于是,Vctcn93就和Null要來(lái)了圖紙,答應(yīng)大家周末抽空把節(jié)點(diǎn)和教程給寫出來(lái)。

不過(guò),在叫了對(duì)方好幾聲哥們之后,經(jīng)@開開提醒,Null是女生,事情的發(fā)展又比預(yù)想的迅猛很多

周六一早,我就收到了Vctcn93的微信,一看時(shí)間是凌晨五點(diǎn)發(fā)來(lái)的。本來(lái)答應(yīng)周末慢慢搞的事,居然搞了個(gè)通宵。

盡管他和我說(shuō),主要是因?yàn)楸緛?lái)覺得很簡(jiǎn)單的一個(gè)腳本,越琢磨越有意思,好玩的知識(shí)點(diǎn)很多,于是越寫越興奮,這才搞了8個(gè)小時(shí)。

但我還是不相信,這和對(duì)方是個(gè)妹子沒關(guān)系。

咳咳。Anyway,Vctcn93找到我,說(shuō)他覺得挖出來(lái)的知識(shí)點(diǎn)很有趣,單獨(dú)發(fā)群里有點(diǎn)浪費(fèi),問(wèn)我是否愿意發(fā)文分享給大家。

我問(wèn)他,這個(gè)教程你想收費(fèi)嗎?

他不好意思地說(shuō):「等我出大點(diǎn)的教程吧,畢竟我也窮。不過(guò)這個(gè)教程挺小的,等我異化出更牛逼的東西來(lái),再做成視頻教程。」

我仔細(xì)看了一下他的思路,確實(shí)很有啟發(fā)。于是答應(yīng)下來(lái),拿出時(shí)間把他的思路和成果整理成大家更容易閱讀的文章,免費(fèi)分享給所有人看。

這份教程中涉及到一些Dynamo的基礎(chǔ)知識(shí),以及幾段Python代碼,如果你暫時(shí)搞不明白原理,也不影響閱讀今天的文章,我們會(huì)在代碼處加入中文說(shuō)明。

暫時(shí)不想做,也可以花十幾分鐘讀一遍,重點(diǎn)看看思路,領(lǐng)略一下Dynamo和Python的自動(dòng)化之美,以及用自動(dòng)化解決重復(fù)問(wèn)題時(shí)那種靈光乍現(xiàn)的酸爽。

如果你希望徹底搞明白背后的原理,我們會(huì)在文末給出更詳細(xì)的學(xué)習(xí)鏈接,以及我們與Vctcn93的分享計(jì)劃。還有,我們送出的三瓶紅酒。

下面正式開始——

01 自適應(yīng)族的拓?fù)潢P(guān)系


首先你需要掌握一點(diǎn)基礎(chǔ)知識(shí)。

Revit 中有一個(gè)十分強(qiáng)大族類型——自適應(yīng)構(gòu)件(Adaptive Component),一般多用于處理幕墻相關(guān)的問(wèn)題。

我們先到 Revit 中制作一個(gè)簡(jiǎn)單的自適應(yīng)族,來(lái)搞清楚自適應(yīng)構(gòu)件的原理。

? 打開 Revit 2018,新建一個(gè) 自適應(yīng)構(gòu)件 族。

? 在面板中找到 點(diǎn)圖元 工具,并且添加四個(gè)點(diǎn)。

? 全選點(diǎn),然后點(diǎn)擊上部面板下的 使之自適應(yīng) 按鈕。

它們就變成了這個(gè)樣子:

? 使用線工具,并打開 三維捕捉。

? 依照 點(diǎn) 上方的序號(hào)(index),依次鏈接各點(diǎn)。

? 選中全部的線,點(diǎn)擊 創(chuàng)建實(shí)體形狀。

這時(shí),我們就成功創(chuàng)建了一個(gè)簡(jiǎn)單的 自適應(yīng)嵌板。

左側(cè)的屬性欄可以調(diào)整厚度。

? 保存一下,新建一個(gè)項(xiàng)目,把建立的族加載進(jìn)項(xiàng)目中,只要給定任意的四個(gè)點(diǎn)(按順序點(diǎn)擊四下),就能得到依照點(diǎn)生成的嵌板。

以上就是制作一個(gè)簡(jiǎn)單自適應(yīng)族的過(guò)程。

想要弄清楚點(diǎn)擊四下的時(shí)候發(fā)生了什么,我們先要了解一個(gè)圖形學(xué)名詞 ——拓?fù)潢P(guān)系(Topological Relation)

拓?fù)潢P(guān)系是圖形學(xué)中的常用概念,本質(zhì)就是把各種圖形,抽象簡(jiǎn)化為各個(gè)點(diǎn)之間的關(guān)系。有了這些基本的關(guān)系,我們則不需要在乎它繪制出來(lái)究竟是什么形狀。

比如正方形、梯形、四邊形、菱形等等,盡管在形狀上有很多不同,但是在拓?fù)涞囊暯强?,這些點(diǎn)都滿足依次使點(diǎn)成環(huán)的關(guān)系,它們是拓?fù)涞葍r(jià)的

我們?cè)谥谱?自適應(yīng)族構(gòu)件的過(guò)程中,有一個(gè)重點(diǎn)操作叫使之自適應(yīng),它的作用是記錄各個(gè)點(diǎn)的位置、順序、誰(shuí)與誰(shuí)相連等拓?fù)潢P(guān)系

這時(shí)每個(gè)點(diǎn)都會(huì)生成一個(gè)序號(hào),它將記錄自己在這一拓?fù)潢P(guān)系中的順序。

當(dāng)我們使用線將各個(gè)點(diǎn)連接起來(lái)的時(shí)候,這個(gè)點(diǎn)就會(huì)記錄下另外哪兩個(gè)點(diǎn)和自己相連,而它不會(huì)在乎這兩個(gè)點(diǎn)在空間中的什么位置。

這些順序和連接關(guān)系就是預(yù)先保留在族里的默認(rèn)信息

我們?cè)谑褂眠@個(gè)族的時(shí)候,點(diǎn)擊四下,這個(gè)操作是告訴Revit預(yù)先設(shè)定的四個(gè)點(diǎn)的空間坐標(biāo),它們是我們使用族的輸入信息

族在項(xiàng)目里最終呈現(xiàn)什么狀態(tài),就是下面的公式:

族的輸出狀態(tài)=預(yù)設(shè)定默認(rèn)信息+使用時(shí)的輸入信息

而我們想要讓族「自動(dòng)化」,就是盡量多的解決默認(rèn)信息,從而減少輸入信息的工作量。

在這個(gè)族里,輸入信息的重點(diǎn)在于順序,它決定了點(diǎn)的序號(hào),決定了誰(shuí)去找誰(shuí)連線,決定了拓?fù)潢P(guān)系,從而決定了最終的形狀。

想讓 Dynamo 來(lái)代替我們放正確的 自適應(yīng)族 的時(shí)候,一定要保證輸入的點(diǎn)順序是正確的。

02 Dynamo中的強(qiáng)大節(jié)點(diǎn)


在 Dynamo 中,有一個(gè)使用自適應(yīng)族的強(qiáng)大節(jié)點(diǎn):

AdaptiveComponents.ByPoints

這個(gè)節(jié)點(diǎn)有兩個(gè)輸入,第一個(gè)是points , 一個(gè)二維數(shù)組的點(diǎn)。

第二個(gè)是familyType ,它是自適應(yīng)族的類別

結(jié)合我們剛剛所學(xué)的拓?fù)潢P(guān)系知識(shí),我們來(lái)模擬與理解一下這個(gè)節(jié)點(diǎn)的輸入要求

假設(shè)我們有一個(gè)需要四個(gè)點(diǎn)生成的自適應(yīng)嵌板,則我們先來(lái)模擬建立點(diǎn)的二維數(shù)組,下面的代碼你不懂python也能大概看懂:

points = [

    [

        Point.ByCoordinates(0, 0, 0),

        Point.ByCoordinates(1000, 0, 0),

        Point.ByCoordinates(1000, 1000, 0),

        Point.ByCoordinates(0, 1000, 0)

    ],

    [

        Point.ByCoordinates(1000, 0, 0),

        Point.ByCoordinates(2000, 0, 0),

        Point.ByCoordinates(2000, 1000, 0),

        Point.ByCoordinates(1000, 1000, 0)

    ],

    [

        Point.ByCoordinates(2000, 0, 0),

        Point.ByCoordinates(3000, 0, 0),

        Point.ByCoordinates(3000, 1000, 0),

        Point.ByCoordinates(2000, 1000, 0)

    ]

];

這段代碼,Dynamo 中的 CodeBlockPython 都可以直讀,結(jié)果會(huì)生成一個(gè) 點(diǎn)陣(Points Array)

在上面的 points數(shù)組(List)中,每一個(gè)元素都是一個(gè)小數(shù)組,每個(gè)小數(shù)組里又包含了四個(gè)點(diǎn)。

這四個(gè)點(diǎn),就是我們所需要每生成一塊嵌板所需要的點(diǎn),點(diǎn)的順序則是我們?cè)?Revit 界面中放置嵌板的點(diǎn)擊順序。

我們把數(shù)據(jù)點(diǎn)陣和族類型Family Types連接到AdaptiveComponents.ByPoints這個(gè)節(jié)點(diǎn)上。

依照上面的點(diǎn)數(shù)據(jù),Dynamo 便會(huì)依照每一個(gè)嵌板的輸入點(diǎn),生成 3個(gè) 自適應(yīng)嵌板。在Dynamo 中看不見族的加載結(jié)果,我們得切換回 Revit 界面中才能看到。

有多少個(gè) points 數(shù)據(jù),將決定我們生成多少塊玻璃嵌板,嵌板中的點(diǎn),即是嵌板的拓?fù)潢P(guān)系,Dynamo 將根據(jù)這四個(gè)點(diǎn)的位置順序,把嵌板放進(jìn)去。

這就是在AdaptiveComponents.ByPoints節(jié)點(diǎn)中發(fā)生的事情,也是 Dynamo 要求輸入這種數(shù)據(jù)結(jié)構(gòu)的原因。

順序非常關(guān)鍵。

正確地抽象我們要的形狀,把抽象所得的點(diǎn)正確地排序與組合,是我們?cè)谑褂眠@個(gè)節(jié)點(diǎn)之前的關(guān)鍵操作。

03 解決問(wèn)題


@Null在群里的問(wèn)題是,怎樣建出多個(gè)形狀類似的窗族。

為了降低難度,我將把她的圖簡(jiǎn)化為方方正正的矩形,制作的時(shí)候也先暫時(shí)忽略尺寸,我們需要根據(jù)這個(gè)矩形,來(lái)運(yùn)用一下剛剛所學(xué)到的東西。

? 制作Dynamo腳本之前,我們需要先思考一下:

· 我想要那些參數(shù)?

· 未來(lái)能否擴(kuò)充與異化?

· 是否有優(yōu)化效率的可能?

先來(lái)看第一個(gè)問(wèn)題,對(duì)于這個(gè)簡(jiǎn)化版的腳本,我需要的參數(shù)是:

· 每塊面板的長(zhǎng)度

· 每塊面板的高度

· 面板的數(shù)量

? 這些參數(shù)當(dāng)然不能一個(gè)個(gè)手動(dòng)輸入,所以在一開始,我們就把這三個(gè)參數(shù)做成 Number Slider 節(jié)點(diǎn),放置到界面的最左邊,把它們重命名,并編組為 參數(shù)調(diào)節(jié)

這里需要注意兩點(diǎn):

· 單位是毫米,所以面板長(zhǎng)度面板高度間距(step)最好以 100 為基準(zhǔn)單位。

· 嵌板的個(gè)數(shù)必須是整數(shù),所以面板個(gè)數(shù)間距(step)一定要是整數(shù)。

? 下面,我們需要一個(gè)原點(diǎn)(origin),作為面板的起始位置,在這里我將使用 (0,0,0)點(diǎn),你也可以設(shè)置其它原點(diǎn)。

? 接下來(lái),我們要依照給定的面板長(zhǎng)度以及面板數(shù)量,生成一個(gè)以面板長(zhǎng)度間距(step),以面板數(shù)量為個(gè)數(shù)的數(shù)組(list),創(chuàng)造需要用到的第一組點(diǎn)。

此處使用 Code Block 代碼來(lái)完成:

0..#quentity..#step

? 然后把面板長(zhǎng)度面板個(gè)數(shù)分別輸入到stepquentity兩個(gè)輸入之中,便可生成第一個(gè)數(shù)組,也就是未來(lái)各點(diǎn)的 x 坐標(biāo)值

? 有了各點(diǎn)的 x 坐標(biāo)值,我們便可以使用 Geometry.Translate 節(jié)點(diǎn),把原點(diǎn)按照坐標(biāo)批量生產(chǎn)。

? x軸方向搞定后,接下來(lái)以同樣的方法,把這條線上的點(diǎn),依照嵌板高度,在 y 方向上做條一模一樣的出來(lái):

到此為止,我們便制作了一個(gè)參數(shù)化、實(shí)時(shí)可調(diào)的點(diǎn)陣(Points Array)。

? 接下來(lái)要做的就是要把生成的點(diǎn)陣,處理為一個(gè)按照順序、包含正確拓?fù)潢P(guān)系二維數(shù)組。

根據(jù)我們前面說(shuō)的拓?fù)渲R(shí),輸入進(jìn) AdaptiveComponents.ByPoints 節(jié)點(diǎn)中的點(diǎn)順序,一定要正確反應(yīng)嵌板的拓?fù)潢P(guān)系。

比如我在使用Revit建立嵌板族的時(shí)候,點(diǎn)擊的順序是從左下角開始逆時(shí)針旋轉(zhuǎn):

所以,我們的點(diǎn)組順序,也要按照這樣的方式排列:(注意Dynamo第一個(gè)點(diǎn)的序號(hào)是0而不是1)。

我們將剛剛生成的兩組點(diǎn),使用 List.Create 節(jié)點(diǎn)打包為一組數(shù)據(jù)。這樣,就可以使用 Python 處理我們的點(diǎn)陣了。

? 接下來(lái)就是Python 數(shù)據(jù)處理。

當(dāng)然,到這一步不使用Python也可以使用,但回顧一下我們開始寫腳本之前思考的第二個(gè)問(wèn)題:

· 我想要那些參數(shù)?

· 未來(lái)能否擴(kuò)充與異化?

· 是否有優(yōu)化效率的可能?

雖然目前我們的數(shù)據(jù)很少、也很具體:兩條線,每條線幾十個(gè)點(diǎn),我們可以用簡(jiǎn)單的代碼把它寫出來(lái)。但是,為了日后的擴(kuò)充與異化,我們一定要把代碼進(jìn)一步處理成代數(shù)問(wèn)題,把它抽象成 m 條線,每條線 n 個(gè)點(diǎn)。

在這種思路下,我們來(lái)開始寫下面的腳本。這里有點(diǎn)燒腦,看不懂代碼沒關(guān)系,藍(lán)色的字是中文代碼說(shuō)明:

# 啟用 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 中

result = list()   # 創(chuàng)建一個(gè)用以裝載結(jié)果的空列表

for i in range(len(data) – 1):   # 遍歷每條線

    current_line = data[i]   # 當(dāng)前的線

    next_line = data[i + 1]   # 下一條線

    for k in range(len(current_line) – 1):   # 拿取線上的每一個(gè)點(diǎn)

        node = list()   # 嵌板點(diǎn)組

        node.append(current_line[k])   # 添加第 0 號(hào)點(diǎn)

        node.append(current_line[k + 1]) # 添加第 1 號(hào)點(diǎn)

        node.append(next_line[k + 1])   # 添加第 2 號(hào)點(diǎn)

        node.append(next_line[k])   # 添加第 3 號(hào)點(diǎn)

        result.append(node)   # 把嵌板點(diǎn)組添加到結(jié)果中

# 將輸出內(nèi)容指定給 OUT 變量。

OUT = result   # 輸出結(jié)果

搞定之后,就可以在Dynamo中使用以上代碼,把點(diǎn)陣處理清楚了。

? 最后使用AdaptiveComponents.ByPoints 節(jié)點(diǎn),在 Revit 中成功生成玻璃嵌板:

? 再來(lái)測(cè)試一下參數(shù)實(shí)時(shí)調(diào)整,所以依據(jù)面板長(zhǎng)度面板高度、面板個(gè)數(shù)幾個(gè)參數(shù)的不同,可以有很多的結(jié)果,并且可實(shí)時(shí)變化:

我們把到此為止的成果儲(chǔ)存為「初始版.dyn」,下載鏈接見文末。

03 異化


到此為止,我們用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」,下載鏈接見文末。

04 小姐姐的需求


寫到這兒有點(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)載的不要投訴啦~

會(huì)員登錄
登錄
其他賬號(hào)登錄:
我的資料
留言
回到頂部