From 12a32d3dc38a228217a39b6b99a7624d767a974a Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 22 Jun 2015 13:57:15 +0200 Subject: [PATCH 01/12] Add application icons for all three platforms Fixes Ultimaker/Uranium#5 --- icons/cura-128.png | Bin 0 -> 2145 bytes icons/cura-32.png | Bin 0 -> 625 bytes icons/cura-48.png | Bin 0 -> 1030 bytes icons/cura-64.png | Bin 0 -> 1133 bytes icons/cura.icns | Bin 0 -> 27026 bytes icons/cura.ico | Bin 0 -> 31206 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/cura-128.png create mode 100644 icons/cura-32.png create mode 100644 icons/cura-48.png create mode 100644 icons/cura-64.png create mode 100644 icons/cura.icns create mode 100644 icons/cura.ico diff --git a/icons/cura-128.png b/icons/cura-128.png new file mode 100644 index 0000000000000000000000000000000000000000..ecfe0d1e4efe064ae9e5154e423d15b303fa4dd2 GIT binary patch literal 2145 zcmWkwc|6o#7ycS##u8%*$(EY2HI#m%R5Mi8m?XSYVk{F9M%fL`s4R)_mVFIlDdZJl z!cfXGS+n%ZI+Cq0k#z>|ckbtN?z!iA&NDdMeML z2f+Cw#)Szw0so8Uwoq_{Ly56q4D&O);ST`j13cp^HICZ?LHPh*dqA+u{o6or za4_nQ?_Ga47r)ym(tVGt<@1LDKxo4JvXN~__EL6)x09V>J9ch@b3WpGiD<@uQ8#0B z?4l)vm;53er6Dc*vozJ~{H#afa(0d_oKNHPZW3KIHe_b0}%Qj7hcQx(4 zmRa-|h&X-Nf*z^Y8kKisSY+zM)kCiZ{aDDvT1Y+nYpVs{t*r%@900`)_@4zJ`(OvJ zMin6(&=T-tFRsIi1R32OYS0_V-G^`Mfsi!G?Mp^Ko3V6)`lQ{`41 z(qLvF!t1yN9*JpGj`*!Rcz2#8|UfJ%Dr0Htso%c(%L_rd(WR%+ z%8XUW5SfGsyZ4@`AlCXqfY%0uqiiX`=hjbb;u|uUM?JKuf4_{F5(-zJD%am2rRzx= zhRvFiIi+KJR)71bwjyH8JAz5M+xDva3UJ62d|TCd3E7 zBE*k>gNtA>RWV&TBXqWuyA9uG_vUY{&y>zz{P~WQe^n{XOI6=e0&HLSPYU4;0>gcU z7YUs{0r}=v27=2=TLo6k$Ul3%d|Q>mGkvy(0r1{HR7>)nzvLc|g%QB^B{h(a3D zuvtPhh2`4#Y&*n%A~AElhuHoFu!mYxW+L0%83rW@)3TMv>%F67-j1VZ1WQMt%9F(A z%2oAS+lp~o^lMfpW`F5Jry-Yh&OgDN^{grO@}(_AzlR;V)?q+IHhCbgpsvt6~3ET#~FL7*HA3*YF#m(sO;%3-yoxMdM%VPH0D)=bAn453R;;g z)@!-xUGiPhPK^&YO2M3+Z{6(Pd}(U2d|8Ft zWpTO(yW|TXTZ*y@uk9#AHM)U!xsy|pBcB24r2Q3fG3))^-h?5hNHwI9!*BA&W9S_> z+Oz%o=f$6V|6Z5=3D?HERys-BH2gA{<|lU#dHb~`_H%n^CchSbn94WYKK_TfkG@%V z4KAy)HD6*)tM1PXo09m5rDyJ3+I)KJY_H@r#9AAEE39^#UMoCACd)P7k!N9*0)re7aV7KHIjN!F zah04!89yW+M&+gWss-cK0K@6K>&J4r*N>APuSg8@~nx+USHQn9`(~cWWutFtyjYh(Q_IN z9jGAY{>i}Z`6C1X_CzqeyKXndxqq(6p;McbyZwV`0swZo#&^~aSlnIqpM;$@-lNPW zKG)#;3|<%Nk4m19H!^``Vjhh0F&WjgK)0B&Nh(#84g}_qKCRM^wbj z)8=A>e2^2hIi4iK@?$xNjY)KP)x4CEd7&vTUwl~&Gl<=BNn)v%CKxs$#t*mBn18-w ziRBXusk?PtA18qh5jW;ukwSB4$1o=AQc`l0~ZC?)leROR-1>P!b^hqKzjjL zkc3K&0yp@#N;ljOQuK(%lMK~92xfJ#E`aeg^<^ MW8CG+i_Q=K4@tB4iU0rr literal 0 HcmV?d00001 diff --git a/icons/cura-32.png b/icons/cura-32.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad22313e9833424a16d12688dc8ba618a4f8884 GIT binary patch literal 625 zcmV-%0*?KOP)i(@G;~XGkRo5j0+7 zp&3Fkfwje@OuMLkoN9p1)8ip`DyTm=&UaD+<@{qMyDHT93R30F2oM+_e>C zuRB_BEacZuanq5r3q;+O(Qg4DG@a7@WyG=RSlB_M;BBk`fL5(>_|YoHrR%A}2a{GK z_6YVP%nGIEGrUHV;m1{EuZ!H>2G@z6S1bp^e_9Q0*6r9POgl=^8BAF>n6KNApa-&q z=PD2chXk)-DsVw(FzJUw4m+R(oq-t)&s-o5o~b|*cxD1g;Q+q@yQ|R)l&`4Q00000 LNkvXXu0mjfB;gk^ literal 0 HcmV?d00001 diff --git a/icons/cura-48.png b/icons/cura-48.png new file mode 100644 index 0000000000000000000000000000000000000000..5fadb70f0fad9253ccdadd00406856234e8fdec5 GIT binary patch literal 1030 zcmV+h1o``kP)&R41+ms zFdY*Q;KpfG7w=4V^2tBK(Kg8cF!y2o$&+h`AT9P0N>OaWSVt&Lu?b@pp|r&&O!Ek( zG&W(HMkuYZ2@`1`KRq`BqMoFrS|OPK3t5~;?k_>L3?kO;oo&0wYy+WR8D>bUb*ceo8f{!HnLE}n>^NW z@c>SKx;O%k^&};MkN52t$nw2*YqP>N=+^VW>mOU;Y&8^~;b31@I8Cf~0Tl-apQ zRqtxY`PE;~L#-MuVD}qze{ce`c@SgbZ8tQi_5thpUjSzBhCum+0Ut6`595{z>=c-GG`3#zC-wbTyA{6yh7#V z81CM;aQD59vt>IdCpOcQ$Mp2t*Y{1&sUDZCEK~YyKeA9($>zP2Wbcg^%$j#@F9M)>i9>0;zhcdiA$a0C&%uxUat-r)f(O@M0M-ZWrCdC&=vG z-)c?P2zVmFcq{_|Cfh^LkyB&~pFpm!mD<)tpo}<&OGAUFV;g{aPjnp`CHLizxUU|B z{!OjY7>R&~$moN@vu7dZ9~@zfamWljPv*!ef~5ugTfYF%u&&QsBg z!bhA2OC$dJ%a)GiSW2M5tRQUHq5o#tN$wlkUU%(^r0)slSYeCK&4vvc-j6^2t7ua@kLo&X*&J$D>YCMQc8JQx&^M0hYH zAgSU@E{P726%`lAT96^K|q?|VUq&V1`nGMkVbe2DIl%z08UUr;rPXF z+tS}+5?=fG^K(#NM6c9A`;n(ocWuSmc7OEoclu@FRJCNgx(w`!+yT(d6})q0+{rTj zg`e@SOha=;GUZ0>eM1yp`5^N6+x`U5gA@<8ee}*mezke9-m($|KwIa6&5W_Fsr2hJI z_?2@;7T1bc>o3IcZj~)1N?}anM_X78s%g};~j)MJn!;vc#~&B*Q>4v$vplncHe%i z?LA@uX#%&xL2)NO4_9beWQUKC85}`bwzRFW$OLGO`{OsEN^>J`lj%PwY8OYW;F8co#2T4^YnOr>?A(pr-79GmYeWL{jcZ^v5{(x>aByD1iNIUK_-nJOes#`_QteEhlD0tI^9fmPQ}h z)VaUf-m`ihuwxgh&;eHT>!9u_;XL$cM zp`)OTegQSER6J!57!?4Jed2lYM?Qg$PSaDHOvO|7K>gs3%fyc(vo;`vs8eYk7(?>}svfd4a!X%G9BE5DxDZh^MR9pEAD z0s`P6%>qKeLs|udgohLg(CC@4@Q^YA8a?AH=RjC^NRfaj@Q@M#QQ;v40wnN|Z~;m; literal 0 HcmV?d00001 diff --git a/icons/cura.icns b/icons/cura.icns new file mode 100644 index 0000000000000000000000000000000000000000..eac1092e0e1c2e8cdebe3d510ad59004501d4feb GIT binary patch literal 27026 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 MHhgCA(}$=31qu%R?f?J) literal 0 HcmV?d00001 diff --git a/icons/cura.ico b/icons/cura.ico new file mode 100644 index 0000000000000000000000000000000000000000..c6b554301c76a062174db69999f308d51b596708 GIT binary patch literal 31206 zcmeHQcW@oW8UJ1{Crh}xnbjq!899FOfi_I2cZX3O%2_2 zl8|90fee8tlL91!^g zmO_$Njz7g>5&rzV0het{!IJ55c>cO9Y->-#dna=+Ze$GZIFx}mZ_UBMbt#z97>AD^ z&%>9mRl(Xt33%X=4BWIo4cRonq_Hu0;>s+Htd7C=?##iSt|ZK#9EaaMZNSSnW?}Qv zB>dxL115})!PD1d;mWg8&^9vxi8#PtPaCjsY8<{<$iblvDd=66gwJ0wplM7Dp1n2; zj~~lGCI#@tt5wig7lZG7EeGGeC5Pt*Fo1TyL{8sD%yr1=N#w8>vF}H2LuF_LhDJa? z0@bP_n5)#)_#VWIT5lO>^rnGM&keMCW}w%X3|#coK-6avP1CZhq=*7f($bGTlb|&C;D-6uO%-a`bJBZTa#v@zP3f~w&WTTVD_T8)l+Km0n8IUmWiy4 zVut1wFiLvbM+Y8_c#z9NK136EkdInlrGQrbcnsk2FFgK@ z$A9qnFCGM-SiqwnkAc!Wg}inT;$hBH_{GLPv5!=sAIZZ*M>BAIR~q)ONy6#{379q^4tHOeq4Sm6Gh(o- zGYOx)WWXm+ybnbKErWD+9eg^u^NyDkjGmygh7n$df`3sp7{p{g9 zomXvYO+Zgu67Iby1J~|O;~d9;9FBT5j>8#MK<7+T$H(C(59R6nXwAX|Y+as&yDrGU z^?TFw!o-nB8smTYngL&s1LsMfW1Qj0>F;=cop>&fAcs?z;dq>F|6dTtc&I%z0$;@u zFx<-qnX|jOVaN_%_OgSgz2x9+Z+GxvZ*%ZtFFN?L7aaWATMj<$O$WdB+(Bu-Oe)l< zbfum4n`X|NJif70D050i)Iql2oXPdbudyl2h&V|0y){#1YXELf&cSZqvczdE*rS8Z zzPB`6lzq(j`0}>dZ?jEZO*g^bX1?WQ|6~loTyp^?FL;3v|_b=Fq++v0W%t zLVOS$rVVHIQYF5gL3F6El`Ko5-5xfYaLbyOs~jYI!NEw<1(M_>+l!P|+Lx2m(_t?< zbS$2g9%Tn`+KZG7qb1W+J#vjz8q5`Seaa3V85!DvUruQOG*=kIxx!q&G!#+GOo` zC$0m@8t=V(b5K7j2K#V5dL6Fy$Qtj<*Q@9{@UdfAAZyO)EXPiA>p#UcAIY;9a1BZF z-y}DFY)1+{d(nXAaWR_n-id42wwZDG%~N@J>gp`aYmNh1i;{IF$>aCmpQkzU)h!7) zd2t5UkXgEJ{qzL`-nlymyH_P?ZvP%!7n6GcB%lBLXAEecouKQ>Po6N~_Csm97A5P- z@tD7#h`IhL^`*7%M(g4qm)I3)@#D z>H3(g<8L{b2C{Y~Yxd7E_TTWlKE-lL>2NbU?EXC} zf3_YrU2F}>UqI!}>XkMJN$~Wa$Uv; zn9fkYu2o~?(ru-J&f4Z;rc-S-2S3-MvvKR+Wzt{aW~S9G=Kf2@X>HsTIFl`vS~n}b zj-&=@nWwjL(@f_6^WCiUI`fuhhu+3bGl%21yIJXV<~n`5-o{NsZwpfnJKW5)x^B)N zGFlrqMe7_~5fKwGcVd~8P=_Z3yqd@b2~{nqU{c=?7L-HV;ZoN;4a9Ohz9_*YLF@S_Lvuzqn8 zZa$Eqx#XRlDcoOF1v8uCuyh95Bb254ir%}I?19R|rQ6c*^G6MM;Y1ED+FaW2RAaSU_pMIBxwwa%>{%kY zXR>E}_^=qw`+oLf72S8WY*qr^zB^C%cE55{4lcmE#UwBO@TFP0m#T112Hr((A3kEh zs`&{xjrnArb0+(%jBE@>)xeP7S&+oM zdJ^8~%h5euhkMevmpu!YY)Qk3J!#B=XCRK(kmTH}@q9_%djxW=!}D&ajnn-2M>sAY zoHF2jJjX>Cw-v|l9pv6VCjoEWhWpcT&-@#>SL}7fcnPn^X&l4na4-8aI2QZy+C7Bl zbOm0!q4NJX0@kjIGPVK?V;NC}Q2q%BPUUR+CQwdLF_vEfqEA`dJ_(c+(-zDh0h>#C z1z!Zp3u%w$hk)Iq%#sfRWk!_3c@vNv$}M^lC^w)S&x?R;Uv}ApK-uve0o@5W%*)^5 zN}&93&WLUVoYoQaxDbc{O%YO0Kw%t3mzF>jV5*op0xH```ZNS0!BPfQ6HuB))2Sp7 z4U{^nih$ZOqFx1oh>$d4odh(7QFS{AL)EACiM?UIXkb60=08s8+~L~!fbGx8FDsFsxmpA&FHbLf(nTXFriboh*b14G{t z=iAf$LQ^{}eu;n{PS&ig4}{B&_4t&4jG~qMj_`=VY8QM$K#M0S&fF0U*0grRM*dKCil6t1zm9#^DGMT4;(GH zLqQ1+4L2VR9xH^$DCMrJm6@&(vBJ3YsZM|1^e~}9`KWe0k8TSUDvVPX{|>D%3_ETJ z6Dgbz`_8g}4sd?BP@%jQ*^sHQsxwria88PE7|#e7DV*2Uj`KgOHC&`{URekJwc!GV z^J;cZ`xb|b6wXVr+48(_k-~ZPI))#v2p1`w*L4p39hLdmVRV-{@JEL`k&s^79QgGi zBZYIj-hp4)^LK6(o>Qq0emY=^*Z=%*BN@(XzhnGieYi;ByqeALU6@2hhKm%^tHs3S zjVU1`g>$=x!HnCRHp5H3pQ?r3Vf(Z`t~2J;p(|60*5zLY!bdfg%5C9Q-%Hw);Oo2 zB}U^G_AJ;p*x~izZ+>-7IS_Nb$}D#X?*wRCHvmdLj!uvKkBTv>#`h%P{>?iNB0liF2prw&f#Ih1gYQLPe2Du_oRcqnF9KHuzU{{0z4E`@&i%hM zzkVe*3|jj;f6srz>YAXy%-%1)*CnV^KIX)mly7`50yFU&AR&r>d@lmcvz@B}Z$bg^ zy$IxwhZuq&_?`rg4wJsdT;B8d{4dDok0z%CyB`wh{CyC}=Z{_75P(8Je9ucj->CK` zFYIpd_i7A^?~edsarT7jF&i(K>QSzAe`i&^fZQF*tX1IqAAvG(QQ=pTfD*rg1l0JI zBcQ>r7y%uAr3h&8D?~t#Ul{@}_!S}GhF=K+uJ{!o;Eo?X0T2Ah33%a0O~4aBVglay z(Gu{1A1MJp_)!w@g&!dSfB4Z6@QEK80l)ZB5%7&45dr`B(Galk@!>G!K_F(qhs4-q zd{~T4#)rn(5#;4MVct8o5@Z_=Kc0DB^=qUkF?z7uNha@*jG9e)P69S@4 z2#7KvAj*V*P41KA4oPm5Wd2+p9)v%ihs*pqJzO@Q*TXxcc+h9(gCoE#OLe0p^Cz`) zEB?fGF7qe1bJ=`?JMWOv<;txGE{~};Hx_V1&La} zBo9b3e{K}-W{>~pqWL=lyo3E502j^Q72qBG_XSM3pSMaidt8*+$$xi%cktgIFlGKj z2CRes9)YQs-U0aYsVsdzZ_=7SuZnl_=T=#=eFTd9hY*-SQ6eC}1*2Txu}F<_za$Sx zvh5O}y^R3Mwh=(tb_r0njR27g0sxWwC3!%SMFPZLBtT@50FgxkL>389xnKcMxnGh8 GEct)Bztd;{ literal 0 HcmV?d00001 From 049f3c25ffdbb5d5fefd9ae0ea63541ed64a6e70 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 22 Jun 2015 17:04:30 +0200 Subject: [PATCH 02/12] Performance: Only calculate the platform center once, not for every poly Contributes to #52 --- .../CuraEngineBackend/ProcessSlicedObjectListJob.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py b/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py index 6113da78a0..27ba592c78 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py @@ -32,6 +32,12 @@ class ProcessSlicedObjectListJob(Job): settings = Application.getInstance().getActiveMachine() layerHeight = settings.getSettingValueByKey("layer_height") + center = None + if not settings.getSettingValueByKey("machine_center_is_zero"): + center = numpy.array([settings.getSettingValueByKey("machine_width") / 2, 0.0, -settings.getSettingValueByKey("machine_depth") / 2]) + else: + center = numpy.array([0.0, 0.0, 0.0]) + mesh = MeshData() for object in self._message.objects: try: @@ -53,9 +59,7 @@ class ProcessSlicedObjectListJob(Job): points[:,2] *= -1 - if not settings.getSettingValueByKey("machine_center_is_zero"): - center = [settings.getSettingValueByKey("machine_width") / 2, 0.0, -settings.getSettingValueByKey("machine_depth") / 2] - points -= numpy.array(center) + points -= numpy.array(center) layerData.addPolygon(layer.id, polygon.type, points, polygon.line_width) From bc055a8031cb8a9811bc5ab961dfcc357d9e81ec Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 22 Jun 2015 17:06:46 +0200 Subject: [PATCH 03/12] Rework LayerData mesh generation for improved performance Rather than using a lot of calls to MeshData::addVertices which is very slow, pre-allocate numpy arrays, fill them with data from the polygons and then assign them to the mesh data's arrays. This greatly increases performance of the layer data calculation. Contributes to #52 --- plugins/CuraEngineBackend/LayerData.py | 78 +++++++++++++++++--------- 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/plugins/CuraEngineBackend/LayerData.py b/plugins/CuraEngineBackend/LayerData.py index b129942c36..c793c17504 100644 --- a/plugins/CuraEngineBackend/LayerData.py +++ b/plugins/CuraEngineBackend/LayerData.py @@ -8,6 +8,7 @@ from UM.Math.Vector import Vector import numpy import math +import copy class LayerData(MeshData): def __init__(self): @@ -48,11 +49,23 @@ class LayerData(MeshData): self._layers[layer].setThickness(thickness) def build(self): + vertex_count = 0 for layer, data in self._layers.items(): - data.build() + vertex_count += data.vertexCount() + vertices = numpy.empty((vertex_count, 3), numpy.float32) + colors = numpy.empty((vertex_count, 4), numpy.float32) + indices = numpy.empty((vertex_count, 2), numpy.int32) + + offset = 0 + for layer, data in self._layers.items(): + offset = data.build(offset, vertices, colors, indices) self._element_counts[layer] = data.elementCount + self.addVertices(vertices) + self.addColors(colors) + self.addIndices(indices.flatten()) + class Layer(): def __init__(self, id): self._id = id @@ -83,20 +96,30 @@ class Layer(): def setThickness(self, thickness): self._thickness = thickness - def build(self): + def vertexCount(self): + result = 0 + for polygon in self._polygons: + result += polygon.vertexCount() + + return result + + def build(self, offset, vertices, colors, indices): + result = offset for polygon in self._polygons: if polygon._type == Polygon.InfillType or polygon._type == Polygon.SupportInfillType: continue - polygon.build() + polygon.build(result, vertices, colors, indices) + result += polygon.vertexCount() self._element_count += polygon.elementCount + return result + def createMesh(self): builder = MeshBuilder() for polygon in self._polygons: poly_color = polygon.getColor() - poly_color = Color(poly_color[0], poly_color[1], poly_color[2], poly_color[3]) points = numpy.copy(polygon.data) if polygon.type == Polygon.InfillType or polygon.type == Polygon.SkinType or polygon.type == Polygon.SupportInfillType: @@ -159,43 +182,48 @@ class Polygon(): self._data = data self._line_width = line_width / 1000 - def build(self): - self._begin = self._mesh._vertex_count - self._mesh.addVertices(self._data) - self._end = self._begin + len(self._data) - 1 + def build(self, offset, vertices, colors, indices): + self._begin = offset color = self.getColor() - color[3] = 2.0 + color.setValues(color.r * 0.5, color.g * 0.5, color.b * 0.5, color.a) - colors = [color for i in range(len(self._data))] - self._mesh.addColors(numpy.array(colors, dtype=numpy.float32) * 0.5) + for i in range(len(self._data)): + vertices[offset + i, :] = self._data[i, :] + colors[offset + i, 0] = color.r + colors[offset + i, 1] = color.g + colors[offset + i, 2] = color.b + colors[offset + i, 3] = color.a + + self._end = self._begin + len(self._data) - 1 - indices = [] for i in range(self._begin, self._end): - indices.append(i) - indices.append(i + 1) + indices[i, 0] = i + indices[i, 1] = i + 1 - indices.append(self._end) - indices.append(self._begin) - self._mesh.addIndices(numpy.array(indices, dtype=numpy.int32)) + indices[self._end, 0] = self._end + indices[self._end, 1] = self._begin def getColor(self): if self._type == self.Inset0Type: - return [1.0, 0.0, 0.0, 1.0] + return Color(1.0, 0.0, 0.0, 1.0) elif self._type == self.InsetXType: - return [0.0, 1.0, 0.0, 1.0] + return Color(0.0, 1.0, 0.0, 1.0) elif self._type == self.SkinType: - return [1.0, 1.0, 0.0, 1.0] + return Color(1.0, 1.0, 0.0, 1.0) elif self._type == self.SupportType: - return [0.0, 1.0, 1.0, 1.0] + return Color(0.0, 1.0, 1.0, 1.0) elif self._type == self.SkirtType: - return [0.0, 1.0, 1.0, 1.0] + return Color(0.0, 1.0, 1.0, 1.0) elif self._type == self.InfillType: - return [1.0, 1.0, 0.0, 1.0] + return Color(1.0, 1.0, 0.0, 1.0) elif self._type == self.SupportInfillType: - return [0.0, 1.0, 1.0, 1.0] + return Color(0.0, 1.0, 1.0, 1.0) else: - return [1.0, 1.0, 1.0, 1.0] + return Color(1.0, 1.0, 1.0, 1.0) + + def vertexCount(self): + return len(self._data) @property def type(self): From 72b1302f9e0a8e40e732808ca494ff04cdcaa65f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 22 Jun 2015 17:23:32 +0200 Subject: [PATCH 04/12] Disable slicing and platform physics when an operation is being performed This prevents the model from jumping around during rotation/scale Fixes #56 --- cura/PlatformPhysics.py | 14 ++++++++++++++ plugins/CuraEngineBackend/CuraEngineBackend.py | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 5e4bd5a415..d7276c9773 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -24,8 +24,12 @@ class PlatformPhysics: super().__init__() self._controller = controller self._controller.getScene().sceneChanged.connect(self._onSceneChanged) + self._controller.toolOperationStarted.connect(self._onToolOperationStarted) + self._controller.toolOperationStopped.connect(self._onToolOperationStopped) self._build_volume = volume + self._enabled = True + self._change_timer = QTimer() self._change_timer.setInterval(100) self._change_timer.setSingleShot(True) @@ -35,6 +39,9 @@ class PlatformPhysics: self._change_timer.start() def _onChangeTimerFinished(self): + if not self._enabled: + return + root = self._controller.getScene().getRoot() for node in BreadthFirstIterator(root): if node is root or type(node) is not SceneNode: @@ -93,3 +100,10 @@ class PlatformPhysics: if node.getBoundingBox().intersectsBox(self._build_volume.getBoundingBox()) == AxisAlignedBox.IntersectionResult.FullIntersection: op = ScaleToBoundsOperation(node, self._build_volume.getBoundingBox()) op.push() + + def _onToolOperationStarted(self, tool): + self._enabled = False + + def _onToolOperationStopped(self, tool): + self._enabled = True + self._onChangeTimerFinished() diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 45a2148892..9fbd7a47a1 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -59,6 +59,8 @@ class CuraEngineBackend(Backend): self._save_polygons = True self._report_progress = True + self._enabled = True + self.backendConnected.connect(self._onBackendConnected) def getEngineCommand(self): @@ -86,6 +88,9 @@ class CuraEngineBackend(Backend): # If False, this method will do nothing when already slicing. True by default. # - report_progress: True if the slicing progress should be reported, False if not. Default is True. def slice(self, **kwargs): + if not self._enabled: + return + if self._slicing: if not kwargs.get("force_restart", True): return @@ -235,3 +240,10 @@ class CuraEngineBackend(Backend): if self._restart: self._onChanged() self._restart = False + + def _onToolOperationStarted(self, tool): + self._enabled = False + + def _onToolOperationStopped(self, tool): + self._enabled = True + self._onChanged() From d937eb7a177b7afa085e45c2437323edb0a27c81 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 23 Jun 2015 11:54:22 +0200 Subject: [PATCH 05/12] Defer opening the webbrowser until the next run of the event loop Opening a web browser from a signal handler connected to a menu crashes Cura, so instead defer the call. Fixes #63 --- cura/CuraActions.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index ee75665e0b..e585b261d0 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -1,4 +1,8 @@ -from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty +from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty, QUrl +from PyQt5.QtGui import QDesktopServices + +from UM.Event import CallFunctionEvent +from UM.Application import Application import webbrowser @@ -8,8 +12,16 @@ class CuraActions(QObject): @pyqtSlot() def openDocumentation(self): - webbrowser.open("http://ultimaker.com/en/support/software") + # Starting a web browser from a signal handler connected to a menu will crash on windows. + # So instead, defer the call to the next run of the event loop, since that does work. + # Note that weirdly enough, only signal handlers that open a web browser fail like that. + event = CallFunctionEvent(self._openUrl, [QUrl("http://ultimaker.com/en/support/software")], {}) + Application.getInstance().functionEvent(event) @pyqtSlot() def openBugReportPage(self): - webbrowser.open("http://github.com/Ultimaker/Cura/issues") + event = CallFunctionEvent(self._openUrl, [QUrl("http://github.com/Ultimaker/Cura/issues")], {}) + Application.getInstance().functionEvent(event) + + def _openUrl(self, url): + QDesktopServices.openUrl(url) \ No newline at end of file From 8a63b8d110d5925a127cd1d2b3659428dc126af9 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 23 Jun 2015 11:56:15 +0200 Subject: [PATCH 06/12] Fix recent files on Windows Contributes to Asana issue 33694049548880 --- cura/CuraApplication.py | 12 ++++++++---- resources/qml/Cura.qml | 8 +++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 45d4f3a74f..be663545e6 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -85,7 +85,7 @@ class CuraApplication(QtApplication): if not os.path.isfile(f): continue - self._recent_files.append(f) + self._recent_files.append(QUrl.fromLocalFile(f)) ## Handle loading of all plugin types (and the backend explicitly) # \sa PluginRegistery @@ -330,7 +330,7 @@ class CuraApplication(QtApplication): return log recentFilesChanged = pyqtSignal() - @pyqtProperty("QStringList", notify = recentFilesChanged) + @pyqtProperty("QVariantList", notify = recentFilesChanged) def recentFiles(self): return self._recent_files @@ -508,7 +508,7 @@ class CuraApplication(QtApplication): if type(job) is not ReadMeshJob: return - f = job.getFileName() + f = QUrl.fromLocalFile(job.getFileName()) if f in self._recent_files: self._recent_files.remove(f) @@ -516,5 +516,9 @@ class CuraApplication(QtApplication): if len(self._recent_files) > 10: del self._recent_files[10] - Preferences.getInstance().setValue("cura/recent_files", ";".join(self._recent_files)) + pref = "" + for path in self._recent_files: + pref += path.toLocalFile() + ";" + + Preferences.getInstance().setValue("cura/recent_files", pref) self.recentFilesChanged.emit() diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 830470c9c6..464424130a 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -37,9 +37,11 @@ UM.MainWindow { Instantiator { model: Printer.recentFiles MenuItem { - property url filePath: modelData; - text: (index + 1) + ". " + modelData.slice(modelData.lastIndexOf("/") + 1); - onTriggered: UM.MeshFileHandler.readLocalFile(filePath); + text: { + var path = modelData.toString() + return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1); + } + onTriggered: UM.MeshFileHandler.readLocalFile(modelData); } onObjectAdded: fileMenu.insertItem(index, object) onObjectRemoved: fileMenu.removeItem(object) From d28f84d7327298cbcb5974e3d6741870394675a6 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 23 Jun 2015 12:29:05 +0200 Subject: [PATCH 07/12] Abort attempts to connect if an error is thrown when connecting to the serial port This fixes an issue where thread.join() would be called from the current thread which fails. --- plugins/USBPrinting/PrinterConnection.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/USBPrinting/PrinterConnection.py b/plugins/USBPrinting/PrinterConnection.py index 19c5b5c07a..1d651516c5 100644 --- a/plugins/USBPrinting/PrinterConnection.py +++ b/plugins/USBPrinting/PrinterConnection.py @@ -173,6 +173,10 @@ class PrinterConnection(SignalEmitter): Logger.log("i", "Could not establish connection on %s: %s. Device is not arduino based." %(self._serial_port,str(e))) except Exception as e: Logger.log("i", "Could not establish connection on %s, unknown reasons. Device is not arduino based." % self._serial_port) + + if not self._serial or not programmer.serial: + self._is_connecting = False + return # If the programmer connected, we know its an atmega based version. Not all that usefull, but it does give some debugging information. for baud_rate in self._getBaudrateList(): # Cycle all baud rates (auto detect) From ab9f30a852bcf2b574962032b7b9b54cda74666d Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 23 Jun 2015 14:31:50 +0200 Subject: [PATCH 08/12] Offset the displayed rotation angle so it does not overlap the mouse cursor Contributes to Asana issue 33752130551782 --- resources/qml/Cura.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 464424130a..9756b3550f 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -283,8 +283,8 @@ UM.MainWindow { } Rectangle { - x: base.mouseX; - y: base.mouseY; + x: base.mouseX + UM.Theme.sizes.default_margin.width; + y: base.mouseY + UM.Theme.sizes.default_margin.height; width: childrenRect.width; height: childrenRect.height; From 3faccd5b3e99c0eafb94de4e377bb020dda4e8ec Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 23 Jun 2015 14:56:51 +0200 Subject: [PATCH 09/12] If findObject returns none but object_id != 0 use the selected object This works around an issue where the tool handles overlap the selected object and thus context menu entries would not work. Fixes #64 --- cura/CuraApplication.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index be663545e6..1e7936f0c9 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -215,6 +215,9 @@ class CuraApplication(QtApplication): def deleteObject(self, object_id): object = self.getController().getScene().findObject(object_id) + if not object and object_id != 0: #Workaround for tool handles overlapping the selected object + object = Selection.getSelectedObject(0) + if object: op = RemoveSceneNodeOperation(object) op.push() @@ -224,6 +227,9 @@ class CuraApplication(QtApplication): def multiplyObject(self, object_id, count): node = self.getController().getScene().findObject(object_id) + if not node and object_id != 0: #Workaround for tool handles overlapping the selected object + node = Selection.getSelectedObject(0) + if node: op = GroupedOperation() for i in range(count): @@ -240,6 +246,9 @@ class CuraApplication(QtApplication): def centerObject(self, object_id): node = self.getController().getScene().findObject(object_id) + if not node and object_id != 0: #Workaround for tool handles overlapping the selected object + node = Selection.getSelectedObject(0) + if node: op = SetTransformOperation(node, Vector()) op.push() From 6b5c3d5878d27e16c74effd940a8b9fb5497e418 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 23 Jun 2015 17:09:42 +0200 Subject: [PATCH 10/12] Display progress information during processing of layer data Contributes to Asana issue 38547857084327 --- .../ProcessSlicedObjectListJob.py | 39 +++++++++++++++++++ plugins/LayerView/LayerView.py | 3 ++ 2 files changed, 42 insertions(+) diff --git a/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py b/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py index 27ba592c78..4c6e0fd2ea 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py @@ -7,18 +7,30 @@ from UM.Scene.SceneNode import SceneNode from UM.Application import Application from UM.Mesh.MeshData import MeshData +from UM.Message import Message +from UM.i18n import i18nCatalog + from . import LayerData import numpy import struct +catalog = i18nCatalog("cura") + class ProcessSlicedObjectListJob(Job): def __init__(self, message): super().__init__() self._message = message self._scene = Application.getInstance().getController().getScene() + self._progress = None + Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged) + def run(self): + if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": + self._progress = Message(catalog.i18nc("Layers View mode", "Layers"), 0, False, 0) + self._progress.show() + objectIdMap = {} new_node = SceneNode() ## Put all nodes in a dict identified by ID @@ -38,6 +50,9 @@ class ProcessSlicedObjectListJob(Job): else: center = numpy.array([0.0, 0.0, 0.0]) + if self._progress: + self._progress.setProgress(2) + mesh = MeshData() for object in self._message.objects: try: @@ -63,9 +78,33 @@ class ProcessSlicedObjectListJob(Job): layerData.addPolygon(layer.id, polygon.type, points, polygon.line_width) + if self._progress: + self._progress.setProgress(50) + # We are done processing all the layers we got from the engine, now create a mesh out of the data layerData.build() mesh.layerData = layerData + if self._progress: + self._progress.setProgress(100) + new_node.setMeshData(mesh) new_node.setParent(self._scene.getRoot()) + + view = Application.getInstance().getController().getActiveView() + if view.getPluginId() == "LayerView": + view.resetLayerData() + + if self._progress: + self._progress.hide() + + def _onActiveViewChanged(self): + if self.isRunning(): + if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": + if not self._progress: + self._progress = Message(catalog.i18nc("Layers View mode", "Layers"), 0, False, 0) + self._progress.show() + else: + if self._progress: + self._progress.hide() + diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 17cea9988c..617dda411a 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -39,6 +39,9 @@ class LayerView(View): def getMaxLayers(self): return self._max_layers + def resetLayerData(self): + self._current_layer_mesh = None + def beginRendering(self): scene = self.getController().getScene() renderer = self.getRenderer() From cbfdd08800a2eaf82943db3ec20c9f725bf7fd51 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 23 Jun 2015 17:58:47 +0200 Subject: [PATCH 11/12] Correct the bottom offset we add when setting the volume for scale to max Contributes to Asana issue 37107676459484 --- cura/CuraApplication.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1e7936f0c9..1fb243ab0a 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -477,7 +477,9 @@ class CuraApplication(QtApplication): self._volume.rebuild() if self.getController().getTool("ScaleTool"): - self.getController().getTool("ScaleTool").setMaximumBounds(self._volume.getBoundingBox()) + bbox = self._volume.getBoundingBox() + bbox.setBottom(0.0) + self.getController().getTool("ScaleTool").setMaximumBounds(bbox) offset = machine.getSettingValueByKey("machine_platform_offset") if offset: From 074ebb92430e5a35e23f12ae4d882c249b393f4e Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 24 Jun 2015 12:06:00 +0200 Subject: [PATCH 12/12] Update changelog --- CHANGES | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 64858ff8ea..bd9c26751c 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,22 @@ Cura 15.06 is a new release built from the ground up on a completely new framework called Uranium. This framework has been designed to make it easier to extend Cura with additional functionality as well as provide a cleaner UI. +Changes since 15.05.95 +---------------------- + +* Fixed: Selection ghost remains visible after deleting an object +* Fixed: Window does not show up immediately after starting application on OSX +* Fixed: Added display of rotation angle during rotation +* Fixed: Object changes position while rotating/scaling +* Fixed: Loading improvements in the layer view +* Fixed: Added application icons +* Fixed: Improved feedback when loading models +* Fixed: Eject device on MacOSX now provides proper feedback +* Fixed: Make it possible to show retraction settings for UM2 +* Fixed: Opening the machine preferences page will switch to the first available machine +* Fixed: Improved tool handle hit area size +* Fixed: Render lines with a thickness based on screen DPI + Changes since 15.05.94 ---------------------- @@ -150,18 +166,8 @@ For an up to date list of all known issues, please see https://github.com/Ultimaker/Cura/issues and https://github.com/Ultimaker/Uranium/issues . -* The application has no application icon yet. -* The Windows version starts a console before starting the - application. This is intentional for the beta and it will be - removed for the final version. -* Opening the machine preferences page will switch to the first - available machine instead of keeping the current machine - selected. * Some OBJ files are rendered as black objects due to missing normals. -* The developer documentation for Uranium (available at - http://software.ultimaker.com/uranium/index.html) is not yet - complete. * Disabling plugins does not work correctly yet. * Unicorn occasionally still requires feeding. Do not feed it after midnight.