亚洲天堂高清一二三,久久久久久久久久性生活,精品国产污污免费网站AⅤ,色橹橹欧美在线观看视频高清

解析3D打印切片軟件Cura及CuraEngine原理 

2016-02-21 09:44
本文由磐紋科技(上海)有限公司軟件大牛潘敬華撰寫(xiě),磐紋科技國(guó)內(nèi)致力于擁有自主知識(shí)產(chǎn)權(quán)的3D打印企業(yè),擁有強(qiáng)大的硬件及軟件開(kāi)發(fā)能力,運(yùn)動(dòng)控制摒棄開(kāi)源,軟件自主開(kāi)發(fā)。

引言

        年初開(kāi)始進(jìn)入3D打印行業(yè),受命以Cura為基礎(chǔ),研發(fā)一款自主的3D打印切片軟件。
        自主研發(fā)要取其長(zhǎng)處,補(bǔ)其不足,首先自然是要搞清楚Cura到底做了什么,讀Cura的代碼是必需的。我一向都覺(jué)得比起自己寫(xiě)代碼來(lái),讀別人的代碼是一個(gè)漫又而痛苦的過(guò)程,讀者的思想與寫(xiě)者總有偏差,往往又無(wú)法驗(yàn)證自己的猜想是否正確,只嘆人腦不是電腦,無(wú)法把眼前的代碼從頭到尾執(zhí)行一遍。不知道各位資深程序會(huì)有什么辦法,我的辦法是“翻譯”,看著別人寫(xiě)的代碼,加上自己的理解之后,按自己的喜好重新寫(xiě)出來(lái),看一段翻譯一段,等全部翻譯完成,理論上作者的思路也明白了,同時(shí)還有了一份功能一模一樣的代碼,自己的理解是否正確,也可以通過(guò)執(zhí)行“翻譯”出來(lái)的代碼驗(yàn)證。

        計(jì)劃總是美好的,中間的工程確總是充滿變數(shù),之間的曲折折疊不說(shuō)。經(jīng)過(guò)若干次推倒重寫(xiě),勉強(qiáng)算是有了一份自己的切片軟件,又經(jīng)過(guò)了半年的推敲摸索以及打印經(jīng)驗(yàn)積累,一個(gè)還算另自己滿意的切片軟件最終誕生。起名Pango,先觀大略。

        Pango的介紹和說(shuō)明先按下不表,以會(huì)有機(jī)會(huì)另外發(fā)文詳述。

        在Pango的開(kāi)發(fā)過(guò)程中,我對(duì)于Cura的理解也日益深入。時(shí)至今日,我也有了信心可以把我的這些經(jīng)驗(yàn)、理解和心得分享出來(lái),供大家參詳一二,若能對(duì)后來(lái)的Cura研究者有所助益,那是再好不過(guò)。


144102dola0zmssjrvrloo.png



Cura的架構(gòu)

        Cura是一個(gè)python語(yǔ)言實(shí)現(xiàn),使用wxpython圖形界面框架的3D打印切片界面軟件,說(shuō)它是界面軟件是因?yàn)镃ura本身并不會(huì)進(jìn)行實(shí)際的切片操作。實(shí)際的切片工作是由另外一個(gè)C++語(yǔ)言實(shí)現(xiàn)的CuraEngine命令行軟件來(lái)具體負(fù)責(zé)的,用戶在Cura提供的界面上的絕大多數(shù)操作如加載模型、平穩(wěn)旋轉(zhuǎn)縮放、參數(shù)設(shè)置等最終會(huì)轉(zhuǎn)換成并執(zhí)行一條CuraEngine命令;CuraEngine把輸入的STL、DAE或OBJ模型文件切片輸出成gcode字符串返回給Cura;Cura再把gcode在3D界面上可視化成路徑展現(xiàn)給用戶。

        我主要參考的代碼是CuraEngine,本文主要篇幅也會(huì)放在CuraEngine上。而Pango的界面代碼就主要靠我自己發(fā)揮了。

        Cura和CuraEngine都可以Github上找到,地址:
        https://github.com/daid/Cura
         https://github.com/Ultimaker/CuraEngine

         我所參考的版本是15.04,15.06之后Cura和CuraEngine都有較大的改動(dòng),但核心思想沒(méi)變。所以本文分析的代碼也到15.04為止。

        言歸正傳,下面我們將開(kāi)始一步一步揭開(kāi)CuraEngine把一個(gè)模型文件轉(zhuǎn)換成為gcode的過(guò)程。

切片流程概述
        從總體上講,CuraEngine的切片分為五個(gè)步驟:

步驟一:模型載入
        有一點(diǎn)3D編程經(jīng)驗(yàn)的人都知道,計(jì)算機(jī)中的3D模型大多是以三角形面組合成的表面所包裹的空間來(lái)表示的。三角形作為3D模型的基本單元,有結(jié)構(gòu)簡(jiǎn)單,通用性強(qiáng),可組合成任意面的特點(diǎn);空間坐標(biāo)中只要三個(gè)點(diǎn)就可以表示一個(gè)唯一的三角形,兩點(diǎn)只能表示一條直線,而再多的直線也無(wú)法組成一個(gè)平面;空間中的任意三個(gè)不共線的點(diǎn)都可以組成一個(gè)三角形,而四個(gè)點(diǎn)所組成的四邊形就必需要求四點(diǎn)共面;任意的表面都可以拆解成三角形,一個(gè)四邊形可以拆解成兩個(gè)三角形,但一個(gè)三角形確沒(méi)有辦法用四邊形組合而成。計(jì)算機(jī)所擅長(zhǎng)的事情就是把簡(jiǎn)單的事情不斷重復(fù),而三角形正是因?yàn)檫@些特性,成為了計(jì)算機(jī)3D世界的基石。

        CuraEngine內(nèi)部也是用三角形組合來(lái)表示模型的,不過(guò)同樣一個(gè)三角形組合,確有無(wú)窮多種數(shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)行存儲(chǔ),CuraEngine切片的第一步,就是從外部讀入模型數(shù)據(jù),轉(zhuǎn)換成以CuraEngine內(nèi)部的數(shù)據(jù)結(jié)構(gòu)所表示的三角形組合。

        有了三角形組合還不夠,CuraEngine在載入模型階段還要對(duì)三角形進(jìn)行關(guān)聯(lián)。兩個(gè)三角形共有一條邊的,就可以判斷它們?yōu)橄噜徣切?,一個(gè)三角形有三條邊,所以最多可以有三個(gè)相鄰三角形,一般而言,如果模型是封閉的,那它的每一個(gè)三角形都會(huì)有三個(gè)相鄰三角形。

        有了三角形的相鄰關(guān)系,就可以大幅提高下一個(gè)步驟分層過(guò)程的處理速度。Cura之所以成為當(dāng)前市場(chǎng)切片速度最快的軟件,這是其中最顯著的優(yōu)化之一。

        模型載入更詳細(xì)的過(guò)程會(huì)另文分析,敬請(qǐng)期待。

步驟二:分層
        如果把模型放在XY平面上,Z軸對(duì)應(yīng)的就是模型高度。我們把XY平面抬高一定高度再與模型的表面相交,就可以得到模型在這個(gè)高度上層切片。所謂的分層就是每隔一定高度就用一個(gè)XY平面去和模型相交作層切片,全部切完后就可以得到模型在每一個(gè)高度上的輪廓線。就像是切土豆片一樣,把一個(gè)圓的或不圓異或不管什么奇形怪狀的土豆用菜刀一刀一刀切開(kāi),最后就能得到一盤(pán)薄如紙片的土豆片,當(dāng)然那還得你的刀功要足夠好才行。

        分層本質(zhì)上就是一個(gè)把3D模型轉(zhuǎn)化為一系列2D平面的過(guò)程,自此之后的所有操作就都是在2D圖形的基礎(chǔ)上進(jìn)行了。

        在前面模型載入階段我說(shuō)到了CuraEngine埋了一個(gè)三角形關(guān)聯(lián)的伏筆,作用是什么,現(xiàn)在就可以揭曉了。我們知道,兩個(gè)平面相交,得到的是一條直線,一個(gè)平面和一個(gè)三角形相交,就得到一條線段。當(dāng)然也有可能什么也得不到,平臺(tái)平行啦,三角形的三個(gè)點(diǎn)都在平面的同一面之類(lèi),這些我們可以不管,我們現(xiàn)在只關(guān)心和平面有交集的那些三角形即可。我們把一個(gè)平面和所有的三角形都相交了一遍,得到了許許多多的線段,但我們需要的是2D圖形,三角形是2D圖形,四邊形,任意多邊形都是2D圖形,但線段不是。所以我們就要把這些線段試著連成一個(gè)多邊形,那么問(wèn)題來(lái)了,要把這些線段連起來(lái),只能兩個(gè)兩個(gè)地去試,看看它們是不是共端點(diǎn)了,粗算一下,每一層都是平方級(jí)的復(fù)雜度,再算上層數(shù),那就是三次方級(jí)了。但現(xiàn)在,我們知道了三角形的關(guān)聯(lián)關(guān)系,兩個(gè)關(guān)聯(lián)的三角形,如果都與一個(gè)平面相交,那它們的交線一定也是關(guān)聯(lián)的,這一下,每一條線段只需要判斷三它與它相鄰三角形,看看與這個(gè)平面有沒(méi)有交線即可,一下子就把問(wèn)題的復(fù)雜度降了一個(gè)次元。速度自然可以有質(zhì)的提升。

        分層更詳細(xì)的過(guò)程會(huì)另文分析,敬請(qǐng)期待。

步驟三:劃分組件
        經(jīng)過(guò)分層之后,我們得到了一疊2D平面圖形。接下來(lái)需要做的事情就是對(duì)每一層的平面圖形進(jìn)行跑馬圈地,標(biāo)記出哪里是外墻、內(nèi)墻、填充、上下表面、支撐等等。



         3D打印在每一層是以組件單位,所謂組件指的就是每一層2D平面圖形里可以連通的區(qū)域,比如左圖就可以拆分為黃綠藍(lán)三個(gè)組件。而打印的順序就每打印完一個(gè)組件,接著會(huì)挑選一個(gè)離上一個(gè)組件最近的組件作為下一個(gè)進(jìn)行打印,如此循環(huán)直至一層的組件全部打印完成;接著會(huì)Z軸上升,重復(fù)上述步驟打印下一層的所有組件。

        至于每一個(gè)組件怎么打印,就和我們手工畫(huà)畫(huà)一樣,先打邊線再對(duì)邊線內(nèi)部填充。邊線可以打印多層,最外層的邊線稱(chēng)為外墻,其它的統(tǒng)稱(chēng)為內(nèi)墻,CuraEngine之所以要對(duì)內(nèi)外墻進(jìn)行區(qū)分,是為了可以為它們定制不同的打印參數(shù):外墻會(huì)被人觀察到,所以可以采用低速以提高表面質(zhì)量,內(nèi)墻只是起增加強(qiáng)度的作用,可以稍稍加快打印速度以節(jié)省時(shí)間。這些都可以在Cura界面的高級(jí)選項(xiàng)里進(jìn)行配置。

        有一點(diǎn)值得注意的是,也是我半年打印的經(jīng)驗(yàn),由于FDM擠出裝置的特性所至,擠出機(jī)的擠出通過(guò)影響的只是加熱腔里的熔絲壓力,間接決定了噴頭的擠出速度,而加熱腔本身對(duì)于壓力就有一個(gè)緩沖作用,所以擠出速度的突變并不會(huì)使得噴頭的擠出速度立即跟著變化,而是有一個(gè)延遲,這一點(diǎn)在遠(yuǎn)端送絲的機(jī)器上更為明顯。而恰恰我們公司的主打產(chǎn)品F3CL就是遠(yuǎn)端送絲,在Pango中考慮到這個(gè)問(wèn)題,并加上了特殊處理,事實(shí)證明的確對(duì)打印質(zhì)量有一定的提升。具體辦法是什么,我先賣(mài)個(gè)關(guān)子,會(huì)Pango的專(zhuān)文里進(jìn)行講解。

        內(nèi)外墻標(biāo)記完之后就是填充和上下表面的標(biāo)記了,填充有一個(gè)填充率,0%填充率就是無(wú)填充,100%就是打成一個(gè)密實(shí)的平面,所以上下表面就是填充率為100%的填充。中間的填充率自然介于兩者之間,就像一張漁網(wǎng),填充率越高網(wǎng)眼越細(xì)。

        軟件會(huì)先把內(nèi)墻里面的部分統(tǒng)統(tǒng)標(biāo)記成填充,之后再進(jìn)一步判斷其中有哪些部分要轉(zhuǎn)換成為上下表面。至于是哪些部分,在設(shè)置里會(huì)有一個(gè)上下表面層數(shù)的設(shè)置,它代表了模型的上下與空氣接觸的表面有幾層,這里就會(huì)用到這個(gè)參數(shù),CuraEngine會(huì)把當(dāng)前層上下n層(上下表面層數(shù))取出來(lái)與當(dāng)前層進(jìn)行比較,凡是當(dāng)前層有而上下n層沒(méi)有的部分就會(huì)被劃歸到表皮。而原來(lái)的填充區(qū)域在割除被劃到表皮的部分后剩下的部分就是最終的填充區(qū)域。

        CuraEngine在處理過(guò)程中大量用到了2D圖形運(yùn)算操作,有關(guān)2D圖形的運(yùn)算,有很多人研究,也被做成許多成熟的庫(kù)可以調(diào)用。CuraEngine的作者拿來(lái)主義,選取了一個(gè)他認(rèn)為比較好用的庫(kù),叫ClipperLib的庫(kù)直接內(nèi)嵌到軟件之中,ClipperLib所使用的2D圖形算法也很著名,叫Vatti's clipping algorithm,很復(fù)雜,我也沒(méi)有完全搞懂,有興趣的讀者要是搞懂了可以多多交流。ClipperLib的網(wǎng)址是:http://www.angusj.com/delphi/clipper.php

         這里我先簡(jiǎn)單介紹一下CuraEngine所用到的幾種2D圖形的運(yùn)算,都是由ClipperLib實(shí)現(xiàn)的:交、并、差、偏移。與集合操作類(lèi)似先看圖:





圖形相交
        二元圖形操作,最終結(jié)果為兩個(gè)圖形共同包含的區(qū)域。記作:A * B
圖形相并
        二元圖形操作,最終結(jié)果為兩個(gè)圖形其中的一個(gè)或兩者所包含的區(qū)域。記作:A + B
圖形相減
        二元圖形操作,最終結(jié)果為屬于前者但不屬于后者的區(qū)域。記作:A - B
圖形偏移(外擴(kuò))
        一元圖形操作,最終結(jié)果為圖形區(qū)域的邊界向外擴(kuò)展指定的距離。
圖形偏移(內(nèi)縮)
        一元圖形操作,最終結(jié)果為圖形區(qū)域的邊界向內(nèi)收縮指定的距離。內(nèi)縮與外擴(kuò)互為逆運(yùn)算。
        這些就是CuraEngine所用到的2D圖形操作,運(yùn)算不多,確可以做許許多多的事情,比如上面所說(shuō)的上下表面計(jì)算,就可以用數(shù)學(xué)公式來(lái)表示:

表面(i) = [填充(i) - 層(i + n)] + [填充(i) - 層(i - n)]

填充(i) = 填充(i) - 表面(i)

         其中,i為當(dāng)前層號(hào),n為上下表面層數(shù)(可以不一樣)。多簡(jiǎn)單,數(shù)學(xué)就是這么任性!
        同樣的,組件里面內(nèi)外墻,填充怎么劃分,只用一個(gè)內(nèi)縮運(yùn)算就可以搞定:

外墻 = 組件.offset(-線寬)

內(nèi)墻1 = 組件.offset(-線寬 * 2)
...
內(nèi)墻n = 組件.offset(-線寬 * (n + 1))

填充 = 組件.offset(-線寬 * (n + 2))


         如果模型無(wú)需支撐,那組件劃分到這里就可以收工。否則,接下就是計(jì)算支撐的時(shí)間了。

        我用CuraEngine半年下來(lái)覺(jué)得它最大的不足就是在支撐上,這也是我在Pango投入最大精力要改進(jìn)的地方,這里就先簡(jiǎn)單介紹一下CuraEngine所用的支撐算法。

        CuraEngine首先把整個(gè)打印空間在XY平臺(tái)上劃分成為50um*50um的網(wǎng)格,每個(gè)網(wǎng)格的中心點(diǎn)再延Z軸向上作一條直線,這條直線可能會(huì)與組成3D模型的三角形相交,三角形與直線的交點(diǎn)以及這個(gè)三角形的傾斜度會(huì)被記錄到網(wǎng)格里面。

        現(xiàn)在每個(gè)網(wǎng)格里會(huì)記錄下一串被稱(chēng)為支撐點(diǎn)的列表,每個(gè)支撐點(diǎn)包含一個(gè)高度和一個(gè)傾斜度信息。接下來(lái)會(huì)對(duì)每個(gè)網(wǎng)格的支撐點(diǎn)列表按照高度從低到高排序。根據(jù)這些信息就可以判斷模型上任意一個(gè)點(diǎn)是否需要支撐了,怎么判斷,我們看圖說(shuō)話:



        讓我們從底面開(kāi)始延著一條網(wǎng)格中心往上走,起始我們是在模型外部,當(dāng)遇到第一個(gè)支撐點(diǎn)的時(shí)候,就從模型外部進(jìn)行了模型內(nèi)部,我們稱(chēng)這個(gè)支撐點(diǎn)為進(jìn)點(diǎn)。

        繼續(xù)向上,遇到了第二個(gè)支撐點(diǎn),從模型內(nèi)部又退到了模型外部,我們稱(chēng)這個(gè)支撐點(diǎn)為出點(diǎn)。

        接著向上,我們可以發(fā)現(xiàn),進(jìn)點(diǎn)與出點(diǎn)總是交替出現(xiàn)的。

        利用這個(gè)規(guī)律,對(duì)于模型上任何一個(gè)點(diǎn),我們只要找到這個(gè)點(diǎn)所對(duì)應(yīng)的網(wǎng)格,再找到這個(gè)網(wǎng)格里在這個(gè)點(diǎn)以上最近的一個(gè)支撐點(diǎn),我們就可以得到兩個(gè)信息:這個(gè)點(diǎn)之上是否有模型懸空;這個(gè)點(diǎn)上面的懸空點(diǎn)的面的傾斜度是多少。

        Cura界面的專(zhuān)家設(shè)置里面有支撐角度的設(shè)置,如果一個(gè)點(diǎn)處于模型懸空部分以下,并且懸空點(diǎn)傾斜度大于支撐角度,那這個(gè)點(diǎn)就是需要支撐的。所一個(gè)平臺(tái)上所有的需要支撐的點(diǎn)連接起來(lái)圍成的2D圖形就是支撐區(qū)域。



       CuraEngine所使用的支撐算法比較粗糙,但勝在速度很快。先不說(shuō)網(wǎng)格化后失去了精度,通過(guò)傾斜角度來(lái)判斷,模型下方一旦傾斜角發(fā)生了突變,像左圖這種從負(fù)45
度一下突變成正45度,傾斜角判斷無(wú)能為力,除非把它改大到60度,這樣的話,整個(gè)模型都會(huì)被過(guò)度支撐。這樣矯枉過(guò)正,既不科學(xué),也浪費(fèi)材料和打印時(shí)間,還會(huì)對(duì)模型表面質(zhì)量帶來(lái)不好的影響。

       科學(xué)的支撐算法應(yīng)該是找到模型局部最低點(diǎn)進(jìn)行支撐,最低點(diǎn)以上不一定需要支撐。因?yàn)镕DM材料本身的粘性,使得材料的走線可以有一部分懸空而不坍塌,這個(gè)效果被稱(chēng)為Overhang,只要上層材料的懸空距離小于一定的值,它就不需要支撐,這個(gè)距離以我的經(jīng)驗(yàn)應(yīng)該在1/4到1/2線寬之間。我在Pango中就基于這個(gè)思路重新實(shí)現(xiàn)了支撐的算法,結(jié)果雖然



        速度不如Cura的支撐算法那么快,但效果非常好,該撐的地方撐,不該撐的地方也不會(huì)多此一舉。

       Pango的支撐算法我會(huì)在以后專(zhuān)文介紹。順帶一說(shuō),CuraEngine在下半年做了很大的改動(dòng),其中之一就是拋棄了之前的支撐算法,而新的算法也和我上面所講的思想異曲同工。我要聲明的是Pango的支撐算法和CuraEngine誰(shuí)也沒(méi)有抄誰(shuí),我的算法是自己拍腦袋想出來(lái)的。算是英雄所見(jiàn)略同吧。

        支撐范圍確定之后,也和組件一樣,可以有外墻、內(nèi)墻、填充、表面。依樣畫(huà)葫蘆即可。CuraEngine對(duì)于支撐,只會(huì)生成外墻和填充,Pango更多。

        組件和支撐就是CuraEngine在這一步所生成的結(jié)果,這一步可以說(shuō)是整個(gè)切片過(guò)程的核心,更詳細(xì)的過(guò)程會(huì)另文分析,敬請(qǐng)期待。

步驟四:路徑生成





        地圈好了,就該在里面種菜了。這一步路徑生成就要開(kāi)始規(guī)劃噴頭在不同的組件中怎么運(yùn)動(dòng)。路徑按大類(lèi)來(lái)分,有輪廓和填充兩種。

        輪廓很簡(jiǎn)單,沿著2D圖形的邊線走一圈即可。前一步所生成的外墻、內(nèi)墻都屬于輪廓,可以直接把它們的圖形以設(shè)置里的線寬轉(zhuǎn)換為輪廓路徑。

        填充稍微要復(fù)雜一些,2D圖形指定的只是填充的邊界,而生成的路徑則是在邊界的范圍內(nèi)的條紋或網(wǎng)格結(jié)構(gòu),就像窗簾或者漁網(wǎng),如左圖。這兩種就最基本的結(jié)構(gòu),當(dāng)然也許你還可以想出其它花式的填充,比如蜂窩狀或者S型,這些在新的Cura或者別的什么切片軟件里可能會(huì)實(shí)現(xiàn),但我打印下來(lái)還是這兩種基本結(jié)構(gòu)更讓人放心。

CuraEngine在專(zhuān)家設(shè)置里可以對(duì)填充類(lèi)型進(jìn)行選擇,里面除了條紋和網(wǎng)格外還有一個(gè)自動(dòng)選項(xiàng),默認(rèn)就是自動(dòng)。自動(dòng)模式會(huì)根據(jù)當(dāng)前的填充率進(jìn)行切換,當(dāng)填充率小于20%就用條紋填充,否則使用網(wǎng)格填充。因?yàn)榫W(wǎng)格結(jié)構(gòu)雖然更為合理,但它有一個(gè)問(wèn)題,就是交點(diǎn)的地方會(huì)打兩次。填充率越高,交點(diǎn)越密,對(duì)打印質(zhì)量的影響會(huì)越大。我們知道,表面就是100%的填充,如果表面用網(wǎng)格打,不但無(wú)法打密實(shí),表面還會(huì)坑坑洼洼,所以100%填充只能用條紋打,這就是CuraEngine推薦自動(dòng)模式的原因。

        至于填充率,就反映在線與線的間距上。100%填充率間距為0;0%填充率間距無(wú)限大,一根線條也不會(huì)有。

        每個(gè)組件獨(dú)立的路徑生成好了,還要確定打印的先后順序。順序先好了可以少走彎路,打印速度和質(zhì)量都會(huì)有提升。路徑的順序以先近后遠(yuǎn)為基本原則:每打印完一條路徑,當(dāng)前位置是上一條路徑的終點(diǎn);在當(dāng)前層里剩下還沒(méi)打印的路徑中挑選一條起點(diǎn)離當(dāng)前位置最近的一條路徑開(kāi)打。路徑的起點(diǎn)可以是路徑中的任意一個(gè)點(diǎn),程序會(huì)自行判斷。而路徑的終點(diǎn)有兩種可能:對(duì)于直線,圖形只有兩個(gè)點(diǎn),終點(diǎn)就是除起點(diǎn)之外的那個(gè)點(diǎn);對(duì)于輪廓,終點(diǎn)就是起點(diǎn),因?yàn)檩喞且粋€(gè)封閉圖形,從它的起點(diǎn)開(kāi)始沿任意方向走一圈,最后還會(huì)回到起點(diǎn)。CuraEngine對(duì)路徑選擇做了一個(gè)估值,除了考慮到先近后遠(yuǎn)外,還順便參考了下一個(gè)點(diǎn)相對(duì)于當(dāng)前點(diǎn)的方向,它的物理意義就是減少噴頭轉(zhuǎn)彎。賽車(chē)在直道上開(kāi)得一定比彎道快,不是么。

        路徑的順序也確定了,還有一個(gè)問(wèn)題需要考慮:如果前后兩條路徑首尾相連,那直接走就是了,但大多數(shù)情況并非如此,前一條路徑的終點(diǎn)往往和后一條路徑起點(diǎn)之間有一段距離。這時(shí)候去往下一點(diǎn)的路上要小心了,肯定不能繼續(xù)擠出材料,否則輕則拉絲,重則模型面目全非。這段路噴頭就需要空走,即噴頭只移動(dòng),不吐絲,那只要把擠出機(jī)停下來(lái)不轉(zhuǎn)就行了嗎?也不行,因?yàn)榍懊娣治鲞^(guò),擠出機(jī)的速度要傳導(dǎo)到噴嘴,有一個(gè)延遲,不是你說(shuō)停它就立即停下來(lái)的。這是FDM打印的通病,解決辦法就是回抽。所謂回抽,就是在空走之前先讓擠出機(jī)高速反轉(zhuǎn)一段材料,這樣就可以瞬間把加熱腔里的材料抽光,再移動(dòng)過(guò)去,中間就不會(huì)擠出材料,到了下一個(gè)點(diǎn),在打印之前,先把剛才抽回去的絲再按一樣的長(zhǎng)度放回來(lái),繼續(xù)打印。回抽可以很好地解決空走拉絲的問(wèn)題,但是它很慢,以抽一次0.5秒來(lái)算的話,如果打印一個(gè)表面,0.4線寬,10厘米的距離至少回抽25下,10幾秒鐘的時(shí)間一層,幾百上千層打下來(lái),光回抽所用的時(shí)間就是幾個(gè)小時(shí),是可忍孰不可忍!





        CuraEngine給我們提供了解決方案就是Comb,也就是繞路。我們先來(lái)看,是不是所有的回抽都是必需的呢?不回抽會(huì)拉絲是肯定的,但如果需要空走的路徑本來(lái)就要打印的,那拉絲又有何妨。按這個(gè)思路,就可以給每個(gè)組件設(shè)定一個(gè)邊界,只要路徑的起點(diǎn)和終點(diǎn)都在這個(gè)邊界之內(nèi)的,空走都不回抽。這樣可以解決80%的問(wèn)題,但如果是左圖這樣的情況就行不通。

        紅色是起點(diǎn),綠色是終點(diǎn),直接走過(guò)去會(huì)走出邊界的范圍。這時(shí)我們就要繞一點(diǎn)路,走一條曲線到達(dá)我們的目的地。這就是Comb所做的事情,在Cura專(zhuān)家設(shè)置里面可以對(duì)Comb進(jìn)行設(shè)置,選擇開(kāi)啟、關(guān)閉還有表面不Comb。Comb可以大幅節(jié)省打印時(shí)間,但是同一個(gè)地方打印多次對(duì)模型質(zhì)量還是會(huì)有細(xì)微的影響,個(gè)中利弊,交給用戶自己判斷。

        Comb的調(diào)整是個(gè)細(xì)致活,Pango花了相當(dāng)多的時(shí)間來(lái)微調(diào)Comb功能以求達(dá)到更好的效果,過(guò)程繁瑣,不再贅述。

        至此路徑生成完成,更詳細(xì)的過(guò)程另文分析,敬請(qǐng)期待。

步驟五:gcode生成
        路徑都生成好了,還需要翻譯對(duì)打印機(jī)可以實(shí)別的gcode代碼才行。這一步花樣不多,按部就班即可。

        先讓打印機(jī)做一些準(zhǔn)備工作:歸零、加熱噴頭和平臺(tái)、抬高噴頭、擠一小段絲、風(fēng)扇設(shè)置。

        從下到上一層一層打印,每層打印之前先用G0抬高Z坐標(biāo)到相應(yīng)位置。

        按照路徑,每個(gè)點(diǎn)生成一條gcode。其中空走G0;邊擠邊走用G1,Cura的設(shè)置里有絲材的直徑、線寬,可以算出走這些距離需要擠出多少材料;G0和G1的速度也都在設(shè)置里可以調(diào)整。

        若需回抽,用G1生成一條E軸倒退的代碼。在下一條G1執(zhí)行之前,再用G1生成一條相應(yīng)的E軸前進(jìn)的代碼。

        所有層都打完后讓打印機(jī)做一些收尾工作:關(guān)閉加熱、XY歸零、電機(jī)釋放。

        生成gcode的過(guò)程中,CuraEngine也會(huì)模擬一遍打印過(guò)程,用來(lái)計(jì)算出打印所需要的時(shí)間和材料長(zhǎng)度,這些也會(huì)寫(xiě)在gcode的注釋里供用戶參考。

        gcode生成不用另文詳細(xì)分析,但是gcode的說(shuō)明還是可以專(zhuān)文分析一下,敬請(qǐng)期待。

待續(xù)

         寫(xiě)了這么多,Cura的切片流程也只能講個(gè)大概,也算是個(gè)提綱,希望對(duì)大家有所幫助。我計(jì)劃對(duì)于上面的第一個(gè)步驟再專(zhuān)文分析。除此之外,還有Cura界面部分以及Cura與CuraEngine的通訊也可以講講。之后就是我半年創(chuàng)作,自我感覺(jué)良好到覺(jué)得可以超越Cura的Pango,也是不說(shuō)不快的。
聲明:3D打印資源庫(kù)(3dzyk)內(nèi)網(wǎng)友所發(fā)表的所有內(nèi)容及言論僅代表其本人,并不代表3D打印資源庫(kù)(3dzyk)觀點(diǎn)和立場(chǎng);如對(duì)文章有異議或投訴,請(qǐng)联系kefu@3dzyk.cn。
一只,懶貓...

作者其他文章

B Color Smilies
解析3D打印切片軟件Cura及CuraEngine原理 
兴安盟| 桃园市| 明星| 木里| 泌阳县| 敦化市| 抚远县| 西贡区| 全椒县| 广汉市| 禹州市| 光山县| 凤凰县| 金沙县| 从化市| 桐柏县| 南和县| 恭城| 双峰县| 辽阳县| 潼南县| 泰安市| 台前县| 绥宁县| 历史| 奉新县| 达孜县| 赣州市| 应城市| 双城市| 崇仁县| 仪陇县| 独山县| 钟山县| 尼木县| 山丹县| 内丘县| 宕昌县| 桦甸市| 淮安市| 乌苏市|