德斯软件资讯9月17日消息,Introduction年终开端进入3D打印行业,奉命开发基于Cura的独立3D打印切片软件。
独立的R&D应该学习其优点,补偿其长处。首先,自然要理解一下Cura做了什么。有必要看一下Cura的代码。我不断以为,比起本身写代码,看他人的代码是一个迟缓而苦楚的进程。读者的想法总是和作者的想法有偏向,往往无法验证本身的猜想能否正确。他们只是感慨人脑不是电脑,无法从头到尾执行眼前的代码。不晓得学长节目会怎样做。我的办法是“翻译”。看了他人写的代码,加上本身的了解,我会依据本身的爱好重写。我会看着翻译的段落,等候一切的翻译完成。实际上,作者的想法会被了解。同时还有一个功用相反的代码。我本身的了解能否正确,也可以经过执行翻译过去的代码来验证。
方案总是美妙的,但两头项目充溢变数,其间的曲折就不提了。经过几次重写,我勉强失掉了一个本身的切片软件,经过半年的琢磨和打印经历,终于降生了一个本身称心的切片软件。我们把它命名为Pango吧。我们先来看看。
关于 Pango的引见和描绘,请先按“否”,这样你就无机会再贴一篇详细的文档。在Pango的开展进程中,我对Cura的了解越来越深。几个小时前,我有决心把我的阅历、了解和领会分享给大家,供大家参考。假如能对后来的Cura研讨者有所协助就太好了。
Cura的架构Cura是用python言语完成的,运用的是wxpython图形界面框架的3D打印切片接口软件。之所以说它是接口软件,是由于Cura自身并不执行实践的切片操作。实践的切片任务由用另一种C++言语完成的CuraEngine命令行软件来完成。用户在Cura界面上的大局部操作,比方加载模型,平滑旋转缩放,设置参数等。,最终将被转换成并执行一个CuraEngine命令;Cura引擎将输出的STL、DAE或OBJ模型文件切片,输入为gcode字符串,前往给CuraCura将gcode可视化为3D界面上的途径,并展现给用户。
我的次要参考代码是CuraEngine,这篇文章的次要篇幅也会放在CuraEngine上。Pango的接口代码次要是我本身开发的。
Cura和CuraEngine都可以在Github上找到,网址是:
https://github.com/daid/Cura
https://github.com/Ultimaker/CuraEngine
我参考的版本是15.04。15.06当前,Cura和CuraEngine有了很大的变化,但是中心流程没有变。因而,本文剖析的版本最高为15.04。
言归正传,让我们开端一步步揭开CuraEngine将一个模型文件转换成gcode的进程。
切片流程普通来说,CuraEngine的切片分为五个步骤:
步骤1:加载模型。略微有一点3D编程经历的人都晓得,计算机中的3D模型大多是由三角形曲面组成的曲面所包裹的空间来表示的。作为三角形三维模型的根本单元,它具有构造复杂、通用性强、可以组分解恣意曲面的特点。只需空间中的三个点能代表一个独一的三角形,两个点只能代表一条直线,再多的直线也不能构成一个立体;空间中恣意三个不共线的点可以组成一个三角形,四个点组成的四边形必需要求四个点共面;任何曲面都可以分解成三角形,一个四边形可以分解成两个三角形,但是没有方法把一个三角形和一个四边形组合起来。计算机擅长的是反复复杂的事情,正由于这些特点,三角构成为了计算机3D世界的基石。
CuraEngine也运用三角形组合来表示模型,但是同一个三角形组合有有限的数据构造要存储。CuraEngine切片的第一步是从内部读取模型数据,转换成CuraEngine外部数据构造表示的三角组合。
光有三角组合是不够的。CuraEngine还需求在模型的加载阶段关联三角形。假如两个三角形共用一条边,则可以断定为相邻三角形。三角形有三条边,所以最多只能有三个相邻的三角形。普通来说,假如模型是封锁的,它的每个三角形都会有三个相邻的三角形。
有了三角形的邻接,可以大大进步下一个分层进程的处置速度。Cura成为目前市场上最快的切片软件,这是最明显的优化之一。
第二步:分层假如把模型放在XY立体上,Z轴对应模型的高度。我们把XY立体抬高到一定高度,然后和模型的外表相交,这样就可以失掉模型在这个高度的切片。所谓分层,就是用一个XY立体与模型相交每隔一定高度实行切片,层与层之间的间隔称为层高。切割完一切图层后,就可以失掉模型在每一层上的轮廓了。就像切薯片一样,用菜刀切一个圆形或非圆形的XOR土豆,最初就能失掉一盘薄如纸的薯片。当然,你的刀功必需足够好。
分层实质上是将3D模型转换成一系列2D立体的进程。从那当前,一切的操作都是在2D图形的根底上实行的。
在模型加载的前一阶段,我提到CuraEngine埋下了一个三角形关联的伏笔。它的功用是什么?如今我们可以揭晓答案了。我们晓得,当两个立体相交时,我们失掉一条直线,当一个立体与一个三角形相交时,我们失掉一条线段。当然,也有例如一无所获。平台是平行的,三角形的三个点都在立体的同一侧。我们可以疏忽这些,我们只关怀那些与立体相交的三角形。我们用一切的三角形穿过一个立体,失掉了许多线段。但是我们需求的是2D图形,三角形是2D图形,四边形和恣意多边形是2D图形,而线段不是。所以我们要试着把这些线段衔接成一个多边形。那么成绩来了。要衔接这些线段,我们只能两个两个地试,看它们能否有共同的端点。粗略来说,每一层都是一个方块级别的复杂水平,然后数一数层数,就是立方体级别了。但是如今,我们晓得了三角形的关系。假如两个相关的三角形相交于一个立体,那么它们的交线也一定是相关的。这样,每一条线段只需求判别与之相邻的三个三角形,看能否与这个立体有交集,就把成绩的复杂度一下子降低了一维。速度自然可以有质的提升。
第三步:将组件分层后,我们失掉一叠2D立体图。接上去我们要做的是标出每层的立体图,标出外墙,内墙,填充,上下外表,支撑等等在哪里。
3D打印基于每个楼层的组件单元。所谓构件,是指每层楼的2D图形中可以衔接的面积。比方左图可以分为黄、绿、蓝三个重量。在印刷顺序中,每印刷完一个元件后,将选择最接近前一个元件的元件作为下一个要印刷的元件,如此循环,直到印刷完第一层的一切元件。然后Z轴会上升,反复以上步骤打印下一层的一切元件。
至于每个组件怎样打印,就像我们手绘的时分,先排队,然后填线的外面。可以打印屡次边,最里面的边叫外墙,其他的统称为内墙。CuraEngine区分外墙和外墙,以便为它们定制不同的打印参数:外墙会被人察看到,所以你可以运用低速来进步外表质量,而内墙只是起到添加强度的作用,可以略微放慢打印速度来节省工夫。这些可以在Cura界面的初级选项中配置。
值得留意的是,这也是我半年的打印经历:由于FDM挤出设备的特性,挤出机经过影响加热腔内的熔体压力,直接决议了喷嘴的挤出速度。加热室自身对压力有缓冲作用,所以挤出机送丝速度的忽然变化不会使喷嘴的挤出速度立刻发作变化,但会有一个延迟。这一点在近程送丝机上愈加分明,而近程送丝机恰恰是我们公司的旗舰产品F3CL。思索到这个成绩,在Pango中参加了特殊处置,证明打印质量有了一定水平的进步。详细办法是什么?我先卖个关子,在Pango的专题文章里解释一下。
内外墙做好标志后,实行填充,并在上下外表做好标志。有填充率,0%填充率表示没有填充,100%表示构成致密立体,上下外表用100%填充率填充。两头的填充率自然是介于两者之间,就像渔网一样。填充率越高,网格越细。
软件会先将内墙外部的一切局部标志为填充,然后进一步判别哪些局部应该转换为上下外表。有哪些局部?在Cura的根底设置中,有一个上下外表层的设置,代表模型的上下外表与空气接触的层数,这里会用到。CuraEngine会取出以后层的上下N层(上下表层)与以后层实行比照。一切具有以后层但没有上下N层的局部将被分类到皮肤中。将刮到表皮的局部切除后的原填充区剩余局部为最终填充区。
CuraEngine在处置进程中运用了少量的2D图形操作。很多人研讨过2D图形的操作,也做了很多成熟的库供调用。CuraEngine的作者应用了这一点,选择了一个他以为好用的库。名为ClipperLib的库被间接嵌入到软件中。ClipperLib运用的2D图形算法也十分有名,叫做Vatti的裁剪算法。这很复杂,我也不完全了解。有兴味的读者看懂了可以多交流。
ClipperLib的网站是:http://www.angusj.com/delphi/clipper.php.
这里我复杂引见一下CuraEngine运用的几种2D图形的运算,都是用ClipperLib完成的:交、并、减、偏。它们相似于集合操作,先看图:
图形与二进制图形运算相交,最终后果是两个图形共同包括的面积。注:A * B
最终后果是两个图形中的一个或两个包括的面积。注:A+B
图形减法二进制图形运算,最初的后果是属于前者而不属于后者的面积。注:A-B
图形偏移(向外扩展)是一元图形操作,最终后果是图形区域的边界向外扩展指定的间隔。
图形偏移(膨胀)是一元图形操作,最终后果是图形区域的边界向内膨胀指定的间隔。外部膨胀和内部收缩是互相反向的操作。
这些是CuraEngine运用的2D图形操作。操作不多,但很多事情可以做。例如,下面提到的上外表和下外表的计算可以用数学公式表示:
外表(i) =
如今,在每个网格中记载了支持点的列表,并且每个支持点包括高度和倾斜度信息。接上去,每个网格的支撑点列表将依照高度从低到高排序。依据这些信息,我们可以判别模型上的任何一点能否需求支撑。如何判别?我们看图说话:
让我们从底部开端,沿着一个网格的中心线向上。一开端我们在模型里面,遇到第一个支撑点就从里面进入模型。我们称这个支撑点为进入点。
持续走,遇到第二个支撑点,从模型外部退到模型内部。我们称这个支撑点为出口点。
然后,我们可以发现,入口点和出口点总是交替呈现。
应用这个规则,关于模型上的恣意一点,我们只需求找到这个点对应的网格,然后在这个网格中找到这个点上方最近的支撑点,就可以失掉两条信息:这个点上方能否有模型悬挂;悬挂点所在立体在该点上方的倾角是多少。
Cura界面的专家设置里有支撑角度的设置。假如一个点在模型悬挂局部的上面,并且悬挂点的倾斜度大于支撑角度,那么这个点需求被支撑。将平台上需求支撑的一切点衔接起来构成的2D图形就是支撑区域。
CuraEngine的支持算法比拟粗糙,但是比拟快。先不说啮合后精度的损失。从倾斜角度来看,一旦倾斜角度在模型下方忽然变化,就像右边的,从负45°开端变化。
假如度数忽然变成正45度,你也没方法判别倾斜角度。除非进步到60度,否则整个模型都会支撑过度。这种矫枉过正是不迷信的,糜费资料和打印工夫,对模型的外表质量也有不好的影响。
一个迷信的支撑算法应该是找到模型的部分最低点实行支撑,最低点以上不一定需求支撑。由于FDM资料自身的粘性,资料的一些痕迹可以被悬浮而不会坍塌。这种效应被称为
悬垂,只需上部资料的悬挂间隔小于一定值,就不需求支撑。以我的经历,这个间隔应该在1/4到1/2线宽之间。我基于这个想法重新完成了Pango中的支持算法。后果虽然速度没有Cura的支持算法快,但是效果很好。该支持的中央,我们不会做多余的事。
Pango的支持算法将在前面的文章中引见。顺带一提,下半年CuraEngine有了很大的变化,其中一个就是丢弃了之前的支持算法,新的算法和我下面说的差不多。我要声明的是,Pango的支持算法和CuraEngine都没有剽窃任何人。我的算法是拍脑袋创造的。英雄所见略同。
支撑范围确定后,可以有外墙、内墙、内墙、上上面以及构件。照着例子做就行了。CuraEngine只会为支撑生成外墙和内墙,而Pango会生成更多。
而组件支持就是CuraEngine在这一步生成的后果,可以说是整个切片进程的中心。
步骤4:途径生成/图像-8/
一旦圈子封锁了,就该在外面种菜了。在途径生成的这一步中,有必要方案喷嘴如何在不同组件中挪动。途径分为两类:轮廓和填充。
这个轮廓很复杂,只是绕着2D图形的边缘走一圈。上一步生成的外墙和内墙属于轮廓,其图形可以经过设置中的线宽间接转换成轮廓途径。
填充略微复杂一点。2D图形只指定填充边界,而生成的途径是边界内的条纹或网格构造,像窗帘或渔网,如左图所示。这两个是最根本的构造。当然,也许你可以想出其他花哨的填充物,比方蜂巢状或S形。这些例如在新的Cura或许其他切片软件中完成,但是把这两个根本构造打印出来对我来说更担心。CuraEngine可以在专家设置中选择填充类型,除了条纹和网格还有一个自动选项。默许为自动。形式将依据以后填充率自动切换。填充率小于20%时,用条纹填充;否则,它将被网格填满。网格构造虽然更合理,但是有一个成绩就是交点会打两遍。填充率越高,穿插点越密,对打印质量的影响越大。我们晓得,外表是100%填充的。假如外表打格子,不只打不密实,还会坑坑洼洼,所以100%填充只能打条纹,这也是CuraEngine引荐自动形式的缘由。
至于填充率,表现外行距上。100%填充率间距为0;0%的填充率是有限距离的,不会有一条线。
当生成每个组件的独立途径时,应该确定打印顺序。假如先把订单做好,就可以少走弯路,打印速度和质量都会进步。途径的顺序是依照先近后远的准绳:每打印一条途径,以后地位就是前一条途径的起点;从以后图层中剩余的未打印途径中,选择终点最接近以后地位的途径开端键入。途径的终点可以是途径中的恣意一点,程序会本身判别。途径的起点有两种例如:关于一条直线,图中只要两点,起点是终点以外的点;关于轮廓来说,起点就是终点,由于轮廓是一个封锁的图形。从它的终点动身,会往任何方向绕,最初会回到终点。CuraEngine对途径选择做了一个估量,不只思索了第一个接近然后是最初一个间隔,还参考了下一个点绝对于以后点的方向。其物理意义是增加喷嘴转动。赛车在直道上一定比在弯道上跑得快,不是吗?
途径的顺序也曾经确定。还有一个成绩需求思索:假如前后途径首尾相连,直行即可,但大少数状况下并非如此。前一条路途的起点和后一条路途的终点之间通常有一段间隔。这个时分,在去下一个点的路上要小心。不能持续拉伸资料,否则绘图会变浅,模型无法辨认。这一段路,喷头需求走空,也就是喷头只动不转,那就把挤出机停上去不要转了?不会,由于后面剖析过,挤出机的速度要传递给喷嘴,有延迟。你说停就不马上停。这是FDM印刷的罕见成绩,处理办法是反抽。所谓反抽,就是让挤出机高速反转一段物料后再放空,让加热室内的物料霎时被抽光,然后再挪过来,这样物料就不会被中途挤出来。在下一点,印刷前,把刚刚抽回的丝放回异样的长度,持续印刷。反抽可以很好的处理空抽成绩,但是很慢。假如用0.5秒抽一次,打印一个线宽为0.4、间距为10 cm的面,至多可以抽25次回来。打印一层需求10秒,打印几百层。光是抽回来的工夫就几个小时,几乎无法忍耐!
CuraEngine为我们提供了一个处理方案,即Comb,这是一条弯路。我们先来看一下,一切的反抽都有必要吗?画图可以不画回是一定的,但是假如空途径需求打印,画图有什么成绩?依照这个思绪,你可以给每个组件设置一个边界。只需途径的终点和起点在这个边界内,当你空着的时分就不会前进。这样可以处理80%的成绩,但是假如是左图的状况就不行了。
白色是终点,绿色是起点。假如你不断往前走,你就会走出边界。这时分我们就要绕道走一个弯才干抵达目的地。这就是Comb的作用。在Cura expert设置中,您可以设置Comb,选择on、off和not Comb on the surface。梳子可以大小节省打印工夫,但是屡次在同一个中央打印还是会对模型的质量有细微的影响。优劣留给用户本身去判别。
梳子的调整是一项细致的任务。Pango花了相当多的工夫对Comb功用实行微调,以到达更好的效果。进程繁琐,这里就不赘述了。
步骤5: gcode生成
一切的途径都曾经生成了,如今需求翻译可以被打印机辨认的gcode代码。这一步没有太多的诀窍,按部就班就好。
先让打印机做一些预备任务:归零,加热喷嘴战争台,升起喷嘴,挤一小块丝,设置风扇。
从底层到顶层打印。在打印每一层之前,运用G0将Z坐标提升到相应的地位。
依据途径,每个点生成一个gcode。空的G0;一边挤压一边用G1,Cura的设置里有线材的直径和线宽,你可以计算出分开这些间隔需求挤压多少资料;G0和G1的速度也可以在设置中调整。
假如需求回抽,则运用G1发生E轴反向代码。在执行下一个G1之前,运用G1生成相应的E轴正向代码。
一切图层完成后,让打印机做一些收尾任务:封闭加热,XY归零,松开电机。
在生成gcode的进程中,CuraEngine还会再次模仿打印进程,计算出打印所需的工夫和资料长度,这些也会写在gcode的评论中,供用户参考。
待续
写了这么多,Cura的切片进程只能勾勒一下,也算是一个轮廓吧。希望对大家有协助。我方案详细剖析下面的第一步。此外,还有Cura接口局部以及Cura和CuraEngine之间的通讯。之后创作了半年的Pango,觉得好到可以逾越Cura。我没说我不开心。