From aa9994fa352b3cb319febe65d8399c1a1e1000fd Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 22 Feb 2019 10:01:34 +0100 Subject: [PATCH 001/236] Gizmos overlay using a single png texture --- resources/icons/gizmos.png | Bin 0 -> 19859 bytes src/libslic3r/Technologies.hpp | 10 + src/slic3r/GUI/GLCanvas3D.cpp | 330 ++++++++++++++++++++++++++------- src/slic3r/GUI/GLCanvas3D.hpp | 5 + src/slic3r/GUI/GLGizmo.cpp | 122 +++++++++++- src/slic3r/GUI/GLGizmo.hpp | 74 +++++++- src/slic3r/GUI/GLToolbar.cpp | 61 +++++- src/slic3r/GUI/GLToolbar.hpp | 22 +++ src/slic3r/GUI/Plater.cpp | 6 + 9 files changed, 562 insertions(+), 68 deletions(-) create mode 100644 resources/icons/gizmos.png diff --git a/resources/icons/gizmos.png b/resources/icons/gizmos.png new file mode 100644 index 0000000000000000000000000000000000000000..448e826b88957e45c9733632d69557aac2d746f6 GIT binary patch literal 19859 zcmcG$2UJsC*DksO()){mfPkPPh!jOYkoF=)K}0&z6#8MtyE9+(YAb^PUF)VrNPJ5Wd+;-f$!!te(o{!FG+|s^l{FIRc zfHUBh>fZ*wqpK4>z9;8LDL0R_H)z^&0D_(6FJY#Kz?$D6SgUzJscPf#zd9TSG{bqi*#3XZ+0M-DZ=7)eS?3+URE z->8)=C7WBeyQ0Jrv+`utOj%X+J0&VSJbV~1v#_vm0|5bn2jpDW-YOucx*g8&=-Z8$@Vs|2K(C!rbK2}oNFt*( z0(HK9w(u_Ab-~!dOJ+wTdMH4fTp@6BnbUuR(2qac^w%$=4V^BfZKIx_0V$OJ*iE-{ z0-rFFzzWfduueS;R>$E)IQ)7n+o}X3!b51S; zDsEdBG=V4%l{tXgKJW!iar1kAyGTj2W_||(%x`RgP~nc1f{}WajmNADBg-Q^oJtSp z;!h%!)h%!JmR`RS{0Q!T>|OM;*7xRLECZ#K%9vgouHlIET0~L8=DaPI9x!ArGeWhHywuN|){j`t{(9leRPvJ?>#EfmMS3^(_qoFWJOAji0L z($lt{X?f&mwGX$*6mjbJEPr5*(@iUj0e^kztfKubX2l&UHTt>tw^R+3?0`FB9Q^aR zWtjnSf|eh@+)IyY#u=KX)o+glo=BC;9C1`TFVuSRQdgnN#2N8QpyT5!gTI7x?uOOep_|xW5#_p0y4-XG5#~L0bC8f&L)Kp}1 zbFdPU72LL zE|wjYptm4=H0{_kH0aph;Q#7Szg|5pe<+XVja8BEj}@t9d0VB`WF^w1K6%*xv!Aoe zvQ|m(%qRe0E$Iod{TPw?;~EiGg>3j z<(z_Bg3w;#Q1e4%f;(SgH1NneejM| z$e%wiW)!Pp4;5d zu;eH@@tm>?(8pFO*fnPxF6o z0_?&^R@|kCOL`7oO!;Lsaxqrf1M_)ha`|)V@Xj`d%J7)5qT6OEF~)iq#BO!AiU@Nx zTyb72a=@W=!Wn-5xRDy3XUEXk0dj5%qu=Nq4!uy;(?kl-8-pAncx7?BJx=sw4O zF9Eb==Khdlzfl|UxNWt-;zQuN`E|L+zKKP(_7<&t3oGl@-k$xNV!Dbx!N@BCB1}&N zK5$(HD&ex=FF=o))~nsWV~HPYa(g)mqbM8|yQ>z0@S5Hvqk;}?75Pe`R>21IYiyTp zG{mobSfQc!?DOO!H8~H$-(AN7KGCkbH&Y~v*mYcgiTip7v?%h44y)E?}8cfWSfz|aj8vyfxVpscF1Bgo zLP)c$4S{4d?2NR?Yf`y$nxq4WgopbW`MQ_k7wrdaQSIlw4upqBdUVCgQ`XPDP&(Nd z2*?rgq9NFCqebt{^?cIZ(~eKi>s`-nh4J!_5gYX&r`4YXW9Ady_N=q{5A|0(eLnM{ z&g}NcKMkXt+cI?9n-*8EJ$QIK&pz_S4;Lq2KjQ^{-a%DWqsQPj*HiJVxLU*|@=YqB zffO6RI}+^(#KC-JoT15D?fg!829qJ)8xf5zN$0Lz8mfZq4rvHM+f=xg1cJ zr}r>T3|$b3?j4+~6PZXb$8T5ee$#)qzDbbGytxs+iL^Vpq%bjkZ00}xaa~KS1PgtT zJ7r@QO)L3k)%Fkm5auI*m7OVvYqg1VgJJV%qr0Z^c3z`8AlTi2z?NI0Z|JIZcgral~q_+ zn8HgG=06?Mz`(xqVX%O}P*ab|%m0=GeM*pD-4f7i_XS_r<>#~9(~$KULwTazMdpiE z;^Ta*%t0E7x$Wb7#7?2UqHFPK-^IppUP=TmIoEeDn;{N6qb{*}%t61wvh&~Ke zFfn-c?DMz2)#X8kZFjm&&oCL+?He$na-m)Tb?{pxr1kTIoHHjw1IENZ+i&cUg1cC0 zMA9?=B;-c+GmM<7Z!^92?PEdN{A)!ed&v}jSQoybM=f8qUZA&ro)ah$4M-#3JWX$9 zB8g7kTM$`MF#Z!^m4a*zbMOz6(2v}{w|*KlBNhnLB%@$6siLExEeC#yniCDkSZWxu*t5X|_9%w+-kjkOLo zVhU~z?%A(^w%Gp7Mn?LM3#)|NT@UolU$&%`{^#xV7jAA`L9nW-_ot5i;J=0EnZRh{ zCR>9n^heYk(q-`)Yl_43L#$38X5675vMelGZVSQR5!Se9R*`h3= z&Y=m91FU*<)vGd-c3w=L zgOQf+1fZjO!L;qp@lIbRt7v-qrm8`-J&3!9;)OomIDCHUSq#sdt7^>q;x2A zdo1XLJil~C8_8{>bLNSY=i3*%b1RoP0+CmaT#egwROdcPg1ZsNJ3x@kcQQUg2?#Y4 z?1HJ-kzrVpyTPPYeW~`y@~PdpGd{f9IHRNbofEj;_N-7?QxT55ngYP?)sfvG zV3df*XKp9!OLQW>g=W5PCD`%DNlLY&AE?e{Olk+#&at)Cz1xU4C)x!fcNf1NDYfO*WEmwr8b# zem%K{Kd5$Vk(5&fs2zE}MU8LyOcos!RoBIY$+5&xFrf7C1W?>>f@k9ZfuKEz3%yvCDqJtYFR1)WQ&FZ&We0p^;Kwyzg|U zZ`N!tV0lK|CyaU{gZEXCK)FU?df_eTV2xdX{0n9^DbdllCxf(7p0-yw*91FT!8AAE zQ(29Ghhg0!!Nl4`Av-0L_5df z5hCjIG6o3_Mm}JT2bqU|A8&npIOl2cGMvTVxr=v9Q#y-2 zSBlpT?)(DtSY8bdB=DV2h?)@5IZB-(ojgsCV*U`%tm1gTmjZQJuiZ_99cg=y5>+o1 zBnsVxX7+%C=%pGUpAg=OG91QYWUdhM-`)ro3glFY3xLh#J^_y-G%%QBXWt_#{> z@5nOpmr^o^@-`sWiy4R_0@m2KHH-NsF7jhUE8tI#EqxYv`~;Nkh*3;6`m#4uTwn0W>iYCFDyEvkaf+Wlktl`c%>8v)1z#x_Y}0|3qTTxJ9pU)qoP@)) zYNNR84{S$e*rX8mUSyBF#?BAgvaJ-&z5VT%$jWkW5*XOJabci)@60uH;r*Id9Zv%1MiNm zlAN_(p+GwR`=YB9Zdq?;Obyy*TLiG&C~Xi*!|yIy7ufSyt@!Q5E~^n9!tG>K3Jl&B zX`Sg1KDx_iN|b-Fjh~qA89tFUAD5NZeo5{+_DBEuBwV(de1CX&s#d&xFK48Vvuml@ z^A2jBecKy3QT9Va`_i>{-XU`$`N$=4J%FWJfXNK4jGMWTP5)wA>#?eKrOi_TK=p!| z;r)Ua@wYx(g1v9*j%;D26gjrs=c`?H6 z;g(0J!0%Uhks**z`zkSfK4Wj zV5GSm@$B03P=#^DJXWTE{U#1!H*nTmLq}l@yQk)5MQM<}L$|3218d`+{fqRaEDaC4t?SgPX%6IrSC_q``SaZrvmB`*U;8zz!>muEJwT)D&q6 z*Iv_NDf8L-<=9`eBK0_-i#U(kw6rljlv%j1qG~`iIIsXjI%SF}W37k`QAJjtpRGgL zJJAkHm>sw#Gs{I32WFU?T7gR60m4%{&cOiHN-2WA#YBiCAOc)-#) zmNz5k>k(n?td54x9uAJqqC0ZLS25uL=A7>3l*-gwHB#!|q=cV!OKclDc!{MEzcMV1 zk)~!q$7SD_MJv)cC}rP!53i~^_klrKP3?1u?vo(V;6HPO)|7Sqm~ ze~Ur?O22_H>K)8nKWgUJT3?ZLBW13+GWUW>FeASdcm9lxib9Ha)Fz|i8%wtdEH*_! z<$6n~zdD)nOVu{VTFHadTBA5ea{{uysYad3|LRZZ;;hD#p8Ul6-oJmJ2HZ}RcyFVk z@@y2Y4$?{!?Upcc@V z>Nn_}zo89Hga^5JoXos7mTh0AljT4z@!^Hl;&0_>^%lYV^9~!VISh^AW5=~Gd}}GJ z+C+ta0g`L+Ki(UP9V>Sn`eae-EzKmJ9cNbIgo}rMzPG?Pl(Xv(BA#ujB$Wji{y*S| z|8Vf*-1Z`JF{0tJN;oZ_jD^uxcX42W*hRQep^QK>88w*t_}PO;nG&Vno_-FD-QQ-b zHFQFc&gXPodJpLn{O7*qi-F^w_b56F-k>AajBCd|lj?B+HPz8I6Gcxp1RJ_s>9(T6 zcRiTsw!G=~Jvl7bzx_n9$F)8i7f1?_tvomT!21i~=lnA?5-Xx%f5_IP`p2uXtMxN9 zo&m9lC<9uHzffmEFr^!BBLnaQ23>acUjGEl z2dj%R{Jai)zDIdu$77Xr2N6$Lza6U>^4GV{yQuGkCPc$E29ocr1d&olO23jbkB4S%tk)G8D)%Uhv-pzysiD0)!NmWH zSwfPP=|k^>b0|U=UZCX%Wm*08(Zz0{GmREGPyES!%h-pnL#VTG9j8lJpTsqn%t5sO zg;QK6mPpUc!i}Qk0(22XW#ECxi$g21tC;7nF=`4=fGDt;talPaxyi?`djI^24@EIc z<7Ix;p3%Ar%gl-_EanX)DF@_Wj#VfD*OtiVhcNer2wE0bpa=NsCG(m~eJGgr4?K6q zd=-5#+yO;|1 zca%O-h>3ZtuV)>Jhtpf;S9jy*6r^8>kSpdx$|a;2HDHnB#(Rw~xSJD9LwrBkEE13J zzmlHY(<3E8yR{RuVJ( zz|Ml=Zto8Wp?JX{7)DI}&97Ra;BDd{k)tV$L~K^am2jfcz#sy9lX|P91gU}eeoGkn zrCApIn*p#-z-vCgY*?gAB%AW6SBHeJW`4lE5p*V)+2z_3uc)H6CK2rie|-~7Z7|K^ zu3g{$1gi=!_FL28h)P_&>@{Gfa3dBP#Um5XjDSsXVO(43I%68v!+nxK0#96nB6l|W ze&%lZTqqIWlz_QVF(U87<=^k4q|s!XI^aB;MY6qKnR737XRO{bz@L~h1bn9=(KBaI zwN6*J(dUtB2@6Rloz1S2?Lg3%gm0N~UBR6rDupBH|46^PH=R zE#FGNm~TnYRbZr~M--b1qk0lAYgSGu5%gZ8rkxIwRKlm(KD$#Z z)1$0K*pcu9O0dv0{;VyFZ4D}aY~ZMPApT3#w_me^mXp6*t;TcZD1LOVvq}5SFQxL- zzqLGUz;D+lZ0j2~tlxh{CSOO&qz8g2trby$fGEL)_?xf%b)@BcvVVgDnn|^_HrvMoAx0$Bwafnz0%gvv(TUD14L#`RW9% zbDET&f@JBGRUbN#p9ztuKi&uep=4E9JJ#g-pbIyt*#_6diSC1gcTPc}^vg?dB{mj@_ zOy@n^=1qy!662`FDvF*`hhWGK6hQ~(M{rZ}Df)5!1jDGCqEAl`$9AE~4u{*%jK8OM z7P?jjbF{gU9)rlLAZr!fmzQ>-8}o1QxVeH2Rb;qmb}+s-6A8)GRG2e;LRA|hA zSnR&-QTa=*UnIj-5);bvt)8o#cF*Y)&s49(@R(>`u`0W{h)|avt|nhVaiIR*FPMlH z%9BfQp_u4>67$Qd%=(xU*_C3s55}pQ?8mOh#T4IDyGtEI*;Kx%l;or|o^|To=lK8w zXXt(Hb#GXc2>bQ7cvy>hjFaMdZWd5O6D{+mkhe^2i%-^l&ItVO&HS;g5U?L*QSZOk zA9Gei>}n;=wU~Q}K?0?lS5d!Oez-7g?XC=UR_a3fEDv4CzWiswIZ;|mqC8Z>e_S*% zvU}*--G#axfidU*E;3)SlzsB+9pGtt#QVnh<1 zgt0T3r}o|W-oj+wEm|%2*l<)%go7A#R^v5(#PgoAGV17^LO_c&gn#ePYb%RBfoz+( zp4SBgC3zJUECv*mx-FeEX8f>k04EE6V|d5EF*B(+2{-6FwwNf%`kzHk&*KX{<|jc zVD-Gle{cCCM2PR@RbPgm{snd^|Dm(C@@htZ`Vk*Z-C6C8F*%{pgt=S zs;cY@I`8@mtk8t_(@kL-n-b>*N|5AkGAIj`@R{VOx>v|f(O|(IafAd#=+c2RqA+=o}M`_x~n&QN_jnu+CxSiRk{-oHTJfA{xDwpM~-s~{@8 zmB65U31zBH)D->!Ob}C2{NJ5~&v)X;n-umtPX6tYZuYg}aeMZT231YI=TM~BkRWlT z2t9eYR*7jKj=7?bM^a~cNY|0&LJfjD10S&3WW}c&B~`)?9^Z|MQgc&4IRm+2-0_no zylyb>r_!N_D~}KH_e$-`17=^ztP^J<#ij40$w{^KEpn%zFu_M_yM5VOe5V!sJx?;- z6A(DM3ho0jc-1G@n^5z=VD2Hq(l@Hlcl%e&^x-@r9~QRvObm_B z5QlA|8T<|=e2g0om-988%XPA|vrozUZsusGNb}%VOM3)i@XnNFvJnvIF!W(;R09LA zOI8i>?QGu?;(MxwZV89c@K=mX*_z8Cp|ZlLR5_a2UYL-h{`z#a*WU6#;&q>ORiLGK zv|73&pZYTV^AI>q{zFwmFjHAP`<<-EXaYXw?$0or3!Q{kzpdciQ!>7aW$4nr|eBx5_az-T^+E z!sH@C!M{Kq&6FblcP@=kW)*x%T=Gt=HzBPC`QcPVHM!vx=QGpGi&`@6};-`Oh!IA7j92N(qKg@$bS# z*HJel0&CMG6RD;y(pzOaii)KnC#uH{)?!xj3)$n?X^$DpORA*GM$pJey^ELdrMO@`O$`8qX}N} z%9TPNc!gW)>gp^cp@5`gq5@rvRBmH-oc8_1{XxVj-CoDR{j-3hO{r9jeFnPMDF$w7 z`MjZ(qP^d}vqz?N3;%wcJlxG|YMeA0B4_U-&DP7}w!OhED9||dU?WC+C&3H5IsKWG zg3vQCFlfRXIK|8B@+%1y5)$$g&ab@Z)=aZV+I1ho>$6A!0V*jVs8&pcasy*oabKk` z1z)%R+UDc!L}o5cgigKGe}7e0Tu7*OW9sX3CUp&sfU!^5BIu$&Nu~zEqOB`QgQaFA zED};hmLU$5PBnaP`K0!9vRS7{7gP6FBioMIG91L}`hWvMOGihCN6$M2CX-qk>n*58 z`^E{(IQ|y4bg8n=Tg$9s^F45^B`C7YJKEd-&WtY3*x+1!F2;7!o+oFJHba^_VP_iI4Y- z=TaY4G_Qhxg>jLk2pt{WdFYb`F1Ua=0bia*aLOgSmLZgNZaHYnCipqj$326GUJ`@u zeDsS=ShF^Wgo23YT!3G-pvbt$fhA6_MR=vi+h7ak6Ks=|!-m_}OK46h1qWu5;vBTO zull5$^>U)jcqWjDu)a<|)M0FhuOS*ebW_#21#Q!&5> zD`xDMg21v_uwzGStB{@xTVVYMK@?mVdA!}g!1zRVToA$uv8fhxDY(mr>E6&S~!-DfyUQ&s|sl zE7oeIWbvXhLF2b}dOW|2Tbh_8E><{?tvmK*-I|lZ1eWS&_R^0O-)|zo6wsx7r?7KQ ziJVm0KZ*|7ATQ>FH1TAq+Lp(55=iJukBQOkhw1FRea|~>zvYj)p#{*Gqsb#62W$^o zZU0bpB$W9-DR=+xnY+_J!A;>XO<|AhIAOhZ*X%grKYEkv7hS9J7fC6B89O_B1ElrK zk?Rw+KAmBF!NbD*{QPlY0xU5>G*l-Wy?_hAaw@yd>(~Ge#Hs{=MJ4qkRNj`(LwN=s zdc?Fu2ttbC!|iNsZ7mNLnB_lz{+ztX3LQNA{UvJ+jJ!)m1*X|!)gJbCL7h-C@dnCv z`*@TEQDKl2Nt6$+y>CBxI$g-SET?)LUy_wL;j?@E?(>`HNM@Egbas;H>^&eP58 zXM9Xe(mrs5>n9t#p`13HS;hS0gL?lF=4%eYwQP-FY<@_aRyd6`efjcbBTdfhVr9wR z>Ns;T1ZL8}TL{%do_H~&s_EO}1Y<_gcCHNSCTN?d{ZPnw6?7+JTqxYWKBJhRV&Lk3 zf4?a--E_N-z%Jmue2gE{94q{M#)W+IE%Qt&>q(@2mumvq@9AlNxOgm6A^b4?)k7?J zUlKYs{KaO`%5Og2qSj}lp&e%Ztxp(~p}_2J*CNJ93`$H=|5AzadPdoJZ)YqUyyjJq zyLkEXR`0SRvC{5_+eZC?cZ27Wp88^UnlWjZF3L!h&N}WHMf9?nq5ol?IfshXYY&!4 z_1d6^)q#KbZ}cxMEpb+eLH&en2m3LM-Mi3e(4rzDBGG@C=T*P68Iux$iq1tWmEa%i zo}q_?cBrfU7|nA%r*urbB8B^bjZMnhWWCuBQdR122GlmrNBlZRW(6<+!B2KmR+n)K z^75+rMg^;;QB+L4r>7Se7c1T8+aK~SsH(nBK|Es0c$!9M?F#H)Fmt3$1$i&wo5Gl) zclY-8?llBfPjI2&&a;rw}$49DGo+*&Wnd-Srg z<0(a=w=cqT5C2-Ig`AR}`e0{g$Lz}k3X=AosvBIJd01vC5lBdzIkE9YYfsFk>{f>%#M_v@>v@-gzDxeuL&>1 zR|nww-AK?|kJsZBF^=-SmhpS^cv}Wi7m#k9ghFGBE5t|(mC@5le;xmP>7dOkqqq4Lgb1Xb(wKiTyNKx-75T@Vd;DeqyG6bFS|9FM zVPYI=(oatq&9jxNB~m5rYZDUJX9ylA(s(4U84rsZ+nx6BAoG;e(n<1I-vS z%8U!BLY44L!AKixVr;KJ`OS)M8Lo+K+UqX#Y;t~ZoMtF)F<6kwmvZN!&N~b0}q5iB^l@Pt5 zyZ30Mv9x(t+jt>~9cgoUVUeh++WpaJ5sr}=!k4bGR3%*LqOkft;nJZ?0Gsl^HDw;v zcpr_Ukcpv-85<;(nhVtFSATdAxIK5Pb}~XnP%vj{vOZu0F5;0A1dyO>MDTw%HjGkV z^Omk5r8=)xuaUi@m_ljhd$i$QJ(=n+%&TuT8zbA~&3m_@W7vaduML88=gx&tQczHA z?;r&}EDvDMLOp>qXlZoo@>AeZ;XoaJb}rNWmuR^S#YC zQ~i}5beqSNN<>HsuF*H%0Kpt8tA!soJi*$ZS82lWE z3cFT=u2`-N77QHiui3y}k%#%P^MRAT$#~o)|AAC(T2#*JuQk9mHY>HqRj#$@dU9%- zXK91C`d&gnLy4DZ`Qw4kcNb>Qlb)E0imK4GJOWmkVmLb$so-TO&YXhqM;k#6kcOpe zOM05KUYi;r%;zgUBjBP4YEf6iWbafm?$L&C`Wz^})Ah|vYZoyA!vVrdnSI@TU0u%5 zW%3wajK_pBaC<^$peYI=YXz;+OSCodf&806m{v8*vql|kv#U1(z|Y1!mO1n$EzOB%TV1GtE1>Q#N#vm z{&hqIEzDGft_2wCvQ&yb5h0uC}(;tkPxTuYxovO@vJYeBh&m`To8nN(l5y zn7a=$H!_2dD&b=B@=E5M@AnaIkgsa((4(F9p5IUkVa_fWLdk*B5N4~<41|OTq}cN# zarvUCzb##OFXYJhxj_ERN_xq?hg6OVXWXTZfQ2&yTn$wj-NEA|!@J27_jNU2B;08E z{v8YP#hrQc+KgH+7Mgeb^&>!fpT^>{ z!1kBsAElLbQ0;+|9jlpreVwf3HBbKfNNH}3^H{|)EMXSc)z#tAghLTr<5O~WnG+K= zUUU%Y`1?1a5Tg)c{3b2ldzFYs6jLWr-74WX+HG7U#((EfH!7%vbG@2+Y{r}&r;q4l zS5X~Vex>iT_eX%iXqr|y-#B%du91$n6w4XeJ?510BpLkJ|Jeb z=tpYVI#izLKnoX4W9uszz6Na64^2b2xW;kvfM>AY$Qj)cBfM=&r=wzt+jIrj=Id;O>Qa{ zuBQqsdw_&FbEA zc|_=g82_@{>hPB?n6JR*q8hJXByd4EJ`$G=*mvS3MNjUlKywQxgBk*JP3`(bucwxo zVzHQHeInxnT?8z1$=^4jBU+x%E*Tz$zvWkA(GAj#6(>)oYqHpE@GhURQbZ~U5!jD> z`UZ|GDFW0Bu_8xqaE~ek5tSjsiZt2@s62|KQLx~~)V8}c>$@}R8gCjcg3$_yZfdIPoN=(QeW17ZJ@LGDxx zmEI1qD%I?bAxD$OVKtS)fUxg5($jQs198Ad#~+*@+oU9X9VA*tYWpIvCa}uU26^Th zBisbVxYCir%20aue9k~K{)X#LWQ6P7ub6)+wg4!L*BcxNbT0V90K-NJ?z*~f*wDbH zmmdc5tP|kU^ZT@QVrE7ii#1M!vr7~|-c^hE-nL*wLaR9ilb;V}TNgoc8;KYH@yZqP z{}aae-z3R@`n=}2sD+7rs~No8}Fp5YCJ3ZNo7$~1+bIz%Si&SY51=ixqxNI;L>d;XfZcS?Yaae z;riq0K23n!)bBJ%KTpD#us28o7bTJa;1PJi5VvJAC_iCP4rh>txlK@DU|sh+g_QmI z1gqs#Sz_X4n?5o!vOwQQtSpAF7NPU_KNVX42Z6-tArJ?s3&@jH;)BYi6S}QTO-;E@ zo}61*oqqo8S)dl&{79eG^~ROloWeRj&ix!%%JMsb0wB|=*g2sa4VObKWFUCc)6@CR zW_z@7s5C8(GV-dVp5>O+`?+h_T~J|bMt zNEESILz2=gHZV=`38q|!aB1wJ9|v#*SRtl)@>AzShV4tb#lV_&#a21RrXjPOt#z@#;K>fiNYEnVIsk}lw=bFR9Q)DGs8a_P^GF?cnS z)P7<|utS8@0a+;gFBLiaywa}n?yeB>AROvHd^VEHD3IpDon)xr%1r462Qqk#j07{( zbddVeo7j;t%Ric&@r^Jw#@}pfzuK@Krgz%rYuR%zNf6|7vXQgI6;|o5zqEaUvhK%A z!T0SK`bb?XQ7flYPb(DMM+IbUEm{cU!Y+KStsD6xGf%rv$+#*K^8RI)*rl!pd$r{u zVVQ^>L`G1R@z3b9A98Shw3xEgH@omNIv1z!kf1*l=_j55V8``AR>`Y{hH0BKVbD9HZy z1K@kIF$@I1@W9X>oClDW9&aCma0jM7Yj_eFef!RxhTol)WRL{%jBagh)h0Raze!7I z&;iUKE-|afuXjGpic7zE^mvW3F?+`cdS8Et_0W5evA+O&)4Wy&-$Q06in0;ja31a3 zcjR|XsIIUL_BvlbR%C}h`&t0DrZ^f>L?rn0-eJ-)slX4XVvB@sXzo_SAJiiAGTev4Yx%!Lu!|j6cI3i&k51 z@Tu}&ebUpiq<)KkH$?yEyZj%zr~l6meobn$+|p~GZBO?#4w$u2AkMYLX8!8yy9%Ly za$D>Ljh(x&&v}tVerRaocu@)<`66=vrZ6T}@32aF8WQqfzkcO~DftQ-M&Ts}uB+58 z&{=N6vB@bit1LvixfN3}-Gc2t!$9cl1O~`6S#zMg+tV%DZO{XYy~X*9>GFQ=yH?2K zz2TqlZ`7vCdI(nQq${THFa28lC28M%j)_OE?1=RHQ}*OgS*J^W*QKAEVTuL>ymvr88Lbsjli&^l8^-*=hew>y4YjnQGK$WlWjQ1t2jdWn z_u;O?1f&#=A-cB6e>4I4r?5-rRc;RnqHG879AamM6uN}4#q2)}lum(h;=~`ZKQ+1`txSHa0k+wa;O575zlXVWTJ^1uV zcJ_s~8}Z?JjGZJzZKPgOX)Lo`@PIofb6T=pI{4$+X0+IRfC+QN?7)t*h)$o-Zb``aq}ZA z9XL+&lFndUtZb(q_UuP)&$W3lDeV3nO+HCzw3wPLPD(epX0MT3ztD9( zhtdG_Wky?)oD56`6+BC~|7!xNsj0EQGouF~cj^75JOcehIs@j@kxHZ@8v<^r43N~= zq*tcMoJ3OdJNXY*#FYrs+Yek1l+JiJSF}Z4h0jB_#|b+!p1$Tb@fJ5bGxLl?)b#4N zh*AVe@6ZiQOu{V-t@|BUv??;{)N#F=9gIQ*NU%V{U!f!V(Affyn1UJmP)85tCCj?1 z3rw~G0@u6X_#?@g5oacOUlc|3Lb>gdN;so;@Y>-UwEEepNDgsDc4p=&3=HZ;Yr0sG z6o%m%uN9?|(ozpD85g{)Jye0MN|0yV^f4ekbME!cV<^XkAn8k6zd=U7`d@P z^s}if3fnyPx5hq)hr(La-WFt`rtjZYeTbp7=0@d!*RbZ8tdB=rA}eN5-dG;wP{E(D zJ_V2feN(vh?bzg9@FOm0cmZ|L{edKU_&|chx1lO#%>aia9v|#LBKRw0c!Th`#dKGP zJ6l$;J$QFa;l>3W7uLK&mmpY%%e6W_@9{E>yKaGrHa(am*vsi4xreu;^W-5Tf`vtV zrJfr};jMQVP|P#wpoMIctoV**bzVu&DvXOL_C{Fs>=ZRo33mpRfEh?@2?q#`rBGR? zZI9Z-2YnIIBFW*n=3(AI62?8wZBu&K`j572-Bt@N6BE?7F*=K=(S>V>R?1MF0dk-Aa{bZN7lbCsqUGBs~~tgaoX59Xy{Ea*pE| z-`Q7eH$v%0zLReDo1D=Y!%bmGm(flsf&_%TV2FvKOIkFLr?D1AT~-NyFux@X0wF{< z+TpT5I8jc0jEa~*+@{!!VxEaOi&6F<-8G2?U0l)K2c7{z}C+?h6ZH<{Bg< zSIr4xV>a3NzaO_h8s=%#6rT5K=`D_Puh7FwgQ_0b43`N4`LhE{lM`g=A)$AAw$+&W za$9dRCY1zJZU@_J$#g+cYJMl*ejDxzPV(KO^{Y6YG`aYIAq$@ZICL^bRkgK|Fn@V9 z2J@LyvrdhbHv|s%9A?JmAKLXM@hd_9&yEDYC%((<$L#;z#7-aaTYtdO>1NEwU(%LI zR^}1kplbilrHT4h1w}>0UfO?^Jw-LXTEzFlnx7K5377@419=*?K!r#%x_Dea7ctB* zWu=*Ux3@wA@e}czF+&{Xs2Rhve#!L%Z1+jtQr$88e`X;Y7q9-l4}U*BRXi3hv+LS~ z05hD7Vk!PO6$&jJARikDJ*&|~)f1a^ajK95uKw|&AMl$nYFI?{6BbX#zfDwh?K|8x zY`fRY5n8#qvIoBqA(+kiDBjrerM9+qklnDyhBWR+jtFKBO09@XgVy-iv}a~po96}G z-N-=`=gQ7)^(JR9PB(=_;AyQBnFT7J_3n59@^~`b8wXaX0F2cOrfQmZTL-(4P6hsm z)=&@aiODxgvo9C^s8!8KlGQ6XSe%c5Kgs2G67|e)qKQlFa^J3T|AZ>FwQEJQ&MjrT z8?o-0*qJFl{e*`L3GDI6$?VmcX9N+kAXqwxae?i*ygAy+k?f*@2Ww+8c7vbq&4w_$ zz>r&=;#s{E8?0${*Fb=d&xK<+B}|+pW|kWunihY_Q2BsK3OCSb4T!qxC3zV%tuLlM zf^1kfU%K~A>EREusw?i^No7?@MY#Pf9MS#ZHX-UlGNyBbcfj3k_`)L8Ghd}_g8ex< zaj}#gb3MKvaMHFxxgFvsLQ=3B1o>Yj8532Bs9>0Bi@!2W*_tRRPdP+yw~KsXQ;?BF zmp$5y{-_nD-57mVAgqdJDmOj2rU(+5Yx^4*WEmtcMqL-`Jb1wyv3Yy=4Jq~Of+sc} z+)|x8!2oWn7dl&C6JFN=HxO4tr%zO0Nq=SBcj7ZuhVDBhn#Q~Q-_LvBij zpGe*QOnyNgs@$GovW@)XY`@j1Q7y~4?}g(XWbsbR;$AxM=|73p*@=9 zN-BhrF3Pa?s;%?GFBUt!ese8y@AH};^~)JS$Ih@bIMv>*yeto%b3S#R1GvUR zGgZYts`AIPj2lljznjlkv$AJeukV5O(!adGEpYj1HW%-#`BUdSZ)N#UabSl29Cdol zI^Z;5=X&5G86yURxx5B-*Z#j;KHo2LcjoI4;6lKR(Hq!Nd!*>)65=k+z@W^~!@}_N z*AJt`iBJ1KZhogeRh#u4a{*u49mDl}8#MM8Ep^y?QeOP2>}Azc>S7G{Dxc4t{4|}p zPsVbQVcj)*;3V=_&}wn#I-lq|)BRtvW*g|6@&_s{+I5>@iek$N4Ra~BhKr|4-%6gc zYGuf~a@_pRoIhT|0s5ck+g6*MFEL|ah^zg2H5KG&;2h>z=7u?oE=_6@iaY^44B$kW zjZ6ebxTmJM*8jQhv-0-<=S)GRbKS3(%hMSi{QCO(sEr74`(+w)0FQ$I&-XQxk25UT z(4{mZ{;XN=ZH>SGzr9 zlD}lM=kA}r_=VU`VZn{p&))6m$a^PWy#2)9!^dPxAHIJYBl5dg#PZX>82jfwCr@%0 zh;bcw`y$^*Sn#9Xulh{u8z0iL4p=T%dX(^S#`KHz)BctH|GL&Vj6rMe|9`K)bw8|H z1?ThLCb)aDIboFyt=akR{0I-knQ~&?~ literal 0 HcmV?d00001 diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 974037516..043dc41b2 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -63,4 +63,14 @@ // Toolbar items hidden/shown in dependence of the user mode #define ENABLE_MODE_AWARE_TOOLBAR_ITEMS (1 && ENABLE_1_42_0_ALPHA5) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//==================== +// 1.42.0.alpha7 techs +//==================== +#define ENABLE_1_42_0_ALPHA7 1 + +// Toolbars, Gizmos and other GUI icons imported from svg files +#define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA7) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + #endif // _technologies_h_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e68f3673b..49399fa7a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3019,72 +3019,20 @@ GLCanvas3D::Gizmos::~Gizmos() bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) { - GLGizmoBase* gizmo = new GLGizmoMove3D(parent); - if (gizmo == nullptr) - return false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + m_icons_texture.metadata.filename = "gizmos.png"; + m_icons_texture.metadata.icon_size = 64; - if (!gizmo->init()) - return false; - - m_gizmos.insert(GizmosMap::value_type(Move, gizmo)); - - gizmo = new GLGizmoScale3D(parent); - if (gizmo == nullptr) - return false; - - if (!gizmo->init()) - return false; - - m_gizmos.insert(GizmosMap::value_type(Scale, gizmo)); - - gizmo = new GLGizmoRotate3D(parent); - if (gizmo == nullptr) + if (!m_icons_texture.metadata.filename.empty()) { - _reset(); - return false; + if (!m_icons_texture.texture.load_from_file(resources_dir() + "/icons/" + m_icons_texture.metadata.filename, false)) + { + _reset(); + return false; + } } - if (!gizmo->init()) - { - _reset(); - return false; - } - - m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo)); - - gizmo = new GLGizmoFlatten(parent); - if (gizmo == nullptr) - return false; - - if (!gizmo->init()) { - _reset(); - return false; - } - - m_gizmos.insert(GizmosMap::value_type(Flatten, gizmo)); - - gizmo = new GLGizmoCut(parent); - if (gizmo == nullptr) - return false; - - if (!gizmo->init()) { - _reset(); - return false; - } - - m_gizmos.insert(GizmosMap::value_type(Cut, gizmo)); - - gizmo = new GLGizmoSlaSupports(parent); - if (gizmo == nullptr) - return false; - - if (!gizmo->init()) { - _reset(); - return false; - } - - m_gizmos.insert(GizmosMap::value_type(SlaSupports, gizmo)); - m_background_texture.metadata.filename = "toolbar_background.png"; m_background_texture.metadata.left = 16; m_background_texture.metadata.top = 16; @@ -3100,6 +3048,139 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) } } + GLGizmoBase* gizmo = new GLGizmoMove3D(parent, 0); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + GLGizmoBase* gizmo = new GLGizmoMove3D(parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (gizmo == nullptr) + return false; + + if (!gizmo->init()) + return false; + + m_gizmos.insert(GizmosMap::value_type(Move, gizmo)); + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + gizmo = new GLGizmoScale3D(parent, 1); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + gizmo = new GLGizmoScale3D(parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (gizmo == nullptr) + return false; + + if (!gizmo->init()) + return false; + + m_gizmos.insert(GizmosMap::value_type(Scale, gizmo)); + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + gizmo = new GLGizmoRotate3D(parent, 2); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + gizmo = new GLGizmoRotate3D(parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (gizmo == nullptr) + { + _reset(); + return false; + } + + if (!gizmo->init()) + { + _reset(); + return false; + } + + m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo)); + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + gizmo = new GLGizmoFlatten(parent, 3); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + gizmo = new GLGizmoFlatten(parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (gizmo == nullptr) + return false; + + if (!gizmo->init()) { + _reset(); + return false; + } + + m_gizmos.insert(GizmosMap::value_type(Flatten, gizmo)); + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + gizmo = new GLGizmoCut(parent, 4); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + gizmo = new GLGizmoCut(parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (gizmo == nullptr) + return false; + + if (!gizmo->init()) { + _reset(); + return false; + } + + m_gizmos.insert(GizmosMap::value_type(Cut, gizmo)); + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + gizmo = new GLGizmoSlaSupports(parent, 5); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + gizmo = new GLGizmoSlaSupports(parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (gizmo == nullptr) + return false; + + if (!gizmo->init()) { + _reset(); + return false; + } + + m_gizmos.insert(GizmosMap::value_type(SlaSupports, gizmo)); + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + m_background_texture.metadata.filename = "toolbar_background.png"; + m_background_texture.metadata.left = 16; + m_background_texture.metadata.top = 16; + m_background_texture.metadata.right = 16; + m_background_texture.metadata.bottom = 16; + + if (!m_background_texture.metadata.filename.empty()) + { + if (!m_background_texture.texture.load_from_file(resources_dir() + "/icons/" + m_background_texture.metadata.filename, false)) + { + _reset(); + return false; + } + } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + return true; } @@ -3130,21 +3211,44 @@ std::string GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, con float cnv_h = (float)canvas.get_canvas_size().get_height(); float height = _get_total_overlay_height(); float top_y = 0.5f * (cnv_h - height) + m_overlay_border; + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale; bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (inside) name = it->second->get_name(); if (it->second->is_activable(selection) && (it->second->get_state() != GLGizmoBase::On)) it->second->set_state(inside ? GLGizmoBase::Hover : GLGizmoBase::Off); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + top_y += (scaled_icons_size + m_overlay_gap_y); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ top_y += (icon_size + m_overlay_gap_y); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } return name; @@ -3159,14 +3263,28 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec float height = _get_total_overlay_height(); float top_y = 0.5f * (cnv_h - height) + m_overlay_border; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale; bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (it->second->is_activable(selection) && inside) { if ((it->second->get_state() == GLGizmoBase::On)) @@ -3183,7 +3301,15 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec else it->second->set_state(GLGizmoBase::Off); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + top_y += (scaled_icons_size + m_overlay_gap_y); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ top_y += (icon_size + m_overlay_gap_y); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } GizmosMap::iterator it = m_gizmos.find(m_current); @@ -3256,17 +3382,35 @@ bool GLCanvas3D::Gizmos::overlay_contains_mouse(const GLCanvas3D& canvas, const float cnv_h = (float)canvas.get_canvas_size().get_height(); float height = _get_total_overlay_height(); float top_y = 0.5f * (cnv_h - height) + m_overlay_border; + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + if ((m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size)) + return true; + + top_y += (scaled_icons_size + m_overlay_gap_y); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale; if ((m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size)) return true; top_y += (icon_size + m_overlay_gap_y); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } return false; @@ -3610,11 +3754,40 @@ void GLCanvas3D::Gizmos::_render_overlay(const GLCanvas3D& canvas, const GLCanva top_x += m_overlay_border * inv_zoom; top_y -= m_overlay_border * inv_zoom; float scaled_gap_y = m_overlay_gap_y * inv_zoom; + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale * inv_zoom; + unsigned int icons_texture_id = m_icons_texture.texture.get_id(); + unsigned int texture_size = m_icons_texture.texture.get_width(); + float inv_texture_size = (texture_size != 0) ? 1.0f / (float)texture_size : 0.0f; +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + unsigned int sprite_id = it->second->get_sprite_id(); + GLGizmoBase::EState state = it->second->get_state(); + + float uv_icon_size = (float)m_icons_texture.metadata.icon_size * inv_texture_size; + float top = sprite_id * uv_icon_size; + float left = state * uv_icon_size; + float bottom = top + uv_icon_size; + float right = left + uv_icon_size; + + GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { left, bottom }, { right, bottom }, { right, top }, { left, top } }); +#if ENABLE_IMGUI + if (it->second->get_state() == GLGizmoBase::On) + it->second->render_input_window(2.0f * m_overlay_border + scaled_icons_size * zoom, 0.5f * cnv_h - top_y * zoom, selection); +#endif // ENABLE_IMGUI + top_y -= (scaled_icons_size + scaled_gap_y); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale * inv_zoom; GLTexture::render_texture(it->second->get_texture_id(), top_x, top_x + icon_size, top_y - icon_size, top_y); #if ENABLE_IMGUI @@ -3622,6 +3795,9 @@ void GLCanvas3D::Gizmos::_render_overlay(const GLCanvas3D& canvas, const GLCanva it->second->render_input_window(2.0f * m_overlay_border + icon_size * zoom, 0.5f * cnv_h - top_y * zoom, selection); #endif // ENABLE_IMGUI top_y -= (icon_size + scaled_gap_y); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } } @@ -3636,12 +3812,26 @@ float GLCanvas3D::Gizmos::_get_total_overlay_height() const { float height = 2.0f * m_overlay_border; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + height += (scaled_icons_size + m_overlay_gap_y); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ height += (float)it->second->get_textures_size() * m_overlay_icons_scale + m_overlay_gap_y; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } return height - m_overlay_gap_y; @@ -3649,6 +3839,11 @@ float GLCanvas3D::Gizmos::_get_total_overlay_height() const float GLCanvas3D::Gizmos::_get_total_overlay_width() const { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + float max_icon_width = std::max(max_icon_width, (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float max_icon_width = 0.0f; for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { @@ -3657,6 +3852,9 @@ float GLCanvas3D::Gizmos::_get_total_overlay_width() const max_icon_width = std::max(max_icon_width, (float)it->second->get_textures_size() * m_overlay_icons_scale); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ return max_icon_width + 2.0f * m_overlay_border; } @@ -6194,9 +6392,17 @@ bool GLCanvas3D::_init_toolbar() ItemsIconsTexture::Metadata icons_data; icons_data.filename = "toolbar.png"; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + icons_data.icon_size = 37; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ icons_data.icon_size = 36; icons_data.icon_border_size = 1; icons_data.icon_gap_size = 1; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // icons_data.filename = "toolbar141.png"; // icons_data.icon_size = 52; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 3d44aa13f..438b64120 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -749,6 +749,11 @@ private: bool m_enabled; typedef std::map GizmosMap; GizmosMap m_gizmos; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + ItemsIconsTexture m_icons_texture; +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BackgroundTexture m_background_texture; EType m_current; diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 086dbfdb1..19b91e3c6 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -157,11 +157,24 @@ void GLGizmoBase::Grabber::render_face(float half_size) const ::glEnd(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLGizmoBase::GLGizmoBase(GLCanvas3D& parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ : m_parent(parent) , m_group_id(-1) , m_state(Off) , m_shortcut_key(0) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + , m_sprite_id(sprite_id) +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_hover_id(-1) , m_dragging(false) #if ENABLE_IMGUI @@ -304,7 +317,15 @@ const unsigned int GLGizmoRotate::SnapRegionsCount = 8; const float GLGizmoRotate::GrabberOffset = 0.15f; // in percent of radius GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + : GLGizmoBase(parent, -1) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ : GLGizmoBase(parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_axis(axis) , m_angle(0.0) , m_quadric(nullptr) @@ -321,7 +342,15 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) } GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + : GLGizmoBase(other.m_parent, other.m_sprite_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ : GLGizmoBase(other.m_parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_axis(other.m_axis) , m_angle(other.m_angle) , m_quadric(nullptr) @@ -693,8 +722,17 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons return transform(mouse_ray, m).intersect_plane(0.0); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent) : GLGizmoBase(parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { m_gizmos.emplace_back(parent, GLGizmoRotate::X); m_gizmos.emplace_back(parent, GLGizmoRotate::Y); @@ -719,6 +757,9 @@ bool GLGizmoRotate3D::on_init() m_gizmos[i].set_highlight_color(AXES_COLOR[i]); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string path = resources_dir() + "/icons/overlay/"; if (!m_textures[Off].load_from_file(path + "rotate_off.png", false)) @@ -729,6 +770,9 @@ bool GLGizmoRotate3D::on_init() if (!m_textures[On].load_from_file(path + "rotate_on.png", false)) return false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_shortcut_key = WXK_CONTROL_R; @@ -784,8 +828,17 @@ void GLGizmoRotate3D::on_render_input_window(float x, float y, const GLCanvas3D: const float GLGizmoScale3D::Offset = 5.0f; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent) : GLGizmoBase(parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_scale(Vec3d::Ones()) , m_snap_step(0.05) , m_starting_scale(Vec3d::Ones()) @@ -794,6 +847,9 @@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent) bool GLGizmoScale3D::on_init() { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string path = resources_dir() + "/icons/overlay/"; if (!m_textures[Off].load_from_file(path + "scale_off.png", false)) @@ -804,6 +860,9 @@ bool GLGizmoScale3D::on_init() if (!m_textures[On].load_from_file(path + "scale_on.png", false)) return false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (int i = 0; i < 10; ++i) { @@ -1141,8 +1200,17 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const const double GLGizmoMove3D::Offset = 10.0; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent) : GLGizmoBase(parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_displacement(Vec3d::Zero()) , m_snap_step(1.0) , m_starting_drag_position(Vec3d::Zero()) @@ -1163,6 +1231,9 @@ GLGizmoMove3D::~GLGizmoMove3D() bool GLGizmoMove3D::on_init() { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string path = resources_dir() + "/icons/overlay/"; if (!m_textures[Off].load_from_file(path + "move_off.png", false)) @@ -1173,6 +1244,9 @@ bool GLGizmoMove3D::on_init() if (!m_textures[On].load_from_file(path + "move_on.png", false)) return false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (int i = 0; i < 3; ++i) { @@ -1389,8 +1463,17 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box ::glDisable(GL_LIGHTING); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent) : GLGizmoBase(parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_normal(Vec3d::Zero()) , m_starting_center(Vec3d::Zero()) { @@ -1398,6 +1481,9 @@ GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent) bool GLGizmoFlatten::on_init() { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string path = resources_dir() + "/icons/overlay/"; if (!m_textures[Off].load_from_file(path + "layflat_off.png", false)) @@ -1408,6 +1494,9 @@ bool GLGizmoFlatten::on_init() if (!m_textures[On].load_from_file(path + "layflat_on.png", false)) return false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_shortcut_key = WXK_CONTROL_F; @@ -1740,8 +1829,18 @@ Vec3d GLGizmoFlatten::get_flattening_normal() const return out; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent) - : GLGizmoBase(parent), m_starting_center(Vec3d::Zero()), m_quadric(nullptr) + : GLGizmoBase(parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + , m_starting_center(Vec3d::Zero()), m_quadric(nullptr) { m_quadric = ::gluNewQuadric(); if (m_quadric != nullptr) @@ -1758,6 +1857,9 @@ GLGizmoSlaSupports::~GLGizmoSlaSupports() bool GLGizmoSlaSupports::on_init() { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string path = resources_dir() + "/icons/overlay/"; if (!m_textures[Off].load_from_file(path + "sla_support_points_off.png", false)) @@ -1768,6 +1870,9 @@ bool GLGizmoSlaSupports::on_init() if (!m_textures[On].load_from_file(path + "sla_support_points_on.png", false)) return false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_shortcut_key = WXK_CONTROL_L; @@ -2559,8 +2664,17 @@ const double GLGizmoCut::Offset = 10.0; const double GLGizmoCut::Margin = 20.0; const std::array GLGizmoCut::GrabberColor = { 1.0, 0.5, 0.0 }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLGizmoCut::GLGizmoCut(GLCanvas3D& parent) : GLGizmoBase(parent) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_cut_z(0.0) , m_max_z(0.0) #if !ENABLE_IMGUI @@ -2593,6 +2707,9 @@ void GLGizmoCut::create_external_gizmo_widgets(wxWindow *parent) bool GLGizmoCut::on_init() { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // TODO: icon std::string path = resources_dir() + "/icons/overlay/"; @@ -2608,6 +2725,9 @@ bool GLGizmoCut::on_init() if (!m_textures[On].load_from_file(path + "cut_on.png", false)) { return false; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_grabbers.emplace_back(); diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp index a24384012..fed848ae4 100644 --- a/src/slic3r/GUI/GLGizmo.hpp +++ b/src/slic3r/GUI/GLGizmo.hpp @@ -87,8 +87,16 @@ protected: int m_group_id; EState m_state; int m_shortcut_key; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + unsigned int m_sprite_id; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // textures are assumed to be square and all with the same size in pixels, no internal check is done GLTexture m_textures[Num_States]; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int m_hover_id; bool m_dragging; float m_base_color[3]; @@ -100,7 +108,15 @@ protected: #endif // ENABLE_IMGUI public: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ explicit GLGizmoBase(GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ virtual ~GLGizmoBase() {} bool init() { return on_init(); } @@ -119,8 +135,16 @@ public: bool is_activable(const GLCanvas3D::Selection& selection) const { return on_is_activable(selection); } bool is_selectable() const { return on_is_selectable(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + unsigned int get_sprite_id() const { return m_sprite_id; } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ unsigned int get_texture_id() const { return m_textures[m_state].get_id(); } int get_textures_size() const { return m_textures[Off].get_width(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int get_hover_id() const { return m_hover_id; } void set_hover_id(int id); @@ -244,7 +268,15 @@ class GLGizmoRotate3D : public GLGizmoBase std::vector m_gizmos; public: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ explicit GLGizmoRotate3D(GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Vec3d get_rotation() const { return Vec3d(m_gizmos[X].get_angle(), m_gizmos[Y].get_angle(), m_gizmos[Z].get_angle()); } void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation(0)); m_gizmos[Y].set_angle(rotation(1)); m_gizmos[Z].set_angle(rotation(2)); } @@ -315,7 +347,15 @@ class GLGizmoScale3D : public GLGizmoBase BoundingBoxf3 m_starting_box; public: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ explicit GLGizmoScale3D(GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ double get_snap_step(double step) const { return m_snap_step; } void set_snap_step(double step) { m_snap_step = step; } @@ -362,7 +402,15 @@ class GLGizmoMove3D : public GLGizmoBase GLUquadricObj* m_quadric; public: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ explicit GLGizmoMove3D(GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ virtual ~GLGizmoMove3D(); double get_snap_step(double step) const { return m_snap_step; } @@ -417,7 +465,15 @@ private: bool is_plane_update_necessary() const; public: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ explicit GLGizmoFlatten(GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_flattening_data(const ModelObject* model_object); Vec3d get_flattening_normal() const; @@ -437,8 +493,6 @@ protected: } }; - - #define SLAGIZMO_IMGUI_MODAL 0 class GLGizmoSlaSupports : public GLGizmoBase { @@ -466,7 +520,15 @@ private: mutable Vec3d m_starting_center; public: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ explicit GLGizmoSlaSupports(GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ virtual ~GLGizmoSlaSupports(); void set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection); bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down); @@ -559,7 +621,15 @@ class GLGizmoCut : public GLGizmoBase #endif // not ENABLE_IMGUI public: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ explicit GLGizmoCut(GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_IMGUI virtual void create_external_gizmo_widgets(wxWindow *parent); diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 8d04868f8..63a8450a9 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -53,25 +53,60 @@ void GLToolbarItem::do_action(wxEvtHandler *target) wxPostEvent(target, SimpleEvent(m_data.action_event)); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int icon_size) const +{ + GLTexture::render_sub_texture(tex_id, left, right, bottom, top, get_uvs(texture_size, icon_size)); +} +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const { GLTexture::render_sub_texture(tex_id, left, right, bottom, top, get_uvs(texture_size, border_size, icon_size, gap_size)); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS +GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int texture_size, unsigned int icon_size) const +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { GLTexture::Quad_UVs uvs; float inv_texture_size = (texture_size != 0) ? 1.0f / (float)texture_size : 0.0f; float scaled_icon_size = (float)icon_size * inv_texture_size; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + float left = (float)m_state * scaled_icon_size; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float scaled_border_size = (float)border_size * inv_texture_size; float scaled_gap_size = (float)gap_size * inv_texture_size; float stride = scaled_icon_size + scaled_gap_size; float left = scaled_border_size + (float)m_state * stride; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float right = left + scaled_icon_size; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + float top = (float)m_data.sprite_id * scaled_icon_size; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float top = scaled_border_size + (float)m_data.sprite_id * stride; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float bottom = top + scaled_icon_size; uvs.left_top = { left, top }; @@ -85,8 +120,14 @@ GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int texture_size, unsigned i ItemsIconsTexture::Metadata::Metadata() : filename("") , icon_size(0) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , icon_border_size(0) , icon_gap_size(0) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { } @@ -610,7 +651,6 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan float scaled_separator_size = m_layout.separator_size * factor; float scaled_gap_size = m_layout.gap_size * factor; float scaled_border = m_layout.border * factor; - float separator_stride = scaled_separator_size + scaled_gap_size; float icon_stride = scaled_icons_size + scaled_gap_size; @@ -709,7 +749,6 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 float scaled_separator_size = m_layout.separator_size * factor; float scaled_gap_size = m_layout.gap_size * factor; float scaled_border = m_layout.border * factor; - float separator_stride = scaled_separator_size + scaled_gap_size; float icon_stride = scaled_icons_size + scaled_gap_size; @@ -733,7 +772,7 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 { float right = left + scaled_icons_size; float bottom = top - scaled_icons_size; - + if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) return id; @@ -919,7 +958,15 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const left += separator_stride; else { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_size); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_border_size, m_icons_texture.metadata.icon_size, m_icons_texture.metadata.icon_gap_size); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ left += icon_stride; } } @@ -1050,7 +1097,15 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const top -= separator_stride; else { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_size); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_border_size, m_icons_texture.metadata.icon_size, m_icons_texture.metadata.icon_gap_size); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ top -= icon_stride; } } diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 951d5e072..a5a912bfc 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -90,10 +90,26 @@ public: #endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS bool is_separator() const { return m_type == Separator; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int icon_size) const; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ private: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SVG_ICONS + GLTexture::Quad_UVs get_uvs(unsigned int texture_size, unsigned int icon_size) const; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLTexture::Quad_UVs get_uvs(unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; // items icon textures are assumed to be square and all with the same size in pixels, no internal check is done @@ -107,10 +123,16 @@ struct ItemsIconsTexture std::string filename; // size of the square icons, in pixels unsigned int icon_size; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // size of the border, in pixels unsigned int icon_border_size; // distance between two adjacent icons (to avoid filtering artifacts), in pixels unsigned int icon_gap_size; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Metadata(); }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 4da9f6652..44b65b2b2 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2564,8 +2564,14 @@ void Plater::priv::init_view_toolbar() ItemsIconsTexture::Metadata icons_data; icons_data.filename = "view_toolbar.png"; icons_data.icon_size = 64; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ icons_data.icon_border_size = 0; icons_data.icon_gap_size = 0; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BackgroundTexture::Metadata background_data; background_data.filename = "toolbar_background.png"; From 03022ce12497b17e36f44de4006bfb9fc9d17449 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 22 Feb 2019 12:06:56 +0100 Subject: [PATCH 002/236] Code cleanup --- src/slic3r/GUI/GLCanvas3D.cpp | 186 -------------------------------- src/slic3r/GUI/GLCanvas3D.hpp | 4 - src/slic3r/GUI/GLGizmo.cpp | 193 ---------------------------------- src/slic3r/GUI/GLGizmo.hpp | 76 +------------ src/slic3r/GUI/GLToolbar.cpp | 63 ----------- src/slic3r/GUI/GLToolbar.hpp | 26 ----- src/slic3r/GUI/Plater.cpp | 8 -- 7 files changed, 1 insertion(+), 555 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a93491ebd..879d1737a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2419,8 +2419,6 @@ GLCanvas3D::Gizmos::~Gizmos() bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS m_icons_texture.metadata.filename = "gizmos.png"; m_icons_texture.metadata.icon_size = 64; @@ -2449,12 +2447,6 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) } GLGizmoBase* gizmo = new GLGizmoMove3D(parent, 0); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - GLGizmoBase* gizmo = new GLGizmoMove3D(parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (gizmo == nullptr) return false; @@ -2463,15 +2455,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Move, gizmo)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS gizmo = new GLGizmoScale3D(parent, 1); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - gizmo = new GLGizmoScale3D(parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (gizmo == nullptr) return false; @@ -2480,15 +2464,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Scale, gizmo)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS gizmo = new GLGizmoRotate3D(parent, 2); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - gizmo = new GLGizmoRotate3D(parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (gizmo == nullptr) { _reset(); @@ -2503,15 +2479,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS gizmo = new GLGizmoFlatten(parent, 3); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - gizmo = new GLGizmoFlatten(parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (gizmo == nullptr) return false; @@ -2522,15 +2490,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Flatten, gizmo)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS gizmo = new GLGizmoCut(parent, 4); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - gizmo = new GLGizmoCut(parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (gizmo == nullptr) return false; @@ -2541,15 +2501,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Cut, gizmo)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS gizmo = new GLGizmoSlaSupports(parent, 5); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - gizmo = new GLGizmoSlaSupports(parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (gizmo == nullptr) return false; @@ -2560,27 +2512,6 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(SlaSupports, gizmo)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_background_texture.metadata.filename = "toolbar_background.png"; - m_background_texture.metadata.left = 16; - m_background_texture.metadata.top = 16; - m_background_texture.metadata.right = 16; - m_background_texture.metadata.bottom = 16; - - if (!m_background_texture.metadata.filename.empty()) - { - if (!m_background_texture.texture.load_from_file(resources_dir() + "/icons/" + m_background_texture.metadata.filename, false)) - { - _reset(); - return false; - } - } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - return true; } @@ -2612,43 +2543,21 @@ std::string GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, con float height = _get_total_overlay_height(); float top_y = 0.5f * (cnv_h - height) + m_overlay_border; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale; - - bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (inside) name = it->second->get_name(); if (it->second->is_activable(selection) && (it->second->get_state() != GLGizmoBase::On)) it->second->set_state(inside ? GLGizmoBase::Hover : GLGizmoBase::Off); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS top_y += (scaled_icons_size + m_overlay_gap_y); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - top_y += (icon_size + m_overlay_gap_y); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } return name; @@ -2663,28 +2572,14 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec float height = _get_total_overlay_height(); float top_y = 0.5f * (cnv_h - height) + m_overlay_border; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (GizmosMap::iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale; - - bool inside = (m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (it->second->is_activable(selection) && inside) { if ((it->second->get_state() == GLGizmoBase::On)) @@ -2701,15 +2596,7 @@ void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec else it->second->set_state(GLGizmoBase::Off); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS top_y += (scaled_icons_size + m_overlay_gap_y); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - top_y += (icon_size + m_overlay_gap_y); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } GizmosMap::iterator it = m_gizmos.find(m_current); @@ -2783,34 +2670,17 @@ bool GLCanvas3D::Gizmos::overlay_contains_mouse(const GLCanvas3D& canvas, const float height = _get_total_overlay_height(); float top_y = 0.5f * (cnv_h - height) + m_overlay_border; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS if ((m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + scaled_icons_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + scaled_icons_size)) return true; top_y += (scaled_icons_size + m_overlay_gap_y); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale; - - if ((m_overlay_border <= (float)mouse_pos(0)) && ((float)mouse_pos(0) <= m_overlay_border + icon_size) && (top_y <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= top_y + icon_size)) - return true; - - top_y += (icon_size + m_overlay_gap_y); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } return false; @@ -3155,22 +3025,16 @@ void GLCanvas3D::Gizmos::_render_overlay(const GLCanvas3D& canvas, const GLCanva top_y -= m_overlay_border * inv_zoom; float scaled_gap_y = m_overlay_gap_y * inv_zoom; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale * inv_zoom; unsigned int icons_texture_id = m_icons_texture.texture.get_id(); unsigned int texture_size = m_icons_texture.texture.get_width(); float inv_texture_size = (texture_size != 0) ? 1.0f / (float)texture_size : 0.0f; -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS unsigned int sprite_id = it->second->get_sprite_id(); GLGizmoBase::EState state = it->second->get_state(); @@ -3186,18 +3050,6 @@ void GLCanvas3D::Gizmos::_render_overlay(const GLCanvas3D& canvas, const GLCanva it->second->render_input_window(2.0f * m_overlay_border + scaled_icons_size * zoom, 0.5f * cnv_h - top_y * zoom, selection); #endif // ENABLE_IMGUI top_y -= (scaled_icons_size + scaled_gap_y); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale * inv_zoom; - GLTexture::render_texture(it->second->get_texture_id(), top_x, top_x + icon_size, top_y - icon_size, top_y); -#if ENABLE_IMGUI - if (it->second->get_state() == GLGizmoBase::On) - it->second->render_input_window(2.0f * m_overlay_border + icon_size * zoom, 0.5f * cnv_h - top_y * zoom, selection); -#endif // ENABLE_IMGUI - top_y -= (icon_size + scaled_gap_y); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } } @@ -3212,26 +3064,14 @@ float GLCanvas3D::Gizmos::_get_total_overlay_height() const { float height = 2.0f * m_overlay_border; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale; -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { if ((it->second == nullptr) || !it->second->is_selectable()) continue; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS height += (scaled_icons_size + m_overlay_gap_y); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - height += (float)it->second->get_textures_size() * m_overlay_icons_scale + m_overlay_gap_y; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } return height - m_overlay_gap_y; @@ -3239,23 +3079,7 @@ float GLCanvas3D::Gizmos::_get_total_overlay_height() const float GLCanvas3D::Gizmos::_get_total_overlay_width() const { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS float max_icon_width = std::max(max_icon_width, (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - float max_icon_width = 0.0f; - for (GizmosMap::const_iterator it = m_gizmos.begin(); it != m_gizmos.end(); ++it) - { - if ((it->second == nullptr) || !it->second->is_selectable()) - continue; - - max_icon_width = std::max(max_icon_width, (float)it->second->get_textures_size() * m_overlay_icons_scale); - } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - return max_icon_width + 2.0f * m_overlay_border; } @@ -5759,17 +5583,7 @@ bool GLCanvas3D::_init_toolbar() ItemsIconsTexture::Metadata icons_data; icons_data.filename = "toolbar.png"; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS icons_data.icon_size = 37; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - icons_data.icon_size = 36; - icons_data.icon_border_size = 1; - icons_data.icon_gap_size = 1; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // icons_data.filename = "toolbar141.png"; // icons_data.icon_size = 52; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index a7ed308cd..d322f5e30 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -647,11 +647,7 @@ private: bool m_enabled; typedef std::map GizmosMap; GizmosMap m_gizmos; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS ItemsIconsTexture m_icons_texture; -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BackgroundTexture m_background_texture; EType m_current; diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index c07523c4f..424ff612b 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -157,24 +157,12 @@ void GLGizmoBase::Grabber::render_face(float half_size) const ::glEnd(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLGizmoBase::GLGizmoBase(GLCanvas3D& parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ : m_parent(parent) , m_group_id(-1) , m_state(Off) , m_shortcut_key(0) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS , m_sprite_id(sprite_id) -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_hover_id(-1) , m_dragging(false) #if ENABLE_IMGUI @@ -317,15 +305,7 @@ const unsigned int GLGizmoRotate::SnapRegionsCount = 8; const float GLGizmoRotate::GrabberOffset = 0.15f; // in percent of radius GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS : GLGizmoBase(parent, -1) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - : GLGizmoBase(parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_axis(axis) , m_angle(0.0) , m_quadric(nullptr) @@ -342,15 +322,7 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) } GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS : GLGizmoBase(other.m_parent, other.m_sprite_id) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - : GLGizmoBase(other.m_parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_axis(other.m_axis) , m_angle(other.m_angle) , m_quadric(nullptr) @@ -722,17 +694,8 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons return transform(mouse_ray, m).intersect_plane(0.0); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent) - : GLGizmoBase(parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { m_gizmos.emplace_back(parent, GLGizmoRotate::X); m_gizmos.emplace_back(parent, GLGizmoRotate::Y); @@ -757,23 +720,6 @@ bool GLGizmoRotate3D::on_init() m_gizmos[i].set_highlight_color(AXES_COLOR[i]); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - std::string path = resources_dir() + "/icons/overlay/"; - - if (!m_textures[Off].load_from_file(path + "rotate_off.png", false)) - return false; - - if (!m_textures[Hover].load_from_file(path + "rotate_hover.png", false)) - return false; - - if (!m_textures[On].load_from_file(path + "rotate_on.png", false)) - return false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_shortcut_key = WXK_CONTROL_R; return true; @@ -828,17 +774,8 @@ void GLGizmoRotate3D::on_render_input_window(float x, float y, const GLCanvas3D: const float GLGizmoScale3D::Offset = 5.0f; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent) - : GLGizmoBase(parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_scale(Vec3d::Ones()) , m_snap_step(0.05) , m_starting_scale(Vec3d::Ones()) @@ -847,23 +784,6 @@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent) bool GLGizmoScale3D::on_init() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - std::string path = resources_dir() + "/icons/overlay/"; - - if (!m_textures[Off].load_from_file(path + "scale_off.png", false)) - return false; - - if (!m_textures[Hover].load_from_file(path + "scale_hover.png", false)) - return false; - - if (!m_textures[On].load_from_file(path + "scale_on.png", false)) - return false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - for (int i = 0; i < 10; ++i) { m_grabbers.push_back(Grabber()); @@ -1200,17 +1120,8 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const const double GLGizmoMove3D::Offset = 10.0; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent) - : GLGizmoBase(parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_displacement(Vec3d::Zero()) , m_snap_step(1.0) , m_starting_drag_position(Vec3d::Zero()) @@ -1231,23 +1142,6 @@ GLGizmoMove3D::~GLGizmoMove3D() bool GLGizmoMove3D::on_init() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - std::string path = resources_dir() + "/icons/overlay/"; - - if (!m_textures[Off].load_from_file(path + "move_off.png", false)) - return false; - - if (!m_textures[Hover].load_from_file(path + "move_hover.png", false)) - return false; - - if (!m_textures[On].load_from_file(path + "move_on.png", false)) - return false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - for (int i = 0; i < 3; ++i) { m_grabbers.push_back(Grabber()); @@ -1463,17 +1357,8 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box ::glDisable(GL_LIGHTING); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent) - : GLGizmoBase(parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_normal(Vec3d::Zero()) , m_starting_center(Vec3d::Zero()) { @@ -1481,25 +1366,7 @@ GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent) bool GLGizmoFlatten::on_init() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - std::string path = resources_dir() + "/icons/overlay/"; - - if (!m_textures[Off].load_from_file(path + "layflat_off.png", false)) - return false; - - if (!m_textures[Hover].load_from_file(path + "layflat_hover.png", false)) - return false; - - if (!m_textures[On].load_from_file(path + "layflat_on.png", false)) - return false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_shortcut_key = WXK_CONTROL_F; - return true; } @@ -1829,17 +1696,8 @@ Vec3d GLGizmoFlatten::get_flattening_normal() const return out; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent) - : GLGizmoBase(parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_starting_center(Vec3d::Zero()), m_quadric(nullptr) { m_quadric = ::gluNewQuadric(); @@ -1857,25 +1715,7 @@ GLGizmoSlaSupports::~GLGizmoSlaSupports() bool GLGizmoSlaSupports::on_init() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - std::string path = resources_dir() + "/icons/overlay/"; - - if (!m_textures[Off].load_from_file(path + "sla_support_points_off.png", false)) - return false; - - if (!m_textures[Hover].load_from_file(path + "sla_support_points_hover.png", false)) - return false; - - if (!m_textures[On].load_from_file(path + "sla_support_points_on.png", false)) - return false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_shortcut_key = WXK_CONTROL_L; - return true; } @@ -2666,17 +2506,8 @@ const double GLGizmoCut::Offset = 10.0; const double GLGizmoCut::Margin = 20.0; const std::array GLGizmoCut::GrabberColor = { 1.0, 0.5, 0.0 }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLGizmoCut::GLGizmoCut(GLCanvas3D& parent) - : GLGizmoBase(parent) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_cut_z(0.0) , m_max_z(0.0) #if !ENABLE_IMGUI @@ -2709,32 +2540,8 @@ void GLGizmoCut::create_external_gizmo_widgets(wxWindow *parent) bool GLGizmoCut::on_init() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - // TODO: icon - - std::string path = resources_dir() + "/icons/overlay/"; - - if (!m_textures[Off].load_from_file(path + "cut_off.png", false)) { - return false; - } - - if (!m_textures[Hover].load_from_file(path + "cut_hover.png", false)) { - return false; - } - - if (!m_textures[On].load_from_file(path + "cut_on.png", false)) { - return false; - } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_grabbers.emplace_back(); - m_shortcut_key = WXK_CONTROL_C; - return true; } diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp index fed848ae4..eed52b2fc 100644 --- a/src/slic3r/GUI/GLGizmo.hpp +++ b/src/slic3r/GUI/GLGizmo.hpp @@ -87,16 +87,7 @@ protected: int m_group_id; EState m_state; int m_shortcut_key; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS unsigned int m_sprite_id; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - // textures are assumed to be square and all with the same size in pixels, no internal check is done - GLTexture m_textures[Num_States]; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int m_hover_id; bool m_dragging; float m_base_color[3]; @@ -108,15 +99,7 @@ protected: #endif // ENABLE_IMGUI public: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - explicit GLGizmoBase(GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ virtual ~GLGizmoBase() {} bool init() { return on_init(); } @@ -135,16 +118,7 @@ public: bool is_activable(const GLCanvas3D::Selection& selection) const { return on_is_activable(selection); } bool is_selectable() const { return on_is_selectable(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS unsigned int get_sprite_id() const { return m_sprite_id; } -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - unsigned int get_texture_id() const { return m_textures[m_state].get_id(); } - int get_textures_size() const { return m_textures[Off].get_width(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int get_hover_id() const { return m_hover_id; } void set_hover_id(int id); @@ -268,15 +242,7 @@ class GLGizmoRotate3D : public GLGizmoBase std::vector m_gizmos; public: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - explicit GLGizmoRotate3D(GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Vec3d get_rotation() const { return Vec3d(m_gizmos[X].get_angle(), m_gizmos[Y].get_angle(), m_gizmos[Z].get_angle()); } void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation(0)); m_gizmos[Y].set_angle(rotation(1)); m_gizmos[Z].set_angle(rotation(2)); } @@ -347,15 +313,7 @@ class GLGizmoScale3D : public GLGizmoBase BoundingBoxf3 m_starting_box; public: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS - GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - explicit GLGizmoScale3D(GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id); double get_snap_step(double step) const { return m_snap_step; } void set_snap_step(double step) { m_snap_step = step; } @@ -402,15 +360,7 @@ class GLGizmoMove3D : public GLGizmoBase GLUquadricObj* m_quadric; public: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - explicit GLGizmoMove3D(GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ virtual ~GLGizmoMove3D(); double get_snap_step(double step) const { return m_snap_step; } @@ -465,15 +415,7 @@ private: bool is_plane_update_necessary() const; public: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - explicit GLGizmoFlatten(GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_flattening_data(const ModelObject* model_object); Vec3d get_flattening_normal() const; @@ -520,15 +462,7 @@ private: mutable Vec3d m_starting_center; public: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - explicit GLGizmoSlaSupports(GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ virtual ~GLGizmoSlaSupports(); void set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection); bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down); @@ -621,15 +555,7 @@ class GLGizmoCut : public GLGizmoBase #endif // not ENABLE_IMGUI public: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - explicit GLGizmoCut(GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_IMGUI virtual void create_external_gizmo_widgets(wxWindow *parent); diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 63a8450a9..4cfa9a879 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -53,60 +53,21 @@ void GLToolbarItem::do_action(wxEvtHandler *target) wxPostEvent(target, SimpleEvent(m_data.action_event)); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int icon_size) const { GLTexture::render_sub_texture(tex_id, left, right, bottom, top, get_uvs(texture_size, icon_size)); } -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const -{ - GLTexture::render_sub_texture(tex_id, left, right, bottom, top, get_uvs(texture_size, border_size, icon_size, gap_size)); -} -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int texture_size, unsigned int icon_size) const -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { GLTexture::Quad_UVs uvs; float inv_texture_size = (texture_size != 0) ? 1.0f / (float)texture_size : 0.0f; float scaled_icon_size = (float)icon_size * inv_texture_size; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS float left = (float)m_state * scaled_icon_size; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - float scaled_border_size = (float)border_size * inv_texture_size; - float scaled_gap_size = (float)gap_size * inv_texture_size; - float stride = scaled_icon_size + scaled_gap_size; - - float left = scaled_border_size + (float)m_state * stride; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float right = left + scaled_icon_size; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS float top = (float)m_data.sprite_id * scaled_icon_size; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - float top = scaled_border_size + (float)m_data.sprite_id * stride; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float bottom = top + scaled_icon_size; uvs.left_top = { left, top }; @@ -120,14 +81,6 @@ GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int texture_size, unsigned i ItemsIconsTexture::Metadata::Metadata() : filename("") , icon_size(0) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - , icon_border_size(0) - , icon_gap_size(0) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { } @@ -958,15 +911,7 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const left += separator_stride; else { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_size); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_border_size, m_icons_texture.metadata.icon_size, m_icons_texture.metadata.icon_gap_size); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ left += icon_stride; } } @@ -1097,15 +1042,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const top -= separator_stride; else { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_size); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_border_size, m_icons_texture.metadata.icon_size, m_icons_texture.metadata.icon_gap_size); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ top -= icon_stride; } } diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index a5a912bfc..8a9ff783c 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -90,26 +90,10 @@ public: #endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS bool is_separator() const { return m_type == Separator; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int icon_size) const; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ private: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SVG_ICONS GLTexture::Quad_UVs get_uvs(unsigned int texture_size, unsigned int icon_size) const; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - GLTexture::Quad_UVs get_uvs(unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; // items icon textures are assumed to be square and all with the same size in pixels, no internal check is done @@ -123,16 +107,6 @@ struct ItemsIconsTexture std::string filename; // size of the square icons, in pixels unsigned int icon_size; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - // size of the border, in pixels - unsigned int icon_border_size; - // distance between two adjacent icons (to avoid filtering artifacts), in pixels - unsigned int icon_gap_size; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Metadata(); }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6ca527da7..57e18875d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2615,14 +2615,6 @@ void Plater::priv::init_view_toolbar() ItemsIconsTexture::Metadata icons_data; icons_data.filename = "view_toolbar.png"; icons_data.icon_size = 64; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - icons_data.icon_border_size = 0; - icons_data.icon_gap_size = 0; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BackgroundTexture::Metadata background_data; background_data.filename = "toolbar_background.png"; From f47fe861ac39258fe269c71f4c32132b04747740 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 26 Feb 2019 10:40:00 +0100 Subject: [PATCH 003/236] Allow non-squared textures for toolbars and gizmo icons --- src/slic3r/GUI/GLCanvas3D.cpp | 42 ++++++++++++++++++------------- src/slic3r/GUI/GLGizmo.cpp | 30 +++++++++++----------- src/slic3r/GUI/GLGizmo.hpp | 18 +++++++------- src/slic3r/GUI/GLTexture.cpp | 4 +-- src/slic3r/GUI/GLToolbar.cpp | 47 +++++++++++++++++++++-------------- src/slic3r/GUI/GLToolbar.hpp | 8 +++--- src/slic3r/GUI/Plater.cpp | 4 +-- 7 files changed, 86 insertions(+), 67 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9fc1d1e3a..c7c18bb8a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3146,7 +3146,10 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan float scaled_icons_size = m_overlay_icons_size * m_overlay_scale * inv_zoom; float scaled_stride_y = scaled_icons_size + scaled_gap_y; unsigned int icons_texture_id = m_icons_texture.get_id(); - unsigned int texture_size = m_icons_texture.get_width(); + unsigned int tex_width = m_icons_texture.get_width(); + unsigned int tex_height = m_icons_texture.get_height(); + float inv_tex_width = (tex_width != 0) ? 1.0f / (float)tex_width : 0.0f; + float inv_tex_height = (tex_height != 0) ? 1.0f / (float)tex_height : 0.0f; #else top_x += m_overlay_border * inv_zoom; top_y -= m_overlay_border * inv_zoom; @@ -3155,11 +3158,11 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan float scaled_icons_size = (float)m_icons_texture.metadata.icon_size * m_overlay_icons_scale * inv_zoom; unsigned int icons_texture_id = m_icons_texture.texture.get_id(); unsigned int texture_size = m_icons_texture.texture.get_width(); -#endif // ENABLE_SVG_ICONS float inv_texture_size = (texture_size != 0) ? 1.0f / (float)texture_size : 0.0f; +#endif // ENABLE_SVG_ICONS #if ENABLE_SVG_ICONS - if ((icons_texture_id == 0) || (texture_size <= 0)) + if ((icons_texture_id == 0) || (tex_width <= 0) || (tex_height <= 0)) return; #endif // ENABLE_SVG_ICONS @@ -3172,14 +3175,19 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan GLGizmoBase::EState state = it->second->get_state(); #if ENABLE_SVG_ICONS - float uv_icon_size = m_overlay_icons_size * inv_texture_size; + float u_icon_size = m_overlay_icons_size * inv_tex_width; + float v_icon_size = m_overlay_icons_size * inv_tex_height; + float top = sprite_id * v_icon_size; + float left = state * u_icon_size; + float bottom = top + v_icon_size; + float right = left + u_icon_size; #else float uv_icon_size = (float)m_icons_texture.metadata.icon_size * inv_texture_size; -#endif // ENABLE_SVG_ICONS float top = sprite_id * uv_icon_size; float left = state * uv_icon_size; float bottom = top + uv_icon_size; float right = left + uv_icon_size; +#endif // ENABLE_SVG_ICONS GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { left, bottom }, { right, bottom }, { right, top }, { left, top } }); #if ENABLE_IMGUI @@ -3262,9 +3270,9 @@ bool GLCanvas3D::Gizmos::generate_icons_texture() const { if (it->second != nullptr) { - const std::string& svg_file = it->second->get_svg_file(); - if (!svg_file.empty()) - filenames.push_back(path + svg_file); + const std::string& icon_filename = it->second->get_icon_filename(); + if (!icon_filename.empty()) + filenames.push_back(path + icon_filename); } } @@ -5901,7 +5909,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "add"; #if ENABLE_SVG_ICONS - item.svg_file = "add.svg"; + item.icon_filename = "add.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Add...") + " [" + GUI::shortkey_ctrl_prefix() + "I]"; item.sprite_id = 0; @@ -5911,7 +5919,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "delete"; #if ENABLE_SVG_ICONS - item.svg_file = "remove.svg"; + item.icon_filename = "remove.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Delete") + " [Del]"; item.sprite_id = 1; @@ -5921,7 +5929,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "deleteall"; #if ENABLE_SVG_ICONS - item.svg_file = "delete_all.svg"; + item.icon_filename = "delete_all.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Delete all") + " [" + GUI::shortkey_ctrl_prefix() + "Del]"; item.sprite_id = 2; @@ -5931,7 +5939,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "arrange"; #if ENABLE_SVG_ICONS - item.svg_file = "arrange.svg"; + item.icon_filename = "arrange.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Arrange [A]"); item.sprite_id = 3; @@ -5944,7 +5952,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "more"; #if ENABLE_SVG_ICONS - item.svg_file = "instance_add.svg"; + item.icon_filename = "instance_add.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Add instance [+]"); item.sprite_id = 4; @@ -5954,7 +5962,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "fewer"; #if ENABLE_SVG_ICONS - item.svg_file = "instance_remove.svg"; + item.icon_filename = "instance_remove.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Remove instance [-]"); item.sprite_id = 5; @@ -5967,7 +5975,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "splitobjects"; #if ENABLE_SVG_ICONS - item.svg_file = "split_objects.svg"; + item.icon_filename = "split_objects.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to objects"); item.sprite_id = 6; @@ -5977,7 +5985,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "splitvolumes"; #if ENABLE_SVG_ICONS - item.svg_file = "split_parts.svg"; + item.icon_filename = "split_parts.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to parts"); item.sprite_id = 8; @@ -5990,7 +5998,7 @@ bool GLCanvas3D::_init_toolbar() item.name = "layersediting"; #if ENABLE_SVG_ICONS - item.svg_file = "layers.svg"; + item.icon_filename = "layers.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Layers editing"); item.sprite_id = 7; diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index b7573410b..b9018d0a1 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -158,7 +158,7 @@ void GLGizmoBase::Grabber::render_face(float half_size) const } #if ENABLE_SVG_ICONS -GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id) +GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) #else GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id) #endif // ENABLE_SVG_ICONS @@ -167,7 +167,7 @@ GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id) , m_state(Off) , m_shortcut_key(0) #if ENABLE_SVG_ICONS - , m_svg_file(svg_file) + , m_icon_filename(icon_filename) #endif // ENABLE_SVG_ICONS , m_sprite_id(sprite_id) , m_hover_id(-1) @@ -334,7 +334,7 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) #if ENABLE_SVG_ICONS - : GLGizmoBase(other.m_parent, other.m_svg_file, other.m_sprite_id) + : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id) #else : GLGizmoBase(other.m_parent, other.m_sprite_id) #endif // ENABLE_SVG_ICONS @@ -710,8 +710,8 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons } #if ENABLE_SVG_ICONS -GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id) - : GLGizmoBase(parent, svg_file, sprite_id) +GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) #else GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) @@ -795,8 +795,8 @@ void GLGizmoRotate3D::on_render_input_window(float x, float y, const GLCanvas3D: const float GLGizmoScale3D::Offset = 5.0f; #if ENABLE_SVG_ICONS -GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id) - : GLGizmoBase(parent, svg_file, sprite_id) +GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) #else GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) @@ -1146,8 +1146,8 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const const double GLGizmoMove3D::Offset = 10.0; #if ENABLE_SVG_ICONS -GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id) - : GLGizmoBase(parent, svg_file, sprite_id) +GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) #else GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) @@ -1388,8 +1388,8 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box } #if ENABLE_SVG_ICONS -GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id) - : GLGizmoBase(parent, svg_file, sprite_id) +GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) #else GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) @@ -1732,8 +1732,8 @@ Vec3d GLGizmoFlatten::get_flattening_normal() const } #if ENABLE_SVG_ICONS -GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id) - : GLGizmoBase(parent, svg_file, sprite_id) +GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) #else GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) @@ -2550,8 +2550,8 @@ const double GLGizmoCut::Margin = 20.0; const std::array GLGizmoCut::GrabberColor = { 1.0, 0.5, 0.0 }; #if ENABLE_SVG_ICONS -GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id) - : GLGizmoBase(parent, svg_file, sprite_id) +GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) #else GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id) : GLGizmoBase(parent, sprite_id) diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp index dc632fe80..e524c2381 100644 --- a/src/slic3r/GUI/GLGizmo.hpp +++ b/src/slic3r/GUI/GLGizmo.hpp @@ -88,7 +88,7 @@ protected: EState m_state; int m_shortcut_key; #if ENABLE_SVG_ICONS - std::string m_svg_file; + std::string m_icon_filename; #endif // ENABLE_SVG_ICONS unsigned int m_sprite_id; int m_hover_id; @@ -103,7 +103,7 @@ protected: public: #if ENABLE_SVG_ICONS - GLGizmoBase(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id); + GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); #else GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS @@ -123,7 +123,7 @@ public: void set_shortcut_key(int key) { m_shortcut_key = key; } #if ENABLE_SVG_ICONS - const std::string& get_svg_file() const { return m_svg_file; } + const std::string& get_icon_filename() const { return m_icon_filename; } #endif // ENABLE_SVG_ICONS bool is_activable(const GLCanvas3D::Selection& selection) const { return on_is_activable(selection); } @@ -254,7 +254,7 @@ class GLGizmoRotate3D : public GLGizmoBase public: #if ENABLE_SVG_ICONS - GLGizmoRotate3D(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id); + GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); #else GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS @@ -329,7 +329,7 @@ class GLGizmoScale3D : public GLGizmoBase public: #if ENABLE_SVG_ICONS - GLGizmoScale3D(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id); + GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); #else GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS @@ -380,7 +380,7 @@ class GLGizmoMove3D : public GLGizmoBase public: #if ENABLE_SVG_ICONS - GLGizmoMove3D(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id); + GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); #else GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS @@ -439,7 +439,7 @@ private: public: #if ENABLE_SVG_ICONS - GLGizmoFlatten(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id); + GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); #else GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS @@ -491,7 +491,7 @@ private: public: #if ENABLE_SVG_ICONS - GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id); + GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); #else GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS @@ -588,7 +588,7 @@ class GLGizmoCut : public GLGizmoBase public: #if ENABLE_SVG_ICONS - GLGizmoCut(GLCanvas3D& parent, const std::string& svg_file, unsigned int sprite_id); + GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); #else GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 9679680d0..7e822a4c1 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -148,8 +148,8 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vectorrender(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, (unsigned int)m_layout.icons_size); + item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); #else item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_size); #endif // ENABLE_SVG_ICONS @@ -1062,14 +1065,17 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const { #if ENABLE_SVG_ICONS unsigned int tex_id = m_icons_texture.get_id(); - int tex_size = m_icons_texture.get_width(); + int tex_width = m_icons_texture.get_width(); + int tex_height = m_icons_texture.get_height(); #else unsigned int tex_id = m_icons_texture.texture.get_id(); int tex_size = m_icons_texture.texture.get_width(); #endif // ENABLE_SVG_ICONS +#if !ENABLE_SVG_ICONS if ((tex_id == 0) || (tex_size <= 0)) return; +#endif // !ENABLE_SVG_ICONS float zoom = parent.get_camera_zoom(); float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; @@ -1184,6 +1190,11 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const left += scaled_border; top -= scaled_border; +#if ENABLE_SVG_ICONS + if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) + return; +#endif // ENABLE_SVG_ICONS + // renders icons for (const GLToolbarItem* item : m_items) { @@ -1197,7 +1208,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const else { #if ENABLE_SVG_ICONS - item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, (unsigned int)(m_layout.icons_size * m_layout.scale)); + item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); #else item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_size); #endif // ENABLE_SVG_ICONS @@ -1213,9 +1224,9 @@ bool GLToolbar::generate_icons_texture() const std::vector filenames; for (GLToolbarItem* item : m_items) { - const std::string& svg_file = item->get_svg_file(); - if (!svg_file.empty()) - filenames.push_back(path + svg_file); + const std::string& icon_filename = item->get_icon_filename(); + if (!icon_filename.empty()) + filenames.push_back(path + icon_filename); } bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, GLToolbarItem::Num_States, (unsigned int)(m_layout.icons_size * m_layout.scale)); diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index b12b2693e..30a9ff04d 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -52,7 +52,7 @@ public: { std::string name; #if ENABLE_SVG_ICONS - std::string svg_file; + std::string icon_filename; #endif // ENABLE_SVG_ICONS std::string tooltip; unsigned int sprite_id; @@ -78,7 +78,7 @@ public: const std::string& get_name() const { return m_data.name; } #if ENABLE_SVG_ICONS - const std::string& get_svg_file() const { return m_data.svg_file; } + const std::string& get_icon_filename() const { return m_data.icon_filename; } #endif // ENABLE_SVG_ICONS const std::string& get_tooltip() const { return m_data.tooltip; } @@ -96,10 +96,10 @@ public: #endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS bool is_separator() const { return m_type == Separator; } - void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int icon_size) const; + void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; private: - GLTexture::Quad_UVs get_uvs(unsigned int texture_size, unsigned int icon_size) const; + GLTexture::Quad_UVs get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; }; #if !ENABLE_SVG_ICONS diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d17cce97d..6c2c3a1ea 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2651,7 +2651,7 @@ void Plater::priv::init_view_toolbar() item.name = "3D"; #if ENABLE_SVG_ICONS - item.svg_file = "add.svg"; + item.icon_filename = "add.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("3D editor view") + " [" + GUI::shortkey_ctrl_prefix() + "5]"; item.sprite_id = 0; @@ -2662,7 +2662,7 @@ void Plater::priv::init_view_toolbar() item.name = "Preview"; #if ENABLE_SVG_ICONS - item.svg_file = "remove.svg"; + item.icon_filename = "remove.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Preview") + " [" + GUI::shortkey_ctrl_prefix() + "6]"; item.sprite_id = 1; From 987a83bb0c3f172dd349f8443695fa24d8195eb0 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 26 Feb 2019 10:57:37 +0100 Subject: [PATCH 004/236] Fixed build when ENABLE_SVG_ICONS is disabled --- src/slic3r/GUI/GLToolbar.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index ab95b71db..5f5350299 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -913,11 +913,12 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const int tex_height = m_icons_texture.get_height(); #else unsigned int tex_id = m_icons_texture.texture.get_id(); - int tex_size = m_icons_texture.texture.get_width(); + int tex_width = m_icons_texture.texture.get_width(); + int tex_height = m_icons_texture.texture.get_height(); #endif // ENABLE_SVG_ICONS #if !ENABLE_SVG_ICONS - if ((tex_id == 0) || (tex_size <= 0)) + if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) return; #endif // !ENABLE_SVG_ICONS @@ -1054,7 +1055,7 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const #if ENABLE_SVG_ICONS item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); #else - item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_size); + item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, m_icons_texture.metadata.icon_size); #endif // ENABLE_SVG_ICONS left += icon_stride; } @@ -1069,11 +1070,12 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const int tex_height = m_icons_texture.get_height(); #else unsigned int tex_id = m_icons_texture.texture.get_id(); - int tex_size = m_icons_texture.texture.get_width(); + int tex_width = m_icons_texture.texture.get_width(); + int tex_height = m_icons_texture.texture.get_height(); #endif // ENABLE_SVG_ICONS #if !ENABLE_SVG_ICONS - if ((tex_id == 0) || (tex_size <= 0)) + if ((tex_id == 0) || (tex_width <= 0) || (tex_height <= 0)) return; #endif // !ENABLE_SVG_ICONS @@ -1210,7 +1212,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const #if ENABLE_SVG_ICONS item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, (unsigned int)(m_layout.icons_size * m_layout.scale)); #else - item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_size, m_icons_texture.metadata.icon_size); + item->render(tex_id, left, left + scaled_icons_size, top - scaled_icons_size, top, (unsigned int)tex_width, (unsigned int)tex_height, m_icons_texture.metadata.icon_size); #endif // ENABLE_SVG_ICONS top -= icon_stride; } From a8610f990eb47eadbf67fc7ae2381ff32a18a213 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 26 Feb 2019 12:56:13 +0100 Subject: [PATCH 005/236] Automatic generation of variants of icons for toolbars and gizmos --- src/slic3r/GUI/GLCanvas3D.cpp | 15 +++++-- src/slic3r/GUI/GLTexture.cpp | 73 +++++++++++++++++++++++++++++------ src/slic3r/GUI/GLTexture.hpp | 10 ++++- src/slic3r/GUI/GLToolbar.cpp | 27 ++++++++++++- src/slic3r/GUI/GLToolbar.hpp | 7 ++++ src/slic3r/GUI/Plater.cpp | 4 ++ 6 files changed, 120 insertions(+), 16 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index c7c18bb8a..253bb5bda 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3276,7 +3276,12 @@ bool GLCanvas3D::Gizmos::generate_icons_texture() const } } - bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, GLGizmoBase::Num_States, (unsigned int)(m_overlay_icons_size * m_overlay_scale)); + std::vector> states; + states.push_back(std::make_pair(1, false)); + states.push_back(std::make_pair(0, false)); + states.push_back(std::make_pair(0, true)); + + bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, (unsigned int)(m_overlay_icons_size * m_overlay_scale)); if (res) m_icons_texture_dirty = false; @@ -3713,7 +3718,11 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) #endif , m_in_render(false) , m_bed(nullptr) +#if ENABLE_SVG_ICONS + , m_toolbar(GLToolbar::Normal, "Top") +#else , m_toolbar(GLToolbar::Normal) +#endif // ENABLE_SVG_ICONS , m_view_toolbar(nullptr) , m_use_clipping_planes(false) , m_sidebar_field("") @@ -5988,7 +5997,7 @@ bool GLCanvas3D::_init_toolbar() item.icon_filename = "split_parts.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to parts"); - item.sprite_id = 8; + item.sprite_id = 7; item.action_event = EVT_GLTOOLBAR_SPLIT_VOLUMES; if (!m_toolbar.add_item(item)) return false; @@ -6001,7 +6010,7 @@ bool GLCanvas3D::_init_toolbar() item.icon_filename = "layers.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Layers editing"); - item.sprite_id = 7; + item.sprite_id = 8; item.is_toggable = true; item.action_event = EVT_GLTOOLBAR_LAYERSEDITING; if (!m_toolbar.add_item(item)) diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 7e822a4c1..2f1b68048 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -138,19 +138,19 @@ bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps) #endif // ENABLE_TEXTURES_FROM_SVG #if ENABLE_SVG_ICONS -bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector& filenames, unsigned int num_states, unsigned int sprite_size_px) +bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector& filenames, const std::vector>& states, unsigned int sprite_size_px) { - static int pass = 0; - ++pass; - reset(); - if (filenames.empty() || (num_states == 0) || (sprite_size_px == 0)) + if (filenames.empty() || states.empty() || (sprite_size_px == 0)) return false; - m_width = (int)(sprite_size_px * num_states); + m_width = (int)(sprite_size_px * states.size()); m_height = (int)(sprite_size_px * filenames.size()); int n_pixels = m_width * m_height; + int sprite_n_pixels = sprite_size_px * sprite_size_px; + int sprite_bytes = sprite_n_pixels * 4; + int sprite_stride = sprite_size_px * 4; if (n_pixels <= 0) { @@ -159,7 +159,10 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector data(n_pixels * 4, 0); - std::vector sprite_data(sprite_size_px * sprite_size_px * 4, 0); + std::vector sprite_data(sprite_bytes, 0); + std::vector sprite_white_only_data(sprite_bytes, 0); + std::vector sprite_gray_only_data(sprite_bytes, 0); + std::vector output_data(sprite_bytes, 0); NSVGrasterizer* rast = nsvgCreateRasterizer(); if (rast == nullptr) @@ -185,16 +188,58 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vectorwidth, image->height); - nsvgRasterize(rast, image, 0, 0, scale, sprite_data.data(), sprite_size_px, sprite_size_px, sprite_size_px * 4); + nsvgRasterize(rast, image, 0, 0, scale, sprite_data.data(), sprite_size_px, sprite_size_px, sprite_stride); + + // makes white only copy of the sprite + ::memcpy((void*)sprite_white_only_data.data(), (const void*)sprite_data.data(), sprite_bytes); + for (int i = 0; i < sprite_n_pixels; ++i) + { + if (sprite_white_only_data.data()[i * 4] != 0) + ::memset((void*)&sprite_white_only_data.data()[i * 4], 255, 3); + } + + // makes gray only copy of the sprite + ::memcpy((void*)sprite_gray_only_data.data(), (const void*)sprite_data.data(), sprite_bytes); + for (int i = 0; i < sprite_n_pixels; ++i) + { + if (sprite_gray_only_data.data()[i * 4] != 0) + ::memset((void*)&sprite_gray_only_data.data()[i * 4], 128, 3); + } int sprite_offset_px = sprite_id * sprite_size_px * m_width; - for (unsigned int i = 0; i < num_states; ++i) + int state_id = -1; + for (const std::pair& state : states) { - int state_offset_px = sprite_offset_px + i * sprite_size_px; + ++state_id; + + // select the sprite variant + std::vector* src = nullptr; + switch (state.first) + { + case 1: { src = &sprite_white_only_data; break; } + case 2: { src = &sprite_gray_only_data; break; } + default: { src = &sprite_data; break; } + } + + ::memcpy((void*)output_data.data(), (const void*)src->data(), sprite_bytes); + // applies background, if needed + if (state.second) + { + for (int i = 0; i < sprite_n_pixels; ++i) + { + float alpha = (float)output_data.data()[i * 4 + 3] / 255.0f; + output_data.data()[i * 4 + 0] = (unsigned char)(0 * (1.0f - alpha) + output_data.data()[i * 4 + 0] * alpha); + output_data.data()[i * 4 + 1] = (unsigned char)(0 * (1.0f - alpha) + output_data.data()[i * 4 + 1] * alpha); + output_data.data()[i * 4 + 2] = (unsigned char)(0 * (1.0f - alpha) + output_data.data()[i * 4 + 2] * alpha); + output_data.data()[i * 4 + 3] = (unsigned char)(128 * (1.0f - alpha) + output_data.data()[i * 4 + 3] * alpha); + } + } + + int state_offset_px = sprite_offset_px + state_id * sprite_size_px; for (int j = 0; j < sprite_size_px; ++j) { int data_offset = (state_offset_px + j * m_width) * 4; - ::memcpy((void*)&data.data()[data_offset], (const void*)&sprite_data.data()[j * sprite_size_px * 4], sprite_size_px * 4); + ::memcpy((void*)&data.data()[data_offset], (const void*)&output_data.data()[j * sprite_stride], sprite_stride); } } @@ -216,6 +261,11 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector& filenames, unsigned int num_states, unsigned int sprite_size_px); + // meanings of states: (std::pair) + // first field (int): + // 0 -> no changes + // 1 -> use white only color variant + // 2 -> use gray only color variant + // second field (bool): + // false -> no changes + // true -> add background color + bool load_from_svg_files_as_sprites_array(const std::vector& filenames, const std::vector>& states, unsigned int sprite_size_px); #endif // ENABLE_SVG_ICONS void reset(); diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 5f5350299..144662c3f 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -124,8 +124,15 @@ GLToolbar::Layout::Layout() { } +#if ENABLE_SVG_ICONS +GLToolbar::GLToolbar(GLToolbar::EType type, const std::string& name) +#else GLToolbar::GLToolbar(GLToolbar::EType type) +#endif // ENABLE_SVG_ICONS : m_type(type) +#if ENABLE_SVG_ICONS + , m_name(name) +#endif // ENABLE_SVG_ICONS , m_enabled(false) #if ENABLE_SVG_ICONS , m_icons_texture_dirty(true) @@ -1231,7 +1238,25 @@ bool GLToolbar::generate_icons_texture() const filenames.push_back(path + icon_filename); } - bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, GLToolbarItem::Num_States, (unsigned int)(m_layout.icons_size * m_layout.scale)); + std::vector> states; + if (m_name == "Top") + { + states.push_back(std::make_pair(1, false)); + states.push_back(std::make_pair(0, false)); + states.push_back(std::make_pair(2, false)); + states.push_back(std::make_pair(0, false)); + states.push_back(std::make_pair(0, false)); + } + else if (m_name == "View") + { + states.push_back(std::make_pair(1, false)); + states.push_back(std::make_pair(1, true)); + states.push_back(std::make_pair(1, false)); + states.push_back(std::make_pair(0, false)); + states.push_back(std::make_pair(1, true)); + } + + bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, (unsigned int)(m_layout.icons_size * m_layout.scale)); if (res) m_icons_texture_dirty = false; diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 30a9ff04d..e14f7b3bb 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -203,6 +203,9 @@ private: typedef std::vector ItemsList; EType m_type; +#if ENABLE_SVG_ICONS + std::string m_name; +#endif // ENABLE_SVG_ICONS bool m_enabled; #if ENABLE_SVG_ICONS mutable GLTexture m_icons_texture; @@ -216,7 +219,11 @@ private: ItemsList m_items; public: +#if ENABLE_SVG_ICONS + GLToolbar(EType type, const std::string& name); +#else explicit GLToolbar(EType type); +#endif // ENABLE_SVG_ICONS ~GLToolbar(); #if ENABLE_SVG_ICONS diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6c2c3a1ea..24d366ced 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1178,7 +1178,11 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) , sidebar(new Sidebar(q)) , delayed_scene_refresh(false) , project_filename(wxEmptyString) +#if ENABLE_SVG_ICONS + , view_toolbar(GLToolbar::Radio, "View") +#else , view_toolbar(GLToolbar::Radio) +#endif // ENABLE_SVG_ICONS { arranging.store(false); rotoptimizing.store(false); From f84591e570d0a68368c66ebe69beced189a1f411 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 26 Feb 2019 13:27:41 +0100 Subject: [PATCH 006/236] Fixed build on Mac and Linux --- src/slic3r/GUI/GLTexture.cpp | 81 ------------------------------------ src/slic3r/GUI/GLTexture.hpp | 6 --- 2 files changed, 87 deletions(-) diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 2f1b68048..168ad8b64 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -6,19 +6,15 @@ #include #include -#if ENABLE_TEXTURES_FROM_SVG #include -#endif // ENABLE_TEXTURES_FROM_SVG #include #include -#if ENABLE_TEXTURES_FROM_SVG #define NANOSVG_IMPLEMENTATION #include "nanosvg/nanosvg.h" #define NANOSVGRAST_IMPLEMENTATION #include "nanosvg/nanosvgrast.h" -#endif // ENABLE_TEXTURES_FROM_SVG namespace Slic3r { namespace GUI { @@ -38,7 +34,6 @@ GLTexture::~GLTexture() reset(); } -#if ENABLE_TEXTURES_FROM_SVG bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps) { reset(); @@ -64,80 +59,7 @@ bool GLTexture::load_from_svg_file(const std::string& filename, bool use_mipmaps else return false; } -#else -bool GLTexture::load_from_file(const std::string& filename, bool use_mipmaps) -{ - reset(); - if (!boost::filesystem::exists(filename)) - return false; - - // Load a PNG with an alpha channel. - wxImage image; - if (!image.LoadFile(wxString::FromUTF8(filename.c_str()), wxBITMAP_TYPE_PNG)) - { - reset(); - return false; - } - - m_width = image.GetWidth(); - m_height = image.GetHeight(); - int n_pixels = m_width * m_height; - - if (n_pixels <= 0) - { - reset(); - return false; - } - - // Get RGB & alpha raw data from wxImage, pack them into an array. - unsigned char* img_rgb = image.GetData(); - if (img_rgb == nullptr) - { - reset(); - return false; - } - - unsigned char* img_alpha = image.GetAlpha(); - - std::vector data(n_pixels * 4, 0); - for (int i = 0; i < n_pixels; ++i) - { - int data_id = i * 4; - int img_id = i * 3; - data[data_id + 0] = img_rgb[img_id + 0]; - data[data_id + 1] = img_rgb[img_id + 1]; - data[data_id + 2] = img_rgb[img_id + 2]; - data[data_id + 3] = (img_alpha != nullptr) ? img_alpha[i] : 255; - } - - // sends data to gpu - ::glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - ::glGenTextures(1, &m_id); - ::glBindTexture(GL_TEXTURE_2D, m_id); - ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()); - if (use_mipmaps) - { - // we manually generate mipmaps because glGenerateMipmap() function is not reliable on all graphics cards - unsigned int levels_count = generate_mipmaps(image); - ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, levels_count); - ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - } - else - { - ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); - } - ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - ::glBindTexture(GL_TEXTURE_2D, 0); - - m_source = filename; - return true; -} -#endif // ENABLE_TEXTURES_FROM_SVG - -#if ENABLE_SVG_ICONS bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector& filenames, const std::vector>& states, unsigned int sprite_size_px) { reset(); @@ -286,7 +208,6 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector) // first field (int): // 0 -> no changes @@ -51,7 +48,6 @@ namespace GUI { // false -> no changes // true -> add background color bool load_from_svg_files_as_sprites_array(const std::vector& filenames, const std::vector>& states, unsigned int sprite_size_px); -#endif // ENABLE_SVG_ICONS void reset(); unsigned int get_id() const { return m_id; } @@ -65,11 +61,9 @@ namespace GUI { protected: unsigned int generate_mipmaps(wxImage& image); -#if ENABLE_TEXTURES_FROM_SVG private: bool load_from_png(const std::string& filename, bool use_mipmaps); bool load_from_svg(const std::string& filename, bool use_mipmaps, unsigned int max_size_px); -#endif // ENABLE_TEXTURES_FROM_SVG }; } // namespace GUI From 43f03b8032087cc9b00ec7fdb818940e6c4d9677 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 26 Feb 2019 17:13:33 +0100 Subject: [PATCH 007/236] Incorporate individual support point radius. --- src/libslic3r/SLA/SLACommon.hpp | 6 +- src/libslic3r/SLA/SLASupportTree.cpp | 755 ++++++++++++------------ src/libslic3r/SLA/SLASupportTree.hpp | 20 +- src/libslic3r/SLA/SLASupportTreeIGL.cpp | 56 +- src/libslic3r/SLAPrint.cpp | 76 ++- 5 files changed, 462 insertions(+), 451 deletions(-) diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp index f7c0acf33..b917db0d0 100644 --- a/src/libslic3r/SLA/SLACommon.hpp +++ b/src/libslic3r/SLA/SLACommon.hpp @@ -2,6 +2,7 @@ #define SLACOMMON_HPP #include +#include // #define SLIC3R_SLA_NEEDS_WINDTREE @@ -36,7 +37,6 @@ struct SupportPoint { bool operator!=(const SupportPoint& sp) const { return !(sp == (*this)); } }; - /// An index-triangle structure for libIGL functions. Also serves as an /// alternative (raw) input format for the SLASupportTree /*struct EigenMesh3D { @@ -125,6 +125,8 @@ public: bool inside(const Vec3d& p) const; #endif /* SLIC3R_SLA_NEEDS_WINDTREE */ + + double squared_distance(const Vec3d& p, int& i, Vec3d& c) const; }; @@ -134,4 +136,4 @@ public: } // namespace Slic3r -#endif // SLASUPPORTTREE_HPP \ No newline at end of file +#endif // SLASUPPORTTREE_HPP diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 913e9beda..9ba4afe42 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -551,18 +551,18 @@ enum { // For indexing Eigen vectors as v(X), v(Y), v(Z) instead of numbers X, Y, Z }; -PointSet to_point_set(const std::vector &v) -{ - PointSet ret(v.size(), 3); - long i = 0; - for(const SupportPoint& support_point : v) { - ret.row(i)(0) = support_point.pos(0); - ret.row(i)(1) = support_point.pos(1); - ret.row(i)(2) = support_point.pos(2); - ++i; - } - return ret; -} +//PointSet to_point_set(const std::vector &v) +//{ +// PointSet ret(v.size(), 3); +// long i = 0; +// for(const SupportPoint& support_point : v) { +// ret.row(i)(X) = double(support_point.pos(X)); +// ret.row(i)(Y) = double(support_point.pos(Y)); +// ret.row(i)(Z) = double(support_point.pos(Z)); +// ++i; +// } +// return ret; +//} Vec3d model_coord(const ModelInstance& object, const Vec3f& mesh_coord) { return object.transform_vector(mesh_coord.cast()); @@ -751,9 +751,13 @@ double bridge_mesh_intersect(const Vec3d& s, return *mit; } -PointSet normals(const PointSet& points, const EigenMesh3D& mesh, +// Calculate the normals for the selected points (from 'points' set) on the +// mesh. This will call squared distance for each point. +PointSet normals(const PointSet& points, + const EigenMesh3D& mesh, double eps = 0.05, // min distance from edges - std::function throw_on_cancel = [](){}); + std::function throw_on_cancel = [](){}, + const std::vector& selected_points = {}); inline Vec2d to_vec2(const Vec3d& v3) { return {v3(X), v3(Y)}; @@ -763,11 +767,11 @@ bool operator==(const SpatElement& e1, const SpatElement& e2) { return e1.second == e2.second; } -// Clustering a set of points by the given criteria +// Clustering a set of points by the given criteria. ClusteredPoints cluster( const PointSet& points, std::function pred, - unsigned max_points = 0); + unsigned max_points = 0, const std::vector& indices = {}); // This class will hold the support tree meshes with some additional bookkeeping // as well. Various parts of the support geometry are stored separately and are @@ -783,7 +787,7 @@ ClusteredPoints cluster( // The support pad is considered an auxiliary geometry and is not part of the // merged mesh. It can be retrieved using a dedicated method (pad()) class SLASupportTree::Impl { - std::vector m_heads; + std::map m_heads; std::vector m_pillars; std::vector m_junctions; std::vector m_bridges; @@ -801,16 +805,19 @@ public: const Controller& ctl() const { return m_ctl; } - template Head& add_head(Args&&... args) { - m_heads.emplace_back(std::forward(args)...); - m_heads.back().id = long(m_heads.size() - 1); + template Head& add_head(unsigned id, Args&&... args) { + auto el = m_heads.emplace(std::piecewise_construct, + std::forward_as_tuple(id), + std::forward_as_tuple(std::forward(args)...)); + el.first->second.id = id; meshcache_valid = false; - return m_heads.back(); + return el.first->second; } - template Pillar& add_pillar(long headid, Args&&... args) { - assert(headid >= 0 && headid < m_heads.size()); - Head& head = m_heads[size_t(headid)]; + template Pillar& add_pillar(unsigned headid, Args&&... args) { + auto it = m_heads.find(headid); + assert(it != m_heads.end()); + Head& head = it->second; m_pillars.emplace_back(head, std::forward(args)...); Pillar& pillar = m_pillars.back(); pillar.id = long(m_pillars.size() - 1); @@ -824,14 +831,16 @@ public: const Head& pillar_head(long pillar_id) const { assert(pillar_id >= 0 && pillar_id < m_pillars.size()); const Pillar& p = m_pillars[size_t(pillar_id)]; - assert(p.starts_from_head && p.start_junction_id >= 0 && - p.start_junction_id < m_heads.size() ); - return m_heads[size_t(p.start_junction_id)]; + assert(p.starts_from_head && p.start_junction_id >= 0); + auto it = m_heads.find(unsigned(p.start_junction_id)); + assert(it != m_heads.end()); + return it->second; } - const Pillar& head_pillar(long headid) const { - assert(headid >= 0 && headid < m_heads.size()); - const Head& h = m_heads[size_t(headid)]; + const Pillar& head_pillar(unsigned headid) const { + auto it = m_heads.find(headid); + assert(it != m_heads.end()); + const Head& h = it->second; assert(h.pillar_id >= 0 && h.pillar_id < m_pillars.size()); return m_pillars[size_t(h.pillar_id)]; } @@ -858,8 +867,13 @@ public: return m_compact_bridges.back(); } - const std::vector& heads() const { return m_heads; } - Head& head(size_t idx) { meshcache_valid = false; return m_heads[idx]; } + const std::map& heads() const { return m_heads; } + Head& head(unsigned idx) { + meshcache_valid = false; + auto it = m_heads.find(idx); + assert(it != m_heads.end()); + return it->second; + } const std::vector& pillars() const { return m_pillars; } const std::vector& bridges() const { return m_bridges; } const std::vector& junctions() const { return m_junctions; } @@ -886,10 +900,10 @@ public: Contour3D merged; - for(auto& head : heads()) { + for(auto& headel : heads()) { if(m_ctl.stopcondition()) break; - if(head.is_valid()) - merged.merge(head.mesh); + if(headel.second.is_valid()) + merged.merge(headel.second.mesh); } for(auto& stick : pillars()) { @@ -1115,42 +1129,40 @@ Vec3d dirv(const Vec3d& startp, const Vec3d& endp) { return (endp - startp).normalized(); } -/// Generation of the supports, entry point function. This is called from the -/// SLASupportTree constructor and throws an SLASupportsStoppedException if it -/// gets canceled by the ctl object's stopcondition functor. -bool SLASupportTree::generate(const PointSet &points, +bool SLASupportTree::generate(const std::vector &support_points, const EigenMesh3D& mesh, const SupportConfig &cfg, const Controller &ctl) { + // Prepare the support points in Eigen/IGL format as well, we will use it + // mostly in this form. + Eigen::MatrixXd points(support_points.size(), 3); long i = 0; + for(const SupportPoint& sp : support_points) { + points.row(i)(X) = double(sp.pos(X)); + points.row(i)(Y) = double(sp.pos(Y)); + points.row(i)(Z) = double(sp.pos(Z)); + ++i; + } + // If there are no input points there is no point in doing anything if(points.rows() == 0) return false; - PointSet filtered_points; // all valid support points - PointSet head_positions; // support points with pinhead - PointSet head_normals; // head normals - PointSet headless_positions; // headless support points - PointSet headless_normals; // headless support point normals + using PtIndices = std::vector; + const size_t pcount = size_t(points.rows()); - using IndexSet = std::vector; + PtIndices filtered_indices; // all valid support points + PtIndices head_indices; // support points with pinhead + PtIndices headless_indices; // headless support points + PtIndices onmodel_head_indices; // supp. pts. connecting to model - // Distances from head positions to ground or mesh touch points - std::vector head_heights; + PointSet support_normals(pcount, 3); // support point normals - // Indices of those who touch the ground - IndexSet ground_heads; + // Captures the height of the processed support points from the ground + // or the model surface + std::vector pt_heights(size_t(points.rows()), 0.0); - // Indices of those who don't touch the ground - IndexSet noground_heads; - - // Groups of the 'ground_head' indices that belong into one cluster. These - // are candidates to be connected to one pillar. - ClusteredPoints ground_connectors; - - // A help function to translate ground head index to the actual coordinates. - auto gnd_head_pt = [&ground_heads, &head_positions] (size_t idx) { - return Vec3d(head_positions.row(ground_heads[idx])); - }; + // Clusters of points which can reach the ground directly + std::vector pillar_clusters; // This algorithm uses the Impl class as its output stream. It will be // filled gradually with support elements (heads, pillars, bridges, ...) @@ -1176,49 +1188,44 @@ bool SLASupportTree::generate(const PointSet &points, // throw if canceled: It will be called many times so a shorthand will // come in handy. - auto& thr = ctl.cancelfn; + ThrowOnCancel thr = ctl.cancelfn; - // Filtering step: here we will discard inappropriate support points and - // decide the future of the appropriate ones. We will check if a pinhead - // is applicable and adjust its angle at each support point. - // We will also merge the support points that are just too close and can be - // considered as one. - auto filterfn = [thr] ( - const SupportConfig& cfg, - const PointSet& points, - const EigenMesh3D& mesh, - PointSet& filt_pts, - PointSet& head_norm, - PointSet& head_pos, - PointSet& headless_pos, - PointSet& headless_norm) + // Each step has a processing block in a form of a function. + + // Filtering step: here we will discard inappropriate support points + // and decide the future of the appropriate ones. We will check if a + // pinhead is applicable and adjust its angle at each support point. We + // will also merge the support points that are just too close and can + // be considered as one. + auto filter_fn = [thr](const SupportConfig& cfg, + const PointSet& points, + const EigenMesh3D& mesh, + PointSet& support_normals, + PtIndices& filtered_indices, + PtIndices& head_indices, + PtIndices& headless_indices) { // Get the points that are too close to each other and keep only the // first one - auto aliases = - cluster(points, - [thr](const SpatElement& p, const SpatElement& se) + auto aliases = cluster(points, + [thr](const SpatElement& p, const SpatElement& se) { - thr(); - return distance(p.first, se.first) < D_SP; + thr(); return distance(p.first, se.first) < D_SP; }, 2); - filt_pts.resize(Eigen::Index(aliases.size()), 3); - int count = 0; + + filtered_indices.resize(aliases.size()); + head_indices.reserve(aliases.size()); + headless_indices.reserve(aliases.size()); + unsigned count = 0; for(auto& a : aliases) { // Here we keep only the front point of the cluster. - filt_pts.row(count++) = points.row(a.front()); + filtered_indices[count++] = a.front(); } - thr(); - - // calculate the normals to the triangles belonging to filtered points - auto nmls = sla::normals(filt_pts, mesh, cfg.head_front_radius_mm, thr); - - head_norm.resize(count, 3); - head_pos.resize(count, 3); - headless_pos.resize(count, 3); - headless_norm.resize(count, 3); + // calculate the normals to the triangles for filtered points + auto nmls = sla::normals(points, mesh, cfg.head_front_radius_mm, + thr, filtered_indices); // Not all of the support points have to be a valid position for // support creation. The angle may be inappropriate or there may @@ -1231,8 +1238,7 @@ bool SLASupportTree::generate(const PointSet &points, using libnest2d::opt::StopCriteria; static const unsigned MAX_TRIES = 100; - int pcount = 0, hlcount = 0; - for(int i = 0; i < count; i++) { + for(unsigned i = 0; i < count; i++) { thr(); auto n = nmls.row(i); @@ -1255,7 +1261,7 @@ bool SLASupportTree::generate(const PointSet &points, polar = std::max(polar, 3*PI / 4); // save the head (pinpoint) position - Vec3d hp = filt_pts.row(i); + Vec3d hp = points.row(filtered_indices[i]); double w = cfg.head_width_mm + cfg.head_back_radius_mm + @@ -1276,9 +1282,10 @@ bool SLASupportTree::generate(const PointSet &points, mesh); if(t <= w) { - // Let's try to optimize this angle, there might be a viable - // normal that doesn't collide with the model geometry and - // its very close to the default. + + // Let's try to optimize this angle, there might be a + // viable normal that doesn't collide with the model + // geometry and its very close to the default. StopCriteria stc; stc.max_iterations = MAX_TRIES; @@ -1301,9 +1308,9 @@ bool SLASupportTree::generate(const PointSet &points, mesh); return score; }, - initvals(polar, azimuth), // let's start with what we have + initvals(polar, azimuth), // start with what we have bound(3*PI/4, PI), // Must not exceed the tilt limit - bound(-PI, PI) // azimuth can be a full range search + bound(-PI, PI) // azimuth can be a full search ); t = oresult.score; @@ -1314,221 +1321,122 @@ bool SLASupportTree::generate(const PointSet &points, std::cos(polar)).normalized(); } + // save the verified and corrected normal + support_normals.row(filtered_indices[i]) = nn; + if(t > w) { - head_pos.row(pcount) = hp; - - // save the verified and corrected normal - head_norm.row(pcount) = nn; - - ++pcount; + // mark the point for needing a head. + head_indices.emplace_back(filtered_indices[i]); } else if( polar >= 3*PI/4 ) { - // Headless supports do not tilt like the headed ones so // the normal should point almost to the ground. - headless_norm.row(hlcount) = nn; - headless_pos.row(hlcount++) = hp; + headless_indices.emplace_back(filtered_indices[i]); } } } - head_pos.conservativeResize(pcount, Eigen::NoChange); - head_norm.conservativeResize(pcount, Eigen::NoChange); - headless_pos.conservativeResize(hlcount, Eigen::NoChange); - headless_norm.conservativeResize(hlcount, Eigen::NoChange); + thr(); }; - // Pinhead creation: based on the filtering results, the Head objects will - // be constructed (together with their triangle meshes). - auto pinheadfn = [thr] ( - const SupportConfig& cfg, - PointSet& head_pos, - PointSet& nmls, - Result& result - ) + // Pinhead creation: based on the filtering results, the Head objects + // will be constructed (together with their triangle meshes). + auto pinheads_fn = [thr](const SupportConfig& cfg, + const std::vector support_points, + const PointSet& support_normals, + const PtIndices& head_indices, + Result& result) { - /* ******************************************************** */ /* Generating Pinheads */ /* ******************************************************** */ - for (int i = 0; i < head_pos.rows(); ++i) { + for (unsigned i : head_indices) { thr(); - result.add_head( + result.add_head(i, cfg.head_back_radius_mm, - cfg.head_front_radius_mm, + support_points[i].head_front_radius, cfg.head_width_mm, cfg.head_penetration_mm, - nmls.row(i), // dir - head_pos.row(i) // displacement + support_normals.row(i), // dir + support_points[i].pos.cast() // displacement ); } }; // Further classification of the support points with pinheads. If the - // ground is directly reachable through a vertical line parallel to the Z - // axis we consider a support point as pillar candidate. If touches the - // model geometry, it will be marked as non-ground facing and further steps - // will process it. Also, the pillars will be grouped into clusters that can - // be interconnected with bridges. Elements of these groups may or may not - // be interconnected. Here we only run the clustering algorithm. - auto classifyfn = [thr] ( - const SupportConfig& cfg, - const EigenMesh3D& mesh, - PointSet& head_pos, - IndexSet& gndidx, - IndexSet& nogndidx, - std::vector& gndheight, - ClusteredPoints& ground_clusters, - Result& result - ) + // ground is directly reachable through a vertical line parallel to the + // Z axis we consider a support point as pillar candidate. If touches + // the model geometry, it will be marked as non-ground facing and + // further steps will process it. Also, the pillars will be grouped + // into clusters that can be interconnected with bridges. Elements of + // these groups may or may not be interconnected. Here we only run the + // clustering algorithm. + auto classify_fn = [thr](const SupportConfig& cfg, + const PointSet& points, + const EigenMesh3D& mesh, + const PtIndices& head_indices, + PtIndices& onmodel_head_indices, + std::vector& pt_heights, + std::vector& pillar_clusters, + Result& result) { - /* ******************************************************** */ /* Classification */ /* ******************************************************** */ // We should first get the heads that reach the ground directly - gndheight.reserve(size_t(head_pos.rows())); - gndidx.reserve(size_t(head_pos.rows())); - nogndidx.reserve(size_t(head_pos.rows())); + pt_heights.reserve(head_indices.size()); + PtIndices ground_head_indices; + ground_head_indices.reserve(head_indices.size()); + onmodel_head_indices.reserve(head_indices.size()); // First we decide which heads reach the ground and can be full - // pillars and which shall be connected to the model surface (or search - // a suitable path around the surface that leads to the ground -- TODO) - for(unsigned i = 0; i < head_pos.rows(); i++) { + // pillars and which shall be connected to the model surface (or + // search a suitable path around the surface that leads to the + // ground -- TODO) + for(unsigned i : head_indices) { thr(); + auto& head = result.head(i); + Vec3d n(0, 0, -1); + double r = head.r_back_mm; + Vec3d headjp = head.junction_point(); - Vec3d dir(0, 0, -1); - bool accept = false; - int ri = 1; - double t = std::numeric_limits::infinity(); - double hw = head.width_mm; + // collision check + double t = bridge_mesh_intersect(headjp, n, r, mesh); + // Precise distance measurement + double tprec = ray_mesh_intersect(headjp, n, mesh); - { -// using libnest2d::opt::Method; -// using libnest2d::opt::bound; -// using libnest2d::opt::Optimizer; -// using libnest2d::opt::TOptimizer; -// using libnest2d::opt::StopCriteria; + // Save the distance from a surface in the Z axis downwards. It + // may be infinity but that is telling us that it touches the + // ground. + pt_heights.emplace_back(tprec); -// auto stopcond = [] () { return false; }; -// static const unsigned max_tries = 100; - -// auto objfunc = -// [&head](double polar, double azimuth, double width) -// { -// Vec3d nn(std::cos(azimuth) * std::sin(polar), -// std::sin(azimuth) * std::sin(polar), -// std::cos(polar)); - - -// }; - -// StopCriteria stc; -// stc.max_iterations = max_tries; -// stc.relative_score_difference = 1e-3; -// stc.stop_condition = stopcond; -// TOptimizer solver(stc); - } - - - // We will try to assign a pillar to all the pinheads. If a pillar - // would pierce the model surface, we will try to adjust slightly - // the head width so that the pillar can be deployed. - while(!accept && head.width_mm > 0) { - - Vec3d startpoint = head.junction_point(); - - // Collision detection - t = bridge_mesh_intersect(startpoint, dir, head.r_back_mm, mesh); - - // Precise distance measurement - double tprec = ray_mesh_intersect(startpoint, dir, mesh); - - if(std::isinf(tprec) && !std::isinf(t)) { - // This is a damned case where the pillar melts into the - // model but its center ray can reach the ground. We can - // not route this to the ground nor to the model surface. - head.width_mm = hw + (ri % 2? -1 : 1) * ri * head.r_back_mm; - } else { - if(!std::isinf(t) && !std::isinf(tprec) && - std::abs(tprec - t) > hw) - { - // In this case the head would scratch the model body - BOOST_LOG_TRIVIAL(warning) << "Head scratch detected."; - } - - accept = true; t = tprec; - - auto id = head.id; - // We need to regenerate the head geometry - head = Head(head.r_back_mm, - head.r_pin_mm, - head.width_mm, - head.penetration_mm, - head.dir, - head.tr); - head.id = id; - } - - ri++; - } - - // Save the distance from a surface in the Z axis downwards. It may - // be infinity but that is telling us that it touches the ground. - gndheight.emplace_back(t); - - if(accept) { - if(std::isinf(t)) gndidx.emplace_back(i); - else nogndidx.emplace_back(i); - } else { - // This is a serious issue. There was no way to deploy a pillar - // for the given pinhead. The whole thing has to be discarded - // leaving the model potentially unprintable. - // - // TODO: In the future this has to be solved by searching for - // a path in 3D space from this support point to a suitable - // pillar position or an existing pillar. - // As a workaround we could mark this head as "sidehead only" - // let it go trough the nearby pillar search in the next step. - BOOST_LOG_TRIVIAL(warning) << "A support point at " - << head.tr.transpose() - << " had to be discarded as there is" - << " nowhere to route it."; - head.invalidate(); - } + if(std::isinf(t)) ground_head_indices.emplace_back(i); + else onmodel_head_indices.emplace_back(i); } - // Transform the ground facing point indices top actual coordinates. - PointSet gnd(gndidx.size(), 3); - for(size_t i = 0; i < gndidx.size(); i++) - gnd.row(long(i)) = head_pos.row(gndidx[i]); - - // We want to search for clusters of points that are far enough from - // each other in the XY plane to not cross their pillar bases - // These clusters of support points will join in one pillar, possibly in - // their centroid support point. + // We want to search for clusters of points that are far enough + // from each other in the XY plane to not cross their pillar bases + // These clusters of support points will join in one pillar, + // possibly in their centroid support point. auto d_base = 2*cfg.base_radius_mm; - ground_clusters = - cluster( - gnd, - [d_base, thr](const SpatElement& p, const SpatElement& s) + pillar_clusters = cluster(points, + [thr, d_base](const SpatElement& p, const SpatElement& s) { thr(); return distance(Vec2d(p.first(X), p.first(Y)), Vec2d(s.first(X), s.first(Y))) < d_base; - }, 3); // max 3 heads to connect to one centroid + }, 3, ground_head_indices); // max 3 heads to connect to one pillar }; // Helper function for interconnecting two pillars with zig-zag bridges. // This is not an individual step. - auto interconnect = [&cfg]( - const Pillar& pillar, - const Pillar& nextpillar, - const EigenMesh3D& emesh, - Result& result) + auto interconnect = [&cfg](const Pillar& pillar, + const Pillar& nextpillar, + const EigenMesh3D& m, + Result& result) { const Head& phead = result.pillar_head(pillar.id); const Head& nextphead = result.pillar_head(nextpillar.id); @@ -1538,11 +1446,11 @@ bool SLASupportTree::generate(const PointSet &points, Vec3d ej = nextpillar.endpoint; double pillar_dist = distance(Vec2d{sj(X), sj(Y)}, Vec2d{ej(X), ej(Y)}); - double zstep = pillar_dist * std::tan(-cfg.tilt); + double zstep = pillar_dist * std::tan(-cfg.head_slope); ej(Z) = sj(Z) + zstep; - double chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r, emesh); - double bridge_distance = pillar_dist / std::cos(-cfg.tilt); + double chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r, m); + double bridge_distance = pillar_dist / std::cos(-cfg.head_slope); // If the pillars are so close that they touch each other, // there is no need to bridge them together. @@ -1569,8 +1477,7 @@ bool SLASupportTree::generate(const PointSet &points, // need to check collision for the cross stick double backchkd = bridge_mesh_intersect(bsj, dirv(bsj, bej), - pillar.r, - emesh); + pillar.r, m); if(backchkd >= bridge_distance) { @@ -1580,21 +1487,21 @@ bool SLASupportTree::generate(const PointSet &points, } sj.swap(ej); ej(Z) = sj(Z) + zstep; - chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r, emesh); + chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r, m); } }; - // Step: Routing the ground connected pinheads, and interconnecting them - // with additional (angled) bridges. Not all of these pinheads will be - // a full pillar (ground connected). Some will connect to a nearby pillar - // using a bridge. The max number of such side-heads for a central pillar - // is limited to avoid bad weight distribution. - auto routing_ground_fn = [gnd_head_pt, interconnect, thr]( - const SupportConfig& cfg, - const ClusteredPoints& gnd_clusters, - const IndexSet& gndidx, - const EigenMesh3D& emesh, - Result& result) + // Step: Routing the ground connected pinheads, and interconnecting + // them with additional (angled) bridges. Not all of these pinheads + // will be a full pillar (ground connected). Some will connect to a + // nearby pillar using a bridge. The max number of such side-heads for + // a central pillar is limited to avoid bad weight distribution. + auto routing_ground_fn = + [thr, interconnect](const SupportConfig& cfg, + const PointSet& points, + const std::vector& pillar_clusters, + const EigenMesh3D& emesh, + Result& result) { const double hbr = cfg.head_back_radius_mm; const double pradius = cfg.head_back_radius_mm; @@ -1602,20 +1509,23 @@ bool SLASupportTree::generate(const PointSet &points, const double gndlvl = result.ground_level; ClusterEl cl_centroids; - cl_centroids.reserve(gnd_clusters.size()); + cl_centroids.reserve(pillar_clusters.size()); SpatIndex pheadindex; // spatial index for the junctions - for(auto& cl : gnd_clusters) { thr(); - // place all the centroid head positions into the index. We will - // query for alternative pillar positions. If a sidehead cannot - // connect to the cluster centroid, we have to search for another - // head with a full pillar. Also when there are two elements in the - // cluster, the centroid is arbitrary and the sidehead is allowed to - // connect to a nearby pillar to increase structural stability. + for(auto& cl : pillar_clusters) { thr(); + // place all the centroid head positions into the index. We + // will query for alternative pillar positions. If a sidehead + // cannot connect to the cluster centroid, we have to search + // for another head with a full pillar. Also when there are two + // elements in the cluster, the centroid is arbitrary and the + // sidehead is allowed to connect to a nearby pillar to + // increase structural stability. + if(cl.empty()) continue; // get the current cluster centroid - long lcid = cluster_centroid(cl, gnd_head_pt, + long lcid = cluster_centroid(cl, + [&points](size_t idx) { return points.row(long(idx)); }, [thr](const Vec3d& p1, const Vec3d& p2) { thr(); @@ -1627,11 +1537,11 @@ bool SLASupportTree::generate(const PointSet &points, cl_centroids.push_back(unsigned(cid)); - unsigned hid = gndidx[cl[cid]]; // Head index + + unsigned hid = cl[cid]; // Head ID Head& h = result.head(hid); h.transform(); Vec3d p = h.junction_point(); p(Z) = gndlvl; - pheadindex.insert(p, hid); } @@ -1639,32 +1549,30 @@ bool SLASupportTree::generate(const PointSet &points, // sidepoints with the cluster centroid (which is a ground pillar) // or a nearby pillar if the centroid is unreachable. size_t ci = 0; - for(auto cl : gnd_clusters) { thr(); + for(auto cl : pillar_clusters) { thr(); auto cidx = cl_centroids[ci]; cl_centroids[ci++] = cl[cidx]; - size_t index_to_heads = gndidx[cl[cidx]]; - auto& head = result.head(index_to_heads); + auto& head = result.head(cl[cidx]); Vec3d startpoint = head.junction_point(); auto endpoint = startpoint; endpoint(Z) = gndlvl; // Create the central pillar of the cluster with its base on the // ground - result.add_pillar(long(index_to_heads), endpoint, pradius) + result.add_pillar(unsigned(head.id), endpoint, pradius) .add_base(cfg.base_height_mm, cfg.base_radius_mm); // Process side point in current cluster - cl.erase(cl.begin() + cidx); // delete the centroid before looping - - // TODO: dont consider the cluster centroid but calculate a central - // position where the pillar can be placed. this way the weight - // is distributed more effectively on the pillar. + cl.erase(cl.begin() + cidx); // delete the centroid + // TODO: don't consider the cluster centroid but calculate a + // central position where the pillar can be placed. this way + // the weight is distributed more effectively on the pillar. auto search_nearest = - [&thr, &cfg, &result, &emesh, maxbridgelen, gndlvl, pradius] - (SpatIndex& spindex, const Vec3d& jsh) + [thr, &cfg, &result, &emesh, maxbridgelen, gndlvl, pradius] + (SpatIndex& spindex, const Vec3d& jsh) { long nearest_id = -1; const double max_len = maxbridgelen / 2; @@ -1676,18 +1584,19 @@ bool SLASupportTree::generate(const PointSet &points, Vec3d qp(jsh(X), jsh(Y), gndlvl); auto ne = spindex.nearest(qp, 1).front(); - const Head& nearhead = result.heads()[ne.second]; + const Head& nearhead = result.head(ne.second); Vec3d jh = nearhead.junction_point(); Vec3d jp = jsh; double dist2d = distance(qp, ne.first); // Bridge endpoint on the main pillar - Vec3d jn(jh(X), jh(Y), jp(Z) + dist2d*std::tan(-cfg.tilt)); + Vec3d jn(jh(X), jh(Y), jp(Z) + + dist2d * std::tan(-cfg.head_slope)); if(jn(Z) > jh(Z)) { - // If the sidepoint cannot connect to the pillar from - // its head junction, then just skip this pillar. + // If the sidepoint cannot connect to the pillar + // from its head junction, just skip this pillar. spindex.remove(ne); continue; } @@ -1708,7 +1617,7 @@ bool SLASupportTree::generate(const PointSet &points, }; for(auto c : cl) { thr(); - auto& sidehead = result.head(gndidx[c]); + auto& sidehead = result.head(c); sidehead.transform(); Vec3d jsh = sidehead.junction_point(); @@ -1720,7 +1629,7 @@ bool SLASupportTree::generate(const PointSet &points, if(nearest_id < 0) { // Could not find a pillar, create one Vec3d jp = jsh; jp(Z) = gndlvl; - result.add_pillar(sidehead.id, jp, pradius). + result.add_pillar(unsigned(sidehead.id), jp, pradius). add_base(cfg.base_height_mm, cfg.base_radius_mm); // connects to ground, eligible for bridging @@ -1728,45 +1637,48 @@ bool SLASupportTree::generate(const PointSet &points, } else { // Creating the bridge to the nearest pillar - const Head& nearhead = result.heads()[size_t(nearest_id)]; + auto nearest_uid = unsigned(nearest_id); + const Head& nearhead = result.head(nearest_uid); Vec3d jp = jsh; Vec3d jh = nearhead.junction_point(); double d = distance(Vec2d{jp(X), jp(Y)}, Vec2d{jh(X), jh(Y)}); - Vec3d jn(jh(X), jh(Y), jp(Z) + d*std::tan(-cfg.tilt)); + Vec3d jn(jh(X), jh(Y), jp(Z) + + d * std::tan(-cfg.head_slope)); if(jn(Z) > jh(Z)) { double hdiff = jn(Z) - jh(Z); jp(Z) -= hdiff; jn(Z) -= hdiff; - // pillar without base, this does not connect to ground. - result.add_pillar(sidehead.id, jp, pradius); + // pillar without base, doesn't connect to ground. + result.add_pillar(nearest_uid, jp, pradius); } if(jp(Z) < jsh(Z)) result.add_junction(jp, hbr); if(jn(Z) >= jh(Z)) result.add_junction(jn, hbr); - double r_pillar = sidehead.request_pillar_radius(pradius); - result.add_bridge(jp, jn, r_pillar); + + result.add_bridge(jp, jn, + sidehead.request_pillar_radius(pradius)); } } } - // We will break down the pillar positions in 2D into concentric rings. - // Connecting the pillars belonging to the same ring will prevent - // bridges from crossing each other. After bridging the rings we can - // create bridges between the rings without the possibility of crossing - // bridges. Two pillars will be bridged with X shaped stick pairs. - // If they are really close to each other, than only one stick will be - // used in zig-zag mode. + // We will break down the pillar positions in 2D into concentric + // rings. Connecting the pillars belonging to the same ring will + // prevent bridges from crossing each other. After bridging the + // rings we can create bridges between the rings without the + // possibility of crossing bridges. Two pillars will be bridged + // with X shaped stick pairs. If they are really close to each + // other, than only one stick will be used in zig-zag mode. // Breaking down the points into rings will be done with a modified // convex hull algorithm (see pts_convex_hull()), that works for // collinear points as well. If the points are on the same surface, - // they can be part of an imaginary line segment for which the convex - // hull is not defined. I this case it is enough to sort the points - // spatially and create the bridge stick from the one endpoint to + // they can be part of an imaginary line segment for which the + // convex hull is not defined. I this case it is enough to sort the + // points spatially and create the bridge stick from one endpoint to // another. ClusterEl rem = cl_centroids; @@ -1777,8 +1689,8 @@ bool SLASupportTree::generate(const PointSet &points, std::sort(rem.begin(), rem.end()); auto newring = pts_convex_hull(rem, - [gnd_head_pt](unsigned i) { - auto&& p = gnd_head_pt(i); + [&points](unsigned i) { + auto&& p = points.row(i); return Vec2d(p(X), p(Y)); // project to 2D in along Z axis }); @@ -1786,7 +1698,7 @@ bool SLASupportTree::generate(const PointSet &points, // inner ring is now in 'newring' and outer ring is in 'ring' SpatIndex innerring; for(unsigned i : newring) { thr(); - const Pillar& pill = result.head_pillar(gndidx[i]); + const Pillar& pill = result.head_pillar(i); assert(pill.id >= 0); innerring.insert(pill.endpoint, unsigned(pill.id)); } @@ -1795,7 +1707,7 @@ bool SLASupportTree::generate(const PointSet &points, // inner ring and connect them. This will create the spider web // fashioned connections between pillars for(unsigned i : ring) { thr(); - const Pillar& outerpill = result.head_pillar(gndidx[i]); + const Pillar& outerpill = result.head_pillar(i); auto res = innerring.nearest(outerpill.endpoint, 1); if(res.empty()) continue; @@ -1821,8 +1733,8 @@ bool SLASupportTree::generate(const PointSet &points, ++it, ++next) { thr(); - const Pillar& pillar = result.head_pillar(gndidx[*it]); - const Pillar& nextpillar = result.head_pillar(gndidx[*next]); + const Pillar& pillar = result.head_pillar(*it); + const Pillar& nextpillar = result.head_pillar(*next); interconnect(pillar, nextpillar, emesh, result); } @@ -1830,9 +1742,10 @@ bool SLASupportTree::generate(const PointSet &points, std::sort(sring.begin(), sring.end()); std::set_difference(rem.begin(), rem.end(), sring.begin(), sring.end(), - std::back_inserter(tmp)); + std::back_inserter(tmp)); rem.swap(tmp); } + }; // Step: routing the pinheads that would connect to the model surface @@ -1842,17 +1755,71 @@ bool SLASupportTree::generate(const PointSet &points, // nearby pillar that can hold the supported weight. auto routing_nongnd_fn = [thr]( const SupportConfig& cfg, - const std::vector& gndheight, - const IndexSet& nogndidx, + const std::vector& pt_heights, + const PtIndices& nonground_head_indices, + const EigenMesh3D& mesh, Result& result) { // TODO: connect these to the ground pillars if possible - for(auto idx : nogndidx) { thr(); - double gh = gndheight[idx]; + for(auto idx : nonground_head_indices) { thr(); + double gh = pt_heights[idx]; double base_width = cfg.head_width_mm; auto& head = result.head(idx); + if(std::isinf(gh)) { // in this case the the pillar geometry + head.invalidate(); continue; +// // is partially inside the model geometry. We cannot go +// // straight down but at an angle. We will search for a suitable +// // direction with the optimizer, optimizing for the smallest +// // difference between the bridge body hit distance and the +// // bridge center hit distance. + +// // Get the spherical representation of the normal. its easier to +// // work with. +// double z = head.dir(Z); +// double r = 1.0; // for normalized vector +// double polar = std::acos(z / r); +// double azimuth = std::atan2(head.dir(Y), head.dir(X)); + +// using libnest2d::opt::bound; +// using libnest2d::opt::initvals; +// using libnest2d::opt::SimplexOptimizer; +// using libnest2d::opt::StopCriteria; + +// StopCriteria stc; +// stc.max_iterations = 100; +// stc.relative_score_difference = 1e-3; +// stc.stop_score = head.r_pin_mm; +// SimplexOptimizer solver(stc); + +// auto oresult = solver.optimize_max( +// [&head, &mesh](double plr, double azm) +// { +// auto n = Vec3d(std::cos(azm) * std::sin(plr), +// std::sin(azm) * std::sin(plr), +// std::cos(plr)).normalized(); + +// double score = bridge_mesh_intersect(head.junction_point(), +// n, +// head.r_back_mm, +// mesh); +// return score; +// }, +// initvals(polar, azimuth), // let's start with what we have +// bound(3*PI/4, PI), // Must not exceed the slope limit +// bound(-PI, PI) // azimuth can be a full range search +// ); + +// t = oresult.score; +// polar = std::get<0>(oresult.optimum); +// azimuth = std::get<1>(oresult.optimum); +// nn = Vec3d(std::cos(azimuth) * std::sin(polar), +// std::sin(azimuth) * std::sin(polar), +// std::cos(polar)).normalized(); + + } + // In this case there is no room for the base pinhead. if(gh < head.fullwidth()) { double min_l = @@ -1904,24 +1871,26 @@ bool SLASupportTree::generate(const PointSet &points, // Step: process the support points where there is not enough space for a // full pinhead. In this case we will use a rounded sphere as a touching // point and use a thinner bridge (let's call it a stick). - auto process_headless = [thr]( - const SupportConfig& cfg, - const PointSet& headless_pts, - const PointSet& headless_norm, + auto process_headless_fn = [thr]( + const std::vector& support_points, + const PointSet& support_normals, + const PtIndices& headless_indices, const EigenMesh3D& emesh, Result& result) { // For now we will just generate smaller headless sticks with a sharp // ending point that connects to the mesh surface. - const double R = cfg.headless_pillar_radius_mm; - const double HWIDTH_MM = R/3; // We will sink the pins into the model surface for a distance of 1/3 of // the pin radius - for(int i = 0; i < headless_pts.rows(); i++) { thr(); - Vec3d sph = headless_pts.row(i); // Exact support position - Vec3d n = headless_norm.row(i); // mesh outward normal + for(unsigned i : headless_indices) { thr(); + + const auto R = double(support_points[i].head_front_radius); + const double HWIDTH_MM = R/3; + + Vec3d sph = support_points[i].pos.cast(); // Exact support position + Vec3d n = support_normals.row(i); // mesh outward normal Vec3d sp = sph - n * HWIDTH_MM; // stick head start point Vec3d dir = {0, 0, -1}; @@ -1959,47 +1928,62 @@ bool SLASupportTree::generate(const PointSet &points, // Here we can easily track what goes in and what comes out of each step: // (see the cref-s as inputs and ref-s as outputs) std::array, NUM_STEPS> program = { - [] () { - // Begin... - // Potentially clear up the shared data (not needed for now) - }, + [] () { + // Begin... + // Potentially clear up the shared data (not needed for now) + }, - // Filtering unnecessary support points - bind(filterfn, cref(cfg), cref(points), cref(mesh), - ref(filtered_points), ref(head_normals), - ref(head_positions), ref(headless_positions), ref(headless_normals)), + bind(filter_fn, + // inputs: + cref(cfg), cref(points), cref(mesh), + // outputs: + ref(support_normals), ref(filtered_indices), ref(head_indices), + ref(headless_indices)), - // Pinhead generation - bind(pinheadfn, cref(cfg), - ref(head_positions), ref(head_normals), ref(result)), + bind(pinheads_fn, + // inputs: + cref(cfg), cref(support_points), cref(support_normals), + cref(head_indices), + // outputs: + ref(result)), - // Classification of support points - bind(classifyfn, cref(cfg), cref(mesh), - ref(head_positions), ref(ground_heads), ref(noground_heads), - ref(head_heights), ref(ground_connectors), ref(result)), + bind(classify_fn, + // inputs: + cref(cfg), cref(points), cref(mesh), cref(head_indices), + // outputs: + ref(onmodel_head_indices), ref(pt_heights), ref(pillar_clusters), + ref(result)), - // Routing ground connecting clusters - bind(routing_ground_fn, - cref(cfg), cref(ground_connectors), cref(ground_heads), cref(mesh), - ref(result)), + bind(routing_ground_fn, + // inputs: + cref(cfg), cref(points), cref(pillar_clusters), cref(mesh), + // outputs: + ref(result)), - // routing non ground connecting support points - bind(routing_nongnd_fn, cref(cfg), cref(head_heights), cref(noground_heads), - ref(result)), + bind(routing_nongnd_fn, + // inputs: + cref(cfg), cref(pt_heights), cref(onmodel_head_indices), cref(mesh), + // outputs: + ref(result)), - bind(process_headless, - cref(cfg), cref(headless_positions), - cref(headless_normals), cref(mesh), - ref(result)), - [] () { - // Done - }, - [] () { - // Halt - }, - [] () { - // Abort - } + bind(process_headless_fn, + // inputs: + cref(support_points), cref(support_normals), + cref(headless_indices), cref(mesh), + // outputs: + ref(result)), + + [] () { + // Done + }, + + [] () { + // Halt + }, + + [] () { + // Abort + } }; if(cfg.ground_facing_only) { // Delete the non-gnd steps if necessary @@ -2067,8 +2051,6 @@ bool SLASupportTree::generate(const PointSet &points, program[pc](); } - if(pc == ABORT) throw SLASupportsStoppedException(); - return pc == ABORT; } @@ -2131,7 +2113,7 @@ void SLASupportTree::remove_pad() m_impl->remove_pad(); } -SLASupportTree::SLASupportTree(const PointSet &points, +SLASupportTree::SLASupportTree(const std::vector &points, const EigenMesh3D& emesh, const SupportConfig &cfg, const Controller &ctl): @@ -2152,8 +2134,5 @@ SLASupportTree &SLASupportTree::operator=(const SLASupportTree &c) SLASupportTree::~SLASupportTree() {} -SLASupportsStoppedException::SLASupportsStoppedException(): - std::runtime_error("") {} - } } diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index c29b2a571..d96951912 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -74,7 +74,7 @@ struct SupportConfig { double base_height_mm = 1.0; // The default angle for connecting support sticks and junctions. - double tilt = M_PI/4; + double head_slope = M_PI/4; // The max length of a bridge in mm double max_bridge_length_mm = 15.0; @@ -116,18 +116,11 @@ using PointSet = Eigen::MatrixXd; //EigenMesh3D to_eigenmesh(const ModelObject& model); // Simple conversion of 'vector of points' to an Eigen matrix -PointSet to_point_set(const std::vector&); +//PointSet to_point_set(const std::vector&); /* ************************************************************************** */ -/// Just a wrapper to the runtime error to be recognizable in try blocks -class SLASupportsStoppedException: public std::runtime_error { -public: - using std::runtime_error::runtime_error; - SLASupportsStoppedException(); -}; - /// The class containing mesh data for the generated supports. class SLASupportTree { class Impl; @@ -141,7 +134,12 @@ class SLASupportTree { const Controller&); /// Generate the 3D supports for a model intended for SLA print. - bool generate(const PointSet& pts, + bool generate(const std::vector& pts, + const EigenMesh3D& mesh, + const SupportConfig& cfg = {}, + const Controller& ctl = {}); + + bool _generate(const std::vector& pts, const EigenMesh3D& mesh, const SupportConfig& cfg = {}, const Controller& ctl = {}); @@ -149,7 +147,7 @@ public: SLASupportTree(); - SLASupportTree(const PointSet& pts, + SLASupportTree(const std::vector& pts, const EigenMesh3D& em, const SupportConfig& cfg = {}, const Controller& ctl = {}); diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index 25638fe69..65fa98286 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -17,6 +17,8 @@ #include #include +#include + #include "SLASpatIndex.hpp" #include "ClipperUtils.hpp" @@ -186,6 +188,15 @@ bool EigenMesh3D::inside(const Vec3d &p) const { } #endif /* SLIC3R_SLA_NEEDS_WINDTREE */ +double EigenMesh3D::squared_distance(const Vec3d &p, int& i, Vec3d& c) const { + double sqdst = 0; + Eigen::Matrix pp = p; + Eigen::Matrix cc; + sqdst = m_aabb->squared_distance(m_V, m_F, pp, i, cc); + c = cc; + return sqdst; +} + /* **************************************************************************** * Misc functions * ****************************************************************************/ @@ -208,21 +219,40 @@ template double distance(const Vec& pp1, const Vec& pp2) { PointSet normals(const PointSet& points, const EigenMesh3D& mesh, double eps, - std::function throw_on_cancel) + std::function throw_on_cancel, + const std::vector& pt_indices = {}) { if(points.rows() == 0 || mesh.V().rows() == 0 || mesh.F().rows() == 0) return {}; - Eigen::VectorXd dists; - Eigen::VectorXi I; - PointSet C; + std::vector range = pt_indices; + if(range.empty()) { + range.resize(size_t(points.rows()), 0); + std::iota(range.begin(), range.end(), 0); + } - igl::point_mesh_squared_distance( points, mesh.V(), mesh.F(), dists, I, C); + std::vector dists(range.size()); + std::vector I(range.size()); + PointSet C(Eigen::Index(range.size()), 3); - PointSet ret(I.rows(), 3); - for(int i = 0; i < I.rows(); i++) { + tbb::parallel_for(size_t(0), range.size(), + [&range, &mesh, &points, &dists, &I, &C](size_t idx) + { + auto eidx = Eigen::Index(range[idx]); + int i = 0; + Vec3d c; + dists[idx] = mesh.squared_distance(points.row(eidx), i, c); + C.row(eidx) = c; + I[range[idx]] = i; + }); + +// igl::point_mesh_squared_distance( points, mesh.V(), mesh.F(), dists, I, C); + + + PointSet ret(I.size(), 3); + for(unsigned i = 0; i < I.size(); i++) { throw_on_cancel(); - auto idx = I(i); + auto idx = I[i]; auto trindex = mesh.F().row(idx); const Vec3d& p1 = mesh.V().row(trindex(0)); @@ -332,7 +362,7 @@ PointSet normals(const PointSet& points, ClusteredPoints cluster( const sla::PointSet& points, std::function pred, - unsigned max_points = 0) + unsigned max_points = 0, const std::vector& indices = {}) { namespace bgi = boost::geometry::index; @@ -342,8 +372,12 @@ ClusteredPoints cluster( Index3D sindex; // Build the index - for(unsigned idx = 0; idx < points.rows(); idx++) - sindex.insert( std::make_pair(points.row(idx), idx)); + if(indices.empty()) + for(unsigned idx = 0; idx < points.rows(); idx++) + sindex.insert( std::make_pair(points.row(idx), idx)); + else + for(unsigned idx : indices) + sindex.insert( std::make_pair(points.row(idx), idx)); using Elems = std::vector; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 827846b71..4efff03da 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -521,7 +521,7 @@ sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c) { scfg.head_penetration_mm = c.support_head_penetration.getFloat(); scfg.head_width_mm = c.support_head_width.getFloat(); scfg.object_elevation_mm = c.support_object_elevation.getFloat(); - scfg.tilt = c.support_critical_angle.getFloat() * PI / 180.0 ; + scfg.head_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); scfg.headless_pillar_radius_mm = 0.375*c.support_pillar_diameter.getFloat(); switch(c.support_pillar_connection_mode.getInt()) { @@ -684,54 +684,52 @@ void SLAPrint::process() return; } - try { - sla::SupportConfig scfg = make_support_cfg(po.m_config); - sla::Controller ctl; + sla::SupportConfig scfg = make_support_cfg(po.m_config); + sla::Controller ctl; - // some magic to scale the status values coming from the support - // tree creation into the whole print process - auto stfirst = OBJ_STEP_LEVELS.begin(); - auto stthis = stfirst + slaposSupportTree; - // we need to add up the status portions until this operation - int init = std::accumulate(stfirst, stthis, 0); - init = int(init * ostepd); // scale the init portion + // some magic to scale the status values coming from the support + // tree creation into the whole print process + auto stfirst = OBJ_STEP_LEVELS.begin(); + auto stthis = stfirst + slaposSupportTree; + // we need to add up the status portions until this operation + int init = std::accumulate(stfirst, stthis, 0); + init = int(init * ostepd); // scale the init portion - // scaling for the sub operations - double d = *stthis / (objcount * 100.0); + // scaling for the sub operations + double d = *stthis / (objcount * 100.0); - ctl.statuscb = [this, init, d](unsigned st, const std::string& msg) - { - //FIXME this status line scaling does not seem to be correct. - // How does it account for an increasing object index? - report_status(*this, int(init + st*d), msg); - }; + ctl.statuscb = [this, init, d](unsigned st, const std::string& msg) + { + //FIXME this status line scaling does not seem to be correct. + // How does it account for an increasing object index? + report_status(*this, int(init + st*d), msg); + }; - ctl.stopcondition = [this](){ return canceled(); }; - ctl.cancelfn = [this]() { throw_if_canceled(); }; + ctl.stopcondition = [this](){ return canceled(); }; + ctl.cancelfn = [this]() { throw_if_canceled(); }; - po.m_supportdata->support_tree_ptr.reset( - new SLASupportTree(sla::to_point_set(po.m_supportdata->support_points), - po.m_supportdata->emesh, scfg, ctl)); + po.m_supportdata->support_tree_ptr.reset( + new SLASupportTree(po.m_supportdata->support_points, + po.m_supportdata->emesh, scfg, ctl)); - // Create the unified mesh - auto rc = SlicingStatus::RELOAD_SCENE; + throw_if_canceled(); - // This is to prevent "Done." being displayed during merged_mesh() - report_status(*this, -1, L("Visualizing supports")); - po.m_supportdata->support_tree_ptr->merged_mesh(); + // Create the unified mesh + auto rc = SlicingStatus::RELOAD_SCENE; - BOOST_LOG_TRIVIAL(debug) << "Processed support point count " - << po.m_supportdata->support_points.size(); + // This is to prevent "Done." being displayed during merged_mesh() + report_status(*this, -1, L("Visualizing supports")); + po.m_supportdata->support_tree_ptr->merged_mesh(); - // Check the mesh for later troubleshooting. - if(po.support_mesh().empty()) - BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty"; + BOOST_LOG_TRIVIAL(debug) << "Processed support point count " + << po.m_supportdata->support_points.size(); + + // Check the mesh for later troubleshooting. + if(po.support_mesh().empty()) + BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty"; + + report_status(*this, -1, L("Visualizing supports"), rc); - report_status(*this, -1, L("Visualizing supports"), rc); - } catch(sla::SLASupportsStoppedException&) { - // no need to rethrow - // throw_if_canceled(); - } }; // This step generates the sla base pad From 359de84a05e4ff12465103d7109b53bd8d3cd5c8 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 26 Feb 2019 18:09:33 +0100 Subject: [PATCH 008/236] Fixing issues from code cleanup --- src/libslic3r/SLA/SLASupportTree.cpp | 24 +++++++-------- src/libslic3r/SLA/SLASupportTreeIGL.cpp | 40 +++++++++---------------- 2 files changed, 25 insertions(+), 39 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 9ba4afe42..d0c33205a 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1150,7 +1150,6 @@ bool SLASupportTree::generate(const std::vector &support_points, using PtIndices = std::vector; const size_t pcount = size_t(points.rows()); - PtIndices filtered_indices; // all valid support points PtIndices head_indices; // support points with pinhead PtIndices headless_indices; // headless support points PtIndices onmodel_head_indices; // supp. pts. connecting to model @@ -1201,7 +1200,6 @@ bool SLASupportTree::generate(const std::vector &support_points, const PointSet& points, const EigenMesh3D& mesh, PointSet& support_normals, - PtIndices& filtered_indices, PtIndices& head_indices, PtIndices& headless_indices) { @@ -1213,14 +1211,13 @@ bool SLASupportTree::generate(const std::vector &support_points, thr(); return distance(p.first, se.first) < D_SP; }, 2); - - filtered_indices.resize(aliases.size()); + PtIndices filtered_indices; + filtered_indices.reserve(aliases.size()); head_indices.reserve(aliases.size()); headless_indices.reserve(aliases.size()); - unsigned count = 0; for(auto& a : aliases) { // Here we keep only the front point of the cluster. - filtered_indices[count++] = a.front(); + filtered_indices.emplace_back(a.front()); } // calculate the normals to the triangles for filtered points @@ -1238,7 +1235,9 @@ bool SLASupportTree::generate(const std::vector &support_points, using libnest2d::opt::StopCriteria; static const unsigned MAX_TRIES = 100; - for(unsigned i = 0; i < count; i++) { + for(unsigned i = 0, fidx = filtered_indices[0]; + i < filtered_indices.size(); ++i, fidx = filtered_indices[i]) + { thr(); auto n = nmls.row(i); @@ -1261,7 +1260,7 @@ bool SLASupportTree::generate(const std::vector &support_points, polar = std::max(polar, 3*PI / 4); // save the head (pinpoint) position - Vec3d hp = points.row(filtered_indices[i]); + Vec3d hp = points.row(i); double w = cfg.head_width_mm + cfg.head_back_radius_mm + @@ -1322,15 +1321,15 @@ bool SLASupportTree::generate(const std::vector &support_points, } // save the verified and corrected normal - support_normals.row(filtered_indices[i]) = nn; + support_normals.row(fidx) = nn; if(t > w) { // mark the point for needing a head. - head_indices.emplace_back(filtered_indices[i]); + head_indices.emplace_back(fidx); } else if( polar >= 3*PI/4 ) { // Headless supports do not tilt like the headed ones so // the normal should point almost to the ground. - headless_indices.emplace_back(filtered_indices[i]); + headless_indices.emplace_back(fidx); } } } @@ -1937,8 +1936,7 @@ bool SLASupportTree::generate(const std::vector &support_points, // inputs: cref(cfg), cref(points), cref(mesh), // outputs: - ref(support_normals), ref(filtered_indices), ref(head_indices), - ref(headless_indices)), + ref(support_normals), ref(head_indices), ref(headless_indices)), bind(pinheads_fn, // inputs: diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index 65fa98286..04b5a7207 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -219,7 +219,7 @@ template double distance(const Vec& pp1, const Vec& pp2) { PointSet normals(const PointSet& points, const EigenMesh3D& mesh, double eps, - std::function throw_on_cancel, + std::function thr, // throw on cancel const std::vector& pt_indices = {}) { if(points.rows() == 0 || mesh.V().rows() == 0 || mesh.F().rows() == 0) @@ -231,29 +231,19 @@ PointSet normals(const PointSet& points, std::iota(range.begin(), range.end(), 0); } - std::vector dists(range.size()); - std::vector I(range.size()); - PointSet C(Eigen::Index(range.size()), 3); + PointSet ret(range.size(), 3); tbb::parallel_for(size_t(0), range.size(), - [&range, &mesh, &points, &dists, &I, &C](size_t idx) + [&ret, &range, &mesh, &points, thr, eps](size_t ridx) { - auto eidx = Eigen::Index(range[idx]); - int i = 0; - Vec3d c; - dists[idx] = mesh.squared_distance(points.row(eidx), i, c); - C.row(eidx) = c; - I[range[idx]] = i; - }); + thr(); + auto eidx = Eigen::Index(range[ridx]); + int faceid = 0; + Vec3d p; -// igl::point_mesh_squared_distance( points, mesh.V(), mesh.F(), dists, I, C); + mesh.squared_distance(points.row(eidx), faceid, p); - - PointSet ret(I.size(), 3); - for(unsigned i = 0; i < I.size(); i++) { - throw_on_cancel(); - auto idx = I[i]; - auto trindex = mesh.F().row(idx); + auto trindex = mesh.F().row(faceid); const Vec3d& p1 = mesh.V().row(trindex(0)); const Vec3d& p2 = mesh.V().row(trindex(1)); @@ -267,8 +257,6 @@ PointSet normals(const PointSet& points, // of its triangle. The procedure is the same, get the neighbor // triangles and calculate an average normal. - const Vec3d& p = C.row(i); - // mark the vertex indices of the edge. ia and ib marks and edge ic // will mark a single vertex. int ia = -1, ib = -1, ic = -1; @@ -296,7 +284,7 @@ PointSet normals(const PointSet& points, std::vector neigh; if(ic >= 0) { // The point is right on a vertex of the triangle for(int n = 0; n < mesh.F().rows(); ++n) { - throw_on_cancel(); + thr(); Vec3i ni = mesh.F().row(n); if((ni(X) == ic || ni(Y) == ic || ni(Z) == ic)) neigh.emplace_back(ni); @@ -305,7 +293,7 @@ PointSet normals(const PointSet& points, else if(ia >= 0 && ib >= 0) { // the point is on and edge // now get all the neigboring triangles for(int n = 0; n < mesh.F().rows(); ++n) { - throw_on_cancel(); + thr(); Vec3i ni = mesh.F().row(n); if((ni(X) == ia || ni(Y) == ia || ni(Z) == ia) && (ni(X) == ib || ni(Y) == ib || ni(Z) == ib)) @@ -346,14 +334,14 @@ PointSet normals(const PointSet& points, Vec3d sumnorm(0, 0, 0); sumnorm = std::accumulate(neighnorms.begin(), lend, sumnorm); sumnorm.normalize(); - ret.row(i) = sumnorm; + ret.row(long(ridx)) = sumnorm; } else { // point lies safely within its triangle Eigen::Vector3d U = p2 - p1; Eigen::Vector3d V = p3 - p1; - ret.row(i) = U.cross(V).normalized(); + ret.row(long(ridx)) = U.cross(V).normalized(); } - } + }); return ret; } From 8cc1486cabc672b9f0c8fd66c9e4a38dc0c5d405 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 27 Feb 2019 10:03:58 +0100 Subject: [PATCH 009/236] Fixed uv in gizmos overlay --- src/slic3r/GUI/GLCanvas3D.cpp | 4 ++-- src/slic3r/GUI/GLTexture.cpp | 38 +++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 23f1502af..3e008df14 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3175,8 +3175,8 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan GLGizmoBase::EState state = it->second->get_state(); #if ENABLE_SVG_ICONS - float u_icon_size = m_overlay_icons_size * inv_tex_width; - float v_icon_size = m_overlay_icons_size * inv_tex_height; + float u_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_width; + float v_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_height; float top = sprite_id * v_icon_size; float left = state * u_icon_size; float bottom = top + v_icon_size; diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 168ad8b64..36c40bb85 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -16,6 +16,8 @@ #define NANOSVGRAST_IMPLEMENTATION #include "nanosvg/nanosvgrast.h" +#include "libslic3r/utils.hpp" + namespace Slic3r { namespace GUI { @@ -116,16 +118,18 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector Date: Wed, 27 Feb 2019 10:28:36 +0100 Subject: [PATCH 010/236] Fixed build on Linux --- src/slic3r/GUI/GLTexture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 36c40bb85..9b4548686 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -16,7 +16,7 @@ #define NANOSVGRAST_IMPLEMENTATION #include "nanosvg/nanosvgrast.h" -#include "libslic3r/utils.hpp" +#include "libslic3r/Utils.hpp" namespace Slic3r { namespace GUI { From 93c57612bf587f2647df1642142a3d7c1ef76228 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 27 Feb 2019 11:39:02 +0100 Subject: [PATCH 011/236] Grouping support generation algorithm into a separate class --- src/libslic3r/SLA/SLASupportTree.cpp | 978 +++++++++++++-------------- src/libslic3r/SLA/SLASupportTree.hpp | 25 +- src/libslic3r/SLAPrint.cpp | 3 +- 3 files changed, 472 insertions(+), 534 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index d0c33205a..49ece2f1f 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -551,206 +551,6 @@ enum { // For indexing Eigen vectors as v(X), v(Y), v(Z) instead of numbers X, Y, Z }; -//PointSet to_point_set(const std::vector &v) -//{ -// PointSet ret(v.size(), 3); -// long i = 0; -// for(const SupportPoint& support_point : v) { -// ret.row(i)(X) = double(support_point.pos(X)); -// ret.row(i)(Y) = double(support_point.pos(Y)); -// ret.row(i)(Z) = double(support_point.pos(Z)); -// ++i; -// } -// return ret; -//} - -Vec3d model_coord(const ModelInstance& object, const Vec3f& mesh_coord) { - return object.transform_vector(mesh_coord.cast()); -} - -inline double ray_mesh_intersect(const Vec3d& s, - const Vec3d& dir, - const EigenMesh3D& m) -{ - return m.query_ray_hit(s, dir).distance(); -} - -// This function will test if a future pinhead would not collide with the model -// geometry. It does not take a 'Head' object because those are created after -// this test. -// Parameters: -// s: The touching point on the model surface. -// dir: This is the direction of the head from the pin to the back -// r_pin, r_back: the radiuses of the pin and the back sphere -// width: This is the full width from the pin center to the back center -// m: The object mesh -// -// Optional: -// samples: how many rays will be shot -// safety distance: This will be added to the radiuses to have a safety distance -// from the mesh. -double pinhead_mesh_intersect(const Vec3d& s, - const Vec3d& dir, - double r_pin, - double r_back, - double width, - const EigenMesh3D& m, - unsigned samples = 16, - double safety_distance = 0.001) -{ - // method based on: - // https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space - - - // We will shoot multiple rays from the head pinpoint in the direction of - // the pinhead robe (side) surface. The result will be the smallest hit - // distance. - - // Move away slightly from the touching point to avoid raycasting on the - // inner surface of the mesh. - Vec3d v = dir; // Our direction (axis) - Vec3d c = s + width * dir; - const double& sd = safety_distance; - - // Two vectors that will be perpendicular to each other and to the axis. - // Values for a(X) and a(Y) are now arbitrary, a(Z) is just a placeholder. - Vec3d a(0, 1, 0), b; - - // The portions of the circle (the head-back circle) for which we will shoot - // rays. - std::vector phis(samples); - for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); - - // We have to address the case when the direction vector v (same as dir) - // is coincident with one of the world axes. In this case two of its - // components will be completely zero and one is 1.0. Our method becomes - // dangerous here due to division with zero. Instead, vector 'a' can be an - // element-wise rotated version of 'v' - auto chk1 = [] (double val) { return std::abs(std::abs(val) - 1) < 1e-20; }; - if(chk1(v(X)) || chk1(v(Y)) || chk1(v(Z))) { - a = {v(Z), v(X), v(Y)}; - b = {v(Y), v(Z), v(X)}; - } - else { - a(Z) = -(v(Y)*a(Y)) / v(Z); a.normalize(); - b = a.cross(v); - } - - // Now a and b vectors are perpendicular to v and to each other. Together - // they define the plane where we have to iterate with the given angles - // in the 'phis' vector - - tbb::parallel_for(size_t(0), phis.size(), - [&phis, &m, sd, r_pin, r_back, s, a, b, c](size_t i) - { - double& phi = phis[i]; - double sinphi = std::sin(phi); - double cosphi = std::cos(phi); - - // Let's have a safety coefficient for the radiuses. - double rpscos = (sd + r_pin) * cosphi; - double rpssin = (sd + r_pin) * sinphi; - double rpbcos = (sd + r_back) * cosphi; - double rpbsin = (sd + r_back) * sinphi; - - // Point on the circle on the pin sphere - Vec3d ps(s(X) + rpscos * a(X) + rpssin * b(X), - s(Y) + rpscos * a(Y) + rpssin * b(Y), - s(Z) + rpscos * a(Z) + rpssin * b(Z)); - - // Point ps is not on mesh but can be inside or outside as well. This - // would cause many problems with ray-casting. To detect the position we - // will use the ray-casting result (which has an is_inside predicate). - - // This is the point on the circle on the back sphere - Vec3d p(c(X) + rpbcos * a(X) + rpbsin * b(X), - c(Y) + rpbcos * a(Y) + rpbsin * b(Y), - c(Z) + rpbcos * a(Z) + rpbsin * b(Z)); - - Vec3d n = (p - ps).normalized(); - auto hr = m.query_ray_hit(ps + sd*n, n); - - if(hr.is_inside()) { // the hit is inside the model - if(hr.distance() > 2*r_pin) phi = 0; - else { - // re-cast the ray from the outside of the object - auto hr2 = m.query_ray_hit(ps + (hr.distance() + 2*sd)*n, n); - phi = hr2.distance(); - } - } else phi = hr.distance(); - }); - - auto mit = std::min_element(phis.begin(), phis.end()); - - return *mit; -} - - -// Checking bridge (pillar and stick as well) intersection with the model. If -// the function is used for headless sticks, the ins_check parameter have to be -// true as the beginning of the stick might be inside the model geometry. -double bridge_mesh_intersect(const Vec3d& s, - const Vec3d& dir, - double r, - const EigenMesh3D& m, - bool ins_check = false, - unsigned samples = 4, - double safety_distance = 0.001) -{ - // helper vector calculations - Vec3d a(0, 1, 0), b; - const double& sd = safety_distance; - - // INFO: for explanation of the method used here, see the previous method's - // comments. - - auto chk1 = [] (double val) { return std::abs(std::abs(val) - 1) < 1e-20; }; - if(chk1(dir(X)) || chk1(dir(Y)) || chk1(dir(Z))) { - a = {dir(Z), dir(X), dir(Y)}; - b = {dir(Y), dir(Z), dir(X)}; - } - else { - a(Z) = -(dir(Y)*a(Y)) / dir(Z); a.normalize(); - b = a.cross(dir); - } - - // circle portions - std::vector phis(samples); - for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); - - tbb::parallel_for(size_t(0), phis.size(), - [&phis, &m, a, b, sd, dir, r, s, ins_check](size_t i) - { - double& phi = phis[i]; - double sinphi = std::sin(phi); - double cosphi = std::cos(phi); - - // Let's have a safety coefficient for the radiuses. - double rcos = (sd + r) * cosphi; - double rsin = (sd + r) * sinphi; - - // Point on the circle on the pin sphere - Vec3d p (s(X) + rcos * a(X) + rsin * b(X), - s(Y) + rcos * a(Y) + rsin * b(Y), - s(Z) + rcos * a(Z) + rsin * b(Z)); - - auto hr = m.query_ray_hit(p + sd*dir, dir); - - if(ins_check && hr.is_inside()) { - if(hr.distance() > 2*r) phi = 0; - else { - // re-cast the ray from the outside of the object - auto hr2 = m.query_ray_hit(p + (hr.distance() + 2*sd)*dir, dir); - phi = hr2.distance(); - } - } else phi = hr.distance(); - }); - - auto mit = std::min_element(phis.begin(), phis.end()); - - return *mit; -} - // Calculate the normals for the selected points (from 'points' set) on the // mesh. This will call squared distance for each point. PointSet normals(const PointSet& points, @@ -1129,100 +929,343 @@ Vec3d dirv(const Vec3d& startp, const Vec3d& endp) { return (endp - startp).normalized(); } -bool SLASupportTree::generate(const std::vector &support_points, - const EigenMesh3D& mesh, - const SupportConfig &cfg, - const Controller &ctl) -{ - // Prepare the support points in Eigen/IGL format as well, we will use it - // mostly in this form. - Eigen::MatrixXd points(support_points.size(), 3); long i = 0; - for(const SupportPoint& sp : support_points) { - points.row(i)(X) = double(sp.pos(X)); - points.row(i)(Y) = double(sp.pos(Y)); - points.row(i)(Z) = double(sp.pos(Z)); - ++i; - } - - // If there are no input points there is no point in doing anything - if(points.rows() == 0) return false; +class SLASupportTree::Algorithm { + const SupportConfig& m_cfg; + const EigenMesh3D& m_mesh; + const std::vector& m_support_pts; using PtIndices = std::vector; - const size_t pcount = size_t(points.rows()); - PtIndices head_indices; // support points with pinhead - PtIndices headless_indices; // headless support points - PtIndices onmodel_head_indices; // supp. pts. connecting to model + PtIndices m_iheads; // support points with pinhead + PtIndices m_iheadless; // headless support points + PtIndices m_iheads_onmodel; // supp. pts. connecting to model - PointSet support_normals(pcount, 3); // support point normals + // normals for support points from model faces. + PointSet m_support_nmls; // Captures the height of the processed support points from the ground // or the model surface - std::vector pt_heights(size_t(points.rows()), 0.0); + std::vector m_ptheights; - // Clusters of points which can reach the ground directly - std::vector pillar_clusters; + // Clusters of points which can reach the ground directly and can be + // bridged to one central pillar + std::vector m_pillar_clusters; // This algorithm uses the Impl class as its output stream. It will be // filled gradually with support elements (heads, pillars, bridges, ...) using Result = SLASupportTree::Impl; - Result& result = *m_impl; - // Let's define the individual steps of the processing. We can experiment - // later with the ordering and the dependencies between them. - enum Steps { - BEGIN, - FILTER, - PINHEADS, - CLASSIFY, - ROUTING_GROUND, - ROUTING_NONGROUND, - HEADLESS, - DONE, - HALT, - ABORT, - NUM_STEPS - //... - }; + Result& m_result; + + // support points in Eigen/IGL format + PointSet m_points; // throw if canceled: It will be called many times so a shorthand will // come in handy. - ThrowOnCancel thr = ctl.cancelfn; + ThrowOnCancel m_thr; - // Each step has a processing block in a form of a function. + inline double ray_mesh_intersect(const Vec3d& s, + const Vec3d& dir) + { + return m_mesh.query_ray_hit(s, dir).distance(); + } + + // This function will test if a future pinhead would not collide with the + // model geometry. It does not take a 'Head' object because those are + // created after this test. Parameters: s: The touching point on the model + // surface. dir: This is the direction of the head from the pin to the back + // r_pin, r_back: the radiuses of the pin and the back sphere width: This + // is the full width from the pin center to the back center m: The object + // mesh + // + // Optional: + // samples: how many rays will be shot + // safety distance: This will be added to the radiuses to have a safety + // distance from the mesh. + double pinhead_mesh_intersect(const Vec3d& s, + const Vec3d& dir, + double r_pin, + double r_back, + double width, + unsigned samples = 8) + { + // method based on: + // https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space + + // We will shoot multiple rays from the head pinpoint in the direction + // of the pinhead robe (side) surface. The result will be the smallest + // hit distance. + + // Move away slightly from the touching point to avoid raycasting on the + // inner surface of the mesh. + Vec3d v = dir; // Our direction (axis) + Vec3d c = s + width * dir; + const double& sd = m_cfg.safety_distance_mm; + + // Two vectors that will be perpendicular to each other and to the + // axis. Values for a(X) and a(Y) are now arbitrary, a(Z) is just a + // placeholder. + Vec3d a(0, 1, 0), b; + + // The portions of the circle (the head-back circle) for which we will + // shoot rays. + std::vector phis(samples); + for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); + + // We have to address the case when the direction vector v (same as + // dir) is coincident with one of the world axes. In this case two of + // its components will be completely zero and one is 1.0. Our method + // becomes dangerous here due to division with zero. Instead, vector + // 'a' can be an element-wise rotated version of 'v' + auto chk1 = [] (double val) { + return std::abs(std::abs(val) - 1) < 1e-20; + }; + + if(chk1(v(X)) || chk1(v(Y)) || chk1(v(Z))) { + a = {v(Z), v(X), v(Y)}; + b = {v(Y), v(Z), v(X)}; + } + else { + a(Z) = -(v(Y)*a(Y)) / v(Z); a.normalize(); + b = a.cross(v); + } + + // Now a and b vectors are perpendicular to v and to each other. + // Together they define the plane where we have to iterate with the + // given angles in the 'phis' vector + auto& m = m_mesh; + + tbb::parallel_for(size_t(0), phis.size(), + [&phis, &m, sd, r_pin, r_back, s, a, b, c](size_t i) + { + double& phi = phis[i]; + double sinphi = std::sin(phi); + double cosphi = std::cos(phi); + + // Let's have a safety coefficient for the radiuses. + double rpscos = (sd + r_pin) * cosphi; + double rpssin = (sd + r_pin) * sinphi; + double rpbcos = (sd + r_back) * cosphi; + double rpbsin = (sd + r_back) * sinphi; + + // Point on the circle on the pin sphere + Vec3d ps(s(X) + rpscos * a(X) + rpssin * b(X), + s(Y) + rpscos * a(Y) + rpssin * b(Y), + s(Z) + rpscos * a(Z) + rpssin * b(Z)); + + // Point ps is not on mesh but can be inside or outside as well. + // This would cause many problems with ray-casting. To detect the + // position we will use the ray-casting result (which has an + // is_inside predicate). + + // This is the point on the circle on the back sphere + Vec3d p(c(X) + rpbcos * a(X) + rpbsin * b(X), + c(Y) + rpbcos * a(Y) + rpbsin * b(Y), + c(Z) + rpbcos * a(Z) + rpbsin * b(Z)); + + Vec3d n = (p - ps).normalized(); + auto q = m.query_ray_hit(ps + sd*n, n); + + if(q.is_inside()) { // the hit is inside the model + if(q.distance() > 2*r_pin) phi = 0; + else { + // re-cast the ray from the outside of the object + auto q2 = m.query_ray_hit(ps + (q.distance() + 2*sd)*n, n); + phi = q2.distance(); + } + } else phi = q.distance(); + }); + + auto mit = std::min_element(phis.begin(), phis.end()); + + return *mit; + } + + // Checking bridge (pillar and stick as well) intersection with the model. + // If the function is used for headless sticks, the ins_check parameter + // have to be true as the beginning of the stick might be inside the model + // geometry. + double bridge_mesh_intersect(const Vec3d& s, + const Vec3d& dir, + double r, + bool ins_check = false, + unsigned samples = 4) + { + // helper vector calculations + Vec3d a(0, 1, 0), b; + const double& sd = m_cfg.safety_distance_mm; + + // INFO: for explanation of the method used here, see the previous + // method's comments. + + auto chk1 = [] (double val) { + return std::abs(std::abs(val) - 1) < 1e-20; + }; + + if(chk1(dir(X)) || chk1(dir(Y)) || chk1(dir(Z))) { + a = {dir(Z), dir(X), dir(Y)}; + b = {dir(Y), dir(Z), dir(X)}; + } + else { + a(Z) = -(dir(Y)*a(Y)) / dir(Z); a.normalize(); + b = a.cross(dir); + } + + // circle portions + std::vector phis(samples); + for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); + + auto& m = m_mesh; + + tbb::parallel_for(size_t(0), phis.size(), + [&m, &phis, a, b, sd, dir, r, s, ins_check](size_t i) + { + double& phi = phis[i]; + double sinphi = std::sin(phi); + double cosphi = std::cos(phi); + + // Let's have a safety coefficient for the radiuses. + double rcos = (sd + r) * cosphi; + double rsin = (sd + r) * sinphi; + + // Point on the circle on the pin sphere + Vec3d p (s(X) + rcos * a(X) + rsin * b(X), + s(Y) + rcos * a(Y) + rsin * b(Y), + s(Z) + rcos * a(Z) + rsin * b(Z)); + + auto hr = m.query_ray_hit(p + sd*dir, dir); + + if(ins_check && hr.is_inside()) { + if(hr.distance() > 2*r) phi = 0; + else { + // re-cast the ray from the outside of the object + auto hr2 = + m.query_ray_hit(p + (hr.distance() + 2*sd)*dir, dir); + + phi = hr2.distance(); + } + } else phi = hr.distance(); + }); + + auto mit = std::min_element(phis.begin(), phis.end()); + + return *mit; + } + + // Helper function for interconnecting two pillars with zig-zag bridges. + // This is not an individual step. + void interconnect(const Pillar& pillar, const Pillar& nextpillar) + { + const Head& phead = m_result.pillar_head(pillar.id); + const Head& nextphead = m_result.pillar_head(nextpillar.id); + + Vec3d sj = phead.junction_point(); + sj(Z) = std::min(sj(Z), nextphead.junction_point()(Z)); + Vec3d ej = nextpillar.endpoint; + double pillar_dist = distance(Vec2d{sj(X), sj(Y)}, + Vec2d{ej(X), ej(Y)}); + double zstep = pillar_dist * std::tan(-m_cfg.bridge_slope); + ej(Z) = sj(Z) + zstep; + + double chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r); + + double bridge_distance = pillar_dist / std::cos(-m_cfg.bridge_slope); + + // If the pillars are so close that they touch each other, + // there is no need to bridge them together. + if(pillar_dist > 2*m_cfg.head_back_radius_mm && + bridge_distance < m_cfg.max_bridge_length_mm) + while(sj(Z) > pillar.endpoint(Z) + m_cfg.base_radius_mm && + ej(Z) > nextpillar.endpoint(Z) + m_cfg.base_radius_mm) + { + if(chkd >= bridge_distance) { + m_result.add_bridge(sj, ej, pillar.r); + + auto pcm = m_cfg.pillar_connection_mode; + + // double bridging: (crosses) + if( pcm == PillarConnectionMode::cross || + (pcm == PillarConnectionMode::dynamic && + pillar_dist > 2*m_cfg.base_radius_mm)) + { + // If the columns are close together, no need to + // double bridge them + Vec3d bsj(ej(X), ej(Y), sj(Z)); + Vec3d bej(sj(X), sj(Y), ej(Z)); + + // need to check collision for the cross stick + double backchkd = bridge_mesh_intersect( + bsj, dirv(bsj, bej), pillar.r); + + + if(backchkd >= bridge_distance) { + m_result.add_bridge(bsj, bej, pillar.r); + } + } + } + sj.swap(ej); + ej(Z) = sj(Z) + zstep; + chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r); + } + } + +public: + + Algorithm(const SupportConfig& config, + const EigenMesh3D& emesh, + const std::vector& support_pts, + Result& result, + ThrowOnCancel thr) : + m_cfg(config), + m_mesh(emesh), + m_support_pts(support_pts), + m_support_nmls(support_pts.size(), 3), + m_ptheights(support_pts.size(), 0.0), + m_result(result), + m_points(support_pts.size(), 3), + m_thr(thr) + { + // Prepare the support points in Eigen/IGL format as well, we will use + // it mostly in this form. + + long i = 0; + for(const SupportPoint& sp : m_support_pts) { + m_points.row(i)(X) = double(sp.pos(X)); + m_points.row(i)(Y) = double(sp.pos(Y)); + m_points.row(i)(Z) = double(sp.pos(Z)); + ++i; + } + } + + + // Now let's define the individual steps of the support generation algorithm // Filtering step: here we will discard inappropriate support points // and decide the future of the appropriate ones. We will check if a // pinhead is applicable and adjust its angle at each support point. We // will also merge the support points that are just too close and can // be considered as one. - auto filter_fn = [thr](const SupportConfig& cfg, - const PointSet& points, - const EigenMesh3D& mesh, - PointSet& support_normals, - PtIndices& head_indices, - PtIndices& headless_indices) - { + void filter() { // Get the points that are too close to each other and keep only the // first one - auto aliases = cluster(points, - [thr](const SpatElement& p, const SpatElement& se) - { - thr(); return distance(p.first, se.first) < D_SP; + auto aliases = cluster(m_points, + [this](const SpatElement& p, const SpatElement& se) { + m_thr(); + return distance(p.first, se.first) < D_SP; }, 2); PtIndices filtered_indices; filtered_indices.reserve(aliases.size()); - head_indices.reserve(aliases.size()); - headless_indices.reserve(aliases.size()); + m_iheads.reserve(aliases.size()); + m_iheadless.reserve(aliases.size()); for(auto& a : aliases) { // Here we keep only the front point of the cluster. filtered_indices.emplace_back(a.front()); } // calculate the normals to the triangles for filtered points - auto nmls = sla::normals(points, mesh, cfg.head_front_radius_mm, - thr, filtered_indices); + auto nmls = sla::normals(m_points, m_mesh, m_cfg.head_front_radius_mm, + m_thr, filtered_indices); // Not all of the support points have to be a valid position for // support creation. The angle may be inappropriate or there may @@ -1238,7 +1281,7 @@ bool SLASupportTree::generate(const std::vector &support_points, for(unsigned i = 0, fidx = filtered_indices[0]; i < filtered_indices.size(); ++i, fidx = filtered_indices[i]) { - thr(); + m_thr(); auto n = nmls.row(i); // for all normals we generate the spherical coordinates and @@ -1254,17 +1297,19 @@ bool SLASupportTree::generate(const std::vector &support_points, double azimuth = std::atan2(n(1), n(0)); // skip if the tilt is not sane - if(polar >= PI - cfg.normal_cutoff_angle) { + if(polar >= PI - m_cfg.normal_cutoff_angle) { // We saturate the polar angle to 3pi/4 polar = std::max(polar, 3*PI / 4); // save the head (pinpoint) position - Vec3d hp = points.row(i); + Vec3d hp = m_points.row(i); - double w = cfg.head_width_mm + - cfg.head_back_radius_mm + - 2*cfg.head_front_radius_mm; + double w = m_cfg.head_width_mm + + m_cfg.head_back_radius_mm + + 2*m_cfg.head_front_radius_mm; + + double pin_r = double(m_support_pts[fidx].head_front_radius); // Reassemble the now corrected normal auto nn = Vec3d(std::cos(azimuth) * std::sin(polar), @@ -1275,10 +1320,9 @@ bool SLASupportTree::generate(const std::vector &support_points, double t = pinhead_mesh_intersect( hp, // touching point nn, // normal - cfg.head_front_radius_mm, - cfg.head_back_radius_mm, - w, - mesh); + pin_r, + m_cfg.head_back_radius_mm, + w); if(t <= w) { @@ -1293,18 +1337,15 @@ bool SLASupportTree::generate(const std::vector &support_points, SimplexOptimizer solver(stc); auto oresult = solver.optimize_max( - [&mesh, &cfg, w, hp](double plr, double azm) + [this, pin_r, w, hp](double plr, double azm) { auto n = Vec3d(std::cos(azm) * std::sin(plr), std::sin(azm) * std::sin(plr), std::cos(plr)).normalized(); - double score = pinhead_mesh_intersect( - hp, n, - cfg.head_front_radius_mm, - cfg.head_back_radius_mm, - w, - mesh); + double score = pinhead_mesh_intersect( hp, n, pin_r, + m_cfg.head_back_radius_mm, + w); return score; }, initvals(polar, azimuth), // start with what we have @@ -1321,46 +1362,39 @@ bool SLASupportTree::generate(const std::vector &support_points, } // save the verified and corrected normal - support_normals.row(fidx) = nn; + m_support_nmls.row(fidx) = nn; if(t > w) { // mark the point for needing a head. - head_indices.emplace_back(fidx); + m_iheads.emplace_back(fidx); } else if( polar >= 3*PI/4 ) { // Headless supports do not tilt like the headed ones so // the normal should point almost to the ground. - headless_indices.emplace_back(fidx); + m_iheadless.emplace_back(fidx); } } } - thr(); - }; + m_thr(); + } // Pinhead creation: based on the filtering results, the Head objects // will be constructed (together with their triangle meshes). - auto pinheads_fn = [thr](const SupportConfig& cfg, - const std::vector support_points, - const PointSet& support_normals, - const PtIndices& head_indices, - Result& result) + void add_pinheads() { - /* ******************************************************** */ - /* Generating Pinheads */ - /* ******************************************************** */ - - for (unsigned i : head_indices) { - thr(); - result.add_head(i, - cfg.head_back_radius_mm, - support_points[i].head_front_radius, - cfg.head_width_mm, - cfg.head_penetration_mm, - support_normals.row(i), // dir - support_points[i].pos.cast() // displacement + for (unsigned i : m_iheads) { + m_thr(); + m_result.add_head( + i, + m_cfg.head_back_radius_mm, + m_support_pts[i].head_front_radius, + m_cfg.head_width_mm, + m_cfg.head_penetration_mm, + m_support_nmls.row(i), // dir + m_support_pts[i].pos.cast() // displacement ); } - }; + } // Further classification of the support points with pinheads. If the // ground is directly reachable through a vertical line parallel to the @@ -1370,148 +1404,75 @@ bool SLASupportTree::generate(const std::vector &support_points, // into clusters that can be interconnected with bridges. Elements of // these groups may or may not be interconnected. Here we only run the // clustering algorithm. - auto classify_fn = [thr](const SupportConfig& cfg, - const PointSet& points, - const EigenMesh3D& mesh, - const PtIndices& head_indices, - PtIndices& onmodel_head_indices, - std::vector& pt_heights, - std::vector& pillar_clusters, - Result& result) + void classify() { - /* ******************************************************** */ - /* Classification */ - /* ******************************************************** */ - // We should first get the heads that reach the ground directly - pt_heights.reserve(head_indices.size()); + m_ptheights.reserve(m_iheads.size()); PtIndices ground_head_indices; - ground_head_indices.reserve(head_indices.size()); - onmodel_head_indices.reserve(head_indices.size()); + ground_head_indices.reserve(m_iheads.size()); + m_iheads_onmodel.reserve(m_iheads.size()); // First we decide which heads reach the ground and can be full // pillars and which shall be connected to the model surface (or // search a suitable path around the surface that leads to the // ground -- TODO) - for(unsigned i : head_indices) { - thr(); + for(unsigned i : m_iheads) { + m_thr(); - auto& head = result.head(i); + auto& head = m_result.head(i); Vec3d n(0, 0, -1); double r = head.r_back_mm; Vec3d headjp = head.junction_point(); // collision check - double t = bridge_mesh_intersect(headjp, n, r, mesh); + double t = bridge_mesh_intersect(headjp, n, r); // Precise distance measurement - double tprec = ray_mesh_intersect(headjp, n, mesh); + double tprec = ray_mesh_intersect(headjp, n); // Save the distance from a surface in the Z axis downwards. It // may be infinity but that is telling us that it touches the // ground. - pt_heights.emplace_back(tprec); + m_ptheights.emplace_back(tprec); if(std::isinf(t)) ground_head_indices.emplace_back(i); - else onmodel_head_indices.emplace_back(i); + else m_iheads_onmodel.emplace_back(i); } // We want to search for clusters of points that are far enough // from each other in the XY plane to not cross their pillar bases // These clusters of support points will join in one pillar, // possibly in their centroid support point. - auto d_base = 2*cfg.base_radius_mm; - pillar_clusters = cluster(points, + auto d_base = 2*m_cfg.base_radius_mm; + auto& thr = m_thr; + m_pillar_clusters = cluster(m_points, [thr, d_base](const SpatElement& p, const SpatElement& s) { thr(); return distance(Vec2d(p.first(X), p.first(Y)), Vec2d(s.first(X), s.first(Y))) < d_base; }, 3, ground_head_indices); // max 3 heads to connect to one pillar - }; - - // Helper function for interconnecting two pillars with zig-zag bridges. - // This is not an individual step. - auto interconnect = [&cfg](const Pillar& pillar, - const Pillar& nextpillar, - const EigenMesh3D& m, - Result& result) - { - const Head& phead = result.pillar_head(pillar.id); - const Head& nextphead = result.pillar_head(nextpillar.id); - - Vec3d sj = phead.junction_point(); - sj(Z) = std::min(sj(Z), nextphead.junction_point()(Z)); - Vec3d ej = nextpillar.endpoint; - double pillar_dist = distance(Vec2d{sj(X), sj(Y)}, - Vec2d{ej(X), ej(Y)}); - double zstep = pillar_dist * std::tan(-cfg.head_slope); - ej(Z) = sj(Z) + zstep; - - double chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r, m); - double bridge_distance = pillar_dist / std::cos(-cfg.head_slope); - - // If the pillars are so close that they touch each other, - // there is no need to bridge them together. - if(pillar_dist > 2*cfg.head_back_radius_mm && - bridge_distance < cfg.max_bridge_length_mm) - while(sj(Z) > pillar.endpoint(Z) + cfg.base_radius_mm && - ej(Z) > nextpillar.endpoint(Z) + cfg.base_radius_mm) - { - if(chkd >= bridge_distance) { - result.add_bridge(sj, ej, pillar.r); - - auto pcm = cfg.pillar_connection_mode; - - // double bridging: (crosses) - if( pcm == PillarConnectionMode::cross || - (pcm == PillarConnectionMode::dynamic && - pillar_dist > 2*cfg.base_radius_mm)) - { - // If the columns are close together, no need to - // double bridge them - Vec3d bsj(ej(X), ej(Y), sj(Z)); - Vec3d bej(sj(X), sj(Y), ej(Z)); - - // need to check collision for the cross stick - double backchkd = bridge_mesh_intersect(bsj, - dirv(bsj, bej), - pillar.r, m); - - - if(backchkd >= bridge_distance) { - result.add_bridge(bsj, bej, pillar.r); - } - } - } - sj.swap(ej); - ej(Z) = sj(Z) + zstep; - chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r, m); - } - }; + } // Step: Routing the ground connected pinheads, and interconnecting // them with additional (angled) bridges. Not all of these pinheads // will be a full pillar (ground connected). Some will connect to a // nearby pillar using a bridge. The max number of such side-heads for // a central pillar is limited to avoid bad weight distribution. - auto routing_ground_fn = - [thr, interconnect](const SupportConfig& cfg, - const PointSet& points, - const std::vector& pillar_clusters, - const EigenMesh3D& emesh, - Result& result) + void routing_to_ground() { - const double hbr = cfg.head_back_radius_mm; - const double pradius = cfg.head_back_radius_mm; - const double maxbridgelen = cfg.max_bridge_length_mm; - const double gndlvl = result.ground_level; + const double hbr = m_cfg.head_back_radius_mm; + const double pradius = m_cfg.head_back_radius_mm; + const double maxbridgelen = m_cfg.max_bridge_length_mm; + const double gndlvl = m_result.ground_level; + + ClusterEl cl_centroids; - cl_centroids.reserve(pillar_clusters.size()); + cl_centroids.reserve(m_pillar_clusters.size()); SpatIndex pheadindex; // spatial index for the junctions - for(auto& cl : pillar_clusters) { thr(); + for(auto& cl : m_pillar_clusters) { m_thr(); // place all the centroid head positions into the index. We // will query for alternative pillar positions. If a sidehead // cannot connect to the cluster centroid, we have to search @@ -1523,6 +1484,7 @@ bool SLASupportTree::generate(const std::vector &support_points, if(cl.empty()) continue; // get the current cluster centroid + auto& thr = m_thr; const auto& points = m_points; long lcid = cluster_centroid(cl, [&points](size_t idx) { return points.row(long(idx)); }, [thr](const Vec3d& p1, const Vec3d& p2) @@ -1538,7 +1500,7 @@ bool SLASupportTree::generate(const std::vector &support_points, unsigned hid = cl[cid]; // Head ID - Head& h = result.head(hid); + Head& h = m_result.head(hid); h.transform(); Vec3d p = h.junction_point(); p(Z) = gndlvl; pheadindex.insert(p, hid); @@ -1548,20 +1510,20 @@ bool SLASupportTree::generate(const std::vector &support_points, // sidepoints with the cluster centroid (which is a ground pillar) // or a nearby pillar if the centroid is unreachable. size_t ci = 0; - for(auto cl : pillar_clusters) { thr(); + for(auto cl : m_pillar_clusters) { m_thr(); auto cidx = cl_centroids[ci]; cl_centroids[ci++] = cl[cidx]; - auto& head = result.head(cl[cidx]); + auto& head = m_result.head(cl[cidx]); Vec3d startpoint = head.junction_point(); auto endpoint = startpoint; endpoint(Z) = gndlvl; // Create the central pillar of the cluster with its base on the // ground - result.add_pillar(unsigned(head.id), endpoint, pradius) - .add_base(cfg.base_height_mm, cfg.base_radius_mm); + m_result.add_pillar(unsigned(head.id), endpoint, pradius) + .add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); // Process side point in current cluster cl.erase(cl.begin() + cidx); // delete the centroid @@ -1570,12 +1532,12 @@ bool SLASupportTree::generate(const std::vector &support_points, // central position where the pillar can be placed. this way // the weight is distributed more effectively on the pillar. auto search_nearest = - [thr, &cfg, &result, &emesh, maxbridgelen, gndlvl, pradius] + [this, maxbridgelen, gndlvl, pradius] (SpatIndex& spindex, const Vec3d& jsh) { long nearest_id = -1; const double max_len = maxbridgelen / 2; - while(nearest_id < 0 && !spindex.empty()) { thr(); + while(nearest_id < 0 && !spindex.empty()) { m_thr(); // loop until a suitable head is not found // if there is a pillar closer than the cluster center // (this may happen as the clustering is not perfect) @@ -1583,7 +1545,7 @@ bool SLASupportTree::generate(const std::vector &support_points, Vec3d qp(jsh(X), jsh(Y), gndlvl); auto ne = spindex.nearest(qp, 1).front(); - const Head& nearhead = result.head(ne.second); + const Head& nearhead = m_result.head(ne.second); Vec3d jh = nearhead.junction_point(); Vec3d jp = jsh; @@ -1591,7 +1553,7 @@ bool SLASupportTree::generate(const std::vector &support_points, // Bridge endpoint on the main pillar Vec3d jn(jh(X), jh(Y), jp(Z) + - dist2d * std::tan(-cfg.head_slope)); + dist2d * std::tan(-m_cfg.bridge_slope)); if(jn(Z) > jh(Z)) { // If the sidepoint cannot connect to the pillar @@ -1602,12 +1564,12 @@ bool SLASupportTree::generate(const std::vector &support_points, double d = distance(jp, jn); - if(jn(Z) <= gndlvl + 2*cfg.head_width_mm || d > max_len) + if(jn(Z) <= gndlvl + 2*m_cfg.head_width_mm || d > max_len) break; double chkd = bridge_mesh_intersect(jp, dirv(jp, jn), - pradius, - emesh); + pradius); + if(chkd >= d) nearest_id = ne.second; spindex.remove(ne); @@ -1615,8 +1577,8 @@ bool SLASupportTree::generate(const std::vector &support_points, return nearest_id; }; - for(auto c : cl) { thr(); - auto& sidehead = result.head(c); + for(auto c : cl) { m_thr(); + auto& sidehead = m_result.head(c); sidehead.transform(); Vec3d jsh = sidehead.junction_point(); @@ -1628,8 +1590,8 @@ bool SLASupportTree::generate(const std::vector &support_points, if(nearest_id < 0) { // Could not find a pillar, create one Vec3d jp = jsh; jp(Z) = gndlvl; - result.add_pillar(unsigned(sidehead.id), jp, pradius). - add_base(cfg.base_height_mm, cfg.base_radius_mm); + m_result.add_pillar(unsigned(sidehead.id), jp, pradius). + add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); // connects to ground, eligible for bridging cl_centroids.emplace_back(c); @@ -1637,14 +1599,14 @@ bool SLASupportTree::generate(const std::vector &support_points, // Creating the bridge to the nearest pillar auto nearest_uid = unsigned(nearest_id); - const Head& nearhead = result.head(nearest_uid); + const Head& nearhead = m_result.head(nearest_uid); Vec3d jp = jsh; Vec3d jh = nearhead.junction_point(); double d = distance(Vec2d{jp(X), jp(Y)}, Vec2d{jh(X), jh(Y)}); Vec3d jn(jh(X), jh(Y), jp(Z) + - d * std::tan(-cfg.head_slope)); + d * std::tan(-m_cfg.bridge_slope)); if(jn(Z) > jh(Z)) { double hdiff = jn(Z) - jh(Z); @@ -1652,14 +1614,14 @@ bool SLASupportTree::generate(const std::vector &support_points, jn(Z) -= hdiff; // pillar without base, doesn't connect to ground. - result.add_pillar(nearest_uid, jp, pradius); + m_result.add_pillar(nearest_uid, jp, pradius); } - if(jp(Z) < jsh(Z)) result.add_junction(jp, hbr); - if(jn(Z) >= jh(Z)) result.add_junction(jn, hbr); + if(jp(Z) < jsh(Z)) m_result.add_junction(jp, hbr); + if(jn(Z) >= jh(Z)) m_result.add_junction(jn, hbr); - result.add_bridge(jp, jn, - sidehead.request_pillar_radius(pradius)); + m_result.add_bridge(jp, jn, + sidehead.request_pillar_radius(pradius)); } } } @@ -1684,9 +1646,10 @@ bool SLASupportTree::generate(const std::vector &support_points, ClusterEl ring; while(!rem.empty()) { // loop until all the points belong to some ring - thr(); + m_thr(); std::sort(rem.begin(), rem.end()); + auto& points = m_points; auto newring = pts_convex_hull(rem, [&points](unsigned i) { auto&& p = points.row(i); @@ -1696,8 +1659,8 @@ bool SLASupportTree::generate(const std::vector &support_points, if(!ring.empty()) { // inner ring is now in 'newring' and outer ring is in 'ring' SpatIndex innerring; - for(unsigned i : newring) { thr(); - const Pillar& pill = result.head_pillar(i); + for(unsigned i : newring) { m_thr(); + const Pillar& pill = m_result.head_pillar(i); assert(pill.id >= 0); innerring.insert(pill.endpoint, unsigned(pill.id)); } @@ -1705,14 +1668,14 @@ bool SLASupportTree::generate(const std::vector &support_points, // For all pillars in the outer ring find the closest in the // inner ring and connect them. This will create the spider web // fashioned connections between pillars - for(unsigned i : ring) { thr(); - const Pillar& outerpill = result.head_pillar(i); + for(unsigned i : ring) { m_thr(); + const Pillar& outerpill = m_result.head_pillar(i); auto res = innerring.nearest(outerpill.endpoint, 1); if(res.empty()) continue; auto ne = res.front(); - const Pillar& innerpill = result.pillars()[ne.second]; - interconnect(outerpill, innerpill, emesh, result); + const Pillar& innerpill = m_result.pillars()[ne.second]; + interconnect(outerpill, innerpill); } } @@ -1731,10 +1694,10 @@ bool SLASupportTree::generate(const std::vector &support_points, next != ring.end(); ++it, ++next) { - thr(); - const Pillar& pillar = result.head_pillar(*it); - const Pillar& nextpillar = result.head_pillar(*next); - interconnect(pillar, nextpillar, emesh, result); + m_thr(); + const Pillar& pillar = m_result.head_pillar(*it); + const Pillar& nextpillar = m_result.head_pillar(*next); + interconnect(pillar, nextpillar); } auto sring = ring; ClusterEl tmp; @@ -1744,27 +1707,21 @@ bool SLASupportTree::generate(const std::vector &support_points, std::back_inserter(tmp)); rem.swap(tmp); } - - }; + } // Step: routing the pinheads that would connect to the model surface // along the Z axis downwards. For now these will actually be connected with // the model surface with a flipped pinhead. In the future here we could use // some smart algorithms to search for a safe path to the ground or to a // nearby pillar that can hold the supported weight. - auto routing_nongnd_fn = [thr]( - const SupportConfig& cfg, - const std::vector& pt_heights, - const PtIndices& nonground_head_indices, - const EigenMesh3D& mesh, - Result& result) + void routing_to_model() { // TODO: connect these to the ground pillars if possible - for(auto idx : nonground_head_indices) { thr(); - double gh = pt_heights[idx]; - double base_width = cfg.head_width_mm; + for(auto idx : m_iheads_onmodel) { m_thr(); + double gh = m_ptheights[idx]; + double base_width = m_cfg.head_width_mm; - auto& head = result.head(idx); + auto& head = m_result.head(idx); if(std::isinf(gh)) { // in this case the the pillar geometry head.invalidate(); continue; @@ -1822,8 +1779,9 @@ bool SLASupportTree::generate(const std::vector &support_points, // In this case there is no room for the base pinhead. if(gh < head.fullwidth()) { double min_l = - 2 * cfg.head_front_radius_mm + - 2 * cfg.head_back_radius_mm - cfg.head_penetration_mm; + 2 * m_cfg.head_front_radius_mm + + 2 * m_cfg.head_back_radius_mm - + m_cfg.head_penetration_mm; base_width = gh - min_l; } @@ -1840,10 +1798,10 @@ bool SLASupportTree::generate(const std::vector &support_points, Vec3d headend = head.junction_point(); - Head base_head(cfg.head_back_radius_mm, - cfg.head_front_radius_mm, + Head base_head(m_cfg.head_back_radius_mm, + m_cfg.head_front_radius_mm, base_width, - cfg.head_penetration_mm, + m_cfg.head_penetration_mm, {0.0, 0.0, 1.0}, {headend(X), headend(Y), headend(Z) - gh}); @@ -1860,44 +1818,39 @@ bool SLASupportTree::generate(const std::vector &support_points, double hl = base_head.fullwidth() - head.r_back_mm; - result.add_pillar(idx, + m_result.add_pillar(idx, Vec3d{headend(X), headend(Y), headend(Z) - gh + hl}, - cfg.head_back_radius_mm + m_cfg.head_back_radius_mm ).base = base_head.mesh; } - }; + } // Step: process the support points where there is not enough space for a // full pinhead. In this case we will use a rounded sphere as a touching // point and use a thinner bridge (let's call it a stick). - auto process_headless_fn = [thr]( - const std::vector& support_points, - const PointSet& support_normals, - const PtIndices& headless_indices, - const EigenMesh3D& emesh, - Result& result) + void routing_headless () { // For now we will just generate smaller headless sticks with a sharp // ending point that connects to the mesh surface. - // We will sink the pins into the model surface for a distance of 1/3 of // the pin radius - for(unsigned i : headless_indices) { thr(); + for(unsigned i : m_iheadless) { m_thr(); - const auto R = double(support_points[i].head_front_radius); + const auto R = double(m_support_pts[i].head_front_radius); const double HWIDTH_MM = R/3; - Vec3d sph = support_points[i].pos.cast(); // Exact support position - Vec3d n = support_normals.row(i); // mesh outward normal + // Exact support position + Vec3d sph = m_support_pts[i].pos.cast(); + Vec3d n = m_support_nmls.row(i); // mesh outward normal Vec3d sp = sph - n * HWIDTH_MM; // stick head start point Vec3d dir = {0, 0, -1}; Vec3d sj = sp + R * n; // stick start point // This is only for checking - double idist = bridge_mesh_intersect(sph, dir, R, emesh, true); - double dist = ray_mesh_intersect(sj, dir, emesh); + double idist = bridge_mesh_intersect(sph, dir, R, true); + double dist = ray_mesh_intersect(sj, dir); if(std::isinf(idist) || std::isnan(idist) || idist < 2*R || std::isinf(dist) || std::isnan(dist) || dist < 2*R) { @@ -1908,68 +1861,53 @@ bool SLASupportTree::generate(const std::vector &support_points, } Vec3d ej = sj + (dist + HWIDTH_MM)* dir; - result.add_compact_bridge(sp, ej, n, R); + m_result.add_compact_bridge(sp, ej, n, R); } + } +}; + +bool SLASupportTree::generate(const std::vector &support_points, + const EigenMesh3D& mesh, + const SupportConfig &cfg, + const Controller &ctl) +{ + Algorithm alg(cfg, mesh, support_points, *m_impl, ctl.cancelfn); + + // Let's define the individual steps of the processing. We can experiment + // later with the ordering and the dependencies between them. + enum Steps { + BEGIN, + FILTER, + PINHEADS, + CLASSIFY, + ROUTING_GROUND, + ROUTING_NONGROUND, + HEADLESS, + DONE, + HALT, + ABORT, + NUM_STEPS + //... }; - // Now that the individual blocks are defined, lets connect the wires. We - // will create an array of functions which represents a program. Place the - // step methods in the array and bind the right arguments to the methods - // This way the data dependencies will be easily traceable between - // individual steps. - // There will be empty steps as well like the begin step or the done or - // abort steps. These are slots for future initialization or cleanup. - - using std::cref; // Bind inputs with cref (read-only) - using std::ref; // Bind outputs with ref (writable) - using std::bind; - - // Here we can easily track what goes in and what comes out of each step: - // (see the cref-s as inputs and ref-s as outputs) + // Collect the algorithm steps into a nice sequence std::array, NUM_STEPS> program = { [] () { // Begin... // Potentially clear up the shared data (not needed for now) }, - bind(filter_fn, - // inputs: - cref(cfg), cref(points), cref(mesh), - // outputs: - ref(support_normals), ref(head_indices), ref(headless_indices)), + std::bind(&Algorithm::filter, &alg), - bind(pinheads_fn, - // inputs: - cref(cfg), cref(support_points), cref(support_normals), - cref(head_indices), - // outputs: - ref(result)), + std::bind(&Algorithm::add_pinheads, &alg), - bind(classify_fn, - // inputs: - cref(cfg), cref(points), cref(mesh), cref(head_indices), - // outputs: - ref(onmodel_head_indices), ref(pt_heights), ref(pillar_clusters), - ref(result)), + std::bind(&Algorithm::classify, &alg), - bind(routing_ground_fn, - // inputs: - cref(cfg), cref(points), cref(pillar_clusters), cref(mesh), - // outputs: - ref(result)), + std::bind(&Algorithm::routing_to_ground, &alg), - bind(routing_nongnd_fn, - // inputs: - cref(cfg), cref(pt_heights), cref(onmodel_head_indices), cref(mesh), - // outputs: - ref(result)), + std::bind(&Algorithm::routing_to_model, &alg), - bind(process_headless_fn, - // inputs: - cref(support_points), cref(support_normals), - cref(headless_indices), cref(mesh), - // outputs: - ref(result)), + std::bind(&Algorithm::routing_headless, &alg), [] () { // Done @@ -1984,19 +1922,19 @@ bool SLASupportTree::generate(const std::vector &support_points, } }; - if(cfg.ground_facing_only) { // Delete the non-gnd steps if necessary + Steps pc = BEGIN, pc_prev = BEGIN; + + if(cfg.ground_facing_only) { program[ROUTING_NONGROUND] = []() { - BOOST_LOG_TRIVIAL(info) << "Skipping non-ground facing supports as " - "requested."; + BOOST_LOG_TRIVIAL(info) + << "Skipping model-facing supports as requested."; }; - program[HEADLESS] = [](){ - BOOST_LOG_TRIVIAL(info) << "Skipping headless stick generation as " - "requested"; + program[HEADLESS] = []() { + BOOST_LOG_TRIVIAL(info) << "Skipping headless stick generation as" + " requested."; }; } - Steps pc = BEGIN, pc_prev = BEGIN; - // Let's define a simple automaton that will run our program. auto progress = [&ctl, &pc, &pc_prev] () { static const std::array stepstr { diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index d96951912..e1d5449a9 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -50,11 +50,6 @@ struct SupportConfig { // Width in mm from the back sphere center to the front sphere center. double head_width_mm = 1.0; - // Radius in mm of the support pillars. The actual radius of the pillars - // beginning with a head will not be higher than head_back_radius but the - // headless pillars will have half of this value. - double headless_pillar_radius_mm = 0.4; - // How to connect pillars PillarConnectionMode pillar_connection_mode = PillarConnectionMode::dynamic; @@ -74,7 +69,7 @@ struct SupportConfig { double base_height_mm = 1.0; // The default angle for connecting support sticks and junctions. - double head_slope = M_PI/4; + double bridge_slope = M_PI/4; // The max length of a bridge in mm double max_bridge_length_mm = 15.0; @@ -86,6 +81,8 @@ struct SupportConfig { // The max Z angle for a normal at which it will get completely ignored. double normal_cutoff_angle = 150.0 * M_PI / 180.0; + // The shortest distance of any support structure from the model surface + double safety_distance_mm = 0.001; }; struct PoolConfig; @@ -123,7 +120,7 @@ using PointSet = Eigen::MatrixXd; /// The class containing mesh data for the generated supports. class SLASupportTree { - class Impl; + class Impl; // persistent support data std::unique_ptr m_impl; Impl& get() { return *m_impl; } @@ -133,16 +130,20 @@ class SLASupportTree { const SupportConfig&, const Controller&); - /// Generate the 3D supports for a model intended for SLA print. + // The generation algorithm is quite long and will be captured in a separate + // class with private data, helper methods, etc... This data is only needed + // during the calculation whereas the Impl class contains the persistent + // data, mostly the meshes. + class Algorithm; + + // Generate the 3D supports for a model intended for SLA print. This + // will instantiate the Algorithm class and call its appropriate methods + // with status indication. bool generate(const std::vector& pts, const EigenMesh3D& mesh, const SupportConfig& cfg = {}, const Controller& ctl = {}); - bool _generate(const std::vector& pts, - const EigenMesh3D& mesh, - const SupportConfig& cfg = {}, - const Controller& ctl = {}); public: SLASupportTree(); diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 4efff03da..4358d8b94 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -521,9 +521,8 @@ sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c) { scfg.head_penetration_mm = c.support_head_penetration.getFloat(); scfg.head_width_mm = c.support_head_width.getFloat(); scfg.object_elevation_mm = c.support_object_elevation.getFloat(); - scfg.head_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; + scfg.bridge_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); - scfg.headless_pillar_radius_mm = 0.375*c.support_pillar_diameter.getFloat(); switch(c.support_pillar_connection_mode.getInt()) { case slapcmZigZag: scfg.pillar_connection_mode = sla::PillarConnectionMode::zigzag; break; From e5a2c0a8c8d8f24f3f96e28ce2725701e81563a8 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 28 Feb 2019 12:21:36 +0100 Subject: [PATCH 012/236] ENABLE_MODE_AWARE_TOOLBAR_ITEMS set as default --- src/libslic3r/Technologies.hpp | 8 -------- src/slic3r/GUI/GLCanvas3D.cpp | 4 ---- src/slic3r/GUI/GLCanvas3D.hpp | 2 -- src/slic3r/GUI/GLToolbar.cpp | 20 -------------------- src/slic3r/GUI/GLToolbar.hpp | 6 ------ src/slic3r/GUI/GUI_Preview.cpp | 2 -- src/slic3r/GUI/GUI_Preview.hpp | 2 -- src/slic3r/GUI/Plater.cpp | 2 -- 8 files changed, 46 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 9ca3daadb..451a0b27c 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -42,14 +42,6 @@ #define ENABLE_VOLUMES_CENTERING_FIXES (1 && ENABLE_1_42_0_ALPHA4) -//==================== -// 1.42.0.alpha5 techs -//==================== -#define ENABLE_1_42_0_ALPHA5 1 - -// Toolbar items hidden/shown in dependence of the user mode -#define ENABLE_MODE_AWARE_TOOLBAR_ITEMS (1 && ENABLE_1_42_0_ALPHA5) - //==================== // 1.42.0.alpha7 techs //==================== diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d26a06a61..ae3e4dc70 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4135,7 +4135,6 @@ void GLCanvas3D::update_volumes_colors_by_extruder() m_volumes.update_colors_by_extruder(m_config); } -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS void GLCanvas3D::update_toolbar_items_visibility() { ConfigOptionMode mode = wxGetApp().get_mode(); @@ -4144,7 +4143,6 @@ void GLCanvas3D::update_toolbar_items_visibility() m_toolbar.set_item_visible("splitvolumes", mode != comSimple); m_dirty = true; } -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS // Returns a Rect object denoting size and position of the Reset button used by a gizmo. // Returns in either screen or viewport coords. @@ -6056,9 +6054,7 @@ bool GLCanvas3D::_init_toolbar() enable_toolbar_item("add", true); -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS update_toolbar_items_visibility(); -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS return true; } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 096789d4a..1659236c2 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -953,9 +953,7 @@ public: void update_volumes_colors_by_extruder(); -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS void update_toolbar_items_visibility(); -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS #if !ENABLE_IMGUI Rect get_gizmo_reset_rect(const GLCanvas3D& canvas, bool viewport) const; diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 144662c3f..1b8ccc165 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -38,9 +38,7 @@ GLToolbarItem::Data::Data() , tooltip("") , sprite_id(-1) , is_toggable(false) -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS , visible(true) -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS { } @@ -362,7 +360,6 @@ bool GLToolbar::is_item_disabled(const std::string& name) const return false; } -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS bool GLToolbar::is_item_visible(const std::string& name) const { for (GLToolbarItem* item : m_items) @@ -400,7 +397,6 @@ void GLToolbar::set_item_visible(const std::string& name, bool visible) } } -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) { @@ -547,10 +543,8 @@ float GLToolbar::get_main_size() const float size = 2.0f * m_layout.border; for (unsigned int i = 0; i < (unsigned int)m_items.size(); ++i) { -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (!m_items[i]->is_visible()) continue; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (m_items[i]->is_separator()) size += m_layout.separator_size; @@ -566,10 +560,8 @@ float GLToolbar::get_main_size() const float size = 2.0f * m_layout.border * m_layout.icons_scale; for (unsigned int i = 0; i < (unsigned int)m_items.size(); ++i) { -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (!m_items[i]->is_visible()) continue; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (m_items[i]->is_separator()) size += m_layout.separator_size * m_layout.icons_scale; @@ -618,10 +610,8 @@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLC for (GLToolbarItem* item : m_items) { -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (!item->is_visible()) continue; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (item->is_separator()) left += separator_stride; @@ -724,10 +714,8 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan for (GLToolbarItem* item : m_items) { -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (!item->is_visible()) continue; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (item->is_separator()) top -= separator_stride; @@ -832,10 +820,8 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 { ++id; -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (!item->is_visible()) continue; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (item->is_separator()) left += separator_stride; @@ -890,10 +876,8 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& { ++id; -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (!item->is_visible()) continue; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (item->is_separator()) top -= separator_stride; @@ -1050,10 +1034,8 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const // renders icons for (const GLToolbarItem* item : m_items) { -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (!item->is_visible()) continue; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (item->is_separator()) left += separator_stride; @@ -1207,10 +1189,8 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const // renders icons for (const GLToolbarItem* item : m_items) { -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (!item->is_visible()) continue; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (item->is_separator()) top -= separator_stride; diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index e14f7b3bb..4ca72fc4a 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -58,9 +58,7 @@ public: unsigned int sprite_id; bool is_toggable; wxEventType action_event; -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS bool visible; -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS Data(); }; @@ -90,10 +88,8 @@ public: bool is_pressed() const { return (m_state == Pressed) || (m_state == HoverPressed); } bool is_toggable() const { return m_data.is_toggable; } -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS bool is_visible() const { return m_data.visible; } void set_visible(bool visible) { m_data.visible = visible; } -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS bool is_separator() const { return m_type == Separator; } void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; @@ -263,10 +259,8 @@ public: bool is_item_pressed(const std::string& name) const; bool is_item_disabled(const std::string& name) const; -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS bool is_item_visible(const std::string& name) const; void set_item_visible(const std::string& name, bool visible); -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 549dbd7e6..dff03b51a 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -137,13 +137,11 @@ void View3D::mirror_selection(Axis axis) m_canvas->mirror_selection(axis); } -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS void View3D::update_toolbar_items_visibility() { if (m_canvas != nullptr) m_canvas->update_toolbar_items_visibility(); } -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS void View3D::enable_toolbar_item(const std::string& name, bool enable) { diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 6cd67013c..e4c3fb60d 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -60,9 +60,7 @@ public: void delete_selected(); void mirror_selection(Axis axis); -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS void update_toolbar_items_visibility(); -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS void enable_toolbar_item(const std::string& name, bool enable); int check_volumes_outside_state() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 24d366ced..bc2917fd0 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2763,10 +2763,8 @@ void Plater::priv::set_bed_shape(const Pointfs& shape) void Plater::priv::update_object_menu() { sidebar->obj_list()->append_menu_items_add_volume(&object_menu); -#if ENABLE_MODE_AWARE_TOOLBAR_ITEMS if (view3D != nullptr) view3D->update_toolbar_items_visibility(); -#endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS } // Plater / Public From 450f817c09b0da65657b12c8bc3be275d6bd0ba3 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 28 Feb 2019 19:05:11 +0100 Subject: [PATCH 013/236] Replacing old model routing with more advanced algorithm. Interconnection still missing. --- src/libslic3r/SLA/SLACommon.hpp | 22 +- src/libslic3r/SLA/SLASupportTree.cpp | 594 ++++++++++++++---------- src/libslic3r/SLA/SLASupportTreeIGL.cpp | 13 +- 3 files changed, 374 insertions(+), 255 deletions(-) diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp index b917db0d0..4fdb32378 100644 --- a/src/libslic3r/SLA/SLACommon.hpp +++ b/src/libslic3r/SLA/SLACommon.hpp @@ -70,24 +70,32 @@ public: // Result of a raycast class hit_result { - double m_t = std::numeric_limits::infinity(); + double m_t = std::nan(""); int m_face_id = -1; - const EigenMesh3D& m_mesh; + std::reference_wrapper m_mesh; Vec3d m_dir; - inline hit_result(const EigenMesh3D& em): m_mesh(em) {} + Vec3d m_source; friend class EigenMesh3D; public: + // A valid object of this class can only be obtained from + // EigenMesh3D::query_ray_hit method. + explicit inline hit_result(const EigenMesh3D& em): m_mesh(em) {} + inline double distance() const { return m_t; } inline const Vec3d& direction() const { return m_dir; } + inline Vec3d position() const { return m_source + m_dir * m_t; } inline int face() const { return m_face_id; } + // Hit_result can decay into a double as the hit distance. + inline operator double() const { return distance(); } + inline Vec3d normal() const { if(m_face_id < 0) return {}; - auto trindex = m_mesh.m_F.row(m_face_id); - const Vec3d& p1 = m_mesh.V().row(trindex(0)); - const Vec3d& p2 = m_mesh.V().row(trindex(1)); - const Vec3d& p3 = m_mesh.V().row(trindex(2)); + auto trindex = m_mesh.get().m_F.row(m_face_id); + const Vec3d& p1 = m_mesh.get().V().row(trindex(0)); + const Vec3d& p2 = m_mesh.get().V().row(trindex(1)); + const Vec3d& p3 = m_mesh.get().V().row(trindex(2)); Eigen::Vector3d U = p2 - p1; Eigen::Vector3d V = p3 - p1; return U.cross(V).normalized(); diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 49ece2f1f..0a157fe3a 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -15,6 +15,11 @@ #include #include #include +#include + +//! macro used to mark string used at localization, +//! return same string +#define L(s) Slic3r::I18N::translate(s) /** * Terminology: @@ -335,6 +340,11 @@ struct Head { return 2 * r_pin_mm + width_mm + 2*r_back_mm - penetration_mm; } + static double fullwidth(const SupportConfig& cfg) { + return 2 * cfg.head_front_radius_mm + cfg.head_width_mm + + 2 * cfg.head_back_radius_mm - cfg.head_penetration_mm; + } + Vec3d junction_point() const { return tr + ( 2 * r_pin_mm + width_mm + r_back_mm - penetration_mm)*dir; } @@ -381,13 +391,14 @@ struct Pillar { assert(steps > 0); double h = jp(Z) - endp(Z); - assert(h > 0); // Endpoint is below the starting point + if(h > 0) { // Endpoint is below the starting point - // We just create a bridge geometry with the pillar parameters and - // move the data. - Contour3D body = cylinder(radius, h, st, endp); - mesh.points.swap(body.points); - mesh.indices.swap(body.indices); + // We just create a bridge geometry with the pillar parameters and + // move the data. + Contour3D body = cylinder(radius, h, st, endp); + mesh.points.swap(body.points); + mesh.indices.swap(body.indices); + } } Pillar(const Junction& junc, const Vec3d& endp): @@ -569,9 +580,20 @@ bool operator==(const SpatElement& e1, const SpatElement& e2) { // Clustering a set of points by the given criteria. ClusteredPoints cluster( + const PointSet& points, const std::vector& indices, + std::function pred, + unsigned max_points = 0); + +inline ClusteredPoints cluster( const PointSet& points, std::function pred, - unsigned max_points = 0, const std::vector& indices = {}); + unsigned max_points = 0) +{ + std::vector indices(size_t(points.rows()), 0); + std::iota(indices.begin(), indices.end(), 0); + return cluster(points, indices, pred, max_points); +} + // This class will hold the support tree meshes with some additional bookkeeping // as well. Various parts of the support geometry are stored separately and are @@ -628,8 +650,20 @@ public: return m_pillars.back(); } + template Pillar& add_pillar(const Vec3d& startp, + const Vec3d& endp, + double r) + { + m_pillars.emplace_back(startp, endp, r); + Pillar& pillar = m_pillars.back(); + pillar.id = long(m_pillars.size() - 1); + pillar.starts_from_head = false; + meshcache_valid = false; + return m_pillars.back(); + } + const Head& pillar_head(long pillar_id) const { - assert(pillar_id >= 0 && pillar_id < m_pillars.size()); + assert(pillar_id >= 0 && pillar_id < long(m_pillars.size())); const Pillar& p = m_pillars[size_t(pillar_id)]; assert(p.starts_from_head && p.start_junction_id >= 0); auto it = m_heads.find(unsigned(p.start_junction_id)); @@ -641,7 +675,7 @@ public: auto it = m_heads.find(headid); assert(it != m_heads.end()); const Head& h = it->second; - assert(h.pillar_id >= 0 && h.pillar_id < m_pillars.size()); + assert(h.pillar_id >= 0 && h.pillar_id < long(m_pillars.size())); return m_pillars[size_t(h.pillar_id)]; } @@ -938,15 +972,13 @@ class SLASupportTree::Algorithm { PtIndices m_iheads; // support points with pinhead PtIndices m_iheadless; // headless support points - PtIndices m_iheads_onmodel; // supp. pts. connecting to model + + // supp. pts. connecting to model: point index and the ray hit data + std::vector> m_iheads_onmodel; // normals for support points from model faces. PointSet m_support_nmls; - // Captures the height of the processed support points from the ground - // or the model surface - std::vector m_ptheights; - // Clusters of points which can reach the ground directly and can be // bridged to one central pillar std::vector m_pillar_clusters; @@ -964,6 +996,9 @@ class SLASupportTree::Algorithm { // come in handy. ThrowOnCancel m_thr; + // A spatial index to easily find strong pillars to connect to. + SpatIndex m_pillar_index; + inline double ray_mesh_intersect(const Vec3d& s, const Vec3d& dir) { @@ -982,12 +1017,13 @@ class SLASupportTree::Algorithm { // samples: how many rays will be shot // safety distance: This will be added to the radiuses to have a safety // distance from the mesh. - double pinhead_mesh_intersect(const Vec3d& s, - const Vec3d& dir, - double r_pin, - double r_back, - double width, - unsigned samples = 8) + EigenMesh3D::hit_result pinhead_mesh_intersect( + const Vec3d& s, + const Vec3d& dir, + double r_pin, + double r_back, + double width, + unsigned samples = 8) { // method based on: // https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space @@ -1012,6 +1048,12 @@ class SLASupportTree::Algorithm { std::vector phis(samples); for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); + auto& m = m_mesh; + using HitResult = EigenMesh3D::hit_result; + + // Hit results + std::vector hits(samples, HitResult(m)); + // We have to address the case when the direction vector v (same as // dir) is coincident with one of the world axes. In this case two of // its components will be completely zero and one is 1.0. Our method @@ -1033,10 +1075,10 @@ class SLASupportTree::Algorithm { // Now a and b vectors are perpendicular to v and to each other. // Together they define the plane where we have to iterate with the // given angles in the 'phis' vector - auto& m = m_mesh; tbb::parallel_for(size_t(0), phis.size(), - [&phis, &m, sd, r_pin, r_back, s, a, b, c](size_t i) + [&phis, &hits, &m, sd, r_pin, r_back, s, a, b, c] + (size_t i) { double& phi = phis[i]; double sinphi = std::sin(phi); @@ -1071,12 +1113,17 @@ class SLASupportTree::Algorithm { else { // re-cast the ray from the outside of the object auto q2 = m.query_ray_hit(ps + (q.distance() + 2*sd)*n, n); - phi = q2.distance(); + hits[i] = q2; } - } else phi = q.distance(); + } else hits[i] = q; }); - auto mit = std::min_element(phis.begin(), phis.end()); + auto mit = std::min_element(hits.begin(), hits.end(), + [](const HitResult& hr1, + const HitResult& hr2) + { + return hr1.distance() < hr2.distance(); + }); return *mit; } @@ -1085,11 +1132,12 @@ class SLASupportTree::Algorithm { // If the function is used for headless sticks, the ins_check parameter // have to be true as the beginning of the stick might be inside the model // geometry. - double bridge_mesh_intersect(const Vec3d& s, - const Vec3d& dir, - double r, - bool ins_check = false, - unsigned samples = 4) + EigenMesh3D::hit_result bridge_mesh_intersect( + const Vec3d& s, + const Vec3d& dir, + double r, + bool ins_check = false, + unsigned samples = 4) { // helper vector calculations Vec3d a(0, 1, 0), b; @@ -1116,9 +1164,14 @@ class SLASupportTree::Algorithm { for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); auto& m = m_mesh; + using HitResult = EigenMesh3D::hit_result; + + // Hit results + std::vector hits(samples, HitResult(m)); tbb::parallel_for(size_t(0), phis.size(), - [&m, &phis, a, b, sd, dir, r, s, ins_check](size_t i) + [&m, &phis, a, b, sd, dir, r, s, ins_check, &hits] + (size_t i) { double& phi = phis[i]; double sinphi = std::sin(phi); @@ -1142,12 +1195,17 @@ class SLASupportTree::Algorithm { auto hr2 = m.query_ray_hit(p + (hr.distance() + 2*sd)*dir, dir); - phi = hr2.distance(); + hits[i] = hr2; } - } else phi = hr.distance(); + } else hits[i] = hr; }); - auto mit = std::min_element(phis.begin(), phis.end()); + auto mit = std::min_element(hits.begin(), hits.end(), + [](const HitResult& hr1, + const HitResult& hr2) + { + return hr1.distance() < hr2.distance(); + }); return *mit; } @@ -1209,6 +1267,88 @@ class SLASupportTree::Algorithm { } } + long search_nearest(const Vec3d& querypoint) + { + SpatIndex spindex = m_pillar_index; + + long nearest_id = -1; + const double gndlvl = m_result.ground_level; + + while(nearest_id < 0 && !spindex.empty()) { m_thr(); + // loop until a suitable head is not found + // if there is a pillar closer than the cluster center + // (this may happen as the clustering is not perfect) + // than we will bridge to this closer pillar + + Vec3d qp(querypoint(X), querypoint(Y), gndlvl); + auto ne = spindex.nearest(qp, 1).front(); + const Head& nearhead = m_result.head(ne.second); + + Vec3d nearhead_jp = nearhead.junction_point(); + double dist2d = distance(qp, ne.first); + + // Bridge endpoint on the main pillar + Vec3d bridge_ep(nearhead_jp(X), nearhead_jp(Y), querypoint(Z) + + dist2d * std::tan(-m_cfg.bridge_slope)); + + if(bridge_ep(Z) > nearhead_jp(Z)) { + // If the sidepoint cannot connect to the pillar + // from its head junction, just skip this pillar. + spindex.remove(ne); + continue; + } + + double d = distance(querypoint, bridge_ep); + + // There will be a minimum distance from the ground where the + // bridge is allowed to connect. This is an empiric value. + double minz = gndlvl + 2 * m_cfg.head_width_mm; + + // WARNING: previously, max_bridge_length was divided by two. + // I don't remember if this was intentional or by accident. There + // is no logical reason why it shouldn't be used directly. + if(bridge_ep(Z) <= minz || d > m_cfg.max_bridge_length_mm) break; + + double chkd = bridge_mesh_intersect(querypoint, + dirv(querypoint, bridge_ep), + m_cfg.head_back_radius_mm); + + if(chkd >= d) nearest_id = ne.second; + + spindex.remove(ne); + } + return nearest_id; + } + + void connect_to_nearhead(const Head& head, const Head& nearhead) { + Vec3d hjp = head.junction_point(); + Vec3d headjp = hjp; + Vec3d nearheadjp = nearhead.junction_point(); + double r = m_cfg.head_back_radius_mm; + + double d = distance(Vec2d{headjp(X), headjp(Y)}, + Vec2d{nearheadjp(X), nearheadjp(Y)}); + + Vec3d touchjp(nearheadjp(X), nearheadjp(Y), headjp(Z) + + d * std::tan(-m_cfg.bridge_slope)); + + if(touchjp(Z) > nearheadjp(Z)) { + double hdiff = touchjp(Z) - nearheadjp(Z); + headjp(Z) -= hdiff; + touchjp(Z) -= hdiff; + + // create a pillar without base, + // it doesn't connect to ground just to an existing + // shorter pillar + m_result.add_pillar(unsigned(nearhead.id), headjp, r); + } + + if(headjp(Z) < hjp(Z)) m_result.add_junction(headjp, r); + if(touchjp(Z) >= nearheadjp(Z)) m_result.add_junction(touchjp, r); + + m_result.add_bridge(headjp, touchjp, r); + } + public: Algorithm(const SupportConfig& config, @@ -1220,7 +1360,6 @@ public: m_mesh(emesh), m_support_pts(support_pts), m_support_nmls(support_pts.size(), 3), - m_ptheights(support_pts.size(), 0.0), m_result(result), m_points(support_pts.size(), 3), m_thr(thr) @@ -1407,7 +1546,6 @@ public: void classify() { // We should first get the heads that reach the ground directly - m_ptheights.reserve(m_iheads.size()); PtIndices ground_head_indices; ground_head_indices.reserve(m_iheads.size()); m_iheads_onmodel.reserve(m_iheads.size()); @@ -1425,18 +1563,10 @@ public: Vec3d headjp = head.junction_point(); // collision check - double t = bridge_mesh_intersect(headjp, n, r); + auto hit = bridge_mesh_intersect(headjp, n, r); - // Precise distance measurement - double tprec = ray_mesh_intersect(headjp, n); - - // Save the distance from a surface in the Z axis downwards. It - // may be infinity but that is telling us that it touches the - // ground. - m_ptheights.emplace_back(tprec); - - if(std::isinf(t)) ground_head_indices.emplace_back(i); - else m_iheads_onmodel.emplace_back(i); + if(std::isinf(hit)) ground_head_indices.emplace_back(i); + else m_iheads_onmodel.emplace_back(std::make_pair(i, hit)); } // We want to search for clusters of points that are far enough @@ -1445,13 +1575,13 @@ public: // possibly in their centroid support point. auto d_base = 2*m_cfg.base_radius_mm; auto& thr = m_thr; - m_pillar_clusters = cluster(m_points, + m_pillar_clusters = cluster(m_points, ground_head_indices, [thr, d_base](const SpatElement& p, const SpatElement& s) { thr(); return distance(Vec2d(p.first(X), p.first(Y)), Vec2d(s.first(X), s.first(Y))) < d_base; - }, 3, ground_head_indices); // max 3 heads to connect to one pillar + }, 3); // max 3 heads to connect to one pillar } // Step: Routing the ground connected pinheads, and interconnecting @@ -1461,17 +1591,12 @@ public: // a central pillar is limited to avoid bad weight distribution. void routing_to_ground() { - const double hbr = m_cfg.head_back_radius_mm; const double pradius = m_cfg.head_back_radius_mm; - const double maxbridgelen = m_cfg.max_bridge_length_mm; const double gndlvl = m_result.ground_level; - - ClusterEl cl_centroids; cl_centroids.reserve(m_pillar_clusters.size()); - SpatIndex pheadindex; // spatial index for the junctions for(auto& cl : m_pillar_clusters) { m_thr(); // place all the centroid head positions into the index. We // will query for alternative pillar positions. If a sidehead @@ -1503,7 +1628,7 @@ public: Head& h = m_result.head(hid); h.transform(); Vec3d p = h.junction_point(); p(Z) = gndlvl; - pheadindex.insert(p, hid); + m_pillar_index.insert(p, hid); } // now we will go through the clusters ones again and connect the @@ -1531,97 +1656,31 @@ public: // TODO: don't consider the cluster centroid but calculate a // central position where the pillar can be placed. this way // the weight is distributed more effectively on the pillar. - auto search_nearest = - [this, maxbridgelen, gndlvl, pradius] - (SpatIndex& spindex, const Vec3d& jsh) - { - long nearest_id = -1; - const double max_len = maxbridgelen / 2; - while(nearest_id < 0 && !spindex.empty()) { m_thr(); - // loop until a suitable head is not found - // if there is a pillar closer than the cluster center - // (this may happen as the clustering is not perfect) - // than we will bridge to this closer pillar - - Vec3d qp(jsh(X), jsh(Y), gndlvl); - auto ne = spindex.nearest(qp, 1).front(); - const Head& nearhead = m_result.head(ne.second); - - Vec3d jh = nearhead.junction_point(); - Vec3d jp = jsh; - double dist2d = distance(qp, ne.first); - - // Bridge endpoint on the main pillar - Vec3d jn(jh(X), jh(Y), jp(Z) + - dist2d * std::tan(-m_cfg.bridge_slope)); - - if(jn(Z) > jh(Z)) { - // If the sidepoint cannot connect to the pillar - // from its head junction, just skip this pillar. - spindex.remove(ne); - continue; - } - - double d = distance(jp, jn); - - if(jn(Z) <= gndlvl + 2*m_cfg.head_width_mm || d > max_len) - break; - - double chkd = bridge_mesh_intersect(jp, dirv(jp, jn), - pradius); - - if(chkd >= d) nearest_id = ne.second; - - spindex.remove(ne); - } - return nearest_id; - }; for(auto c : cl) { m_thr(); auto& sidehead = m_result.head(c); sidehead.transform(); - Vec3d jsh = sidehead.junction_point(); - SpatIndex spindex = pheadindex; - long nearest_id = search_nearest(spindex, jsh); + Vec3d sidehead_jp = sidehead.junction_point(); + long nearest_id = search_nearest(sidehead_jp); // at this point we either have our pillar index or we have // to connect the sidehead to the ground if(nearest_id < 0) { // Could not find a pillar, create one - Vec3d jp = jsh; jp(Z) = gndlvl; - m_result.add_pillar(unsigned(sidehead.id), jp, pradius). - add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); + m_result.add_pillar( + unsigned(sidehead.id), + Vec3d{sidehead_jp(X), sidehead_jp(Y), gndlvl}, + pradius).add_base(m_cfg.base_height_mm, + m_cfg.base_radius_mm); // connects to ground, eligible for bridging cl_centroids.emplace_back(c); } else { // Creating the bridge to the nearest pillar - auto nearest_uid = unsigned(nearest_id); const Head& nearhead = m_result.head(nearest_uid); - Vec3d jp = jsh; - Vec3d jh = nearhead.junction_point(); - - double d = distance(Vec2d{jp(X), jp(Y)}, - Vec2d{jh(X), jh(Y)}); - Vec3d jn(jh(X), jh(Y), jp(Z) + - d * std::tan(-m_cfg.bridge_slope)); - - if(jn(Z) > jh(Z)) { - double hdiff = jn(Z) - jh(Z); - jp(Z) -= hdiff; - jn(Z) -= hdiff; - - // pillar without base, doesn't connect to ground. - m_result.add_pillar(nearest_uid, jp, pradius); - } - - if(jp(Z) < jsh(Z)) m_result.add_junction(jp, hbr); - if(jn(Z) >= jh(Z)) m_result.add_junction(jn, hbr); - - m_result.add_bridge(jp, jn, - sidehead.request_pillar_radius(pradius)); + connect_to_nearhead(sidehead, nearhead); } } } @@ -1716,112 +1775,175 @@ public: // nearby pillar that can hold the supported weight. void routing_to_model() { + + // We need to check if there is an easy way out to the bed surface. + // If it can be routed there with a bridge shorter than + // min_bridge_distance. + + // First we want to index the available pillars. The best is to connect + // these points to the available pillars + + auto routedown = [this](Head& head, const Vec3d& dir, double dist) + { + head.transform(); + Vec3d hjp = head.junction_point(); + Vec3d endp = hjp + dist * dir; + m_result.add_bridge(hjp, endp, head.r_back_mm); + m_result.add_junction(endp, head.r_back_mm); + + auto groundp = endp; + groundp(Z) = m_result.ground_level; + m_result.add_pillar(endp, groundp, head.r_back_mm).add_base( + m_cfg.base_height_mm, m_cfg.base_radius_mm); + }; + // TODO: connect these to the ground pillars if possible - for(auto idx : m_iheads_onmodel) { m_thr(); - double gh = m_ptheights[idx]; - double base_width = m_cfg.head_width_mm; + for(auto item : m_iheads_onmodel) { m_thr(); + unsigned idx = item.first; + EigenMesh3D::hit_result hit = item.second; auto& head = m_result.head(idx); + Vec3d hjp = head.junction_point(); - if(std::isinf(gh)) { // in this case the the pillar geometry - head.invalidate(); continue; -// // is partially inside the model geometry. We cannot go -// // straight down but at an angle. We will search for a suitable -// // direction with the optimizer, optimizing for the smallest -// // difference between the bridge body hit distance and the -// // bridge center hit distance. + // ///////////////////////////////////////////////////////////////// + // Search nearby pillar + // ///////////////////////////////////////////////////////////////// -// // Get the spherical representation of the normal. its easier to -// // work with. -// double z = head.dir(Z); -// double r = 1.0; // for normalized vector -// double polar = std::acos(z / r); -// double azimuth = std::atan2(head.dir(Y), head.dir(X)); - -// using libnest2d::opt::bound; -// using libnest2d::opt::initvals; -// using libnest2d::opt::SimplexOptimizer; -// using libnest2d::opt::StopCriteria; - -// StopCriteria stc; -// stc.max_iterations = 100; -// stc.relative_score_difference = 1e-3; -// stc.stop_score = head.r_pin_mm; -// SimplexOptimizer solver(stc); - -// auto oresult = solver.optimize_max( -// [&head, &mesh](double plr, double azm) -// { -// auto n = Vec3d(std::cos(azm) * std::sin(plr), -// std::sin(azm) * std::sin(plr), -// std::cos(plr)).normalized(); - -// double score = bridge_mesh_intersect(head.junction_point(), -// n, -// head.r_back_mm, -// mesh); -// return score; -// }, -// initvals(polar, azimuth), // let's start with what we have -// bound(3*PI/4, PI), // Must not exceed the slope limit -// bound(-PI, PI) // azimuth can be a full range search -// ); - -// t = oresult.score; -// polar = std::get<0>(oresult.optimum); -// azimuth = std::get<1>(oresult.optimum); -// nn = Vec3d(std::cos(azimuth) * std::sin(polar), -// std::sin(azimuth) * std::sin(polar), -// std::cos(polar)).normalized(); - - } - - // In this case there is no room for the base pinhead. - if(gh < head.fullwidth()) { - double min_l = - 2 * m_cfg.head_front_radius_mm + - 2 * m_cfg.head_back_radius_mm - - m_cfg.head_penetration_mm; - - base_width = gh - min_l; - } - - if(base_width < 0) { - // There is really no space for even a reduced size head. We - // have to replace that with a small half sphere that touches - // the model surface. (TODO) - head.invalidate(); + long nearest_pillar_id = search_nearest(hjp); + if(nearest_pillar_id >= 0) { // successful search + auto nearest_uid = unsigned(nearest_pillar_id); + const Head& nearhead = m_result.head(nearest_uid); + head.transform(); // accept the head + connect_to_nearhead(head, nearhead); continue; } - head.transform(); + // ///////////////////////////////////////////////////////////////// + // Try straight path + // ///////////////////////////////////////////////////////////////// - Vec3d headend = head.junction_point(); + // Cannot connect to nearby pillar. We will try to search for + // a route to the ground. - Head base_head(m_cfg.head_back_radius_mm, - m_cfg.head_front_radius_mm, - base_width, - m_cfg.head_penetration_mm, - {0.0, 0.0, 1.0}, - {headend(X), headend(Y), headend(Z) - gh}); + double t = bridge_mesh_intersect(hjp, head.dir, head.r_back_mm); + double d = 0, tdown = 0; + Vec3d dirdown(0.0, 0.0, -1.0); - base_head.transform(); + while(d < t && !std::isinf(tdown = bridge_mesh_intersect( + hjp + d*head.dir, + dirdown, head.r_back_mm))) { + d += head.r_back_mm; + } - // Robustness check: - if(headend(Z) < base_head.junction_point()(Z)) { - // This should not happen it is against all assumptions - BOOST_LOG_TRIVIAL(warning) - << "Ignoring invalid supports connecting to model body"; - head.invalidate(); + if(std::isinf(tdown)) { // we heave found a route to the ground + routedown(head, head.dir, d); continue; + } + + // ///////////////////////////////////////////////////////////////// + // Optimize bridge direction + // ///////////////////////////////////////////////////////////////// + + // Straight path failed so we will try to search for a suitable + // direction out of the cavity. + + // Get the spherical representation of the normal. its easier to + // work with. + double z = head.dir(Z); + double r = 1.0; // for normalized vector + double polar = std::acos(z / r); + double azimuth = std::atan2(head.dir(Y), head.dir(X)); + + using libnest2d::opt::bound; + using libnest2d::opt::initvals; + using libnest2d::opt::SimplexOptimizer; + using libnest2d::opt::StopCriteria; + + StopCriteria stc; + stc.max_iterations = 100; + stc.relative_score_difference = 1e-3; + stc.stop_score = 1e6; + SimplexOptimizer solver(stc); + + double r_back = head.r_back_mm; + + auto oresult = solver.optimize_max( + [this, hjp, r_back](double plr, double azm) + { + Vec3d n = Vec3d(std::cos(azm) * std::sin(plr), + std::sin(azm) * std::sin(plr), + std::cos(plr)).normalized(); + + return bridge_mesh_intersect(hjp, n, r_back); + }, + initvals(polar, azimuth), // let's start with what we have + bound(3*PI/4, PI), // Must not exceed the slope limit + bound(-PI, PI) // azimuth can be a full range search + ); + + d = 0; t = oresult.score; + polar = std::get<0>(oresult.optimum); + azimuth = std::get<1>(oresult.optimum); + Vec3d bridgedir = Vec3d(std::cos(azimuth) * std::sin(polar), + std::sin(azimuth) * std::sin(polar), + std::cos(polar)).normalized(); + + while(d < t && !std::isinf(tdown = bridge_mesh_intersect( + hjp + d*bridgedir, + dirdown, + head.r_back_mm))) { + d += head.r_back_mm; + } + + if(std::isinf(tdown)) { // we heave found a route to the ground + routedown(head, bridgedir, d); continue; + } + + // ///////////////////////////////////////////////////////////////// + // Route to model body + // ///////////////////////////////////////////////////////////////// + + double zangle = std::asin(hit.direction()(Z)); + zangle = std::max(zangle, PI/4); + double h = std::sin(zangle) * head.fullwidth(); + + // The width of the tail head that we would like to have... + h = std::min(hit.distance() - head.r_back_mm, h); + + if(h > 0) { + Vec3d endp{hjp(X), hjp(Y), hjp(Z) - hit.distance() + h}; + auto center_hit = m_mesh.query_ray_hit(hjp, dirdown); + + double hitdiff = center_hit.distance() - hit.distance(); + Vec3d hitp = std::abs(hitdiff) < 2*head.r_back_mm? + center_hit.position() : hit.position(); + + head.transform(); + + Pillar& pill = m_result.add_pillar(unsigned(head.id), + endp, + head.r_back_mm); + + Vec3d taildir = endp - hitp; + double dist = distance(endp, hitp) + m_cfg.head_penetration_mm; + double w = dist - 2 * head.r_pin_mm - head.r_back_mm; + + Head tailhead(head.r_back_mm, + head.r_pin_mm, + w, + m_cfg.head_penetration_mm, + taildir, + hitp); + + tailhead.transform(); + pill.base = tailhead.mesh; continue; } - double hl = base_head.fullwidth() - head.r_back_mm; - - m_result.add_pillar(idx, - Vec3d{headend(X), headend(Y), headend(Z) - gh + hl}, - m_cfg.head_back_radius_mm - ).base = base_head.mesh; + // We have failed to route this head. + BOOST_LOG_TRIVIAL(warning) + << "Failed to route model facing support point." + << " ID: " << idx; + head.invalidate(); } } @@ -1884,7 +2006,6 @@ bool SLASupportTree::generate(const std::vector &support_points, ROUTING_NONGROUND, HEADLESS, DONE, - HALT, ABORT, NUM_STEPS //... @@ -1913,16 +2034,12 @@ bool SLASupportTree::generate(const std::vector &support_points, // Done }, - [] () { - // Halt - }, - [] () { // Abort } }; - Steps pc = BEGIN, pc_prev = BEGIN; + Steps pc = BEGIN; if(cfg.ground_facing_only) { program[ROUTING_NONGROUND] = []() { @@ -1936,18 +2053,17 @@ bool SLASupportTree::generate(const std::vector &support_points, } // Let's define a simple automaton that will run our program. - auto progress = [&ctl, &pc, &pc_prev] () { + auto progress = [&ctl, &pc] () { static const std::array stepstr { - "Starting", - "Filtering", - "Generate pinheads", - "Classification", - "Routing to ground", - "Routing supports to model surface", - "Processing small holes", - "Done", - "Halt", - "Abort" + L("Starting"), + L("Filtering"), + L("Generate pinheads"), + L("Classification"), + L("Routing to ground"), + L("Routing supports to model surface"), + L("Processing small holes"), + L("Done"), + L("Abort") }; static const std::array stepstate { @@ -1959,7 +2075,6 @@ bool SLASupportTree::generate(const std::vector &support_points, 70, 80, 100, - 0, 0 }; @@ -1973,7 +2088,6 @@ bool SLASupportTree::generate(const std::vector &support_points, case ROUTING_GROUND: pc = ROUTING_NONGROUND; break; case ROUTING_NONGROUND: pc = HEADLESS; break; case HEADLESS: pc = DONE; break; - case HALT: pc = pc_prev; break; case DONE: case ABORT: break; default: ; @@ -1982,7 +2096,7 @@ bool SLASupportTree::generate(const std::vector &support_points, }; // Just here we run the computation... - while(pc < DONE || pc == HALT) { + while(pc < DONE) { progress(); program[pc](); } diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index 04b5a7207..da2bb1b79 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -169,6 +169,7 @@ EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const hit_result ret(*this); ret.m_t = double(hit.t); ret.m_dir = dir; + ret.m_source = s; if(!std::isinf(hit.t) && !std::isnan(hit.t)) ret.m_face_id = hit.id; return ret; @@ -348,9 +349,9 @@ PointSet normals(const PointSet& points, // Clustering a set of points by the given criteria ClusteredPoints cluster( - const sla::PointSet& points, + const sla::PointSet& points, const std::vector& indices, std::function pred, - unsigned max_points = 0, const std::vector& indices = {}) + unsigned max_points = 0) { namespace bgi = boost::geometry::index; @@ -360,12 +361,8 @@ ClusteredPoints cluster( Index3D sindex; // Build the index - if(indices.empty()) - for(unsigned idx = 0; idx < points.rows(); idx++) - sindex.insert( std::make_pair(points.row(idx), idx)); - else - for(unsigned idx : indices) - sindex.insert( std::make_pair(points.row(idx), idx)); + for(unsigned idx : indices) + sindex.insert( std::make_pair(points.row(idx), idx)); using Elems = std::vector; From a123099f804e869e5e11d643a25993f15b98d33c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 1 Mar 2019 11:00:34 +0100 Subject: [PATCH 014/236] Implemented another behavior of the "Slice Now" / "Export/Send G-code" buttons (SPE-831) --- src/slic3r/GUI/3DScene.cpp | 7 +- src/slic3r/GUI/BackgroundSlicingProcess.hpp | 3 + src/slic3r/GUI/GLCanvas3D.cpp | 55 +++++++++---- src/slic3r/GUI/GLCanvas3D.hpp | 5 +- src/slic3r/GUI/MainFrame.cpp | 3 +- src/slic3r/GUI/Plater.cpp | 91 ++++++++++++++++++++- src/slic3r/GUI/Plater.hpp | 7 +- 7 files changed, 145 insertions(+), 26 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 88815d9a6..f88b4e73d 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -834,6 +834,8 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M ModelInstance::EPrintVolumeState state = ModelInstance::PVS_Inside; bool all_contained = true; + bool contained_min_one = false; + for (GLVolume* volume : this->volumes) { if ((volume == nullptr) || volume->is_modifier || (volume->is_wipe_tower && !volume->shader_outside_printer_detection_enabled) || ((volume->composite_id.volume_id < 0) && !volume->shader_outside_printer_detection_enabled)) @@ -843,6 +845,9 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M bool contained = print_volume.contains(bb); all_contained &= contained; + if (contained) + contained_min_one = true; + volume->is_outside = !contained; if ((state == ModelInstance::PVS_Inside) && volume->is_outside) @@ -855,7 +860,7 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M if (out_state != nullptr) *out_state = state; - return all_contained; + return /*all_contained*/ contained_min_one; // #ys_FIXME_delete_after_testing } void GLVolumeCollection::reset_outside_state() diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.hpp b/src/slic3r/GUI/BackgroundSlicingProcess.hpp index a2299e7bf..a15d3faef 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.hpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp @@ -123,6 +123,9 @@ public: // This "finished" flag does not account for the final export of the output file (.gcode or zipped PNGs), // and it does not account for the OctoPrint scheduling. bool finished() const { return m_print->finished(); } + + // set status line + void set_status(const std::string & status_str) const { m_print->set_status(100, status_str); } private: void thread_proc(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4f456c392..b29bb16e0 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3067,7 +3067,7 @@ GLGizmoBase* GLCanvas3D::Gizmos::_get_current() const return (it != m_gizmos.end()) ? it->second : nullptr; } -const unsigned char GLCanvas3D::WarningTexture::Background_Color[3] = { 9, 91, 134 }; +const unsigned char GLCanvas3D::WarningTexture::Background_Color[3] = { 120, 120, 120 };//{ 9, 91, 134 }; const unsigned char GLCanvas3D::WarningTexture::Opacity = 255; GLCanvas3D::WarningTexture::WarningTexture() @@ -3101,16 +3101,23 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool // Look at the end of our vector and generate proper texture. std::string text; + bool red_colored = false; switch (m_warnings.back()) { case ObjectOutside : text = L("Detected object outside print volume"); break; case ToolpathOutside : text = L("Detected toolpath outside print volume"); break; case SomethingNotShown : text = L("Some objects are not visible when editing supports"); break; + case ObjectClashed: { + text = L("Detected object outside print volume\n" + "Resolve a clash to continue slicing/export process correctly"); + red_colored = true; + break; + } } - _generate(text, canvas); // GUI::GLTexture::reset() is called at the beginning of generate(...) + _generate(text, canvas, red_colored); // GUI::GLTexture::reset() is called at the beginning of generate(...) } -bool GLCanvas3D::WarningTexture::_generate(const std::string& msg, const GLCanvas3D& canvas) +bool GLCanvas3D::WarningTexture::_generate(const std::string& msg, const GLCanvas3D& canvas, const bool red_colored/* = false*/) { reset(); @@ -3127,7 +3134,8 @@ bool GLCanvas3D::WarningTexture::_generate(const std::string& msg, const GLCanva // calculates texture size wxCoord w, h; - memDC.GetTextExtent(msg, &w, &h); +// memDC.GetTextExtent(msg, &w, &h); + memDC.GetMultiLineTextExtent(msg, &w, &h); int pow_of_two_size = next_highest_power_of_2(std::max(w, h)); @@ -3144,8 +3152,9 @@ bool GLCanvas3D::WarningTexture::_generate(const std::string& msg, const GLCanva memDC.Clear(); // draw message - memDC.SetTextForeground(*wxWHITE); - memDC.DrawText(msg, 0, 0); + memDC.SetTextForeground(red_colored ? wxColour(255,72,65/*204,204*/) : *wxWHITE); +// memDC.DrawText(msg, 0, 0); + memDC.DrawLabel(msg, wxRect(0,0, m_original_width, m_original_height), wxALIGN_CENTER); memDC.SelectObject(wxNullBitmap); @@ -4392,23 +4401,33 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re if (!m_volumes.empty()) { ModelInstance::EPrintVolumeState state; - bool contained = m_volumes.check_outside_state(m_config, &state); - if (!contained) - { - _set_warning_texture(WarningTexture::ObjectOutside, true); - post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, state == ModelInstance::PVS_Fully_Outside)); - } - else - { - m_volumes.reset_outside_state(); - _set_warning_texture(WarningTexture::ObjectOutside, false); - post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, !m_model->objects.empty())); - } + const bool contained_min_one = m_volumes.check_outside_state(m_config, &state); + + _set_warning_texture(WarningTexture::ObjectClashed, state == ModelInstance::PVS_Partly_Outside); + _set_warning_texture(WarningTexture::ObjectOutside, state == ModelInstance::PVS_Fully_Outside); + + post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, + contained_min_one && !m_model->objects.empty() && state != ModelInstance::PVS_Partly_Outside)); + +// #ys_FIXME_delete_after_testing +// bool contained = m_volumes.check_outside_state(m_config, &state); +// if (!contained) +// { +// _set_warning_texture(WarningTexture::ObjectOutside, true); +// post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, state == ModelInstance::PVS_Fully_Outside)); +// } +// else +// { +// m_volumes.reset_outside_state(); +// _set_warning_texture(WarningTexture::ObjectOutside, false); +// post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, !m_model->objects.empty())); +// } } else { _set_warning_texture(WarningTexture::ObjectOutside, false); + _set_warning_texture(WarningTexture::ObjectClashed, false); post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, false)); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 008e77056..614f75ac2 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -751,7 +751,8 @@ private: enum Warning { ObjectOutside, ToolpathOutside, - SomethingNotShown + SomethingNotShown, + ObjectClashed }; // Sets a warning of the given type to be active/inactive. If several warnings are active simultaneously, @@ -770,7 +771,7 @@ private: std::vector m_warnings; // Generates the texture with given text. - bool _generate(const std::string& msg, const GLCanvas3D& canvas); + bool _generate(const std::string& msg, const GLCanvas3D& canvas, const bool red_colored = false); }; class LegendTexture : public GUI::GLTexture diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index cddf081eb..1d1982ffa 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -881,9 +881,10 @@ void MainFrame::on_config_changed(DynamicPrintConfig* config) const // Update the UI based on the current preferences. void MainFrame::update_ui_from_settings() { - bool bp_on = wxGetApp().app_config->get("background_processing") == "1"; + const bool bp_on = wxGetApp().app_config->get("background_processing") == "1"; // m_menu_item_reslice_now->Enable(!bp_on); m_plater->sidebar().show_reslice(!bp_on); + m_plater->sidebar().show_export(bp_on); m_plater->sidebar().Layout(); if (m_plater) m_plater->update_ui_from_settings(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index e917269d2..784443c64 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -487,6 +487,12 @@ ConfigOptionsGroup* FreqChangedParams::get_og(const bool is_fff) // Sidebar / private +enum class ActionButtonType : int { + abReslice, + abExport, + abSendGCode +}; + struct Sidebar::priv { Plater *plater; @@ -942,8 +948,9 @@ void Sidebar::enable_buttons(bool enable) p->btn_send_gcode->Enable(enable); } -void Sidebar::show_reslice(bool show) { p->btn_reslice->Show(show); } -void Sidebar::show_send(bool show) { p->btn_send_gcode->Show(show); } +void Sidebar::show_reslice(bool show) const { p->btn_reslice->Show(show); } +void Sidebar::show_export(bool show) const { p->btn_export_gcode->Show(show); } +void Sidebar::show_send(bool show) const { p->btn_send_gcode->Show(show); } bool Sidebar::is_multifilament() { @@ -1033,6 +1040,8 @@ struct Plater::priv wxTimer background_process_timer; + std::string label_btn_export; + static const std::regex pattern_bundle; static const std::regex pattern_3mf; static const std::regex pattern_zip_amf; @@ -1122,6 +1131,7 @@ struct Plater::priv void on_3dcanvas_mouse_dragging_finished(SimpleEvent&); void update_object_menu(); + void show_action_buttons(const bool is_ready_to_slice) const; // Set the bed shape to a single closed 2D polygon(array of two element arrays), // triangulate the bed and store the triangles into m_bed.m_triangles, @@ -2093,6 +2103,31 @@ unsigned int Plater::priv::update_background_process(bool force_validation) // jinak background_process.running() -> Zobraz "Slicing ..." // jinak pokud ! background_process.empty() && ! background_process.finished() -> je neco ke slajsovani (povol tlacitko) "Slice Now" + if ((return_state & UPDATE_BACKGROUND_PROCESS_INVALID) != 0) + { + const wxString invalid_str = _(L("Invalid data")); + for (auto btn : {ActionButtonType::abReslice, ActionButtonType::abSendGCode, ActionButtonType::abExport}) + sidebar->set_btn_label(btn, invalid_str); + } + else + { + if ((return_state & UPDATE_BACKGROUND_PROCESS_RESTART) != 0 || + (return_state & UPDATE_BACKGROUND_PROCESS_REFRESH_SCENE) != 0 ) + background_process.set_status("Ready to slice"); + + sidebar->set_btn_label(ActionButtonType::abExport, _(label_btn_export)); + sidebar->set_btn_label(ActionButtonType::abSendGCode, _(L("Send G-code"))); + + const wxString slice_string = background_process.running() && wxGetApp().get_mode() == comSimple ? + _(L("Slicing")) + dots : _(L("Slice now")); + sidebar->set_btn_label(ActionButtonType::abReslice, slice_string); + + if (background_process.finished()) + show_action_buttons(false); + else if (!background_process.empty()) + show_action_buttons(true); + } + return return_state; } @@ -2388,6 +2423,9 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) this->update_sla_scene(); break; } + + if (wxGetApp().get_mode() == comSimple) + show_action_buttons(false); } void Plater::priv::on_layer_editing_toggled(bool enable) @@ -2755,6 +2793,37 @@ void Plater::priv::update_object_menu() #endif // ENABLE_MODE_AWARE_TOOLBAR_ITEMS } +void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const +{ + wxWindowUpdateLocker noUpdater(sidebar); + const auto prin_host_opt = config->option("print_host"); + const bool send_gcode_shown = prin_host_opt != nullptr && !prin_host_opt->value.empty(); + + // when a background processing is ON, export_btn and/or send_btn are showing + if (wxGetApp().app_config->get("background_processing") == "1") + { + sidebar->show_reslice(false); + sidebar->show_export(true); + sidebar->show_send(send_gcode_shown); + } + else + { + sidebar->show_reslice(is_ready_to_slice); + sidebar->show_export(!is_ready_to_slice); + sidebar->show_send(send_gcode_shown && !is_ready_to_slice); + } +} + +void Sidebar::set_btn_label(const ActionButtonType btn_type, const wxString& label) const +{ + switch (btn_type) + { + case ActionButtonType::abReslice: p->btn_reslice->SetLabelText(label); break; + case ActionButtonType::abExport: p->btn_export_gcode->SetLabelText(label); break; + case ActionButtonType::abSendGCode: p->btn_send_gcode->SetLabelText(label); break; + } +} + // Plater / Public Plater::Plater(wxWindow *parent, MainFrame *main_frame) @@ -3081,6 +3150,22 @@ void Plater::reslice() this->p->background_process.set_task(PrintBase::TaskParams()); // Only restarts if the state is valid. this->p->restart_background_process(state | priv::UPDATE_BACKGROUND_PROCESS_FORCE_RESTART); + + if ((state & priv::UPDATE_BACKGROUND_PROCESS_INVALID) != 0) + return; + + if (p->background_process.running()) + { + if (wxGetApp().get_mode() == comSimple) + p->sidebar->set_btn_label(ActionButtonType::abReslice, _(L("Slicing")) + dots); + else + { + p->sidebar->set_btn_label(ActionButtonType::abReslice, _(L("Slice now"))); + p->show_action_buttons(false); + } + } + else if (!p->background_process.empty() && !p->background_process.idle()) + p->show_action_buttons(true); } void Plater::reslice_SLA_supports(const ModelObject &object) @@ -3282,6 +3367,8 @@ void Plater::set_printer_technology(PrinterTechnology printer_technology) } //FIXME for SLA synchronize //p->background_process.apply(Model)! + + p->label_btn_export = printer_technology == ptFFF ? L("Export G-code") : L("Export"); // #ys_FIXME_rename } void Plater::changed_object(int obj_idx) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 4d489c82a..3370dd92f 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -38,6 +38,7 @@ class GLCanvas3D; using t_optgroups = std::vector >; class Plater; +enum class ActionButtonType : int; class PresetComboBox : public wxBitmapComboBox { @@ -86,8 +87,10 @@ public: void show_info_sizer(); void show_sliced_info_sizer(const bool show); void enable_buttons(bool enable); - void show_reslice(bool show); - void show_send(bool show); + void set_btn_label(const ActionButtonType btn_type, const wxString& label) const; + void show_reslice(bool show) const; + void show_export(bool show) const; + void show_send(bool show) const; bool is_multifilament(); void set_mode_value(const /*ConfigOptionMode*/int mode) { m_mode = mode; } From 84a96d3ba068fee41dde516d1ad1e50d6ede2cb6 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 1 Mar 2019 12:03:14 +0100 Subject: [PATCH 015/236] Added a tooltip for the "Slice now" button and changed its behavior according to a hold of Shift + some code refactoring --- src/slic3r/GUI/GUI_App.cpp | 15 +-------------- src/slic3r/GUI/Plater.cpp | 36 +++++++++++++++++++++++++++++++++--- src/slic3r/GUI/Plater.hpp | 7 ++++--- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index eb02d622c..5526add4d 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -525,20 +525,7 @@ void GUI_App::save_mode(const /*ConfigOptionMode*/int mode) // Update view mode according to selected menu void GUI_App::update_mode() { - wxWindowUpdateLocker noUpdates(&sidebar()); - - const ConfigOptionMode mode = wxGetApp().get_mode(); - - obj_list()->get_sizer()->Show(mode > comSimple); - sidebar().set_mode_value(mode); -// sidebar().show_buttons(mode == comExpert); - obj_list()->unselect_objects(); - obj_list()->update_selections(); - obj_list()->update_object_menu(); - - sidebar().update_mode_sizer(mode); - - sidebar().Layout(); + sidebar().update_mode(); for (auto tab : tabs_list) tab->update_visibility(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 784443c64..bfde4c5c0 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -655,7 +655,13 @@ Sidebar::Sidebar(Plater *parent) // Events p->btn_export_gcode->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->export_gcode(); }); - p->btn_reslice->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->reslice(); }); + p->btn_reslice->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) + { + const bool export_gcode_after_slicing = wxGetKeyState(WXK_SHIFT); + p->plater->reslice(); + if (export_gcode_after_slicing) + p->plater->export_gcode(); + }); p->btn_send_gcode->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->send_gcode(); }); } @@ -753,9 +759,15 @@ void Sidebar::update_presets(Preset::Type preset_type) wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); } -void Sidebar::update_mode_sizer(const Slic3r::ConfigOptionMode& mode) +void Sidebar::update_mode_sizer() const { - p->mode_sizer->SetMode(mode); + p->mode_sizer->SetMode(m_mode); +} + +void Sidebar::update_reslice_btn_tooltip() const +{ + const wxString tooltip = m_mode == comSimple ? wxEmptyString : _(L("Hold Shift to Slice & Export G-code")); + p->btn_reslice->SetToolTip(tooltip); } ObjectManipulation* Sidebar::obj_manipul() @@ -958,6 +970,24 @@ bool Sidebar::is_multifilament() } +void Sidebar::update_mode() +{ + m_mode = wxGetApp().get_mode(); + + update_reslice_btn_tooltip(); + update_mode_sizer(); + + wxWindowUpdateLocker noUpdates(this); + + p->object_list->get_sizer()->Show(m_mode > comSimple); + + p->object_list->unselect_objects(); + p->object_list->update_selections(); + p->object_list->update_object_menu(); + + Layout(); +} + std::vector& Sidebar::combos_filament() { return p->combos_filament; diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 3370dd92f..78035d0ab 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -62,7 +62,7 @@ private: class Sidebar : public wxPanel { - /*ConfigOptionMode*/int m_mode; + ConfigOptionMode m_mode; public: Sidebar(Plater *parent); Sidebar(Sidebar &&) = delete; @@ -74,7 +74,8 @@ public: void init_filament_combo(PresetComboBox **combo, const int extr_idx); void remove_unused_filament_combos(const int current_extruder_count); void update_presets(Slic3r::Preset::Type preset_type); - void update_mode_sizer(const Slic3r::ConfigOptionMode& mode); + void update_mode_sizer() const; + void update_reslice_btn_tooltip() const; ObjectManipulation* obj_manipul(); ObjectList* obj_list(); @@ -92,7 +93,7 @@ public: void show_export(bool show) const; void show_send(bool show) const; bool is_multifilament(); - void set_mode_value(const /*ConfigOptionMode*/int mode) { m_mode = mode; } + void update_mode(); std::vector& combos_filament(); private: From 878ac7f1b09d20ee215738636129c77233c38f95 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 1 Mar 2019 17:45:29 +0100 Subject: [PATCH 016/236] Fixing many errors caused by the new changes. --- src/libslic3r/SLA/SLACommon.hpp | 22 ++++--- src/libslic3r/SLA/SLASupportTree.cpp | 86 ++++++++++++++++------------ src/libslic3r/SLA/SLASupportTree.hpp | 2 +- 3 files changed, 65 insertions(+), 45 deletions(-) diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp index 4fdb32378..2dfc2b5e7 100644 --- a/src/libslic3r/SLA/SLACommon.hpp +++ b/src/libslic3r/SLA/SLACommon.hpp @@ -72,30 +72,36 @@ public: class hit_result { double m_t = std::nan(""); int m_face_id = -1; - std::reference_wrapper m_mesh; + const EigenMesh3D *m_mesh = nullptr; Vec3d m_dir; Vec3d m_source; friend class EigenMesh3D; - public: // A valid object of this class can only be obtained from // EigenMesh3D::query_ray_hit method. - explicit inline hit_result(const EigenMesh3D& em): m_mesh(em) {} + explicit inline hit_result(const EigenMesh3D& em): m_mesh(&em) {} + public: + + // This can create a placeholder object which is invalid (not created + // by a query_ray_hit call) but the distance can be preset to + // a specific value for distinguishing the placeholder. + inline hit_result(double val = std::nan("")): m_t(val) {} inline double distance() const { return m_t; } inline const Vec3d& direction() const { return m_dir; } inline Vec3d position() const { return m_source + m_dir * m_t; } inline int face() const { return m_face_id; } + inline bool is_valid() const { return m_mesh != nullptr; } // Hit_result can decay into a double as the hit distance. inline operator double() const { return distance(); } inline Vec3d normal() const { - if(m_face_id < 0) return {}; - auto trindex = m_mesh.get().m_F.row(m_face_id); - const Vec3d& p1 = m_mesh.get().V().row(trindex(0)); - const Vec3d& p2 = m_mesh.get().V().row(trindex(1)); - const Vec3d& p3 = m_mesh.get().V().row(trindex(2)); + if(m_face_id < 0 || !is_valid()) return {}; + auto trindex = m_mesh->m_F.row(m_face_id); + const Vec3d& p1 = m_mesh->V().row(trindex(0)); + const Vec3d& p2 = m_mesh->V().row(trindex(1)); + const Vec3d& p3 = m_mesh->V().row(trindex(2)); Eigen::Vector3d U = p2 - p1; Eigen::Vector3d V = p3 - p1; return U.cross(V).normalized(); diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 0a157fe3a..d2c9a9f6b 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1011,20 +1011,20 @@ class SLASupportTree::Algorithm { // surface. dir: This is the direction of the head from the pin to the back // r_pin, r_back: the radiuses of the pin and the back sphere width: This // is the full width from the pin center to the back center m: The object - // mesh - // - // Optional: - // samples: how many rays will be shot - // safety distance: This will be added to the radiuses to have a safety - // distance from the mesh. + // mesh. + // The return value is the hit result from the ray casting. If the starting + // point was inside the model, an "invalid" hit_result will be returned + // with a zero distance value instead of a NAN. This way the result can + // be used safely for comparison with other distances. EigenMesh3D::hit_result pinhead_mesh_intersect( const Vec3d& s, const Vec3d& dir, double r_pin, double r_back, - double width, - unsigned samples = 8) + double width) { + static const size_t SAMPLES = 8; + // method based on: // https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space @@ -1045,14 +1045,14 @@ class SLASupportTree::Algorithm { // The portions of the circle (the head-back circle) for which we will // shoot rays. - std::vector phis(samples); + std::array phis; for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); auto& m = m_mesh; using HitResult = EigenMesh3D::hit_result; // Hit results - std::vector hits(samples, HitResult(m)); + std::array hits; // We have to address the case when the direction vector v (same as // dir) is coincident with one of the world axes. In this case two of @@ -1109,21 +1109,27 @@ class SLASupportTree::Algorithm { auto q = m.query_ray_hit(ps + sd*n, n); if(q.is_inside()) { // the hit is inside the model - if(q.distance() > 2*r_pin) phi = 0; + if(q.distance() > 2*r_pin) { + // If we are inside the model and the hit distance is bigger + // than our pin circle diameter, it probably indicates that + // the support point was already inside the model, or there + // is really no space around the point. We will assign a + // zero hit distance to these cases which will enforce the + // function return value to be an invalid ray with zero hit + // distance. (see min_element at the end) + hits[i] = HitResult(0.0); + } else { - // re-cast the ray from the outside of the object + // re-cast the ray from the outside of the object. + // The starting point has an offset of 2*safety_distance + // because the original ray has also had an offset auto q2 = m.query_ray_hit(ps + (q.distance() + 2*sd)*n, n); hits[i] = q2; } } else hits[i] = q; }); - auto mit = std::min_element(hits.begin(), hits.end(), - [](const HitResult& hr1, - const HitResult& hr2) - { - return hr1.distance() < hr2.distance(); - }); + auto mit = std::min_element(hits.begin(), hits.end()); return *mit; } @@ -1132,13 +1138,18 @@ class SLASupportTree::Algorithm { // If the function is used for headless sticks, the ins_check parameter // have to be true as the beginning of the stick might be inside the model // geometry. + // The return value is the hit result from the ray casting. If the starting + // point was inside the model, an "invalid" hit_result will be returned + // with a zero distance value instead of a NAN. This way the result can + // be used safely for comparison with other distances. EigenMesh3D::hit_result bridge_mesh_intersect( const Vec3d& s, const Vec3d& dir, double r, - bool ins_check = false, - unsigned samples = 4) + bool ins_check = false) { + static const size_t SAMPLES = 8; + // helper vector calculations Vec3d a(0, 1, 0), b; const double& sd = m_cfg.safety_distance_mm; @@ -1160,14 +1171,14 @@ class SLASupportTree::Algorithm { } // circle portions - std::vector phis(samples); + std::array phis; for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); auto& m = m_mesh; using HitResult = EigenMesh3D::hit_result; // Hit results - std::vector hits(samples, HitResult(m)); + std::array hits; tbb::parallel_for(size_t(0), phis.size(), [&m, &phis, a, b, sd, dir, r, s, ins_check, &hits] @@ -1189,7 +1200,7 @@ class SLASupportTree::Algorithm { auto hr = m.query_ray_hit(p + sd*dir, dir); if(ins_check && hr.is_inside()) { - if(hr.distance() > 2*r) phi = 0; + if(hr.distance() > 2*r) hits[i] = HitResult(0.0); else { // re-cast the ray from the outside of the object auto hr2 = @@ -1200,12 +1211,7 @@ class SLASupportTree::Algorithm { } else hits[i] = hr; }); - auto mit = std::min_element(hits.begin(), hits.end(), - [](const HitResult& hr1, - const HitResult& hr2) - { - return hr1.distance() < hr2.distance(); - }); + auto mit = std::min_element(hits.begin(), hits.end()); return *mit; } @@ -1442,7 +1448,7 @@ public: polar = std::max(polar, 3*PI / 4); // save the head (pinpoint) position - Vec3d hp = m_points.row(i); + Vec3d hp = m_points.row(fidx); double w = m_cfg.head_width_mm + m_cfg.head_back_radius_mm + @@ -1492,12 +1498,14 @@ public: bound(-PI, PI) // azimuth can be a full search ); - t = oresult.score; - polar = std::get<0>(oresult.optimum); - azimuth = std::get<1>(oresult.optimum); - nn = Vec3d(std::cos(azimuth) * std::sin(polar), - std::sin(azimuth) * std::sin(polar), - std::cos(polar)).normalized(); + if(oresult.score > w) { + polar = std::get<0>(oresult.optimum); + azimuth = std::get<1>(oresult.optimum); + nn = Vec3d(std::cos(azimuth) * std::sin(polar), + std::sin(azimuth) * std::sin(polar), + std::cos(polar)).normalized(); + t = oresult.score; + } } // save the verified and corrected normal @@ -1829,6 +1837,8 @@ public: double d = 0, tdown = 0; Vec3d dirdown(0.0, 0.0, -1.0); + t = std::min(t, m_cfg.max_bridge_length_mm); + while(d < t && !std::isinf(tdown = bridge_mesh_intersect( hjp + d*head.dir, dirdown, head.r_back_mm))) { @@ -1881,12 +1891,16 @@ public: ); d = 0; t = oresult.score; + + polar = std::get<0>(oresult.optimum); azimuth = std::get<1>(oresult.optimum); Vec3d bridgedir = Vec3d(std::cos(azimuth) * std::sin(polar), std::sin(azimuth) * std::sin(polar), std::cos(polar)).normalized(); + t = std::min(t, m_cfg.max_bridge_length_mm); + while(d < t && !std::isinf(tdown = bridge_mesh_intersect( hjp + d*bridgedir, dirdown, diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index e1d5449a9..54e934f3a 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -82,7 +82,7 @@ struct SupportConfig { double normal_cutoff_angle = 150.0 * M_PI / 180.0; // The shortest distance of any support structure from the model surface - double safety_distance_mm = 0.001; + double safety_distance_mm = 0.1; }; struct PoolConfig; From f2f513dd3e1077c8b36c0a3f5c083ff2e4ea7eb8 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 1 Mar 2019 19:19:05 +0100 Subject: [PATCH 017/236] Trying to improve pillar connectivity. --- src/libslic3r/SLA/SLASupportTree.cpp | 63 +++++++++++++++------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index d2c9a9f6b..d264c3012 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1218,7 +1218,7 @@ class SLASupportTree::Algorithm { // Helper function for interconnecting two pillars with zig-zag bridges. // This is not an individual step. - void interconnect(const Pillar& pillar, const Pillar& nextpillar) + bool interconnect(const Pillar& pillar, const Pillar& nextpillar) { const Head& phead = m_result.pillar_head(pillar.id); const Head& nextphead = m_result.pillar_head(nextpillar.id); @@ -1234,43 +1234,48 @@ class SLASupportTree::Algorithm { double chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r); double bridge_distance = pillar_dist / std::cos(-m_cfg.bridge_slope); + bool was_connected = false; // If the pillars are so close that they touch each other, // there is no need to bridge them together. if(pillar_dist > 2*m_cfg.head_back_radius_mm && - bridge_distance < m_cfg.max_bridge_length_mm) + bridge_distance < m_cfg.max_bridge_length_mm) { while(sj(Z) > pillar.endpoint(Z) + m_cfg.base_radius_mm && ej(Z) > nextpillar.endpoint(Z) + m_cfg.base_radius_mm) - { - if(chkd >= bridge_distance) { - m_result.add_bridge(sj, ej, pillar.r); + { + if(chkd >= bridge_distance) { + m_result.add_bridge(sj, ej, pillar.r); + was_connected = true; - auto pcm = m_cfg.pillar_connection_mode; + auto pcm = m_cfg.pillar_connection_mode; - // double bridging: (crosses) - if( pcm == PillarConnectionMode::cross || - (pcm == PillarConnectionMode::dynamic && - pillar_dist > 2*m_cfg.base_radius_mm)) - { - // If the columns are close together, no need to - // double bridge them - Vec3d bsj(ej(X), ej(Y), sj(Z)); - Vec3d bej(sj(X), sj(Y), ej(Z)); + // double bridging: (crosses) + if( pcm == PillarConnectionMode::cross || + (pcm == PillarConnectionMode::dynamic && + pillar_dist > 2*m_cfg.base_radius_mm)) + { + // If the columns are close together, no need to + // double bridge them + Vec3d bsj(ej(X), ej(Y), sj(Z)); + Vec3d bej(sj(X), sj(Y), ej(Z)); - // need to check collision for the cross stick - double backchkd = bridge_mesh_intersect( - bsj, dirv(bsj, bej), pillar.r); + // need to check collision for the cross stick + double backchkd = bridge_mesh_intersect( + bsj, dirv(bsj, bej), pillar.r); - if(backchkd >= bridge_distance) { - m_result.add_bridge(bsj, bej, pillar.r); + if(backchkd >= bridge_distance) { + m_result.add_bridge(bsj, bej, pillar.r); + } } } + sj.swap(ej); + ej(Z) = sj(Z) + zstep; + chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r); } - sj.swap(ej); - ej(Z) = sj(Z) + zstep; - chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r); } + + return was_connected; } long search_nearest(const Vec3d& querypoint) @@ -1737,12 +1742,14 @@ public: // fashioned connections between pillars for(unsigned i : ring) { m_thr(); const Pillar& outerpill = m_result.head_pillar(i); - auto res = innerring.nearest(outerpill.endpoint, 1); - if(res.empty()) continue; - auto ne = res.front(); - const Pillar& innerpill = m_result.pillars()[ne.second]; - interconnect(outerpill, innerpill); + auto res = innerring.nearest(outerpill.endpoint, + unsigned(innerring.size())); + + for(auto& ne : res) { + const Pillar& innerpill = m_result.pillars()[ne.second]; + if(interconnect(outerpill, innerpill)) break; + } } } From 12c91f4283c01ba7f18ef02de29e653e5e26c846 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 4 Mar 2019 10:44:40 +0100 Subject: [PATCH 018/236] Removed reset of gcode preview from schedule_background_process() --- src/slic3r/GUI/Plater.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7a41e06e5..87b41c238 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1997,9 +1997,6 @@ void Plater::priv::schedule_background_process() this->background_process_timer.Start(500, wxTIMER_ONE_SHOT); // Notify the Canvas3D that something has changed, so it may invalidate some of the layer editing stuff. this->view3D->get_canvas3d()->set_config(this->config); - // Reset gcode preview - this->preview->get_canvas3d()->reset_volumes(); - this->preview->get_canvas3d()->reset_legend_texture(); } void Plater::priv::update_print_volume_state() From 06c2b4bdf3d2b5968df38f4d359504d74c5eb1a0 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 4 Mar 2019 11:00:52 +0100 Subject: [PATCH 019/236] Allow to drag object's subparts once selected using the sidebar table --- src/slic3r/GUI/GLCanvas3D.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index b51662325..29d72687b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -896,7 +896,11 @@ void GLCanvas3D::Selection::add(unsigned int volume_idx, bool as_single_selectio if (needs_reset) clear(); - m_mode = volume->is_modifier ? Volume : Instance; + if (volume->is_modifier) + m_mode = Volume; + else if (!contains_volume(volume_idx)) + m_mode = Instance; + // else -> keep current mode switch (m_mode) { From 8050b93bf9af751de19103038bb90cb60c99fcf5 Mon Sep 17 00:00:00 2001 From: Maeyanie Date: Sat, 2 Mar 2019 01:40:24 -0500 Subject: [PATCH 020/236] Fix compile error At least on my system (Fedora 28) gcc gave a compile error for std::vector being used here despite being undefined. Adding the appropriate include fixes the problem, and seems unlikely to cause any other problems. --- src/slic3r/GUI/KBShortcutsDialog.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/KBShortcutsDialog.hpp b/src/slic3r/GUI/KBShortcutsDialog.hpp index c5f60f0b8..d8905e1ce 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.hpp +++ b/src/slic3r/GUI/KBShortcutsDialog.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace Slic3r { namespace GUI { From 4b134b29e63bc8951136bc342b7a1d868fdb77c2 Mon Sep 17 00:00:00 2001 From: Maeyanie Date: Sat, 2 Mar 2019 01:45:20 -0500 Subject: [PATCH 021/236] Fix compile error, part 2 Another undefined use of std::vector --- src/slic3r/GUI/GUI_ObjectSettings.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/GUI_ObjectSettings.hpp b/src/slic3r/GUI/GUI_ObjectSettings.hpp index 3e72713bf..12115e208 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.hpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.hpp @@ -2,6 +2,7 @@ #define slic3r_GUI_ObjectSettings_hpp_ #include +#include #include class wxBoxSizer; From bc65827499c66b77dfc5001599a18421958eada5 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 4 Mar 2019 12:21:00 +0100 Subject: [PATCH 022/236] ImGUI wrapper text and combo methods shall accept std::string in UTF8 format. --- src/slic3r/GUI/ImGuiWrapper.cpp | 31 +++++++++++++++++++++++++++++-- src/slic3r/GUI/ImGuiWrapper.hpp | 3 +++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 7f95b6c28..78a3f9db8 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -239,10 +239,19 @@ bool ImGuiWrapper::checkbox(const wxString &label, bool &value) return ImGui::Checkbox(label_utf8.c_str(), &value); } +void ImGuiWrapper::text(const char *label) +{ + ImGui::Text(label, NULL); +} + +void ImGuiWrapper::text(const std::string &label) +{ + this->text(label.c_str()); +} + void ImGuiWrapper::text(const wxString &label) { - auto label_utf8 = into_u8(label); - ImGui::Text(label_utf8.c_str(), NULL); + this->text(into_u8(label).c_str()); } @@ -267,6 +276,24 @@ bool ImGuiWrapper::combo(const wxString& label, const std::vector& opt return false; } +bool ImGuiWrapper::combo(const wxString& label, const std::vector& options, std::string& selection) +{ + // this is to force the label to the left of the widget: + text(label); + ImGui::SameLine(); + + if (ImGui::BeginCombo("", selection.c_str())) { + for (const std::string& option : options) { + bool is_selected = (selection.empty()) ? false : (option == selection); + if (ImGui::Selectable(option.c_str(), is_selected)) + selection = option; + } + ImGui::EndCombo(); + return true; + } + return false; +} + void ImGuiWrapper::disabled_begin(bool disabled) { wxCHECK_RET(!m_disabled, "ImGUI: Unbalanced disabled_begin() call"); diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index 2cadc773c..8698b480d 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -57,7 +57,10 @@ public: bool input_double(const std::string &label, const double &value, const std::string &format = "%.3f"); bool input_vec3(const std::string &label, const Vec3d &value, float width, const std::string &format = "%.3f"); bool checkbox(const wxString &label, bool &value); + void text(const const char *label); + void text(const std::string &label); void text(const wxString &label); + bool combo(const wxString& label, const std::vector& options, std::string& current_selection); bool combo(const wxString& label, const std::vector& options, wxString& current_selection); void disabled_begin(bool disabled); From 9c5194c89b92e2a0bf24056df6e8bb8db11d2587 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 4 Mar 2019 09:41:25 +0100 Subject: [PATCH 023/236] An attempt to fix an OSX crash when manipulating the ImGui sliders --- src/slic3r/GUI/GLGizmo.cpp | 10 ++++++---- src/slic3r/GUI/GUI_ObjectList.cpp | 11 +++++++++-- src/slic3r/GUI/GUI_ObjectList.hpp | 4 ++++ src/slic3r/GUI/GUI_Preview.cpp | 3 ++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 7a64e5f45..c485c90e7 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -2365,8 +2365,10 @@ RENDER_AGAIN: } if (value_changed) { // Update side panel - wxGetApp().obj_settings()->UpdateAndShow(true); - wxGetApp().obj_list()->update_settings_items(); + wxTheApp->CallAfter([]() { + wxGetApp().obj_settings()->UpdateAndShow(true); + wxGetApp().obj_list()->update_settings_items(); + }); } bool generate = m_imgui->button(_(L("Auto-generate points [A]"))); @@ -2400,7 +2402,7 @@ RENDER_AGAIN: if (remove_selected || remove_all) { force_refresh = false; - m_parent.reload_scene(true); + m_parent.set_as_dirty(); if (remove_all) select_point(AllPoints); delete_selected_points(remove_all); @@ -2413,7 +2415,7 @@ RENDER_AGAIN: } if (force_refresh) - m_parent.reload_scene(true); + m_parent.set_as_dirty(); } #endif // ENABLE_IMGUI diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 082ea42c6..0857265f3 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -376,7 +376,8 @@ void ObjectList::selection_changed() fix_multiselection_conflicts(); // update object selection on Plater - update_selections_on_canvas(); + if (!m_prevent_canvas_selection_update) + update_selections_on_canvas(); // to update the toolbar and info sizer if (!GetSelection() || m_objects_model->GetItemType(GetSelection()) == itObject) { @@ -2129,6 +2130,10 @@ bool ObjectList::has_multi_part_objects() void ObjectList::update_settings_items() { + m_prevent_canvas_selection_update = true; + wxDataViewItemArray sel; + GetSelections(sel); // stash selection + wxDataViewItemArray items; m_objects_model->GetChildren(wxDataViewItem(0), items); @@ -2136,7 +2141,9 @@ void ObjectList::update_settings_items() const wxDataViewItem& settings_item = m_objects_model->GetSettingsItem(item); select_item(settings_item ? settings_item : m_objects_model->AddSettingsChild(item)); } - UnselectAll(); + // restore selection: + SetSelections(sel); + m_prevent_canvas_selection_update = false; } void ObjectList::update_object_menu() diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 138bacac4..7d14eb13f 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -127,6 +127,10 @@ class ObjectList : public wxDataViewCtrl bool m_prevent_update_extruder_in_config = false; // We use this flag to avoid updating of the extruder value in config // during updating of the extruder count. + bool m_prevent_canvas_selection_update = false; // This flag prevents changing selection on the canvas. See function + // update_settings_items - updating canvas selection is undesirable, + // because it would turn off the gizmos (mainly a problem for the SLA gizmo) + bool m_parts_changed = false; bool m_part_settings_changed = false; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 22def0623..4f6d89244 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -191,7 +191,8 @@ void View3D::reload_scene(bool refresh_immediately, bool force_full_scene_refres void View3D::render() { if (m_canvas != nullptr) - m_canvas->render(); + //m_canvas->render(); + m_canvas->set_as_dirty(); } Preview::Preview(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process_func) From 58e4ace6993b70b602a33d9ddeabd4df938c8286 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 4 Mar 2019 12:59:20 +0100 Subject: [PATCH 024/236] Fixed a typo --- src/slic3r/GUI/ImGuiWrapper.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index 8698b480d..333b66ed4 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -57,7 +57,7 @@ public: bool input_double(const std::string &label, const double &value, const std::string &format = "%.3f"); bool input_vec3(const std::string &label, const Vec3d &value, float width, const std::string &format = "%.3f"); bool checkbox(const wxString &label, bool &value); - void text(const const char *label); + void text(const char *label); void text(const std::string &label); void text(const wxString &label); bool combo(const wxString& label, const std::vector& options, std::string& current_selection); From 319a48f42df9ee99ab70d4fbeb07156442071a3b Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 4 Mar 2019 14:21:52 +0100 Subject: [PATCH 025/236] Added svg icons for view toolbar and gismos --- resources/icons/cut.svg | 28 +++++++++++++++++++ resources/icons/editor.svg | 20 +++++++++++++ resources/icons/move.svg | 42 ++++++++++++++++++++++++++++ resources/icons/place.svg | 32 +++++++++++++++++++++ resources/icons/preview.svg | 48 ++++++++++++++++++++++++++++++++ resources/icons/rotate.svg | 25 +++++++++++++++++ resources/icons/scale.svg | 38 +++++++++++++++++++++++++ resources/icons/sla_supports.svg | 42 ++++++++++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 12 ++++---- src/slic3r/GUI/Plater.cpp | 4 +-- 10 files changed, 283 insertions(+), 8 deletions(-) create mode 100644 resources/icons/cut.svg create mode 100644 resources/icons/editor.svg create mode 100644 resources/icons/move.svg create mode 100644 resources/icons/place.svg create mode 100644 resources/icons/preview.svg create mode 100644 resources/icons/rotate.svg create mode 100644 resources/icons/scale.svg create mode 100644 resources/icons/sla_supports.svg diff --git a/resources/icons/cut.svg b/resources/icons/cut.svg new file mode 100644 index 000000000..c5c952742 --- /dev/null +++ b/resources/icons/cut.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/resources/icons/editor.svg b/resources/icons/editor.svg new file mode 100644 index 000000000..5866ce055 --- /dev/null +++ b/resources/icons/editor.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/resources/icons/move.svg b/resources/icons/move.svg new file mode 100644 index 000000000..019ea8ca7 --- /dev/null +++ b/resources/icons/move.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/place.svg b/resources/icons/place.svg new file mode 100644 index 000000000..6acc2451e --- /dev/null +++ b/resources/icons/place.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/preview.svg b/resources/icons/preview.svg new file mode 100644 index 000000000..658bba2c6 --- /dev/null +++ b/resources/icons/preview.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/rotate.svg b/resources/icons/rotate.svg new file mode 100644 index 000000000..508c4f39d --- /dev/null +++ b/resources/icons/rotate.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/scale.svg b/resources/icons/scale.svg new file mode 100644 index 000000000..ee9cef95a --- /dev/null +++ b/resources/icons/scale.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/sla_supports.svg b/resources/icons/sla_supports.svg new file mode 100644 index 000000000..119fb6afc --- /dev/null +++ b/resources/icons/sla_supports.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4fba8009a..95c010c45 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2476,7 +2476,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) } #if ENABLE_SVG_ICONS - GLGizmoBase* gizmo = new GLGizmoMove3D(parent, "add.svg", 0); + GLGizmoBase* gizmo = new GLGizmoMove3D(parent, "move.svg", 0); #else GLGizmoBase* gizmo = new GLGizmoMove3D(parent, 0); #endif // ENABLE_SVG_ICONS @@ -2489,7 +2489,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Move, gizmo)); #if ENABLE_SVG_ICONS - gizmo = new GLGizmoScale3D(parent, "remove.svg", 1); + gizmo = new GLGizmoScale3D(parent, "scale.svg", 1); #else gizmo = new GLGizmoScale3D(parent, 1); #endif // ENABLE_SVG_ICONS @@ -2502,7 +2502,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Scale, gizmo)); #if ENABLE_SVG_ICONS - gizmo = new GLGizmoRotate3D(parent, "delete_all.svg", 2); + gizmo = new GLGizmoRotate3D(parent, "rotate.svg", 2); #else gizmo = new GLGizmoRotate3D(parent, 2); #endif // ENABLE_SVG_ICONS @@ -2521,7 +2521,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo)); #if ENABLE_SVG_ICONS - gizmo = new GLGizmoFlatten(parent, "arrange.svg", 3); + gizmo = new GLGizmoFlatten(parent, "place.svg", 3); #else gizmo = new GLGizmoFlatten(parent, 3); #endif // ENABLE_SVG_ICONS @@ -2536,7 +2536,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Flatten, gizmo)); #if ENABLE_SVG_ICONS - gizmo = new GLGizmoCut(parent, "instance_add.svg", 4); + gizmo = new GLGizmoCut(parent, "cut.svg", 4); #else gizmo = new GLGizmoCut(parent, 4); #endif // ENABLE_SVG_ICONS @@ -2551,7 +2551,7 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent) m_gizmos.insert(GizmosMap::value_type(Cut, gizmo)); #if ENABLE_SVG_ICONS - gizmo = new GLGizmoSlaSupports(parent, "instance_remove.svg", 5); + gizmo = new GLGizmoSlaSupports(parent, "sla_supports.svg", 5); #else gizmo = new GLGizmoSlaSupports(parent, 5); #endif // ENABLE_SVG_ICONS diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index dccfa61a8..661af87f6 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2656,7 +2656,7 @@ void Plater::priv::init_view_toolbar() item.name = "3D"; #if ENABLE_SVG_ICONS - item.icon_filename = "add.svg"; + item.icon_filename = "editor.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("3D editor view") + " [" + GUI::shortkey_ctrl_prefix() + "5]"; item.sprite_id = 0; @@ -2667,7 +2667,7 @@ void Plater::priv::init_view_toolbar() item.name = "Preview"; #if ENABLE_SVG_ICONS - item.icon_filename = "remove.svg"; + item.icon_filename = "preview.svg"; #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Preview") + " [" + GUI::shortkey_ctrl_prefix() + "6]"; item.sprite_id = 1; From 02c68ed895743605a2edada6fb32e684c4e99ad2 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 4 Mar 2019 14:52:08 +0100 Subject: [PATCH 026/236] Prevented the sla gizmo dialog to overlap the bottom toolbar --- src/slic3r/GUI/GLCanvas3D.cpp | 6 ++++-- src/slic3r/GUI/GLGizmo.cpp | 22 +++++++++++++++------- src/slic3r/GUI/GLGizmo.hpp | 14 +++++++------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 29d72687b..2ad9ec851 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3029,8 +3029,10 @@ void GLCanvas3D::Gizmos::_render_overlay(const GLCanvas3D& canvas, const GLCanva float icon_size = (float)it->second->get_textures_size() * m_overlay_icons_scale * inv_zoom; GLTexture::render_texture(it->second->get_texture_id(), top_x, top_x + icon_size, top_y - icon_size, top_y); #if ENABLE_IMGUI - if (it->second->get_state() == GLGizmoBase::On) - it->second->render_input_window(2.0f * m_overlay_border + icon_size * zoom, 0.5f * cnv_h - top_y * zoom, selection); + if (it->second->get_state() == GLGizmoBase::On) { + float toolbar_top = (float)cnv_h - canvas.m_view_toolbar->get_height(); + it->second->render_input_window(2.0f * m_overlay_border + icon_size * zoom, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); + } #endif // ENABLE_IMGUI top_y -= (icon_size + scaled_gap_y); } diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 7a64e5f45..f38f450e2 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -769,7 +769,7 @@ void GLGizmoRotate3D::on_render(const GLCanvas3D::Selection& selection) const } #if ENABLE_IMGUI -void GLGizmoRotate3D::on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection) +void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI Vec3d rotation(Geometry::rad2deg(m_gizmos[0].get_angle()), Geometry::rad2deg(m_gizmos[1].get_angle()), Geometry::rad2deg(m_gizmos[2].get_angle())); @@ -1056,7 +1056,7 @@ void GLGizmoScale3D::on_render_for_picking(const GLCanvas3D::Selection& selectio } #if ENABLE_IMGUI -void GLGizmoScale3D::on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection) +void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI bool single_instance = selection.is_single_full_instance(); @@ -1307,7 +1307,7 @@ void GLGizmoMove3D::on_render_for_picking(const GLCanvas3D::Selection& selection } #if ENABLE_IMGUI -void GLGizmoMove3D::on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection) +void GLGizmoMove3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI bool show_position = selection.is_single_full_instance(); @@ -2272,7 +2272,7 @@ std::vector GLGizmoSlaSupports::get_config_options(const std::vec #if ENABLE_IMGUI -void GLGizmoSlaSupports::on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection) +void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { if (!m_model_object) return; @@ -2281,8 +2281,13 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, const GLCanvas // so it is not delayed until the background process finishes. RENDER_AGAIN: m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + + static const ImVec2 window_size(285.f, 260.f); + ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); + ImGui::SetNextWindowSize(ImVec2(window_size)); + m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove |/* ImGuiWindowFlags_NoResize | */ImGuiWindowFlags_NoCollapse); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); ImGui::PushItemWidth(100.0f); @@ -2538,6 +2543,7 @@ void GLGizmoSlaSupports::editing_mode_reload_cache() m_editing_mode_cache.clear(); for (const sla::SupportPoint& point : m_model_object->sla_support_points) m_editing_mode_cache.push_back(std::make_pair(point, false)); + m_unsaved_changes = false; } @@ -2585,7 +2591,9 @@ void GLGizmoSlaSupports::auto_generate() void GLGizmoSlaSupports::switch_to_editing_mode() { - editing_mode_reload_cache(); + if (m_model_object->sla_points_status != sla::PointsStatus::AutoGenerated) + editing_mode_reload_cache(); + m_unsaved_changes = false; m_editing_mode = true; } @@ -2801,7 +2809,7 @@ void GLGizmoCut::on_render_for_picking(const GLCanvas3D::Selection& selection) c } #if ENABLE_IMGUI -void GLGizmoCut::on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection) +void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); m_imgui->set_next_window_bg_alpha(0.5f); diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp index 18ddbac69..9d7472d21 100644 --- a/src/slic3r/GUI/GLGizmo.hpp +++ b/src/slic3r/GUI/GLGizmo.hpp @@ -144,7 +144,7 @@ public: #endif // not ENABLE_IMGUI #if ENABLE_IMGUI - void render_input_window(float x, float y, const GLCanvas3D::Selection& selection) { on_render_input_window(x, y, selection); } + void render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { on_render_input_window(x, y, bottom_limit, selection); } #endif // ENABLE_IMGUI protected: @@ -163,7 +163,7 @@ protected: virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const = 0; #if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection) {} + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) {} #endif // ENABLE_IMGUI float picking_color_component(unsigned int id) const; @@ -296,7 +296,7 @@ protected: } #if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection); + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); #endif // ENABLE_IMGUI }; @@ -333,7 +333,7 @@ protected: virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; #if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection); + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); #endif // ENABLE_IMGUI private: @@ -380,7 +380,7 @@ protected: virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; #if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection); + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); #endif // ENABLE_IMGUI private: @@ -528,7 +528,7 @@ protected: void on_start_dragging(const GLCanvas3D::Selection& selection) override; #if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection) override; + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) override; #endif // ENABLE_IMGUI virtual std::string on_get_name() const; @@ -579,7 +579,7 @@ protected: virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; #if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, const GLCanvas3D::Selection& selection); + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); #endif // ENABLE_IMGUI private: void update_max_z(const GLCanvas3D::Selection& selection) const; From cc79b1553daa4f13fb60719c469191565da5a970 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 4 Mar 2019 15:28:04 +0100 Subject: [PATCH 027/236] Implemented caching of SlicingParameters by PrintObject --- src/libslic3r/Print.hpp | 4 +++- src/libslic3r/PrintObject.cpp | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 3de91818a..2f85da96b 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -93,7 +93,7 @@ public: const LayerPtrs& layers() const { return m_layers; } const SupportLayerPtrs& support_layers() const { return m_support_layers; } const Transform3d& trafo() const { return m_trafo; } - const Points& copies() const { return m_copies; } + const Points& copies() const { return m_copies; } // since the object is aligned to origin, bounding box coincides with size BoundingBox bounding_box() const { return BoundingBox(Point(0,0), to_2d(this->size)); } @@ -161,6 +161,7 @@ protected: bool invalidate_all_steps(); // Invalidate steps based on a set of parameters changed. bool invalidate_state_by_config_options(const std::vector &opt_keys); + SlicingParameters slicing_parameters_internal() const; static PrintObjectConfig object_config_from_model_object(const PrintObjectConfig &default_object_config, const ModelObject &object, size_t num_extruders); static PrintRegionConfig region_config_from_model_volume(const PrintRegionConfig &default_region_config, const ModelVolume &volume, size_t num_extruders); @@ -195,6 +196,7 @@ private: // for external callers) Point m_copies_shift; + SlicingParameters m_slicing_params; LayerPtrs m_layers; SupportLayerPtrs m_support_layers; diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 55eba0931..5e46bb753 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -104,7 +104,8 @@ void PrintObject::slice() return; m_print->set_status(10, "Processing triangulated mesh"); std::vector layer_height_profile; - this->update_layer_height_profile(*this->model_object(), this->slicing_parameters(), layer_height_profile); + m_slicing_params = this->slicing_parameters_internal(); + this->update_layer_height_profile(*this->model_object(), m_slicing_params, layer_height_profile); m_print->throw_if_canceled(); this->_slice(layer_height_profile); m_print->throw_if_canceled(); @@ -1360,13 +1361,18 @@ PrintRegionConfig PrintObject::region_config_from_model_volume(const PrintRegion return config; } -SlicingParameters PrintObject::slicing_parameters() const +SlicingParameters PrintObject::slicing_parameters_internal() const { return SlicingParameters::create_from_config( this->print()->config(), m_config, unscale(this->size(2)), this->object_extruders()); } +SlicingParameters PrintObject::slicing_parameters() const +{ + return this->is_step_done(posSlice) ? m_slicing_params : this->slicing_parameters_internal(); +} + SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig &full_config, const ModelObject &model_object) { PrintConfig print_config; @@ -1451,23 +1457,21 @@ void PrintObject::_slice(const std::vector &layer_height_profile) tbb_init = new tbb::task_scheduler_init(1); #endif - SlicingParameters slicing_params = this->slicing_parameters(); - // 1) Initialize layers and their slice heights. std::vector slice_zs; { this->clear_layers(); // Object layers (pairs of bottom/top Z coordinate), without the raft. - std::vector object_layers = generate_object_layers(slicing_params, layer_height_profile); + std::vector object_layers = generate_object_layers(m_slicing_params, layer_height_profile); // Reserve object layers for the raft. Last layer of the raft is the contact layer. - int id = int(slicing_params.raft_layers()); + int id = int(m_slicing_params.raft_layers()); slice_zs.reserve(object_layers.size()); Layer *prev = nullptr; for (size_t i_layer = 0; i_layer < object_layers.size(); i_layer += 2) { coordf_t lo = object_layers[i_layer]; coordf_t hi = object_layers[i_layer + 1]; coordf_t slice_z = 0.5 * (lo + hi); - Layer *layer = this->add_layer(id ++, hi - lo, hi + slicing_params.object_print_z_min, slice_z); + Layer *layer = this->add_layer(id ++, hi - lo, hi + m_slicing_params.object_print_z_min, slice_z); slice_zs.push_back(float(slice_z)); if (prev != nullptr) { prev->upper_layer = layer; @@ -2246,7 +2250,7 @@ void PrintObject::combine_infill() void PrintObject::_generate_support_material() { - PrintObjectSupportMaterial support_material(this, PrintObject::slicing_parameters()); + PrintObjectSupportMaterial support_material(this, m_slicing_params); support_material.generate(*this); } From b2f10ec8640a707dd8cfe8de7f48c4fa6ee27014 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 4 Mar 2019 15:29:07 +0100 Subject: [PATCH 028/236] Fixed a bug, where a bounding box volume was shown at the side bar instead of volume of the mesh. --- src/slic3r/GUI/Plater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 87b41c238..e90752e19 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -813,7 +813,7 @@ void Sidebar::show_info_sizer() p->object_info->info_materials->SetLabel(wxString::Format("%d", static_cast(model_object->materials_count()))); auto& stats = model_object->volumes.front()->mesh.stl.stats; - p->object_info->info_volume->SetLabel(wxString::Format("%.2f", size(0) * size(1) * size(2))); + p->object_info->info_volume->SetLabel(wxString::Format("%.2f", stats.volume)); p->object_info->info_facets->SetLabel(wxString::Format(_(L("%d (%d shells)")), static_cast(model_object->facets_count()), stats.number_of_parts)); int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + From 6f0efd11688fff890be75e9000e7200180a2c7af Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 4 Mar 2019 12:52:30 +0100 Subject: [PATCH 029/236] Fixed a bug in a printer preset updating --- src/slic3r/GUI/Tab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d4c6a051d..632627eba 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2596,7 +2596,7 @@ void Tab::select_preset(std::string preset_name) // The preset will be switched to a different, compatible preset, or the '-- default --'. if (pu.technology == new_printer_technology) m_dependent_tabs.emplace_back(pu.tab_type); - if (pu.old_preset_dirty) + if (pu.old_preset_dirty && !pu.new_preset_compatible) pu.presets->discard_current_changes(); } } From 7f35f45e476b14b4aae61e3effca93e9eec35e41 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 4 Mar 2019 15:34:22 +0100 Subject: [PATCH 030/236] Bumped up the year in About Dialog. --- src/slic3r/GUI/AboutDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index fb57cfeb9..db2e76736 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -92,8 +92,8 @@ AboutDialog::AboutDialog() "" "" "" - "Copyright © 2016-2018 Prusa Research.
" - "Copyright © 2011-2017 Alessandro Ranellucci.
" + "Copyright © 2016-2019 Prusa Research.
" + "Copyright © 2011-2018 Alessandro Ranellucci.
" "Slic3r is licensed under the " "GNU Affero General Public License, version 3." "

" From 826a3cdbd21c7e47e728b8e0564c03b7e99dd5f2 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 4 Mar 2019 16:05:29 +0100 Subject: [PATCH 031/236] Technology for svg icons moved to next alpha (8) --- src/libslic3r/Technologies.hpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 451a0b27c..e978b5838 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -49,7 +49,14 @@ // Printbed textures generated from svg files #define ENABLE_TEXTURES_FROM_SVG (1 && ENABLE_1_42_0_ALPHA7) + + +//==================== +// 1.42.0.alpha8 techs +//==================== +#define ENABLE_1_42_0_ALPHA8 1 + // Toolbars and Gizmos use icons imported from svg files -#define ENABLE_SVG_ICONS (1 && ENABLE_TEXTURES_FROM_SVG) +#define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) #endif // _technologies_h_ From c2d5a8d03b4974fe2793eb666f296b7d318347db Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 4 Mar 2019 18:32:28 +0100 Subject: [PATCH 032/236] Working on improved interconnection strategy --- src/libslic3r/SLA/SLASupportTree.cpp | 296 +++++++++++++++--------- src/libslic3r/SLA/SLASupportTreeIGL.cpp | 89 +++++++ 2 files changed, 277 insertions(+), 108 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index d264c3012..7ffa2274a 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -594,6 +594,10 @@ inline ClusteredPoints cluster( return cluster(points, indices, pred, max_points); } +ClusteredPoints cluster_nearest2d( + const PointSet& points, const std::vector& indices, + double dist, + unsigned max_points = 0); // This class will hold the support tree meshes with some additional bookkeeping // as well. Various parts of the support geometry are stored separately and are @@ -818,6 +822,9 @@ long cluster_centroid(const ClusterEl& clust, // distance for the two points and add the distance to the averages. // The point with the smallest average than wins. + // The complexity should be O(n^2) but we will mostly apply this function + // for small clusters only (cca 3 elements) + std::vector sel(clust.size(), false); // create full zero bitmask std::fill(sel.end() - 2, sel.end(), true); // insert the two ones std::vector avgs(clust.size(), 0.0); // store the average distances @@ -1217,68 +1224,109 @@ class SLASupportTree::Algorithm { } // Helper function for interconnecting two pillars with zig-zag bridges. - // This is not an individual step. bool interconnect(const Pillar& pillar, const Pillar& nextpillar) { + // Get the starting heads corresponding to the given pillars const Head& phead = m_result.pillar_head(pillar.id); const Head& nextphead = m_result.pillar_head(nextpillar.id); - Vec3d sj = phead.junction_point(); - sj(Z) = std::min(sj(Z), nextphead.junction_point()(Z)); - Vec3d ej = nextpillar.endpoint; - double pillar_dist = distance(Vec2d{sj(X), sj(Y)}, - Vec2d{ej(X), ej(Y)}); - double zstep = pillar_dist * std::tan(-m_cfg.bridge_slope); - ej(Z) = sj(Z) + zstep; - - double chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r); - - double bridge_distance = pillar_dist / std::cos(-m_cfg.bridge_slope); + // We need to get the starting point of the zig-zag pattern. We have to + // be aware that the two head junctions are at different heights. We + // may start from the lowest junction and call it a day but this + // strategy would leave unconnected a lot of pillar duos where the + // shorter pillar is too short to start a new bridge but the taller + // pillar could still be bridged with the shorter one. bool was_connected = false; - // If the pillars are so close that they touch each other, - // there is no need to bridge them together. - if(pillar_dist > 2*m_cfg.head_back_radius_mm && - bridge_distance < m_cfg.max_bridge_length_mm) { - while(sj(Z) > pillar.endpoint(Z) + m_cfg.base_radius_mm && - ej(Z) > nextpillar.endpoint(Z) + m_cfg.base_radius_mm) + Vec3d supper = phead.junction_point(); + Vec3d slower = nextphead.junction_point(); + Vec3d eupper = pillar.endpoint; + Vec3d elower = nextpillar.endpoint; + + double zmin = m_result.ground_level + m_cfg.base_height_mm; + eupper(Z) = std::max(eupper(Z), zmin); + elower(Z) = std::max(elower(Z), zmin); + + // The usable length of both pillars should be positive + if(slower(Z) - elower(Z) < 0) return false; + if(supper(Z) - eupper(Z) < 0) return false; + + double pillar_dist = distance(Vec2d{slower(X), slower(Y)}, + Vec2d{supper(X), supper(Y)}); + double bridge_distance = pillar_dist / std::cos(-m_cfg.bridge_slope); + double zstep = pillar_dist * std::tan(-m_cfg.bridge_slope); + + if(pillar_dist < 2*m_cfg.head_back_radius_mm) return false; + if(bridge_distance > m_cfg.max_bridge_length_mm) return false; + + if(supper(Z) < slower(Z)) supper.swap(slower); + if(eupper(Z) < elower(Z)) eupper.swap(elower); + + double startz = 0, endz = 0; + + startz = slower(Z) - zstep < supper(Z) ? slower(Z) - zstep : slower(Z); + endz = eupper(Z) + zstep > elower(Z) ? eupper(Z) + zstep : eupper(Z); + + if(slower(Z) - eupper(Z) < std::abs(zstep)) { // no space for even one cross + + // Get max available space + startz = std::min(supper(Z), slower(Z) - zstep); + endz = std::max(eupper(Z) + zstep, elower(Z)); + + // Align to center + double available_dist = (startz - endz); + double rounds = std::floor(available_dist / std::abs(zstep)); + startz -= 0.5 * (available_dist - rounds * std::abs(zstep));; + } + + auto pcm = m_cfg.pillar_connection_mode; + bool docrosses = + pcm == PillarConnectionMode::cross || + (pcm == PillarConnectionMode::dynamic && + pillar_dist > 2*m_cfg.base_radius_mm); + + // 'sj' means starting junction, 'ej' is the end junction of a bridge. + // They will be swapped in every iteration thus the zig-zag pattern. + // According to a config parameter, a second bridge may be added which + // results in a cross connection between the pillars. + Vec3d sj = supper, ej = slower; sj(Z) = startz; ej(Z) = sj(Z) + zstep; + + while(ej(Z) >= endz) { + if(bridge_mesh_intersect(sj, + dirv(sj, ej), + pillar.r) >= bridge_distance) { - if(chkd >= bridge_distance) { - m_result.add_bridge(sj, ej, pillar.r); - was_connected = true; - - auto pcm = m_cfg.pillar_connection_mode; - - // double bridging: (crosses) - if( pcm == PillarConnectionMode::cross || - (pcm == PillarConnectionMode::dynamic && - pillar_dist > 2*m_cfg.base_radius_mm)) - { - // If the columns are close together, no need to - // double bridge them - Vec3d bsj(ej(X), ej(Y), sj(Z)); - Vec3d bej(sj(X), sj(Y), ej(Z)); - - // need to check collision for the cross stick - double backchkd = bridge_mesh_intersect( - bsj, dirv(bsj, bej), pillar.r); - - - if(backchkd >= bridge_distance) { - m_result.add_bridge(bsj, bej, pillar.r); - } - } - } - sj.swap(ej); - ej(Z) = sj(Z) + zstep; - chkd = bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r); + m_result.add_bridge(sj, ej, pillar.r); + was_connected = true; } + + // double bridging: (crosses) + if(docrosses) { + Vec3d sjback(ej(X), ej(Y), sj(Z)); + Vec3d ejback(sj(X), sj(Y), ej(Z)); + if(sjback(Z) <= slower(Z) && ejback(Z) >= eupper(Z) && + bridge_mesh_intersect(sjback, + dirv(sjback, ejback), + pillar.r) >= bridge_distance) + { + // need to check collision for the cross stick + m_result.add_bridge(sjback, ejback, pillar.r); + was_connected = true; + } + } + + sj.swap(ej); + ej(Z) = sj(Z) + zstep; } return was_connected; } - long search_nearest(const Vec3d& querypoint) + // Search for the nearest pillar to the given query point which is not + // further than max_dist. The result is the pillar ID or -1 if nothing was + // found. The pillar search is carried out using the m_pillar_index + // structure. + long search_nearest(const Vec3d& querypoint, double max_dist) { SpatIndex spindex = m_pillar_index; @@ -1318,7 +1366,7 @@ class SLASupportTree::Algorithm { // WARNING: previously, max_bridge_length was divided by two. // I don't remember if this was intentional or by accident. There // is no logical reason why it shouldn't be used directly. - if(bridge_ep(Z) <= minz || d > m_cfg.max_bridge_length_mm) break; + if(bridge_ep(Z) <= minz || d > max_dist) break; double chkd = bridge_mesh_intersect(querypoint, dirv(querypoint, bridge_ep), @@ -1331,6 +1379,10 @@ class SLASupportTree::Algorithm { return nearest_id; } + inline long search_nearest(const Vec3d& qp) { + return search_nearest(qp, m_cfg.max_bridge_length_mm); + } + void connect_to_nearhead(const Head& head, const Head& nearhead) { Vec3d hjp = head.junction_point(); Vec3d headjp = hjp; @@ -1579,7 +1631,10 @@ public: auto hit = bridge_mesh_intersect(headjp, n, r); if(std::isinf(hit)) ground_head_indices.emplace_back(i); - else m_iheads_onmodel.emplace_back(std::make_pair(i, hit)); + else { + if(m_cfg.ground_facing_only) head.invalidate(); + m_iheads_onmodel.emplace_back(std::make_pair(i, hit)); + } } // We want to search for clusters of points that are far enough @@ -1675,7 +1730,8 @@ public: sidehead.transform(); Vec3d sidehead_jp = sidehead.junction_point(); - long nearest_id = search_nearest(sidehead_jp); + long nearest_id = search_nearest(sidehead_jp, + m_cfg.max_bridge_length_mm/2); // at this point we either have our pillar index or we have // to connect the sidehead to the ground @@ -1714,59 +1770,15 @@ public: // points spatially and create the bridge stick from one endpoint to // another. - ClusterEl rem = cl_centroids; - ClusterEl ring; - - while(!rem.empty()) { // loop until all the points belong to some ring - m_thr(); - std::sort(rem.begin(), rem.end()); - - auto& points = m_points; - auto newring = pts_convex_hull(rem, - [&points](unsigned i) { - auto&& p = points.row(i); - return Vec2d(p(X), p(Y)); // project to 2D in along Z axis - }); - - if(!ring.empty()) { - // inner ring is now in 'newring' and outer ring is in 'ring' - SpatIndex innerring; - for(unsigned i : newring) { m_thr(); - const Pillar& pill = m_result.head_pillar(i); - assert(pill.id >= 0); - innerring.insert(pill.endpoint, unsigned(pill.id)); - } - - // For all pillars in the outer ring find the closest in the - // inner ring and connect them. This will create the spider web - // fashioned connections between pillars - for(unsigned i : ring) { m_thr(); - const Pillar& outerpill = m_result.head_pillar(i); - - auto res = innerring.nearest(outerpill.endpoint, - unsigned(innerring.size())); - - for(auto& ne : res) { - const Pillar& innerpill = m_result.pillars()[ne.second]; - if(interconnect(outerpill, innerpill)) break; - } - } - } - - // no need for newring anymore in the current iteration - ring.swap(newring); - - /*std::cout << "ring: \n"; - for(auto ri : ring) { - std::cout << ri << " " << " X = " << gnd_head_pt(ri)(X) - << " Y = " << gnd_head_pt(ri)(Y) << std::endl; - } - std::cout << std::endl;*/ + double d = std::cos(m_cfg.bridge_slope) * m_cfg.max_bridge_length_mm; + auto pclusters = cluster_nearest2d(m_points, cl_centroids, d, 3); + for(auto& ring : pclusters) { // now the ring has to be connected with bridge sticks - for(auto it = ring.begin(), next = std::next(it); - next != ring.end(); - ++it, ++next) + if(ring.size() > 1) + for(auto it = ring.begin(), next = std::next(it); + next != ring.end(); + ++it, ++next) { m_thr(); const Pillar& pillar = m_result.head_pillar(*it); @@ -1774,13 +1786,81 @@ public: interconnect(pillar, nextpillar); } - auto sring = ring; ClusterEl tmp; - std::sort(sring.begin(), sring.end()); - std::set_difference(rem.begin(), rem.end(), - sring.begin(), sring.end(), - std::back_inserter(tmp)); - rem.swap(tmp); + if(ring.size() > 2) { + const Pillar& firstpillar = m_result.head_pillar(ring.front()); + const Pillar& lastpillar = m_result.head_pillar(ring.back()); + interconnect(firstpillar, lastpillar); + } + } + +// ClusterEl rem = cl_centroids; +// ClusterEl ring; + +// while(!rem.empty()) { // loop until all the points belong to some ring +// m_thr(); +// std::sort(rem.begin(), rem.end()); + +// auto& points = m_points; +// auto newring = pts_convex_hull(rem, +// [&points](unsigned i) { +// auto&& p = points.row(i); +// return Vec2d(p(X), p(Y)); // project to 2D in along Z axis +// }); + +// if(!ring.empty()) { +// // inner ring is now in 'newring' and outer ring is in 'ring' +// SpatIndex innerring; +// for(unsigned i : newring) { m_thr(); +// const Pillar& pill = m_result.head_pillar(i); +// assert(pill.id >= 0); +// innerring.insert(pill.endpoint, unsigned(pill.id)); +// } + +// // For all pillars in the outer ring find the closest in the +// // inner ring and connect them. This will create the spider web +// // fashioned connections between pillars +// for(unsigned i : ring) { m_thr(); +// const Pillar& outerpill = m_result.head_pillar(i); + +// auto res = innerring.nearest(outerpill.endpoint, +// unsigned(innerring.size())); + +// for(auto& ne : res) { +// const Pillar& innerpill = m_result.pillars()[ne.second]; +// if(interconnect(outerpill, innerpill)) break; +// } +// } +// } + +// // no need for newring anymore in the current iteration +// ring.swap(newring); + +// /*std::cout << "ring: \n"; +// for(auto ri : ring) { +// std::cout << ri << " " << " X = " << gnd_head_pt(ri)(X) +// << " Y = " << gnd_head_pt(ri)(Y) << std::endl; +// } +// std::cout << std::endl;*/ + +// // now the ring has to be connected with bridge sticks +// for(auto it = ring.begin(), next = std::next(it); +// next != ring.end(); +// ++it, ++next) +// { +// m_thr(); +// const Pillar& pillar = m_result.head_pillar(*it); +// const Pillar& nextpillar = m_result.head_pillar(*next); +// interconnect(pillar, nextpillar); +// } + +// auto sring = ring; ClusterEl tmp; +// std::sort(sring.begin(), sring.end()); +// std::set_difference(rem.begin(), rem.end(), +// sring.begin(), sring.end(), +// std::back_inserter(tmp)); +// rem.swap(tmp); +// } } // Step: routing the pinheads that would connect to the model surface diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index da2bb1b79..bd2d16215 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -347,6 +347,95 @@ PointSet normals(const PointSet& points, return ret; } +//template double distance(const Vec& p) { +// return std::sqrt(p.transpose() * p); +//} + +//template double distance(const Vec& pp1, const Vec& pp2) { +// auto p = pp2 - pp1; +// return distance(p); +//} + +// Clustering a set of points by the given criteria +ClusteredPoints cluster_nearest2d( + const sla::PointSet& points, const std::vector& indices, + double dist, + unsigned max_points = 0) +{ + + namespace bgi = boost::geometry::index; + using Index3D = bgi::rtree< SpatElement, bgi::rstar<16, 4> /* ? */ >; + + // A spatial index for querying the nearest points + Index3D sindex; + + // Build the index + for(unsigned idx : indices) { + Vec3d p = points.row(idx); p(Z) = 0; + sindex.insert( std::make_pair(points.row(idx), idx)); + } + + using Elems = std::vector; + + // Recursive function for visiting all the points in a given distance to + // each other + std::function group = + [&sindex, &group, max_points, dist](Elems& pts, Elems& cluster) + { + for(auto& p : pts) { + std::vector tmp; + + sindex.query( + bgi::nearest(p.first, max_points), + std::back_inserter(tmp) + ); + + for(auto it = tmp.begin(); it < tmp.end(); ++it) + if(distance(p.first, it->first) > dist) it = tmp.erase(it); + + auto cmp = [](const SpatElement& e1, const SpatElement& e2){ + return e1.second < e2.second; + }; + + std::sort(tmp.begin(), tmp.end(), cmp); + + Elems newpts; + std::set_difference(tmp.begin(), tmp.end(), + cluster.begin(), cluster.end(), + std::back_inserter(newpts), cmp); + + int c = max_points && newpts.size() + cluster.size() > max_points? + int(max_points - cluster.size()) : int(newpts.size()); + + cluster.insert(cluster.end(), newpts.begin(), newpts.begin() + c); + std::sort(cluster.begin(), cluster.end(), cmp); + + if(!newpts.empty() && (!max_points || cluster.size() < max_points)) + group(newpts, cluster); + } + }; + + std::vector clusters; + for(auto it = sindex.begin(); it != sindex.end();) { + Elems cluster = {}; + Elems pts = {*it}; + group(pts, cluster); + + for(auto& c : cluster) sindex.remove(c); + it = sindex.begin(); + + clusters.emplace_back(cluster); + } + + ClusteredPoints result; + for(auto& cluster : clusters) { + result.emplace_back(); + for(auto c : cluster) result.back().emplace_back(c.second); + } + + return result; +} + // Clustering a set of points by the given criteria ClusteredPoints cluster( const sla::PointSet& points, const std::vector& indices, From de0bd2ea443639e6f39c010b358155caa18f532a Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 5 Mar 2019 10:46:57 +0100 Subject: [PATCH 033/236] Fixed SLA-parameters initialization with correct current values, not default (SPE-834) --- src/slic3r/GUI/GUI_ObjectList.cpp | 29 ++++++++++++++++++----------- src/slic3r/GUI/GUI_ObjectList.hpp | 2 ++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 0857265f3..c2ff7bfb7 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -259,7 +259,7 @@ void ObjectList::update_extruder_values_for_items(const int max_extruder) void ObjectList::update_objects_list_extruder_column(int extruders_count) { if (!this) return; // #ys_FIXME - if (wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA) + if (printer_technology() == ptSLA) extruders_count = 1; wxDataViewChoiceRenderer* ch_render = dynamic_cast(GetColumn(1)->GetRenderer()); @@ -452,7 +452,7 @@ void ObjectList::show_context_menu() wxMenu* menu = type & itInstance ? &m_menu_instance : m_objects_model->GetParent(item) != wxDataViewItem(0) ? &m_menu_part : - wxGetApp().plater()->printer_technology() == ptFFF ? &m_menu_object : &m_menu_sla_object; + printer_technology() == ptFFF ? &m_menu_object : &m_menu_sla_object; if (!(type & itInstance)) append_menu_item_settings(menu); @@ -597,7 +597,7 @@ void ObjectList::OnDrop(wxDataViewEvent &event) std::vector ObjectList::get_options(const bool is_part) { - if (wxGetApp().plater()->printer_technology() == ptSLA) { + if (printer_technology() == ptSLA) { SLAPrintObjectConfig full_sla_config; auto options = full_sla_config.keys(); options.erase(find(options.begin(), options.end(), "layer_height")); @@ -616,7 +616,7 @@ std::vector ObjectList::get_options(const bool is_part) const std::vector& ObjectList::get_options_for_bundle(const wxString& bundle_name) { - const FreqSettingsBundle& bundle = wxGetApp().plater()->printer_technology() == ptSLA ? + const FreqSettingsBundle& bundle = printer_technology() == ptSLA ? FREQ_SETTINGS_BUNDLE_SLA : FREQ_SETTINGS_BUNDLE_FFF; for (auto& it : bundle) @@ -626,7 +626,7 @@ const std::vector& ObjectList::get_options_for_bundle(const wxStrin } #if 0 // if "Quick menu" is selected - FreqSettingsBundle& bundle_quick = wxGetApp().plater()->printer_technology() == ptSLA ? + FreqSettingsBundle& bundle_quick = printer_technology() == ptSLA ? m_freq_settings_sla: m_freq_settings_fff; for (auto& it : bundle_quick) @@ -644,7 +644,7 @@ void ObjectList::get_options_menu(settings_menu_hierarchy& settings_menu, const { auto options = get_options(is_part); - auto extruders_cnt = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA ? 1 : + auto extruders_cnt = printer_technology() == ptSLA ? 1 : wxGetApp().preset_bundle->printers.get_edited_preset().config.option("nozzle_diameter")->values.size(); DynamicPrintConfig config; @@ -667,6 +667,11 @@ void ObjectList::get_options_menu(settings_menu_hierarchy& settings_menu, const } } +Slic3r::PrinterTechnology ObjectList::printer_technology() const +{ + return wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology(); +} + void ObjectList::get_settings_choice(const wxString& category_name) { wxArrayString names; @@ -705,7 +710,7 @@ void ObjectList::get_settings_choice(const wxString& category_name) if (selection_cnt > 0) { // Add selected items to the "Quick menu" - FreqSettingsBundle& freq_settings = wxGetApp().plater()->printer_technology() == ptSLA ? + FreqSettingsBundle& freq_settings = printer_technology() == ptSLA ? m_freq_settings_sla : m_freq_settings_fff; bool changed_existing = false; @@ -751,7 +756,9 @@ void ObjectList::get_settings_choice(const wxString& category_name) for (auto sel : selections) selected_options.push_back((*settings_list)[sel].first); - const DynamicPrintConfig& from_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + const DynamicPrintConfig& from_config = printer_technology() == ptFFF ? + wxGetApp().preset_bundle->prints.get_edited_preset().config : + wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; for (auto& setting : (*settings_list)) { @@ -1065,10 +1072,10 @@ wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu) void ObjectList::create_freq_settings_popupmenu(wxMenu *menu) { // Add default settings bundles - const FreqSettingsBundle& bundle = wxGetApp().plater()->printer_technology() == ptFFF ? + const FreqSettingsBundle& bundle = printer_technology() == ptFFF ? FREQ_SETTINGS_BUNDLE_FFF : FREQ_SETTINGS_BUNDLE_SLA; - auto extruders_cnt = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA ? 1 : + auto extruders_cnt = printer_technology() == ptSLA ? 1 : wxGetApp().preset_bundle->printers.get_edited_preset().config.option("nozzle_diameter")->values.size(); for (auto& it : bundle) { @@ -1081,7 +1088,7 @@ void ObjectList::create_freq_settings_popupmenu(wxMenu *menu) } #if 0 // Add "Quick" settings bundles - const FreqSettingsBundle& bundle_quick = wxGetApp().plater()->printer_technology() == ptFFF ? + const FreqSettingsBundle& bundle_quick = printer_technology() == ptFFF ? m_freq_settings_fff : m_freq_settings_sla; for (auto& it : bundle_quick) { diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 7d14eb13f..9e24b4b49 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -284,6 +284,8 @@ private: std::vector get_options(const bool is_part); const std::vector& get_options_for_bundle(const wxString& bundle_name); void get_options_menu(settings_menu_hierarchy& settings_menu, const bool is_part); + + PrinterTechnology printer_technology() const ; }; From 5e582efc5ce3fcbbe92eb49771f94ba669730551 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 5 Mar 2019 11:54:04 +0100 Subject: [PATCH 034/236] Elephant foot compensation improvements. Fix of the negative XY compensation on multi-material (or multi-region) prints, where the negative XY compensation created gaps between parts. --- src/libslic3r/Flow.hpp | 14 +++-- src/libslic3r/Layer.cpp | 19 +++++++ src/libslic3r/Layer.hpp | 10 +++- src/libslic3r/LayerRegion.cpp | 24 ++++++++- src/libslic3r/PrintObject.cpp | 99 +++++++++++++++++++++++++++-------- 5 files changed, 139 insertions(+), 27 deletions(-) diff --git a/src/libslic3r/Flow.hpp b/src/libslic3r/Flow.hpp index 516490b35..4b0a846ad 100644 --- a/src/libslic3r/Flow.hpp +++ b/src/libslic3r/Flow.hpp @@ -42,14 +42,20 @@ public: bool bridge; Flow(float _w, float _h, float _nd, bool _bridge = false) : - width(_w), height(_h), nozzle_diameter(_nd), bridge(_bridge) {}; + width(_w), height(_h), nozzle_diameter(_nd), bridge(_bridge) {} float spacing() const; float spacing(const Flow &other) const; double mm3_per_mm() const; - coord_t scaled_width() const { return coord_t(scale_(this->width)); }; - coord_t scaled_spacing() const { return coord_t(scale_(this->spacing())); }; - coord_t scaled_spacing(const Flow &other) const { return coord_t(scale_(this->spacing(other))); }; + coord_t scaled_width() const { return coord_t(scale_(this->width)); } + coord_t scaled_spacing() const { return coord_t(scale_(this->spacing())); } + coord_t scaled_spacing(const Flow &other) const { return coord_t(scale_(this->spacing(other))); } + + // Elephant foot compensation spacing to be used to detect narrow parts, where the elephant foot compensation cannot be applied. + // To be used on frExternalPerimeter only. + // Enable some perimeter squish (see INSET_OVERLAP_TOLERANCE). + // Here an overlap of 0.2x external perimeter spacing is allowed for by the elephant foot compensation. + coord_t scaled_elephant_foot_spacing() const { return coord_t(0.5f * float(this->scaled_width() + 0.6f * this->scaled_spacing())); } static Flow new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent &width, float nozzle_diameter, float height, float bridge_flow_ratio); // Create a flow from the spacing of extrusion lines. diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index fa5d29692..31baaed33 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -65,6 +65,7 @@ void Layer::make_slices() this->slices.expolygons.push_back(std::move(slices[i])); } +// Merge typed slices into untyped slices. This method is used to revert the effects of detect_surfaces_type() called for posPrepareInfill. void Layer::merge_slices() { if (m_regions.size() == 1) { @@ -78,6 +79,24 @@ void Layer::merge_slices() } } +ExPolygons Layer::merged(float offset_scaled) const +{ + assert(offset_scaled >= 0.f); + // If no offset is set, apply EPSILON offset before union, and revert it afterwards. + float offset_scaled2 = 0; + if (offset_scaled == 0.f) { + offset_scaled = float( EPSILON); + offset_scaled2 = float(- EPSILON); + } + Polygons polygons; + for (LayerRegion *layerm : m_regions) + append(polygons, offset(to_expolygons(layerm->slices.surfaces), offset_scaled)); + ExPolygons out = union_ex(polygons); + if (offset_scaled2 != 0.f) + out = offset_ex(out, offset_scaled2); + return out; +} + // Here the perimeters are created cummulatively for all layer regions sharing the same parameters influencing the perimeters. // The perimeter paths and the thin fills (ExtrusionEntityCollection) are assigned to the first compatible layer region. // The resulting fill surface is split back among the originating regions. diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 78897a2db..6297b49d0 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -63,7 +63,12 @@ public: void prepare_fill_surfaces(); void make_perimeters(const SurfaceCollection &slices, SurfaceCollection* fill_surfaces); void process_external_surfaces(const Layer* lower_layer); - double infill_area_threshold() const; + double infill_area_threshold() const; + // Trim surfaces by trimming polygons. Used by the elephant foot compensation at the 1st layer. + void trim_surfaces(const Polygons &trimming_polygons); + // Single elephant foot compensation step, used by the elephant foor compensation at the 1st layer. + // Trim surfaces by trimming polygons (shrunk by an elephant foot compensation step), but don't shrink narrow parts so much that no perimeter would fit. + void elephant_foot_compensation_step(const float elephant_foot_compensation_perimeter_step, const Polygons &trimming_polygons); void export_region_slices_to_svg(const char *path) const; void export_region_fill_surfaces_to_svg(const char *path) const; @@ -117,7 +122,10 @@ public: // Test whether whether there are any slices assigned to this layer. bool empty() const; void make_slices(); + // Merge typed slices into untyped slices. This method is used to revert the effects of detect_surfaces_type() called for posPrepareInfill. void merge_slices(); + // Slices merged into islands, to be used by the elephant foot compensation to trim the individual surfaces with the shrunk merged slices. + ExPolygons merged(float offset) const; template bool any_internal_region_slice_contains(const T &item) const { for (const LayerRegion *layerm : m_regions) if (layerm->slices.any_internal_contains(item)) return true; return false; diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index 6f70fba65..913ba76a6 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -74,7 +74,7 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec // Cummulative sum of polygons over all the regions. g.lower_slices = &this->layer()->lower_layer->slices; - g.layer_id = this->layer()->id(); + g.layer_id = (int)this->layer()->id(); g.ext_perimeter_flow = this->flow(frExternalPerimeter); g.overhang_flow = this->region()->flow(frPerimeter, -1, true, false, -1, *this->layer()->object()); g.solid_infill_flow = this->flow(frSolidInfill); @@ -385,6 +385,28 @@ double LayerRegion::infill_area_threshold() const return ss*ss; } +void LayerRegion::trim_surfaces(const Polygons &trimming_polygons) +{ +#ifndef NDEBUG + for (const Surface &surface : this->slices.surfaces) + assert(surface.surface_type == stInternal); +#endif /* NDEBUG */ + this->slices.set(intersection_ex(to_polygons(std::move(this->slices.surfaces)), trimming_polygons, false), stInternal); +} + +void LayerRegion::elephant_foot_compensation_step(const float elephant_foot_compensation_perimeter_step, const Polygons &trimming_polygons) +{ +#ifndef NDEBUG + for (const Surface &surface : this->slices.surfaces) + assert(surface.surface_type == stInternal); +#endif /* NDEBUG */ + ExPolygons slices_expolygons = to_expolygons(std::move(this->slices.surfaces)); + Polygons slices_polygons = to_polygons(slices_expolygons); + Polygons tmp = intersection(slices_polygons, trimming_polygons, false); + append(tmp, diff(slices_polygons, offset(offset_ex(slices_expolygons, -elephant_foot_compensation_perimeter_step), elephant_foot_compensation_perimeter_step))); + this->slices.set(std::move(union_ex(tmp)), stInternal); +} + void LayerRegion::export_region_slices_to_svg(const char *path) const { BoundingBox bbox; diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 5e46bb753..07fecdfc6 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1551,32 +1551,89 @@ end: Layer *layer = m_layers[layer_id]; // Apply size compensation and perform clipping of multi-part objects. float delta = float(scale_(m_config.xy_size_compensation.value)); + float elephant_foot_compensation = 0.f; if (layer_id == 0) - delta -= float(scale_(m_config.elefant_foot_compensation.value)); - bool scale = delta != 0.f; - bool clip = m_config.clip_multipart_objects.value || delta > 0.f; + elephant_foot_compensation = float(scale_(m_config.elefant_foot_compensation.value)); if (layer->m_regions.size() == 1) { - if (scale) { + // Optimized version for a single region layer. + if (layer_id == 0) { + if (delta > elephant_foot_compensation) { + delta -= elephant_foot_compensation; + elephant_foot_compensation = 0.f; + } else if (delta > 0) + elephant_foot_compensation -= delta; + } + if (delta != 0.f || elephant_foot_compensation > 0.f) { // Single region, growing or shrinking. LayerRegion *layerm = layer->m_regions.front(); - layerm->slices.set(offset_ex(to_expolygons(std::move(layerm->slices.surfaces)), delta), stInternal); + // Apply the XY compensation. + ExPolygons expolygons = (delta == 0.f) ? + to_expolygons(std::move(layerm->slices.surfaces)) : + offset_ex(to_expolygons(std::move(layerm->slices.surfaces)), delta); + // Apply the elephant foot compensation. + if (elephant_foot_compensation > 0) { + float elephant_foot_spacing = layerm->flow(frExternalPerimeter).scaled_elephant_foot_spacing(); + float external_perimeter_nozzle = scale_(this->print()->config().nozzle_diameter.get_at(layerm->region()->config().perimeter_extruder.value - 1)); + // Apply the elephant foot compensation by steps of 1/10 nozzle diameter. + float steps = std::ceil(elephant_foot_compensation / (0.1f * external_perimeter_nozzle)); + size_t nsteps = size_t(steps); + float step = elephant_foot_compensation / steps; + for (size_t i = 0; i < nsteps; ++ i) { + Polygons tmp = offset(expolygons, - step); + append(tmp, diff(to_polygons(expolygons), offset(offset_ex(expolygons, -elephant_foot_spacing - step), elephant_foot_spacing + step))); + expolygons = union_ex(tmp); + } + } + layerm->slices.set(std::move(expolygons), stInternal); } - } else if (scale || clip) { - // Multiple regions, growing, shrinking or just clipping one region by the other. - // When clipping the regions, priority is given to the first regions. - Polygons processed; - for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) { - LayerRegion *layerm = layer->m_regions[region_id]; - ExPolygons slices = to_expolygons(std::move(layerm->slices.surfaces)); - if (scale) - slices = offset_ex(slices, delta); - if (region_id > 0 && clip) - // Trim by the slices of already processed regions. - slices = diff_ex(to_polygons(std::move(slices)), processed); - if (clip && region_id + 1 < layer->m_regions.size()) - // Collect the already processed regions to trim the to be processed regions. - polygons_append(processed, slices); - layerm->slices.set(std::move(slices), stInternal); + } else { + bool upscale = delta > 0.f; + bool downscale = delta < 0.f || elephant_foot_compensation > 0.f; + bool clip = m_config.clip_multipart_objects.value; + if (upscale || clip) { + // Multiple regions, growing or just clipping one region by the other. + // When clipping the regions, priority is given to the first regions. + Polygons processed; + for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) { + LayerRegion *layerm = layer->m_regions[region_id]; + ExPolygons slices = to_expolygons(std::move(layerm->slices.surfaces)); + if (upscale) + slices = offset_ex(std::move(slices), delta); + if (region_id > 0 && clip) + // Trim by the slices of already processed regions. + slices = diff_ex(to_polygons(std::move(slices)), processed); + if (clip && (region_id + 1 < layer->m_regions.size())) + // Collect the already processed regions to trim the to be processed regions. + polygons_append(processed, slices); + layerm->slices.set(std::move(slices), stInternal); + } + } + if (delta < 0.f) { + // Apply the negative XY compensation. + Polygons trimming = offset(layer->merged(EPSILON), delta - EPSILON); + for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) + layer->m_regions[region_id]->trim_surfaces(trimming); + } + if (elephant_foot_compensation > 0.f) { + // Apply the elephant foot compensation. + std::vector elephant_foot_spacing; + elephant_foot_spacing.reserve(layer->m_regions.size()); + float external_perimeter_nozzle = 0.f; + for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) { + LayerRegion *layerm = layer->m_regions[region_id]; + elephant_foot_spacing.emplace_back(layerm->flow(frExternalPerimeter).scaled_elephant_foot_spacing()); + external_perimeter_nozzle += scale_(this->print()->config().nozzle_diameter.get_at(layerm->region()->config().perimeter_extruder.value - 1)); + } + external_perimeter_nozzle /= (float)layer->m_regions.size(); + // Apply the elephant foot compensation by steps of 1/10 nozzle diameter. + float steps = std::ceil(elephant_foot_compensation / (0.1f * external_perimeter_nozzle)); + size_t nsteps = size_t(steps); + float step = elephant_foot_compensation / steps; + for (size_t i = 0; i < nsteps; ++ i) { + Polygons trimming_polygons = offset(layer->merged(EPSILON), - step - EPSILON); + for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) + layer->m_regions[region_id]->elephant_foot_compensation_step(elephant_foot_spacing[region_id] + step, trimming_polygons); + } } } // Merge all regions' slices to get islands, chain them by a shortest path. From 925378ba900e8a13c9a33ecc18cb3b3549693280 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 5 Mar 2019 13:57:41 +0100 Subject: [PATCH 035/236] Added background to legend texture --- src/slic3r/GUI/GLCanvas3D.cpp | 11 ++++++----- src/slic3r/GUI/GLCanvas3D.hpp | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index aacc6f0e3..399ead284 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3493,7 +3493,7 @@ void GLCanvas3D::LegendTexture::fill_color_print_legend_values(const GCodePrevie } } -bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, const std::vector& tool_colors, const GLCanvas3D& canvas, bool use_error_colors) +bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, const std::vector& tool_colors, const GLCanvas3D& canvas) { reset(); @@ -3559,14 +3559,14 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c memDC.SelectObject(bitmap); mask_memDC.SelectObject(mask); - memDC.SetBackground(wxBrush(use_error_colors ? *wxWHITE : *wxBLACK)); + memDC.SetBackground(wxBrush(*wxBLACK)); mask_memDC.SetBackground(wxBrush(*wxBLACK)); memDC.Clear(); mask_memDC.Clear(); // draw title - memDC.SetTextForeground(use_error_colors ? *wxWHITE : *wxBLACK); + memDC.SetTextForeground(*wxWHITE); mask_memDC.SetTextForeground(*wxWHITE); int title_x = scaled_border; @@ -3649,10 +3649,11 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c unsigned char* px_ptr = data.data() + 4 * hh; for (int w = 0; w < m_width; ++w) { + unsigned char alpha = (mask_image.GetRed(w, h) + mask_image.GetGreen(w, h) + mask_image.GetBlue(w, h)) / 3; *px_ptr++ = image.GetRed(w, h); *px_ptr++ = image.GetGreen(w, h); *px_ptr++ = image.GetBlue(w, h); - *px_ptr++ = (mask_image.GetRed(w, h) + mask_image.GetGreen(w, h) + mask_image.GetBlue(w, h)) / 3; + *px_ptr++ = (alpha == 0) ? 128 : 255; } } @@ -8109,7 +8110,7 @@ std::vector GLCanvas3D::_parse_colors(const std::vector& col void GLCanvas3D::_generate_legend_texture(const GCodePreviewData& preview_data, const std::vector& tool_colors) { - m_legend_texture.generate(preview_data, tool_colors, *this, m_dynamic_background_enabled && _is_any_volume_outside()); + m_legend_texture.generate(preview_data, tool_colors, *this); } void GLCanvas3D::_set_warning_texture(WarningTexture::Warning warning, bool state) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index d47b7c976..51a1e9213 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -868,7 +868,7 @@ private: void fill_color_print_legend_values(const GCodePreviewData& preview_data, const GLCanvas3D& canvas, std::vector>& cp_legend_values); - bool generate(const GCodePreviewData& preview_data, const std::vector& tool_colors, const GLCanvas3D& canvas, bool use_error_colors); + bool generate(const GCodePreviewData& preview_data, const std::vector& tool_colors, const GLCanvas3D& canvas); void render(const GLCanvas3D& canvas) const; }; From 676076b7b4552670d53683865a5b8c1500fc33e8 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 5 Mar 2019 14:05:58 +0100 Subject: [PATCH 036/236] Fix of caching of the SlicingParamerters at PrintObject --- src/libslic3r/Print.cpp | 15 ++++++++++++--- src/libslic3r/Print.hpp | 5 +++-- src/libslic3r/PrintObject.cpp | 19 ++++++++----------- src/libslic3r/Slicing.cpp | 1 + src/libslic3r/Slicing.hpp | 4 ++++ 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 87e78f11c..8ed70fde6 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -523,6 +523,9 @@ exit_for_rearrange_regions: invalidated = true; } + for (PrintObject *object : m_objects) + object->update_slicing_parameters(); + return invalidated; } @@ -1098,6 +1101,12 @@ Print::ApplyStatus Print::apply(const Model &model, const DynamicPrintConfig &co } } + // Update SlicingParameters for each object where the SlicingParameters is not valid. + // If it is not valid, then it is ensured that PrintObject.m_slicing_params is not in use + // (posSlicing and posSupportMaterial was invalidated). + for (PrintObject *object : m_objects) + object->update_slicing_parameters(); + #ifdef _DEBUG check_model_ids_equal(m_model, model); #endif /* _DEBUG */ @@ -1202,13 +1211,13 @@ std::string Print::validate() const break; } } - SlicingParameters slicing_params0 = m_objects.front()->slicing_parameters(); + const SlicingParameters &slicing_params0 = m_objects.front()->slicing_parameters(); size_t tallest_object_idx = 0; if (has_custom_layering) PrintObject::update_layer_height_profile(*m_objects.front()->model_object(), slicing_params0, layer_height_profiles.front()); for (size_t i = 1; i < m_objects.size(); ++ i) { - const PrintObject *object = m_objects[i]; - const SlicingParameters slicing_params = object->slicing_parameters(); + const PrintObject *object = m_objects[i]; + const SlicingParameters &slicing_params = object->slicing_parameters(); if (std::abs(slicing_params.first_print_layer_height - slicing_params0.first_print_layer_height) > EPSILON || std::abs(slicing_params.layer_height - slicing_params0.layer_height ) > EPSILON) return L("The Wipe Tower is only supported for multiple objects if they have equal layer heigths"); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 2f85da96b..43fd52e18 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -131,7 +131,7 @@ public: // by the interactive layer height editor and by the printing process itself. // The slicing parameters are dependent on various configuration values // (layer height, first layer height, raft settings, print nozzle diameter etc). - SlicingParameters slicing_parameters() const; + const SlicingParameters& slicing_parameters() const { return m_slicing_params; } static SlicingParameters slicing_parameters(const DynamicPrintConfig &full_config, const ModelObject &model_object); // returns 0-based indices of extruders used to print the object (without brim, support and other helper extrusions) @@ -161,7 +161,8 @@ protected: bool invalidate_all_steps(); // Invalidate steps based on a set of parameters changed. bool invalidate_state_by_config_options(const std::vector &opt_keys); - SlicingParameters slicing_parameters_internal() const; + // If ! m_slicing_params.valid, recalculate. + void update_slicing_parameters(); static PrintObjectConfig object_config_from_model_object(const PrintObjectConfig &default_object_config, const ModelObject &object, size_t num_extruders); static PrintRegionConfig region_config_from_model_volume(const PrintRegionConfig &default_region_config, const ModelVolume &volume, size_t num_extruders); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 07fecdfc6..2349a7445 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -104,7 +104,6 @@ void PrintObject::slice() return; m_print->set_status(10, "Processing triangulated mesh"); std::vector layer_height_profile; - m_slicing_params = this->slicing_parameters_internal(); this->update_layer_height_profile(*this->model_object(), m_slicing_params, layer_height_profile); m_print->throw_if_canceled(); this->_slice(layer_height_profile); @@ -569,8 +568,11 @@ bool PrintObject::invalidate_step(PrintObjectStep step) } else if (step == posSlice) { invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posSupportMaterial }); invalidated |= m_print->invalidate_steps({ psSkirt, psBrim }); - } else if (step == posSupportMaterial) + this->m_slicing_params.valid = false; + } else if (step == posSupportMaterial) { invalidated |= m_print->invalidate_steps({ psSkirt, psBrim }); + this->m_slicing_params.valid = false; + } // Wipe tower depends on the ordering of extruders, which in turn depends on everything. // It also decides about what the wipe_into_infill / wipe_into_object features will do, @@ -1361,16 +1363,11 @@ PrintRegionConfig PrintObject::region_config_from_model_volume(const PrintRegion return config; } -SlicingParameters PrintObject::slicing_parameters_internal() const +void PrintObject::update_slicing_parameters() { - return SlicingParameters::create_from_config( - this->print()->config(), m_config, - unscale(this->size(2)), this->object_extruders()); -} - -SlicingParameters PrintObject::slicing_parameters() const -{ - return this->is_step_done(posSlice) ? m_slicing_params : this->slicing_parameters_internal(); + if (! m_slicing_params.valid) + m_slicing_params = SlicingParameters::create_from_config( + this->print()->config(), m_config, unscale(this->size(2)), this->object_extruders()); } SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig &full_config, const ModelObject &model_object) diff --git a/src/libslic3r/Slicing.cpp b/src/libslic3r/Slicing.cpp index b3e314549..3a05e9d8a 100644 --- a/src/libslic3r/Slicing.cpp +++ b/src/libslic3r/Slicing.cpp @@ -149,6 +149,7 @@ SlicingParameters SlicingParameters::create_from_config( params.object_print_z_max += print_z; } + params.valid = true; return params; } diff --git a/src/libslic3r/Slicing.hpp b/src/libslic3r/Slicing.hpp index 094527850..fa5a12f9c 100644 --- a/src/libslic3r/Slicing.hpp +++ b/src/libslic3r/Slicing.hpp @@ -42,6 +42,8 @@ struct SlicingParameters // Height of the object to be printed. This value does not contain the raft height. coordf_t object_print_z_height() const { return object_print_z_max - object_print_z_min; } + bool valid; + // Number of raft layers. size_t base_raft_layers; // Number of interface layers including the contact layer. @@ -100,6 +102,8 @@ static_assert(IsTriviallyCopyable::value, "SlicingParameters // The two slicing parameters lead to the same layering as long as the variable layer thickness is not in action. inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters &sp2) { + assert(sp1.valid); + assert(sp2.valid); return sp1.base_raft_layers == sp2.base_raft_layers && sp1.interface_raft_layers == sp2.interface_raft_layers && sp1.base_raft_layer_height == sp2.base_raft_layer_height && From 95ca670efbdcb6fe94cf16863dbd63f91f52ab36 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 5 Mar 2019 14:26:44 +0100 Subject: [PATCH 037/236] Fixed OSX and Linux build --- src/slic3r/GUI/Plater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5454268bf..587c3579f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -766,7 +766,7 @@ void Sidebar::update_mode_sizer() const void Sidebar::update_reslice_btn_tooltip() const { - const wxString tooltip = m_mode == comSimple ? wxEmptyString : _(L("Hold Shift to Slice & Export G-code")); + const wxString tooltip = m_mode == comSimple ? wxString("") : _(L("Hold Shift to Slice & Export G-code")); p->btn_reslice->SetToolTip(tooltip); } From 8a29ec2204d308d7f16889a0baebbec5d418ee14 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 5 Mar 2019 15:03:56 +0100 Subject: [PATCH 038/236] GCode Anayzer take in account extruder offsets --- src/libslic3r/GCode.cpp | 16 +++++++++++++++- src/libslic3r/GCode/Analyzer.cpp | 27 +++++++++++++++++++++++++++ src/libslic3r/GCode/Analyzer.hpp | 7 +++++++ src/libslic3r/Technologies.hpp | 2 ++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 910c3f871..31be220a6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1,3 +1,4 @@ +#include "libslic3r.h" #include "GCode.hpp" #include "ExtrusionEntity.hpp" #include "EdgeGrid.hpp" @@ -573,6 +574,17 @@ void GCode::_do_export(Print &print, FILE *file) // resets analyzer m_analyzer.reset(); +#if ENABLE_ANALYZER_EXTRUDER_OFFSET + // send extruder offset data to analyzer + std::vector extruder_offsets; + for (unsigned int extruder_id : print.extruders()) + { + extruder_offsets.push_back(print.config().extruder_offset.get_at(extruder_id)); + } + + m_analyzer.set_extruder_offsets(extruder_offsets); +#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET + // resets analyzer's tracking data m_last_mm3_per_mm = GCodeAnalyzer::Default_mm3_per_mm; @@ -843,7 +855,9 @@ void GCode::_do_export(Print &print, FILE *file) for (unsigned int extruder_id : print.extruders()) { const Vec2d &extruder_offset = print.config().extruder_offset.get_at(extruder_id); Polygon s(outer_skirt); - s.translate(Point::new_scale(- extruder_offset(0), - extruder_offset(1))); +#if !ENABLE_ANALYZER_EXTRUDER_OFFSET + s.translate(Point::new_scale(-extruder_offset(0), -extruder_offset(1))); +#endif // !ENABLE_ANALYZER_EXTRUDER_OFFSET skirts.emplace_back(std::move(s)); } m_ooze_prevention.enable = true; diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp index c32acd4e9..a561504ba 100644 --- a/src/libslic3r/GCode/Analyzer.cpp +++ b/src/libslic3r/GCode/Analyzer.cpp @@ -101,6 +101,13 @@ GCodeAnalyzer::GCodeAnalyzer() reset(); } +#if ENABLE_ANALYZER_EXTRUDER_OFFSET +void GCodeAnalyzer::set_extruder_offsets(const std::vector& extruder_offsets) +{ + m_extruder_offsets = extruder_offsets; +} +#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET + void GCodeAnalyzer::reset() { _set_units(Millimeters); @@ -118,6 +125,9 @@ void GCodeAnalyzer::reset() _reset_axes_position(); m_moves_map.clear(); +#if ENABLE_ANALYZER_EXTRUDER_OFFSET + m_extruder_offsets.clear(); +#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET } const std::string& GCodeAnalyzer::process_gcode(const std::string& gcode) @@ -654,7 +664,24 @@ void GCodeAnalyzer::_store_move(GCodeAnalyzer::GCodeMove::EType type) it = m_moves_map.insert(TypeToMovesMap::value_type(type, GCodeMovesList())).first; // store move +#if ENABLE_ANALYZER_EXTRUDER_OFFSET + Vec3d extruder_offset = Vec3d::Zero(); + unsigned int extruder_id = _get_extruder_id(); + + std::cout << extruder_id << std::endl; + + if (extruder_id < m_extruder_offsets.size()) + { + Vec2d offset = m_extruder_offsets[extruder_id]; + extruder_offset = Vec3d(offset(0), offset(1), 0.0); + } + + Vec3d start_position = _get_start_position() + extruder_offset; + Vec3d end_position = _get_end_position() + extruder_offset; + it->second.emplace_back(type, _get_extrusion_role(), extruder_id, _get_mm3_per_mm(), _get_width(), _get_height(), _get_feedrate(), start_position, end_position, _get_delta_extrusion(), _get_cp_color_id()); +#else it->second.emplace_back(type, _get_extrusion_role(), _get_extruder_id(), _get_mm3_per_mm(), _get_width(), _get_height(), _get_feedrate(), _get_start_position(), _get_end_position(), _get_delta_extrusion(), _get_cp_color_id()); +#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET } bool GCodeAnalyzer::_is_valid_extrusion_role(int value) const diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp index 389c11cec..fb15bde07 100644 --- a/src/libslic3r/GCode/Analyzer.hpp +++ b/src/libslic3r/GCode/Analyzer.hpp @@ -104,6 +104,9 @@ private: State m_state; GCodeReader m_parser; TypeToMovesMap m_moves_map; +#if ENABLE_ANALYZER_EXTRUDER_OFFSET + std::vector m_extruder_offsets; +#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET // The output of process_layer() std::string m_process_output; @@ -111,6 +114,10 @@ private: public: GCodeAnalyzer(); +#if ENABLE_ANALYZER_EXTRUDER_OFFSET + void set_extruder_offsets(const std::vector& extruder_offsets); +#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET + // Reinitialize the analyzer void reset(); diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index e978b5838..0bc62a10b 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -58,5 +58,7 @@ // Toolbars and Gizmos use icons imported from svg files #define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) +// G-Code Analyzer takes in account for extruder offsets +#define ENABLE_ANALYZER_EXTRUDER_OFFSET (1 && ENABLE_1_42_0_ALPHA8) #endif // _technologies_h_ From 82352c1314cb96fd4baadaf5adc21ecdc0353901 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 4 Mar 2019 15:40:06 +0100 Subject: [PATCH 039/236] imgui: Refactor combo boxes. Fix #1895 #1868 --- src/slic3r/GUI/GLGizmo.cpp | 15 ++++++----- src/slic3r/GUI/ImGuiWrapper.cpp | 47 +++++++++++---------------------- src/slic3r/GUI/ImGuiWrapper.hpp | 3 +-- 3 files changed, 26 insertions(+), 39 deletions(-) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index d4b2bf526..afffd670e 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -2286,17 +2286,20 @@ RENDER_AGAIN: m_imgui->text(_(L("Shift + Left (+ drag) - select point(s)"))); m_imgui->text(" "); // vertical gap - std::vector options = {"0.2", "0.4", "0.6", "0.8", "1.0"}; - std::stringstream ss; - ss << std::setprecision(1) << m_new_point_head_diameter; - wxString str = ss.str(); + static const std::vector options = {0.2f, 0.4f, 0.6f, 0.8f, 1.0f}; + static const std::vector options_str = {"0.2", "0.4", "0.6", "0.8", "1.0"}; + int selection = -1; + for (size_t i = 0; i < options.size(); i++) { + if (options[i] == m_new_point_head_diameter) { selection = (int)i; } + } bool old_combo_state = m_combo_box_open; // The combo is commented out for now, until the feature is supported by backend. - // m_combo_box_open = m_imgui->combo(_(L("Head diameter")), options, str); + // m_combo_box_open = m_imgui->combo(_(L("Head diameter")), options_str, selection); force_refresh |= (old_combo_state != m_combo_box_open); - float current_number = atof(str); + // float current_number = atof(str); + const float current_number = selection < options.size() ? options[selection] : m_new_point_head_diameter; if (old_combo_state && !m_combo_box_open) // closing the combo must always change the sizes (even if the selection did not change) for (auto& point_and_selection : m_editing_mode_cache) if (point_and_selection.second) { diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 78a3f9db8..9e75eb2ff 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -254,44 +254,29 @@ void ImGuiWrapper::text(const wxString &label) this->text(into_u8(label).c_str()); } - -bool ImGuiWrapper::combo(const wxString& label, const std::vector& options, wxString& selection) -{ - std::string selection_u8 = into_u8(selection); - - // this is to force the label to the left of the widget: - text(label); - ImGui::SameLine(); - - if (ImGui::BeginCombo("", selection_u8.c_str())) { - for (const wxString& option : options) { - std::string option_u8 = into_u8(option); - bool is_selected = (selection_u8.empty()) ? false : (option_u8 == selection_u8); - if (ImGui::Selectable(option_u8.c_str(), is_selected)) - selection = option_u8; - } - ImGui::EndCombo(); - return true; - } - return false; -} - -bool ImGuiWrapper::combo(const wxString& label, const std::vector& options, std::string& selection) +bool ImGuiWrapper::combo(const wxString& label, const std::vector& options, int& selection) { // this is to force the label to the left of the widget: text(label); ImGui::SameLine(); - - if (ImGui::BeginCombo("", selection.c_str())) { - for (const std::string& option : options) { - bool is_selected = (selection.empty()) ? false : (option == selection); - if (ImGui::Selectable(option.c_str(), is_selected)) - selection = option; + + int selection_out = -1; + bool res = false; + + const char *selection_str = selection < options.size() ? options[selection].c_str() : ""; + if (ImGui::BeginCombo("", selection_str)) { + for (int i = 0; i < options.size(); i++) { + if (ImGui::Selectable(options[i].c_str(), i == selection)) { + selection_out = i; + } } + ImGui::EndCombo(); - return true; + res = true; } - return false; + + selection = selection_out; + return res; } void ImGuiWrapper::disabled_begin(bool disabled) diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index 333b66ed4..019bb610e 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -60,8 +60,7 @@ public: void text(const char *label); void text(const std::string &label); void text(const wxString &label); - bool combo(const wxString& label, const std::vector& options, std::string& current_selection); - bool combo(const wxString& label, const std::vector& options, wxString& current_selection); + bool combo(const wxString& label, const std::vector& options, int& selection); // Use -1 to not mark any option as selected void disabled_begin(bool disabled); void disabled_end(); From a6ec3ea883713229b109b1d4825621ff58056e8e Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 5 Mar 2019 15:35:43 +0100 Subject: [PATCH 040/236] Reverted 8a29ec2204d308d7f16889a0baebbec5d418ee14 by disabling the tech ENABLE_ANALYZER_EXTRUDER_OFFSET --- src/libslic3r/Technologies.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 0bc62a10b..560067c37 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -59,6 +59,6 @@ // Toolbars and Gizmos use icons imported from svg files #define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) // G-Code Analyzer takes in account for extruder offsets -#define ENABLE_ANALYZER_EXTRUDER_OFFSET (1 && ENABLE_1_42_0_ALPHA8) +#define ENABLE_ANALYZER_EXTRUDER_OFFSET (0 && ENABLE_1_42_0_ALPHA8) #endif // _technologies_h_ From 2ddd2ed4c74079e81230a34b8c231426184d8a46 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 5 Mar 2019 15:33:38 +0100 Subject: [PATCH 041/236] Fixed a preset selection after a config wizard running (SPE-841) --- src/slic3r/GUI/GUI.cpp | 22 ++++++++++++++++++++-- src/slic3r/GUI/GUI_ObjectList.cpp | 10 +++++----- src/slic3r/GUI/GUI_ObjectList.hpp | 2 -- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index e09ce2466..85c8b48ab 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -30,6 +30,8 @@ #include "libslic3r/Utils.hpp" #include "libslic3r/Print.hpp" +#include "Tab.hpp" +#include "GUI_ObjectList.hpp" namespace Slic3r { namespace GUI { @@ -123,6 +125,9 @@ void config_wizard(int reason) if (! wxGetApp().check_unsaved_changes()) return; + // save selected preset before config wizard running + const auto printer_preset_name = wxGetApp().preset_bundle->printers.get_edited_preset().name; + try { ConfigWizard wizard(nullptr, static_cast(reason)); wizard.run(wxGetApp().preset_bundle, wxGetApp().preset_updater); @@ -131,8 +136,21 @@ void config_wizard(int reason) show_error(nullptr, e.what()); } - // Load the currently selected preset into the GUI, update the preset selection box. - wxGetApp().load_current_presets(); + // select old(before config wizard running) preset + wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(printer_preset_name); + // If old preset if invisible now, then first visible preset will be selected + // So, let control the case if multi-part object is on the scene and first visible preset is SLA + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA && + wxGetApp().obj_list()->has_multi_part_objects()) + { + show_info(nullptr, + _(L("It's impossible to print multi-part object(s) with SLA technology.")) + "\n\n" + + _(L("Please check and fixe your object list.")), + _(L("Attention!"))); + } + + // Load the currently selected preset into the GUI, update the preset selection box. + // wxGetApp().load_current_presets(); // #ys_FIXME_to_delete presets are loaded now in select_preset function } // opt_index = 0, by the reason of zero-index in ConfigOptionVector by default (in case only one element) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index c2ff7bfb7..a961c9ffa 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -38,6 +38,11 @@ FreqSettingsBundle FREQ_SETTINGS_BUNDLE_SLA = { L("Pad and Support") , { "supports_enable", "pad_enable" } } }; +static PrinterTechnology printer_technology() +{ + return wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology(); +} + ObjectList::ObjectList(wxWindow* parent) : wxDataViewCtrl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE), m_parent(parent) @@ -667,11 +672,6 @@ void ObjectList::get_options_menu(settings_menu_hierarchy& settings_menu, const } } -Slic3r::PrinterTechnology ObjectList::printer_technology() const -{ - return wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology(); -} - void ObjectList::get_settings_choice(const wxString& category_name) { wxArrayString names; diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 9e24b4b49..7d14eb13f 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -284,8 +284,6 @@ private: std::vector get_options(const bool is_part); const std::vector& get_options_for_bundle(const wxString& bundle_name); void get_options_menu(settings_menu_hierarchy& settings_menu, const bool is_part); - - PrinterTechnology printer_technology() const ; }; From 96d09ce0ad7dc878561b8d4c909a162941e666ce Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 1 Mar 2019 15:25:07 +0100 Subject: [PATCH 042/236] Bonjour: Fix: Set Query ID to zero, no ID checking in responses. Fix #1864 --- src/slic3r/Utils/Bonjour.cpp | 45 +++++++++++++----------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/src/slic3r/Utils/Bonjour.cpp b/src/slic3r/Utils/Bonjour.cpp index bfd9d4828..4953cfc64 100644 --- a/src/slic3r/Utils/Bonjour.cpp +++ b/src/slic3r/Utils/Bonjour.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -34,6 +33,9 @@ namespace Slic3r { // the implementations has been tested with AFL. +// Relevant RFC: https://www.ietf.org/rfc/rfc6762.txt + + struct DnsName: public std::string { enum @@ -387,7 +389,7 @@ struct DnsMessage DnsSDMap sdmap; - static optional decode(const std::vector &buffer, optional id_wanted = boost::none) + static optional decode(const std::vector &buffer) { const auto size = buffer.size(); if (size < DnsHeader::SIZE + DnsQuestion::MIN_SIZE || size > MAX_SIZE) { @@ -397,10 +399,6 @@ struct DnsMessage DnsMessage res; res.header = DnsHeader::decode(buffer); - if (id_wanted && *id_wanted != res.header.id) { - return boost::none; - } - if (res.header.qdcount > 1 || res.header.ancount > MAX_ANS) { return boost::none; } @@ -472,16 +470,12 @@ struct BonjourRequest static const asio::ip::address_v4 MCAST_IP4; static const uint16_t MCAST_PORT; - uint16_t id; std::vector data; static optional make(const std::string &service, const std::string &protocol); private: - BonjourRequest(uint16_t id, std::vector &&data) : - id(id), - data(std::move(data)) - {} + BonjourRequest(std::vector &&data) : data(std::move(data)) {} }; const asio::ip::address_v4 BonjourRequest::MCAST_IP4{0xe00000fb}; @@ -493,22 +487,15 @@ optional BonjourRequest::make(const std::string &service, const return boost::none; } - std::random_device dev; - std::uniform_int_distribution dist; - uint16_t id = dist(dev); - uint16_t id_big = endian::native_to_big(id); - const char *id_char = reinterpret_cast(&id_big); - std::vector data; data.reserve(service.size() + 18); - // Add the transaction ID - data.push_back(id_char[0]); - data.push_back(id_char[1]); - // Add metadata static const unsigned char rq_meta[] = { - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0x00, 0x00, // Query ID (zero for mDNS) + 0x00, 0x00, // Flags + 0x00, 0x01, // One query + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Zero Answer, Authority, and Additional RRs }; std::copy(rq_meta, rq_meta + sizeof(rq_meta), std::back_inserter(data)); @@ -522,11 +509,14 @@ optional BonjourRequest::make(const std::string &service, const // Add the rest of PTR record static const unsigned char ptr_tail[] = { - 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0xff, + 0x05, // length of "label" + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x00, // "label" string and terminator + 0x00, 0x0c, // Type PTR + 0x00, 0xff, // Class ANY }; std::copy(ptr_tail, ptr_tail + sizeof(ptr_tail), std::back_inserter(data)); - return BonjourRequest(id, std::move(data)); + return BonjourRequest(std::move(data)); } @@ -539,7 +529,6 @@ struct Bonjour::priv const std::string service_dn; unsigned timeout; unsigned retries; - uint16_t rq_id; std::vector buffer; std::thread io_thread; @@ -558,8 +547,7 @@ Bonjour::priv::priv(std::string service, std::string protocol) : protocol(std::move(protocol)), service_dn((boost::format("_%1%._%2%.local") % this->service % this->protocol).str()), timeout(10), - retries(1), - rq_id(0) + retries(1) { buffer.resize(DnsMessage::MAX_SIZE); } @@ -585,7 +573,7 @@ void Bonjour::priv::udp_receive(udp::endpoint from, size_t bytes) } buffer.resize(bytes); - const auto dns_msg = DnsMessage::decode(buffer, rq_id); + const auto dns_msg = DnsMessage::decode(buffer); if (dns_msg) { asio::ip::address ip = from.address(); if (dns_msg->rr_a) { ip = dns_msg->rr_a->ip; } @@ -629,7 +617,6 @@ void Bonjour::priv::lookup_perform() } auto self = this; - rq_id = brq->id; try { boost::asio::io_service io_service; From bd725a47f450f45a85b5ff2603530eee9bb7482f Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 4 Mar 2019 16:50:43 +0100 Subject: [PATCH 043/236] PrintHost: Don't offer print start for SL1 --- src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/PrintHostDialogs.cpp | 17 +++++++++-------- src/slic3r/GUI/PrintHostDialogs.hpp | 2 +- src/slic3r/Utils/Duet.cpp | 5 +++++ src/slic3r/Utils/Duet.hpp | 1 + src/slic3r/Utils/OctoPrint.cpp | 10 ++++++++++ src/slic3r/Utils/OctoPrint.hpp | 2 ++ src/slic3r/Utils/PrintHost.cpp | 8 ++++---- src/slic3r/Utils/PrintHost.hpp | 4 +++- 9 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 4e3ed4797..3062741eb 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3144,7 +3144,7 @@ void Plater::send_gcode() } default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(default_output_file.string())); - PrintHostSendDialog dlg(default_output_file); + PrintHostSendDialog dlg(default_output_file, upload_job.printhost->can_start_print()); if (dlg.ShowModal() == wxID_OK) { upload_job.upload_data.upload_path = dlg.filename(); upload_job.upload_data.start_print = dlg.start_print(); diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp index 1ec1c3a6a..76185b1ba 100644 --- a/src/slic3r/GUI/PrintHostDialogs.cpp +++ b/src/slic3r/GUI/PrintHostDialogs.cpp @@ -28,14 +28,15 @@ namespace GUI { static const char *CONFIG_KEY_PATH = "printhost_path"; static const char *CONFIG_KEY_PRINT = "printhost_print"; -PrintHostSendDialog::PrintHostSendDialog(const fs::path &path) +PrintHostSendDialog::PrintHostSendDialog(const fs::path &path, bool can_start_print) : MsgDialog(nullptr, _(L("Send G-Code to printer host")), _(L("Upload to Printer Host with the following filename:")), wxID_NONE) , txt_filename(new wxTextCtrl(this, wxID_ANY)) - , box_print(new wxCheckBox(this, wxID_ANY, _(L("Start printing after upload")))) + , box_print(can_start_print ? new wxCheckBox(this, wxID_ANY, _(L("Start printing after upload"))) : nullptr) { #ifdef __APPLE__ txt_filename->OSXDisableAllSmartSubstitutions(); #endif + const AppConfig *app_config = wxGetApp().app_config; auto *label_dir_hint = new wxStaticText(this, wxID_ANY, _(L("Use forward slashes ( / ) as a directory separator if needed."))); label_dir_hint->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); @@ -43,12 +44,13 @@ PrintHostSendDialog::PrintHostSendDialog(const fs::path &path) content_sizer->Add(txt_filename, 0, wxEXPAND); content_sizer->Add(label_dir_hint); content_sizer->AddSpacer(VERT_SPACING); - content_sizer->Add(box_print, 0, wxBOTTOM, 2*VERT_SPACING); + if (box_print != nullptr) { + content_sizer->Add(box_print, 0, wxBOTTOM, 2*VERT_SPACING); + box_print->SetValue(app_config->get("recent", CONFIG_KEY_PRINT) == "1"); + } btn_sizer->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL)); - const AppConfig *app_config = wxGetApp().app_config; - box_print->SetValue(app_config->get("recent", CONFIG_KEY_PRINT) == "1"); wxString recent_path = from_u8(app_config->get("recent", CONFIG_KEY_PATH)); if (recent_path.Length() > 0 && recent_path[recent_path.Length() - 1] != '/') { @@ -80,7 +82,7 @@ fs::path PrintHostSendDialog::filename() const bool PrintHostSendDialog::start_print() const { - return box_print->GetValue(); + return box_print != nullptr ? box_print->GetValue() : false; } void PrintHostSendDialog::EndModal(int ret) @@ -94,8 +96,7 @@ void PrintHostSendDialog::EndModal(int ret) wxGetApp().app_config->set("recent", CONFIG_KEY_PATH, into_u8(path)); } - bool print = box_print->GetValue(); - GUI::get_app_config()->set("recent", CONFIG_KEY_PRINT, print ? "1" : "0"); + GUI::get_app_config()->set("recent", CONFIG_KEY_PRINT, start_print() ? "1" : "0"); } MsgDialog::EndModal(ret); diff --git a/src/slic3r/GUI/PrintHostDialogs.hpp b/src/slic3r/GUI/PrintHostDialogs.hpp index e7c84fefd..105899cf0 100644 --- a/src/slic3r/GUI/PrintHostDialogs.hpp +++ b/src/slic3r/GUI/PrintHostDialogs.hpp @@ -29,7 +29,7 @@ namespace GUI { class PrintHostSendDialog : public GUI::MsgDialog { public: - PrintHostSendDialog(const boost::filesystem::path &path); + PrintHostSendDialog(const boost::filesystem::path &path, bool can_start_print); boost::filesystem::path filename() const; bool start_print() const; diff --git a/src/slic3r/Utils/Duet.cpp b/src/slic3r/Utils/Duet.cpp index 77137a7d2..c85bd90e8 100644 --- a/src/slic3r/Utils/Duet.cpp +++ b/src/slic3r/Utils/Duet.cpp @@ -119,6 +119,11 @@ bool Duet::can_test() const return true; } +bool Duet::can_start_print() const +{ + return true; +} + bool Duet::connect(wxString &msg) const { bool res = false; diff --git a/src/slic3r/Utils/Duet.hpp b/src/slic3r/Utils/Duet.hpp index e1c28d149..0b40fe8b3 100644 --- a/src/slic3r/Utils/Duet.hpp +++ b/src/slic3r/Utils/Duet.hpp @@ -25,6 +25,7 @@ public: virtual bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn) const; virtual bool has_auto_discovery() const; virtual bool can_test() const; + virtual bool can_start_print() const; virtual std::string get_host() const { return host; } private: diff --git a/src/slic3r/Utils/OctoPrint.cpp b/src/slic3r/Utils/OctoPrint.cpp index 2e2e169b8..594c2e3da 100644 --- a/src/slic3r/Utils/OctoPrint.cpp +++ b/src/slic3r/Utils/OctoPrint.cpp @@ -144,6 +144,11 @@ bool OctoPrint::can_test() const return true; } +bool OctoPrint::can_start_print() const +{ + return true; +} + bool OctoPrint::validate_version_text(const boost::optional &version_text) const { return version_text ? boost::starts_with(*version_text, "OctoPrint") : true; @@ -186,6 +191,11 @@ wxString SLAHost::get_test_failed_msg (wxString &msg) const return wxString::Format("%s: %s", _(L("Could not connect to Prusa SLA")), msg); } +bool SLAHost::can_start_print() const +{ + return false; +} + bool SLAHost::validate_version_text(const boost::optional &version_text) const { return version_text ? boost::starts_with(*version_text, "Prusa SLA") : false; diff --git a/src/slic3r/Utils/OctoPrint.hpp b/src/slic3r/Utils/OctoPrint.hpp index 8da149f53..a7caa7129 100644 --- a/src/slic3r/Utils/OctoPrint.hpp +++ b/src/slic3r/Utils/OctoPrint.hpp @@ -26,6 +26,7 @@ public: virtual bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn) const; virtual bool has_auto_discovery() const; virtual bool can_test() const; + virtual bool can_start_print() const; virtual std::string get_host() const { return host; } protected: @@ -49,6 +50,7 @@ public: virtual wxString get_test_ok_msg () const; virtual wxString get_test_failed_msg (wxString &msg) const; + virtual bool can_start_print() const ; protected: virtual bool validate_version_text(const boost::optional &version_text) const; }; diff --git a/src/slic3r/Utils/PrintHost.cpp b/src/slic3r/Utils/PrintHost.cpp index 0c6d6bb0f..5c39f8542 100644 --- a/src/slic3r/Utils/PrintHost.cpp +++ b/src/slic3r/Utils/PrintHost.cpp @@ -25,16 +25,16 @@ namespace Slic3r { PrintHost::~PrintHost() {} -PrintHost* PrintHost::get_print_host(DynamicPrintConfig *config) +PrintHost* PrintHost::get_print_host(DynamicPrintConfig *config, Slic3r::PrinterTechnology pt_fallback) { const auto opt = config->option>("host_type"); - if (opt == nullptr) { return nullptr; } + const auto host_type = opt != nullptr ? opt->value : (pt_fallback == ptFFF ? htOctoPrint : htSL1); - switch (opt->value) { + switch (host_type) { case htOctoPrint: return new OctoPrint(config); case htDuet: return new Duet(config); case htSL1: return new SLAHost(config); - default: return nullptr; + default: return nullptr; } } diff --git a/src/slic3r/Utils/PrintHost.hpp b/src/slic3r/Utils/PrintHost.hpp index d740ea99e..010889642 100644 --- a/src/slic3r/Utils/PrintHost.hpp +++ b/src/slic3r/Utils/PrintHost.hpp @@ -8,6 +8,7 @@ #include +#include "libslic3r/PrintConfig.hpp" #include "Http.hpp" @@ -38,9 +39,10 @@ public: virtual bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn) const = 0; virtual bool has_auto_discovery() const = 0; virtual bool can_test() const = 0; + virtual bool can_start_print() const = 0; virtual std::string get_host() const = 0; - static PrintHost* get_print_host(DynamicPrintConfig *config); + static PrintHost* get_print_host(DynamicPrintConfig *config, Slic3r::PrinterTechnology pt_fallback = ptFFF); protected: virtual wxString format_error(const std::string &body, const std::string &error, unsigned status) const; From 857b68a82ac4772e4cbc3292b0f9f8968619b2d0 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Tue, 5 Mar 2019 15:15:41 +0100 Subject: [PATCH 044/236] PrintHost: Fix host type configuration, refactor, fix #1687 --- src/libslic3r/PrintConfig.cpp | 48 +++++++++++++++++----------------- src/libslic3r/PrintConfig.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 3 --- src/slic3r/GUI/Tab.cpp | 2 -- src/slic3r/Utils/Duet.cpp | 2 ++ src/slic3r/Utils/Duet.hpp | 2 ++ src/slic3r/Utils/OctoPrint.cpp | 33 ++++++++++++++--------- src/slic3r/Utils/OctoPrint.hpp | 10 ++++--- src/slic3r/Utils/PrintHost.cpp | 28 ++++++++++++++------ src/slic3r/Utils/PrintHost.hpp | 5 ++-- 10 files changed, 80 insertions(+), 55 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 081057f88..1c78a3e31 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -70,6 +70,30 @@ void PrintConfigDef::init_common_params() def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0.049); + + def = this->add("print_host", coString); + def->label = L("Hostname, IP or URL"); + def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain " + "the hostname, IP address or URL of the printer host instance."); + def->cli = "print-host=s"; + def->mode = comAdvanced; + def->default_value = new ConfigOptionString(""); + + def = this->add("printhost_apikey", coString); + def->label = L("API Key / Password"); + def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain " + "the API Key or the password required for authentication."); + def->cli = "printhost-apikey=s"; + def->mode = comAdvanced; + def->default_value = new ConfigOptionString(""); + + def = this->add("printhost_cafile", coString); + def->label = "HTTPS CA File"; + def->tooltip = "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. " + "If left blank, the default OS CA certificate repository is used."; + def->cli = "printhost-cafile=s"; + def->mode = comAdvanced; + def->default_value = new ConfigOptionString(""); } void PrintConfigDef::init_fff_params() @@ -1331,30 +1355,6 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->default_value = new ConfigOptionEnum(htOctoPrint); - def = this->add("printhost_apikey", coString); - def->label = L("API Key / Password"); - def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain " - "the API Key or the password required for authentication."); - def->cli = "printhost-apikey=s"; - def->mode = comAdvanced; - def->default_value = new ConfigOptionString(""); - - def = this->add("printhost_cafile", coString); - def->label = "HTTPS CA File"; - def->tooltip = "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. " - "If left blank, the default OS CA certificate repository is used."; - def->cli = "printhost-cafile=s"; - def->mode = comAdvanced; - def->default_value = new ConfigOptionString(""); - - def = this->add("print_host", coString); - def->label = L("Hostname, IP or URL"); - def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain " - "the hostname, IP address or URL of the printer host instance."); - def->cli = "print-host=s"; - def->mode = comAdvanced; - def->default_value = new ConfigOptionString(""); - def = this->add("only_retract_when_crossing_perimeters", coBool); def->label = L("Only retract when crossing perimeters"); def->tooltip = L("Disables retraction when the travel path does not exceed the upper layer's perimeters " diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index d72c48339..f4d9053a6 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -38,7 +38,7 @@ enum GCodeFlavor { }; enum PrintHostType { - htOctoPrint, htDuet, htSL1, + htOctoPrint, htDuet }; enum InfillPattern { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 3062741eb..95537771f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3217,9 +3217,6 @@ void Plater::on_config_change(const DynamicPrintConfig &config) bed_shape_changed = true; update_scheduled = true; } - else if (opt_key == "host_type" && this->p->printer_technology == ptSLA) { - p->config->option>(opt_key)->value = htSL1; - } } { diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 632627eba..060eb1383 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1626,8 +1626,6 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) // Only offer the host type selection for FFF, for SLA it's always the SL1 printer (at the moment) if (! sla) { optgroup->append_single_option_line("host_type"); - } else { - m_config->option>("host_type", true)->value = htSL1; } auto printhost_browse = [this, optgroup] (wxWindow* parent) { diff --git a/src/slic3r/Utils/Duet.cpp b/src/slic3r/Utils/Duet.cpp index c85bd90e8..b0d8c0b8d 100644 --- a/src/slic3r/Utils/Duet.cpp +++ b/src/slic3r/Utils/Duet.cpp @@ -34,6 +34,8 @@ Duet::Duet(DynamicPrintConfig *config) : Duet::~Duet() {} +const char* Duet::get_name() const { return "Duet"; } + bool Duet::test(wxString &msg) const { bool connected = connect(msg); diff --git a/src/slic3r/Utils/Duet.hpp b/src/slic3r/Utils/Duet.hpp index 0b40fe8b3..04ceec36f 100644 --- a/src/slic3r/Utils/Duet.hpp +++ b/src/slic3r/Utils/Duet.hpp @@ -19,6 +19,8 @@ public: Duet(DynamicPrintConfig *config); virtual ~Duet(); + virtual const char* get_name() const; + virtual bool test(wxString &curl_msg) const; virtual wxString get_test_ok_msg () const; virtual wxString get_test_failed_msg (wxString &msg) const; diff --git a/src/slic3r/Utils/OctoPrint.cpp b/src/slic3r/Utils/OctoPrint.cpp index 594c2e3da..7cea198bf 100644 --- a/src/slic3r/Utils/OctoPrint.cpp +++ b/src/slic3r/Utils/OctoPrint.cpp @@ -29,25 +29,29 @@ OctoPrint::OctoPrint(DynamicPrintConfig *config) : OctoPrint::~OctoPrint() {} +const char* OctoPrint::get_name() const { return "OctoPrint"; } + bool OctoPrint::test(wxString &msg) const { // Since the request is performed synchronously here, // it is ok to refer to `msg` from within the closure + const char *name = get_name(); + bool res = true; auto url = make_url("api/version"); - BOOST_LOG_TRIVIAL(info) << boost::format("Octoprint: Get version at: %1%") % url; + BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Get version at: %2%") % name % url; auto http = Http::get(std::move(url)); set_auth(http); http.on_error([&](std::string body, std::string error, unsigned status) { - BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error getting version: %1%, HTTP %2%, body: `%3%`") % error % status % body; + BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status % body; res = false; msg = format_error(body, error, status); }) .on_complete([&, this](std::string body, unsigned) { - BOOST_LOG_TRIVIAL(debug) << boost::format("Octoprint: Got version: %1%") % body; + BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got version: %2%") % name % body; try { std::stringstream ss(body); @@ -88,6 +92,8 @@ wxString OctoPrint::get_test_failed_msg (wxString &msg) const bool OctoPrint::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn) const { + const char *name = get_name(); + const auto upload_filename = upload_data.upload_path.filename(); const auto upload_parent_path = upload_data.upload_path.parent_path(); @@ -101,7 +107,8 @@ bool OctoPrint::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, Erro auto url = make_url("api/files/local"); - BOOST_LOG_TRIVIAL(info) << boost::format("Octoprint: Uploading file %1% at %2%, filename: %3%, path: %4%, print: %5%") + BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Uploading file %2% at %3%, filename: %4%, path: %5%, print: %6%") + % name % upload_data.source_path % url % upload_filename.string() @@ -114,10 +121,10 @@ bool OctoPrint::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, Erro .form_add("path", upload_parent_path.string()) // XXX: slashes on windows ??? .form_add_file("file", upload_data.source_path.string(), upload_filename.string()) .on_complete([&](std::string body, unsigned status) { - BOOST_LOG_TRIVIAL(debug) << boost::format("Octoprint: File uploaded: HTTP %1%: %2%") % status % body; + BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: File uploaded: HTTP %2%: %3%") % name % status % body; }) .on_error([&](std::string body, std::string error, unsigned status) { - BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error uploading file: %1%, HTTP %2%, body: `%3%`") % error % status % body; + BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error uploading file: %2%, HTTP %3%, body: `%4%`") % name % error % status % body; error_fn(format_error(body, error, status)); res = false; }) @@ -177,26 +184,28 @@ std::string OctoPrint::make_url(const std::string &path) const } -// SLAHost +// SL1Host -SLAHost::~SLAHost() {} +SL1Host::~SL1Host() {} -wxString SLAHost::get_test_ok_msg () const +const char* SL1Host::get_name() const { return "SL1Host"; } + +wxString SL1Host::get_test_ok_msg () const { return _(L("Connection to Prusa SLA works correctly.")); } -wxString SLAHost::get_test_failed_msg (wxString &msg) const +wxString SL1Host::get_test_failed_msg (wxString &msg) const { return wxString::Format("%s: %s", _(L("Could not connect to Prusa SLA")), msg); } -bool SLAHost::can_start_print() const +bool SL1Host::can_start_print() const { return false; } -bool SLAHost::validate_version_text(const boost::optional &version_text) const +bool SL1Host::validate_version_text(const boost::optional &version_text) const { return version_text ? boost::starts_with(*version_text, "Prusa SLA") : false; } diff --git a/src/slic3r/Utils/OctoPrint.hpp b/src/slic3r/Utils/OctoPrint.hpp index a7caa7129..0e372c7c9 100644 --- a/src/slic3r/Utils/OctoPrint.hpp +++ b/src/slic3r/Utils/OctoPrint.hpp @@ -20,6 +20,8 @@ public: OctoPrint(DynamicPrintConfig *config); virtual ~OctoPrint(); + virtual const char* get_name() const; + virtual bool test(wxString &curl_msg) const; virtual wxString get_test_ok_msg () const; virtual wxString get_test_failed_msg (wxString &msg) const; @@ -42,11 +44,13 @@ private: }; -class SLAHost: public OctoPrint +class SL1Host: public OctoPrint { public: - SLAHost(DynamicPrintConfig *config) : OctoPrint(config) {} - virtual ~SLAHost(); + SL1Host(DynamicPrintConfig *config) : OctoPrint(config) {} + virtual ~SL1Host(); + + virtual const char* get_name() const; virtual wxString get_test_ok_msg () const; virtual wxString get_test_failed_msg (wxString &msg) const; diff --git a/src/slic3r/Utils/PrintHost.cpp b/src/slic3r/Utils/PrintHost.cpp index 5c39f8542..e9e39e695 100644 --- a/src/slic3r/Utils/PrintHost.cpp +++ b/src/slic3r/Utils/PrintHost.cpp @@ -25,16 +25,28 @@ namespace Slic3r { PrintHost::~PrintHost() {} -PrintHost* PrintHost::get_print_host(DynamicPrintConfig *config, Slic3r::PrinterTechnology pt_fallback) +PrintHost* PrintHost::get_print_host(DynamicPrintConfig *config) { - const auto opt = config->option>("host_type"); - const auto host_type = opt != nullptr ? opt->value : (pt_fallback == ptFFF ? htOctoPrint : htSL1); + PrinterTechnology tech = ptFFF; - switch (host_type) { - case htOctoPrint: return new OctoPrint(config); - case htDuet: return new Duet(config); - case htSL1: return new SLAHost(config); - default: return nullptr; + { + const auto opt = config->option>("printer_technology"); + if (opt != nullptr) { + tech = opt->value; + } + } + + if (tech == ptFFF) { + const auto opt = config->option>("host_type"); + const auto host_type = opt != nullptr ? opt->value : htOctoPrint; + + switch (host_type) { + case htOctoPrint: return new OctoPrint(config); + case htDuet: return new Duet(config); + default: return nullptr; + } + } else { + return new SL1Host(config); } } diff --git a/src/slic3r/Utils/PrintHost.hpp b/src/slic3r/Utils/PrintHost.hpp index 010889642..e0aeb463c 100644 --- a/src/slic3r/Utils/PrintHost.hpp +++ b/src/slic3r/Utils/PrintHost.hpp @@ -8,7 +8,6 @@ #include -#include "libslic3r/PrintConfig.hpp" #include "Http.hpp" @@ -33,6 +32,8 @@ public: typedef Http::ProgressFn ProgressFn; typedef std::function ErrorFn; + virtual const char* get_name() const = 0; + virtual bool test(wxString &curl_msg) const = 0; virtual wxString get_test_ok_msg () const = 0; virtual wxString get_test_failed_msg (wxString &msg) const = 0; @@ -42,7 +43,7 @@ public: virtual bool can_start_print() const = 0; virtual std::string get_host() const = 0; - static PrintHost* get_print_host(DynamicPrintConfig *config, Slic3r::PrinterTechnology pt_fallback = ptFFF); + static PrintHost* get_print_host(DynamicPrintConfig *config); protected: virtual wxString format_error(const std::string &body, const std::string &error, unsigned status) const; From c1a24d2fbb78cd5695f9e0b34f3a1cf0688e558c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 5 Mar 2019 16:13:14 +0100 Subject: [PATCH 045/236] Fixed message type and disabled "Split to parts" in toolbar for the SLA printer --- src/slic3r/GUI/GUI.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 85c8b48ab..11e94f2ca 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -145,7 +145,7 @@ void config_wizard(int reason) { show_info(nullptr, _(L("It's impossible to print multi-part object(s) with SLA technology.")) + "\n\n" + - _(L("Please check and fixe your object list.")), + _(L("Please check and fix your object list.")), _(L("Attention!"))); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 95537771f..658cdcb04 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1714,8 +1714,8 @@ void Plater::priv::selection_changed() view3D->enable_toolbar_item("delete", can_delete_object()); view3D->enable_toolbar_item("more", can_increase_instances()); view3D->enable_toolbar_item("fewer", can_decrease_instances()); - view3D->enable_toolbar_item("splitobjects", can_split/*_to_objects*/()); - view3D->enable_toolbar_item("splitvolumes", can_split/*_to_volumes*/()); + view3D->enable_toolbar_item("splitobjects", can_split()); + view3D->enable_toolbar_item("splitvolumes", printer_technology == ptFFF && can_split()); // if the selection is not valid to allow for layer editing, we need to turn off the tool if it is running bool enable_layer_editing = layers_height_allowed(); From 75525569985c4ef871d764d3228dfc509504ee76 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 5 Mar 2019 16:28:18 +0100 Subject: [PATCH 046/236] New interconnection strategy --- src/libslic3r/SLA/SLASpatIndex.hpp | 2 + src/libslic3r/SLA/SLASupportTree.cpp | 342 +++++++++++++----------- src/libslic3r/SLA/SLASupportTree.hpp | 4 + src/libslic3r/SLA/SLASupportTreeIGL.cpp | 114 ++------ 4 files changed, 216 insertions(+), 246 deletions(-) diff --git a/src/libslic3r/SLA/SLASpatIndex.hpp b/src/libslic3r/SLA/SLASpatIndex.hpp index 792e86c85..e5fbfa7d4 100644 --- a/src/libslic3r/SLA/SLASpatIndex.hpp +++ b/src/libslic3r/SLA/SLASpatIndex.hpp @@ -43,6 +43,8 @@ public: // For testing size_t size() const; bool empty() const { return size() == 0; } + + void foreach(std::function fn); }; } diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 7ffa2274a..204a951db 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -377,6 +377,7 @@ struct Pillar { double r = 1; size_t steps = 0; Vec3d endpoint; + double height = 0; long id = -1; @@ -390,12 +391,12 @@ struct Pillar { { assert(steps > 0); - double h = jp(Z) - endp(Z); - if(h > 0) { // Endpoint is below the starting point + height = jp(Z) - endp(Z); + if(height > 0) { // Endpoint is below the starting point // We just create a bridge geometry with the pillar parameters and // move the data. - Contour3D body = cylinder(radius, h, st, endp); + Contour3D body = cylinder(radius, height, st, endp); mesh.points.swap(body.points); mesh.indices.swap(body.indices); } @@ -410,6 +411,10 @@ struct Pillar { { } + Vec3d startpoint() const { + return {endpoint(X), endpoint(Y), endpoint(Z) + height}; + } + void add_base(double height = 3, double radius = 2) { if(height <= 0) return; @@ -419,23 +424,23 @@ struct Pillar { if(radius < r ) radius = r; double a = 2*PI/steps; - double z = endpoint(2) + height; + double z = endpoint(Z) + height; for(size_t i = 0; i < steps; ++i) { double phi = i*a; - double x = endpoint(0) + r*std::cos(phi); - double y = endpoint(1) + r*std::sin(phi); + double x = endpoint(X) + r*std::cos(phi); + double y = endpoint(Y) + r*std::sin(phi); base.points.emplace_back(x, y, z); } for(size_t i = 0; i < steps; ++i) { double phi = i*a; - double x = endpoint(0) + radius*std::cos(phi); - double y = endpoint(1) + radius*std::sin(phi); + double x = endpoint(X) + radius*std::cos(phi); + double y = endpoint(Y) + radius*std::sin(phi); base.points.emplace_back(x, y, z - height); } - auto ep = endpoint; ep(2) += height; + auto ep = endpoint; ep(Z) += height; base.points.emplace_back(endpoint); base.points.emplace_back(ep); @@ -578,26 +583,15 @@ bool operator==(const SpatElement& e1, const SpatElement& e2) { return e1.second == e2.second; } -// Clustering a set of points by the given criteria. -ClusteredPoints cluster( - const PointSet& points, const std::vector& indices, - std::function pred, - unsigned max_points = 0); +// Clustering a set of points by the given distance. +ClusteredPoints cluster(const std::vector& indices, + std::function pointfn, + double dist, + unsigned max_points); -inline ClusteredPoints cluster( - const PointSet& points, - std::function pred, - unsigned max_points = 0) -{ - std::vector indices(size_t(points.rows()), 0); - std::iota(indices.begin(), indices.end(), 0); - return cluster(points, indices, pred, max_points); -} - -ClusteredPoints cluster_nearest2d( - const PointSet& points, const std::vector& indices, - double dist, - unsigned max_points = 0); +ClusteredPoints cluster(const PointSet& points, + double dist, + unsigned max_points); // This class will hold the support tree meshes with some additional bookkeeping // as well. Various parts of the support geometry are stored separately and are @@ -802,6 +796,8 @@ public: }; +// This function returns the position of the centroid in the input 'clust' +// vector of point indices. template long cluster_centroid(const ClusterEl& clust, std::function pointfn, @@ -1340,10 +1336,16 @@ class SLASupportTree::Algorithm { // than we will bridge to this closer pillar Vec3d qp(querypoint(X), querypoint(Y), gndlvl); - auto ne = spindex.nearest(qp, 1).front(); - const Head& nearhead = m_result.head(ne.second); + auto qres = spindex.nearest(qp, 1); + if(qres.empty()) continue; + auto ne = qres.front(); + const Head& nearhead = m_result.head(ne.second); Vec3d nearhead_jp = nearhead.junction_point(); +// const Pillar& nearpillar = m_result.pillars()[ne.second]; + +// Vec3d nearhead_jp = nearpillar.startpoint(); + double dist2d = distance(qp, ne.first); // Bridge endpoint on the main pillar @@ -1412,6 +1414,149 @@ class SLASupportTree::Algorithm { m_result.add_bridge(headjp, touchjp, r); } + // Interconnection strategy. Pillars with height exceeding H1 will require + // at least one neighbor to connect with. Height exceeding H2 require two + // neighbors. A connection only counts if the height ratio is bigger + // than 20% + void connect_pillars_nearest(unsigned neighbors = 3, + double H1 = 4.0, // min 1 neighbor required + double H2 = 35.0, // min 2 neighbor required + double min_height_ratio = 0.2) + { + // Now comes the algorithm that connects ground pillars with each other. + // Ideally every pillar should be connected with at least one of its + // neighbors if that neighbor is within sufficient distance (a bridge to + // it would not be longer than max_bridge_distance) + + double d = std::cos(m_cfg.bridge_slope) * m_cfg.max_bridge_length_mm; + + std::set pairs; + + m_pillar_index.foreach( + [this, d, &pairs, neighbors, min_height_ratio, H1, H2] + (const SpatElement& el) + { + Vec3d qp = el.first; + + // Query all remaining points within reach + auto qres = m_pillar_index.query([qp, d](const SpatElement& e){ + return distance(e.first, qp) < d; + }); + + // sort the result by distance (have to check if this is needed) + std::sort(qres.begin(), qres.end(), + [qp](const SpatElement& e1, const SpatElement& e2){ + return distance(e1.first, qp) < distance(e2.first, qp); + }); + + const Pillar& pillar = m_result.head_pillar(el.second); + unsigned ncount = 0; + for(auto& re : qres) { + if(re.second == el.second) continue; + + auto hashval = m_pillar_index.size() * el.second + re.second; + if(pairs.find(hashval) != pairs.end()) continue; + + const Pillar& neighborpillar = m_result.head_pillar(re.second); + if(interconnect(pillar, neighborpillar)) { + pairs.insert(hashval); + + // If the interconnection length between the two pillars is + // less than 20% of the longer pillar's height, don't count + if(std::min(pillar.height, neighborpillar.height) / + std::max(pillar.height, neighborpillar.height) > + min_height_ratio) ++ncount; + } + + // 3 connections are enough for one pillar + if(ncount == neighbors) break; + } + + if(ncount < 1 && pillar.height > H1) { + // No neighbors could be found and the pillar is too long. + BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has no " + "neighbors. Head ID: " + << pillar.start_junction_id; + } else if(ncount < 2 && pillar.height > H2) { + // Not enough neighbors to support this pillar + BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has too " + "few neighbors. Head ID: " + << pillar.start_junction_id; + } + }); + } + + // This is the old interconnection strategy which has a lot of imperfections + void connect_pillars_spiderweb() { + std::vector rem; rem.reserve(m_pillar_index.size()); + std::vector ring; + + // Could use an unordered_map instead. Points can be quite many. + std::vector pts(size_t(m_points.rows())); + + m_pillar_index.foreach([&rem, &pts](const SpatElement& e) { + rem.emplace_back(e.second); + pts[e.second] = {e.first(X), e.first(Y)}; + }); + + while(!rem.empty()) { // loop until all the points belong to some ring + m_thr(); + + std::sort(rem.begin(), rem.end()); + + auto newring = pts_convex_hull(rem, + [&pts](unsigned i) { + return pts[i]; // project to 2D in along Z axis + }); + + if(!ring.empty()) { + // inner ring is now in 'newring' and outer ring is in 'ring' + SpatIndex innerring; + for(unsigned i : newring) { m_thr(); + const Pillar& pill = m_result.head_pillar(i); + assert(pill.id >= 0); + innerring.insert(pill.endpoint, unsigned(pill.id)); + } + + // For all pillars in the outer ring find the closest in the + // inner ring and connect them. This will create the spider web + // fashioned connections between pillars + for(unsigned i : ring) { m_thr(); + const Pillar& outerpill = m_result.head_pillar(i); + + auto res = innerring.nearest(outerpill.endpoint, + unsigned(innerring.size())); + + for(auto& ne : res) { + const Pillar& innerpill = m_result.pillars()[ne.second]; + if(interconnect(outerpill, innerpill)) break; + } + } + } + + // no need for newring anymore in the current iteration + ring.swap(newring); + + // now the ring has to be connected with bridge sticks + for(auto it = ring.begin(), next = std::next(it); + next != ring.end(); + ++it, ++next) + { + m_thr(); + const Pillar& pillar = m_result.head_pillar(*it); + const Pillar& nextpillar = m_result.head_pillar(*next); + interconnect(pillar, nextpillar); + } + + auto sring = ring; ClusterEl tmp; + std::sort(sring.begin(), sring.end()); + std::set_difference(rem.begin(), rem.end(), + sring.begin(), sring.end(), + std::back_inserter(tmp)); + rem.swap(tmp); + } + } + public: Algorithm(const SupportConfig& config, @@ -1450,11 +1595,7 @@ public: void filter() { // Get the points that are too close to each other and keep only the // first one - auto aliases = cluster(m_points, - [this](const SpatElement& p, const SpatElement& se) { - m_thr(); - return distance(p.first, se.first) < D_SP; - }, 2); + auto aliases = cluster(m_points, D_SP, 2); PtIndices filtered_indices; filtered_indices.reserve(aliases.size()); @@ -1642,14 +1783,10 @@ public: // These clusters of support points will join in one pillar, // possibly in their centroid support point. auto d_base = 2*m_cfg.base_radius_mm; - auto& thr = m_thr; - m_pillar_clusters = cluster(m_points, ground_head_indices, - [thr, d_base](const SpatElement& p, const SpatElement& s) - { - thr(); - return distance(Vec2d(p.first(X), p.first(Y)), - Vec2d(s.first(X), s.first(Y))) < d_base; - }, 3); // max 3 heads to connect to one pillar + m_pillar_clusters = cluster(ground_head_indices, + [this](unsigned i) { + return m_points.row(i); + }, d_base, 3); } // Step: Routing the ground connected pinheads, and interconnecting @@ -1691,7 +1828,6 @@ public: cl_centroids.push_back(unsigned(cid)); - unsigned hid = cl[cid]; // Head ID Head& h = m_result.head(hid); h.transform(); @@ -1705,8 +1841,7 @@ public: size_t ci = 0; for(auto cl : m_pillar_clusters) { m_thr(); - auto cidx = cl_centroids[ci]; - cl_centroids[ci++] = cl[cidx]; + auto cidx = cl_centroids[ci++]; auto& head = m_result.head(cl[cidx]); @@ -1736,15 +1871,15 @@ public: // at this point we either have our pillar index or we have // to connect the sidehead to the ground if(nearest_id < 0) { + Vec3d pend = Vec3d{sidehead_jp(X), sidehead_jp(Y), gndlvl}; // Could not find a pillar, create one m_result.add_pillar( - unsigned(sidehead.id), - Vec3d{sidehead_jp(X), sidehead_jp(Y), gndlvl}, + unsigned(sidehead.id), pend, pradius).add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); // connects to ground, eligible for bridging - cl_centroids.emplace_back(c); + m_pillar_index.insert(pend, c); } else { // Creating the bridge to the nearest pillar auto nearest_uid = unsigned(nearest_id); @@ -1754,113 +1889,9 @@ public: } } - // We will break down the pillar positions in 2D into concentric - // rings. Connecting the pillars belonging to the same ring will - // prevent bridges from crossing each other. After bridging the - // rings we can create bridges between the rings without the - // possibility of crossing bridges. Two pillars will be bridged - // with X shaped stick pairs. If they are really close to each - // other, than only one stick will be used in zig-zag mode. + // connect_pillars_spiderweb(); + connect_pillars_nearest(); - // Breaking down the points into rings will be done with a modified - // convex hull algorithm (see pts_convex_hull()), that works for - // collinear points as well. If the points are on the same surface, - // they can be part of an imaginary line segment for which the - // convex hull is not defined. I this case it is enough to sort the - // points spatially and create the bridge stick from one endpoint to - // another. - - double d = std::cos(m_cfg.bridge_slope) * m_cfg.max_bridge_length_mm; - auto pclusters = cluster_nearest2d(m_points, cl_centroids, d, 3); - - for(auto& ring : pclusters) { - // now the ring has to be connected with bridge sticks - if(ring.size() > 1) - for(auto it = ring.begin(), next = std::next(it); - next != ring.end(); - ++it, ++next) - { - m_thr(); - const Pillar& pillar = m_result.head_pillar(*it); - const Pillar& nextpillar = m_result.head_pillar(*next); - interconnect(pillar, nextpillar); - } - - if(ring.size() > 2) { - const Pillar& firstpillar = m_result.head_pillar(ring.front()); - const Pillar& lastpillar = m_result.head_pillar(ring.back()); - interconnect(firstpillar, lastpillar); - } - - } - -// ClusterEl rem = cl_centroids; -// ClusterEl ring; - -// while(!rem.empty()) { // loop until all the points belong to some ring -// m_thr(); -// std::sort(rem.begin(), rem.end()); - -// auto& points = m_points; -// auto newring = pts_convex_hull(rem, -// [&points](unsigned i) { -// auto&& p = points.row(i); -// return Vec2d(p(X), p(Y)); // project to 2D in along Z axis -// }); - -// if(!ring.empty()) { -// // inner ring is now in 'newring' and outer ring is in 'ring' -// SpatIndex innerring; -// for(unsigned i : newring) { m_thr(); -// const Pillar& pill = m_result.head_pillar(i); -// assert(pill.id >= 0); -// innerring.insert(pill.endpoint, unsigned(pill.id)); -// } - -// // For all pillars in the outer ring find the closest in the -// // inner ring and connect them. This will create the spider web -// // fashioned connections between pillars -// for(unsigned i : ring) { m_thr(); -// const Pillar& outerpill = m_result.head_pillar(i); - -// auto res = innerring.nearest(outerpill.endpoint, -// unsigned(innerring.size())); - -// for(auto& ne : res) { -// const Pillar& innerpill = m_result.pillars()[ne.second]; -// if(interconnect(outerpill, innerpill)) break; -// } -// } -// } - -// // no need for newring anymore in the current iteration -// ring.swap(newring); - -// /*std::cout << "ring: \n"; -// for(auto ri : ring) { -// std::cout << ri << " " << " X = " << gnd_head_pt(ri)(X) -// << " Y = " << gnd_head_pt(ri)(Y) << std::endl; -// } -// std::cout << std::endl;*/ - -// // now the ring has to be connected with bridge sticks -// for(auto it = ring.begin(), next = std::next(it); -// next != ring.end(); -// ++it, ++next) -// { -// m_thr(); -// const Pillar& pillar = m_result.head_pillar(*it); -// const Pillar& nextpillar = m_result.head_pillar(*next); -// interconnect(pillar, nextpillar); -// } - -// auto sring = ring; ClusterEl tmp; -// std::sort(sring.begin(), sring.end()); -// std::set_difference(rem.begin(), rem.end(), -// sring.begin(), sring.end(), -// std::back_inserter(tmp)); -// rem.swap(tmp); -// } } // Step: routing the pinheads that would connect to the model surface @@ -1890,6 +1921,7 @@ public: groundp(Z) = m_result.ground_level; m_result.add_pillar(endp, groundp, head.r_back_mm).add_base( m_cfg.base_height_mm, m_cfg.base_radius_mm); +// m_pillar_index.insert(groundp, unsigned(head.id)); }; // TODO: connect these to the ground pillars if possible diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index 54e934f3a..d275c7963 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -83,6 +83,10 @@ struct SupportConfig { // The shortest distance of any support structure from the model surface double safety_distance_mm = 0.1; + + double max_solo_pillar_height_mm = 5.0; + + double max_dual_pillar_height_mm = 35.0; }; struct PoolConfig; diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index bd2d16215..d422aae24 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -91,6 +91,11 @@ size_t SpatIndex::size() const return m_impl->m_store.size(); } +void SpatIndex::foreach(std::function fn) +{ + for(auto& el : m_impl->m_store) fn(el); +} + /* **************************************************************************** * EigenMesh3D implementation * ****************************************************************************/ @@ -346,35 +351,11 @@ PointSet normals(const PointSet& points, return ret; } +namespace bgi = boost::geometry::index; +using Index3D = bgi::rtree< SpatElement, bgi::rstar<16, 4> /* ? */ >; -//template double distance(const Vec& p) { -// return std::sqrt(p.transpose() * p); -//} - -//template double distance(const Vec& pp1, const Vec& pp2) { -// auto p = pp2 - pp1; -// return distance(p); -//} - -// Clustering a set of points by the given criteria -ClusteredPoints cluster_nearest2d( - const sla::PointSet& points, const std::vector& indices, - double dist, - unsigned max_points = 0) +ClusteredPoints cluster(Index3D& sindex, double dist, unsigned max_points) { - - namespace bgi = boost::geometry::index; - using Index3D = bgi::rtree< SpatElement, bgi::rstar<16, 4> /* ? */ >; - - // A spatial index for querying the nearest points - Index3D sindex; - - // Build the index - for(unsigned idx : indices) { - Vec3d p = points.row(idx); p(Z) = 0; - sindex.insert( std::make_pair(points.row(idx), idx)); - } - using Elems = std::vector; // Recursive function for visiting all the points in a given distance to @@ -438,79 +419,30 @@ ClusteredPoints cluster_nearest2d( // Clustering a set of points by the given criteria ClusteredPoints cluster( - const sla::PointSet& points, const std::vector& indices, - std::function pred, - unsigned max_points = 0) + const std::vector& indices, + std::function pointfn, + double dist, + unsigned max_points) { - - namespace bgi = boost::geometry::index; - using Index3D = bgi::rtree< SpatElement, bgi::rstar<16, 4> /* ? */ >; - // A spatial index for querying the nearest points Index3D sindex; // Build the index - for(unsigned idx : indices) - sindex.insert( std::make_pair(points.row(idx), idx)); + for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx)); - using Elems = std::vector; + return cluster(sindex, dist, max_points); +} - // Recursive function for visiting all the points in a given distance to - // each other - std::function group = - [&sindex, &group, pred, max_points](Elems& pts, Elems& cluster) - { - for(auto& p : pts) { - std::vector tmp; +ClusteredPoints cluster(const PointSet& pts, double dist, unsigned max_points) +{ + // A spatial index for querying the nearest points + Index3D sindex; - sindex.query( - bgi::satisfies([p, pred](const SpatElement& se) { - return pred(p, se); - }), - std::back_inserter(tmp) - ); + // Build the index + for(Eigen::Index i = 0; i < pts.rows(); i++) + sindex.insert(std::make_pair(Vec3d(pts.row(i)), unsigned(i))); - auto cmp = [](const SpatElement& e1, const SpatElement& e2){ - return e1.second < e2.second; - }; - - std::sort(tmp.begin(), tmp.end(), cmp); - - Elems newpts; - std::set_difference(tmp.begin(), tmp.end(), - cluster.begin(), cluster.end(), - std::back_inserter(newpts), cmp); - - int c = max_points && newpts.size() + cluster.size() > max_points? - int(max_points - cluster.size()) : int(newpts.size()); - - cluster.insert(cluster.end(), newpts.begin(), newpts.begin() + c); - std::sort(cluster.begin(), cluster.end(), cmp); - - if(!newpts.empty() && (!max_points || cluster.size() < max_points)) - group(newpts, cluster); - } - }; - - std::vector clusters; - for(auto it = sindex.begin(); it != sindex.end();) { - Elems cluster = {}; - Elems pts = {*it}; - group(pts, cluster); - - for(auto& c : cluster) sindex.remove(c); - it = sindex.begin(); - - clusters.emplace_back(cluster); - } - - ClusteredPoints result; - for(auto& cluster : clusters) { - result.emplace_back(); - for(auto c : cluster) result.back().emplace_back(c.second); - } - - return result; + return cluster(sindex, dist, max_points); } } From 34e0b6917951803974754c9cb8826ce5b0afba81 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 5 Mar 2019 18:21:20 +0100 Subject: [PATCH 047/236] WIP: sidehead routedown when pillar is too long --- src/libslic3r/SLA/SLASupportTree.cpp | 47 ++++++++++++++-- src/libslic3r/SLA/SLASupportTreeIGL.cpp | 71 ++++++++++++++++++++----- 2 files changed, 100 insertions(+), 18 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 204a951db..525f86e11 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -415,8 +415,8 @@ struct Pillar { return {endpoint(X), endpoint(Y), endpoint(Z) + height}; } - void add_base(double height = 3, double radius = 2) { - if(height <= 0) return; + Pillar& add_base(double height = 3, double radius = 2) { + if(height <= 0) return *this; assert(steps >= 0); auto last = int(steps - 1); @@ -459,7 +459,7 @@ struct Pillar { indices.emplace_back(last, offs + last, offs); indices.emplace_back(hcenter, last, 0); indices.emplace_back(offs, offs + last, lcenter); - + return *this; } bool has_base() const { return !base.points.empty(); } @@ -1472,17 +1472,56 @@ class SLASupportTree::Algorithm { if(ncount == neighbors) break; } + unsigned needpillars = 0; if(ncount < 1 && pillar.height > H1) { - // No neighbors could be found and the pillar is too long. + // No neighbors could not be found and the pillar is too long. BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has no " "neighbors. Head ID: " << pillar.start_junction_id; + +// double D = 2*m_cfg.base_radius_mm; +// Vec3d jp = pillar.startpoint(); +// double h = D / std::cos(m_cfg.bridge_slope); +// bool found = false; +// double phi = 0; + +// // Search for a suitable angle for the two pillars +// while(!found && phi < 2*PI) { + +// } + needpillars = 1; } else if(ncount < 2 && pillar.height > H2) { // Not enough neighbors to support this pillar BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has too " "few neighbors. Head ID: " << pillar.start_junction_id; + needpillars = 2 - ncount; } + + // WIP: + // note: sideheads ARE tested to reach the ground! + + +// if(needpillars > 0) { +// if(pillar.starts_from_head) { +// // search for a sidehead for this head. We will route that +// // to the ground. +// const Head& head = m_result.head(unsigned(pillar.start_junction_id)); +// for(auto cl : m_pillar_clusters) { +// auto it = std::find(cl.begin(), cl.end(), head.id); +// if(it != cl.end()) { +// cl.erase(it); +// for(size_t j = 0; j < cl.size() && j < needpillars; j++) { +// unsigned hid = cl[j]; + +// m_result.add_pillar(hid, endpoint, ) +// .add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); +// } +// } +// } +// } +// } + }); } diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index d422aae24..c368b8604 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -354,26 +354,18 @@ PointSet normals(const PointSet& points, namespace bgi = boost::geometry::index; using Index3D = bgi::rtree< SpatElement, bgi::rstar<16, 4> /* ? */ >; -ClusteredPoints cluster(Index3D& sindex, double dist, unsigned max_points) +ClusteredPoints cluster(Index3D& sindex, unsigned max_points, + std::function(const Index3D&, const SpatElement&)> qfn) { using Elems = std::vector; // Recursive function for visiting all the points in a given distance to // each other std::function group = - [&sindex, &group, max_points, dist](Elems& pts, Elems& cluster) + [&sindex, &group, max_points, qfn](Elems& pts, Elems& cluster) { for(auto& p : pts) { - std::vector tmp; - - sindex.query( - bgi::nearest(p.first, max_points), - std::back_inserter(tmp) - ); - - for(auto it = tmp.begin(); it < tmp.end(); ++it) - if(distance(p.first, it->first) > dist) it = tmp.erase(it); - + std::vector tmp = qfn(sindex, p); auto cmp = [](const SpatElement& e1, const SpatElement& e2){ return e1.second < e2.second; }; @@ -417,6 +409,25 @@ ClusteredPoints cluster(Index3D& sindex, double dist, unsigned max_points) return result; } +namespace { +std::vector distance_queryfn(const Index3D& sindex, + const SpatElement& p, + double dist, + unsigned max_points) +{ + std::vector tmp; tmp.reserve(max_points); + sindex.query( + bgi::nearest(p.first, max_points), + std::back_inserter(tmp) + ); + + for(auto it = tmp.begin(); it < tmp.end(); ++it) + if(distance(p.first, it->first) > dist) it = tmp.erase(it); + + return tmp; +} +} + // Clustering a set of points by the given criteria ClusteredPoints cluster( const std::vector& indices, @@ -430,7 +441,35 @@ ClusteredPoints cluster( // Build the index for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx)); - return cluster(sindex, dist, max_points); + return cluster(sindex, max_points, + [dist, max_points](const Index3D& sidx, const SpatElement& p) + { + return distance_queryfn(sidx, p, dist, max_points); + }); +} + +// Clustering a set of points by the given criteria +ClusteredPoints cluster( + const std::vector& indices, + std::function pointfn, + std::function predicate, + unsigned max_points) +{ + // A spatial index for querying the nearest points + Index3D sindex; + + // Build the index + for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx)); + + return cluster(sindex, max_points, + [max_points, predicate](const Index3D& sidx, const SpatElement& p) + { + std::vector tmp; tmp.reserve(max_points); + sidx.query(bgi::satisfies([p, predicate](const SpatElement& e){ + return predicate(p, e); + }), std::back_inserter(tmp)); + return tmp; + }); } ClusteredPoints cluster(const PointSet& pts, double dist, unsigned max_points) @@ -442,7 +481,11 @@ ClusteredPoints cluster(const PointSet& pts, double dist, unsigned max_points) for(Eigen::Index i = 0; i < pts.rows(); i++) sindex.insert(std::make_pair(Vec3d(pts.row(i)), unsigned(i))); - return cluster(sindex, dist, max_points); + return cluster(sindex, max_points, + [dist, max_points](const Index3D& sidx, const SpatElement& p) + { + return distance_queryfn(sidx, p, dist, max_points); + }); } } From f1f68cfd85d4bee7e0f2248965ef342f673f6649 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 6 Mar 2019 09:28:55 +0100 Subject: [PATCH 048/236] Fixed a crash after a printer preset changing with selected setting's item in an object list --- src/slic3r/GUI/GUI_ObjectList.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index a961c9ffa..44998c14f 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2147,7 +2147,15 @@ void ObjectList::update_settings_items() for (auto& item : items) { const wxDataViewItem& settings_item = m_objects_model->GetSettingsItem(item); select_item(settings_item ? settings_item : m_objects_model->AddSettingsChild(item)); + + // If settings item was deleted from the list, + // it's need to be deleted from selection array, if it was there + if (settings_item != m_objects_model->GetSettingsItem(item) && + sel.Index(settings_item) != wxNOT_FOUND) { + sel.Remove(settings_item); + } } + // restore selection: SetSelections(sel); m_prevent_canvas_selection_update = false; From f147f192b4cb4d641538741c773d0ef3187fdd8c Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 6 Mar 2019 10:09:27 +0100 Subject: [PATCH 049/236] Disabled object context menu when the SLA gizmo is active --- src/slic3r/GUI/GLCanvas3D.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 399ead284..cffc2e521 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5298,7 +5298,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (m_hover_volume_id != -1) { // if right clicking on volume, propagate event through callback (shows context menu) - if (m_volumes.volumes[m_hover_volume_id]->hover && !m_volumes.volumes[m_hover_volume_id]->is_wipe_tower) + if (m_volumes.volumes[m_hover_volume_id]->hover + && !m_volumes.volumes[m_hover_volume_id]->is_wipe_tower // no context menu for the wipe tower + && m_gizmos.get_current_type() != Gizmos::SlaSupports) // disable context menu when the gizmo is open { // forces the selection of the volume if (!m_selection.is_multiple_full_instance()) From 79fbf0840904f00f4915919bd7642bf5e60b0ad8 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 6 Mar 2019 09:15:33 +0100 Subject: [PATCH 050/236] An attempt to fix sla gizmo imgui dialog scaling on osx and hidpi screens --- src/slic3r/GUI/GLGizmo.cpp | 3 ++- src/slic3r/GUI/ImGuiWrapper.hpp | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index afffd670e..ec541b89e 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -2267,7 +2267,8 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l RENDER_AGAIN: m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - static const ImVec2 window_size(285.f, 260.f); + const float scaling = m_imgui->get_style_scaling(); + const ImVec2 window_size(285.f * scaling, 260.f * scaling); ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); ImGui::SetNextWindowSize(ImVec2(window_size)); diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index 019bb610e..35d0b5636 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -42,6 +42,8 @@ public: bool update_mouse_data(wxMouseEvent &evt); bool update_key_data(wxKeyEvent &evt); + float get_style_scaling() const { return m_style_scaling; } + void new_frame(); void render(); From e399cf6d3d3a294fc92ffa334663f863ab182dcb Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 6 Mar 2019 10:21:10 +0100 Subject: [PATCH 051/236] Implemented clipping of parts of multi-part objects in the order they are presented in the UI. Parallelized the slice stealing when splitting regions with modifier meshes. Rewrote Layer::make_perimeters() to C++11 loops. --- src/libslic3r/Layer.cpp | 23 ++-- src/libslic3r/Print.hpp | 1 + src/libslic3r/PrintObject.cpp | 204 +++++++++++++++++++++++++++------- 3 files changed, 177 insertions(+), 51 deletions(-) diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 31baaed33..c1d92c6bb 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -105,13 +105,14 @@ void Layer::make_perimeters() BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id(); // keep track of regions whose perimeters we have already generated - std::set done; + std::vector done(m_regions.size(), false); for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm) { size_t region_id = layerm - m_regions.begin(); - if (done.find(region_id) != done.end()) continue; + if (done[region_id]) + continue; BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id() << ", region " << region_id; - done.insert(region_id); + done[region_id] = true; const PrintRegionConfig &config = (*layerm)->region()->config(); // find compatible regions @@ -131,7 +132,7 @@ void Layer::make_perimeters() && config.thin_walls == other_config.thin_walls && config.external_perimeters_first == other_config.external_perimeters_first) { layerms.push_back(other_layerm); - done.insert(it - m_regions.begin()); + done[it - m_regions.begin()] = true; } } @@ -143,15 +144,13 @@ void Layer::make_perimeters() SurfaceCollection new_slices; { // group slices (surfaces) according to number of extra perimeters - std::map slices; // extra_perimeters => [ surface, surface... ] - for (LayerRegionPtrs::iterator l = layerms.begin(); l != layerms.end(); ++l) { - for (Surfaces::iterator s = (*l)->slices.surfaces.begin(); s != (*l)->slices.surfaces.end(); ++s) { - slices[s->extra_perimeters].push_back(*s); - } - } + std::map slices; // extra_perimeters => [ surface, surface... ] + for (LayerRegion *layerm : layerms) + for (Surface &surface : layerm->slices.surfaces) + slices[surface.extra_perimeters].emplace_back(surface); // merge the surfaces assigned to each group - for (std::map::const_iterator it = slices.begin(); it != slices.end(); ++it) - new_slices.append(union_ex(it->second, true), it->second.front()); + for (std::pair &surfaces_with_extra_perimeters : slices) + new_slices.append(union_ex(surfaces_with_extra_perimeters.second, true), surfaces_with_extra_perimeters.second.front()); } // make perimeters diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 43fd52e18..0eea71046 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -203,6 +203,7 @@ private: std::vector _slice_region(size_t region_id, const std::vector &z, bool modifier); std::vector _slice_volumes(const std::vector &z, const std::vector &volumes) const; + std::vector _slice_volume(const std::vector &z, const ModelVolume &volume) const; }; struct WipeTowerData diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 2349a7445..6c04c7781 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -810,7 +810,7 @@ void PrintObject::process_external_surfaces() for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { m_print->throw_if_canceled(); // BOOST_LOG_TRIVIAL(trace) << "Processing external surface, layer" << m_layers[layer_idx]->print_z; - m_layers[layer_idx]->get_region(region_id)->process_external_surfaces((layer_idx == 0) ? NULL : m_layers[layer_idx - 1]); + m_layers[layer_idx]->get_region((int)region_id)->process_external_surfaces((layer_idx == 0) ? NULL : m_layers[layer_idx - 1]); } } ); @@ -1480,46 +1480,151 @@ void PrintObject::_slice(const std::vector &layer_height_profile) prev = layer; } } + + // Count model parts and modifier meshes, check whether the model parts are of the same region. + int single_volume_region = -2; // not set yet + size_t num_volumes = 0; + size_t num_modifiers = 0; + std::vector map_volume_to_region(this->model_object()->volumes.size()); + for (int region_id = 0; region_id < (int)this->region_volumes.size(); ++ region_id) { + for (int volume_id : this->region_volumes[region_id]) { + const ModelVolume *model_volume = this->model_object()->volumes[volume_id]; + if (model_volume->is_model_part()) { + map_volume_to_region[volume_id] = region_id; + if (single_volume_region == -2) + // first model volume met + single_volume_region = region_id; + else if (single_volume_region != region_id) + // multiple volumes met and they are not equal + single_volume_region = -1; + ++ num_volumes; + } else if (model_volume->is_modifier()) + ++ num_modifiers; + } + } + assert(num_volumes > 0); // Slice all non-modifier volumes. - for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) { - BOOST_LOG_TRIVIAL(debug) << "Slicing objects - region " << region_id; - std::vector expolygons_by_layer = this->_slice_region(region_id, slice_zs, false); - m_print->throw_if_canceled(); - BOOST_LOG_TRIVIAL(debug) << "Slicing objects - append slices " << region_id << " start"; - for (size_t layer_id = 0; layer_id < expolygons_by_layer.size(); ++ layer_id) - m_layers[layer_id]->regions()[region_id]->slices.append(std::move(expolygons_by_layer[layer_id]), stInternal); - m_print->throw_if_canceled(); - BOOST_LOG_TRIVIAL(debug) << "Slicing objects - append slices " << region_id << " end"; + bool clipped = false; + bool upscaled = false; + if (! m_config.clip_multipart_objects.value || single_volume_region >= 0) { + // Cheap path: Slice regions without mutual clipping. + // The cheap path is possible if no clipping is allowed or if slicing volumes of just a single region. + for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) { + BOOST_LOG_TRIVIAL(debug) << "Slicing objects - region " << region_id; + // slicing in parallel + std::vector expolygons_by_layer = this->_slice_region(region_id, slice_zs, false); + m_print->throw_if_canceled(); + BOOST_LOG_TRIVIAL(debug) << "Slicing objects - append slices " << region_id << " start"; + for (size_t layer_id = 0; layer_id < expolygons_by_layer.size(); ++ layer_id) + m_layers[layer_id]->regions()[region_id]->slices.append(std::move(expolygons_by_layer[layer_id]), stInternal); + m_print->throw_if_canceled(); + BOOST_LOG_TRIVIAL(debug) << "Slicing objects - append slices " << region_id << " end"; + } + } else { + // Expensive path: Slice one volume after the other in the order they are presented at the user interface, + // clip the last volumes with the first. + // First slice the volumes. + struct SlicedVolume { + SlicedVolume(int volume_id, int region_id, std::vector &&expolygons_by_layer) : + volume_id(volume_id), region_id(region_id), expolygons_by_layer(std::move(expolygons_by_layer)) {} + int volume_id; + int region_id; + std::vector expolygons_by_layer; + }; + std::vector sliced_volumes; + sliced_volumes.reserve(num_volumes); + for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) + for (int volume_id : this->region_volumes[region_id]) { + const ModelVolume *model_volume = this->model_object()->volumes[volume_id]; + if (model_volume->is_model_part()) { + BOOST_LOG_TRIVIAL(debug) << "Slicing objects - volume " << volume_id; + // slicing in parallel + sliced_volumes.emplace_back(volume_id, map_volume_to_region[volume_id], this->_slice_volume(slice_zs, *model_volume)); + } + } + // Second clip the volumes in the order they are presented at the user interface. + BOOST_LOG_TRIVIAL(debug) << "Slicing objects - parallel clipping - start"; + tbb::parallel_for( + tbb::blocked_range(0, slice_zs.size()), + [this, &sliced_volumes, num_modifiers](const tbb::blocked_range& range) { + float delta = float(scale_(m_config.xy_size_compensation.value)); + // Only upscale together with clipping if there are no modifiers, as the modifiers shall be applied before upscaling + // (upscaling may grow the object outside of the modifier mesh). + bool upscale = delta > 0 && num_modifiers == 0; + for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) { + m_print->throw_if_canceled(); + // Trim volumes in a single layer, one by the other, possibly apply upscaling. + { + Polygons processed; + for (SlicedVolume &sliced_volume : sliced_volumes) { + ExPolygons slices = std::move(sliced_volume.expolygons_by_layer[layer_id]); + if (upscale) + slices = offset_ex(std::move(slices), delta); + if (! processed.empty()) + // Trim by the slices of already processed regions. + slices = diff_ex(to_polygons(std::move(slices)), processed); + if (size_t(&sliced_volume - &sliced_volumes.front()) + 1 < sliced_volumes.size()) + // Collect the already processed regions to trim the to be processed regions. + polygons_append(processed, slices); + sliced_volume.expolygons_by_layer[layer_id] = std::move(slices); + } + } + // Collect and union volumes of a single region. + for (int region_id = 0; region_id < (int)this->region_volumes.size(); ++ region_id) { + ExPolygons expolygons; + size_t num_volumes = 0; + for (SlicedVolume &sliced_volume : sliced_volumes) + if (sliced_volume.region_id == region_id && ! sliced_volume.expolygons_by_layer[layer_id].empty()) { + ++ num_volumes; + append(expolygons, std::move(sliced_volume.expolygons_by_layer[layer_id])); + } + if (num_volumes > 1) + // Merge the islands using a positive / negative offset. + expolygons = offset_ex(offset_ex(expolygons, float(scale_(EPSILON))), -float(scale_(EPSILON))); + m_layers[layer_id]->regions()[region_id]->slices.append(std::move(expolygons), stInternal); + } + } + }); + BOOST_LOG_TRIVIAL(debug) << "Slicing objects - parallel clipping - end"; + clipped = true; + upscaled = m_config.xy_size_compensation.value > 0 && num_modifiers == 0; } // Slice all modifier volumes. if (this->region_volumes.size() > 1) { for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) { BOOST_LOG_TRIVIAL(debug) << "Slicing modifier volumes - region " << region_id; + // slicing in parallel std::vector expolygons_by_layer = this->_slice_region(region_id, slice_zs, true); m_print->throw_if_canceled(); + if (expolygons_by_layer.empty()) + continue; // loop through the other regions and 'steal' the slices belonging to this one BOOST_LOG_TRIVIAL(debug) << "Slicing modifier volumes - stealing " << region_id << " start"; - for (size_t other_region_id = 0; other_region_id < this->region_volumes.size(); ++ other_region_id) { - if (region_id == other_region_id) - continue; - for (size_t layer_id = 0; layer_id < expolygons_by_layer.size(); ++ layer_id) { - Layer *layer = m_layers[layer_id]; - LayerRegion *layerm = layer->m_regions[region_id]; - LayerRegion *other_layerm = layer->m_regions[other_region_id]; - if (layerm == nullptr || other_layerm == nullptr) - continue; - Polygons other_slices = to_polygons(other_layerm->slices); - ExPolygons my_parts = intersection_ex(other_slices, to_polygons(expolygons_by_layer[layer_id])); - if (my_parts.empty()) - continue; - // Remove such parts from original region. - other_layerm->slices.set(diff_ex(other_slices, to_polygons(my_parts)), stInternal); - // Append new parts to our region. - layerm->slices.append(std::move(my_parts), stInternal); - } - } + tbb::parallel_for( + tbb::blocked_range(0, m_layers.size()), + [this, &expolygons_by_layer, region_id](const tbb::blocked_range& range) { + for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) { + for (size_t other_region_id = 0; other_region_id < this->region_volumes.size(); ++ other_region_id) { + if (region_id == other_region_id) + continue; + Layer *layer = m_layers[layer_id]; + LayerRegion *layerm = layer->m_regions[region_id]; + LayerRegion *other_layerm = layer->m_regions[other_region_id]; + if (layerm == nullptr || other_layerm == nullptr) + continue; + Polygons other_slices = to_polygons(other_layerm->slices); + ExPolygons my_parts = intersection_ex(other_slices, to_polygons(expolygons_by_layer[layer_id])); + if (my_parts.empty()) + continue; + // Remove such parts from original region. + other_layerm->slices.set(diff_ex(other_slices, to_polygons(my_parts)), stInternal); + // Append new parts to our region. + layerm->slices.append(std::move(my_parts), stInternal); + } + } + }); m_print->throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Slicing modifier volumes - stealing " << region_id << " end"; } @@ -1542,7 +1647,7 @@ end: BOOST_LOG_TRIVIAL(debug) << "Slicing objects - make_slices in parallel - begin"; tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), - [this](const tbb::blocked_range& range) { + [this, upscaled, clipped](const tbb::blocked_range& range) { for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) { m_print->throw_if_canceled(); Layer *layer = m_layers[layer_id]; @@ -1569,8 +1674,8 @@ end: offset_ex(to_expolygons(std::move(layerm->slices.surfaces)), delta); // Apply the elephant foot compensation. if (elephant_foot_compensation > 0) { - float elephant_foot_spacing = layerm->flow(frExternalPerimeter).scaled_elephant_foot_spacing(); - float external_perimeter_nozzle = scale_(this->print()->config().nozzle_diameter.get_at(layerm->region()->config().perimeter_extruder.value - 1)); + float elephant_foot_spacing = float(layerm->flow(frExternalPerimeter).scaled_elephant_foot_spacing()); + float external_perimeter_nozzle = float(scale_(this->print()->config().nozzle_diameter.get_at(layerm->region()->config().perimeter_extruder.value - 1))); // Apply the elephant foot compensation by steps of 1/10 nozzle diameter. float steps = std::ceil(elephant_foot_compensation / (0.1f * external_perimeter_nozzle)); size_t nsteps = size_t(steps); @@ -1584,9 +1689,8 @@ end: layerm->slices.set(std::move(expolygons), stInternal); } } else { - bool upscale = delta > 0.f; - bool downscale = delta < 0.f || elephant_foot_compensation > 0.f; - bool clip = m_config.clip_multipart_objects.value; + bool upscale = ! upscaled && delta > 0.f; + bool clip = ! clipped && m_config.clip_multipart_objects.value; if (upscale || clip) { // Multiple regions, growing or just clipping one region by the other. // When clipping the regions, priority is given to the first regions. @@ -1607,7 +1711,7 @@ end: } if (delta < 0.f) { // Apply the negative XY compensation. - Polygons trimming = offset(layer->merged(EPSILON), delta - EPSILON); + Polygons trimming = offset(layer->merged(float(EPSILON)), delta - float(EPSILON)); for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) layer->m_regions[region_id]->trim_surfaces(trimming); } @@ -1618,8 +1722,8 @@ end: float external_perimeter_nozzle = 0.f; for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) { LayerRegion *layerm = layer->m_regions[region_id]; - elephant_foot_spacing.emplace_back(layerm->flow(frExternalPerimeter).scaled_elephant_foot_spacing()); - external_perimeter_nozzle += scale_(this->print()->config().nozzle_diameter.get_at(layerm->region()->config().perimeter_extruder.value - 1)); + elephant_foot_spacing.emplace_back(float(layerm->flow(frExternalPerimeter).scaled_elephant_foot_spacing())); + external_perimeter_nozzle += float(scale_(this->print()->config().nozzle_diameter.get_at(layerm->region()->config().perimeter_extruder.value - 1))); } external_perimeter_nozzle /= (float)layer->m_regions.size(); // Apply the elephant foot compensation by steps of 1/10 nozzle diameter. @@ -1627,7 +1731,7 @@ end: size_t nsteps = size_t(steps); float step = elephant_foot_compensation / steps; for (size_t i = 0; i < nsteps; ++ i) { - Polygons trimming_polygons = offset(layer->merged(EPSILON), - step - EPSILON); + Polygons trimming_polygons = offset(layer->merged(float(EPSILON)), - step - float(EPSILON)); for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) layer->m_regions[region_id]->elephant_foot_compensation_step(elephant_foot_spacing[region_id] + step, trimming_polygons); } @@ -1709,6 +1813,28 @@ std::vector PrintObject::_slice_volumes(const std::vector &z, return layers; } +std::vector PrintObject::_slice_volume(const std::vector &z, const ModelVolume &volume) const +{ + std::vector layers; + // Compose mesh. + //FIXME better to perform slicing over each volume separately and then to use a Boolean operation to merge them. + TriangleMesh mesh(volume.mesh); + mesh.transform(volume.get_matrix()); + if (mesh.stl.stats.number_of_facets > 0) { + mesh.transform(m_trafo); + // apply XY shift + mesh.translate(- unscale(m_copies_shift(0)), - unscale(m_copies_shift(1)), 0); + // perform actual slicing + TriangleMeshSlicer mslicer; + const Print *print = this->print(); + auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();}); + mslicer.init(&mesh, callback); + mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback); + m_print->throw_if_canceled(); + } + return layers; +} + std::string PrintObject::_fix_slicing_errors() { // Collect layers with slicing errors. From 219ea04c233b71bb80395a3c4234261171810c50 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 6 Mar 2019 10:22:10 +0100 Subject: [PATCH 052/236] Fix of #1812 (GCode Anayzer take in account extruder offsets for multiextruder printers) --- src/libslic3r/GCode.cpp | 13 +++++-------- src/libslic3r/GCode/Analyzer.cpp | 21 ++++----------------- src/libslic3r/GCode/Analyzer.hpp | 9 +++------ src/libslic3r/Technologies.hpp | 2 -- 4 files changed, 12 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 31be220a6..2907415bf 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -574,17 +574,16 @@ void GCode::_do_export(Print &print, FILE *file) // resets analyzer m_analyzer.reset(); -#if ENABLE_ANALYZER_EXTRUDER_OFFSET + // send extruder offset data to analyzer - std::vector extruder_offsets; + GCodeAnalyzer::ExtruderOffsetsMap extruder_offsets; for (unsigned int extruder_id : print.extruders()) { - extruder_offsets.push_back(print.config().extruder_offset.get_at(extruder_id)); + Vec2d offset = print.config().extruder_offset.get_at(extruder_id); + if (!offset.isApprox(Vec2d::Zero())) + extruder_offsets[extruder_id] = offset; } - m_analyzer.set_extruder_offsets(extruder_offsets); -#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET - // resets analyzer's tracking data m_last_mm3_per_mm = GCodeAnalyzer::Default_mm3_per_mm; @@ -855,9 +854,7 @@ void GCode::_do_export(Print &print, FILE *file) for (unsigned int extruder_id : print.extruders()) { const Vec2d &extruder_offset = print.config().extruder_offset.get_at(extruder_id); Polygon s(outer_skirt); -#if !ENABLE_ANALYZER_EXTRUDER_OFFSET s.translate(Point::new_scale(-extruder_offset(0), -extruder_offset(1))); -#endif // !ENABLE_ANALYZER_EXTRUDER_OFFSET skirts.emplace_back(std::move(s)); } m_ooze_prevention.enable = true; diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp index a561504ba..e1fb140bb 100644 --- a/src/libslic3r/GCode/Analyzer.cpp +++ b/src/libslic3r/GCode/Analyzer.cpp @@ -101,12 +101,10 @@ GCodeAnalyzer::GCodeAnalyzer() reset(); } -#if ENABLE_ANALYZER_EXTRUDER_OFFSET -void GCodeAnalyzer::set_extruder_offsets(const std::vector& extruder_offsets) +void GCodeAnalyzer::set_extruder_offsets(const GCodeAnalyzer::ExtruderOffsetsMap& extruder_offsets) { m_extruder_offsets = extruder_offsets; } -#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET void GCodeAnalyzer::reset() { @@ -125,9 +123,7 @@ void GCodeAnalyzer::reset() _reset_axes_position(); m_moves_map.clear(); -#if ENABLE_ANALYZER_EXTRUDER_OFFSET m_extruder_offsets.clear(); -#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET } const std::string& GCodeAnalyzer::process_gcode(const std::string& gcode) @@ -664,24 +660,15 @@ void GCodeAnalyzer::_store_move(GCodeAnalyzer::GCodeMove::EType type) it = m_moves_map.insert(TypeToMovesMap::value_type(type, GCodeMovesList())).first; // store move -#if ENABLE_ANALYZER_EXTRUDER_OFFSET Vec3d extruder_offset = Vec3d::Zero(); unsigned int extruder_id = _get_extruder_id(); - - std::cout << extruder_id << std::endl; - - if (extruder_id < m_extruder_offsets.size()) - { - Vec2d offset = m_extruder_offsets[extruder_id]; - extruder_offset = Vec3d(offset(0), offset(1), 0.0); - } + ExtruderOffsetsMap::iterator extr_it = m_extruder_offsets.find(extruder_id); + if (extr_it != m_extruder_offsets.end()) + extruder_offset = Vec3d(extr_it->second(0), extr_it->second(1), 0.0); Vec3d start_position = _get_start_position() + extruder_offset; Vec3d end_position = _get_end_position() + extruder_offset; it->second.emplace_back(type, _get_extrusion_role(), extruder_id, _get_mm3_per_mm(), _get_width(), _get_height(), _get_feedrate(), start_position, end_position, _get_delta_extrusion(), _get_cp_color_id()); -#else - it->second.emplace_back(type, _get_extrusion_role(), _get_extruder_id(), _get_mm3_per_mm(), _get_width(), _get_height(), _get_feedrate(), _get_start_position(), _get_end_position(), _get_delta_extrusion(), _get_cp_color_id()); -#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET } bool GCodeAnalyzer::_is_valid_extrusion_role(int value) const diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp index fb15bde07..c74a4558c 100644 --- a/src/libslic3r/GCode/Analyzer.hpp +++ b/src/libslic3r/GCode/Analyzer.hpp @@ -86,6 +86,7 @@ public: typedef std::vector GCodeMovesList; typedef std::map TypeToMovesMap; + typedef std::map ExtruderOffsetsMap; private: struct State @@ -104,9 +105,7 @@ private: State m_state; GCodeReader m_parser; TypeToMovesMap m_moves_map; -#if ENABLE_ANALYZER_EXTRUDER_OFFSET - std::vector m_extruder_offsets; -#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET + ExtruderOffsetsMap m_extruder_offsets; // The output of process_layer() std::string m_process_output; @@ -114,9 +113,7 @@ private: public: GCodeAnalyzer(); -#if ENABLE_ANALYZER_EXTRUDER_OFFSET - void set_extruder_offsets(const std::vector& extruder_offsets); -#endif // ENABLE_ANALYZER_EXTRUDER_OFFSET + void set_extruder_offsets(const ExtruderOffsetsMap& extruder_offsets); // Reinitialize the analyzer void reset(); diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 560067c37..e978b5838 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -58,7 +58,5 @@ // Toolbars and Gizmos use icons imported from svg files #define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) -// G-Code Analyzer takes in account for extruder offsets -#define ENABLE_ANALYZER_EXTRUDER_OFFSET (0 && ENABLE_1_42_0_ALPHA8) #endif // _technologies_h_ From 1bb5630eaa36afbec8c205f60dfeff6d8007e4ed Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 6 Mar 2019 10:47:48 +0100 Subject: [PATCH 053/236] Fixed gizmos' imgui dialog x position --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index cffc2e521..19aff8469 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3205,7 +3205,7 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan if (it->second->get_state() == GLGizmoBase::On) { float toolbar_top = (float)cnv_h - canvas.m_view_toolbar->get_height(); #if ENABLE_SVG_ICONS - it->second->render_input_window(2.0f * scaled_border + scaled_icons_size * zoom, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); + it->second->render_input_window(2.0f * m_overlay_border + m_overlay_icons_size, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); #else it->second->render_input_window(2.0f * m_overlay_border + icon_size * zoom, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); #endif // ENABLE_SVG_ICONS From de06db7989d2753ae8bdc0539a434e1f9482b238 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 6 Mar 2019 12:09:20 +0100 Subject: [PATCH 054/236] Allow dragging of objects also along world Z axis in side views --- src/slic3r/GUI/GLCanvas3D.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 19aff8469..9a8b6c469 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5354,11 +5354,14 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) GLfloat matrix[16]; ::glGetFloatv(GL_MODELVIEW_MATRIX, matrix); Vec3d camera_right((double)matrix[0], (double)matrix[4], (double)matrix[8]); + Vec3d camera_up((double)matrix[1], (double)matrix[5], (double)matrix[9]); - // finds projection of the vector along the camera right axis - double projection = inters_vec.dot(camera_right); + // finds projection of the vector along the camera axes + double projection_x = inters_vec.dot(camera_right); + double projection_z = inters_vec.dot(camera_up); - cur_pos = m_mouse.drag.start_position_3D + projection * camera_right; + // apply offset + cur_pos = m_mouse.drag.start_position_3D + projection_x * camera_right + projection_z * camera_up; } else { From 2c99fd35d38934604c8976aa4b499c80c3eea7b6 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 5 Mar 2019 10:54:03 +0100 Subject: [PATCH 055/236] Force canvas resize when switching between views --- src/slic3r/GUI/GLCanvas3D.cpp | 8 +++++--- src/slic3r/GUI/GLTexture.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9a8b6c469..2f7d1a5c5 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5137,11 +5137,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) auto *top_level_wnd = dynamic_cast(p); if (top_level_wnd && top_level_wnd->IsActive()) m_canvas->SetFocus(); - // forces a frame render to ensure that m_hover_volume_id is updated even when the user right clicks while + m_mouse.position = pos.cast(); + // 1) forces a frame render to ensure that m_hover_volume_id is updated even when the user right clicks while // the context menu is shown, ensuring it to disappear if the mouse is outside any volume and to // change the volume hover state if any is under the mouse - m_mouse.position = pos.cast(); - render(); + // 2) when switching between 3d view and preview the size of the canvas changes if the side panels are visible, + // so forces a resize to avoid multiple renders with different sizes (seen as flickering) + _refresh_if_shown_on_screen(); } m_mouse.set_start_position_2D_as_invalid(); //#endif diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index ab83d8051..b48ca2044 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -165,7 +165,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector panels; Sidebar *sidebar; Bed3D bed; From 809ffedcb588713a3f32326ba739cab132eefac9 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 6 Mar 2019 11:38:09 +0100 Subject: [PATCH 056/236] Gizmos' grabbers size proportional to the average of the bounding box edges lengths --- src/slic3r/GUI/GLGizmo.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index ec541b89e..720da1c0f 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -981,7 +981,7 @@ void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const ::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f); - float grabber_max_size = (float)std::max(grabber_size(0), std::max(grabber_size(1), grabber_size(2))); + float grabber_mean_size = (float)(grabber_size(0) + grabber_size(1) + grabber_size(2)) / 3.0f; if (m_hover_id == -1) { @@ -1007,7 +1007,7 @@ void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const render_grabbers_connection(8, 9); render_grabbers_connection(9, 6); // draw grabbers - render_grabbers(grabber_max_size); + render_grabbers(grabber_mean_size); } else if ((m_hover_id == 0) || (m_hover_id == 1)) { @@ -1015,8 +1015,8 @@ void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const ::glColor3fv(m_grabbers[0].color); render_grabbers_connection(0, 1); // draw grabbers - m_grabbers[0].render(true, grabber_max_size); - m_grabbers[1].render(true, grabber_max_size); + m_grabbers[0].render(true, grabber_mean_size); + m_grabbers[1].render(true, grabber_mean_size); } else if ((m_hover_id == 2) || (m_hover_id == 3)) { @@ -1024,8 +1024,8 @@ void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const ::glColor3fv(m_grabbers[2].color); render_grabbers_connection(2, 3); // draw grabbers - m_grabbers[2].render(true, grabber_max_size); - m_grabbers[3].render(true, grabber_max_size); + m_grabbers[2].render(true, grabber_mean_size); + m_grabbers[3].render(true, grabber_mean_size); } else if ((m_hover_id == 4) || (m_hover_id == 5)) { @@ -1033,8 +1033,8 @@ void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const ::glColor3fv(m_grabbers[4].color); render_grabbers_connection(4, 5); // draw grabbers - m_grabbers[4].render(true, grabber_max_size); - m_grabbers[5].render(true, grabber_max_size); + m_grabbers[4].render(true, grabber_mean_size); + m_grabbers[5].render(true, grabber_mean_size); } else if (m_hover_id >= 6) { @@ -1047,7 +1047,7 @@ void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const // draw grabbers for (int i = 6; i < 10; ++i) { - m_grabbers[i].render(true, grabber_max_size); + m_grabbers[i].render(true, grabber_mean_size); } } } From 0a2ef07ca05865d0027013a56f22d5f6fe6f1e64 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 6 Mar 2019 15:21:07 +0100 Subject: [PATCH 057/236] Reworking sidehead to pillar connections. --- src/libslic3r/SLA/SLASupportTree.cpp | 307 +++++++++++++++------------ 1 file changed, 171 insertions(+), 136 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 525f86e11..64c30d592 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -376,7 +376,7 @@ struct Pillar { Contour3D base; double r = 1; size_t steps = 0; - Vec3d endpoint; + Vec3d endpt; double height = 0; long id = -1; @@ -387,7 +387,7 @@ struct Pillar { Pillar(const Vec3d& jp, const Vec3d& endp, double radius = 1, size_t st = 45): - r(radius), steps(st), endpoint(endp), starts_from_head(false) + r(radius), steps(st), endpt(endp), starts_from_head(false) { assert(steps > 0); @@ -411,10 +411,12 @@ struct Pillar { { } - Vec3d startpoint() const { - return {endpoint(X), endpoint(Y), endpoint(Z) + height}; + inline Vec3d startpoint() const { + return {endpt(X), endpt(Y), endpt(Z) + height}; } + inline const Vec3d& endpoint() const { return endpt; } + Pillar& add_base(double height = 3, double radius = 2) { if(height <= 0) return *this; @@ -424,24 +426,24 @@ struct Pillar { if(radius < r ) radius = r; double a = 2*PI/steps; - double z = endpoint(Z) + height; + double z = endpt(Z) + height; for(size_t i = 0; i < steps; ++i) { double phi = i*a; - double x = endpoint(X) + r*std::cos(phi); - double y = endpoint(Y) + r*std::sin(phi); + double x = endpt(X) + r*std::cos(phi); + double y = endpt(Y) + r*std::sin(phi); base.points.emplace_back(x, y, z); } for(size_t i = 0; i < steps; ++i) { double phi = i*a; - double x = endpoint(X) + radius*std::cos(phi); - double y = endpoint(Y) + radius*std::sin(phi); + double x = endpt(X) + radius*std::cos(phi); + double y = endpt(Y) + radius*std::sin(phi); base.points.emplace_back(x, y, z - height); } - auto ep = endpoint; ep(Z) += height; - base.points.emplace_back(endpoint); + auto ep = endpt; ep(Z) += height; + base.points.emplace_back(endpt); base.points.emplace_back(ep); auto& indices = base.indices; @@ -593,6 +595,12 @@ ClusteredPoints cluster(const PointSet& points, double dist, unsigned max_points); +ClusteredPoints cluster( + const std::vector& indices, + std::function pointfn, + std::function predicate, + unsigned max_points); + // This class will hold the support tree meshes with some additional bookkeeping // as well. Various parts of the support geometry are stored separately and are // merged when the caller queries the merged mesh. The merged result is cached @@ -962,7 +970,7 @@ ClusterEl pts_convex_hull(const ClusterEl& inpts, return hull; } -Vec3d dirv(const Vec3d& startp, const Vec3d& endp) { +inline Vec3d dirv(const Vec3d& startp, const Vec3d& endp) { return (endp - startp).normalized(); } @@ -1236,8 +1244,8 @@ class SLASupportTree::Algorithm { Vec3d supper = phead.junction_point(); Vec3d slower = nextphead.junction_point(); - Vec3d eupper = pillar.endpoint; - Vec3d elower = nextpillar.endpoint; + Vec3d eupper = pillar.endpt; + Vec3d elower = nextpillar.endpt; double zmin = m_result.ground_level + m_cfg.base_height_mm; eupper(Z) = std::max(eupper(Z), zmin); @@ -1318,16 +1326,110 @@ class SLASupportTree::Algorithm { return was_connected; } - // Search for the nearest pillar to the given query point which is not - // further than max_dist. The result is the pillar ID or -1 if nothing was - // found. The pillar search is carried out using the m_pillar_index - // structure. - long search_nearest(const Vec3d& querypoint, double max_dist) - { + // For connecting a head to a nearby pillar. + bool connect_to_nearpillar(const Head& head, const Pillar& nearpillar) { +// Vec3d hjp = head.junction_point(); +// Vec3d headjp = hjp; +// Vec3d nearheadjp = nearhead.junction_point(); +// double r = m_cfg.head_back_radius_mm; + +// double d = distance(Vec2d{headjp(X), headjp(Y)}, +// Vec2d{nearheadjp(X), nearheadjp(Y)}); + +// // Touching point on the nearby pillar +// Vec3d touchjp(nearheadjp(X), nearheadjp(Y), headjp(Z) + +// d * std::tan(-m_cfg.bridge_slope)); + +// // If the touching point is too high, we can add a partial pillar from +// // under the higher head to reach the nearby pillar with a bridge +// if(touchjp(Z) > nearheadjp(Z)) { +// double hdiff = touchjp(Z) - nearheadjp(Z); +// headjp(Z) -= hdiff; +// touchjp(Z) -= hdiff; + +// // create a pillar without base, +// // it doesn't connect to ground just to an existing shorter pillar +// m_result.add_pillar(unsigned(nearhead.id), headjp, r); +// } + +// if(headjp(Z) < hjp(Z)) m_result.add_junction(headjp, r); +// if(touchjp(Z) >= nearheadjp(Z)) m_result.add_junction(touchjp, r); + +// m_result.add_bridge(headjp, touchjp, r); + + Vec3d headjp = head.junction_point(); + Vec3d nearjp_u = nearpillar.startpoint(); + Vec3d nearjp_l = nearpillar.endpoint(); + + double r = head.r_back_mm; + double d2d = distance(to_2d(headjp), to_2d(nearjp_u)); + double d3d = distance(headjp, nearjp_u); + + double hdiff = nearjp_u(Z) - headjp(Z); + double slope = std::atan2(hdiff, d2d); + + Vec3d bridgestart = headjp; + Vec3d bridgeend = nearjp_u; + double max_len = m_cfg.max_bridge_length_mm; + double max_slope = m_cfg.bridge_slope; + double zdiff = 0.0; + + // check the default situation if feasible for a bridge + if(d3d > max_len || slope > -max_slope) { + // not feasible to connect the two head junctions. We have to search + // for a suitable touch point. + + double Zdown = headjp(Z) + d2d * std::tan(-max_slope); + Vec3d touchjp = bridgeend; touchjp(Z) = Zdown; + double D = distance(headjp, touchjp); + double zdiff = Zdown - nearjp_u(Z); + + if(zdiff > 0) { + Zdown -= zdiff; + bridgestart(Z) -= zdiff; + touchjp(Z) = Zdown; + + double t = bridge_mesh_intersect(bridgestart, {0,0,-1}, r); + + // We can't insert a pillar under the source head to connect + // with the nearby pillar's starting junction + if(t < zdiff) return false; + } + + if(Zdown <= nearjp_u(Z) && Zdown >= nearjp_l(Z) && D < max_len) + bridgeend(Z) = Zdown; + else + return false; + } + + // There will be a minimum distance from the ground where the + // bridge is allowed to connect. This is an empiric value. + double minz = m_result.ground_level + 2 * m_cfg.head_width_mm; + if(bridgeend(Z) < minz) return false; + + double t = bridge_mesh_intersect(bridgestart, + dirv(bridgestart, bridgeend), r); + + // Cannot insert the bridge. (further search might not worth the hassle) + if(t < distance(bridgestart, bridgeend)) return false; + + // A partial pillar is needed under the starting head. + if(zdiff > 0) { + m_result.add_pillar(unsigned(head.id), bridgestart, r); + m_result.add_junction(bridgestart, r); + } + + m_result.add_bridge(bridgestart, bridgeend, r); + + return true; + } + + bool search_pillar_and_connect(const Head& head) { SpatIndex spindex = m_pillar_index; long nearest_id = -1; - const double gndlvl = m_result.ground_level; + + Vec3d querypoint = head.junction_point(); while(nearest_id < 0 && !spindex.empty()) { m_thr(); // loop until a suitable head is not found @@ -1335,83 +1437,25 @@ class SLASupportTree::Algorithm { // (this may happen as the clustering is not perfect) // than we will bridge to this closer pillar - Vec3d qp(querypoint(X), querypoint(Y), gndlvl); + Vec3d qp(querypoint(X), querypoint(Y), m_result.ground_level); auto qres = spindex.nearest(qp, 1); - if(qres.empty()) continue; + if(qres.empty()) break; auto ne = qres.front(); - const Head& nearhead = m_result.head(ne.second); - Vec3d nearhead_jp = nearhead.junction_point(); -// const Pillar& nearpillar = m_result.pillars()[ne.second]; + nearest_id = ne.second; -// Vec3d nearhead_jp = nearpillar.startpoint(); - - double dist2d = distance(qp, ne.first); - - // Bridge endpoint on the main pillar - Vec3d bridge_ep(nearhead_jp(X), nearhead_jp(Y), querypoint(Z) + - dist2d * std::tan(-m_cfg.bridge_slope)); - - if(bridge_ep(Z) > nearhead_jp(Z)) { - // If the sidepoint cannot connect to the pillar - // from its head junction, just skip this pillar. - spindex.remove(ne); - continue; + assert(nearest_id >= 0); + if(nearest_id >= 0) { + auto nearheadid = unsigned(nearest_id); + const Pillar& nearpillar = m_result.head_pillar(nearheadid); + if(!connect_to_nearpillar(head, nearpillar)) { + nearest_id = -1; // continue searching + spindex.remove(ne); // without the current pillar + } } - - double d = distance(querypoint, bridge_ep); - - // There will be a minimum distance from the ground where the - // bridge is allowed to connect. This is an empiric value. - double minz = gndlvl + 2 * m_cfg.head_width_mm; - - // WARNING: previously, max_bridge_length was divided by two. - // I don't remember if this was intentional or by accident. There - // is no logical reason why it shouldn't be used directly. - if(bridge_ep(Z) <= minz || d > max_dist) break; - - double chkd = bridge_mesh_intersect(querypoint, - dirv(querypoint, bridge_ep), - m_cfg.head_back_radius_mm); - - if(chkd >= d) nearest_id = ne.second; - - spindex.remove(ne); - } - return nearest_id; - } - - inline long search_nearest(const Vec3d& qp) { - return search_nearest(qp, m_cfg.max_bridge_length_mm); - } - - void connect_to_nearhead(const Head& head, const Head& nearhead) { - Vec3d hjp = head.junction_point(); - Vec3d headjp = hjp; - Vec3d nearheadjp = nearhead.junction_point(); - double r = m_cfg.head_back_radius_mm; - - double d = distance(Vec2d{headjp(X), headjp(Y)}, - Vec2d{nearheadjp(X), nearheadjp(Y)}); - - Vec3d touchjp(nearheadjp(X), nearheadjp(Y), headjp(Z) + - d * std::tan(-m_cfg.bridge_slope)); - - if(touchjp(Z) > nearheadjp(Z)) { - double hdiff = touchjp(Z) - nearheadjp(Z); - headjp(Z) -= hdiff; - touchjp(Z) -= hdiff; - - // create a pillar without base, - // it doesn't connect to ground just to an existing - // shorter pillar - m_result.add_pillar(unsigned(nearhead.id), headjp, r); } - if(headjp(Z) < hjp(Z)) m_result.add_junction(headjp, r); - if(touchjp(Z) >= nearheadjp(Z)) m_result.add_junction(touchjp, r); - - m_result.add_bridge(headjp, touchjp, r); + return nearest_id >= 0; } // Interconnection strategy. Pillars with height exceeding H1 will require @@ -1554,7 +1598,7 @@ class SLASupportTree::Algorithm { for(unsigned i : newring) { m_thr(); const Pillar& pill = m_result.head_pillar(i); assert(pill.id >= 0); - innerring.insert(pill.endpoint, unsigned(pill.id)); + innerring.insert(pill.endpt, unsigned(pill.id)); } // For all pillars in the outer ring find the closest in the @@ -1563,7 +1607,7 @@ class SLASupportTree::Algorithm { for(unsigned i : ring) { m_thr(); const Pillar& outerpill = m_result.head_pillar(i); - auto res = innerring.nearest(outerpill.endpoint, + auto res = innerring.nearest(outerpill.endpt, unsigned(innerring.size())); for(auto& ne : res) { @@ -1821,11 +1865,16 @@ public: // from each other in the XY plane to not cross their pillar bases // These clusters of support points will join in one pillar, // possibly in their centroid support point. - auto d_base = 2*m_cfg.base_radius_mm; - m_pillar_clusters = cluster(ground_head_indices, - [this](unsigned i) { - return m_points.row(i); - }, d_base, 3); + auto pointfn = [this](unsigned i) { + return m_result.head(i).junction_point(); + }; + auto predicate = [this](const SpatElement& e1, const SpatElement& e2) { + double d2d = distance(to_2d(e1.first), to_2d(e2.first)); + double d3d = distance(e1.first, e2.first); + return d2d < 2*m_cfg.base_radius_mm && + d3d < m_cfg.max_bridge_length_mm; + }; + m_pillar_clusters = cluster(ground_head_indices, pointfn, predicate, 3); } // Step: Routing the ground connected pinheads, and interconnecting @@ -1863,15 +1912,16 @@ public: }); assert(lcid >= 0); - auto cid = unsigned(lcid); + unsigned hid = cl[size_t(lcid)]; // Head ID - cl_centroids.push_back(unsigned(cid)); + cl_centroids.emplace_back(hid); - unsigned hid = cl[cid]; // Head ID Head& h = m_result.head(hid); h.transform(); Vec3d p = h.junction_point(); p(Z) = gndlvl; - m_pillar_index.insert(p, hid); + m_result.add_pillar(hid, p, h.r_back_mm) + .add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); + m_pillar_index.insert(p, hid); // TODO: replace hid with pillarID } // now we will go through the clusters ones again and connect the @@ -1882,35 +1932,23 @@ public: auto cidx = cl_centroids[ci++]; - auto& head = m_result.head(cl[cidx]); - - Vec3d startpoint = head.junction_point(); - auto endpoint = startpoint; endpoint(Z) = gndlvl; - - // Create the central pillar of the cluster with its base on the - // ground - m_result.add_pillar(unsigned(head.id), endpoint, pradius) - .add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); - - // Process side point in current cluster - cl.erase(cl.begin() + cidx); // delete the centroid - // TODO: don't consider the cluster centroid but calculate a // central position where the pillar can be placed. this way // the weight is distributed more effectively on the pillar. + const Pillar& centerpillar = m_result.head_pillar(cidx); + for(auto c : cl) { m_thr(); + if(c == cidx) continue; + auto& sidehead = m_result.head(c); sidehead.transform(); - Vec3d sidehead_jp = sidehead.junction_point(); - long nearest_id = search_nearest(sidehead_jp, - m_cfg.max_bridge_length_mm/2); - - // at this point we either have our pillar index or we have - // to connect the sidehead to the ground - if(nearest_id < 0) { - Vec3d pend = Vec3d{sidehead_jp(X), sidehead_jp(Y), gndlvl}; + if(!connect_to_nearpillar(sidehead, centerpillar) && + !search_pillar_and_connect(sidehead)) + { + Vec3d pstart = sidehead.junction_point(); + Vec3d pend = Vec3d{pstart(X), pstart(Y), gndlvl}; // Could not find a pillar, create one m_result.add_pillar( unsigned(sidehead.id), pend, @@ -1919,11 +1957,6 @@ public: // connects to ground, eligible for bridging m_pillar_index.insert(pend, c); - } else { - // Creating the bridge to the nearest pillar - auto nearest_uid = unsigned(nearest_id); - const Head& nearhead = m_result.head(nearest_uid); - connect_to_nearhead(sidehead, nearhead); } } } @@ -1975,14 +2008,16 @@ public: // Search nearby pillar // ///////////////////////////////////////////////////////////////// - long nearest_pillar_id = search_nearest(hjp); - if(nearest_pillar_id >= 0) { // successful search - auto nearest_uid = unsigned(nearest_pillar_id); - const Head& nearhead = m_result.head(nearest_uid); - head.transform(); // accept the head - connect_to_nearhead(head, nearhead); - continue; - } + if(search_pillar_and_connect(head)) continue; + +// long nearest_pillar_id = search_nearest(hjp); +// if(nearest_pillar_id >= 0) { // successful search +// auto nearest_uid = unsigned(nearest_pillar_id); +// const Pillar& nearpillar = m_result.head_pillar(nearest_uid); +// head.transform(); // accept the head +// connect_to_nearpillar(head, nearpillar); +// continue; +// } // ///////////////////////////////////////////////////////////////// // Try straight path From 2a6de99f06404b9599f178024d00c239934887b4 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 4 Mar 2019 11:38:29 +0100 Subject: [PATCH 058/236] Fixed rotation of multiple volumes selection --- src/slic3r/GUI/GLCanvas3D.cpp | 7 +++++-- src/slic3r/GUI/GLCanvas3D.hpp | 3 +++ src/slic3r/GUI/GLGizmo.cpp | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2f7d1a5c5..0e5ee1991 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -805,6 +805,7 @@ GLCanvas3D::Selection::VolumeCache::TransformCache::TransformCache() , rotation_matrix(Transform3d::Identity()) , scale_matrix(Transform3d::Identity()) , mirror_matrix(Transform3d::Identity()) + , full_matrix(Transform3d::Identity()) { } @@ -813,6 +814,7 @@ GLCanvas3D::Selection::VolumeCache::TransformCache::TransformCache(const Geometr , rotation(transform.get_rotation()) , scaling_factor(transform.get_scaling_factor()) , mirror(transform.get_mirror()) + , full_matrix(transform.get_matrix()) { rotation_matrix = Geometry::assemble_transform(Vec3d::Zero(), rotation); scale_matrix = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scaling_factor); @@ -1331,8 +1333,9 @@ void GLCanvas3D::Selection::rotate(const Vec3d& rotation, GLCanvas3D::Transforma Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); if (transformation_type.joint()) { - Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() + m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); - volume.set_volume_offset(m_cache.dragging_center - m_cache.volumes_data[i].get_instance_position() + offset); + Vec3d local_pivot = m_cache.volumes_data[i].get_instance_full_matrix().inverse() * m_cache.dragging_center; + Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() - local_pivot); + volume.set_volume_offset(local_pivot + offset); } volume.set_volume_rotation(new_rotation); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 51a1e9213..ae6155876 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -468,6 +468,7 @@ public: Transform3d rotation_matrix; Transform3d scale_matrix; Transform3d mirror_matrix; + Transform3d full_matrix; TransformCache(); explicit TransformCache(const Geometry::Transformation& transform); @@ -487,6 +488,7 @@ public: const Transform3d& get_volume_rotation_matrix() const { return m_volume.rotation_matrix; } const Transform3d& get_volume_scale_matrix() const { return m_volume.scale_matrix; } const Transform3d& get_volume_mirror_matrix() const { return m_volume.mirror_matrix; } + const Transform3d& get_volume_full_matrix() const { return m_volume.full_matrix; } const Vec3d& get_instance_position() const { return m_instance.position; } const Vec3d& get_instance_rotation() const { return m_instance.rotation; } @@ -495,6 +497,7 @@ public: const Transform3d& get_instance_rotation_matrix() const { return m_instance.rotation_matrix; } const Transform3d& get_instance_scale_matrix() const { return m_instance.scale_matrix; } const Transform3d& get_instance_mirror_matrix() const { return m_instance.mirror_matrix; } + const Transform3d& get_instance_full_matrix() const { return m_instance.full_matrix; } }; typedef std::map VolumesCache; diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 720da1c0f..22023825f 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -646,7 +646,7 @@ void GLGizmoRotate::transform_to_local(const GLCanvas3D::Selection& selection) c { ::glTranslated(m_center(0), m_center(1), m_center(2)); - if (selection.is_single_volume() || selection.is_single_modifier()) + if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) { Transform3d orient_matrix = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true); ::glMultMatrixd(orient_matrix.data()); @@ -703,7 +703,7 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons } } - if (selection.is_single_volume() || selection.is_single_modifier()) + if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) m = m * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true).inverse(); m.translate(-m_center); From efd3d274251a3e0ca3fe39630c2a8b60177ba703 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 6 Mar 2019 18:00:34 +0100 Subject: [PATCH 059/236] Experimental working version of onmodel pillar cascading. --- src/libslic3r/SLA/SLASupportTree.cpp | 314 ++++----------------------- 1 file changed, 46 insertions(+), 268 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 64c30d592..de2bb274b 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -854,122 +854,6 @@ long cluster_centroid(const ClusterEl& clust, return long(minit - avgs.begin()); } -/** - * This function will calculate the convex hull of the input point set and - * return the indices of those points belonging to the chull in the right - * (counter clockwise) order. The input is also the set of indices and a - * functor to get the actual point form the index. - * - * I've adapted this algorithm from here: - * https://www.geeksforgeeks.org/convex-hull-set-1-jarviss-algorithm-or-wrapping/ - * and modified it so that it starts with the leftmost lower vertex. Also added - * support for floating point coordinates. - * - * This function is a modded version of the standard convex hull. If the points - * are all collinear with each other, it will return their indices in spatially - * subsequent order (the order they appear on the screen). - */ -ClusterEl pts_convex_hull(const ClusterEl& inpts, - std::function pfn) -{ - using Point = Vec2d; - using std::vector; - - static const double ERR = 1e-3; - - auto orientation = [](const Point& p, const Point& q, const Point& r) - { - double val = (q(Y) - p(Y)) * (r(X) - q(X)) - - (q(X) - p(X)) * (r(Y) - q(Y)); - - if (std::abs(val) < ERR) return 0; // collinear - return (val > ERR)? 1: 2; // clock or counterclockwise - }; - - size_t n = inpts.size(); - - if (n < 3) return inpts; - - // Initialize Result - ClusterEl hull; - vector points; points.reserve(n); - for(auto i : inpts) { - points.emplace_back(pfn(i)); - } - - // Check if the triplet of points is collinear. The standard convex hull - // algorithms are not capable of handling such input properly. - bool collinear = true; - for(auto one = points.begin(), two = std::next(one), three = std::next(two); - three != points.end() && collinear; - ++one, ++two, ++three) - { - // check if the points are collinear - if(orientation(*one, *two, *three) != 0) collinear = false; - } - - // Find the leftmost (bottom) point - size_t l = 0; - for (size_t i = 1; i < n; i++) { - if(std::abs(points[i](X) - points[l](X)) < ERR) { - if(points[i](Y) < points[l](Y)) l = i; - } - else if (points[i](X) < points[l](X)) l = i; - } - - if(collinear) { - // fill the output with the spatially ordered set of points. - - // find the direction - hull = inpts; - auto& lp = points[l]; - std::sort(hull.begin(), hull.end(), - [&lp, points](unsigned i1, unsigned i2) { - // compare the distance from the leftmost point - return distance(lp, points[i1]) < distance(lp, points[i2]); - }); - - return hull; - } - - // TODO: this algorithm is O(m*n) and O(n^2) in the worst case so it needs - // to be replaced with a graham scan or something O(nlogn) - - // Start from leftmost point, keep moving counterclockwise - // until reach the start point again. This loop runs O(h) - // times where h is number of points in result or output. - size_t p = l; - do - { - // Add current point to result - hull.push_back(inpts[p]); - - // Search for a point 'q' such that orientation(p, x, - // q) is counterclockwise for all points 'x'. The idea - // is to keep track of last visited most counterclock- - // wise point in q. If any point 'i' is more counterclock- - // wise than q, then update q. - size_t q = (p + 1) % n; - for (size_t i = 0; i < n; i++) - { - // If i is more counterclockwise than current q, then - // update q - if (orientation(points[p], points[i], points[q]) == 2) q = i; - } - - // Now q is the most counterclockwise with respect to p - // Set p as q for next iteration, so that q is added to - // result 'hull' - p = q; - - } while (p != l); // While we don't come to first point - - auto first = hull.front(); - hull.emplace_back(first); - - return hull; -} - inline Vec3d dirv(const Vec3d& startp, const Vec3d& endp) { return (endp - startp).normalized(); } @@ -1230,10 +1114,6 @@ class SLASupportTree::Algorithm { // Helper function for interconnecting two pillars with zig-zag bridges. bool interconnect(const Pillar& pillar, const Pillar& nextpillar) { - // Get the starting heads corresponding to the given pillars - const Head& phead = m_result.pillar_head(pillar.id); - const Head& nextphead = m_result.pillar_head(nextpillar.id); - // We need to get the starting point of the zig-zag pattern. We have to // be aware that the two head junctions are at different heights. We // may start from the lowest junction and call it a day but this @@ -1242,8 +1122,8 @@ class SLASupportTree::Algorithm { // pillar could still be bridged with the shorter one. bool was_connected = false; - Vec3d supper = phead.junction_point(); - Vec3d slower = nextphead.junction_point(); + Vec3d supper = pillar.startpoint(); + Vec3d slower = nextpillar.startpoint(); Vec3d eupper = pillar.endpt; Vec3d elower = nextpillar.endpt; @@ -1328,35 +1208,6 @@ class SLASupportTree::Algorithm { // For connecting a head to a nearby pillar. bool connect_to_nearpillar(const Head& head, const Pillar& nearpillar) { -// Vec3d hjp = head.junction_point(); -// Vec3d headjp = hjp; -// Vec3d nearheadjp = nearhead.junction_point(); -// double r = m_cfg.head_back_radius_mm; - -// double d = distance(Vec2d{headjp(X), headjp(Y)}, -// Vec2d{nearheadjp(X), nearheadjp(Y)}); - -// // Touching point on the nearby pillar -// Vec3d touchjp(nearheadjp(X), nearheadjp(Y), headjp(Z) + -// d * std::tan(-m_cfg.bridge_slope)); - -// // If the touching point is too high, we can add a partial pillar from -// // under the higher head to reach the nearby pillar with a bridge -// if(touchjp(Z) > nearheadjp(Z)) { -// double hdiff = touchjp(Z) - nearheadjp(Z); -// headjp(Z) -= hdiff; -// touchjp(Z) -= hdiff; - -// // create a pillar without base, -// // it doesn't connect to ground just to an existing shorter pillar -// m_result.add_pillar(unsigned(nearhead.id), headjp, r); -// } - -// if(headjp(Z) < hjp(Z)) m_result.add_junction(headjp, r); -// if(touchjp(Z) >= nearheadjp(Z)) m_result.add_junction(touchjp, r); - -// m_result.add_bridge(headjp, touchjp, r); - Vec3d headjp = head.junction_point(); Vec3d nearjp_u = nearpillar.startpoint(); Vec3d nearjp_l = nearpillar.endpoint(); @@ -1382,14 +1233,14 @@ class SLASupportTree::Algorithm { double Zdown = headjp(Z) + d2d * std::tan(-max_slope); Vec3d touchjp = bridgeend; touchjp(Z) = Zdown; double D = distance(headjp, touchjp); - double zdiff = Zdown - nearjp_u(Z); + zdiff = Zdown - nearjp_u(Z); if(zdiff > 0) { Zdown -= zdiff; bridgestart(Z) -= zdiff; touchjp(Z) = Zdown; - double t = bridge_mesh_intersect(bridgestart, {0,0,-1}, r); + double t = bridge_mesh_intersect(headjp, {0,0,-1}, r); // We can't insert a pillar under the source head to connect // with the nearby pillar's starting junction @@ -1446,8 +1297,8 @@ class SLASupportTree::Algorithm { assert(nearest_id >= 0); if(nearest_id >= 0) { - auto nearheadid = unsigned(nearest_id); - const Pillar& nearpillar = m_result.head_pillar(nearheadid); + auto nearpillarID = unsigned(nearest_id); + const Pillar& nearpillar = m_result.pillars()[nearpillarID]; if(!connect_to_nearpillar(head, nearpillar)) { nearest_id = -1; // continue searching spindex.remove(ne); // without the current pillar @@ -1462,7 +1313,7 @@ class SLASupportTree::Algorithm { // at least one neighbor to connect with. Height exceeding H2 require two // neighbors. A connection only counts if the height ratio is bigger // than 20% - void connect_pillars_nearest(unsigned neighbors = 3, + void connect_pillars_nearest(unsigned neighbors = 1, double H1 = 4.0, // min 1 neighbor required double H2 = 35.0, // min 2 neighbor required double min_height_ratio = 0.2) @@ -1493,7 +1344,7 @@ class SLASupportTree::Algorithm { return distance(e1.first, qp) < distance(e2.first, qp); }); - const Pillar& pillar = m_result.head_pillar(el.second); + const Pillar& pillar = m_result.pillars()[el.second]; unsigned ncount = 0; for(auto& re : qres) { if(re.second == el.second) continue; @@ -1501,7 +1352,7 @@ class SLASupportTree::Algorithm { auto hashval = m_pillar_index.size() * el.second + re.second; if(pairs.find(hashval) != pairs.end()) continue; - const Pillar& neighborpillar = m_result.head_pillar(re.second); + const Pillar& neighborpillar = m_result.pillars()[re.second]; if(interconnect(pillar, neighborpillar)) { pairs.insert(hashval); @@ -1522,17 +1373,6 @@ class SLASupportTree::Algorithm { BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has no " "neighbors. Head ID: " << pillar.start_junction_id; - -// double D = 2*m_cfg.base_radius_mm; -// Vec3d jp = pillar.startpoint(); -// double h = D / std::cos(m_cfg.bridge_slope); -// bool found = false; -// double phi = 0; - -// // Search for a suitable angle for the two pillars -// while(!found && phi < 2*PI) { - -// } needpillars = 1; } else if(ncount < 2 && pillar.height > H2) { // Not enough neighbors to support this pillar @@ -1545,7 +1385,6 @@ class SLASupportTree::Algorithm { // WIP: // note: sideheads ARE tested to reach the ground! - // if(needpillars > 0) { // if(pillar.starts_from_head) { // // search for a sidehead for this head. We will route that @@ -1569,77 +1408,6 @@ class SLASupportTree::Algorithm { }); } - // This is the old interconnection strategy which has a lot of imperfections - void connect_pillars_spiderweb() { - std::vector rem; rem.reserve(m_pillar_index.size()); - std::vector ring; - - // Could use an unordered_map instead. Points can be quite many. - std::vector pts(size_t(m_points.rows())); - - m_pillar_index.foreach([&rem, &pts](const SpatElement& e) { - rem.emplace_back(e.second); - pts[e.second] = {e.first(X), e.first(Y)}; - }); - - while(!rem.empty()) { // loop until all the points belong to some ring - m_thr(); - - std::sort(rem.begin(), rem.end()); - - auto newring = pts_convex_hull(rem, - [&pts](unsigned i) { - return pts[i]; // project to 2D in along Z axis - }); - - if(!ring.empty()) { - // inner ring is now in 'newring' and outer ring is in 'ring' - SpatIndex innerring; - for(unsigned i : newring) { m_thr(); - const Pillar& pill = m_result.head_pillar(i); - assert(pill.id >= 0); - innerring.insert(pill.endpt, unsigned(pill.id)); - } - - // For all pillars in the outer ring find the closest in the - // inner ring and connect them. This will create the spider web - // fashioned connections between pillars - for(unsigned i : ring) { m_thr(); - const Pillar& outerpill = m_result.head_pillar(i); - - auto res = innerring.nearest(outerpill.endpt, - unsigned(innerring.size())); - - for(auto& ne : res) { - const Pillar& innerpill = m_result.pillars()[ne.second]; - if(interconnect(outerpill, innerpill)) break; - } - } - } - - // no need for newring anymore in the current iteration - ring.swap(newring); - - // now the ring has to be connected with bridge sticks - for(auto it = ring.begin(), next = std::next(it); - next != ring.end(); - ++it, ++next) - { - m_thr(); - const Pillar& pillar = m_result.head_pillar(*it); - const Pillar& nextpillar = m_result.head_pillar(*next); - interconnect(pillar, nextpillar); - } - - auto sring = ring; ClusterEl tmp; - std::sort(sring.begin(), sring.end()); - std::set_difference(rem.begin(), rem.end(), - sring.begin(), sring.end(), - std::back_inserter(tmp)); - rem.swap(tmp); - } - } - public: Algorithm(const SupportConfig& config, @@ -1919,9 +1687,12 @@ public: Head& h = m_result.head(hid); h.transform(); Vec3d p = h.junction_point(); p(Z) = gndlvl; - m_result.add_pillar(hid, p, h.r_back_mm) - .add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); - m_pillar_index.insert(p, hid); // TODO: replace hid with pillarID + auto& plr = m_result.add_pillar(hid, p, h.r_back_mm) + .add_base(m_cfg.base_height_mm, + m_cfg.base_radius_mm); + + // Save the pillar endpoint and the pillar id in the spatial index + m_pillar_index.insert(plr.endpoint(), unsigned(plr.id)); } // now we will go through the clusters ones again and connect the @@ -1950,20 +1721,16 @@ public: Vec3d pstart = sidehead.junction_point(); Vec3d pend = Vec3d{pstart(X), pstart(Y), gndlvl}; // Could not find a pillar, create one - m_result.add_pillar( - unsigned(sidehead.id), pend, - pradius).add_base(m_cfg.base_height_mm, - m_cfg.base_radius_mm); + auto& pillar = m_result.add_pillar(unsigned(sidehead.id), + pend, pradius) + .add_base(m_cfg.base_height_mm, + m_cfg.base_radius_mm); // connects to ground, eligible for bridging - m_pillar_index.insert(pend, c); + m_pillar_index.insert(pend, unsigned(pillar.id)); } } } - - // connect_pillars_spiderweb(); - connect_pillars_nearest(); - } // Step: routing the pinheads that would connect to the model surface @@ -1991,11 +1758,14 @@ public: auto groundp = endp; groundp(Z) = m_result.ground_level; - m_result.add_pillar(endp, groundp, head.r_back_mm).add_base( - m_cfg.base_height_mm, m_cfg.base_radius_mm); -// m_pillar_index.insert(groundp, unsigned(head.id)); + auto& newpillar = m_result.add_pillar(endp, groundp, head.r_back_mm) + .add_base(m_cfg.base_height_mm, + m_cfg.base_radius_mm); + m_pillar_index.insert(groundp, unsigned(newpillar.id)); }; + std::vector modelpillars; + // TODO: connect these to the ground pillars if possible for(auto item : m_iheads_onmodel) { m_thr(); unsigned idx = item.first; @@ -2008,16 +1778,7 @@ public: // Search nearby pillar // ///////////////////////////////////////////////////////////////// - if(search_pillar_and_connect(head)) continue; - -// long nearest_pillar_id = search_nearest(hjp); -// if(nearest_pillar_id >= 0) { // successful search -// auto nearest_uid = unsigned(nearest_pillar_id); -// const Pillar& nearpillar = m_result.head_pillar(nearest_uid); -// head.transform(); // accept the head -// connect_to_nearpillar(head, nearpillar); -// continue; -// } + if(search_pillar_and_connect(head)) { head.transform(); continue; } // ///////////////////////////////////////////////////////////////// // Try straight path @@ -2085,7 +1846,6 @@ public: d = 0; t = oresult.score; - polar = std::get<0>(oresult.optimum); azimuth = std::get<1>(oresult.optimum); Vec3d bridgedir = Vec3d(std::cos(azimuth) * std::sin(polar), @@ -2143,6 +1903,9 @@ public: tailhead.transform(); pill.base = tailhead.mesh; + + // Experimental: add the pillar to the index for cascading + modelpillars.emplace_back(unsigned(pill.id)); continue; } @@ -2152,6 +1915,15 @@ public: << " ID: " << idx; head.invalidate(); } + + for(auto pillid : modelpillars) { + auto& pillar = m_result.pillars()[pillid]; + m_pillar_index.insert(pillar.endpoint(), pillid); + } + } + + void cascade_pillars() { + connect_pillars_nearest(); } // Step: process the support points where there is not enough space for a @@ -2211,6 +1983,7 @@ bool SLASupportTree::generate(const std::vector &support_points, CLASSIFY, ROUTING_GROUND, ROUTING_NONGROUND, + CASCADE_PILLARS, HEADLESS, DONE, ABORT, @@ -2235,6 +2008,8 @@ bool SLASupportTree::generate(const std::vector &support_points, std::bind(&Algorithm::routing_to_model, &alg), + std::bind(&Algorithm::cascade_pillars, &alg), + std::bind(&Algorithm::routing_headless, &alg), [] () { @@ -2268,6 +2043,7 @@ bool SLASupportTree::generate(const std::vector &support_points, L("Classification"), L("Routing to ground"), L("Routing supports to model surface"), + L("Cascading pillars"), L("Processing small holes"), L("Done"), L("Abort") @@ -2281,6 +2057,7 @@ bool SLASupportTree::generate(const std::vector &support_points, 60, 70, 80, + 90, 100, 0 }; @@ -2293,7 +2070,8 @@ bool SLASupportTree::generate(const std::vector &support_points, case PINHEADS: pc = CLASSIFY; break; case CLASSIFY: pc = ROUTING_GROUND; break; case ROUTING_GROUND: pc = ROUTING_NONGROUND; break; - case ROUTING_NONGROUND: pc = HEADLESS; break; + case ROUTING_NONGROUND: pc = CASCADE_PILLARS; break; + case CASCADE_PILLARS: pc = HEADLESS; break; case HEADLESS: pc = DONE; break; case DONE: case ABORT: break; From aa0737fa5ef2cf3ecbaecd74c3ac80f1fb77aaaa Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 7 Mar 2019 10:08:21 +0100 Subject: [PATCH 060/236] Fixed assert after try to add Part to Object with several Instances from the ObjectList. + Fixed selection on the 3DScene before a context menu showing --- src/slic3r/GUI/GLCanvas3D.cpp | 10 +++++++--- src/slic3r/GUI/GUI_ObjectList.cpp | 7 +++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 0e5ee1991..8415e8c24 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5308,14 +5308,18 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) && m_gizmos.get_current_type() != Gizmos::SlaSupports) // disable context menu when the gizmo is open { // forces the selection of the volume - if (!m_selection.is_multiple_full_instance()) + /** #ys_FIXME_to_delete after testing: + * Next condition allows a multiple instance selection for the context menu, + * which has no reason. So it's commented till next testing + */ +// if (!m_selection.is_multiple_full_instance()) // #ys_FIXME_to_delete m_selection.add(m_hover_volume_id); m_gizmos.update_on_off_state(m_selection); post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); _update_gizmos_data(); wxGetApp().obj_manipul()->update_settings_value(m_selection); -// // forces a frame render to update the view before the context menu is shown -// render(); + // forces a frame render to update the view before the context menu is shown + render(); Vec2d logical_pos = pos.cast(); #if ENABLE_RETINA_GL diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 44998c14f..a4ce8fe12 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1256,8 +1256,11 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode const GLCanvas3D::Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); assert(obj_idx == selection.get_object_idx()); - // Selected instance index in ModelObject. Only valid if there is only one instance selected in the selection. - int instance_idx = selection.get_instance_idx(); + + /** Any changes of the Object's composition is duplicated for all Object's Instances + * So, It's enough to take a bounding box of a first selected Instance and calculate Part(generic_subobject) position + */ + int instance_idx = *selection.get_instance_idxs().begin(); assert(instance_idx != -1); if (instance_idx == -1) return; From 8756a1455737d1cdc78bb477a7ec607d84e968a2 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 7 Mar 2019 10:56:17 +0100 Subject: [PATCH 061/236] Fixed crash on "stoi argument out of range" from SpinConrol (SPE-847) --- src/slic3r/GUI/Field.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 0d65e0ef5..dc0550b3b 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -464,8 +464,14 @@ void SpinCtrl::BUILD() { // # As a workaround, we get the new value from $event->GetString and store // # here temporarily so that we can return it from $self->get_value std::string value = e.GetString().utf8_str().data(); - if (is_matched(value, "^\\-?\\d+$")) - tmp_value = std::stoi(value); + if (is_matched(value, "^\\-?\\d+$")) { + try { + tmp_value = std::stoi(value); + } + catch (const std::exception & /* e */) { + tmp_value = -9999; + } + } else tmp_value = -9999; #ifdef __WXOSX__ propagate_value(); From 9131b1658aefd0495343fc70f92ea33d92d37054 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 7 Mar 2019 12:01:21 +0100 Subject: [PATCH 062/236] Replacing simplex optimizers with more intelligent genetic ones. --- src/libslic3r/SLA/SLASupportTree.cpp | 235 ++++++++++++++------------- src/libslic3r/SLA/SLASupportTree.hpp | 16 +- 2 files changed, 132 insertions(+), 119 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index de2bb274b..547ad8527 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include #include @@ -63,6 +63,19 @@ namespace Slic3r { namespace sla { +// Compile time configuration value definitions: + +// The max Z angle for a normal at which it will get completely ignored. +const double SupportConfig::normal_cutoff_angle = 150.0 * M_PI / 180.0; + +// The shortest distance of any support structure from the model surface +const double SupportConfig::safety_distance_mm = 0.1; + +const double SupportConfig::max_solo_pillar_height_mm = 5.0; +const double SupportConfig::max_dual_pillar_height_mm = 35.0; +const double SupportConfig::optimizer_rel_score_diff = 1e-6; +const unsigned SupportConfig::optimizer_max_iterations = 500; + using Coordf = double; using Portion = std::tuple; @@ -1309,105 +1322,6 @@ class SLASupportTree::Algorithm { return nearest_id >= 0; } - // Interconnection strategy. Pillars with height exceeding H1 will require - // at least one neighbor to connect with. Height exceeding H2 require two - // neighbors. A connection only counts if the height ratio is bigger - // than 20% - void connect_pillars_nearest(unsigned neighbors = 1, - double H1 = 4.0, // min 1 neighbor required - double H2 = 35.0, // min 2 neighbor required - double min_height_ratio = 0.2) - { - // Now comes the algorithm that connects ground pillars with each other. - // Ideally every pillar should be connected with at least one of its - // neighbors if that neighbor is within sufficient distance (a bridge to - // it would not be longer than max_bridge_distance) - - double d = std::cos(m_cfg.bridge_slope) * m_cfg.max_bridge_length_mm; - - std::set pairs; - - m_pillar_index.foreach( - [this, d, &pairs, neighbors, min_height_ratio, H1, H2] - (const SpatElement& el) - { - Vec3d qp = el.first; - - // Query all remaining points within reach - auto qres = m_pillar_index.query([qp, d](const SpatElement& e){ - return distance(e.first, qp) < d; - }); - - // sort the result by distance (have to check if this is needed) - std::sort(qres.begin(), qres.end(), - [qp](const SpatElement& e1, const SpatElement& e2){ - return distance(e1.first, qp) < distance(e2.first, qp); - }); - - const Pillar& pillar = m_result.pillars()[el.second]; - unsigned ncount = 0; - for(auto& re : qres) { - if(re.second == el.second) continue; - - auto hashval = m_pillar_index.size() * el.second + re.second; - if(pairs.find(hashval) != pairs.end()) continue; - - const Pillar& neighborpillar = m_result.pillars()[re.second]; - if(interconnect(pillar, neighborpillar)) { - pairs.insert(hashval); - - // If the interconnection length between the two pillars is - // less than 20% of the longer pillar's height, don't count - if(std::min(pillar.height, neighborpillar.height) / - std::max(pillar.height, neighborpillar.height) > - min_height_ratio) ++ncount; - } - - // 3 connections are enough for one pillar - if(ncount == neighbors) break; - } - - unsigned needpillars = 0; - if(ncount < 1 && pillar.height > H1) { - // No neighbors could not be found and the pillar is too long. - BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has no " - "neighbors. Head ID: " - << pillar.start_junction_id; - needpillars = 1; - } else if(ncount < 2 && pillar.height > H2) { - // Not enough neighbors to support this pillar - BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has too " - "few neighbors. Head ID: " - << pillar.start_junction_id; - needpillars = 2 - ncount; - } - - // WIP: - // note: sideheads ARE tested to reach the ground! - -// if(needpillars > 0) { -// if(pillar.starts_from_head) { -// // search for a sidehead for this head. We will route that -// // to the ground. -// const Head& head = m_result.head(unsigned(pillar.start_junction_id)); -// for(auto cl : m_pillar_clusters) { -// auto it = std::find(cl.begin(), cl.end(), head.id); -// if(it != cl.end()) { -// cl.erase(it); -// for(size_t j = 0; j < cl.size() && j < needpillars; j++) { -// unsigned hid = cl[j]; - -// m_result.add_pillar(hid, endpoint, ) -// .add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); -// } -// } -// } -// } -// } - - }); - } - public: Algorithm(const SupportConfig& config, @@ -1468,9 +1382,8 @@ public: using libnest2d::opt::bound; using libnest2d::opt::initvals; - using libnest2d::opt::SimplexOptimizer; + using libnest2d::opt::GeneticOptimizer; using libnest2d::opt::StopCriteria; - static const unsigned MAX_TRIES = 100; for(unsigned i = 0, fidx = filtered_indices[0]; i < filtered_indices.size(); ++i, fidx = filtered_indices[i]) @@ -1525,10 +1438,10 @@ public: // geometry and its very close to the default. StopCriteria stc; - stc.max_iterations = MAX_TRIES; - stc.relative_score_difference = 1e-3; + stc.max_iterations = m_cfg.optimizer_max_iterations; + stc.relative_score_difference = m_cfg.optimizer_rel_score_diff; stc.stop_score = w; // space greater than w is enough - SimplexOptimizer solver(stc); + GeneticOptimizer solver(stc); auto oresult = solver.optimize_max( [this, pin_r, w, hp](double plr, double azm) @@ -1538,8 +1451,8 @@ public: std::cos(plr)).normalized(); double score = pinhead_mesh_intersect( hp, n, pin_r, - m_cfg.head_back_radius_mm, - w); + m_cfg.head_back_radius_mm, w); + return score; }, initvals(polar, azimuth), // start with what we have @@ -1639,7 +1552,7 @@ public: auto predicate = [this](const SpatElement& e1, const SpatElement& e2) { double d2d = distance(to_2d(e1.first), to_2d(e2.first)); double d3d = distance(e1.first, e2.first); - return d2d < 2*m_cfg.base_radius_mm && + return d2d < 2 * m_cfg.base_radius_mm && d3d < m_cfg.max_bridge_length_mm; }; m_pillar_clusters = cluster(ground_head_indices, pointfn, predicate, 3); @@ -1819,14 +1732,14 @@ public: using libnest2d::opt::bound; using libnest2d::opt::initvals; - using libnest2d::opt::SimplexOptimizer; + using libnest2d::opt::GeneticOptimizer; using libnest2d::opt::StopCriteria; StopCriteria stc; - stc.max_iterations = 100; - stc.relative_score_difference = 1e-3; + stc.max_iterations = m_cfg.optimizer_max_iterations; + stc.relative_score_difference = m_cfg.optimizer_rel_score_diff; stc.stop_score = 1e6; - SimplexOptimizer solver(stc); + GeneticOptimizer solver(stc); double r_back = head.r_back_mm; @@ -1836,7 +1749,6 @@ public: Vec3d n = Vec3d(std::cos(azm) * std::sin(plr), std::sin(azm) * std::sin(plr), std::cos(plr)).normalized(); - return bridge_mesh_intersect(hjp, n, r_back); }, initvals(polar, azimuth), // let's start with what we have @@ -1923,7 +1835,102 @@ public: } void cascade_pillars() { - connect_pillars_nearest(); + // Now comes the algorithm that connects ground pillars with each other. + // Ideally every pillar should be connected with at least one of its + // neighbors if that neighbor is within sufficient distance (a bridge to + // it would not be longer than max_bridge_distance) + + // Pillars with height exceeding H1 will require at least one neighbor + // to connect with. Height exceeding H2 require two neighbors. + double H1 = m_cfg.max_solo_pillar_height_mm; + double H2 = m_cfg.max_dual_pillar_height_mm; + unsigned neighbors = m_cfg.pillar_cascade_neighbors; + double d = std::cos(m_cfg.bridge_slope) * m_cfg.max_bridge_length_mm; + + //A connection between two pillars only counts if the height ratio is + // bigger than 20% + double min_height_ratio = 0.2; + + std::set pairs; + + m_pillar_index.foreach( + [this, d, &pairs, neighbors, min_height_ratio, H1, H2] + (const SpatElement& el) + { + Vec3d qp = el.first; + + // Query all remaining points within reach + auto qres = m_pillar_index.query([qp, d](const SpatElement& e){ + return distance(e.first, qp) < d; + }); + + // sort the result by distance (have to check if this is needed) + std::sort(qres.begin(), qres.end(), + [qp](const SpatElement& e1, const SpatElement& e2){ + return distance(e1.first, qp) < distance(e2.first, qp); + }); + + const Pillar& pillar = m_result.pillars()[el.second]; + unsigned ncount = 0; + for(auto& re : qres) { + if(re.second == el.second) continue; + + auto hashval = m_pillar_index.size() * el.second + re.second; + if(pairs.find(hashval) != pairs.end()) continue; + + const Pillar& neighborpillar = m_result.pillars()[re.second]; + if(interconnect(pillar, neighborpillar)) { + pairs.insert(hashval); + + // If the interconnection length between the two pillars is + // less than 20% of the longer pillar's height, don't count + if(neighborpillar.height / pillar.height > min_height_ratio) + ++ncount; + } + + // 3 connections are enough for one pillar + if(ncount == neighbors) break; + } + + unsigned needpillars = 0; + if(ncount < 1 && pillar.height > H1) { + // No neighbors could not be found and the pillar is too long. + BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has no " + "neighbors. Head ID: " + << pillar.start_junction_id; + needpillars = 1; + } else if(ncount < 2 && pillar.height > H2) { + // Not enough neighbors to support this pillar + BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has too " + "few neighbors. Head ID: " + << pillar.start_junction_id; + needpillars = 2 - ncount; + } + + // WIP: + // note: sideheads ARE tested to reach the ground! + +// if(needpillars > 0) { +// if(pillar.starts_from_head) { +// // search for a sidehead for this head. We will route that +// // to the ground. +// const Head& head = m_result.head(unsigned(pillar.start_junction_id)); +// for(auto cl : m_pillar_clusters) { +// auto it = std::find(cl.begin(), cl.end(), head.id); +// if(it != cl.end()) { +// cl.erase(it); +// for(size_t j = 0; j < cl.size() && j < needpillars; j++) { +// unsigned hid = cl[j]; + +// m_result.add_pillar(hid, endpoint, ) +// .add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); +// } +// } +// } +// } +// } + + }); } // Step: process the support points where there is not enough space for a diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index d275c7963..401798582 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -79,14 +79,20 @@ struct SupportConfig { double object_elevation_mm = 10; // The max Z angle for a normal at which it will get completely ignored. - double normal_cutoff_angle = 150.0 * M_PI / 180.0; + static const double normal_cutoff_angle; + + // ///////////////////////////////////////////////////////////////////////// + // Compile time configuration values (candidates for runtime) + // ///////////////////////////////////////////////////////////////////////// // The shortest distance of any support structure from the model surface - double safety_distance_mm = 0.1; + static const double safety_distance_mm; - double max_solo_pillar_height_mm = 5.0; - - double max_dual_pillar_height_mm = 35.0; + static const double max_solo_pillar_height_mm; + static const double max_dual_pillar_height_mm; + static const double optimizer_rel_score_diff; + static const unsigned optimizer_max_iterations; + static const unsigned pillar_cascade_neighbors; }; struct PoolConfig; From 000a60e19805cd68f79b6fcac5e8a98d790d2505 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 7 Mar 2019 12:09:23 +0100 Subject: [PATCH 063/236] Added "Export object as STL" menu item to the ObjectList context menu --- src/slic3r/GUI/GUI_ObjectList.cpp | 15 +++++++++++++-- src/slic3r/GUI/GUI_ObjectList.hpp | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index a4ce8fe12..33988a3ba 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -940,7 +940,9 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) // Create new items for settings popupmenu - menu->m_separator_frst = menu->AppendSeparator(); + if (printer_technology() == ptFFF || + menu->GetMenuItems().size() > 0 && !menu->GetMenuItems().back()->IsSeparator()) + menu->m_separator_frst = menu->AppendSeparator(); // Add frequently settings create_freq_settings_popupmenu(menu); @@ -992,12 +994,20 @@ void ObjectList::append_menu_item_fix_through_netfabb(wxMenu* menu) menu->AppendSeparator(); } +void ObjectList::append_menu_item_export_stl(wxMenu* menu) const +{ + append_menu_item(menu, wxID_ANY, _(L("Export object as STL")) + dots, "", + [](wxCommandEvent&) { wxGetApp().plater()->export_stl(true); }, "", menu); + menu->AppendSeparator(); +} + void ObjectList::create_object_popupmenu(wxMenu *menu) { #ifdef __WXOSX__ append_menu_item_rename(menu); #endif // __WXOSX__ + append_menu_item_export_stl(menu); append_menu_item_fix_through_netfabb(menu); // Split object to parts @@ -1017,7 +1027,8 @@ void ObjectList::create_sla_object_popupmenu(wxMenu *menu) #ifdef __WXOSX__ append_menu_item_rename(menu); #endif // __WXOSX__ - + + append_menu_item_export_stl(menu); append_menu_item_fix_through_netfabb(menu); // rest of a object_sla_menu will be added later in: // - append_menu_item_settings() -> for "Add (settings)" diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 7d14eb13f..762020bda 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -186,6 +186,7 @@ public: wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu); void append_menu_item_rename(wxMenu* menu); void append_menu_item_fix_through_netfabb(wxMenu* menu); + void append_menu_item_export_stl(wxMenu* menu) const ; void create_object_popupmenu(wxMenu *menu); void create_sla_object_popupmenu(wxMenu*menu); void create_part_popupmenu(wxMenu*menu); From 28a516b6dc31346b590bbf1c7366ff6532c8bf39 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 7 Mar 2019 12:48:17 +0100 Subject: [PATCH 064/236] Fix a missing definition issue --- src/libslic3r/SLA/SLASupportTree.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index b65f99466..ff1547e27 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -75,6 +75,7 @@ const double SupportConfig::max_solo_pillar_height_mm = 5.0; const double SupportConfig::max_dual_pillar_height_mm = 35.0; const double SupportConfig::optimizer_rel_score_diff = 1e-6; const unsigned SupportConfig::optimizer_max_iterations = 500; +const unsigned SupportConfig::pillar_cascade_neighbors = 2; using Coordf = double; using Portion = std::tuple; From 0d594331784951666e372cafbf1d82152a65d7ed Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 7 Mar 2019 13:01:28 +0100 Subject: [PATCH 065/236] Fix build on Mac --- src/libslic3r/SLA/SLASupportTree.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index ff1547e27..1cd9ffdcc 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1536,7 +1536,7 @@ public: // collision check auto hit = bridge_mesh_intersect(headjp, n, r); - if(std::isinf(hit)) ground_head_indices.emplace_back(i); + if(std::isinf(hit.distance())) ground_head_indices.emplace_back(i); else { if(m_cfg.ground_facing_only) head.invalidate(); m_iheads_onmodel.emplace_back(std::make_pair(i, hit)); @@ -1980,6 +1980,8 @@ bool SLASupportTree::generate(const std::vector &support_points, const SupportConfig &cfg, const Controller &ctl) { + if(support_points.empty()) return false; + Algorithm alg(cfg, mesh, support_points, *m_impl, ctl.cancelfn); // Let's define the individual steps of the processing. We can experiment From ef3482a427d2b2fdf7ab738102a5a5abc457d27e Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 7 Mar 2019 15:26:19 +0100 Subject: [PATCH 066/236] Fixed a scrolling of the selected item in ObjectList (SPE-849) --- src/slic3r/GUI/GUI_ObjectList.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 33988a3ba..eb3744bef 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1928,11 +1928,23 @@ void ObjectList::update_selections() select_items(sels); + /* Because of ScrollLines() and GetItemRect() functions are implemented + * only for GENERIC DataViewCtrl in current version of wxWidgets, + * use this part of code only for MSW + */ +#if defined(wxUSE_GENERICDATAVIEWCTRL) + // Scroll selected Item in the middle of an object list if (GetSelection()) { - const int sel_item_row = m_objects_model->GetRowByItem(GetSelection()); - ScrollLines(sel_item_row - m_selected_row); - m_selected_row = sel_item_row; + const wxRect& sel_rc = GetItemRect(GetSelection()); + const wxRect& main_rc = GetClientRect(); + if (sel_rc.GetBottom() <= main_rc.GetTop()+sel_rc.height || + sel_rc.GetTop() >= main_rc.GetBottom() ) + { + const wxRect& top_rc = GetItemRect(GetTopItem()); + ScrollLines(int((sel_rc.y - top_rc.y) / top_rc.GetHeight()) - 0.5*GetCountPerPage()); + } } +#endif } void ObjectList::update_selections_on_canvas() From 311df8ecfd93803bd51e6c2fa706a7e3d90bb338 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 7 Mar 2019 16:01:46 +0100 Subject: [PATCH 067/236] Reworked discretization step of Archimedean Chords infill to lower slicing time and memory requirements. Fixes "Infill pattern Archimedean causing total freeze at Infilling patterns" #1871 --- src/libslic3r/Fill/FillPlanePath.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp index 615cc6efe..c52353b02 100644 --- a/src/libslic3r/Fill/FillPlanePath.cpp +++ b/src/libslic3r/Fill/FillPlanePath.cpp @@ -15,7 +15,7 @@ void FillPlanePath::_fill_surface_single( { expolygon.rotate(- direction.first); - coord_t distance_between_lines = scale_(this->spacing) / params.density; + coord_t distance_between_lines = coord_t(scale_(this->spacing) / params.density); // align infill across layers using the object's bounding box // Rotated bounding box of the whole object. @@ -89,7 +89,8 @@ Pointfs FillArchimedeanChords::_generate(coord_t min_x, coord_t min_y, coord_t m out.push_back(Vec2d(0, 0)); out.push_back(Vec2d(1, 0)); while (r < rmax) { - theta += 1. / r; + // Discretization angle to achieve a discretization error lower than RESOLUTION. + theta += 2. * acos(1. - RESOLUTION / r); r = a + b * theta; out.push_back(Vec2d(r * cos(theta), r * sin(theta))); } From 0ec718a51022e35ba25131ec67300b02800b471d Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 7 Mar 2019 16:21:56 +0100 Subject: [PATCH 068/236] All wxComboBoxes are changed to the wxBitmapComboBoxes --- src/slic3r/GUI/Field.cpp | 44 ++++++++++++++++++++-------------------- src/slic3r/GUI/Field.hpp | 5 +++-- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index dc0550b3b..3ef482369 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -497,11 +497,11 @@ void Choice::BUILD() { if (m_opt.height >= 0) size.SetHeight(m_opt.height); if (m_opt.width >= 0) size.SetWidth(m_opt.width); - wxComboBox* temp; + wxBitmapComboBox* temp; if (!m_opt.gui_type.empty() && m_opt.gui_type.compare("select_open") != 0) - temp = new wxComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); + temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); else - temp = new wxComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, NULL, wxCB_READONLY); + temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); @@ -511,7 +511,7 @@ void Choice::BUILD() { else{ for (auto el : m_opt.enum_labels.empty() ? m_opt.enum_values : m_opt.enum_labels) { const wxString& str = _(el);//m_opt_id == "support" ? _(el) : el; - temp->Append(str); + temp->Append(str, *m_undo_bitmap); } set_selection(); } @@ -523,7 +523,7 @@ void Choice::BUILD() { e.Skip(); if (m_opt.type == coStrings) return; double old_val = !m_value.empty() ? boost::any_cast(m_value) : -99999; - if (is_defined_input_value(window, m_opt.type)) { + if (is_defined_input_value(window, m_opt.type)) { if (fabs(old_val - boost::any_cast(get_value())) <= 0.0001) return; else @@ -554,13 +554,13 @@ void Choice::set_selection() } // if (m_opt.type == coPercent) text_value += "%"; idx == m_opt.enum_values.size() ? - dynamic_cast(window)->SetValue(text_value) : - dynamic_cast(window)->SetSelection(idx); + dynamic_cast(window)->SetValue(text_value) : + dynamic_cast(window)->SetSelection(idx); break; } case coEnum:{ int id_value = static_cast*>(m_opt.default_value)->value; //!! - dynamic_cast(window)->SetSelection(id_value); + dynamic_cast(window)->SetSelection(id_value); break; } case coInt:{ @@ -574,8 +574,8 @@ void Choice::set_selection() ++idx; } idx == m_opt.enum_values.size() ? - dynamic_cast(window)->SetValue(text_value) : - dynamic_cast(window)->SetSelection(idx); + dynamic_cast(window)->SetValue(text_value) : + dynamic_cast(window)->SetSelection(idx); break; } case coStrings:{ @@ -589,8 +589,8 @@ void Choice::set_selection() ++idx; } idx == m_opt.enum_values.size() ? - dynamic_cast(window)->SetValue(text_value) : - dynamic_cast(window)->SetSelection(idx); + dynamic_cast(window)->SetValue(text_value) : + dynamic_cast(window)->SetSelection(idx); break; } } @@ -609,8 +609,8 @@ void Choice::set_value(const std::string& value, bool change_event) //! Redunda } idx == m_opt.enum_values.size() ? - dynamic_cast(window)->SetValue(value) : - dynamic_cast(window)->SetSelection(idx); + dynamic_cast(window)->SetValue(value) : + dynamic_cast(window)->SetSelection(idx); m_disable_change_event = false; } @@ -640,11 +640,11 @@ void Choice::set_value(const boost::any& value, bool change_event) if (idx == m_opt.enum_values.size()) { // For editable Combobox under OSX is needed to set selection to -1 explicitly, // otherwise selection doesn't be changed - dynamic_cast(window)->SetSelection(-1); - dynamic_cast(window)->SetValue(text_value); + dynamic_cast(window)->SetSelection(-1); + dynamic_cast(window)->SetValue(text_value); } else - dynamic_cast(window)->SetSelection(idx); + dynamic_cast(window)->SetSelection(idx); break; } case coEnum: { @@ -674,7 +674,7 @@ void Choice::set_value(const boost::any& value, bool change_event) else val = 0; } - dynamic_cast(window)->SetSelection(val); + dynamic_cast(window)->SetSelection(val); break; } default: @@ -693,7 +693,7 @@ void Choice::set_values(const std::vector& values) // # it looks that Clear() also clears the text field in recent wxWidgets versions, // # but we want to preserve it - auto ww = dynamic_cast(window); + auto ww = dynamic_cast(window); auto value = ww->GetValue(); ww->Clear(); ww->Append(""); @@ -707,7 +707,7 @@ void Choice::set_values(const std::vector& values) boost::any& Choice::get_value() { // boost::any m_value; - wxString ret_str = static_cast(window)->GetValue(); + wxString ret_str = static_cast(window)->GetValue(); // options from right panel std::vector right_panel_options{ "support", "scale_unit" }; @@ -717,7 +717,7 @@ boost::any& Choice::get_value() if (m_opt.type == coEnum) { - int ret_enum = static_cast(window)->GetSelection(); + int ret_enum = static_cast(window)->GetSelection(); if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern") { if (!m_opt.enum_values.empty()) { @@ -746,7 +746,7 @@ boost::any& Choice::get_value() m_value = static_cast(ret_enum); } else if (m_opt.gui_type == "f_enum_open") { - const int ret_enum = static_cast(window)->GetSelection(); + const int ret_enum = static_cast(window)->GetSelection(); if (ret_enum < 0 || m_opt.enum_values.empty() || m_opt.type == coStrings) // modifies ret_string! get_value_by_opt_type(ret_str); diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index 8391a111b..457807afa 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -11,6 +11,7 @@ #include #include +#include #include #include "libslic3r/libslic3r.h" @@ -357,8 +358,8 @@ public: void set_values(const std::vector &values); boost::any& get_value() override; - void enable() override { dynamic_cast(window)->Enable(); }; - void disable() override{ dynamic_cast(window)->Disable(); }; + void enable() override { dynamic_cast(window)->Enable(); }; + void disable() override{ dynamic_cast(window)->Disable(); }; wxWindow* getWindow() override { return window; } }; From 99e43d6b24dd344c87e6bb29493ff5981e1aa42b Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 7 Mar 2019 16:23:02 +0100 Subject: [PATCH 069/236] wxBitmapComboBoxes without bitmaps --- src/slic3r/GUI/Field.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 3ef482369..554350b68 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -511,7 +511,7 @@ void Choice::BUILD() { else{ for (auto el : m_opt.enum_labels.empty() ? m_opt.enum_values : m_opt.enum_labels) { const wxString& str = _(el);//m_opt_id == "support" ? _(el) : el; - temp->Append(str, *m_undo_bitmap); + temp->Append(str/*, *m_undo_bitmap*/); } set_selection(); } From 3bce99bd235d62fa711d63b7d8ad183559f3c138 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 7 Mar 2019 17:17:47 +0100 Subject: [PATCH 070/236] Fixes for interconnection issues. --- src/libslic3r/SLA/SLASupportTree.cpp | 160 ++++++++++++++++++--------- src/libslic3r/SLA/SLASupportTree.hpp | 7 +- 2 files changed, 113 insertions(+), 54 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 1cd9ffdcc..e145cf64a 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -76,6 +76,7 @@ const double SupportConfig::max_dual_pillar_height_mm = 35.0; const double SupportConfig::optimizer_rel_score_diff = 1e-6; const unsigned SupportConfig::optimizer_max_iterations = 500; const unsigned SupportConfig::pillar_cascade_neighbors = 2; +const unsigned SupportConfig::max_bridges_on_pillar = 3; using Coordf = double; using Portion = std::tuple; @@ -399,6 +400,12 @@ struct Pillar { bool starts_from_head = true; // Could start from a junction as well long start_junction_id = -1; + // How many bridges are connected to this pillar + unsigned bridges = 0; + + // How many pillars are cascaded with this one + unsigned links = 0; + Pillar(const Vec3d& jp, const Vec3d& endp, double radius = 1, size_t st = 45): r(radius), steps(st), endpt(endp), starts_from_head(false) @@ -670,11 +677,19 @@ public: return m_pillars.back(); } - template Pillar& add_pillar(const Vec3d& startp, - const Vec3d& endp, - double r) + void increment_bridges(const Pillar& pillar) { + if(pillar.id >= 0 && size_t(pillar.id) < m_pillars.size()) + m_pillars[size_t(pillar.id)].bridges++; + } + + void increment_links(const Pillar& pillar) { + if(pillar.id >= 0 && size_t(pillar.id) < m_pillars.size()) + m_pillars[size_t(pillar.id)].links++; + } + + template Pillar& add_pillar(Args&&...args) { - m_pillars.emplace_back(startp, endp, r); + m_pillars.emplace_back(std::forward(args)...); Pillar& pillar = m_pillars.back(); pillar.id = long(m_pillars.size() - 1); pillar.starts_from_head = false; @@ -1138,8 +1153,8 @@ class SLASupportTree::Algorithm { Vec3d supper = pillar.startpoint(); Vec3d slower = nextpillar.startpoint(); - Vec3d eupper = pillar.endpt; - Vec3d elower = nextpillar.endpt; + Vec3d eupper = pillar.endpoint(); + Vec3d elower = nextpillar.endpoint(); double zmin = m_result.ground_level + m_cfg.base_height_mm; eupper(Z) = std::max(eupper(Z), zmin); @@ -1165,7 +1180,8 @@ class SLASupportTree::Algorithm { startz = slower(Z) - zstep < supper(Z) ? slower(Z) - zstep : slower(Z); endz = eupper(Z) + zstep > elower(Z) ? eupper(Z) + zstep : eupper(Z); - if(slower(Z) - eupper(Z) < std::abs(zstep)) { // no space for even one cross + if(slower(Z) - eupper(Z) < std::abs(zstep)) { + // no space for even one cross // Get max available space startz = std::min(supper(Z), slower(Z) - zstep); @@ -1189,7 +1205,8 @@ class SLASupportTree::Algorithm { // results in a cross connection between the pillars. Vec3d sj = supper, ej = slower; sj(Z) = startz; ej(Z) = sj(Z) + zstep; - while(ej(Z) >= endz) { + // TODO: This is a workaround to not have a faulty last bridge + while(ej(Z) >= eupper(Z) /*endz*/) { if(bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r) >= bridge_distance) @@ -1222,6 +1239,8 @@ class SLASupportTree::Algorithm { // For connecting a head to a nearby pillar. bool connect_to_nearpillar(const Head& head, const Pillar& nearpillar) { + if(nearpillar.bridges > m_cfg.max_bridges_on_pillar) return false; + Vec3d headjp = head.junction_point(); Vec3d nearjp_u = nearpillar.startpoint(); Vec3d nearjp_l = nearpillar.endpoint(); @@ -1285,6 +1304,7 @@ class SLASupportTree::Algorithm { } m_result.add_bridge(bridgestart, bridgeend, r); + m_result.increment_bridges(nearpillar); return true; } @@ -1309,13 +1329,14 @@ class SLASupportTree::Algorithm { auto ne = qres.front(); nearest_id = ne.second; - assert(nearest_id >= 0); if(nearest_id >= 0) { auto nearpillarID = unsigned(nearest_id); - const Pillar& nearpillar = m_result.pillars()[nearpillarID]; - if(!connect_to_nearpillar(head, nearpillar)) { - nearest_id = -1; // continue searching - spindex.remove(ne); // without the current pillar + if(nearpillarID < m_result.pillars().size()) { + const Pillar& nearpillar = m_result.pillars()[nearpillarID]; + if(!connect_to_nearpillar(head, nearpillar)) { + nearest_id = -1; // continue searching + spindex.remove(ne); // without the current pillar + } } } } @@ -1556,7 +1577,8 @@ public: return d2d < 2 * m_cfg.base_radius_mm && d3d < m_cfg.max_bridge_length_mm; }; - m_pillar_clusters = cluster(ground_head_indices, pointfn, predicate, 3); + m_pillar_clusters = cluster(ground_head_indices, pointfn, predicate, + m_cfg.max_bridges_on_pillar); } // Step: Routing the ground connected pinheads, and interconnecting @@ -1850,12 +1872,12 @@ public: //A connection between two pillars only counts if the height ratio is // bigger than 20% - double min_height_ratio = 0.2; + double min_height_ratio = 0.5; std::set pairs; m_pillar_index.foreach( - [this, d, &pairs, neighbors, min_height_ratio, H1, H2] + [this, d, &pairs, neighbors, min_height_ratio] (const SpatElement& el) { Vec3d qp = el.first; @@ -1872,7 +1894,6 @@ public: }); const Pillar& pillar = m_result.pillars()[el.second]; - unsigned ncount = 0; for(auto& re : qres) { if(re.second == el.second) continue; @@ -1886,52 +1907,89 @@ public: // If the interconnection length between the two pillars is // less than 20% of the longer pillar's height, don't count if(neighborpillar.height / pillar.height > min_height_ratio) - ++ncount; + m_result.increment_links(pillar); + + if(pillar.height / neighborpillar.height > min_height_ratio) + m_result.increment_links(neighborpillar); + } // 3 connections are enough for one pillar - if(ncount == neighbors) break; + if(pillar.links == neighbors) break; } + }); + + size_t pillarcount = m_result.pillars().size(); + + for(size_t pid = 0; pid < pillarcount; pid++) { + const Pillar& pillar = m_result.pillars()[pid]; unsigned needpillars = 0; - if(ncount < 1 && pillar.height > H1) { - // No neighbors could not be found and the pillar is too long. - BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has no " - "neighbors. Head ID: " - << pillar.start_junction_id; - needpillars = 1; - } else if(ncount < 2 && pillar.height > H2) { + if(pillar.bridges > m_cfg.max_bridges_on_pillar) needpillars = 3; + else if(pillar.links < 2 && pillar.height > H2) { // Not enough neighbors to support this pillar - BOOST_LOG_TRIVIAL(warning) << "Pillar is too long and has too " - "few neighbors. Head ID: " - << pillar.start_junction_id; - needpillars = 2 - ncount; + needpillars = 2 - pillar.links; + } + else if(pillar.links < 1 && pillar.height > H1) { + // No neighbors could be found and the pillar is too long. + needpillars = 1; } - // WIP: - // note: sideheads ARE tested to reach the ground! + // Search for new pillar locations + bool found = false; + double alpha = 0; // goes to 2Pi + double r = 2 * m_cfg.base_radius_mm; + Vec3d pillarsp = pillar.startpoint(); + Vec3d sp(pillarsp(X), pillarsp(Y), pillarsp(Z) - r); + std::vector tv(needpillars, false); + std::vector spts(needpillars); -// if(needpillars > 0) { -// if(pillar.starts_from_head) { -// // search for a sidehead for this head. We will route that -// // to the ground. -// const Head& head = m_result.head(unsigned(pillar.start_junction_id)); -// for(auto cl : m_pillar_clusters) { -// auto it = std::find(cl.begin(), cl.end(), head.id); -// if(it != cl.end()) { -// cl.erase(it); -// for(size_t j = 0; j < cl.size() && j < needpillars; j++) { -// unsigned hid = cl[j]; + while(!found && alpha < 2*PI) { -// m_result.add_pillar(hid, endpoint, ) -// .add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); -// } -// } -// } -// } -// } + for(unsigned n = 0; n < needpillars; n++) { + double a = alpha + n * PI/3; + Vec3d s = sp; + s(X) += std::cos(a) * r; + s(Y) += std::sin(a) * r; + spts[n] = s; + auto hr = bridge_mesh_intersect(s, {0, 0, -1}, pillar.r); + tv[n] = std::isinf(hr.distance()); + } - }); + found = std::all_of(tv.begin(), tv.end(), [](bool v){return v;}); + + // 20 angles will be tried... + alpha += 0.1 * PI; + } + + std::vector> newpills; + newpills.reserve(needpillars); + + if(found) for(unsigned n = 0; n < needpillars; n++) { + Vec3d s = spts[n]; double gnd = m_result.ground_level; + Pillar p(s, Vec3d(s(X), s(Y), gnd), pillar.r); + p.add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); + + if(interconnect(pillar, p)) { + Pillar& pp = m_result.add_pillar(p); + m_result.add_junction(s, pillar.r); + double t = bridge_mesh_intersect(pillarsp, + dirv(pillarsp, s), + pillar.r); + if(distance(pillarsp, s) < t) + m_result.add_bridge(pillarsp, s, pillar.r); + + if(pillar.endpoint()(Z) > m_result.ground_level) + m_result.add_junction(pillar.endpoint(), pillar.r); + + newpills.emplace_back(pp); + } + } + + if(!newpills.empty()) + for(auto it = newpills.begin(), nx = std::next(it); + nx != newpills.end(); ++it, ++nx) interconnect(*it, *nx); + } } // Step: process the support points where there is not enough space for a diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index 401798582..fb5425250 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -78,13 +78,13 @@ struct SupportConfig { // and the model object's bounding box bottom. double object_elevation_mm = 10; - // The max Z angle for a normal at which it will get completely ignored. - static const double normal_cutoff_angle; - // ///////////////////////////////////////////////////////////////////////// // Compile time configuration values (candidates for runtime) // ///////////////////////////////////////////////////////////////////////// + // The max Z angle for a normal at which it will get completely ignored. + static const double normal_cutoff_angle; + // The shortest distance of any support structure from the model surface static const double safety_distance_mm; @@ -93,6 +93,7 @@ struct SupportConfig { static const double optimizer_rel_score_diff; static const unsigned optimizer_max_iterations; static const unsigned pillar_cascade_neighbors; + static const unsigned max_bridges_on_pillar; }; struct PoolConfig; From 064a9aeaf8cc4660dab9479f0b2721f6bdc94f0a Mon Sep 17 00:00:00 2001 From: hspil Date: Wed, 6 Mar 2019 18:44:33 -0900 Subject: [PATCH 071/236] fix name of Updatig.md --- doc/updating/{Updatig.md => Updating.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/updating/{Updatig.md => Updating.md} (100%) diff --git a/doc/updating/Updatig.md b/doc/updating/Updating.md similarity index 100% rename from doc/updating/Updatig.md rename to doc/updating/Updating.md From ce55c615e6f42c3d992dbae48f2c47f8f2dfffc0 Mon Sep 17 00:00:00 2001 From: hspil Date: Wed, 6 Mar 2019 19:49:34 -0900 Subject: [PATCH 072/236] fix Localization_guide.md grammar --- doc/Localization_guide.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/Localization_guide.md b/doc/Localization_guide.md index 33fcc1c08..656f225ef 100644 --- a/doc/Localization_guide.md +++ b/doc/Localization_guide.md @@ -2,20 +2,20 @@ The purpose of this guide is to describe how to contribute to the Slic3rPE translations. We use GNUgettext for extracting string resources from the project and PoEdit for editing translations. -Those are possible to download here: +Those can be downloaded here: - https://sourceforge.net/directory/os:windows/?q=gnu+gettext GNUgettext package contains a set of tools to extract strings from the source code and to create the translation Catalog. - https://poedit.net PoEdit provides good interface for the translators. -After GNUgettext is installed it is recommended to add the path to gettext/bin to PATH variable. +After GNUgettext is installed, it is recommended to add the path to gettext/bin to PATH variable. -Full manual for GNUgettext you can see here: http://www.gnu.org/software/gettext/manual/gettext.html +Full manual for GNUgettext can be seen here: http://www.gnu.org/software/gettext/manual/gettext.html -### Scenario 1. How do I add a translation or fix the existing translation +### Scenario 1. How do I add a translation or fix an existing translation 1. Get PO-file from corresponding folder here: https://github.com/prusa3d/Slic3r/tree/master/resources/localization 2. Open this file in PoEdit as "Edit a translation" -3. Apply your corrections to translation +3. Apply your corrections to the translation 4. Push changed Slic3rPE.po and Slic3rPE.mo (will create automatically after saving of Slic3r.po in PoEdit) back to to the enter folder. ### Scenario 2. How do I add a new language support @@ -23,10 +23,10 @@ https://github.com/prusa3d/Slic3r/tree/master/resources/localization https://github.com/prusa3d/Slic3r/tree/master/resources/localization 2. Open it in PoEdit for "Create new translation" 3. Select Translation Language (for example French). -4. As a result you will have fr.po - the file contaning translation to French. -Notice. When the transtation is complete you need to: +4. As a result you will have fr.po - the file containing translation to French. +Notice. When the translation is complete you need to: - Rename the file to Slic3rPE.po - - Click "Save file" button. Slic3rPE.mo will be created immediatly + - Click "Save file" button. Slic3rPE.mo will be created immediately - Both Slic3rPE.po and Slic3rPE.mo have to be saved here: https://github.com/prusa3d/Slic3r/tree/master/resources/localization/fr ( name of folder "fr" means "French" - the translation language). @@ -37,11 +37,11 @@ Each string resource in Slic3rPE available for translation needs to be explicitl auto msg = L("This message to be localized") ``` To get translated text use one of needed macro/function (`_(s)`, `_CHB(s)` or `L_str(s)` ). -If you add new file resourse, add it to list of files contaned macro `L()` +If you add new file resource, add it to the list of files containing macro `L()` ### Scenario 4. How do I use GNUgettext to localize my own application taking Slic3rPE as an example -1. For conviniance create list of files with this macro `L(s)`. We have +1. For convenience create a list of files with this macro `L(s)`. We have https://github.com/prusa3d/Slic3r/tree/master/resources/localization/list.txt. 2. Create template file(*.POT) with GNUgettext command: @@ -50,11 +50,11 @@ https://github.com/prusa3d/Slic3r/tree/master/resources/localization/list.txt. ``` Use flag `--from-code=UTF-8` to specify that the source strings are in UTF-8 encoding - Use flag `--debug` to correctly extract formated strings(used %d, %s etc.) + Use flag `--debug` to correctly extract formatted strings(used %d, %s etc.) 3. Create PO- and MO-files for your project as described above. -4. To merge old PO-file with strings from creaded new POT-file use command: +4. To merge old PO-file with strings from created new POT-file use command: ``` msgmerge -N -o new.po old.po new.pot ``` @@ -71,6 +71,6 @@ https://github.com/prusa3d/Slic3r/tree/master/resources/localization/list.txt. ``` Notice, in this Catalog it will be totally same strings for initial text and translated. -When you have Catalog to translation open POT or PO file in PoEdit and start to translation. -It's very important to keep attention to every gaps and punctuation. Especially with -formated strings. (used %d, %s etc.) \ No newline at end of file +When you have Catalog to translation open POT or PO file in PoEdit and start to translation, +it's very important to keep attention to every gaps and punctuation. Especially with +formatted strings. (using %d, %s, etc.) \ No newline at end of file From 55d70a79d6715c5596c042ef952facd67d3273fe Mon Sep 17 00:00:00 2001 From: hspil Date: Wed, 6 Mar 2019 22:07:07 -0900 Subject: [PATCH 073/236] fix Mac OS and Windows build instructions grammar --- doc/How to build - Mac OS.md | 4 ++-- doc/How to build - Windows.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/How to build - Mac OS.md b/doc/How to build - Mac OS.md index a1c8d9049..670e9fd87 100644 --- a/doc/How to build - Mac OS.md +++ b/doc/How to build - Mac OS.md @@ -18,12 +18,12 @@ This will create a dependencies bundle inside the `build/destdir` directory. You can also customize the bundle output path using the `-DDESTDIR=` option passed to `cmake`. **Warning**: Once the dependency bundle is installed in a destdir, the destdir cannot be moved elsewhere. -(This is because wxWidgets hardcode the installation path.) +(This is because wxWidgets hardcodes the installation path.) ### Building Slic3r -If dependencies built without an error, you can proceed to build Slic3r itself. +If dependencies are built without errors, you can proceed to build Slic3r itself. Go back to top level Slic3r sources directory and use these commands: mkdir build diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index 90fcfde7d..627f1c99b 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -7,7 +7,7 @@ CMake installer can be downloaded from [the official website](https://cmake.org/ Building with newer versions of MSVS (2015, 2017) may work too as reported by some of our users. -_Note:_ Thanks to [**@supermerill**](https://github.com/supermerill) for testing and inspiration on this guide. +_Note:_ Thanks to [**@supermerill**](https://github.com/supermerill) for testing and inspiration for this guide. ### Dependencies @@ -20,7 +20,7 @@ The package comes in a several variants: - [32 bit, Release mode only](https://bintray.com/vojtechkral/Slic3r-PE/download_file?file_path=destdir-32.7z) (38 MB, 520 MB unpacked) - [32 bit, Release and Debug mode](https://bintray.com/vojtechkral/Slic3r-PE/download_file?file_path=destdir-32-dev.7z) (74 MB, 1.1 GB unpacked) -When unsure, use the _Release mode only_ variant, the _Release and Debug_ variant is only needed for debugging & developement. +When unsure, use the _Release mode only_ variant, the _Release and Debug_ variant is only needed for debugging & development. If you're unsure where to unpack the package, unpack it into `C:\local\` (but it can really be anywhere). @@ -46,13 +46,13 @@ Conversely, if you're using Visual Studio version other than 2013, the version n If `cmake` has finished without errors, go to the build directory and open the `Slic3r.sln` solution file in Visual Studio. Before building, make sure you're building the right project (use one of those starting with `slic3r_app_...`) and that you're building -with the right configuration, ie. _Release_ vs. _Debug_. When unsure, choose _Release_. +with the right configuration, i.e. _Release_ vs. _Debug_. When unsure, choose _Release_. Note that you won't be able to build a _Debug_ variant against a _Release_-only dependencies package. #### Installing using the `INSTALL` project Slic3r PE can be run from the Visual Studio or from Visual Studio's build directory (`src\Release` or `src\Debug`), -but for longer-term usage you migth want to install somewhere using the `INSTALL` project. +but for longer-term usage you might want to install somewhere using the `INSTALL` project. By default, this installs into `C:\Program Files\Slic3r`. To customize the install path, use the `-DCMAKE_INSTALL_PREFIX=` when invoking `cmake`. @@ -91,7 +91,7 @@ You can also use the Visual Studio GUI or other generators as mentioned above. The `DESTDIR` option is the location where the bundle will be installed. This may be customized. If you leave it empty, the `DESTDIR` will be places inside the same `build` directory. -Note that the build variant that you may choose using Visual Studio (ie. _Release_ or _Debug_ etc.) when building the dependency package is **not relevant**. +Note that the build variant that you may choose using Visual Studio (i.e. _Release_ or _Debug_ etc.) when building the dependency package is **not relevant**. The dependency build will by default build _both_ the _Release_ and _Debug_ variants regardless of what you choose in Visual Studio. You can disable building of the debug variant by passing the `-DDEP_DEBUG=OFF` option to CMake, this will only produce a _Release_ build. From 05435869994ea326b6f1eeeb7370e027a61eee43 Mon Sep 17 00:00:00 2001 From: hspil Date: Wed, 6 Mar 2019 22:54:41 -0900 Subject: [PATCH 074/236] fix Linux et al. build instructions grammar --- doc/How to build - Linux et al.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/How to build - Linux et al.md b/doc/How to build - Linux et al.md index a0dfec089..cf7bc86f2 100644 --- a/doc/How to build - Linux et al.md +++ b/doc/How to build - Linux et al.md @@ -7,7 +7,7 @@ as the versions listed - generally versions available on conservative Linux dist Perl is not required any more. -In a typical situaction, one would open a command line, go to the Slic3r sources, create a directory called `build` or similar, +In a typical situation, one would open a command line, go to the Slic3r sources, create a directory called `build` or similar, `cd` into it and call: cmake .. @@ -19,7 +19,7 @@ Additional CMake flags may be applicable as explained below. ### Dependency resolution -By default Slic3r looks for dependencies the default way CMake looks for them, ie. in default system locations. +By default Slic3r looks for dependencies the default way CMake looks for them, i.e. in default system locations. On Linux this will typically make Slic3r depend on dynamically loaded libraries from the system, however, Slic3r can be told to specifically look for static libraries with the `SLIC3R_STATIC` flag passed to cmake: @@ -65,9 +65,9 @@ To create a debug build, use the following CMake flag: ### Installation -In runtime, Slic3r needs a way to access its resource files. By default, it looks for a `resources` directory relative to its binary. +At runtime, Slic3r needs a way to access its resource files. By default, it looks for a `resources` directory relative to its binary. -If you instead wnat Slic3r installed in a structure according to the Filesystem Hierarchy Standard, use the `SLIC3R_FHS` flag +If you instead want Slic3r installed in a structure according to the File System Hierarchy Standard, use the `SLIC3R_FHS` flag cmake .. -DSLIC3R_FHS=1 From 140b86de4e83e8826b334b1cdd44093b3802d804 Mon Sep 17 00:00:00 2001 From: hspil Date: Wed, 6 Mar 2019 23:02:36 -0900 Subject: [PATCH 075/236] fix Updating.md grammar --- doc/updating/Updating.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/updating/Updating.md b/doc/updating/Updating.md index 13a2de144..12727fb15 100644 --- a/doc/updating/Updating.md +++ b/doc/updating/Updating.md @@ -12,7 +12,7 @@ There are three new features: - _System preset_: These are the presets that come with Slic3r PE installation. They come from a vendor configuration bundle (not individual files like before). They are **read-only** – a user cannot modify them, but may instead create a derived User preset based on a System preset - _User preset_: These are regular presets stored in files just like before. Additionally, they may be derived (inherited) from one of the System presets -A derived User preset keeps track of wich settings are inherited from the parent System preset and which are modified by the user. When a system preset is updated (either via installation of a new Slic3r or automatically from the internet), in a User preset the settings that are modified by the user will stay that way, while the ones that are inherited reflect the updated System preset. +A derived User preset keeps track of which settings are inherited from the parent System preset and which are modified by the user. When a system preset is updated (either via installation of a new Slic3r or automatically from the internet), in a User preset the settings that are modified by the user will stay that way, while the ones that are inherited reflect the updated System preset. This system ensures that we don't overwrite user's settings when there is an update to the built in presets. @@ -25,9 +25,9 @@ A settings modified in a User preset has an open lock icon: ![a user setting](setting_user.png) -Clickign the open lock icon restored the system setting. +Clicking the open lock icon restores the system setting. -Additionaly, any setting that is modified but not yet saved onto disk is represented by orange label and a back-arrow: +Additionally, any setting that is modified but not yet saved onto disk is represented by orange label and a back-arrow: ![a modified setting](setting_mod.png) From 8b74cc48eb67f6414152d5e458838952398fe693 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 8 Mar 2019 09:26:30 +0100 Subject: [PATCH 076/236] Prevented instance move event when SLA gizmo is active so right panel is not needlessly updated --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8415e8c24..b71f5294a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5498,7 +5498,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { // the gizmo got the event and took some action, no need to do anything more } - else if ((m_mouse.drag.move_volume_idx != -1) && m_mouse.dragging) + else if ((m_mouse.drag.move_volume_idx != -1) && m_mouse.dragging && m_gizmos.get_current_type() != Gizmos::SlaSupports) { m_regenerate_volumes = false; do_move(); From af72d781ad6bdcb09d2770fdd0d985be5fc8e9aa Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 8 Mar 2019 10:36:12 +0100 Subject: [PATCH 077/236] Fixed GLCanvas3D::Selection::is_single_full_instance() --- src/slic3r/GUI/GLCanvas3D.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index b71f5294a..1f022a2ec 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1145,8 +1145,11 @@ bool GLCanvas3D::Selection::is_single_full_instance() const for (unsigned int i : m_list) { const GLVolume* v = (*m_volumes)[i]; + if ((object_idx != v->object_idx()) || (instance_idx != v->instance_idx())) + return false; + int volume_idx = v->volume_idx(); - if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx) && (volume_idx >= 0)) + if (volume_idx >= 0) volumes_idxs.insert(volume_idx); } From 1cb1c12812316b3950af395bccbc1c9b403a0522 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 8 Mar 2019 11:39:34 +0100 Subject: [PATCH 078/236] Fine tuning the new parameters and adding max_pillar_link_distance --- src/libslic3r/PrintConfig.cpp | 9 +++++++++ src/libslic3r/PrintConfig.hpp | 4 ++++ src/libslic3r/SLA/SLASupportTree.cpp | 23 +++++++++++++++-------- src/libslic3r/SLA/SLASupportTree.hpp | 5 ++++- src/libslic3r/SLAPrint.cpp | 2 ++ src/libslic3r/SLAPrint.hpp | 7 +++++-- src/slic3r/GUI/Preset.cpp | 1 + src/slic3r/GUI/Tab.cpp | 1 + 8 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 1c78a3e31..d6e66cd67 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2672,6 +2672,15 @@ void PrintConfigDef::init_sla_params() def->min = 0; def->default_value = new ConfigOptionFloat(15.0); + def = this->add("support_max_pillar_link_distance", coFloat); + def->label = L("Max pillar linking distance"); + def->category = L("Supports"); + def->tooltip = L("The max distance of two pillars to get linked with each other."); + def->sidetext = L("mm"); + def->cli = ""; + def->min = 0; // 0 means no linking + def->default_value = new ConfigOptionFloat(10.0); + def = this->add("support_object_elevation", coFloat); def->label = L("Object elevation"); def->category = L("Supports"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index f4d9053a6..7ddc3b8d6 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1006,6 +1006,9 @@ public: // The max length of a bridge in mm ConfigOptionFloat support_max_bridge_length /*= 15.0*/; + // The max distance of two pillars to get cross linked. + ConfigOptionFloat support_max_pillar_link_distance; + // The elevation in Z direction upwards. This is the space between the pad // and the model object's bounding box bottom. Units in mm. ConfigOptionFloat support_object_elevation /*= 5.0*/; @@ -1053,6 +1056,7 @@ protected: OPT_PTR(support_base_height); OPT_PTR(support_critical_angle); OPT_PTR(support_max_bridge_length); + OPT_PTR(support_max_pillar_link_distance); OPT_PTR(support_points_density_relative); OPT_PTR(support_points_minimal_distance); OPT_PTR(support_object_elevation); diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index e145cf64a..c52f82654 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -71,7 +71,7 @@ const double SupportConfig::normal_cutoff_angle = 150.0 * M_PI / 180.0; // The shortest distance of any support structure from the model surface const double SupportConfig::safety_distance_mm = 0.1; -const double SupportConfig::max_solo_pillar_height_mm = 5.0; +const double SupportConfig::max_solo_pillar_height_mm = 15.0; const double SupportConfig::max_dual_pillar_height_mm = 35.0; const double SupportConfig::optimizer_rel_score_diff = 1e-6; const unsigned SupportConfig::optimizer_max_iterations = 500; @@ -678,11 +678,15 @@ public: } void increment_bridges(const Pillar& pillar) { + assert(pillar.id >= 0 && size_t(pillar.id) < m_pillars.size()); + if(pillar.id >= 0 && size_t(pillar.id) < m_pillars.size()) m_pillars[size_t(pillar.id)].bridges++; } void increment_links(const Pillar& pillar) { + assert(pillar.id >= 0 && size_t(pillar.id) < m_pillars.size()); + if(pillar.id >= 0 && size_t(pillar.id) < m_pillars.size()) m_pillars[size_t(pillar.id)].links++; } @@ -1169,8 +1173,8 @@ class SLASupportTree::Algorithm { double bridge_distance = pillar_dist / std::cos(-m_cfg.bridge_slope); double zstep = pillar_dist * std::tan(-m_cfg.bridge_slope); - if(pillar_dist < 2*m_cfg.head_back_radius_mm) return false; - if(bridge_distance > m_cfg.max_bridge_length_mm) return false; + if(pillar_dist < 2 * m_cfg.head_back_radius_mm || + pillar_dist > m_cfg.max_pillar_link_distance_mm) return false; if(supper(Z) < slower(Z)) supper.swap(slower); if(eupper(Z) < elower(Z)) eupper.swap(elower); @@ -1659,8 +1663,8 @@ public: // Could not find a pillar, create one auto& pillar = m_result.add_pillar(unsigned(sidehead.id), pend, pradius) - .add_base(m_cfg.base_height_mm, - m_cfg.base_radius_mm); + .add_base(m_cfg.base_height_mm, + m_cfg.base_radius_mm); // connects to ground, eligible for bridging m_pillar_index.insert(pend, unsigned(pillar.id)); @@ -1962,7 +1966,7 @@ public: alpha += 0.1 * PI; } - std::vector> newpills; + std::vector newpills; newpills.reserve(needpillars); if(found) for(unsigned n = 0; n < needpillars; n++) { @@ -1982,13 +1986,16 @@ public: if(pillar.endpoint()(Z) > m_result.ground_level) m_result.add_junction(pillar.endpoint(), pillar.r); - newpills.emplace_back(pp); + newpills.emplace_back(pp.id); } } if(!newpills.empty()) for(auto it = newpills.begin(), nx = std::next(it); - nx != newpills.end(); ++it, ++nx) interconnect(*it, *nx); + nx != newpills.end(); ++it, ++nx) { + interconnect(m_result.pillars()[size_t(*it)], + m_result.pillars()[size_t(*nx)]); + } } } diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index fb5425250..74d7da9ca 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -72,7 +72,10 @@ struct SupportConfig { double bridge_slope = M_PI/4; // The max length of a bridge in mm - double max_bridge_length_mm = 15.0; + double max_bridge_length_mm = 10.0; + + // The max distance of a pillar to pillar link. + double max_pillar_link_distance_mm = 10.0; // The elevation in Z direction upwards. This is the space between the pad // and the model object's bounding box bottom. diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 469e7a8ff..82b499ec7 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -546,6 +546,7 @@ sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c) { scfg.object_elevation_mm = c.support_object_elevation.getFloat(); scfg.bridge_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); + scfg.max_pillar_link_distance_mm = c.support_max_pillar_link_distance.getFloat(); switch(c.support_pillar_connection_mode.getInt()) { case slapcmZigZag: scfg.pillar_connection_mode = sla::PillarConnectionMode::zigzag; break; @@ -1386,6 +1387,7 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vector &opt_keys); + std::vector calculate_heights(const BoundingBoxf3& bb, + float elevation, + float initial_layer_height, + float layer_height) const; + void fill_statistics(); SLAPrintConfig m_print_config; @@ -270,8 +275,6 @@ private: lref(std::cref(lyr)), copies(std::cref(cp)) {} }; - std::vector calculate_heights(const BoundingBoxf3& bb, float elevation, float initial_layer_height, float layer_height) const; - // One level may contain multiple slices from multiple objects and their // supports using LayerRefs = std::vector; diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 37b495a36..4902b5552 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -457,6 +457,7 @@ const std::vector& Preset::sla_print_options() "support_base_height", "support_critical_angle", "support_max_bridge_length", + "support_max_pillar_link_distance", "support_object_elevation", "support_points_density_relative", "support_points_minimal_distance", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 060eb1383..a7b1af75d 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3277,6 +3277,7 @@ void TabSLAPrint::build() optgroup = page->new_optgroup(_(L("Connection of the support sticks and junctions"))); optgroup->append_single_option_line("support_critical_angle"); optgroup->append_single_option_line("support_max_bridge_length"); + optgroup->append_single_option_line("support_max_pillar_link_distance"); optgroup = page->new_optgroup(_(L("Automatic generation"))); optgroup->append_single_option_line("support_points_density_relative"); From aa4c44dbea2bdb430f704f7777458ed9054d0d91 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 6 Mar 2019 15:46:19 +0100 Subject: [PATCH 079/236] Use unique camera shared by 3d view and preview (experimental) --- src/libslic3r/Technologies.hpp | 4 + src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/Camera.cpp | 65 ++++++++++++ src/slic3r/GUI/Camera.hpp | 54 ++++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 188 +++++++++++++++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 48 +++++++++ src/slic3r/GUI/GUI_Preview.cpp | 26 +++++ src/slic3r/GUI/GUI_Preview.hpp | 21 ++++ src/slic3r/GUI/Plater.cpp | 40 +++++++ 9 files changed, 448 insertions(+) create mode 100644 src/slic3r/GUI/Camera.cpp create mode 100644 src/slic3r/GUI/Camera.hpp diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index e978b5838..92b4bbfdc 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -58,5 +58,9 @@ // Toolbars and Gizmos use icons imported from svg files #define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// Use a unique camera shared by 3d view and preview +#define ENABLE_SHARED_CAMERA (1 && ENABLE_1_42_0_ALPHA8) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // _technologies_h_ diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 157fc9011..e4a8c9678 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -76,6 +76,8 @@ set(SLIC3R_GUI_SOURCES GUI/2DBed.hpp GUI/3DBed.cpp GUI/3DBed.hpp + GUI/Camera.cpp + GUI/Camera.hpp GUI/wxExtensions.cpp GUI/wxExtensions.hpp GUI/WipeTowerDialog.cpp diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp new file mode 100644 index 000000000..c3317b0f4 --- /dev/null +++ b/src/slic3r/GUI/Camera.cpp @@ -0,0 +1,65 @@ +#include "libslic3r/libslic3r.h" + +#include "Camera.hpp" + +#if ENABLE_SHARED_CAMERA + +static const float GIMBALL_LOCK_THETA_MAX = 180.0f; + +namespace Slic3r { +namespace GUI { + +Camera::Camera() + : type(Ortho) + , zoom(1.0f) + , phi(45.0f) +// , distance(0.0f) + , requires_zoom_to_bed(false) + , m_theta(45.0f) + , m_target(Vec3d::Zero()) +{ +} + +std::string Camera::get_type_as_string() const +{ + switch (type) + { + default: + case Unknown: + return "unknown"; +// case Perspective: +// return "perspective"; + case Ortho: + return "ortho"; + }; +} + +void Camera::set_target(const Vec3d& target) +{ + m_target = target; + m_target(0) = clamp(m_scene_box.min(0), m_scene_box.max(0), m_target(0)); + m_target(1) = clamp(m_scene_box.min(1), m_scene_box.max(1), m_target(1)); + m_target(2) = clamp(m_scene_box.min(2), m_scene_box.max(2), m_target(2)); +} + +void Camera::set_theta(float theta, bool apply_limit) +{ + if (apply_limit) + m_theta = clamp(0.0f, GIMBALL_LOCK_THETA_MAX, theta); + else + { + m_theta = fmod(theta, 360.0f); + if (m_theta < 0.0f) + m_theta += 360.0f; + } +} + +void Camera::set_scene_box(const BoundingBoxf3& box) +{ + m_scene_box = box; +} + +} // GUI +} // Slic3r + +#endif // ENABLE_SHARED_CAMERA diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp new file mode 100644 index 000000000..77d5e9d9a --- /dev/null +++ b/src/slic3r/GUI/Camera.hpp @@ -0,0 +1,54 @@ +#ifndef slic3r_Camera_hpp_ +#define slic3r_Camera_hpp_ + +#if ENABLE_SHARED_CAMERA + +#include "libslic3r/BoundingBox.hpp" + +namespace Slic3r { +namespace GUI { + +struct Camera +{ + enum EType : unsigned char + { + Unknown, +// Perspective, + Ortho, + Num_types + }; + + EType type; + float zoom; + float phi; +// float distance; + bool requires_zoom_to_bed; + +private: + Vec3d m_target; + float m_theta; + + BoundingBoxf3 m_scene_box; + +public: + Camera(); + + std::string get_type_as_string() const; + + const Vec3d& get_target() const { return m_target; } + void set_target(const Vec3d& target); + + float get_theta() const { return m_theta; } + void set_theta(float theta, bool apply_limit); + + const BoundingBoxf3& get_scene_box() const { return m_scene_box; } + void set_scene_box(const BoundingBoxf3& box); +}; + +} // GUI +} // Slic3r + +#endif // ENABLE_SHARED_CAMERA + +#endif // slic3r_Camera_hpp_ + diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1f022a2ec..e7b0a25f5 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -54,7 +54,13 @@ #include static const float TRACKBALLSIZE = 0.8f; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ static const float GIMBALL_LOCK_THETA_MAX = 180.0f; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ static const float GROUND_Z = -0.02f; // phi / theta angles to orient the camera. @@ -183,6 +189,9 @@ void Rect::set_bottom(float bottom) m_bottom = bottom; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLCanvas3D::Camera::Camera() : type(Ortho) , zoom(1.0f) @@ -237,6 +246,9 @@ void GLCanvas3D::Camera::set_scene_box(const BoundingBoxf3& box, GLCanvas3D& can canvas.viewport_changed(); } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_TEXTURES_FROM_SVG GLCanvas3D::Shader::Shader() @@ -3713,7 +3725,13 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const wxDEFINE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxDEFINE_EVENT(EVT_GLCANVAS_VIEWPORT_CHANGED, SimpleEvent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, Vec2dEvent); wxDEFINE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent); @@ -3737,6 +3755,11 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) , m_retina_helper(nullptr) #endif , m_in_render(false) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + , m_camera(nullptr) +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_bed(nullptr) #if ENABLE_SVG_ICONS , m_toolbar(GLToolbar::Normal, "Top") @@ -3752,7 +3775,13 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) , m_dirty(true) , m_initialized(false) , m_use_VBOs(false) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_requires_zoom_to_bed(false) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_apply_zoom_to_volumes_filter(false) , m_hover_volume_id(-1) , m_toolbar_action_running(false) @@ -3792,10 +3821,16 @@ void GLCanvas3D::post_event(wxEvent &&event) wxPostEvent(m_canvas, event); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::viewport_changed() { post_event(SimpleEvent(EVT_GLCANVAS_VIEWPORT_CHANGED)); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) { @@ -3971,8 +4006,20 @@ void GLCanvas3D::set_model(Model* model) void GLCanvas3D::bed_shape_changed() { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if (m_camera != nullptr) + { + m_camera->set_scene_box(scene_bounding_box()); + m_camera->requires_zoom_to_bed = true; + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.set_scene_box(scene_bounding_box(), *this); m_requires_zoom_to_bed = true; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } @@ -3984,7 +4031,15 @@ void GLCanvas3D::set_color_by(const std::string& value) float GLCanvas3D::get_camera_zoom() const { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + return (m_camera != nullptr) ? m_camera->zoom : 0.0f; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ return m_camera.zoom; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const @@ -4129,16 +4184,31 @@ void GLCanvas3D::select_view(const std::string& direction) if (dir_vec != nullptr) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if (m_camera != nullptr) + { + m_camera->phi = dir_vec[0]; + m_camera->set_theta(dir_vec[1], false); + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.phi = dir_vec[0]; m_camera.set_theta(dir_vec[1], false); viewport_changed(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_canvas != nullptr) m_canvas->Refresh(); } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::set_viewport_from_scene(const GLCanvas3D& other) { m_camera.phi = other.m_camera.phi; @@ -4148,6 +4218,9 @@ void GLCanvas3D::set_viewport_from_scene(const GLCanvas3D& other) m_camera.zoom = other.m_camera.zoom; m_dirty = true; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::update_volumes_colors_by_extruder() { @@ -4209,12 +4282,28 @@ void GLCanvas3D::render() post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE)); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if ((m_camera != nullptr) && m_camera->requires_zoom_to_bed) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_requires_zoom_to_bed) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { zoom_to_bed(); const Size& cnv_size = get_canvas_size(); _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + m_camera->requires_zoom_to_bed = false; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_requires_zoom_to_bed = false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } _camera_tranform(); @@ -4224,7 +4313,15 @@ void GLCanvas3D::render() GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; ::glLightfv(GL_LIGHT0, GL_POSITION, position_top); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + float theta = (m_camera != nullptr) ? m_camera->get_theta() : 0.0f; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float theta = m_camera.get_theta(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (theta > 180.f) // absolute value of the rotation theta = 360.f - theta; @@ -4661,8 +4758,17 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // restore to default value m_regenerate_volumes = true; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if (m_camera != nullptr) + m_camera->set_scene_box(scene_bounding_box()); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.set_scene_box(scene_bounding_box(), *this); m_camera.set_target(m_camera.get_target(), *this); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_selection.is_empty()) { @@ -5349,7 +5455,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag if (m_selection.contains_volume(m_hover_volume_id)) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if ((m_camera != nullptr) && (m_camera->get_theta() == 90.0f)) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_camera.get_theta() == 90.0f) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { // side view -> move selected volumes orthogonally to camera view direction Linef3 ray = mouse_ray(pos); @@ -5460,10 +5574,22 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif // ENABLE_MOVE_MIN_THRESHOLD { const Vec3d& orig = m_mouse.drag.start_position_3D; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if (m_camera != nullptr) + { + m_camera->phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); + m_camera->set_theta(m_camera->get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); viewport_changed(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } @@ -5478,9 +5604,18 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) float z = 0.0f; const Vec3d& cur_pos = _mouse_to_3d(pos, &z); Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if (m_camera != nullptr) + m_camera->set_target(m_camera->get_target() + orig - cur_pos); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.set_target(m_camera.get_target() + orig - cur_pos, *this); viewport_changed(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } @@ -5558,8 +5693,16 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // Let the platter know that the dragging finished, so a delayed refresh // of the scene with the background processing data should be performed. post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + m_camera->set_scene_box(scene_bounding_box()); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.set_scene_box(scene_bounding_box(), *this); set_camera_zoom(0.0f); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } m_moving = false; @@ -5904,8 +6047,17 @@ void GLCanvas3D::set_camera_zoom(float zoom) // Don't allow to zoom too close to the scene. zoom = std::min(zoom, 100.0f); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if (m_camera != nullptr) + m_camera->zoom = zoom; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.zoom = zoom; viewport_changed(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ _refresh_if_shown_on_screen(); } @@ -6128,7 +6280,16 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) const BoundingBoxf3& bbox = _max_bounding_box(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + Camera::EType camera_type = (m_camera != nullptr) ? m_camera->type : Camera::Unknown; + switch (camera_type) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ switch (m_camera.type) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { case Camera::Ortho: { @@ -6196,11 +6357,24 @@ void GLCanvas3D::_zoom_to_bounding_box(const BoundingBoxf3& bbox) float zoom = _get_zoom_to_bounding_box_factor(bbox); if (zoom > 0.0f) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if (m_camera != nullptr) + { + m_camera->zoom = zoom; + // center view around bounding box center + m_camera->set_target(bbox.center()); + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.zoom = zoom; // center view around bounding box center m_camera.set_target(bbox.center(), *this); viewport_changed(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } @@ -6291,10 +6465,24 @@ void GLCanvas3D::_camera_tranform() const ::glMatrixMode(GL_MODELVIEW); ::glLoadIdentity(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + Vec3d target = Vec3d::Zero(); + if (m_camera != nullptr) + { + ::glRotatef(-m_camera->get_theta(), 1.0f, 0.0f, 0.0f); // pitch + ::glRotatef(m_camera->phi, 0.0f, 0.0f, 1.0f); // yaw + target = -m_camera->get_target(); + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ::glRotatef(-m_camera.get_theta(), 1.0f, 0.0f, 0.0f); // pitch ::glRotatef(m_camera.phi, 0.0f, 0.0f, 1.0f); // yaw Vec3d target = -m_camera.get_target(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ::glTranslated(target(0), target(1), target(2)); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index ae6155876..4d6612a4c 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -9,6 +9,11 @@ #include "GLToolbar.hpp" #include "Event.hpp" #include "3DBed.hpp" +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA +#include "Camera.hpp" +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include @@ -100,7 +105,13 @@ template using Vec3dsEvent = ArrayEvent; wxDECLARE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxDECLARE_EVENT(EVT_GLCANVAS_VIEWPORT_CHANGED, SimpleEvent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxDECLARE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, Vec2dEvent); wxDECLARE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent); @@ -162,6 +173,9 @@ class GLCanvas3D void reset() { first_volumes.clear(); } }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ struct Camera { enum EType : unsigned char @@ -196,6 +210,9 @@ class GLCanvas3D const BoundingBoxf3& get_scene_box() const { return m_scene_box; } void set_scene_box(const BoundingBoxf3& box, GLCanvas3D& canvas); }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_TEXTURES_FROM_SVG class Shader @@ -885,7 +902,15 @@ private: LegendTexture m_legend_texture; WarningTexture m_warning_texture; wxTimer m_timer; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + Camera* m_camera; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Camera m_camera; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Bed3D* m_bed; LayersEditing m_layers_editing; Shader m_shader; @@ -908,7 +933,13 @@ private: bool m_dirty; bool m_initialized; bool m_use_VBOs; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool m_requires_zoom_to_bed; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool m_apply_zoom_to_volumes_filter; mutable int m_hover_volume_id; bool m_toolbar_action_running; @@ -942,6 +973,11 @@ public: wxGLCanvas* get_wxglcanvas() { return m_canvas; } const wxGLCanvas* get_wxglcanvas() const { return m_canvas; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + void set_camera(Camera* camera) { m_camera = camera; } +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_bed(Bed3D* bed) { m_bed = bed; } void set_view_toolbar(GLToolbar* toolbar) { m_view_toolbar = toolbar; } @@ -1005,7 +1041,13 @@ public: void zoom_to_volumes(); void zoom_to_selection(); void select_view(const std::string& direction); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_viewport_from_scene(const GLCanvas3D& other); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_volumes_colors_by_extruder(); @@ -1070,7 +1112,13 @@ public: void update_gizmos_on_off_state(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void viewport_changed(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void handle_sidebar_focus_event(const std::string& opt_key, bool focus_on); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index d48bb5f49..6f9882148 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -95,6 +95,16 @@ void View3D::set_bed(Bed3D* bed) m_canvas->set_bed(bed); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA +void View3D::set_camera(Camera* camera) +{ + if (m_canvas != nullptr) + m_canvas->set_camera(camera); +} +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + void View3D::set_view_toolbar(GLToolbar* toolbar) { if (m_canvas != nullptr) @@ -348,6 +358,16 @@ void Preview::set_bed(Bed3D* bed) m_canvas->set_bed(bed); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA +void Preview::set_camera(Camera* camera) +{ + if (m_canvas != nullptr) + m_canvas->set_camera(camera); +} +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + void Preview::set_view_toolbar(GLToolbar* toolbar) { if (m_canvas != nullptr) @@ -390,6 +410,9 @@ void Preview::select_view(const std::string& direction) m_canvas->select_view(direction); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Preview::set_viewport_from_scene(GLCanvas3D* canvas) { if (canvas != nullptr) @@ -401,6 +424,9 @@ void Preview::set_viewport_into_scene(GLCanvas3D* canvas) if (canvas != nullptr) canvas->set_viewport_from_scene(*m_canvas); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Preview::set_drop_target(wxDropTarget* target) { diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 1d65aff1b..59d90f4b3 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -28,6 +28,11 @@ namespace GUI { class GLCanvas3D; class GLToolbar; class Bed3D; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA +class Camera; +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ class View3D : public wxPanel { @@ -50,6 +55,11 @@ public: GLCanvas3D* get_canvas3d() { return m_canvas; } void set_bed(Bed3D* bed); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + void set_camera(Camera* camera); +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_view_toolbar(GLToolbar* toolbar); void set_as_dirty(); @@ -115,6 +125,11 @@ public: GLCanvas3D* get_canvas3d() { return m_canvas; } void set_bed(Bed3D* bed); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + void set_camera(Camera* camera); +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_view_toolbar(GLToolbar* toolbar); void set_number_extruders(unsigned int number_extruders); @@ -122,8 +137,14 @@ public: void set_enabled(bool enabled); void bed_shape_changed(); void select_view(const std::string& direction); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_viewport_from_scene(GLCanvas3D* canvas); void set_viewport_into_scene(GLCanvas3D* canvas); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_drop_target(wxDropTarget* target); void load_print(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 40f18598f..a5139f2bd 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -50,6 +50,11 @@ #include "GLToolbar.hpp" #include "GUI_Preview.hpp" #include "3DBed.hpp" +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA +#include "Camera.hpp" +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include "Tab.hpp" #include "PresetBundle.hpp" #include "BackgroundSlicingProcess.hpp" @@ -1019,6 +1024,11 @@ struct Plater::priv std::vector panels; Sidebar *sidebar; Bed3D bed; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + Camera camera; +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ View3D* view3D; GLToolbar view_toolbar; Preview *preview; @@ -1115,7 +1125,13 @@ struct Plater::priv void on_action_layersediting(SimpleEvent&); void on_object_select(SimpleEvent&); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void on_viewport_changed(SimpleEvent&); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void on_right_click(Vec2dEvent&); void on_wipetower_moved(Vec3dEvent&); void on_update_geometry(Vec3dsEvent<2>&); @@ -1207,6 +1223,12 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D->set_bed(&bed); preview->set_bed(&bed); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + view3D->set_camera(&camera); + preview->set_camera(&camera); +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ panels.push_back(view3D); panels.push_back(preview); @@ -1238,7 +1260,13 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) // 3DScene events: view3D_canvas->Bind(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, [this](SimpleEvent&) { this->schedule_background_process(); }); view3D_canvas->Bind(EVT_GLCANVAS_OBJECT_SELECT, &priv::on_object_select, this); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D_canvas->Bind(EVT_GLCANVAS_VIEWPORT_CHANGED, &priv::on_viewport_changed, this); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D_canvas->Bind(EVT_GLCANVAS_RIGHT_CLICK, &priv::on_right_click, this); view3D_canvas->Bind(EVT_GLCANVAS_REMOVE_OBJECT, [q](SimpleEvent&) { q->remove_selected(); }); view3D_canvas->Bind(EVT_GLCANVAS_ARRANGE, [this](SimpleEvent&) { arrange(); }); @@ -1268,7 +1296,13 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&) { set_bed_shape(config->option("bed_shape")->values); }); // Preview events: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_VIEWPORT_CHANGED, &priv::on_viewport_changed, this); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [this](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&) { set_bed_shape(config->option("bed_shape")->values); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); }); @@ -2435,6 +2469,9 @@ void Plater::priv::on_object_select(SimpleEvent& evt) selection_changed(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Plater::priv::on_viewport_changed(SimpleEvent& evt) { wxObject* o = evt.GetEventObject(); @@ -2443,6 +2480,9 @@ void Plater::priv::on_viewport_changed(SimpleEvent& evt) else if (o == view3D->get_wxglcanvas()) preview->set_viewport_from_scene(view3D->get_canvas3d()); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Plater::priv::on_right_click(Vec2dEvent& evt) { From 72239732e4f1e533fdba4c1553fee9f6431b8a8f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 7 Mar 2019 08:34:54 +0100 Subject: [PATCH 080/236] Fixed build on Mac --- src/slic3r/GUI/GLCanvas3D.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e7b0a25f5..7c4ff1e52 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6092,8 +6092,20 @@ void GLCanvas3D::update_ui_from_settings() if (new_scaling != orig_scaling) { BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Scaling factor: " << new_scaling; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + if (m_camera != nullptr) + { + m_camera->zoom /= orig_scaling; + m_camera->zoom *= new_scaling; + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_camera.zoom /= orig_scaling; m_camera.zoom *= new_scaling; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ _refresh_if_shown_on_screen(); } #endif @@ -6859,7 +6871,15 @@ void GLCanvas3D::_render_camera_target() const ::glLineWidth(2.0f); ::glBegin(GL_LINES); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_SHARED_CAMERA + Vec3d target = (m_camera != nullptr) ? m_camera->get_target() : Vec3d::Zero(); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ const Vec3d& target = m_camera.get_target(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_SHARED_CAMERA +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // draw line for x axis ::glColor3f(1.0f, 0.0f, 0.0f); ::glVertex3d(target(0) - half_length, target(1), target(2)); From b5217918cf27055f348b84aeb15b7f128de1c588 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 7 Mar 2019 09:33:33 +0100 Subject: [PATCH 081/236] Code cleanup --- src/libslic3r/Technologies.hpp | 4 - src/slic3r/GUI/Camera.cpp | 3 - src/slic3r/GUI/Camera.hpp | 4 - src/slic3r/GUI/GLCanvas3D.cpp | 270 +-------------------------------- src/slic3r/GUI/GLCanvas3D.hpp | 86 ----------- src/slic3r/GUI/GUI_Preview.cpp | 26 ---- src/slic3r/GUI/GUI_Preview.hpp | 22 +-- src/slic3r/GUI/Plater.cpp | 49 +----- 8 files changed, 4 insertions(+), 460 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 92b4bbfdc..e978b5838 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -58,9 +58,5 @@ // Toolbars and Gizmos use icons imported from svg files #define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// Use a unique camera shared by 3d view and preview -#define ENABLE_SHARED_CAMERA (1 && ENABLE_1_42_0_ALPHA8) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // _technologies_h_ diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index c3317b0f4..c748efa64 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -2,8 +2,6 @@ #include "Camera.hpp" -#if ENABLE_SHARED_CAMERA - static const float GIMBALL_LOCK_THETA_MAX = 180.0f; namespace Slic3r { @@ -62,4 +60,3 @@ void Camera::set_scene_box(const BoundingBoxf3& box) } // GUI } // Slic3r -#endif // ENABLE_SHARED_CAMERA diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 77d5e9d9a..d50dc6e4d 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -1,8 +1,6 @@ #ifndef slic3r_Camera_hpp_ #define slic3r_Camera_hpp_ -#if ENABLE_SHARED_CAMERA - #include "libslic3r/BoundingBox.hpp" namespace Slic3r { @@ -48,7 +46,5 @@ public: } // GUI } // Slic3r -#endif // ENABLE_SHARED_CAMERA - #endif // slic3r_Camera_hpp_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7c4ff1e52..12361bdbc 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -54,13 +54,6 @@ #include static const float TRACKBALLSIZE = 0.8f; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -static const float GIMBALL_LOCK_THETA_MAX = 180.0f; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ static const float GROUND_Z = -0.02f; // phi / theta angles to orient the camera. @@ -189,67 +182,6 @@ void Rect::set_bottom(float bottom) m_bottom = bottom; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -GLCanvas3D::Camera::Camera() - : type(Ortho) - , zoom(1.0f) - , phi(45.0f) -// , distance(0.0f) - , m_theta(45.0f) - , m_target(Vec3d::Zero()) -{ -} - -std::string GLCanvas3D::Camera::get_type_as_string() const -{ - switch (type) - { - default: - case Unknown: - return "unknown"; -// case Perspective: -// return "perspective"; - case Ortho: - return "ortho"; - }; -} - -void GLCanvas3D::Camera::set_theta(float theta, bool apply_limit) -{ - if (apply_limit) - m_theta = clamp(0.0f, GIMBALL_LOCK_THETA_MAX, theta); - else - { - m_theta = fmod(theta, 360.0f); - if (m_theta < 0.0f) - m_theta += 360.0f; - } -} - -void GLCanvas3D::Camera::set_target(const Vec3d& target, GLCanvas3D& canvas) -{ - m_target = target; - m_target(0) = clamp(m_scene_box.min(0), m_scene_box.max(0), m_target(0)); - m_target(1) = clamp(m_scene_box.min(1), m_scene_box.max(1), m_target(1)); - m_target(2) = clamp(m_scene_box.min(2), m_scene_box.max(2), m_target(2)); - if (!m_target.isApprox(target)) - canvas.viewport_changed(); -} - -void GLCanvas3D::Camera::set_scene_box(const BoundingBoxf3& box, GLCanvas3D& canvas) -{ - if (m_scene_box != box) - { - m_scene_box = box; - canvas.viewport_changed(); - } -} -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - #if !ENABLE_TEXTURES_FROM_SVG GLCanvas3D::Shader::Shader() : m_shader(nullptr) @@ -3725,13 +3657,6 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const wxDEFINE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -wxDEFINE_EVENT(EVT_GLCANVAS_VIEWPORT_CHANGED, SimpleEvent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, Vec2dEvent); wxDEFINE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent); @@ -3755,11 +3680,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) , m_retina_helper(nullptr) #endif , m_in_render(false) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA , m_camera(nullptr) -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_bed(nullptr) #if ENABLE_SVG_ICONS , m_toolbar(GLToolbar::Normal, "Top") @@ -3775,13 +3696,6 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) , m_dirty(true) , m_initialized(false) , m_use_VBOs(false) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - , m_requires_zoom_to_bed(false) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_apply_zoom_to_volumes_filter(false) , m_hover_volume_id(-1) , m_toolbar_action_running(false) @@ -3821,17 +3735,6 @@ void GLCanvas3D::post_event(wxEvent &&event) wxPostEvent(m_canvas, event); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -void GLCanvas3D::viewport_changed() -{ - post_event(SimpleEvent(EVT_GLCANVAS_VIEWPORT_CHANGED)); -} -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) { if (m_initialized) @@ -4006,20 +3909,11 @@ void GLCanvas3D::set_model(Model* model) void GLCanvas3D::bed_shape_changed() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if (m_camera != nullptr) { m_camera->set_scene_box(scene_bounding_box()); m_camera->requires_zoom_to_bed = true; } -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.set_scene_box(scene_bounding_box(), *this); - m_requires_zoom_to_bed = true; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } @@ -4031,15 +3925,7 @@ void GLCanvas3D::set_color_by(const std::string& value) float GLCanvas3D::get_camera_zoom() const { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA return (m_camera != nullptr) ? m_camera->zoom : 0.0f; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - return m_camera.zoom; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const @@ -4184,44 +4070,17 @@ void GLCanvas3D::select_view(const std::string& direction) if (dir_vec != nullptr) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if (m_camera != nullptr) { m_camera->phi = dir_vec[0]; m_camera->set_theta(dir_vec[1], false); } -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.phi = dir_vec[0]; - m_camera.set_theta(dir_vec[1], false); - - viewport_changed(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_canvas != nullptr) m_canvas->Refresh(); } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -void GLCanvas3D::set_viewport_from_scene(const GLCanvas3D& other) -{ - m_camera.phi = other.m_camera.phi; - m_camera.set_theta(other.m_camera.get_theta(), false); - m_camera.set_scene_box(other.m_camera.get_scene_box(), *this); - m_camera.set_target(other.m_camera.get_target(), *this); - m_camera.zoom = other.m_camera.zoom; - m_dirty = true; -} -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void GLCanvas3D::update_volumes_colors_by_extruder() { if (m_config != nullptr) @@ -4282,28 +4141,12 @@ void GLCanvas3D::render() post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE)); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if ((m_camera != nullptr) && m_camera->requires_zoom_to_bed) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - if (m_requires_zoom_to_bed) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { zoom_to_bed(); const Size& cnv_size = get_canvas_size(); _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA m_camera->requires_zoom_to_bed = false; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_requires_zoom_to_bed = false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } _camera_tranform(); @@ -4313,15 +4156,7 @@ void GLCanvas3D::render() GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; ::glLightfv(GL_LIGHT0, GL_POSITION, position_top); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA float theta = (m_camera != nullptr) ? m_camera->get_theta() : 0.0f; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - float theta = m_camera.get_theta(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (theta > 180.f) // absolute value of the rotation theta = 360.f - theta; @@ -4758,17 +4593,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // restore to default value m_regenerate_volumes = true; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if (m_camera != nullptr) m_camera->set_scene_box(scene_bounding_box()); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.set_scene_box(scene_bounding_box(), *this); - m_camera.set_target(m_camera.get_target(), *this); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_selection.is_empty()) { @@ -5455,15 +5281,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag if (m_selection.contains_volume(m_hover_volume_id)) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if ((m_camera != nullptr) && (m_camera->get_theta() == 90.0f)) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - if (m_camera.get_theta() == 90.0f) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { // side view -> move selected volumes orthogonally to camera view direction Linef3 ray = mouse_ray(pos); @@ -5574,22 +5392,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif // ENABLE_MOVE_MIN_THRESHOLD { const Vec3d& orig = m_mouse.drag.start_position_3D; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if (m_camera != nullptr) { m_camera->phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); m_camera->set_theta(m_camera->get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); } -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); - m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); - - viewport_changed(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } @@ -5604,18 +5411,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) float z = 0.0f; const Vec3d& cur_pos = _mouse_to_3d(pos, &z); Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if (m_camera != nullptr) m_camera->set_target(m_camera->get_target() + orig - cur_pos); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.set_target(m_camera.get_target() + orig - cur_pos, *this); - - viewport_changed(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } @@ -5693,16 +5490,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // Let the platter know that the dragging finished, so a delayed refresh // of the scene with the background processing data should be performed. post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA m_camera->set_scene_box(scene_bounding_box()); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.set_scene_box(scene_bounding_box(), *this); - set_camera_zoom(0.0f); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } m_moving = false; @@ -6047,17 +5835,9 @@ void GLCanvas3D::set_camera_zoom(float zoom) // Don't allow to zoom too close to the scene. zoom = std::min(zoom, 100.0f); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if (m_camera != nullptr) m_camera->zoom = zoom; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.zoom = zoom; - viewport_changed(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + _refresh_if_shown_on_screen(); } @@ -6092,20 +5872,11 @@ void GLCanvas3D::update_ui_from_settings() if (new_scaling != orig_scaling) { BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Scaling factor: " << new_scaling; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if (m_camera != nullptr) { m_camera->zoom /= orig_scaling; m_camera->zoom *= new_scaling; } -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.zoom /= orig_scaling; - m_camera.zoom *= new_scaling; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ _refresh_if_shown_on_screen(); } #endif @@ -6292,16 +6063,8 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) const BoundingBoxf3& bbox = _max_bounding_box(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA Camera::EType camera_type = (m_camera != nullptr) ? m_camera->type : Camera::Unknown; switch (camera_type) -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - switch (m_camera.type) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { case Camera::Ortho: { @@ -6369,24 +6132,12 @@ void GLCanvas3D::_zoom_to_bounding_box(const BoundingBoxf3& bbox) float zoom = _get_zoom_to_bounding_box_factor(bbox); if (zoom > 0.0f) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA if (m_camera != nullptr) { m_camera->zoom = zoom; // center view around bounding box center m_camera->set_target(bbox.center()); } -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - m_camera.zoom = zoom; - // center view around bounding box center - m_camera.set_target(bbox.center(), *this); - - viewport_changed(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } @@ -6477,8 +6228,6 @@ void GLCanvas3D::_camera_tranform() const ::glMatrixMode(GL_MODELVIEW); ::glLoadIdentity(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA Vec3d target = Vec3d::Zero(); if (m_camera != nullptr) { @@ -6486,15 +6235,6 @@ void GLCanvas3D::_camera_tranform() const ::glRotatef(m_camera->phi, 0.0f, 0.0f, 1.0f); // yaw target = -m_camera->get_target(); } -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - ::glRotatef(-m_camera.get_theta(), 1.0f, 0.0f, 0.0f); // pitch - ::glRotatef(m_camera.phi, 0.0f, 0.0f, 1.0f); // yaw - - Vec3d target = -m_camera.get_target(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ::glTranslated(target(0), target(1), target(2)); } @@ -6871,15 +6611,7 @@ void GLCanvas3D::_render_camera_target() const ::glLineWidth(2.0f); ::glBegin(GL_LINES); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA Vec3d target = (m_camera != nullptr) ? m_camera->get_target() : Vec3d::Zero(); -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - const Vec3d& target = m_camera.get_target(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // draw line for x axis ::glColor3f(1.0f, 0.0f, 0.0f); ::glVertex3d(target(0) - half_length, target(1), target(2)); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 4d6612a4c..51a7202e7 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -9,11 +9,7 @@ #include "GLToolbar.hpp" #include "Event.hpp" #include "3DBed.hpp" -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA #include "Camera.hpp" -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include @@ -105,13 +101,6 @@ template using Vec3dsEvent = ArrayEvent; wxDECLARE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -wxDECLARE_EVENT(EVT_GLCANVAS_VIEWPORT_CHANGED, SimpleEvent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxDECLARE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, Vec2dEvent); wxDECLARE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_ARRANGE, SimpleEvent); @@ -173,47 +162,6 @@ class GLCanvas3D void reset() { first_volumes.clear(); } }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - struct Camera - { - enum EType : unsigned char - { - Unknown, -// Perspective, - Ortho, - Num_types - }; - - EType type; - float zoom; - float phi; -// float distance; - - private: - Vec3d m_target; - BoundingBoxf3 m_scene_box; - float m_theta; - - public: - Camera(); - - std::string get_type_as_string() const; - - float get_theta() const { return m_theta; } - void set_theta(float theta, bool apply_limit); - - const Vec3d& get_target() const { return m_target; } - void set_target(const Vec3d& target, GLCanvas3D& canvas); - - const BoundingBoxf3& get_scene_box() const { return m_scene_box; } - void set_scene_box(const BoundingBoxf3& box, GLCanvas3D& canvas); - }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - #if !ENABLE_TEXTURES_FROM_SVG class Shader { @@ -902,15 +850,7 @@ private: LegendTexture m_legend_texture; WarningTexture m_warning_texture; wxTimer m_timer; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA Camera* m_camera; -#else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - Camera m_camera; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Bed3D* m_bed; LayersEditing m_layers_editing; Shader m_shader; @@ -933,13 +873,6 @@ private: bool m_dirty; bool m_initialized; bool m_use_VBOs; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - bool m_requires_zoom_to_bed; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool m_apply_zoom_to_volumes_filter; mutable int m_hover_volume_id; bool m_toolbar_action_running; @@ -973,11 +906,7 @@ public: wxGLCanvas* get_wxglcanvas() { return m_canvas; } const wxGLCanvas* get_wxglcanvas() const { return m_canvas; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA void set_camera(Camera* camera) { m_camera = camera; } -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_bed(Bed3D* bed) { m_bed = bed; } void set_view_toolbar(GLToolbar* toolbar) { m_view_toolbar = toolbar; } @@ -1041,13 +970,6 @@ public: void zoom_to_volumes(); void zoom_to_selection(); void select_view(const std::string& direction); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void set_viewport_from_scene(const GLCanvas3D& other); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_volumes_colors_by_extruder(); @@ -1112,14 +1034,6 @@ public: void update_gizmos_on_off_state(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void viewport_changed(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void handle_sidebar_focus_event(const std::string& opt_key, bool focus_on); void update_ui_from_settings(); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 6f9882148..7f819dc3e 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -95,15 +95,11 @@ void View3D::set_bed(Bed3D* bed) m_canvas->set_bed(bed); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA void View3D::set_camera(Camera* camera) { if (m_canvas != nullptr) m_canvas->set_camera(camera); } -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void View3D::set_view_toolbar(GLToolbar* toolbar) { @@ -358,15 +354,11 @@ void Preview::set_bed(Bed3D* bed) m_canvas->set_bed(bed); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA void Preview::set_camera(Camera* camera) { if (m_canvas != nullptr) m_canvas->set_camera(camera); } -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Preview::set_view_toolbar(GLToolbar* toolbar) { @@ -410,24 +402,6 @@ void Preview::select_view(const std::string& direction) m_canvas->select_view(direction); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -void Preview::set_viewport_from_scene(GLCanvas3D* canvas) -{ - if (canvas != nullptr) - m_canvas->set_viewport_from_scene(*canvas); -} - -void Preview::set_viewport_into_scene(GLCanvas3D* canvas) -{ - if (canvas != nullptr) - canvas->set_viewport_from_scene(*m_canvas); -} -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void Preview::set_drop_target(wxDropTarget* target) { if (target != nullptr) diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 59d90f4b3..3fb64ce21 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -28,11 +28,7 @@ namespace GUI { class GLCanvas3D; class GLToolbar; class Bed3D; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA class Camera; -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ class View3D : public wxPanel { @@ -55,11 +51,8 @@ public: GLCanvas3D* get_canvas3d() { return m_canvas; } void set_bed(Bed3D* bed); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA void set_camera(Camera* camera); -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + void set_view_toolbar(GLToolbar* toolbar); void set_as_dirty(); @@ -125,11 +118,8 @@ public: GLCanvas3D* get_canvas3d() { return m_canvas; } void set_bed(Bed3D* bed); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA void set_camera(Camera* camera); -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + void set_view_toolbar(GLToolbar* toolbar); void set_number_extruders(unsigned int number_extruders); @@ -137,14 +127,6 @@ public: void set_enabled(bool enabled); void bed_shape_changed(); void select_view(const std::string& direction); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void set_viewport_from_scene(GLCanvas3D* canvas); - void set_viewport_into_scene(GLCanvas3D* canvas); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_drop_target(wxDropTarget* target); void load_print(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a5139f2bd..39a81c210 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -50,11 +50,7 @@ #include "GLToolbar.hpp" #include "GUI_Preview.hpp" #include "3DBed.hpp" -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA #include "Camera.hpp" -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include "Tab.hpp" #include "PresetBundle.hpp" #include "BackgroundSlicingProcess.hpp" @@ -1024,11 +1020,7 @@ struct Plater::priv std::vector panels; Sidebar *sidebar; Bed3D bed; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA Camera camera; -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ View3D* view3D; GLToolbar view_toolbar; Preview *preview; @@ -1125,13 +1117,6 @@ struct Plater::priv void on_action_layersediting(SimpleEvent&); void on_object_select(SimpleEvent&); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void on_viewport_changed(SimpleEvent&); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void on_right_click(Vec2dEvent&); void on_wipetower_moved(Vec3dEvent&); void on_update_geometry(Vec3dsEvent<2>&); @@ -1223,12 +1208,9 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D->set_bed(&bed); preview->set_bed(&bed); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_SHARED_CAMERA + view3D->set_camera(&camera); preview->set_camera(&camera); -#endif // ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ panels.push_back(view3D); panels.push_back(preview); @@ -1260,13 +1242,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) // 3DScene events: view3D_canvas->Bind(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, [this](SimpleEvent&) { this->schedule_background_process(); }); view3D_canvas->Bind(EVT_GLCANVAS_OBJECT_SELECT, &priv::on_object_select, this); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - view3D_canvas->Bind(EVT_GLCANVAS_VIEWPORT_CHANGED, &priv::on_viewport_changed, this); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D_canvas->Bind(EVT_GLCANVAS_RIGHT_CLICK, &priv::on_right_click, this); view3D_canvas->Bind(EVT_GLCANVAS_REMOVE_OBJECT, [q](SimpleEvent&) { q->remove_selected(); }); view3D_canvas->Bind(EVT_GLCANVAS_ARRANGE, [this](SimpleEvent&) { arrange(); }); @@ -1296,13 +1271,6 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&) { set_bed_shape(config->option("bed_shape")->values); }); // Preview events: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_VIEWPORT_CHANGED, &priv::on_viewport_changed, this); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [this](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&) { set_bed_shape(config->option("bed_shape")->values); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); }); @@ -2469,21 +2437,6 @@ void Plater::priv::on_object_select(SimpleEvent& evt) selection_changed(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -void Plater::priv::on_viewport_changed(SimpleEvent& evt) -{ - wxObject* o = evt.GetEventObject(); - if (o == preview->get_wxglcanvas()) - preview->set_viewport_into_scene(view3D->get_canvas3d()); - else if (o == view3D->get_wxglcanvas()) - preview->set_viewport_from_scene(view3D->get_canvas3d()); -} -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#endif // !ENABLE_SHARED_CAMERA -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void Plater::priv::on_right_click(Vec2dEvent& evt) { int obj_idx = get_selected_object_idx(); From fc70b73f45701d99db18b0af07436867ceecceab Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 7 Mar 2019 11:49:00 +0100 Subject: [PATCH 082/236] Refactoring - Shared members of GLCanvas3D as references instead of pointers --- src/slic3r/GUI/3DScene.cpp | 4 +- src/slic3r/GUI/3DScene.hpp | 7 +- src/slic3r/GUI/GLCanvas3D.cpp | 170 ++++++++++----------------- src/slic3r/GUI/GLCanvas3D.hpp | 13 +- src/slic3r/GUI/GLCanvas3DManager.cpp | 4 +- src/slic3r/GUI/GLCanvas3DManager.hpp | 5 +- src/slic3r/GUI/GUI_Preview.cpp | 54 ++------- src/slic3r/GUI/GUI_Preview.hpp | 20 +--- src/slic3r/GUI/Plater.cpp | 13 +- 9 files changed, 97 insertions(+), 193 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 88815d9a6..d4fcdd2e0 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -2002,9 +2002,9 @@ std::string _3DScene::get_gl_info(bool format_as_html, bool extensions) return s_canvas_mgr.get_gl_info(format_as_html, extensions); } -bool _3DScene::add_canvas(wxGLCanvas* canvas) +bool _3DScene::add_canvas(wxGLCanvas* canvas, GUI::Bed3D& bed, GUI::Camera& camera, GUI::GLToolbar& view_toolbar) { - return s_canvas_mgr.add(canvas); + return s_canvas_mgr.add(canvas, bed, camera, view_toolbar); } bool _3DScene::remove_canvas(wxGLCanvas* canvas) diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 46cb5b870..5daf4b941 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -25,6 +25,11 @@ inline void glAssertRecentCall() { } #endif namespace Slic3r { +namespace GUI { +class Bed3D; +struct Camera; +class GLToolbar; +} // namespace GUI class Print; class PrintObject; @@ -563,7 +568,7 @@ class _3DScene public: static std::string get_gl_info(bool format_as_html, bool extensions); - static bool add_canvas(wxGLCanvas* canvas); + static bool add_canvas(wxGLCanvas* canvas, GUI::Bed3D& bed, GUI::Camera& camera, GUI::GLToolbar& view_toolbar); static bool remove_canvas(wxGLCanvas* canvas); static void remove_all_canvases(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 12361bdbc..b8afc325a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3153,7 +3153,7 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { left, bottom }, { right, bottom }, { right, top }, { left, top } }); #if ENABLE_IMGUI if (it->second->get_state() == GLGizmoBase::On) { - float toolbar_top = (float)cnv_h - canvas.m_view_toolbar->get_height(); + float toolbar_top = (float)cnv_h - canvas.m_view_toolbar.get_height(); #if ENABLE_SVG_ICONS it->second->render_input_window(2.0f * m_overlay_border + m_overlay_icons_size, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); #else @@ -3673,21 +3673,21 @@ wxDEFINE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent); -GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) +GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar) : m_canvas(canvas) , m_context(nullptr) #if ENABLE_RETINA_GL , m_retina_helper(nullptr) #endif , m_in_render(false) - , m_camera(nullptr) - , m_bed(nullptr) + , m_bed(bed) + , m_camera(camera) + , m_view_toolbar(view_toolbar) #if ENABLE_SVG_ICONS , m_toolbar(GLToolbar::Normal, "Top") #else , m_toolbar(GLToolbar::Normal) #endif // ENABLE_SVG_ICONS - , m_view_toolbar(nullptr) , m_use_clipping_planes(false) , m_sidebar_field("") , m_config(nullptr) @@ -3909,12 +3909,8 @@ void GLCanvas3D::set_model(Model* model) void GLCanvas3D::bed_shape_changed() { - if (m_camera != nullptr) - { - m_camera->set_scene_box(scene_bounding_box()); - m_camera->requires_zoom_to_bed = true; - } - + m_camera.set_scene_box(scene_bounding_box()); + m_camera.requires_zoom_to_bed = true; m_dirty = true; } @@ -3925,7 +3921,7 @@ void GLCanvas3D::set_color_by(const std::string& value) float GLCanvas3D::get_camera_zoom() const { - return (m_camera != nullptr) ? m_camera->zoom : 0.0f; + return m_camera.zoom; } BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const @@ -3942,8 +3938,7 @@ BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const BoundingBoxf3 GLCanvas3D::scene_bounding_box() const { BoundingBoxf3 bb = volumes_bounding_box(); - if (m_bed != nullptr) - bb.merge(m_bed->get_bounding_box()); + bb.merge(m_bed.get_bounding_box()); if (m_config != nullptr) { @@ -4032,8 +4027,7 @@ bool GLCanvas3D::is_toolbar_item_pressed(const std::string& name) const void GLCanvas3D::zoom_to_bed() { - if (m_bed != nullptr) - _zoom_to_bounding_box(m_bed->get_bounding_box()); + _zoom_to_bounding_box(m_bed.get_bounding_box()); } void GLCanvas3D::zoom_to_volumes() @@ -4070,12 +4064,8 @@ void GLCanvas3D::select_view(const std::string& direction) if (dir_vec != nullptr) { - if (m_camera != nullptr) - { - m_camera->phi = dir_vec[0]; - m_camera->set_theta(dir_vec[1], false); - } - + m_camera.phi = dir_vec[0]; + m_camera.set_theta(dir_vec[1], false); if (m_canvas != nullptr) m_canvas->Refresh(); } @@ -4135,18 +4125,16 @@ void GLCanvas3D::render() if (!_set_current() || !_3DScene::init(m_canvas)) return; - if ((m_bed != nullptr) && m_bed->get_shape().empty()) - { + if (m_bed.get_shape().empty()) // this happens at startup when no data is still saved under <>\AppData\Roaming\Slic3rPE post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE)); - } - if ((m_camera != nullptr) && m_camera->requires_zoom_to_bed) + if (m_camera.requires_zoom_to_bed) { zoom_to_bed(); const Size& cnv_size = get_canvas_size(); _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); - m_camera->requires_zoom_to_bed = false; + m_camera.requires_zoom_to_bed = false; } _camera_tranform(); @@ -4156,13 +4144,11 @@ void GLCanvas3D::render() GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; ::glLightfv(GL_LIGHT0, GL_POSITION, position_top); - float theta = (m_camera != nullptr) ? m_camera->get_theta() : 0.0f; + float theta = m_camera.get_theta(); if (theta > 180.f) // absolute value of the rotation theta = 360.f - theta; - bool is_custom_bed = (m_bed == nullptr) || m_bed->is_custom(); - #if ENABLE_IMGUI wxGetApp().imgui()->new_frame(); #endif // ENABLE_IMGUI @@ -4175,8 +4161,8 @@ void GLCanvas3D::render() _render_background(); // textured bed needs to be rendered after objects if the texture is transparent - bool early_bed_render = is_custom_bed || (theta <= 90.0f); - if (early_bed_render) + bool early_bed_render = m_bed.is_custom() || (theta <= 90.0f); + if (early_bed_render) _render_bed(theta); _render_objects(); @@ -4593,8 +4579,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // restore to default value m_regenerate_volumes = true; - if (m_camera != nullptr) - m_camera->set_scene_box(scene_bounding_box()); + m_camera.set_scene_box(scene_bounding_box()); if (m_selection.is_empty()) { @@ -5048,7 +5033,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_layers_editing.select_object(*m_model, layer_editing_object_idx); bool gizmos_overlay_contains_mouse = m_gizmos.overlay_contains_mouse(*this, m_mouse.position); int toolbar_contains_mouse = m_toolbar.contains_mouse(m_mouse.position, *this); - int view_toolbar_contains_mouse = (m_view_toolbar != nullptr) ? m_view_toolbar->contains_mouse(m_mouse.position, *this) : -1; + int view_toolbar_contains_mouse = m_view_toolbar.contains_mouse(m_mouse.position, *this); #if ENABLE_MOVE_MIN_THRESHOLD if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) @@ -5160,10 +5145,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // event was taken care of by the SlaSupports gizmo } else if (evt.LeftDown() && (view_toolbar_contains_mouse != -1)) - { - if (m_view_toolbar != nullptr) - m_view_toolbar->do_action((unsigned int)view_toolbar_contains_mouse, *this); - } + m_view_toolbar.do_action((unsigned int)view_toolbar_contains_mouse, *this); else if (evt.LeftDown() && (toolbar_contains_mouse != -1)) { m_toolbar_action_running = true; @@ -5281,7 +5263,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag if (m_selection.contains_volume(m_hover_volume_id)) { - if ((m_camera != nullptr) && (m_camera->get_theta() == 90.0f)) + if (m_camera.get_theta() == 90.0f) { // side view -> move selected volumes orthogonally to camera view direction Linef3 ray = mouse_ray(pos); @@ -5392,12 +5374,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif // ENABLE_MOVE_MIN_THRESHOLD { const Vec3d& orig = m_mouse.drag.start_position_3D; - if (m_camera != nullptr) - { - m_camera->phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); - m_camera->set_theta(m_camera->get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); - } - + m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); + m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); m_dirty = true; } m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0); @@ -5411,9 +5389,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) float z = 0.0f; const Vec3d& cur_pos = _mouse_to_3d(pos, &z); Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z); - if (m_camera != nullptr) - m_camera->set_target(m_camera->get_target() + orig - cur_pos); - + m_camera.set_target(m_camera.get_target() + orig - cur_pos); m_dirty = true; } @@ -5490,7 +5466,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // Let the platter know that the dragging finished, so a delayed refresh // of the scene with the background processing data should be performed. post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - m_camera->set_scene_box(scene_bounding_box()); + m_camera.set_scene_box(scene_bounding_box()); } m_moving = false; @@ -5520,9 +5496,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) tooltip = m_toolbar.update_hover_state(m_mouse.position, *this); // updates view toolbar overlay - if (tooltip.empty() && (m_view_toolbar != nullptr)) + if (tooltip.empty()) { - tooltip = m_view_toolbar->update_hover_state(m_mouse.position, *this); + tooltip = m_view_toolbar.update_hover_state(m_mouse.position, *this); if (!tooltip.empty()) m_dirty = true; } @@ -5835,9 +5811,7 @@ void GLCanvas3D::set_camera_zoom(float zoom) // Don't allow to zoom too close to the scene. zoom = std::min(zoom, 100.0f); - if (m_camera != nullptr) - m_camera->zoom = zoom; - + m_camera.zoom = zoom; _refresh_if_shown_on_screen(); } @@ -5872,11 +5846,8 @@ void GLCanvas3D::update_ui_from_settings() if (new_scaling != orig_scaling) { BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Scaling factor: " << new_scaling; - if (m_camera != nullptr) - { - m_camera->zoom /= orig_scaling; - m_camera->zoom *= new_scaling; - } + m_camera.zoom /= orig_scaling; + m_camera.zoom *= new_scaling; _refresh_if_shown_on_screen(); } #endif @@ -6063,8 +6034,7 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) const BoundingBoxf3& bbox = _max_bounding_box(); - Camera::EType camera_type = (m_camera != nullptr) ? m_camera->type : Camera::Unknown; - switch (camera_type) + switch (m_camera.type) { case Camera::Ortho: { @@ -6121,8 +6091,7 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) BoundingBoxf3 GLCanvas3D::_max_bounding_box() const { BoundingBoxf3 bb = volumes_bounding_box(); - if (m_bed != nullptr) - bb.merge(m_bed->get_bounding_box()); + bb.merge(m_bed.get_bounding_box()); return bb; } @@ -6132,13 +6101,9 @@ void GLCanvas3D::_zoom_to_bounding_box(const BoundingBoxf3& bbox) float zoom = _get_zoom_to_bounding_box_factor(bbox); if (zoom > 0.0f) { - if (m_camera != nullptr) - { - m_camera->zoom = zoom; - // center view around bounding box center - m_camera->set_target(bbox.center()); - } - + m_camera.zoom = zoom; + // center view around bounding box center + m_camera.set_target(bbox.center()); m_dirty = true; } } @@ -6228,13 +6193,9 @@ void GLCanvas3D::_camera_tranform() const ::glMatrixMode(GL_MODELVIEW); ::glLoadIdentity(); - Vec3d target = Vec3d::Zero(); - if (m_camera != nullptr) - { - ::glRotatef(-m_camera->get_theta(), 1.0f, 0.0f, 0.0f); // pitch - ::glRotatef(m_camera->phi, 0.0f, 0.0f, 1.0f); // yaw - target = -m_camera->get_target(); - } + ::glRotatef(-m_camera.get_theta(), 1.0f, 0.0f, 0.0f); // pitch + ::glRotatef(m_camera.phi, 0.0f, 0.0f, 1.0f); // yaw + Vec3d target = -m_camera.get_target(); ::glTranslated(target(0), target(1), target(2)); } @@ -6329,16 +6290,13 @@ void GLCanvas3D::_render_bed(float theta) const float scale_factor = 1.0; #if ENABLE_RETINA_GL scale_factor = m_retina_helper->get_scale_factor(); -#endif - - if (m_bed != nullptr) - m_bed->render(theta, m_use_VBOs, scale_factor); +#endif // ENABLE_RETINA_GL + m_bed.render(theta, m_use_VBOs, scale_factor); } void GLCanvas3D::_render_axes() const { - if (m_bed != nullptr) - m_bed->render_axes(); + m_bed.render_axes(); } void GLCanvas3D::_render_objects() const @@ -6356,9 +6314,9 @@ void GLCanvas3D::_render_objects() const // Update the layer editing selection to the first object selected, update the current object maximum Z. const_cast(m_layers_editing).select_object(*m_model, this->is_layers_editing_enabled() ? m_selection.get_object_idx() : -1); - if ((m_config != nullptr) && (m_bed != nullptr)) + if (m_config != nullptr) { - const BoundingBoxf3& bed_bb = m_bed->get_bounding_box(); + const BoundingBoxf3& bed_bb = m_bed.get_bounding_box(); m_volumes.set_print_box((float)bed_bb.min(0), (float)bed_bb.min(1), 0.0f, (float)bed_bb.max(0), (float)bed_bb.max(1), (float)m_config->opt_float("max_print_height")); m_volumes.check_outside_state(m_config, nullptr); } @@ -6540,7 +6498,7 @@ void GLCanvas3D::_render_toolbar() const } else { - top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom; + top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; left = -0.5f * m_toolbar.get_width() * inv_zoom; } break; @@ -6575,31 +6533,29 @@ void GLCanvas3D::_render_toolbar() const void GLCanvas3D::_render_view_toolbar() const { - if (m_view_toolbar != nullptr) { #if ENABLE_SVG_ICONS #if ENABLE_RETINA_GL - m_view_toolbar->set_scale(m_retina_helper->get_scale_factor()); + m_view_toolbar.set_scale(m_retina_helper->get_scale_factor()); #else - m_view_toolbar->set_scale(m_canvas->GetContentScaleFactor()); + m_view_toolbar.set_scale(m_canvas->GetContentScaleFactor()); #endif // ENABLE_RETINA_GL - Size cnv_size = get_canvas_size(); - float zoom = get_camera_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + Size cnv_size = get_canvas_size(); + float zoom = get_camera_zoom(); + float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; - // places the toolbar on the bottom-left corner of the 3d scene - float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom; - float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; - m_view_toolbar->set_position(top, left); + // places the toolbar on the bottom-left corner of the 3d scene + float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; + float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; + m_view_toolbar.set_position(top, left); #else #if ENABLE_RETINA_GL - m_view_toolbar->set_icons_scale(m_retina_helper->get_scale_factor()); + m_view_toolbar.set_icons_scale(m_retina_helper->get_scale_factor()); #else - m_view_toolbar->set_icons_scale(m_canvas->GetContentScaleFactor()); + m_view_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor()); #endif /* __WXMSW__ */ #endif // ENABLE_SVG_ICONS - m_view_toolbar->render(*this); - } + m_view_toolbar.render(*this); } #if ENABLE_SHOW_CAMERA_TARGET @@ -6611,7 +6567,7 @@ void GLCanvas3D::_render_camera_target() const ::glLineWidth(2.0f); ::glBegin(GL_LINES); - Vec3d target = (m_camera != nullptr) ? m_camera->get_target() : Vec3d::Zero(); + const Vec3d& target = m_camera.get_target(); // draw line for x axis ::glColor3f(1.0f, 0.0f, 0.0f); ::glVertex3d(target(0) - half_length, target(1), target(2)); @@ -8115,7 +8071,7 @@ void GLCanvas3D::_resize_toolbars() const } else { - top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom; + top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; left = -0.5f * m_toolbar.get_width() * inv_zoom; } m_toolbar.set_position(top, left); @@ -8143,15 +8099,15 @@ void GLCanvas3D::_resize_toolbars() const if (m_view_toolbar != nullptr) { #if ENABLE_RETINA_GL - m_view_toolbar->set_icons_scale(m_retina_helper->get_scale_factor()); + m_view_toolbar.set_icons_scale(m_retina_helper->get_scale_factor()); #else - m_view_toolbar->set_icons_scale(m_canvas->GetContentScaleFactor()); + m_view_toolbar.set_icons_scale(m_canvas->GetContentScaleFactor()); #endif /* __WXMSW__ */ // places the toolbar on the bottom-left corner of the 3d scene - float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar->get_height()) * inv_zoom; + float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom; float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; - m_view_toolbar->set_position(top, left); + m_view_toolbar.set_position(top, left); } } #endif // !ENABLE_SVG_ICONS diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 51a7202e7..7c39ab490 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -850,14 +850,14 @@ private: LegendTexture m_legend_texture; WarningTexture m_warning_texture; wxTimer m_timer; - Camera* m_camera; - Bed3D* m_bed; + Bed3D& m_bed; + Camera& m_camera; + GLToolbar& m_view_toolbar; LayersEditing m_layers_editing; Shader m_shader; Mouse m_mouse; mutable Gizmos m_gizmos; mutable GLToolbar m_toolbar; - GLToolbar* m_view_toolbar; ClippingPlane m_clipping_planes[2]; bool m_use_clipping_planes; mutable SlaCap m_sla_caps[2]; @@ -898,7 +898,7 @@ private: #endif // not ENABLE_IMGUI public: - GLCanvas3D(wxGLCanvas* canvas); + GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); ~GLCanvas3D(); void set_context(wxGLContext* context) { m_context = context; } @@ -906,11 +906,6 @@ public: wxGLCanvas* get_wxglcanvas() { return m_canvas; } const wxGLCanvas* get_wxglcanvas() const { return m_canvas; } - void set_camera(Camera* camera) { m_camera = camera; } - void set_bed(Bed3D* bed) { m_bed = bed; } - - void set_view_toolbar(GLToolbar* toolbar) { m_view_toolbar = toolbar; } - bool init(bool useVBOs, bool use_legacy_opengl); void post_event(wxEvent &&event); diff --git a/src/slic3r/GUI/GLCanvas3DManager.cpp b/src/slic3r/GUI/GLCanvas3DManager.cpp index 71299f777..e409bed0d 100644 --- a/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -129,7 +129,7 @@ GLCanvas3DManager::~GLCanvas3DManager() } } -bool GLCanvas3DManager::add(wxGLCanvas* canvas) +bool GLCanvas3DManager::add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar) { if (canvas == nullptr) return false; @@ -137,7 +137,7 @@ bool GLCanvas3DManager::add(wxGLCanvas* canvas) if (_get_canvas(canvas) != m_canvases.end()) return false; - GLCanvas3D* canvas3D = new GLCanvas3D(canvas); + GLCanvas3D* canvas3D = new GLCanvas3D(canvas, bed, camera, view_toolbar); if (canvas3D == nullptr) return false; diff --git a/src/slic3r/GUI/GLCanvas3DManager.hpp b/src/slic3r/GUI/GLCanvas3DManager.hpp index 1f7c49f72..75647e6b2 100644 --- a/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -23,6 +23,9 @@ class PrintObject; namespace GUI { class GLCanvas3D; +class Bed3D; +class GLToolbar; +struct Camera; class GLCanvas3DManager { @@ -62,7 +65,7 @@ public: GLCanvas3DManager(); ~GLCanvas3DManager(); - bool add(wxGLCanvas* canvas); + bool add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); bool remove(wxGLCanvas* canvas); void remove_all(); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 7f819dc3e..57ede0a96 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -27,7 +27,7 @@ namespace Slic3r { namespace GUI { -View3D::View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) + View3D::View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) : m_canvas_widget(nullptr) , m_canvas(nullptr) #if !ENABLE_IMGUI @@ -37,7 +37,7 @@ View3D::View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, Backg , m_config(nullptr) , m_process(nullptr) { - init(parent, model, config, process); + init(parent, bed, camera, view_toolbar, model, config, process); } View3D::~View3D() @@ -50,13 +50,13 @@ View3D::~View3D() } } -bool View3D::init(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) +bool View3D::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) { if (!Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 /* disable wxTAB_TRAVERSAL */)) return false; m_canvas_widget = GLCanvas3DManager::create_wxglcanvas(this); - _3DScene::add_canvas(m_canvas_widget); + _3DScene::add_canvas(m_canvas_widget, bed, camera, view_toolbar); m_canvas = _3DScene::get_canvas(this->m_canvas_widget); m_canvas->allow_multisample(GLCanvas3DManager::can_multisample()); @@ -89,24 +89,6 @@ bool View3D::init(wxWindow* parent, Model* model, DynamicPrintConfig* config, Ba return true; } -void View3D::set_bed(Bed3D* bed) -{ - if (m_canvas != nullptr) - m_canvas->set_bed(bed); -} - -void View3D::set_camera(Camera* camera) -{ - if (m_canvas != nullptr) - m_canvas->set_camera(camera); -} - -void View3D::set_view_toolbar(GLToolbar* toolbar) -{ - if (m_canvas != nullptr) - m_canvas->set_view_toolbar(toolbar); -} - void View3D::set_as_dirty() { if (m_canvas != nullptr) @@ -199,7 +181,7 @@ void View3D::render() m_canvas->set_as_dirty(); } -Preview::Preview(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process_func) +Preview::Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process_func) : m_canvas_widget(nullptr) , m_canvas(nullptr) , m_double_slider_sizer(nullptr) @@ -220,14 +202,14 @@ Preview::Preview(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicing , m_enabled(false) , m_schedule_background_process(schedule_background_process_func) { - if (init(parent, config, process, gcode_preview_data)) + if (init(parent, bed, camera, view_toolbar, config, process, gcode_preview_data)) { show_hide_ui_elements("none"); load_print(); } } -bool Preview::init(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data) +bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data) { if ((config == nullptr) || (process == nullptr) || (gcode_preview_data == nullptr)) return false; @@ -236,8 +218,8 @@ bool Preview::init(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlici return false; m_canvas_widget = GLCanvas3DManager::create_wxglcanvas(this); - _3DScene::add_canvas(m_canvas_widget); - m_canvas = _3DScene::get_canvas(this->m_canvas_widget); + _3DScene::add_canvas(m_canvas_widget, bed, camera, view_toolbar); + m_canvas = _3DScene::get_canvas(this->m_canvas_widget); m_canvas->allow_multisample(GLCanvas3DManager::can_multisample()); m_canvas->set_config(m_config); m_canvas->set_process(process); @@ -348,24 +330,6 @@ Preview::~Preview() } } -void Preview::set_bed(Bed3D* bed) -{ - if (m_canvas != nullptr) - m_canvas->set_bed(bed); -} - -void Preview::set_camera(Camera* camera) -{ - if (m_canvas != nullptr) - m_canvas->set_camera(camera); -} - -void Preview::set_view_toolbar(GLToolbar* toolbar) -{ - if (m_canvas != nullptr) - m_canvas->set_view_toolbar(toolbar); -} - void Preview::set_number_extruders(unsigned int number_extruders) { if (m_number_extruders != number_extruders) diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 3fb64ce21..05f9fc2ca 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -28,7 +28,7 @@ namespace GUI { class GLCanvas3D; class GLToolbar; class Bed3D; -class Camera; +struct Camera; class View3D : public wxPanel { @@ -44,17 +44,12 @@ class View3D : public wxPanel BackgroundSlicingProcess* m_process; public: - View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); + View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); virtual ~View3D(); wxGLCanvas* get_wxglcanvas() { return m_canvas_widget; } GLCanvas3D* get_canvas3d() { return m_canvas; } - void set_bed(Bed3D* bed); - void set_camera(Camera* camera); - - void set_view_toolbar(GLToolbar* toolbar); - void set_as_dirty(); void bed_shape_changed(); @@ -78,7 +73,7 @@ public: void render(); private: - bool init(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); + bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); }; class Preview : public wxPanel @@ -111,17 +106,12 @@ class Preview : public wxPanel PrusaDoubleSlider* m_slider {nullptr}; public: - Preview(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process = [](){}); + Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process = [](){}); virtual ~Preview(); wxGLCanvas* get_wxglcanvas() { return m_canvas_widget; } GLCanvas3D* get_canvas3d() { return m_canvas; } - void set_bed(Bed3D* bed); - void set_camera(Camera* camera); - - void set_view_toolbar(GLToolbar* toolbar); - void set_number_extruders(unsigned int number_extruders); void set_canvas_as_dirty(); void set_enabled(bool enabled); @@ -134,7 +124,7 @@ public: void refresh_print(); private: - bool init(wxWindow* parent, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data); + bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data); void bind_event_handlers(); void unbind_event_handlers(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 39a81c210..65868a4e7 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1203,14 +1203,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) sla_print.set_status_callback(statuscb); this->q->Bind(EVT_SLICING_UPDATE, &priv::on_slicing_update, this); - view3D = new View3D(q, &model, config, &background_process); - preview = new Preview(q, config, &background_process, &gcode_preview_data, [this](){ schedule_background_process(); }); - - view3D->set_bed(&bed); - preview->set_bed(&bed); - - view3D->set_camera(&camera); - preview->set_camera(&camera); + view3D = new View3D(q, bed, camera, view_toolbar, &model, config, &background_process); + preview = new Preview(q, bed, camera, view_toolbar, config, &background_process, &gcode_preview_data, [this](){ schedule_background_process(); }); panels.push_back(view3D); panels.push_back(preview); @@ -2674,9 +2668,6 @@ void Plater::priv::init_view_toolbar() view_toolbar.select_item("3D"); view_toolbar.set_enabled(true); - - view3D->set_view_toolbar(&view_toolbar); - preview->set_view_toolbar(&view_toolbar); } bool Plater::priv::can_delete_object() const From 2f6a5e4af33b7eef03acf55cf41e36231334bc72 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 7 Mar 2019 14:43:35 +0100 Subject: [PATCH 083/236] 1st attempt to prevent showing old framebuffer when switching between views on Mac --- src/slic3r/GUI/Plater.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 65868a4e7..f6cd089ea 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2239,8 +2239,16 @@ void Plater::priv::set_current_panel(wxPanel* panel) p->Hide(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + current_panel->Freeze(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + panel_sizer->Layout(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + current_panel->Thaw(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (current_panel == view3D) { if (view3D->is_reload_delayed()) From 628a868cfddb0d0b4e492fd8aa3e43f6ac16c39f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 7 Mar 2019 15:13:38 +0100 Subject: [PATCH 084/236] 2nd attempt to prevent showing old framebuffer when switching between views on Mac --- src/slic3r/GUI/GLCanvas3D.cpp | 6 ++++-- src/slic3r/GUI/Plater.cpp | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index b8afc325a..0ffcbb3eb 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4118,8 +4118,10 @@ void GLCanvas3D::render() if (m_canvas == nullptr) return; - if (!_is_shown_on_screen()) - return; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// if (!_is_shown_on_screen()) +// return; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // ensures this canvas is current and initialized if (!_set_current() || !_3DScene::init(m_canvas)) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f6cd089ea..b63771ca3 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2240,13 +2240,13 @@ void Plater::priv::set_current_panel(wxPanel* panel) } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - current_panel->Freeze(); +// current_panel->Freeze(); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ panel_sizer->Layout(); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - current_panel->Thaw(); +// current_panel->Thaw(); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (current_panel == view3D) From 81820fa77fc274c2c53933a2fa683c3acef949aa Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 7 Mar 2019 15:44:25 +0100 Subject: [PATCH 085/236] 3rd attempt to prevent showing old framebuffer when switching between views on Mac --- src/slic3r/GUI/Plater.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index b63771ca3..0ba4a26fd 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2222,6 +2222,10 @@ void Plater::priv::set_current_panel(wxPanel* panel) if (std::find(panels.begin(), panels.end(), panel) == panels.end()) return; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + bool force_render = (current_panel != nullptr); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (current_panel == panel) return; @@ -2230,7 +2234,20 @@ void Plater::priv::set_current_panel(wxPanel* panel) for (wxPanel* p : panels) { if (p == current_panel) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + { + if (force_render) + { + if (p == view3D) + dynamic_cast(p)->get_canvas3d()->render(); + else if (p == preview) + dynamic_cast(p)->get_canvas3d()->render(); + } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ p->Show(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } // then set to invisible the other for (wxPanel* p : panels) From 513256649edf56b0f8155053442d98d4b1b24558 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 8 Mar 2019 08:29:54 +0100 Subject: [PATCH 086/236] Final version of fix to prevent showing old framebuffer when switching between views on Mac --- src/slic3r/GUI/GLCanvas3D.cpp | 6 ++---- src/slic3r/GUI/Plater.cpp | 19 +++++-------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 0ffcbb3eb..b8afc325a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4118,10 +4118,8 @@ void GLCanvas3D::render() if (m_canvas == nullptr) return; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// if (!_is_shown_on_screen()) -// return; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (!_is_shown_on_screen()) + return; // ensures this canvas is current and initialized if (!_set_current() || !_3DScene::init(m_canvas)) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 0ba4a26fd..112dc8b6e 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2222,9 +2222,9 @@ void Plater::priv::set_current_panel(wxPanel* panel) if (std::find(panels.begin(), panels.end(), panel) == panels.end()) return; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#ifdef __WXMAC__ bool force_render = (current_panel != nullptr); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // __WXMAC__ if (current_panel == panel) return; @@ -2234,8 +2234,9 @@ void Plater::priv::set_current_panel(wxPanel* panel) for (wxPanel* p : panels) { if (p == current_panel) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { +#ifdef __WXMAC__ + // On Mac we need also to force a render to avoid flickering when changing view if (force_render) { if (p == view3D) @@ -2243,11 +2244,9 @@ void Plater::priv::set_current_panel(wxPanel* panel) else if (p == preview) dynamic_cast(p)->get_canvas3d()->render(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // __WXMAC__ p->Show(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } // then set to invisible the other for (wxPanel* p : panels) @@ -2256,16 +2255,8 @@ void Plater::priv::set_current_panel(wxPanel* panel) p->Hide(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// current_panel->Freeze(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - panel_sizer->Layout(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// current_panel->Thaw(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - if (current_panel == view3D) { if (view3D->is_reload_delayed()) From 862700ab46d7b540f8f01c5ababd213e816af3d4 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 8 Mar 2019 10:42:09 +0100 Subject: [PATCH 087/236] Added change removed by mistale in 02163f7f9648b81ad1dc59a4ad6c1a5c55c02a50 --- src/slic3r/GUI/GLCanvas3D.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index b8afc325a..7914022a1 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4118,8 +4118,11 @@ void GLCanvas3D::render() if (m_canvas == nullptr) return; +#ifndef __WXMAC__ + // on Mac this check causes flickering when changing view if (!_is_shown_on_screen()) return; +#endif // __WXMAC__ // ensures this canvas is current and initialized if (!_set_current() || !_3DScene::init(m_canvas)) From 7c09b841bc4bd01d4f8bf0500d709d90bf43c659 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 8 Mar 2019 14:18:22 +0100 Subject: [PATCH 088/236] Fix for the application of the new pillar link distance parameter --- src/libslic3r/SLA/SLASupportTree.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index c52f82654..eab0ddba7 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1862,17 +1862,16 @@ public: } void cascade_pillars() { - // Now comes the algorithm that connects ground pillars with each other. + // Now comes the algorithm that connects pillars with each other. // Ideally every pillar should be connected with at least one of its - // neighbors if that neighbor is within sufficient distance (a bridge to - // it would not be longer than max_bridge_distance) + // neighbors if that neighbor is within max_pillar_link_distance // Pillars with height exceeding H1 will require at least one neighbor // to connect with. Height exceeding H2 require two neighbors. double H1 = m_cfg.max_solo_pillar_height_mm; double H2 = m_cfg.max_dual_pillar_height_mm; unsigned neighbors = m_cfg.pillar_cascade_neighbors; - double d = std::cos(m_cfg.bridge_slope) * m_cfg.max_bridge_length_mm; + double d = m_cfg.max_pillar_link_distance_mm; //A connection between two pillars only counts if the height ratio is // bigger than 20% From 172daa89897edfd8764dbb9581fc0e25a85ec5c6 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 8 Mar 2019 14:35:33 +0100 Subject: [PATCH 089/236] Top toolbar icon size set to 40px --- src/slic3r/GUI/GLCanvas3D.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7914022a1..dca42eb62 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5890,6 +5890,9 @@ bool GLCanvas3D::_init_toolbar() return true; } +#if ENABLE_SVG_ICONS + m_toolbar.set_icons_size(40); +#endif // ENABLE_SVG_ICONS // m_toolbar.set_layout_type(GLToolbar::Layout::Vertical); m_toolbar.set_layout_type(GLToolbar::Layout::Horizontal); m_toolbar.set_layout_orientation(GLToolbar::Layout::Top); From b89e95aea7d2ef665973a812ba03c263cc82a3ba Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 8 Mar 2019 14:52:32 +0100 Subject: [PATCH 090/236] Fixed rotation of multiple instances selection --- src/slic3r/GUI/GLCanvas3D.cpp | 132 +++++++++++++++++++--------------- 1 file changed, 76 insertions(+), 56 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index dca42eb62..855365130 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1222,69 +1222,89 @@ void GLCanvas3D::Selection::rotate(const Vec3d& rotation, GLCanvas3D::Transforma // Only relative rotation values are allowed in the world coordinate system. assert(! transformation_type.world() || transformation_type.relative()); - int rot_axis_max; - //FIXME this does not work for absolute rotations (transformation_type.absolute() is true) - rotation.cwiseAbs().maxCoeff(&rot_axis_max); - - // For generic rotation, we want to rotate the first volume in selection, and then to synchronize the other volumes with it. - std::vector object_instance_first(m_model->objects.size(), -1); - auto rotate_instance = [this, &rotation, &object_instance_first, rot_axis_max, transformation_type](GLVolume &volume, int i) { - int first_volume_idx = object_instance_first[volume.object_idx()]; - if (rot_axis_max != 2 && first_volume_idx != -1) { - // Generic rotation, but no rotation around the Z axis. - // Always do a local rotation (do not consider the selection to be a rigid body). - assert(is_approx(rotation.z(), 0.0)); - const GLVolume &first_volume = *(*m_volumes)[first_volume_idx]; - const Vec3d &rotation = first_volume.get_instance_rotation(); - double z_diff = rotation_diff_z(m_cache.volumes_data[first_volume_idx].get_instance_rotation(), m_cache.volumes_data[i].get_instance_rotation()); - volume.set_instance_rotation(Vec3d(rotation(0), rotation(1), rotation(2) + z_diff)); - } else { - // extracts rotations from the composed transformation - Vec3d new_rotation = transformation_type.world() ? - Geometry::extract_euler_angles(Geometry::assemble_transform(Vec3d::Zero(), rotation) * m_cache.volumes_data[i].get_instance_rotation_matrix()) : - transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation(); - if (rot_axis_max == 2 && transformation_type.joint()) { - // Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis. - double z_diff = rotation_diff_z(new_rotation, m_cache.volumes_data[i].get_instance_rotation()); - volume.set_instance_offset(m_cache.dragging_center + Eigen::AngleAxisd(z_diff, Vec3d::UnitZ()) * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); - } - volume.set_instance_rotation(new_rotation); - object_instance_first[volume.object_idx()] = i; - } - }; - - for (unsigned int i : m_list) + int rot_axis_max = 0; + if (rotation.isApprox(Vec3d::Zero())) { - GLVolume &volume = *(*m_volumes)[i]; - if (is_single_full_instance()) - rotate_instance(volume, i); - else if (is_single_volume() || is_single_modifier()) - { - if (transformation_type.independent()) - volume.set_volume_rotation(volume.get_volume_rotation() + rotation); - else - { - Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); - Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); - volume.set_volume_rotation(new_rotation); - } - } - else + for (unsigned int i : m_list) { + GLVolume &volume = *(*m_volumes)[i]; if (m_mode == Instance) - rotate_instance(volume, i); + { + volume.set_instance_rotation(m_cache.volumes_data[i].get_instance_rotation()); + volume.set_instance_offset(m_cache.volumes_data[i].get_instance_position()); + } else if (m_mode == Volume) { + volume.set_volume_rotation(m_cache.volumes_data[i].get_volume_rotation()); + volume.set_volume_offset(m_cache.volumes_data[i].get_volume_position()); + } + } + } + else + { + //FIXME this does not work for absolute rotations (transformation_type.absolute() is true) + rotation.cwiseAbs().maxCoeff(&rot_axis_max); + + // For generic rotation, we want to rotate the first volume in selection, and then to synchronize the other volumes with it. + std::vector object_instance_first(m_model->objects.size(), -1); + auto rotate_instance = [this, &rotation, &object_instance_first, rot_axis_max, transformation_type](GLVolume &volume, int i) { + int first_volume_idx = object_instance_first[volume.object_idx()]; + if (rot_axis_max != 2 && first_volume_idx != -1) { + // Generic rotation, but no rotation around the Z axis. + // Always do a local rotation (do not consider the selection to be a rigid body). + assert(is_approx(rotation.z(), 0.0)); + const GLVolume &first_volume = *(*m_volumes)[first_volume_idx]; + const Vec3d &rotation = first_volume.get_instance_rotation(); + double z_diff = rotation_diff_z(m_cache.volumes_data[first_volume_idx].get_instance_rotation(), m_cache.volumes_data[i].get_instance_rotation()); + volume.set_instance_rotation(Vec3d(rotation(0), rotation(1), rotation(2) + z_diff)); + } else { // extracts rotations from the composed transformation - Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); - Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); - if (transformation_type.joint()) - { - Vec3d local_pivot = m_cache.volumes_data[i].get_instance_full_matrix().inverse() * m_cache.dragging_center; - Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() - local_pivot); - volume.set_volume_offset(local_pivot + offset); + Vec3d new_rotation = transformation_type.world() ? + Geometry::extract_euler_angles(Geometry::assemble_transform(Vec3d::Zero(), rotation) * m_cache.volumes_data[i].get_instance_rotation_matrix()) : + transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation(); + if (rot_axis_max == 2 && transformation_type.joint()) { + // Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis. + Vec3d offset = Geometry::assemble_transform(Vec3d::Zero(), Vec3d(0.0, 0.0, new_rotation(2) - m_cache.volumes_data[i].get_instance_rotation()(2))) * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); + volume.set_instance_offset(m_cache.dragging_center + offset); + } + volume.set_instance_rotation(new_rotation); + object_instance_first[volume.object_idx()] = i; + } + }; + + for (unsigned int i : m_list) + { + GLVolume &volume = *(*m_volumes)[i]; + if (is_single_full_instance()) + rotate_instance(volume, i); + else if (is_single_volume() || is_single_modifier()) + { + if (transformation_type.independent()) + volume.set_volume_rotation(volume.get_volume_rotation() + rotation); + else + { + Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); + Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); + volume.set_volume_rotation(new_rotation); + } + } + else + { + if (m_mode == Instance) + rotate_instance(volume, i); + else if (m_mode == Volume) + { + // extracts rotations from the composed transformation + Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); + Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); + if (transformation_type.joint()) + { + Vec3d local_pivot = m_cache.volumes_data[i].get_instance_full_matrix().inverse() * m_cache.dragging_center; + Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() - local_pivot); + volume.set_volume_offset(local_pivot + offset); + } + volume.set_volume_rotation(new_rotation); } - volume.set_volume_rotation(new_rotation); } } } From 0a1bff3fc983b20bb4c1d4980933b3fd75760971 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 8 Mar 2019 15:08:55 +0100 Subject: [PATCH 091/236] Fix for pad wall slope. --- src/libslic3r/SLA/SLABasePool.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/SLA/SLABasePool.cpp b/src/libslic3r/SLA/SLABasePool.cpp index 6fd218402..2aabaa590 100644 --- a/src/libslic3r/SLA/SLABasePool.cpp +++ b/src/libslic3r/SLA/SLABasePool.cpp @@ -601,14 +601,16 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out, const double thickness = cfg.min_wall_thickness_mm; const double wingheight = cfg.min_wall_height_mm; const double fullheight = wingheight + thickness; - const double slope = cfg.wall_slope; + const double slope = cfg.wall_slope; const double wingdist = wingheight / std::tan(slope); + const double bottom_offs = (thickness + wingheight) / std::tan(slope); // scaled values const coord_t s_thickness = mm(thickness); const coord_t s_eradius = mm(cfg.edge_radius_mm); const coord_t s_safety_dist = 2*s_eradius + coord_t(0.8*s_thickness); const coord_t s_wingdist = mm(wingdist); + const coord_t s_bottom_offs = mm(bottom_offs); auto& thrcl = cfg.throw_on_cancel; @@ -620,7 +622,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out, // Get rid of any holes in the concave hull output. concaveh.holes.clear(); - // Here lies the trick that does the smooting only with clipper offset + // Here lies the trick that does the smoothing only with clipper offset // calls. The offset is configured to round edges. Inner edges will // be rounded because we offset twice: ones to get the outer (top) plate // and again to get the inner (bottom) plate @@ -628,10 +630,9 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out, outer_base.holes.clear(); offset(outer_base, s_safety_dist + s_wingdist + s_thickness); - ExPolygon bottom_poly = outer_base; bottom_poly.holes.clear(); - if(s_wingdist > 0) offset(bottom_poly, -s_wingdist); + offset(bottom_poly, -s_bottom_offs); // Punching a hole in the top plate for the cavity ExPolygon top_poly; @@ -692,7 +693,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out, // Now that we have the rounded edge connecting the top plate with // the outer side walls, we can generate and merge the sidewall geometry pool.merge(walls(ob.contour, bottom_poly.contour, wh, -fullheight, - wingdist, thrcl)); + bottom_offs, thrcl)); if(wingheight > 0) { // Generate the smoothed edge geometry From 063d812d64c43bc94baaa8751b1f673e2101e7bc Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 8 Mar 2019 15:40:28 +0100 Subject: [PATCH 092/236] Added case of a slicing cancellation --- src/slic3r/GUI/Plater.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 587c3579f..7edc2bae1 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2458,7 +2458,12 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) break; } - if (wxGetApp().get_mode() == comSimple) + if (canceled) { + if (wxGetApp().get_mode() == comSimple) + sidebar->set_btn_label(ActionButtonType::abReslice, "Slice now"); + show_action_buttons(true); + } + else if (wxGetApp().get_mode() == comSimple) show_action_buttons(false); } From 7857206442bfd09fd268d776de0e1918c4103bf4 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 8 Mar 2019 16:06:21 +0100 Subject: [PATCH 093/236] Fixes for cascading logic. --- src/libslic3r/SLA/SLASupportTree.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index eab0ddba7..2516d265e 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -74,7 +74,7 @@ const double SupportConfig::safety_distance_mm = 0.1; const double SupportConfig::max_solo_pillar_height_mm = 15.0; const double SupportConfig::max_dual_pillar_height_mm = 35.0; const double SupportConfig::optimizer_rel_score_diff = 1e-6; -const unsigned SupportConfig::optimizer_max_iterations = 500; +const unsigned SupportConfig::optimizer_max_iterations = 1000; const unsigned SupportConfig::pillar_cascade_neighbors = 2; const unsigned SupportConfig::max_bridges_on_pillar = 3; @@ -1870,17 +1870,16 @@ public: // to connect with. Height exceeding H2 require two neighbors. double H1 = m_cfg.max_solo_pillar_height_mm; double H2 = m_cfg.max_dual_pillar_height_mm; - unsigned neighbors = m_cfg.pillar_cascade_neighbors; double d = m_cfg.max_pillar_link_distance_mm; //A connection between two pillars only counts if the height ratio is // bigger than 20% - double min_height_ratio = 0.5; + double min_height_ratio = 0.2; std::set pairs; m_pillar_index.foreach( - [this, d, &pairs, neighbors, min_height_ratio] + [this, d, &pairs, min_height_ratio] (const SpatElement& el) { Vec3d qp = el.first; @@ -1897,13 +1896,23 @@ public: }); const Pillar& pillar = m_result.pillars()[el.second]; + + unsigned neighbors = m_cfg.pillar_cascade_neighbors; + for(auto& re : qres) { + // connections are enough for one pillar + if(pillar.links >= neighbors) break; + if(re.second == el.second) continue; auto hashval = m_pillar_index.size() * el.second + re.second; if(pairs.find(hashval) != pairs.end()) continue; const Pillar& neighborpillar = m_result.pillars()[re.second]; + + // this neighbor is occupied + if(neighborpillar.links >= neighbors) continue; + if(interconnect(pillar, neighborpillar)) { pairs.insert(hashval); @@ -1916,9 +1925,6 @@ public: m_result.increment_links(neighborpillar); } - - // 3 connections are enough for one pillar - if(pillar.links == neighbors) break; } }); From b382ad1ffbc1bae64734fcc8e9b70befed5c03c2 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 7 Mar 2019 16:36:39 +0100 Subject: [PATCH 094/236] Some improvements --- resources/icons/empty_icon.png | Bin 0 -> 893 bytes src/slic3r/GUI/Field.cpp | 56 +++++++++++++++++++-------------- src/slic3r/GUI/Field.hpp | 5 +++ src/slic3r/GUI/GUI_App.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 1 + src/slic3r/GUI/Tab.hpp | 3 ++ 6 files changed, 43 insertions(+), 24 deletions(-) create mode 100644 resources/icons/empty_icon.png diff --git a/resources/icons/empty_icon.png b/resources/icons/empty_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd8f0afe17e5cc48e754e2b9efe6c061f57ce79 GIT binary patch literal 893 zcmV-@1A_dCP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3sgj>IMmh5vJk9s%1Jo8v$LsW<5H`ykBB&g^!j zRt-uZjXU^C+rFS`JN17 zbVWSjz(YtPo_S>vj6jN1)Uuz(%VKELwy?<0+PyUT5bxRg&@R?vmv<>b%*P>rXmsqP zA9i`B;m;90GQWLj{*e2-c5`;0bKJA5DMP6o&ZHhw*)2FWNO`M~Q4F`DZMzf{#}qFR z>!8_Cu0VwtYEMeksnVpe>x(W7G4Wu?&CD0ewmIZ4d~GOc6`E|o(}OrjT%aZ}^K&e; z^Ol|OB1h&<@MJLbqte*go2)Px5ApwDyNt7~0V>Tk_=-^W^ za+bsm1W1)Tg$Xty8E~9eZuBwQzN~zkakK!0O2$_4wSfRDCB^!&IwZQP`# zrY$#X-b$+%md}+gz4B$3U*)QuyL4>-p1Xzaz4SV0U@46>bmU>fM;UcutxcI}>de!o z&ob+i8l7$XMvXqm{Z5SzwM8s#KYLMw+3XR5)^VbX8HjNr5Vu7D3z`?R=#&yKa*J6k zIHE)u)JPYcPKy`_ra`Qep6p)ae&rT4{VQ(#PvpWv_kWNJ3*902o!bx8dfk5%*?`tA zT$)CiIN0DYyt3EzPx`%{tvs4dl2XEt4N|QJ0`aQX?`hQS6}cV@jyW7d_ecG`#$KDf zguek`1h~~$RE)*|0007FOGiWi|A&vvzW@LL32;bRa{vG?BLDy{BLR4&KXw2B00(qQ zO+^Re0|yWd9@X?=y8r+HA4x<(R0!8&U_b>=7@0U3n0_-d{byuiVr2UI4^18bZ@L8Q Tk26l500000NkvXXu0mjfplzA> literal 0 HcmV?d00001 diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 554350b68..7cc533772 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -2,6 +2,7 @@ #include "GUI_App.hpp" #include "I18N.hpp" #include "Field.hpp" +#include "wxExtensions.hpp" #include "libslic3r/PrintConfig.hpp" @@ -493,13 +494,15 @@ void SpinCtrl::propagate_value() } void Choice::BUILD() { - auto size = wxSize(wxDefaultSize); + wxSize size(15 * wxGetApp().em_unit(), -1); if (m_opt.height >= 0) size.SetHeight(m_opt.height); if (m_opt.width >= 0) size.SetWidth(m_opt.width); wxBitmapComboBox* temp; - if (!m_opt.gui_type.empty() && m_opt.gui_type.compare("select_open") != 0) - temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); + if (!m_opt.gui_type.empty() && m_opt.gui_type.compare("select_open") != 0) { + m_is_editable = true; + temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); + } else temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); @@ -511,14 +514,14 @@ void Choice::BUILD() { else{ for (auto el : m_opt.enum_labels.empty() ? m_opt.enum_values : m_opt.enum_labels) { const wxString& str = _(el);//m_opt_id == "support" ? _(el) : el; - temp->Append(str/*, *m_undo_bitmap*/); + temp->Append(str, create_scaled_bitmap("empty_icon.png")); } set_selection(); } // temp->Bind(wxEVT_TEXT, ([this](wxCommandEvent e) { on_change_field(); }), temp->GetId()); temp->Bind(wxEVT_COMBOBOX, ([this](wxCommandEvent e) { on_change_field(); }), temp->GetId()); - if (temp->GetWindowStyle() != wxCB_READONLY) { + if (m_is_editable) { temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e) { e.Skip(); if (m_opt.type == coStrings) return; @@ -540,6 +543,8 @@ void Choice::BUILD() { void Choice::set_selection() { wxString text_value = wxString(""); + + wxBitmapComboBox* field = dynamic_cast(window); switch (m_opt.type) { case coFloat: case coPercent: { @@ -554,13 +559,13 @@ void Choice::set_selection() } // if (m_opt.type == coPercent) text_value += "%"; idx == m_opt.enum_values.size() ? - dynamic_cast(window)->SetValue(text_value) : - dynamic_cast(window)->SetSelection(idx); + field->SetValue(text_value) : + field->SetSelection(idx); break; } case coEnum:{ int id_value = static_cast*>(m_opt.default_value)->value; //!! - dynamic_cast(window)->SetSelection(id_value); + field->SetSelection(id_value); break; } case coInt:{ @@ -574,8 +579,8 @@ void Choice::set_selection() ++idx; } idx == m_opt.enum_values.size() ? - dynamic_cast(window)->SetValue(text_value) : - dynamic_cast(window)->SetSelection(idx); + field->SetValue(text_value) : + field->SetSelection(idx); break; } case coStrings:{ @@ -589,8 +594,8 @@ void Choice::set_selection() ++idx; } idx == m_opt.enum_values.size() ? - dynamic_cast(window)->SetValue(text_value) : - dynamic_cast(window)->SetSelection(idx); + field->SetValue(text_value) : + field->SetSelection(idx); break; } } @@ -608,9 +613,10 @@ void Choice::set_value(const std::string& value, bool change_event) //! Redunda ++idx; } + wxBitmapComboBox* field = dynamic_cast(window); idx == m_opt.enum_values.size() ? - dynamic_cast(window)->SetValue(value) : - dynamic_cast(window)->SetSelection(idx); + field->SetValue(value) : + field->SetSelection(idx); m_disable_change_event = false; } @@ -619,6 +625,8 @@ void Choice::set_value(const boost::any& value, bool change_event) { m_disable_change_event = !change_event; + wxBitmapComboBox* field = dynamic_cast(window); + switch (m_opt.type) { case coInt: case coFloat: @@ -640,11 +648,11 @@ void Choice::set_value(const boost::any& value, bool change_event) if (idx == m_opt.enum_values.size()) { // For editable Combobox under OSX is needed to set selection to -1 explicitly, // otherwise selection doesn't be changed - dynamic_cast(window)->SetSelection(-1); - dynamic_cast(window)->SetValue(text_value); + field->SetSelection(-1); + field->SetValue(text_value); } else - dynamic_cast(window)->SetSelection(idx); + field->SetSelection(idx); break; } case coEnum: { @@ -674,7 +682,7 @@ void Choice::set_value(const boost::any& value, bool change_event) else val = 0; } - dynamic_cast(window)->SetSelection(val); + field->SetSelection(val); break; } default: @@ -706,8 +714,9 @@ void Choice::set_values(const std::vector& values) boost::any& Choice::get_value() { -// boost::any m_value; - wxString ret_str = static_cast(window)->GetValue(); + wxBitmapComboBox* field = dynamic_cast(window); + + wxString ret_str = field->GetValue(); // options from right panel std::vector right_panel_options{ "support", "scale_unit" }; @@ -717,7 +726,7 @@ boost::any& Choice::get_value() if (m_opt.type == coEnum) { - int ret_enum = static_cast(window)->GetSelection(); + int ret_enum = field->GetSelection(); if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern") { if (!m_opt.enum_values.empty()) { @@ -746,8 +755,9 @@ boost::any& Choice::get_value() m_value = static_cast(ret_enum); } else if (m_opt.gui_type == "f_enum_open") { - const int ret_enum = static_cast(window)->GetSelection(); - if (ret_enum < 0 || m_opt.enum_values.empty() || m_opt.type == coStrings) + const int ret_enum = field->GetSelection(); + if (ret_enum < 0 || m_opt.enum_values.empty() || m_opt.type == coStrings || + ret_str != m_opt.enum_values[ret_enum] && ret_str != m_opt.enum_labels[ret_enum] ) // modifies ret_string! get_value_by_opt_type(ret_str); else diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index 457807afa..128d60d47 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -352,6 +352,11 @@ public: wxWindow* window{ nullptr }; void BUILD() override; + /* Under OSX: wxBitmapComboBox->GetWindowStyle() returns some weard value, + * so let use a flag, which has TRUE value for a control without wxCB_READONLY style + */ + bool m_is_editable { false }; + void set_selection(); void set_value(const std::string& value, bool change_event = false); void set_value(const boost::any& value, bool change_event = false); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7a3d6f13a..b61457226 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -506,7 +506,7 @@ Tab* GUI_App::get_tab(Preset::Type type) { for (Tab* tab: tabs_list) if (tab->type() == type) - return tab; + return tab->complited() ? tab : nullptr; // To avoid actions with no-completed Tab return nullptr; } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 060eb1383..b3580a285 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -257,6 +257,7 @@ void Tab::create_preset_tab() // Initialize the DynamicPrintConfig by default keys/values. build(); rebuild_page_tree(); + m_complited = true; } void Tab::load_initial_data() diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 7ef066963..2f8cec1de 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -204,6 +204,8 @@ protected: void set_type(); int m_em_unit; + // To avoid actions with no-completed Tab + bool m_complited { false }; public: PresetBundle* m_preset_bundle; @@ -226,6 +228,7 @@ public: wxString title() const { return m_title; } std::string name() const { return m_name; } Preset::Type type() const { return m_type; } + bool complited() const { return m_complited; } virtual bool supports_printer_technology(const PrinterTechnology tech) = 0; void create_preset_tab(); From c74fe8acb88e958e1e3418054ccae6b6ded8d9b7 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 8 Mar 2019 17:00:56 +0100 Subject: [PATCH 095/236] Moved the "Delete" button in the 3D Canvas pop up menu from the very top below the add / remove instance, so that it could not be selected by mistake. --- src/slic3r/GUI/Plater.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 112dc8b6e..fa2510394 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2509,15 +2509,20 @@ bool Plater::priv::init_object_menu() bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/) { - wxMenuItem* item_delete = append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), - [this](wxCommandEvent&) { q->remove_selected(); }, "brick_delete.png"); - if (!is_part){ + wxMenuItem* item_delete = nullptr; + if (is_part) { + item_delete = append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), + [this](wxCommandEvent&) { q->remove_selected(); }, "brick_delete.png"); + } else { wxMenuItem* item_increase = append_menu_item(menu, wxID_ANY, _(L("Increase copies")) + "\t+", _(L("Place one more copy of the selected object")), [this](wxCommandEvent&) { q->increase_instances(); }, "add.png"); wxMenuItem* item_decrease = append_menu_item(menu, wxID_ANY, _(L("Decrease copies")) + "\t-", _(L("Remove one copy of the selected object")), [this](wxCommandEvent&) { q->decrease_instances(); }, "delete.png"); wxMenuItem* item_set_number_of_copies = append_menu_item(menu, wxID_ANY, _(L("Set number of copies")) + dots, _(L("Change the number of copies of the selected object")), [this](wxCommandEvent&) { q->set_number_of_copies(); }, "textfield.png"); + // Delete menu was moved to be after +/- instace to make it more difficult to be selected by mistake. + item_delete = append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), + [this](wxCommandEvent&) { q->remove_selected(); }, "brick_delete.png"); menu->AppendSeparator(); wxMenuItem* item_instance_to_object = sidebar->obj_list()->append_menu_item_instance_to_object(menu); @@ -2554,7 +2559,7 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ wxMenuItem* item_mirror = append_submenu(menu, mirror_menu, wxID_ANY, _(L("Mirror")), _(L("Mirror the selected object"))); - // ui updates needs to be binded to the parent panel + // ui updates needs to be bound to the parent panel if (q != nullptr) { q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_mirror()); }, item_mirror->GetId()); From e4dca04a4b3c8c1d4cfed21f82e245ecc0ec1922 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 8 Mar 2019 20:34:22 +0100 Subject: [PATCH 096/236] Added wxBusyCursor on AABB tree calculation for SLA gizmo --- src/slic3r/GUI/GLGizmo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 22023825f..5627c77f4 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -1932,6 +1932,7 @@ bool GLGizmoSlaSupports::is_mesh_update_necessary() const void GLGizmoSlaSupports::update_mesh() { + wxBusyCursor wait; Eigen::MatrixXf& V = m_V; Eigen::MatrixXi& F = m_F; // Composite mesh of all instances in the world coordinate system. From 40abbc7184e802a94be327960153a183942d0043 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 11 Mar 2019 10:23:59 +0100 Subject: [PATCH 097/236] Fixed an updating of the button's show during SLA slicing --- src/slic3r/GUI/Plater.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7edc2bae1..636b916ba 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2157,7 +2157,11 @@ unsigned int Plater::priv::update_background_process(bool force_validation) if (background_process.finished()) show_action_buttons(false); - else if (!background_process.empty()) + else if (!background_process.empty() && + !background_process.running()) /* Do not update buttons if background process is running + * This condition is important for SLA mode especially, + * when this function is called several times during calculations + * */ show_action_buttons(true); } From 6811c68f60979b0e07ecb469da613ade88963141 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 11 Mar 2019 11:03:13 +0100 Subject: [PATCH 098/236] Fixed crashes if OnIdle handler was called before Plater was initialized. --- src/slic3r/GUI/GUI_App.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7a3d6f13a..194399316 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -161,12 +161,15 @@ bool GUI_App::OnInit() Bind(wxEVT_IDLE, [this](wxIdleEvent& event) { + if (! plater_) + return; + if (app_config->dirty() && app_config->get("autosave") == "1") app_config->save(); // ! Temporary workaround for the correct behavior of the Scrolled sidebar panel // Do this "manipulations" only once ( after (re)create of the application ) - if (plater_ && sidebar().obj_list()->GetMinHeight() > 15 * wxGetApp().em_unit()) + if (sidebar().obj_list()->GetMinHeight() > 15 * wxGetApp().em_unit()) { wxWindowUpdateLocker noUpdates_sidebar(&sidebar()); sidebar().obj_list()->SetMinSize(wxSize(-1, 15 * wxGetApp().em_unit())); @@ -175,8 +178,7 @@ bool GUI_App::OnInit() update_mode(); // update view mode after fix of the object_list size } - if (this->plater() != nullptr) - this->obj_manipul()->update_if_dirty(); + this->obj_manipul()->update_if_dirty(); // Preset updating & Configwizard are done after the above initializations, // and after MainFrame is created & shown. From c77d15c98bf45db05d9dee84ed210a5694fb0f9e Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 11 Mar 2019 12:58:46 +0100 Subject: [PATCH 099/236] Fixed OnWhile() function for the PrusaDoubleSlider (#1913) Current behavior: Move selected thumb only. If no one thumb is selected, set selection to the thumb nearest to the current mouse position --- src/slic3r/GUI/wxExtensions.cpp | 35 ++++++++++++++------------------- src/slic3r/GUI/wxExtensions.hpp | 2 +- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index e83101d22..dee18ad43 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -1958,21 +1958,8 @@ int PrusaDoubleSlider::get_value_from_position(const wxCoord x, const wxCoord y) return int(m_min_value + double(height - SLIDER_MARGIN - y) / step + 0.5); } -void PrusaDoubleSlider::detect_selected_slider(const wxPoint& pt, const bool is_mouse_wheel /*= false*/) +void PrusaDoubleSlider::detect_selected_slider(const wxPoint& pt) { - if (is_mouse_wheel) - { - if (is_horizontal()) { - m_selection = pt.x <= m_rect_lower_thumb.GetRight() ? ssLower : - pt.x >= m_rect_higher_thumb.GetLeft() ? ssHigher : ssUndef; - } - else { - m_selection = pt.y >= m_rect_lower_thumb.GetTop() ? ssLower : - pt.y <= m_rect_higher_thumb.GetBottom() ? ssHigher : ssUndef; - } - return; - } - m_selection = is_point_in_rect(pt, m_rect_lower_thumb) ? ssLower : is_point_in_rect(pt, m_rect_higher_thumb) ? ssHigher : ssUndef; } @@ -2192,12 +2179,20 @@ void PrusaDoubleSlider::action_tick(const TicksAction action) void PrusaDoubleSlider::OnWheel(wxMouseEvent& event) { - wxClientDC dc(this); - wxPoint pos = event.GetLogicalPosition(dc); - detect_selected_slider(pos, true); - - if (m_selection == ssUndef) - return; + // Set nearest to the mouse thumb as a selected, if there is not selected thumb + if (m_selection == ssUndef) + { + const wxPoint& pt = event.GetLogicalPosition(wxClientDC(this)); + + if (is_horizontal()) + m_selection = abs(pt.x - m_rect_lower_thumb.GetRight()) <= + abs(pt.x - m_rect_higher_thumb.GetLeft()) ? + ssLower : ssHigher; + else + m_selection = abs(pt.y - m_rect_lower_thumb.GetTop()) <= + abs(pt.y - m_rect_higher_thumb.GetBottom()) ? + ssLower : ssHigher; + } move_current_thumb(event.GetWheelRotation() > 0); } diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index e0bd5d091..a15bee256 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -771,7 +771,7 @@ protected: void draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const; void update_thumb_rect(const wxCoord& begin_x, const wxCoord& begin_y, const SelectedSlider& selection); - void detect_selected_slider(const wxPoint& pt, const bool is_mouse_wheel = false); + void detect_selected_slider(const wxPoint& pt); void correct_lower_value(); void correct_higher_value(); void move_current_thumb(const bool condition); From 140c717c044b3809a55b6fd6723d6e372f680ac1 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 11 Mar 2019 14:55:28 +0100 Subject: [PATCH 100/236] Enable imgui support point size. Fine tuning of support params. --- src/libslic3r/PrintConfig.cpp | 38 +++++++++++++++++++++++++--- src/libslic3r/SLA/SLASupportTree.cpp | 31 +++++++++++++++-------- src/slic3r/GUI/GLGizmo.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 3 ++- 4 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d6e66cd67..ea2657bde 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2450,6 +2450,7 @@ void PrintConfigDef::init_sla_params() def->enum_values.push_back("portrait"); def->enum_labels.push_back(L("Landscape")); def->enum_labels.push_back(L("Portrait")); + def->mode = comExpert; def->default_value = new ConfigOptionEnum(sladoPortrait); def = this->add("fast_tilt_time", coFloat); @@ -2563,6 +2564,7 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("Generate supports for the models"); def->cli = ""; + def->mode = comSimple; def->default_value = new ConfigOptionBool(true); def = this->add("support_head_front_diameter", coFloat); @@ -2580,6 +2582,7 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("How much the pinhead has to penetrate the model surface"); def->sidetext = L("mm"); def->cli = ""; + def->mode = comAdvanced; def->min = 0; def->default_value = new ConfigOptionFloat(0.2); @@ -2590,6 +2593,8 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->max = 20; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(1.0); def = this->add("support_pillar_diameter", coFloat); @@ -2599,6 +2604,8 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->max = 15; + def->mode = comSimple; def->default_value = new ConfigOptionFloat(1.0); def = this->add("support_pillar_connection_mode", coEnum); @@ -2615,6 +2622,7 @@ void PrintConfigDef::init_sla_params() def->enum_labels.push_back(L("Zig-Zag")); def->enum_labels.push_back(L("Cross")); def->enum_labels.push_back(L("Dynamic")); + def->mode = comAdvanced; def->default_value = new ConfigOptionEnum(slapcmDynamic); def = this->add("support_buildplate_only", coBool); @@ -2634,6 +2642,7 @@ void PrintConfigDef::init_sla_params() def->cli = ""; def->min = 0; def->max = 1; + def->mode = comExpert; def->default_value = new ConfigOptionFloat(0.0); def = this->add("support_base_diameter", coFloat); @@ -2643,6 +2652,8 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->max = 30; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(4.0); def = this->add("support_base_height", coFloat); @@ -2652,6 +2663,7 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(1.0); def = this->add("support_critical_angle", coFloat); @@ -2661,6 +2673,8 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("°"); def->cli = ""; def->min = 0; + def->max = 90; + def->mode = comSimple; def->default_value = new ConfigOptionFloat(45); def = this->add("support_max_bridge_length", coFloat); @@ -2670,15 +2684,18 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->mode = comSimple; def->default_value = new ConfigOptionFloat(15.0); def = this->add("support_max_pillar_link_distance", coFloat); def->label = L("Max pillar linking distance"); def->category = L("Supports"); - def->tooltip = L("The max distance of two pillars to get linked with each other."); + def->tooltip = L("The max distance of two pillars to get linked with each other." + " A zero value will prohibit pillar cascading."); def->sidetext = L("mm"); def->cli = ""; def->min = 0; // 0 means no linking + def->mode = comSimple; def->default_value = new ConfigOptionFloat(10.0); def = this->add("support_object_elevation", coFloat); @@ -2688,6 +2705,8 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->max = 150; // This is the max height of print on SL1 + def->mode = comSimple; def->default_value = new ConfigOptionFloat(5.0); def = this->add("support_points_density_relative", coInt); @@ -2713,35 +2732,46 @@ void PrintConfigDef::init_sla_params() def->category = L("Pad"); def->tooltip = L("Add a pad underneath the supported model"); def->cli = ""; + def->mode = comSimple; def->default_value = new ConfigOptionBool(true); def = this->add("pad_wall_thickness", coFloat); def->label = L("Pad wall thickness"); def->category = L("Pad"); -// def->tooltip = L(""); + def->tooltip = L("The thickness of the pad and its optional cavity walls."); def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->max = 30; + def->mode = comSimple; def->default_value = new ConfigOptionFloat(2.0); def = this->add("pad_wall_height", coFloat); def->label = L("Pad wall height"); + def->tooltip = L("Defines the cavity depth. Set to zero to disable the cavity."); def->category = L("Pad"); // def->tooltip = L(""); def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->max = 30; + def->mode = comSimple; def->default_value = new ConfigOptionFloat(5.0); def = this->add("pad_max_merge_distance", coFloat); def->label = L("Max merge distance"); def->category = L("Pad"); -// def->tooltip = L(""); + def->tooltip = L("Some objects can get along with a few smaller pads " + "instead of a single big one. This parameter defines " + "how far the center of two smaller pads should be. If they" + "are closer, they will get merged into one pad."); def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->mode = comExpert; def->default_value = new ConfigOptionFloat(50.0); + // This is disabled on the UI. I hope it will never be enabled. def = this->add("pad_edge_radius", coFloat); def->label = L("Pad edge radius"); def->category = L("Pad"); @@ -2749,6 +2779,7 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(1.0); def = this->add("pad_wall_slope", coFloat); @@ -2760,6 +2791,7 @@ void PrintConfigDef::init_sla_params() def->cli = ""; def->min = 45; def->max = 90; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(45.0); } diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 2516d265e..4dc82fcb5 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -69,7 +69,7 @@ namespace sla { const double SupportConfig::normal_cutoff_angle = 150.0 * M_PI / 180.0; // The shortest distance of any support structure from the model surface -const double SupportConfig::safety_distance_mm = 0.1; +const double SupportConfig::safety_distance_mm = 0.5; const double SupportConfig::max_solo_pillar_height_mm = 15.0; const double SupportConfig::max_dual_pillar_height_mm = 35.0; @@ -438,8 +438,9 @@ struct Pillar { inline const Vec3d& endpoint() const { return endpt; } - Pillar& add_base(double height = 3, double radius = 2) { - if(height <= 0) return *this; + Pillar& add_base(double baseheight = 3, double radius = 2) { + if(baseheight <= 0) return *this; + if(baseheight > height) baseheight = height; assert(steps >= 0); auto last = int(steps - 1); @@ -447,7 +448,7 @@ struct Pillar { if(radius < r ) radius = r; double a = 2*PI/steps; - double z = endpt(Z) + height; + double z = endpt(Z) + baseheight; for(size_t i = 0; i < steps; ++i) { double phi = i*a; @@ -460,10 +461,10 @@ struct Pillar { double phi = i*a; double x = endpt(X) + radius*std::cos(phi); double y = endpt(Y) + radius*std::sin(phi); - base.points.emplace_back(x, y, z - height); + base.points.emplace_back(x, y, z - baseheight); } - auto ep = endpt; ep(Z) += height; + auto ep = endpt; ep(Z) += baseheight; base.points.emplace_back(endpt); base.points.emplace_back(ep); @@ -1004,9 +1005,12 @@ class SLASupportTree::Algorithm { // Together they define the plane where we have to iterate with the // given angles in the 'phis' vector +// std::cout << "Head check begin: " << std::endl; + tbb::parallel_for(size_t(0), phis.size(), [&phis, &hits, &m, sd, r_pin, r_back, s, a, b, c] (size_t i) +// for(size_t i = 0; i < phis.size(); ++i) { double& phi = phis[i]; double sinphi = std::sin(phi); @@ -1037,7 +1041,10 @@ class SLASupportTree::Algorithm { auto q = m.query_ray_hit(ps + sd*n, n); if(q.is_inside()) { // the hit is inside the model - if(q.distance() > 2*r_pin) { + if(q.distance() > r_pin + sd) { + +// std::cout << "Fatal inside hit. Phi: " << phi << " distance: " << q.distance() << std::endl; + // If we are inside the model and the hit distance is bigger // than our pin circle diameter, it probably indicates that // the support point was already inside the model, or there @@ -1048,17 +1055,21 @@ class SLASupportTree::Algorithm { hits[i] = HitResult(0.0); } else { +// std::cout << "Recoverable inside hit. Phi: " << phi << " distance: " << q.distance() << " re-cast dist: " ; // re-cast the ray from the outside of the object. // The starting point has an offset of 2*safety_distance // because the original ray has also had an offset auto q2 = m.query_ray_hit(ps + (q.distance() + 2*sd)*n, n); hits[i] = q2; +// std::cout << q2.distance() << std::endl; } } else hits[i] = q; }); auto mit = std::min_element(hits.begin(), hits.end()); +// std::cout << "Head check end. Result: " << mit->distance() << std::endl; + return *mit; } @@ -1128,7 +1139,7 @@ class SLASupportTree::Algorithm { auto hr = m.query_ray_hit(p + sd*dir, dir); if(ins_check && hr.is_inside()) { - if(hr.distance() > 2*r) hits[i] = HitResult(0.0); + if(hr.distance() > r + sd) hits[i] = HitResult(0.0); else { // re-cast the ray from the outside of the object auto hr2 = @@ -1457,7 +1468,7 @@ public: m_cfg.head_back_radius_mm, w); - if(t <= w) { + if(t <= w || (hp(Z) + nn(Z) * w) < m_result.ground_level) { // Let's try to optimize this angle, there might be a // viable normal that doesn't collide with the model @@ -1499,7 +1510,7 @@ public: // save the verified and corrected normal m_support_nmls.row(fidx) = nn; - if(t > w) { + if(t > w && (hp(Z) + nn(Z) * w) > m_result.ground_level) { // mark the point for needing a head. m_iheads.emplace_back(fidx); } else if( polar >= 3*PI/4 ) { diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 22023825f..0efba4b46 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -2296,7 +2296,7 @@ RENDER_AGAIN: bool old_combo_state = m_combo_box_open; // The combo is commented out for now, until the feature is supported by backend. - // m_combo_box_open = m_imgui->combo(_(L("Head diameter")), options_str, selection); + m_combo_box_open = m_imgui->combo(_(L("Head diameter")), options_str, selection); force_refresh |= (old_combo_state != m_combo_box_open); // float current_number = atof(str); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index a7b1af75d..779f0ca6f 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3269,7 +3269,8 @@ void TabSLAPrint::build() optgroup->append_single_option_line("support_pillar_diameter"); optgroup->append_single_option_line("support_pillar_connection_mode"); optgroup->append_single_option_line("support_buildplate_only"); - optgroup->append_single_option_line("support_pillar_widening_factor"); + // TODO: This parameter is not used at the moment. + // optgroup->append_single_option_line("support_pillar_widening_factor"); optgroup->append_single_option_line("support_base_diameter"); optgroup->append_single_option_line("support_base_height"); optgroup->append_single_option_line("support_object_elevation"); From cbe96906ebdc94a6072d775a2d159a908355abb7 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 11 Mar 2019 11:13:37 +0100 Subject: [PATCH 101/236] SLA support points are correctly appointed as user-modified SLA gizmo point cache is reloaded when appropriate --- src/libslic3r/Format/3mf.cpp | 4 +++- src/libslic3r/Format/AMF.cpp | 1 + src/slic3r/GUI/GLGizmo.cpp | 42 ++++++++++++++++++------------------ 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index d2b9b08f3..5a16a6e8f 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -587,8 +587,10 @@ namespace Slic3r { object.second->layer_height_profile = obj_layer_heights_profile->second; IdToSlaSupportPointsMap::iterator obj_sla_support_points = m_sla_support_points.find(object.first); - if (obj_sla_support_points != m_sla_support_points.end() && !obj_sla_support_points->second.empty()) + if (obj_sla_support_points != m_sla_support_points.end() && !obj_sla_support_points->second.empty()) { object.second->sla_support_points = obj_sla_support_points->second; + object.second->sla_points_status = sla::PointsStatus::UserModified; + } IdToMetadataMap::iterator obj_metadata = m_objects_metadata.find(object.first); if (obj_metadata != m_objects_metadata.end()) diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 35c90a00c..f5219263d 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -600,6 +600,7 @@ void AMFParserContext::endElement(const char * /* name */) break; p = end + 1; } + m_object->sla_points_status = sla::PointsStatus::UserModified; } else if (m_path.size() == 5 && m_path[3] == NODE_TYPE_VOLUME && m_volume) { if (strcmp(opt_key, "modifier") == 0) { diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 5627c77f4..918411209 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -1773,8 +1773,10 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const G if (model_object && selection.is_from_single_instance()) { - if (is_mesh_update_necessary()) + if (is_mesh_update_necessary()) { update_mesh(); + editing_mode_reload_cache(); + } if (m_model_object != m_old_model_object) m_editing_mode = false; @@ -1953,9 +1955,6 @@ void GLGizmoSlaSupports::update_mesh() m_AABB = igl::AABB(); m_AABB.init(m_V, m_F); - - // we'll now reload support points (selection might have changed): - editing_mode_reload_cache(); } Vec3f GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) @@ -2441,32 +2440,33 @@ std::string GLGizmoSlaSupports::on_get_name() const void GLGizmoSlaSupports::on_set_state() { - if (m_state == On) { + if (m_state == On && m_old_state != On) { // the gizmo was just turned on if (is_mesh_update_necessary()) update_mesh(); + // we'll now reload support points: + if (m_model_object) + editing_mode_reload_cache(); + m_parent.toggle_model_objects_visibility(false); if (m_model_object) m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); } - if (m_state == Off) { - if (m_old_state != Off) { // the gizmo was just turned Off - - if (m_model_object) { - if (m_unsaved_changes) { - wxMessageDialog dlg(GUI::wxGetApp().plater(), _(L("Do you want to save your manually edited support points ?\n")), - _(L("Save changes?")), wxICON_QUESTION | wxYES | wxNO); - if (dlg.ShowModal() == wxID_YES) - editing_mode_apply_changes(); - else - editing_mode_discard_changes(); - } + if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off + if (m_model_object) { + if (m_unsaved_changes) { + wxMessageDialog dlg(GUI::wxGetApp().plater(), _(L("Do you want to save your manually edited support points ?\n")), + _(L("Save changes?")), wxICON_QUESTION | wxYES | wxNO); + if (dlg.ShowModal() == wxID_YES) + editing_mode_apply_changes(); + else + editing_mode_discard_changes(); } - - m_parent.toggle_model_objects_visibility(true); - m_editing_mode = false; // so it is not active next time the gizmo opens - m_editing_mode_cache.clear(); } + + m_parent.toggle_model_objects_visibility(true); + m_editing_mode = false; // so it is not active next time the gizmo opens + m_editing_mode_cache.clear(); } m_old_state = m_state; } From a25853982c576f522a77a1c2f92b2d92d9ed18df Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 11 Mar 2019 16:00:13 +0100 Subject: [PATCH 102/236] Added "Supports" on Sidebar for SLA mode + Checked scheduling process calling after change Support/Pad parameters from the Sidebar --- src/slic3r/GUI/Plater.cpp | 69 ++++++++++++++++++++++++++------------- src/slic3r/GUI/Tab.cpp | 20 +++++++----- 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index fa2510394..808ad81c8 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -365,20 +365,20 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : Line line = Line { "", "" }; - ConfigOptionDef def; - def.label = L("Supports"); - def.type = coStrings; - def.gui_type = "select_open"; - def.tooltip = L("Select what kind of support do you need"); - def.enum_labels.push_back(L("None")); - def.enum_labels.push_back(L("Support on build plate only")); - def.enum_labels.push_back(L("Everywhere")); - const std::string selection = !config->opt_bool("support_material") ? - "None" : config->opt_bool("support_material_buildplate_only") ? - "Support on build plate only" : - "Everywhere"; - def.default_value = new ConfigOptionStrings{ selection }; - Option option = Option(def, "support"); + ConfigOptionDef support_def; + support_def.label = L("Supports"); + support_def.type = coStrings; + support_def.gui_type = "select_open"; + support_def.tooltip = L("Select what kind of support do you need"); + support_def.enum_labels.push_back(L("None")); + support_def.enum_labels.push_back(L("Support on build plate only")); + support_def.enum_labels.push_back(L("Everywhere")); + std::string selection = !config->opt_bool("support_material") ? + "None" : config->opt_bool("support_material_buildplate_only") ? + "Support on build plate only" : + "Everywhere"; + support_def.default_value = new ConfigOptionStrings{ selection }; + Option option = Option(support_def, "support"); option.opt.full_width = true; line.append_option(option); m_og->append_line(line); @@ -393,6 +393,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : line.append_option(option); m_brim_width = config->opt_float("brim_width"); + ConfigOptionDef def; def.label = L("Brim"); def.type = coBool; def.tooltip = L("This flag enables the brim that will be printed around each object on the first layer."); @@ -428,6 +429,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : m_og->append_line(line); + // Frequently changed parameters for SLA_technology m_og_sla = std::make_shared(parent, ""); DynamicPrintConfig* config_sla = &wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; @@ -438,20 +440,43 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : Tab* tab = wxGetApp().get_tab(Preset::TYPE_SLA_PRINT); if (!tab) return; - tab->set_value(opt_key, value); + if (opt_key == "pad_enable") { + tab->set_value(opt_key, value); + tab->update(); + } + else //(opt_key == "support") + { + DynamicPrintConfig new_conf = *config_sla; + const wxString& selection = boost::any_cast(value); + + const bool supports_enable = selection == _("None") ? false : true; + new_conf.set_key_value("supports_enable", new ConfigOptionBool(supports_enable)); + + if (selection == _("Everywhere")) + new_conf.set_key_value("support_buildplate_only", new ConfigOptionBool(false)); + else if (selection == _("Support on build plate only")) + new_conf.set_key_value("support_buildplate_only", new ConfigOptionBool(true)); + + tab->load_config(new_conf); + } - DynamicPrintConfig new_conf = *config_sla; - new_conf.set_key_value(opt_key, new ConfigOptionBool(boost::any_cast(value))); - tab->load_config(new_conf); tab->update_dirty(); - }; - + }; line = Line{ "", "" }; - option = m_og_sla->get_option("supports_enable"); - option.opt.sidetext = " "; + selection = !config_sla->opt_bool("supports_enable") ? + "None" : config_sla->opt_bool("support_buildplate_only") ? + "Support on build plate only" : + "Everywhere"; + support_def.default_value = new ConfigOptionStrings{ selection }; + option = Option(support_def, "support"); + option.opt.full_width = true; line.append_option(option); + m_og_sla->append_line(line); + + + line = Line{ "", "" }; option = m_og_sla->get_option("pad_enable"); option.opt.sidetext = " "; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 060eb1383..0d53c3fd9 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -751,21 +751,25 @@ void Tab::load_key_value(const std::string& opt_key, const boost::any& value, bo void Tab::on_value_change(const std::string& opt_key, const boost::any& value) { - ConfigOptionsGroup* og_freq_chng_params = wxGetApp().sidebar().og_freq_chng_params(supports_printer_technology(ptFFF)); - if (opt_key == "fill_density" || opt_key == "supports_enable" || opt_key == "pad_enable") + const bool is_fff = supports_printer_technology(ptFFF); + ConfigOptionsGroup* og_freq_chng_params = wxGetApp().sidebar().og_freq_chng_params(is_fff); + if (opt_key == "fill_density" || opt_key == "pad_enable") { boost::any val = og_freq_chng_params->get_config_value(*m_config, opt_key); og_freq_chng_params->set_value(opt_key, val); } - if (opt_key == "support_material" || opt_key == "support_material_buildplate_only") + + if ( is_fff && (opt_key == "support_material" || opt_key == "support_material_buildplate_only") || + !is_fff && (opt_key == "supports_enable" || opt_key == "support_buildplate_only")) { - wxString new_selection = !m_config->opt_bool("support_material") ? - _("None") : - m_config->opt_bool("support_material_buildplate_only") ? - _("Support on build plate only") : - _("Everywhere"); + const std::string support = is_fff ? "support_material" : "supports_enable"; + const std::string buildplate_only = is_fff ? "support_material_buildplate_only" : "support_buildplate_only"; + wxString new_selection = !m_config->opt_bool(support) ? _("None") : + m_config->opt_bool(buildplate_only) ? _("Support on build plate only") : + _("Everywhere"); og_freq_chng_params->set_value("support", new_selection); } + if (opt_key == "brim_width") { bool val = m_config->opt_float("brim_width") > 0.0 ? true : false; From 2da3f22fbc53de996dec06a2935956c69a8131d5 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 11 Mar 2019 16:27:54 +0100 Subject: [PATCH 103/236] Some constraints applied to support parameters. --- src/libslic3r/PrintConfig.cpp | 9 +++++---- src/slic3r/GUI/Tab.cpp | 36 ++++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index ea2657bde..b54a7a1fd 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2574,6 +2574,7 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0.4); def = this->add("support_head_penetration", coFloat); @@ -2674,7 +2675,7 @@ void PrintConfigDef::init_sla_params() def->cli = ""; def->min = 0; def->max = 90; - def->mode = comSimple; + def->mode = comExpert; def->default_value = new ConfigOptionFloat(45); def = this->add("support_max_bridge_length", coFloat); @@ -2684,7 +2685,7 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; - def->mode = comSimple; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(15.0); def = this->add("support_max_pillar_link_distance", coFloat); @@ -2695,7 +2696,7 @@ void PrintConfigDef::init_sla_params() def->sidetext = L("mm"); def->cli = ""; def->min = 0; // 0 means no linking - def->mode = comSimple; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(10.0); def = this->add("support_object_elevation", coFloat); @@ -2706,7 +2707,7 @@ void PrintConfigDef::init_sla_params() def->cli = ""; def->min = 0; def->max = 150; // This is the max height of print on SL1 - def->mode = comSimple; + def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(5.0); def = this->add("support_points_density_relative", coInt); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 779f0ca6f..aa7b7ded4 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3337,11 +3337,37 @@ void TabSLAPrint::update() return; // #ys_FIXME // #ys_FIXME -// m_update_cnt++; -// ! something to update -// m_update_cnt--; -// -// if (m_update_cnt == 0) + m_update_cnt++; + + double head_penetration = m_config->opt_float("support_head_penetration"); + double head_width = m_config->opt_float("support_head_width"); + if(head_penetration > head_width) { + wxString msg_text = _(L("Head penetration should not be greater than the head width.")); + auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Invalid Head penetration")), wxICON_WARNING | wxOK); + DynamicPrintConfig new_conf = *m_config; + if (dialog->ShowModal() == wxID_OK) { + new_conf.set_key_value("support_head_penetration", new ConfigOptionFloat(head_width)); + } + + load_config(new_conf); + } + + double pinhead_d = m_config->opt_float("support_head_front_diameter"); + double pillar_d = m_config->opt_float("support_pillar_diameter"); + if(pinhead_d > pillar_d) { + wxString msg_text = _(L("Pinhead diameter should be smaller than the pillar diameter.")); + auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Invalid pinhead diameter")), wxICON_WARNING | wxOK); + DynamicPrintConfig new_conf = *m_config; + if (dialog->ShowModal() == wxID_OK) { + new_conf.set_key_value("support_head_front_diameter", new ConfigOptionFloat(pillar_d / 2.0)); + } + + load_config(new_conf); + } + + m_update_cnt--; + + if (m_update_cnt == 0) wxGetApp().mainframe->on_config_changed(m_config); } From c4829338453691371fc089d0aaf2cb9271417415 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 11 Mar 2019 17:18:38 +0100 Subject: [PATCH 104/236] Fixed a regression issue in the triangle mesh slicing code, where a broken contour was not glued together using the closest neighbors. --- src/admesh/connect.cpp | 4 ++-- src/libslic3r/Point.hpp | 2 +- src/libslic3r/SupportMaterial.cpp | 2 +- src/libslic3r/TriangleMesh.cpp | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/admesh/connect.cpp b/src/admesh/connect.cpp index 166eec330..5fc992b63 100644 --- a/src/admesh/connect.cpp +++ b/src/admesh/connect.cpp @@ -293,8 +293,8 @@ static int stl_load_edge_nearby(stl_file *stl, stl_hash_edge *edge, stl_vertex * { // Index of a grid cell spaced by tolerance. typedef Eigen::Matrix Vec3i; - Vec3i vertex1 = (*a / tolerance).cast(); - Vec3i vertex2 = (*b / tolerance).cast(); + Vec3i vertex1 = ((*a - stl->stats.min) / tolerance).cast(); + Vec3i vertex2 = ((*b - stl->stats.min) / tolerance).cast(); static_assert(sizeof(Vec3i) == 12, "size of Vec3i incorrect"); if (vertex1 == vertex2) diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index a03e6f436..6b35600cb 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -224,7 +224,7 @@ public: const ValueType &value = it->second; const Vec2crd *pt2 = m_point_accessor(value); if (pt2 != nullptr) { - const double d2 = (pt - *pt2).squaredNorm(); + const double d2 = (pt - *pt2).cast().squaredNorm(); if (d2 < dist_min) { dist_min = d2; value_min = &value; diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 8cdc0ebfd..c1847fcd8 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -2850,7 +2850,7 @@ void modulate_extrusion_by_overlapping_layers( if (end_and_dist2.first == nullptr) { // New fragment connecting to pt_current was not found. // Verify that the last point found is close to the original end point of the unfragmented path. - //const double d2 = (pt_end - pt_current).squaredNorm(); + //const double d2 = (pt_end - pt_current).cast.squaredNorm(); //assert(d2 < coordf_t(search_radius * search_radius)); // End of the path. break; diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index f75bd7fa9..855fe7644 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -620,8 +620,9 @@ void TriangleMesh::require_shared_vertices() for (int nbr_idx = 0; nbr_idx < 3; ++nbr_idx) { int nbr_face = this->stl.neighbors_start[facet_idx].neighbor[nbr_idx]; if (nbr_face != -1) { - assert(stl.v_indices[nbr_face].vertex[(nbr.which_vertex_not[nbr_idx] + 1) % 3] == vertices[(nbr_idx + 1) % 3]); - assert(stl.v_indices[nbr_face].vertex[(nbr.which_vertex_not[nbr_idx] + 2) % 3] == vertices[nbr_idx]); + assert( + (stl.v_indices[nbr_face].vertex[(nbr.which_vertex_not[nbr_idx] + 1) % 3] == vertices[(nbr_idx + 1) % 3] && stl.v_indices[nbr_face].vertex[(nbr.which_vertex_not[nbr_idx] + 2) % 3] == vertices[nbr_idx]) || + (stl.v_indices[nbr_face].vertex[(nbr.which_vertex_not[nbr_idx] + 2) % 3] == vertices[(nbr_idx + 1) % 3] && stl.v_indices[nbr_face].vertex[(nbr.which_vertex_not[nbr_idx] + 1) % 3] == vertices[nbr_idx])); } } } From 8b23740d3052dfdfc107b630ec220bd5573034ae Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 11 Mar 2019 18:17:26 +0100 Subject: [PATCH 105/236] Fixing issue with cascading pair has function. --- src/libslic3r/SLA/SLASupportTree.cpp | 42 ++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 4dc82fcb5..cbd27eb7c 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1884,14 +1884,13 @@ public: double d = m_cfg.max_pillar_link_distance_mm; //A connection between two pillars only counts if the height ratio is - // bigger than 20% - double min_height_ratio = 0.2; + // bigger than 50% + double min_height_ratio = 0.5; std::set pairs; - m_pillar_index.foreach( - [this, d, &pairs, min_height_ratio] - (const SpatElement& el) + auto cascadefn = + [this, d, &pairs, min_height_ratio, H1] (const SpatElement& el) { Vec3d qp = el.first; @@ -1916,7 +1915,12 @@ public: if(re.second == el.second) continue; - auto hashval = m_pillar_index.size() * el.second + re.second; + auto a = el.second, b = re.second; + + // I hope that the area of a square is never equal to its + // circumference + auto hashval = 2 * (a + b) + a * b; + if(pairs.find(hashval) != pairs.end()) continue; const Pillar& neighborpillar = m_result.pillars()[re.second]; @@ -1929,15 +1933,19 @@ public: // If the interconnection length between the two pillars is // less than 20% of the longer pillar's height, don't count - if(neighborpillar.height / pillar.height > min_height_ratio) + if(pillar.height < H1 || + neighborpillar.height / pillar.height > min_height_ratio) m_result.increment_links(pillar); - if(pillar.height / neighborpillar.height > min_height_ratio) + if(neighborpillar.height < H1 || + pillar.height / neighborpillar.height > min_height_ratio) m_result.increment_links(neighborpillar); } } - }); + }; + + m_pillar_index.foreach(cascadefn); size_t pillarcount = m_result.pillars().size(); @@ -1992,6 +2000,8 @@ public: if(interconnect(pillar, p)) { Pillar& pp = m_result.add_pillar(p); + m_pillar_index.insert(pp.endpoint(), unsigned(pp.id)); + m_result.add_junction(s, pillar.r); double t = bridge_mesh_intersect(pillarsp, dirv(pillarsp, s), @@ -2003,15 +2013,23 @@ public: m_result.add_junction(pillar.endpoint(), pillar.r); newpills.emplace_back(pp.id); + m_result.increment_links(pillar); } } - if(!newpills.empty()) + if(!newpills.empty()) { for(auto it = newpills.begin(), nx = std::next(it); nx != newpills.end(); ++it, ++nx) { - interconnect(m_result.pillars()[size_t(*it)], - m_result.pillars()[size_t(*nx)]); + const Pillar& itpll = m_result.pillars()[size_t(*it)]; + const Pillar& nxpll = m_result.pillars()[size_t(*nx)]; + if(interconnect(itpll, nxpll)) { + m_result.increment_links(itpll); + m_result.increment_links(nxpll); + } } + + m_pillar_index.foreach(cascadefn); + } } } From 75cf1cde9254eb77760b5ada94141c9e53a148b7 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 12 Mar 2019 09:41:57 +0100 Subject: [PATCH 106/236] Refactoring of the Slice / Export G-code button --- src/slic3r/GUI/BackgroundSlicingProcess.hpp | 3 --- src/slic3r/GUI/Plater.cpp | 21 +++++++++------------ 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.hpp b/src/slic3r/GUI/BackgroundSlicingProcess.hpp index a15d3faef..9ea20163d 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.hpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp @@ -124,9 +124,6 @@ public: // and it does not account for the OctoPrint scheduling. bool finished() const { return m_print->finished(); } - // set status line - void set_status(const std::string & status_str) const { m_print->set_status(100, status_str); } - private: void thread_proc(); void thread_proc_safe(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c01d89352..eac611115 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -684,9 +684,10 @@ Sidebar::Sidebar(Plater *parent) p->btn_reslice->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { const bool export_gcode_after_slicing = wxGetKeyState(WXK_SHIFT); - p->plater->reslice(); if (export_gcode_after_slicing) p->plater->export_gcode(); + else + p->plater->reslice(); }); p->btn_send_gcode->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->send_gcode(); }); } @@ -1098,6 +1099,7 @@ struct Plater::priv wxTimer background_process_timer; std::string label_btn_export; + std::string label_btn_send; static const std::regex pattern_bundle; static const std::regex pattern_3mf; @@ -2150,28 +2152,22 @@ unsigned int Plater::priv::update_background_process(bool force_validation) wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone()); } - //FIXME update "Slice Now / Schedule background process" - //background_process.is_export_scheduled() - byl zavolan "Export G-code", background processing ma jmeno export souboru - //background_process.is_upload_scheduled() - byl zavolan "Send to OctoPrint", jeste nebylo doslajsovano (pak se preda upload fronte a background process zapomene) - //background_process.empty() - prazdna plocha - // pokud (return_state & UPDATE_BACKGROUND_PROCESS_INVALID) != 0 -> doslo k chybe (gray out "Slice now") mozna "Invalid data"??? - // jinak background_process.running() -> Zobraz "Slicing ..." - // jinak pokud ! background_process.empty() && ! background_process.finished() -> je neco ke slajsovani (povol tlacitko) "Slice Now" - if ((return_state & UPDATE_BACKGROUND_PROCESS_INVALID) != 0) { + // Validation of the background data failed. const wxString invalid_str = _(L("Invalid data")); for (auto btn : {ActionButtonType::abReslice, ActionButtonType::abSendGCode, ActionButtonType::abExport}) sidebar->set_btn_label(btn, invalid_str); } else { + // Background data is valid. if ((return_state & UPDATE_BACKGROUND_PROCESS_RESTART) != 0 || (return_state & UPDATE_BACKGROUND_PROCESS_REFRESH_SCENE) != 0 ) - background_process.set_status("Ready to slice"); + this->statusbar()->set_status_text(L("Ready to slice")); sidebar->set_btn_label(ActionButtonType::abExport, _(label_btn_export)); - sidebar->set_btn_label(ActionButtonType::abSendGCode, _(L("Send G-code"))); + sidebar->set_btn_label(ActionButtonType::abSendGCode, _(label_btn_send)); const wxString slice_string = background_process.running() && wxGetApp().get_mode() == comSimple ? _(L("Slicing")) + dots : _(L("Slice now")); @@ -3447,7 +3443,8 @@ void Plater::set_printer_technology(PrinterTechnology printer_technology) //FIXME for SLA synchronize //p->background_process.apply(Model)! - p->label_btn_export = printer_technology == ptFFF ? L("Export G-code") : L("Export"); // #ys_FIXME_rename + p->label_btn_export = printer_technology == ptFFF ? L("Export G-code") : L("Export"); + p->label_btn_send = printer_technology == ptFFF ? L("Send G-code") : L("Send to printer"); } void Plater::changed_object(int obj_idx) From 9522cd1d4f255aac752da1640a874e2a3e04ab4e Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 11 Mar 2019 11:49:24 +0100 Subject: [PATCH 107/236] OnInit: Move preset loading out of EVT_IDLE/once, remove temp workaround of sidebar scrollbar --- src/slic3r/GUI/GUI_App.cpp | 16 +++------------- src/slic3r/GUI/GUI_ObjectList.cpp | 5 +---- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 73ff19a9d..afbf6b568 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -167,17 +167,6 @@ bool GUI_App::OnInit() if (app_config->dirty() && app_config->get("autosave") == "1") app_config->save(); - // ! Temporary workaround for the correct behavior of the Scrolled sidebar panel - // Do this "manipulations" only once ( after (re)create of the application ) - if (sidebar().obj_list()->GetMinHeight() > 15 * wxGetApp().em_unit()) - { - wxWindowUpdateLocker noUpdates_sidebar(&sidebar()); - sidebar().obj_list()->SetMinSize(wxSize(-1, 15 * wxGetApp().em_unit())); - - // !!! to correct later layouts - update_mode(); // update view mode after fix of the object_list size - } - this->obj_manipul()->update_if_dirty(); // Preset updating & Configwizard are done after the above initializations, @@ -205,11 +194,12 @@ bool GUI_App::OnInit() } preset_updater->sync(preset_bundle); }); - - load_current_presets(); } }); + load_current_presets(); + update_mode(); // update view mode after fix of the object_list size + mainframe->Show(true); m_initialized = true; return true; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index eb3744bef..6a605a667 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -115,10 +115,7 @@ ObjectList::~ObjectList() void ObjectList::create_objects_ctrl() { - // temporary workaround for the correct behavior of the Scrolled sidebar panel: - // 1. set a height of the list to some big value - // 2. change it to the normal min value (200) after first whole App updating/layouting - SetMinSize(wxSize(-1, 3000)); // #ys_FIXME + SetMinSize(wxSize(-1, 15 * wxGetApp().em_unit())); m_sizer = new wxBoxSizer(wxVERTICAL); m_sizer->Add(this, 1, wxGROW); From 4e510dc3e71d3eb96045c90cdf944396d0ca7f61 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 11 Mar 2019 09:48:24 +0100 Subject: [PATCH 108/236] PostProcessor on Unix: Execute using default shell #1908 escape gcode path, collect stderr --- src/libslic3r/GCode/PostProcessor.cpp | 76 ++++++++++++++++++--------- src/slic3r/GUI/Plater.cpp | 9 ++-- 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/src/libslic3r/GCode/PostProcessor.cpp b/src/libslic3r/GCode/PostProcessor.cpp index e86463b84..df4acc1bf 100644 --- a/src/libslic3r/GCode/PostProcessor.cpp +++ b/src/libslic3r/GCode/PostProcessor.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #ifdef WIN32 @@ -88,7 +89,7 @@ static DWORD execute_process_winapi(const std::wstring &command_line) // Run the script. If it is a perl script, run it through the bundled perl interpreter. // If it is a batch file, run it through the cmd.exe. // Otherwise run it directly. -static int run_script_win32(const std::string &script, const std::string &gcode) +static int run_script(const std::string &script, const std::string &gcode, std::string &/*std_err*/) { // Unpack the argument list provided by the user. int nArgs; @@ -132,9 +133,46 @@ static int run_script_win32(const std::string &script, const std::string &gcode) } #else - #include //for getting filesystem UID/GID - #include //for getting current UID/GID - #include + // POSIX + +#include // getenv() +#include +#include + +namespace process = boost::process; + +static int run_script(const std::string &script, const std::string &gcode, std::string &std_err) +{ + // Try to obtain user's default shell + const char *shell = ::getenv("SHELL"); + if (shell == nullptr) { shell = "sh"; } + + // Quote and escape the gcode path argument + std::string command { script }; + command.append(" '"); + for (char c : gcode) { + if (c == '\'') { command.append("'\\''"); } + else { command.push_back(c); } + } + command.push_back('\''); + + BOOST_LOG_TRIVIAL(debug) << boost::format("Executing script, shell: %1%, command: %2%") % shell % command; + + process::ipstream istd_err; + process::child child(shell, "-c", command, process::std_err > istd_err); + + std_err.clear(); + std::string line; + + while (child.running() && std::getline(istd_err, line)) { + std_err.append(line); + std_err.push_back('\n'); + } + + child.wait(); + return child.exit_code(); +} + #endif namespace Slic3r { @@ -158,27 +196,15 @@ void run_post_process_scripts(const std::string &path, const PrintConfig &config if (script.empty()) continue; BOOST_LOG_TRIVIAL(info) << "Executing script " << script << " on file " << path; -#ifdef WIN32 - int result = run_script_win32(script, gcode_file.string()); -#else - //FIXME testing existence of a script is risky, as the script line may contain the script and some additional command line parameters. - // We would have to process the script line into parameters before testing for the existence of the command, the command may be looked up - // in the PATH etc. - if (! boost::filesystem::exists(boost::filesystem::path(script))) - throw std::runtime_error(std::string("The configured post-processing script does not exist: ") + script); - struct stat info; - if (stat(script.c_str(), &info)) - throw std::runtime_error(std::string("Cannot read information for post-processing script: ") + script); - boost::filesystem::perms script_perms = boost::filesystem::status(script).permissions(); - //if UID matches, check UID perm. else if GID matches, check GID perm. Otherwise check other perm. - if (!(script_perms & ((info.st_uid == geteuid()) ? boost::filesystem::perms::owner_exe - : ((info.st_gid == getegid()) ? boost::filesystem::perms::group_exe - : boost::filesystem::perms::others_exe)))) - throw std::runtime_error(std::string("The configured post-processing script is not executable: check permissions. ") + script); - int result = boost::process::system(script, gcode_file); - if (result < 0) - BOOST_LOG_TRIVIAL(error) << "Script " << script << " on file " << path << " failed. Negative error code returned."; -#endif + + std::string std_err; + const int result = run_script(script, gcode_file.string(), std_err); + if (result != 0) { + const std::string msg = std_err.empty() ? (boost::format("Post-processing script %1% on file %2% failed.\nError code: %3%") % script % path % result).str() + : (boost::format("Post-processing script %1% on file %2% failed.\nError code: %3%\nOutput:\n%4%") % script % path % result % std_err).str(); + BOOST_LOG_TRIVIAL(error) << msg; + throw std::runtime_error(msg); + } } } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index eac611115..aac21e7db 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2463,14 +2463,17 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) this->statusbar()->reset_cancel_callback(); this->statusbar()->stop_busy(); - bool canceled = evt.GetInt() < 0; - bool success = evt.GetInt() > 0; + const bool canceled = evt.GetInt() < 0; + const bool error = evt.GetInt() == 0; + const bool success = evt.GetInt() > 0; // Reset the "export G-code path" name, so that the automatic background processing will be enabled again. this->background_process.reset_export(); - if (! success) { + + if (error) { wxString message = evt.GetString(); if (message.IsEmpty()) message = _(L("Export failed")); + show_error(q, message); this->statusbar()->set_status_text(message); } if (canceled) From 09c9f567f23c8c9248759ee71adcb902fbbdba38 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 11 Mar 2019 13:59:58 +0100 Subject: [PATCH 109/236] Fix crash on exit --- src/slic3r/GUI/Tab.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 0d53c3fd9..1d7a9a0c2 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -751,6 +751,10 @@ void Tab::load_key_value(const std::string& opt_key, const boost::any& value, bo void Tab::on_value_change(const std::string& opt_key, const boost::any& value) { + if (wxGetApp().plater() == nullptr) { + return; + } + const bool is_fff = supports_printer_technology(ptFFF); ConfigOptionsGroup* og_freq_chng_params = wxGetApp().sidebar().og_freq_chng_params(is_fff); if (opt_key == "fill_density" || opt_key == "pad_enable") From 077b4cbfbc73941bcd802645e7f14a7aaf657a96 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 12 Mar 2019 11:39:16 +0100 Subject: [PATCH 110/236] Fixed layout for the action buttons + Tried to use DoubleBuffered for the controls drawing on the Sidebar (under MSW only) --- src/slic3r/GUI/Plater.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index aac21e7db..2fddd4784 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -555,8 +555,6 @@ void Sidebar::priv::show_preset_comboboxes() { const bool showSLA = wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA; - wxWindowUpdateLocker noUpdates_scrolled(scrolled->GetParent()); - for (size_t i = 0; i < 4; ++i) sizer_presets->Show(i, !showSLA); @@ -580,6 +578,10 @@ Sidebar::Sidebar(Plater *parent) p->scrolled = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(40 * wxGetApp().em_unit(), -1)); p->scrolled->SetScrollbars(0, 20, 1, 2); +#ifdef __WINDOWS__ + p->scrolled->SetDoubleBuffered(true); +#endif //__WINDOWS__ + // Sizer in the scrolled area auto *scrolled_sizer = new wxBoxSizer(wxVERTICAL); p->scrolled->SetSizer(scrolled_sizer); @@ -645,9 +647,7 @@ Sidebar::Sidebar(Plater *parent) p->object_settings->Hide(); p->sizer_params->Add(p->object_settings->get_sizer(), 0, wxEXPAND | wxTOP, margin_5); - wxBitmap arrow_up(GUI::from_u8(Slic3r::var("brick_go.png")), wxBITMAP_TYPE_PNG); p->btn_send_gcode = new wxButton(this, wxID_ANY, _(L("Send to printer"))); - p->btn_send_gcode->SetBitmap(arrow_up); p->btn_send_gcode->SetFont(wxGetApp().bold_font()); p->btn_send_gcode->Hide(); @@ -757,6 +757,8 @@ void Sidebar::update_presets(Preset::Type preset_type) case Preset::TYPE_PRINTER: { + wxWindowUpdateLocker noUpdates_scrolled(p->scrolled); + // Update the print choosers to only contain the compatible presets, update the dirty flags. if (print_tech == ptFFF) preset_bundle.prints.update_platter_ui(p->combo_print); @@ -2893,6 +2895,7 @@ void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const sidebar->show_export(!is_ready_to_slice); sidebar->show_send(send_gcode_shown && !is_ready_to_slice); } + sidebar->Layout(); } void Sidebar::set_btn_label(const ActionButtonType btn_type, const wxString& label) const From f5b5e48ad78342bffa9b806c838f7bd038226750 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 12 Mar 2019 11:57:39 +0100 Subject: [PATCH 111/236] Added cancel mechanism to GCodeAnalyzer::calc_gcode_preview_data() --- src/libslic3r/GCode.cpp | 2 +- src/libslic3r/GCode/Analyzer.cpp | 51 ++++++++++++++++++++++++++------ src/libslic3r/GCode/Analyzer.hpp | 12 ++++---- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 2907415bf..94be37b21 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -487,7 +487,7 @@ void GCode::do_export(Print *print, const char *path, GCodePreviewData *preview_ // starts analyzer calculations if (m_enable_analyzer) { BOOST_LOG_TRIVIAL(debug) << "Preparing G-code preview data"; - m_analyzer.calc_gcode_preview_data(*preview_data); + m_analyzer.calc_gcode_preview_data(*preview_data, [print]() { print->throw_if_canceled(); }); m_analyzer.reset(); } diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp index e1fb140bb..f1f828776 100644 --- a/src/libslic3r/GCode/Analyzer.cpp +++ b/src/libslic3r/GCode/Analyzer.cpp @@ -137,22 +137,22 @@ const std::string& GCodeAnalyzer::process_gcode(const std::string& gcode) return m_process_output; } -void GCodeAnalyzer::calc_gcode_preview_data(GCodePreviewData& preview_data) +void GCodeAnalyzer::calc_gcode_preview_data(GCodePreviewData& preview_data, std::function cancel_callback) { // resets preview data preview_data.reset(); // calculates extrusion layers - _calc_gcode_preview_extrusion_layers(preview_data); + _calc_gcode_preview_extrusion_layers(preview_data, cancel_callback); // calculates travel - _calc_gcode_preview_travel(preview_data); + _calc_gcode_preview_travel(preview_data, cancel_callback); // calculates retractions - _calc_gcode_preview_retractions(preview_data); + _calc_gcode_preview_retractions(preview_data, cancel_callback); // calculates unretractions - _calc_gcode_preview_unretractions(preview_data); + _calc_gcode_preview_unretractions(preview_data, cancel_callback); } bool GCodeAnalyzer::is_valid_extrusion_role(ExtrusionRole role) @@ -676,7 +676,7 @@ bool GCodeAnalyzer::_is_valid_extrusion_role(int value) const return ((int)erNone <= value) && (value <= (int)erMixed); } -void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data) +void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data, std::function cancel_callback) { struct Helper { @@ -725,9 +725,18 @@ void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& previ GCodePreviewData::Range feedrate_range; GCodePreviewData::Range volumetric_rate_range; + // to avoid to call the callback too often + unsigned int cancel_callback_threshold = (unsigned int)extrude_moves->second.size() / 25; + unsigned int cancel_callback_curr = 0; + // constructs the polylines while traversing the moves for (const GCodeMove& move : extrude_moves->second) { + // to avoid to call the callback too often + cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; + if (cancel_callback_curr == 0) + cancel_callback(); + if ((data != move.data) || (z != move.start_position.z()) || (position != move.start_position) || (volumetric_rate != move.data.feedrate * (float)move.data.mm3_per_mm)) { // store current polyline @@ -769,7 +778,7 @@ void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& previ preview_data.ranges.volumetric_rate.update_from(volumetric_rate_range); } -void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data) +void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function cancel_callback) { struct Helper { @@ -797,9 +806,17 @@ void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data) GCodePreviewData::Range width_range; GCodePreviewData::Range feedrate_range; + // to avoid to call the callback too often + unsigned int cancel_callback_threshold = (unsigned int)travel_moves->second.size() / 25; + unsigned int cancel_callback_curr = 0; + // constructs the polylines while traversing the moves for (const GCodeMove& move : travel_moves->second) { + cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; + if (cancel_callback_curr == 0) + cancel_callback(); + GCodePreviewData::Travel::EType move_type = (move.delta_extruder < 0.0f) ? GCodePreviewData::Travel::Retract : ((move.delta_extruder > 0.0f) ? GCodePreviewData::Travel::Extrude : GCodePreviewData::Travel::Move); GCodePreviewData::Travel::Polyline::EDirection move_direction = ((move.start_position.x() != move.end_position.x()) || (move.start_position.y() != move.end_position.y())) ? GCodePreviewData::Travel::Polyline::Generic : GCodePreviewData::Travel::Polyline::Vertical; @@ -840,28 +857,44 @@ void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data) preview_data.ranges.feedrate.update_from(feedrate_range); } -void GCodeAnalyzer::_calc_gcode_preview_retractions(GCodePreviewData& preview_data) +void GCodeAnalyzer::_calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function cancel_callback) { TypeToMovesMap::iterator retraction_moves = m_moves_map.find(GCodeMove::Retract); if (retraction_moves == m_moves_map.end()) return; + // to avoid to call the callback too often + unsigned int cancel_callback_threshold = (unsigned int)retraction_moves->second.size() / 25; + unsigned int cancel_callback_curr = 0; + for (const GCodeMove& move : retraction_moves->second) { + cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; + if (cancel_callback_curr == 0) + cancel_callback(); + // store position Vec3crd position(scale_(move.start_position.x()), scale_(move.start_position.y()), scale_(move.start_position.z())); preview_data.retraction.positions.emplace_back(position, move.data.width, move.data.height); } } -void GCodeAnalyzer::_calc_gcode_preview_unretractions(GCodePreviewData& preview_data) +void GCodeAnalyzer::_calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function cancel_callback) { TypeToMovesMap::iterator unretraction_moves = m_moves_map.find(GCodeMove::Unretract); if (unretraction_moves == m_moves_map.end()) return; + // to avoid to call the callback too often + unsigned int cancel_callback_threshold = (unsigned int)unretraction_moves->second.size() / 25; + unsigned int cancel_callback_curr = 0; + for (const GCodeMove& move : unretraction_moves->second) { + cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; + if (cancel_callback_curr == 0) + cancel_callback(); + // store position Vec3crd position(scale_(move.start_position.x()), scale_(move.start_position.y()), scale_(move.start_position.z())); preview_data.unretraction.positions.emplace_back(position, move.data.width, move.data.height); diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp index c74a4558c..4c201c640 100644 --- a/src/libslic3r/GCode/Analyzer.hpp +++ b/src/libslic3r/GCode/Analyzer.hpp @@ -122,7 +122,8 @@ public: const std::string& process_gcode(const std::string& gcode); // Calculates all data needed for gcode visualization - void calc_gcode_preview_data(GCodePreviewData& preview_data); + // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). + void calc_gcode_preview_data(GCodePreviewData& preview_data, std::function cancel_callback = std::function()); // Return an estimate of the memory consumed by the time estimator. size_t memory_used() const; @@ -237,10 +238,11 @@ private: // Checks if the given int is a valid extrusion role (contained into enum ExtrusionRole) bool _is_valid_extrusion_role(int value) const; - void _calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data); - void _calc_gcode_preview_travel(GCodePreviewData& preview_data); - void _calc_gcode_preview_retractions(GCodePreviewData& preview_data); - void _calc_gcode_preview_unretractions(GCodePreviewData& preview_data); + // All the following methods throw CanceledException through print->throw_if_canceled() (sent by the caller as callback). + void _calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data, std::function cancel_callback); + void _calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function cancel_callback); + void _calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function cancel_callback); + void _calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function cancel_callback); }; } // namespace Slic3r From 1778c51af1711b5d5d1621155042fc41ed118afd Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 12 Mar 2019 15:21:55 +0100 Subject: [PATCH 112/236] Fixed seed for the genetic optimizer for support generation --- src/libnest2d/include/libnest2d/optimizers/nlopt/genetic.hpp | 2 ++ src/libslic3r/SLA/SLASupportTree.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/libnest2d/include/libnest2d/optimizers/nlopt/genetic.hpp b/src/libnest2d/include/libnest2d/optimizers/nlopt/genetic.hpp index 731ead554..b92251ebd 100644 --- a/src/libnest2d/include/libnest2d/optimizers/nlopt/genetic.hpp +++ b/src/libnest2d/include/libnest2d/optimizers/nlopt/genetic.hpp @@ -14,6 +14,8 @@ public: localmethod_ = m; return *this; } + + inline void seed(unsigned long val) { nlopt::srand(val); } }; template<> diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index cbd27eb7c..4f449523a 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1479,6 +1479,7 @@ public: stc.relative_score_difference = m_cfg.optimizer_rel_score_diff; stc.stop_score = w; // space greater than w is enough GeneticOptimizer solver(stc); + solver.seed(0); // we want deterministic behavior auto oresult = solver.optimize_max( [this, pin_r, w, hp](double plr, double azm) @@ -1778,6 +1779,7 @@ public: stc.relative_score_difference = m_cfg.optimizer_rel_score_diff; stc.stop_score = 1e6; GeneticOptimizer solver(stc); + solver.seed(0); // we want deterministic behavior double r_back = head.r_back_mm; From 63b65bb3c88e74fa8ce2bdc2245a1fd07116503c Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 13 Mar 2019 10:46:50 +0100 Subject: [PATCH 113/236] Wipe tower brim lines are now printed with overlaps as they should be --- src/libslic3r/GCode/WipeTowerPrusaMM.cpp | 3 +-- src/slic3r/GUI/GLCanvas3D.cpp | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/WipeTowerPrusaMM.cpp b/src/libslic3r/GCode/WipeTowerPrusaMM.cpp index 031fd9a28..829fe1bb9 100644 --- a/src/libslic3r/GCode/WipeTowerPrusaMM.cpp +++ b/src/libslic3r/GCode/WipeTowerPrusaMM.cpp @@ -709,12 +709,11 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::toolchange_Brim(bool sideOnly, flo // The tool is supposed to be active and primed at the time when the wipe tower brim is extruded. // Extrude 4 rounds of a brim around the future wipe tower. box_coordinates box(wipeTower_box); - box.expand(m_perimeter_width); for (size_t i = 0; i < 4; ++ i) { + box.expand(m_perimeter_width - m_layer_height*(1.f-M_PI_4)); // the brim shall have 'normal' spacing with no extra void space writer.travel (box.ld, 7000) .extrude(box.lu, 2100).extrude(box.ru) .extrude(box.rd ).extrude(box.ld); - box.expand(m_perimeter_width); } writer.travel(wipeTower_box.ld, 7000); // Move to the front left corner. diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a3a523d94..8178c9cf6 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4564,11 +4564,18 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re const Print *print = m_process->fff_print(); float depth = print->get_wipe_tower_depth(); + + // Calculate wipe tower brim spacing. + const DynamicPrintConfig &print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + double layer_height = print_config.opt_float("layer_height"); + double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height); + float brim_spacing = print->config().nozzle_diameter.values[0] * 1.25f - first_layer_height * (1. - M_PI_4); + if (!print->is_step_done(psWipeTower)) depth = (900.f/w) * (float)(extruders_count - 1) ; int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( 1000, x, y, w, depth, (float)height, a, m_use_VBOs && m_initialized, !print->is_step_done(psWipeTower), - print->config().nozzle_diameter.values[0] * 1.25f * 4.5f); + brim_spacing * 4.5f); if (volume_idx_wipe_tower_old != -1) map_glvolume_old_to_new[volume_idx_wipe_tower_old] = volume_idx_wipe_tower_new; } @@ -7852,10 +7859,17 @@ void GLCanvas3D::_load_shells_fff() unsigned int extruders_count = config.nozzle_diameter.size(); if ((extruders_count > 1) && config.single_extruder_multi_material && config.wipe_tower && !config.complete_objects) { float depth = print->get_wipe_tower_depth(); + + // Calculate wipe tower brim spacing. + const DynamicPrintConfig &print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + double layer_height = print_config.opt_float("layer_height"); + double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height); + float brim_spacing = print->config().nozzle_diameter.values[0] * 1.25f - first_layer_height * (1. - M_PI_4); + if (!print->is_step_done(psWipeTower)) depth = (900.f/config.wipe_tower_width) * (float)(extruders_count - 1) ; m_volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, - m_use_VBOs && m_initialized, !print->is_step_done(psWipeTower), print->config().nozzle_diameter.values[0] * 1.25f * 4.5f); + m_use_VBOs && m_initialized, !print->is_step_done(psWipeTower), brim_spacing * 4.5f); } } } From 03beb1870b799184ed7a1ea9b94640924da4cdcf Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 13 Mar 2019 12:02:33 +0100 Subject: [PATCH 114/236] SLA gizmo - combo replaced by slider, autogeneration uses config value for head_diameter --- src/libslic3r/SLA/SLAAutoSupports.cpp | 2 +- src/libslic3r/SLA/SLAAutoSupports.hpp | 1 + src/libslic3r/SLAPrint.cpp | 1 + src/slic3r/GUI/GLGizmo.cpp | 51 +++++++++++++-------------- src/slic3r/GUI/GLGizmo.hpp | 4 +-- 5 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/libslic3r/SLA/SLAAutoSupports.cpp b/src/libslic3r/SLA/SLAAutoSupports.cpp index e99ed111e..9e9f07b6c 100644 --- a/src/libslic3r/SLA/SLAAutoSupports.cpp +++ b/src/libslic3r/SLA/SLAAutoSupports.cpp @@ -496,7 +496,7 @@ void SLAAutoSupports::uniformly_cover(const ExPolygons& islands, Structure& stru poisson_samples.erase(poisson_samples.begin() + poisson_samples_target, poisson_samples.end()); } for (const Vec2f &pt : poisson_samples) { - m_output.emplace_back(float(pt(0)), float(pt(1)), structure.height, 0.2f, is_new_island); + m_output.emplace_back(float(pt(0)), float(pt(1)), structure.height, m_config.head_diameter/2.f, is_new_island); structure.supports_force_this_layer += m_config.support_force(); grid3d.insert(pt, &structure); } diff --git a/src/libslic3r/SLA/SLAAutoSupports.hpp b/src/libslic3r/SLA/SLAAutoSupports.hpp index 5a758c2a6..038b505da 100644 --- a/src/libslic3r/SLA/SLAAutoSupports.hpp +++ b/src/libslic3r/SLA/SLAAutoSupports.hpp @@ -17,6 +17,7 @@ public: struct Config { float density_relative; float minimal_distance; + float head_diameter; /////////////// inline float support_force() const { return 10.f / density_relative; } // a force one point can support (arbitrary force unit) inline float tear_pressure() const { return 1.f; } // pressure that the display exerts (the force unit per mm2) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 82b499ec7..35750dad3 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -673,6 +673,7 @@ void SLAPrint::process() // the density config value is in percents: config.density_relative = float(cfg.support_points_density_relative / 100.f); config.minimal_distance = float(cfg.support_points_minimal_distance); + config.head_diameter = float(cfg.support_head_front_diameter); // Construction of this object does the calculation. this->throw_if_canceled(); diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 8b21833c4..fc91dff2d 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -2227,15 +2227,15 @@ void GLGizmoSlaSupports::render_tooltip_texture() const { #endif // not ENABLE_IMGUI -std::vector GLGizmoSlaSupports::get_config_options(const std::vector& keys) const +std::vector GLGizmoSlaSupports::get_config_options(const std::vector& keys) const { - std::vector out; + std::vector out; if (!m_model_object) return out; - DynamicPrintConfig& object_cfg = m_model_object->config; - DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + const DynamicPrintConfig& object_cfg = m_model_object->config; + const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; std::unique_ptr default_cfg = nullptr; for (const std::string& key : keys) { @@ -2268,7 +2268,7 @@ RENDER_AGAIN: m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); const float scaling = m_imgui->get_style_scaling(); - const ImVec2 window_size(285.f * scaling, 260.f * scaling); + const ImVec2 window_size(285.f * scaling, 300.f * scaling); ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); ImGui::SetNextWindowSize(ImVec2(window_size)); @@ -2287,30 +2287,19 @@ RENDER_AGAIN: m_imgui->text(_(L("Shift + Left (+ drag) - select point(s)"))); m_imgui->text(" "); // vertical gap - static const std::vector options = {0.2f, 0.4f, 0.6f, 0.8f, 1.0f}; - static const std::vector options_str = {"0.2", "0.4", "0.6", "0.8", "1.0"}; - int selection = -1; - for (size_t i = 0; i < options.size(); i++) { - if (options[i] == m_new_point_head_diameter) { selection = (int)i; } - } + float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; + if (m_new_point_head_diameter > diameter_upper_cap) + m_new_point_head_diameter = diameter_upper_cap; - bool old_combo_state = m_combo_box_open; - // The combo is commented out for now, until the feature is supported by backend. - m_combo_box_open = m_imgui->combo(_(L("Head diameter")), options_str, selection); - force_refresh |= (old_combo_state != m_combo_box_open); - - // float current_number = atof(str); - const float current_number = selection < options.size() ? options[selection] : m_new_point_head_diameter; - if (old_combo_state && !m_combo_box_open) // closing the combo must always change the sizes (even if the selection did not change) + m_imgui->text(_(L("Head diameter: "))); + ImGui::SameLine(); + if (ImGui::SliderFloat("", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f")) { + // value was changed for (auto& point_and_selection : m_editing_mode_cache) if (point_and_selection.second) { - point_and_selection.first.head_front_radius = current_number / 2.f; + point_and_selection.first.head_front_radius = m_new_point_head_diameter / 2.f; m_unsaved_changes = true; } - - if (std::abs(current_number - m_new_point_head_diameter) > 0.001) { - force_refresh = true; - m_new_point_head_diameter = current_number; } bool changed = m_lock_unique_islands; @@ -2343,9 +2332,9 @@ RENDER_AGAIN: m_imgui->text(_(L("Minimal points distance: "))); ImGui::SameLine(); - std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); - float density = static_cast(opts[0])->value; - float minimal_point_distance = static_cast(opts[1])->value; + std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); + float density = static_cast(opts[0])->value; + float minimal_point_distance = static_cast(opts[1])->value; bool value_changed = ImGui::SliderFloat("", &minimal_point_distance, 0.f, 20.f, "%.f mm"); if (value_changed) @@ -2451,6 +2440,10 @@ void GLGizmoSlaSupports::on_set_state() m_parent.toggle_model_objects_visibility(false); if (m_model_object) m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + + // Set default head diameter from config. + const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; } if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off if (m_model_object) { @@ -2489,10 +2482,14 @@ void GLGizmoSlaSupports::select_point(int i) for (auto& point_and_selection : m_editing_mode_cache) point_and_selection.second = ( i == AllPoints ); m_selection_empty = (i == NoPoints); + + if (i == AllPoints) + m_new_point_head_diameter = m_editing_mode_cache[0].first.head_front_radius * 2.f; } else { m_editing_mode_cache[i].second = true; m_selection_empty = false; + m_new_point_head_diameter = m_editing_mode_cache[i].first.head_front_radius * 2.f; } } diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp index fc8d40a65..c0690b8bc 100644 --- a/src/slic3r/GUI/GLGizmo.hpp +++ b/src/slic3r/GUI/GLGizmo.hpp @@ -520,7 +520,7 @@ private: bool m_lock_unique_islands = false; bool m_editing_mode = false; // Is editing mode active? bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). - float m_new_point_head_diameter = 0.4f; // Size of a new point. + float m_new_point_head_diameter; // Size of a new point. float m_minimal_point_distance = 20.f; float m_density = 100.f; std::vector> m_editing_mode_cache; // a support point and whether it is currently selected @@ -536,7 +536,7 @@ private: int m_canvas_width; int m_canvas_height; - std::vector get_config_options(const std::vector& keys) const; + std::vector get_config_options(const std::vector& keys) const; // Methods that do the model_object and editing cache synchronization, // editing mode selection, etc: From a6dcbc8791aad14a0b0dde169cce66dd6b231b17 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 13 Mar 2019 13:13:18 +0100 Subject: [PATCH 115/236] Set DoubleBuffered state for the Tabs (under MSW) + Some improvements/experiments for the presets selection from the Plater + Some fix of a sidebar layout --- src/slic3r/GUI/GUI_App.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 48 ++++++++++++++++++++++----------- src/slic3r/GUI/Plater.hpp | 3 +++ src/slic3r/GUI/Preset.cpp | 6 ++++- src/slic3r/GUI/PresetBundle.cpp | 5 +++- src/slic3r/GUI/Tab.cpp | 39 +++++++-------------------- 6 files changed, 54 insertions(+), 49 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index afbf6b568..7d448fbe4 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -198,9 +198,9 @@ bool GUI_App::OnInit() }); load_current_presets(); - update_mode(); // update view mode after fix of the object_list size mainframe->Show(true); + update_mode(); // update view mode after fix of the object_list size m_initialized = true; return true; } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 2fddd4784..6fb21e17b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -524,6 +524,7 @@ struct Sidebar::priv Plater *plater; wxScrolledWindow *scrolled; + wxPanel* presets_panel; // Used for MSW better layouts PrusaModeSizer *mode_sizer; wxFlexGridSizer *sizer_presets; @@ -578,9 +579,6 @@ Sidebar::Sidebar(Plater *parent) p->scrolled = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(40 * wxGetApp().em_unit(), -1)); p->scrolled->SetScrollbars(0, 20, 1, 2); -#ifdef __WINDOWS__ - p->scrolled->SetDoubleBuffered(true); -#endif //__WINDOWS__ // Sizer in the scrolled area auto *scrolled_sizer = new wxBoxSizer(wxVERTICAL); @@ -593,12 +591,25 @@ Sidebar::Sidebar(Plater *parent) p->sizer_presets = new wxFlexGridSizer(10, 1, 1, 2); p->sizer_presets->AddGrowableCol(0, 1); p->sizer_presets->SetFlexibleDirection(wxBOTH); + + bool is_msw = false; +#ifdef __WINDOWS__ + p->scrolled->SetDoubleBuffered(true); + + p->presets_panel = new wxPanel(p->scrolled, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + p->presets_panel->SetSizer(p->sizer_presets); + + is_msw = true; +#else + presets_panel = p->scrolled; +#endif //__WINDOWS__ + p->sizer_filaments = new wxBoxSizer(wxVERTICAL); auto init_combo = [this](PresetComboBox **combo, wxString label, Preset::Type preset_type, bool filament) { - auto *text = new wxStaticText(p->scrolled, wxID_ANY, label+" :"); + auto *text = new wxStaticText(p->presets_panel, wxID_ANY, label + " :"); text->SetFont(wxGetApp().small_font()); - *combo = new PresetComboBox(p->scrolled, preset_type); + *combo = new PresetComboBox(p->presets_panel, preset_type); auto *sizer_presets = this->p->sizer_presets; auto *sizer_filaments = this->p->sizer_filaments; @@ -657,7 +668,9 @@ Sidebar::Sidebar(Plater *parent) // Sizer in the scrolled area scrolled_sizer->Add(p->mode_sizer, 0, wxALIGN_CENTER_HORIZONTAL/*RIGHT | wxBOTTOM | wxRIGHT, 5*/); - scrolled_sizer->Add(p->sizer_presets, 0, wxEXPAND | wxLEFT, margin_5); + is_msw ? + scrolled_sizer->Add(p->presets_panel, 0, wxEXPAND | wxLEFT, margin_5) : + scrolled_sizer->Add(p->sizer_presets, 0, wxEXPAND | wxLEFT, margin_5); scrolled_sizer->Add(p->sizer_params, 1, wxEXPAND | wxLEFT, margin_5); scrolled_sizer->Add(p->object_info, 0, wxEXPAND | wxTOP | wxLEFT, margin_5); scrolled_sizer->Add(p->sliced_info, 0, wxEXPAND | wxTOP | wxLEFT, margin_5); @@ -695,7 +708,7 @@ Sidebar::Sidebar(Plater *parent) Sidebar::~Sidebar() {} void Sidebar::init_filament_combo(PresetComboBox **combo, const int extr_idx) { - *combo = new PresetComboBox(p->scrolled, Slic3r::Preset::TYPE_FILAMENT); + *combo = new PresetComboBox(p->presets_panel, Slic3r::Preset::TYPE_FILAMENT); // # copy icons from first choice // $choice->SetItemBitmap($_, $choices->[0]->GetItemBitmap($_)) for 0..$#presets; @@ -757,7 +770,7 @@ void Sidebar::update_presets(Preset::Type preset_type) case Preset::TYPE_PRINTER: { - wxWindowUpdateLocker noUpdates_scrolled(p->scrolled); +// wxWindowUpdateLocker noUpdates_scrolled(p->scrolled); // Update the print choosers to only contain the compatible presets, update the dirty flags. if (print_tech == ptFFF) @@ -819,6 +832,11 @@ wxScrolledWindow* Sidebar::scrolled_panel() return p->scrolled; } +wxPanel* Sidebar::presets_panel() +{ + return p->presets_panel; +} + ConfigOptionsGroup* Sidebar::og_freq_chng_params(const bool is_fff) { return p->frequently_changed_parameters->get_og(is_fff); @@ -2392,7 +2410,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) //! instead of //! combo->GetStringSelection().ToUTF8().data()); - std::string selected_string = combo->GetString(combo->GetSelection()).ToUTF8().data(); + const std::string& selected_string = combo->GetString(combo->GetSelection()).ToUTF8().data(); if (preset_type == Preset::TYPE_FILAMENT) { wxGetApp().preset_bundle->set_filament_preset(idx, selected_string); @@ -2404,12 +2422,8 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo); } else { - for (Tab* tab : wxGetApp().tabs_list) { - if (tab->type() == preset_type) { - tab->select_preset(selected_string); - break; - } - } + wxWindowUpdateLocker noUpdates(sidebar->presets_panel()); + wxGetApp().get_tab(preset_type)->select_preset(selected_string); } // update plater with new config @@ -3313,8 +3327,10 @@ void Plater::on_extruders_change(int num_extruders) { auto& choices = sidebar().combos_filament(); + if (num_extruders == choices.size()) + return; + wxWindowUpdateLocker noUpdates_scrolled_panel(&sidebar()/*.scrolled_panel()*/); -// sidebar().scrolled_panel()->Freeze(); int i = choices.size(); while ( i < num_extruders ) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 78035d0ab..4261dbae2 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -51,6 +51,8 @@ public: int get_extruder_idx() const { return extruder_idx; } void check_selection(); + std::string selected_preset_name; + private: typedef std::size_t Marker; enum { LABEL_ITEM_MARKER = 0x4d }; @@ -81,6 +83,7 @@ public: ObjectList* obj_list(); ObjectSettings* obj_settings(); wxScrolledWindow* scrolled_panel(); + wxPanel* presets_panel(); ConfigOptionsGroup* og_freq_chng_params(const bool is_fff); wxButton* get_wiping_dialog_button(); diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 4902b5552..86fdde44b 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -879,8 +879,10 @@ size_t PresetCollection::update_compatible_internal(const Preset &active_printer // Hide the void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) { - if (ui == nullptr) + if (ui == nullptr || + ui->selected_preset_name == this->get_selected_preset().name) return; + // Otherwise fill in the list from scratch. ui->Freeze(); ui->Clear(); @@ -949,6 +951,8 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); ui->Thaw(); + + ui->selected_preset_name = this->get_selected_preset().name; } size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible) diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 0ee7a5c6c..6ec8eb6e3 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1436,7 +1436,8 @@ bool PresetBundle::parse_color(const std::string &scolor, unsigned char *rgb_out void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui) { if (ui == nullptr || this->printers.get_edited_preset().printer_technology() == ptSLA || - this->filament_presets.size() <= idx_extruder ) + this->filament_presets.size() <= idx_extruder || + ui->selected_preset_name == this->filaments.find_preset(this->filament_presets[idx_extruder])->name) return; unsigned char rgb[3]; @@ -1525,6 +1526,8 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); ui->Thaw(); + + ui->selected_preset_name = this->filaments.find_preset(this->filament_presets[idx_extruder])->name; } void PresetBundle::set_default_suppressed(bool default_suppressed) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 1400f75a6..c75618132 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -73,6 +73,10 @@ void Tab::set_type() // sub new void Tab::create_preset_tab() { +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + m_preset_bundle = wxGetApp().preset_bundle; // Vertical sizer to hold the choice menu and the rest of the page. @@ -787,25 +791,6 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value) wxGetApp().plater()->on_extruders_change(boost::any_cast(value)); update(); - - // #ys_FIXME_to_delete - // Post event to the Plater after updating of the all dirty options - // It helps to avoid needless schedule_background_processing -// if (update_completed()) -// if (m_update_stack.empty()) -// { -// // wxCommandEvent event(EVT_TAB_VALUE_CHANGED); -// // event.SetEventObject(this); -// // event.SetString(opt_key); -// // if (opt_key == "extruders_count") -// // { -// // const int val = boost::any_cast(value); -// // event.SetInt(val); -// // } -// // -// // wxPostEvent(this, event); -// wxGetApp().mainframe->on_value_changed(m_config); -// } } // Show/hide the 'purging volumes' button @@ -828,9 +813,13 @@ void Tab::update_wiping_button_visibility() { // To update the content of the selection boxes, // to update the filament colors of the selection boxes, // to update the "dirty" flags of the selection boxes, -// to uddate number of "filament" selection boxes when the number of extruders change. +// to update number of "filament" selection boxes when the number of extruders change. void Tab::on_presets_changed() { + // Instead of PostEvent (EVT_TAB_PRESETS_CHANGED) just call update_presets + wxGetApp().plater()->sidebar().update_presets(m_type); + update_preset_description_line(); + // Printer selected at the Printer tab, update "compatible" marks at the print and filament selectors. for (auto t: m_dependent_tabs) { @@ -841,16 +830,6 @@ void Tab::on_presets_changed() // clear m_dependent_tabs after first update from select_preset() // to avoid needless preset loading from update() function m_dependent_tabs.clear(); - - // #ys_FIXME_to_delete -// wxCommandEvent event(EVT_TAB_PRESETS_CHANGED); -// event.SetEventObject(this); -// wxPostEvent(this, event); - - // Instead of PostEvent (EVT_TAB_PRESETS_CHANGED) just call update_presets - wxGetApp().plater()->sidebar().update_presets(m_type); - - update_preset_description_line(); } void Tab::update_preset_description_line() From dec1c6ecfb2936610b00f20b9ece0a5350e87db7 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 13 Mar 2019 13:37:36 +0100 Subject: [PATCH 116/236] Typo fixed --- src/slic3r/GUI/Plater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6fb21e17b..64d189859 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -601,7 +601,7 @@ Sidebar::Sidebar(Plater *parent) is_msw = true; #else - presets_panel = p->scrolled; + p->presets_panel = p->scrolled; #endif //__WINDOWS__ p->sizer_filaments = new wxBoxSizer(wxVERTICAL); From 77964de9f24dab24c811ae293d9775e0c080d59a Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 13 Mar 2019 14:04:59 +0100 Subject: [PATCH 117/236] Update of ModelVolume::m_is_splittable moved inside ModelVolume itself --- src/libslic3r/Model.cpp | 9 +++++++++ src/libslic3r/Model.hpp | 5 ++--- src/slic3r/GUI/GUI_ObjectList.cpp | 7 +------ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 9c5f8c826..606bcd6f0 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1456,6 +1456,15 @@ int ModelVolume::extruder_id() const return extruder_id; } +bool ModelVolume::is_splittable() const +{ + // the call mesh.has_multiple_patches() is expensive, so cache the value to calculate it only once + if (m_is_splittable == -1) + m_is_splittable = (int)mesh.has_multiple_patches(); + + return m_is_splittable == 1; +} + void ModelVolume::center_geometry() { #if ENABLE_VOLUMES_CENTERING_FIXES diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index a4b32d93f..432e49220 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -336,8 +336,7 @@ public: // Extruder ID is only valid for FFF. Returns -1 for SLA or if the extruder ID is not applicable (support volumes). int extruder_id() const; - void set_splittable(const int val) { m_is_splittable = val; } - int is_splittable() const { return m_is_splittable; } + bool is_splittable() const; // Split this volume, append the result to the object owning this volume. // Return the number of volumes created from this one. @@ -417,7 +416,7 @@ private: // -1 -> is unknown value (before first cheking) // 0 -> is not splittable // 1 -> is splittable - int m_is_splittable {-1}; + mutable int m_is_splittable{ -1 }; ModelVolume(ModelObject *object, const TriangleMesh &mesh) : mesh(mesh), m_type(ModelVolumeType::MODEL_PART), object(object) { diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 6a605a667..494467f79 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1519,12 +1519,7 @@ bool ObjectList::is_splittable() if (!get_volume_by_item(item, volume) || !volume) return false; - int splittable = volume->is_splittable(); - if (splittable == -1) { - splittable = (int)volume->mesh.has_multiple_patches(); - volume->set_splittable(splittable); - } - return splittable != 0; + return volume->is_splittable(); } bool ObjectList::selected_instances_of_same_object() From 973fafab2fa76660e3103277fc944bac930501ee Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 13 Mar 2019 14:35:09 +0100 Subject: [PATCH 118/236] Removed unused members from View3D and unused parameters from Preview::Init() --- src/slic3r/GUI/GUI_Preview.cpp | 12 +++--------- src/slic3r/GUI/GUI_Preview.hpp | 6 +----- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 57ede0a96..6f177d8b4 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -33,9 +33,6 @@ namespace GUI { #if !ENABLE_IMGUI , m_gizmo_widget(nullptr) #endif // !ENABLE_IMGUI - , m_model(nullptr) - , m_config(nullptr) - , m_process(nullptr) { init(parent, bed, camera, view_toolbar, model, config, process); } @@ -202,18 +199,15 @@ Preview::Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_t , m_enabled(false) , m_schedule_background_process(schedule_background_process_func) { - if (init(parent, bed, camera, view_toolbar, config, process, gcode_preview_data)) + if (init(parent, bed, camera, view_toolbar)) { show_hide_ui_elements("none"); load_print(); } } -bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data) +bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar) { - if ((config == nullptr) || (process == nullptr) || (gcode_preview_data == nullptr)) - return false; - if (!Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 /* disable wxTAB_TRAVERSAL */)) return false; @@ -222,7 +216,7 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view m_canvas = _3DScene::get_canvas(this->m_canvas_widget); m_canvas->allow_multisample(GLCanvas3DManager::can_multisample()); m_canvas->set_config(m_config); - m_canvas->set_process(process); + m_canvas->set_process(m_process); m_canvas->enable_legend_texture(true); m_canvas->enable_dynamic_background(true); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 05f9fc2ca..c15aad3b3 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -39,10 +39,6 @@ class View3D : public wxPanel wxPanel* m_gizmo_widget; #endif // !ENABLE_IMGUI - Model* m_model; - DynamicPrintConfig* m_config; - BackgroundSlicingProcess* m_process; - public: View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); virtual ~View3D(); @@ -124,7 +120,7 @@ public: void refresh_print(); private: - bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data); + bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); void bind_event_handlers(); void unbind_event_handlers(); From 3c62c0d595d763a1d3358689f911dcaf827bb169 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 13 Mar 2019 14:44:59 +0100 Subject: [PATCH 119/236] imgui: Fix mouse button state while dragging --- src/slic3r/GUI/ImGuiWrapper.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 9e75eb2ff..aeb74d2f0 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -107,11 +107,11 @@ bool ImGuiWrapper::update_mouse_data(wxMouseEvent& evt) ImGuiIO& io = ImGui::GetIO(); io.MousePos = ImVec2((float)evt.GetX(), (float)evt.GetY()); - io.MouseDown[0] = evt.LeftDown(); - io.MouseDown[1] = evt.RightDown(); - io.MouseDown[2] = evt.MiddleDown(); + io.MouseDown[0] = evt.LeftIsDown(); + io.MouseDown[1] = evt.RightIsDown(); + io.MouseDown[2] = evt.MiddleIsDown(); - unsigned buttons = (evt.LeftDown() ? 1 : 0) | (evt.RightDown() ? 2 : 0) | (evt.MiddleDown() ? 4 : 0); + unsigned buttons = (evt.LeftIsDown() ? 1 : 0) | (evt.RightIsDown() ? 2 : 0) | (evt.MiddleIsDown() ? 4 : 0); m_mouse_buttons = buttons; new_frame(); From 88f93a0b448744de2904fc251fcbaccc041f71a7 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 13 Mar 2019 14:50:32 +0100 Subject: [PATCH 120/236] imgui: Slider style --- src/slic3r/GUI/ImGuiWrapper.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index aeb74d2f0..0050b6463 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -441,6 +441,10 @@ void ImGuiWrapper::init_style() set_color(ImGuiCol_Header, COL_ORANGE_DARK); set_color(ImGuiCol_HeaderHovered, COL_ORANGE_LIGHT); set_color(ImGuiCol_HeaderActive, COL_ORANGE_LIGHT); + + // Slider + set_color(ImGuiCol_SliderGrab, COL_ORANGE_DARK); + set_color(ImGuiCol_SliderGrabActive, COL_ORANGE_LIGHT); } void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) From 46d19aa52dc4923ccbb87c4c5e7e550605c928a4 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 13 Mar 2019 15:34:27 +0100 Subject: [PATCH 121/236] Added function for the updating of the Error icon after a fix through the NetFabb --- src/slic3r/GUI/GUI_ObjectList.cpp | 42 +++++++++++++++++++++++-------- src/slic3r/GUI/GUI_ObjectList.hpp | 1 + src/slic3r/GUI/Tab.cpp | 4 +-- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 494467f79..04fb9b7ca 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -427,10 +427,8 @@ void ObjectList::OnContextMenu(wxDataViewEvent&) else if (title == _("Name") && pt.x >15 && m_objects_model->GetBitmap(item).GetRefData() == m_bmp_manifold_warning.GetRefData()) { - if (is_windows10()) { - const auto obj_idx = m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)); - wxGetApp().plater()->fix_through_netfabb(obj_idx); - } + if (is_windows10()) + fix_through_netfabb(); } #ifndef __WXMSW__ GetMainWindow()->SetToolTip(""); // hide tooltip @@ -2272,13 +2270,37 @@ void ObjectList::fix_through_netfabb() const if (!item) return; - ItemType type = m_objects_model->GetItemType(item); + const ItemType type = m_objects_model->GetItemType(item); + + const int obj_idx = type & itObject ? m_objects_model->GetIdByItem(item) : + type & itVolume ? m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)) : -1; + + const int vol_idx = type & itVolume ? m_objects_model->GetVolumeIdByItem(item) : -1; + + wxGetApp().plater()->fix_through_netfabb(obj_idx, vol_idx); - if (type & itObject) - wxGetApp().plater()->fix_through_netfabb(m_objects_model->GetIdByItem(item)); - else if (type & itVolume) - wxGetApp().plater()->fix_through_netfabb(m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)), - m_objects_model->GetVolumeIdByItem(item)); + update_item_error_icon(obj_idx, vol_idx); +} + +void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) const +{ + const wxDataViewItem item = vol_idx <0 ? m_objects_model->GetItemById(obj_idx) : + m_objects_model->GetItemByVolumeId(obj_idx, vol_idx); + if (!item) + return; + + auto model_object = (*m_objects)[obj_idx]; + + const stl_stats& stats = model_object->volumes[vol_idx<0 ? 0 : vol_idx]->mesh.stl.stats; + const int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + + stats.facets_added + stats.facets_reversed + stats.backwards_edges; + + if (errors == 0) { + // delete Error_icon if all errors are fixed + wxVariant variant; + variant << PrusaDataViewBitmapText(from_u8(model_object->name), wxNullBitmap); + m_objects_model->SetValue(variant, item, 0); + } } void ObjectList::ItemValueChanged(wxDataViewEvent &event) diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 762020bda..a4df67497 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -270,6 +270,7 @@ public: void split_instances(); void rename_item(); void fix_through_netfabb() const; + void update_item_error_icon(const int obj_idx, int vol_idx) const ; private: void OnChar(wxKeyEvent& event); void OnContextMenu(wxDataViewEvent &event); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index c75618132..56af8b4f9 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2455,7 +2455,7 @@ void Tab::load_current_preset() //Regerenerate content of the page tree. void Tab::rebuild_page_tree(bool tree_sel_change_event /*= false*/) { - Freeze(); +// Freeze(); // get label of the currently selected item const auto sel_item = m_treectrl->GetSelection(); @@ -2481,7 +2481,7 @@ void Tab::rebuild_page_tree(bool tree_sel_change_event /*= false*/) // this is triggered on first load, so we don't disable the sel change event m_treectrl->SelectItem(m_treectrl->GetFirstVisibleItem());//! (treectrl->GetFirstChild(rootItem)); } - Thaw(); +// Thaw(); } void Tab::update_page_tree_visibility() From 2750a8113da30d582aff830d02845a99b3619fbd Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 13 Mar 2019 14:32:09 +0100 Subject: [PATCH 122/236] SLA gizmo now shows arrows pointing at the points so they are easy to see --- src/slic3r/GUI/GLGizmo.cpp | 101 +++++++++++++++++++++++++------------ src/slic3r/GUI/GLGizmo.hpp | 15 +++++- 2 files changed, 83 insertions(+), 33 deletions(-) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index fc91dff2d..a87cb68fb 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -1873,8 +1873,8 @@ void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, b float render_color[3]; for (int i = 0; i < (int)m_editing_mode_cache.size(); ++i) { - const sla::SupportPoint& support_point = m_editing_mode_cache[i].first; - const bool& point_selected = m_editing_mode_cache[i].second; + const sla::SupportPoint& support_point = m_editing_mode_cache[i].support_point; + const bool& point_selected = m_editing_mode_cache[i].selected; // First decide about the color of the point. if (picking) { @@ -1889,7 +1889,7 @@ void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, b render_color[2] = 1.0f; } else { // neigher hover nor picking - bool supports_new_island = m_lock_unique_islands && m_editing_mode_cache[i].first.is_new_island; + bool supports_new_island = m_lock_unique_islands && m_editing_mode_cache[i].support_point.is_new_island; if (m_editing_mode) { render_color[0] = point_selected ? 1.0f : (supports_new_island ? 0.3f : 0.7f); render_color[1] = point_selected ? 0.3f : (supports_new_island ? 0.3f : 0.7f); @@ -1903,12 +1903,32 @@ void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, b float render_color_emissive[4] = { 0.5f * render_color[0], 0.5f * render_color[1], 0.5f * render_color[2], 1.f}; ::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive); - // Now render the sphere. Inverse matrix of the instance scaling is applied so that the - // sphere does not scale with the object. + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. ::glPushMatrix(); ::glTranslated(support_point.pos(0), support_point.pos(1), support_point.pos(2)); ::glMultMatrixd(instance_scaling_matrix_inverse.data()); - ::gluSphere(m_quadric, m_editing_mode_cache[i].first.head_front_radius * RenderPointScale, 64, 36); + + // Matrices set, we can render the point mark now. + // If in editing mode, we'll also render a cone pointing to the sphere. + if (m_editing_mode) { + if (m_editing_mode_cache[i].normal == Vec3f::Zero()) + update_cache_entry_normal(i); // in case the normal is not yet cached, find and cache it + + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_mode_cache[i].normal.cast()); + Eigen::AngleAxisd aa(q); + ::glRotated(aa.angle() * (180./M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2)); + + const float cone_radius = 0.25f; // mm + const float cone_height = 0.75f; + ::glPushMatrix(); + ::glTranslatef(0.f, 0.f, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale); + ::gluCylinder(m_quadric, 0.f, cone_radius, cone_height, 36, 1); + ::glTranslatef(0.f, 0.f, cone_height); + ::gluDisk(m_quadric, 0.0, cone_radius, 36, 1); + ::glPopMatrix(); + } + ::gluSphere(m_quadric, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale, 64, 36); ::glPopMatrix(); } @@ -1957,7 +1977,7 @@ void GLGizmoSlaSupports::update_mesh() m_AABB.init(m_V, m_F); } -Vec3f GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) +std::pair GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) { // if the gizmo doesn't have the V, F structures for igl, calculate them first: if (m_V.size() == 0) @@ -1992,9 +2012,16 @@ Vec3f GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) if (!m_AABB.intersect_ray(m_V, m_F, point1.cast(), (point2-point1).cast(), hit)) throw std::invalid_argument("unproject_on_mesh(): No intersection found."); - int fid = hit.id; - Vec3f bc(1-hit.u-hit.v, hit.u, hit.v); - return bc(0) * m_V.row(m_F(fid, 0)) + bc(1) * m_V.row(m_F(fid, 1)) + bc(2)*m_V.row(m_F(fid, 2)); + int fid = hit.id; // facet id + Vec3f bc(1-hit.u-hit.v, hit.u, hit.v); // barycentric coordinates of the hit + Vec3f a = (m_V.row(m_F(fid, 1)) - m_V.row(m_F(fid, 0))); + Vec3f b = (m_V.row(m_F(fid, 2)) - m_V.row(m_F(fid, 0))); + + // Calculate and return both the point and the facet normal. + return std::make_pair( + bc(0) * m_V.row(m_F(fid, 0)) + bc(1) * m_V.row(m_F(fid, 1)) + bc(2)*m_V.row(m_F(fid, 2)), + a.cross(b) + ); } // Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. @@ -2046,10 +2073,9 @@ bool GLGizmoSlaSupports::mouse_event(SLAGizmoEventType action, const Vec2d& mous // If there is some selection, don't add new point and deselect everything instead. if (m_selection_empty) { - Vec3f new_pos; try { - new_pos = unproject_on_mesh(mouse_position); // this can throw - we don't want to create a new point in that case - m_editing_mode_cache.emplace_back(std::make_pair(sla::SupportPoint(new_pos, m_new_point_head_diameter/2.f, false), false)); + std::pair pos_and_normal = unproject_on_mesh(mouse_position); // don't create anything if this throws + m_editing_mode_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); m_unsaved_changes = true; } catch (...) { // not clicked on object @@ -2090,7 +2116,7 @@ bool GLGizmoSlaSupports::mouse_event(SLAGizmoEventType action, const Vec2d& mous // Iterate over all points, check if they're in the rectangle and if so, check that they are not obscured by the mesh: for (unsigned int i=0; i() * support_point.pos; pos(2) += z_offset; GLdouble out_x, out_y, out_z; @@ -2166,7 +2192,7 @@ bool GLGizmoSlaSupports::mouse_event(SLAGizmoEventType action, const Vec2d& mous void GLGizmoSlaSupports::delete_selected_points(bool force) { for (unsigned int idx=0; idx pos_and_normal; try { - new_pos = unproject_on_mesh(Vec2d((*data.mouse_pos)(0), (*data.mouse_pos)(1))); + pos_and_normal = unproject_on_mesh(Vec2d((*data.mouse_pos)(0), (*data.mouse_pos)(1))); } catch (...) { return; } - m_editing_mode_cache[m_hover_id].first.pos = new_pos; - m_editing_mode_cache[m_hover_id].first.is_new_island = false; + m_editing_mode_cache[m_hover_id].support_point.pos = pos_and_normal.first; + m_editing_mode_cache[m_hover_id].support_point.is_new_island = false; + m_editing_mode_cache[m_hover_id].normal = pos_and_normal.second; m_unsaved_changes = true; // Do not update immediately, wait until the mouse is released. // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); @@ -2255,6 +2282,18 @@ std::vector GLGizmoSlaSupports::get_config_options(const st } +void GLGizmoSlaSupports::update_cache_entry_normal(unsigned int i) const +{ + int idx = 0; + Eigen::Matrix pp = m_editing_mode_cache[i].support_point.pos; + Eigen::Matrix cc; + m_AABB.squared_distance(m_V, m_F, pp, idx, cc); + Vec3f a = (m_V.row(m_F(idx, 1)) - m_V.row(m_F(idx, 0))); + Vec3f b = (m_V.row(m_F(idx, 2)) - m_V.row(m_F(idx, 0))); + m_editing_mode_cache[i].normal = a.cross(b); +} + + #if ENABLE_IMGUI void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) @@ -2295,9 +2334,9 @@ RENDER_AGAIN: ImGui::SameLine(); if (ImGui::SliderFloat("", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f")) { // value was changed - for (auto& point_and_selection : m_editing_mode_cache) - if (point_and_selection.second) { - point_and_selection.first.head_front_radius = m_new_point_head_diameter / 2.f; + for (auto& cache_entry : m_editing_mode_cache) + if (cache_entry.selected) { + cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; m_unsaved_changes = true; } } @@ -2480,16 +2519,16 @@ void GLGizmoSlaSupports::select_point(int i) { if (i == AllPoints || i == NoPoints) { for (auto& point_and_selection : m_editing_mode_cache) - point_and_selection.second = ( i == AllPoints ); + point_and_selection.selected = ( i == AllPoints ); m_selection_empty = (i == NoPoints); if (i == AllPoints) - m_new_point_head_diameter = m_editing_mode_cache[0].first.head_front_radius * 2.f; + m_new_point_head_diameter = m_editing_mode_cache[0].support_point.head_front_radius * 2.f; } else { - m_editing_mode_cache[i].second = true; + m_editing_mode_cache[i].selected = true; m_selection_empty = false; - m_new_point_head_diameter = m_editing_mode_cache[i].first.head_front_radius * 2.f; + m_new_point_head_diameter = m_editing_mode_cache[i].support_point.head_front_radius * 2.f; } } @@ -2499,7 +2538,7 @@ void GLGizmoSlaSupports::editing_mode_discard_changes() { m_editing_mode_cache.clear(); for (const sla::SupportPoint& point : m_model_object->sla_support_points) - m_editing_mode_cache.push_back(std::make_pair(point, false)); + m_editing_mode_cache.emplace_back(point, false); m_editing_mode = false; m_unsaved_changes = false; } @@ -2513,8 +2552,8 @@ void GLGizmoSlaSupports::editing_mode_apply_changes() if (m_unsaved_changes) { m_model_object->sla_points_status = sla::PointsStatus::UserModified; m_model_object->sla_support_points.clear(); - for (const std::pair& point_and_selection : m_editing_mode_cache) - m_model_object->sla_support_points.push_back(point_and_selection.first); + for (const CacheEntry& cache_entry : m_editing_mode_cache) + m_model_object->sla_support_points.push_back(cache_entry.support_point); // Recalculate support structures once the editing mode is left. // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); @@ -2531,7 +2570,7 @@ void GLGizmoSlaSupports::editing_mode_reload_cache() { m_editing_mode_cache.clear(); for (const sla::SupportPoint& point : m_model_object->sla_support_points) - m_editing_mode_cache.push_back(std::make_pair(point, false)); + m_editing_mode_cache.emplace_back(point, false); m_unsaved_changes = false; } diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp index c0690b8bc..a872a161e 100644 --- a/src/slic3r/GUI/GLGizmo.hpp +++ b/src/slic3r/GUI/GLGizmo.hpp @@ -471,7 +471,7 @@ private: ModelObject* m_old_model_object = nullptr; int m_active_instance = -1; int m_old_instance_id = -1; - Vec3f unproject_on_mesh(const Vec2d& mouse_pos); + std::pair unproject_on_mesh(const Vec2d& mouse_pos); const float RenderPointScale = 1.f; @@ -484,6 +484,16 @@ private: Geometry::Transformation transformation; }; + class CacheEntry { + public: + CacheEntry(const sla::SupportPoint& point, bool sel, const Vec3f& norm = Vec3f::Zero()) : + support_point(point), selected(sel), normal(norm) {} + + sla::SupportPoint support_point; + bool selected; // whether the point is selected + Vec3f normal; + }; + // This holds information to decide whether recalculation is necessary: SourceDataSummary m_source_data; @@ -510,6 +520,7 @@ private: void render_points(const GLCanvas3D::Selection& selection, bool picking = false) const; bool is_mesh_update_necessary() const; void update_mesh(); + void update_cache_entry_normal(unsigned int i) const; #if !ENABLE_IMGUI void render_tooltip_texture() const; @@ -523,7 +534,7 @@ private: float m_new_point_head_diameter; // Size of a new point. float m_minimal_point_distance = 20.f; float m_density = 100.f; - std::vector> m_editing_mode_cache; // a support point and whether it is currently selected + mutable std::vector m_editing_mode_cache; // a support point and whether it is currently selected bool m_selection_rectangle_active = false; Vec2d m_selection_rectangle_start_corner; From 18025cc669c2b855b23a451bad230f15ef266697 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 13 Mar 2019 15:44:50 +0100 Subject: [PATCH 123/236] Reworked the command line interface based on the current state of the upstream. Thanks @alexrj, @lordofhyphens for the original code of slic3r.cpp --- src/admesh/shared.cpp | 6 +- src/admesh/stl.h | 8 +- src/admesh/stl_io.cpp | 2 +- src/libslic3r/Config.cpp | 165 +++++-- src/libslic3r/Config.hpp | 101 ++++- src/libslic3r/Format/OBJ.cpp | 19 + src/libslic3r/Format/OBJ.hpp | 4 + src/libslic3r/Format/STL.cpp | 6 + src/libslic3r/Format/STL.hpp | 1 + src/libslic3r/Model.cpp | 21 + src/libslic3r/Model.hpp | 6 + src/libslic3r/Print.cpp | 7 +- src/libslic3r/Print.hpp | 4 +- src/libslic3r/PrintConfig.cpp | 312 ++++++++----- src/libslic3r/PrintConfig.hpp | 89 +--- src/libslic3r/SLAPrint.cpp | 145 ++++--- src/libslic3r/TriangleMesh.cpp | 9 +- src/libslic3r/TriangleMesh.hpp | 2 +- src/slic3r.cpp | 746 +++++++++++++++++++++++--------- src/slic3r/GUI/PresetBundle.cpp | 2 +- xs/src/perlglue.cpp | 4 + xs/xsp/Config.xsp | 2 + 22 files changed, 1131 insertions(+), 530 deletions(-) diff --git a/src/admesh/shared.cpp b/src/admesh/shared.cpp index 91bb82e00..c8c17ccd5 100644 --- a/src/admesh/shared.cpp +++ b/src/admesh/shared.cpp @@ -143,7 +143,7 @@ stl_generate_shared_vertices(stl_file *stl) { } void -stl_write_off(stl_file *stl, char *file) { +stl_write_off(stl_file *stl, const char *file) { int i; FILE *fp; char *error_msg; @@ -179,7 +179,7 @@ stl_write_off(stl_file *stl, char *file) { } void -stl_write_vrml(stl_file *stl, char *file) { +stl_write_vrml(stl_file *stl, const char *file) { int i; FILE *fp; char *error_msg; @@ -236,7 +236,7 @@ stl_write_vrml(stl_file *stl, char *file) { fclose(fp); } -void stl_write_obj (stl_file *stl, char *file) { +void stl_write_obj (stl_file *stl, const char *file) { int i; FILE* fp; diff --git a/src/admesh/stl.h b/src/admesh/stl.h index 9c71f00f6..afff3deac 100644 --- a/src/admesh/stl.h +++ b/src/admesh/stl.h @@ -177,10 +177,10 @@ extern void stl_transform(stl_file *stl, const Eigen::Transformvertex[1] - facet->vertex[0]).cross(facet->vertex[2] - facet->vertex[0]); } diff --git a/src/admesh/stl_io.cpp b/src/admesh/stl_io.cpp index 81e29d286..71e434cbc 100644 --- a/src/admesh/stl_io.cpp +++ b/src/admesh/stl_io.cpp @@ -365,7 +365,7 @@ stl_write_quad_object(stl_file *stl, char *file) { } void -stl_write_dxf(stl_file *stl, char *file, char *label) { +stl_write_dxf(stl_file *stl, const char *file, char *label) { int i; FILE *fp; char *error_msg; diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 6f22ba89e..e7984e6cc 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -190,6 +190,110 @@ bool unescape_strings_cstyle(const std::string &str, std::vector &o } } +std::vector ConfigOptionDef::cli_args() const +{ + std::string cli = this->cli.substr(0, this->cli.find("=")); + boost::trim_right_if(cli, boost::is_any_of("!")); + std::vector args; + boost::split(args, cli, boost::is_any_of("|")); + return args; +} + +std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults) const +{ + // prepare a function for wrapping text + auto wrap = [](std::string text, size_t line_length) -> std::string { + std::istringstream words(text); + std::ostringstream wrapped; + std::string word; + + if (words >> word) { + wrapped << word; + size_t space_left = line_length - word.length(); + while (words >> word) { + if (space_left < word.length() + 1) { + wrapped << '\n' << word; + space_left = line_length - word.length(); + } else { + wrapped << ' ' << word; + space_left -= word.length() + 1; + } + } + } + return wrapped.str(); + }; + + // get the unique categories + std::set categories; + for (const auto& opt : this->options) { + const ConfigOptionDef& def = opt.second; + categories.insert(def.category); + } + + for (auto category : categories) { + if (category != "") { + out << category << ":" << std::endl; + } else if (categories.size() > 1) { + out << "Misc options:" << std::endl; + } + + for (const auto& opt : this->options) { + const ConfigOptionDef& def = opt.second; + if (def.category != category) continue; + + if (!def.cli.empty()) { + // get all possible variations: --foo, --foobar, -f... + auto cli_args = def.cli_args(); + for (auto& arg : cli_args) { + arg.insert(0, (arg.size() == 1) ? "-" : "--"); + if (def.type == coFloat || def.type == coInt || def.type == coFloatOrPercent + || def.type == coFloats || def.type == coInts) { + arg += " N"; + } else if (def.type == coPoint) { + arg += " X,Y"; + } else if (def.type == coPoint3) { + arg += " X,Y,Z"; + } else if (def.type == coString || def.type == coStrings) { + arg += " ABCD"; + } + } + + // left: command line options + const std::string cli = boost::algorithm::join(cli_args, ", "); + out << " " << std::left << std::setw(20) << cli; + + // right: option description + std::string descr = def.tooltip; + if (show_defaults && def.default_value != nullptr && def.type != coBool + && (def.type != coString || !def.default_value->serialize().empty())) { + descr += " ("; + if (!def.sidetext.empty()) { + descr += def.sidetext + ", "; + } else if (!def.enum_values.empty()) { + descr += boost::algorithm::join(def.enum_values, ", ") + "; "; + } + descr += "default: " + def.default_value->serialize() + ")"; + } + + // wrap lines of description + descr = wrap(descr, 80); + std::vector lines; + boost::split(lines, descr, boost::is_any_of("\n")); + + // if command line options are too long, print description in new line + for (size_t i = 0; i < lines.size(); ++i) { + if (i == 0 && cli.size() > 19) + out << std::endl; + if (i > 0 || cli.size() > 19) + out << std::string(21, ' '); + out << lines[i] << std::endl; + } + } + } + } + return out; +} + void ConfigBase::apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent) { // loop through options and apply them @@ -508,50 +612,53 @@ ConfigOption* DynamicConfig::optptr(const t_config_option_key &opt_key, bool cre // Let the parent decide what to do if the opt_key is not defined by this->def(). return nullptr; ConfigOption *opt = nullptr; - switch (optdef->type) { - case coFloat: opt = new ConfigOptionFloat(); break; - case coFloats: opt = new ConfigOptionFloats(); break; - case coInt: opt = new ConfigOptionInt(); break; - case coInts: opt = new ConfigOptionInts(); break; - case coString: opt = new ConfigOptionString(); break; - case coStrings: opt = new ConfigOptionStrings(); break; - case coPercent: opt = new ConfigOptionPercent(); break; - case coPercents: opt = new ConfigOptionPercents(); break; - case coFloatOrPercent: opt = new ConfigOptionFloatOrPercent(); break; - case coPoint: opt = new ConfigOptionPoint(); break; - case coPoints: opt = new ConfigOptionPoints(); break; - case coBool: opt = new ConfigOptionBool(); break; - case coBools: opt = new ConfigOptionBools(); break; - case coEnum: opt = new ConfigOptionEnumGeneric(optdef->enum_keys_map); break; - default: throw std::runtime_error(std::string("Unknown option type for option ") + opt_key); + if (optdef->default_value != nullptr) { + opt = (optdef->default_value->type() == coEnum) ? + // Special case: For a DynamicConfig, convert a templated enum to a generic enum. + new ConfigOptionEnumGeneric(optdef->enum_keys_map, optdef->default_value->getInt()) : + optdef->default_value->clone(); + } else { + switch (optdef->type) { + case coFloat: opt = new ConfigOptionFloat(); break; + case coFloats: opt = new ConfigOptionFloats(); break; + case coInt: opt = new ConfigOptionInt(); break; + case coInts: opt = new ConfigOptionInts(); break; + case coString: opt = new ConfigOptionString(); break; + case coStrings: opt = new ConfigOptionStrings(); break; + case coPercent: opt = new ConfigOptionPercent(); break; + case coPercents: opt = new ConfigOptionPercents(); break; + case coFloatOrPercent: opt = new ConfigOptionFloatOrPercent(); break; + case coPoint: opt = new ConfigOptionPoint(); break; + case coPoints: opt = new ConfigOptionPoints(); break; + case coPoint3: opt = new ConfigOptionPoint3(); break; + // case coPoint3s: opt = new ConfigOptionPoint3s(); break; + case coBool: opt = new ConfigOptionBool(); break; + case coBools: opt = new ConfigOptionBools(); break; + case coEnum: opt = new ConfigOptionEnumGeneric(optdef->enum_keys_map); break; + default: throw std::runtime_error(std::string("Unknown option type for option ") + opt_key); + } } this->options[opt_key] = opt; return opt; } -void DynamicConfig::read_cli(const std::vector &tokens, t_config_option_keys* extra) +void DynamicConfig::read_cli(const std::vector &tokens, t_config_option_keys* extra, t_config_option_keys* keys) { std::vector args; // push a bogus executable name (argv[0]) args.emplace_back(const_cast("")); for (size_t i = 0; i < tokens.size(); ++ i) args.emplace_back(const_cast(tokens[i].c_str())); - this->read_cli(int(args.size()), &args[0], extra); + this->read_cli(int(args.size()), &args[0], extra, keys); } -bool DynamicConfig::read_cli(int argc, char** argv, t_config_option_keys* extra) +bool DynamicConfig::read_cli(int argc, char** argv, t_config_option_keys* extra, t_config_option_keys* keys) { // cache the CLI option => opt_key mapping std::map opts; - for (const auto &oit : this->def()->options) { - std::string cli = oit.second.cli; - cli = cli.substr(0, cli.find("=")); - boost::trim_right_if(cli, boost::is_any_of("!")); - std::vector tokens; - boost::split(tokens, cli, boost::is_any_of("|")); - for (const std::string &t : tokens) + for (const auto &oit : this->def()->options) + for (auto t : oit.second.cli_args()) opts[t] = oit.first; - } bool parse_options = true; for (int i = 1; i < argc; ++ i) { @@ -611,6 +718,10 @@ bool DynamicConfig::read_cli(int argc, char** argv, t_config_option_keys* extra) } // Store the option value. const bool existing = this->has(opt_key); + if (keys != nullptr && !existing) { + // Save the order of detected keys. + keys->push_back(opt_key); + } ConfigOption *opt_base = this->option(opt_key, true); ConfigOptionVectorBase *opt_vector = opt_base->is_vector() ? static_cast(opt_base) : nullptr; if (opt_vector) { diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index c521f1cbb..6fb8cb0c1 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -27,6 +27,24 @@ extern std::string escape_strings_cstyle(const std::vector &strs); extern bool unescape_string_cstyle(const std::string &str, std::string &out); extern bool unescape_strings_cstyle(const std::string &str, std::vector &out); +/// Specialization of std::exception to indicate that an unknown config option has been encountered. +class UnknownOptionException : public std::runtime_error { +public: + UnknownOptionException() : + std::runtime_error("Unknown option exception") {} + UnknownOptionException(const std::string &opt_key) : + std::runtime_error(std::string("Unknown option exception: ") + opt_key) {} +}; + +/// Indicate that the ConfigBase derived class does not provide config definition (the method def() returns null). +class NoDefinitionException : public std::runtime_error +{ +public: + NoDefinitionException() : + std::runtime_error("No definition exception") {} + NoDefinitionException(const std::string &opt_key) : + std::runtime_error(std::string("No definition exception: ") + opt_key) {} +}; // Type of a configuration value. enum ConfigOptionType { @@ -54,12 +72,14 @@ enum ConfigOptionType { coPoint = 6, // vector of 2d points (Point2f). Currently used for the definition of the print bed and for the extruder offsets. coPoints = coPoint + coVectorType, + coPoint3 = 7, +// coPoint3s = coPoint3 + coVectorType, // single boolean value - coBool = 7, + coBool = 8, // vector of boolean values coBools = coBool + coVectorType, // a generic enum - coEnum = 8, + coEnum = 9, }; enum ConfigOptionMode { @@ -718,6 +738,39 @@ public: } }; + +class ConfigOptionPoint3 : public ConfigOptionSingle +{ +public: + ConfigOptionPoint3() : ConfigOptionSingle(Vec3d(0,0,0)) {} + explicit ConfigOptionPoint3(const Vec3d &value) : ConfigOptionSingle(value) {} + + static ConfigOptionType static_type() { return coPoint3; } + ConfigOptionType type() const override { return static_type(); } + ConfigOption* clone() const override { return new ConfigOptionPoint3(*this); } + ConfigOptionPoint3& operator=(const ConfigOption *opt) { this->set(opt); return *this; } + bool operator==(const ConfigOptionPoint3 &rhs) const { return this->value == rhs.value; } + + std::string serialize() const override + { + std::ostringstream ss; + ss << this->value(0); + ss << ","; + ss << this->value(1); + ss << ","; + ss << this->value(2); + return ss.str(); + } + + bool deserialize(const std::string &str, bool append = false) override + { + UNUSED(append); + char dummy; + return sscanf(str.data(), " %lf , %lf , %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 2 || + sscanf(str.data(), " %lf x %lf x %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 2; + } +}; + class ConfigOptionBool : public ConfigOptionSingle { public: @@ -893,6 +946,7 @@ class ConfigOptionEnumGeneric : public ConfigOptionInt { public: ConfigOptionEnumGeneric(const t_config_enum_values* keys_map = nullptr) : keys_map(keys_map) {} + explicit ConfigOptionEnumGeneric(const t_config_enum_values* keys_map, int value) : ConfigOptionInt(value), keys_map(keys_map) {} const t_config_enum_values* keys_map; @@ -1010,6 +1064,9 @@ public: return true; return false; } + + /// Returns the alternative CLI arguments for the given option. + std::vector cli_args() const; }; // Map from a config option name to its definition. @@ -1044,6 +1101,9 @@ public: return out; } + /// Iterate through all of the CLI options and write them to a stream. + std::ostream& print_cli_help(std::ostream& out, bool show_defaults) const; + protected: ConfigOptionDef* add(const t_config_option_key &opt_key, ConfigOptionType type) { ConfigOptionDef* opt = &this->options[opt_key]; @@ -1089,12 +1149,24 @@ public: TYPE* option(const t_config_option_key &opt_key, bool create = false) { ConfigOption *opt = this->optptr(opt_key, create); -// assert(opt == nullptr || opt->type() == TYPE::static_type()); return (opt == nullptr || opt->type() != TYPE::static_type()) ? nullptr : static_cast(opt); } template const TYPE* option(const t_config_option_key &opt_key) const { return const_cast(this)->option(opt_key, false); } + template + TYPE* option_throw(const t_config_option_key &opt_key, bool create = false) + { + ConfigOption *opt = this->optptr(opt_key, create); + if (opt == nullptr) + throw UnknownOptionException(opt_key); + if (opt->type() != TYPE::static_type()) + throw std::runtime_error("Conversion to a wrong type"); + return static_cast(opt); + } + template + const TYPE* option_throw(const t_config_option_key &opt_key) const + { return const_cast(this)->option_throw(opt_key, false); } // Apply all keys of other ConfigBase defined by this->def() to this ConfigBase. // An UnknownOptionException is thrown in case some option keys of other are not defined by this->def(), // or this ConfigBase is of a StaticConfig type and it does not support some of the keys, and ignore_nonexistent is not set. @@ -1276,8 +1348,8 @@ public: bool opt_bool(const t_config_option_key &opt_key, unsigned int idx) const { return this->option(opt_key)->get_at(idx) != 0; } // Command line processing - void read_cli(const std::vector &tokens, t_config_option_keys* extra); - bool read_cli(int argc, char** argv, t_config_option_keys* extra); + void read_cli(const std::vector &tokens, t_config_option_keys* extra, t_config_option_keys* keys = nullptr); + bool read_cli(int argc, char** argv, t_config_option_keys* extra, t_config_option_keys* keys = nullptr); typedef std::map t_options_map; t_options_map::const_iterator cbegin() const { return options.cbegin(); } @@ -1303,25 +1375,6 @@ protected: void set_defaults(); }; -/// Specialization of std::exception to indicate that an unknown config option has been encountered. -class UnknownOptionException : public std::runtime_error { -public: - UnknownOptionException() : - std::runtime_error("Unknown option exception") {} - UnknownOptionException(const std::string &opt_key) : - std::runtime_error(std::string("Unknown option exception: ") + opt_key) {} -}; - -/// Indicate that the ConfigBase derived class does not provide config definition (the method def() returns null). -class NoDefinitionException : public std::runtime_error -{ -public: - NoDefinitionException() : - std::runtime_error("No definition exception") {} - NoDefinitionException(const std::string &opt_key) : - std::runtime_error(std::string("No definition exception: ") + opt_key) {} -}; - } #endif diff --git a/src/libslic3r/Format/OBJ.cpp b/src/libslic3r/Format/OBJ.cpp index ee5756083..85ca73551 100644 --- a/src/libslic3r/Format/OBJ.cpp +++ b/src/libslic3r/Format/OBJ.cpp @@ -115,4 +115,23 @@ bool load_obj(const char *path, Model *model, const char *object_name_in) return true; } +bool store_obj(const char *path, TriangleMesh *mesh) +{ + //FIXME returning false even if write failed. + mesh->WriteOBJFile(path); + return true; +} + +bool store_obj(const char *path, ModelObject *model_object) +{ + TriangleMesh mesh = model_object->mesh(); + return store_obj(path, &mesh); +} + +bool store_obj(const char *path, Model *model) +{ + TriangleMesh mesh = model->mesh(); + return store_obj(path, &mesh); +} + }; // namespace Slic3r diff --git a/src/libslic3r/Format/OBJ.hpp b/src/libslic3r/Format/OBJ.hpp index 9a8790bff..36aa17951 100644 --- a/src/libslic3r/Format/OBJ.hpp +++ b/src/libslic3r/Format/OBJ.hpp @@ -9,6 +9,10 @@ class Model; // Load an OBJ file into a provided model. extern bool load_obj(const char *path, Model *model, const char *object_name = nullptr); +extern bool store_obj(const char *path, TriangleMesh *mesh); +extern bool store_obj(const char *path, ModelObject *model); +extern bool store_obj(const char *path, Model *model); + }; // namespace Slic3r #endif /* slic3r_Format_OBJ_hpp_ */ diff --git a/src/libslic3r/Format/STL.cpp b/src/libslic3r/Format/STL.cpp index 99e2ff193..b00623d1d 100644 --- a/src/libslic3r/Format/STL.cpp +++ b/src/libslic3r/Format/STL.cpp @@ -55,4 +55,10 @@ bool store_stl(const char *path, ModelObject *model_object, bool binary) return store_stl(path, &mesh, binary); } +bool store_stl(const char *path, Model *model, bool binary) +{ + TriangleMesh mesh = model->mesh(); + return store_stl(path, &mesh, binary); +} + }; // namespace Slic3r diff --git a/src/libslic3r/Format/STL.hpp b/src/libslic3r/Format/STL.hpp index 2fd32324c..cff7dc086 100644 --- a/src/libslic3r/Format/STL.hpp +++ b/src/libslic3r/Format/STL.hpp @@ -11,6 +11,7 @@ extern bool load_stl(const char *path, Model *model, const char *object_name = n extern bool store_stl(const char *path, TriangleMesh *mesh, bool binary); extern bool store_stl(const char *path, ModelObject *model_object, bool binary); +extern bool store_stl(const char *path, Model *model, bool binary); }; // namespace Slic3r diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 9c5f8c826..473464598 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -577,6 +577,11 @@ end: return input_file; } +std::string Model::propose_export_file_name_and_path(const std::string &new_extension) const +{ + return boost::filesystem::path(this->propose_export_file_name_and_path()).replace_extension(new_extension).string(); +} + ModelObject::~ModelObject() { this->clear_volumes(); @@ -1568,6 +1573,22 @@ void ModelVolume::scale(const Vec3d& scaling_factors) set_scaling_factor(get_scaling_factor().cwiseProduct(scaling_factors)); } +void ModelObject::scale_to_fit(const Vec3d &size) +{ +/* + BoundingBoxf3 instance_bounding_box(size_t instance_idx, bool dont_translate = false) const; + Vec3d orig_size = this->bounding_box().size(); + float factor = fminf( + size.x / orig_size.x, + fminf( + size.y / orig_size.y, + size.z / orig_size.z + ) + ); + this->scale(factor); +*/ +} + void ModelVolume::rotate(double angle, Axis axis) { switch (axis) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index a4b32d93f..3b3bb51d9 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -245,6 +245,10 @@ public: void scale(const Vec3d &versor); void scale(const double s) { this->scale(Vec3d(s, s, s)); } void scale(double x, double y, double z) { this->scale(Vec3d(x, y, z)); } + /// Scale the current ModelObject to fit by altering the scaling factor of ModelInstances. + /// It operates on the total size by duplicating the object according to all the instances. + /// \param size Sizef3 the size vector + void scale_to_fit(const Vec3d &size); void rotate(double angle, Axis axis); void rotate(double angle, const Vec3d& axis); void mirror(Axis axis); @@ -619,6 +623,8 @@ public: // Propose an output file name & path based on the first printable object's name and source input file's path. std::string propose_export_file_name_and_path() const; + // Propose an output path, replace extension. The new_extension shall contain the initial dot. + std::string propose_export_file_name_and_path(const std::string &new_extension) const; private: MODELBASE_DERIVED_PRIVATE_COPY_MOVE(Model) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 8ed70fde6..bd7772f80 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1509,7 +1509,7 @@ void Print::process() // The export_gcode may die for various reasons (fails to process output_filename_format, // write error into the G-code, cannot execute post-processing scripts). // It is up to the caller to show an error message. -void Print::export_gcode(const std::string &path_template, GCodePreviewData *preview_data) +std::string Print::export_gcode(const std::string &path_template, GCodePreviewData *preview_data) { // output everything to a G-code file // The following call may die if the output_filename_format template substitution fails. @@ -1525,6 +1525,7 @@ void Print::export_gcode(const std::string &path_template, GCodePreviewData *pre // The following line may die for multiple reasons. GCode gcode; gcode.do_export(this, path.c_str(), preview_data); + return path.c_str(); } void Print::_make_skirt() @@ -1693,8 +1694,10 @@ void Print::_make_brim() } polygons_append(loops, offset(islands, -0.5f * float(flow.scaled_spacing()))); } - + loops = union_pt_chained(loops, false); + // The function above produces ordering well suited for concentric infill (from outside to inside). + // For Brim, the ordering should be reversed (from inside to outside). std::reverse(loops.begin(), loops.end()); extrusion_entities_append_loops(m_brim.entities, std::move(loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(this->skirt_first_layer_height())); } diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 0eea71046..9e97ab20c 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -297,7 +297,9 @@ public: bool apply_config(DynamicPrintConfig config); void process() override; - void export_gcode(const std::string &path_template, GCodePreviewData *preview_data); + // Exports G-code into a file name based on the path_template, returns the file path of the generated G-code file. + // If preview_data is not null, the preview_data is filled in for the G-code visualization (not used by the command line Slic3r). + std::string export_gcode(const std::string &path_template, GCodePreviewData *preview_data); // methods for handling state bool is_step_done(PrintStep step) const { return Inherited::is_step_done(step); } diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 1c78a3e31..df30761c8 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2955,7 +2955,7 @@ std::string FullPrintConfig::validate() return "--use-firmware-retraction is only supported by Marlin, Smoothie, Repetier and Machinekit firmware"; if (this->use_firmware_retraction.value) - for (bool wipe : this->wipe.values) + for (unsigned char wipe : this->wipe.values) if (wipe) return "--use-firmware-retraction is not compatible with --wipe"; @@ -2999,7 +2999,7 @@ std::string FullPrintConfig::validate() return "Invalid value for --extruder-clearance-height"; // --extrusion-multiplier - for (float em : this->extrusion_multiplier.values) + for (double em : this->extrusion_multiplier.values) if (em <= 0) return "Invalid value for --extrusion-multiplier"; @@ -3100,55 +3100,65 @@ StaticPrintConfig::StaticCache SLAPrintObje StaticPrintConfig::StaticCache SLAPrinterConfig::s_cache_SLAPrinterConfig; StaticPrintConfig::StaticCache SLAFullPrintConfig::s_cache_SLAFullPrintConfig; -CLIConfigDef::CLIConfigDef() +CLIActionsConfigDef::CLIActionsConfigDef() { - ConfigOptionDef *def; + ConfigOptionDef* def; - def = this->add("cut", coFloat); - def->label = L("Cut"); - def->tooltip = L("Cut model at the given Z."); - def->cli = "cut"; - def->default_value = new ConfigOptionFloat(0); - - def = this->add("dont_arrange", coBool); - def->label = L("Dont arrange"); - def->tooltip = L("Don't arrange the objects on the build plate. The model coordinates " - "define the absolute positions on the build plate. " - "The option --center will be ignored."); - def->cli = "dont-arrange"; + // Actions: + def = this->add("export_obj", coBool); + def->label = L("Export SVG"); + def->tooltip = L("Export the model(s) as OBJ."); + def->cli = "export-obj"; + def->default_value = new ConfigOptionBool(false); + +/* + def = this->add("export_svg", coBool); + def->label = L("Export SVG"); + def->tooltip = L("Slice the model and export solid slices as SVG."); + def->cli = "export-svg"; + def->default_value = new ConfigOptionBool(false); +*/ + + def = this->add("export_sla", coBool); + def->label = L("Export SLA"); + def->tooltip = L("Slice the model and export SLA printing layers as PNG."); + def->cli = "export-sla|sla"; def->default_value = new ConfigOptionBool(false); - - def = this->add("datadir", coString); - def->label = L("User data directory"); - def->tooltip = L("Load and store settings at the given directory. " - "This is useful for maintaining different profiles or including " - "configurations from a network storage."); - def->cli = "datadir"; - def->default_value = new ConfigOptionString(); def = this->add("export_3mf", coBool); def->label = L("Export 3MF"); - def->tooltip = L("Slice the model and export slices as 3MF."); + def->tooltip = L("Export the model(s) as 3MF."); def->cli = "export-3mf"; def->default_value = new ConfigOptionBool(false); - def = this->add("slice", coBool); - def->label = L("Slice"); - def->tooltip = L("Slice the model and export gcode."); - def->cli = "slice"; + def = this->add("export_amf", coBool); + def->label = L("Export AMF"); + def->tooltip = L("Export the model(s) as AMF."); + def->cli = "export-amf"; + def->default_value = new ConfigOptionBool(false); + + def = this->add("export_stl", coBool); + def->label = L("Export STL"); + def->tooltip = L("Export the model(s) as STL."); + def->cli = "export-stl"; + def->default_value = new ConfigOptionBool(false); + + def = this->add("export_gcode", coBool); + def->label = L("Export G-code"); + def->tooltip = L("Slice the model and export toolpaths as G-code."); + def->cli = "export-gcode|gcode|g"; def->default_value = new ConfigOptionBool(false); def = this->add("help", coBool); def->label = L("Help"); def->tooltip = L("Show this help."); - def->cli = "help"; + def->cli = "help|h"; def->default_value = new ConfigOptionBool(false); - def = this->add("gui", coBool); - def->label = L("Use GUI"); - def->tooltip = L("Forces the GUI launch instead of command line slicing " - "(if you supply a model file, it will be loaded into the plater)"); - def->cli = "gui"; + def = this->add("help_options", coBool); + def->label = L("Help (options)"); + def->tooltip = L("Show the full list of print/G-code configuration options."); + def->cli = "help-options"; def->default_value = new ConfigOptionBool(false); def = this->add("info", coBool); @@ -3157,107 +3167,169 @@ CLIConfigDef::CLIConfigDef() def->cli = "info"; def->default_value = new ConfigOptionBool(false); - def = this->add("load", coStrings); - def->label = L("Load config file"); - def->tooltip = L("Load configuration from the specified file. It can be used more than once to load options from multiple files."); - def->cli = "load"; - def->default_value = new ConfigOptionStrings(); - - def = this->add("no_gui", coBool); - def->label = L("Do not use GUI"); - def->tooltip = L("Forces the command line slicing instead of gui. This takes precedence over --gui if both are present."); - def->cli = "no-gui"; - def->default_value = new ConfigOptionBool(false); - - def = this->add("output", coString); - def->label = L("Output File"); - def->tooltip = L("The file where the output will be written (if not specified, it will be based on the input file)."); - def->cli = "output"; - def->default_value = new ConfigOptionString(""); - - def = this->add("rotate", coFloat); - def->label = L("Rotate"); - def->tooltip = L("Rotation angle around the Z axis in degrees (0-360, default: 0)."); - def->cli = "rotate"; - def->default_value = new ConfigOptionFloat(0); - - def = this->add("rotate_x", coFloat); - def->label = L("Rotate around X"); - def->tooltip = L("Rotation angle around the X axis in degrees (0-360, default: 0)."); - def->cli = "rotate-x"; - def->default_value = new ConfigOptionFloat(0); - - def = this->add("rotate_y", coFloat); - def->label = L("Rotate around Y"); - def->tooltip = L("Rotation angle around the Y axis in degrees (0-360, default: 0)."); - def->cli = "rotate-y"; - def->default_value = new ConfigOptionFloat(0); - def = this->add("save", coString); def->label = L("Save config file"); def->tooltip = L("Save configuration to the specified file."); def->cli = "save"; def->default_value = new ConfigOptionString(); - - def = this->add("scale", coFloat); - def->label = L("Scale"); - def->tooltip = L("Scaling factor (default: 1)."); - def->cli = "scale"; - def->default_value = new ConfigOptionFloat(1); +} -/* +CLITransformConfigDef::CLITransformConfigDef() +{ + ConfigOptionDef* def; + + // Transform options: + def = this->add("align_xy", coPoint); + def->label = L("Align XY"); + def->tooltip = L("Align the model to the given point."); + def->cli = "align-xy"; + def->default_value = new ConfigOptionPoint(Vec2d(100,100)); + + def = this->add("cut", coFloat); + def->label = L("Cut"); + def->tooltip = L("Cut model at the given Z."); + def->cli = "cut"; + def->default_value = new ConfigOptionFloat(0); + +/* + def = this->add("cut_grid", coFloat); + def->label = L("Cut"); + def->tooltip = L("Cut model in the XY plane into tiles of the specified max size."); + def->cli = "cut-grid"; + def->default_value = new ConfigOptionPoint(); + + def = this->add("cut_x", coFloat); + def->label = L("Cut"); + def->tooltip = L("Cut model at the given X."); + def->cli = "cut-x"; + def->default_value = new ConfigOptionFloat(0); + + def = this->add("cut_y", coFloat); + def->label = L("Cut"); + def->tooltip = L("Cut model at the given Y."); + def->cli = "cut-y"; + def->default_value = new ConfigOptionFloat(0); +*/ + + def = this->add("center", coPoint); + def->label = L("Center"); + def->tooltip = L("Center the print around the given center."); + def->cli = "center"; + def->default_value = new ConfigOptionPoint(Vec2d(100,100)); + + def = this->add("dont_arrange", coBool); + def->label = L("Don't arrange"); + def->tooltip = L("Do not rearrange the given models before merging and keep their original XY coordinates."); + def->cli = "dont-arrange"; + + def = this->add("duplicate", coInt); + def->label = L("Duplicate"); + def->tooltip =L("Multiply copies by this factor."); + def->cli = "duplicate=i"; + def->min = 1; + + def = this->add("duplicate_grid", coPoint); + def->label = L("Duplicate by grid"); + def->tooltip = L("Multiply copies by creating a grid."); + def->cli = "duplicate-grid"; + + def = this->add("merge", coBool); + def->label = L("Merge"); + def->tooltip = L("Arrange the supplied models in a plate and merge them in a single model in order to perform actions once."); + def->cli = "merge|m"; + + def = this->add("repair", coBool); + def->label = L("Repair"); + def->tooltip = L("Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)."); + def->cli = "repair"; + + def = this->add("rotate", coFloat); + def->label = L("Rotate"); + def->tooltip = L("Rotation angle around the Z axis in degrees."); + def->cli = "rotate"; + def->default_value = new ConfigOptionFloat(0); + + def = this->add("rotate_x", coFloat); + def->label = L("Rotate around X"); + def->tooltip = L("Rotation angle around the X axis in degrees."); + def->cli = "rotate-x"; + def->default_value = new ConfigOptionFloat(0); + + def = this->add("rotate_y", coFloat); + def->label = L("Rotate around Y"); + def->tooltip = L("Rotation angle around the Y axis in degrees."); + def->cli = "rotate-y"; + def->default_value = new ConfigOptionFloat(0); + + def = this->add("scale", coFloatOrPercent); + def->label = L("Scale"); + def->tooltip = L("Scaling factor or percentage."); + def->cli = "scale"; + def->default_value = new ConfigOptionFloatOrPercent(1, false); + + def = this->add("split", coBool); + def->label = L("Split"); + def->tooltip = L("Detect unconnected parts in the given model(s) and split them into separate objects."); + def->cli = "split"; + def = this->add("scale_to_fit", coPoint3); def->label = L("Scale to Fit"); def->tooltip = L("Scale to fit the given volume."); def->cli = "scale-to-fit"; - def->default_value = new ConfigOptionPoint3(Pointf3(0,0,0)); -*/ - - def = this->add("print_center", coPoint); - def->label = L("Print center"); - def->tooltip = L("Center the print around the given center (default: 100, 100)."); - def->cli = "print-center"; - def->default_value = new ConfigOptionPoint(Vec2d(100,100)); + def->default_value = new ConfigOptionPoint3(Vec3d(0,0,0)); } -const CLIConfigDef cli_config_def; +CLIMiscConfigDef::CLIMiscConfigDef() +{ + ConfigOptionDef* def; + + def = this->add("ignore_nonexistent_config", coBool); + def->label = L("Ignore non-existent config files"); + def->tooltip = L("Do not fail if a file supplied to --load does not exist."); + def->cli = "ignore-nonexistent-config"; + + def = this->add("load", coStrings); + def->label = L("Load config file"); + def->tooltip = L("Load configuration from the specified file. It can be used more than once to load options from multiple files."); + def->cli = "load"; + + def = this->add("output", coString); + def->label = L("Output File"); + def->tooltip = L("The file where the output will be written (if not specified, it will be based on the input file)."); + def->cli = "output|o"; + +/* + def = this->add("autosave", coString); + def->label = L("Autosave"); + def->tooltip = L("Automatically export current configuration to the specified file."); + def->cli = "autosave"; +*/ + + def = this->add("datadir", coString); + def->label = L("Data directory"); + def->tooltip = L("Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."); + def->cli = "datadir"; + + def = this->add("loglevel", coInt); + def->label = L("Logging level"); + def->tooltip = L("Messages with severity lower or eqal to the loglevel will be printed out. 0:trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal"); + def->cli = "loglevel"; + def->min = 0; +} + +const CLIActionsConfigDef cli_actions_config_def; +const CLITransformConfigDef cli_transform_config_def; +const CLIMiscConfigDef cli_misc_config_def; + DynamicPrintAndCLIConfig::PrintAndCLIConfigDef DynamicPrintAndCLIConfig::s_def; void DynamicPrintAndCLIConfig::handle_legacy(t_config_option_key &opt_key, std::string &value) const { - if (cli_config_def.options.find(opt_key) == cli_config_def.options.end()) { - PrintConfigDef::handle_legacy(opt_key, value); - } -} - -std::ostream& print_cli_options(std::ostream& out) -{ - for (const auto& opt : cli_config_def.options) { - if (opt.second.cli.size() != 0) { - out << "\t" << std::left << std::setw(40) << std::string("--") + opt.second.cli; - out << "\t" << opt.second.tooltip << "\n"; - if (opt.second.default_value != nullptr) - out << "\t" << std::setw(40) << " " << "\t" << " (default: " << opt.second.default_value->serialize() << ")"; - out << "\n"; - } - } - std::cerr << std::endl; - return out; -} - -std::ostream& print_print_options(std::ostream& out) -{ - for (const auto& opt : print_config_def.options) { - if (opt.second.cli.size() != 0) { - out << "\t" << std::left << std::setw(40) << std::string("--") + opt.second.cli; - out << "\t" << opt.second.tooltip << "\n"; - if (opt.second.default_value != nullptr) - out << "\t" << std::setw(40) << " " << "\t" << " (default: " << opt.second.default_value->serialize() << ")"; - out << "\n"; - } - } - std::cerr << std::endl; - return out; + if (cli_actions_config_def .options.find(opt_key) == cli_actions_config_def .options.end() && + cli_transform_config_def.options.find(opt_key) == cli_transform_config_def.options.end() && + cli_misc_config_def .options.find(opt_key) == cli_misc_config_def .options.end()) { + PrintConfigDef::handle_legacy(opt_key, value); + } } } diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index f4d9053a6..ecbfd0e62 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -30,6 +30,8 @@ enum PrinterTechnology ptFFF, // Stereolitography ptSLA, + // Unknown, useful for command line processing + ptUnknown, }; enum GCodeFlavor { @@ -1145,72 +1147,32 @@ protected: #undef STATIC_PRINT_CONFIG_CACHE_DERIVED #undef OPT_PTR -class CLIConfigDef : public ConfigDef +class CLIActionsConfigDef : public ConfigDef { public: - CLIConfigDef(); + CLIActionsConfigDef(); }; -extern const CLIConfigDef cli_config_def; - -#define OPT_PTR(KEY) if (opt_key == #KEY) return &this->KEY - -class CLIConfig : public virtual ConfigBase, public StaticConfig +class CLITransformConfigDef : public ConfigDef { public: - ConfigOptionFloat cut; - ConfigOptionString datadir; - ConfigOptionBool dont_arrange; - ConfigOptionBool export_3mf; - ConfigOptionBool gui; - ConfigOptionBool info; - ConfigOptionBool help; - ConfigOptionStrings load; - ConfigOptionBool no_gui; - ConfigOptionString output; - ConfigOptionPoint print_center; - ConfigOptionFloat rotate; - ConfigOptionFloat rotate_x; - ConfigOptionFloat rotate_y; - ConfigOptionString save; - ConfigOptionFloat scale; -// ConfigOptionPoint3 scale_to_fit; - ConfigOptionBool slice; - - CLIConfig() : ConfigBase(), StaticConfig() - { - this->set_defaults(); - }; - - // Overrides ConfigBase::def(). Static configuration definition. Any value stored into this ConfigBase shall have its definition here. - const ConfigDef* def() const override { return &cli_config_def; } - t_config_option_keys keys() const override { return cli_config_def.keys(); } - - ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) override - { - OPT_PTR(cut); - OPT_PTR(datadir); - OPT_PTR(dont_arrange); - OPT_PTR(export_3mf); - OPT_PTR(gui); - OPT_PTR(help); - OPT_PTR(info); - OPT_PTR(load); - OPT_PTR(no_gui); - OPT_PTR(output); - OPT_PTR(print_center); - OPT_PTR(rotate); - OPT_PTR(rotate_x); - OPT_PTR(rotate_y); - OPT_PTR(save); - OPT_PTR(scale); -// OPT_PTR(scale_to_fit); - OPT_PTR(slice); - return NULL; - } + CLITransformConfigDef(); }; -#undef OPT_PTR +class CLIMiscConfigDef : public ConfigDef +{ +public: + CLIMiscConfigDef(); +}; + +// This class defines the command line options representing actions. +extern const CLIActionsConfigDef cli_actions_config_def; + +// This class defines the command line options representing transforms. +extern const CLITransformConfigDef cli_transform_config_def; + +// This class defines all command line options that are not actions or transforms. +extern const CLIMiscConfigDef cli_misc_config_def; class DynamicPrintAndCLIConfig : public DynamicPrintConfig { @@ -1233,19 +1195,16 @@ private: public: PrintAndCLIConfigDef() { this->options.insert(print_config_def.options.begin(), print_config_def.options.end()); - this->options.insert(cli_config_def.options.begin(), cli_config_def.options.end()); + this->options.insert(cli_actions_config_def.options.begin(), cli_actions_config_def.options.end()); + this->options.insert(cli_transform_config_def.options.begin(), cli_transform_config_def.options.end()); + this->options.insert(cli_misc_config_def.options.begin(), cli_misc_config_def.options.end()); } - // Do not release the default values, they are handled by print_config_def & cli_config_def. + // Do not release the default values, they are handled by print_config_def & cli_actions_config_def / cli_transform_config_def / cli_misc_config_def. ~PrintAndCLIConfigDef() { this->options.clear(); } }; static PrintAndCLIConfigDef s_def; }; -/// Iterate through all of the print options and write them to a stream. -std::ostream& print_print_options(std::ostream& out); -/// Iterate through all of the CLI options and write them to a stream. -std::ostream& print_cli_options(std::ostream& out); - } // namespace Slic3r #endif diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 23880cfa9..e6696b27f 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -300,81 +300,82 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf auto it_status = model_object_status.find(ModelObjectStatus(model_object.id())); assert(it_status != model_object_status.end()); assert(it_status->status != ModelObjectStatus::Deleted); - if (it_status->status == ModelObjectStatus::New) - // PrintObject instances will be added in the next loop. - continue; - // Update the ModelObject instance, possibly invalidate the linked PrintObjects. - assert(it_status->status == ModelObjectStatus::Old || it_status->status == ModelObjectStatus::Moved); - const ModelObject &model_object_new = *model.objects[idx_model_object]; - auto it_print_object_status = print_object_status.lower_bound(PrintObjectStatus(model_object.id())); - if (it_print_object_status != print_object_status.end() && it_print_object_status->id != model_object.id()) - it_print_object_status = print_object_status.end(); - // Check whether a model part volume was added or removed, their transformations or order changed. - bool model_parts_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::MODEL_PART); - bool sla_trafo_differs = model_object.instances.empty() != model_object_new.instances.empty() || - (! model_object.instances.empty() && ! sla_trafo(model_object).isApprox(sla_trafo(model_object_new))); - if (model_parts_differ || sla_trafo_differs) { - // The very first step (the slicing step) is invalidated. One may freely remove all associated PrintObjects. - if (it_print_object_status != print_object_status.end()) { - update_apply_status(it_print_object_status->print_object->invalidate_all_steps()); - const_cast(*it_print_object_status).status = PrintObjectStatus::Deleted; - } - // Copy content of the ModelObject including its ID, do not change the parent. - model_object.assign_copy(model_object_new); - } else { - // Synchronize Object's config. - bool object_config_changed = model_object.config != model_object_new.config; - if (object_config_changed) - model_object.config = model_object_new.config; - if (! object_diff.empty() || object_config_changed) { - SLAPrintObjectConfig new_config = m_default_object_config; - normalize_and_apply_config(new_config, model_object.config); - if (it_print_object_status != print_object_status.end()) { - t_config_option_keys diff = it_print_object_status->print_object->config().diff(new_config); - if (! diff.empty()) { - update_apply_status(it_print_object_status->print_object->invalidate_state_by_config_options(diff)); - it_print_object_status->print_object->config_apply_only(new_config, diff, true); - } - } - } - /*if (model_object.sla_support_points != model_object_new.sla_support_points) { - model_object.sla_support_points = model_object_new.sla_support_points; - if (it_print_object_status != print_object_status.end()) - update_apply_status(it_print_object_status->print_object->invalidate_step(slaposSupportPoints)); - } - if (model_object.sla_points_status != model_object_new.sla_points_status) { - // Change of this status should invalidate support points. The points themselves are not enough, there are none - // in case that nothing was generated OR that points were autogenerated already and not copied to the front-end. - // These cases can only be differentiated by checking the status change. However, changing from 'Generating' should NOT - // invalidate - that would keep stopping the background processing without a reason. - if (model_object.sla_points_status != sla::PointsStatus::Generating) - if (it_print_object_status != print_object_status.end()) - update_apply_status(it_print_object_status->print_object->invalidate_step(slaposSupportPoints)); - model_object.sla_points_status = model_object_new.sla_points_status; - }*/ + // PrintObject for this ModelObject, if it exists. + auto it_print_object_status = print_object_status.end(); + if (it_status->status != ModelObjectStatus::New) { + // Update the ModelObject instance, possibly invalidate the linked PrintObjects. + assert(it_status->status == ModelObjectStatus::Old || it_status->status == ModelObjectStatus::Moved); + const ModelObject &model_object_new = *model.objects[idx_model_object]; + auto it_print_object_status = print_object_status.lower_bound(PrintObjectStatus(model_object.id())); + if (it_print_object_status != print_object_status.end() && it_print_object_status->id != model_object.id()) + it_print_object_status = print_object_status.end(); + // Check whether a model part volume was added or removed, their transformations or order changed. + bool model_parts_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::MODEL_PART); + bool sla_trafo_differs = model_object.instances.empty() != model_object_new.instances.empty() || + (! model_object.instances.empty() && ! sla_trafo(model_object).isApprox(sla_trafo(model_object_new))); + if (model_parts_differ || sla_trafo_differs) { + // The very first step (the slicing step) is invalidated. One may freely remove all associated PrintObjects. + if (it_print_object_status != print_object_status.end()) { + update_apply_status(it_print_object_status->print_object->invalidate_all_steps()); + const_cast(*it_print_object_status).status = PrintObjectStatus::Deleted; + } + // Copy content of the ModelObject including its ID, do not change the parent. + model_object.assign_copy(model_object_new); + } else { + // Synchronize Object's config. + bool object_config_changed = model_object.config != model_object_new.config; + if (object_config_changed) + model_object.config = model_object_new.config; + if (! object_diff.empty() || object_config_changed) { + SLAPrintObjectConfig new_config = m_default_object_config; + normalize_and_apply_config(new_config, model_object.config); + if (it_print_object_status != print_object_status.end()) { + t_config_option_keys diff = it_print_object_status->print_object->config().diff(new_config); + if (! diff.empty()) { + update_apply_status(it_print_object_status->print_object->invalidate_state_by_config_options(diff)); + it_print_object_status->print_object->config_apply_only(new_config, diff, true); + } + } + } + /*if (model_object.sla_support_points != model_object_new.sla_support_points) { + model_object.sla_support_points = model_object_new.sla_support_points; + if (it_print_object_status != print_object_status.end()) + update_apply_status(it_print_object_status->print_object->invalidate_step(slaposSupportPoints)); + } + if (model_object.sla_points_status != model_object_new.sla_points_status) { + // Change of this status should invalidate support points. The points themselves are not enough, there are none + // in case that nothing was generated OR that points were autogenerated already and not copied to the front-end. + // These cases can only be differentiated by checking the status change. However, changing from 'Generating' should NOT + // invalidate - that would keep stopping the background processing without a reason. + if (model_object.sla_points_status != sla::PointsStatus::Generating) + if (it_print_object_status != print_object_status.end()) + update_apply_status(it_print_object_status->print_object->invalidate_step(slaposSupportPoints)); + model_object.sla_points_status = model_object_new.sla_points_status; + }*/ - bool old_user_modified = model_object.sla_points_status == sla::PointsStatus::UserModified; - bool new_user_modified = model_object_new.sla_points_status == sla::PointsStatus::UserModified; - if ((old_user_modified && ! new_user_modified) || // switching to automatic supports from manual supports - (! old_user_modified && new_user_modified) || // switching to manual supports from automatic supports - (new_user_modified && model_object.sla_support_points != model_object_new.sla_support_points)) { - if (it_print_object_status != print_object_status.end()) - update_apply_status(it_print_object_status->print_object->invalidate_step(slaposSupportPoints)); + bool old_user_modified = model_object.sla_points_status == sla::PointsStatus::UserModified; + bool new_user_modified = model_object_new.sla_points_status == sla::PointsStatus::UserModified; + if ((old_user_modified && ! new_user_modified) || // switching to automatic supports from manual supports + (! old_user_modified && new_user_modified) || // switching to manual supports from automatic supports + (new_user_modified && model_object.sla_support_points != model_object_new.sla_support_points)) { + if (it_print_object_status != print_object_status.end()) + update_apply_status(it_print_object_status->print_object->invalidate_step(slaposSupportPoints)); - model_object.sla_points_status = model_object_new.sla_points_status; - model_object.sla_support_points = model_object_new.sla_support_points; - } + model_object.sla_points_status = model_object_new.sla_points_status; + model_object.sla_support_points = model_object_new.sla_support_points; + } - // Copy the ModelObject name, input_file and instances. The instances will compared against PrintObject instances in the next step. - model_object.name = model_object_new.name; - model_object.input_file = model_object_new.input_file; - model_object.clear_instances(); - model_object.instances.reserve(model_object_new.instances.size()); - for (const ModelInstance *model_instance : model_object_new.instances) { - model_object.instances.emplace_back(new ModelInstance(*model_instance)); - model_object.instances.back()->set_model_object(&model_object); - } - } + // Copy the ModelObject name, input_file and instances. The instances will compared against PrintObject instances in the next step. + model_object.name = model_object_new.name; + model_object.input_file = model_object_new.input_file; + model_object.clear_instances(); + model_object.instances.reserve(model_object_new.instances.size()); + for (const ModelInstance *model_instance : model_object_new.instances) { + model_object.instances.emplace_back(new ModelInstance(*model_instance)); + model_object.instances.back()->set_model_object(&model_object); + } + } + } std::vector new_instances = sla_instances(model_object); if (it_print_object_status != print_object_status.end() && it_print_object_status->status != PrintObjectStatus::Deleted) { diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index 855fe7644..eaa11b738 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -247,7 +247,7 @@ bool TriangleMesh::needed_repair() const || this->stl.stats.backwards_edges > 0; } -void TriangleMesh::WriteOBJFile(char* output_file) +void TriangleMesh::WriteOBJFile(const char* output_file) { stl_generate_shared_vertices(&stl); stl_write_obj(&stl, output_file); @@ -1499,9 +1499,16 @@ void TriangleMeshSlicer::make_loops(std::vector &lines, Polygo // Try to close gaps. // Do it in two rounds, first try to connect in the same direction only, // then try to connect the open polylines in reversed order as well. +#if 0 + for (double max_gap : { EPSILON, 0.001, 0.1, 1., 2. }) { + chain_open_polylines_close_gaps(open_polylines, *loops, max_gap, false); + chain_open_polylines_close_gaps(open_polylines, *loops, max_gap, true); + } +#else const double max_gap = 2.; //mm chain_open_polylines_close_gaps(open_polylines, *loops, max_gap, false); chain_open_polylines_close_gaps(open_polylines, *loops, max_gap, true); +#endif #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index 04c13e876..a4387e5c1 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -36,7 +36,7 @@ public: float volume(); void check_topology(); bool is_manifold() const { return this->stl.stats.connected_facets_3_edge == (int)this->stl.stats.number_of_facets; } - void WriteOBJFile(char* output_file); + void WriteOBJFile(const char* output_file); void scale(float factor); void scale(const Vec3d &versor); void translate(float x, float y, float z); diff --git a/src/slic3r.cpp b/src/slic3r.cpp index 9a124c73c..b6409fb1d 100644 --- a/src/slic3r.cpp +++ b/src/slic3r.cpp @@ -31,22 +31,452 @@ #include "libslic3r/Print.hpp" #include "libslic3r/SLAPrint.hpp" #include "libslic3r/TriangleMesh.hpp" +#include "libslic3r/Format/AMF.hpp" #include "libslic3r/Format/3mf.hpp" +#include "libslic3r/Format/STL.hpp" +#include "libslic3r/Format/OBJ.hpp" #include "libslic3r/Utils.hpp" +#include "slic3r.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" using namespace Slic3r; -/// utility function for displaying CLI usage -void printUsage(); +PrinterTechnology get_printer_technology(const DynamicConfig &config) +{ + const ConfigOptionEnum *opt = config.option>("printer_technology"); + return (opt == nullptr) ? ptUnknown : opt->value; +} -#ifdef _MSC_VER -int slic3r_main_(int argc, char **argv) +int CLI::run(int argc, char **argv) +{ + if (! this->setup(argc, argv)) + return 1; + + m_extra_config.apply(m_config, true); + m_extra_config.normalize(); + + bool start_gui = m_actions.empty() && + // cutting transformations are setting an "export" action. + std::find(m_transforms.begin(), m_transforms.end(), "cut") == m_transforms.end() && + std::find(m_transforms.begin(), m_transforms.end(), "cut_x") == m_transforms.end() && + std::find(m_transforms.begin(), m_transforms.end(), "cut_y") == m_transforms.end(); + PrinterTechnology printer_technology = get_printer_technology(m_extra_config); + const std::vector &load_configs = m_config.option("load", true)->values; + + // load config files supplied via --load + for (auto const &file : load_configs) { + if (! boost::filesystem::exists(file)) { + if (m_config.opt_bool("ignore_nonexistent_file")) { + continue; + } else { + boost::nowide::cerr << "No such file: " << file << std::endl; + return 1; + } + } + DynamicPrintConfig config; + try { + config.load(file); + } catch (std::exception &ex) { + boost::nowide::cerr << "Error while reading config file: " << ex.what() << std::endl; + return 1; + } + config.normalize(); + PrinterTechnology other_printer_technology = get_printer_technology(config); + if (printer_technology == ptUnknown) { + printer_technology = other_printer_technology; + } else if (printer_technology != other_printer_technology) { + boost::nowide::cerr << "Mixing configurations for FFF and SLA technologies" << std::endl; + return 1; + } + m_print_config.apply(config); + } + + // Read input file(s) if any. + for (const std::string &file : m_input_files) { + if (! boost::filesystem::exists(file)) { + boost::nowide::cerr << "No such file: " << file << std::endl; + exit(1); + } + Model model; + try { + // When loading an AMF or 3MF, config is imported as well, including the printer technology. + model = Model::read_from_file(file, &m_print_config, true); + PrinterTechnology other_printer_technology = get_printer_technology(m_print_config); + if (printer_technology == ptUnknown) { + printer_technology = other_printer_technology; + } else if (printer_technology != other_printer_technology) { + boost::nowide::cerr << "Mixing configurations for FFF and SLA technologies" << std::endl; + return 1; + } + } catch (std::exception &e) { + boost::nowide::cerr << file << ": " << e.what() << std::endl; + return 1; + } + if (model.objects.empty()) { + boost::nowide::cerr << "Error: file is empty: " << file << std::endl; + continue; + } + m_models.push_back(model); + } + + // Apply command line options to a more specific DynamicPrintConfig which provides normalize() + // (command line options override --load files) + m_print_config.apply(m_extra_config, true); + // Normalizing after importing the 3MFs / AMFs + m_print_config.normalize(); + + if (printer_technology == ptUnknown) + printer_technology = std::find(m_actions.begin(), m_actions.end(), "export_sla") == m_actions.end() ? ptFFF : ptSLA; + + // Initialize full print configs for both the FFF and SLA technologies. + FullPrintConfig fff_print_config; + SLAFullPrintConfig sla_print_config; + fff_print_config.apply(m_print_config); + sla_print_config.apply(m_print_config); + + // Loop through transform options. + for (auto const &opt_key : m_transforms) { + if (opt_key == "merge") { + Model m; + for (auto &model : m_models) + for (ModelObject *o : model.objects) + m.add_object(*o); + // Rearrange instances unless --dont-arrange is supplied + if (! m_config.opt_bool("dont_arrange")) { + m.add_default_instances(); + const BoundingBoxf &bb = fff_print_config.bed_shape.values; + m.arrange_objects( + fff_print_config.min_object_distance(), + // If we are going to use the merged model for printing, honor + // the configured print bed for arranging, otherwise do it freely. + this->has_print_action() ? &bb : nullptr + ); + } + m_models.clear(); + m_models.emplace_back(std::move(m)); + } else if (opt_key == "duplicate") { + const BoundingBoxf &bb = fff_print_config.bed_shape.values; + for (auto &model : m_models) { + const bool all_objects_have_instances = std::none_of( + model.objects.begin(), model.objects.end(), + [](ModelObject* o){ return o->instances.empty(); } + ); + if (all_objects_have_instances) { + // if all input objects have defined position(s) apply duplication to the whole model + model.duplicate(m_config.opt_int("duplicate"), fff_print_config.min_object_distance(), &bb); + } else { + model.add_default_instances(); + model.duplicate_objects(m_config.opt_int("duplicate"), fff_print_config.min_object_distance(), &bb); + } + } + } else if (opt_key == "duplicate_grid") { + std::vector &ints = m_config.option("duplicate_grid")->values; + const int x = ints.size() > 0 ? ints.at(0) : 1; + const int y = ints.size() > 1 ? ints.at(1) : 1; + const double distance = fff_print_config.duplicate_distance.value; + for (auto &model : m_models) + model.duplicate_objects_grid(x, y, (distance > 0) ? distance : 6); // TODO: this is not the right place for setting a default + } else if (opt_key == "center") { + for (auto &model : m_models) { + model.add_default_instances(); + // this affects instances: + model.center_instances_around_point(m_config.option("center")->value); + // this affects volumes: + //FIXME Vojtech: Who knows why the complete model should be aligned with Z as a single rigid body? + //model.align_to_ground(); + BoundingBoxf3 bbox; + for (ModelObject *model_object : model.objects) + // We are interested into the Z span only, therefore it is sufficient to measure the bounding box of the 1st instance only. + bbox.merge(model_object->instance_bounding_box(0, false)); + for (ModelObject *model_object : model.objects) + for (ModelInstance *model_instance : model_object->instances) + model_instance->set_offset(Z, model_instance->get_offset(Z) - bbox.min.z()); + } + } else if (opt_key == "align_xy") { + const Vec2d &p = m_config.option("align_xy")->value; + for (auto &model : m_models) { + BoundingBoxf3 bb = model.bounding_box(); + // this affects volumes: + model.translate(-(bb.min.x() - p.x()), -(bb.min.y() - p.y()), -bb.min.z()); + } + } else if (opt_key == "dont_arrange") { + // do nothing - this option alters other transform options + } else if (opt_key == "rotate") { + for (auto &model : m_models) + for (auto &o : model.objects) + // this affects volumes: + o->rotate(Geometry::deg2rad(m_config.opt_float(opt_key)), Z); + } else if (opt_key == "rotate_x") { + for (auto &model : m_models) + for (auto &o : model.objects) + // this affects volumes: + o->rotate(Geometry::deg2rad(m_config.opt_float(opt_key)), X); + } else if (opt_key == "rotate_y") { + for (auto &model : m_models) + for (auto &o : model.objects) + // this affects volumes: + o->rotate(Geometry::deg2rad(m_config.opt_float(opt_key)), Y); + } else if (opt_key == "scale") { + for (auto &model : m_models) + for (auto &o : model.objects) + // this affects volumes: + o->scale(m_config.get_abs_value(opt_key, 1)); + } else if (opt_key == "scale_to_fit") { + const Vec3d &opt = m_config.opt(opt_key)->value; + if (opt.x() <= 0 || opt.y() <= 0 || opt.z() <= 0) { + boost::nowide::cerr << "--scale-to-fit requires a positive volume" << std::endl; + return 1; + } + for (auto &model : m_models) + for (auto &o : model.objects) + // this affects volumes: + o->scale_to_fit(opt); + } else if (opt_key == "cut" || opt_key == "cut_x" || opt_key == "cut_y") { + std::vector new_models; + for (auto &model : m_models) { + model.repair(); + model.translate(0, 0, -model.bounding_box().min.z()); // align to z = 0 + size_t num_objects = model.objects.size(); + for (size_t i = 0; i < num_objects; ++ i) { + +#if 0 + if (opt_key == "cut_x") { + o->cut(X, m_config.opt_float("cut_x"), &out); + } else if (opt_key == "cut_y") { + o->cut(Y, m_config.opt_float("cut_y"), &out); + } else if (opt_key == "cut") { + o->cut(Z, m_config.opt_float("cut"), &out); + } #else -int main(int argc, char **argv) + model.objects.front()->cut(0, m_config.opt_float("cut"), true, true, true); #endif + model.delete_object(size_t(0)); + } + } + + // TODO: copy less stuff around using pointers + m_models = new_models; + + if (m_actions.empty()) + m_actions.push_back("export_stl"); + } +#if 0 + else if (opt_key == "cut_grid") { + std::vector new_models; + for (auto &model : m_models) { + TriangleMesh mesh = model.mesh(); + mesh.repair(); + + TriangleMeshPtrs meshes = mesh.cut_by_grid(m_config.option("cut_grid")->value); + size_t i = 0; + for (TriangleMesh* m : meshes) { + Model out; + auto o = out.add_object(); + o->add_volume(*m); + o->input_file += "_" + std::to_string(i++); + delete m; + } + } + + // TODO: copy less stuff around using pointers + m_models = new_models; + + if (m_actions.empty()) + m_actions.push_back("export_stl"); + } +#endif + else if (opt_key == "split") { + for (Model &model : m_models) { + size_t num_objects = model.objects.size(); + for (size_t i = 0; i < num_objects; ++ i) { + model.objects.front()->split(nullptr); + model.delete_object(size_t(0)); + } + } + } else if (opt_key == "repair") { + for (auto &model : m_models) + model.repair(); + } else { + boost::nowide::cerr << "error: option not implemented yet: " << opt_key << std::endl; + return 1; + } + } + + // loop through action options + for (auto const &opt_key : m_actions) { + if (opt_key == "help") { + this->print_help(); + } else if (opt_key == "help_options") { + this->print_help(true); + } else if (opt_key == "save") { + //FIXME check for mixing the FFF / SLA parameters. + // or better save fff_print_config vs. sla_print_config + m_print_config.save(m_config.opt_string("save")); + } else if (opt_key == "info") { + // --info works on unrepaired model + for (Model &model : m_models) { + model.add_default_instances(); + model.print_info(); + } + } else if (opt_key == "export_stl") { + for (auto &model : m_models) + model.add_default_instances(); + if (! this->export_models(IO::STL)) + return 1; + } else if (opt_key == "export_obj") { + for (auto &model : m_models) + model.add_default_instances(); + if (! this->export_models(IO::OBJ)) + return 1; + } else if (opt_key == "export_amf") { + if (! this->export_models(IO::AMF)) + return 1; + } else if (opt_key == "export_3mf") { + if (! this->export_models(IO::TMF)) + return 1; + } else if (opt_key == "export_gcode" || opt_key == "export_sla" || opt_key == "slice") { + if (opt_key == "export_gcode" && printer_technology == ptSLA) { + boost::nowide::cerr << "error: cannot export G-code for an FFF configuration" << std::endl; + return 1; + } else if (opt_key == "export_sla" && printer_technology == ptFFF) { + boost::nowide::cerr << "error: cannot export SLA slices for a SLA configuration" << std::endl; + return 1; + } + // Make a copy of the model if the current action is not the last action, as the model may be + // modified by the centering and such. + Model model_copy; + bool make_copy = &opt_key != &m_actions.back(); + for (Model &model_in : m_models) { + if (make_copy) + model_copy = model_in; + Model &model = make_copy ? model_copy : model_in; + // If all objects have defined instances, their relative positions will be + // honored when printing (they will be only centered, unless --dont-arrange + // is supplied); if any object has no instances, it will get a default one + // and all instances will be rearranged (unless --dont-arrange is supplied). + std::string outfile = m_config.opt_string("output"); + Print fff_print; + SLAPrint sla_print; + PrintBase *print = (printer_technology == ptFFF) ? static_cast(&fff_print) : static_cast(&sla_print); + if (! m_config.opt_bool("dont_arrange")) { + //FIXME make the min_object_distance configurable. + model.arrange_objects(fff_print.config().min_object_distance()); + model.center_instances_around_point(m_config.option("center")->value); + } + if (printer_technology == ptFFF) { + for (auto* mo : model.objects) + fff_print.auto_assign_extruders(mo); + } + print->apply(model, m_print_config); + std::string err = print->validate(); + if (err.empty()) { + try { + std::string outfile_final; + print->process(); + if (printer_technology == ptFFF) { + // The outfile is processed by a PlaceholderParser. + outfile = fff_print.export_gcode(outfile, nullptr); + outfile_final = fff_print.print_statistics().finalize_output_path(outfile); + } else { + outfile = sla_print.output_filepath(outfile); + //FIXME Tamas, please port it to miniz + // sla_print.export_raster(outfile); + outfile_final = sla_print.print_statistics().finalize_output_path(outfile); + } + if (outfile != outfile_final && Slic3r::rename_file(outfile, outfile_final) != 0) { + boost::nowide::cerr << "Renaming file " << outfile << " to " << outfile_final << " failed" << std::endl; + return 1; + } + } catch (const std::exception &ex) { + boost::nowide::cerr << ex.what() << std::endl; + return 1; + } + } else { + boost::nowide::cerr << err << std::endl; + return 1; + } + +/* + print.center = ! m_config.has("center") + && ! m_config.has("align_xy") + && ! m_config.opt_bool("dont_arrange"); + print.set_model(model); + + // start chronometer + typedef std::chrono::high_resolution_clock clock_; + typedef std::chrono::duration > second_; + std::chrono::time_point t0{ clock_::now() }; + + const std::string outfile = this->output_filepath(model, IO::Gcode); + try { + print.export_gcode(outfile); + } catch (std::runtime_error &e) { + boost::nowide::cerr << e.what() << std::endl; + return 1; + } + boost::nowide::cout << "G-code exported to " << outfile << std::endl; + + // output some statistics + double duration { std::chrono::duration_cast(clock_::now() - t0).count() }; + boost::nowide::cout << std::fixed << std::setprecision(0) + << "Done. Process took " << (duration/60) << " minutes and " + << std::setprecision(3) + << std::fmod(duration, 60.0) << " seconds." << std::endl + << std::setprecision(2) + << "Filament required: " << print.total_used_filament() << "mm" + << " (" << print.total_extruded_volume()/1000 << "cm3)" << std::endl; +*/ + } + } else { + boost::nowide::cerr << "error: option not supported yet: " << opt_key << std::endl; + return 1; + } + } + + if (start_gui) { +#if 1 +// #ifdef USE_WX + GUI::GUI_App *gui = new GUI::GUI_App(); +// gui->autosave = m_config.opt_string("autosave"); + GUI::GUI_App::SetInstance(gui); + gui->CallAfter([gui, this, &load_configs] { + if (!gui->initialized()) { + return; + } +#if 0 + // Load the cummulative config over the currently active profiles. + //FIXME if multiple configs are loaded, only the last one will have an effect. + // We need to decide what to do about loading of separate presets (just print preset, just filament preset etc). + // As of now only the full configs are supported here. + if (!m_print_config.empty()) + gui->mainframe->load_config(m_print_config); +#endif + if (! load_configs.empty()) + // Load the last config to give it a name at the UI. The name of the preset may be later + // changed by loading an AMF or 3MF. + //FIXME this is not strictly correct, as one may pass a print/filament/printer profile here instead of a full config. + gui->mainframe->load_config_file(load_configs.back()); + // If loading a 3MF file, the config is loaded from the last one. + if (! m_input_files.empty()) + gui->plater()->load_files(m_input_files, true, true); + if (! m_extra_config.empty()) + gui->mainframe->load_config(m_extra_config); + }); + return wxEntry(argc, argv); +#else + // No GUI support. Just print out a help. + this->print_help(false); + // If started without a parameter, consider it to be OK, otherwise report an error code (no action etc). + return (argc == 0) ? 0 : 1; +#endif + } + + return 0; +} + +bool CLI::setup(int argc, char **argv) { { const char *loglevel = boost::nowide::getenv("SLIC3R_LOGLEVEL"); @@ -58,15 +488,6 @@ int main(int argc, char **argv) } } - // parse all command line options into a DynamicConfig - DynamicPrintAndCLIConfig all_config; - t_config_option_keys input_files; - // if any option is unsupported, print usage and abort immediately - if (! all_config.read_cli(argc, argv, &input_files)) { - printUsage(); - return 0; - } - boost::filesystem::path path_to_binary = boost::filesystem::system_complete(argv[0]); // Path from the Slic3r binary to its resources. @@ -94,207 +515,111 @@ int main(int argc, char **argv) set_var_dir((path_resources / "icons").string()); set_local_dir((path_resources / "localization").string()); - // apply command line options to a more handy CLIConfig - CLIConfig cli_config; -#ifdef __APPLE__ - // Enable the GUI mode by default, to support drag & drop. - cli_config.gui.value = true; -#endif /* __APPLE__ */ + // Parse all command line options into a DynamicConfig. + // If any option is unsupported, print usage and abort immediately. + t_config_option_keys opt_order; + if (! m_config.read_cli(argc, argv, &m_input_files, &opt_order)) { + this->print_help(); + return false; + } + // Parse actions and transform options. + for (auto const &opt_key : opt_order) { + if (cli_actions_config_def.has(opt_key)) + m_actions.emplace_back(opt_key); + if (cli_transform_config_def.has(opt_key)) + m_transforms.emplace_back(opt_key); + } - cli_config.apply(all_config, true); - set_data_dir(cli_config.datadir.value); - - // Load the extra config values. - DynamicPrintConfig extra_config; - extra_config.apply(all_config, true); - - // load config files supplied via --load - DynamicPrintConfig print_config; - for (const std::string &file : cli_config.load.values) { - if (! boost::filesystem::exists(file)) { - boost::nowide::cout << "No such file: " << file << std::endl; - exit(1); - } - DynamicPrintConfig c; - try { - c.load(file); - } catch (std::exception &e) { - boost::nowide::cout << "Error while reading config file: " << e.what() << std::endl; - exit(1); - } - c.normalize(); - print_config.apply(c); + { + const ConfigOptionInt *opt_loglevel = m_config.opt("loglevel"); + if (opt_loglevel != 0) + set_logging_level(opt_loglevel->value); } - if ((input_files.empty() || cli_config.gui.value) && ! cli_config.no_gui.value && ! cli_config.help.value && cli_config.save.value.empty()) { -#if 1 - GUI::GUI_App *gui = new GUI::GUI_App(); - GUI::GUI_App::SetInstance(gui); - gui->CallAfter([gui, &input_files, &cli_config, &extra_config, &print_config] { - if (! gui->initialized()) { - return; - } -#if 0 - // Load the cummulative config over the currently active profiles. - //FIXME if multiple configs are loaded, only the last one will have an effect. - // We need to decide what to do about loading of separate presets (just print preset, just filament preset etc). - // As of now only the full configs are supported here. - if (! print_config.empty()) - gui->mainframe->load_config(print_config); -#endif - if (! cli_config.load.values.empty()) - // Load the last config to give it a name at the UI. The name of the preset may be later - // changed by loading an AMF or 3MF. - //FIXME this is not strictly correct, as one may pass a print/filament/printer profile here instead of a full config. - gui->mainframe->load_config_file(cli_config.load.values.back()); - // If loading a 3MF file, the config is loaded from the last one. - gui->plater()->load_files(input_files, true, true); - if (! extra_config.empty()) - gui->mainframe->load_config(extra_config); - }); - return wxEntry(argc, argv); -#else - std::cout << "GUI support has not been built." << "\n"; - return -1; -#endif - } + // Initialize with defaults. + for (const t_optiondef_map *options : { &cli_actions_config_def.options, &cli_transform_config_def.options, &cli_misc_config_def.options }) + for (const std::pair &optdef : *options) + m_config.optptr(optdef.first, true); - // apply command line options to a more specific DynamicPrintConfig which provides normalize() - // (command line options override --load files) - print_config.apply(extra_config, true); - - // write config if requested - if (! cli_config.save.value.empty()) { - print_config.normalize(); - print_config.save(cli_config.save.value); - } + set_data_dir(m_config.opt_string("datadir")); - if (cli_config.help) { - printUsage(); - return 0; - } - - // read input file(s) if any - std::vector models; - for (const t_config_option_key &file : input_files) { - if (! boost::filesystem::exists(file)) { - boost::nowide::cerr << "No such file: " << file << std::endl; - exit(1); - } - Model model; - try { - model = Model::read_from_file(file, &print_config, true); - } catch (std::exception &e) { - boost::nowide::cerr << file << ": " << e.what() << std::endl; - exit(1); - } - if (model.objects.empty()) { - boost::nowide::cerr << "Error: file is empty: " << file << std::endl; - continue; - } - model.add_default_instances(); - // apply command line transform options - for (ModelObject* o : model.objects) { -/* - if (cli_config.scale_to_fit.is_positive_volume()) - o->scale_to_fit(cli_config.scale_to_fit.value); -*/ - // TODO: honor option order? - o->scale(cli_config.scale.value); - o->rotate(Geometry::deg2rad(cli_config.rotate_x.value), X); - o->rotate(Geometry::deg2rad(cli_config.rotate_y.value), Y); - o->rotate(Geometry::deg2rad(cli_config.rotate.value), Z); - } - // TODO: handle --merge - models.push_back(model); - } - - for (Model &model : models) { - if (cli_config.info) { - // --info works on unrepaired model - model.print_info(); - } else if (cli_config.export_3mf) { - std::string outfile = cli_config.output.value; - if (outfile.empty()) outfile = model.objects.front()->input_file; - // Check if the file is already a 3mf. - if(outfile.substr(outfile.find_last_of('.'), outfile.length()) == ".3mf") - outfile = outfile.substr(0, outfile.find_last_of('.')) + "_2" + ".3mf"; - else - // Remove the previous extension and add .3mf extention. - outfile = outfile.substr(0, outfile.find_last_of('.')) + ".3mf"; - store_3mf(outfile.c_str(), &model, nullptr); - boost::nowide::cout << "File file exported to " << outfile << std::endl; - } else if (cli_config.cut > 0) { - model.repair(); - model.translate(0, 0, - model.bounding_box().min(2)); - if (! model.objects.empty()) { - // XXX - // Model out; - // model.objects.front()->cut(cli_config.cut, &out); - // ModelObject &upper = *out.objects[0]; - // ModelObject &lower = *out.objects[1]; - // // Use the input name and trim off the extension. - // std::string outfile = cli_config.output.value; - // if (outfile.empty()) - // outfile = model.objects.front()->input_file; - // outfile = outfile.substr(0, outfile.find_last_of('.')); - // std::cerr << outfile << "\n"; - // if (upper.facets_count() > 0) - // upper.mesh().write_binary((outfile + "_upper.stl").c_str()); - // if (lower.facets_count() > 0) - // lower.mesh().write_binary((outfile + "_lower.stl").c_str()); - } - } else if (cli_config.slice) { - PrinterTechnology printer_technology = print_config.option>("printer_technology", true)->value; - std::string outfile = cli_config.output.value; - Print fff_print; - SLAPrint sla_print; - PrintBase *print = (printer_technology == ptFFF) ? static_cast(&fff_print) : static_cast(&sla_print); - if (! cli_config.dont_arrange) { - //FIXME make the min_object_distance configurable. - model.arrange_objects(fff_print.config().min_object_distance()); - model.center_instances_around_point(cli_config.print_center); - } - if (printer_technology == ptFFF) { - for (auto* mo : model.objects) - fff_print.auto_assign_extruders(mo); - } - print_config.normalize(); - print->apply(model, print_config); - std::string err = print->validate(); - if (err.empty()) { - if (printer_technology == ptFFF) { - // The outfile is processed by a PlaceholderParser. - fff_print.export_gcode(outfile, nullptr); - } else { - assert(printer_technology == ptSLA); - //FIXME add the output here - } - } else - std::cerr << err << "\n"; - } else { - boost::nowide::cerr << "error: command not supported" << std::endl; - return 1; - } - } - - return 0; + return true; } -void printUsage() +void CLI::print_help(bool include_print_options) const { - std::cout << "Slic3r " << SLIC3R_VERSION << " is a STL-to-GCODE translator for RepRap 3D printers" << "\n" - << "written by Alessandro Ranellucci - http://slic3r.org/ - https://github.com/slic3r/Slic3r" << "\n" -// << "Git Version " << BUILD_COMMIT << "\n\n" - << "Usage: ./slic3r [ OPTIONS ] [ file.stl ] [ file2.stl ] ..." << "\n"; - // CLI Options - std::cout << "** CLI OPTIONS **\n"; - print_cli_options(boost::nowide::cout); - std::cout << "****\n"; - // Print options - std::cout << "** PRINT OPTIONS **\n"; - print_print_options(boost::nowide::cout); - std::cout << "****\n"; + boost::nowide::cout + << "Slic3r Prusa Edition " << SLIC3R_BUILD << std::endl + << "https://github.com/prusa3d/Slic3r" << std::endl << std::endl + << "Usage: slic3r [ ACTIONS ] [ TRANSFORM ] [ OPTIONS ] [ file.stl ... ]" << std::endl + << std::endl + << "Actions:" << std::endl; + cli_actions_config_def.print_cli_help(boost::nowide::cout, false); + + boost::nowide::cout + << std::endl + << "Transform options:" << std::endl; + cli_transform_config_def.print_cli_help(boost::nowide::cout, false); + + boost::nowide::cout + << std::endl + << "Other options:" << std::endl; + cli_misc_config_def.print_cli_help(boost::nowide::cout, false); + + if (include_print_options) { + boost::nowide::cout << std::endl; + print_config_def.print_cli_help(boost::nowide::cout, true); + } else { + boost::nowide::cout + << std::endl + << "Run --help-options to see the full listing of print/G-code options." << std::endl; + } +} + +bool CLI::export_models(IO::ExportFormat format) +{ + for (Model &model : m_models) { + const std::string path = this->output_filepath(model, format); + bool success = false; + switch (format) { + case IO::AMF: success = Slic3r::store_amf(path.c_str(), &model, nullptr); break; + case IO::OBJ: success = Slic3r::store_obj(path.c_str(), &model); break; + case IO::STL: success = Slic3r::store_stl(path.c_str(), &model, true); break; + case IO::TMF: success = Slic3r::store_3mf(path.c_str(), &model, nullptr); break; + default: assert(false); break; + } + if (success) + std::cout << "File exported to " << path << std::endl; + else { + std::cerr << "File export to " << path << " failed" << std::endl; + return false; + } + } + return true; +} + +std::string CLI::output_filepath(const Model &model, IO::ExportFormat format) const +{ + std::string ext; + switch (format) { + case IO::AMF: ext = ".amf"; break; + case IO::OBJ: ext = ".obj"; break; + case IO::STL: ext = ".stl"; break; + case IO::TMF: ext = ".3mf"; break; + default: assert(false); break; + }; + auto proposed_path = boost::filesystem::path(model.propose_export_file_name_and_path(ext)); + // use --output when available + std::string cmdline_param = m_config.opt_string("output", false); + if (! cmdline_param.empty()) { + // if we were supplied a directory, use it and append our automatically generated filename + boost::filesystem::path cmdline_path(cmdline_param); + if (boost::filesystem::is_directory(cmdline_path)) + proposed_path = cmdline_path / proposed_path.filename(); + else + proposed_path = cmdline_path; + } + return proposed_path.string(); } #ifdef _MSC_VER @@ -309,7 +634,12 @@ extern "C" { for (size_t i = 0; i < argc; ++ i) argv_ptrs[i] = const_cast(argv_narrow[i].data()); // Call the UTF8 main. - return slic3r_main_(argc, argv_ptrs.data()); + return CLI().run(argc, argv_ptrs.data()); } } +#else /* _MSC_VER */ +int main(int argc, char **argv) +{ + return CLI().run(argc, argv); +} #endif /* _MSC_VER */ diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 0ee7a5c6c..f0bb4de01 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1289,7 +1289,7 @@ void PresetBundle::update_compatible(bool select_other_if_incompatible) { const Preset &printer_preset = this->printers.get_edited_preset(); - switch (printers.get_edited_preset().printer_technology()) { + switch (printer_preset.printer_technology()) { case ptFFF: { assert(printer_preset.config.has("default_print_profile")); diff --git a/xs/src/perlglue.cpp b/xs/src/perlglue.cpp index bcf84b957..da1d7abbf 100644 --- a/xs/src/perlglue.cpp +++ b/xs/src/perlglue.cpp @@ -115,6 +115,8 @@ SV* ConfigOption_to_SV(const ConfigOption &opt, const ConfigOptionDef &def) } case coPoint: return perl_to_SV_clone_ref(static_cast(&opt)->value); + case coPoint3: + return perl_to_SV_clone_ref(static_cast(&opt)->value); case coPoints: { auto optv = static_cast(&opt); @@ -248,6 +250,8 @@ bool ConfigBase__set(ConfigBase* THIS, const t_config_option_key &opt_key, SV* v } case coPoint: return from_SV_check(value, &static_cast(opt)->value); + case coPoint3: + return from_SV_check(value, &static_cast(&opt)->value); case coPoints: { std::vector &values = static_cast(opt)->values; diff --git a/xs/xsp/Config.xsp b/xs/xsp/Config.xsp index d5d295839..017c8dad4 100644 --- a/xs/xsp/Config.xsp +++ b/xs/xsp/Config.xsp @@ -159,6 +159,8 @@ print_config_def() opt_type = "s@"; } else if (optdef->type == coPoint || optdef->type == coPoints) { opt_type = "point"; + } else if (optdef.type == coPoint3) { + opt_type = "point3"; } else if (optdef->type == coBool || optdef->type == coBools) { opt_type = "bool"; } else if (optdef->type == coEnum) { From 8d8df8b6700d9f98b8aed1dbe77af488b4fe40ef Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 13 Mar 2019 16:06:21 +0100 Subject: [PATCH 124/236] added missing slic3r.hpp removed slic3r-noconsole.exe from the windows builds --- src/CMakeLists.txt | 10 ++-------- src/slic3r.hpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 src/slic3r.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b38ae3665..945328a00 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -88,9 +88,9 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/slic3r.rc.in ${CMAKE_CUR configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/slic3r.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/slic3r.manifest @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/osx/Info.plist.in ${CMAKE_CURRENT_BINARY_DIR}/Info.plist @ONLY) if (MSVC) - add_library(slic3r SHARED slic3r.cpp) + add_library(slic3r SHARED slic3r.cpp slic3r.hpp) else () - add_executable(slic3r slic3r.cpp) + add_executable(slic3r slic3r.cpp slic3r.hpp) endif () if (NOT MSVC) if(SLIC3R_GUI) @@ -161,11 +161,6 @@ if (MSVC) target_compile_definitions(slic3r_app_console PRIVATE -DSLIC3R_WRAPPER_CONSOLE -DSLIC3R_WRAPPER_NOGUI) add_dependencies(slic3r_app_console slic3r) set_target_properties(slic3r_app_console PROPERTIES OUTPUT_NAME "slic3r-console") - - add_executable(slic3r_app_noconsole WIN32 slic3r_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/slic3r.rc) - target_compile_definitions(slic3r_app_noconsole PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE -DSLIC3R_WRAPPER_NOGUI) - add_dependencies(slic3r_app_noconsole slic3r) - set_target_properties(slic3r_app_noconsole PROPERTIES OUTPUT_NAME "slic3r-noconsole") endif () # Link the resources dir to where Slic3r GUI expects it @@ -213,7 +208,6 @@ if (WIN32) if (MSVC) install(TARGETS slic3r_app_gui RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") install(TARGETS slic3r_app_console RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") - install(TARGETS slic3r_app_noconsole RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") endif () else () install(TARGETS slic3r RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/src/slic3r.hpp b/src/slic3r.hpp new file mode 100644 index 000000000..f977dc9eb --- /dev/null +++ b/src/slic3r.hpp @@ -0,0 +1,48 @@ +#ifndef SLIC3R_HPP +#define SLIC3R_HPP + +#include "libslic3r/Config.hpp" +#include "libslic3r/Model.hpp" + +namespace Slic3r { + +namespace IO { + enum ExportFormat : int { + AMF, + OBJ, + STL, + // SVG, + TMF, + Gcode + }; +} + +class CLI { +public: + int run(int argc, char **argv); + +private: + DynamicPrintAndCLIConfig m_config; + DynamicPrintConfig m_print_config; + DynamicPrintConfig m_extra_config; + std::vector m_input_files; + std::vector m_actions; + std::vector m_transforms; + std::vector m_models; + + bool setup(int argc, char **argv); + + /// Prints usage of the CLI. + void print_help(bool include_print_options = false) const; + + /// Exports loaded models to a file of the specified format, according to the options affecting output filename. + bool export_models(IO::ExportFormat format); + + bool has_print_action() const { return m_config.opt_bool("export_gcode") || m_config.opt_bool("export_sla"); } + + std::string output_filepath(const Model &model, IO::ExportFormat format) const; +}; + +} + +#endif From 22fcf245c406305e7095074d5694d2dbc2b21e10 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 13 Mar 2019 16:40:11 +0100 Subject: [PATCH 125/236] Fixed updating of the extruder value for last part in the object after deleting another parts (#1931) --- src/slic3r/GUI/GUI_ObjectList.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 04fb9b7ca..57469a0c6 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1407,12 +1407,14 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con // Cannot delete a wipe tower. return false; + ModelObject* object = (*m_objects)[obj_idx]; + if (type == itVolume) { - const auto volume = (*m_objects)[obj_idx]->volumes[idx]; + const auto volume = object->volumes[idx]; // if user is deleting the last solid part, throw error int solid_cnt = 0; - for (auto vol : (*m_objects)[obj_idx]->volumes) + for (auto vol : object->volumes) if (vol->is_model_part()) ++solid_cnt; if (volume->is_model_part() && solid_cnt == 1) { @@ -1420,14 +1422,23 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con return false; } - (*m_objects)[obj_idx]->delete_volume(idx); + object->delete_volume(idx); + + if (object->volumes.size() == 1) + { + const auto last_volume = object->volumes[0]; + if (!last_volume->config.empty()) { + object->config.apply(last_volume->config); + last_volume->config.clear(); + } + } } else if (type == itInstance) { - if ((*m_objects)[obj_idx]->instances.size() == 1) { + if (object->instances.size() == 1) { Slic3r::GUI::show_error(nullptr, _(L("You can't delete the last intance from object."))); return false; } - (*m_objects)[obj_idx]->delete_instance(idx); + object->delete_instance(idx); } else return false; @@ -1752,6 +1763,11 @@ void ObjectList::delete_from_model_and_list(const std::vector& it if (item->type&itVolume) { m_objects_model->Delete(m_objects_model->GetItemByVolumeId(item->obj_idx, item->sub_obj_idx)); + if ((*m_objects)[item->obj_idx]->volumes.size() == 1) + { + const wxString extruder = wxString::Format("%d", (*m_objects)[item->obj_idx]->config.option("extruder")->value); + m_objects_model->SetValue(extruder, m_objects_model->GetItemById(item->obj_idx), 1); + } wxGetApp().plater()->canvas3D()->ensure_on_bed(item->obj_idx); } else From df8d475363f5e1f0376f1d0fdfcd097e5ab6562f Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 13 Mar 2019 16:53:08 +0100 Subject: [PATCH 126/236] Fixed perl bindings --- xs/src/perlglue.cpp | 2 +- xs/xsp/Config.xsp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xs/src/perlglue.cpp b/xs/src/perlglue.cpp index da1d7abbf..1a551d67b 100644 --- a/xs/src/perlglue.cpp +++ b/xs/src/perlglue.cpp @@ -251,7 +251,7 @@ bool ConfigBase__set(ConfigBase* THIS, const t_config_option_key &opt_key, SV* v case coPoint: return from_SV_check(value, &static_cast(opt)->value); case coPoint3: - return from_SV_check(value, &static_cast(&opt)->value); + return from_SV_check(value, &static_cast(&opt)->value); case coPoints: { std::vector &values = static_cast(opt)->values; diff --git a/xs/xsp/Config.xsp b/xs/xsp/Config.xsp index 017c8dad4..f9482bd3b 100644 --- a/xs/xsp/Config.xsp +++ b/xs/xsp/Config.xsp @@ -159,7 +159,7 @@ print_config_def() opt_type = "s@"; } else if (optdef->type == coPoint || optdef->type == coPoints) { opt_type = "point"; - } else if (optdef.type == coPoint3) { + } else if (optdef->type == coPoint3) { opt_type = "point3"; } else if (optdef->type == coBool || optdef->type == coBools) { opt_type = "bool"; From cea6ca83db7ad60d87fe027b6df0d6764ab0fbb5 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 13 Mar 2019 17:06:45 +0100 Subject: [PATCH 127/236] removed the --gui parameter from the slic3r wrapper. Fixed the perl bindings --- src/CMakeLists.txt | 4 ++-- src/slic3r_app_msvc.cpp | 7 ++----- xs/src/perlglue.cpp | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 945328a00..aae3436ae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -153,12 +153,12 @@ endif () # Also the shim may load the Mesa software OpenGL renderer if the default renderer does not support OpenGL 2.0 and higher. if (MSVC) add_executable(slic3r_app_gui WIN32 slic3r_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/slic3r.rc) - target_compile_definitions(slic3r_app_gui PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE -DSLIC3R_WRAPPER_GUI) + target_compile_definitions(slic3r_app_gui PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE) add_dependencies(slic3r_app_gui slic3r) set_target_properties(slic3r_app_gui PROPERTIES OUTPUT_NAME "slic3r") add_executable(slic3r_app_console slic3r_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/slic3r.rc) - target_compile_definitions(slic3r_app_console PRIVATE -DSLIC3R_WRAPPER_CONSOLE -DSLIC3R_WRAPPER_NOGUI) + target_compile_definitions(slic3r_app_console PRIVATE -DSLIC3R_WRAPPER_CONSOLE) add_dependencies(slic3r_app_console slic3r) set_target_properties(slic3r_app_console PROPERTIES OUTPUT_NAME "slic3r-console") endif () diff --git a/src/slic3r_app_msvc.cpp b/src/slic3r_app_msvc.cpp index ff5ad6cfa..48c166406 100644 --- a/src/slic3r_app_msvc.cpp +++ b/src/slic3r_app_msvc.cpp @@ -206,11 +206,8 @@ int wmain(int argc, wchar_t **argv) std::vector argv_extended; argv_extended.emplace_back(argv[0]); -#ifdef SLIC3R_WRAPPER_GUI - std::wstring cmd_gui = L"--gui"; - argv_extended.emplace_back(const_cast(cmd_gui.data())); -#endif - for (int i = 1; i < argc; ++i) + // Here one may push some additional parameters based on the wrapper type. + for (int i = 1; i < argc; ++ i) argv_extended.emplace_back(argv[i]); argv_extended.emplace_back(nullptr); diff --git a/xs/src/perlglue.cpp b/xs/src/perlglue.cpp index 1a551d67b..eea5ad54f 100644 --- a/xs/src/perlglue.cpp +++ b/xs/src/perlglue.cpp @@ -251,7 +251,7 @@ bool ConfigBase__set(ConfigBase* THIS, const t_config_option_key &opt_key, SV* v case coPoint: return from_SV_check(value, &static_cast(opt)->value); case coPoint3: - return from_SV_check(value, &static_cast(&opt)->value); + return from_SV_check(value, &static_cast(opt)->value); case coPoints: { std::vector &values = static_cast(opt)->values; From c6bae3e251dec33d602e1cabd158abf73be59b71 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 13 Mar 2019 17:29:47 +0100 Subject: [PATCH 128/236] Slight enhancements in the cascading algorithm. --- src/libslic3r/SLA/SLASupportTree.cpp | 31 +++++++++++----------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 4f449523a..5f339fc96 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -75,7 +75,7 @@ const double SupportConfig::max_solo_pillar_height_mm = 15.0; const double SupportConfig::max_dual_pillar_height_mm = 35.0; const double SupportConfig::optimizer_rel_score_diff = 1e-6; const unsigned SupportConfig::optimizer_max_iterations = 1000; -const unsigned SupportConfig::pillar_cascade_neighbors = 2; +const unsigned SupportConfig::pillar_cascade_neighbors = 3; const unsigned SupportConfig::max_bridges_on_pillar = 3; using Coordf = double; @@ -1004,13 +1004,9 @@ class SLASupportTree::Algorithm { // Now a and b vectors are perpendicular to v and to each other. // Together they define the plane where we have to iterate with the // given angles in the 'phis' vector - -// std::cout << "Head check begin: " << std::endl; - tbb::parallel_for(size_t(0), phis.size(), [&phis, &hits, &m, sd, r_pin, r_back, s, a, b, c] (size_t i) -// for(size_t i = 0; i < phis.size(); ++i) { double& phi = phis[i]; double sinphi = std::sin(phi); @@ -1042,9 +1038,6 @@ class SLASupportTree::Algorithm { if(q.is_inside()) { // the hit is inside the model if(q.distance() > r_pin + sd) { - -// std::cout << "Fatal inside hit. Phi: " << phi << " distance: " << q.distance() << std::endl; - // If we are inside the model and the hit distance is bigger // than our pin circle diameter, it probably indicates that // the support point was already inside the model, or there @@ -1055,21 +1048,17 @@ class SLASupportTree::Algorithm { hits[i] = HitResult(0.0); } else { -// std::cout << "Recoverable inside hit. Phi: " << phi << " distance: " << q.distance() << " re-cast dist: " ; // re-cast the ray from the outside of the object. // The starting point has an offset of 2*safety_distance // because the original ray has also had an offset auto q2 = m.query_ray_hit(ps + (q.distance() + 2*sd)*n, n); hits[i] = q2; -// std::cout << q2.distance() << std::endl; } } else hits[i] = q; }); auto mit = std::min_element(hits.begin(), hits.end()); -// std::cout << "Head check end. Result: " << mit->distance() << std::endl; - return *mit; } @@ -1896,6 +1885,13 @@ public: { Vec3d qp = el.first; + const Pillar& pillar = m_result.pillars()[el.second]; + + unsigned neighbors = m_cfg.pillar_cascade_neighbors; + + // connections are enough for one pillar + if(pillar.links >= neighbors) return; + // Query all remaining points within reach auto qres = m_pillar_index.query([qp, d](const SpatElement& e){ return distance(e.first, qp) < d; @@ -1907,13 +1903,7 @@ public: return distance(e1.first, qp) < distance(e2.first, qp); }); - const Pillar& pillar = m_result.pillars()[el.second]; - - unsigned neighbors = m_cfg.pillar_cascade_neighbors; - for(auto& re : qres) { - // connections are enough for one pillar - if(pillar.links >= neighbors) break; if(re.second == el.second) continue; @@ -1934,7 +1924,7 @@ public: pairs.insert(hashval); // If the interconnection length between the two pillars is - // less than 20% of the longer pillar's height, don't count + // less than 50% of the longer pillar's height, don't count if(pillar.height < H1 || neighborpillar.height / pillar.height > min_height_ratio) m_result.increment_links(pillar); @@ -1944,6 +1934,9 @@ public: m_result.increment_links(neighborpillar); } + + // connections are enough for one pillar + if(pillar.links >= neighbors) break; } }; From c980e96dbbb21d5ddbc01fa432695b26ace52b59 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 13 Mar 2019 17:38:48 +0100 Subject: [PATCH 129/236] Fix of perl bindings --- xs/src/perlglue.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xs/src/perlglue.cpp b/xs/src/perlglue.cpp index eea5ad54f..463f7d21b 100644 --- a/xs/src/perlglue.cpp +++ b/xs/src/perlglue.cpp @@ -250,8 +250,9 @@ bool ConfigBase__set(ConfigBase* THIS, const t_config_option_key &opt_key, SV* v } case coPoint: return from_SV_check(value, &static_cast(opt)->value); - case coPoint3: - return from_SV_check(value, &static_cast(opt)->value); +// case coPoint3: + // not gonna fix it, die Perl die! +// return from_SV_check(value, &static_cast(opt)->value); case coPoints: { std::vector &values = static_cast(opt)->values; From c7ba6500979fe2b630e32b52d1b92c150dbfe638 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 13 Mar 2019 19:17:26 +0100 Subject: [PATCH 130/236] Help for the FFF / SLA command line parameters. Removed the cli parameter from most options as it is derived from the option key. Options without CLI parameter are now marked with cli = nocli. --- src/libslic3r/Config.cpp | 116 +++++----- src/libslic3r/Config.hpp | 27 ++- src/libslic3r/PrintConfig.cpp | 393 ++++++++-------------------------- src/libslic3r/PrintConfig.hpp | 10 - src/slic3r.cpp | 13 +- src/slic3r.hpp | 2 +- 6 files changed, 185 insertions(+), 376 deletions(-) diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index e7984e6cc..037bd3500 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include // std::runtime_error #include #include @@ -190,16 +191,26 @@ bool unescape_strings_cstyle(const std::string &str, std::vector &o } } -std::vector ConfigOptionDef::cli_args() const +std::vector ConfigOptionDef::cli_args(const std::string &key) const { - std::string cli = this->cli.substr(0, this->cli.find("=")); - boost::trim_right_if(cli, boost::is_any_of("!")); - std::vector args; - boost::split(args, cli, boost::is_any_of("|")); + std::vector args; + if (this->cli != ConfigOptionDef::nocli) { + std::string cli = this->cli.substr(0, this->cli.find("=")); + boost::trim_right_if(cli, boost::is_any_of("!")); + if (cli.empty()) { + // Add the key + std::string opt = key; + boost::replace_all(opt, "_", "-"); + args.emplace_back(std::move(opt)); + } else + boost::split(args, cli, boost::is_any_of("|")); + } return args; } -std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults) const +std::string ConfigOptionDef::nocli = "~~~noCLI"; + +std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults, std::function filter) const { // prepare a function for wrapping text auto wrap = [](std::string text, size_t line_length) -> std::string { @@ -222,12 +233,13 @@ std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults) c } return wrapped.str(); }; - + // get the unique categories std::set categories; for (const auto& opt : this->options) { const ConfigOptionDef& def = opt.second; - categories.insert(def.category); + if (filter(def)) + categories.insert(def.category); } for (auto category : categories) { @@ -239,55 +251,57 @@ std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults) c for (const auto& opt : this->options) { const ConfigOptionDef& def = opt.second; - if (def.category != category) continue; + if (def.category != category || def.cli == ConfigOptionDef::nocli || !filter(def)) + continue; - if (!def.cli.empty()) { - // get all possible variations: --foo, --foobar, -f... - auto cli_args = def.cli_args(); - for (auto& arg : cli_args) { - arg.insert(0, (arg.size() == 1) ? "-" : "--"); - if (def.type == coFloat || def.type == coInt || def.type == coFloatOrPercent - || def.type == coFloats || def.type == coInts) { - arg += " N"; - } else if (def.type == coPoint) { - arg += " X,Y"; - } else if (def.type == coPoint3) { - arg += " X,Y,Z"; - } else if (def.type == coString || def.type == coStrings) { - arg += " ABCD"; - } + // get all possible variations: --foo, --foobar, -f... + std::vector cli_args = def.cli_args(opt.first); + if (cli_args.empty()) + continue; + + for (auto& arg : cli_args) { + arg.insert(0, (arg.size() == 1) ? "-" : "--"); + if (def.type == coFloat || def.type == coInt || def.type == coFloatOrPercent + || def.type == coFloats || def.type == coInts) { + arg += " N"; + } else if (def.type == coPoint) { + arg += " X,Y"; + } else if (def.type == coPoint3) { + arg += " X,Y,Z"; + } else if (def.type == coString || def.type == coStrings) { + arg += " ABCD"; } + } - // left: command line options - const std::string cli = boost::algorithm::join(cli_args, ", "); - out << " " << std::left << std::setw(20) << cli; + // left: command line options + const std::string cli = boost::algorithm::join(cli_args, ", "); + out << " " << std::left << std::setw(20) << cli; - // right: option description - std::string descr = def.tooltip; - if (show_defaults && def.default_value != nullptr && def.type != coBool - && (def.type != coString || !def.default_value->serialize().empty())) { - descr += " ("; - if (!def.sidetext.empty()) { - descr += def.sidetext + ", "; - } else if (!def.enum_values.empty()) { - descr += boost::algorithm::join(def.enum_values, ", ") + "; "; - } - descr += "default: " + def.default_value->serialize() + ")"; + // right: option description + std::string descr = def.tooltip; + if (show_defaults && def.default_value != nullptr && def.type != coBool + && (def.type != coString || !def.default_value->serialize().empty())) { + descr += " ("; + if (!def.sidetext.empty()) { + descr += def.sidetext + ", "; + } else if (!def.enum_values.empty()) { + descr += boost::algorithm::join(def.enum_values, ", ") + "; "; } + descr += "default: " + def.default_value->serialize() + ")"; + } - // wrap lines of description - descr = wrap(descr, 80); - std::vector lines; - boost::split(lines, descr, boost::is_any_of("\n")); + // wrap lines of description + descr = wrap(descr, 80); + std::vector lines; + boost::split(lines, descr, boost::is_any_of("\n")); - // if command line options are too long, print description in new line - for (size_t i = 0; i < lines.size(); ++i) { - if (i == 0 && cli.size() > 19) - out << std::endl; - if (i > 0 || cli.size() > 19) - out << std::string(21, ' '); - out << lines[i] << std::endl; - } + // if command line options are too long, print description in new line + for (size_t i = 0; i < lines.size(); ++i) { + if (i == 0 && cli.size() > 19) + out << std::endl; + if (i > 0 || cli.size() > 19) + out << std::string(21, ' '); + out << lines[i] << std::endl; } } } @@ -657,7 +671,7 @@ bool DynamicConfig::read_cli(int argc, char** argv, t_config_option_keys* extra, // cache the CLI option => opt_key mapping std::map opts; for (const auto &oit : this->def()->options) - for (auto t : oit.second.cli_args()) + for (auto t : oit.second.cli_args(oit.first)) opts[t] = oit.first; bool parse_options = true; diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 6fb8cb0c1..1e5972701 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -88,6 +89,18 @@ enum ConfigOptionMode { comExpert }; +enum PrinterTechnology +{ + // Fused Filament Fabrication + ptFFF, + // Stereolitography + ptSLA, + // Unknown, useful for command line processing + ptUnknown, + // Any technology, useful for parameters compatible with both ptFFF and ptSLA + ptAny +}; + // A generic value of a configuration option. class ConfigOption { public: @@ -1014,6 +1027,8 @@ public: // The full label is shown, when adding an override parameter for an object or a modified object. std::string label; std::string full_label; + // With which printer technology is this configuration valid? + PrinterTechnology printer_technology = ptUnknown; // Category of a configuration field, from the GUI perspective. // One of: "Layers and Perimeters", "Infill", "Support material", "Speed", "Extruders", "Advanced", "Extrusion Width" std::string category; @@ -1065,8 +1080,12 @@ public: return false; } - /// Returns the alternative CLI arguments for the given option. - std::vector cli_args() const; + // Returns the alternative CLI arguments for the given option. + // If there are no cli arguments defined, use the key and replace underscores with dashes. + std::vector cli_args(const std::string &key) const; + + // Assign this key to cli to disable CLI for this option. + static std::string nocli; }; // Map from a config option name to its definition. @@ -1102,7 +1121,9 @@ public: } /// Iterate through all of the CLI options and write them to a stream. - std::ostream& print_cli_help(std::ostream& out, bool show_defaults) const; + std::ostream& print_cli_help( + std::ostream& out, bool show_defaults, + std::function filter = [](const ConfigOptionDef &){ return true; }) const; protected: ConfigOptionDef* add(const t_config_option_key &opt_key, ConfigOptionType type) { diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d17c7370b..8d5d0d69f 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -16,11 +16,21 @@ namespace Slic3r { //! return same string #define L(s) Slic3r::I18N::translate(s) +static void assign_printer_technology_to_unknown(t_optiondef_map &options, PrinterTechnology printer_technology) +{ + for (std::pair &kvp : options) + if (kvp.second.printer_technology == ptUnknown) + kvp.second.printer_technology = printer_technology; +} + PrintConfigDef::PrintConfigDef() { this->init_common_params(); + assign_printer_technology_to_unknown(this->options, ptAny); this->init_fff_params(); + assign_printer_technology_to_unknown(this->options, ptFFF); this->init_sla_params(); + assign_printer_technology_to_unknown(this->options, ptSLA); } void PrintConfigDef::init_common_params() @@ -31,7 +41,6 @@ void PrintConfigDef::init_common_params() def = this->add("printer_technology", coEnum); def->label = L("Printer technology"); def->tooltip = L("Printer technology"); - def->cli = "printer-technology=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("FFF"); def->enum_values.push_back("SLA"); @@ -48,7 +57,6 @@ void PrintConfigDef::init_common_params() def->tooltip = L("This setting controls the height (and thus the total number) of the slices/layers. " "Thinner layers give better accuracy but take more time to print."); def->sidetext = L("mm"); - def->cli = "layer-height=f"; def->min = 0; def->default_value = new ConfigOptionFloat(0.3); @@ -56,7 +64,6 @@ void PrintConfigDef::init_common_params() def->label = L("Max print height"); def->tooltip = L("Set this to the maximum height that can be reached by your extruder while printing."); def->sidetext = L("mm"); - def->cli = "max-print-height=f"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(200.0); @@ -66,7 +73,6 @@ void PrintConfigDef::init_common_params() def->tooltip = L("Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. " "The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low."); def->sidetext = L("mm"); - def->cli = "slice-closing-radius=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0.049); @@ -75,7 +81,6 @@ void PrintConfigDef::init_common_params() def->label = L("Hostname, IP or URL"); def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance."); - def->cli = "print-host=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionString(""); @@ -83,7 +88,6 @@ void PrintConfigDef::init_common_params() def->label = L("API Key / Password"); def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication."); - def->cli = "printhost-apikey=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionString(""); @@ -91,7 +95,6 @@ void PrintConfigDef::init_common_params() def->label = "HTTPS CA File"; def->tooltip = "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. " "If left blank, the default OS CA certificate repository is used."; - def->cli = "printhost-cafile=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionString(""); } @@ -109,7 +112,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Optimize travel moves in order to minimize the crossing of perimeters. " "This is mostly useful with Bowden extruders which suffer from oozing. " "This feature slows down both the print and the G-code generation."); - def->cli = "avoid-crossing-perimeters!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -117,7 +119,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Other layers"); def->tooltip = L("Bed temperature for layers after the first one. " "Set this to zero to disable bed temperature control commands in the output."); - def->cli = "bed-temperature=i@"; def->full_label = L("Bed temperature"); def->min = 0; def->max = 300; @@ -128,7 +129,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " "as [layer_num] and [layer_z]."); - def->cli = "before-layer-gcode=s"; def->multiline = true; def->full_width = true; def->height = 50; @@ -138,7 +138,6 @@ void PrintConfigDef::init_fff_params() def = this->add("between_objects_gcode", coString); def->label = L("Between objects G-code"); def->tooltip = L("This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."); - def->cli = "between-objects-gcode=s"; def->multiline = true; def->full_width = true; def->height = 120; @@ -149,7 +148,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Bottom"); def->category = L("Layers and Perimeters"); def->tooltip = L("Number of solid layers to generate on bottom surfaces."); - def->cli = "bottom-solid-layers=i"; def->full_label = L("Bottom solid layers"); def->min = 0; def->default_value = new ConfigOptionInt(3); @@ -159,7 +157,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This is the acceleration your printer will use for bridges. " "Set zero to disable acceleration control for bridges."); def->sidetext = L("mm/s²"); - def->cli = "bridge-acceleration=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -171,7 +168,6 @@ void PrintConfigDef::init_fff_params() "automatically. Otherwise the provided angle will be used for all bridges. " "Use 180° for zero angle."); def->sidetext = L("°"); - def->cli = "bridge-angle=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0.); @@ -180,7 +176,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Bridges fan speed"); def->tooltip = L("This fan speed is enforced during all bridges and overhangs."); def->sidetext = L("%"); - def->cli = "bridge-fan-speed=i@"; def->min = 0; def->max = 100; def->mode = comExpert; @@ -193,7 +188,6 @@ void PrintConfigDef::init_fff_params() "You can decrease it slightly to pull the extrudates and prevent sagging, " "although default settings are usually good and you should experiment " "with cooling (use a fan) before tweaking this."); - def->cli = "bridge-flow-ratio=f"; def->min = 0; def->max = 2; def->mode = comAdvanced; @@ -204,7 +198,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Speed"); def->tooltip = L("Speed for printing bridges."); def->sidetext = L("mm/s"); - def->cli = "bridge-speed=f"; def->aliases = { "bridge_feed_rate" }; def->min = 0; def->mode = comAdvanced; @@ -214,7 +207,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Brim width"); def->tooltip = L("Horizontal width of the brim that will be printed around each object on the first layer."); def->sidetext = L("mm"); - def->cli = "brim-width=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0); @@ -224,20 +216,19 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("When printing multi-material objects, this settings will make slic3r " "to clip the overlapping object parts one by the other " "(2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."); - def->cli = "clip-multipart-objects!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); def = this->add("colorprint_heights", coFloats); def->label = L("Colorprint height"); def->tooltip = L("Heights at which a filament change is to occur. "); - def->cli = "colorprint-heights=f@"; def->default_value = new ConfigOptionFloats { }; def = this->add("compatible_printers", coStrings); def->label = L("Compatible printers"); def->mode = comAdvanced; def->default_value = new ConfigOptionStrings(); + def->cli = ConfigOptionDef::nocli; def = this->add("compatible_printers_condition", coString); def->label = L("Compatible printers condition"); @@ -246,11 +237,13 @@ void PrintConfigDef::init_fff_params() "with the active printer profile."); def->mode = comExpert; def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; def = this->add("compatible_prints", coStrings); def->label = L("Compatible print profiles"); def->mode = comAdvanced; def->default_value = new ConfigOptionStrings(); + def->cli = ConfigOptionDef::nocli; def = this->add("compatible_prints_condition", coString); def->label = L("Compatible print profiles condition"); @@ -259,13 +252,16 @@ void PrintConfigDef::init_fff_params() "with the active print profile."); def->mode = comExpert; def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; // The following value is to be stored into the project file (AMF, 3MF, Config ...) // and it contains a sum of "compatible_printers_condition" values over the print and filament profiles. def = this->add("compatible_printers_condition_cummulative", coStrings); def->default_value = new ConfigOptionStrings(); + def->cli = ConfigOptionDef::nocli; def = this->add("compatible_prints_condition_cummulative", coStrings); def->default_value = new ConfigOptionStrings(); + def->cli = ConfigOptionDef::nocli; def = this->add("complete_objects", coBool); def->label = L("Complete individual objects"); @@ -273,7 +269,6 @@ void PrintConfigDef::init_fff_params() "each object before moving onto next one (and starting it from its bottom layer). " "This feature is useful to avoid the risk of ruined prints. " "Slic3r should warn and prevent you from extruder collisions, but beware."); - def->cli = "complete-objects!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(false); @@ -281,14 +276,12 @@ void PrintConfigDef::init_fff_params() def->label = L("Enable auto cooling"); def->tooltip = L("This flag enables the automatic cooling logic that adjusts print speed " "and fan speed according to layer printing time."); - def->cli = "cooling!"; def->default_value = new ConfigOptionBools { true }; def = this->add("cooling_tube_retraction", coFloat); def->label = L("Cooling tube position"); def->tooltip = L("Distance of the center-point of the cooling tube from the extruder tip "); def->sidetext = L("mm"); - def->cli = "cooling_tube_retraction=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(91.5f); @@ -297,7 +290,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Cooling tube length"); def->tooltip = L("Length of the cooling tube to limit space for cooling moves inside it "); def->sidetext = L("mm"); - def->cli = "cooling_tube_length=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(5.f); @@ -308,7 +300,6 @@ void PrintConfigDef::init_fff_params() "the role-specific acceleration values are used (perimeter/infill). " "Set zero to prevent resetting acceleration at all."); def->sidetext = L("mm/s²"); - def->cli = "default-acceleration=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -318,19 +309,20 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Default filament profile associated with the current printer profile. " "On selection of the current printer profile, this filament profile will be activated."); def->default_value = new ConfigOptionStrings(); + def->cli = ConfigOptionDef::nocli; def = this->add("default_print_profile", coString); def->label = L("Default print profile"); def->tooltip = L("Default print profile associated with the current printer profile. " "On selection of the current printer profile, this print profile will be activated."); def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; def = this->add("disable_fan_first_layers", coInts); def->label = L("Disable fan for the first"); def->tooltip = L("You can set this to a positive value to disable fan at all " "during the first layers, so that it does not make adhesion worse."); def->sidetext = L("layers"); - def->cli = "disable-fan-first-layers=i@"; def->min = 0; def->max = 1000; def->mode = comExpert; @@ -341,7 +333,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("Experimental option for preventing support material from being generated " "under bridged areas."); - def->cli = "dont-support-bridges!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(true); @@ -349,7 +340,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Distance between copies"); def->tooltip = L("Distance used for the auto-arrange feature of the plater."); def->sidetext = L("mm"); - def->cli = "duplicate-distance=f"; def->aliases = { "multiply_distance" }; def->min = 0; def->default_value = new ConfigOptionFloat(6); @@ -360,7 +350,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("The first layer will be shrunk in the XY plane by the configured value " "to compensate for the 1st layer squish aka an Elephant Foot effect."); def->sidetext = L("mm"); - def->cli = "elefant-foot-compensation=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0); @@ -369,7 +358,6 @@ void PrintConfigDef::init_fff_params() def->label = L("End G-code"); def->tooltip = L("This end procedure is inserted at the end of the output file. " "Note that you can use placeholder variables for all Slic3r settings."); - def->cli = "end-gcode=s"; def->multiline = true; def->full_width = true; def->height = 120; @@ -381,7 +369,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This end procedure is inserted at the end of the output file, before the printer end gcode. " "Note that you can use placeholder variables for all Slic3r settings. " "If you have multiple extruders, the gcode is processed in extruder order."); - def->cli = "end-filament-gcode=s@"; def->multiline = true; def->full_width = true; def->height = 120; @@ -393,7 +380,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Layers and Perimeters"); def->tooltip = L("Add solid infill near sloping surfaces to guarantee the vertical shell thickness " "(top+bottom solid layers)."); - def->cli = "ensure-vertical-shell-thickness!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(false); @@ -401,7 +387,7 @@ void PrintConfigDef::init_fff_params() def->label = L("Top fill pattern"); def->category = L("Infill"); def->tooltip = L("Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."); - def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern=s"; + def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("rectilinear"); def->enum_values.push_back("concentric"); @@ -421,7 +407,7 @@ void PrintConfigDef::init_fff_params() *def = *def_top_fill_pattern; def->label = L("Bottom Pattern"); def->tooltip = L("Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."); - def->cli = "bottom-fill-pattern|external-fill-pattern|solid-fill-pattern=s"; + def->cli = "bottom-fill-pattern|external-fill-pattern|solid-fill-pattern"; def->default_value = new ConfigOptionEnum(ipRectilinear); def = this->add("external_perimeter_extrusion_width", coFloatOrPercent); @@ -431,7 +417,6 @@ void PrintConfigDef::init_fff_params() "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. " "If expressed as percentage (for example 200%), it will be computed over layer height."); def->sidetext = L("mm or % (leave 0 for default)"); - def->cli = "external-perimeter-extrusion-width=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(0, false); @@ -442,7 +427,6 @@ void PrintConfigDef::init_fff_params() "If expressed as percentage (for example: 80%) it will be calculated " "on the perimeters speed setting above. Set to zero for auto."); def->sidetext = L("mm/s or %"); - def->cli = "external-perimeter-speed=s"; def->ratio_over = "perimeter_speed"; def->min = 0; def->mode = comAdvanced; @@ -453,7 +437,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Layers and Perimeters"); def->tooltip = L("Print contour perimeters from the outermost one to the innermost one " "instead of the default inverse order."); - def->cli = "external-perimeters-first!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -463,7 +446,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Add more perimeters when needed for avoiding gaps in sloping walls. " "Slic3r keeps adding perimeters, until more than 70% of the loop immediately above " "is supported."); - def->cli = "extra-perimeters!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(true); @@ -473,7 +455,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Extruders"); def->tooltip = L("The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support extruders."); - def->cli = "extruder=i"; def->min = 0; // 0 = inherit defaults def->enum_labels.push_back("default"); // override label for item 0 def->enum_labels.push_back("1"); @@ -489,7 +470,6 @@ void PrintConfigDef::init_fff_params() "and it represents the maximum depth the extruder can peek before colliding with " "other printed objects."); def->sidetext = L("mm"); - def->cli = "extruder-clearance-height=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(20); @@ -501,7 +481,6 @@ void PrintConfigDef::init_fff_params() "This setting is used to check for collisions and to display the graphical preview " "in the plater."); def->sidetext = L("mm"); - def->cli = "extruder-clearance-radius=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(20); @@ -509,7 +488,6 @@ void PrintConfigDef::init_fff_params() def = this->add("extruder_colour", coStrings); def->label = L("Extruder Color"); def->tooltip = L("This is only used in the Slic3r interface as a visual help."); - def->cli = "extruder-color=s@"; def->gui_type = "color"; // Empty string means no color assigned yet. def->default_value = new ConfigOptionStrings { "" }; @@ -521,7 +499,6 @@ void PrintConfigDef::init_fff_params() "with respect to the first one. It expects positive coordinates (they will be subtracted " "from the XY coordinate)."); def->sidetext = L("mm"); - def->cli = "extruder-offset=s@"; def->mode = comAdvanced; def->default_value = new ConfigOptionPoints { Vec2d(0,0) }; @@ -529,7 +506,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Extrusion axis"); def->tooltip = L("Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)."); - def->cli = "extrusion-axis=s"; def->default_value = new ConfigOptionString("E"); def = this->add("extrusion_multiplier", coFloats); @@ -538,7 +514,6 @@ void PrintConfigDef::init_fff_params() "this setting to get nice surface finish and correct single wall widths. " "Usual values are between 0.9 and 1.1. If you think you need to change this more, " "check filament diameter and your firmware E steps."); - def->cli = "extrusion-multiplier=f@"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 1. }; @@ -550,7 +525,6 @@ void PrintConfigDef::init_fff_params() "(see the tooltips for perimeter extrusion width, infill extrusion width etc). " "If expressed as percentage (for example: 230%), it will be computed over layer height."); def->sidetext = L("mm or % (leave 0 for auto)"); - def->cli = "extrusion-width=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(0, false); @@ -558,7 +532,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Keep fan always on"); def->tooltip = L("If this is enabled, fan will never be disabled and will be kept running at least " "at its minimum speed. Useful for PLA, harmful for ABS."); - def->cli = "fan-always-on!"; def->default_value = new ConfigOptionBools { false }; def = this->add("fan_below_layer_time", coInts); @@ -566,7 +539,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("If layer print time is estimated below this number of seconds, fan will be enabled " "and its speed will be calculated by interpolating the minimum and maximum speeds."); def->sidetext = L("approximate seconds"); - def->cli = "fan-below-layer-time=i@"; def->width = 60; def->min = 0; def->max = 1000; @@ -576,14 +548,12 @@ void PrintConfigDef::init_fff_params() def = this->add("filament_colour", coStrings); def->label = L("Color"); def->tooltip = L("This is only used in the Slic3r interface as a visual help."); - def->cli = "filament-color=s@"; def->gui_type = "color"; def->default_value = new ConfigOptionStrings { "#29B2B2" }; def = this->add("filament_notes", coStrings); def->label = L("Filament notes"); def->tooltip = L("You can put your notes regarding the filament here."); - def->cli = "filament-notes=s@"; def->multiline = true; def->full_width = true; def->height = 130; @@ -596,7 +566,6 @@ void PrintConfigDef::init_fff_params() "speed of a print to the minimum of print and filament volumetric speed. " "Set to zero for no limit."); def->sidetext = L("mm³/s"); - def->cli = "filament-max-volumetric-speed=f@"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 0. }; @@ -605,7 +574,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Loading speed"); def->tooltip = L("Speed used for loading the filament on the wipe tower. "); def->sidetext = L("mm/s"); - def->cli = "filament-loading-speed=f@"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloats { 28. }; @@ -614,7 +582,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Loading speed at the start"); def->tooltip = L("Speed used at the very beginning of loading phase. "); def->sidetext = L("mm/s"); - def->cli = "filament-loading-speed-start=f@"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloats { 3. }; @@ -624,7 +591,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Speed used for unloading the filament on the wipe tower (does not affect " " initial part of unloading just after ramming). "); def->sidetext = L("mm/s"); - def->cli = "filament-unloading-speed=f@"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloats { 90. }; @@ -633,7 +599,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Unloading speed at the start"); def->tooltip = L("Speed used for unloading the tip of the filament immediately after ramming. "); def->sidetext = L("mm/s"); - def->cli = "filament-unloading-speed-start=f@"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloats { 100. }; @@ -644,7 +609,6 @@ void PrintConfigDef::init_fff_params() "May help to get reliable toolchanges with flexible materials " "that may need more time to shrink to original dimensions. "); def->sidetext = L("s"); - def->cli = "filament-toolchange-delay=f@"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloats { 0. }; @@ -653,7 +617,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Number of cooling moves"); def->tooltip = L("Filament is cooled by being moved back and forth in the " "cooling tubes. Specify desired number of these moves "); - def->cli = "filament-cooling-moves=i@"; def->max = 0; def->max = 20; def->mode = comExpert; @@ -662,7 +625,6 @@ void PrintConfigDef::init_fff_params() def = this->add("filament_cooling_initial_speed", coFloats); def->label = L("Speed of the first cooling move"); def->tooltip = L("Cooling moves are gradually accelerating beginning at this speed. "); - def->cli = "filament-cooling-initial-speed=f@"; def->sidetext = L("mm/s"); def->min = 0; def->mode = comExpert; @@ -674,7 +636,6 @@ void PrintConfigDef::init_fff_params() "the nozzle may not be known, and the filament pressure is likely not yet stable. " "Before purging the print head into an infill or a sacrificial object, Slic3r will always prime " "this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably."); - def->cli = "filament-minimal-purge-on-wipe-tower=f@"; def->sidetext = L("mm³"); def->min = 0; def->mode = comExpert; @@ -683,7 +644,6 @@ void PrintConfigDef::init_fff_params() def = this->add("filament_cooling_final_speed", coFloats); def->label = L("Speed of the last cooling move"); def->tooltip = L("Cooling moves are gradually accelerating towards this speed. "); - def->cli = "filament-cooling-final-speed=f@"; def->sidetext = L("mm/s"); def->min = 0; def->mode = comExpert; @@ -692,7 +652,6 @@ void PrintConfigDef::init_fff_params() def = this->add("filament_load_time", coFloats); def->label = L("Filament load time"); def->tooltip = L("Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."); - def->cli = "filament-load-time=i@"; def->sidetext = L("s"); def->min = 0; def->mode = comExpert; @@ -701,7 +660,6 @@ void PrintConfigDef::init_fff_params() def = this->add("filament_ramming_parameters", coStrings); def->label = L("Ramming parameters"); def->tooltip = L("This string is edited by RammingDialog and contains ramming specific parameters "); - def->cli = "filament-ramming-parameters=s@"; def->mode = comExpert; def->default_value = new ConfigOptionStrings { "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0|" " 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" }; @@ -709,7 +667,6 @@ void PrintConfigDef::init_fff_params() def = this->add("filament_unload_time", coFloats); def->label = L("Filament unload time"); def->tooltip = L("Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."); - def->cli = "filament-unload-time=i@"; def->sidetext = L("s"); def->min = 0; def->mode = comExpert; @@ -720,7 +677,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Enter your filament diameter here. Good precision is required, so use a caliper " "and do multiple measurements along the filament, then compute the average."); def->sidetext = L("mm"); - def->cli = "filament-diameter=f@"; def->min = 0; def->default_value = new ConfigOptionFloats { 3. }; @@ -730,14 +686,12 @@ void PrintConfigDef::init_fff_params() "A decent way is to weigh a known length of filament and compute the ratio " "of the length to volume. Better is to calculate the volume directly through displacement."); def->sidetext = L("g/cm³"); - def->cli = "filament-density=f@"; def->min = 0; def->default_value = new ConfigOptionFloats { 0. }; def = this->add("filament_type", coStrings); def->label = L("Filament type"); def->tooltip = L("The filament material type for use in custom G-codes."); - def->cli = "filament_type=s@"; def->gui_type = "f_enum_open"; def->gui_flags = "show_value"; def->enum_values.push_back("PLA"); @@ -755,7 +709,6 @@ void PrintConfigDef::init_fff_params() def = this->add("filament_soluble", coBools); def->label = L("Soluble material"); def->tooltip = L("Soluble material is most likely used for a soluble support."); - def->cli = "filament-soluble!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBools { false }; @@ -763,12 +716,12 @@ void PrintConfigDef::init_fff_params() def->label = L("Cost"); def->tooltip = L("Enter your filament cost per kg here. This is only for statistical information."); def->sidetext = L("money/kg"); - def->cli = "filament-cost=f@"; def->min = 0; def->default_value = new ConfigOptionFloats { 0. }; def = this->add("filament_settings_id", coStrings); def->default_value = new ConfigOptionStrings { "" }; + def->cli = ConfigOptionDef::nocli; def = this->add("fill_angle", coFloat); def->label = L("Fill angle"); @@ -777,7 +730,6 @@ void PrintConfigDef::init_fff_params() "Bridges will be infilled using the best direction Slic3r can detect, so this setting " "does not affect them."); def->sidetext = L("°"); - def->cli = "fill-angle=f"; def->min = 0; def->max = 360; def->mode = comAdvanced; @@ -790,7 +742,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Infill"); def->tooltip = L("Density of internal infill, expressed in the range 0% - 100%."); def->sidetext = L("%"); - def->cli = "fill-density=s"; def->min = 0; def->max = 100; def->enum_values.push_back("0"); @@ -827,7 +778,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Fill pattern"); def->category = L("Infill"); def->tooltip = L("Fill pattern for general low-density infill."); - def->cli = "fill-pattern=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("rectilinear"); def->enum_values.push_back("grid"); @@ -862,7 +812,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This is the acceleration your printer will use for first layer. Set zero " "to disable acceleration control for first layer."); def->sidetext = L("mm/s²"); - def->cli = "first-layer-acceleration=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -871,7 +820,6 @@ void PrintConfigDef::init_fff_params() def->label = L("First layer"); def->tooltip = L("Heated build plate temperature for the first layer. Set this to zero to disable " "bed temperature control commands in the output."); - def->cli = "first-layer-bed-temperature=i@"; def->max = 0; def->max = 300; def->default_value = new ConfigOptionInts { 0 }; @@ -884,7 +832,6 @@ void PrintConfigDef::init_fff_params() "as percentage (for example 120%) it will be computed over first layer height. " "If set to zero, it will use the default extrusion width."); def->sidetext = L("mm or % (leave 0 for default)"); - def->cli = "first-layer-extrusion-width=s"; def->ratio_over = "first_layer_height"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(200, true); @@ -897,7 +844,6 @@ void PrintConfigDef::init_fff_params() "This can be expressed as an absolute value or as a percentage (for example: 150%) " "over the default layer height."); def->sidetext = L("mm or %"); - def->cli = "first-layer-height=s"; def->ratio_over = "layer_height"; def->default_value = new ConfigOptionFloatOrPercent(0.35, false); @@ -907,7 +853,6 @@ void PrintConfigDef::init_fff_params() "of the first layer, regardless of their type. If expressed as a percentage " "(for example: 40%) it will scale the default speeds."); def->sidetext = L("mm/s or %"); - def->cli = "first-layer-speed=s"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(30, false); @@ -916,7 +861,6 @@ void PrintConfigDef::init_fff_params() def->label = L("First layer"); def->tooltip = L("Extruder temperature for first layer. If you want to control temperature manually " "during print, set this to zero to disable temperature control commands in the output file."); - def->cli = "first-layer-temperature=i@"; def->min = 0; def->max = max_temp; def->default_value = new ConfigOptionInts { 200 }; @@ -927,7 +871,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Speed for filling small gaps using short zigzag moves. Keep this reasonably low " "to avoid too much shaking and resonance issues. Set zero to disable gaps filling."); def->sidetext = L("mm/s"); - def->cli = "gap-fill-speed=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(20); @@ -937,7 +880,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Enable this to get a commented G-code file, with each line explained by a descriptive text. " "If you print from SD card, the additional weight of the file could make your firmware " "slow down."); - def->cli = "gcode-comments!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(0); @@ -946,7 +888,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Some G/M-code commands, including temperature control and others, are not universal. " "Set this option to your printer's firmware to get a compatible output. " "The \"No extrusion\" flavor prevents Slic3r from exporting any extrusion value at all."); - def->cli = "gcode-flavor=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("reprap"); def->enum_values.push_back("repetier"); @@ -976,7 +917,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = "Enable this to add comments into the G-Code labeling print moves with what object they belong to," " which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with " "Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."; - def->cli = "gcode-label-objects!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(0); @@ -985,7 +925,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("It may be beneficial to increase the extruder motor current during the filament exchange" " sequence to allow for rapid ramming feed rates and to overcome resistance when loading" " a filament with an ugly shaped tip."); - def->cli = "high-current-on-filament-swap!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(0); @@ -994,7 +933,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This is the acceleration your printer will use for infill. Set zero to disable " "acceleration control for infill."); def->sidetext = L("mm/s²"); - def->cli = "infill-acceleration=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -1005,7 +943,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This feature allows to combine infill and speed up your print by extruding thicker " "infill layers while preserving thin perimeters, thus accuracy."); def->sidetext = L("layers"); - def->cli = "infill-every-layers=i"; def->full_label = L("Combine infill every n layers"); def->min = 1; def->mode = comAdvanced; @@ -1015,7 +952,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Infill extruder"); def->category = L("Extruders"); def->tooltip = L("The extruder to use when printing infill."); - def->cli = "infill-extruder=i"; def->min = 1; def->mode = comAdvanced; def->default_value = new ConfigOptionInt(1); @@ -1028,14 +964,12 @@ void PrintConfigDef::init_fff_params() "You may want to use fatter extrudates to speed up the infill and make your parts stronger. " "If expressed as percentage (for example 90%) it will be computed over layer height."); def->sidetext = L("mm or % (leave 0 for default)"); - def->cli = "infill-extrusion-width=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(0, false); def = this->add("infill_first", coBool); def->label = L("Infill before perimeters"); def->tooltip = L("This option will switch the print order of perimeters and infill, making the latter first."); - def->cli = "infill-first!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -1045,7 +979,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This option will limit infill to the areas actually needed for supporting ceilings " "(it will act as internal support material). If enabled, slows down the G-code generation " "due to the multiple checks involved."); - def->cli = "infill-only-where-needed!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(false); @@ -1056,7 +989,6 @@ void PrintConfigDef::init_fff_params() "Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed " "as percentage (example: 15%) it is calculated over perimeter extrusion width."); def->sidetext = L("mm or %"); - def->cli = "infill-overlap=s"; def->ratio_over = "perimeter_extrusion_width"; def->mode = comExpert; def->default_value = new ConfigOptionFloatOrPercent(25, true); @@ -1066,7 +998,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Speed"); def->tooltip = L("Speed for printing the internal fill. Set to zero for auto."); def->sidetext = L("mm/s"); - def->cli = "infill-speed=f"; def->aliases = { "print_feed_rate", "infill_feed_rate" }; def->min = 0; def->mode = comAdvanced; @@ -1078,18 +1009,19 @@ void PrintConfigDef::init_fff_params() def->full_width = true; def->height = 50; def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; // The following value is to be stored into the project file (AMF, 3MF, Config ...) // and it contains a sum of "inherits" values over the print and filament profiles. def = this->add("inherits_cummulative", coStrings); def->default_value = new ConfigOptionStrings(); + def->cli = ConfigOptionDef::nocli; def = this->add("interface_shells", coBool); def->label = L("Interface shells"); def->tooltip = L("Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual soluble " "support material."); - def->cli = "interface-shells!"; def->category = L("Layers and Perimeters"); def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -1099,7 +1031,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can use " "placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."); - def->cli = "after-layer-gcode|layer-gcode=s"; + def->cli = "after-layer-gcode|layer-gcode"; def->multiline = true; def->full_width = true; def->height = 50; @@ -1219,7 +1151,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Max"); def->tooltip = L("This setting represents the maximum speed of your fan."); def->sidetext = L("%"); - def->cli = "max-fan-speed=i@"; def->min = 0; def->max = 100; def->mode = comExpert; @@ -1232,7 +1163,6 @@ void PrintConfigDef::init_fff_params() "is 75% of the extrusion width to achieve reasonable inter-layer adhesion. " "If set to 0, layer height is limited to 75% of the nozzle diameter."); def->sidetext = L("mm"); - def->cli = "max-layer-height=f@"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 0. }; @@ -1243,7 +1173,6 @@ void PrintConfigDef::init_fff_params() "in order to keep constant extruder pressure. This experimental setting is used " "to set the highest print speed you want to allow."); def->sidetext = L("mm/s"); - def->cli = "max-print-speed=f"; def->min = 1; def->mode = comExpert; def->default_value = new ConfigOptionFloat(80); @@ -1253,7 +1182,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This experimental setting is used to set the maximum volumetric speed your " "extruder supports."); def->sidetext = L("mm³/s"); - def->cli = "max-volumetric-speed=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -1266,7 +1194,6 @@ void PrintConfigDef::init_fff_params() "of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) " "to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."); def->sidetext = L("mm³/s²"); - def->cli = "max-volumetric-extrusion-rate-slope-positive=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -1278,7 +1205,6 @@ void PrintConfigDef::init_fff_params() "of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) " "to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."); def->sidetext = L("mm³/s²"); - def->cli = "max-volumetric-extrusion-rate-slope-negative=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -1288,7 +1214,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Min"); def->tooltip = L("This setting represents the minimum PWM your fan needs to work."); def->sidetext = L("%"); - def->cli = "min-fan-speed=i@"; def->min = 0; def->max = 100; def->mode = comExpert; @@ -1299,7 +1224,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This is the lowest printable layer height for this extruder and limits " "the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."); def->sidetext = L("mm"); - def->cli = "min-layer-height=f@"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 0.07 }; @@ -1308,7 +1232,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Min print speed"); def->tooltip = L("Slic3r will not scale speed down below this speed."); def->sidetext = L("mm/s"); - def->cli = "min-print-speed=f@"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloats { 10. }; @@ -1319,7 +1242,6 @@ void PrintConfigDef::init_fff_params() "the specified amount of filament on the bottom layer. For multi-extruder machines, " "this minimum applies to each extruder."); def->sidetext = L("mm"); - def->cli = "min-skirt-length=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -1328,7 +1250,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Configuration notes"); def->tooltip = L("You can put here your personal notes. This text will be added to the G-code " "header comments."); - def->cli = "notes=s"; def->multiline = true; def->full_width = true; def->height = 130; @@ -1339,14 +1260,12 @@ void PrintConfigDef::init_fff_params() def->label = L("Nozzle diameter"); def->tooltip = L("This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"); def->sidetext = L("mm"); - def->cli = "nozzle-diameter=f@"; def->default_value = new ConfigOptionFloats { 0.5 }; def = this->add("host_type", coEnum); def->label = L("Host Type"); def->tooltip = L("Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host."); - def->cli = "host-type=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("octoprint"); def->enum_values.push_back("duet"); @@ -1359,7 +1278,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Only retract when crossing perimeters"); def->tooltip = L("Disables retraction when the travel path does not exceed the upper layer's perimeters " "(and thus any ooze will be probably invisible)."); - def->cli = "only-retract-when-crossing-perimeters!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(true); @@ -1368,7 +1286,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This option will drop the temperature of the inactive extruders to prevent oozing. " "It will enable a tall skirt automatically and move extruders outside such " "skirt when changing temperatures."); - def->cli = "ooze-prevention!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -1378,7 +1295,6 @@ void PrintConfigDef::init_fff_params() "For example: [layer_height], [fill_density] etc. You can also use [timestamp], " "[year], [month], [day], [hour], [minute], [second], [version], [input_filename], " "[input_filename_base]."); - def->cli = "output-filename-format=s"; def->full_width = true; def->mode = comExpert; def->default_value = new ConfigOptionString("[input_filename_base]"); @@ -1388,7 +1304,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Layers and Perimeters"); def->tooltip = L("Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan."); - def->cli = "overhangs!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(true); @@ -1397,7 +1312,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware. "); def->sidetext = L("mm"); - def->cli = "parking_pos_retraction=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(92.f); @@ -1408,7 +1322,6 @@ void PrintConfigDef::init_fff_params() "is exactly the same as it was moved back during unload. When positive, it is loaded further, " " if negative, the loading move is shorter than unloading. "); def->sidetext = L("mm"); - def->cli = "extra_loading_move=f"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(-2.f); @@ -1418,7 +1331,6 @@ void PrintConfigDef::init_fff_params() "A high value like 9000 usually gives good results if your hardware is up to the job. " "Set zero to disable acceleration control for perimeters."); def->sidetext = L("mm/s²"); - def->cli = "perimeter-acceleration=f"; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -1426,7 +1338,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Perimeter extruder"); def->category = L("Extruders"); def->tooltip = L("The extruder to use when printing perimeters and brim. First extruder is 1."); - def->cli = "perimeter-extruder=i"; def->aliases = { "perimeters_extruder" }; def->min = 1; def->mode = comAdvanced; @@ -1440,7 +1351,6 @@ void PrintConfigDef::init_fff_params() "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. " "If expressed as percentage (for example 200%) it will be computed over layer height."); def->sidetext = L("mm or % (leave 0 for default)"); - def->cli = "perimeter-extrusion-width=s"; def->aliases = { "perimeters_extrusion_width" }; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(0, false); @@ -1450,7 +1360,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Speed"); def->tooltip = L("Speed for perimeters (contours, aka vertical shells). Set to zero for auto."); def->sidetext = L("mm/s"); - def->cli = "perimeter-speed=f"; def->aliases = { "perimeter_feed_rate" }; def->min = 0; def->mode = comAdvanced; @@ -1464,7 +1373,6 @@ void PrintConfigDef::init_fff_params() "sloping surfaces which benefit from a higher number of perimeters " "if the Extra Perimeters option is enabled."); def->sidetext = L("(minimum)"); - def->cli = "perimeters=i"; def->aliases = { "perimeter_offsets" }; def->min = 0; def->default_value = new ConfigOptionInt(3); @@ -1475,7 +1383,6 @@ void PrintConfigDef::init_fff_params() "just list their absolute paths here. Separate multiple scripts with a semicolon. " "Scripts will be passed the absolute path to the G-code file as the first argument, " "and they can access the Slic3r config settings by reading environment variables."); - def->cli = "post-process=s@"; def->gui_flags = "serialized"; def->multiline = true; def->full_width = true; @@ -1487,11 +1394,11 @@ void PrintConfigDef::init_fff_params() def->label = L("Printer type"); def->tooltip = L("Type of the printer."); def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; def = this->add("printer_notes", coString); def->label = L("Printer notes"); def->tooltip = L("You can put your notes regarding the printer here."); - def->cli = "printer-notes=s"; def->multiline = true; def->full_width = true; def->height = 130; @@ -1502,17 +1409,21 @@ void PrintConfigDef::init_fff_params() def->label = L("Printer vendor"); def->tooltip = L("Name of the printer vendor."); def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; def = this->add("printer_variant", coString); def->label = L("Printer variant"); def->tooltip = L("Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter."); def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; def = this->add("print_settings_id", coString); def->default_value = new ConfigOptionString(""); + def->cli = ConfigOptionDef::nocli; def = this->add("printer_settings_id", coString); def->default_value = new ConfigOptionString(""); + def->cli = ConfigOptionDef::nocli; def = this->add("raft_layers", coInt); def->label = L("Raft layers"); @@ -1520,7 +1431,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("The object will be raised by this number of layers, and support material " "will be generated under it."); def->sidetext = L("layers"); - def->cli = "raft-layers=i"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionInt(0); @@ -1532,7 +1442,6 @@ void PrintConfigDef::init_fff_params() "more detail than printers can render. Set to zero to disable any simplification " "and use full resolution from input."); def->sidetext = L("mm"); - def->cli = "resolution=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -1541,7 +1450,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Minimum travel after retraction"); def->tooltip = L("Retraction is not triggered when travel moves are shorter than this length."); def->sidetext = L("mm"); - def->cli = "retract-before-travel=f@"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 2. }; @@ -1550,14 +1458,12 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement."); def->sidetext = L("%"); - def->cli = "retract-before-wipe=s@"; def->mode = comAdvanced; def->default_value = new ConfigOptionPercents { 0. }; def = this->add("retract_layer_change", coBools); def->label = L("Retract on layer change"); def->tooltip = L("This flag enforces a retraction whenever a Z move is done."); - def->cli = "retract-layer-change!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBools { false }; @@ -1567,7 +1473,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("When retraction is triggered, filament is pulled back by the specified amount " "(the length is measured on raw filament, before it enters the extruder)."); def->sidetext = L("mm (zero to disable)"); - def->cli = "retract-length=f@"; def->default_value = new ConfigOptionFloats { 2. }; def = this->add("retract_length_toolchange", coFloats); @@ -1577,7 +1482,6 @@ void PrintConfigDef::init_fff_params() "by the specified amount (the length is measured on raw filament, before it enters " "the extruder)."); def->sidetext = L("mm (zero to disable)"); - def->cli = "retract-length-toolchange=f@"; def->mode = comExpert; def->default_value = new ConfigOptionFloats { 10. }; @@ -1587,7 +1491,6 @@ void PrintConfigDef::init_fff_params() "is triggered. When using multiple extruders, only the setting for the first extruder " "will be considered."); def->sidetext = L("mm"); - def->cli = "retract-lift=f@"; def->default_value = new ConfigOptionFloats { 0. }; def = this->add("retract_lift_above", coFloats); @@ -1596,7 +1499,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("If you set this to a positive value, Z lift will only take place above the specified " "absolute Z. You can tune this setting for skipping lift on the first layers."); def->sidetext = L("mm"); - def->cli = "retract-lift-above=f@"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 0. }; @@ -1607,7 +1509,6 @@ void PrintConfigDef::init_fff_params() "the specified absolute Z. You can tune this setting for limiting lift " "to the first layers."); def->sidetext = L("mm"); - def->cli = "retract-lift-below=f@"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 0. }; @@ -1616,7 +1517,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("When the retraction is compensated after the travel move, the extruder will push " "this additional amount of filament. This setting is rarely needed."); def->sidetext = L("mm"); - def->cli = "retract-restart-extra=f@"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 0. }; @@ -1625,7 +1525,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("When the retraction is compensated after changing tool, the extruder will push " "this additional amount of filament."); def->sidetext = L("mm"); - def->cli = "retract-restart-extra-toolchange=f@"; def->mode = comExpert; def->default_value = new ConfigOptionFloats { 0. }; @@ -1634,7 +1533,6 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Retraction Speed"); def->tooltip = L("The speed for retractions (it only applies to the extruder motor)."); def->sidetext = L("mm/s"); - def->cli = "retract-speed=f@"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 40. }; @@ -1644,7 +1542,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("The speed for loading of a filament into extruder after retraction " "(it only applies to the extruder motor). If left to zero, the retraction speed is used."); def->sidetext = L("mm/s"); - def->cli = "retract-speed=f@"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloats { 0. }; @@ -1652,7 +1549,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Seam position"); def->category = L("Layers and Perimeters"); def->tooltip = L("Position of perimeters starting points."); - def->cli = "seam-position=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("random"); def->enum_values.push_back("nearest"); @@ -1672,7 +1568,6 @@ void PrintConfigDef::init_fff_params() def->sidetext = L("°"); def->full_label = L("Preferred direction of the seam"); def->tooltip = L("Seam preferred direction"); - def->cli = "seam-preferred-direction=f"; def->min = 0; def->max = 360; def->default_value = new ConfigOptionFloat(0); @@ -1683,7 +1578,6 @@ void PrintConfigDef::init_fff_params() def->sidetext = L("°"); def->full_label = L("Seam preferred direction jitter"); def->tooltip = L("Preferred direction of the seam - jitter"); - def->cli = "seam-preferred-direction-jitter=f"; def->min = 0; def->max = 360; def->default_value = new ConfigOptionFloat(30); @@ -1694,7 +1588,6 @@ void PrintConfigDef::init_fff_params() def->label = ""; def->full_label = L("Serial port"); def->tooltip = L("USB/serial port for printer connection."); - def->cli = "serial-port=s"; def->width = 200; def->default_value = new ConfigOptionString(""); @@ -1703,7 +1596,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Speed"); def->full_label = L("Serial port speed"); def->tooltip = L("Speed (baud) of USB/serial port for printer connection."); - def->cli = "serial-speed=i"; def->min = 1; def->max = 300000; def->enum_values.push_back("115200"); @@ -1716,7 +1608,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion."); def->sidetext = L("mm"); - def->cli = "skirt-distance=f"; def->min = 0; def->default_value = new ConfigOptionFloat(6); @@ -1725,7 +1616,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts."); def->sidetext = L("layers"); - def->cli = "skirt-height=i"; def->mode = comAdvanced; def->default_value = new ConfigOptionInt(1); @@ -1735,7 +1625,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Number of loops for the skirt. If the Minimum Extrusion Length option is set, " "the number of loops might be greater than the one configured here. Set this to zero " "to disable skirt completely."); - def->cli = "skirts=i"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionInt(1); @@ -1745,7 +1634,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value."); def->sidetext = L("approximate seconds"); - def->cli = "slowdown-below-layer-time=i@"; def->width = 60; def->min = 0; def->max = 1000; @@ -1759,7 +1647,6 @@ void PrintConfigDef::init_fff_params() "(usually holes). If expressed as percentage (for example: 80%) it will be calculated " "on the perimeters speed setting above. Set to zero for auto."); def->sidetext = L("mm/s or %"); - def->cli = "small-perimeter-speed=s"; def->ratio_over = "perimeter_speed"; def->min = 0; def->mode = comAdvanced; @@ -1770,7 +1657,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Infill"); def->tooltip = L("Force solid infill for regions having a smaller area than the specified threshold."); def->sidetext = L("mm²"); - def->cli = "solid-infill-below-area=f"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(70); @@ -1779,7 +1665,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Solid infill extruder"); def->category = L("Extruders"); def->tooltip = L("The extruder to use when printing solid infill."); - def->cli = "solid-infill-extruder=i"; def->min = 1; def->mode = comAdvanced; def->default_value = new ConfigOptionInt(1); @@ -1792,7 +1677,6 @@ void PrintConfigDef::init_fff_params() "Slic3r will automatically choose the maximum possible number of layers " "to combine according to nozzle diameter and layer height."); def->sidetext = L("layers"); - def->cli = "solid-infill-every-layers=i"; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionInt(0); @@ -1804,7 +1688,6 @@ void PrintConfigDef::init_fff_params() "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. " "If expressed as percentage (for example 90%) it will be computed over layer height."); def->sidetext = L("mm or % (leave 0 for default)"); - def->cli = "solid-infill-extrusion-width=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(0, false); @@ -1815,7 +1698,6 @@ void PrintConfigDef::init_fff_params() "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto."); def->sidetext = L("mm/s or %"); - def->cli = "solid-infill-speed=s"; def->ratio_over = "infill_speed"; def->aliases = { "solid_infill_feed_rate" }; def->min = 0; @@ -1825,7 +1707,6 @@ void PrintConfigDef::init_fff_params() def = this->add("solid_layers", coInt); def->label = L("Solid layers"); def->tooltip = L("Number of solid layers to generate on top and bottom surfaces."); - def->cli = "solid-layers=i"; def->shortcut.push_back("top_solid_layers"); def->shortcut.push_back("bottom_solid_layers"); def->min = 0; @@ -1837,7 +1718,6 @@ void PrintConfigDef::init_fff_params() "no infill, no top solid layers and no support material. You can still set " "any number of bottom solid layers as well as skirt/brim loops. " "It won't work when printing more than an object."); - def->cli = "spiral-vase!"; def->default_value = new ConfigOptionBool(false); def = this->add("standby_temperature_delta", coInt); @@ -1845,7 +1725,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Temperature difference to be applied when an extruder is not active. " "Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."); def->sidetext = "∆°C"; - def->cli = "standby-temperature-delta=i"; def->min = -max_temp; def->max = max_temp; def->mode = comExpert; @@ -1860,7 +1739,6 @@ void PrintConfigDef::init_fff_params() "the order of heating commands and other custom actions. Note that you can use " "placeholder variables for all Slic3r settings, so you can put " "a \"M109 S[first_layer_temperature]\" command wherever you want."); - def->cli = "start-gcode=s"; def->multiline = true; def->full_width = true; def->height = 120; @@ -1877,7 +1755,6 @@ void PrintConfigDef::init_fff_params() "for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command " "wherever you want. If you have multiple extruders, the gcode is processed " "in extruder order."); - def->cli = "start-filament-gcode=s@"; def->multiline = true; def->full_width = true; def->height = 120; @@ -1887,14 +1764,12 @@ void PrintConfigDef::init_fff_params() def = this->add("single_extruder_multi_material", coBool); def->label = L("Single Extruder Multi Material"); def->tooltip = L("The printer multiplexes filaments into a single hot end."); - def->cli = "single-extruder-multi-material!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); def = this->add("single_extruder_multi_material_priming", coBool); def->label = L("Prime all printing extruders"); def->tooltip = L("If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print."); - def->cli = "single-extruder-multi-material-priming!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(true); @@ -1902,7 +1777,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Generate support material"); def->category = L("Support material"); def->tooltip = L("Enable support material generation."); - def->cli = "support-material!"; def->default_value = new ConfigOptionBool(false); def = this->add("support_material_auto", coBool); @@ -1910,7 +1784,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("If checked, supports will be generated automatically based on the overhang threshold value."\ " If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only."); - def->cli = "support-material-auto!"; def->mode = comSimple; def->default_value = new ConfigOptionBool(true); @@ -1920,7 +1793,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width."); def->sidetext = L("mm or %"); - def->cli = "support-material-xy-spacing=s"; def->ratio_over = "external_perimeter_extrusion_width"; def->min = 0; def->mode = comAdvanced; @@ -1932,7 +1804,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("Use this setting to rotate the support material pattern on the horizontal plane."); def->sidetext = L("°"); - def->cli = "support-material-angle=f"; def->min = 0; def->max = 359; def->mode = comExpert; @@ -1942,7 +1813,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Support on build plate only"); def->category = L("Support material"); def->tooltip = L("Only create support if it lies on a build plate. Don't create support on a print."); - def->cli = "support-material-buildplate-only!"; def->mode = comSimple; def->default_value = new ConfigOptionBool(false); @@ -1954,7 +1824,6 @@ void PrintConfigDef::init_fff_params() "Setting this to 0 will also prevent Slic3r from using bridge flow and speed " "for the first object layer."); def->sidetext = L("mm"); - def->cli = "support-material-contact-distance=f"; // def->min = 0; def->enum_values.push_back("0"); def->enum_values.push_back("0.2"); @@ -1971,7 +1840,6 @@ void PrintConfigDef::init_fff_params() "of any angle threshold. This is useful for getting more adhesion of objects " "having a very thin or poor footprint on the build plate."); def->sidetext = L("layers"); - def->cli = "support-material-enforce-layers=f"; def->full_label = L("Enforce support for the first n layers"); def->min = 0; def->mode = comExpert; @@ -1982,7 +1850,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Extruders"); def->tooltip = L("The extruder to use when printing support material, raft and skirt " "(1+, 0 to use the current extruder to minimize tool changes)."); - def->cli = "support-material-extruder=i"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionInt(1); @@ -1994,7 +1861,6 @@ void PrintConfigDef::init_fff_params() "If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. " "If expressed as percentage (for example 90%) it will be computed over layer height."); def->sidetext = L("mm or % (leave 0 for default)"); - def->cli = "support-material-extrusion-width=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(0, false); @@ -2002,7 +1868,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Interface loops"); def->category = L("Support material"); def->tooltip = L("Cover the top contact layer of the supports with loops. Disabled by default."); - def->cli = "support-material-interface-contact-loops!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -2011,7 +1876,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Extruders"); def->tooltip = L("The extruder to use when printing support material interface " "(1+, 0 to use the current extruder to minimize tool changes). This affects raft too."); - def->cli = "support-material-interface-extruder=i"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionInt(1); @@ -2021,7 +1885,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("Number of interface layers to insert between the object(s) and support material."); def->sidetext = L("layers"); - def->cli = "support-material-interface-layers=i"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionInt(3); @@ -2031,7 +1894,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("Spacing between interface lines. Set zero to get a solid interface."); def->sidetext = L("mm"); - def->cli = "support-material-interface-spacing=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0); @@ -2042,7 +1904,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Speed for printing support material interface layers. If expressed as percentage " "(for example 50%) it will be calculated over support material speed."); def->sidetext = L("mm/s or %"); - def->cli = "support-material-interface-speed=s"; def->ratio_over = "support_material_speed"; def->min = 0; def->mode = comAdvanced; @@ -2052,7 +1913,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Pattern"); def->category = L("Support material"); def->tooltip = L("Pattern used to generate support material."); - def->cli = "support-material-pattern=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("rectilinear"); def->enum_values.push_back("rectilinear-grid"); @@ -2068,7 +1928,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("Spacing between support material lines."); def->sidetext = L("mm"); - def->cli = "support-material-spacing=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(2.5); @@ -2078,7 +1937,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("Speed for printing support material."); def->sidetext = L("mm/s"); - def->cli = "support-material-speed=f"; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(60); @@ -2088,7 +1946,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("Synchronize support layers with the object print layers. This is useful " "with multi-material printers, where the extruder switch is expensive."); - def->cli = "support-material-synchronize-layers!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -2101,7 +1958,6 @@ void PrintConfigDef::init_fff_params() "that you can print without support material. Set to zero for automatic detection " "(recommended)."); def->sidetext = L("°"); - def->cli = "support-material-threshold=i"; def->min = 0; def->max = 90; def->mode = comAdvanced; @@ -2112,7 +1968,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Support material"); def->tooltip = L("Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove."); - def->cli = "support-material-with-sheath!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(true); @@ -2120,7 +1975,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Other layers"); def->tooltip = L("Extruder temperature for layers after the first one. Set this to zero to disable " "temperature control commands in the output."); - def->cli = "temperature=i@"; def->full_label = L("Temperature"); def->min = 0; def->max = max_temp; @@ -2131,7 +1985,6 @@ void PrintConfigDef::init_fff_params() def->category = L("Layers and Perimeters"); def->tooltip = L("Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)."); - def->cli = "thin-walls!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(true); @@ -2139,12 +1992,12 @@ void PrintConfigDef::init_fff_params() def->label = L("Threads"); def->tooltip = L("Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors."); - def->cli = "threads|j=i"; def->readonly = true; def->min = 1; { int threads = (unsigned int)boost::thread::hardware_concurrency(); def->default_value = new ConfigOptionInt(threads > 0 ? threads : 2); + def->cli == ConfigOptionDef::nocli; } def = this->add("toolchange_gcode", coString); @@ -2152,7 +2005,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This custom code is inserted right before every extruder change. " "Note that you can use placeholder variables for all Slic3r settings as well " "as [previous_extruder] and [next_extruder]."); - def->cli = "toolchange-gcode=s"; def->multiline = true; def->full_width = true; def->height = 50; @@ -2167,7 +2019,6 @@ void PrintConfigDef::init_fff_params() "If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. " "If expressed as percentage (for example 90%) it will be computed over layer height."); def->sidetext = L("mm or % (leave 0 for default)"); - def->cli = "top-infill-extrusion-width=s"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloatOrPercent(0, false); @@ -2180,7 +2031,6 @@ void PrintConfigDef::init_fff_params() "as a percentage (for example: 80%) over the solid infill speed above. " "Set to zero for auto."); def->sidetext = L("mm/s or %"); - def->cli = "top-solid-infill-speed=s"; def->ratio_over = "solid_infill_speed"; def->min = 0; def->mode = comAdvanced; @@ -2190,7 +2040,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Top"); def->category = L("Layers and Perimeters"); def->tooltip = L("Number of solid layers to generate on top surfaces."); - def->cli = "top-solid-layers=i"; def->full_label = L("Top solid layers"); def->min = 0; def->default_value = new ConfigOptionInt(3); @@ -2199,7 +2048,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Travel"); def->tooltip = L("Speed for travel moves (jumps between distant extrusion points)."); def->sidetext = L("mm/s"); - def->cli = "travel-speed=f"; def->aliases = { "travel_feed_rate" }; def->min = 1; def->mode = comAdvanced; @@ -2209,7 +2057,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Use firmware retraction"); def->tooltip = L("This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin."); - def->cli = "use-firmware-retraction!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -2217,7 +2064,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Use relative E distances"); def->tooltip = L("If your firmware requires relative E values, check this, " "otherwise leave it unchecked. Most firmwares use absolute values."); - def->cli = "use-relative-e-distances!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -2229,7 +2075,6 @@ void PrintConfigDef::init_fff_params() "in your start G-code in order to turn volumetric mode on and use the filament " "diameter associated to the filament selected in Slic3r. This is only supported " "in recent Marlin."); - def->cli = "use-volumetric-e!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(false); @@ -2237,7 +2082,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Enable variable layer height feature"); def->tooltip = L("Some printers or printer setups may have difficulties printing " "with a variable layer height. Enabled by default."); - def->cli = "variable-layer-height!"; def->mode = comExpert; def->default_value = new ConfigOptionBool(true); @@ -2245,7 +2089,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Wipe while retracting"); def->tooltip = L("This flag will move the nozzle while retracting to minimize the possible blob " "on leaky extruders."); - def->cli = "wipe!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBools { false }; @@ -2253,7 +2096,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Enable"); def->tooltip = L("Multi material printers may need to prime or purge extruders on tool changes. " "Extrude the excess material into the wipe tower."); - def->cli = "wipe-tower!"; def->mode = comAdvanced; def->default_value = new ConfigOptionBool(false); @@ -2262,14 +2104,12 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below. "); - def->cli = "wiping-volumes-extruders=f@"; def->default_value = new ConfigOptionFloats { 70.f, 70.f, 70.f, 70.f, 70.f, 70.f, 70.f, 70.f, 70.f, 70.f }; def = this->add("wiping_volumes_matrix", coFloats); def->label = L("Purging volumes - matrix"); def->tooltip = L("This matrix describes volumes (in cubic milimetres) required to purge the" " new filament on the wipe tower for any given pair of tools. "); - def->cli = "wiping-volumes-matrix=f@"; def->default_value = new ConfigOptionFloats { 0.f, 140.f, 140.f, 140.f, 140.f, 140.f, 0.f, 140.f, 140.f, 140.f, 140.f, 140.f, 0.f, 140.f, 140.f, @@ -2280,7 +2120,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Position X"); def->tooltip = L("X coordinate of the left front corner of a wipe tower"); def->sidetext = L("mm"); - def->cli = "wipe-tower-x=f"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(180.); @@ -2288,7 +2127,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Position Y"); def->tooltip = L("Y coordinate of the left front corner of a wipe tower"); def->sidetext = L("mm"); - def->cli = "wipe-tower-y=f"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(140.); @@ -2296,7 +2134,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Width"); def->tooltip = L("Width of a wipe tower"); def->sidetext = L("mm"); - def->cli = "wipe-tower-width=f"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(60.); @@ -2304,7 +2141,6 @@ void PrintConfigDef::init_fff_params() def->label = L("Wipe tower rotation angle"); def->tooltip = L("Wipe tower rotation angle with respect to x-axis "); def->sidetext = L("degrees"); - def->cli = "wipe-tower-rotation-angle=f"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0.); @@ -2314,7 +2150,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Purging after toolchange will done inside this object's infills. " "This lowers the amount of waste but may result in longer print time " " due to additional travel moves."); - def->cli = "wipe-into-infill!"; def->default_value = new ConfigOptionBool(false); def = this->add("wipe_into_objects", coBool); @@ -2323,14 +2158,12 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result."); - def->cli = "wipe-into-objects!"; def->default_value = new ConfigOptionBool(false); def = this->add("wipe_tower_bridging", coFloat); def->label = L("Maximal bridging distance"); def->tooltip = L("Maximal distance between supports on sparse infill sections. "); def->sidetext = L("mm"); - def->cli = "wipe-tower-bridging=f"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(10.); @@ -2341,7 +2174,6 @@ void PrintConfigDef::init_fff_params() "(negative = inwards, positive = outwards). This might be useful " "for fine-tuning hole sizes."); def->sidetext = L("mm"); - def->cli = "xy-size-compensation=f"; def->mode = comExpert; def->default_value = new ConfigOptionFloat(0); @@ -2352,56 +2184,8 @@ void PrintConfigDef::init_fff_params() "for example, if your endstop zero actually leaves the nozzle 0.3mm far " "from the print bed, set this to -0.3 (or fix your endstop)."); def->sidetext = L("mm"); - def->cli = "z-offset=f"; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0); - - def = this->add("bed_size_x", coFloat); - def->label = L("Bed size X"); - def->category = L("Dwarf"); - def->sidetext = L("mm"); - def->cli = "bed-size-x=f"; - def->default_value = new ConfigOptionFloat(68.); - - def = this->add("bed_size_y", coFloat); - def->label = L("Bed size Y"); - def->category = L("Dwarf"); - def->sidetext = L("mm"); - def->cli = "bed-size-y=f"; - def->default_value = new ConfigOptionFloat(120.); - - def = this->add("pixel_width", coInt); - def->label = L("Picture resolution X"); - def->category = L("Dwarf"); - def->sidetext = L("px"); - def->cli = "pixel-width=i"; - def->min = 1; - def->mode = comExpert; - def->default_value = new ConfigOptionInt(1440); - - def = this->add("pixel_height", coInt); - def->label = L("Picture resolution Y"); - def->category = L("Dwarf"); - def->sidetext = L("px"); - def->cli = "pixel-height=i"; - def->min = 1; - def->default_value = new ConfigOptionInt(2560); - - def = this->add("exp_time", coFloat); - def->label = L("Exposure time"); - def->category = L("Dwarf"); - def->sidetext = L("s"); - def->cli = "exp-time=f"; - def->min = 1; - def->default_value = new ConfigOptionFloat(8.); - - def = this->add("exp_time_first", coFloat); - def->label = L("Exposure time first layers"); - def->category = L("Dwarf"); - def->sidetext = L("s"); - def->cli = "exp-time-first=f"; - def->min = 1; - def->default_value = new ConfigOptionFloat(35.); } void PrintConfigDef::init_sla_params() @@ -2410,17 +2194,51 @@ void PrintConfigDef::init_sla_params() ConfigOptionDef* def; // SLA Printer settings + + def = this->add("bed_size_x", coFloat); + def->label = L("Bed size X"); + def->sidetext = L("mm"); + def->default_value = new ConfigOptionFloat(68.); + + def = this->add("bed_size_y", coFloat); + def->label = L("Bed size Y"); + def->sidetext = L("mm"); + def->default_value = new ConfigOptionFloat(120.); + + def = this->add("pixel_width", coInt); + def->label = L("Picture resolution X"); + def->sidetext = L("px"); + def->min = 1; + def->mode = comExpert; + def->default_value = new ConfigOptionInt(1440); + + def = this->add("pixel_height", coInt); + def->label = L("Picture resolution Y"); + def->sidetext = L("px"); + def->min = 1; + def->default_value = new ConfigOptionInt(2560); + + def = this->add("exp_time", coFloat); + def->label = L("Exposure time"); + def->sidetext = L("s"); + def->min = 1; + def->default_value = new ConfigOptionFloat(8.); + + def = this->add("exp_time_first", coFloat); + def->label = L("Exposure time first layers"); + def->sidetext = L("s"); + def->min = 1; + def->default_value = new ConfigOptionFloat(35.); + def = this->add("display_width", coFloat); def->label = L("Display width"); def->tooltip = L("Width of the display"); - def->cli = "display-width=f"; def->min = 1; def->default_value = new ConfigOptionFloat(120.); def = this->add("display_height", coFloat); def->label = L("Display height"); def->tooltip = L("Height of the display"); - def->cli = "display-height=f"; def->min = 1; def->default_value = new ConfigOptionFloat(68.); @@ -2428,14 +2246,12 @@ void PrintConfigDef::init_sla_params() def->full_label = L("Number of pixels in"); def->label = ("X"); def->tooltip = L("Number of pixels in X"); - def->cli = "display-pixels-x=i"; def->min = 100; def->default_value = new ConfigOptionInt(2560); def = this->add("display_pixels_y", coInt); def->label = ("Y"); def->tooltip = L("Number of pixels in Y"); - def->cli = "display-pixels-y=i"; def->min = 100; def->default_value = new ConfigOptionInt(1440); @@ -2444,7 +2260,6 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("Set the actual LCD display orientation inside the SLA printer." " Portrait mode will flip the meaning of display width and height parameters" " and the output images will be rotated by 90 degrees."); - def->cli = "display-orientation=s"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("landscape"); def->enum_values.push_back("portrait"); @@ -2490,7 +2305,6 @@ void PrintConfigDef::init_sla_params() def->label = L("Initial layer height"); def->tooltip = L("Initial layer height"); def->sidetext = L("mm"); - def->cli = "initial-layer-height=f"; def->min = 0; def->default_value = new ConfigOptionFloat(0.3); @@ -2506,7 +2320,6 @@ void PrintConfigDef::init_sla_params() def->label = L("Exposure time"); def->tooltip = L("Exposure time"); def->sidetext = L("s"); - def->cli = "exposure-time=f"; def->min = 0; def->default_value = new ConfigOptionFloat(10); @@ -2514,7 +2327,6 @@ void PrintConfigDef::init_sla_params() def->label = L("Initial exposure time"); def->tooltip = L("Initial exposure time"); def->sidetext = L("s"); - def->cli = "initial-exposure-time=f"; def->min = 0; def->default_value = new ConfigOptionFloat(15); @@ -2533,7 +2345,6 @@ void PrintConfigDef::init_sla_params() def = this->add("material_notes", coString); def->label = L("SLA print material notes"); def->tooltip = L("You can put your notes regarding the SLA print material here."); - def->cli = "material-notes=s"; def->multiline = true; def->full_width = true; def->height = 130; @@ -2545,25 +2356,27 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("Default print profile associated with the current printer profile. " "On selection of the current printer profile, this print profile will be activated."); def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; def = this->add("sla_material_settings_id", coString); def->default_value = new ConfigOptionString(""); - + def->cli = ConfigOptionDef::nocli; def = this->add("default_sla_print_profile", coString); def->label = L("Default SLA material profile"); def->tooltip = L("Default print profile associated with the current printer profile. " "On selection of the current printer profile, this print profile will be activated."); def->default_value = new ConfigOptionString(); + def->cli = ConfigOptionDef::nocli; def = this->add("sla_print_settings_id", coString); def->default_value = new ConfigOptionString(""); + def->cli = ConfigOptionDef::nocli; def = this->add("supports_enable", coBool); def->label = L("Generate supports"); def->category = L("Supports"); def->tooltip = L("Generate supports for the models"); - def->cli = ""; def->mode = comSimple; def->default_value = new ConfigOptionBool(true); @@ -2572,7 +2385,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("Diameter of the pointing side of the head"); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(0.4); @@ -2582,7 +2394,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("How much the pinhead has to penetrate the model surface"); def->sidetext = L("mm"); - def->cli = ""; def->mode = comAdvanced; def->min = 0; def->default_value = new ConfigOptionFloat(0.2); @@ -2592,7 +2403,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("Width from the back sphere center to the front sphere center"); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->max = 20; def->mode = comAdvanced; @@ -2603,7 +2413,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("Diameter in mm of the support pillars"); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->max = 15; def->mode = comSimple; @@ -2615,7 +2424,6 @@ void PrintConfigDef::init_sla_params() " Can be zig-zag, cross (double zig-zag) or dynamic which" " will automatically switch between the first two depending" " on the distance of the two pillars."); - def->cli = ""; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("zigzag"); def->enum_values.push_back("cross"); @@ -2630,7 +2438,6 @@ void PrintConfigDef::init_sla_params() def->label = L("Support on build plate only"); def->category = L("Supports"); def->tooltip = L("Only create support if it lies on a build plate. Don't create support on a print."); - def->cli = "support-buildplate-only!"; def->mode = comSimple; def->default_value = new ConfigOptionBool(false); @@ -2640,7 +2447,6 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("Merging bridges or pillars into another pillars can " "increase the radius. Zero means no increase, one means " "full increase."); - def->cli = ""; def->min = 0; def->max = 1; def->mode = comExpert; @@ -2651,7 +2457,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("Diameter in mm of the pillar base"); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->max = 30; def->mode = comAdvanced; @@ -2662,7 +2467,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("The height of the pillar base cone"); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(1.0); @@ -2672,7 +2476,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("The default angle for connecting support sticks and junctions."); def->sidetext = L("°"); - def->cli = ""; def->min = 0; def->max = 90; def->mode = comExpert; @@ -2683,7 +2486,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("The max length of a bridge"); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(15.0); @@ -2694,7 +2496,6 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("The max distance of two pillars to get linked with each other." " A zero value will prohibit pillar cascading."); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; // 0 means no linking def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(10.0); @@ -2704,7 +2505,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("How much the supports should lift up the supported object."); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->max = 150; // This is the max height of print on SL1 def->mode = comAdvanced; @@ -2715,7 +2515,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("This is a relative measure of support points density."); def->sidetext = L("%"); - def->cli = ""; def->min = 0; def->default_value = new ConfigOptionInt(100); @@ -2724,7 +2523,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Supports"); def->tooltip = L("No support points will be placed closer than this threshold."); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->default_value = new ConfigOptionFloat(0.f); @@ -2732,7 +2530,6 @@ void PrintConfigDef::init_sla_params() def->label = L("Use pad"); def->category = L("Pad"); def->tooltip = L("Add a pad underneath the supported model"); - def->cli = ""; def->mode = comSimple; def->default_value = new ConfigOptionBool(true); @@ -2741,7 +2538,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Pad"); def->tooltip = L("The thickness of the pad and its optional cavity walls."); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->max = 30; def->mode = comSimple; @@ -2753,7 +2549,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Pad"); // def->tooltip = L(""); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->max = 30; def->mode = comSimple; @@ -2767,7 +2562,6 @@ void PrintConfigDef::init_sla_params() "how far the center of two smaller pads should be. If they" "are closer, they will get merged into one pad."); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->mode = comExpert; def->default_value = new ConfigOptionFloat(50.0); @@ -2778,7 +2572,6 @@ void PrintConfigDef::init_sla_params() def->category = L("Pad"); // def->tooltip = L(""); def->sidetext = L("mm"); - def->cli = ""; def->min = 0; def->mode = comAdvanced; def->default_value = new ConfigOptionFloat(1.0); @@ -2789,7 +2582,6 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("The slope of the pad wall relative to the bed plane. " "90 degrees means straight walls."); def->sidetext = L("degrees"); - def->cli = ""; def->min = 45; def->max = 90; def->mode = comAdvanced; @@ -3150,14 +2942,12 @@ CLIActionsConfigDef::CLIActionsConfigDef() def = this->add("export_obj", coBool); def->label = L("Export SVG"); def->tooltip = L("Export the model(s) as OBJ."); - def->cli = "export-obj"; def->default_value = new ConfigOptionBool(false); /* def = this->add("export_svg", coBool); def->label = L("Export SVG"); def->tooltip = L("Slice the model and export solid slices as SVG."); - def->cli = "export-svg"; def->default_value = new ConfigOptionBool(false); */ @@ -3170,19 +2960,16 @@ CLIActionsConfigDef::CLIActionsConfigDef() def = this->add("export_3mf", coBool); def->label = L("Export 3MF"); def->tooltip = L("Export the model(s) as 3MF."); - def->cli = "export-3mf"; def->default_value = new ConfigOptionBool(false); def = this->add("export_amf", coBool); def->label = L("Export AMF"); def->tooltip = L("Export the model(s) as AMF."); - def->cli = "export-amf"; def->default_value = new ConfigOptionBool(false); def = this->add("export_stl", coBool); def->label = L("Export STL"); def->tooltip = L("Export the model(s) as STL."); - def->cli = "export-stl"; def->default_value = new ConfigOptionBool(false); def = this->add("export_gcode", coBool); @@ -3191,6 +2978,12 @@ CLIActionsConfigDef::CLIActionsConfigDef() def->cli = "export-gcode|gcode|g"; def->default_value = new ConfigOptionBool(false); + def = this->add("slice", coBool); + def->label = L("Slice"); + def->tooltip = L("Slice the model as FFF or SLA based on the printer_technology configuration value."); + def->cli = "slice|s"; + def->default_value = new ConfigOptionBool(false); + def = this->add("help", coBool); def->label = L("Help"); def->tooltip = L("Show this help."); @@ -3200,19 +2993,26 @@ CLIActionsConfigDef::CLIActionsConfigDef() def = this->add("help_options", coBool); def->label = L("Help (options)"); def->tooltip = L("Show the full list of print/G-code configuration options."); - def->cli = "help-options"; + def->default_value = new ConfigOptionBool(false); + + def = this->add("help_fff", coBool); + def->label = L("Help (FFF options)"); + def->tooltip = L("Show the full list of print/G-code configuration options."); + def->default_value = new ConfigOptionBool(false); + + def = this->add("help_sla", coBool); + def->label = L("Help (SLA options)"); + def->tooltip = L("Show the full list of SLA print configuration options."); def->default_value = new ConfigOptionBool(false); def = this->add("info", coBool); def->label = L("Output Model Info"); def->tooltip = L("Write information about the model to the console."); - def->cli = "info"; def->default_value = new ConfigOptionBool(false); def = this->add("save", coString); def->label = L("Save config file"); def->tooltip = L("Save configuration to the specified file."); - def->cli = "save"; def->default_value = new ConfigOptionString(); } @@ -3224,56 +3024,47 @@ CLITransformConfigDef::CLITransformConfigDef() def = this->add("align_xy", coPoint); def->label = L("Align XY"); def->tooltip = L("Align the model to the given point."); - def->cli = "align-xy"; def->default_value = new ConfigOptionPoint(Vec2d(100,100)); def = this->add("cut", coFloat); def->label = L("Cut"); def->tooltip = L("Cut model at the given Z."); - def->cli = "cut"; def->default_value = new ConfigOptionFloat(0); /* def = this->add("cut_grid", coFloat); def->label = L("Cut"); def->tooltip = L("Cut model in the XY plane into tiles of the specified max size."); - def->cli = "cut-grid"; def->default_value = new ConfigOptionPoint(); def = this->add("cut_x", coFloat); def->label = L("Cut"); def->tooltip = L("Cut model at the given X."); - def->cli = "cut-x"; def->default_value = new ConfigOptionFloat(0); def = this->add("cut_y", coFloat); def->label = L("Cut"); def->tooltip = L("Cut model at the given Y."); - def->cli = "cut-y"; def->default_value = new ConfigOptionFloat(0); */ def = this->add("center", coPoint); def->label = L("Center"); def->tooltip = L("Center the print around the given center."); - def->cli = "center"; def->default_value = new ConfigOptionPoint(Vec2d(100,100)); def = this->add("dont_arrange", coBool); def->label = L("Don't arrange"); def->tooltip = L("Do not rearrange the given models before merging and keep their original XY coordinates."); - def->cli = "dont-arrange"; def = this->add("duplicate", coInt); def->label = L("Duplicate"); def->tooltip =L("Multiply copies by this factor."); - def->cli = "duplicate=i"; def->min = 1; def = this->add("duplicate_grid", coPoint); def->label = L("Duplicate by grid"); def->tooltip = L("Multiply copies by creating a grid."); - def->cli = "duplicate-grid"; def = this->add("merge", coBool); def->label = L("Merge"); @@ -3283,41 +3074,34 @@ CLITransformConfigDef::CLITransformConfigDef() def = this->add("repair", coBool); def->label = L("Repair"); def->tooltip = L("Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)."); - def->cli = "repair"; def = this->add("rotate", coFloat); def->label = L("Rotate"); def->tooltip = L("Rotation angle around the Z axis in degrees."); - def->cli = "rotate"; def->default_value = new ConfigOptionFloat(0); def = this->add("rotate_x", coFloat); def->label = L("Rotate around X"); def->tooltip = L("Rotation angle around the X axis in degrees."); - def->cli = "rotate-x"; def->default_value = new ConfigOptionFloat(0); def = this->add("rotate_y", coFloat); def->label = L("Rotate around Y"); def->tooltip = L("Rotation angle around the Y axis in degrees."); - def->cli = "rotate-y"; def->default_value = new ConfigOptionFloat(0); def = this->add("scale", coFloatOrPercent); def->label = L("Scale"); def->tooltip = L("Scaling factor or percentage."); - def->cli = "scale"; def->default_value = new ConfigOptionFloatOrPercent(1, false); def = this->add("split", coBool); def->label = L("Split"); def->tooltip = L("Detect unconnected parts in the given model(s) and split them into separate objects."); - def->cli = "split"; def = this->add("scale_to_fit", coPoint3); def->label = L("Scale to Fit"); def->tooltip = L("Scale to fit the given volume."); - def->cli = "scale-to-fit"; def->default_value = new ConfigOptionPoint3(Vec3d(0,0,0)); } @@ -3328,12 +3112,10 @@ CLIMiscConfigDef::CLIMiscConfigDef() def = this->add("ignore_nonexistent_config", coBool); def->label = L("Ignore non-existent config files"); def->tooltip = L("Do not fail if a file supplied to --load does not exist."); - def->cli = "ignore-nonexistent-config"; def = this->add("load", coStrings); def->label = L("Load config file"); def->tooltip = L("Load configuration from the specified file. It can be used more than once to load options from multiple files."); - def->cli = "load"; def = this->add("output", coString); def->label = L("Output File"); @@ -3344,18 +3126,15 @@ CLIMiscConfigDef::CLIMiscConfigDef() def = this->add("autosave", coString); def->label = L("Autosave"); def->tooltip = L("Automatically export current configuration to the specified file."); - def->cli = "autosave"; */ def = this->add("datadir", coString); def->label = L("Data directory"); def->tooltip = L("Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."); - def->cli = "datadir"; def = this->add("loglevel", coInt); def->label = L("Logging level"); def->tooltip = L("Messages with severity lower or eqal to the loglevel will be printed out. 0:trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal"); - def->cli = "loglevel"; def->min = 0; } diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 2955f0b4c..d6b3d9cf4 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -24,16 +24,6 @@ namespace Slic3r { -enum PrinterTechnology -{ - // Fused Filament Fabrication - ptFFF, - // Stereolitography - ptSLA, - // Unknown, useful for command line processing - ptUnknown, -}; - enum GCodeFlavor { gcfRepRap, gcfRepetier, gcfTeacup, gcfMakerWare, gcfMarlin, gcfSailfish, gcfMach3, gcfMachinekit, gcfSmoothie, gcfNoExtrusion, diff --git a/src/slic3r.cpp b/src/slic3r.cpp index b6409fb1d..d29f6b04f 100644 --- a/src/slic3r.cpp +++ b/src/slic3r.cpp @@ -309,7 +309,11 @@ int CLI::run(int argc, char **argv) if (opt_key == "help") { this->print_help(); } else if (opt_key == "help_options") { - this->print_help(true); + this->print_help(true, ptAny); + } else if (opt_key == "help_fff") { + this->print_help(true, ptFFF); + } else if (opt_key == "help_sla") { + this->print_help(true, ptSLA); } else if (opt_key == "save") { //FIXME check for mixing the FFF / SLA parameters. // or better save fff_print_config vs. sla_print_config @@ -546,7 +550,7 @@ bool CLI::setup(int argc, char **argv) return true; } -void CLI::print_help(bool include_print_options) const +void CLI::print_help(bool include_print_options, PrinterTechnology printer_technology) const { boost::nowide::cout << "Slic3r Prusa Edition " << SLIC3R_BUILD << std::endl @@ -568,11 +572,12 @@ void CLI::print_help(bool include_print_options) const if (include_print_options) { boost::nowide::cout << std::endl; - print_config_def.print_cli_help(boost::nowide::cout, true); + print_config_def.print_cli_help(boost::nowide::cout, true, [printer_technology](const ConfigOptionDef &def) + { return printer_technology == ptAny || def.printer_technology == ptAny || printer_technology == def.printer_technology; }); } else { boost::nowide::cout << std::endl - << "Run --help-options to see the full listing of print/G-code options." << std::endl; + << "Run --help-options / --help-fff / --help-sla to see the full listing of print options." << std::endl; } } diff --git a/src/slic3r.hpp b/src/slic3r.hpp index f977dc9eb..0554580e5 100644 --- a/src/slic3r.hpp +++ b/src/slic3r.hpp @@ -33,7 +33,7 @@ private: bool setup(int argc, char **argv); /// Prints usage of the CLI. - void print_help(bool include_print_options = false) const; + void print_help(bool include_print_options = false, PrinterTechnology printer_technology = ptAny) const; /// Exports loaded models to a file of the specified format, according to the options affecting output filename. bool export_models(IO::ExportFormat format); From 1224491cd43beb46b9ca05c4e269d8f2cf8300c5 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 13 Mar 2019 19:21:56 +0100 Subject: [PATCH 131/236] Removed obsolete Dwarf parametes from FFF Print settings. --- src/libslic3r/PrintConfig.cpp | 35 ----------------------------------- src/libslic3r/PrintConfig.hpp | 12 ------------ 2 files changed, 47 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 8d5d0d69f..48945fc7d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2195,41 +2195,6 @@ void PrintConfigDef::init_sla_params() // SLA Printer settings - def = this->add("bed_size_x", coFloat); - def->label = L("Bed size X"); - def->sidetext = L("mm"); - def->default_value = new ConfigOptionFloat(68.); - - def = this->add("bed_size_y", coFloat); - def->label = L("Bed size Y"); - def->sidetext = L("mm"); - def->default_value = new ConfigOptionFloat(120.); - - def = this->add("pixel_width", coInt); - def->label = L("Picture resolution X"); - def->sidetext = L("px"); - def->min = 1; - def->mode = comExpert; - def->default_value = new ConfigOptionInt(1440); - - def = this->add("pixel_height", coInt); - def->label = L("Picture resolution Y"); - def->sidetext = L("px"); - def->min = 1; - def->default_value = new ConfigOptionInt(2560); - - def = this->add("exp_time", coFloat); - def->label = L("Exposure time"); - def->sidetext = L("s"); - def->min = 1; - def->default_value = new ConfigOptionFloat(8.); - - def = this->add("exp_time_first", coFloat); - def->label = L("Exposure time first layers"); - def->sidetext = L("s"); - def->min = 1; - def->default_value = new ConfigOptionFloat(35.); - def = this->add("display_width", coFloat); def->label = L("Display width"); def->tooltip = L("Width of the display"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index d6b3d9cf4..c5585326b 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -798,12 +798,6 @@ public: ConfigOptionFloats wiping_volumes_matrix; ConfigOptionFloats wiping_volumes_extruders; ConfigOptionFloat z_offset; - ConfigOptionFloat bed_size_x; - ConfigOptionFloat bed_size_y; - ConfigOptionInt pixel_width; - ConfigOptionInt pixel_height; - ConfigOptionFloat exp_time; - ConfigOptionFloat exp_time_first; protected: PrintConfig(int) : MachineEnvelopeConfig(1), GCodeConfig(1) {} @@ -876,12 +870,6 @@ protected: OPT_PTR(wiping_volumes_matrix); OPT_PTR(wiping_volumes_extruders); OPT_PTR(z_offset); - OPT_PTR(bed_size_x); - OPT_PTR(bed_size_y); - OPT_PTR(pixel_width); - OPT_PTR(pixel_height); - OPT_PTR(exp_time); - OPT_PTR(exp_time_first); } }; From 0b4dbc87c7d3d84b026a2cff342eb526046bff6e Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 13 Mar 2019 19:49:14 +0100 Subject: [PATCH 132/236] CLI: Removed the --help-options parameter, left the --help-fff and --help-sla Added check for empty print. --- src/libslic3r/PrintConfig.cpp | 5 ----- src/slic3r.cpp | 22 +++++++++++----------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 48945fc7d..11fff2fb3 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2955,11 +2955,6 @@ CLIActionsConfigDef::CLIActionsConfigDef() def->cli = "help|h"; def->default_value = new ConfigOptionBool(false); - def = this->add("help_options", coBool); - def->label = L("Help (options)"); - def->tooltip = L("Show the full list of print/G-code configuration options."); - def->default_value = new ConfigOptionBool(false); - def = this->add("help_fff", coBool); def->label = L("Help (FFF options)"); def->tooltip = L("Show the full list of print/G-code configuration options."); diff --git a/src/slic3r.cpp b/src/slic3r.cpp index d29f6b04f..f88b84ce7 100644 --- a/src/slic3r.cpp +++ b/src/slic3r.cpp @@ -133,8 +133,8 @@ int CLI::run(int argc, char **argv) // Initialize full print configs for both the FFF and SLA technologies. FullPrintConfig fff_print_config; SLAFullPrintConfig sla_print_config; - fff_print_config.apply(m_print_config); - sla_print_config.apply(m_print_config); + fff_print_config.apply(m_print_config, true); + sla_print_config.apply(m_print_config, true); // Loop through transform options. for (auto const &opt_key : m_transforms) { @@ -308,8 +308,6 @@ int CLI::run(int argc, char **argv) for (auto const &opt_key : m_actions) { if (opt_key == "help") { this->print_help(); - } else if (opt_key == "help_options") { - this->print_help(true, ptAny); } else if (opt_key == "help_fff") { this->print_help(true, ptFFF); } else if (opt_key == "help_sla") { @@ -375,7 +373,13 @@ int CLI::run(int argc, char **argv) } print->apply(model, m_print_config); std::string err = print->validate(); - if (err.empty()) { + if (! err.empty()) { + boost::nowide::cerr << err << std::endl; + return 1; + } + if (print->empty()) + boost::nowide::cout << "Nothing to print for " << outfile << " . Either the print is empty or no object is fully inside the print volume." << std::endl; + else try { std::string outfile_final; print->process(); @@ -393,15 +397,11 @@ int CLI::run(int argc, char **argv) boost::nowide::cerr << "Renaming file " << outfile << " to " << outfile_final << " failed" << std::endl; return 1; } + boost::nowide::cout << "Slicing result exported to " << outfile << std::endl; } catch (const std::exception &ex) { boost::nowide::cerr << ex.what() << std::endl; return 1; } - } else { - boost::nowide::cerr << err << std::endl; - return 1; - } - /* print.center = ! m_config.has("center") && ! m_config.has("align_xy") @@ -577,7 +577,7 @@ void CLI::print_help(bool include_print_options, PrinterTechnology printer_techn } else { boost::nowide::cout << std::endl - << "Run --help-options / --help-fff / --help-sla to see the full listing of print options." << std::endl; + << "Run --help-fff / --help-sla to see the full listing of print options." << std::endl; } } From 5ecd78434c8e21499de6d71eff3a63e3e52155a4 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 14 Mar 2019 09:19:21 +0100 Subject: [PATCH 133/236] Fixed #1949 --- src/libslic3r/PrintConfig.cpp | 2 +- src/slic3r/GUI/GUI_ObjectList.cpp | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 11fff2fb3..a9fc1c63f 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -405,7 +405,7 @@ void PrintConfigDef::init_fff_params() def = this->add("bottom_fill_pattern", coEnum); *def = *def_top_fill_pattern; - def->label = L("Bottom Pattern"); + def->label = L("Bottom fill pattern"); def->tooltip = L("Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."); def->cli = "bottom-fill-pattern|external-fill-pattern|solid-fill-pattern"; def->default_value = new ConfigOptionEnum(ipRectilinear); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 57469a0c6..8fe7c2d05 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -655,9 +655,7 @@ void ObjectList::get_options_menu(settings_menu_hierarchy& settings_menu, const if (category.empty() || (category == "Extruders" && extruders_cnt == 1)) continue; - const std::string& label = opt->label.empty() ? opt->full_label : - opt->full_label.empty() ? opt->label : - opt->full_label + " " + opt->label;; + const std::string& label = !opt->full_label.empty() ? opt->full_label : opt->label; std::pair option_label(option, label); std::vector< std::pair > new_category; auto& cat_opt_label = settings_menu.find(category) == settings_menu.end() ? new_category : settings_menu.at(category); From 7cced0613a80ef4fa428127e75555ba0ac595ea7 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 14 Mar 2019 09:22:15 +0100 Subject: [PATCH 134/236] Fixed crash after deleting of the part with no extruder options in configuration --- src/slic3r/GUI/GUI_ObjectList.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 8fe7c2d05..4757c95b9 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1761,7 +1761,8 @@ void ObjectList::delete_from_model_and_list(const std::vector& it if (item->type&itVolume) { m_objects_model->Delete(m_objects_model->GetItemByVolumeId(item->obj_idx, item->sub_obj_idx)); - if ((*m_objects)[item->obj_idx]->volumes.size() == 1) + if ((*m_objects)[item->obj_idx]->volumes.size() == 1 && + (*m_objects)[item->obj_idx]->config.has("extruder")) { const wxString extruder = wxString::Format("%d", (*m_objects)[item->obj_idx]->config.option("extruder")->value); m_objects_model->SetValue(extruder, m_objects_model->GetItemById(item->obj_idx), 1); From 594d40cec8f8f30a783cc7438170ee476dbe1c25 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 14 Mar 2019 09:36:03 +0100 Subject: [PATCH 135/236] Fixing error with sla array indexing --- src/libslic3r/SLA/SLASupportTree.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 5f339fc96..9f2575036 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1411,10 +1411,11 @@ public: using libnest2d::opt::GeneticOptimizer; using libnest2d::opt::StopCriteria; - for(unsigned i = 0, fidx = filtered_indices[0]; - i < filtered_indices.size(); ++i, fidx = filtered_indices[i]) + for(unsigned i = 0, fidx = 0; i < filtered_indices.size(); ++i) { m_thr(); + + fidx = filtered_indices[i]; auto n = nmls.row(i); // for all normals we generate the spherical coordinates and From 5255f79789ec6bfc634e18a94d78900c330e8196 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Wed, 13 Mar 2019 17:38:41 +0100 Subject: [PATCH 136/236] Fix crash on exit, pt2 --- src/slic3r/GUI/Tab.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 56af8b4f9..6c7f246a6 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -816,6 +816,10 @@ void Tab::update_wiping_button_visibility() { // to update number of "filament" selection boxes when the number of extruders change. void Tab::on_presets_changed() { + if (wxGetApp().plater() == nullptr) { + return; + } + // Instead of PostEvent (EVT_TAB_PRESETS_CHANGED) just call update_presets wxGetApp().plater()->sidebar().update_presets(m_type); update_preset_description_line(); From 9c574a0d42da3ec682ff3101040a36022e5a848d Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 14 Mar 2019 12:10:10 +0100 Subject: [PATCH 137/236] Fix of yesterday's commit, the bug caused cancelling of the computation. --- src/libslic3r/SLAPrint.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 3c8e16cf6..b6c8aad13 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -306,7 +306,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf // Update the ModelObject instance, possibly invalidate the linked PrintObjects. assert(it_status->status == ModelObjectStatus::Old || it_status->status == ModelObjectStatus::Moved); const ModelObject &model_object_new = *model.objects[idx_model_object]; - auto it_print_object_status = print_object_status.lower_bound(PrintObjectStatus(model_object.id())); + it_print_object_status = print_object_status.lower_bound(PrintObjectStatus(model_object.id())); if (it_print_object_status != print_object_status.end() && it_print_object_status->id != model_object.id()) it_print_object_status = print_object_status.end(); // Check whether a model part volume was added or removed, their transformations or order changed. From f02f24c4b78b9c6d52fbcf515793fccb437bc1b6 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 14 Mar 2019 13:15:04 +0100 Subject: [PATCH 138/236] Implemented set extruder number on multiple items at the same time (#1940) --- src/slic3r/GUI/GUI_ObjectList.cpp | 114 +++++++++++++++++++++++++++--- src/slic3r/GUI/GUI_ObjectList.hpp | 4 ++ 2 files changed, 110 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 4757c95b9..f6ccbbd7d 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -43,6 +43,18 @@ static PrinterTechnology printer_technology() return wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology(); } +// Config from current edited printer preset +DynamicPrintConfig& printer_config() +{ + return wxGetApp().preset_bundle->printers.get_edited_preset().config; +} + +int extruders_count() +{ + return printer_technology() == ptSLA ? 1 : + printer_config().option("nozzle_diameter")->values.size(); +} + ObjectList::ObjectList(wxWindow* parent) : wxDataViewCtrl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE), m_parent(parent) @@ -430,6 +442,9 @@ void ObjectList::OnContextMenu(wxDataViewEvent&) if (is_windows10()) fix_through_netfabb(); } + else if (title == _("Extruder")) + show_extruder_selection_menu(); + #ifndef __WXMSW__ GetMainWindow()->SetToolTip(""); // hide tooltip #endif //__WXMSW__ @@ -437,9 +452,13 @@ void ObjectList::OnContextMenu(wxDataViewEvent&) void ObjectList::show_context_menu() { - if (multiple_selection() && selected_instances_of_same_object()) + if (multiple_selection()) { - wxGetApp().plater()->PopupMenu(&m_menu_instance); + if (selected_instances_of_same_object()) + wxGetApp().plater()->PopupMenu(&m_menu_instance); + else + show_extruder_selection_menu(); + return; } @@ -644,8 +663,7 @@ void ObjectList::get_options_menu(settings_menu_hierarchy& settings_menu, const { auto options = get_options(is_part); - auto extruders_cnt = printer_technology() == ptSLA ? 1 : - wxGetApp().preset_bundle->printers.get_edited_preset().config.option("nozzle_diameter")->values.size(); + const int extruders_cnt = extruders_count(); DynamicPrintConfig config; for (auto& option : options) @@ -1079,8 +1097,7 @@ void ObjectList::create_freq_settings_popupmenu(wxMenu *menu) const FreqSettingsBundle& bundle = printer_technology() == ptFFF ? FREQ_SETTINGS_BUNDLE_FFF : FREQ_SETTINGS_BUNDLE_SLA; - auto extruders_cnt = printer_technology() == ptSLA ? 1 : - wxGetApp().preset_bundle->printers.get_edited_preset().config.option("nozzle_diameter")->values.size(); + const int extruders_cnt = extruders_count(); for (auto& it : bundle) { if (it.first.empty() || it.first == "Extruders" && extruders_cnt == 1) @@ -1277,7 +1294,7 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode const wxString name = _(L("Generic")) + "-" + _(type_name); TriangleMesh mesh; - auto& bed_shape = wxGetApp().preset_bundle->printers.get_edited_preset().config.option("bed_shape")->values; + auto& bed_shape = printer_config().option("bed_shape")->values; const auto& sz = BoundingBoxf(bed_shape).size(); const auto side = 0.1 * std::max(sz(0), sz(1)); @@ -1456,7 +1473,7 @@ void ObjectList::split() ModelVolume* volume; if (!get_volume_by_item(item, volume)) return; - DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + DynamicPrintConfig& config = printer_config(); const ConfigOption *nozzle_dmtrs_opt = config.option("nozzle_diameter", false); const auto nozzle_dmrs_cnt = (nozzle_dmtrs_opt == nullptr) ? size_t(1) : dynamic_cast(nozzle_dmtrs_opt)->values.size(); if (volume->split(nozzle_dmrs_cnt) == 1) { @@ -2338,5 +2355,86 @@ void ObjectList::OnEditingDone(wxDataViewEvent &event) _(L("the following characters are not allowed:")) + " <>:/\\|?*\""); } +void ObjectList::show_extruder_selection_menu() +{ + wxDataViewItemArray sels; + GetSelections(sels); + + for (const wxDataViewItem& item : sels) + if (!(m_objects_model->GetItemType(item) & (itVolume | itObject))) + // show this menu only for Object(s)/Volume(s) selection + return; + + wxMenu* menu = new wxMenu(); + append_menu_item(menu, wxID_ANY, _(L("Set extruder for selected items")), + _(L("Select extruder number for selected objects and/or parts")), + [this](wxCommandEvent&) { extruder_selection(); }, "", menu); + PopupMenu(menu); +} + +void ObjectList::extruder_selection() +{ + wxArrayString choices; + choices.Add("default"); + for (int i = 1; i <= extruders_count(); ++i) + choices.Add(wxString::Format("%d", i)); + + const wxString& selected_extruder = wxGetSingleChoice(_(L("Select extruder number:")), + _(L("This extruder will be set for selected items")), + choices, 0, this); + if (selected_extruder.IsEmpty()) + return; + + const int extruder_num = selected_extruder == "default" ? 0 : atoi(selected_extruder.c_str()); + +// /* Another variant for an extruder selection */ +// extruder_num = wxGetNumberFromUser(_(L("Attention!!! \n" +// "It's a possibile to set an extruder number \n" +// "for whole Object(s) and/or object Part(s), \n" +// "not for an Instance. ")), +// _(L("Enter extruder number:")), +// _(L("This extruder will be set for selected items")), +// 1, 1, 5, this); + + set_extruder_for_selected_items(extruder_num); +} + +void ObjectList::set_extruder_for_selected_items(const int extruder) const +{ + wxDataViewItemArray sels; + GetSelections(sels); + + for (const wxDataViewItem& item : sels) + { + const ItemType type = m_objects_model->GetItemType(item); + + const int obj_idx = type & itObject ? m_objects_model->GetIdByItem(item) : + m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)); + + const int vol_idx = type & itVolume ? m_objects_model->GetVolumeIdByItem(item) : -1; + + DynamicPrintConfig& config = type & itObject ? (*m_objects)[obj_idx]->config : + (*m_objects)[obj_idx]->volumes[vol_idx]->config; + + if (config.has("extruder")) { + if (extruder == 0) + config.erase("extruder"); + else + config.option("extruder")->value = extruder; + } + else if (extruder > 0) + config.set_key_value("extruder", new ConfigOptionInt(extruder)); + + const wxString extruder_str = extruder == 0 ? wxString ("default") : + wxString::Format("%d", config.option("extruder")->value); + m_objects_model->SetValue(extruder_str, item, 1); + + wxGetApp().plater()->canvas3D()->ensure_on_bed(obj_idx); + } + + // update scene + wxGetApp().plater()->update(); +} + } //namespace GUI } //namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index a4df67497..fa4db8f9d 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -283,6 +283,10 @@ private: void ItemValueChanged(wxDataViewEvent &event); void OnEditingDone(wxDataViewEvent &event); + void show_extruder_selection_menu(); + void extruder_selection(); + void set_extruder_for_selected_items(const int extruder) const ; + std::vector get_options(const bool is_part); const std::vector& get_options_for_bundle(const wxString& bundle_name); void get_options_menu(settings_menu_hierarchy& settings_menu, const bool is_part); From 5018089351ef942194caa097f8420b20e48a1335 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 14 Mar 2019 13:54:05 +0100 Subject: [PATCH 139/236] Toolbar refactoring 1) toolbar items define 3 callback functions for setting the visibility, setting the enabling state and defining their action which are set while adding a new item to the toolbar 2) the toolbar takes care to update all its items visibility and enabled states through a new update method to be called by the parent idle event handler 3) the toolbar handles mouse events by calling its on_mouse method --- src/libslic3r/Technologies.hpp | 5 + src/slic3r/GUI/GLCanvas3D.cpp | 218 ++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 24 +++ src/slic3r/GUI/GLToolbar.cpp | 367 ++++++++++++++++++++++++++++++++- src/slic3r/GUI/GLToolbar.hpp | 132 +++++++++++- src/slic3r/GUI/GUI_Preview.cpp | 6 + src/slic3r/GUI/GUI_Preview.hpp | 6 + src/slic3r/GUI/Plater.cpp | 202 +++++++++++++++++- src/slic3r/GUI/Plater.hpp | 13 ++ 9 files changed, 968 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index e978b5838..da343ac20 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -59,4 +59,9 @@ // Toolbars and Gizmos use icons imported from svg files #define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#define ENABLE_CANVAS_GUI_REFACTORING 1 +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + #endif // _technologies_h_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8178c9cf6..87e004ee7 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -734,7 +734,13 @@ GLCanvas3D::Mouse::Drag::Drag() GLCanvas3D::Mouse::Mouse() : dragging(false) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , left_down(false) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , position(DBL_MAX, DBL_MAX) , scene_position(DBL_MAX, DBL_MAX, DBL_MAX) , ignore_up_event(false) @@ -3727,7 +3733,13 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_use_VBOs(false) , m_apply_zoom_to_volumes_filter(false) , m_hover_volume_id(-1) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_toolbar_action_running(false) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_legend_texture_enabled(false) , m_picking_enabled(false) , m_moving_enabled(false) @@ -4041,6 +4053,9 @@ void GLCanvas3D::allow_multisample(bool allow) m_multisample_allowed = allow; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::enable_toolbar_item(const std::string& name, bool enable) { if (enable) @@ -4053,6 +4068,9 @@ bool GLCanvas3D::is_toolbar_item_pressed(const std::string& name) const { return m_toolbar.is_item_pressed(name); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::zoom_to_bed() { @@ -4106,6 +4124,9 @@ void GLCanvas3D::update_volumes_colors_by_extruder() m_volumes.update_colors_by_extruder(m_config); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::update_toolbar_items_visibility() { ConfigOptionMode mode = wxGetApp().get_mode(); @@ -4114,6 +4135,9 @@ void GLCanvas3D::update_toolbar_items_visibility() m_toolbar.set_item_visible("splitvolumes", mode != comSimple); m_dirty = true; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Returns a Rect object denoting size and position of the Reset button used by a gizmo. // Returns in either screen or viewport coords. @@ -4790,6 +4814,13 @@ void GLCanvas3D::on_size(wxSizeEvent& evt) void GLCanvas3D::on_idle(wxIdleEvent& evt) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + m_dirty |= m_toolbar.update_items_state(); + m_dirty |= m_view_toolbar.update_items_state(); +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (!m_dirty) return; @@ -5074,6 +5105,22 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +// if (!evt.Entering() && !evt.Leaving()) +// { + bool processed_by_toolbar = m_toolbar.on_mouse(evt, *this); + processed_by_toolbar |= m_view_toolbar.on_mouse(evt, *this); + + if (processed_by_toolbar) + { + m_mouse.set_start_position_3D_as_invalid(); + return; + } +// } +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (m_picking_enabled) _set_current(); @@ -5081,8 +5128,14 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) int layer_editing_object_idx = is_layers_editing_enabled() ? selected_object_idx : -1; m_layers_editing.select_object(*m_model, layer_editing_object_idx); bool gizmos_overlay_contains_mouse = m_gizmos.overlay_contains_mouse(*this, m_mouse.position); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int toolbar_contains_mouse = m_toolbar.contains_mouse(m_mouse.position, *this); int view_toolbar_contains_mouse = m_view_toolbar.contains_mouse(m_mouse.position, *this); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_MOVE_MIN_THRESHOLD if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) @@ -5124,23 +5177,41 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { // to remove hover on objects when the mouse goes out of this canvas m_mouse.position = Vec2d(-1.0, -1.0); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // ensure m_mouse.left_down is reset (it may happen when switching canvas) m_mouse.left_down = false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.LeftDClick() && (toolbar_contains_mouse != -1)) { m_toolbar_action_running = true; m_mouse.set_start_position_3D_as_invalid(); m_toolbar.do_action((unsigned int)toolbar_contains_mouse, *this); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.LeftDClick() && (m_gizmos.get_current_type() != Gizmos::Undefined)) { m_mouse.ignore_up_event = true; } else if (evt.LeftDown() || evt.RightDown()) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_mouse.left_down = evt.LeftDown(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // If user pressed left or right button we first check whether this happened // on a volume or not. @@ -5193,6 +5264,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { // event was taken care of by the SlaSupports gizmo } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.LeftDown() && (view_toolbar_contains_mouse != -1)) m_view_toolbar.do_action((unsigned int)view_toolbar_contains_mouse, *this); else if (evt.LeftDown() && (toolbar_contains_mouse != -1)) @@ -5202,6 +5276,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_toolbar.do_action((unsigned int)toolbar_contains_mouse, *this); m_mouse.left_down = false; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else { // Select volume in this 3D canvas. @@ -5403,7 +5480,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } // do not process dragging if the mouse is into any of the HUD elements +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + else if (evt.Dragging() && !gizmos_overlay_contains_mouse) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.Dragging() && !gizmos_overlay_contains_mouse && (toolbar_contains_mouse == -1) && (view_toolbar_contains_mouse == -1)) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { m_mouse.dragging = true; @@ -5413,7 +5498,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) _perform_layer_editing_action(&evt); } // do not process the dragging if the left mouse was set down in another canvas +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + else if (evt.LeftIsDown()) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (m_mouse.left_down && evt.LeftIsDown()) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { // if dragging over blank area with left button, rotate #if ENABLE_MOVE_MIN_THRESHOLD @@ -5474,7 +5567,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // that's why the mouse_event function was called so that the gizmo can refuse the deselection in manual editing mode // deselect and propagate event through callback +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + if (!evt.ShiftDown() && m_picking_enabled && !m_mouse.ignore_up_event) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!evt.ShiftDown() && m_picking_enabled && !m_toolbar_action_running && !m_mouse.ignore_up_event) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { m_selection.clear(); m_selection.set_mode(Selection::Instance); @@ -5523,8 +5624,14 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.set_start_position_3D_as_invalid(); m_mouse.set_start_position_2D_as_invalid(); m_mouse.dragging = false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_mouse.left_down = false; m_toolbar_action_running = false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; if (m_canvas->HasCapture()) @@ -5540,6 +5647,15 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (m_selection.is_empty()) m_gizmos.reset_all_states(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + if (tooltip.empty()) + tooltip = m_toolbar.get_tooltip(); + + if (tooltip.empty()) + tooltip = m_view_toolbar.get_tooltip(); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // updates toolbar overlay if (tooltip.empty()) tooltip = m_toolbar.update_hover_state(m_mouse.position, *this); @@ -5551,6 +5667,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (!tooltip.empty()) m_dirty = true; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ set_tooltip(tooltip); @@ -5954,7 +6073,15 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Add...") + " [" + GUI::shortkey_ctrl_prefix() + "I]"; item.sprite_id = 0; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ADD)); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_ADD; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -5964,7 +6091,16 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Delete") + " [Del]"; item.sprite_id = 1; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE)); }; + item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_delete(); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_DELETE; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -5974,7 +6110,16 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Delete all") + " [" + GUI::shortkey_ctrl_prefix() + "Del]"; item.sprite_id = 2; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); }; + item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_delete_all(); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_DELETE_ALL; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -5984,7 +6129,16 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Arrange [A]"); item.sprite_id = 3; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ARRANGE)); }; + item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_arrange(); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_ARRANGE; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -5997,7 +6151,17 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Add instance [+]"); item.sprite_id = 4; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); }; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; + item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_increase_instances(); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_MORE; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6007,7 +6171,17 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Remove instance [-]"); item.sprite_id = 5; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); }; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; + item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_decrease_instances(); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_FEWER; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6020,7 +6194,17 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to objects"); item.sprite_id = 6; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_OBJECTS)); }; + item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; + item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_split_to_objects(); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_SPLIT_OBJECTS; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6030,7 +6214,17 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to parts"); item.sprite_id = 7; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_VOLUMES)); }; + item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; + item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_split_to_volumes(); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_SPLIT_VOLUMES; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6044,13 +6238,29 @@ bool GLCanvas3D::_init_toolbar() item.tooltip = GUI::L_str("Layers editing"); item.sprite_id = 8; item.is_toggable = true; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); }; + item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; + item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_layers_editing(); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_LAYERSEDITING; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ enable_toolbar_item("add", true); update_toolbar_items_visibility(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ return true; } @@ -6255,7 +6465,15 @@ void GLCanvas3D::_picking_pass() const { const Vec2d& pos = m_mouse.position; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + if (m_picking_enabled && !m_mouse.dragging && (pos != Vec2d(DBL_MAX, DBL_MAX))) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_picking_enabled && !m_mouse.dragging && !m_mouse.left_down && (pos != Vec2d(DBL_MAX, DBL_MAX))) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { // Render the object for picking. // FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing. diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 07b3907a3..808e958c7 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -314,7 +314,13 @@ class GLCanvas3D }; bool dragging; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool left_down; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Vec2d position; Vec3d scene_position; Drag drag; @@ -876,7 +882,13 @@ private: bool m_use_VBOs; bool m_apply_zoom_to_volumes_filter; mutable int m_hover_volume_id; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool m_toolbar_action_running; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool m_warning_texture_enabled; bool m_legend_texture_enabled; bool m_picking_enabled; @@ -959,8 +971,14 @@ public: void enable_dynamic_background(bool enable); void allow_multisample(bool allow); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void enable_toolbar_item(const std::string& name, bool enable); bool is_toolbar_item_pressed(const std::string& name) const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void zoom_to_bed(); void zoom_to_volumes(); @@ -969,7 +987,13 @@ public: void update_volumes_colors_by_extruder(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_toolbar_items_visibility(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_IMGUI Rect get_gizmo_reset_rect(const GLCanvas3D& canvas, bool viewport) const; diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 1b8ccc165..9678776c8 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -30,6 +30,14 @@ wxDEFINE_EVENT(EVT_GLTOOLBAR_LAYERSEDITING, SimpleEvent); wxDEFINE_EVENT(EVT_GLVIEWTOOLBAR_3D, SimpleEvent); wxDEFINE_EVENT(EVT_GLVIEWTOOLBAR_PREVIEW, SimpleEvent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +const GLToolbarItem::ActionCallback GLToolbarItem::Default_Action_Callback = [](){}; +const GLToolbarItem::VisibilityCallback GLToolbarItem::Default_Visibility_Callback = []()->bool { return true; }; +const GLToolbarItem::EnabledStateCallback GLToolbarItem::Default_Enabled_State_Callback = []()->bool { return true; }; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + GLToolbarItem::Data::Data() : name("") #if ENABLE_SVG_ICONS @@ -39,20 +47,65 @@ GLToolbarItem::Data::Data() , sprite_id(-1) , is_toggable(false) , visible(true) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + , action_callback(Default_Action_Callback) + , visibility_callback(Default_Visibility_Callback) + , enabled_state_callback(Default_Enabled_State_Callback) +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { } GLToolbarItem::GLToolbarItem(GLToolbarItem::EType type, const GLToolbarItem::Data& data) : m_type(type) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + , m_state(Normal) +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_state(Disabled) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_data(data) { } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbarItem::do_action(wxEvtHandler *target) { wxPostEvent(target, SimpleEvent(m_data.action_event)); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +bool GLToolbarItem::update_visibility() +{ + bool visible = m_data.visibility_callback(); + bool ret = (m_data.visible != visible); + if (ret) + m_data.visible = visible; + + return ret; +} + +bool GLToolbarItem::update_enabled_state() +{ + bool enabled = m_data.enabled_state_callback(); + bool ret = (is_enabled() != enabled); + if (ret) + m_state = enabled ? GLToolbarItem::Normal : GLToolbarItem::Disabled; + + return ret; +} +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const { @@ -135,6 +188,12 @@ GLToolbar::GLToolbar(GLToolbar::EType type) #if ENABLE_SVG_ICONS , m_icons_texture_dirty(true) #endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + , m_mouse_capture({false, false, false}) + , m_tooltip("") +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { } @@ -299,6 +358,9 @@ float GLToolbar::get_height() const return m_layout.height; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::enable_item(const std::string& name) { for (GLToolbarItem* item : m_items) @@ -322,6 +384,9 @@ void GLToolbar::disable_item(const std::string& name) } } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::select_item(const std::string& name) { @@ -371,6 +436,9 @@ bool GLToolbar::is_item_visible(const std::string& name) const return false; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::set_item_visible(const std::string& name, bool visible) { for (GLToolbarItem* item : m_items) @@ -395,9 +463,26 @@ void GLToolbar::set_item_visible(const std::string& name, bool visible) any_item_visible = false; } } - } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +bool GLToolbar::update_items_state() +{ + bool ret = false; + ret |= update_items_visibility(); + ret |= update_items_enabled_state(); + return ret; +} +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) { if (!m_enabled) @@ -461,6 +546,9 @@ void GLToolbar::do_action(unsigned int item_id, GLCanvas3D& parent) } } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::render(const GLCanvas3D& parent) const { @@ -487,6 +575,57 @@ void GLToolbar::render(const GLCanvas3D& parent) const ::glPopMatrix(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) +{ + Vec2d mouse_pos((double)evt.GetX(), (double)evt.GetY()); + bool processed = false; + + // mouse anywhere + if (evt.Moving()) + m_tooltip = update_hover_state(mouse_pos, parent); + else if (evt.LeftUp()) + m_mouse_capture.left = false; + else if (evt.MiddleUp()) + m_mouse_capture.middle = false; + else if (evt.RightUp()) + m_mouse_capture.right = false; + else if (m_mouse_capture.any() && evt.Dragging()) + processed = true; + + int item_id = contains_mouse(mouse_pos, parent); + if (item_id == -1) + { + // mouse is outside the toolbar + m_tooltip = ""; + } + else + { + // mouse inside toolbar only + if (evt.LeftDown() || evt.LeftDClick()) + { + m_mouse_capture.left = true; + if ((item_id != -2) && !m_items[item_id]->is_separator()) + { + // mouse is inside an icon + do_action((unsigned int)item_id, parent); + processed = true; + } + } + else if (evt.MiddleDown()) + m_mouse_capture.middle = true; + else if (evt.RightDown()) + m_mouse_capture.right = true; + else if (evt.LeftUp()) + processed = true; + } + + return processed; +} +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + void GLToolbar::calc_layout() const { switch (m_layout.type) @@ -576,6 +715,61 @@ float GLToolbar::get_main_size() const return size; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +void GLToolbar::do_action(unsigned int item_id, GLCanvas3D& parent) +{ + if (item_id < (unsigned int)m_items.size()) + { + GLToolbarItem* item = m_items[item_id]; + if ((item != nullptr) && !item->is_separator() && item->is_hovered()) + { + if (item->is_toggable()) + { + GLToolbarItem::EState state = item->get_state(); + if (state == GLToolbarItem::Hover) + item->set_state(GLToolbarItem::HoverPressed); + else if (state == GLToolbarItem::HoverPressed) + item->set_state(GLToolbarItem::Hover); + + parent.render(); + item->do_action(); + } + else + { + if (m_type == Radio) + select_item(item->get_name()); + else + item->set_state(GLToolbarItem::HoverPressed); + + parent.render(); + item->do_action(); + if ((m_type == Normal) && (item->get_state() != GLToolbarItem::Disabled)) + { + // the item may get disabled during the action, if not, set it back to hover state + item->set_state(GLToolbarItem::Hover); + parent.render(); + } + } + } + } +} + +std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) +{ + if (!m_enabled) + return ""; + + switch (m_layout.type) + { + default: + case Layout::Horizontal: { return update_hover_state_horizontal(mouse_pos, parent); } + case Layout::Vertical: { return update_hover_state_vertical(mouse_pos, parent); } + } +} +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent) { // NB: mouse_pos is already scaled appropriately @@ -785,6 +979,23 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan return tooltip; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const +{ + if (!m_enabled) + return -1; + + switch (m_layout.type) + { + default: + case Layout::Horizontal: { return contains_mouse_horizontal(mouse_pos, parent); } + case Layout::Vertical: { return contains_mouse_vertical(mouse_pos, parent); } + } +} +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { // NB: mouse_pos is already scaled appropriately @@ -808,8 +1019,14 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 float scaled_separator_size = m_layout.separator_size * factor; float scaled_gap_size = m_layout.gap_size * factor; float scaled_border = m_layout.border * factor; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float separator_stride = scaled_separator_size + scaled_gap_size; float icon_stride = scaled_icons_size + scaled_gap_size; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float left = m_layout.left + scaled_border; float top = m_layout.top - scaled_border; @@ -824,16 +1041,62 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 continue; if (item->is_separator()) - left += separator_stride; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + { + float right = left + scaled_separator_size; + float bottom = top - scaled_icons_size; + + // mouse inside the separator + if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + return id; + + left = right; + right += scaled_gap_size; + + if (id < m_items.size() - 1) + { + // mouse inside the gap + if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + return -2; + } + + left = right; + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + left += separator_stride; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else { float right = left + scaled_icons_size; float bottom = top - scaled_icons_size; + // mouse inside the icon if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) return id; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + left = right; + right += scaled_gap_size; + + if (id < m_items.size() - 1) + { + // mouse inside the gap + if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + return -2; + } + + left = right; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ left += icon_stride; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } } @@ -863,9 +1126,14 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& float scaled_separator_size = m_layout.separator_size * factor; float scaled_gap_size = m_layout.gap_size * factor; float scaled_border = m_layout.border * factor; - +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float separator_stride = scaled_separator_size + scaled_gap_size; float icon_stride = scaled_icons_size + scaled_gap_size; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float left = m_layout.left + scaled_border; float top = m_layout.top - scaled_border; @@ -880,16 +1148,62 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& continue; if (item->is_separator()) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + { + float right = left + scaled_icons_size; + float bottom = top - scaled_separator_size; + + // mouse inside the separator + if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + return id; + + top = bottom; + bottom -= scaled_gap_size; + + if (id < m_items.size() - 1) + { + // mouse inside the gap + if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + return -2; + } + + top = bottom; + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ top -= separator_stride; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else { float right = left + scaled_icons_size; float bottom = top - scaled_icons_size; + // mouse inside the icon if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) return id; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + top = bottom; + bottom -= scaled_gap_size; + + if (id < m_items.size() - 1) + { + // mouse inside the gap + if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) + return -2; + } + + top = bottom; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ top -= icon_stride; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } } @@ -1244,5 +1558,52 @@ bool GLToolbar::generate_icons_texture() const } #endif // ENABLE_SVG_ICONS +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +bool GLToolbar::update_items_visibility() +{ + bool ret = false; + + for (GLToolbarItem* item : m_items) + { + ret |= item->update_visibility(); + } + + if (ret) + m_layout.dirty = true; + + // updates separators visibility to avoid having two of them consecutive + bool any_item_visible = false; + for (GLToolbarItem* item : m_items) + { + if (!item->is_separator()) + any_item_visible |= item->is_visible(); + else + { + item->set_visible(any_item_visible); + any_item_visible = false; + } + } + + return ret; +} + +bool GLToolbar::update_items_enabled_state() +{ + bool ret = false; + + for (GLToolbarItem* item : m_items) + { + ret |= item->update_enabled_state(); + } + + if (ret) + m_layout.dirty = true; + + return ret; +} +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 4ca72fc4a..e6ef051d6 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -31,6 +31,14 @@ wxDECLARE_EVENT(EVT_GLVIEWTOOLBAR_PREVIEW, SimpleEvent); class GLToolbarItem { public: +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + typedef std::function ActionCallback; + typedef std::function VisibilityCallback; + typedef std::function EnabledStateCallback; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + enum EType : unsigned char { Action, @@ -57,12 +65,33 @@ public: std::string tooltip; unsigned int sprite_id; bool is_toggable; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxEventType action_event; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool visible; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + ActionCallback action_callback; + VisibilityCallback visibility_callback; + EnabledStateCallback enabled_state_callback; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Data(); }; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + static const ActionCallback Default_Action_Callback; + static const VisibilityCallback Default_Visibility_Callback; + static const EnabledStateCallback Default_Enabled_State_Callback; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + private: EType m_type; EState m_state; @@ -80,7 +109,15 @@ public: #endif // ENABLE_SVG_ICONS const std::string& get_tooltip() const { return m_data.tooltip; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + void do_action() { m_data.action_callback(); } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void do_action(wxEvtHandler *target); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool is_enabled() const { return m_state != Disabled; } bool is_disabled() const { return m_state == Disabled; } @@ -89,13 +126,35 @@ public: bool is_toggable() const { return m_data.is_toggable; } bool is_visible() const { return m_data.visible; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_visible(bool visible) { m_data.visible = visible; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool is_separator() const { return m_type == Separator; } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + // returns true if the state changes + bool update_visibility(); + // returns true if the state changes + bool update_enabled_state(); +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; private: GLTexture::Quad_UVs get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + void set_visible(bool visible) { m_data.visible = visible; } + + friend class GLToolbar; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; #if !ENABLE_SVG_ICONS @@ -213,6 +272,21 @@ private: mutable Layout m_layout; ItemsList m_items; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + struct MouseCapture + { + bool left; + bool middle; + bool right; + + bool any() const { return left || middle || right; } + }; + + MouseCapture m_mouse_capture; + std::string m_tooltip; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ public: #if ENABLE_SVG_ICONS @@ -253,24 +327,59 @@ public: float get_width() const; float get_height() const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void enable_item(const std::string& name); void disable_item(const std::string& name); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void select_item(const std::string& name); bool is_item_pressed(const std::string& name) const; bool is_item_disabled(const std::string& name) const; bool is_item_visible(const std::string& name) const; - void set_item_visible(const std::string& name, bool visible); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + const std::string& get_tooltip() const { return m_tooltip; } +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + // returns true if any item changed its state + bool update_items_state(); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + void set_item_visible(const std::string& name, bool visible); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent); // returns the id of the item under the given mouse position or -1 if none int contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; void do_action(unsigned int item_id, GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void render(const GLCanvas3D& parent) const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + bool on_mouse(wxMouseEvent& evt, GLCanvas3D& parent); +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + private: void calc_layout() const; float get_width_horizontal() const; @@ -278,8 +387,20 @@ private: float get_height_horizontal() const; float get_height_vertical() const; float get_main_size() const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + void do_action(unsigned int item_id, GLCanvas3D& parent); + std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent); +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent); std::string update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + // returns the id of the item under the given mouse position or -1 if none + int contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; int contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; @@ -289,6 +410,15 @@ private: #if ENABLE_SVG_ICONS bool generate_icons_texture() const; #endif // ENABLE_SVG_ICONS + +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + // returns true if any item changed its state + bool update_items_visibility(); + // returns true if any item changed its state + bool update_items_enabled_state(); +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; } // namespace GUI diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 6f177d8b4..553978972 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -122,6 +122,9 @@ void View3D::mirror_selection(Axis axis) m_canvas->mirror_selection(axis); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void View3D::update_toolbar_items_visibility() { if (m_canvas != nullptr) @@ -133,6 +136,9 @@ void View3D::enable_toolbar_item(const std::string& name, bool enable) if (m_canvas != nullptr) m_canvas->enable_toolbar_item(name, enable); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int View3D::check_volumes_outside_state() const { diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index c15aad3b3..61d789247 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -54,8 +54,14 @@ public: void delete_selected(); void mirror_selection(Axis axis); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_toolbar_items_visibility(); void enable_toolbar_item(const std::string& name, bool enable); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int check_volumes_outside_state() const; bool is_layers_editing_enabled() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 64d189859..85349a52a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1217,6 +1217,19 @@ struct Plater::priv // Sets m_bed.m_polygon to limit the object placement. void set_bed_shape(const Pointfs& shape); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + bool can_delete() const; + bool can_delete_all() const; + bool can_increase_instances() const; + bool can_decrease_instances() const; + bool can_split_to_objects() const; + bool can_split_to_volumes() const; + bool can_arrange() const; + bool can_layers_editing() const; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + private: bool init_object_menu(); bool init_common_menu(wxMenu* menu, const bool is_part = false); @@ -1225,16 +1238,34 @@ private: bool complit_init_part_menu(); void init_view_toolbar(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_delete_object() const; bool can_increase_instances() const; bool can_decrease_instances() const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_set_instance_to_object() const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_split_to_objects() const; bool can_split_to_volumes() const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_split() const; bool layers_height_allowed() const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_delete_all() const; bool can_arrange() const; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_mirror() const; void update_fff_scene(); @@ -1794,11 +1825,17 @@ int Plater::priv::get_selected_volume_idx() const void Plater::priv::selection_changed() { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D->enable_toolbar_item("delete", can_delete_object()); view3D->enable_toolbar_item("more", can_increase_instances()); view3D->enable_toolbar_item("fewer", can_decrease_instances()); view3D->enable_toolbar_item("splitobjects", can_split()); view3D->enable_toolbar_item("splitvolumes", printer_technology == ptFFF && can_split()); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // if the selection is not valid to allow for layer editing, we need to turn off the tool if it is running bool enable_layer_editing = layers_height_allowed(); @@ -1807,7 +1844,13 @@ void Plater::priv::selection_changed() on_action_layersediting(evt); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D->enable_toolbar_item("layersediting", enable_layer_editing); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // forces a frame render to update the view (to avoid a missed update if, for example, the context menu appears) view3D->render(); @@ -1815,9 +1858,15 @@ void Plater::priv::selection_changed() void Plater::priv::object_list_changed() { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Enable/disable buttons depending on whether there are any objects on the platter. view3D->enable_toolbar_item("deleteall", can_delete_all()); view3D->enable_toolbar_item("arrange", can_arrange()); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ const bool export_in_progress = this->background_process.is_export_scheduled(); // || ! send_gcode_file.empty()); // XXX: is this right? @@ -1897,8 +1946,14 @@ void Plater::priv::arrange() wxBusyCursor wait; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Disable the arrange button (to prevent reentrancies, we will call wxYied) view3D->enable_toolbar_item("arrange", can_arrange()); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ this->background_process.stop(); unsigned count = 0; @@ -1970,8 +2025,14 @@ void Plater::priv::arrange() statusbar()->set_cancel_callback(); // remove cancel button arranging.store(false); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // We enable back the arrange button view3D->enable_toolbar_item("arrange", can_arrange()); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Do a full refresh of scene tree, including regenerating all the GLVolumes. //FIXME The update function shall just reload the modified matrices. @@ -2527,10 +2588,16 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) void Plater::priv::on_layer_editing_toggled(bool enable) { view3D->enable_layers_editing(enable); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (enable && !view3D->is_layers_editing_enabled()) { // Initialization of the OpenGL shaders failed. Disable the tool. view3D->enable_toolbar_item("layersediting", false); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D->set_as_dirty(); } @@ -2552,10 +2619,18 @@ void Plater::priv::on_action_split_volumes(SimpleEvent&) void Plater::priv::on_action_layersediting(SimpleEvent&) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + view3D->enable_layers_editing(!view3D->is_layers_editing_enabled()); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool enable = !view3D->is_layers_editing_enabled(); view3D->enable_layers_editing(enable); if (enable && !view3D->is_layers_editing_enabled()) view3D->enable_toolbar_item("layersediting", false); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } void Plater::priv::on_object_select(SimpleEvent& evt) @@ -2680,7 +2755,15 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ if (q != nullptr) { q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_mirror()); }, item_mirror->GetId()); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete()); }, item_delete->GetId()); +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete_object()); }, item_delete->GetId()); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } return true; @@ -2785,7 +2868,15 @@ void Plater::priv::init_view_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("3D editor view") + " [" + GUI::shortkey_ctrl_prefix() + "5]"; item.sprite_id = 0; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (this->q != nullptr) wxPostEvent(this->q, SimpleEvent(EVT_GLVIEWTOOLBAR_3D)); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLVIEWTOOLBAR_3D; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.is_toggable = false; if (!view_toolbar.add_item(item)) return; @@ -2796,18 +2887,35 @@ void Plater::priv::init_view_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Preview") + " [" + GUI::shortkey_ctrl_prefix() + "6]"; item.sprite_id = 1; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + item.action_callback = [this]() { if (this->q != nullptr) wxPostEvent(this->q, SimpleEvent(EVT_GLVIEWTOOLBAR_PREVIEW)); }; +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLVIEWTOOLBAR_PREVIEW; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.is_toggable = false; if (!view_toolbar.add_item(item)) return; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view_toolbar.enable_item("3D"); view_toolbar.enable_item("Preview"); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view_toolbar.select_item("3D"); view_toolbar.set_enabled(true); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_delete_object() const { int obj_idx = get_selected_object_idx(); @@ -2819,6 +2927,9 @@ bool Plater::priv::can_increase_instances() const int obj_idx = get_selected_object_idx(); return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_set_instance_to_object() const { @@ -2826,6 +2937,9 @@ bool Plater::priv::can_set_instance_to_object() const return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && (model.objects[obj_idx]->instances.size() > 1); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_decrease_instances() const { int obj_idx = get_selected_object_idx(); @@ -2846,6 +2960,9 @@ bool Plater::priv::can_split_to_volumes() const // return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && !model.objects[obj_idx]->is_multiparts(); return sidebar->obj_list()->is_splittable(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_split() const { @@ -2858,6 +2975,9 @@ bool Plater::priv::layers_height_allowed() const return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && config->opt_bool("variable_layer_height") && view3D->is_layers_editing_allowed(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_delete_all() const { return !model.objects.empty(); @@ -2867,6 +2987,9 @@ bool Plater::priv::can_arrange() const { return !model.objects.empty() && !arranging.load(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_mirror() const { @@ -2883,11 +3006,63 @@ void Plater::priv::set_bed_shape(const Pointfs& shape) } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +bool Plater::priv::can_delete() const +{ + return !get_selection().is_empty(); +} + +bool Plater::priv::can_delete_all() const +{ + return !model.objects.empty(); +} + +bool Plater::priv::can_increase_instances() const +{ + int obj_idx = get_selected_object_idx(); + return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()); +} + +bool Plater::priv::can_decrease_instances() const +{ + int obj_idx = get_selected_object_idx(); + return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && (model.objects[obj_idx]->instances.size() > 1); +} + +bool Plater::priv::can_split_to_objects() const +{ + return can_split(); +} + +bool Plater::priv::can_split_to_volumes() const +{ + return (printer_technology != ptSLA) && can_split(); +} + +bool Plater::priv::can_arrange() const +{ + return !model.objects.empty() && !arranging.load(); +} + +bool Plater::priv::can_layers_editing() const +{ + return layers_height_allowed(); +} +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + void Plater::priv::update_object_menu() { sidebar->obj_list()->append_menu_items_add_volume(&object_menu); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (view3D != nullptr) view3D->update_toolbar_items_visibility(); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const @@ -3370,14 +3545,26 @@ void Plater::on_config_change(const DynamicPrintConfig &config) } else if(opt_key == "variable_layer_height") { if (p->config->opt_bool("variable_layer_height") != true) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ p->view3D->enable_toolbar_item("layersediting", false); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ p->view3D->enable_layers_editing(false); p->view3D->set_as_dirty(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (p->view3D->is_layers_editing_allowed()) { p->view3D->enable_toolbar_item("layersediting", true); } - } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // !ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + } else if(opt_key == "extruder_colour") { update_scheduled = true; p->preview->set_number_extruders(p->config->option(opt_key)->values.size()); @@ -3498,4 +3685,17 @@ void Plater::fix_through_netfabb(const int obj_idx, const int vol_idx/* = -1*/) void Plater::update_object_menu() { p->update_object_menu(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING +bool Plater::can_delete() const { return p->can_delete(); } +bool Plater::can_delete_all() const { return p->can_delete_all(); } +bool Plater::can_increase_instances() const { return p->can_increase_instances(); } +bool Plater::can_decrease_instances() const { return p->can_decrease_instances(); } +bool Plater::can_split_to_objects() const { return p->can_split_to_objects(); } +bool Plater::can_split_to_volumes() const { return p->can_split_to_volumes(); } +bool Plater::can_arrange() const { return p->can_arrange(); } +bool Plater::can_layers_editing() const { return p->can_layers_editing(); } +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 4261dbae2..b8bd7d907 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -178,6 +178,19 @@ public: PrinterTechnology printer_technology() const; void set_printer_technology(PrinterTechnology printer_technology); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_CANVAS_GUI_REFACTORING + bool can_delete() const; + bool can_delete_all() const; + bool can_increase_instances() const; + bool can_decrease_instances() const; + bool can_split_to_objects() const; + bool can_split_to_volumes() const; + bool can_arrange() const; + bool can_layers_editing() const; +#endif // ENABLE_CANVAS_GUI_REFACTORING +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + private: struct priv; std::unique_ptr p; From 2c49dcb9bed0fc49b3c24f33d4cecf01fa7e8b9a Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Tue, 12 Mar 2019 17:41:43 +0100 Subject: [PATCH 140/236] Bonjour: Add txt key-val extraction, filtering based on printer tech --- src/slic3r/GUI/BonjourDialog.cpp | 50 ++++++--- src/slic3r/GUI/BonjourDialog.hpp | 5 +- src/slic3r/GUI/Tab.cpp | 15 +-- src/slic3r/Utils/Bonjour.cpp | 176 +++++++++++++++++++------------ src/slic3r/Utils/Bonjour.hpp | 24 ++++- 5 files changed, 174 insertions(+), 96 deletions(-) diff --git a/src/slic3r/GUI/BonjourDialog.cpp b/src/slic3r/GUI/BonjourDialog.cpp index 68e353ebe..41e9d5392 100644 --- a/src/slic3r/GUI/BonjourDialog.cpp +++ b/src/slic3r/GUI/BonjourDialog.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/I18N.hpp" @@ -49,14 +50,16 @@ struct LifetimeGuard LifetimeGuard(BonjourDialog *dialog) : dialog(dialog) {} }; +// FIXME: use em, resizable -BonjourDialog::BonjourDialog(wxWindow *parent) : - wxDialog(parent, wxID_ANY, _(L("Network lookup"))), - list(new wxListView(this, wxID_ANY, wxDefaultPosition, wxSize(800, 300))), - replies(new ReplySet), - label(new wxStaticText(this, wxID_ANY, "")), - timer(new wxTimer()), - timer_state(0) +BonjourDialog::BonjourDialog(wxWindow *parent, Slic3r::PrinterTechnology tech) + : wxDialog(parent, wxID_ANY, _(L("Network lookup"))) + , list(new wxListView(this, wxID_ANY, wxDefaultPosition, wxSize(800, 300))) + , replies(new ReplySet) + , label(new wxStaticText(this, wxID_ANY, "")) + , timer(new wxTimer()) + , timer_state(0) + , tech(tech) { wxBoxSizer *vsizer = new wxBoxSizer(wxVERTICAL); @@ -67,7 +70,9 @@ BonjourDialog::BonjourDialog(wxWindow *parent) : list->AppendColumn(_(L("Address")), wxLIST_FORMAT_LEFT, 50); list->AppendColumn(_(L("Hostname")), wxLIST_FORMAT_LEFT, 100); list->AppendColumn(_(L("Service name")), wxLIST_FORMAT_LEFT, 200); - list->AppendColumn(_(L("OctoPrint version")), wxLIST_FORMAT_LEFT, 50); + if (tech == ptFFF) { + list->AppendColumn(_(L("OctoPrint version")), wxLIST_FORMAT_LEFT, 50); + } vsizer->Add(list, 1, wxEXPAND | wxALL, 10); @@ -110,7 +115,11 @@ bool BonjourDialog::show_and_lookup() // so that both threads can access it safely. auto dguard = std::make_shared(this); + // Note: More can be done here when we support discovery of hosts other than Octoprint and SL1 + Bonjour::TxtKeys txt_keys { "version", "model" }; + bonjour = std::move(Bonjour("octoprint") + .set_txt_keys(std::move(txt_keys)) .set_retries(3) .set_timeout(4) .on_reply([dguard](BonjourReply &&reply) { @@ -157,9 +166,20 @@ void BonjourDialog::on_reply(BonjourReplyEvent &e) return; } + // Filter replies based on selected technology + const auto model = e.reply.txt_data.find("model"); + const bool sl1 = model != e.reply.txt_data.end() && model->second == "SL1"; + if (tech == ptFFF && sl1 || tech == ptSLA && !sl1) { + return; + } + replies->insert(std::move(e.reply)); auto selected = get_selected(); + + wxWindowUpdateLocker freeze_guard(this); + (void)freeze_guard; + list->DeleteAllItems(); // The whole list is recreated so that we benefit from it already being sorted in the set. @@ -168,12 +188,18 @@ void BonjourDialog::on_reply(BonjourReplyEvent &e) auto item = list->InsertItem(0, reply.full_address); list->SetItem(item, 1, reply.hostname); list->SetItem(item, 2, reply.service_name); - list->SetItem(item, 3, reply.version); + + if (tech == ptFFF) { + const auto it = reply.txt_data.find("version"); + if (it != reply.txt_data.end()) { + list->SetItem(item, 3, GUI::from_u8(it->second)); + } + } } - for (int i = 0; i < 4; i++) { - this->list->SetColumnWidth(i, wxLIST_AUTOSIZE); - if (this->list->GetColumnWidth(i) < 100) { this->list->SetColumnWidth(i, 100); } + for (int i = 0; i < list->GetColumnCount(); i++) { + list->SetColumnWidth(i, wxLIST_AUTOSIZE); + if (list->GetColumnWidth(i) < 100) { list->SetColumnWidth(i, 100); } } if (!selected.IsEmpty()) { diff --git a/src/slic3r/GUI/BonjourDialog.hpp b/src/slic3r/GUI/BonjourDialog.hpp index e3f53790b..a9a33d522 100644 --- a/src/slic3r/GUI/BonjourDialog.hpp +++ b/src/slic3r/GUI/BonjourDialog.hpp @@ -5,6 +5,8 @@ #include +#include "libslic3r/PrintConfig.hpp" + class wxListView; class wxStaticText; class wxTimer; @@ -21,7 +23,7 @@ class ReplySet; class BonjourDialog: public wxDialog { public: - BonjourDialog(wxWindow *parent); + BonjourDialog(wxWindow *parent, Slic3r::PrinterTechnology); BonjourDialog(BonjourDialog &&) = delete; BonjourDialog(const BonjourDialog &) = delete; BonjourDialog &operator=(BonjourDialog &&) = delete; @@ -37,6 +39,7 @@ private: std::shared_ptr bonjour; std::unique_ptr timer; unsigned timer_state; + Slic3r::PrinterTechnology tech; void on_reply(BonjourReplyEvent &); void on_timer(wxTimerEvent &); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 6c7f246a6..bd0adcab0 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1612,25 +1612,21 @@ bool Tab::current_preset_is_dirty() void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) { - const bool sla = m_presets->get_selected_preset().printer_technology() == ptSLA; + const PrinterTechnology tech = m_presets->get_selected_preset().printer_technology(); // Only offer the host type selection for FFF, for SLA it's always the SL1 printer (at the moment) - if (! sla) { + if (tech == ptFFF) { optgroup->append_single_option_line("host_type"); } - auto printhost_browse = [this, optgroup] (wxWindow* parent) { - - // TODO: SLA Bonjour - + auto printhost_browse = [=](wxWindow* parent) { auto btn = m_printhost_browse_btn = new wxButton(parent, wxID_ANY, _(L(" Browse "))+dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT); -// btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("zoom.png")), wxBITMAP_TYPE_PNG)); btn->SetBitmap(create_scaled_bitmap("zoom.png")); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn); - btn->Bind(wxEVT_BUTTON, [this, parent, optgroup](wxCommandEvent &e) { - BonjourDialog dialog(parent); + btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent &e) { + BonjourDialog dialog(parent, tech); if (dialog.show_and_lookup()) { optgroup->set_value("print_host", std::move(dialog.get_selected()), true); optgroup->get_field("print_host")->field_changed(); @@ -1643,7 +1639,6 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) auto print_host_test = [this](wxWindow* parent) { auto btn = m_print_host_test_btn = new wxButton(parent, wxID_ANY, _(L("Test")), wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT); -// btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("wrench.png")), wxBITMAP_TYPE_PNG)); btn->SetBitmap(create_scaled_bitmap("wrench.png")); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn); diff --git a/src/slic3r/Utils/Bonjour.cpp b/src/slic3r/Utils/Bonjour.cpp index 4953cfc64..28b3b2228 100644 --- a/src/slic3r/Utils/Bonjour.cpp +++ b/src/slic3r/Utils/Bonjour.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -33,7 +34,9 @@ namespace Slic3r { // the implementations has been tested with AFL. -// Relevant RFC: https://www.ietf.org/rfc/rfc6762.txt +// Relevant RFCs: +// https://tools.ietf.org/html/rfc6762.txt +// https://tools.ietf.org/html/rfc6763.txt struct DnsName: public std::string @@ -156,9 +159,9 @@ struct DnsQuestion uint16_t type; uint16_t qclass; - DnsQuestion() : - type(0), - qclass(0) + DnsQuestion() + : type(0) + , qclass(0) {} static optional decode(const std::vector &buffer, size_t &offset) @@ -187,10 +190,10 @@ struct DnsResource uint32_t ttl; std::vector data; - DnsResource() : - type(0), - rclass(0), - ttl(0) + DnsResource() + : type(0) + , rclass(0) + , ttl(0) {} static optional decode(const std::vector &buffer, size_t &offset, size_t &dataoffset) @@ -310,9 +313,9 @@ struct DnsRR_TXT TAG = 0x10, }; - std::vector values; + BonjourReply::TxtData data; - static optional decode(const DnsResource &rr) + static optional decode(const DnsResource &rr, const Bonjour::TxtKeys &txt_keys) { const size_t size = rr.data.size(); if (size < 2) { @@ -328,11 +331,21 @@ struct DnsRR_TXT } ++it; - std::string value(val_size, ' '); - std::copy(it, it + val_size, value.begin()); - res.values.push_back(std::move(value)); + const auto it_end = it + val_size; + const auto it_eq = std::find(it, it_end, '='); + if (it_eq > it && it_eq < it_end - 1) { + std::string key(it_eq - it, ' '); + std::copy(it, it_eq, key.begin()); - it += val_size; + if (txt_keys.find(key) != txt_keys.end() || key == "path") { + // This key-value has been requested for + std::string value(it_end - it_eq - 1, ' '); + std::copy(it_eq + 1, it_end, value.begin()); + res.data.insert(std::make_pair(std::move(key), std::move(value))); + } + } + + it = it_end; } return std::move(res); @@ -389,7 +402,7 @@ struct DnsMessage DnsSDMap sdmap; - static optional decode(const std::vector &buffer) + static optional decode(const std::vector &buffer, const Bonjour::TxtKeys &txt_keys) { const auto size = buffer.size(); if (size < DnsHeader::SIZE + DnsQuestion::MIN_SIZE || size > MAX_SIZE) { @@ -414,14 +427,15 @@ struct DnsMessage if (!rr) { return boost::none; } else { - res.parse_rr(buffer, std::move(*rr), dataoffset); + res.parse_rr(buffer, std::move(*rr), dataoffset, txt_keys); } } return std::move(res); } + private: - void parse_rr(const std::vector &buffer, DnsResource &&rr, size_t dataoffset) + void parse_rr(const std::vector &buffer, DnsResource &&rr, size_t dataoffset, const Bonjour::TxtKeys &txt_keys) { switch (rr.type) { case DnsRR_A::TAG: DnsRR_A::decode(this->rr_a, rr); break; @@ -432,7 +446,7 @@ private: break; } case DnsRR_TXT::TAG: { - auto txt = DnsRR_TXT::decode(rr); + auto txt = DnsRR_TXT::decode(rr, txt_keys); if (txt) { this->sdmap.insert_txt(std::move(rr.name), std::move(*txt)); } break; } @@ -442,26 +456,28 @@ private: std::ostream& operator<<(std::ostream &os, const DnsMessage &msg) { - os << "DnsMessage(ID: " << msg.header.id << ", " - << "Q: " << (msg.question ? msg.question->name.c_str() : "none") << ", " - << "A: " << (msg.rr_a ? msg.rr_a->ip.to_string() : "none") << ", " - << "AAAA: " << (msg.rr_aaaa ? msg.rr_aaaa->ip.to_string() : "none") << ", " - << "services: ["; + os << boost::format("DnsMessage(ID: %1%, Q: %2%, A: %3%, AAAA: %4%, services: [") + % msg.header.id + % (msg.question ? msg.question->name.c_str() : "none") + % (msg.rr_a ? msg.rr_a->ip.to_string() : "none") + % (msg.rr_aaaa ? msg.rr_aaaa->ip.to_string() : "none"); - enum { SRV_PRINT_MAX = 3 }; - unsigned i = 0; - for (const auto &sdpair : msg.sdmap) { - os << sdpair.first << ", "; + enum { SRV_PRINT_MAX = 3 }; + unsigned i = 0; + for (const auto &sdpair : msg.sdmap) { + if (i > 0) { os << ", "; } - if (++i >= SRV_PRINT_MAX) { - os << "..."; - break; - } + if (i < SRV_PRINT_MAX) { + os << sdpair.first; + } else { + os << "..."; + break; } - os << "])"; + i++; + } - return os; + return os << "])"; } @@ -525,8 +541,9 @@ optional BonjourRequest::make(const std::string &service, const struct Bonjour::priv { const std::string service; - const std::string protocol; - const std::string service_dn; + std::string protocol; + std::string service_dn; + TxtKeys txt_keys; unsigned timeout; unsigned retries; @@ -535,19 +552,18 @@ struct Bonjour::priv Bonjour::ReplyFn replyfn; Bonjour::CompleteFn completefn; - priv(std::string service, std::string protocol); + priv(std::string &&service); std::string strip_service_dn(const std::string &service_name) const; void udp_receive(udp::endpoint from, size_t bytes); void lookup_perform(); }; -Bonjour::priv::priv(std::string service, std::string protocol) : - service(std::move(service)), - protocol(std::move(protocol)), - service_dn((boost::format("_%1%._%2%.local") % this->service % this->protocol).str()), - timeout(10), - retries(1) +Bonjour::priv::priv(std::string &&service) + : service(std::move(service)) + , protocol("tcp") + , timeout(10) + , retries(1) { buffer.resize(DnsMessage::MAX_SIZE); } @@ -573,13 +589,13 @@ void Bonjour::priv::udp_receive(udp::endpoint from, size_t bytes) } buffer.resize(bytes); - const auto dns_msg = DnsMessage::decode(buffer); + auto dns_msg = DnsMessage::decode(buffer, txt_keys); if (dns_msg) { asio::ip::address ip = from.address(); if (dns_msg->rr_a) { ip = dns_msg->rr_a->ip; } else if (dns_msg->rr_aaaa) { ip = dns_msg->rr_aaaa->ip; } - for (const auto &sdpair : dns_msg->sdmap) { + for (auto &sdpair : dns_msg->sdmap) { if (! sdpair.second.srv) { continue; } @@ -590,20 +606,12 @@ void Bonjour::priv::udp_receive(udp::endpoint from, size_t bytes) std::string path; std::string version; + BonjourReply::TxtData txt_data; if (sdpair.second.txt) { - static const std::string tag_path = "path="; - static const std::string tag_version = "version="; - - for (const auto &value : sdpair.second.txt->values) { - if (value.size() > tag_path.size() && value.compare(0, tag_path.size(), tag_path) == 0) { - path = std::move(value.substr(tag_path.size())); - } else if (value.size() > tag_version.size() && value.compare(0, tag_version.size(), tag_version) == 0) { - version = std::move(value.substr(tag_version.size())); - } - } + txt_data = std::move(sdpair.second.txt->data); } - BonjourReply reply(ip, srv.port, std::move(service_name), srv.hostname, std::move(path), std::move(version)); + BonjourReply reply(ip, srv.port, std::move(service_name), srv.hostname, std::move(txt_data)); replyfn(std::move(reply)); } } @@ -611,6 +619,8 @@ void Bonjour::priv::udp_receive(udp::endpoint from, size_t bytes) void Bonjour::priv::lookup_perform() { + service_dn = (boost::format("_%1%._%2%.local") % service % protocol).str(); + const auto brq = BonjourRequest::make(service, protocol); if (!brq) { return; @@ -671,21 +681,29 @@ void Bonjour::priv::lookup_perform() // API - public part -BonjourReply::BonjourReply(boost::asio::ip::address ip, uint16_t port, std::string service_name, std::string hostname, std::string path, std::string version) : - ip(std::move(ip)), - port(port), - service_name(std::move(service_name)), - hostname(std::move(hostname)), - path(path.empty() ? std::move(std::string("/")) : std::move(path)), - version(version.empty() ? std::move(std::string("Unknown")) : std::move(version)) +BonjourReply::BonjourReply(boost::asio::ip::address ip, uint16_t port, std::string service_name, std::string hostname, BonjourReply::TxtData txt_data) + : ip(std::move(ip)) + , port(port) + , service_name(std::move(service_name)) + , hostname(std::move(hostname)) + , txt_data(std::move(txt_data)) { std::string proto; std::string port_suffix; if (port == 443) { proto = "https://"; } if (port != 443 && port != 80) { port_suffix = std::to_string(port).insert(0, 1, ':'); } - if (this->path[0] != '/') { this->path.insert(0, 1, '/'); } + + std::string path = this->path(); + if (path[0] != '/') { path.insert(0, 1, '/'); } full_address = proto + ip.to_string() + port_suffix; - if (this->path != "/") { full_address += path; } + if (path != "/") { full_address += path; } + txt_data["path"] = std::move(path); +} + +std::string BonjourReply::path() const +{ + const auto it = txt_data.find("path"); + return it != txt_data.end() ? it->second : std::string("/"); } bool BonjourReply::operator==(const BonjourReply &other) const @@ -707,14 +725,22 @@ bool BonjourReply::operator<(const BonjourReply &other) const std::ostream& operator<<(std::ostream &os, const BonjourReply &reply) { - os << "BonjourReply(" << reply.ip.to_string() << ", " << reply.service_name << ", " - << reply.hostname << ", " << reply.path << ", " << reply.version << ")"; - return os; + os << boost::format("BonjourReply(%1%, %2%, %3%, %4%") + % reply.ip.to_string() + % reply.service_name + % reply.hostname + % reply.full_address; + + for (const auto &kv : reply.txt_data) { + os << boost::format(", %1%=%2%") % kv.first % kv.second; + } + + return os << ')'; } -Bonjour::Bonjour(std::string service, std::string protocol) : - p(new priv(std::move(service), std::move(protocol))) +Bonjour::Bonjour(std::string service) + : p(new priv(std::move(service))) {} Bonjour::Bonjour(Bonjour &&other) : p(std::move(other.p)) {} @@ -726,6 +752,18 @@ Bonjour::~Bonjour() } } +Bonjour& Bonjour::set_protocol(std::string protocol) +{ + if (p) { p->protocol = std::move(protocol); } + return *this; +} + +Bonjour& Bonjour::set_txt_keys(TxtKeys txt_keys) +{ + if (p) { p->txt_keys = std::move(txt_keys); } + return *this; +} + Bonjour& Bonjour::set_timeout(unsigned timeout) { if (p) { p->timeout = timeout; } diff --git a/src/slic3r/Utils/Bonjour.hpp b/src/slic3r/Utils/Bonjour.hpp index 63f34638c..e61cd1833 100644 --- a/src/slic3r/Utils/Bonjour.hpp +++ b/src/slic3r/Utils/Bonjour.hpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include #include @@ -13,16 +15,24 @@ namespace Slic3r { struct BonjourReply { + typedef std::unordered_map TxtData; + boost::asio::ip::address ip; uint16_t port; std::string service_name; std::string hostname; std::string full_address; - std::string path; - std::string version; + + TxtData txt_data; BonjourReply() = delete; - BonjourReply(boost::asio::ip::address ip, uint16_t port, std::string service_name, std::string hostname, std::string path, std::string version); + BonjourReply(boost::asio::ip::address ip, + uint16_t port, + std::string service_name, + std::string hostname, + TxtData txt_data); + + std::string path() const; bool operator==(const BonjourReply &other) const; bool operator<(const BonjourReply &other) const; @@ -39,11 +49,17 @@ public: typedef std::shared_ptr Ptr; typedef std::function ReplyFn; typedef std::function CompleteFn; + typedef std::set TxtKeys; - Bonjour(std::string service, std::string protocol = "tcp"); + Bonjour(std::string service); Bonjour(Bonjour &&other); ~Bonjour(); + // Set requested service protocol, "tcp" by default + Bonjour& set_protocol(std::string protocol); + // Set which TXT key-values should be collected + // Note that "path" is always collected + Bonjour& set_txt_keys(TxtKeys txt_keys); Bonjour& set_timeout(unsigned timeout); Bonjour& set_retries(unsigned retries); // ^ Note: By default there is 1 retry (meaning 1 broadcast is sent). From 5c9cede9bfc2a38eb3aa83ad0429793ec4287200 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Thu, 14 Mar 2019 14:46:01 +0100 Subject: [PATCH 141/236] Fix HiDPI in Bonjour Dialog --- src/slic3r/GUI/BonjourDialog.cpp | 30 +++++++++++++++++------------- src/slic3r/GUI/MsgDialog.cpp | 2 -- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/BonjourDialog.cpp b/src/slic3r/GUI/BonjourDialog.cpp index 41e9d5392..ec6b2f0c9 100644 --- a/src/slic3r/GUI/BonjourDialog.cpp +++ b/src/slic3r/GUI/BonjourDialog.cpp @@ -13,6 +13,7 @@ #include #include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/I18N.hpp" #include "slic3r/Utils/Bonjour.hpp" @@ -50,35 +51,36 @@ struct LifetimeGuard LifetimeGuard(BonjourDialog *dialog) : dialog(dialog) {} }; -// FIXME: use em, resizable - BonjourDialog::BonjourDialog(wxWindow *parent, Slic3r::PrinterTechnology tech) - : wxDialog(parent, wxID_ANY, _(L("Network lookup"))) - , list(new wxListView(this, wxID_ANY, wxDefaultPosition, wxSize(800, 300))) + : wxDialog(parent, wxID_ANY, _(L("Network lookup")), wxDefaultPosition, wxDefaultSize, wxRESIZE_BORDER) + , list(new wxListView(this, wxID_ANY)) , replies(new ReplySet) , label(new wxStaticText(this, wxID_ANY, "")) , timer(new wxTimer()) , timer_state(0) , tech(tech) { + const int em = GUI::wxGetApp().em_unit(); + list->SetMinSize(wxSize(80 * em, 30 * em)); + wxBoxSizer *vsizer = new wxBoxSizer(wxVERTICAL); - vsizer->Add(label, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 10); + vsizer->Add(label, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, em); list->SetSingleStyle(wxLC_SINGLE_SEL); list->SetSingleStyle(wxLC_SORT_DESCENDING); - list->AppendColumn(_(L("Address")), wxLIST_FORMAT_LEFT, 50); - list->AppendColumn(_(L("Hostname")), wxLIST_FORMAT_LEFT, 100); - list->AppendColumn(_(L("Service name")), wxLIST_FORMAT_LEFT, 200); + list->AppendColumn(_(L("Address")), wxLIST_FORMAT_LEFT, 5 * em); + list->AppendColumn(_(L("Hostname")), wxLIST_FORMAT_LEFT, 10 * em); + list->AppendColumn(_(L("Service name")), wxLIST_FORMAT_LEFT, 20 * em); if (tech == ptFFF) { - list->AppendColumn(_(L("OctoPrint version")), wxLIST_FORMAT_LEFT, 50); + list->AppendColumn(_(L("OctoPrint version")), wxLIST_FORMAT_LEFT, 5 * em); } - vsizer->Add(list, 1, wxEXPAND | wxALL, 10); + vsizer->Add(list, 1, wxEXPAND | wxALL, em); wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL); - button_sizer->Add(new wxButton(this, wxID_OK, "OK"), 0, wxALL, 10); - button_sizer->Add(new wxButton(this, wxID_CANCEL, "Cancel"), 0, wxALL, 10); + button_sizer->Add(new wxButton(this, wxID_OK, "OK"), 0, wxALL, em); + button_sizer->Add(new wxButton(this, wxID_CANCEL, "Cancel"), 0, wxALL, em); // ^ Note: The Ok/Cancel labels are translated by wxWidgets vsizer->Add(button_sizer, 0, wxALIGN_CENTER); @@ -197,9 +199,11 @@ void BonjourDialog::on_reply(BonjourReplyEvent &e) } } + const int em = GUI::wxGetApp().em_unit(); + for (int i = 0; i < list->GetColumnCount(); i++) { list->SetColumnWidth(i, wxLIST_AUTOSIZE); - if (list->GetColumnWidth(i) < 100) { list->SetColumnWidth(i, 100); } + if (list->GetColumnWidth(i) < 10 * em) { list->SetColumnWidth(i, 10 * em); } } if (!selected.IsEmpty()) { diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 176d19fb4..7cf70840d 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -24,7 +24,6 @@ namespace GUI { MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, wxWindowID button_id) : -// MsgDialog(parent, title, headline, wxBitmap(from_u8(Slic3r::var("Slic3r_192px.png")), wxBITMAP_TYPE_PNG), button_id) MsgDialog(parent, title, headline, create_scaled_bitmap("Slic3r_192px.png"), button_id) {} @@ -70,7 +69,6 @@ MsgDialog::~MsgDialog() {} ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg) : MsgDialog(parent, _(L("Slic3r error")), _(L("Slic3r has encountered an error")), -// wxBitmap(from_u8(Slic3r::var("Slic3r_192px_grayscale.png")), wxBITMAP_TYPE_PNG), create_scaled_bitmap("Slic3r_192px_grayscale.png"), wxID_NONE) , msg(msg) From aaf5c6c663b1c37c15c62071a45cd778d31fcb38 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Thu, 14 Mar 2019 14:54:12 +0100 Subject: [PATCH 142/236] MsgDialog: Make resizable --- src/slic3r/GUI/MsgDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 7cf70840d..961888455 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -28,7 +28,7 @@ MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &he {} MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, wxBitmap bitmap, wxWindowID button_id) : - wxDialog(parent, wxID_ANY, title), + wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxRESIZE_BORDER), boldfont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)), content_sizer(new wxBoxSizer(wxVERTICAL)), btn_sizer(new wxBoxSizer(wxHORIZONTAL)) From d6b409d0d98bacffb67e9f1f81731726f144a283 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 14 Mar 2019 15:11:27 +0100 Subject: [PATCH 143/236] Update the SLA slices at the print preview once the index is calculated. --- src/libslic3r/PrintBase.hpp | 1 + src/libslic3r/SLAPrint.cpp | 5 ++++- src/slic3r/GUI/Plater.cpp | 10 ++++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index e01b678a5..2d47d3567 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -272,6 +272,7 @@ public: NO_RELOAD_SCENE = 0, RELOAD_SCENE = 1 << 1, RELOAD_SLA_SUPPORT_POINTS = 1 << 2, + RELOAD_SLA_PREVIEW = 1 << 3, }; // Bitmap of FlagBits unsigned int flags; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index b6c8aad13..52f1e032b 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -821,7 +821,7 @@ void SLAPrint::process() // We have the layer polygon collection but we need to unite them into // an index where the key is the height level in discrete levels (clipper) - auto index_slices = [ilhd](SLAPrintObject& po) { + auto index_slices = [this, ilhd](SLAPrintObject& po) { po.m_slice_index.clear(); auto sih = LevelID(scale_(ilhd)); @@ -890,6 +890,9 @@ void SLAPrint::process() sr.support_slices_idx = SLAPrintObject::SliceRecord::Idx(i); } } + + // Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update status to the 3D preview to load the SLA slices. + report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW); }; // Rasterizing the model objects, and their supports diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 64d189859..601c2ddb6 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2434,8 +2434,10 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) { - this->statusbar()->set_progress(evt.status.percent); - this->statusbar()->set_status_text(_(L(evt.status.text)) + wxString::FromUTF8("…")); + if (evt.status.percent >= -1) { + this->statusbar()->set_progress(evt.status.percent); + this->statusbar()->set_status_text(_(L(evt.status.text)) + wxString::FromUTF8("…")); + } if (evt.status.flags & PrintBase::SlicingStatus::RELOAD_SCENE) { switch (this->printer_technology) { case ptFFF: @@ -2453,6 +2455,10 @@ void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) // Update SLA gizmo (reload_scene calls update_gizmos_data) q->canvas3D()->reload_scene(true); } + if (evt.status.flags & PrintBase::SlicingStatus::RELOAD_SLA_PREVIEW) { + // Update the SLA preview + this->preview->reload_print(); + } } void Plater::priv::on_slicing_completed(wxCommandEvent &) From 639b641722c21cb6aae12ced9535be64c1c7e349 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 14 Mar 2019 15:45:52 +0100 Subject: [PATCH 144/236] Disabled DoubleBuffered for Tabs + set helper functions like a static (GUI_ObjectList.cpp) --- src/slic3r/GUI/GUI_ObjectList.cpp | 4 ++-- src/slic3r/GUI/Tab.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f6ccbbd7d..7eef82063 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -44,12 +44,12 @@ static PrinterTechnology printer_technology() } // Config from current edited printer preset -DynamicPrintConfig& printer_config() +static DynamicPrintConfig& printer_config() { return wxGetApp().preset_bundle->printers.get_edited_preset().config; } -int extruders_count() +static int extruders_count() { return printer_technology() == ptSLA ? 1 : printer_config().option("nozzle_diameter")->values.size(); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index bd0adcab0..ae33443c3 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -74,7 +74,7 @@ void Tab::set_type() void Tab::create_preset_tab() { #ifdef __WINDOWS__ - SetDoubleBuffered(true); +// SetDoubleBuffered(true); #endif //__WINDOWS__ m_preset_bundle = wxGetApp().preset_bundle; From 6928284cc38e3ab6a21f898b812bd805534c9dcd Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 14 Mar 2019 16:31:55 +0100 Subject: [PATCH 145/236] Loading of FFF print preview when switching to the print preview screen: always refresh from the Print with the exception of finished G-code export, where the final G-code preview is cached. --- src/slic3r/GUI/GUI_Preview.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 6f177d8b4..e2539473b 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -746,10 +746,11 @@ void Preview::load_print_as_fff() if (IsShown()) { - if (gcode_preview_data_valid) + if (gcode_preview_data_valid) { // Load the real G-code preview. m_canvas->load_gcode_preview(*m_gcode_preview_data, colors); - else + m_loaded = true; + } else // Load the initial preview based on slices, not the final G-code. m_canvas->load_preview(colors, color_print_values); show_hide_ui_elements(gcode_preview_data_valid ? "full" : "simple"); @@ -761,7 +762,6 @@ void Preview::load_print_as_fff() m_canvas_widget->Refresh(); } else update_sliders(zs); - m_loaded = true; } } From 60260c26be31c6a68165f33a56749ddde4d9483d Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 14 Mar 2019 18:47:26 +0100 Subject: [PATCH 146/236] Fixed command line slicing due to some missing config keys --- src/libslic3r/Print.cpp | 9 ++++++--- src/libslic3r/SLAPrint.cpp | 9 ++++++--- src/slic3r.cpp | 8 ++++---- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index bd7772f80..794390133 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -661,6 +661,9 @@ Print::ApplyStatus Print::apply(const Model &model, const DynamicPrintConfig &co // Make a copy of the config, normalize it. DynamicPrintConfig config(config_in); + config.option("print_settings_id", true); + config.option("filament_settings_id", true); + config.option("printer_settings_id", true); config.normalize(); // Collect changes to print config. t_config_option_keys print_diff = m_config.diff(config); @@ -688,9 +691,9 @@ Print::ApplyStatus Print::apply(const Model &model, const DynamicPrintConfig &co PlaceholderParser &pp = this->placeholder_parser(); pp.apply_only(config, placeholder_parser_diff); // Set the profile aliases for the PrintBase::output_filename() - pp.set("print_preset", config_in.option("print_settings_id" )->clone()); - pp.set("filament_preset", config_in.option("filament_settings_id")->clone()); - pp.set("printer_preset", config_in.option("printer_settings_id" )->clone()); + pp.set("print_preset", config.option("print_settings_id")->clone()); + pp.set("filament_preset", config.option("filament_settings_id")->clone()); + pp.set("printer_preset", config.option("printer_settings_id")->clone()); } // It is also safe to change m_config now after this->invalidate_state_by_config_options() call. diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 52f1e032b..0e8e717cc 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -118,6 +118,9 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf // Make a copy of the config, normalize it. DynamicPrintConfig config(config_in); + config.option("sla_print_settings_id", true); + config.option("sla_material_settings_id", true); + config.option("printer_settings_id", true); config.normalize(); // Collect changes to print config. t_config_option_keys print_diff = m_print_config.diff(config); @@ -151,9 +154,9 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf PlaceholderParser &pp = this->placeholder_parser(); pp.apply_config(config); // Set the profile aliases for the PrintBase::output_filename() - pp.set("print_preset", config_in.option("sla_print_settings_id")->clone()); - pp.set("material_preset", config_in.option("sla_material_settings_id")->clone()); - pp.set("printer_preset", config_in.option("printer_settings_id")->clone()); + pp.set("print_preset", config.option("sla_print_settings_id")->clone()); + pp.set("material_preset", config.option("sla_material_settings_id")->clone()); + pp.set("printer_preset", config.option("printer_settings_id")->clone()); } // It is also safe to change m_config now after this->invalidate_state_by_config_options() call. diff --git a/src/slic3r.cpp b/src/slic3r.cpp index f88b84ce7..b60c5b1dd 100644 --- a/src/slic3r.cpp +++ b/src/slic3r.cpp @@ -68,7 +68,7 @@ int CLI::run(int argc, char **argv) // load config files supplied via --load for (auto const &file : load_configs) { if (! boost::filesystem::exists(file)) { - if (m_config.opt_bool("ignore_nonexistent_file")) { + if (m_config.opt_bool("ignore_nonexistent_config")) { continue; } else { boost::nowide::cerr << "No such file: " << file << std::endl; @@ -132,9 +132,9 @@ int CLI::run(int argc, char **argv) // Initialize full print configs for both the FFF and SLA technologies. FullPrintConfig fff_print_config; - SLAFullPrintConfig sla_print_config; +// SLAFullPrintConfig sla_print_config; fff_print_config.apply(m_print_config, true); - sla_print_config.apply(m_print_config, true); +// sla_print_config.apply(m_print_config, true); // Loop through transform options. for (auto const &opt_key : m_transforms) { @@ -530,7 +530,7 @@ bool CLI::setup(int argc, char **argv) for (auto const &opt_key : opt_order) { if (cli_actions_config_def.has(opt_key)) m_actions.emplace_back(opt_key); - if (cli_transform_config_def.has(opt_key)) + else if (cli_transform_config_def.has(opt_key)) m_transforms.emplace_back(opt_key); } From 5b01eb30047e3a67896ee02bd7dd6fc606a8dc40 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 15 Mar 2019 09:13:15 +0100 Subject: [PATCH 147/236] 2nd fix for x position of gizmos' imgui dialogs --- src/slic3r/GUI/GLCanvas3D.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8178c9cf6..33f460802 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3039,6 +3039,7 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; float height = get_total_overlay_height(); + float width = get_total_overlay_width(); #if ENABLE_SVG_ICONS float scaled_border = m_overlay_border * m_overlay_scale * inv_zoom; #else @@ -3050,7 +3051,7 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan float left = top_x; float top = top_y; - float right = left + get_total_overlay_width() * inv_zoom; + float right = left + width * inv_zoom; float bottom = top - height * inv_zoom; // renders background @@ -3158,24 +3159,24 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan #if ENABLE_SVG_ICONS float u_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_width; float v_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_height; - float top = sprite_id * v_icon_size; - float left = state * u_icon_size; - float bottom = top + v_icon_size; - float right = left + u_icon_size; + float v_top = sprite_id * v_icon_size; + float u_left = state * u_icon_size; + float v_bottom = v_top + v_icon_size; + float u_right = u_left + u_icon_size; #else float uv_icon_size = (float)m_icons_texture.metadata.icon_size * inv_texture_size; - float top = sprite_id * uv_icon_size; - float left = state * uv_icon_size; - float bottom = top + uv_icon_size; - float right = left + uv_icon_size; + float v_top = sprite_id * uv_icon_size; + float u_left = state * uv_icon_size; + float v_bottom = v_top + uv_icon_size; + float u_right = u_left + uv_icon_size; #endif // ENABLE_SVG_ICONS - GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { left, bottom }, { right, bottom }, { right, top }, { left, top } }); + GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); #if ENABLE_IMGUI if (it->second->get_state() == GLGizmoBase::On) { float toolbar_top = (float)cnv_h - canvas.m_view_toolbar.get_height(); #if ENABLE_SVG_ICONS - it->second->render_input_window(2.0f * m_overlay_border + m_overlay_icons_size, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); + it->second->render_input_window(width, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); #else it->second->render_input_window(2.0f * m_overlay_border + icon_size * zoom, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); #endif // ENABLE_SVG_ICONS From dd309c9dfc69af15344a8607cdb93e5e927dfe1c Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 15 Mar 2019 10:05:14 +0100 Subject: [PATCH 148/236] GLGizmoBase::picking_color_component modified to return all the three components of the picking color --- src/slic3r/GUI/GLGizmo.cpp | 34 ++++++++++++++++++++++------------ src/slic3r/GUI/GLGizmo.hpp | 2 +- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index a87cb68fb..e8e48b63c 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -244,13 +244,21 @@ void GLGizmoBase::update(const UpdateData& data, const GLCanvas3D::Selection& se on_update(data, selection); } -float GLGizmoBase::picking_color_component(unsigned int id) const +std::array GLGizmoBase::picking_color_component(unsigned int id) const { - int color = 254 - (int)id; - if (m_group_id > -1) - color -= m_group_id; + // Starting value for id to avoid clashing with id used by GLVolumes + static const unsigned int BASE = 254 * 255 * 255; + static const float INV_255 = 1.0f / 255.0f; - return (float)color / 255.0f; + id = BASE - id; + + std::array color; + + color[0] = (float)((id >> 16) & 0xff) * INV_255; // red + color[1] = (float)((id >> 8) & 0xff) * INV_255; // green + color[2] = (float)(id & 0xff) * INV_255; // blue + + return color; } void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const @@ -281,9 +289,10 @@ void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const { if (m_grabbers[i].enabled) { - m_grabbers[i].color[0] = 1.0f; - m_grabbers[i].color[1] = 1.0f; - m_grabbers[i].color[2] = picking_color_component(i); + std::array color = picking_color_component(i); + m_grabbers[i].color[0] = color[0]; + m_grabbers[i].color[1] = color[1]; + m_grabbers[i].color[2] = color[2]; m_grabbers[i].render_for_picking(size); } } @@ -1478,7 +1487,7 @@ void GLGizmoFlatten::on_render_for_picking(const GLCanvas3D::Selection& selectio const_cast(this)->update_planes(); for (int i = 0; i < (int)m_planes.size(); ++i) { - ::glColor3f(1.0f, 1.0f, picking_color_component(i)); + ::glColor3fv(picking_color_component(i).data()); ::glBegin(GL_POLYGON); for (const Vec3d& vertex : m_planes[i].vertices) { @@ -1878,9 +1887,10 @@ void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, b // First decide about the color of the point. if (picking) { - render_color[0] = 1.0f; - render_color[1] = 1.0f; - render_color[2] = picking_color_component(i); + std::array color = picking_color_component(i); + render_color[0] = color[0]; + render_color[1] = color[1]; + render_color[2] = color[2]; } else { if ((m_hover_id == i && m_editing_mode)) { // ignore hover state unless editing mode is active diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp index a872a161e..83a062a2c 100644 --- a/src/slic3r/GUI/GLGizmo.hpp +++ b/src/slic3r/GUI/GLGizmo.hpp @@ -175,7 +175,7 @@ protected: virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) {} #endif // ENABLE_IMGUI - float picking_color_component(unsigned int id) const; + std::array picking_color_component(unsigned int id) const; void render_grabbers(const BoundingBoxf3& box) const; void render_grabbers(float size) const; void render_grabbers_for_picking(const BoundingBoxf3& box) const; From 32c9e8b168277e0d916c2f1eb1b69d1dc0c34139 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 15 Mar 2019 10:15:23 +0100 Subject: [PATCH 149/236] A small fix of the gizmo grabbers picking --- src/slic3r/GUI/GLGizmo.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index e8e48b63c..359deed3a 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -252,13 +252,12 @@ std::array GLGizmoBase::picking_color_component(unsigned int id) const id = BASE - id; - std::array color; + if (m_group_id > -1) + id -= m_group_id; - color[0] = (float)((id >> 16) & 0xff) * INV_255; // red - color[1] = (float)((id >> 8) & 0xff) * INV_255; // green - color[2] = (float)(id & 0xff) * INV_255; // blue - - return color; + return std::array { (float)((id >> 16) & 0xff) * INV_255, // red + (float)((id >> 8) & 0xff) * INV_255, // green + (float)(id & 0xff) * INV_255}; // blue } void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const From ef939905b198460dc1e8c8ab0661dbf2518ff4c4 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 15 Mar 2019 11:04:08 +0100 Subject: [PATCH 150/236] Another fix of the gizmo grabber color picking --- src/slic3r/GUI/GLCanvas3D.cpp | 3 +-- src/slic3r/GUI/GLGizmo.cpp | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 33f460802..3100a024b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6286,7 +6286,6 @@ void GLCanvas3D::_picking_pass() const ::glReadPixels(pos(0), cnv_size.get_height() - pos(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color); volume_id = color[0] + color[1] * 256 + color[2] * 256 * 256; } - if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size())) { m_hover_volume_id = volume_id; @@ -6295,7 +6294,7 @@ void GLCanvas3D::_picking_pass() const else { m_hover_volume_id = -1; - m_gizmos.set_hover_id(inside ? (254 - (int)color[2]) : -1); + m_gizmos.set_hover_id(inside && volume_id <= 254 * 255 * 255 ? (254 * 255 * 255 - volume_id) : -1); } _update_volumes_hover_state(); diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 359deed3a..19d50e2e0 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -255,9 +255,9 @@ std::array GLGizmoBase::picking_color_component(unsigned int id) const if (m_group_id > -1) id -= m_group_id; - return std::array { (float)((id >> 16) & 0xff) * INV_255, // red + return std::array { (float)((id >> 0) & 0xff) * INV_255, // red (float)((id >> 8) & 0xff) * INV_255, // green - (float)(id & 0xff) * INV_255}; // blue + (float)((id >> 16)& 0xff) * INV_255}; // blue } void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const From bc3036d777fb6ca7c937c28d8aa9b9131a376c20 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 15 Mar 2019 12:07:25 +0100 Subject: [PATCH 151/236] Follow-up to previous commits on gizmo grabbers picking (use of centralized static constant for ids and added comments) --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- src/slic3r/GUI/GLGizmo.cpp | 7 +++---- src/slic3r/GUI/GLGizmo.hpp | 7 +++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 3100a024b..dac370b54 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6294,7 +6294,7 @@ void GLCanvas3D::_picking_pass() const else { m_hover_volume_id = -1; - m_gizmos.set_hover_id(inside && volume_id <= 254 * 255 * 255 ? (254 * 255 * 255 - volume_id) : -1); + m_gizmos.set_hover_id(inside && volume_id <= GLGizmoBase::BASE_ID ? (GLGizmoBase::BASE_ID - volume_id) : -1); } _update_volumes_hover_state(); diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 19d50e2e0..6ab2f46ab 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -246,18 +246,17 @@ void GLGizmoBase::update(const UpdateData& data, const GLCanvas3D::Selection& se std::array GLGizmoBase::picking_color_component(unsigned int id) const { - // Starting value for id to avoid clashing with id used by GLVolumes - static const unsigned int BASE = 254 * 255 * 255; static const float INV_255 = 1.0f / 255.0f; - id = BASE - id; + id = BASE_ID - id; if (m_group_id > -1) id -= m_group_id; + // color components are encoded to match the calculation of volume_id made into GLCanvas3D::_picking_pass() return std::array { (float)((id >> 0) & 0xff) * INV_255, // red (float)((id >> 8) & 0xff) * INV_255, // green - (float)((id >> 16)& 0xff) * INV_255}; // blue + (float)((id >> 16) & 0xff) * INV_255 }; // blue } void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp index 83a062a2c..4e44da540 100644 --- a/src/slic3r/GUI/GLGizmo.hpp +++ b/src/slic3r/GUI/GLGizmo.hpp @@ -35,6 +35,11 @@ class ImGuiWrapper; class GLGizmoBase { +public: + // Starting value for ids to avoid clashing with ids used by GLVolumes + // (254 is choosen to leave some space for forward compatibility) + static const unsigned int BASE_ID = 255 * 255 * 254; + protected: struct Grabber { @@ -175,6 +180,8 @@ protected: virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) {} #endif // ENABLE_IMGUI + // Returns the picking color for the given id, based on the BASE_ID constant + // No check is made for clashing with other picking color (i.e. GLVolumes) std::array picking_color_component(unsigned int id) const; void render_grabbers(const BoundingBoxf3& box) const; void render_grabbers(float size) const; From 6548a6d525108ae1c694239ba0bbce83eb97cc19 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 15 Mar 2019 14:21:32 +0100 Subject: [PATCH 152/236] Fixed preset selection after ConfigWizard running --- src/slic3r/GUI/GUI.cpp | 3 --- src/slic3r/GUI/Preset.cpp | 4 +++- src/slic3r/GUI/Tab.cpp | 24 +++++++++++++++++++++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 11e94f2ca..4a3ccc356 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -148,9 +148,6 @@ void config_wizard(int reason) _(L("Please check and fix your object list.")), _(L("Attention!"))); } - - // Load the currently selected preset into the GUI, update the preset selection box. - // wxGetApp().load_current_presets(); // #ys_FIXME_to_delete presets are loaded now in select_preset function } // opt_index = 0, by the reason of zero-index in ConfigOptionVector by default (in case only one element) diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 86fdde44b..bb70b8f47 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -952,7 +952,9 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) ui->SetToolTip(ui->GetString(selected_preset_item)); ui->Thaw(); - ui->selected_preset_name = this->get_selected_preset().name; + // For printer preset it's important to update preset list every time because of ConfigWizard + // So, don't save selected preset name + ui->selected_preset_name = type()==Preset::TYPE_PRINTER ? "" : this->get_selected_preset().name; } size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index ae33443c3..b23becaae 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2594,7 +2594,7 @@ void Tab::select_preset(std::string preset_name) } else { if (current_dirty) m_presets->discard_current_changes(); - m_presets->select_preset_by_name(preset_name, false); + const bool is_selected = m_presets->select_preset_by_name(preset_name, false); // Mark the print & filament enabled if they are compatible with the currently selected preset. // The following method should not discard changes of current print or filament presets on change of a printer profile, // if they are compatible with the current printer. @@ -2603,6 +2603,28 @@ void Tab::select_preset(std::string preset_name) // Initialize the UI from the current preset. if (printer_tab) static_cast(this)->update_pages(); + + if (!is_selected && printer_tab) + { + /* There is a case, when : + * after Config Wizard applying we try to select previously selected preset, but + * in a current configuration this one: + * 1. doesn't exist now, + * 2. have another printer_technology + * So, it is necessary to update list of dependent tabs + * to the corresponding printer_technology + */ + const PrinterTechnology printer_technology = m_presets->get_edited_preset().printer_technology(); + if (printer_technology == ptFFF && m_dependent_tabs.front() != Preset::Type::TYPE_PRINT || + printer_technology == ptSLA && m_dependent_tabs.front() != Preset::Type::TYPE_SLA_PRINT ) + { + m_dependent_tabs.clear(); + if (printer_technology == ptFFF) + m_dependent_tabs = { Preset::Type::TYPE_PRINT, Preset::Type::TYPE_FILAMENT }; + else + m_dependent_tabs = { Preset::Type::TYPE_SLA_PRINT, Preset::Type::TYPE_SLA_MATERIAL }; + } + } load_current_preset(); } } From fdf59f756c5767d536f17fa7c6799687a6345220 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 15 Mar 2019 15:30:20 +0100 Subject: [PATCH 153/236] Fixing memory corruption from invalidated references --- src/libslic3r/SLA/SLASupportTree.cpp | 63 +++++++++++++++------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 9f2575036..437f07fcb 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -716,7 +716,7 @@ public: assert(it != m_heads.end()); const Head& h = it->second; assert(h.pillar_id >= 0 && h.pillar_id < long(m_pillars.size())); - return m_pillars[size_t(h.pillar_id)]; + return pillar(h.pillar_id); } template const Junction& add_junction(Args&&... args) { @@ -755,6 +755,10 @@ public: return m_compact_bridges; } + template inline + typename std::enable_if::value, const Pillar&>::type + pillar(T id) const { assert(id >= 0); return m_pillars.at(size_t(id)); } + const Pad& create_pad(const TriangleMesh& object_supports, const ExPolygons& baseplate, const PoolConfig& cfg) { @@ -1242,12 +1246,14 @@ class SLASupportTree::Algorithm { } // For connecting a head to a nearby pillar. - bool connect_to_nearpillar(const Head& head, const Pillar& nearpillar) { - if(nearpillar.bridges > m_cfg.max_bridges_on_pillar) return false; + bool connect_to_nearpillar(const Head& head, long nearpillar_id) { + + auto nearpillar = [this, nearpillar_id]() { return m_result.pillar(nearpillar_id); }; + if(nearpillar().bridges > m_cfg.max_bridges_on_pillar) return false; Vec3d headjp = head.junction_point(); - Vec3d nearjp_u = nearpillar.startpoint(); - Vec3d nearjp_l = nearpillar.endpoint(); + Vec3d nearjp_u = nearpillar().startpoint(); + Vec3d nearjp_l = nearpillar().endpoint(); double r = head.r_back_mm; double d2d = distance(to_2d(headjp), to_2d(nearjp_u)); @@ -1308,7 +1314,7 @@ class SLASupportTree::Algorithm { } m_result.add_bridge(bridgestart, bridgeend, r); - m_result.increment_bridges(nearpillar); + m_result.increment_bridges(nearpillar()); return true; } @@ -1336,8 +1342,7 @@ class SLASupportTree::Algorithm { if(nearest_id >= 0) { auto nearpillarID = unsigned(nearest_id); if(nearpillarID < m_result.pillars().size()) { - const Pillar& nearpillar = m_result.pillars()[nearpillarID]; - if(!connect_to_nearpillar(head, nearpillar)) { + if(!connect_to_nearpillar(head, nearpillarID)) { nearest_id = -1; // continue searching spindex.remove(ne); // without the current pillar } @@ -1649,7 +1654,7 @@ public: // central position where the pillar can be placed. this way // the weight is distributed more effectively on the pillar. - const Pillar& centerpillar = m_result.head_pillar(cidx); + auto centerpillarID = m_result.head_pillar(cidx).id; for(auto c : cl) { m_thr(); if(c == cidx) continue; @@ -1657,7 +1662,7 @@ public: auto& sidehead = m_result.head(c); sidehead.transform(); - if(!connect_to_nearpillar(sidehead, centerpillar) && + if(!connect_to_nearpillar(sidehead, centerpillarID) && !search_pillar_and_connect(sidehead)) { Vec3d pstart = sidehead.junction_point(); @@ -1859,7 +1864,7 @@ public: } for(auto pillid : modelpillars) { - auto& pillar = m_result.pillars()[pillid]; + auto& pillar = m_result.pillar(pillid); m_pillar_index.insert(pillar.endpoint(), pillid); } } @@ -1886,7 +1891,7 @@ public: { Vec3d qp = el.first; - const Pillar& pillar = m_result.pillars()[el.second]; + const Pillar& pillar = m_result.pillar(el.second); unsigned neighbors = m_cfg.pillar_cascade_neighbors; @@ -1946,15 +1951,15 @@ public: size_t pillarcount = m_result.pillars().size(); for(size_t pid = 0; pid < pillarcount; pid++) { - const Pillar& pillar = m_result.pillars()[pid]; + auto pillar = [this, pid]() { return m_result.pillar(pid); }; unsigned needpillars = 0; - if(pillar.bridges > m_cfg.max_bridges_on_pillar) needpillars = 3; - else if(pillar.links < 2 && pillar.height > H2) { + if(pillar().bridges > m_cfg.max_bridges_on_pillar) needpillars = 3; + else if(pillar().links < 2 && pillar().height > H2) { // Not enough neighbors to support this pillar - needpillars = 2 - pillar.links; + needpillars = 2 - pillar().links; } - else if(pillar.links < 1 && pillar.height > H1) { + else if(pillar().links < 1 && pillar().height > H1) { // No neighbors could be found and the pillar is too long. needpillars = 1; } @@ -1963,7 +1968,7 @@ public: bool found = false; double alpha = 0; // goes to 2Pi double r = 2 * m_cfg.base_radius_mm; - Vec3d pillarsp = pillar.startpoint(); + Vec3d pillarsp = pillar().startpoint(); Vec3d sp(pillarsp(X), pillarsp(Y), pillarsp(Z) - r); std::vector tv(needpillars, false); std::vector spts(needpillars); @@ -1976,7 +1981,7 @@ public: s(X) += std::cos(a) * r; s(Y) += std::sin(a) * r; spts[n] = s; - auto hr = bridge_mesh_intersect(s, {0, 0, -1}, pillar.r); + auto hr = bridge_mesh_intersect(s, {0, 0, -1}, pillar().r); tv[n] = std::isinf(hr.distance()); } @@ -1991,33 +1996,33 @@ public: if(found) for(unsigned n = 0; n < needpillars; n++) { Vec3d s = spts[n]; double gnd = m_result.ground_level; - Pillar p(s, Vec3d(s(X), s(Y), gnd), pillar.r); + Pillar p(s, Vec3d(s(X), s(Y), gnd), pillar().r); p.add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm); - if(interconnect(pillar, p)) { + if(interconnect(pillar(), p)) { Pillar& pp = m_result.add_pillar(p); m_pillar_index.insert(pp.endpoint(), unsigned(pp.id)); - m_result.add_junction(s, pillar.r); + m_result.add_junction(s, pillar().r); double t = bridge_mesh_intersect(pillarsp, dirv(pillarsp, s), - pillar.r); + pillar().r); if(distance(pillarsp, s) < t) - m_result.add_bridge(pillarsp, s, pillar.r); + m_result.add_bridge(pillarsp, s, pillar().r); - if(pillar.endpoint()(Z) > m_result.ground_level) - m_result.add_junction(pillar.endpoint(), pillar.r); + if(pillar().endpoint()(Z) > m_result.ground_level) + m_result.add_junction(pillar().endpoint(), pillar().r); newpills.emplace_back(pp.id); - m_result.increment_links(pillar); + m_result.increment_links(pillar()); } } if(!newpills.empty()) { for(auto it = newpills.begin(), nx = std::next(it); nx != newpills.end(); ++it, ++nx) { - const Pillar& itpll = m_result.pillars()[size_t(*it)]; - const Pillar& nxpll = m_result.pillars()[size_t(*nx)]; + const Pillar& itpll = m_result.pillar(*it); + const Pillar& nxpll = m_result.pillar(*nx); if(interconnect(itpll, nxpll)) { m_result.increment_links(itpll); m_result.increment_links(nxpll); From 5f81328aa4967e140c817295d475fccf07ccfca7 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 15 Mar 2019 18:40:49 +0100 Subject: [PATCH 154/236] Fixed a case when the SLA gizmo did not calculate igl mesh and aabb tree even though it should --- src/slic3r/GUI/GLGizmo.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 6ab2f46ab..34d0c746a 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -1954,7 +1954,8 @@ void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, b bool GLGizmoSlaSupports::is_mesh_update_necessary() const { - return (m_state == On) && (m_model_object != m_old_model_object) && (m_model_object != nullptr) && !m_model_object->instances.empty(); + return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) + && ((m_model_object != m_old_model_object) || m_V.size()==0); //if (m_state != On || !m_model_object || m_model_object->instances.empty() || ! m_instance_matrix.isApprox(m_source_data.matrix)) // return false; From 954d571ab0a713d3df5fdcf97a9a9cc0e06fa471 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 16 Mar 2019 17:12:51 +0100 Subject: [PATCH 155/236] Bumped up version number to 1.42.0-beta changed the config path from Slic3rPE-alpha to Slic3rPE-beta --- src/slic3r/GUI/GUI_App.cpp | 2 +- version.inc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7d448fbe4..1cf2ca17c 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -95,7 +95,7 @@ bool GUI_App::OnInit() wxCHECK_MSG(m_imgui->init(), false, "Failed to initialize ImGui"); #endif // ENABLE_IMGUI - SetAppName("Slic3rPE-alpha"); + SetAppName("Slic3rPE-beta"); SetAppDisplayName("Slic3r Prusa Edition"); // Slic3r::debugf "wxWidgets version %s, Wx version %s\n", wxVERSION_STRING, wxVERSION; diff --git a/version.inc b/version.inc index 0e84a48a2..18ac508b2 100644 --- a/version.inc +++ b/version.inc @@ -2,7 +2,7 @@ # (the version numbers are generated by the build script from the git current label) set(SLIC3R_FORK_NAME "Slic3r Prusa Edition") -set(SLIC3R_VERSION "1.42.0-alpha7") +set(SLIC3R_VERSION "1.42.0-beta") set(SLIC3R_BUILD "${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_BUILD_ID "${SLIC3R_BUILD_ID}") set(SLIC3R_RC_VERSION "1,42,0,0") From e3153fc8fe4657ea978b8cd5daa481b0a745bc50 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 16 Mar 2019 19:13:30 +0100 Subject: [PATCH 156/236] Updated Prusa3D print profiles --- resources/profiles/PrusaResearch.idx | 15 +- resources/profiles/PrusaResearch.ini | 501 +++++++++++++++++++++------ 2 files changed, 414 insertions(+), 102 deletions(-) diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 407883544..a6f9deb28 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,14 +1,22 @@ min_slic3r_version = 1.42.0-alpha6 -0.8.0-alpha7 -0.8.0-alpha6 +0.8.0-beta Updated SLA profiles +0.8.0-alpha9 Updated SLA and FFF profiles +0.8.0-alpha8 Updated SLA profiles +0.8.0-alpha7 Updated SLA profiles +0.8.0-alpha6 Updated SLA profiles min_slic3r_version = 1.42.0-alpha -0.8.0-alpha +0.8.0-alpha Updated SLA profiles 0.4.0-alpha4 Updated SLA profiles 0.4.0-alpha3 Update of SLA profiles 0.4.0-alpha2 First SLA profiles min_slic3r_version = 1.41.3-alpha +0.4.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.3 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.2 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt +0.4.1 New MK2.5S and MK3S FW versions 0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt min_slic3r_version = 1.41.1 +0.3.5 New MK2.5 and MK3 FW versions 0.3.4 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt 0.3.3 Prusament PETG released 0.3.2 New MK2.5 and MK3 FW versions @@ -41,6 +49,7 @@ min_slic3r_version = 1.41.0-alpha 0.2.0-alpha1 added initial profiles for the i3 MK3 Multi Material Upgrade 2.0 0.2.0-alpha moved machine limits from the start G-code to the new print profile parameters min_slic3r_version = 1.40.0 +0.1.13 New MK2.5 and MK3 FW versions 0.1.12 New MK2.5 and MK3 FW versions 0.1.11 fw version changed to 3.3.1 0.1.10 MK3 jerk and acceleration update diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index a471700fb..35916377b 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,7 +5,7 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the Slic3r configuration to be downgraded. -config_version = 0.8.0-alpha7 +config_version = 0.8.0-beta # Where to get the updates from? config_update_url = https://raw.githubusercontent.com/prusa3d/Slic3r-settings/master/live/PrusaResearch/ @@ -190,6 +190,14 @@ travel_speed = 180 wipe_tower_x = 170 wipe_tower_y = 125 +[print:*MK306*] +fill_pattern = gyroid +fill_density = 15% +single_extruder_multi_material_priming = 0 +travel_speed = 180 +wipe_tower_x = 170 +wipe_tower_y = 125 + # Print parameters common to a 0.25mm diameter nozzle. [print:*0.25nozzle*] external_perimeter_extrusion_width = 0.25 @@ -205,6 +213,38 @@ support_material_interface_spacing = 0.15 support_material_spacing = 1 support_material_xy_spacing = 150% +[print:*0.25nozzleMK3*] +external_perimeter_extrusion_width = 0.25 +extrusion_width = 0.25 +first_layer_extrusion_width = 0.35 +infill_extrusion_width = 0.25 +perimeter_extrusion_width = 0.25 +solid_infill_extrusion_width = 0.25 +top_infill_extrusion_width = 0.25 +support_material_extrusion_width = 0.2 +support_material_interface_layers = 0 +support_material_interface_spacing = 0.15 +support_material_spacing = 1 +support_material_xy_spacing = 150% +perimeter_speed = 30 +external_perimeter_speed = 20 +small_perimeter_speed = 20 +infill_speed = 45 +solid_infill_speed = 45 +top_solid_infill_speed = 30 +support_material_speed = 40 +bridge_speed = 20 +gap_fill_speed = 30 +perimeter_acceleration = 500 +infill_acceleration = 1000 +bridge_acceleration = 500 +first_layer_acceleration = 500 +default_acceleration = 1000 +max_print_speed = 80 +perimeters = 3 +fill_pattern = grid +fill_density = 20% + # Print parameters common to a 0.6mm diameter nozzle. [print:*0.6nozzle*] external_perimeter_extrusion_width = 0.61 @@ -216,6 +256,18 @@ solid_infill_extrusion_width = 0.65 top_infill_extrusion_width = 0.6 support_material_extrusion_width = 0.55 +[print:*0.6nozzleMK3*] +external_perimeter_extrusion_width = 0.65 +extrusion_width = 0.65 +first_layer_extrusion_width = 0.65 +infill_extrusion_width = 0.7 +perimeter_extrusion_width = 0.65 +solid_infill_extrusion_width = 0.7 +top_infill_extrusion_width = 0.6 +support_material_extrusion_width = 0.55 +bridge_flow_ratio = 0.95 +bridge_speed = 25 + [print:*soluble_support*] overhangs = 1 skirts = 0 @@ -288,6 +340,9 @@ support_material_speed = 20 [print:0.05mm ULTRADETAIL 0.25 nozzle MK3] inherits = *0.05mm*; *0.25nozzle*; *MK3* compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 +fill_pattern = grid +fill_density = 20% +first_layer_extrusion_width = 0.35 # XXXXXXXXXXXXXXXXXXXX # XXX--- 0.07mm ---XXX @@ -326,6 +381,17 @@ fill_pattern = gyroid compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material top_infill_extrusion_width = 0.4 +[print:0.07mm ULTRADETAIL 0.25 nozzle MK3] +inherits = *0.07mm*; *0.25nozzle*; *MK3* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 +infill_speed = 30 +solid_infill_speed = 30 +support_material_speed = 30 +top_solid_infill_speed = 20 +fill_pattern = grid +fill_density = 20% +first_layer_extrusion_width = 0.35 + # XXXXXXXXXXXXXXXXXXXX # XXX--- 0.10mm ---XXX # XXXXXXXXXXXXXXXXXXXX @@ -382,29 +448,10 @@ top_solid_infill_speed = 30 # MK3 # [print:0.10mm DETAIL 0.25 nozzle MK3] -inherits = *0.10mm*; *0.25nozzle*; *MK3* -bridge_speed = 30 +inherits = *0.10mm*; *0.25nozzleMK3*; *MK3* compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 -external_perimeter_speed = 35 -infill_acceleration = 1250 -infill_speed = 200 -max_print_speed = 200 -perimeter_speed = 45 -solid_infill_speed = 200 -top_solid_infill_speed = 50 - -# MK3 # -[print:0.10mm DETAIL 0.6 nozzle MK3] -inherits = *0.10mm*; *0.6nozzle*; *MK3* -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 -external_perimeter_speed = 35 -infill_acceleration = 1250 -infill_speed = 200 -max_print_speed = 200 -perimeter_speed = 45 -solid_infill_speed = 200 -top_solid_infill_speed = 50 +fill_pattern = grid +fill_density = 20% # XXXXXXXXXXXXXXXXXXXX # XXX--- 0.15mm ---XXX @@ -531,17 +578,27 @@ support_material_with_sheath = 0 support_material_xy_spacing = 80% # MK3 # -[print:0.15mm OPTIMAL 0.25 nozzle MK3] -inherits = *0.15mm*; *0.25nozzle*; *MK3* -bridge_speed = 30 +[print:0.15mm QUALITY 0.25 nozzle MK3] +inherits = *0.15mm*; *0.25nozzleMK3*; *MK3* compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 +fill_pattern = grid +fill_density = 20% + +# MK3 # +[print:0.15mm DETAIL 0.6 nozzle MK3] +inherits = *0.15mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 infill_acceleration = 1250 -infill_speed = 200 -max_print_speed = 200 +infill_speed = 70 +max_print_speed = 100 perimeter_speed = 45 -solid_infill_speed = 200 -top_solid_infill_speed = 50 +solid_infill_speed = 70 +top_solid_infill_speed = 45 + +# XXXXXXXXXXXXXXXXXXXX +# XXX--- 0.20mm ---XXX +# XXXXXXXXXXXXXXXXXXXX [print:*0.20mm*] inherits = *common* @@ -557,23 +614,6 @@ solid_infill_speed = 50 top_infill_extrusion_width = 0.4 top_solid_layers = 5 -# MK3 # -[print:0.15mm OPTIMAL 0.6 nozzle MK3] -inherits = *0.15mm*; *0.6nozzle*; *MK3* -bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 -external_perimeter_speed = 35 -infill_acceleration = 1250 -infill_speed = 200 -max_print_speed = 200 -perimeter_speed = 45 -solid_infill_speed = 200 -top_solid_infill_speed = 50 - -# XXXXXXXXXXXXXXXXXXXX -# XXX--- 0.20mm ---XXX -# XXXXXXXXXXXXXXXXXXXX - # MK2 # [print:0.20mm 100mms Linear Advance] inherits = *0.20mm* @@ -664,17 +704,68 @@ support_material_with_sheath = 0 support_material_xy_spacing = 80% # MK3 # -[print:0.20mm FAST 0.6 nozzle MK3] -inherits = *0.20mm*; *0.6nozzle*; *MK3* -bridge_speed = 30 +[print:0.20mm DETAIL 0.6 nozzle MK3] +inherits = *0.20mm*; *0.6nozzleMK3*; *MK306* compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 infill_acceleration = 1250 -infill_speed = 200 -max_print_speed = 200 +infill_speed = 70 +max_print_speed = 100 perimeter_speed = 45 -solid_infill_speed = 200 -top_solid_infill_speed = 50 +solid_infill_speed = 70 +top_solid_infill_speed = 45 + +# XXXXXXXXXXXXXXXXXXXX +# XXX--- 0.30mm ---XXX +# XXXXXXXXXXXXXXXXXXXX + +[print:*0.30mm*] +inherits = *common* +bottom_solid_layers = 4 +bridge_flow_ratio = 0.95 +external_perimeter_speed = 40 +infill_acceleration = 2000 +infill_speed = 60 +layer_height = 0.3 +perimeter_acceleration = 800 +perimeter_speed = 50 +solid_infill_speed = 50 +top_infill_extrusion_width = 0.4 +top_solid_layers = 4 + +[print:0.30mm QUALITY 0.6 nozzle MK3] +inherits = *0.30mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +infill_acceleration = 1250 +infill_speed = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 + +[print:0.30mm DRAFT MK3] +inherits = *0.30mm*; *MK3* +bottom_solid_layers = 3 +bridge_speed = 30 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 +external_perimeter_speed = 35 +infill_acceleration = 1250 +infill_speed = 85 +max_print_speed = 200 +perimeter_speed = 50 +small_perimeter_speed = 30 +solid_infill_speed = 80 +top_solid_infill_speed = 40 +support_material_speed = 45 +external_perimeter_extrusion_width = 0.6 +extrusion_width = 0.5 +first_layer_extrusion_width = 0.42 +infill_extrusion_width = 0.5 +perimeter_extrusion_width = 0.5 +solid_infill_extrusion_width = 0.5 +top_infill_extrusion_width = 0.45 +support_material_extrusion_width = 0.35 # XXXXXXXXXXXXXXXXXXXX # XXX--- 0.35mm ---XXX @@ -732,6 +823,57 @@ support_material_interface_layers = 2 support_material_with_sheath = 0 support_material_xy_spacing = 150% +# MK3 # +[print:0.35mm SPEED 0.6 nozzle MK3] +inherits = *0.35mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +infill_acceleration = 1250 +infill_speed = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +external_perimeter_extrusion_width = 0.68 +perimeter_extrusion_width = 0.68 + +# XXXXXXXXXXXXXXXXXXXX +# XXX--- 0.40mm ---XXX +# XXXXXXXXXXXXXXXXXXXX + +[print:*0.40mm*] +inherits = *common* +bottom_solid_layers = 3 +external_perimeter_extrusion_width = 0.6 +external_perimeter_speed = 40 +first_layer_extrusion_width = 0.65 +infill_acceleration = 2000 +infill_speed = 60 +layer_height = 0.4 +perimeter_acceleration = 800 +perimeter_extrusion_width = 0.65 +perimeter_speed = 50 +solid_infill_extrusion_width = 0.65 +solid_infill_speed = 60 +top_solid_infill_speed = 40 +top_solid_layers = 4 + +# MK3 # +[print:0.40mm DRAFT 0.6 nozzle MK3] +inherits = *0.40mm*; *0.6nozzleMK3*; *MK306* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 +external_perimeter_speed = 35 +infill_acceleration = 1250 +infill_speed = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +external_perimeter_extrusion_width = 0.7 +perimeter_extrusion_width = 0.7 +infill_extrusion_width = 0.72 +solid_infill_extrusion_width = 0.72 + # XXXXXXXXXXXXXXXXXXXXXX # XXX----- MK2.5 ----XXX # XXXXXXXXXXXXXXXXXXXXXX @@ -827,7 +969,7 @@ filament_settings_id = "" filament_soluble = 0 min_print_speed = 15 slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif} ; Filament gcode" [filament:*PLA*] inherits = *common* @@ -844,6 +986,7 @@ first_layer_temperature = 215 max_fan_speed = 100 min_fan_speed = 100 temperature = 210 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}15{else}30{endif} ; Filament gcode" [filament:*PET*] inherits = *common* @@ -859,9 +1002,14 @@ first_layer_bed_temperature = 85 first_layer_temperature = 230 max_fan_speed = 50 min_fan_speed = 30 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}22{else}45{endif} ; Filament gcode" temperature = 240 +[filament:*PET06*] +inherits = *PET* +compatible_printers_condition = nozzle_diameter[0]==0.6 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) +filament_max_volumetric_speed = 15 + [filament:*ABS*] inherits = *common* bed_temperature = 110 @@ -879,6 +1027,7 @@ first_layer_temperature = 255 max_fan_speed = 30 min_fan_speed = 20 temperature = 255 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}15{else}30{endif} ; Filament gcode" [filament:*FLEX*] inherits = *common* @@ -906,10 +1055,11 @@ inherits = *PLA* # For now, all but selected filaments are disabled for the MMU 2.0 compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 -filament_cost = 80.65 -filament_density = 4 +filament_cost = 56.64 +filament_density = 3.9 filament_colour = #804040 -filament_max_volumetric_speed = 10 +filament_max_volumetric_speed = 9 +filament_notes = "List of materials tested with standard print settings:\n\nColorFabb bronzeFill\nColorFabb brassFill\nColorFabb steelFill\nColorFabb copperFill" [filament:ColorFabb HT] inherits = *PET* @@ -933,19 +1083,31 @@ inherits = *PLA* filament_cost = 55.5 filament_density = 1.24 -[filament:ColorFabb Woodfil] +[filament:ColorFabb woodFill] inherits = *PLA* # For now, all but selected filaments are disabled for the MMU 2.0 compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 filament_cost = 62.9 filament_density = 1.15 -filament_colour = #804040 +filament_colour = #dfc287 filament_max_volumetric_speed = 10 first_layer_temperature = 200 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" temperature = 200 +[filament:ColorFabb corkFill] +inherits = *PLA* +compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) +extrusion_multiplier = 1.2 +filament_cost = 45.45 +filament_density = 1.18 +filament_colour = #634d33 +filament_max_volumetric_speed = 6 +first_layer_temperature = 220 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" +temperature = 220 + [filament:ColorFabb XT] inherits = *PET* filament_type = PET @@ -1001,7 +1163,7 @@ temperature = 260 inherits = *PET* filament_cost = 56.9 filament_density = 1.26 -filament_notes = "List of manufacturers tested with standart PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" +filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" [filament:E3D PC-ABS] inherits = *ABS* @@ -1036,7 +1198,7 @@ max_fan_speed = 50 min_fan_speed = 50 temperature = 275 -[filament:Fillamentum Timberfil] +[filament:Fillamentum Timberfill] inherits = *PLA* # For now, all but selected filaments are disabled for the MMU 2.0 compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) @@ -1053,19 +1215,19 @@ temperature = 190 inherits = *ABS* filament_cost = 27.82 filament_density = 1.04 -filament_notes = "List of materials tested with standart ABS print settings:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladec ABS" +filament_notes = "List of materials tested with standard ABS print settings:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladec ABS" [filament:Generic PET] inherits = *PET* filament_cost = 27.82 filament_density = 1.27 -filament_notes = "List of manufacturers tested with standart PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" +filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" [filament:Generic PLA] inherits = *PLA* filament_cost = 25.4 filament_density = 1.24 -filament_notes = "List of materials tested with standart PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" +filament_notes = "List of materials tested with standard PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" [filament:Polymaker PC-Max] inherits = *ABS* @@ -1084,11 +1246,11 @@ filament_density = 1.23 cooling = 0 fan_always_on = 0 filament_colour = #FFFFD7 -filament_max_volumetric_speed = 10 -filament_notes = "List of materials tested with standart PVA print settings:\n\nPrimaSelect PVA+\nICE FILAMENTS PVA 'NAUGHTY NATURAL'\nVerbatim BVOH" +filament_max_volumetric_speed = 4 +filament_notes = "List of materials tested with standard PVA print settings:\n\nPrimaSelect PVA+\nICE FILAMENTS PVA 'NAUGHTY NATURAL'" filament_ramming_parameters = "120 100 8.3871 8.6129 8.93548 9.22581 9.48387 9.70968 9.87097 10.0323 10.2258 10.4194 10.6452 10.8065| 0.05 8.34193 0.45 8.73548 0.95 9.34836 1.45 9.78385 1.95 10.0871 2.45 10.5161 2.95 10.8903 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" filament_soluble = 1 -filament_type = PVA +filament_type = PLA first_layer_temperature = 195 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" temperature = 195 @@ -1097,7 +1259,7 @@ temperature = 195 inherits = *ABS* filament_cost = 27.82 filament_density = 1.08 -filament_notes = "List of materials tested with standart ABS print settings:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladec ABS" +filament_notes = "List of materials tested with standard ABS print settings:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladec ABS" [filament:*ABS MMU2*] inherits = Prusa ABS @@ -1140,7 +1302,8 @@ temperature = 220 inherits = *PET* filament_cost = 27.82 filament_density = 1.27 -filament_notes = "List of manufacturers tested with standart PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" +filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" +compatible_printers_condition = nozzle_diameter[0]!=0.6 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) [filament:Prusament PETG] inherits = *PET* @@ -1148,6 +1311,20 @@ first_layer_temperature = 240 temperature = 250 filament_cost = 24.99 filament_density = 1.27 +compatible_printers_condition = nozzle_diameter[0]!=0.6 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:Prusa PET 0.6 nozzle] +inherits = *PET06* +filament_cost = 27.82 +filament_density = 1.27 +filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" + +[filament:Prusament PETG 0.6 nozzle] +inherits = *PET06* +first_layer_temperature = 240 +temperature = 250 +filament_cost = 24.99 +filament_density = 1.27 [filament:*PET MMU2*] inherits = Prusa PET @@ -1179,7 +1356,7 @@ inherits = *PET MMU2* inherits = *PLA* filament_cost = 25.4 filament_density = 1.24 -filament_notes = "List of materials tested with standart PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" +filament_notes = "List of materials tested with standard PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" [filament:Prusament PLA] inherits = *PLA* @@ -1265,7 +1442,7 @@ fan_always_on = 0 fan_below_layer_time = 100 filament_colour = #FFFFD7 filament_max_volumetric_speed = 4 -filament_notes = "List of materials tested with standart PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" +filament_notes = "List of materials tested with standard PVA print settings:\n\nVerbatim BVOH" filament_soluble = 1 filament_type = PLA first_layer_bed_temperature = 60 @@ -1279,7 +1456,6 @@ temperature = 210 inherits = Verbatim BVOH compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material temperature = 195 -filament_notes = BVOH fan_always_on = 1 first_layer_temperature = 200 filament_cooling_final_speed = 1 @@ -1316,7 +1492,7 @@ filament_loading_speed = 14 filament_loading_speed_start = 19 filament_max_volumetric_speed = 4 filament_minimal_purge_on_wipe_tower = 5 -filament_notes = PVA +filament_notes = "List of materials tested with standard PVA print settings:\n\nPrimaSelect PVA+" filament_ramming_parameters = "120 110 3.83871 3.90323 3.96774 4.03226 4.09677 4.19355 4.3871 4.83871 5.67742 6.93548 8.54839 10.3226 11.9677 13.2581 14.129 14.5806| 0.05 3.8258 0.45 3.89676 0.95 4.05807 1.45 4.23548 1.95 5.18386 2.45 7.80651 2.95 11.5356 3.45 13.9872 3.95 14.7613 4.45 7.6 4.95 7.6" filament_soluble = 1 filament_toolchange_delay = 0 @@ -1346,7 +1522,7 @@ fan_always_on = 1 fan_below_layer_time = 100 filament_colour = #DEE0E6 filament_max_volumetric_speed = 5 -filament_notes = "List of materials tested with standart PLA print settings:\n\nEsun PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nEUMAKERS PLA" +filament_notes = "List of materials tested with standard PLA print settings:\n\nEsun PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nEUMAKERS PLA" filament_type = PLA first_layer_bed_temperature = 100 first_layer_temperature = 220 @@ -1358,14 +1534,15 @@ temperature = 220 [sla_print:*common*] compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_SL1.*/ layer_height = 0.05 -output_filename_format = [input_filename_base].dwz +output_filename_format = [input_filename_base].sl1 pad_edge_radius = 0.5 pad_enable = 1 pad_max_merge_distance = 50 -pad_wall_height = 3 +pad_wall_height = 0 pad_wall_thickness = 1 +pad_wall_slope = 90 support_base_diameter = 3 -support_base_height = 0.5 +support_base_height = 1 support_critical_angle = 45 support_density_at_45 = 250 support_density_at_horizontal = 500 @@ -1376,6 +1553,7 @@ support_max_bridge_length = 10 support_minimal_z = 0 support_object_elevation = 5 support_pillar_diameter = 1 +support_pillar_connection_mode = zigzag support_pillar_widening_factor = 0 supports_enable = 1 @@ -1441,6 +1619,11 @@ inherits = *common 0.025* exposure_time = 5 initial_exposure_time = 35 +[sla_material:SL1 Orange solid 0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 35 + ########### Materials 0.05 [sla_material:3DM-HTR140 (high temperature) 0.05] @@ -1458,11 +1641,31 @@ inherits = *common 0.05* exposure_time = 8 initial_exposure_time = 45 +[sla_material:Bluecast Keramaster Dental 0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 45 + +[sla_material:Bluecast LCD-DLP Original 0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 60 + [sla_material:Bluecast Phrozen Wax 0.05] inherits = *common 0.05* exposure_time = 10 initial_exposure_time = 55 +[sla_material:Bluecast S+ 0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 45 + +[sla_material:Bluecast X2 0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 60 + [sla_material:Jamg He PJHC-00 Yellow 0.05] inherits = *common 0.05* exposure_time = 7 @@ -1475,7 +1678,7 @@ initial_exposure_time = 45 [sla_material:Jamg He PJHC-30 Orange 0.05] inherits = *common 0.05* -exposure_time = 7 +exposure_time = 7.5 initial_exposure_time = 45 [sla_material:Jamg He PJHC-60 Gray 0.05] @@ -1513,8 +1716,6 @@ inherits = *common 0.05* exposure_time = 7 initial_exposure_time = 40 -# v2 - [sla_material:3DM-ABS 0.05] inherits = *common 0.05* exposure_time = 9 @@ -1560,11 +1761,101 @@ inherits = *common 0.05* exposure_time = 6.5 initial_exposure_time = 40 +[sla_material:Harz Labs Model Resin Cherry 0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 45 + +[sla_material:Jamg He CRX-70C High Tenacity Black 0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 40 + +[sla_material:Jamg He MC-2000 Casting Green 0.05] +inherits = *common 0.05* +exposure_time = 13 +initial_exposure_time = 40 + +[sla_material:Jamg He PJHC-00 Solid Yellow 0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 40 + +[sla_material:Jamg He PJHC-20 White 0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 45 + +[sla_material:Jamg He PJHC-80 Transparent Green 0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 45 + +[sla_material:Jamg He PJHC-80 Transparent Red 0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 45 + +[sla_material:Jamg He PJHC-81 Solid Maroon 0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 45 + +[sla_material:Jamg He PJHC-90 Solid Pink 0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 40 + +[sla_material:Jamg He RJHC-00 Yellow Flexible 0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 40 + +[sla_material:Jamg He RJHC-10 Clear Flexible 0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 40 + +[sla_material:Jamg He RJHC-20 White Flexible 0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 40 + +[sla_material:Jamg He RJHC-50 Blue Flexible 0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 40 + +[sla_material:Jamg He RJHC-70 Black Flexible 0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 40 + +[sla_material:Jamg He RJHC-81 Red Flexible 0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 40 + +[sla_material:SL1 Orange solid 0.05] +inherits = *common 0.05* +exposure_time = 7.5 +initial_exposure_time = 45 + +[sla_material:SL1 Red transparent 0.05] +inherits = *common 0.05* +exposure_time = 7.5 +initial_exposure_time = 45 + ########### Materials 0.035 [sla_material:Jamg He PJHC-30 Orange 0.035] inherits = *common 0.035* -exposure_time = 9 +exposure_time = 6 +initial_exposure_time = 35 + +[sla_material:SL1 Orange solid 0.035] +inherits = *common 0.035* +exposure_time = 6 initial_exposure_time = 35 ########### Materials 0.1 @@ -1574,6 +1865,11 @@ inherits = *common 0.1* exposure_time = 10 initial_exposure_time = 45 +[sla_material:SL1 Orange solid 0.1] +inherits = *common 0.1* +exposure_time = 10 +initial_exposure_time = 45 + [printer:*common*] printer_technology = FFF bed_shape = 0x0,250x0,250x210,0x210 @@ -1740,19 +2036,19 @@ min_layer_height = 0.1 inherits = Original Prusa i3 MK2S printer_model = MK2.5 remaining_times = 1 -start_gcode = M115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 0.25 nozzle] inherits = Original Prusa i3 MK2S 0.25 nozzle printer_model = MK2.5 remaining_times = 1 -start_gcode = M115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 0.6 nozzle] inherits = Original Prusa i3 MK2S 0.6 nozzle printer_model = MK2.5 remaining_times = 1 -start_gcode = M115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 MMU2 Single] inherits = Original Prusa i3 MK2.5; *mm2* @@ -1781,7 +2077,7 @@ machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL MK2.5 default_filament_profile = Prusament PLA printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2.5\n -start_gcode = M107\nM115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n +start_gcode = M107\nM115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors [printer:Original Prusa i3 MK2.5 MMU2] @@ -1815,20 +2111,23 @@ single_extruder_multi_material = 1 # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M107\nM115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n +start_gcode = M107\nM115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200; home X axis\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S] inherits = Original Prusa i3 MK2.5 printer_model = MK2.5S +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.25 nozzle] inherits = Original Prusa i3 MK2.5 0.25 nozzle printer_model = MK2.5S +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.6 nozzle] inherits = Original Prusa i3 MK2.5 0.6 nozzle printer_model = MK2.5S +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S MMU2S Single] inherits = Original Prusa i3 MK2.5; *mm2s* @@ -1857,7 +2156,7 @@ machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL MK2.5 default_filament_profile = Prusament PLA printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2.5\n -start_gcode = M107\nM115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n +start_gcode = M107\nM115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors [printer:Original Prusa i3 MK2.5S MMU2S] @@ -1891,7 +2190,7 @@ single_extruder_multi_material = 1 # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M107\nM115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n +start_gcode = M107\nM115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200; home X axis\nM84 ; disable motors\n @@ -1923,7 +2222,7 @@ remaining_times = 1 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 max_print_height = 210 -start_gcode = M115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} printer_model = MK3 default_print_profile = 0.15mm QUALITY MK3 @@ -1933,27 +2232,31 @@ nozzle_diameter = 0.25 max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} default_print_profile = 0.10mm DETAIL 0.25 nozzle MK3 [printer:Original Prusa i3 MK3 0.6 nozzle] inherits = Original Prusa i3 MK3 nozzle_diameter = 0.6 -max_layer_height = 0.35 -min_layer_height = 0.1 +max_layer_height = 0.40 +min_layer_height = 0.15 printer_variant = 0.6 -default_print_profile = 0.15mm OPTIMAL 0.6 nozzle MK3 +default_print_profile = 0.30mm QUALITY 0.6 nozzle MK3 [printer:Original Prusa i3 MK3S] inherits = Original Prusa i3 MK3 printer_model = MK3S +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} [printer:Original Prusa i3 MK3S 0.25 nozzle] inherits = Original Prusa i3 MK3 0.25 nozzle printer_model = MK3S +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} [printer:Original Prusa i3 MK3S 0.6 nozzle] inherits = Original Prusa i3 MK3 0.6 nozzle printer_model = MK3S +start_gcode = M115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} [printer:*mm2*] inherits = Original Prusa i3 MK3 @@ -1983,7 +2286,7 @@ default_filament_profile = Prusament PLA MMU2 inherits = *mm2* single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M107\nM115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n +start_gcode = M107\nM115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors [printer:Original Prusa i3 MK3 MMU2] @@ -1994,14 +2297,14 @@ inherits = *mm2* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M107\nM115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n +start_gcode = M107\nM115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200; home X axis\nM84 ; disable motors\n [printer:Original Prusa i3 MK3S MMU2S Single] inherits = *mm2s* single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M107\nM115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n +start_gcode = M107\nM115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200; home X axis\nM84 ; disable motors [printer:Original Prusa i3 MK3S MMU2S] @@ -2009,14 +2312,14 @@ inherits = *mm2s* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M107\nM115 U3.5.1 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n +start_gcode = M107\nM115 U3.6.0 ; tell printer latest fw version\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG92 E0.0\n end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200; home X axis\nM84 ; disable motors\n [printer:Original Prusa SL1] printer_technology = SLA printer_model = SL1 printer_variant = default -default_sla_material_profile = Jamg He Transparent Green 0.05 +default_sla_material_profile = Jamg He PJHC-30 Orange 0.05 default_sla_print_profile = 0.05 Normal bed_shape = 0.98x1.02,119.98x1.02,119.98x68.02,0.98x68.02 display_height = 68.04 From e74bde858a9ccfbdd85966383487f29d02910bcc Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sat, 16 Mar 2019 22:23:51 +0100 Subject: [PATCH 157/236] Deleted imaginary optimization for the Preset comboboxes on sidebar. --- src/slic3r/GUI/Plater.hpp | 2 -- src/slic3r/GUI/Preset.cpp | 7 +------ src/slic3r/GUI/PresetBundle.cpp | 5 +---- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 4261dbae2..ecce63805 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -51,8 +51,6 @@ public: int get_extruder_idx() const { return extruder_idx; } void check_selection(); - std::string selected_preset_name; - private: typedef std::size_t Marker; enum { LABEL_ITEM_MARKER = 0x4d }; diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index bb70b8f47..656658b0b 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -879,8 +879,7 @@ size_t PresetCollection::update_compatible_internal(const Preset &active_printer // Hide the void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) { - if (ui == nullptr || - ui->selected_preset_name == this->get_selected_preset().name) + if (ui == nullptr) return; // Otherwise fill in the list from scratch. @@ -951,10 +950,6 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); ui->Thaw(); - - // For printer preset it's important to update preset list every time because of ConfigWizard - // So, don't save selected preset name - ui->selected_preset_name = type()==Preset::TYPE_PRINTER ? "" : this->get_selected_preset().name; } size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible) diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 52421fafa..f0bb4de01 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1436,8 +1436,7 @@ bool PresetBundle::parse_color(const std::string &scolor, unsigned char *rgb_out void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui) { if (ui == nullptr || this->printers.get_edited_preset().printer_technology() == ptSLA || - this->filament_presets.size() <= idx_extruder || - ui->selected_preset_name == this->filaments.find_preset(this->filament_presets[idx_extruder])->name) + this->filament_presets.size() <= idx_extruder ) return; unsigned char rgb[3]; @@ -1526,8 +1525,6 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); ui->Thaw(); - - ui->selected_preset_name = this->filaments.find_preset(this->filament_presets[idx_extruder])->name; } void PresetBundle::set_default_suppressed(bool default_suppressed) From 9eea1561b372b00b7a200e03d1d25c5d6bdb64b8 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 17 Mar 2019 09:32:53 +0100 Subject: [PATCH 158/236] fix of problems with Cyrillic in the snapshot (if the name of the Russian letters) #1956 --- src/slic3r/GUI/ConfigSnapshotDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.cpp b/src/slic3r/GUI/ConfigSnapshotDialog.cpp index 422f683b3..205e84f57 100644 --- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp +++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp @@ -38,7 +38,7 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve text += wxString("") + (snapshot_active ? _(L("Active: ")) : "") + Utils::format_local_date_time(snapshot.time_captured) + ": " + format_reason(snapshot.reason); if (! snapshot.comment.empty()) - text += " (" + snapshot.comment + ")"; + text += " (" + wxString::FromUTF8(snapshot.comment.data()) + ")"; text += "
"; // End of row header. text += _(L("slic3r version")) + ": " + snapshot.slic3r_version_captured.to_string() + "
"; From 2bb4b4e691ac3372e19ee829a0bf46510b0a31d4 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 17 Mar 2019 14:35:54 +0100 Subject: [PATCH 159/236] Command line - improved error handling --- src/libslic3r/Config.cpp | 16 ++++++++-------- src/slic3r.cpp | 4 +++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 037bd3500..91e74a032 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -713,11 +713,8 @@ bool DynamicConfig::read_cli(int argc, char** argv, t_config_option_keys* extra, // Look for the cli -> option mapping. const auto it = opts.find(token); if (it == opts.end()) { - printf("Warning: unknown option --%s\n", token.c_str()); - // instead of continuing, return false to caller - // to stop execution and print usage - return false; - //continue; + boost::nowide::cerr << "Unknown option --" << token.c_str() << std::endl; + return false; } const t_config_option_key opt_key = it->second; const ConfigOptionDef &optdef = this->def()->options.at(opt_key); @@ -725,8 +722,8 @@ bool DynamicConfig::read_cli(int argc, char** argv, t_config_option_keys* extra, // look for it in the next token. if (optdef.type != coBool && optdef.type != coBools && value.empty()) { if (i == (argc-1)) { - printf("No value supplied for --%s\n", token.c_str()); - continue; + boost::nowide::cerr << "No value supplied for --" << token.c_str() << std::endl; + return false; } value = argv[++ i]; } @@ -759,7 +756,10 @@ bool DynamicConfig::read_cli(int argc, char** argv, t_config_option_keys* extra, static_cast(opt_base)->value = value; } else { // Any scalar value of a type different from Bool and String. - this->set_deserialize(opt_key, value, false); + if (! this->set_deserialize(opt_key, value, false)) { + boost::nowide::cerr << "Invalid value supplied for --" << token.c_str() << std::endl; + return false; + } } } return true; diff --git a/src/slic3r.cpp b/src/slic3r.cpp index b60c5b1dd..3b301ec2a 100644 --- a/src/slic3r.cpp +++ b/src/slic3r.cpp @@ -523,6 +523,8 @@ bool CLI::setup(int argc, char **argv) // If any option is unsupported, print usage and abort immediately. t_config_option_keys opt_order; if (! m_config.read_cli(argc, argv, &m_input_files, &opt_order)) { + // Separate error message reported by the CLI parser from the help. + boost::nowide::cerr << std::endl; this->print_help(); return false; } @@ -615,7 +617,7 @@ std::string CLI::output_filepath(const Model &model, IO::ExportFormat format) co }; auto proposed_path = boost::filesystem::path(model.propose_export_file_name_and_path(ext)); // use --output when available - std::string cmdline_param = m_config.opt_string("output", false); + std::string cmdline_param = m_config.opt_string("output"); if (! cmdline_param.empty()) { // if we were supplied a directory, use it and append our automatically generated filename boost::filesystem::path cmdline_path(cmdline_param); From 5fc37238e08b34f79437d090f92c8dc2c0ce696f Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 17 Mar 2019 15:04:34 +0100 Subject: [PATCH 160/236] Fixed missing include on OSX --- src/libslic3r/Config.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 91e74a032..a7db29b8e 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include From 902bcf7f710cb689cbe6d3cc2c193b37b2d28bbb Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 18 Mar 2019 09:42:34 +0100 Subject: [PATCH 161/236] Fix of #1978 --- src/libslic3r/GCode/Analyzer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp index f1f828776..d1ad4f575 100644 --- a/src/libslic3r/GCode/Analyzer.cpp +++ b/src/libslic3r/GCode/Analyzer.cpp @@ -726,7 +726,7 @@ void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& previ GCodePreviewData::Range volumetric_rate_range; // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)extrude_moves->second.size() / 25; + unsigned int cancel_callback_threshold = (unsigned int)std::max((int)extrude_moves->second.size() / 25, 1); unsigned int cancel_callback_curr = 0; // constructs the polylines while traversing the moves @@ -807,7 +807,7 @@ void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data, s GCodePreviewData::Range feedrate_range; // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)travel_moves->second.size() / 25; + unsigned int cancel_callback_threshold = (unsigned int)std::max((int)travel_moves->second.size() / 25, 1); unsigned int cancel_callback_curr = 0; // constructs the polylines while traversing the moves @@ -864,7 +864,7 @@ void GCodeAnalyzer::_calc_gcode_preview_retractions(GCodePreviewData& preview_da return; // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)retraction_moves->second.size() / 25; + unsigned int cancel_callback_threshold = (unsigned int)std::max((int)retraction_moves->second.size() / 25, 1); unsigned int cancel_callback_curr = 0; for (const GCodeMove& move : retraction_moves->second) @@ -886,7 +886,7 @@ void GCodeAnalyzer::_calc_gcode_preview_unretractions(GCodePreviewData& preview_ return; // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)unretraction_moves->second.size() / 25; + unsigned int cancel_callback_threshold = (unsigned int)std::max((int)unretraction_moves->second.size() / 25, 1); unsigned int cancel_callback_curr = 0; for (const GCodeMove& move : unretraction_moves->second) From 710bb66dfc39dad6e13a45329bce4de7acf18c7d Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 18 Mar 2019 10:10:11 +0100 Subject: [PATCH 162/236] Fixed assert in imgui when starting Slic3r for the 1st time (no config data saved on disk) --- src/slic3r/GUI/GLCanvas3D.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index dac370b54..94d26fea6 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4159,8 +4159,11 @@ void GLCanvas3D::render() return; if (m_bed.get_shape().empty()) + { // this happens at startup when no data is still saved under <>\AppData\Roaming\Slic3rPE post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE)); + return; + } if (m_camera.requires_zoom_to_bed) { From fe91edc5216175f8becfeb68552865fcaa3d6ad2 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 18 Mar 2019 10:18:24 +0100 Subject: [PATCH 163/236] Set MinSize() in respect to em_unit --- src/slic3r/GUI/MainFrame.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 1d1982ffa..9e54b9b36 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -56,7 +56,8 @@ wxFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAUL // initialize default width_unit according to the width of the one symbol ("x") of the current system font const wxSize size = GetTextExtent("m"); - wxGetApp().set_em_unit(size.x-1); +// wxGetApp().set_em_unit(size.x-1); + wxGetApp().set_em_unit(std::max(10, size.x - 1)); // initialize tabpanel and menubar init_tabpanel(); @@ -76,12 +77,14 @@ wxFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAUL sizer->SetSizeHints(this); SetSizer(sizer); Fit(); + + const wxSize min_size = wxSize(76*wxGetApp().em_unit(), 49*wxGetApp().em_unit()); #ifdef __APPLE__ // Using SetMinSize() on Mac messes up the window position in some cases // cf. https://groups.google.com/forum/#!topic/wx-users/yUKPBBfXWO0 - SetSize(wxSize(760, 490)); + SetSize(min_size/*wxSize(760, 490)*/); #else - SetMinSize(wxSize(760, 490)); + SetMinSize(min_size/*wxSize(760, 490)*/); SetSize(GetMinSize()); #endif Layout(); From feb2041c7b8fce8fd5a73eef1548f3361029d159 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 18 Mar 2019 10:47:01 +0100 Subject: [PATCH 164/236] Context menu in 3D scene shown on right mouse up event --- src/slic3r/GUI/GLCanvas3D.cpp | 67 ++++++++++++++++------------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 94d26fea6..dff68d21d 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5264,42 +5264,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_moving = true; } } - else if (evt.RightDown()) - { - m_mouse.position = pos.cast(); - // forces a frame render to ensure that m_hover_volume_id is updated even when the user right clicks while - // the context menu is already shown - render(); - if (m_hover_volume_id != -1) - { - // if right clicking on volume, propagate event through callback (shows context menu) - if (m_volumes.volumes[m_hover_volume_id]->hover - && !m_volumes.volumes[m_hover_volume_id]->is_wipe_tower // no context menu for the wipe tower - && m_gizmos.get_current_type() != Gizmos::SlaSupports) // disable context menu when the gizmo is open - { - // forces the selection of the volume - /** #ys_FIXME_to_delete after testing: - * Next condition allows a multiple instance selection for the context menu, - * which has no reason. So it's commented till next testing - */ -// if (!m_selection.is_multiple_full_instance()) // #ys_FIXME_to_delete - m_selection.add(m_hover_volume_id); - m_gizmos.update_on_off_state(m_selection); - post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); - _update_gizmos_data(); - wxGetApp().obj_manipul()->update_settings_value(m_selection); - // forces a frame render to update the view before the context menu is shown - render(); - - Vec2d logical_pos = pos.cast(); -#if ENABLE_RETINA_GL - const float factor = m_retina_helper->get_scale_factor(); - logical_pos = logical_pos.cwiseQuotient(Vec2d(factor, factor)); -#endif // ENABLE_RETINA_GL - post_event(Vec2dEvent(EVT_GLCANVAS_RIGHT_CLICK, logical_pos)); - } - } - } } } } @@ -5521,6 +5485,37 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); m_camera.set_scene_box(scene_bounding_box()); } + else if (evt.RightUp()) + { + m_mouse.position = pos.cast(); + // forces a frame render to ensure that m_hover_volume_id is updated even when the user right clicks while + // the context menu is already shown + render(); + if (m_hover_volume_id != -1) + { + // if right clicking on volume, propagate event through callback (shows context menu) + if (m_volumes.volumes[m_hover_volume_id]->hover + && !m_volumes.volumes[m_hover_volume_id]->is_wipe_tower // no context menu for the wipe tower + && m_gizmos.get_current_type() != Gizmos::SlaSupports) // disable context menu when the gizmo is open + { + // forces the selection of the volume + m_selection.add(m_hover_volume_id); + m_gizmos.update_on_off_state(m_selection); + post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT)); + _update_gizmos_data(); + wxGetApp().obj_manipul()->update_settings_value(m_selection); + // forces a frame render to update the view before the context menu is shown + render(); + + Vec2d logical_pos = pos.cast(); +#if ENABLE_RETINA_GL + const float factor = m_retina_helper->get_scale_factor(); + logical_pos = logical_pos.cwiseQuotient(Vec2d(factor, factor)); +#endif // ENABLE_RETINA_GL + post_event(Vec2dEvent(EVT_GLCANVAS_RIGHT_CLICK, logical_pos)); + } + } + } m_moving = false; m_mouse.drag.move_volume_idx = -1; From 0d9a74bb6d9406e438308a801a231c4699a6c8bf Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 18 Mar 2019 10:48:23 +0100 Subject: [PATCH 165/236] Fix for ugly code. --- src/libslic3r/SLA/SLASupportTree.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 437f07fcb..a5fcaf3f3 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -755,9 +755,12 @@ public: return m_compact_bridges; } - template inline - typename std::enable_if::value, const Pillar&>::type - pillar(T id) const { assert(id >= 0); return m_pillars.at(size_t(id)); } + template inline const Pillar& pillar(T id) const { + static_assert(std::is_integral::value, "Invalid index type"); + assert(id >= 0 && id < m_pillars.size() && + id < std::numerix_limits::max()); + return m_pillars[size_t(id)]; + } const Pad& create_pad(const TriangleMesh& object_supports, const ExPolygons& baseplate, From 160d708ecdaccd3e5097672a4f1b42083e378f7c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 18 Mar 2019 11:27:27 +0100 Subject: [PATCH 166/236] Typo fix.... sorry guys --- src/libslic3r/SLA/SLASupportTree.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index a5fcaf3f3..650dfe2e7 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -758,7 +758,7 @@ public: template inline const Pillar& pillar(T id) const { static_assert(std::is_integral::value, "Invalid index type"); assert(id >= 0 && id < m_pillars.size() && - id < std::numerix_limits::max()); + id < std::numeric_limits::max()); return m_pillars[size_t(id)]; } From d3c8e3166eea156bb9049269a7100ec1d8346e39 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 15 Mar 2019 12:53:15 +0100 Subject: [PATCH 167/236] Separated gizmos into individual files --- src/slic3r/CMakeLists.txt | 16 +- src/slic3r/GUI/GLCanvas3D.cpp | 5 +- src/slic3r/GUI/GLGizmo.cpp | 2908 ------------------ src/slic3r/GUI/GLGizmo.hpp | 647 ---- src/slic3r/GUI/GLTexture.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 286 ++ src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 196 ++ src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 288 ++ src/slic3r/GUI/Gizmos/GLGizmoCut.hpp | 68 + src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 357 +++ src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp | 67 + src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 257 ++ src/slic3r/GUI/Gizmos/GLGizmoMove.hpp | 60 + src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 505 +++ src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 144 + src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 364 +++ src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 65 + src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 912 ++++++ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 137 + src/slic3r/GUI/Gizmos/GLGizmos.hpp | 11 + 20 files changed, 3734 insertions(+), 3560 deletions(-) delete mode 100644 src/slic3r/GUI/GLGizmo.cpp delete mode 100644 src/slic3r/GUI/GLGizmo.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoBase.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoBase.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoCut.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoMove.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoMove.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoScale.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoScale.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmos.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index e4a8c9678..219f17082 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -28,8 +28,20 @@ set(SLIC3R_GUI_SOURCES GUI/GLCanvas3D.cpp GUI/GLCanvas3DManager.hpp GUI/GLCanvas3DManager.cpp - GUI/GLGizmo.hpp - GUI/GLGizmo.cpp + GUI/Gizmos/GLGizmoBase.cpp + GUI/Gizmos/GLGizmoBase.hpp + GUI/Gizmos/GLGizmoMove.cpp + GUI/Gizmos/GLGizmoMove.hpp + GUI/Gizmos/GLGizmoRotate.cpp + GUI/Gizmos/GLGizmoRotate.hpp + GUI/Gizmos/GLGizmoScale.cpp + GUI/Gizmos/GLGizmoScale.hpp + GUI/Gizmos/GLGizmoSlaSupports.cpp + GUI/Gizmos/GLGizmoSlaSupports.hpp + GUI/Gizmos/GLGizmoFlatten.cpp + GUI/Gizmos/GLGizmoFlatten.hpp + GUI/Gizmos/GLGizmoCut.cpp + GUI/Gizmos/GLGizmoCut.hpp GUI/GLTexture.hpp GUI/GLTexture.cpp GUI/GLToolbar.hpp diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index dff68d21d..902c68b59 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1,4 +1,4 @@ -#include "slic3r/GUI/GLGizmo.hpp" +#include "slic3r/GUI/Gizmos/GLGizmos.hpp" #include "GLCanvas3D.hpp" #include "admesh/stl.h" @@ -16,7 +16,6 @@ #include "slic3r/GUI/GLShader.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/PresetBundle.hpp" -//#include "slic3r/GUI/GLGizmo.hpp" #include "GUI_App.hpp" #include "GUI_ObjectList.hpp" #include "GUI_ObjectManipulation.hpp" @@ -78,7 +77,7 @@ static const float DEFAULT_BG_LIGHT_COLOR[3] = { 0.753f, 0.753f, 0.753f }; static const float ERROR_BG_DARK_COLOR[3] = { 0.478f, 0.192f, 0.039f }; static const float ERROR_BG_LIGHT_COLOR[3] = { 0.753f, 0.192f, 0.039f }; static const float UNIFORM_SCALE_COLOR[3] = { 1.0f, 0.38f, 0.0f }; -static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } }; +//static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } }; namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp deleted file mode 100644 index 34d0c746a..000000000 --- a/src/slic3r/GUI/GLGizmo.cpp +++ /dev/null @@ -1,2908 +0,0 @@ -// Include GLGizmo.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. -#include "GLGizmo.hpp" - -#include -#include - -#include "libslic3r/libslic3r.h" -#include "libslic3r/Geometry.hpp" -#include "libslic3r/Utils.hpp" -#include "libslic3r/SLA/SLACommon.hpp" -#include "libslic3r/SLAPrint.hpp" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "Tab.hpp" -#include "GUI.hpp" -#include "GUI_Utils.hpp" -#include "GUI_App.hpp" -#include "GUI_ObjectSettings.hpp" -#include "GUI_ObjectList.hpp" -#include "I18N.hpp" -#include "PresetBundle.hpp" - -#include - -// TODO: Display tooltips quicker on Linux - -static const float DEFAULT_BASE_COLOR[3] = { 0.625f, 0.625f, 0.625f }; -static const float DEFAULT_DRAG_COLOR[3] = { 1.0f, 1.0f, 1.0f }; -static const float DEFAULT_HIGHLIGHT_COLOR[3] = { 1.0f, 0.38f, 0.0f }; - -static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } }; - -namespace Slic3r { -namespace GUI { - -const float GLGizmoBase::Grabber::SizeFactor = 0.025f; -const float GLGizmoBase::Grabber::MinHalfSize = 1.5f; -const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f; - -GLGizmoBase::Grabber::Grabber() - : center(Vec3d::Zero()) - , angles(Vec3d::Zero()) - , dragging(false) - , enabled(true) -{ - color[0] = 1.0f; - color[1] = 1.0f; - color[2] = 1.0f; -} - -void GLGizmoBase::Grabber::render(bool hover, float size) const -{ - float render_color[3]; - if (hover) - { - render_color[0] = 1.0f - color[0]; - render_color[1] = 1.0f - color[1]; - render_color[2] = 1.0f - color[2]; - } - else - ::memcpy((void*)render_color, (const void*)color, 3 * sizeof(float)); - - render(size, render_color, true); -} - -float GLGizmoBase::Grabber::get_half_size(float size) const -{ - return std::max(size * SizeFactor, MinHalfSize); -} - -float GLGizmoBase::Grabber::get_dragging_half_size(float size) const -{ - return std::max(size * SizeFactor * DraggingScaleFactor, MinHalfSize); -} - -void GLGizmoBase::Grabber::render(float size, const float* render_color, bool use_lighting) const -{ - float half_size = dragging ? get_dragging_half_size(size) : get_half_size(size); - - if (use_lighting) - ::glEnable(GL_LIGHTING); - - ::glColor3fv(render_color); - - ::glPushMatrix(); - ::glTranslated(center(0), center(1), center(2)); - - ::glRotated(Geometry::rad2deg(angles(2)), 0.0, 0.0, 1.0); - ::glRotated(Geometry::rad2deg(angles(1)), 0.0, 1.0, 0.0); - ::glRotated(Geometry::rad2deg(angles(0)), 1.0, 0.0, 0.0); - - // face min x - ::glPushMatrix(); - ::glTranslatef(-(GLfloat)half_size, 0.0f, 0.0f); - ::glRotatef(-90.0f, 0.0f, 1.0f, 0.0f); - render_face(half_size); - ::glPopMatrix(); - - // face max x - ::glPushMatrix(); - ::glTranslatef((GLfloat)half_size, 0.0f, 0.0f); - ::glRotatef(90.0f, 0.0f, 1.0f, 0.0f); - render_face(half_size); - ::glPopMatrix(); - - // face min y - ::glPushMatrix(); - ::glTranslatef(0.0f, -(GLfloat)half_size, 0.0f); - ::glRotatef(90.0f, 1.0f, 0.0f, 0.0f); - render_face(half_size); - ::glPopMatrix(); - - // face max y - ::glPushMatrix(); - ::glTranslatef(0.0f, (GLfloat)half_size, 0.0f); - ::glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); - render_face(half_size); - ::glPopMatrix(); - - // face min z - ::glPushMatrix(); - ::glTranslatef(0.0f, 0.0f, -(GLfloat)half_size); - ::glRotatef(180.0f, 1.0f, 0.0f, 0.0f); - render_face(half_size); - ::glPopMatrix(); - - // face max z - ::glPushMatrix(); - ::glTranslatef(0.0f, 0.0f, (GLfloat)half_size); - render_face(half_size); - ::glPopMatrix(); - - ::glPopMatrix(); - - if (use_lighting) - ::glDisable(GL_LIGHTING); -} - -void GLGizmoBase::Grabber::render_face(float half_size) const -{ - ::glBegin(GL_TRIANGLES); - ::glNormal3f(0.0f, 0.0f, 1.0f); - ::glVertex3f(-(GLfloat)half_size, -(GLfloat)half_size, 0.0f); - ::glVertex3f((GLfloat)half_size, -(GLfloat)half_size, 0.0f); - ::glVertex3f((GLfloat)half_size, (GLfloat)half_size, 0.0f); - ::glVertex3f((GLfloat)half_size, (GLfloat)half_size, 0.0f); - ::glVertex3f(-(GLfloat)half_size, (GLfloat)half_size, 0.0f); - ::glVertex3f(-(GLfloat)half_size, -(GLfloat)half_size, 0.0f); - ::glEnd(); -} - -#if ENABLE_SVG_ICONS -GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) -#else -GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id) -#endif // ENABLE_SVG_ICONS - : m_parent(parent) - , m_group_id(-1) - , m_state(Off) - , m_shortcut_key(0) -#if ENABLE_SVG_ICONS - , m_icon_filename(icon_filename) -#endif // ENABLE_SVG_ICONS - , m_sprite_id(sprite_id) - , m_hover_id(-1) - , m_dragging(false) -#if ENABLE_IMGUI - , m_imgui(wxGetApp().imgui()) -#endif // ENABLE_IMGUI -{ - ::memcpy((void*)m_base_color, (const void*)DEFAULT_BASE_COLOR, 3 * sizeof(float)); - ::memcpy((void*)m_drag_color, (const void*)DEFAULT_DRAG_COLOR, 3 * sizeof(float)); - ::memcpy((void*)m_highlight_color, (const void*)DEFAULT_HIGHLIGHT_COLOR, 3 * sizeof(float)); -} - -void GLGizmoBase::set_hover_id(int id) -{ - if (m_grabbers.empty() || (id < (int)m_grabbers.size())) - { - m_hover_id = id; - on_set_hover_id(); - } -} - -void GLGizmoBase::set_highlight_color(const float* color) -{ - if (color != nullptr) - ::memcpy((void*)m_highlight_color, (const void*)color, 3 * sizeof(float)); -} - -void GLGizmoBase::enable_grabber(unsigned int id) -{ - if ((0 <= id) && (id < (unsigned int)m_grabbers.size())) - m_grabbers[id].enabled = true; - - on_enable_grabber(id); -} - -void GLGizmoBase::disable_grabber(unsigned int id) -{ - if ((0 <= id) && (id < (unsigned int)m_grabbers.size())) - m_grabbers[id].enabled = false; - - on_disable_grabber(id); -} - -void GLGizmoBase::start_dragging(const GLCanvas3D::Selection& selection) -{ - m_dragging = true; - - for (int i = 0; i < (int)m_grabbers.size(); ++i) - { - m_grabbers[i].dragging = (m_hover_id == i); - } - - on_start_dragging(selection); -} - -void GLGizmoBase::stop_dragging() -{ - m_dragging = false; - - for (int i = 0; i < (int)m_grabbers.size(); ++i) - { - m_grabbers[i].dragging = false; - } - - on_stop_dragging(); -} - -void GLGizmoBase::update(const UpdateData& data, const GLCanvas3D::Selection& selection) -{ - if (m_hover_id != -1) - on_update(data, selection); -} - -std::array GLGizmoBase::picking_color_component(unsigned int id) const -{ - static const float INV_255 = 1.0f / 255.0f; - - id = BASE_ID - id; - - if (m_group_id > -1) - id -= m_group_id; - - // color components are encoded to match the calculation of volume_id made into GLCanvas3D::_picking_pass() - return std::array { (float)((id >> 0) & 0xff) * INV_255, // red - (float)((id >> 8) & 0xff) * INV_255, // green - (float)((id >> 16) & 0xff) * INV_255 }; // blue -} - -void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const -{ - float size = (float)box.max_size(); - - for (int i = 0; i < (int)m_grabbers.size(); ++i) - { - if (m_grabbers[i].enabled) - m_grabbers[i].render((m_hover_id == i), size); - } -} - -void GLGizmoBase::render_grabbers(float size) const -{ - for (int i = 0; i < (int)m_grabbers.size(); ++i) - { - if (m_grabbers[i].enabled) - m_grabbers[i].render((m_hover_id == i), size); - } -} - -void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const -{ - float size = (float)box.max_size(); - - for (unsigned int i = 0; i < (unsigned int)m_grabbers.size(); ++i) - { - if (m_grabbers[i].enabled) - { - std::array color = picking_color_component(i); - m_grabbers[i].color[0] = color[0]; - m_grabbers[i].color[1] = color[1]; - m_grabbers[i].color[2] = color[2]; - m_grabbers[i].render_for_picking(size); - } - } -} - -#if !ENABLE_IMGUI -void GLGizmoBase::create_external_gizmo_widgets(wxWindow *parent) {} -#endif // not ENABLE_IMGUI - -void GLGizmoBase::set_tooltip(const std::string& tooltip) const -{ - m_parent.set_tooltip(tooltip); -} - -std::string GLGizmoBase::format(float value, unsigned int decimals) const -{ - return Slic3r::string_printf("%.*f", decimals, value); -} - -const float GLGizmoRotate::Offset = 5.0f; -const unsigned int GLGizmoRotate::CircleResolution = 64; -const unsigned int GLGizmoRotate::AngleResolution = 64; -const unsigned int GLGizmoRotate::ScaleStepsCount = 72; -const float GLGizmoRotate::ScaleStepRad = 2.0f * (float)PI / GLGizmoRotate::ScaleStepsCount; -const unsigned int GLGizmoRotate::ScaleLongEvery = 2; -const float GLGizmoRotate::ScaleLongTooth = 0.1f; // in percent of radius -const unsigned int GLGizmoRotate::SnapRegionsCount = 8; -const float GLGizmoRotate::GrabberOffset = 0.15f; // in percent of radius - -GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) -#if ENABLE_SVG_ICONS - : GLGizmoBase(parent, "", -1) -#else - : GLGizmoBase(parent, -1) -#endif // ENABLE_SVG_ICONS - , m_axis(axis) - , m_angle(0.0) - , m_quadric(nullptr) - , m_center(0.0, 0.0, 0.0) - , m_radius(0.0f) - , m_snap_coarse_in_radius(0.0f) - , m_snap_coarse_out_radius(0.0f) - , m_snap_fine_in_radius(0.0f) - , m_snap_fine_out_radius(0.0f) -{ - m_quadric = ::gluNewQuadric(); - if (m_quadric != nullptr) - ::gluQuadricDrawStyle(m_quadric, GLU_FILL); -} - -GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) -#if ENABLE_SVG_ICONS - : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id) -#else - : GLGizmoBase(other.m_parent, other.m_sprite_id) -#endif // ENABLE_SVG_ICONS - , m_axis(other.m_axis) - , m_angle(other.m_angle) - , m_quadric(nullptr) - , m_center(other.m_center) - , m_radius(other.m_radius) - , m_snap_coarse_in_radius(other.m_snap_coarse_in_radius) - , m_snap_coarse_out_radius(other.m_snap_coarse_out_radius) - , m_snap_fine_in_radius(other.m_snap_fine_in_radius) - , m_snap_fine_out_radius(other.m_snap_fine_out_radius) -{ - m_quadric = ::gluNewQuadric(); - if (m_quadric != nullptr) - ::gluQuadricDrawStyle(m_quadric, GLU_FILL); -} - -GLGizmoRotate::~GLGizmoRotate() -{ - if (m_quadric != nullptr) - ::gluDeleteQuadric(m_quadric); -} - -void GLGizmoRotate::set_angle(double angle) -{ - if (std::abs(angle - 2.0 * (double)PI) < EPSILON) - angle = 0.0; - - m_angle = angle; -} - -bool GLGizmoRotate::on_init() -{ - m_grabbers.push_back(Grabber()); - return true; -} - -void GLGizmoRotate::on_start_dragging(const GLCanvas3D::Selection& selection) -{ - const BoundingBoxf3& box = selection.get_bounding_box(); - m_center = box.center(); - m_radius = Offset + box.radius(); - m_snap_coarse_in_radius = m_radius / 3.0f; - m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; - m_snap_fine_in_radius = m_radius; - m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; -} - -void GLGizmoRotate::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) -{ - Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray, selection)); - - Vec2d orig_dir = Vec2d::UnitX(); - Vec2d new_dir = mouse_pos.normalized(); - - double theta = ::acos(clamp(-1.0, 1.0, new_dir.dot(orig_dir))); - if (cross2(orig_dir, new_dir) < 0.0) - theta = 2.0 * (double)PI - theta; - - double len = mouse_pos.norm(); - - // snap to coarse snap region - if ((m_snap_coarse_in_radius <= len) && (len <= m_snap_coarse_out_radius)) - { - double step = 2.0 * (double)PI / (double)SnapRegionsCount; - theta = step * (double)std::round(theta / step); - } - else - { - // snap to fine snap region (scale) - if ((m_snap_fine_in_radius <= len) && (len <= m_snap_fine_out_radius)) - { - double step = 2.0 * (double)PI / (double)ScaleStepsCount; - theta = step * (double)std::round(theta / step); - } - } - - if (theta == 2.0 * (double)PI) - theta = 0.0; - - m_angle = theta; -} - -void GLGizmoRotate::on_render(const GLCanvas3D::Selection& selection) const -{ - if (!m_grabbers[0].enabled) - return; - - const BoundingBoxf3& box = selection.get_bounding_box(); - - std::string axis; - switch (m_axis) - { - case X: { axis = "X"; break; } - case Y: { axis = "Y"; break; } - case Z: { axis = "Z"; break; } - } - - if (!m_dragging && (m_hover_id == 0)) - set_tooltip(axis); - else if (m_dragging) - set_tooltip(axis + ": " + format((float)Geometry::rad2deg(m_angle), 4) + "\u00B0"); - else - { - m_center = box.center(); - m_radius = Offset + box.radius(); - m_snap_coarse_in_radius = m_radius / 3.0f; - m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; - m_snap_fine_in_radius = m_radius; - m_snap_fine_out_radius = m_radius * (1.0f + ScaleLongTooth); - } - - ::glEnable(GL_DEPTH_TEST); - - ::glPushMatrix(); - transform_to_local(selection); - - ::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f); - ::glColor3fv((m_hover_id != -1) ? m_drag_color : m_highlight_color); - - render_circle(); - - if (m_hover_id != -1) - { - render_scale(); - render_snap_radii(); - render_reference_radius(); - } - - ::glColor3fv(m_highlight_color); - - if (m_hover_id != -1) - render_angle(); - - render_grabber(box); - render_grabber_extension(box, false); - - ::glPopMatrix(); -} - -void GLGizmoRotate::on_render_for_picking(const GLCanvas3D::Selection& selection) const -{ - ::glDisable(GL_DEPTH_TEST); - - ::glPushMatrix(); - - transform_to_local(selection); - - const BoundingBoxf3& box = selection.get_bounding_box(); - render_grabbers_for_picking(box); - render_grabber_extension(box, true); - - ::glPopMatrix(); -} - -void GLGizmoRotate::render_circle() const -{ - ::glBegin(GL_LINE_LOOP); - for (unsigned int i = 0; i < ScaleStepsCount; ++i) - { - float angle = (float)i * ScaleStepRad; - float x = ::cos(angle) * m_radius; - float y = ::sin(angle) * m_radius; - float z = 0.0f; - ::glVertex3f((GLfloat)x, (GLfloat)y, (GLfloat)z); - } - ::glEnd(); -} - -void GLGizmoRotate::render_scale() const -{ - float out_radius_long = m_snap_fine_out_radius; - float out_radius_short = m_radius * (1.0f + 0.5f * ScaleLongTooth); - - ::glBegin(GL_LINES); - for (unsigned int i = 0; i < ScaleStepsCount; ++i) - { - float angle = (float)i * ScaleStepRad; - float cosa = ::cos(angle); - float sina = ::sin(angle); - float in_x = cosa * m_radius; - float in_y = sina * m_radius; - float in_z = 0.0f; - float out_x = (i % ScaleLongEvery == 0) ? cosa * out_radius_long : cosa * out_radius_short; - float out_y = (i % ScaleLongEvery == 0) ? sina * out_radius_long : sina * out_radius_short; - float out_z = 0.0f; - ::glVertex3f((GLfloat)in_x, (GLfloat)in_y, (GLfloat)in_z); - ::glVertex3f((GLfloat)out_x, (GLfloat)out_y, (GLfloat)out_z); - } - ::glEnd(); -} - -void GLGizmoRotate::render_snap_radii() const -{ - float step = 2.0f * (float)PI / (float)SnapRegionsCount; - - float in_radius = m_radius / 3.0f; - float out_radius = 2.0f * in_radius; - - ::glBegin(GL_LINES); - for (unsigned int i = 0; i < SnapRegionsCount; ++i) - { - float angle = (float)i * step; - float cosa = ::cos(angle); - float sina = ::sin(angle); - float in_x = cosa * in_radius; - float in_y = sina * in_radius; - float in_z = 0.0f; - float out_x = cosa * out_radius; - float out_y = sina * out_radius; - float out_z = 0.0f; - ::glVertex3f((GLfloat)in_x, (GLfloat)in_y, (GLfloat)in_z); - ::glVertex3f((GLfloat)out_x, (GLfloat)out_y, (GLfloat)out_z); - } - ::glEnd(); -} - -void GLGizmoRotate::render_reference_radius() const -{ - ::glBegin(GL_LINES); - ::glVertex3f(0.0f, 0.0f, 0.0f); - ::glVertex3f((GLfloat)(m_radius * (1.0f + GrabberOffset)), 0.0f, 0.0f); - ::glEnd(); -} - -void GLGizmoRotate::render_angle() const -{ - float step_angle = (float)m_angle / AngleResolution; - float ex_radius = m_radius * (1.0f + GrabberOffset); - - ::glBegin(GL_LINE_STRIP); - for (unsigned int i = 0; i <= AngleResolution; ++i) - { - float angle = (float)i * step_angle; - float x = ::cos(angle) * ex_radius; - float y = ::sin(angle) * ex_radius; - float z = 0.0f; - ::glVertex3f((GLfloat)x, (GLfloat)y, (GLfloat)z); - } - ::glEnd(); -} - -void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const -{ - double grabber_radius = (double)m_radius * (1.0 + (double)GrabberOffset); - m_grabbers[0].center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0); - m_grabbers[0].angles(2) = m_angle; - - ::glColor3fv((m_hover_id != -1) ? m_drag_color : m_highlight_color); - - ::glBegin(GL_LINES); - ::glVertex3f(0.0f, 0.0f, 0.0f); - ::glVertex3dv(m_grabbers[0].center.data()); - ::glEnd(); - - ::memcpy((void*)m_grabbers[0].color, (const void*)m_highlight_color, 3 * sizeof(float)); - render_grabbers(box); -} - -void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) const -{ - if (m_quadric == nullptr) - return; - - double size = m_dragging ? (double)m_grabbers[0].get_dragging_half_size((float)box.max_size()) : (double)m_grabbers[0].get_half_size((float)box.max_size()); - - float color[3]; - ::memcpy((void*)color, (const void*)m_grabbers[0].color, 3 * sizeof(float)); - if (!picking && (m_hover_id != -1)) - { - color[0] = 1.0f - color[0]; - color[1] = 1.0f - color[1]; - color[2] = 1.0f - color[2]; - } - - if (!picking) - ::glEnable(GL_LIGHTING); - - ::glColor3fv(color); - ::glPushMatrix(); - ::glTranslated(m_grabbers[0].center(0), m_grabbers[0].center(1), m_grabbers[0].center(2)); - ::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0); - ::glRotated(90.0, 1.0, 0.0, 0.0); - ::glTranslated(0.0, 0.0, 2.0 * size); - ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); - ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); - ::gluQuadricOrientation(m_quadric, GLU_INSIDE); - ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); - ::glPopMatrix(); - ::glPushMatrix(); - ::glTranslated(m_grabbers[0].center(0), m_grabbers[0].center(1), m_grabbers[0].center(2)); - ::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0); - ::glRotated(-90.0, 1.0, 0.0, 0.0); - ::glTranslated(0.0, 0.0, 2.0 * size); - ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); - ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); - ::gluQuadricOrientation(m_quadric, GLU_INSIDE); - ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); - ::glPopMatrix(); - - if (!picking) - ::glDisable(GL_LIGHTING); -} - -void GLGizmoRotate::transform_to_local(const GLCanvas3D::Selection& selection) const -{ - ::glTranslated(m_center(0), m_center(1), m_center(2)); - - if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) - { - Transform3d orient_matrix = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true); - ::glMultMatrixd(orient_matrix.data()); - } - - switch (m_axis) - { - case X: - { - ::glRotatef(90.0f, 0.0f, 1.0f, 0.0f); - ::glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); - break; - } - case Y: - { - ::glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); - ::glRotatef(-90.0f, 0.0f, 1.0f, 0.0f); - break; - } - default: - case Z: - { - // no rotation - break; - } - } -} - -Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, const GLCanvas3D::Selection& selection) const -{ - double half_pi = 0.5 * (double)PI; - - Transform3d m = Transform3d::Identity(); - - switch (m_axis) - { - case X: - { - m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitZ())); - m.rotate(Eigen::AngleAxisd(-half_pi, Vec3d::UnitY())); - break; - } - case Y: - { - m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitY())); - m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitZ())); - break; - } - default: - case Z: - { - // no rotation applied - break; - } - } - - if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) - m = m * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true).inverse(); - - m.translate(-m_center); - - return transform(mouse_ray, m).intersect_plane(0.0); -} - -#if ENABLE_SVG_ICONS -GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -#else -GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id) - : GLGizmoBase(parent, sprite_id) -#endif // ENABLE_SVG_ICONS -{ - m_gizmos.emplace_back(parent, GLGizmoRotate::X); - m_gizmos.emplace_back(parent, GLGizmoRotate::Y); - m_gizmos.emplace_back(parent, GLGizmoRotate::Z); - - for (unsigned int i = 0; i < 3; ++i) - { - m_gizmos[i].set_group_id(i); - } -} - -bool GLGizmoRotate3D::on_init() -{ - for (GLGizmoRotate& g : m_gizmos) - { - if (!g.init()) - return false; - } - - for (unsigned int i = 0; i < 3; ++i) - { - m_gizmos[i].set_highlight_color(AXES_COLOR[i]); - } - - m_shortcut_key = WXK_CONTROL_R; - - return true; -} - -std::string GLGizmoRotate3D::on_get_name() const -{ - return L("Rotate [R]"); -} - -void GLGizmoRotate3D::on_start_dragging(const GLCanvas3D::Selection& selection) -{ - if ((0 <= m_hover_id) && (m_hover_id < 3)) - m_gizmos[m_hover_id].start_dragging(selection); -} - -void GLGizmoRotate3D::on_stop_dragging() -{ - if ((0 <= m_hover_id) && (m_hover_id < 3)) - m_gizmos[m_hover_id].stop_dragging(); -} - -void GLGizmoRotate3D::on_render(const GLCanvas3D::Selection& selection) const -{ - ::glClear(GL_DEPTH_BUFFER_BIT); - - if ((m_hover_id == -1) || (m_hover_id == 0)) - m_gizmos[X].render(selection); - - if ((m_hover_id == -1) || (m_hover_id == 1)) - m_gizmos[Y].render(selection); - - if ((m_hover_id == -1) || (m_hover_id == 2)) - m_gizmos[Z].render(selection); -} - -#if ENABLE_IMGUI -void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) -{ -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - Vec3d rotation(Geometry::rad2deg(m_gizmos[0].get_angle()), Geometry::rad2deg(m_gizmos[1].get_angle()), Geometry::rad2deg(m_gizmos[2].get_angle())); - wxString label = _(L("Rotation (deg)")); - - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - m_imgui->input_vec3("", rotation, 100.0f, "%.2f"); - m_imgui->end(); -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI -} -#endif // ENABLE_IMGUI - -const float GLGizmoScale3D::Offset = 5.0f; - -#if ENABLE_SVG_ICONS -GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -#else -GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id) - : GLGizmoBase(parent, sprite_id) -#endif // ENABLE_SVG_ICONS - , m_scale(Vec3d::Ones()) - , m_snap_step(0.05) - , m_starting_scale(Vec3d::Ones()) -{ -} - -bool GLGizmoScale3D::on_init() -{ - for (int i = 0; i < 10; ++i) - { - m_grabbers.push_back(Grabber()); - } - - double half_pi = 0.5 * (double)PI; - - // x axis - m_grabbers[0].angles(1) = half_pi; - m_grabbers[1].angles(1) = half_pi; - - // y axis - m_grabbers[2].angles(0) = half_pi; - m_grabbers[3].angles(0) = half_pi; - - m_shortcut_key = WXK_CONTROL_S; - - return true; -} - -std::string GLGizmoScale3D::on_get_name() const -{ - return L("Scale [S]"); -} - -void GLGizmoScale3D::on_start_dragging(const GLCanvas3D::Selection& selection) -{ - if (m_hover_id != -1) - { - m_starting_drag_position = m_grabbers[m_hover_id].center; - m_starting_box = selection.get_bounding_box(); - } -} - -void GLGizmoScale3D::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) -{ - if ((m_hover_id == 0) || (m_hover_id == 1)) - do_scale_x(data); - else if ((m_hover_id == 2) || (m_hover_id == 3)) - do_scale_y(data); - else if ((m_hover_id == 4) || (m_hover_id == 5)) - do_scale_z(data); - else if (m_hover_id >= 6) - do_scale_uniform(data); -} - -void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const -{ - bool single_instance = selection.is_single_full_instance(); - bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); - bool single_selection = single_instance || single_volume; - - Vec3f scale = 100.0f * Vec3f::Ones(); - if (single_instance) - scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_scaling_factor().cast(); - else if (single_volume) - scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_volume_scaling_factor().cast(); - - if ((single_selection && ((m_hover_id == 0) || (m_hover_id == 1))) || m_grabbers[0].dragging || m_grabbers[1].dragging) - set_tooltip("X: " + format(scale(0), 4) + "%"); - else if (!m_grabbers[0].dragging && !m_grabbers[1].dragging && ((m_hover_id == 0) || (m_hover_id == 1))) - set_tooltip("X"); - else if ((single_selection && ((m_hover_id == 2) || (m_hover_id == 3))) || m_grabbers[2].dragging || m_grabbers[3].dragging) - set_tooltip("Y: " + format(scale(1), 4) + "%"); - else if (!m_grabbers[2].dragging && !m_grabbers[3].dragging && ((m_hover_id == 2) || (m_hover_id == 3))) - set_tooltip("Y"); - else if ((single_selection && ((m_hover_id == 4) || (m_hover_id == 5))) || m_grabbers[4].dragging || m_grabbers[5].dragging) - set_tooltip("Z: " + format(scale(2), 4) + "%"); - else if (!m_grabbers[4].dragging && !m_grabbers[5].dragging && ((m_hover_id == 4) || (m_hover_id == 5))) - set_tooltip("Z"); - else if ((single_selection && ((m_hover_id == 6) || (m_hover_id == 7) || (m_hover_id == 8) || (m_hover_id == 9))) - || m_grabbers[6].dragging || m_grabbers[7].dragging || m_grabbers[8].dragging || m_grabbers[9].dragging) - { - std::string tooltip = "X: " + format(scale(0), 4) + "%\n"; - tooltip += "Y: " + format(scale(1), 4) + "%\n"; - tooltip += "Z: " + format(scale(2), 4) + "%"; - set_tooltip(tooltip); - } - else if (!m_grabbers[6].dragging && !m_grabbers[7].dragging && !m_grabbers[8].dragging && !m_grabbers[9].dragging && - ((m_hover_id == 6) || (m_hover_id == 7) || (m_hover_id == 8) || (m_hover_id == 9))) - set_tooltip("X/Y/Z"); - - ::glClear(GL_DEPTH_BUFFER_BIT); - ::glEnable(GL_DEPTH_TEST); - - BoundingBoxf3 box; - Transform3d transform = Transform3d::Identity(); - Vec3d angles = Vec3d::Zero(); - Transform3d offsets_transform = Transform3d::Identity(); - - Vec3d grabber_size = Vec3d::Zero(); - - if (single_instance) - { - // calculate bounding box in instance local reference system - const GLCanvas3D::Selection::IndicesList& idxs = selection.get_volume_idxs(); - for (unsigned int idx : idxs) - { - const GLVolume* vol = selection.get_volume(idx); - box.merge(vol->bounding_box.transformed(vol->get_volume_transformation().get_matrix())); - } - - // gets transform from first selected volume - const GLVolume* v = selection.get_volume(*idxs.begin()); - transform = v->get_instance_transformation().get_matrix(); - // gets angles from first selected volume - angles = v->get_instance_rotation(); - // consider rotation+mirror only components of the transform for offsets - offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v->get_instance_mirror()); - grabber_size = v->get_instance_transformation().get_matrix(true, true, false, true) * box.size(); - } - else if (single_volume) - { - const GLVolume* v = selection.get_volume(*selection.get_volume_idxs().begin()); - box = v->bounding_box; - transform = v->world_matrix(); - angles = Geometry::extract_euler_angles(transform); - // consider rotation+mirror only components of the transform for offsets - offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v->get_instance_mirror()); - grabber_size = v->get_volume_transformation().get_matrix(true, true, false, true) * box.size(); - } - else - { - box = selection.get_bounding_box(); - grabber_size = box.size(); - } - - m_box = box; - - const Vec3d& center = m_box.center(); - Vec3d offset_x = offsets_transform * Vec3d((double)Offset, 0.0, 0.0); - Vec3d offset_y = offsets_transform * Vec3d(0.0, (double)Offset, 0.0); - Vec3d offset_z = offsets_transform * Vec3d(0.0, 0.0, (double)Offset); - - // x axis - m_grabbers[0].center = transform * Vec3d(m_box.min(0), center(1), center(2)) - offset_x; - m_grabbers[1].center = transform * Vec3d(m_box.max(0), center(1), center(2)) + offset_x; - ::memcpy((void*)m_grabbers[0].color, (const void*)&AXES_COLOR[0], 3 * sizeof(float)); - ::memcpy((void*)m_grabbers[1].color, (const void*)&AXES_COLOR[0], 3 * sizeof(float)); - - // y axis - m_grabbers[2].center = transform * Vec3d(center(0), m_box.min(1), center(2)) - offset_y; - m_grabbers[3].center = transform * Vec3d(center(0), m_box.max(1), center(2)) + offset_y; - ::memcpy((void*)m_grabbers[2].color, (const void*)&AXES_COLOR[1], 3 * sizeof(float)); - ::memcpy((void*)m_grabbers[3].color, (const void*)&AXES_COLOR[1], 3 * sizeof(float)); - - // z axis - m_grabbers[4].center = transform * Vec3d(center(0), center(1), m_box.min(2)) - offset_z; - m_grabbers[5].center = transform * Vec3d(center(0), center(1), m_box.max(2)) + offset_z; - ::memcpy((void*)m_grabbers[4].color, (const void*)&AXES_COLOR[2], 3 * sizeof(float)); - ::memcpy((void*)m_grabbers[5].color, (const void*)&AXES_COLOR[2], 3 * sizeof(float)); - - // uniform - m_grabbers[6].center = transform * Vec3d(m_box.min(0), m_box.min(1), center(2)) - offset_x - offset_y; - m_grabbers[7].center = transform * Vec3d(m_box.max(0), m_box.min(1), center(2)) + offset_x - offset_y; - m_grabbers[8].center = transform * Vec3d(m_box.max(0), m_box.max(1), center(2)) + offset_x + offset_y; - m_grabbers[9].center = transform * Vec3d(m_box.min(0), m_box.max(1), center(2)) - offset_x + offset_y; - for (int i = 6; i < 10; ++i) - { - ::memcpy((void*)m_grabbers[i].color, (const void*)m_highlight_color, 3 * sizeof(float)); - } - - // sets grabbers orientation - for (int i = 0; i < 10; ++i) - { - m_grabbers[i].angles = angles; - } - - ::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f); - - float grabber_mean_size = (float)(grabber_size(0) + grabber_size(1) + grabber_size(2)) / 3.0f; - - if (m_hover_id == -1) - { - // draw connections - if (m_grabbers[0].enabled && m_grabbers[1].enabled) - { - ::glColor3fv(m_grabbers[0].color); - render_grabbers_connection(0, 1); - } - if (m_grabbers[2].enabled && m_grabbers[3].enabled) - { - ::glColor3fv(m_grabbers[2].color); - render_grabbers_connection(2, 3); - } - if (m_grabbers[4].enabled && m_grabbers[5].enabled) - { - ::glColor3fv(m_grabbers[4].color); - render_grabbers_connection(4, 5); - } - ::glColor3fv(m_base_color); - render_grabbers_connection(6, 7); - render_grabbers_connection(7, 8); - render_grabbers_connection(8, 9); - render_grabbers_connection(9, 6); - // draw grabbers - render_grabbers(grabber_mean_size); - } - else if ((m_hover_id == 0) || (m_hover_id == 1)) - { - // draw connection - ::glColor3fv(m_grabbers[0].color); - render_grabbers_connection(0, 1); - // draw grabbers - m_grabbers[0].render(true, grabber_mean_size); - m_grabbers[1].render(true, grabber_mean_size); - } - else if ((m_hover_id == 2) || (m_hover_id == 3)) - { - // draw connection - ::glColor3fv(m_grabbers[2].color); - render_grabbers_connection(2, 3); - // draw grabbers - m_grabbers[2].render(true, grabber_mean_size); - m_grabbers[3].render(true, grabber_mean_size); - } - else if ((m_hover_id == 4) || (m_hover_id == 5)) - { - // draw connection - ::glColor3fv(m_grabbers[4].color); - render_grabbers_connection(4, 5); - // draw grabbers - m_grabbers[4].render(true, grabber_mean_size); - m_grabbers[5].render(true, grabber_mean_size); - } - else if (m_hover_id >= 6) - { - // draw connection - ::glColor3fv(m_drag_color); - render_grabbers_connection(6, 7); - render_grabbers_connection(7, 8); - render_grabbers_connection(8, 9); - render_grabbers_connection(9, 6); - // draw grabbers - for (int i = 6; i < 10; ++i) - { - m_grabbers[i].render(true, grabber_mean_size); - } - } -} - -void GLGizmoScale3D::on_render_for_picking(const GLCanvas3D::Selection& selection) const -{ - ::glDisable(GL_DEPTH_TEST); - - render_grabbers_for_picking(selection.get_bounding_box()); -} - -#if ENABLE_IMGUI -void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) -{ -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - bool single_instance = selection.is_single_full_instance(); - wxString label = _(L("Scale (%)")); - - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - m_imgui->input_vec3("", m_scale * 100.f, 100.0f, "%.2f"); - m_imgui->end(); -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI -} -#endif // ENABLE_IMGUI - -void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2) const -{ - unsigned int grabbers_count = (unsigned int)m_grabbers.size(); - if ((id_1 < grabbers_count) && (id_2 < grabbers_count)) - { - ::glBegin(GL_LINES); - ::glVertex3dv(m_grabbers[id_1].center.data()); - ::glVertex3dv(m_grabbers[id_2].center.data()); - ::glEnd(); - } -} - -void GLGizmoScale3D::do_scale_x(const UpdateData& data) -{ - double ratio = calc_ratio(data); - if (ratio > 0.0) - m_scale(0) = m_starting_scale(0) * ratio; -} - -void GLGizmoScale3D::do_scale_y(const UpdateData& data) -{ - double ratio = calc_ratio(data); - if (ratio > 0.0) - m_scale(1) = m_starting_scale(1) * ratio; -} - -void GLGizmoScale3D::do_scale_z(const UpdateData& data) -{ - double ratio = calc_ratio(data); - if (ratio > 0.0) - m_scale(2) = m_starting_scale(2) * ratio; -} - -void GLGizmoScale3D::do_scale_uniform(const UpdateData& data) -{ - double ratio = calc_ratio(data); - if (ratio > 0.0) - m_scale = m_starting_scale * ratio; -} - -double GLGizmoScale3D::calc_ratio(const UpdateData& data) const -{ - double ratio = 0.0; - - // vector from the center to the starting position - Vec3d starting_vec = m_starting_drag_position - m_starting_box.center(); - double len_starting_vec = starting_vec.norm(); - if (len_starting_vec != 0.0) - { - Vec3d mouse_dir = data.mouse_ray.unit_vector(); - // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position - // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form - // in our case plane normal and ray direction are the same (orthogonal view) - // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - Vec3d inters = data.mouse_ray.a + (m_starting_drag_position - data.mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; - // vector from the starting position to the found intersection - Vec3d inters_vec = inters - m_starting_drag_position; - - // finds projection of the vector along the staring direction - double proj = inters_vec.dot(starting_vec.normalized()); - - ratio = (len_starting_vec + proj) / len_starting_vec; - } - - if (data.shift_down) - ratio = m_snap_step * (double)std::round(ratio / m_snap_step); - - return ratio; -} - -const double GLGizmoMove3D::Offset = 10.0; - -#if ENABLE_SVG_ICONS -GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -#else -GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id) - : GLGizmoBase(parent, sprite_id) -#endif // ENABLE_SVG_ICONS - , m_displacement(Vec3d::Zero()) - , m_snap_step(1.0) - , m_starting_drag_position(Vec3d::Zero()) - , m_starting_box_center(Vec3d::Zero()) - , m_starting_box_bottom_center(Vec3d::Zero()) - , m_quadric(nullptr) -{ - m_quadric = ::gluNewQuadric(); - if (m_quadric != nullptr) - ::gluQuadricDrawStyle(m_quadric, GLU_FILL); -} - -GLGizmoMove3D::~GLGizmoMove3D() -{ - if (m_quadric != nullptr) - ::gluDeleteQuadric(m_quadric); -} - -bool GLGizmoMove3D::on_init() -{ - for (int i = 0; i < 3; ++i) - { - m_grabbers.push_back(Grabber()); - } - - m_shortcut_key = WXK_CONTROL_M; - - return true; -} - -std::string GLGizmoMove3D::on_get_name() const -{ - return L("Move [M]"); -} - -void GLGizmoMove3D::on_start_dragging(const GLCanvas3D::Selection& selection) -{ - if (m_hover_id != -1) - { - m_displacement = Vec3d::Zero(); - const BoundingBoxf3& box = selection.get_bounding_box(); - m_starting_drag_position = m_grabbers[m_hover_id].center; - m_starting_box_center = box.center(); - m_starting_box_bottom_center = box.center(); - m_starting_box_bottom_center(2) = box.min(2); - } -} - -void GLGizmoMove3D::on_stop_dragging() -{ - m_displacement = Vec3d::Zero(); -} - -void GLGizmoMove3D::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) -{ - if (m_hover_id == 0) - m_displacement(0) = calc_projection(data); - else if (m_hover_id == 1) - m_displacement(1) = calc_projection(data); - else if (m_hover_id == 2) - m_displacement(2) = calc_projection(data); -} - -void GLGizmoMove3D::on_render(const GLCanvas3D::Selection& selection) const -{ - bool show_position = selection.is_single_full_instance(); - const Vec3d& position = selection.get_bounding_box().center(); - - if ((show_position && (m_hover_id == 0)) || m_grabbers[0].dragging) - set_tooltip("X: " + format(show_position ? position(0) : m_displacement(0), 2)); - else if (!m_grabbers[0].dragging && (m_hover_id == 0)) - set_tooltip("X"); - else if ((show_position && (m_hover_id == 1)) || m_grabbers[1].dragging) - set_tooltip("Y: " + format(show_position ? position(1) : m_displacement(1), 2)); - else if (!m_grabbers[1].dragging && (m_hover_id == 1)) - set_tooltip("Y"); - else if ((show_position && (m_hover_id == 2)) || m_grabbers[2].dragging) - set_tooltip("Z: " + format(show_position ? position(2) : m_displacement(2), 2)); - else if (!m_grabbers[2].dragging && (m_hover_id == 2)) - set_tooltip("Z"); - - ::glClear(GL_DEPTH_BUFFER_BIT); - ::glEnable(GL_DEPTH_TEST); - - const BoundingBoxf3& box = selection.get_bounding_box(); - const Vec3d& center = box.center(); - - // x axis - m_grabbers[0].center = Vec3d(box.max(0) + Offset, center(1), center(2)); - ::memcpy((void*)m_grabbers[0].color, (const void*)&AXES_COLOR[0], 3 * sizeof(float)); - - // y axis - m_grabbers[1].center = Vec3d(center(0), box.max(1) + Offset, center(2)); - ::memcpy((void*)m_grabbers[1].color, (const void*)&AXES_COLOR[1], 3 * sizeof(float)); - - // z axis - m_grabbers[2].center = Vec3d(center(0), center(1), box.max(2) + Offset); - ::memcpy((void*)m_grabbers[2].color, (const void*)&AXES_COLOR[2], 3 * sizeof(float)); - - ::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f); - - if (m_hover_id == -1) - { - // draw axes - for (unsigned int i = 0; i < 3; ++i) - { - if (m_grabbers[i].enabled) - { - ::glColor3fv(AXES_COLOR[i]); - ::glBegin(GL_LINES); - ::glVertex3dv(center.data()); - ::glVertex3dv(m_grabbers[i].center.data()); - ::glEnd(); - } - } - - // draw grabbers - render_grabbers(box); - for (unsigned int i = 0; i < 3; ++i) - { - if (m_grabbers[i].enabled) - render_grabber_extension((Axis)i, box, false); - } - } - else - { - // draw axis - ::glColor3fv(AXES_COLOR[m_hover_id]); - ::glBegin(GL_LINES); - ::glVertex3dv(center.data()); - ::glVertex3dv(m_grabbers[m_hover_id].center.data()); - ::glEnd(); - - // draw grabber - m_grabbers[m_hover_id].render(true, box.max_size()); - render_grabber_extension((Axis)m_hover_id, box, false); - } -} - -void GLGizmoMove3D::on_render_for_picking(const GLCanvas3D::Selection& selection) const -{ - ::glDisable(GL_DEPTH_TEST); - - const BoundingBoxf3& box = selection.get_bounding_box(); - render_grabbers_for_picking(box); - render_grabber_extension(X, box, true); - render_grabber_extension(Y, box, true); - render_grabber_extension(Z, box, true); -} - -#if ENABLE_IMGUI -void GLGizmoMove3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) -{ -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - bool show_position = selection.is_single_full_instance(); - const Vec3d& position = selection.get_bounding_box().center(); - - Vec3d displacement = show_position ? position : m_displacement; - wxString label = show_position ? _(L("Position (mm)")) : _(L("Displacement (mm)")); - - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - m_imgui->input_vec3("", displacement, 100.0f, "%.2f"); - - m_imgui->end(); -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI -} -#endif // ENABLE_IMGUI - -double GLGizmoMove3D::calc_projection(const UpdateData& data) const -{ - double projection = 0.0; - - Vec3d starting_vec = m_starting_drag_position - m_starting_box_center; - double len_starting_vec = starting_vec.norm(); - if (len_starting_vec != 0.0) - { - Vec3d mouse_dir = data.mouse_ray.unit_vector(); - // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position - // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form - // in our case plane normal and ray direction are the same (orthogonal view) - // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - Vec3d inters = data.mouse_ray.a + (m_starting_drag_position - data.mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; - // vector from the starting position to the found intersection - Vec3d inters_vec = inters - m_starting_drag_position; - - // finds projection of the vector along the staring direction - projection = inters_vec.dot(starting_vec.normalized()); - } - - if (data.shift_down) - projection = m_snap_step * (double)std::round(projection / m_snap_step); - - return projection; -} - -void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const -{ - if (m_quadric == nullptr) - return; - - double size = m_dragging ? (double)m_grabbers[axis].get_dragging_half_size((float)box.max_size()) : (double)m_grabbers[axis].get_half_size((float)box.max_size()); - - float color[3]; - ::memcpy((void*)color, (const void*)m_grabbers[axis].color, 3 * sizeof(float)); - if (!picking && (m_hover_id != -1)) - { - color[0] = 1.0f - color[0]; - color[1] = 1.0f - color[1]; - color[2] = 1.0f - color[2]; - } - - if (!picking) - ::glEnable(GL_LIGHTING); - - ::glColor3fv(color); - ::glPushMatrix(); - ::glTranslated(m_grabbers[axis].center(0), m_grabbers[axis].center(1), m_grabbers[axis].center(2)); - if (axis == X) - ::glRotated(90.0, 0.0, 1.0, 0.0); - else if (axis == Y) - ::glRotated(-90.0, 1.0, 0.0, 0.0); - - ::glTranslated(0.0, 0.0, 2.0 * size); - ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); - ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); - ::gluQuadricOrientation(m_quadric, GLU_INSIDE); - ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); - ::glPopMatrix(); - - if (!picking) - ::glDisable(GL_LIGHTING); -} - -#if ENABLE_SVG_ICONS -GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -#else -GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id) - : GLGizmoBase(parent, sprite_id) -#endif // ENABLE_SVG_ICONS - , m_normal(Vec3d::Zero()) - , m_starting_center(Vec3d::Zero()) -{ -} - -bool GLGizmoFlatten::on_init() -{ - m_shortcut_key = WXK_CONTROL_F; - return true; -} - -std::string GLGizmoFlatten::on_get_name() const -{ - return L("Place on face [F]"); -} - -bool GLGizmoFlatten::on_is_activable(const GLCanvas3D::Selection& selection) const -{ - return selection.is_single_full_instance(); -} - -void GLGizmoFlatten::on_start_dragging(const GLCanvas3D::Selection& selection) -{ - if (m_hover_id != -1) - { - assert(m_planes_valid); - m_normal = m_planes[m_hover_id].normal; - m_starting_center = selection.get_bounding_box().center(); - } -} - -void GLGizmoFlatten::on_render(const GLCanvas3D::Selection& selection) const -{ - ::glClear(GL_DEPTH_BUFFER_BIT); - - ::glEnable(GL_DEPTH_TEST); - ::glEnable(GL_BLEND); - - if (selection.is_single_full_instance()) - { - const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); - ::glPushMatrix(); - ::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z()); - ::glMultMatrixd(m.data()); - if (this->is_plane_update_necessary()) - const_cast(this)->update_planes(); - for (int i = 0; i < (int)m_planes.size(); ++i) - { - if (i == m_hover_id) - ::glColor4f(0.9f, 0.9f, 0.9f, 0.75f); - else - ::glColor4f(0.9f, 0.9f, 0.9f, 0.5f); - - ::glBegin(GL_POLYGON); - for (const Vec3d& vertex : m_planes[i].vertices) - { - ::glVertex3dv(vertex.data()); - } - ::glEnd(); - } - ::glPopMatrix(); - } - - ::glEnable(GL_CULL_FACE); - ::glDisable(GL_BLEND); -} - -void GLGizmoFlatten::on_render_for_picking(const GLCanvas3D::Selection& selection) const -{ - ::glDisable(GL_DEPTH_TEST); - ::glDisable(GL_BLEND); - - if (selection.is_single_full_instance()) - { - const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); - ::glPushMatrix(); - ::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z()); - ::glMultMatrixd(m.data()); - if (this->is_plane_update_necessary()) - const_cast(this)->update_planes(); - for (int i = 0; i < (int)m_planes.size(); ++i) - { - ::glColor3fv(picking_color_component(i).data()); - ::glBegin(GL_POLYGON); - for (const Vec3d& vertex : m_planes[i].vertices) - { - ::glVertex3dv(vertex.data()); - } - ::glEnd(); - } - ::glPopMatrix(); - } - - ::glEnable(GL_CULL_FACE); -} - -void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object) -{ - m_starting_center = Vec3d::Zero(); - if (m_model_object != model_object) { - m_planes.clear(); - m_planes_valid = false; - } - m_model_object = model_object; -} - -void GLGizmoFlatten::update_planes() -{ - TriangleMesh ch; - for (const ModelVolume* vol : m_model_object->volumes) - { - if (vol->type() != ModelVolumeType::MODEL_PART) - continue; - TriangleMesh vol_ch = vol->get_convex_hull(); - vol_ch.transform(vol->get_matrix()); - ch.merge(vol_ch); - } - ch = ch.convex_hull_3d(); - m_planes.clear(); - const Transform3d& inst_matrix = m_model_object->instances.front()->get_matrix(true); - - // Following constants are used for discarding too small polygons. - const float minimal_area = 5.f; // in square mm (world coordinates) - const float minimal_side = 1.f; // mm - - // Now we'll go through all the facets and append Points of facets sharing the same normal. - // This part is still performed in mesh coordinate system. - const int num_of_facets = ch.stl.stats.number_of_facets; - std::vector facet_queue(num_of_facets, 0); - std::vector facet_visited(num_of_facets, false); - int facet_queue_cnt = 0; - const stl_normal* normal_ptr = nullptr; - while (1) { - // Find next unvisited triangle: - int facet_idx = 0; - for (; facet_idx < num_of_facets; ++ facet_idx) - if (!facet_visited[facet_idx]) { - facet_queue[facet_queue_cnt ++] = facet_idx; - facet_visited[facet_idx] = true; - normal_ptr = &ch.stl.facet_start[facet_idx].normal; - m_planes.emplace_back(); - break; - } - if (facet_idx == num_of_facets) - break; // Everything was visited already - - while (facet_queue_cnt > 0) { - int facet_idx = facet_queue[-- facet_queue_cnt]; - const stl_normal& this_normal = ch.stl.facet_start[facet_idx].normal; - if (std::abs(this_normal(0) - (*normal_ptr)(0)) < 0.001 && std::abs(this_normal(1) - (*normal_ptr)(1)) < 0.001 && std::abs(this_normal(2) - (*normal_ptr)(2)) < 0.001) { - stl_vertex* first_vertex = ch.stl.facet_start[facet_idx].vertex; - for (int j=0; j<3; ++j) - m_planes.back().vertices.emplace_back((double)first_vertex[j](0), (double)first_vertex[j](1), (double)first_vertex[j](2)); - - facet_visited[facet_idx] = true; - for (int j = 0; j < 3; ++ j) { - int neighbor_idx = ch.stl.neighbors_start[facet_idx].neighbor[j]; - if (! facet_visited[neighbor_idx]) - facet_queue[facet_queue_cnt ++] = neighbor_idx; - } - } - } - m_planes.back().normal = normal_ptr->cast(); - - // Now we'll transform all the points into world coordinates, so that the areas, angles and distances - // make real sense. - m_planes.back().vertices = transform(m_planes.back().vertices, inst_matrix); - - // if this is a just a very small triangle, remove it to speed up further calculations (it would be rejected later anyway): - if (m_planes.back().vertices.size() == 3 && - ((m_planes.back().vertices[0] - m_planes.back().vertices[1]).norm() < minimal_side - || (m_planes.back().vertices[0] - m_planes.back().vertices[2]).norm() < minimal_side - || (m_planes.back().vertices[1] - m_planes.back().vertices[2]).norm() < minimal_side)) - m_planes.pop_back(); - } - - // Let's prepare transformation of the normal vector from mesh to instance coordinates. - Geometry::Transformation t(inst_matrix); - Vec3d scaling = t.get_scaling_factor(); - t.set_scaling_factor(Vec3d(1./scaling(0), 1./scaling(1), 1./scaling(2))); - - // Now we'll go through all the polygons, transform the points into xy plane to process them: - for (unsigned int polygon_id=0; polygon_id < m_planes.size(); ++polygon_id) { - Pointf3s& polygon = m_planes[polygon_id].vertices; - const Vec3d& normal = m_planes[polygon_id].normal; - - // transform the normal according to the instance matrix: - Vec3d normal_transformed = t.get_matrix() * normal; - - // We are going to rotate about z and y to flatten the plane - Eigen::Quaterniond q; - Transform3d m = Transform3d::Identity(); - m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(normal_transformed, Vec3d::UnitZ()).toRotationMatrix(); - polygon = transform(polygon, m); - - // Now to remove the inner points. We'll misuse Geometry::convex_hull for that, but since - // it works in fixed point representation, we will rescale the polygon to avoid overflows. - // And yes, it is a nasty thing to do. Whoever has time is free to refactor. - Vec3d bb_size = BoundingBoxf3(polygon).size(); - float sf = std::min(1./bb_size(0), 1./bb_size(1)); - Transform3d tr = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), Vec3d(sf, sf, 1.f)); - polygon = transform(polygon, tr); - polygon = Slic3r::Geometry::convex_hull(polygon); - polygon = transform(polygon, tr.inverse()); - - // Calculate area of the polygons and discard ones that are too small - float& area = m_planes[polygon_id].area; - area = 0.f; - for (unsigned int i = 0; i < polygon.size(); i++) // Shoelace formula - area += polygon[i](0)*polygon[i + 1 < polygon.size() ? i + 1 : 0](1) - polygon[i + 1 < polygon.size() ? i + 1 : 0](0)*polygon[i](1); - area = 0.5f * std::abs(area); - - bool discard = false; - if (area < minimal_area) - discard = true; - else { - // We also check the inner angles and discard polygons with angles smaller than the following threshold - const double angle_threshold = ::cos(10.0 * (double)PI / 180.0); - - for (unsigned int i = 0; i < polygon.size(); ++i) { - const Vec3d& prec = polygon[(i == 0) ? polygon.size() - 1 : i - 1]; - const Vec3d& curr = polygon[i]; - const Vec3d& next = polygon[(i == polygon.size() - 1) ? 0 : i + 1]; - - if ((prec - curr).normalized().dot((next - curr).normalized()) > angle_threshold) { - discard = true; - break; - } - } - } - - if (discard) { - m_planes.erase(m_planes.begin() + (polygon_id--)); - continue; - } - - // We will shrink the polygon a little bit so it does not touch the object edges: - Vec3d centroid = std::accumulate(polygon.begin(), polygon.end(), Vec3d(0.0, 0.0, 0.0)); - centroid /= (double)polygon.size(); - for (auto& vertex : polygon) - vertex = 0.9f*vertex + 0.1f*centroid; - - // Polygon is now simple and convex, we'll round the corners to make them look nicer. - // The algorithm takes a vertex, calculates middles of respective sides and moves the vertex - // towards their average (controlled by 'aggressivity'). This is repeated k times. - // In next iterations, the neighbours are not always taken at the middle (to increase the - // rounding effect at the corners, where we need it most). - const unsigned int k = 10; // number of iterations - const float aggressivity = 0.2f; // agressivity - const unsigned int N = polygon.size(); - std::vector> neighbours; - if (k != 0) { - Pointf3s points_out(2*k*N); // vector long enough to store the future vertices - for (unsigned int j=0; jvolumes) { - m_volumes_matrices.push_back(vol->get_matrix()); - m_volumes_types.push_back(vol->type()); - } - m_first_instance_scale = m_model_object->instances.front()->get_scaling_factor(); - m_first_instance_mirror = m_model_object->instances.front()->get_mirror(); - - m_planes_valid = true; -} - - -bool GLGizmoFlatten::is_plane_update_necessary() const -{ - if (m_state != On || !m_model_object || m_model_object->instances.empty()) - return false; - - if (! m_planes_valid || m_model_object->volumes.size() != m_volumes_matrices.size()) - return true; - - // We want to recalculate when the scale changes - some planes could (dis)appear. - if (! m_model_object->instances.front()->get_scaling_factor().isApprox(m_first_instance_scale) - || ! m_model_object->instances.front()->get_mirror().isApprox(m_first_instance_mirror)) - return true; - - for (unsigned int i=0; i < m_model_object->volumes.size(); ++i) - if (! m_model_object->volumes[i]->get_matrix().isApprox(m_volumes_matrices[i]) - || m_model_object->volumes[i]->type() != m_volumes_types[i]) - return true; - - return false; -} - -Vec3d GLGizmoFlatten::get_flattening_normal() const -{ - Vec3d out = m_normal; - m_normal = Vec3d::Zero(); - m_starting_center = Vec3d::Zero(); - return out; -} - -#if ENABLE_SVG_ICONS -GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -#else -GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id) - : GLGizmoBase(parent, sprite_id) -#endif // ENABLE_SVG_ICONS - , m_starting_center(Vec3d::Zero()), m_quadric(nullptr) -{ - m_quadric = ::gluNewQuadric(); - if (m_quadric != nullptr) - // using GLU_FILL does not work when the instance's transformation - // contains mirroring (normals are reverted) - ::gluQuadricDrawStyle(m_quadric, GLU_FILL); -} - -GLGizmoSlaSupports::~GLGizmoSlaSupports() -{ - if (m_quadric != nullptr) - ::gluDeleteQuadric(m_quadric); -} - -bool GLGizmoSlaSupports::on_init() -{ - m_shortcut_key = WXK_CONTROL_L; - return true; -} - -void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection) -{ - m_starting_center = Vec3d::Zero(); - m_old_model_object = m_model_object; - m_model_object = model_object; - if (selection.is_empty()) - m_old_instance_id = -1; - - m_active_instance = selection.get_instance_idx(); - - if (model_object && selection.is_from_single_instance()) - { - if (is_mesh_update_necessary()) { - update_mesh(); - editing_mode_reload_cache(); - } - - if (m_model_object != m_old_model_object) - m_editing_mode = false; - - if (m_editing_mode_cache.empty() && m_model_object->sla_points_status != sla::PointsStatus::UserModified) - get_data_from_backend(); - - if (m_state == On) { - m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); - } - } -} - -void GLGizmoSlaSupports::on_render(const GLCanvas3D::Selection& selection) const -{ - ::glEnable(GL_BLEND); - ::glEnable(GL_DEPTH_TEST); - - render_points(selection, false); - render_selection_rectangle(); - -#if !ENABLE_IMGUI - render_tooltip_texture(); -#endif // not ENABLE_IMGUI - - ::glDisable(GL_BLEND); -} - -void GLGizmoSlaSupports::render_selection_rectangle() const -{ - if (!m_selection_rectangle_active) - return; - - ::glLineWidth(1.5f); - float render_color[3] = {1.f, 0.f, 0.f}; - ::glColor3fv(render_color); - - ::glPushAttrib(GL_TRANSFORM_BIT); // remember current MatrixMode - - ::glMatrixMode(GL_MODELVIEW); // cache modelview matrix and set to identity - ::glPushMatrix(); - ::glLoadIdentity(); - - ::glMatrixMode(GL_PROJECTION); // cache projection matrix and set to identity - ::glPushMatrix(); - ::glLoadIdentity(); - - ::glOrtho(0.f, m_canvas_width, m_canvas_height, 0.f, -1.f, 1.f); // set projection matrix so that world coords = window coords - - // render the selection rectangle (window coordinates): - ::glPushAttrib(GL_ENABLE_BIT); - ::glLineStipple(4, 0xAAAA); - ::glEnable(GL_LINE_STIPPLE); - - ::glBegin(GL_LINE_LOOP); - ::glVertex3f((GLfloat)m_selection_rectangle_start_corner(0), (GLfloat)m_selection_rectangle_start_corner(1), (GLfloat)0.5f); - ::glVertex3f((GLfloat)m_selection_rectangle_end_corner(0), (GLfloat)m_selection_rectangle_start_corner(1), (GLfloat)0.5f); - ::glVertex3f((GLfloat)m_selection_rectangle_end_corner(0), (GLfloat)m_selection_rectangle_end_corner(1), (GLfloat)0.5f); - ::glVertex3f((GLfloat)m_selection_rectangle_start_corner(0), (GLfloat)m_selection_rectangle_end_corner(1), (GLfloat)0.5f); - ::glEnd(); - ::glPopAttrib(); - - ::glPopMatrix(); // restore former projection matrix - ::glMatrixMode(GL_MODELVIEW); - ::glPopMatrix(); // restore former modelview matrix - ::glPopAttrib(); // restore former MatrixMode -} - -void GLGizmoSlaSupports::on_render_for_picking(const GLCanvas3D::Selection& selection) const -{ - ::glEnable(GL_DEPTH_TEST); - - render_points(selection, true); -} - -void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, bool picking) const -{ - if (m_quadric == nullptr || !selection.is_from_single_instance()) - return; - - if (!picking) - ::glEnable(GL_LIGHTING); - - const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); - double z_shift = vol->get_sla_shift_z(); - const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); - const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); - - ::glPushMatrix(); - ::glTranslated(0.0, 0.0, z_shift); - ::glMultMatrixd(instance_matrix.data()); - - float render_color[3]; - for (int i = 0; i < (int)m_editing_mode_cache.size(); ++i) - { - const sla::SupportPoint& support_point = m_editing_mode_cache[i].support_point; - const bool& point_selected = m_editing_mode_cache[i].selected; - - // First decide about the color of the point. - if (picking) { - std::array color = picking_color_component(i); - render_color[0] = color[0]; - render_color[1] = color[1]; - render_color[2] = color[2]; - } - else { - if ((m_hover_id == i && m_editing_mode)) { // ignore hover state unless editing mode is active - render_color[0] = 0.f; - render_color[1] = 1.0f; - render_color[2] = 1.0f; - } - else { // neigher hover nor picking - bool supports_new_island = m_lock_unique_islands && m_editing_mode_cache[i].support_point.is_new_island; - if (m_editing_mode) { - render_color[0] = point_selected ? 1.0f : (supports_new_island ? 0.3f : 0.7f); - render_color[1] = point_selected ? 0.3f : (supports_new_island ? 0.3f : 0.7f); - render_color[2] = point_selected ? 0.3f : (supports_new_island ? 1.0f : 0.7f); - } - else - for (unsigned char i=0; i<3; ++i) render_color[i] = 0.5f; - } - } - ::glColor3fv(render_color); - float render_color_emissive[4] = { 0.5f * render_color[0], 0.5f * render_color[1], 0.5f * render_color[2], 1.f}; - ::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive); - - // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. - ::glPushMatrix(); - ::glTranslated(support_point.pos(0), support_point.pos(1), support_point.pos(2)); - ::glMultMatrixd(instance_scaling_matrix_inverse.data()); - - // Matrices set, we can render the point mark now. - // If in editing mode, we'll also render a cone pointing to the sphere. - if (m_editing_mode) { - if (m_editing_mode_cache[i].normal == Vec3f::Zero()) - update_cache_entry_normal(i); // in case the normal is not yet cached, find and cache it - - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_mode_cache[i].normal.cast()); - Eigen::AngleAxisd aa(q); - ::glRotated(aa.angle() * (180./M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2)); - - const float cone_radius = 0.25f; // mm - const float cone_height = 0.75f; - ::glPushMatrix(); - ::glTranslatef(0.f, 0.f, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale); - ::gluCylinder(m_quadric, 0.f, cone_radius, cone_height, 36, 1); - ::glTranslatef(0.f, 0.f, cone_height); - ::gluDisk(m_quadric, 0.0, cone_radius, 36, 1); - ::glPopMatrix(); - } - ::gluSphere(m_quadric, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale, 64, 36); - ::glPopMatrix(); - } - - { - // Reset emissive component to zero (the default value) - float render_color_emissive[4] = { 0.f, 0.f, 0.f, 1.f }; - ::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive); - } - - if (!picking) - ::glDisable(GL_LIGHTING); - - ::glPopMatrix(); -} - -bool GLGizmoSlaSupports::is_mesh_update_necessary() const -{ - return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) - && ((m_model_object != m_old_model_object) || m_V.size()==0); - - //if (m_state != On || !m_model_object || m_model_object->instances.empty() || ! m_instance_matrix.isApprox(m_source_data.matrix)) - // return false; -} - -void GLGizmoSlaSupports::update_mesh() -{ - wxBusyCursor wait; - Eigen::MatrixXf& V = m_V; - Eigen::MatrixXi& F = m_F; - // Composite mesh of all instances in the world coordinate system. - // This mesh does not account for the possible Z up SLA offset. - TriangleMesh mesh = m_model_object->raw_mesh(); - const stl_file& stl = mesh.stl; - V.resize(3 * stl.stats.number_of_facets, 3); - F.resize(stl.stats.number_of_facets, 3); - for (unsigned int i=0; ivertex[0](0); V(3*i+0, 1) = facet->vertex[0](1); V(3*i+0, 2) = facet->vertex[0](2); - V(3*i+1, 0) = facet->vertex[1](0); V(3*i+1, 1) = facet->vertex[1](1); V(3*i+1, 2) = facet->vertex[1](2); - V(3*i+2, 0) = facet->vertex[2](0); V(3*i+2, 1) = facet->vertex[2](1); V(3*i+2, 2) = facet->vertex[2](2); - F(i, 0) = 3*i+0; - F(i, 1) = 3*i+1; - F(i, 2) = 3*i+2; - } - - m_AABB = igl::AABB(); - m_AABB.init(m_V, m_F); -} - -std::pair GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) -{ - // if the gizmo doesn't have the V, F structures for igl, calculate them first: - if (m_V.size() == 0) - update_mesh(); - - Eigen::Matrix viewport; - ::glGetIntegerv(GL_VIEWPORT, viewport.data()); - Eigen::Matrix modelview_matrix; - ::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix.data()); - Eigen::Matrix projection_matrix; - ::glGetDoublev(GL_PROJECTION_MATRIX, projection_matrix.data()); - - Vec3d point1; - Vec3d point2; - ::gluUnProject(mouse_pos(0), viewport(3)-mouse_pos(1), 0.f, modelview_matrix.data(), projection_matrix.data(), viewport.data(), &point1(0), &point1(1), &point1(2)); - ::gluUnProject(mouse_pos(0), viewport(3)-mouse_pos(1), 1.f, modelview_matrix.data(), projection_matrix.data(), viewport.data(), &point2(0), &point2(1), &point2(2)); - - igl::Hit hit; - - const GLCanvas3D::Selection& selection = m_parent.get_selection(); - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - double z_offset = volume->get_sla_shift_z(); - - point1(2) -= z_offset; - point2(2) -= z_offset; - - Transform3d inv = volume->get_instance_transformation().get_matrix().inverse(); - - point1 = inv * point1; - point2 = inv * point2; - - if (!m_AABB.intersect_ray(m_V, m_F, point1.cast(), (point2-point1).cast(), hit)) - throw std::invalid_argument("unproject_on_mesh(): No intersection found."); - - int fid = hit.id; // facet id - Vec3f bc(1-hit.u-hit.v, hit.u, hit.v); // barycentric coordinates of the hit - Vec3f a = (m_V.row(m_F(fid, 1)) - m_V.row(m_F(fid, 0))); - Vec3f b = (m_V.row(m_F(fid, 2)) - m_V.row(m_F(fid, 0))); - - // Calculate and return both the point and the facet normal. - return std::make_pair( - bc(0) * m_V.row(m_F(fid, 0)) + bc(1) * m_V.row(m_F(fid, 1)) + bc(2)*m_V.row(m_F(fid, 2)), - a.cross(b) - ); -} - -// Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. -// The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is -// aware that the event was reacted to and stops trying to make different sense of it. If the gizmo -// concludes that the event was not intended for it, it should return false. -bool GLGizmoSlaSupports::mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down) -{ - if (m_editing_mode) { - - // left down - show the selection rectangle: - if (action == SLAGizmoEventType::LeftDown && shift_down) { - if (m_hover_id == -1) { - m_selection_rectangle_active = true; - m_selection_rectangle_start_corner = mouse_position; - m_selection_rectangle_end_corner = mouse_position; - m_canvas_width = m_parent.get_canvas_size().get_width(); - m_canvas_height = m_parent.get_canvas_size().get_height(); - } - else - select_point(m_hover_id); - - return true; - } - - // dragging the selection rectangle: - if (action == SLAGizmoEventType::Dragging && m_selection_rectangle_active) { - m_selection_rectangle_end_corner = mouse_position; - return true; - } - - // mouse up without selection rectangle - place point on the mesh: - if (action == SLAGizmoEventType::LeftUp && !m_selection_rectangle_active && !shift_down) { - if (m_ignore_up_event) { - m_ignore_up_event = false; - return false; - } - - int instance_id = m_parent.get_selection().get_instance_idx(); - if (m_old_instance_id != instance_id) - { - bool something_selected = (m_old_instance_id != -1); - m_old_instance_id = instance_id; - if (something_selected) - return false; - } - if (instance_id == -1) - return false; - - // If there is some selection, don't add new point and deselect everything instead. - if (m_selection_empty) { - try { - std::pair pos_and_normal = unproject_on_mesh(mouse_position); // don't create anything if this throws - m_editing_mode_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); - m_unsaved_changes = true; - } - catch (...) { // not clicked on object - return true; // prevents deselection of the gizmo by GLCanvas3D - } - } - else - select_point(NoPoints); - - return true; - } - - // left up with selection rectangle - select points inside the rectangle: - if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp) - && m_selection_rectangle_active) { - if (action == SLAGizmoEventType::ShiftUp) - m_ignore_up_event = true; - const Transform3d& instance_matrix = m_model_object->instances[m_active_instance]->get_transformation().get_matrix(); - GLint viewport[4]; - ::glGetIntegerv(GL_VIEWPORT, viewport); - GLdouble modelview_matrix[16]; - ::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix); - GLdouble projection_matrix[16]; - ::glGetDoublev(GL_PROJECTION_MATRIX, projection_matrix); - - const GLCanvas3D::Selection& selection = m_parent.get_selection(); - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - double z_offset = volume->get_sla_shift_z(); - - // bounding box created from the rectangle corners - will take care of order of the corners - BoundingBox rectangle(Points{Point(m_selection_rectangle_start_corner.cast()), Point(m_selection_rectangle_end_corner.cast())}); - - const Transform3d& instance_matrix_no_translation = volume->get_instance_transformation().get_matrix(true); - // we'll recover current look direction from the modelview matrix (in world coords)... - Vec3f direction_to_camera(modelview_matrix[2], modelview_matrix[6], modelview_matrix[10]); - // ...and transform it to model coords. - direction_to_camera = (instance_matrix_no_translation.inverse().cast() * direction_to_camera).normalized().eval(); - - // Iterate over all points, check if they're in the rectangle and if so, check that they are not obscured by the mesh: - for (unsigned int i=0; i() * support_point.pos; - pos(2) += z_offset; - GLdouble out_x, out_y, out_z; - ::gluProject((GLdouble)pos(0), (GLdouble)pos(1), (GLdouble)pos(2), modelview_matrix, projection_matrix, viewport, &out_x, &out_y, &out_z); - out_y = m_canvas_height - out_y; - - if (rectangle.contains(Point(out_x, out_y))) { - bool is_obscured = false; - // Cast a ray in the direction of the camera and look for intersection with the mesh: - std::vector hits; - // Offset the start of the ray to the front of the ball + EPSILON to account for numerical inaccuracies. - if (m_AABB.intersect_ray(m_V, m_F, support_point.pos + direction_to_camera * (support_point.head_front_radius + EPSILON), direction_to_camera, hits)) - // FIXME: the intersection could in theory be behind the camera, but as of now we only have camera direction. - // Also, the threshold is in mesh coordinates, not in actual dimensions. - if (hits.size() > 1 || hits.front().t > 0.001f) - is_obscured = true; - - if (!is_obscured) - select_point(i); - } - } - m_selection_rectangle_active = false; - return true; - } - - if (action == SLAGizmoEventType::Delete) { - // delete key pressed - delete_selected_points(); - return true; - } - - if (action == SLAGizmoEventType::ApplyChanges) { - editing_mode_apply_changes(); - return true; - } - - if (action == SLAGizmoEventType::DiscardChanges) { - editing_mode_discard_changes(); - return true; - } - - if (action == SLAGizmoEventType::RightDown) { - if (m_hover_id != -1) { - select_point(NoPoints); - select_point(m_hover_id); - delete_selected_points(); - return true; - } - return false; - } - - if (action == SLAGizmoEventType::SelectAll) { - select_point(AllPoints); - return true; - } - } - - if (!m_editing_mode) { - if (action == SLAGizmoEventType::AutomaticGeneration) { - auto_generate(); - return true; - } - - if (action == SLAGizmoEventType::ManualEditing) { - switch_to_editing_mode(); - return true; - } - } - - return false; -} - -void GLGizmoSlaSupports::delete_selected_points(bool force) -{ - for (unsigned int idx=0; idxreslice_SLA_supports(*m_model_object); - } - - select_point(NoPoints); - - //m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); -} - -void GLGizmoSlaSupports::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) -{ - if (m_editing_mode && m_hover_id != -1 && data.mouse_pos && (!m_editing_mode_cache[m_hover_id].support_point.is_new_island || !m_lock_unique_islands)) { - std::pair pos_and_normal; - try { - pos_and_normal = unproject_on_mesh(Vec2d((*data.mouse_pos)(0), (*data.mouse_pos)(1))); - } - catch (...) { return; } - m_editing_mode_cache[m_hover_id].support_point.pos = pos_and_normal.first; - m_editing_mode_cache[m_hover_id].support_point.is_new_island = false; - m_editing_mode_cache[m_hover_id].normal = pos_and_normal.second; - m_unsaved_changes = true; - // Do not update immediately, wait until the mouse is released. - // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - } -} - -#if !ENABLE_IMGUI -void GLGizmoSlaSupports::render_tooltip_texture() const { - if (m_tooltip_texture.get_id() == 0) - if (!m_tooltip_texture.load_from_file(resources_dir() + "/icons/sla_support_points_tooltip.png", false)) - return; - if (m_reset_texture.get_id() == 0) - if (!m_reset_texture.load_from_file(resources_dir() + "/icons/sla_support_points_reset.png", false)) - return; - - float zoom = m_parent.get_camera_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; - float gap = 30.0f * inv_zoom; - - const Size& cnv_size = m_parent.get_canvas_size(); - float l = gap - cnv_size.get_width()/2.f * inv_zoom; - float r = l + (float)m_tooltip_texture.get_width() * inv_zoom; - float b = gap - cnv_size.get_height()/2.f * inv_zoom; - float t = b + (float)m_tooltip_texture.get_height() * inv_zoom; - - Rect reset_rect = m_parent.get_gizmo_reset_rect(m_parent, true); - - ::glDisable(GL_DEPTH_TEST); - ::glPushMatrix(); - ::glLoadIdentity(); - GLTexture::render_texture(m_tooltip_texture.get_id(), l, r, b, t); - GLTexture::render_texture(m_reset_texture.get_id(), reset_rect.get_left(), reset_rect.get_right(), reset_rect.get_bottom(), reset_rect.get_top()); - ::glPopMatrix(); - ::glEnable(GL_DEPTH_TEST); -} -#endif // not ENABLE_IMGUI - - -std::vector GLGizmoSlaSupports::get_config_options(const std::vector& keys) const -{ - std::vector out; - - if (!m_model_object) - return out; - - const DynamicPrintConfig& object_cfg = m_model_object->config; - const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; - std::unique_ptr default_cfg = nullptr; - - for (const std::string& key : keys) { - if (object_cfg.has(key)) - out.push_back(object_cfg.option(key)); - else - if (print_cfg.has(key)) - out.push_back(print_cfg.option(key)); - else { // we must get it from defaults - if (default_cfg == nullptr) - default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); - out.push_back(default_cfg->option(key)); - } - } - - return out; -} - - -void GLGizmoSlaSupports::update_cache_entry_normal(unsigned int i) const -{ - int idx = 0; - Eigen::Matrix pp = m_editing_mode_cache[i].support_point.pos; - Eigen::Matrix cc; - m_AABB.squared_distance(m_V, m_F, pp, idx, cc); - Vec3f a = (m_V.row(m_F(idx, 1)) - m_V.row(m_F(idx, 0))); - Vec3f b = (m_V.row(m_F(idx, 2)) - m_V.row(m_F(idx, 0))); - m_editing_mode_cache[i].normal = a.cross(b); -} - - - -#if ENABLE_IMGUI -void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) -{ - if (!m_model_object) - return; - - bool first_run = true; // This is a hack to redraw the button when all points are removed, - // so it is not delayed until the background process finishes. -RENDER_AGAIN: - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - - const float scaling = m_imgui->get_style_scaling(); - const ImVec2 window_size(285.f * scaling, 300.f * scaling); - ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); - ImGui::SetNextWindowSize(ImVec2(window_size)); - - m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - - ImGui::PushItemWidth(100.0f); - - bool force_refresh = false; - bool remove_selected = false; - bool remove_all = false; - - if (m_editing_mode) { - m_imgui->text(_(L("Left mouse click - add point"))); - m_imgui->text(_(L("Right mouse click - remove point"))); - m_imgui->text(_(L("Shift + Left (+ drag) - select point(s)"))); - m_imgui->text(" "); // vertical gap - - float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; - if (m_new_point_head_diameter > diameter_upper_cap) - m_new_point_head_diameter = diameter_upper_cap; - - m_imgui->text(_(L("Head diameter: "))); - ImGui::SameLine(); - if (ImGui::SliderFloat("", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f")) { - // value was changed - for (auto& cache_entry : m_editing_mode_cache) - if (cache_entry.selected) { - cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; - m_unsaved_changes = true; - } - } - - bool changed = m_lock_unique_islands; - m_imgui->checkbox(_(L("Lock supports under new islands")), m_lock_unique_islands); - force_refresh |= changed != m_lock_unique_islands; - - m_imgui->disabled_begin(m_selection_empty); - remove_selected = m_imgui->button(_(L("Remove selected points"))); - m_imgui->disabled_end(); - - m_imgui->disabled_begin(m_editing_mode_cache.empty()); - remove_all = m_imgui->button(_(L("Remove all points"))); - m_imgui->disabled_end(); - - m_imgui->text(" "); // vertical gap - - if (m_imgui->button(_(L("Apply changes")))) { - editing_mode_apply_changes(); - force_refresh = true; - } - ImGui::SameLine(); - bool discard_changes = m_imgui->button(_(L("Discard changes"))); - if (discard_changes) { - editing_mode_discard_changes(); - force_refresh = true; - } - } - else { // not in editing mode: - ImGui::PushItemWidth(100.0f); - m_imgui->text(_(L("Minimal points distance: "))); - ImGui::SameLine(); - - std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); - float density = static_cast(opts[0])->value; - float minimal_point_distance = static_cast(opts[1])->value; - - bool value_changed = ImGui::SliderFloat("", &minimal_point_distance, 0.f, 20.f, "%.f mm"); - if (value_changed) - m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - - m_imgui->text(_(L("Support points density: "))); - ImGui::SameLine(); - if (ImGui::SliderFloat(" ", &density, 0.f, 200.f, "%.f %%")) { - value_changed = true; - m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; - } - - if (value_changed) { // Update side panel - wxTheApp->CallAfter([]() { - wxGetApp().obj_settings()->UpdateAndShow(true); - wxGetApp().obj_list()->update_settings_items(); - }); - } - - bool generate = m_imgui->button(_(L("Auto-generate points [A]"))); - - if (generate) - auto_generate(); - - m_imgui->text(""); - if (m_imgui->button(_(L("Manual editing [M]")))) - switch_to_editing_mode(); - - m_imgui->disabled_begin(m_editing_mode_cache.empty()); - remove_all = m_imgui->button(_(L("Remove all points"))); - m_imgui->disabled_end(); - - m_imgui->text(""); - - m_imgui->text(m_model_object->sla_points_status == sla::PointsStatus::None ? "No points (will be autogenerated)" : - (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated ? "Autogenerated points (no modifications)" : - (m_model_object->sla_points_status == sla::PointsStatus::UserModified ? "User-modified points" : - (m_model_object->sla_points_status == sla::PointsStatus::Generating ? "Generation in progress..." : "UNKNOWN STATUS")))); - } - - m_imgui->end(); - - if (m_editing_mode != m_old_editing_state) { // user toggled between editing/non-editing mode - m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode); - force_refresh = true; - } - m_old_editing_state = m_editing_mode; - - if (remove_selected || remove_all) { - force_refresh = false; - m_parent.set_as_dirty(); - if (remove_all) - select_point(AllPoints); - delete_selected_points(remove_all); - if (remove_all && !m_editing_mode) - editing_mode_apply_changes(); - if (first_run) { - first_run = false; - goto RENDER_AGAIN; - } - } - - if (force_refresh) - m_parent.set_as_dirty(); -} -#endif // ENABLE_IMGUI - -bool GLGizmoSlaSupports::on_is_activable(const GLCanvas3D::Selection& selection) const -{ - if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA - || !selection.is_from_single_instance()) - return false; - - // Check that none of the selected volumes is outside. - const GLCanvas3D::Selection::IndicesList& list = selection.get_volume_idxs(); - for (const auto& idx : list) - if (selection.get_volume(idx)->is_outside) - return false; - - return true; -} - -bool GLGizmoSlaSupports::on_is_selectable() const -{ - return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA); -} - -std::string GLGizmoSlaSupports::on_get_name() const -{ - return L("SLA Support Points [L]"); -} - -void GLGizmoSlaSupports::on_set_state() -{ - if (m_state == On && m_old_state != On) { // the gizmo was just turned on - if (is_mesh_update_necessary()) - update_mesh(); - - // we'll now reload support points: - if (m_model_object) - editing_mode_reload_cache(); - - m_parent.toggle_model_objects_visibility(false); - if (m_model_object) - m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); - - // Set default head diameter from config. - const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; - m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; - } - if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off - if (m_model_object) { - if (m_unsaved_changes) { - wxMessageDialog dlg(GUI::wxGetApp().plater(), _(L("Do you want to save your manually edited support points ?\n")), - _(L("Save changes?")), wxICON_QUESTION | wxYES | wxNO); - if (dlg.ShowModal() == wxID_YES) - editing_mode_apply_changes(); - else - editing_mode_discard_changes(); - } - } - - m_parent.toggle_model_objects_visibility(true); - m_editing_mode = false; // so it is not active next time the gizmo opens - m_editing_mode_cache.clear(); - } - m_old_state = m_state; -} - - - -void GLGizmoSlaSupports::on_start_dragging(const GLCanvas3D::Selection& selection) -{ - if (m_hover_id != -1) { - select_point(NoPoints); - select_point(m_hover_id); - } -} - - - -void GLGizmoSlaSupports::select_point(int i) -{ - if (i == AllPoints || i == NoPoints) { - for (auto& point_and_selection : m_editing_mode_cache) - point_and_selection.selected = ( i == AllPoints ); - m_selection_empty = (i == NoPoints); - - if (i == AllPoints) - m_new_point_head_diameter = m_editing_mode_cache[0].support_point.head_front_radius * 2.f; - } - else { - m_editing_mode_cache[i].selected = true; - m_selection_empty = false; - m_new_point_head_diameter = m_editing_mode_cache[i].support_point.head_front_radius * 2.f; - } -} - - - -void GLGizmoSlaSupports::editing_mode_discard_changes() -{ - m_editing_mode_cache.clear(); - for (const sla::SupportPoint& point : m_model_object->sla_support_points) - m_editing_mode_cache.emplace_back(point, false); - m_editing_mode = false; - m_unsaved_changes = false; -} - - - -void GLGizmoSlaSupports::editing_mode_apply_changes() -{ - // If there are no changes, don't touch the front-end. The data in the cache could have been - // taken from the backend and copying them to ModelObject would needlessly invalidate them. - if (m_unsaved_changes) { - m_model_object->sla_points_status = sla::PointsStatus::UserModified; - m_model_object->sla_support_points.clear(); - for (const CacheEntry& cache_entry : m_editing_mode_cache) - m_model_object->sla_support_points.push_back(cache_entry.support_point); - - // Recalculate support structures once the editing mode is left. - // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - wxGetApp().plater()->reslice_SLA_supports(*m_model_object); - } - m_editing_mode = false; - m_unsaved_changes = false; -} - - - -void GLGizmoSlaSupports::editing_mode_reload_cache() -{ - m_editing_mode_cache.clear(); - for (const sla::SupportPoint& point : m_model_object->sla_support_points) - m_editing_mode_cache.emplace_back(point, false); - - m_unsaved_changes = false; -} - - - -void GLGizmoSlaSupports::get_data_from_backend() -{ - for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - if (po->model_object()->id() == m_model_object->id() && po->is_step_done(slaposSupportPoints)) { - m_editing_mode_cache.clear(); - const std::vector& points = po->get_support_points(); - auto mat = po->trafo().inverse().cast(); - for (unsigned int i=0; isla_points_status != sla::PointsStatus::UserModified) - m_model_object->sla_points_status = sla::PointsStatus::AutoGenerated; - - break; - } - } - m_unsaved_changes = false; - - // We don't copy the data into ModelObject, as this would stop the background processing. -} - - - -void GLGizmoSlaSupports::auto_generate() -{ - wxMessageDialog dlg(GUI::wxGetApp().plater(), _(L( - "Autogeneration will erase all manually edited points.\n\n" - "Are you sure you want to do it?\n" - )), _(L("Warning")), wxICON_WARNING | wxYES | wxNO); - - if (m_model_object->sla_points_status != sla::PointsStatus::UserModified || m_editing_mode_cache.empty() || dlg.ShowModal() == wxID_YES) { - m_model_object->sla_support_points.clear(); - m_model_object->sla_points_status = sla::PointsStatus::Generating; - m_editing_mode_cache.clear(); - wxGetApp().plater()->reslice_SLA_supports(*m_model_object); - } -} - - - -void GLGizmoSlaSupports::switch_to_editing_mode() -{ - if (m_model_object->sla_points_status != sla::PointsStatus::AutoGenerated) - editing_mode_reload_cache(); - m_unsaved_changes = false; - m_editing_mode = true; -} - - - - - - -// GLGizmoCut - -class GLGizmoCutPanel : public wxPanel -{ -public: - GLGizmoCutPanel(wxWindow *parent); - - void display(bool display); -private: - bool m_active; - wxCheckBox *m_cb_rotate; - wxButton *m_btn_cut; - wxButton *m_btn_cancel; -}; - -GLGizmoCutPanel::GLGizmoCutPanel(wxWindow *parent) - : wxPanel(parent) - , m_active(false) - , m_cb_rotate(new wxCheckBox(this, wxID_ANY, _(L("Rotate lower part upwards")))) - , m_btn_cut(new wxButton(this, wxID_OK, _(L("Perform cut")))) - , m_btn_cancel(new wxButton(this, wxID_CANCEL, _(L("Cancel")))) -{ - enum { MARGIN = 5 }; - - auto *sizer = new wxBoxSizer(wxHORIZONTAL); - - auto *label = new wxStaticText(this, wxID_ANY, _(L("Cut object:"))); - sizer->Add(label, 0, wxALL | wxALIGN_CENTER, MARGIN); - sizer->Add(m_cb_rotate, 0, wxALL | wxALIGN_CENTER, MARGIN); - sizer->AddStretchSpacer(); - sizer->Add(m_btn_cut, 0, wxALL | wxALIGN_CENTER, MARGIN); - sizer->Add(m_btn_cancel, 0, wxALL | wxALIGN_CENTER, MARGIN); - - SetSizer(sizer); -} - -void GLGizmoCutPanel::display(bool display) -{ - Show(display); - GetParent()->Layout(); -} - - -const double GLGizmoCut::Offset = 10.0; -const double GLGizmoCut::Margin = 20.0; -const std::array GLGizmoCut::GrabberColor = { 1.0, 0.5, 0.0 }; - -#if ENABLE_SVG_ICONS -GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -#else -GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id) - : GLGizmoBase(parent, sprite_id) -#endif // ENABLE_SVG_ICONS - , m_cut_z(0.0) - , m_max_z(0.0) -#if !ENABLE_IMGUI - , m_panel(nullptr) -#endif // not ENABLE_IMGUI - , m_keep_upper(true) - , m_keep_lower(true) - , m_rotate_lower(false) -{} - -#if !ENABLE_IMGUI -void GLGizmoCut::create_external_gizmo_widgets(wxWindow *parent) -{ - wxASSERT(m_panel == nullptr); - - m_panel = new GLGizmoCutPanel(parent); - parent->GetSizer()->Add(m_panel, 0, wxEXPAND); - - parent->Layout(); - parent->Fit(); - auto prev_heigh = parent->GetMinSize().GetHeight(); - parent->SetMinSize(wxSize(-1, std::max(prev_heigh, m_panel->GetSize().GetHeight()))); - - m_panel->Hide(); - m_panel->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { - perform_cut(m_parent.get_selection()); - }, wxID_OK); -} -#endif // not ENABLE_IMGUI - -bool GLGizmoCut::on_init() -{ - m_grabbers.emplace_back(); - m_shortcut_key = WXK_CONTROL_C; - return true; -} - -std::string GLGizmoCut::on_get_name() const -{ - return L("Cut [C]"); -} - -void GLGizmoCut::on_set_state() -{ - // Reset m_cut_z on gizmo activation - if (get_state() == On) { - m_cut_z = m_parent.get_selection().get_bounding_box().size()(2) / 2.0; - } - -#if !ENABLE_IMGUI - // Display or hide the extra panel - if (m_panel != nullptr) { - m_panel->display(get_state() == On); - } -#endif // not ENABLE_IMGUI -} - -bool GLGizmoCut::on_is_activable(const GLCanvas3D::Selection& selection) const -{ - return selection.is_single_full_instance() && !selection.is_wipe_tower(); -} - -void GLGizmoCut::on_start_dragging(const GLCanvas3D::Selection& selection) -{ - if (m_hover_id == -1) { return; } - - const BoundingBoxf3& box = selection.get_bounding_box(); - m_start_z = m_cut_z; - update_max_z(selection); - m_drag_pos = m_grabbers[m_hover_id].center; - m_drag_center = box.center(); - m_drag_center(2) = m_cut_z; -} - -void GLGizmoCut::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) -{ - if (m_hover_id != -1) { - set_cut_z(m_start_z + calc_projection(data.mouse_ray)); - } -} - -void GLGizmoCut::on_render(const GLCanvas3D::Selection& selection) const -{ - if (m_grabbers[0].dragging) { - set_tooltip("Z: " + format(m_cut_z, 2)); - } - - update_max_z(selection); - - const BoundingBoxf3& box = selection.get_bounding_box(); - Vec3d plane_center = box.center(); - plane_center(2) = m_cut_z; - - const float min_x = box.min(0) - Margin; - const float max_x = box.max(0) + Margin; - const float min_y = box.min(1) - Margin; - const float max_y = box.max(1) + Margin; - ::glEnable(GL_DEPTH_TEST); - ::glDisable(GL_CULL_FACE); - ::glEnable(GL_BLEND); - ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - // Draw the cutting plane - ::glBegin(GL_QUADS); - ::glColor4f(0.8f, 0.8f, 0.8f, 0.5f); - ::glVertex3f(min_x, min_y, plane_center(2)); - ::glVertex3f(max_x, min_y, plane_center(2)); - ::glVertex3f(max_x, max_y, plane_center(2)); - ::glVertex3f(min_x, max_y, plane_center(2)); - ::glEnd(); - - ::glEnable(GL_CULL_FACE); - ::glDisable(GL_BLEND); - - // TODO: draw cut part contour? - - // Draw the grabber and the connecting line - m_grabbers[0].center = plane_center; - m_grabbers[0].center(2) = plane_center(2) + Offset; - - ::glDisable(GL_DEPTH_TEST); - ::glLineWidth(m_hover_id != -1 ? 2.0f : 1.5f); - ::glColor3f(1.0, 1.0, 0.0); - ::glBegin(GL_LINES); - ::glVertex3dv(plane_center.data()); - ::glVertex3dv(m_grabbers[0].center.data()); - ::glEnd(); - - std::copy(std::begin(GrabberColor), std::end(GrabberColor), m_grabbers[0].color); - m_grabbers[0].render(m_hover_id == 0, box.max_size()); -} - -void GLGizmoCut::on_render_for_picking(const GLCanvas3D::Selection& selection) const -{ - ::glDisable(GL_DEPTH_TEST); - - render_grabbers_for_picking(selection.get_bounding_box()); -} - -#if ENABLE_IMGUI -void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) -{ - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(_(L("Cut")), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - - ImGui::PushItemWidth(100.0f); - bool _value_changed = ImGui::InputDouble("Z", &m_cut_z, 0.0f, 0.0f, "%.2f"); - - m_imgui->checkbox(_(L("Keep upper part")), m_keep_upper); - m_imgui->checkbox(_(L("Keep lower part")), m_keep_lower); - m_imgui->checkbox(_(L("Rotate lower part upwards")), m_rotate_lower); - - m_imgui->disabled_begin(!m_keep_upper && !m_keep_lower); - const bool cut_clicked = m_imgui->button(_(L("Perform cut"))); - m_imgui->disabled_end(); - - m_imgui->end(); - - if (cut_clicked && (m_keep_upper || m_keep_lower)) { - perform_cut(selection); - } -} -#endif // ENABLE_IMGUI - -void GLGizmoCut::update_max_z(const GLCanvas3D::Selection& selection) const -{ - m_max_z = selection.get_bounding_box().size()(2); - set_cut_z(m_cut_z); -} - -void GLGizmoCut::set_cut_z(double cut_z) const -{ - // Clamp the plane to the object's bounding box - m_cut_z = std::max(0.0, std::min(m_max_z, cut_z)); -} - -void GLGizmoCut::perform_cut(const GLCanvas3D::Selection& selection) -{ - const auto instance_idx = selection.get_instance_idx(); - const auto object_idx = selection.get_object_idx(); - - wxCHECK_RET(instance_idx >= 0 && object_idx >= 0, "GLGizmoCut: Invalid object selection"); - - wxGetApp().plater()->cut(object_idx, instance_idx, m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); -} - -double GLGizmoCut::calc_projection(const Linef3& mouse_ray) const -{ - double projection = 0.0; - - const Vec3d starting_vec = m_drag_pos - m_drag_center; - const double len_starting_vec = starting_vec.norm(); - if (len_starting_vec != 0.0) - { - Vec3d mouse_dir = mouse_ray.unit_vector(); - // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position - // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form - // in our case plane normal and ray direction are the same (orthogonal view) - // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - Vec3d inters = mouse_ray.a + (m_drag_pos - mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; - // vector from the starting position to the found intersection - Vec3d inters_vec = inters - m_drag_pos; - - // finds projection of the vector along the staring direction - projection = inters_vec.dot(starting_vec.normalized()); - } - return projection; -} - - -} // namespace GUI -} // namespace Slic3r diff --git a/src/slic3r/GUI/GLGizmo.hpp b/src/slic3r/GUI/GLGizmo.hpp deleted file mode 100644 index 4e44da540..000000000 --- a/src/slic3r/GUI/GLGizmo.hpp +++ /dev/null @@ -1,647 +0,0 @@ -#ifndef slic3r_GLGizmo_hpp_ -#define slic3r_GLGizmo_hpp_ - -#include - -#include "../../slic3r/GUI/GLTexture.hpp" -#include "../../slic3r/GUI/GLCanvas3D.hpp" - -#include "libslic3r/Point.hpp" -#include "libslic3r/BoundingBox.hpp" -#include "libslic3r/SLA/SLAAutoSupports.hpp" - -#include -#include -#include - - -class wxWindow; -class GLUquadric; -typedef class GLUquadric GLUquadricObj; - - -namespace Slic3r { - -class BoundingBoxf3; -class Linef3; -class ModelObject; - -namespace GUI { - -class GLCanvas3D; -#if ENABLE_IMGUI -class ImGuiWrapper; -#endif // ENABLE_IMGUI - -class GLGizmoBase -{ -public: - // Starting value for ids to avoid clashing with ids used by GLVolumes - // (254 is choosen to leave some space for forward compatibility) - static const unsigned int BASE_ID = 255 * 255 * 254; - -protected: - struct Grabber - { - static const float SizeFactor; - static const float MinHalfSize; - static const float DraggingScaleFactor; - - Vec3d center; - Vec3d angles; - float color[3]; - bool enabled; - bool dragging; - - Grabber(); - - void render(bool hover, float size) const; - void render_for_picking(float size) const { render(size, color, false); } - - float get_half_size(float size) const; - float get_dragging_half_size(float size) const; - - private: - void render(float size, const float* render_color, bool use_lighting) const; - void render_face(float half_size) const; - }; - -public: - enum EState - { - Off, - Hover, - On, - Num_States - }; - - struct UpdateData - { - const Linef3 mouse_ray; - const Point* mouse_pos; - bool shift_down; - - UpdateData(const Linef3& mouse_ray, const Point* mouse_pos = nullptr, bool shift_down = false) - : mouse_ray(mouse_ray), mouse_pos(mouse_pos), shift_down(shift_down) - {} - }; - -protected: - GLCanvas3D& m_parent; - - int m_group_id; - EState m_state; - int m_shortcut_key; -#if ENABLE_SVG_ICONS - std::string m_icon_filename; -#endif // ENABLE_SVG_ICONS - unsigned int m_sprite_id; - int m_hover_id; - bool m_dragging; - float m_base_color[3]; - float m_drag_color[3]; - float m_highlight_color[3]; - mutable std::vector m_grabbers; -#if ENABLE_IMGUI - ImGuiWrapper* m_imgui; -#endif // ENABLE_IMGUI - -public: -#if ENABLE_SVG_ICONS - GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); -#else - GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id); -#endif // ENABLE_SVG_ICONS - virtual ~GLGizmoBase() {} - - bool init() { return on_init(); } - - std::string get_name() const { return on_get_name(); } - - int get_group_id() const { return m_group_id; } - void set_group_id(int id) { m_group_id = id; } - - EState get_state() const { return m_state; } - void set_state(EState state) { m_state = state; on_set_state(); } - - int get_shortcut_key() const { return m_shortcut_key; } - void set_shortcut_key(int key) { m_shortcut_key = key; } - -#if ENABLE_SVG_ICONS - const std::string& get_icon_filename() const { return m_icon_filename; } -#endif // ENABLE_SVG_ICONS - - bool is_activable(const GLCanvas3D::Selection& selection) const { return on_is_activable(selection); } - bool is_selectable() const { return on_is_selectable(); } - - unsigned int get_sprite_id() const { return m_sprite_id; } - - int get_hover_id() const { return m_hover_id; } - void set_hover_id(int id); - - void set_highlight_color(const float* color); - - void enable_grabber(unsigned int id); - void disable_grabber(unsigned int id); - - void start_dragging(const GLCanvas3D::Selection& selection); - void stop_dragging(); - bool is_dragging() const { return m_dragging; } - - void update(const UpdateData& data, const GLCanvas3D::Selection& selection); - - void render(const GLCanvas3D::Selection& selection) const { on_render(selection); } - void render_for_picking(const GLCanvas3D::Selection& selection) const { on_render_for_picking(selection); } - -#if !ENABLE_IMGUI - virtual void create_external_gizmo_widgets(wxWindow *parent); -#endif // not ENABLE_IMGUI - -#if ENABLE_IMGUI - void render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { on_render_input_window(x, y, bottom_limit, selection); } -#endif // ENABLE_IMGUI - -protected: - virtual bool on_init() = 0; - virtual std::string on_get_name() const = 0; - virtual void on_set_state() {} - virtual void on_set_hover_id() {} - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return true; } - virtual bool on_is_selectable() const { return true; } - virtual void on_enable_grabber(unsigned int id) {} - virtual void on_disable_grabber(unsigned int id) {} - virtual void on_start_dragging(const GLCanvas3D::Selection& selection) {} - virtual void on_stop_dragging() {} - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) = 0; - virtual void on_render(const GLCanvas3D::Selection& selection) const = 0; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const = 0; - -#if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) {} -#endif // ENABLE_IMGUI - - // Returns the picking color for the given id, based on the BASE_ID constant - // No check is made for clashing with other picking color (i.e. GLVolumes) - std::array picking_color_component(unsigned int id) const; - void render_grabbers(const BoundingBoxf3& box) const; - void render_grabbers(float size) const; - void render_grabbers_for_picking(const BoundingBoxf3& box) const; - - void set_tooltip(const std::string& tooltip) const; - std::string format(float value, unsigned int decimals) const; -}; - -class GLGizmoRotate : public GLGizmoBase -{ - static const float Offset; - static const unsigned int CircleResolution; - static const unsigned int AngleResolution; - static const unsigned int ScaleStepsCount; - static const float ScaleStepRad; - static const unsigned int ScaleLongEvery; - static const float ScaleLongTooth; - static const unsigned int SnapRegionsCount; - static const float GrabberOffset; - -public: - enum Axis : unsigned char - { - X, - Y, - Z - }; - -private: - Axis m_axis; - double m_angle; - - GLUquadricObj* m_quadric; - - mutable Vec3d m_center; - mutable float m_radius; - - mutable float m_snap_coarse_in_radius; - mutable float m_snap_coarse_out_radius; - mutable float m_snap_fine_in_radius; - mutable float m_snap_fine_out_radius; - -public: - GLGizmoRotate(GLCanvas3D& parent, Axis axis); - GLGizmoRotate(const GLGizmoRotate& other); - virtual ~GLGizmoRotate(); - - double get_angle() const { return m_angle; } - void set_angle(double angle); - -protected: - virtual bool on_init(); - virtual std::string on_get_name() const { return ""; } - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - -private: - void render_circle() const; - void render_scale() const; - void render_snap_radii() const; - void render_reference_radius() const; - void render_angle() const; - void render_grabber(const BoundingBoxf3& box) const; - void render_grabber_extension(const BoundingBoxf3& box, bool picking) const; - - void transform_to_local(const GLCanvas3D::Selection& selection) const; - // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate - Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const GLCanvas3D::Selection& selection) const; -}; - -class GLGizmoRotate3D : public GLGizmoBase -{ - std::vector m_gizmos; - -public: -#if ENABLE_SVG_ICONS - GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); -#else - GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id); -#endif // ENABLE_SVG_ICONS - - Vec3d get_rotation() const { return Vec3d(m_gizmos[X].get_angle(), m_gizmos[Y].get_angle(), m_gizmos[Z].get_angle()); } - void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation(0)); m_gizmos[Y].set_angle(rotation(1)); m_gizmos[Z].set_angle(rotation(2)); } - -protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual void on_set_state() - { - for (GLGizmoRotate& g : m_gizmos) - { - g.set_state(m_state); - } - } - virtual void on_set_hover_id() - { - for (unsigned int i = 0; i < 3; ++i) - { - m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1); - } - } - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); } - virtual void on_enable_grabber(unsigned int id) - { - if ((0 <= id) && (id < 3)) - m_gizmos[id].enable_grabber(0); - } - virtual void on_disable_grabber(unsigned int id) - { - if ((0 <= id) && (id < 3)) - m_gizmos[id].disable_grabber(0); - } - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_stop_dragging(); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) - { - for (GLGizmoRotate& g : m_gizmos) - { - g.update(data, selection); - } - } - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const - { - for (const GLGizmoRotate& g : m_gizmos) - { - g.render_for_picking(selection); - } - } - -#if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); -#endif // ENABLE_IMGUI -}; - -class GLGizmoScale3D : public GLGizmoBase -{ - static const float Offset; - - mutable BoundingBoxf3 m_box; - - Vec3d m_scale; - - double m_snap_step; - - Vec3d m_starting_scale; - Vec3d m_starting_drag_position; - BoundingBoxf3 m_starting_box; - -public: -#if ENABLE_SVG_ICONS - GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); -#else - GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id); -#endif // ENABLE_SVG_ICONS - - double get_snap_step(double step) const { return m_snap_step; } - void set_snap_step(double step) { m_snap_step = step; } - - const Vec3d& get_scale() const { return m_scale; } - void set_scale(const Vec3d& scale) { m_starting_scale = scale; m_scale = scale; } - -protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); } - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - -#if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); -#endif // ENABLE_IMGUI - -private: - void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; - - void do_scale_x(const UpdateData& data); - void do_scale_y(const UpdateData& data); - void do_scale_z(const UpdateData& data); - void do_scale_uniform(const UpdateData& data); - - double calc_ratio(const UpdateData& data) const; -}; - -class GLGizmoMove3D : public GLGizmoBase -{ - static const double Offset; - - Vec3d m_displacement; - - double m_snap_step; - - Vec3d m_starting_drag_position; - Vec3d m_starting_box_center; - Vec3d m_starting_box_bottom_center; - - GLUquadricObj* m_quadric; - -public: -#if ENABLE_SVG_ICONS - GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); -#else - GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id); -#endif // ENABLE_SVG_ICONS - virtual ~GLGizmoMove3D(); - - double get_snap_step(double step) const { return m_snap_step; } - void set_snap_step(double step) { m_snap_step = step; } - - const Vec3d& get_displacement() const { return m_displacement; } - -protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_stop_dragging(); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - -#if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); -#endif // ENABLE_IMGUI - -private: - double calc_projection(const UpdateData& data) const; - void render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const; -}; - -class GLGizmoFlatten : public GLGizmoBase -{ -// This gizmo does not use grabbers. The m_hover_id relates to polygon managed by the class itself. - -private: - mutable Vec3d m_normal; - - struct PlaneData { - std::vector vertices; - Vec3d normal; - float area; - }; - - // This holds information to decide whether recalculation is necessary: - std::vector m_volumes_matrices; - std::vector m_volumes_types; - Vec3d m_first_instance_scale; - Vec3d m_first_instance_mirror; - - std::vector m_planes; - bool m_planes_valid = false; - mutable Vec3d m_starting_center; - const ModelObject* m_model_object = nullptr; - std::vector instances_matrices; - - void update_planes(); - bool is_plane_update_necessary() const; - -public: -#if ENABLE_SVG_ICONS - GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); -#else - GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id); -#endif // ENABLE_SVG_ICONS - - void set_flattening_data(const ModelObject* model_object); - Vec3d get_flattening_normal() const; - -protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) {} - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - virtual void on_set_state() - { - if (m_state == On && is_plane_update_necessary()) - update_planes(); - } -}; - -#define SLAGIZMO_IMGUI_MODAL 0 - -class GLGizmoSlaSupports : public GLGizmoBase -{ -private: - ModelObject* m_model_object = nullptr; - ModelObject* m_old_model_object = nullptr; - int m_active_instance = -1; - int m_old_instance_id = -1; - std::pair unproject_on_mesh(const Vec2d& mouse_pos); - - const float RenderPointScale = 1.f; - - GLUquadricObj* m_quadric; - Eigen::MatrixXf m_V; // vertices - Eigen::MatrixXi m_F; // facets indices - igl::AABB m_AABB; - - struct SourceDataSummary { - Geometry::Transformation transformation; - }; - - class CacheEntry { - public: - CacheEntry(const sla::SupportPoint& point, bool sel, const Vec3f& norm = Vec3f::Zero()) : - support_point(point), selected(sel), normal(norm) {} - - sla::SupportPoint support_point; - bool selected; // whether the point is selected - Vec3f normal; - }; - - // This holds information to decide whether recalculation is necessary: - SourceDataSummary m_source_data; - - mutable Vec3d m_starting_center; - -public: -#if ENABLE_SVG_ICONS - GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); -#else - GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id); -#endif // ENABLE_SVG_ICONS - virtual ~GLGizmoSlaSupports(); - void set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection); - bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down); - void delete_selected_points(bool force = false); - -private: - bool on_init(); - void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - - void render_selection_rectangle() const; - void render_points(const GLCanvas3D::Selection& selection, bool picking = false) const; - bool is_mesh_update_necessary() const; - void update_mesh(); - void update_cache_entry_normal(unsigned int i) const; - -#if !ENABLE_IMGUI - void render_tooltip_texture() const; - mutable GLTexture m_tooltip_texture; - mutable GLTexture m_reset_texture; -#endif // not ENABLE_IMGUI - - bool m_lock_unique_islands = false; - bool m_editing_mode = false; // Is editing mode active? - bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). - float m_new_point_head_diameter; // Size of a new point. - float m_minimal_point_distance = 20.f; - float m_density = 100.f; - mutable std::vector m_editing_mode_cache; // a support point and whether it is currently selected - - bool m_selection_rectangle_active = false; - Vec2d m_selection_rectangle_start_corner; - Vec2d m_selection_rectangle_end_corner; - bool m_ignore_up_event = false; - bool m_combo_box_open = false; // To ensure proper rendering of the imgui combobox. - bool m_unsaved_changes = false; // Are there unsaved changes in manual mode? - bool m_selection_empty = true; - EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) - int m_canvas_width; - int m_canvas_height; - - std::vector get_config_options(const std::vector& keys) const; - - // Methods that do the model_object and editing cache synchronization, - // editing mode selection, etc: - enum { - AllPoints = -2, - NoPoints, - }; - void select_point(int i); - void editing_mode_apply_changes(); - void editing_mode_discard_changes(); - void editing_mode_reload_cache(); - void get_data_from_backend(); - void auto_generate(); - void switch_to_editing_mode(); - -protected: - void on_set_state() override; - void on_start_dragging(const GLCanvas3D::Selection& selection) override; - -#if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) override; -#endif // ENABLE_IMGUI - - virtual std::string on_get_name() const; - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; - virtual bool on_is_selectable() const; -}; - - -#if !ENABLE_IMGUI -class GLGizmoCutPanel; -#endif // not ENABLE_IMGUI - -class GLGizmoCut : public GLGizmoBase -{ - static const double Offset; - static const double Margin; - static const std::array GrabberColor; - - mutable double m_cut_z; - double m_start_z; - mutable double m_max_z; - Vec3d m_drag_pos; - Vec3d m_drag_center; - bool m_keep_upper; - bool m_keep_lower; - bool m_rotate_lower; -#if !ENABLE_IMGUI - GLGizmoCutPanel *m_panel; -#endif // not ENABLE_IMGUI - -public: -#if ENABLE_SVG_ICONS - GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); -#else - GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id); -#endif // ENABLE_SVG_ICONS - -#if !ENABLE_IMGUI - virtual void create_external_gizmo_widgets(wxWindow *parent); -#endif // not ENABLE_IMGUI -#if !ENABLE_IMGUI -#endif // not ENABLE_IMGUI - -protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual void on_set_state(); - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - -#if ENABLE_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); -#endif // ENABLE_IMGUI -private: - void update_max_z(const GLCanvas3D::Selection& selection) const; - void set_cut_z(double cut_z) const; - void perform_cut(const GLCanvas3D::Selection& selection); - double calc_projection(const Linef3& mouse_ray) const; -}; - - -} // namespace GUI -} // namespace Slic3r - -#endif // slic3r_GLGizmo_hpp_ - diff --git a/src/slic3r/GUI/GLTexture.hpp b/src/slic3r/GUI/GLTexture.hpp index 017255647..e00b3a3be 100644 --- a/src/slic3r/GUI/GLTexture.hpp +++ b/src/slic3r/GUI/GLTexture.hpp @@ -2,6 +2,7 @@ #define slic3r_GLTexture_hpp_ #include +#include class wxImage; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp new file mode 100644 index 000000000..3c3f68371 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -0,0 +1,286 @@ +#include "GLGizmoBase.hpp" + +#include + +#include "slic3r/GUI/GUI_App.hpp" + + + + + +// TODO: Display tooltips quicker on Linux + + + +namespace Slic3r { +namespace GUI { + +const float GLGizmoBase::Grabber::SizeFactor = 0.025f; +const float GLGizmoBase::Grabber::MinHalfSize = 1.5f; +const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f; + +GLGizmoBase::Grabber::Grabber() + : center(Vec3d::Zero()) + , angles(Vec3d::Zero()) + , dragging(false) + , enabled(true) +{ + color[0] = 1.0f; + color[1] = 1.0f; + color[2] = 1.0f; +} + +void GLGizmoBase::Grabber::render(bool hover, float size) const +{ + float render_color[3]; + if (hover) + { + render_color[0] = 1.0f - color[0]; + render_color[1] = 1.0f - color[1]; + render_color[2] = 1.0f - color[2]; + } + else + ::memcpy((void*)render_color, (const void*)color, 3 * sizeof(float)); + + render(size, render_color, true); +} + +float GLGizmoBase::Grabber::get_half_size(float size) const +{ + return std::max(size * SizeFactor, MinHalfSize); +} + +float GLGizmoBase::Grabber::get_dragging_half_size(float size) const +{ + return std::max(size * SizeFactor * DraggingScaleFactor, MinHalfSize); +} + +void GLGizmoBase::Grabber::render(float size, const float* render_color, bool use_lighting) const +{ + float half_size = dragging ? get_dragging_half_size(size) : get_half_size(size); + + if (use_lighting) + ::glEnable(GL_LIGHTING); + + ::glColor3fv(render_color); + + ::glPushMatrix(); + ::glTranslated(center(0), center(1), center(2)); + + ::glRotated(Geometry::rad2deg(angles(2)), 0.0, 0.0, 1.0); + ::glRotated(Geometry::rad2deg(angles(1)), 0.0, 1.0, 0.0); + ::glRotated(Geometry::rad2deg(angles(0)), 1.0, 0.0, 0.0); + + // face min x + ::glPushMatrix(); + ::glTranslatef(-(GLfloat)half_size, 0.0f, 0.0f); + ::glRotatef(-90.0f, 0.0f, 1.0f, 0.0f); + render_face(half_size); + ::glPopMatrix(); + + // face max x + ::glPushMatrix(); + ::glTranslatef((GLfloat)half_size, 0.0f, 0.0f); + ::glRotatef(90.0f, 0.0f, 1.0f, 0.0f); + render_face(half_size); + ::glPopMatrix(); + + // face min y + ::glPushMatrix(); + ::glTranslatef(0.0f, -(GLfloat)half_size, 0.0f); + ::glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + render_face(half_size); + ::glPopMatrix(); + + // face max y + ::glPushMatrix(); + ::glTranslatef(0.0f, (GLfloat)half_size, 0.0f); + ::glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); + render_face(half_size); + ::glPopMatrix(); + + // face min z + ::glPushMatrix(); + ::glTranslatef(0.0f, 0.0f, -(GLfloat)half_size); + ::glRotatef(180.0f, 1.0f, 0.0f, 0.0f); + render_face(half_size); + ::glPopMatrix(); + + // face max z + ::glPushMatrix(); + ::glTranslatef(0.0f, 0.0f, (GLfloat)half_size); + render_face(half_size); + ::glPopMatrix(); + + ::glPopMatrix(); + + if (use_lighting) + ::glDisable(GL_LIGHTING); +} + +void GLGizmoBase::Grabber::render_face(float half_size) const +{ + ::glBegin(GL_TRIANGLES); + ::glNormal3f(0.0f, 0.0f, 1.0f); + ::glVertex3f(-(GLfloat)half_size, -(GLfloat)half_size, 0.0f); + ::glVertex3f((GLfloat)half_size, -(GLfloat)half_size, 0.0f); + ::glVertex3f((GLfloat)half_size, (GLfloat)half_size, 0.0f); + ::glVertex3f((GLfloat)half_size, (GLfloat)half_size, 0.0f); + ::glVertex3f(-(GLfloat)half_size, (GLfloat)half_size, 0.0f); + ::glVertex3f(-(GLfloat)half_size, -(GLfloat)half_size, 0.0f); + ::glEnd(); +} + +#if ENABLE_SVG_ICONS +GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) +#else +GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id) +#endif // ENABLE_SVG_ICONS + : m_parent(parent) + , m_group_id(-1) + , m_state(Off) + , m_shortcut_key(0) +#if ENABLE_SVG_ICONS + , m_icon_filename(icon_filename) +#endif // ENABLE_SVG_ICONS + , m_sprite_id(sprite_id) + , m_hover_id(-1) + , m_dragging(false) +#if ENABLE_IMGUI + , m_imgui(wxGetApp().imgui()) +#endif // ENABLE_IMGUI +{ + ::memcpy((void*)m_base_color, (const void*)DEFAULT_BASE_COLOR, 3 * sizeof(float)); + ::memcpy((void*)m_drag_color, (const void*)DEFAULT_DRAG_COLOR, 3 * sizeof(float)); + ::memcpy((void*)m_highlight_color, (const void*)DEFAULT_HIGHLIGHT_COLOR, 3 * sizeof(float)); +} + +void GLGizmoBase::set_hover_id(int id) +{ + if (m_grabbers.empty() || (id < (int)m_grabbers.size())) + { + m_hover_id = id; + on_set_hover_id(); + } +} + +void GLGizmoBase::set_highlight_color(const float* color) +{ + if (color != nullptr) + ::memcpy((void*)m_highlight_color, (const void*)color, 3 * sizeof(float)); +} + +void GLGizmoBase::enable_grabber(unsigned int id) +{ + if ((0 <= id) && (id < (unsigned int)m_grabbers.size())) + m_grabbers[id].enabled = true; + + on_enable_grabber(id); +} + +void GLGizmoBase::disable_grabber(unsigned int id) +{ + if ((0 <= id) && (id < (unsigned int)m_grabbers.size())) + m_grabbers[id].enabled = false; + + on_disable_grabber(id); +} + +void GLGizmoBase::start_dragging(const GLCanvas3D::Selection& selection) +{ + m_dragging = true; + + for (int i = 0; i < (int)m_grabbers.size(); ++i) + { + m_grabbers[i].dragging = (m_hover_id == i); + } + + on_start_dragging(selection); +} + +void GLGizmoBase::stop_dragging() +{ + m_dragging = false; + + for (int i = 0; i < (int)m_grabbers.size(); ++i) + { + m_grabbers[i].dragging = false; + } + + on_stop_dragging(); +} + +void GLGizmoBase::update(const UpdateData& data, const GLCanvas3D::Selection& selection) +{ + if (m_hover_id != -1) + on_update(data, selection); +} + +std::array GLGizmoBase::picking_color_component(unsigned int id) const +{ + static const float INV_255 = 1.0f / 255.0f; + + id = BASE_ID - id; + + if (m_group_id > -1) + id -= m_group_id; + + // color components are encoded to match the calculation of volume_id made into GLCanvas3D::_picking_pass() + return std::array { (float)((id >> 0) & 0xff) * INV_255, // red + (float)((id >> 8) & 0xff) * INV_255, // green + (float)((id >> 16) & 0xff) * INV_255 }; // blue +} + +void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const +{ + float size = (float)box.max_size(); + + for (int i = 0; i < (int)m_grabbers.size(); ++i) + { + if (m_grabbers[i].enabled) + m_grabbers[i].render((m_hover_id == i), size); + } +} + +void GLGizmoBase::render_grabbers(float size) const +{ + for (int i = 0; i < (int)m_grabbers.size(); ++i) + { + if (m_grabbers[i].enabled) + m_grabbers[i].render((m_hover_id == i), size); + } +} + +void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const +{ + float size = (float)box.max_size(); + + for (unsigned int i = 0; i < (unsigned int)m_grabbers.size(); ++i) + { + if (m_grabbers[i].enabled) + { + std::array color = picking_color_component(i); + m_grabbers[i].color[0] = color[0]; + m_grabbers[i].color[1] = color[1]; + m_grabbers[i].color[2] = color[2]; + m_grabbers[i].render_for_picking(size); + } + } +} + +#if !ENABLE_IMGUI +void GLGizmoBase::create_external_gizmo_widgets(wxWindow *parent) {} +#endif // not ENABLE_IMGUI + +void GLGizmoBase::set_tooltip(const std::string& tooltip) const +{ + m_parent.set_tooltip(tooltip); +} + +std::string GLGizmoBase::format(float value, unsigned int decimals) const +{ + return Slic3r::string_printf("%.*f", decimals, value); +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp new file mode 100644 index 000000000..3abd2e607 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -0,0 +1,196 @@ +#ifndef slic3r_GLGizmoBase_hpp_ +#define slic3r_GLGizmoBase_hpp_ + +#include "libslic3r/Point.hpp" + +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/I18N.hpp" + + +class wxWindow; +class GLUquadric; +typedef class GLUquadric GLUquadricObj; + + +namespace Slic3r { + +class BoundingBoxf3; +class Linef3; +class ModelObject; + +namespace GUI { + +static const float DEFAULT_BASE_COLOR[3] = { 0.625f, 0.625f, 0.625f }; +static const float DEFAULT_DRAG_COLOR[3] = { 1.0f, 1.0f, 1.0f }; +static const float DEFAULT_HIGHLIGHT_COLOR[3] = { 1.0f, 0.38f, 0.0f }; +static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } }; + + + +#if ENABLE_IMGUI +class ImGuiWrapper; +#endif // ENABLE_IMGUI + + +class GLGizmoBase +{ +public: + // Starting value for ids to avoid clashing with ids used by GLVolumes + // (254 is choosen to leave some space for forward compatibility) + static const unsigned int BASE_ID = 255 * 255 * 254; + +protected: + struct Grabber + { + static const float SizeFactor; + static const float MinHalfSize; + static const float DraggingScaleFactor; + + Vec3d center; + Vec3d angles; + float color[3]; + bool enabled; + bool dragging; + + Grabber(); + + void render(bool hover, float size) const; + void render_for_picking(float size) const { render(size, color, false); } + + float get_half_size(float size) const; + float get_dragging_half_size(float size) const; + + private: + void render(float size, const float* render_color, bool use_lighting) const; + void render_face(float half_size) const; + }; + +public: + enum EState + { + Off, + Hover, + On, + Num_States + }; + + struct UpdateData + { + const Linef3 mouse_ray; + const Point* mouse_pos; + bool shift_down; + + UpdateData(const Linef3& mouse_ray, const Point* mouse_pos = nullptr, bool shift_down = false) + : mouse_ray(mouse_ray), mouse_pos(mouse_pos), shift_down(shift_down) + {} + }; + +protected: + GLCanvas3D& m_parent; + + int m_group_id; + EState m_state; + int m_shortcut_key; +#if ENABLE_SVG_ICONS + std::string m_icon_filename; +#endif // ENABLE_SVG_ICONS + unsigned int m_sprite_id; + int m_hover_id; + bool m_dragging; + float m_base_color[3]; + float m_drag_color[3]; + float m_highlight_color[3]; + mutable std::vector m_grabbers; +#if ENABLE_IMGUI + ImGuiWrapper* m_imgui; +#endif // ENABLE_IMGUI + +public: +#if ENABLE_SVG_ICONS + GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); +#else + GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id); +#endif // ENABLE_SVG_ICONS + virtual ~GLGizmoBase() {} + + bool init() { return on_init(); } + + std::string get_name() const { return on_get_name(); } + + int get_group_id() const { return m_group_id; } + void set_group_id(int id) { m_group_id = id; } + + EState get_state() const { return m_state; } + void set_state(EState state) { m_state = state; on_set_state(); } + + int get_shortcut_key() const { return m_shortcut_key; } + void set_shortcut_key(int key) { m_shortcut_key = key; } + +#if ENABLE_SVG_ICONS + const std::string& get_icon_filename() const { return m_icon_filename; } +#endif // ENABLE_SVG_ICONS + + bool is_activable(const GLCanvas3D::Selection& selection) const { return on_is_activable(selection); } + bool is_selectable() const { return on_is_selectable(); } + + unsigned int get_sprite_id() const { return m_sprite_id; } + + int get_hover_id() const { return m_hover_id; } + void set_hover_id(int id); + + void set_highlight_color(const float* color); + + void enable_grabber(unsigned int id); + void disable_grabber(unsigned int id); + + void start_dragging(const GLCanvas3D::Selection& selection); + void stop_dragging(); + bool is_dragging() const { return m_dragging; } + + void update(const UpdateData& data, const GLCanvas3D::Selection& selection); + + void render(const GLCanvas3D::Selection& selection) const { on_render(selection); } + void render_for_picking(const GLCanvas3D::Selection& selection) const { on_render_for_picking(selection); } + +#if !ENABLE_IMGUI + virtual void create_external_gizmo_widgets(wxWindow *parent); +#endif // not ENABLE_IMGUI + +#if ENABLE_IMGUI + void render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { on_render_input_window(x, y, bottom_limit, selection); } +#endif // ENABLE_IMGUI + +protected: + virtual bool on_init() = 0; + virtual std::string on_get_name() const = 0; + virtual void on_set_state() {} + virtual void on_set_hover_id() {} + virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return true; } + virtual bool on_is_selectable() const { return true; } + virtual void on_enable_grabber(unsigned int id) {} + virtual void on_disable_grabber(unsigned int id) {} + virtual void on_start_dragging(const GLCanvas3D::Selection& selection) {} + virtual void on_stop_dragging() {} + virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) = 0; + virtual void on_render(const GLCanvas3D::Selection& selection) const = 0; + virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const = 0; + +#if ENABLE_IMGUI + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) {} +#endif // ENABLE_IMGUI + + // Returns the picking color for the given id, based on the BASE_ID constant + // No check is made for clashing with other picking color (i.e. GLVolumes) + std::array picking_color_component(unsigned int id) const; + void render_grabbers(const BoundingBoxf3& box) const; + void render_grabbers(float size) const; + void render_grabbers_for_picking(const BoundingBoxf3& box) const; + + void set_tooltip(const std::string& tooltip) const; + std::string format(float value, unsigned int decimals) const; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoBase_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp new file mode 100644 index 000000000..bd29b1288 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -0,0 +1,288 @@ +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoCut.hpp" + +#include + +#include +#include +#include +#include + +#include "slic3r/GUI/GUI_App.hpp" + + +namespace Slic3r { +namespace GUI { + + + + + + +// GLGizmoCut + +class GLGizmoCutPanel : public wxPanel +{ +public: + GLGizmoCutPanel(wxWindow *parent); + + void display(bool display); +private: + bool m_active; + wxCheckBox *m_cb_rotate; + wxButton *m_btn_cut; + wxButton *m_btn_cancel; +}; + +GLGizmoCutPanel::GLGizmoCutPanel(wxWindow *parent) + : wxPanel(parent) + , m_active(false) + , m_cb_rotate(new wxCheckBox(this, wxID_ANY, _(L("Rotate lower part upwards")))) + , m_btn_cut(new wxButton(this, wxID_OK, _(L("Perform cut")))) + , m_btn_cancel(new wxButton(this, wxID_CANCEL, _(L("Cancel")))) +{ + enum { MARGIN = 5 }; + + auto *sizer = new wxBoxSizer(wxHORIZONTAL); + + auto *label = new wxStaticText(this, wxID_ANY, _(L("Cut object:"))); + sizer->Add(label, 0, wxALL | wxALIGN_CENTER, MARGIN); + sizer->Add(m_cb_rotate, 0, wxALL | wxALIGN_CENTER, MARGIN); + sizer->AddStretchSpacer(); + sizer->Add(m_btn_cut, 0, wxALL | wxALIGN_CENTER, MARGIN); + sizer->Add(m_btn_cancel, 0, wxALL | wxALIGN_CENTER, MARGIN); + + SetSizer(sizer); +} + +void GLGizmoCutPanel::display(bool display) +{ + Show(display); + GetParent()->Layout(); +} + + +const double GLGizmoCut::Offset = 10.0; +const double GLGizmoCut::Margin = 20.0; +const std::array GLGizmoCut::GrabberColor = { 1.0, 0.5, 0.0 }; + +#if ENABLE_SVG_ICONS +GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +#else +GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#endif // ENABLE_SVG_ICONS + , m_cut_z(0.0) + , m_max_z(0.0) +#if !ENABLE_IMGUI + , m_panel(nullptr) +#endif // not ENABLE_IMGUI + , m_keep_upper(true) + , m_keep_lower(true) + , m_rotate_lower(false) +{} + +#if !ENABLE_IMGUI +void GLGizmoCut::create_external_gizmo_widgets(wxWindow *parent) +{ + wxASSERT(m_panel == nullptr); + + m_panel = new GLGizmoCutPanel(parent); + parent->GetSizer()->Add(m_panel, 0, wxEXPAND); + + parent->Layout(); + parent->Fit(); + auto prev_heigh = parent->GetMinSize().GetHeight(); + parent->SetMinSize(wxSize(-1, std::max(prev_heigh, m_panel->GetSize().GetHeight()))); + + m_panel->Hide(); + m_panel->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { + perform_cut(m_parent.get_selection()); + }, wxID_OK); +} +#endif // not ENABLE_IMGUI + +bool GLGizmoCut::on_init() +{ + m_grabbers.emplace_back(); + m_shortcut_key = WXK_CONTROL_C; + return true; +} + +std::string GLGizmoCut::on_get_name() const +{ + return L("Cut [C]"); +} + +void GLGizmoCut::on_set_state() +{ + // Reset m_cut_z on gizmo activation + if (get_state() == On) { + m_cut_z = m_parent.get_selection().get_bounding_box().size()(2) / 2.0; + } + +#if !ENABLE_IMGUI + // Display or hide the extra panel + if (m_panel != nullptr) { + m_panel->display(get_state() == On); + } +#endif // not ENABLE_IMGUI +} + +bool GLGizmoCut::on_is_activable(const GLCanvas3D::Selection& selection) const +{ + return selection.is_single_full_instance() && !selection.is_wipe_tower(); +} + +void GLGizmoCut::on_start_dragging(const GLCanvas3D::Selection& selection) +{ + if (m_hover_id == -1) { return; } + + const BoundingBoxf3& box = selection.get_bounding_box(); + m_start_z = m_cut_z; + update_max_z(selection); + m_drag_pos = m_grabbers[m_hover_id].center; + m_drag_center = box.center(); + m_drag_center(2) = m_cut_z; +} + +void GLGizmoCut::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +{ + if (m_hover_id != -1) { + set_cut_z(m_start_z + calc_projection(data.mouse_ray)); + } +} + +void GLGizmoCut::on_render(const GLCanvas3D::Selection& selection) const +{ + if (m_grabbers[0].dragging) { + set_tooltip("Z: " + format(m_cut_z, 2)); + } + + update_max_z(selection); + + const BoundingBoxf3& box = selection.get_bounding_box(); + Vec3d plane_center = box.center(); + plane_center(2) = m_cut_z; + + const float min_x = box.min(0) - Margin; + const float max_x = box.max(0) + Margin; + const float min_y = box.min(1) - Margin; + const float max_y = box.max(1) + Margin; + ::glEnable(GL_DEPTH_TEST); + ::glDisable(GL_CULL_FACE); + ::glEnable(GL_BLEND); + ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // Draw the cutting plane + ::glBegin(GL_QUADS); + ::glColor4f(0.8f, 0.8f, 0.8f, 0.5f); + ::glVertex3f(min_x, min_y, plane_center(2)); + ::glVertex3f(max_x, min_y, plane_center(2)); + ::glVertex3f(max_x, max_y, plane_center(2)); + ::glVertex3f(min_x, max_y, plane_center(2)); + ::glEnd(); + + ::glEnable(GL_CULL_FACE); + ::glDisable(GL_BLEND); + + // TODO: draw cut part contour? + + // Draw the grabber and the connecting line + m_grabbers[0].center = plane_center; + m_grabbers[0].center(2) = plane_center(2) + Offset; + + ::glDisable(GL_DEPTH_TEST); + ::glLineWidth(m_hover_id != -1 ? 2.0f : 1.5f); + ::glColor3f(1.0, 1.0, 0.0); + ::glBegin(GL_LINES); + ::glVertex3dv(plane_center.data()); + ::glVertex3dv(m_grabbers[0].center.data()); + ::glEnd(); + + std::copy(std::begin(GrabberColor), std::end(GrabberColor), m_grabbers[0].color); + m_grabbers[0].render(m_hover_id == 0, box.max_size()); +} + +void GLGizmoCut::on_render_for_picking(const GLCanvas3D::Selection& selection) const +{ + ::glDisable(GL_DEPTH_TEST); + + render_grabbers_for_picking(selection.get_bounding_box()); +} + +#if ENABLE_IMGUI +void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +{ + m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(_(L("Cut")), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + ImGui::PushItemWidth(100.0f); + bool _value_changed = ImGui::InputDouble("Z", &m_cut_z, 0.0f, 0.0f, "%.2f"); + + m_imgui->checkbox(_(L("Keep upper part")), m_keep_upper); + m_imgui->checkbox(_(L("Keep lower part")), m_keep_lower); + m_imgui->checkbox(_(L("Rotate lower part upwards")), m_rotate_lower); + + m_imgui->disabled_begin(!m_keep_upper && !m_keep_lower); + const bool cut_clicked = m_imgui->button(_(L("Perform cut"))); + m_imgui->disabled_end(); + + m_imgui->end(); + + if (cut_clicked && (m_keep_upper || m_keep_lower)) { + perform_cut(selection); + } +} +#endif // ENABLE_IMGUI + +void GLGizmoCut::update_max_z(const GLCanvas3D::Selection& selection) const +{ + m_max_z = selection.get_bounding_box().size()(2); + set_cut_z(m_cut_z); +} + +void GLGizmoCut::set_cut_z(double cut_z) const +{ + // Clamp the plane to the object's bounding box + m_cut_z = std::max(0.0, std::min(m_max_z, cut_z)); +} + +void GLGizmoCut::perform_cut(const GLCanvas3D::Selection& selection) +{ + const auto instance_idx = selection.get_instance_idx(); + const auto object_idx = selection.get_object_idx(); + + wxCHECK_RET(instance_idx >= 0 && object_idx >= 0, "GLGizmoCut: Invalid object selection"); + + wxGetApp().plater()->cut(object_idx, instance_idx, m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); +} + +double GLGizmoCut::calc_projection(const Linef3& mouse_ray) const +{ + double projection = 0.0; + + const Vec3d starting_vec = m_drag_pos - m_drag_center; + const double len_starting_vec = starting_vec.norm(); + if (len_starting_vec != 0.0) + { + Vec3d mouse_dir = mouse_ray.unit_vector(); + // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position + // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form + // in our case plane normal and ray direction are the same (orthogonal view) + // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal + Vec3d inters = mouse_ray.a + (m_drag_pos - mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; + // vector from the starting position to the found intersection + Vec3d inters_vec = inters - m_drag_pos; + + // finds projection of the vector along the staring direction + projection = inters_vec.dot(starting_vec.normalized()); + } + return projection; +} + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp new file mode 100644 index 000000000..200e1c0df --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -0,0 +1,68 @@ +#ifndef slic3r_GLGizmoCut_hpp_ +#define slic3r_GLGizmoCut_hpp_ + +#include "GLGizmoBase.hpp" + + +namespace Slic3r { +namespace GUI { + +#if !ENABLE_IMGUI +class GLGizmoCutPanel; +#endif // not ENABLE_IMGUI + +class GLGizmoCut : public GLGizmoBase +{ + static const double Offset; + static const double Margin; + static const std::array GrabberColor; + + mutable double m_cut_z; + double m_start_z; + mutable double m_max_z; + Vec3d m_drag_pos; + Vec3d m_drag_center; + bool m_keep_upper; + bool m_keep_lower; + bool m_rotate_lower; +#if !ENABLE_IMGUI + GLGizmoCutPanel *m_panel; +#endif // not ENABLE_IMGUI + +public: +#if ENABLE_SVG_ICONS + GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); +#else + GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id); +#endif // ENABLE_SVG_ICONS + +#if !ENABLE_IMGUI + virtual void create_external_gizmo_widgets(wxWindow *parent); +#endif // not ENABLE_IMGUI +#if !ENABLE_IMGUI +#endif // not ENABLE_IMGUI + +protected: + virtual bool on_init(); + virtual std::string on_get_name() const; + virtual void on_set_state(); + virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; + virtual void on_start_dragging(const GLCanvas3D::Selection& selection); + virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); + virtual void on_render(const GLCanvas3D::Selection& selection) const; + virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + +#if ENABLE_IMGUI + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); +#endif // ENABLE_IMGUI +private: + void update_max_z(const GLCanvas3D::Selection& selection) const; + void set_cut_z(double cut_z) const; + void perform_cut(const GLCanvas3D::Selection& selection); + double calc_projection(const Linef3& mouse_ray) const; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoCut_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp new file mode 100644 index 000000000..d72dc4913 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -0,0 +1,357 @@ +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoFlatten.hpp" + +#include + +#include + +namespace Slic3r { +namespace GUI { + + +#if ENABLE_SVG_ICONS +GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +#else +GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#endif // ENABLE_SVG_ICONS + , m_normal(Vec3d::Zero()) + , m_starting_center(Vec3d::Zero()) +{ +} + +bool GLGizmoFlatten::on_init() +{ + m_shortcut_key = WXK_CONTROL_F; + return true; +} + +std::string GLGizmoFlatten::on_get_name() const +{ + return L("Place on face [F]"); +} + +bool GLGizmoFlatten::on_is_activable(const GLCanvas3D::Selection& selection) const +{ + return selection.is_single_full_instance(); +} + +void GLGizmoFlatten::on_start_dragging(const GLCanvas3D::Selection& selection) +{ + if (m_hover_id != -1) + { + assert(m_planes_valid); + m_normal = m_planes[m_hover_id].normal; + m_starting_center = selection.get_bounding_box().center(); + } +} + +void GLGizmoFlatten::on_render(const GLCanvas3D::Selection& selection) const +{ + ::glClear(GL_DEPTH_BUFFER_BIT); + + ::glEnable(GL_DEPTH_TEST); + ::glEnable(GL_BLEND); + + if (selection.is_single_full_instance()) + { + const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); + ::glPushMatrix(); + ::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z()); + ::glMultMatrixd(m.data()); + if (this->is_plane_update_necessary()) + const_cast(this)->update_planes(); + for (int i = 0; i < (int)m_planes.size(); ++i) + { + if (i == m_hover_id) + ::glColor4f(0.9f, 0.9f, 0.9f, 0.75f); + else + ::glColor4f(0.9f, 0.9f, 0.9f, 0.5f); + + ::glBegin(GL_POLYGON); + for (const Vec3d& vertex : m_planes[i].vertices) + { + ::glVertex3dv(vertex.data()); + } + ::glEnd(); + } + ::glPopMatrix(); + } + + ::glEnable(GL_CULL_FACE); + ::glDisable(GL_BLEND); +} + +void GLGizmoFlatten::on_render_for_picking(const GLCanvas3D::Selection& selection) const +{ + ::glDisable(GL_DEPTH_TEST); + ::glDisable(GL_BLEND); + + if (selection.is_single_full_instance()) + { + const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); + ::glPushMatrix(); + ::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z()); + ::glMultMatrixd(m.data()); + if (this->is_plane_update_necessary()) + const_cast(this)->update_planes(); + for (int i = 0; i < (int)m_planes.size(); ++i) + { + ::glColor3fv(picking_color_component(i).data()); + ::glBegin(GL_POLYGON); + for (const Vec3d& vertex : m_planes[i].vertices) + { + ::glVertex3dv(vertex.data()); + } + ::glEnd(); + } + ::glPopMatrix(); + } + + ::glEnable(GL_CULL_FACE); +} + +void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object) +{ + m_starting_center = Vec3d::Zero(); + if (m_model_object != model_object) { + m_planes.clear(); + m_planes_valid = false; + } + m_model_object = model_object; +} + +void GLGizmoFlatten::update_planes() +{ + TriangleMesh ch; + for (const ModelVolume* vol : m_model_object->volumes) + { + if (vol->type() != ModelVolumeType::MODEL_PART) + continue; + TriangleMesh vol_ch = vol->get_convex_hull(); + vol_ch.transform(vol->get_matrix()); + ch.merge(vol_ch); + } + ch = ch.convex_hull_3d(); + m_planes.clear(); + const Transform3d& inst_matrix = m_model_object->instances.front()->get_matrix(true); + + // Following constants are used for discarding too small polygons. + const float minimal_area = 5.f; // in square mm (world coordinates) + const float minimal_side = 1.f; // mm + + // Now we'll go through all the facets and append Points of facets sharing the same normal. + // This part is still performed in mesh coordinate system. + const int num_of_facets = ch.stl.stats.number_of_facets; + std::vector facet_queue(num_of_facets, 0); + std::vector facet_visited(num_of_facets, false); + int facet_queue_cnt = 0; + const stl_normal* normal_ptr = nullptr; + while (1) { + // Find next unvisited triangle: + int facet_idx = 0; + for (; facet_idx < num_of_facets; ++ facet_idx) + if (!facet_visited[facet_idx]) { + facet_queue[facet_queue_cnt ++] = facet_idx; + facet_visited[facet_idx] = true; + normal_ptr = &ch.stl.facet_start[facet_idx].normal; + m_planes.emplace_back(); + break; + } + if (facet_idx == num_of_facets) + break; // Everything was visited already + + while (facet_queue_cnt > 0) { + int facet_idx = facet_queue[-- facet_queue_cnt]; + const stl_normal& this_normal = ch.stl.facet_start[facet_idx].normal; + if (std::abs(this_normal(0) - (*normal_ptr)(0)) < 0.001 && std::abs(this_normal(1) - (*normal_ptr)(1)) < 0.001 && std::abs(this_normal(2) - (*normal_ptr)(2)) < 0.001) { + stl_vertex* first_vertex = ch.stl.facet_start[facet_idx].vertex; + for (int j=0; j<3; ++j) + m_planes.back().vertices.emplace_back((double)first_vertex[j](0), (double)first_vertex[j](1), (double)first_vertex[j](2)); + + facet_visited[facet_idx] = true; + for (int j = 0; j < 3; ++ j) { + int neighbor_idx = ch.stl.neighbors_start[facet_idx].neighbor[j]; + if (! facet_visited[neighbor_idx]) + facet_queue[facet_queue_cnt ++] = neighbor_idx; + } + } + } + m_planes.back().normal = normal_ptr->cast(); + + // Now we'll transform all the points into world coordinates, so that the areas, angles and distances + // make real sense. + m_planes.back().vertices = transform(m_planes.back().vertices, inst_matrix); + + // if this is a just a very small triangle, remove it to speed up further calculations (it would be rejected later anyway): + if (m_planes.back().vertices.size() == 3 && + ((m_planes.back().vertices[0] - m_planes.back().vertices[1]).norm() < minimal_side + || (m_planes.back().vertices[0] - m_planes.back().vertices[2]).norm() < minimal_side + || (m_planes.back().vertices[1] - m_planes.back().vertices[2]).norm() < minimal_side)) + m_planes.pop_back(); + } + + // Let's prepare transformation of the normal vector from mesh to instance coordinates. + Geometry::Transformation t(inst_matrix); + Vec3d scaling = t.get_scaling_factor(); + t.set_scaling_factor(Vec3d(1./scaling(0), 1./scaling(1), 1./scaling(2))); + + // Now we'll go through all the polygons, transform the points into xy plane to process them: + for (unsigned int polygon_id=0; polygon_id < m_planes.size(); ++polygon_id) { + Pointf3s& polygon = m_planes[polygon_id].vertices; + const Vec3d& normal = m_planes[polygon_id].normal; + + // transform the normal according to the instance matrix: + Vec3d normal_transformed = t.get_matrix() * normal; + + // We are going to rotate about z and y to flatten the plane + Eigen::Quaterniond q; + Transform3d m = Transform3d::Identity(); + m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(normal_transformed, Vec3d::UnitZ()).toRotationMatrix(); + polygon = transform(polygon, m); + + // Now to remove the inner points. We'll misuse Geometry::convex_hull for that, but since + // it works in fixed point representation, we will rescale the polygon to avoid overflows. + // And yes, it is a nasty thing to do. Whoever has time is free to refactor. + Vec3d bb_size = BoundingBoxf3(polygon).size(); + float sf = std::min(1./bb_size(0), 1./bb_size(1)); + Transform3d tr = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), Vec3d(sf, sf, 1.f)); + polygon = transform(polygon, tr); + polygon = Slic3r::Geometry::convex_hull(polygon); + polygon = transform(polygon, tr.inverse()); + + // Calculate area of the polygons and discard ones that are too small + float& area = m_planes[polygon_id].area; + area = 0.f; + for (unsigned int i = 0; i < polygon.size(); i++) // Shoelace formula + area += polygon[i](0)*polygon[i + 1 < polygon.size() ? i + 1 : 0](1) - polygon[i + 1 < polygon.size() ? i + 1 : 0](0)*polygon[i](1); + area = 0.5f * std::abs(area); + + bool discard = false; + if (area < minimal_area) + discard = true; + else { + // We also check the inner angles and discard polygons with angles smaller than the following threshold + const double angle_threshold = ::cos(10.0 * (double)PI / 180.0); + + for (unsigned int i = 0; i < polygon.size(); ++i) { + const Vec3d& prec = polygon[(i == 0) ? polygon.size() - 1 : i - 1]; + const Vec3d& curr = polygon[i]; + const Vec3d& next = polygon[(i == polygon.size() - 1) ? 0 : i + 1]; + + if ((prec - curr).normalized().dot((next - curr).normalized()) > angle_threshold) { + discard = true; + break; + } + } + } + + if (discard) { + m_planes.erase(m_planes.begin() + (polygon_id--)); + continue; + } + + // We will shrink the polygon a little bit so it does not touch the object edges: + Vec3d centroid = std::accumulate(polygon.begin(), polygon.end(), Vec3d(0.0, 0.0, 0.0)); + centroid /= (double)polygon.size(); + for (auto& vertex : polygon) + vertex = 0.9f*vertex + 0.1f*centroid; + + // Polygon is now simple and convex, we'll round the corners to make them look nicer. + // The algorithm takes a vertex, calculates middles of respective sides and moves the vertex + // towards their average (controlled by 'aggressivity'). This is repeated k times. + // In next iterations, the neighbours are not always taken at the middle (to increase the + // rounding effect at the corners, where we need it most). + const unsigned int k = 10; // number of iterations + const float aggressivity = 0.2f; // agressivity + const unsigned int N = polygon.size(); + std::vector> neighbours; + if (k != 0) { + Pointf3s points_out(2*k*N); // vector long enough to store the future vertices + for (unsigned int j=0; jvolumes) { + m_volumes_matrices.push_back(vol->get_matrix()); + m_volumes_types.push_back(vol->type()); + } + m_first_instance_scale = m_model_object->instances.front()->get_scaling_factor(); + m_first_instance_mirror = m_model_object->instances.front()->get_mirror(); + + m_planes_valid = true; +} + + +bool GLGizmoFlatten::is_plane_update_necessary() const +{ + if (m_state != On || !m_model_object || m_model_object->instances.empty()) + return false; + + if (! m_planes_valid || m_model_object->volumes.size() != m_volumes_matrices.size()) + return true; + + // We want to recalculate when the scale changes - some planes could (dis)appear. + if (! m_model_object->instances.front()->get_scaling_factor().isApprox(m_first_instance_scale) + || ! m_model_object->instances.front()->get_mirror().isApprox(m_first_instance_mirror)) + return true; + + for (unsigned int i=0; i < m_model_object->volumes.size(); ++i) + if (! m_model_object->volumes[i]->get_matrix().isApprox(m_volumes_matrices[i]) + || m_model_object->volumes[i]->type() != m_volumes_types[i]) + return true; + + return false; +} + +Vec3d GLGizmoFlatten::get_flattening_normal() const +{ + Vec3d out = m_normal; + m_normal = Vec3d::Zero(); + m_starting_center = Vec3d::Zero(); + return out; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp new file mode 100644 index 000000000..c91924c5a --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp @@ -0,0 +1,67 @@ +#ifndef slic3r_GLGizmoFlatten_hpp_ +#define slic3r_GLGizmoFlatten_hpp_ + +#include "GLGizmoBase.hpp" + + +namespace Slic3r { +namespace GUI { + + +class GLGizmoFlatten : public GLGizmoBase +{ +// This gizmo does not use grabbers. The m_hover_id relates to polygon managed by the class itself. + +private: + mutable Vec3d m_normal; + + struct PlaneData { + std::vector vertices; + Vec3d normal; + float area; + }; + + // This holds information to decide whether recalculation is necessary: + std::vector m_volumes_matrices; + std::vector m_volumes_types; + Vec3d m_first_instance_scale; + Vec3d m_first_instance_mirror; + + std::vector m_planes; + bool m_planes_valid = false; + mutable Vec3d m_starting_center; + const ModelObject* m_model_object = nullptr; + std::vector instances_matrices; + + void update_planes(); + bool is_plane_update_necessary() const; + +public: +#if ENABLE_SVG_ICONS + GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); +#else + GLGizmoFlatten(GLCanvas3D& parent, unsigned int sprite_id); +#endif // ENABLE_SVG_ICONS + + void set_flattening_data(const ModelObject* model_object); + Vec3d get_flattening_normal() const; + +protected: + virtual bool on_init(); + virtual std::string on_get_name() const; + virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; + virtual void on_start_dragging(const GLCanvas3D::Selection& selection); + virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) {} + virtual void on_render(const GLCanvas3D::Selection& selection) const; + virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + virtual void on_set_state() + { + if (m_state == On && is_plane_update_necessary()) + update_planes(); + } +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoFlatten_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp new file mode 100644 index 000000000..38b0ce23b --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -0,0 +1,257 @@ +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoMove.hpp" + +#include + + +namespace Slic3r { +namespace GUI { + +const double GLGizmoMove3D::Offset = 10.0; + +#if ENABLE_SVG_ICONS +GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +#else +GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#endif // ENABLE_SVG_ICONS + , m_displacement(Vec3d::Zero()) + , m_snap_step(1.0) + , m_starting_drag_position(Vec3d::Zero()) + , m_starting_box_center(Vec3d::Zero()) + , m_starting_box_bottom_center(Vec3d::Zero()) + , m_quadric(nullptr) +{ + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +} + +GLGizmoMove3D::~GLGizmoMove3D() +{ + if (m_quadric != nullptr) + ::gluDeleteQuadric(m_quadric); +} + +bool GLGizmoMove3D::on_init() +{ + for (int i = 0; i < 3; ++i) + { + m_grabbers.push_back(Grabber()); + } + + m_shortcut_key = WXK_CONTROL_M; + + return true; +} + +std::string GLGizmoMove3D::on_get_name() const +{ + return L("Move [M]"); +} + +void GLGizmoMove3D::on_start_dragging(const GLCanvas3D::Selection& selection) +{ + if (m_hover_id != -1) + { + m_displacement = Vec3d::Zero(); + const BoundingBoxf3& box = selection.get_bounding_box(); + m_starting_drag_position = m_grabbers[m_hover_id].center; + m_starting_box_center = box.center(); + m_starting_box_bottom_center = box.center(); + m_starting_box_bottom_center(2) = box.min(2); + } +} + +void GLGizmoMove3D::on_stop_dragging() +{ + m_displacement = Vec3d::Zero(); +} + +void GLGizmoMove3D::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +{ + if (m_hover_id == 0) + m_displacement(0) = calc_projection(data); + else if (m_hover_id == 1) + m_displacement(1) = calc_projection(data); + else if (m_hover_id == 2) + m_displacement(2) = calc_projection(data); +} + +void GLGizmoMove3D::on_render(const GLCanvas3D::Selection& selection) const +{ + bool show_position = selection.is_single_full_instance(); + const Vec3d& position = selection.get_bounding_box().center(); + + if ((show_position && (m_hover_id == 0)) || m_grabbers[0].dragging) + set_tooltip("X: " + format(show_position ? position(0) : m_displacement(0), 2)); + else if (!m_grabbers[0].dragging && (m_hover_id == 0)) + set_tooltip("X"); + else if ((show_position && (m_hover_id == 1)) || m_grabbers[1].dragging) + set_tooltip("Y: " + format(show_position ? position(1) : m_displacement(1), 2)); + else if (!m_grabbers[1].dragging && (m_hover_id == 1)) + set_tooltip("Y"); + else if ((show_position && (m_hover_id == 2)) || m_grabbers[2].dragging) + set_tooltip("Z: " + format(show_position ? position(2) : m_displacement(2), 2)); + else if (!m_grabbers[2].dragging && (m_hover_id == 2)) + set_tooltip("Z"); + + ::glClear(GL_DEPTH_BUFFER_BIT); + ::glEnable(GL_DEPTH_TEST); + + const BoundingBoxf3& box = selection.get_bounding_box(); + const Vec3d& center = box.center(); + + // x axis + m_grabbers[0].center = Vec3d(box.max(0) + Offset, center(1), center(2)); + ::memcpy((void*)m_grabbers[0].color, (const void*)&AXES_COLOR[0], 3 * sizeof(float)); + + // y axis + m_grabbers[1].center = Vec3d(center(0), box.max(1) + Offset, center(2)); + ::memcpy((void*)m_grabbers[1].color, (const void*)&AXES_COLOR[1], 3 * sizeof(float)); + + // z axis + m_grabbers[2].center = Vec3d(center(0), center(1), box.max(2) + Offset); + ::memcpy((void*)m_grabbers[2].color, (const void*)&AXES_COLOR[2], 3 * sizeof(float)); + + ::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f); + + if (m_hover_id == -1) + { + // draw axes + for (unsigned int i = 0; i < 3; ++i) + { + if (m_grabbers[i].enabled) + { + ::glColor3fv(AXES_COLOR[i]); + ::glBegin(GL_LINES); + ::glVertex3dv(center.data()); + ::glVertex3dv(m_grabbers[i].center.data()); + ::glEnd(); + } + } + + // draw grabbers + render_grabbers(box); + for (unsigned int i = 0; i < 3; ++i) + { + if (m_grabbers[i].enabled) + render_grabber_extension((Axis)i, box, false); + } + } + else + { + // draw axis + ::glColor3fv(AXES_COLOR[m_hover_id]); + ::glBegin(GL_LINES); + ::glVertex3dv(center.data()); + ::glVertex3dv(m_grabbers[m_hover_id].center.data()); + ::glEnd(); + + // draw grabber + m_grabbers[m_hover_id].render(true, box.max_size()); + render_grabber_extension((Axis)m_hover_id, box, false); + } +} + +void GLGizmoMove3D::on_render_for_picking(const GLCanvas3D::Selection& selection) const +{ + ::glDisable(GL_DEPTH_TEST); + + const BoundingBoxf3& box = selection.get_bounding_box(); + render_grabbers_for_picking(box); + render_grabber_extension(X, box, true); + render_grabber_extension(Y, box, true); + render_grabber_extension(Z, box, true); +} + +#if ENABLE_IMGUI +void GLGizmoMove3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +{ +#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI + bool show_position = selection.is_single_full_instance(); + const Vec3d& position = selection.get_bounding_box().center(); + + Vec3d displacement = show_position ? position : m_displacement; + wxString label = show_position ? _(L("Position (mm)")) : _(L("Displacement (mm)")); + + m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + m_imgui->input_vec3("", displacement, 100.0f, "%.2f"); + + m_imgui->end(); +#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI +} +#endif // ENABLE_IMGUI + +double GLGizmoMove3D::calc_projection(const UpdateData& data) const +{ + double projection = 0.0; + + Vec3d starting_vec = m_starting_drag_position - m_starting_box_center; + double len_starting_vec = starting_vec.norm(); + if (len_starting_vec != 0.0) + { + Vec3d mouse_dir = data.mouse_ray.unit_vector(); + // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position + // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form + // in our case plane normal and ray direction are the same (orthogonal view) + // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal + Vec3d inters = data.mouse_ray.a + (m_starting_drag_position - data.mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; + // vector from the starting position to the found intersection + Vec3d inters_vec = inters - m_starting_drag_position; + + // finds projection of the vector along the staring direction + projection = inters_vec.dot(starting_vec.normalized()); + } + + if (data.shift_down) + projection = m_snap_step * (double)std::round(projection / m_snap_step); + + return projection; +} + +void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const +{ + if (m_quadric == nullptr) + return; + + double size = m_dragging ? (double)m_grabbers[axis].get_dragging_half_size((float)box.max_size()) : (double)m_grabbers[axis].get_half_size((float)box.max_size()); + + float color[3]; + ::memcpy((void*)color, (const void*)m_grabbers[axis].color, 3 * sizeof(float)); + if (!picking && (m_hover_id != -1)) + { + color[0] = 1.0f - color[0]; + color[1] = 1.0f - color[1]; + color[2] = 1.0f - color[2]; + } + + if (!picking) + ::glEnable(GL_LIGHTING); + + ::glColor3fv(color); + ::glPushMatrix(); + ::glTranslated(m_grabbers[axis].center(0), m_grabbers[axis].center(1), m_grabbers[axis].center(2)); + if (axis == X) + ::glRotated(90.0, 0.0, 1.0, 0.0); + else if (axis == Y) + ::glRotated(-90.0, 1.0, 0.0, 0.0); + + ::glTranslated(0.0, 0.0, 2.0 * size); + ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); + ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); + ::gluQuadricOrientation(m_quadric, GLU_INSIDE); + ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); + ::glPopMatrix(); + + if (!picking) + ::glDisable(GL_LIGHTING); +} + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp new file mode 100644 index 000000000..72b067ba9 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -0,0 +1,60 @@ +#ifndef slic3r_GLGizmoMove_hpp_ +#define slic3r_GLGizmoMove_hpp_ + +#include "GLGizmoBase.hpp" + + +namespace Slic3r { +namespace GUI { + +class GLGizmoMove3D : public GLGizmoBase +{ + static const double Offset; + + Vec3d m_displacement; + + double m_snap_step; + + Vec3d m_starting_drag_position; + Vec3d m_starting_box_center; + Vec3d m_starting_box_bottom_center; + + GLUquadricObj* m_quadric; + +public: +#if ENABLE_SVG_ICONS + GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); +#else + GLGizmoMove3D(GLCanvas3D& parent, unsigned int sprite_id); +#endif // ENABLE_SVG_ICONS + virtual ~GLGizmoMove3D(); + + double get_snap_step(double step) const { return m_snap_step; } + void set_snap_step(double step) { m_snap_step = step; } + + const Vec3d& get_displacement() const { return m_displacement; } + +protected: + virtual bool on_init(); + virtual std::string on_get_name() const; + virtual void on_start_dragging(const GLCanvas3D::Selection& selection); + virtual void on_stop_dragging(); + virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); + virtual void on_render(const GLCanvas3D::Selection& selection) const; + virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + +#if ENABLE_IMGUI + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); +#endif // ENABLE_IMGUI + +private: + double calc_projection(const UpdateData& data) const; + void render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const; +}; + + + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoMove_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp new file mode 100644 index 000000000..89ca426e4 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -0,0 +1,505 @@ +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoRotate.hpp" + +#include + + +namespace Slic3r { +namespace GUI { + + +const float GLGizmoRotate::Offset = 5.0f; +const unsigned int GLGizmoRotate::CircleResolution = 64; +const unsigned int GLGizmoRotate::AngleResolution = 64; +const unsigned int GLGizmoRotate::ScaleStepsCount = 72; +const float GLGizmoRotate::ScaleStepRad = 2.0f * (float)PI / GLGizmoRotate::ScaleStepsCount; +const unsigned int GLGizmoRotate::ScaleLongEvery = 2; +const float GLGizmoRotate::ScaleLongTooth = 0.1f; // in percent of radius +const unsigned int GLGizmoRotate::SnapRegionsCount = 8; +const float GLGizmoRotate::GrabberOffset = 0.15f; // in percent of radius + +GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) +#if ENABLE_SVG_ICONS + : GLGizmoBase(parent, "", -1) +#else + : GLGizmoBase(parent, -1) +#endif // ENABLE_SVG_ICONS + , m_axis(axis) + , m_angle(0.0) + , m_quadric(nullptr) + , m_center(0.0, 0.0, 0.0) + , m_radius(0.0f) + , m_snap_coarse_in_radius(0.0f) + , m_snap_coarse_out_radius(0.0f) + , m_snap_fine_in_radius(0.0f) + , m_snap_fine_out_radius(0.0f) +{ + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +} + +GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) +#if ENABLE_SVG_ICONS + : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id) +#else + : GLGizmoBase(other.m_parent, other.m_sprite_id) +#endif // ENABLE_SVG_ICONS + , m_axis(other.m_axis) + , m_angle(other.m_angle) + , m_quadric(nullptr) + , m_center(other.m_center) + , m_radius(other.m_radius) + , m_snap_coarse_in_radius(other.m_snap_coarse_in_radius) + , m_snap_coarse_out_radius(other.m_snap_coarse_out_radius) + , m_snap_fine_in_radius(other.m_snap_fine_in_radius) + , m_snap_fine_out_radius(other.m_snap_fine_out_radius) +{ + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +} + +GLGizmoRotate::~GLGizmoRotate() +{ + if (m_quadric != nullptr) + ::gluDeleteQuadric(m_quadric); +} + +void GLGizmoRotate::set_angle(double angle) +{ + if (std::abs(angle - 2.0 * (double)PI) < EPSILON) + angle = 0.0; + + m_angle = angle; +} + +bool GLGizmoRotate::on_init() +{ + m_grabbers.push_back(Grabber()); + return true; +} + +void GLGizmoRotate::on_start_dragging(const GLCanvas3D::Selection& selection) +{ + const BoundingBoxf3& box = selection.get_bounding_box(); + m_center = box.center(); + m_radius = Offset + box.radius(); + m_snap_coarse_in_radius = m_radius / 3.0f; + m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; + m_snap_fine_in_radius = m_radius; + m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; +} + +void GLGizmoRotate::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +{ + Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray, selection)); + + Vec2d orig_dir = Vec2d::UnitX(); + Vec2d new_dir = mouse_pos.normalized(); + + double theta = ::acos(clamp(-1.0, 1.0, new_dir.dot(orig_dir))); + if (cross2(orig_dir, new_dir) < 0.0) + theta = 2.0 * (double)PI - theta; + + double len = mouse_pos.norm(); + + // snap to coarse snap region + if ((m_snap_coarse_in_radius <= len) && (len <= m_snap_coarse_out_radius)) + { + double step = 2.0 * (double)PI / (double)SnapRegionsCount; + theta = step * (double)std::round(theta / step); + } + else + { + // snap to fine snap region (scale) + if ((m_snap_fine_in_radius <= len) && (len <= m_snap_fine_out_radius)) + { + double step = 2.0 * (double)PI / (double)ScaleStepsCount; + theta = step * (double)std::round(theta / step); + } + } + + if (theta == 2.0 * (double)PI) + theta = 0.0; + + m_angle = theta; +} + +void GLGizmoRotate::on_render(const GLCanvas3D::Selection& selection) const +{ + if (!m_grabbers[0].enabled) + return; + + const BoundingBoxf3& box = selection.get_bounding_box(); + + std::string axis; + switch (m_axis) + { + case X: { axis = "X"; break; } + case Y: { axis = "Y"; break; } + case Z: { axis = "Z"; break; } + } + + if (!m_dragging && (m_hover_id == 0)) + set_tooltip(axis); + else if (m_dragging) + set_tooltip(axis + ": " + format((float)Geometry::rad2deg(m_angle), 4) + "\u00B0"); + else + { + m_center = box.center(); + m_radius = Offset + box.radius(); + m_snap_coarse_in_radius = m_radius / 3.0f; + m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; + m_snap_fine_in_radius = m_radius; + m_snap_fine_out_radius = m_radius * (1.0f + ScaleLongTooth); + } + + ::glEnable(GL_DEPTH_TEST); + + ::glPushMatrix(); + transform_to_local(selection); + + ::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f); + ::glColor3fv((m_hover_id != -1) ? m_drag_color : m_highlight_color); + + render_circle(); + + if (m_hover_id != -1) + { + render_scale(); + render_snap_radii(); + render_reference_radius(); + } + + ::glColor3fv(m_highlight_color); + + if (m_hover_id != -1) + render_angle(); + + render_grabber(box); + render_grabber_extension(box, false); + + ::glPopMatrix(); +} + +void GLGizmoRotate::on_render_for_picking(const GLCanvas3D::Selection& selection) const +{ + ::glDisable(GL_DEPTH_TEST); + + ::glPushMatrix(); + + transform_to_local(selection); + + const BoundingBoxf3& box = selection.get_bounding_box(); + render_grabbers_for_picking(box); + render_grabber_extension(box, true); + + ::glPopMatrix(); +} + +void GLGizmoRotate::render_circle() const +{ + ::glBegin(GL_LINE_LOOP); + for (unsigned int i = 0; i < ScaleStepsCount; ++i) + { + float angle = (float)i * ScaleStepRad; + float x = ::cos(angle) * m_radius; + float y = ::sin(angle) * m_radius; + float z = 0.0f; + ::glVertex3f((GLfloat)x, (GLfloat)y, (GLfloat)z); + } + ::glEnd(); +} + +void GLGizmoRotate::render_scale() const +{ + float out_radius_long = m_snap_fine_out_radius; + float out_radius_short = m_radius * (1.0f + 0.5f * ScaleLongTooth); + + ::glBegin(GL_LINES); + for (unsigned int i = 0; i < ScaleStepsCount; ++i) + { + float angle = (float)i * ScaleStepRad; + float cosa = ::cos(angle); + float sina = ::sin(angle); + float in_x = cosa * m_radius; + float in_y = sina * m_radius; + float in_z = 0.0f; + float out_x = (i % ScaleLongEvery == 0) ? cosa * out_radius_long : cosa * out_radius_short; + float out_y = (i % ScaleLongEvery == 0) ? sina * out_radius_long : sina * out_radius_short; + float out_z = 0.0f; + ::glVertex3f((GLfloat)in_x, (GLfloat)in_y, (GLfloat)in_z); + ::glVertex3f((GLfloat)out_x, (GLfloat)out_y, (GLfloat)out_z); + } + ::glEnd(); +} + +void GLGizmoRotate::render_snap_radii() const +{ + float step = 2.0f * (float)PI / (float)SnapRegionsCount; + + float in_radius = m_radius / 3.0f; + float out_radius = 2.0f * in_radius; + + ::glBegin(GL_LINES); + for (unsigned int i = 0; i < SnapRegionsCount; ++i) + { + float angle = (float)i * step; + float cosa = ::cos(angle); + float sina = ::sin(angle); + float in_x = cosa * in_radius; + float in_y = sina * in_radius; + float in_z = 0.0f; + float out_x = cosa * out_radius; + float out_y = sina * out_radius; + float out_z = 0.0f; + ::glVertex3f((GLfloat)in_x, (GLfloat)in_y, (GLfloat)in_z); + ::glVertex3f((GLfloat)out_x, (GLfloat)out_y, (GLfloat)out_z); + } + ::glEnd(); +} + +void GLGizmoRotate::render_reference_radius() const +{ + ::glBegin(GL_LINES); + ::glVertex3f(0.0f, 0.0f, 0.0f); + ::glVertex3f((GLfloat)(m_radius * (1.0f + GrabberOffset)), 0.0f, 0.0f); + ::glEnd(); +} + +void GLGizmoRotate::render_angle() const +{ + float step_angle = (float)m_angle / AngleResolution; + float ex_radius = m_radius * (1.0f + GrabberOffset); + + ::glBegin(GL_LINE_STRIP); + for (unsigned int i = 0; i <= AngleResolution; ++i) + { + float angle = (float)i * step_angle; + float x = ::cos(angle) * ex_radius; + float y = ::sin(angle) * ex_radius; + float z = 0.0f; + ::glVertex3f((GLfloat)x, (GLfloat)y, (GLfloat)z); + } + ::glEnd(); +} + +void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const +{ + double grabber_radius = (double)m_radius * (1.0 + (double)GrabberOffset); + m_grabbers[0].center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0); + m_grabbers[0].angles(2) = m_angle; + + ::glColor3fv((m_hover_id != -1) ? m_drag_color : m_highlight_color); + + ::glBegin(GL_LINES); + ::glVertex3f(0.0f, 0.0f, 0.0f); + ::glVertex3dv(m_grabbers[0].center.data()); + ::glEnd(); + + ::memcpy((void*)m_grabbers[0].color, (const void*)m_highlight_color, 3 * sizeof(float)); + render_grabbers(box); +} + +void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) const +{ + if (m_quadric == nullptr) + return; + + double size = m_dragging ? (double)m_grabbers[0].get_dragging_half_size((float)box.max_size()) : (double)m_grabbers[0].get_half_size((float)box.max_size()); + + float color[3]; + ::memcpy((void*)color, (const void*)m_grabbers[0].color, 3 * sizeof(float)); + if (!picking && (m_hover_id != -1)) + { + color[0] = 1.0f - color[0]; + color[1] = 1.0f - color[1]; + color[2] = 1.0f - color[2]; + } + + if (!picking) + ::glEnable(GL_LIGHTING); + + ::glColor3fv(color); + ::glPushMatrix(); + ::glTranslated(m_grabbers[0].center(0), m_grabbers[0].center(1), m_grabbers[0].center(2)); + ::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0); + ::glRotated(90.0, 1.0, 0.0, 0.0); + ::glTranslated(0.0, 0.0, 2.0 * size); + ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); + ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); + ::gluQuadricOrientation(m_quadric, GLU_INSIDE); + ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); + ::glPopMatrix(); + ::glPushMatrix(); + ::glTranslated(m_grabbers[0].center(0), m_grabbers[0].center(1), m_grabbers[0].center(2)); + ::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0); + ::glRotated(-90.0, 1.0, 0.0, 0.0); + ::glTranslated(0.0, 0.0, 2.0 * size); + ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); + ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); + ::gluQuadricOrientation(m_quadric, GLU_INSIDE); + ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); + ::glPopMatrix(); + + if (!picking) + ::glDisable(GL_LIGHTING); +} + +void GLGizmoRotate::transform_to_local(const GLCanvas3D::Selection& selection) const +{ + ::glTranslated(m_center(0), m_center(1), m_center(2)); + + if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) + { + Transform3d orient_matrix = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true); + ::glMultMatrixd(orient_matrix.data()); + } + + switch (m_axis) + { + case X: + { + ::glRotatef(90.0f, 0.0f, 1.0f, 0.0f); + ::glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); + break; + } + case Y: + { + ::glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); + ::glRotatef(-90.0f, 0.0f, 1.0f, 0.0f); + break; + } + default: + case Z: + { + // no rotation + break; + } + } +} + +Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, const GLCanvas3D::Selection& selection) const +{ + double half_pi = 0.5 * (double)PI; + + Transform3d m = Transform3d::Identity(); + + switch (m_axis) + { + case X: + { + m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitZ())); + m.rotate(Eigen::AngleAxisd(-half_pi, Vec3d::UnitY())); + break; + } + case Y: + { + m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitY())); + m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitZ())); + break; + } + default: + case Z: + { + // no rotation applied + break; + } + } + + if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) + m = m * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true).inverse(); + + m.translate(-m_center); + + return transform(mouse_ray, m).intersect_plane(0.0); +} + +#if ENABLE_SVG_ICONS +GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +#else +GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#endif // ENABLE_SVG_ICONS +{ + m_gizmos.emplace_back(parent, GLGizmoRotate::X); + m_gizmos.emplace_back(parent, GLGizmoRotate::Y); + m_gizmos.emplace_back(parent, GLGizmoRotate::Z); + + for (unsigned int i = 0; i < 3; ++i) + { + m_gizmos[i].set_group_id(i); + } +} + +bool GLGizmoRotate3D::on_init() +{ + for (GLGizmoRotate& g : m_gizmos) + { + if (!g.init()) + return false; + } + + for (unsigned int i = 0; i < 3; ++i) + { + m_gizmos[i].set_highlight_color(AXES_COLOR[i]); + } + + m_shortcut_key = WXK_CONTROL_R; + + return true; +} + +std::string GLGizmoRotate3D::on_get_name() const +{ + return L("Rotate [R]"); +} + +void GLGizmoRotate3D::on_start_dragging(const GLCanvas3D::Selection& selection) +{ + if ((0 <= m_hover_id) && (m_hover_id < 3)) + m_gizmos[m_hover_id].start_dragging(selection); +} + +void GLGizmoRotate3D::on_stop_dragging() +{ + if ((0 <= m_hover_id) && (m_hover_id < 3)) + m_gizmos[m_hover_id].stop_dragging(); +} + +void GLGizmoRotate3D::on_render(const GLCanvas3D::Selection& selection) const +{ + ::glClear(GL_DEPTH_BUFFER_BIT); + + if ((m_hover_id == -1) || (m_hover_id == 0)) + m_gizmos[X].render(selection); + + if ((m_hover_id == -1) || (m_hover_id == 1)) + m_gizmos[Y].render(selection); + + if ((m_hover_id == -1) || (m_hover_id == 2)) + m_gizmos[Z].render(selection); +} + +#if ENABLE_IMGUI +void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +{ +#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI + Vec3d rotation(Geometry::rad2deg(m_gizmos[0].get_angle()), Geometry::rad2deg(m_gizmos[1].get_angle()), Geometry::rad2deg(m_gizmos[2].get_angle())); + wxString label = _(L("Rotation (deg)")); + + m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + m_imgui->input_vec3("", rotation, 100.0f, "%.2f"); + m_imgui->end(); +#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI +} +#endif // ENABLE_IMGUI + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp new file mode 100644 index 000000000..6281f98cb --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -0,0 +1,144 @@ +#ifndef slic3r_GLGizmoRotate_hpp_ +#define slic3r_GLGizmoRotate_hpp_ + +#include "GLGizmoBase.hpp" + + +namespace Slic3r { +namespace GUI { + +class GLGizmoRotate : public GLGizmoBase +{ + static const float Offset; + static const unsigned int CircleResolution; + static const unsigned int AngleResolution; + static const unsigned int ScaleStepsCount; + static const float ScaleStepRad; + static const unsigned int ScaleLongEvery; + static const float ScaleLongTooth; + static const unsigned int SnapRegionsCount; + static const float GrabberOffset; + +public: + enum Axis : unsigned char + { + X, + Y, + Z + }; + +private: + Axis m_axis; + double m_angle; + + GLUquadricObj* m_quadric; + + mutable Vec3d m_center; + mutable float m_radius; + + mutable float m_snap_coarse_in_radius; + mutable float m_snap_coarse_out_radius; + mutable float m_snap_fine_in_radius; + mutable float m_snap_fine_out_radius; + +public: + GLGizmoRotate(GLCanvas3D& parent, Axis axis); + GLGizmoRotate(const GLGizmoRotate& other); + virtual ~GLGizmoRotate(); + + double get_angle() const { return m_angle; } + void set_angle(double angle); + +protected: + virtual bool on_init(); + virtual std::string on_get_name() const { return ""; } + virtual void on_start_dragging(const GLCanvas3D::Selection& selection); + virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); + virtual void on_render(const GLCanvas3D::Selection& selection) const; + virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + +private: + void render_circle() const; + void render_scale() const; + void render_snap_radii() const; + void render_reference_radius() const; + void render_angle() const; + void render_grabber(const BoundingBoxf3& box) const; + void render_grabber_extension(const BoundingBoxf3& box, bool picking) const; + + void transform_to_local(const GLCanvas3D::Selection& selection) const; + // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate + Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const GLCanvas3D::Selection& selection) const; +}; + +class GLGizmoRotate3D : public GLGizmoBase +{ + std::vector m_gizmos; + +public: +#if ENABLE_SVG_ICONS + GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); +#else + GLGizmoRotate3D(GLCanvas3D& parent, unsigned int sprite_id); +#endif // ENABLE_SVG_ICONS + + Vec3d get_rotation() const { return Vec3d(m_gizmos[X].get_angle(), m_gizmos[Y].get_angle(), m_gizmos[Z].get_angle()); } + void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation(0)); m_gizmos[Y].set_angle(rotation(1)); m_gizmos[Z].set_angle(rotation(2)); } + +protected: + virtual bool on_init(); + virtual std::string on_get_name() const; + virtual void on_set_state() + { + for (GLGizmoRotate& g : m_gizmos) + { + g.set_state(m_state); + } + } + virtual void on_set_hover_id() + { + for (unsigned int i = 0; i < 3; ++i) + { + m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1); + } + } + virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); } + virtual void on_enable_grabber(unsigned int id) + { + if ((0 <= id) && (id < 3)) + m_gizmos[id].enable_grabber(0); + } + virtual void on_disable_grabber(unsigned int id) + { + if ((0 <= id) && (id < 3)) + m_gizmos[id].disable_grabber(0); + } + virtual void on_start_dragging(const GLCanvas3D::Selection& selection); + virtual void on_stop_dragging(); + virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) + { + for (GLGizmoRotate& g : m_gizmos) + { + g.update(data, selection); + } + } + virtual void on_render(const GLCanvas3D::Selection& selection) const; + virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const + { + for (const GLGizmoRotate& g : m_gizmos) + { + g.render_for_picking(selection); + } + } + +#if ENABLE_IMGUI + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); +#endif // ENABLE_IMGUI +}; + + + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoRotate_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp new file mode 100644 index 000000000..bb0663e36 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -0,0 +1,364 @@ + + +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoScale.hpp" + +#include + +namespace Slic3r { +namespace GUI { + + +const float GLGizmoScale3D::Offset = 5.0f; + +#if ENABLE_SVG_ICONS +GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +#else +GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#endif // ENABLE_SVG_ICONS + , m_scale(Vec3d::Ones()) + , m_snap_step(0.05) + , m_starting_scale(Vec3d::Ones()) +{ +} + +bool GLGizmoScale3D::on_init() +{ + for (int i = 0; i < 10; ++i) + { + m_grabbers.push_back(Grabber()); + } + + double half_pi = 0.5 * (double)PI; + + // x axis + m_grabbers[0].angles(1) = half_pi; + m_grabbers[1].angles(1) = half_pi; + + // y axis + m_grabbers[2].angles(0) = half_pi; + m_grabbers[3].angles(0) = half_pi; + + m_shortcut_key = WXK_CONTROL_S; + + return true; +} + +std::string GLGizmoScale3D::on_get_name() const +{ + return L("Scale [S]"); +} + +void GLGizmoScale3D::on_start_dragging(const GLCanvas3D::Selection& selection) +{ + if (m_hover_id != -1) + { + m_starting_drag_position = m_grabbers[m_hover_id].center; + m_starting_box = selection.get_bounding_box(); + } +} + +void GLGizmoScale3D::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +{ + if ((m_hover_id == 0) || (m_hover_id == 1)) + do_scale_x(data); + else if ((m_hover_id == 2) || (m_hover_id == 3)) + do_scale_y(data); + else if ((m_hover_id == 4) || (m_hover_id == 5)) + do_scale_z(data); + else if (m_hover_id >= 6) + do_scale_uniform(data); +} + +void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const +{ + bool single_instance = selection.is_single_full_instance(); + bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); + bool single_selection = single_instance || single_volume; + + Vec3f scale = 100.0f * Vec3f::Ones(); + if (single_instance) + scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_scaling_factor().cast(); + else if (single_volume) + scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_volume_scaling_factor().cast(); + + if ((single_selection && ((m_hover_id == 0) || (m_hover_id == 1))) || m_grabbers[0].dragging || m_grabbers[1].dragging) + set_tooltip("X: " + format(scale(0), 4) + "%"); + else if (!m_grabbers[0].dragging && !m_grabbers[1].dragging && ((m_hover_id == 0) || (m_hover_id == 1))) + set_tooltip("X"); + else if ((single_selection && ((m_hover_id == 2) || (m_hover_id == 3))) || m_grabbers[2].dragging || m_grabbers[3].dragging) + set_tooltip("Y: " + format(scale(1), 4) + "%"); + else if (!m_grabbers[2].dragging && !m_grabbers[3].dragging && ((m_hover_id == 2) || (m_hover_id == 3))) + set_tooltip("Y"); + else if ((single_selection && ((m_hover_id == 4) || (m_hover_id == 5))) || m_grabbers[4].dragging || m_grabbers[5].dragging) + set_tooltip("Z: " + format(scale(2), 4) + "%"); + else if (!m_grabbers[4].dragging && !m_grabbers[5].dragging && ((m_hover_id == 4) || (m_hover_id == 5))) + set_tooltip("Z"); + else if ((single_selection && ((m_hover_id == 6) || (m_hover_id == 7) || (m_hover_id == 8) || (m_hover_id == 9))) + || m_grabbers[6].dragging || m_grabbers[7].dragging || m_grabbers[8].dragging || m_grabbers[9].dragging) + { + std::string tooltip = "X: " + format(scale(0), 4) + "%\n"; + tooltip += "Y: " + format(scale(1), 4) + "%\n"; + tooltip += "Z: " + format(scale(2), 4) + "%"; + set_tooltip(tooltip); + } + else if (!m_grabbers[6].dragging && !m_grabbers[7].dragging && !m_grabbers[8].dragging && !m_grabbers[9].dragging && + ((m_hover_id == 6) || (m_hover_id == 7) || (m_hover_id == 8) || (m_hover_id == 9))) + set_tooltip("X/Y/Z"); + + ::glClear(GL_DEPTH_BUFFER_BIT); + ::glEnable(GL_DEPTH_TEST); + + BoundingBoxf3 box; + Transform3d transform = Transform3d::Identity(); + Vec3d angles = Vec3d::Zero(); + Transform3d offsets_transform = Transform3d::Identity(); + + Vec3d grabber_size = Vec3d::Zero(); + + if (single_instance) + { + // calculate bounding box in instance local reference system + const GLCanvas3D::Selection::IndicesList& idxs = selection.get_volume_idxs(); + for (unsigned int idx : idxs) + { + const GLVolume* vol = selection.get_volume(idx); + box.merge(vol->bounding_box.transformed(vol->get_volume_transformation().get_matrix())); + } + + // gets transform from first selected volume + const GLVolume* v = selection.get_volume(*idxs.begin()); + transform = v->get_instance_transformation().get_matrix(); + // gets angles from first selected volume + angles = v->get_instance_rotation(); + // consider rotation+mirror only components of the transform for offsets + offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v->get_instance_mirror()); + grabber_size = v->get_instance_transformation().get_matrix(true, true, false, true) * box.size(); + } + else if (single_volume) + { + const GLVolume* v = selection.get_volume(*selection.get_volume_idxs().begin()); + box = v->bounding_box; + transform = v->world_matrix(); + angles = Geometry::extract_euler_angles(transform); + // consider rotation+mirror only components of the transform for offsets + offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v->get_instance_mirror()); + grabber_size = v->get_volume_transformation().get_matrix(true, true, false, true) * box.size(); + } + else + { + box = selection.get_bounding_box(); + grabber_size = box.size(); + } + + m_box = box; + + const Vec3d& center = m_box.center(); + Vec3d offset_x = offsets_transform * Vec3d((double)Offset, 0.0, 0.0); + Vec3d offset_y = offsets_transform * Vec3d(0.0, (double)Offset, 0.0); + Vec3d offset_z = offsets_transform * Vec3d(0.0, 0.0, (double)Offset); + + // x axis + m_grabbers[0].center = transform * Vec3d(m_box.min(0), center(1), center(2)) - offset_x; + m_grabbers[1].center = transform * Vec3d(m_box.max(0), center(1), center(2)) + offset_x; + ::memcpy((void*)m_grabbers[0].color, (const void*)&AXES_COLOR[0], 3 * sizeof(float)); + ::memcpy((void*)m_grabbers[1].color, (const void*)&AXES_COLOR[0], 3 * sizeof(float)); + + // y axis + m_grabbers[2].center = transform * Vec3d(center(0), m_box.min(1), center(2)) - offset_y; + m_grabbers[3].center = transform * Vec3d(center(0), m_box.max(1), center(2)) + offset_y; + ::memcpy((void*)m_grabbers[2].color, (const void*)&AXES_COLOR[1], 3 * sizeof(float)); + ::memcpy((void*)m_grabbers[3].color, (const void*)&AXES_COLOR[1], 3 * sizeof(float)); + + // z axis + m_grabbers[4].center = transform * Vec3d(center(0), center(1), m_box.min(2)) - offset_z; + m_grabbers[5].center = transform * Vec3d(center(0), center(1), m_box.max(2)) + offset_z; + ::memcpy((void*)m_grabbers[4].color, (const void*)&AXES_COLOR[2], 3 * sizeof(float)); + ::memcpy((void*)m_grabbers[5].color, (const void*)&AXES_COLOR[2], 3 * sizeof(float)); + + // uniform + m_grabbers[6].center = transform * Vec3d(m_box.min(0), m_box.min(1), center(2)) - offset_x - offset_y; + m_grabbers[7].center = transform * Vec3d(m_box.max(0), m_box.min(1), center(2)) + offset_x - offset_y; + m_grabbers[8].center = transform * Vec3d(m_box.max(0), m_box.max(1), center(2)) + offset_x + offset_y; + m_grabbers[9].center = transform * Vec3d(m_box.min(0), m_box.max(1), center(2)) - offset_x + offset_y; + for (int i = 6; i < 10; ++i) + { + ::memcpy((void*)m_grabbers[i].color, (const void*)m_highlight_color, 3 * sizeof(float)); + } + + // sets grabbers orientation + for (int i = 0; i < 10; ++i) + { + m_grabbers[i].angles = angles; + } + + ::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f); + + float grabber_mean_size = (float)(grabber_size(0) + grabber_size(1) + grabber_size(2)) / 3.0f; + + if (m_hover_id == -1) + { + // draw connections + if (m_grabbers[0].enabled && m_grabbers[1].enabled) + { + ::glColor3fv(m_grabbers[0].color); + render_grabbers_connection(0, 1); + } + if (m_grabbers[2].enabled && m_grabbers[3].enabled) + { + ::glColor3fv(m_grabbers[2].color); + render_grabbers_connection(2, 3); + } + if (m_grabbers[4].enabled && m_grabbers[5].enabled) + { + ::glColor3fv(m_grabbers[4].color); + render_grabbers_connection(4, 5); + } + ::glColor3fv(m_base_color); + render_grabbers_connection(6, 7); + render_grabbers_connection(7, 8); + render_grabbers_connection(8, 9); + render_grabbers_connection(9, 6); + // draw grabbers + render_grabbers(grabber_mean_size); + } + else if ((m_hover_id == 0) || (m_hover_id == 1)) + { + // draw connection + ::glColor3fv(m_grabbers[0].color); + render_grabbers_connection(0, 1); + // draw grabbers + m_grabbers[0].render(true, grabber_mean_size); + m_grabbers[1].render(true, grabber_mean_size); + } + else if ((m_hover_id == 2) || (m_hover_id == 3)) + { + // draw connection + ::glColor3fv(m_grabbers[2].color); + render_grabbers_connection(2, 3); + // draw grabbers + m_grabbers[2].render(true, grabber_mean_size); + m_grabbers[3].render(true, grabber_mean_size); + } + else if ((m_hover_id == 4) || (m_hover_id == 5)) + { + // draw connection + ::glColor3fv(m_grabbers[4].color); + render_grabbers_connection(4, 5); + // draw grabbers + m_grabbers[4].render(true, grabber_mean_size); + m_grabbers[5].render(true, grabber_mean_size); + } + else if (m_hover_id >= 6) + { + // draw connection + ::glColor3fv(m_drag_color); + render_grabbers_connection(6, 7); + render_grabbers_connection(7, 8); + render_grabbers_connection(8, 9); + render_grabbers_connection(9, 6); + // draw grabbers + for (int i = 6; i < 10; ++i) + { + m_grabbers[i].render(true, grabber_mean_size); + } + } +} + +void GLGizmoScale3D::on_render_for_picking(const GLCanvas3D::Selection& selection) const +{ + ::glDisable(GL_DEPTH_TEST); + + render_grabbers_for_picking(selection.get_bounding_box()); +} + +#if ENABLE_IMGUI +void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +{ +#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI + bool single_instance = selection.is_single_full_instance(); + wxString label = _(L("Scale (%)")); + + m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + m_imgui->input_vec3("", m_scale * 100.f, 100.0f, "%.2f"); + m_imgui->end(); +#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI +} +#endif // ENABLE_IMGUI + +void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2) const +{ + unsigned int grabbers_count = (unsigned int)m_grabbers.size(); + if ((id_1 < grabbers_count) && (id_2 < grabbers_count)) + { + ::glBegin(GL_LINES); + ::glVertex3dv(m_grabbers[id_1].center.data()); + ::glVertex3dv(m_grabbers[id_2].center.data()); + ::glEnd(); + } +} + +void GLGizmoScale3D::do_scale_x(const UpdateData& data) +{ + double ratio = calc_ratio(data); + if (ratio > 0.0) + m_scale(0) = m_starting_scale(0) * ratio; +} + +void GLGizmoScale3D::do_scale_y(const UpdateData& data) +{ + double ratio = calc_ratio(data); + if (ratio > 0.0) + m_scale(1) = m_starting_scale(1) * ratio; +} + +void GLGizmoScale3D::do_scale_z(const UpdateData& data) +{ + double ratio = calc_ratio(data); + if (ratio > 0.0) + m_scale(2) = m_starting_scale(2) * ratio; +} + +void GLGizmoScale3D::do_scale_uniform(const UpdateData& data) +{ + double ratio = calc_ratio(data); + if (ratio > 0.0) + m_scale = m_starting_scale * ratio; +} + +double GLGizmoScale3D::calc_ratio(const UpdateData& data) const +{ + double ratio = 0.0; + + // vector from the center to the starting position + Vec3d starting_vec = m_starting_drag_position - m_starting_box.center(); + double len_starting_vec = starting_vec.norm(); + if (len_starting_vec != 0.0) + { + Vec3d mouse_dir = data.mouse_ray.unit_vector(); + // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position + // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form + // in our case plane normal and ray direction are the same (orthogonal view) + // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal + Vec3d inters = data.mouse_ray.a + (m_starting_drag_position - data.mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; + // vector from the starting position to the found intersection + Vec3d inters_vec = inters - m_starting_drag_position; + + // finds projection of the vector along the staring direction + double proj = inters_vec.dot(starting_vec.normalized()); + + ratio = (len_starting_vec + proj) / len_starting_vec; + } + + if (data.shift_down) + ratio = m_snap_step * (double)std::round(ratio / m_snap_step); + + return ratio; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp new file mode 100644 index 000000000..a6ee40c1a --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -0,0 +1,65 @@ +#ifndef slic3r_GLGizmoScale_hpp_ +#define slic3r_GLGizmoScale_hpp_ + +#include "GLGizmoBase.hpp" + + +namespace Slic3r { +namespace GUI { + +class GLGizmoScale3D : public GLGizmoBase +{ + static const float Offset; + + mutable BoundingBoxf3 m_box; + + Vec3d m_scale; + + double m_snap_step; + + Vec3d m_starting_scale; + Vec3d m_starting_drag_position; + BoundingBoxf3 m_starting_box; + +public: +#if ENABLE_SVG_ICONS + GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); +#else + GLGizmoScale3D(GLCanvas3D& parent, unsigned int sprite_id); +#endif // ENABLE_SVG_ICONS + + double get_snap_step(double step) const { return m_snap_step; } + void set_snap_step(double step) { m_snap_step = step; } + + const Vec3d& get_scale() const { return m_scale; } + void set_scale(const Vec3d& scale) { m_starting_scale = scale; m_scale = scale; } + +protected: + virtual bool on_init(); + virtual std::string on_get_name() const; + virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); } + virtual void on_start_dragging(const GLCanvas3D::Selection& selection); + virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); + virtual void on_render(const GLCanvas3D::Selection& selection) const; + virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + +#if ENABLE_IMGUI + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); +#endif // ENABLE_IMGUI + +private: + void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; + + void do_scale_x(const UpdateData& data); + void do_scale_y(const UpdateData& data); + void do_scale_z(const UpdateData& data); + void do_scale_uniform(const UpdateData& data); + + double calc_ratio(const UpdateData& data) const; +}; + + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoScale_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp new file mode 100644 index 000000000..c43f80de2 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -0,0 +1,912 @@ +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoSlaSupports.hpp" + +#include + +#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectSettings.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/PresetBundle.hpp" + + +namespace Slic3r { +namespace GUI { + +#if ENABLE_SVG_ICONS +GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +#else +GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id) + : GLGizmoBase(parent, sprite_id) +#endif // ENABLE_SVG_ICONS + , m_starting_center(Vec3d::Zero()), m_quadric(nullptr) +{ + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + // using GLU_FILL does not work when the instance's transformation + // contains mirroring (normals are reverted) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +} + +GLGizmoSlaSupports::~GLGizmoSlaSupports() +{ + if (m_quadric != nullptr) + ::gluDeleteQuadric(m_quadric); +} + +bool GLGizmoSlaSupports::on_init() +{ + m_shortcut_key = WXK_CONTROL_L; + return true; +} + +void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection) +{ + m_starting_center = Vec3d::Zero(); + m_old_model_object = m_model_object; + m_model_object = model_object; + if (selection.is_empty()) + m_old_instance_id = -1; + + m_active_instance = selection.get_instance_idx(); + + if (model_object && selection.is_from_single_instance()) + { + if (is_mesh_update_necessary()) { + update_mesh(); + editing_mode_reload_cache(); + } + + if (m_model_object != m_old_model_object) + m_editing_mode = false; + + if (m_editing_mode_cache.empty() && m_model_object->sla_points_status != sla::PointsStatus::UserModified) + get_data_from_backend(); + + if (m_state == On) { + m_parent.toggle_model_objects_visibility(false); + m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + } + } +} + +void GLGizmoSlaSupports::on_render(const GLCanvas3D::Selection& selection) const +{ + ::glEnable(GL_BLEND); + ::glEnable(GL_DEPTH_TEST); + + render_points(selection, false); + render_selection_rectangle(); + +#if !ENABLE_IMGUI + render_tooltip_texture(); +#endif // not ENABLE_IMGUI + + ::glDisable(GL_BLEND); +} + +void GLGizmoSlaSupports::render_selection_rectangle() const +{ + if (!m_selection_rectangle_active) + return; + + ::glLineWidth(1.5f); + float render_color[3] = {1.f, 0.f, 0.f}; + ::glColor3fv(render_color); + + ::glPushAttrib(GL_TRANSFORM_BIT); // remember current MatrixMode + + ::glMatrixMode(GL_MODELVIEW); // cache modelview matrix and set to identity + ::glPushMatrix(); + ::glLoadIdentity(); + + ::glMatrixMode(GL_PROJECTION); // cache projection matrix and set to identity + ::glPushMatrix(); + ::glLoadIdentity(); + + ::glOrtho(0.f, m_canvas_width, m_canvas_height, 0.f, -1.f, 1.f); // set projection matrix so that world coords = window coords + + // render the selection rectangle (window coordinates): + ::glPushAttrib(GL_ENABLE_BIT); + ::glLineStipple(4, 0xAAAA); + ::glEnable(GL_LINE_STIPPLE); + + ::glBegin(GL_LINE_LOOP); + ::glVertex3f((GLfloat)m_selection_rectangle_start_corner(0), (GLfloat)m_selection_rectangle_start_corner(1), (GLfloat)0.5f); + ::glVertex3f((GLfloat)m_selection_rectangle_end_corner(0), (GLfloat)m_selection_rectangle_start_corner(1), (GLfloat)0.5f); + ::glVertex3f((GLfloat)m_selection_rectangle_end_corner(0), (GLfloat)m_selection_rectangle_end_corner(1), (GLfloat)0.5f); + ::glVertex3f((GLfloat)m_selection_rectangle_start_corner(0), (GLfloat)m_selection_rectangle_end_corner(1), (GLfloat)0.5f); + ::glEnd(); + ::glPopAttrib(); + + ::glPopMatrix(); // restore former projection matrix + ::glMatrixMode(GL_MODELVIEW); + ::glPopMatrix(); // restore former modelview matrix + ::glPopAttrib(); // restore former MatrixMode +} + +void GLGizmoSlaSupports::on_render_for_picking(const GLCanvas3D::Selection& selection) const +{ + ::glEnable(GL_DEPTH_TEST); + + render_points(selection, true); +} + +void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, bool picking) const +{ + if (m_quadric == nullptr || !selection.is_from_single_instance()) + return; + + if (!picking) + ::glEnable(GL_LIGHTING); + + const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); + double z_shift = vol->get_sla_shift_z(); + const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); + const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); + + ::glPushMatrix(); + ::glTranslated(0.0, 0.0, z_shift); + ::glMultMatrixd(instance_matrix.data()); + + float render_color[3]; + for (int i = 0; i < (int)m_editing_mode_cache.size(); ++i) + { + const sla::SupportPoint& support_point = m_editing_mode_cache[i].support_point; + const bool& point_selected = m_editing_mode_cache[i].selected; + + // First decide about the color of the point. + if (picking) { + std::array color = picking_color_component(i); + render_color[0] = color[0]; + render_color[1] = color[1]; + render_color[2] = color[2]; + } + else { + if ((m_hover_id == i && m_editing_mode)) { // ignore hover state unless editing mode is active + render_color[0] = 0.f; + render_color[1] = 1.0f; + render_color[2] = 1.0f; + } + else { // neigher hover nor picking + bool supports_new_island = m_lock_unique_islands && m_editing_mode_cache[i].support_point.is_new_island; + if (m_editing_mode) { + render_color[0] = point_selected ? 1.0f : (supports_new_island ? 0.3f : 0.7f); + render_color[1] = point_selected ? 0.3f : (supports_new_island ? 0.3f : 0.7f); + render_color[2] = point_selected ? 0.3f : (supports_new_island ? 1.0f : 0.7f); + } + else + for (unsigned char i=0; i<3; ++i) render_color[i] = 0.5f; + } + } + ::glColor3fv(render_color); + float render_color_emissive[4] = { 0.5f * render_color[0], 0.5f * render_color[1], 0.5f * render_color[2], 1.f}; + ::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive); + + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. + ::glPushMatrix(); + ::glTranslated(support_point.pos(0), support_point.pos(1), support_point.pos(2)); + ::glMultMatrixd(instance_scaling_matrix_inverse.data()); + + // Matrices set, we can render the point mark now. + // If in editing mode, we'll also render a cone pointing to the sphere. + if (m_editing_mode) { + if (m_editing_mode_cache[i].normal == Vec3f::Zero()) + update_cache_entry_normal(i); // in case the normal is not yet cached, find and cache it + + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_mode_cache[i].normal.cast()); + Eigen::AngleAxisd aa(q); + ::glRotated(aa.angle() * (180./M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2)); + + const float cone_radius = 0.25f; // mm + const float cone_height = 0.75f; + ::glPushMatrix(); + ::glTranslatef(0.f, 0.f, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale); + ::gluCylinder(m_quadric, 0.f, cone_radius, cone_height, 36, 1); + ::glTranslatef(0.f, 0.f, cone_height); + ::gluDisk(m_quadric, 0.0, cone_radius, 36, 1); + ::glPopMatrix(); + } + ::gluSphere(m_quadric, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale, 64, 36); + ::glPopMatrix(); + } + + { + // Reset emissive component to zero (the default value) + float render_color_emissive[4] = { 0.f, 0.f, 0.f, 1.f }; + ::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive); + } + + if (!picking) + ::glDisable(GL_LIGHTING); + + ::glPopMatrix(); +} + +bool GLGizmoSlaSupports::is_mesh_update_necessary() const +{ + return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) + && ((m_model_object != m_old_model_object) || m_V.size()==0); + + //if (m_state != On || !m_model_object || m_model_object->instances.empty() || ! m_instance_matrix.isApprox(m_source_data.matrix)) + // return false; +} + +void GLGizmoSlaSupports::update_mesh() +{ + wxBusyCursor wait; + Eigen::MatrixXf& V = m_V; + Eigen::MatrixXi& F = m_F; + // Composite mesh of all instances in the world coordinate system. + // This mesh does not account for the possible Z up SLA offset. + TriangleMesh mesh = m_model_object->raw_mesh(); + const stl_file& stl = mesh.stl; + V.resize(3 * stl.stats.number_of_facets, 3); + F.resize(stl.stats.number_of_facets, 3); + for (unsigned int i=0; ivertex[0](0); V(3*i+0, 1) = facet->vertex[0](1); V(3*i+0, 2) = facet->vertex[0](2); + V(3*i+1, 0) = facet->vertex[1](0); V(3*i+1, 1) = facet->vertex[1](1); V(3*i+1, 2) = facet->vertex[1](2); + V(3*i+2, 0) = facet->vertex[2](0); V(3*i+2, 1) = facet->vertex[2](1); V(3*i+2, 2) = facet->vertex[2](2); + F(i, 0) = 3*i+0; + F(i, 1) = 3*i+1; + F(i, 2) = 3*i+2; + } + + m_AABB = igl::AABB(); + m_AABB.init(m_V, m_F); +} + +std::pair GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) +{ + // if the gizmo doesn't have the V, F structures for igl, calculate them first: + if (m_V.size() == 0) + update_mesh(); + + Eigen::Matrix viewport; + ::glGetIntegerv(GL_VIEWPORT, viewport.data()); + Eigen::Matrix modelview_matrix; + ::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix.data()); + Eigen::Matrix projection_matrix; + ::glGetDoublev(GL_PROJECTION_MATRIX, projection_matrix.data()); + + Vec3d point1; + Vec3d point2; + ::gluUnProject(mouse_pos(0), viewport(3)-mouse_pos(1), 0.f, modelview_matrix.data(), projection_matrix.data(), viewport.data(), &point1(0), &point1(1), &point1(2)); + ::gluUnProject(mouse_pos(0), viewport(3)-mouse_pos(1), 1.f, modelview_matrix.data(), projection_matrix.data(), viewport.data(), &point2(0), &point2(1), &point2(2)); + + igl::Hit hit; + + const GLCanvas3D::Selection& selection = m_parent.get_selection(); + const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); + double z_offset = volume->get_sla_shift_z(); + + point1(2) -= z_offset; + point2(2) -= z_offset; + + Transform3d inv = volume->get_instance_transformation().get_matrix().inverse(); + + point1 = inv * point1; + point2 = inv * point2; + + if (!m_AABB.intersect_ray(m_V, m_F, point1.cast(), (point2-point1).cast(), hit)) + throw std::invalid_argument("unproject_on_mesh(): No intersection found."); + + int fid = hit.id; // facet id + Vec3f bc(1-hit.u-hit.v, hit.u, hit.v); // barycentric coordinates of the hit + Vec3f a = (m_V.row(m_F(fid, 1)) - m_V.row(m_F(fid, 0))); + Vec3f b = (m_V.row(m_F(fid, 2)) - m_V.row(m_F(fid, 0))); + + // Calculate and return both the point and the facet normal. + return std::make_pair( + bc(0) * m_V.row(m_F(fid, 0)) + bc(1) * m_V.row(m_F(fid, 1)) + bc(2)*m_V.row(m_F(fid, 2)), + a.cross(b) + ); +} + +// Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. +// The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is +// aware that the event was reacted to and stops trying to make different sense of it. If the gizmo +// concludes that the event was not intended for it, it should return false. +bool GLGizmoSlaSupports::mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down) +{ + if (m_editing_mode) { + + // left down - show the selection rectangle: + if (action == SLAGizmoEventType::LeftDown && shift_down) { + if (m_hover_id == -1) { + m_selection_rectangle_active = true; + m_selection_rectangle_start_corner = mouse_position; + m_selection_rectangle_end_corner = mouse_position; + m_canvas_width = m_parent.get_canvas_size().get_width(); + m_canvas_height = m_parent.get_canvas_size().get_height(); + } + else + select_point(m_hover_id); + + return true; + } + + // dragging the selection rectangle: + if (action == SLAGizmoEventType::Dragging && m_selection_rectangle_active) { + m_selection_rectangle_end_corner = mouse_position; + return true; + } + + // mouse up without selection rectangle - place point on the mesh: + if (action == SLAGizmoEventType::LeftUp && !m_selection_rectangle_active && !shift_down) { + if (m_ignore_up_event) { + m_ignore_up_event = false; + return false; + } + + int instance_id = m_parent.get_selection().get_instance_idx(); + if (m_old_instance_id != instance_id) + { + bool something_selected = (m_old_instance_id != -1); + m_old_instance_id = instance_id; + if (something_selected) + return false; + } + if (instance_id == -1) + return false; + + // If there is some selection, don't add new point and deselect everything instead. + if (m_selection_empty) { + try { + std::pair pos_and_normal = unproject_on_mesh(mouse_position); // don't create anything if this throws + m_editing_mode_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); + m_unsaved_changes = true; + } + catch (...) { // not clicked on object + return true; // prevents deselection of the gizmo by GLCanvas3D + } + } + else + select_point(NoPoints); + + return true; + } + + // left up with selection rectangle - select points inside the rectangle: + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp) + && m_selection_rectangle_active) { + if (action == SLAGizmoEventType::ShiftUp) + m_ignore_up_event = true; + const Transform3d& instance_matrix = m_model_object->instances[m_active_instance]->get_transformation().get_matrix(); + GLint viewport[4]; + ::glGetIntegerv(GL_VIEWPORT, viewport); + GLdouble modelview_matrix[16]; + ::glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix); + GLdouble projection_matrix[16]; + ::glGetDoublev(GL_PROJECTION_MATRIX, projection_matrix); + + const GLCanvas3D::Selection& selection = m_parent.get_selection(); + const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); + double z_offset = volume->get_sla_shift_z(); + + // bounding box created from the rectangle corners - will take care of order of the corners + BoundingBox rectangle(Points{Point(m_selection_rectangle_start_corner.cast()), Point(m_selection_rectangle_end_corner.cast())}); + + const Transform3d& instance_matrix_no_translation = volume->get_instance_transformation().get_matrix(true); + // we'll recover current look direction from the modelview matrix (in world coords)... + Vec3f direction_to_camera(modelview_matrix[2], modelview_matrix[6], modelview_matrix[10]); + // ...and transform it to model coords. + direction_to_camera = (instance_matrix_no_translation.inverse().cast() * direction_to_camera).normalized().eval(); + + // Iterate over all points, check if they're in the rectangle and if so, check that they are not obscured by the mesh: + for (unsigned int i=0; i() * support_point.pos; + pos(2) += z_offset; + GLdouble out_x, out_y, out_z; + ::gluProject((GLdouble)pos(0), (GLdouble)pos(1), (GLdouble)pos(2), modelview_matrix, projection_matrix, viewport, &out_x, &out_y, &out_z); + out_y = m_canvas_height - out_y; + + if (rectangle.contains(Point(out_x, out_y))) { + bool is_obscured = false; + // Cast a ray in the direction of the camera and look for intersection with the mesh: + std::vector hits; + // Offset the start of the ray to the front of the ball + EPSILON to account for numerical inaccuracies. + if (m_AABB.intersect_ray(m_V, m_F, support_point.pos + direction_to_camera * (support_point.head_front_radius + EPSILON), direction_to_camera, hits)) + // FIXME: the intersection could in theory be behind the camera, but as of now we only have camera direction. + // Also, the threshold is in mesh coordinates, not in actual dimensions. + if (hits.size() > 1 || hits.front().t > 0.001f) + is_obscured = true; + + if (!is_obscured) + select_point(i); + } + } + m_selection_rectangle_active = false; + return true; + } + + if (action == SLAGizmoEventType::Delete) { + // delete key pressed + delete_selected_points(); + return true; + } + + if (action == SLAGizmoEventType::ApplyChanges) { + editing_mode_apply_changes(); + return true; + } + + if (action == SLAGizmoEventType::DiscardChanges) { + editing_mode_discard_changes(); + return true; + } + + if (action == SLAGizmoEventType::RightDown) { + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + delete_selected_points(); + return true; + } + return false; + } + + if (action == SLAGizmoEventType::SelectAll) { + select_point(AllPoints); + return true; + } + } + + if (!m_editing_mode) { + if (action == SLAGizmoEventType::AutomaticGeneration) { + auto_generate(); + return true; + } + + if (action == SLAGizmoEventType::ManualEditing) { + switch_to_editing_mode(); + return true; + } + } + + return false; +} + +void GLGizmoSlaSupports::delete_selected_points(bool force) +{ + for (unsigned int idx=0; idxreslice_SLA_supports(*m_model_object); + } + + select_point(NoPoints); + + //m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); +} + +void GLGizmoSlaSupports::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +{ + if (m_editing_mode && m_hover_id != -1 && data.mouse_pos && (!m_editing_mode_cache[m_hover_id].support_point.is_new_island || !m_lock_unique_islands)) { + std::pair pos_and_normal; + try { + pos_and_normal = unproject_on_mesh(Vec2d((*data.mouse_pos)(0), (*data.mouse_pos)(1))); + } + catch (...) { return; } + m_editing_mode_cache[m_hover_id].support_point.pos = pos_and_normal.first; + m_editing_mode_cache[m_hover_id].support_point.is_new_island = false; + m_editing_mode_cache[m_hover_id].normal = pos_and_normal.second; + m_unsaved_changes = true; + // Do not update immediately, wait until the mouse is released. + // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + } +} + +#if !ENABLE_IMGUI +void GLGizmoSlaSupports::render_tooltip_texture() const { + if (m_tooltip_texture.get_id() == 0) + if (!m_tooltip_texture.load_from_file(resources_dir() + "/icons/sla_support_points_tooltip.png", false)) + return; + if (m_reset_texture.get_id() == 0) + if (!m_reset_texture.load_from_file(resources_dir() + "/icons/sla_support_points_reset.png", false)) + return; + + float zoom = m_parent.get_camera_zoom(); + float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + float gap = 30.0f * inv_zoom; + + const Size& cnv_size = m_parent.get_canvas_size(); + float l = gap - cnv_size.get_width()/2.f * inv_zoom; + float r = l + (float)m_tooltip_texture.get_width() * inv_zoom; + float b = gap - cnv_size.get_height()/2.f * inv_zoom; + float t = b + (float)m_tooltip_texture.get_height() * inv_zoom; + + Rect reset_rect = m_parent.get_gizmo_reset_rect(m_parent, true); + + ::glDisable(GL_DEPTH_TEST); + ::glPushMatrix(); + ::glLoadIdentity(); + GLTexture::render_texture(m_tooltip_texture.get_id(), l, r, b, t); + GLTexture::render_texture(m_reset_texture.get_id(), reset_rect.get_left(), reset_rect.get_right(), reset_rect.get_bottom(), reset_rect.get_top()); + ::glPopMatrix(); + ::glEnable(GL_DEPTH_TEST); +} +#endif // not ENABLE_IMGUI + + +std::vector GLGizmoSlaSupports::get_config_options(const std::vector& keys) const +{ + std::vector out; + + if (!m_model_object) + return out; + + const DynamicPrintConfig& object_cfg = m_model_object->config; + const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + std::unique_ptr default_cfg = nullptr; + + for (const std::string& key : keys) { + if (object_cfg.has(key)) + out.push_back(object_cfg.option(key)); + else + if (print_cfg.has(key)) + out.push_back(print_cfg.option(key)); + else { // we must get it from defaults + if (default_cfg == nullptr) + default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); + out.push_back(default_cfg->option(key)); + } + } + + return out; +} + + +void GLGizmoSlaSupports::update_cache_entry_normal(unsigned int i) const +{ + int idx = 0; + Eigen::Matrix pp = m_editing_mode_cache[i].support_point.pos; + Eigen::Matrix cc; + m_AABB.squared_distance(m_V, m_F, pp, idx, cc); + Vec3f a = (m_V.row(m_F(idx, 1)) - m_V.row(m_F(idx, 0))); + Vec3f b = (m_V.row(m_F(idx, 2)) - m_V.row(m_F(idx, 0))); + m_editing_mode_cache[i].normal = a.cross(b); +} + + + +#if ENABLE_IMGUI +void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +{ + if (!m_model_object) + return; + + bool first_run = true; // This is a hack to redraw the button when all points are removed, + // so it is not delayed until the background process finishes. +RENDER_AGAIN: + m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + + const float scaling = m_imgui->get_style_scaling(); + const ImVec2 window_size(285.f * scaling, 300.f * scaling); + ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); + ImGui::SetNextWindowSize(ImVec2(window_size)); + + m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + ImGui::PushItemWidth(100.0f); + + bool force_refresh = false; + bool remove_selected = false; + bool remove_all = false; + + if (m_editing_mode) { + m_imgui->text(_(L("Left mouse click - add point"))); + m_imgui->text(_(L("Right mouse click - remove point"))); + m_imgui->text(_(L("Shift + Left (+ drag) - select point(s)"))); + m_imgui->text(" "); // vertical gap + + float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; + if (m_new_point_head_diameter > diameter_upper_cap) + m_new_point_head_diameter = diameter_upper_cap; + + m_imgui->text(_(L("Head diameter: "))); + ImGui::SameLine(); + if (ImGui::SliderFloat("", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f")) { + // value was changed + for (auto& cache_entry : m_editing_mode_cache) + if (cache_entry.selected) { + cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; + m_unsaved_changes = true; + } + } + + bool changed = m_lock_unique_islands; + m_imgui->checkbox(_(L("Lock supports under new islands")), m_lock_unique_islands); + force_refresh |= changed != m_lock_unique_islands; + + m_imgui->disabled_begin(m_selection_empty); + remove_selected = m_imgui->button(_(L("Remove selected points"))); + m_imgui->disabled_end(); + + m_imgui->disabled_begin(m_editing_mode_cache.empty()); + remove_all = m_imgui->button(_(L("Remove all points"))); + m_imgui->disabled_end(); + + m_imgui->text(" "); // vertical gap + + if (m_imgui->button(_(L("Apply changes")))) { + editing_mode_apply_changes(); + force_refresh = true; + } + ImGui::SameLine(); + bool discard_changes = m_imgui->button(_(L("Discard changes"))); + if (discard_changes) { + editing_mode_discard_changes(); + force_refresh = true; + } + } + else { // not in editing mode: + ImGui::PushItemWidth(100.0f); + m_imgui->text(_(L("Minimal points distance: "))); + ImGui::SameLine(); + + std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); + float density = static_cast(opts[0])->value; + float minimal_point_distance = static_cast(opts[1])->value; + + bool value_changed = ImGui::SliderFloat("", &minimal_point_distance, 0.f, 20.f, "%.f mm"); + if (value_changed) + m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + + m_imgui->text(_(L("Support points density: "))); + ImGui::SameLine(); + if (ImGui::SliderFloat(" ", &density, 0.f, 200.f, "%.f %%")) { + value_changed = true; + m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + } + + if (value_changed) { // Update side panel + wxTheApp->CallAfter([]() { + wxGetApp().obj_settings()->UpdateAndShow(true); + wxGetApp().obj_list()->update_settings_items(); + }); + } + + bool generate = m_imgui->button(_(L("Auto-generate points [A]"))); + + if (generate) + auto_generate(); + + m_imgui->text(""); + if (m_imgui->button(_(L("Manual editing [M]")))) + switch_to_editing_mode(); + + m_imgui->disabled_begin(m_editing_mode_cache.empty()); + remove_all = m_imgui->button(_(L("Remove all points"))); + m_imgui->disabled_end(); + + m_imgui->text(""); + + m_imgui->text(m_model_object->sla_points_status == sla::PointsStatus::None ? "No points (will be autogenerated)" : + (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated ? "Autogenerated points (no modifications)" : + (m_model_object->sla_points_status == sla::PointsStatus::UserModified ? "User-modified points" : + (m_model_object->sla_points_status == sla::PointsStatus::Generating ? "Generation in progress..." : "UNKNOWN STATUS")))); + } + + m_imgui->end(); + + if (m_editing_mode != m_old_editing_state) { // user toggled between editing/non-editing mode + m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode); + force_refresh = true; + } + m_old_editing_state = m_editing_mode; + + if (remove_selected || remove_all) { + force_refresh = false; + m_parent.set_as_dirty(); + if (remove_all) + select_point(AllPoints); + delete_selected_points(remove_all); + if (remove_all && !m_editing_mode) + editing_mode_apply_changes(); + if (first_run) { + first_run = false; + goto RENDER_AGAIN; + } + } + + if (force_refresh) + m_parent.set_as_dirty(); +} +#endif // ENABLE_IMGUI + +bool GLGizmoSlaSupports::on_is_activable(const GLCanvas3D::Selection& selection) const +{ + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA + || !selection.is_from_single_instance()) + return false; + + // Check that none of the selected volumes is outside. + const GLCanvas3D::Selection::IndicesList& list = selection.get_volume_idxs(); + for (const auto& idx : list) + if (selection.get_volume(idx)->is_outside) + return false; + + return true; +} + +bool GLGizmoSlaSupports::on_is_selectable() const +{ + return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA); +} + +std::string GLGizmoSlaSupports::on_get_name() const +{ + return L("SLA Support Points [L]"); +} + +void GLGizmoSlaSupports::on_set_state() +{ + if (m_state == On && m_old_state != On) { // the gizmo was just turned on + if (is_mesh_update_necessary()) + update_mesh(); + + // we'll now reload support points: + if (m_model_object) + editing_mode_reload_cache(); + + m_parent.toggle_model_objects_visibility(false); + if (m_model_object) + m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + + // Set default head diameter from config. + const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; + } + if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off + if (m_model_object) { + if (m_unsaved_changes) { + wxMessageDialog dlg(GUI::wxGetApp().plater(), _(L("Do you want to save your manually edited support points ?\n")), + _(L("Save changes?")), wxICON_QUESTION | wxYES | wxNO); + if (dlg.ShowModal() == wxID_YES) + editing_mode_apply_changes(); + else + editing_mode_discard_changes(); + } + } + + m_parent.toggle_model_objects_visibility(true); + m_editing_mode = false; // so it is not active next time the gizmo opens + m_editing_mode_cache.clear(); + } + m_old_state = m_state; +} + + + +void GLGizmoSlaSupports::on_start_dragging(const GLCanvas3D::Selection& selection) +{ + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + } +} + + + +void GLGizmoSlaSupports::select_point(int i) +{ + if (i == AllPoints || i == NoPoints) { + for (auto& point_and_selection : m_editing_mode_cache) + point_and_selection.selected = ( i == AllPoints ); + m_selection_empty = (i == NoPoints); + + if (i == AllPoints) + m_new_point_head_diameter = m_editing_mode_cache[0].support_point.head_front_radius * 2.f; + } + else { + m_editing_mode_cache[i].selected = true; + m_selection_empty = false; + m_new_point_head_diameter = m_editing_mode_cache[i].support_point.head_front_radius * 2.f; + } +} + + + +void GLGizmoSlaSupports::editing_mode_discard_changes() +{ + m_editing_mode_cache.clear(); + for (const sla::SupportPoint& point : m_model_object->sla_support_points) + m_editing_mode_cache.emplace_back(point, false); + m_editing_mode = false; + m_unsaved_changes = false; +} + + + +void GLGizmoSlaSupports::editing_mode_apply_changes() +{ + // If there are no changes, don't touch the front-end. The data in the cache could have been + // taken from the backend and copying them to ModelObject would needlessly invalidate them. + if (m_unsaved_changes) { + m_model_object->sla_points_status = sla::PointsStatus::UserModified; + m_model_object->sla_support_points.clear(); + for (const CacheEntry& cache_entry : m_editing_mode_cache) + m_model_object->sla_support_points.push_back(cache_entry.support_point); + + // Recalculate support structures once the editing mode is left. + // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + wxGetApp().plater()->reslice_SLA_supports(*m_model_object); + } + m_editing_mode = false; + m_unsaved_changes = false; +} + + + +void GLGizmoSlaSupports::editing_mode_reload_cache() +{ + m_editing_mode_cache.clear(); + for (const sla::SupportPoint& point : m_model_object->sla_support_points) + m_editing_mode_cache.emplace_back(point, false); + + m_unsaved_changes = false; +} + + + +void GLGizmoSlaSupports::get_data_from_backend() +{ + for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { + if (po->model_object()->id() == m_model_object->id() && po->is_step_done(slaposSupportPoints)) { + m_editing_mode_cache.clear(); + const std::vector& points = po->get_support_points(); + auto mat = po->trafo().inverse().cast(); + for (unsigned int i=0; isla_points_status != sla::PointsStatus::UserModified) + m_model_object->sla_points_status = sla::PointsStatus::AutoGenerated; + + break; + } + } + m_unsaved_changes = false; + + // We don't copy the data into ModelObject, as this would stop the background processing. +} + + + +void GLGizmoSlaSupports::auto_generate() +{ + wxMessageDialog dlg(GUI::wxGetApp().plater(), _(L( + "Autogeneration will erase all manually edited points.\n\n" + "Are you sure you want to do it?\n" + )), _(L("Warning")), wxICON_WARNING | wxYES | wxNO); + + if (m_model_object->sla_points_status != sla::PointsStatus::UserModified || m_editing_mode_cache.empty() || dlg.ShowModal() == wxID_YES) { + m_model_object->sla_support_points.clear(); + m_model_object->sla_points_status = sla::PointsStatus::Generating; + m_editing_mode_cache.clear(); + wxGetApp().plater()->reslice_SLA_supports(*m_model_object); + } +} + + + +void GLGizmoSlaSupports::switch_to_editing_mode() +{ + if (m_model_object->sla_points_status != sla::PointsStatus::AutoGenerated) + editing_mode_reload_cache(); + m_unsaved_changes = false; + m_editing_mode = true; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp new file mode 100644 index 000000000..44842e5c5 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -0,0 +1,137 @@ +#ifndef slic3r_GLGizmoSlaSupports_hpp_ +#define slic3r_GLGizmoSlaSupports_hpp_ + +#include "GLGizmoBase.hpp" + +// There is an L function in igl that would be overridden by our localization macro - let's undefine it... +#undef L +#include +#include "slic3r/GUI/I18N.hpp" // ...and redefine again when we are done with the igl code + +#include "libslic3r/SLA/SLACommon.hpp" +#include "libslic3r/SLAPrint.hpp" + + +namespace Slic3r { +namespace GUI { + + +class GLGizmoSlaSupports : public GLGizmoBase +{ +private: + ModelObject* m_model_object = nullptr; + ModelObject* m_old_model_object = nullptr; + int m_active_instance = -1; + int m_old_instance_id = -1; + std::pair unproject_on_mesh(const Vec2d& mouse_pos); + + const float RenderPointScale = 1.f; + + GLUquadricObj* m_quadric; + Eigen::MatrixXf m_V; // vertices + Eigen::MatrixXi m_F; // facets indices + igl::AABB m_AABB; + + struct SourceDataSummary { + Geometry::Transformation transformation; + }; + + class CacheEntry { + public: + CacheEntry(const sla::SupportPoint& point, bool sel, const Vec3f& norm = Vec3f::Zero()) : + support_point(point), selected(sel), normal(norm) {} + + sla::SupportPoint support_point; + bool selected; // whether the point is selected + Vec3f normal; + }; + + // This holds information to decide whether recalculation is necessary: + SourceDataSummary m_source_data; + + mutable Vec3d m_starting_center; + +public: +#if ENABLE_SVG_ICONS + GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); +#else + GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id); +#endif // ENABLE_SVG_ICONS + virtual ~GLGizmoSlaSupports(); + void set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection); + bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down); + void delete_selected_points(bool force = false); + std::pair get_sla_clipping_plane() const; + +private: + bool on_init(); + void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); + virtual void on_render(const GLCanvas3D::Selection& selection) const; + virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + + void render_selection_rectangle() const; + void render_points(const GLCanvas3D::Selection& selection, bool picking = false) const; + bool is_mesh_update_necessary() const; + void update_mesh(); + void update_cache_entry_normal(unsigned int i) const; + +#if !ENABLE_IMGUI + void render_tooltip_texture() const; + mutable GLTexture m_tooltip_texture; + mutable GLTexture m_reset_texture; +#endif // not ENABLE_IMGUI + + bool m_lock_unique_islands = false; + bool m_editing_mode = false; // Is editing mode active? + bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). + float m_new_point_head_diameter; // Size of a new point. + float m_minimal_point_distance = 20.f; + float m_density = 100.f; + mutable std::vector m_editing_mode_cache; // a support point and whether it is currently selected + float m_clipping_plane_distance = 0.f; + + bool m_selection_rectangle_active = false; + Vec2d m_selection_rectangle_start_corner; + Vec2d m_selection_rectangle_end_corner; + bool m_ignore_up_event = false; + bool m_combo_box_open = false; // To ensure proper rendering of the imgui combobox. + bool m_unsaved_changes = false; // Are there unsaved changes in manual mode? + bool m_selection_empty = true; + EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) + int m_canvas_width; + int m_canvas_height; + + std::vector get_config_options(const std::vector& keys) const; + + // Methods that do the model_object and editing cache synchronization, + // editing mode selection, etc: + enum { + AllPoints = -2, + NoPoints, + }; + void select_point(int i); + void editing_mode_apply_changes(); + void editing_mode_discard_changes(); + void editing_mode_reload_cache(); + void get_data_from_backend(); + void auto_generate(); + void switch_to_editing_mode(); + +protected: + void on_set_state() override; + void on_start_dragging(const GLCanvas3D::Selection& selection) override; + +#if ENABLE_IMGUI + virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) override; +#endif // ENABLE_IMGUI + + virtual std::string on_get_name() const; + virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; + virtual bool on_is_selectable() const; +}; + + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoSlaSupports_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmos.hpp b/src/slic3r/GUI/Gizmos/GLGizmos.hpp new file mode 100644 index 000000000..8c5e25669 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmos.hpp @@ -0,0 +1,11 @@ +#ifndef slic3r_GLGizmos_hpp_ +#define slic3r_GLGizmos_hpp_ + +#include "slic3r/GUI/Gizmos/GLGizmoMove.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoScale.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoRotate.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoFlatten.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoCut.hpp" + +#endif //slic3r_GLGizmos_hpp_ From e813a562a1108b678f0b5b1de38e3f3ebb60433d Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 15 Mar 2019 16:31:54 +0100 Subject: [PATCH 168/236] Removed technology ENABLE_IMGUI --- src/libslic3r/Technologies.hpp | 5 +- src/slic3r/GUI/GLCanvas3D.cpp | 61 -------------------- src/slic3r/GUI/GLCanvas3D.hpp | 17 ------ src/slic3r/GUI/GUI_App.cpp | 5 -- src/slic3r/GUI/GUI_App.hpp | 7 --- src/slic3r/GUI/GUI_Preview.cpp | 12 ---- src/slic3r/GUI/GUI_Preview.hpp | 4 -- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 5 -- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 14 ----- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 31 ---------- src/slic3r/GUI/Gizmos/GLGizmoCut.hpp | 17 +----- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 2 - src/slic3r/GUI/Gizmos/GLGizmoMove.hpp | 3 - src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 2 - src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 2 - src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 2 - src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 3 - src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 38 ------------ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 9 --- 19 files changed, 3 insertions(+), 236 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index e978b5838..307527fcb 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -20,9 +20,8 @@ // Disable synchronization of unselected instances #define DISABLE_INSTANCES_SYNCH (0 && ENABLE_1_42_0_ALPHA1) -// Scene's GUI made using imgui library -#define ENABLE_IMGUI (1 && ENABLE_1_42_0_ALPHA1) -#define DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI (1 && ENABLE_IMGUI) +// Disable imgui dialog for move, rotate and scale gizmos +#define DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI (1 && ENABLE_1_42_0_ALPHA1) // Use wxDataViewRender instead of wxDataViewCustomRenderer #define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING (0 && ENABLE_1_42_0_ALPHA1) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 902c68b59..f38e257ac 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3005,14 +3005,6 @@ void GLCanvas3D::Gizmos::render_overlay(const GLCanvas3D& canvas, const GLCanvas ::glPopMatrix(); } -#if !ENABLE_IMGUI -void GLCanvas3D::Gizmos::create_external_gizmo_widgets(wxWindow *parent) -{ - for (auto &entry : m_gizmos) { - entry.second->create_external_gizmo_widgets(parent); - } -} -#endif // not ENABLE_IMGUI void GLCanvas3D::Gizmos::reset() { @@ -3031,9 +3023,7 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan return; float cnv_w = (float)canvas.get_canvas_size().get_width(); -#if ENABLE_IMGUI float cnv_h = (float)canvas.get_canvas_size().get_height(); -#endif // ENABLE_IMGUI float zoom = canvas.get_camera_zoom(); float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; @@ -3171,7 +3161,6 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan #endif // ENABLE_SVG_ICONS GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); -#if ENABLE_IMGUI if (it->second->get_state() == GLGizmoBase::On) { float toolbar_top = (float)cnv_h - canvas.m_view_toolbar.get_height(); #if ENABLE_SVG_ICONS @@ -3180,7 +3169,6 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan it->second->render_input_window(2.0f * m_overlay_border + icon_size * zoom, 0.5f * cnv_h - top_y * zoom, toolbar_top, selection); #endif // ENABLE_SVG_ICONS } -#endif // ENABLE_IMGUI #if ENABLE_SVG_ICONS top_y -= scaled_stride_y; #else @@ -3739,9 +3727,6 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_color_by("volume") , m_reload_delayed(false) , m_render_sla_auxiliaries(true) -#if !ENABLE_IMGUI - , m_external_gizmo_widgets_parent(nullptr) -#endif // not ENABLE_IMGUI { if (m_canvas != nullptr) { m_timer.SetOwner(m_canvas); @@ -3834,13 +3819,6 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) std::cout << "Unable to initialize gizmos: please, check that all the required textures are available" << std::endl; return false; } - -#if !ENABLE_IMGUI - if (m_external_gizmo_widgets_parent != nullptr) { - m_gizmos.create_external_gizmo_widgets(m_external_gizmo_widgets_parent); - m_canvas->GetParent()->Layout(); - } -#endif // not ENABLE_IMGUI } if (!_init_toolbar()) @@ -4115,27 +4093,6 @@ void GLCanvas3D::update_toolbar_items_visibility() m_dirty = true; } -// Returns a Rect object denoting size and position of the Reset button used by a gizmo. -// Returns in either screen or viewport coords. -#if !ENABLE_IMGUI -Rect GLCanvas3D::get_gizmo_reset_rect(const GLCanvas3D& canvas, bool viewport) const -{ - const Size& cnv_size = canvas.get_canvas_size(); - float w = (viewport ? -0.5f : 0.f) * (float)cnv_size.get_width(); - float h = (viewport ? 0.5f : 1.f) * (float)cnv_size.get_height(); - float zoom = canvas.get_camera_zoom(); - float inv_zoom = viewport ? ((zoom != 0.0f) ? 1.0f / zoom : 0.0f) : 1.f; - const float gap = 30.f; - return Rect((w + gap + 80.f) * inv_zoom, (viewport ? -1.f : 1.f) * (h - GIZMO_RESET_BUTTON_HEIGHT) * inv_zoom, - (w + gap + 80.f + GIZMO_RESET_BUTTON_WIDTH) * inv_zoom, (viewport ? -1.f : 1.f) * (h * inv_zoom)); -} - -bool GLCanvas3D::gizmo_reset_rect_contains(const GLCanvas3D& canvas, float x, float y) const -{ - const Rect& rect = get_gizmo_reset_rect(canvas, false); - return (rect.get_left() <= x) && (x <= rect.get_right()) && (rect.get_top() <= y) && (y <= rect.get_bottom()); -} -#endif // not ENABLE_IMGUI void GLCanvas3D::render() { @@ -4184,9 +4141,7 @@ void GLCanvas3D::render() // absolute value of the rotation theta = 360.f - theta; -#if ENABLE_IMGUI wxGetApp().imgui()->new_frame(); -#endif // ENABLE_IMGUI // picking pass _picking_pass(); @@ -4237,9 +4192,7 @@ void GLCanvas3D::render() if (m_layers_editing.last_object_id >= 0) m_layers_editing.render_overlay(*this); -#if ENABLE_IMGUI wxGetApp().imgui()->render(); -#endif // ENABLE_IMGUI m_canvas->SwapBuffers(); } @@ -4805,13 +4758,11 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) int keyCode = evt.GetKeyCode(); int ctrlMask = wxMOD_CONTROL; -#if ENABLE_IMGUI auto imgui = wxGetApp().imgui(); if (imgui->update_key_data(evt)) { render(); return; } -#endif // ENABLE_IMGUI //#ifdef __APPLE__ // ctrlMask |= wxMOD_RAW_CONTROL; @@ -4919,12 +4870,10 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) { const int keyCode = evt.GetKeyCode(); -#if ENABLE_IMGUI auto imgui = wxGetApp().imgui(); if (imgui->update_key_data(evt)) { render(); } else -#endif // ENABLE_IMGUI if (evt.GetEventType() == wxEVT_KEY_UP) { if (m_tab_down && keyCode == WXK_TAB && !evt.HasAnyModifiers()) { // Enable switching between 3D and Preview with Tab @@ -5047,7 +4996,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) Point pos(evt.GetX(), evt.GetY()); -#if ENABLE_IMGUI ImGuiWrapper *imgui = wxGetApp().imgui(); if (imgui->update_mouse_data(evt)) { m_mouse.position = evt.Leaving() ? Vec2d(-1.0, -1.0) : pos.cast(); @@ -5057,7 +5005,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ return; } -#endif // ENABLE_IMGUI #ifdef __WXMSW__ bool on_enter_workaround = false; @@ -5628,12 +5575,6 @@ void GLCanvas3D::set_tooltip(const std::string& tooltip) const } } -#if !ENABLE_IMGUI -void GLCanvas3D::set_external_gizmo_widgets_parent(wxWindow *parent) -{ - m_external_gizmo_widgets_parent = parent; -} -#endif // not ENABLE_IMGUI void GLCanvas3D::do_move() { @@ -6066,14 +6007,12 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) if ((m_canvas == nullptr) && (m_context == nullptr)) return; -#if ENABLE_IMGUI wxGetApp().imgui()->set_display_size((float)w, (float)h); #if ENABLE_RETINA_GL wxGetApp().imgui()->set_style_scaling(m_retina_helper->get_scale_factor()); #else wxGetApp().imgui()->set_style_scaling(m_canvas->GetContentScaleFactor()); #endif -#endif // ENABLE_IMGUI // ensures that this canvas is current _set_current(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 07b3907a3..4ec0f076b 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -750,10 +750,6 @@ private: void render_overlay(const GLCanvas3D& canvas, const Selection& selection) const; -#if !ENABLE_IMGUI - void create_external_gizmo_widgets(wxWindow *parent); -#endif // not ENABLE_IMGUI - private: void reset(); @@ -894,10 +890,6 @@ private: GCodePreviewVolumeIndex m_gcode_preview_volume_index; -#if !ENABLE_IMGUI - wxWindow *m_external_gizmo_widgets_parent; -#endif // not ENABLE_IMGUI - public: GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); ~GLCanvas3D(); @@ -971,11 +963,6 @@ public: void update_toolbar_items_visibility(); -#if !ENABLE_IMGUI - Rect get_gizmo_reset_rect(const GLCanvas3D& canvas, bool viewport) const; - bool gizmo_reset_rect_contains(const GLCanvas3D& canvas, float x, float y) const; -#endif // not ENABLE_IMGUI - bool is_dragging() const { return m_gizmos.is_dragging() || m_moving; } void render(); @@ -1016,10 +1003,6 @@ public: void set_tooltip(const std::string& tooltip) const; -#if !ENABLE_IMGUI - void set_external_gizmo_widgets_parent(wxWindow *parent); -#endif // not ENABLE_IMGUI - void do_move(); void do_rotate(); void do_scale(); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 1cf2ca17c..89f5d00c9 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -79,9 +79,7 @@ IMPLEMENT_APP(GUI_App) GUI_App::GUI_App() : wxApp() , m_em_unit(10) -#if ENABLE_IMGUI , m_imgui(new ImGuiWrapper()) -#endif // ENABLE_IMGUI {} bool GUI_App::OnInit() @@ -90,10 +88,7 @@ bool GUI_App::OnInit() const wxString resources_dir = from_u8(Slic3r::resources_dir()); wxCHECK_MSG(wxDirExists(resources_dir), false, wxString::Format("Resources path does not exist or is not a directory: %s", resources_dir)); - -#if ENABLE_IMGUI wxCHECK_MSG(m_imgui->init(), false, "Failed to initialize ImGui"); -#endif // ENABLE_IMGUI SetAppName("Slic3rPE-beta"); SetAppDisplayName("Slic3r Prusa Edition"); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 4c23e3eb7..8f332b855 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -5,9 +5,7 @@ #include #include "libslic3r/PrintConfig.hpp" #include "MainFrame.hpp" -#if ENABLE_IMGUI #include "ImGuiWrapper.hpp" -#endif // ENABLE_IMGUI #include #include @@ -86,10 +84,7 @@ class GUI_App : public wxApp wxLocale* m_wxLocale{ nullptr }; -#if ENABLE_IMGUI std::unique_ptr m_imgui; -#endif // ENABLE_IMGUI - std::unique_ptr m_printhost_job_queue; public: @@ -166,9 +161,7 @@ public: std::vector tabs_list; -#if ENABLE_IMGUI ImGuiWrapper* imgui() { return m_imgui.get(); } -#endif // ENABLE_IMGUI PrintHostJobQueue& printhost_job_queue() { return *m_printhost_job_queue.get(); } diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index e2539473b..2211e8d7d 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -30,9 +30,6 @@ namespace GUI { View3D::View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) : m_canvas_widget(nullptr) , m_canvas(nullptr) -#if !ENABLE_IMGUI - , m_gizmo_widget(nullptr) -#endif // !ENABLE_IMGUI { init(parent, bed, camera, view_toolbar, model, config, process); } @@ -67,17 +64,8 @@ bool View3D::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_ m_canvas->enable_gizmos(true); m_canvas->enable_toolbar(true); -#if !ENABLE_IMGUI - m_gizmo_widget = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize); - m_gizmo_widget->SetSizer(new wxBoxSizer(wxVERTICAL)); - m_canvas->set_external_gizmo_widgets_parent(m_gizmo_widget); -#endif // !ENABLE_IMGUI - wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); main_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0); -#if !ENABLE_IMGUI - main_sizer->Add(m_gizmo_widget, 0, wxALL | wxEXPAND, 0); -#endif // !ENABLE_IMGUI SetSizer(main_sizer); SetMinSize(GetSize()); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index c15aad3b3..bfb604c40 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -35,10 +35,6 @@ class View3D : public wxPanel wxGLCanvas* m_canvas_widget; GLCanvas3D* m_canvas; -#if !ENABLE_IMGUI - wxPanel* m_gizmo_widget; -#endif // !ENABLE_IMGUI - public: View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process); virtual ~View3D(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 3c3f68371..290541a18 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -146,9 +146,7 @@ GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, unsigned int sprite_id) , m_sprite_id(sprite_id) , m_hover_id(-1) , m_dragging(false) -#if ENABLE_IMGUI , m_imgui(wxGetApp().imgui()) -#endif // ENABLE_IMGUI { ::memcpy((void*)m_base_color, (const void*)DEFAULT_BASE_COLOR, 3 * sizeof(float)); ::memcpy((void*)m_drag_color, (const void*)DEFAULT_DRAG_COLOR, 3 * sizeof(float)); @@ -268,9 +266,6 @@ void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const } } -#if !ENABLE_IMGUI -void GLGizmoBase::create_external_gizmo_widgets(wxWindow *parent) {} -#endif // not ENABLE_IMGUI void GLGizmoBase::set_tooltip(const std::string& tooltip) const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 3abd2e607..e8328bcd4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -27,9 +27,7 @@ static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f -#if ENABLE_IMGUI class ImGuiWrapper; -#endif // ENABLE_IMGUI class GLGizmoBase @@ -101,9 +99,7 @@ protected: float m_drag_color[3]; float m_highlight_color[3]; mutable std::vector m_grabbers; -#if ENABLE_IMGUI ImGuiWrapper* m_imgui; -#endif // ENABLE_IMGUI public: #if ENABLE_SVG_ICONS @@ -151,14 +147,7 @@ public: void render(const GLCanvas3D::Selection& selection) const { on_render(selection); } void render_for_picking(const GLCanvas3D::Selection& selection) const { on_render_for_picking(selection); } - -#if !ENABLE_IMGUI - virtual void create_external_gizmo_widgets(wxWindow *parent); -#endif // not ENABLE_IMGUI - -#if ENABLE_IMGUI void render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { on_render_input_window(x, y, bottom_limit, selection); } -#endif // ENABLE_IMGUI protected: virtual bool on_init() = 0; @@ -174,10 +163,7 @@ protected: virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) = 0; virtual void on_render(const GLCanvas3D::Selection& selection) const = 0; virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const = 0; - -#if ENABLE_IMGUI virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) {} -#endif // ENABLE_IMGUI // Returns the picking color for the given id, based on the BASE_ID constant // No check is made for clashing with other picking color (i.e. GLVolumes) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index bd29b1288..54a39c6d5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -75,33 +75,11 @@ GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id) #endif // ENABLE_SVG_ICONS , m_cut_z(0.0) , m_max_z(0.0) -#if !ENABLE_IMGUI - , m_panel(nullptr) -#endif // not ENABLE_IMGUI , m_keep_upper(true) , m_keep_lower(true) , m_rotate_lower(false) {} -#if !ENABLE_IMGUI -void GLGizmoCut::create_external_gizmo_widgets(wxWindow *parent) -{ - wxASSERT(m_panel == nullptr); - - m_panel = new GLGizmoCutPanel(parent); - parent->GetSizer()->Add(m_panel, 0, wxEXPAND); - - parent->Layout(); - parent->Fit(); - auto prev_heigh = parent->GetMinSize().GetHeight(); - parent->SetMinSize(wxSize(-1, std::max(prev_heigh, m_panel->GetSize().GetHeight()))); - - m_panel->Hide(); - m_panel->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { - perform_cut(m_parent.get_selection()); - }, wxID_OK); -} -#endif // not ENABLE_IMGUI bool GLGizmoCut::on_init() { @@ -121,13 +99,6 @@ void GLGizmoCut::on_set_state() if (get_state() == On) { m_cut_z = m_parent.get_selection().get_bounding_box().size()(2) / 2.0; } - -#if !ENABLE_IMGUI - // Display or hide the extra panel - if (m_panel != nullptr) { - m_panel->display(get_state() == On); - } -#endif // not ENABLE_IMGUI } bool GLGizmoCut::on_is_activable(const GLCanvas3D::Selection& selection) const @@ -212,7 +183,6 @@ void GLGizmoCut::on_render_for_picking(const GLCanvas3D::Selection& selection) c render_grabbers_for_picking(selection.get_bounding_box()); } -#if ENABLE_IMGUI void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); @@ -236,7 +206,6 @@ void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit, co perform_cut(selection); } } -#endif // ENABLE_IMGUI void GLGizmoCut::update_max_z(const GLCanvas3D::Selection& selection) const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index 200e1c0df..beec6d1da 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -7,10 +7,6 @@ namespace Slic3r { namespace GUI { -#if !ENABLE_IMGUI -class GLGizmoCutPanel; -#endif // not ENABLE_IMGUI - class GLGizmoCut : public GLGizmoBase { static const double Offset; @@ -25,9 +21,6 @@ class GLGizmoCut : public GLGizmoBase bool m_keep_upper; bool m_keep_lower; bool m_rotate_lower; -#if !ENABLE_IMGUI - GLGizmoCutPanel *m_panel; -#endif // not ENABLE_IMGUI public: #if ENABLE_SVG_ICONS @@ -36,12 +29,6 @@ public: GLGizmoCut(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS -#if !ENABLE_IMGUI - virtual void create_external_gizmo_widgets(wxWindow *parent); -#endif // not ENABLE_IMGUI -#if !ENABLE_IMGUI -#endif // not ENABLE_IMGUI - protected: virtual bool on_init(); virtual std::string on_get_name() const; @@ -51,10 +38,8 @@ protected: virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); virtual void on_render(const GLCanvas3D::Selection& selection) const; virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - -#if ENABLE_IMGUI virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); -#endif // ENABLE_IMGUI + private: void update_max_z(const GLCanvas3D::Selection& selection) const; void set_cut_z(double cut_z) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 38b0ce23b..d18d71c83 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -166,7 +166,6 @@ void GLGizmoMove3D::on_render_for_picking(const GLCanvas3D::Selection& selection render_grabber_extension(Z, box, true); } -#if ENABLE_IMGUI void GLGizmoMove3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI @@ -184,7 +183,6 @@ void GLGizmoMove3D::on_render_input_window(float x, float y, float bottom_limit, m_imgui->end(); #endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI } -#endif // ENABLE_IMGUI double GLGizmoMove3D::calc_projection(const UpdateData& data) const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index 72b067ba9..d4d97de7f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -42,10 +42,7 @@ protected: virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); virtual void on_render(const GLCanvas3D::Selection& selection) const; virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - -#if ENABLE_IMGUI virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); -#endif // ENABLE_IMGUI private: double calc_projection(const UpdateData& data) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 89ca426e4..4c6f66f4c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -483,7 +483,6 @@ void GLGizmoRotate3D::on_render(const GLCanvas3D::Selection& selection) const m_gizmos[Z].render(selection); } -#if ENABLE_IMGUI void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI @@ -497,7 +496,6 @@ void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limi m_imgui->end(); #endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI } -#endif // ENABLE_IMGUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index 6281f98cb..aca64c94e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -131,9 +131,7 @@ protected: } } -#if ENABLE_IMGUI virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); -#endif // ENABLE_IMGUI }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index bb0663e36..acc44e00d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -274,7 +274,6 @@ void GLGizmoScale3D::on_render_for_picking(const GLCanvas3D::Selection& selectio render_grabbers_for_picking(selection.get_bounding_box()); } -#if ENABLE_IMGUI void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI @@ -288,7 +287,6 @@ void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit m_imgui->end(); #endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI } -#endif // ENABLE_IMGUI void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2) const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index a6ee40c1a..8554e57a7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -42,10 +42,7 @@ protected: virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); virtual void on_render(const GLCanvas3D::Selection& selection) const; virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - -#if ENABLE_IMGUI virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); -#endif // ENABLE_IMGUI private: void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index c43f80de2..695564971 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -80,10 +80,6 @@ void GLGizmoSlaSupports::on_render(const GLCanvas3D::Selection& selection) const render_points(selection, false); render_selection_rectangle(); -#if !ENABLE_IMGUI - render_tooltip_texture(); -#endif // not ENABLE_IMGUI - ::glDisable(GL_BLEND); } @@ -505,38 +501,6 @@ void GLGizmoSlaSupports::on_update(const UpdateData& data, const GLCanvas3D::Sel } } -#if !ENABLE_IMGUI -void GLGizmoSlaSupports::render_tooltip_texture() const { - if (m_tooltip_texture.get_id() == 0) - if (!m_tooltip_texture.load_from_file(resources_dir() + "/icons/sla_support_points_tooltip.png", false)) - return; - if (m_reset_texture.get_id() == 0) - if (!m_reset_texture.load_from_file(resources_dir() + "/icons/sla_support_points_reset.png", false)) - return; - - float zoom = m_parent.get_camera_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; - float gap = 30.0f * inv_zoom; - - const Size& cnv_size = m_parent.get_canvas_size(); - float l = gap - cnv_size.get_width()/2.f * inv_zoom; - float r = l + (float)m_tooltip_texture.get_width() * inv_zoom; - float b = gap - cnv_size.get_height()/2.f * inv_zoom; - float t = b + (float)m_tooltip_texture.get_height() * inv_zoom; - - Rect reset_rect = m_parent.get_gizmo_reset_rect(m_parent, true); - - ::glDisable(GL_DEPTH_TEST); - ::glPushMatrix(); - ::glLoadIdentity(); - GLTexture::render_texture(m_tooltip_texture.get_id(), l, r, b, t); - GLTexture::render_texture(m_reset_texture.get_id(), reset_rect.get_left(), reset_rect.get_right(), reset_rect.get_bottom(), reset_rect.get_top()); - ::glPopMatrix(); - ::glEnable(GL_DEPTH_TEST); -} -#endif // not ENABLE_IMGUI - - std::vector GLGizmoSlaSupports::get_config_options(const std::vector& keys) const { std::vector out; @@ -578,7 +542,6 @@ void GLGizmoSlaSupports::update_cache_entry_normal(unsigned int i) const -#if ENABLE_IMGUI void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { if (!m_model_object) @@ -722,7 +685,6 @@ RENDER_AGAIN: if (force_refresh) m_parent.set_as_dirty(); } -#endif // ENABLE_IMGUI bool GLGizmoSlaSupports::on_is_activable(const GLCanvas3D::Selection& selection) const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 44842e5c5..492bb85ca 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -75,12 +75,6 @@ private: void update_mesh(); void update_cache_entry_normal(unsigned int i) const; -#if !ENABLE_IMGUI - void render_tooltip_texture() const; - mutable GLTexture m_tooltip_texture; - mutable GLTexture m_reset_texture; -#endif // not ENABLE_IMGUI - bool m_lock_unique_islands = false; bool m_editing_mode = false; // Is editing mode active? bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). @@ -120,10 +114,7 @@ private: protected: void on_set_state() override; void on_start_dragging(const GLCanvas3D::Selection& selection) override; - -#if ENABLE_IMGUI virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) override; -#endif // ENABLE_IMGUI virtual std::string on_get_name() const; virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; From 96fb6dff29e20742d1053c21a87047b76b660d3e Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 18 Mar 2019 12:37:14 +0100 Subject: [PATCH 169/236] Fixed GLVolume::get_volume_scaling_factor() declaration --- src/slic3r/GUI/3DScene.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 5daf4b941..15ac6a3a1 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -364,7 +364,7 @@ public: void set_volume_rotation(const Vec3d& rotation) { m_volume_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } void set_volume_rotation(Axis axis, double rotation) { m_volume_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); } - Vec3d get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } + const Vec3d& get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } double get_volume_scaling_factor(Axis axis) const { return m_volume_transformation.get_scaling_factor(axis); } void set_volume_scaling_factor(const Vec3d& scaling_factor) { m_volume_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } From 2f9e6cf887fcaa57351c9415ea94a75b697b9a88 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 18 Mar 2019 12:48:39 +0100 Subject: [PATCH 170/236] Moved the Fileds from the Page object to the respective OptionGroups for performance reasons. Disabled clearing of background for most of the static texts and Fields stored into OptionGrops. --- src/slic3r/GUI/Field.cpp | 21 ++++++++++- src/slic3r/GUI/GUI_App.cpp | 3 ++ src/slic3r/GUI/OptionsGroup.cpp | 45 ++++++++++++---------- src/slic3r/GUI/OptionsGroup.hpp | 8 +++- src/slic3r/GUI/Tab.cpp | 66 +++++++++++++++++++++------------ src/slic3r/GUI/Tab.hpp | 3 ++ 6 files changed, 99 insertions(+), 47 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index dc0550b3b..c9eb9282e 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -36,7 +36,9 @@ void Field::PostInitialize() m_Undo_to_sys_btn = new MyButton(m_parent, wxID_ANY, "", wxDefaultPosition,wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); if (wxMSW) { m_Undo_btn->SetBackgroundColour(color); + m_Undo_btn->SetBackgroundStyle(wxBG_STYLE_PAINT); m_Undo_to_sys_btn->SetBackgroundColour(color); + m_Undo_to_sys_btn->SetBackgroundStyle(wxBG_STYLE_PAINT); } m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_back_to_initial_value(); })); m_Undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_back_to_sys_value(); })); @@ -257,6 +259,7 @@ void TextCtrl::BUILD() { const long style = m_opt.multiline ? wxTE_MULTILINE : wxTE_PROCESS_ENTER/*0*/; auto temp = new wxTextCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, style); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); #ifdef __WXOSX__ temp->OSXDisableAllSmartSubstitutions(); #endif // __WXOSX__ @@ -372,6 +375,7 @@ void CheckBox::BUILD() { false; auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->SetValue(check_value); if (m_opt.readonly) temp->Disable(); @@ -429,6 +433,7 @@ void SpinCtrl::BUILD() { auto temp = new wxSpinCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, 0|wxTE_PROCESS_ENTER, min_val, max_val, default_value); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); #ifndef __WXOSX__ // #ys_FIXME_KILL_FOCUS @@ -502,6 +507,7 @@ void Choice::BUILD() { temp = new wxComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); else temp = new wxComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, NULL, wxCB_READONLY); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); @@ -774,6 +780,7 @@ void ColourPicker::BUILD() } auto temp = new wxColourPickerCtrl(m_parent, wxID_ANY, clr, wxDefaultPosition, size); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); // // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); @@ -808,10 +815,17 @@ void PointCtrl::BUILD() x_textctrl = new wxTextCtrl(m_parent, wxID_ANY, X, wxDefaultPosition, field_size, wxTE_PROCESS_ENTER); y_textctrl = new wxTextCtrl(m_parent, wxID_ANY, Y, wxDefaultPosition, field_size, wxTE_PROCESS_ENTER); + x_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); + y_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); - temp->Add(new wxStaticText(m_parent, wxID_ANY, "x : "), 0, wxALIGN_CENTER_VERTICAL, 0); + auto static_text_x = new wxStaticText(m_parent, wxID_ANY, "x : "); + auto static_text_y = new wxStaticText(m_parent, wxID_ANY, " y : "); + static_text_x->SetBackgroundStyle(wxBG_STYLE_PAINT); + static_text_y->SetBackgroundStyle(wxBG_STYLE_PAINT); + + temp->Add(static_text_x, 0, wxALIGN_CENTER_VERTICAL, 0); temp->Add(x_textctrl); - temp->Add(new wxStaticText(m_parent, wxID_ANY, " y : "), 0, wxALIGN_CENTER_VERTICAL, 0); + temp->Add(static_text_y, 0, wxALIGN_CENTER_VERTICAL, 0); temp->Add(y_textctrl); // x_textctrl->Bind(wxEVT_TEXT, ([this](wxCommandEvent e) { on_change_field(); }), x_textctrl->GetId()); @@ -880,6 +894,7 @@ void StaticText::BUILD() const wxString legend(static_cast(m_opt.default_value)->value); auto temp = new wxStaticText(m_parent, wxID_ANY, legend, wxDefaultPosition, size, wxST_ELLIPSIZE_MIDDLE); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->SetFont(wxGetApp().bold_font()); // // recast as a wxWindow to fit the calling convention @@ -903,10 +918,12 @@ void SliderCtrl::BUILD() m_slider = new wxSlider(m_parent, wxID_ANY, def_val * m_scale, min * m_scale, max * m_scale, wxDefaultPosition, size); + m_slider->SetBackgroundStyle(wxBG_STYLE_PAINT); wxSize field_size(40, -1); m_textctrl = new wxTextCtrl(m_parent, wxID_ANY, wxString::Format("%d", m_slider->GetValue()/m_scale), wxDefaultPosition, field_size); + m_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->Add(m_slider, 1, wxEXPAND | wxALIGN_CENTER_VERTICAL, 0); temp->Add(m_textctrl, 0, wxALIGN_CENTER_VERTICAL, 0); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7d448fbe4..79ad70e5a 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "libslic3r/Utils.hpp" #include "libslic3r/Model.hpp" @@ -98,6 +99,8 @@ bool GUI_App::OnInit() SetAppName("Slic3rPE-alpha"); SetAppDisplayName("Slic3r Prusa Edition"); +// wxSystemOptions::SetOption("msw.staticbox.optimized-paint", 0); + // Slic3r::debugf "wxWidgets version %s, Wx version %s\n", wxVERSION_STRING, wxVERSION; // Set the Slic3r data directory at the Slic3r XS module. diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 0e9fcd75e..5e9c9ac30 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -23,18 +23,18 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co // is the normal type. if (opt.gui_type.compare("select") == 0) { } else if (opt.gui_type.compare("select_open") == 0) { - m_fields.emplace(id, std::move(Choice::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); } else if (opt.gui_type.compare("color") == 0) { - m_fields.emplace(id, std::move(ColourPicker::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(ColourPicker::Create(this->ctrl_parent(), opt, id))); } else if (opt.gui_type.compare("f_enum_open") == 0 || opt.gui_type.compare("i_enum_open") == 0 || opt.gui_type.compare("i_enum_closed") == 0) { - m_fields.emplace(id, std::move(Choice::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); } else if (opt.gui_type.compare("slider") == 0) { - m_fields.emplace(id, std::move(SliderCtrl::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(SliderCtrl::Create(this->ctrl_parent(), opt, id))); } else if (opt.gui_type.compare("i_spin") == 0) { // Spinctrl } else if (opt.gui_type.compare("legend") == 0) { // StaticText - m_fields.emplace(id, std::move(StaticText::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(StaticText::Create(this->ctrl_parent(), opt, id))); } else { switch (opt.type) { case coFloatOrPercent: @@ -44,21 +44,21 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co case coPercents: case coString: case coStrings: - m_fields.emplace(id, std::move(TextCtrl::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(TextCtrl::Create(this->ctrl_parent(), opt, id))); break; case coBool: case coBools: - m_fields.emplace(id, std::move(CheckBox::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(CheckBox::Create(this->ctrl_parent(), opt, id))); break; case coInt: case coInts: - m_fields.emplace(id, std::move(SpinCtrl::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(SpinCtrl::Create(this->ctrl_parent(), opt, id))); break; case coEnum: - m_fields.emplace(id, std::move(Choice::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); break; case coPoints: - m_fields.emplace(id, std::move(PointCtrl::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(PointCtrl::Create(this->ctrl_parent(), opt, id))); break; case coNone: break; default: @@ -119,7 +119,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n return; } if (line.widget != nullptr) { - sizer->Add(line.widget(m_parent), 0, wxEXPAND | wxALL, wxOSX ? 0 : 15); + sizer->Add(line.widget(this->ctrl_parent()), 0, wxEXPAND | wxALL, wxOSX ? 0 : 15); return; } } @@ -167,7 +167,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // if we have an extra column, build it if (extra_column) - grid_sizer->Add(extra_column(parent(), line), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3); + grid_sizer->Add(extra_column(this->ctrl_parent(), line), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3); // Build a label if we have it wxStaticText* label=nullptr; @@ -179,18 +179,21 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // Text is properly aligned only when Ellipsize is checked. label_style |= staticbox ? 0 : wxST_ELLIPSIZE_END; #endif /* __WXGTK__ */ - label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ": "), + label = new wxStaticText(this->ctrl_parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ": "), wxDefaultPosition, wxSize(label_width, -1), label_style); + label->SetBackgroundStyle(wxBG_STYLE_PAINT); label->SetFont(label_font); label->Wrap(label_width); // avoid a Linux/GTK bug if (!line.near_label_widget) grid_sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, line.label.IsEmpty() ? 0 : 5); + else if (line.near_label_widget && line.label.IsEmpty()) + grid_sizer->Add(line.near_label_widget(this->ctrl_parent()), 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 7); else { // If we're here, we have some widget near the label // so we need a horizontal sizer to arrange these things auto sizer = new wxBoxSizer(wxHORIZONTAL); grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1); - sizer->Add(line.near_label_widget(parent()), 0, wxRIGHT, 7); + sizer->Add(line.near_label_widget(this->ctrl_parent()), 0, wxRIGHT, 7); sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, 5); } if (line.label_tooltip.compare("") != 0) @@ -201,7 +204,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n *full_Label = label; // Initiate the pointer to the control of the full label, if we need this one. // If there's a widget, build it and add the result to the sizer. if (line.widget != nullptr) { - auto wgt = line.widget(parent()); + auto wgt = line.widget(this->ctrl_parent()); // If widget doesn't have label, don't use border grid_sizer->Add(wgt, 0, wxEXPAND | wxBOTTOM | wxTOP, (wxOSX || line.label.IsEmpty()) ? 0 : 5); return; @@ -237,7 +240,8 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n wxString str_label = (option.label == "Top" || option.label == "Bottom") ? _CTX(option.label, "Layers") : _(option.label); - label = new wxStaticText(parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, wxDefaultSize); + label = new wxStaticText(this->ctrl_parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, wxDefaultSize); + label->SetBackgroundStyle(wxBG_STYLE_PAINT); label->SetFont(label_font); sizer_tmp->Add(label, 0, /*wxALIGN_RIGHT |*/ wxALIGN_CENTER_VERTICAL, 0); } @@ -262,8 +266,9 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // add sidetext if any if (option.sidetext != "") { - auto sidetext = new wxStaticText( parent(), wxID_ANY, _(option.sidetext), wxDefaultPosition, + auto sidetext = new wxStaticText( this->ctrl_parent(), wxID_ANY, _(option.sidetext), wxDefaultPosition, wxSize(sidetext_width, -1)/*wxDefaultSize*/, wxALIGN_LEFT); + sidetext->SetBackgroundStyle(wxBG_STYLE_PAINT); sidetext->SetFont(sidetext_font); sizer_tmp->Add(sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); field->set_side_text_ptr(sidetext); @@ -271,7 +276,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // add side widget if any if (opt.side_widget != nullptr) { - sizer_tmp->Add(opt.side_widget(parent())/*!.target()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 1); //! requires verification + sizer_tmp->Add(opt.side_widget(this->ctrl_parent())/*!.target()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 1); //! requires verification } if (opt.opt_id != option_set.back().opt_id) //! istead of (opt != option_set.back()) @@ -287,11 +292,11 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // extra widget for non-staticbox option group (like for the frequently used parameters on the sidebar) should be wxALIGN_RIGHT const auto v_sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(v_sizer, 1, wxEXPAND); - v_sizer->Add(extra_widget(parent()), 0, wxALIGN_RIGHT); + v_sizer->Add(extra_widget(this->ctrl_parent()), 0, wxALIGN_RIGHT); return; } - sizer->Add(extra_widget(parent())/*!.target()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); //! requires verification + sizer->Add(extra_widget(this->ctrl_parent())/*!.target()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); //! requires verification } } diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index d9ff6a01a..661aadbd7 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -112,6 +112,10 @@ public: } #endif /* __WXGTK__ */ + wxWindow* ctrl_parent() const { + return this->stb ? (wxWindow*)this->stb : this->parent(); + } + void append_line(const Line& line, wxStaticText** full_Label = nullptr); Line create_single_option_line(const Option& option) const; void append_single_option_line(const Option& option) { append_line(create_single_option_line(option)); } @@ -161,8 +165,10 @@ public: staticbox(title!=""), extra_column(extra_clmn) { if (staticbox) { stb = new wxStaticBox(_parent, wxID_ANY, title); + stb->SetBackgroundStyle(wxBG_STYLE_PAINT); stb->SetFont(wxGetApp().bold_font()); - } + } else + stb = nullptr; sizer = (staticbox ? new wxStaticBoxSizer(stb, wxVERTICAL) : new wxBoxSizer(wxVERTICAL)); auto num_columns = 1U; if (label_width != 0) num_columns++; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index ae33443c3..faee25270 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -58,6 +58,13 @@ Tab::Tab(wxNotebook* parent, const wxString& title, const char* name) : wxGetApp().tabs_list.push_back(this); m_em_unit = wxGetApp().em_unit(); + + Bind(wxEVT_SIZE, ([this](wxSizeEvent &evt) { + for (auto page : m_pages) + if (! page.get()->IsShown()) + page->layout_valid = false; + evt.Skip(); + })); } void Tab::set_type() @@ -74,7 +81,7 @@ void Tab::set_type() void Tab::create_preset_tab() { #ifdef __WINDOWS__ -// SetDoubleBuffered(true); + SetDoubleBuffered(true); #endif //__WINDOWS__ m_preset_bundle = wxGetApp().preset_bundle; @@ -293,6 +300,11 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str auto panel = this; #endif PageShp page(new Page(panel, title, icon_idx)); +// page->SetBackgroundStyle(wxBG_STYLE_SYSTEM); +#ifdef __WINDOWS__ +// page->SetDoubleBuffered(true); +#endif //__WINDOWS__ + page->SetScrollbars(1, 20, 1, 2); page->Hide(); m_hsizer->Add(page.get(), 1, wxEXPAND | wxLEFT, 5); @@ -318,7 +330,7 @@ void Tab::OnActivate() void Tab::update_labels_colour() { - Freeze(); +// Freeze(); //update options "decoration" for (const auto opt : m_options_list) { @@ -345,7 +357,7 @@ void Tab::update_labels_colour() if (field == nullptr) continue; field->set_label_colour_force(color); } - Thaw(); +// Thaw(); auto cur_item = m_treectrl->GetFirstVisibleItem(); while (cur_item) { @@ -389,7 +401,7 @@ void Tab::update_changed_ui() for (auto opt_key : dirty_options) m_options_list[opt_key] &= ~osInitValue; for (auto opt_key : nonsys_options) m_options_list[opt_key] &= ~osSystemValue; - Freeze(); +// Freeze(); //update options "decoration" for (const auto opt : m_options_list) { @@ -439,7 +451,7 @@ void Tab::update_changed_ui() field->set_undo_to_sys_tooltip(sys_tt); field->set_label_colour(color); } - Thaw(); +// Thaw(); wxTheApp->CallAfter([this]() { update_changed_tree_ui(); @@ -686,16 +698,16 @@ void Tab::load_config(const DynamicPrintConfig& config) // Reload current $self->{config} (aka $self->{presets}->edited_preset->config) into the UI fields. void Tab::reload_config() { - Freeze(); +// Freeze(); for (auto page : m_pages) page->reload_config(); - Thaw(); +// Thaw(); } void Tab::update_visibility() { const ConfigOptionMode mode = wxGetApp().get_mode(); - Freeze(); +// Freeze(); for (auto page : m_pages) page->update_visibility(mode); @@ -705,7 +717,7 @@ void Tab::update_visibility() m_mode_sizer->SetMode(mode); Layout(); - Thaw(); +// Thaw(); // to update tree items color // wxTheApp->CallAfter([this]() { @@ -1180,7 +1192,7 @@ void TabPrint::update() // return; // ! TODO Let delete this part of code after a common aplication testing m_update_cnt++; - Freeze(); +// Freeze(); double fill_density = m_config->option("fill_density")->value; @@ -1391,7 +1403,7 @@ void TabPrint::update() m_recommended_thin_wall_thickness_description_line->SetText( from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle))); - Thaw(); +// Thaw(); m_update_cnt--; if (m_update_cnt==0) @@ -1566,7 +1578,7 @@ void TabFilament::update() return; // ys_FIXME m_update_cnt++; - Freeze(); +// Freeze(); wxString text = from_u8(PresetHints::cooling_description(m_presets->get_edited_preset())); m_cooling_description_line->SetText(text); text = from_u8(PresetHints::maximum_volumetric_flow_description(*m_preset_bundle)); @@ -1580,7 +1592,7 @@ void TabFilament::update() for (auto el : { "min_fan_speed", "disable_fan_first_layers" }) get_field(el)->toggle(fan_always_on); - Thaw(); +// Thaw(); m_update_cnt--; if (m_update_cnt == 0) @@ -2261,7 +2273,7 @@ void TabPrinter::update() void TabPrinter::update_fff() { - Freeze(); +// Freeze(); bool en; auto serial_speed = get_field("serial_speed"); @@ -2360,7 +2372,7 @@ void TabPrinter::update_fff() (have_multiple_extruders && toolchange_retraction); } - Thaw(); +// Thaw(); } void TabPrinter::update_sla() @@ -2674,7 +2686,7 @@ void Tab::OnTreeSelChange(wxTreeEvent& event) #ifdef __linux__ std::unique_ptr no_updates(new wxWindowUpdateLocker(this)); #else - wxWindowUpdateLocker noUpdates(this); +// wxWindowUpdateLocker noUpdates(this); #endif if (m_pages.empty()) @@ -2694,17 +2706,22 @@ void Tab::OnTreeSelChange(wxTreeEvent& event) if (page == nullptr) return; for (auto& el : m_pages) - el.get()->Hide(); +// if (el.get()->IsShown()) { + el.get()->Hide(); +// break; +// } -#ifdef __linux__ - no_updates.reset(nullptr); -#endif - - page->Show(); - m_hsizer->Layout(); - Refresh(); + #ifdef __linux__ + no_updates.reset(nullptr); + #endif update_undo_buttons(); + page->Show(); +// if (! page->layout_valid) { + page->layout_valid = true; + m_hsizer->Layout(); + Refresh(); +// } } void Tab::OnKeyDown(wxKeyEvent& event) @@ -3040,6 +3057,7 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la } // auto bmp = new wxStaticBitmap(parent, wxID_ANY, bmp_name.empty() ? wxNullBitmap : wxBitmap(from_u8(var(bmp_name)), wxBITMAP_TYPE_PNG)); auto bmp = new wxStaticBitmap(parent, wxID_ANY, bmp_name.empty() ? wxNullBitmap : create_scaled_bitmap(bmp_name)); + bmp->SetBackgroundStyle(wxBG_STYLE_PAINT); return bmp; }; diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 7ef066963..5f8a7f706 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -65,6 +65,9 @@ public: bool m_is_modified_values{ false }; bool m_is_nonsys_values{ true }; + // Delayed layout after resizing the main window. + bool layout_valid = false; + public: std::vector m_optgroups; DynamicPrintConfig* m_config; From cf53604ae8899c3165d7d819979c981281505bff Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 18 Mar 2019 12:48:39 +0100 Subject: [PATCH 171/236] Moved the Fileds from the Page object to the respective OptionGroups for performance reasons. Disabled clearing of background for most of the static texts and Fields stored into OptionGrops. --- src/slic3r/GUI/Field.cpp | 21 ++++++++++- src/slic3r/GUI/GUI_App.cpp | 3 ++ src/slic3r/GUI/OptionsGroup.cpp | 45 ++++++++++++---------- src/slic3r/GUI/OptionsGroup.hpp | 8 +++- src/slic3r/GUI/Tab.cpp | 66 +++++++++++++++++++++------------ src/slic3r/GUI/Tab.hpp | 3 ++ 6 files changed, 99 insertions(+), 47 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index dc0550b3b..c9eb9282e 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -36,7 +36,9 @@ void Field::PostInitialize() m_Undo_to_sys_btn = new MyButton(m_parent, wxID_ANY, "", wxDefaultPosition,wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); if (wxMSW) { m_Undo_btn->SetBackgroundColour(color); + m_Undo_btn->SetBackgroundStyle(wxBG_STYLE_PAINT); m_Undo_to_sys_btn->SetBackgroundColour(color); + m_Undo_to_sys_btn->SetBackgroundStyle(wxBG_STYLE_PAINT); } m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_back_to_initial_value(); })); m_Undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_back_to_sys_value(); })); @@ -257,6 +259,7 @@ void TextCtrl::BUILD() { const long style = m_opt.multiline ? wxTE_MULTILINE : wxTE_PROCESS_ENTER/*0*/; auto temp = new wxTextCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, style); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); #ifdef __WXOSX__ temp->OSXDisableAllSmartSubstitutions(); #endif // __WXOSX__ @@ -372,6 +375,7 @@ void CheckBox::BUILD() { false; auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->SetValue(check_value); if (m_opt.readonly) temp->Disable(); @@ -429,6 +433,7 @@ void SpinCtrl::BUILD() { auto temp = new wxSpinCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, 0|wxTE_PROCESS_ENTER, min_val, max_val, default_value); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); #ifndef __WXOSX__ // #ys_FIXME_KILL_FOCUS @@ -502,6 +507,7 @@ void Choice::BUILD() { temp = new wxComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); else temp = new wxComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, NULL, wxCB_READONLY); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); @@ -774,6 +780,7 @@ void ColourPicker::BUILD() } auto temp = new wxColourPickerCtrl(m_parent, wxID_ANY, clr, wxDefaultPosition, size); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); // // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); @@ -808,10 +815,17 @@ void PointCtrl::BUILD() x_textctrl = new wxTextCtrl(m_parent, wxID_ANY, X, wxDefaultPosition, field_size, wxTE_PROCESS_ENTER); y_textctrl = new wxTextCtrl(m_parent, wxID_ANY, Y, wxDefaultPosition, field_size, wxTE_PROCESS_ENTER); + x_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); + y_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); - temp->Add(new wxStaticText(m_parent, wxID_ANY, "x : "), 0, wxALIGN_CENTER_VERTICAL, 0); + auto static_text_x = new wxStaticText(m_parent, wxID_ANY, "x : "); + auto static_text_y = new wxStaticText(m_parent, wxID_ANY, " y : "); + static_text_x->SetBackgroundStyle(wxBG_STYLE_PAINT); + static_text_y->SetBackgroundStyle(wxBG_STYLE_PAINT); + + temp->Add(static_text_x, 0, wxALIGN_CENTER_VERTICAL, 0); temp->Add(x_textctrl); - temp->Add(new wxStaticText(m_parent, wxID_ANY, " y : "), 0, wxALIGN_CENTER_VERTICAL, 0); + temp->Add(static_text_y, 0, wxALIGN_CENTER_VERTICAL, 0); temp->Add(y_textctrl); // x_textctrl->Bind(wxEVT_TEXT, ([this](wxCommandEvent e) { on_change_field(); }), x_textctrl->GetId()); @@ -880,6 +894,7 @@ void StaticText::BUILD() const wxString legend(static_cast(m_opt.default_value)->value); auto temp = new wxStaticText(m_parent, wxID_ANY, legend, wxDefaultPosition, size, wxST_ELLIPSIZE_MIDDLE); + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->SetFont(wxGetApp().bold_font()); // // recast as a wxWindow to fit the calling convention @@ -903,10 +918,12 @@ void SliderCtrl::BUILD() m_slider = new wxSlider(m_parent, wxID_ANY, def_val * m_scale, min * m_scale, max * m_scale, wxDefaultPosition, size); + m_slider->SetBackgroundStyle(wxBG_STYLE_PAINT); wxSize field_size(40, -1); m_textctrl = new wxTextCtrl(m_parent, wxID_ANY, wxString::Format("%d", m_slider->GetValue()/m_scale), wxDefaultPosition, field_size); + m_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->Add(m_slider, 1, wxEXPAND | wxALIGN_CENTER_VERTICAL, 0); temp->Add(m_textctrl, 0, wxALIGN_CENTER_VERTICAL, 0); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 7d448fbe4..79ad70e5a 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "libslic3r/Utils.hpp" #include "libslic3r/Model.hpp" @@ -98,6 +99,8 @@ bool GUI_App::OnInit() SetAppName("Slic3rPE-alpha"); SetAppDisplayName("Slic3r Prusa Edition"); +// wxSystemOptions::SetOption("msw.staticbox.optimized-paint", 0); + // Slic3r::debugf "wxWidgets version %s, Wx version %s\n", wxVERSION_STRING, wxVERSION; // Set the Slic3r data directory at the Slic3r XS module. diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 0e9fcd75e..5e9c9ac30 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -23,18 +23,18 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co // is the normal type. if (opt.gui_type.compare("select") == 0) { } else if (opt.gui_type.compare("select_open") == 0) { - m_fields.emplace(id, std::move(Choice::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); } else if (opt.gui_type.compare("color") == 0) { - m_fields.emplace(id, std::move(ColourPicker::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(ColourPicker::Create(this->ctrl_parent(), opt, id))); } else if (opt.gui_type.compare("f_enum_open") == 0 || opt.gui_type.compare("i_enum_open") == 0 || opt.gui_type.compare("i_enum_closed") == 0) { - m_fields.emplace(id, std::move(Choice::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); } else if (opt.gui_type.compare("slider") == 0) { - m_fields.emplace(id, std::move(SliderCtrl::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(SliderCtrl::Create(this->ctrl_parent(), opt, id))); } else if (opt.gui_type.compare("i_spin") == 0) { // Spinctrl } else if (opt.gui_type.compare("legend") == 0) { // StaticText - m_fields.emplace(id, std::move(StaticText::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(StaticText::Create(this->ctrl_parent(), opt, id))); } else { switch (opt.type) { case coFloatOrPercent: @@ -44,21 +44,21 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co case coPercents: case coString: case coStrings: - m_fields.emplace(id, std::move(TextCtrl::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(TextCtrl::Create(this->ctrl_parent(), opt, id))); break; case coBool: case coBools: - m_fields.emplace(id, std::move(CheckBox::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(CheckBox::Create(this->ctrl_parent(), opt, id))); break; case coInt: case coInts: - m_fields.emplace(id, std::move(SpinCtrl::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(SpinCtrl::Create(this->ctrl_parent(), opt, id))); break; case coEnum: - m_fields.emplace(id, std::move(Choice::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); break; case coPoints: - m_fields.emplace(id, std::move(PointCtrl::Create(parent(), opt, id))); + m_fields.emplace(id, std::move(PointCtrl::Create(this->ctrl_parent(), opt, id))); break; case coNone: break; default: @@ -119,7 +119,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n return; } if (line.widget != nullptr) { - sizer->Add(line.widget(m_parent), 0, wxEXPAND | wxALL, wxOSX ? 0 : 15); + sizer->Add(line.widget(this->ctrl_parent()), 0, wxEXPAND | wxALL, wxOSX ? 0 : 15); return; } } @@ -167,7 +167,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // if we have an extra column, build it if (extra_column) - grid_sizer->Add(extra_column(parent(), line), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3); + grid_sizer->Add(extra_column(this->ctrl_parent(), line), 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3); // Build a label if we have it wxStaticText* label=nullptr; @@ -179,18 +179,21 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // Text is properly aligned only when Ellipsize is checked. label_style |= staticbox ? 0 : wxST_ELLIPSIZE_END; #endif /* __WXGTK__ */ - label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ": "), + label = new wxStaticText(this->ctrl_parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ": "), wxDefaultPosition, wxSize(label_width, -1), label_style); + label->SetBackgroundStyle(wxBG_STYLE_PAINT); label->SetFont(label_font); label->Wrap(label_width); // avoid a Linux/GTK bug if (!line.near_label_widget) grid_sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, line.label.IsEmpty() ? 0 : 5); + else if (line.near_label_widget && line.label.IsEmpty()) + grid_sizer->Add(line.near_label_widget(this->ctrl_parent()), 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 7); else { // If we're here, we have some widget near the label // so we need a horizontal sizer to arrange these things auto sizer = new wxBoxSizer(wxHORIZONTAL); grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1); - sizer->Add(line.near_label_widget(parent()), 0, wxRIGHT, 7); + sizer->Add(line.near_label_widget(this->ctrl_parent()), 0, wxRIGHT, 7); sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, 5); } if (line.label_tooltip.compare("") != 0) @@ -201,7 +204,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n *full_Label = label; // Initiate the pointer to the control of the full label, if we need this one. // If there's a widget, build it and add the result to the sizer. if (line.widget != nullptr) { - auto wgt = line.widget(parent()); + auto wgt = line.widget(this->ctrl_parent()); // If widget doesn't have label, don't use border grid_sizer->Add(wgt, 0, wxEXPAND | wxBOTTOM | wxTOP, (wxOSX || line.label.IsEmpty()) ? 0 : 5); return; @@ -237,7 +240,8 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n wxString str_label = (option.label == "Top" || option.label == "Bottom") ? _CTX(option.label, "Layers") : _(option.label); - label = new wxStaticText(parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, wxDefaultSize); + label = new wxStaticText(this->ctrl_parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, wxDefaultSize); + label->SetBackgroundStyle(wxBG_STYLE_PAINT); label->SetFont(label_font); sizer_tmp->Add(label, 0, /*wxALIGN_RIGHT |*/ wxALIGN_CENTER_VERTICAL, 0); } @@ -262,8 +266,9 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // add sidetext if any if (option.sidetext != "") { - auto sidetext = new wxStaticText( parent(), wxID_ANY, _(option.sidetext), wxDefaultPosition, + auto sidetext = new wxStaticText( this->ctrl_parent(), wxID_ANY, _(option.sidetext), wxDefaultPosition, wxSize(sidetext_width, -1)/*wxDefaultSize*/, wxALIGN_LEFT); + sidetext->SetBackgroundStyle(wxBG_STYLE_PAINT); sidetext->SetFont(sidetext_font); sizer_tmp->Add(sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); field->set_side_text_ptr(sidetext); @@ -271,7 +276,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // add side widget if any if (opt.side_widget != nullptr) { - sizer_tmp->Add(opt.side_widget(parent())/*!.target()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 1); //! requires verification + sizer_tmp->Add(opt.side_widget(this->ctrl_parent())/*!.target()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 1); //! requires verification } if (opt.opt_id != option_set.back().opt_id) //! istead of (opt != option_set.back()) @@ -287,11 +292,11 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n // extra widget for non-staticbox option group (like for the frequently used parameters on the sidebar) should be wxALIGN_RIGHT const auto v_sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(v_sizer, 1, wxEXPAND); - v_sizer->Add(extra_widget(parent()), 0, wxALIGN_RIGHT); + v_sizer->Add(extra_widget(this->ctrl_parent()), 0, wxALIGN_RIGHT); return; } - sizer->Add(extra_widget(parent())/*!.target()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); //! requires verification + sizer->Add(extra_widget(this->ctrl_parent())/*!.target()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); //! requires verification } } diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index d9ff6a01a..661aadbd7 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -112,6 +112,10 @@ public: } #endif /* __WXGTK__ */ + wxWindow* ctrl_parent() const { + return this->stb ? (wxWindow*)this->stb : this->parent(); + } + void append_line(const Line& line, wxStaticText** full_Label = nullptr); Line create_single_option_line(const Option& option) const; void append_single_option_line(const Option& option) { append_line(create_single_option_line(option)); } @@ -161,8 +165,10 @@ public: staticbox(title!=""), extra_column(extra_clmn) { if (staticbox) { stb = new wxStaticBox(_parent, wxID_ANY, title); + stb->SetBackgroundStyle(wxBG_STYLE_PAINT); stb->SetFont(wxGetApp().bold_font()); - } + } else + stb = nullptr; sizer = (staticbox ? new wxStaticBoxSizer(stb, wxVERTICAL) : new wxBoxSizer(wxVERTICAL)); auto num_columns = 1U; if (label_width != 0) num_columns++; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index ae33443c3..faee25270 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -58,6 +58,13 @@ Tab::Tab(wxNotebook* parent, const wxString& title, const char* name) : wxGetApp().tabs_list.push_back(this); m_em_unit = wxGetApp().em_unit(); + + Bind(wxEVT_SIZE, ([this](wxSizeEvent &evt) { + for (auto page : m_pages) + if (! page.get()->IsShown()) + page->layout_valid = false; + evt.Skip(); + })); } void Tab::set_type() @@ -74,7 +81,7 @@ void Tab::set_type() void Tab::create_preset_tab() { #ifdef __WINDOWS__ -// SetDoubleBuffered(true); + SetDoubleBuffered(true); #endif //__WINDOWS__ m_preset_bundle = wxGetApp().preset_bundle; @@ -293,6 +300,11 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str auto panel = this; #endif PageShp page(new Page(panel, title, icon_idx)); +// page->SetBackgroundStyle(wxBG_STYLE_SYSTEM); +#ifdef __WINDOWS__ +// page->SetDoubleBuffered(true); +#endif //__WINDOWS__ + page->SetScrollbars(1, 20, 1, 2); page->Hide(); m_hsizer->Add(page.get(), 1, wxEXPAND | wxLEFT, 5); @@ -318,7 +330,7 @@ void Tab::OnActivate() void Tab::update_labels_colour() { - Freeze(); +// Freeze(); //update options "decoration" for (const auto opt : m_options_list) { @@ -345,7 +357,7 @@ void Tab::update_labels_colour() if (field == nullptr) continue; field->set_label_colour_force(color); } - Thaw(); +// Thaw(); auto cur_item = m_treectrl->GetFirstVisibleItem(); while (cur_item) { @@ -389,7 +401,7 @@ void Tab::update_changed_ui() for (auto opt_key : dirty_options) m_options_list[opt_key] &= ~osInitValue; for (auto opt_key : nonsys_options) m_options_list[opt_key] &= ~osSystemValue; - Freeze(); +// Freeze(); //update options "decoration" for (const auto opt : m_options_list) { @@ -439,7 +451,7 @@ void Tab::update_changed_ui() field->set_undo_to_sys_tooltip(sys_tt); field->set_label_colour(color); } - Thaw(); +// Thaw(); wxTheApp->CallAfter([this]() { update_changed_tree_ui(); @@ -686,16 +698,16 @@ void Tab::load_config(const DynamicPrintConfig& config) // Reload current $self->{config} (aka $self->{presets}->edited_preset->config) into the UI fields. void Tab::reload_config() { - Freeze(); +// Freeze(); for (auto page : m_pages) page->reload_config(); - Thaw(); +// Thaw(); } void Tab::update_visibility() { const ConfigOptionMode mode = wxGetApp().get_mode(); - Freeze(); +// Freeze(); for (auto page : m_pages) page->update_visibility(mode); @@ -705,7 +717,7 @@ void Tab::update_visibility() m_mode_sizer->SetMode(mode); Layout(); - Thaw(); +// Thaw(); // to update tree items color // wxTheApp->CallAfter([this]() { @@ -1180,7 +1192,7 @@ void TabPrint::update() // return; // ! TODO Let delete this part of code after a common aplication testing m_update_cnt++; - Freeze(); +// Freeze(); double fill_density = m_config->option("fill_density")->value; @@ -1391,7 +1403,7 @@ void TabPrint::update() m_recommended_thin_wall_thickness_description_line->SetText( from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle))); - Thaw(); +// Thaw(); m_update_cnt--; if (m_update_cnt==0) @@ -1566,7 +1578,7 @@ void TabFilament::update() return; // ys_FIXME m_update_cnt++; - Freeze(); +// Freeze(); wxString text = from_u8(PresetHints::cooling_description(m_presets->get_edited_preset())); m_cooling_description_line->SetText(text); text = from_u8(PresetHints::maximum_volumetric_flow_description(*m_preset_bundle)); @@ -1580,7 +1592,7 @@ void TabFilament::update() for (auto el : { "min_fan_speed", "disable_fan_first_layers" }) get_field(el)->toggle(fan_always_on); - Thaw(); +// Thaw(); m_update_cnt--; if (m_update_cnt == 0) @@ -2261,7 +2273,7 @@ void TabPrinter::update() void TabPrinter::update_fff() { - Freeze(); +// Freeze(); bool en; auto serial_speed = get_field("serial_speed"); @@ -2360,7 +2372,7 @@ void TabPrinter::update_fff() (have_multiple_extruders && toolchange_retraction); } - Thaw(); +// Thaw(); } void TabPrinter::update_sla() @@ -2674,7 +2686,7 @@ void Tab::OnTreeSelChange(wxTreeEvent& event) #ifdef __linux__ std::unique_ptr no_updates(new wxWindowUpdateLocker(this)); #else - wxWindowUpdateLocker noUpdates(this); +// wxWindowUpdateLocker noUpdates(this); #endif if (m_pages.empty()) @@ -2694,17 +2706,22 @@ void Tab::OnTreeSelChange(wxTreeEvent& event) if (page == nullptr) return; for (auto& el : m_pages) - el.get()->Hide(); +// if (el.get()->IsShown()) { + el.get()->Hide(); +// break; +// } -#ifdef __linux__ - no_updates.reset(nullptr); -#endif - - page->Show(); - m_hsizer->Layout(); - Refresh(); + #ifdef __linux__ + no_updates.reset(nullptr); + #endif update_undo_buttons(); + page->Show(); +// if (! page->layout_valid) { + page->layout_valid = true; + m_hsizer->Layout(); + Refresh(); +// } } void Tab::OnKeyDown(wxKeyEvent& event) @@ -3040,6 +3057,7 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la } // auto bmp = new wxStaticBitmap(parent, wxID_ANY, bmp_name.empty() ? wxNullBitmap : wxBitmap(from_u8(var(bmp_name)), wxBITMAP_TYPE_PNG)); auto bmp = new wxStaticBitmap(parent, wxID_ANY, bmp_name.empty() ? wxNullBitmap : create_scaled_bitmap(bmp_name)); + bmp->SetBackgroundStyle(wxBG_STYLE_PAINT); return bmp; }; diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 7ef066963..5f8a7f706 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -65,6 +65,9 @@ public: bool m_is_modified_values{ false }; bool m_is_nonsys_values{ true }; + // Delayed layout after resizing the main window. + bool layout_valid = false; + public: std::vector m_optgroups; DynamicPrintConfig* m_config; From a5b202aa1d28c0c3280f42f63b9af0bc394d4ca9 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 18 Mar 2019 12:59:52 +0100 Subject: [PATCH 172/236] Fix of #1955 and #1874 --- src/slic3r/GUI/GUI_Preview.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 2211e8d7d..69f255be1 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -365,6 +365,9 @@ void Preview::load_print() void Preview::reload_print(bool force, bool keep_volumes) { + if (!IsShown() && !force) + return; + if (!keep_volumes) { m_canvas->reset_volumes(); @@ -372,9 +375,6 @@ void Preview::reload_print(bool force, bool keep_volumes) m_loaded = false; } - if (!IsShown() && !force) - return; - load_print(); } From f249155340c0ca8ecc923527142f57049e2b9d46 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 18 Mar 2019 14:07:55 +0100 Subject: [PATCH 173/236] Follow-up of a5b202aa1d28c0c3280f42f63b9af0bc394d4ca9 (fixed cleanup of toolpaths in preview after scene update) --- src/slic3r/GUI/GUI_Preview.cpp | 11 ++++++++--- src/slic3r/GUI/GUI_Preview.hpp | 4 +++- src/slic3r/GUI/Plater.cpp | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 69f255be1..5a9426547 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -186,6 +186,7 @@ Preview::Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_t , m_loaded(false) , m_enabled(false) , m_schedule_background_process(schedule_background_process_func) + , m_volumes_cleanup_required(false) { if (init(parent, bed, camera, view_toolbar)) { @@ -363,16 +364,20 @@ void Preview::load_print() load_print_as_sla(); } -void Preview::reload_print(bool force, bool keep_volumes) +void Preview::reload_print(bool keep_volumes) { - if (!IsShown() && !force) + if (!IsShown()) + { + m_volumes_cleanup_required = !keep_volumes; return; + } - if (!keep_volumes) + if (m_volumes_cleanup_required || !keep_volumes) { m_canvas->reset_volumes(); m_canvas->reset_legend_texture(); m_loaded = false; + m_volumes_cleanup_required = false; } load_print(); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index bfb604c40..7820c137b 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -86,6 +86,8 @@ class Preview : public wxPanel BackgroundSlicingProcess* m_process; GCodePreviewData* m_gcode_preview_data; + bool m_volumes_cleanup_required; + // Calling this function object forces Plater::schedule_background_process. std::function m_schedule_background_process; @@ -112,7 +114,7 @@ public: void set_drop_target(wxDropTarget* target); void load_print(); - void reload_print(bool force = false, bool keep_volumes = false); + void reload_print(bool keep_volumes = false); void refresh_print(); private: diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 601c2ddb6..56dc323b3 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2388,7 +2388,7 @@ void Plater::priv::set_current_panel(wxPanel* panel) { this->q->reslice(); // keeps current gcode preview, if any - preview->reload_print(false, true); + preview->reload_print(true); preview->set_canvas_as_dirty(); view_toolbar.select_item("Preview"); } From ba54ce030993ac00a1a58e3f646561f842d75d95 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 18 Mar 2019 15:10:40 +0100 Subject: [PATCH 174/236] Added "Edit Preset" buttons on the sidebar. + fixed Filament presets updating for the multi-material Printer (inside update_compatible(...) function) --- src/slic3r/GUI/Plater.cpp | 44 ++++++++++++++++++++++++++++++--- src/slic3r/GUI/Plater.hpp | 2 ++ src/slic3r/GUI/PresetBundle.cpp | 30 ++++++++++++---------- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 601c2ddb6..b5074ccc1 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -275,9 +275,36 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * dialog->Destroy(); }); } + + edit_btn = new wxButton(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER); +#ifdef __WINDOWS__ + edit_btn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); +#endif + edit_btn->SetBitmap(create_scaled_bitmap("cog.png")); + edit_btn->SetToolTip(_(L("Click to Edit a selected Filament Preset"))); + + edit_btn->Bind(wxEVT_BUTTON, ([preset_type, this](wxCommandEvent) + { + Tab* tab = wxGetApp().get_tab(preset_type); + if (!tab) + return; + + int page_id = wxGetApp().tab_panel()->FindPage(tab); + if (page_id == wxNOT_FOUND) + return; + + wxGetApp().tab_panel()->ChangeSelection(page_id); + + tab->select_preset(GetString(GetSelection()).ToUTF8().data()); + + })); } -PresetComboBox::~PresetComboBox() {} +PresetComboBox::~PresetComboBox() +{ + if (edit_btn) + edit_btn->Destroy(); +} void PresetComboBox::set_label_marker(int item) @@ -611,13 +638,18 @@ Sidebar::Sidebar(Plater *parent) text->SetFont(wxGetApp().small_font()); *combo = new PresetComboBox(p->presets_panel, preset_type); + auto combo_and_btn_sizer = new wxBoxSizer(wxHORIZONTAL); + combo_and_btn_sizer->Add(*combo, 1, wxEXPAND); + if ((*combo)->edit_btn) + combo_and_btn_sizer->Add((*combo)->edit_btn, 0, wxLEFT|wxRIGHT, int(0.3*wxGetApp().em_unit())); + auto *sizer_presets = this->p->sizer_presets; auto *sizer_filaments = this->p->sizer_filaments; sizer_presets->Add(text, 0, wxALIGN_LEFT | wxEXPAND | wxRIGHT, 4); if (! filament) { - sizer_presets->Add(*combo, 0, wxEXPAND | wxBOTTOM, 1); + sizer_presets->Add(combo_and_btn_sizer, 0, wxEXPAND | wxBOTTOM, 1); } else { - sizer_filaments->Add(*combo, 0, wxEXPAND | wxBOTTOM, 1); + sizer_filaments->Add(combo_and_btn_sizer, 0, wxEXPAND | wxBOTTOM, 1); (*combo)->set_extruder_idx(0); sizer_presets->Add(sizer_filaments, 1, wxEXPAND); } @@ -714,8 +746,12 @@ void Sidebar::init_filament_combo(PresetComboBox **combo, const int extr_idx) { (*combo)->set_extruder_idx(extr_idx); + auto combo_and_btn_sizer = new wxBoxSizer(wxHORIZONTAL); + combo_and_btn_sizer->Add(*combo, 1, wxEXPAND); + combo_and_btn_sizer->Add((*combo)->edit_btn, 0, wxLEFT | wxRIGHT, int(0.3*wxGetApp().em_unit())); + auto /***/sizer_filaments = this->p->sizer_filaments; - sizer_filaments->Add(*combo, 1, wxEXPAND | wxBOTTOM, 1); + sizer_filaments->Add(combo_and_btn_sizer, 1, wxEXPAND | wxBOTTOM, 1); } void Sidebar::remove_unused_filament_combos(const int current_extruder_count) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index ecce63805..d24a9bf32 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -46,6 +46,8 @@ public: PresetComboBox(wxWindow *parent, Preset::Type preset_type); ~PresetComboBox(); + wxButton* edit_btn { nullptr }; + void set_label_marker(int item); void set_extruder_idx(const int extr_idx) { extruder_idx = extr_idx; } int get_extruder_idx() const { return extruder_idx; } diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index f0bb4de01..b8c9fedac 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1308,19 +1308,23 @@ void PresetBundle::update_compatible(bool select_other_if_incompatible) { return std::find(prefered_filament_profiles.begin(), prefered_filament_profiles.end(), profile_name) != prefered_filament_profiles.end(); }); if (select_other_if_incompatible) { // Verify validity of the current filament presets. - this->filament_presets.front() = this->filaments.get_edited_preset().name; - for (size_t idx = 1; idx < this->filament_presets.size(); ++ idx) { - std::string &filament_name = this->filament_presets[idx]; - Preset *preset = this->filaments.find_preset(filament_name, false); - if (preset == nullptr || ! preset->is_compatible) { - // Pick a compatible profile. If there are prefered_filament_profiles, use them. - if (prefered_filament_profiles.empty()) - filament_name = this->filaments.first_compatible().name; - else { - const std::string &preferred = (idx < prefered_filament_profiles.size()) ? - prefered_filament_profiles[idx] : prefered_filament_profiles.front(); - filament_name = this->filaments.first_compatible( - [&preferred](const std::string& profile_name) { return profile_name == preferred; }).name; + if (this->filament_presets.size() == 1) + this->filament_presets.front() = this->filaments.get_edited_preset().name; + else + { + for (size_t idx = 0; idx < this->filament_presets.size(); ++idx) { + std::string &filament_name = this->filament_presets[idx]; + Preset *preset = this->filaments.find_preset(filament_name, false); + if (preset == nullptr || !preset->is_compatible) { + // Pick a compatible profile. If there are prefered_filament_profiles, use them. + if (prefered_filament_profiles.empty()) + filament_name = this->filaments.first_compatible().name; + else { + const std::string &preferred = (idx < prefered_filament_profiles.size()) ? + prefered_filament_profiles[idx] : prefered_filament_profiles.front(); + filament_name = this->filaments.first_compatible( + [&preferred](const std::string& profile_name) { return profile_name == preferred; }).name; + } } } } From cd2cccec5f2ff20fa06b8f66472656671032c616 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 18 Mar 2019 15:31:47 +0100 Subject: [PATCH 175/236] Adding validation code for support parameters (elevation) --- src/libslic3r/SLA/SLASupportTree.cpp | 4 ++-- src/libslic3r/SLAPrint.cpp | 17 +++++++++++++++++ src/libslic3r/SLAPrint.hpp | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index 650dfe2e7..df9990822 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -1466,7 +1466,7 @@ public: m_cfg.head_back_radius_mm, w); - if(t <= w || (hp(Z) + nn(Z) * w) < m_result.ground_level) { + if(t <= w) { // Let's try to optimize this angle, there might be a // viable normal that doesn't collide with the model @@ -1509,7 +1509,7 @@ public: // save the verified and corrected normal m_support_nmls.row(fidx) = nn; - if(t > w && (hp(Z) + nn(Z) * w) > m_result.ground_level) { + if(t > w) { // mark the point for needing a head. m_iheads.emplace_back(fidx); } else if( polar >= 3*PI/4 ) { diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 0e8e717cc..83fa61fdd 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -571,7 +571,24 @@ void swapXY(ExPolygon& expoly) { for(auto& p : expoly.contour.points) std::swap(p(X), p(Y)); for(auto& h : expoly.holes) for(auto& p : h.points) std::swap(p(X), p(Y)); } +} +std::string SLAPrint::validate() const +{ + for(SLAPrintObject * po : m_objects) { + sla::SupportConfig cfg = make_support_cfg(po->config()); + + double pinhead_width = + 2 * cfg.head_front_radius_mm + + cfg.head_width_mm + + 2 * cfg.head_back_radius_mm - + cfg.head_penetration_mm; + + if(pinhead_width > cfg.object_elevation_mm) + return L("Elevetion is too low for object."); + } + + return ""; } std::vector SLAPrint::calculate_heights(const BoundingBoxf3& bb3d, diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index eb927c769..c06e2fc77 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -240,6 +240,8 @@ public: const SLAPrintStatistics& print_statistics() const { return m_print_statistics; } + std::string validate() const override; + private: using SLAPrinter = FilePrinter; using SLAPrinterPtr = std::unique_ptr; From 4a8a1fac7b6ad690ed4f81eae9d31ae6e145a4c5 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 18 Mar 2019 16:00:44 +0100 Subject: [PATCH 176/236] Fix of #1976 --- src/slic3r/GUI/GUI_Preview.cpp | 7 +++---- src/slic3r/GUI/GUI_Preview.hpp | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 5a9426547..9860f26b1 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -559,15 +559,14 @@ static int find_close_layer_idx(const std::vector& zs, double &z, double return -1; } -void Preview::update_double_slider(const std::vector& layers_z, bool force_sliders_full_range) +void Preview::update_double_slider(const std::vector& layers_z) { // Save the initial slider span. double z_low = m_slider->GetLowerValueD(); double z_high = m_slider->GetHigherValueD(); bool was_empty = m_slider->GetMaxValue() == 0; - bool span_changed = layers_z.empty() || std::abs(layers_z.back() - m_slider->GetMaxValueD()) > 1e-6; - force_sliders_full_range |= was_empty | span_changed; - bool snap_to_min = force_sliders_full_range || m_slider->is_lower_at_min(); + bool force_sliders_full_range = was_empty; + bool snap_to_min = force_sliders_full_range || m_slider->is_lower_at_min(); bool snap_to_max = force_sliders_full_range || m_slider->is_higher_at_max(); std::vector> values; diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 7820c137b..59f62ded1 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -138,7 +138,7 @@ private: // Create/Update/Reset double slider on 3dPreview void create_double_slider(); - void update_double_slider(const std::vector& layers_z, bool force_sliders_full_range = false); + void update_double_slider(const std::vector& layers_z); void fill_slider_values(std::vector> &values, const std::vector &layers_z); void reset_double_slider(); From 456d09be766c3323e652b83952a502ec3b66e313 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 18 Mar 2019 16:18:28 +0100 Subject: [PATCH 177/236] Fix out of bounds selection in ObjectList, fix #1890 --- src/slic3r/GUI/GUI_ObjectList.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 7eef82063..abfc067ff 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2022,6 +2022,8 @@ void ObjectList::update_selections_on_canvas() void ObjectList::select_item(const wxDataViewItem& item) { + if (! item.IsOk()) { return; } + m_prevent_list_events = true; UnselectAll(); From a90d5c8a286dc687dd1139351cbe5d18edadfc74 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 18 Mar 2019 20:54:01 +0100 Subject: [PATCH 178/236] Performance fix of rendering of the parameter tabs on Windows: Disabled Windows Vista themes for the wxNotebook. --- src/slic3r/GUI/Field.cpp | 17 ++++++++++++++++- src/slic3r/GUI/GUI_App.cpp | 5 +++++ src/slic3r/GUI/GUI_App.hpp | 2 ++ src/slic3r/GUI/MainFrame.cpp | 4 +++- src/slic3r/GUI/Tab.cpp | 9 ++++++++- 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index c9eb9282e..f691a8065 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -259,7 +259,12 @@ void TextCtrl::BUILD() { const long style = m_opt.multiline ? wxTE_MULTILINE : wxTE_PROCESS_ENTER/*0*/; auto temp = new wxTextCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, style); - temp->SetBackgroundStyle(wxBG_STYLE_PAINT); + temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + + if (! m_opt.multiline) + // Only disable background refresh for single line input fields, as they are completely painted over by the edit control. + // This does not apply to the multi-line edit field, where the last line and a narrow frame around the text is not cleared. + temp->SetBackgroundStyle(wxBG_STYLE_PAINT); #ifdef __WXOSX__ temp->OSXDisableAllSmartSubstitutions(); #endif // __WXOSX__ @@ -375,6 +380,7 @@ void CheckBox::BUILD() { false; auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); + temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); temp->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->SetValue(check_value); if (m_opt.readonly) temp->Disable(); @@ -433,6 +439,7 @@ void SpinCtrl::BUILD() { auto temp = new wxSpinCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, 0|wxTE_PROCESS_ENTER, min_val, max_val, default_value); + temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); temp->SetBackgroundStyle(wxBG_STYLE_PAINT); #ifndef __WXOSX__ @@ -507,6 +514,7 @@ void Choice::BUILD() { temp = new wxComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); else temp = new wxComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, NULL, wxCB_READONLY); + temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); temp->SetBackgroundStyle(wxBG_STYLE_PAINT); // recast as a wxWindow to fit the calling convention @@ -815,12 +823,16 @@ void PointCtrl::BUILD() x_textctrl = new wxTextCtrl(m_parent, wxID_ANY, X, wxDefaultPosition, field_size, wxTE_PROCESS_ENTER); y_textctrl = new wxTextCtrl(m_parent, wxID_ANY, Y, wxDefaultPosition, field_size, wxTE_PROCESS_ENTER); + x_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); x_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); + y_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); y_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); auto static_text_x = new wxStaticText(m_parent, wxID_ANY, "x : "); auto static_text_y = new wxStaticText(m_parent, wxID_ANY, " y : "); + static_text_x->SetFont(Slic3r::GUI::wxGetApp().normal_font()); static_text_x->SetBackgroundStyle(wxBG_STYLE_PAINT); + static_text_y->SetFont(Slic3r::GUI::wxGetApp().normal_font()); static_text_y->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->Add(static_text_x, 0, wxALIGN_CENTER_VERTICAL, 0); @@ -894,6 +906,7 @@ void StaticText::BUILD() const wxString legend(static_cast(m_opt.default_value)->value); auto temp = new wxStaticText(m_parent, wxID_ANY, legend, wxDefaultPosition, size, wxST_ELLIPSIZE_MIDDLE); + temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); temp->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->SetFont(wxGetApp().bold_font()); @@ -918,11 +931,13 @@ void SliderCtrl::BUILD() m_slider = new wxSlider(m_parent, wxID_ANY, def_val * m_scale, min * m_scale, max * m_scale, wxDefaultPosition, size); + m_slider->SetFont(Slic3r::GUI::wxGetApp().normal_font()); m_slider->SetBackgroundStyle(wxBG_STYLE_PAINT); wxSize field_size(40, -1); m_textctrl = new wxTextCtrl(m_parent, wxID_ANY, wxString::Format("%d", m_slider->GetValue()/m_scale), wxDefaultPosition, field_size); + m_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); m_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->Add(m_slider, 1, wxEXPAND | wxALIGN_CENTER_VERTICAL, 0); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 84bbf42fc..3b506850a 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -94,7 +94,11 @@ bool GUI_App::OnInit() SetAppName("Slic3rPE-beta"); SetAppDisplayName("Slic3r Prusa Edition"); +// Enable this to get the default Win32 COMCTRL32 behavior of static boxes. // wxSystemOptions::SetOption("msw.staticbox.optimized-paint", 0); +// Enable this to disable Windows Vista themes for all wxNotebooks. The themes seem to lead to terrible +// performance when working on high resolution multi-display setups. +// wxSystemOptions::SetOption("msw.notebook.themed-background", 0); // Slic3r::debugf "wxWidgets version %s, Wx version %s\n", wxVERSION_STRING, wxVERSION; @@ -249,6 +253,7 @@ void GUI_App::init_fonts() { m_small_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); m_bold_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold(); + m_normal_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); #ifdef __WXMAC__ m_small_font.SetPointSize(11); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 8f332b855..e10a7b95e 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -78,6 +78,7 @@ class GUI_App : public wxApp wxFont m_small_font; wxFont m_bold_font; + wxFont m_normal_font; size_t m_em_unit; // width of a "m"-symbol in pixels for current system font // Note: for 100% Scale m_em_unit = 10 -> it's a good enough coefficient for a size setting of controls @@ -106,6 +107,7 @@ public: const wxFont& small_font() { return m_small_font; } const wxFont& bold_font() { return m_bold_font; } + const wxFont& normal_font() { return m_normal_font; } size_t em_unit() const { return m_em_unit; } void set_em_unit(const size_t em_unit) { m_em_unit = em_unit; } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 9e54b9b36..4ded9b1ff 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -127,7 +127,9 @@ wxFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAUL void MainFrame::init_tabpanel() { - m_tabpanel = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL); + // wxNB_NOPAGETHEME: Disable Windows Vista theme for the Notebook background. The theme performance is terrible on Windows 10 + // with multiple high resolution displays connected. + m_tabpanel = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME); m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, [this](wxEvent&) { auto panel = m_tabpanel->GetCurrentPage(); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index a9c76d764..70adfd9ee 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1498,6 +1498,7 @@ void TabFilament::build() line = optgroup->create_single_option_line("filament_ramming_parameters");// { _(L("Ramming")), "" }; line.widget = [this](wxWindow* parent) { auto ramming_dialog_btn = new wxButton(parent, wxID_ANY, _(L("Ramming settings"))+dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); + ramming_dialog_btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(ramming_dialog_btn); @@ -1633,6 +1634,7 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) auto printhost_browse = [=](wxWindow* parent) { auto btn = m_printhost_browse_btn = new wxButton(parent, wxID_ANY, _(L(" Browse "))+dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT); + btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); btn->SetBitmap(create_scaled_bitmap("zoom.png")); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn); @@ -1651,6 +1653,7 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) auto print_host_test = [this](wxWindow* parent) { auto btn = m_print_host_test_btn = new wxButton(parent, wxID_ANY, _(L("Test")), wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT); + btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); btn->SetBitmap(create_scaled_bitmap("wrench.png")); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn); @@ -1688,6 +1691,7 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) auto printhost_cafile_browse = [this, optgroup] (wxWindow* parent) { auto btn = new wxButton(parent, wxID_ANY, _(L(" Browse "))+dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT); // btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("zoom.png")), wxBITMAP_TYPE_PNG)); + btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); btn->SetBitmap(create_scaled_bitmap("zoom.png")); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn); @@ -1726,6 +1730,7 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) \tOn this system, Slic3r uses HTTPS certificates from the system Certificate Store or Keychain.\n\ \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain.")), ca_file_hint)); + txt->SetFont(Slic3r::GUI::wxGetApp().normal_font()); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(txt); return sizer; @@ -1966,7 +1971,7 @@ void TabPrinter::build_sla() Line line = optgroup->create_single_option_line("bed_shape");//{ _(L("Bed shape")), "" }; line.widget = [this](wxWindow* parent) { auto btn = new wxButton(parent, wxID_ANY, _(L(" Set ")) + dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT); - // btn->SetFont(Slic3r::GUI::small_font); + btn->SetFont(wxGetApp().small_font()); // btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("printer_empty.png")), wxBITMAP_TYPE_PNG)); btn->SetBitmap(create_scaled_bitmap("printer_empty.png")); @@ -2883,7 +2888,9 @@ void Tab::update_ui_from_settings() wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &deps) { deps.checkbox = new wxCheckBox(parent, wxID_ANY, _(L("All"))); + deps.checkbox->SetFont(Slic3r::GUI::wxGetApp().normal_font()); deps.btn = new wxButton(parent, wxID_ANY, _(L(" Set "))+dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT); + deps.btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); // deps.btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("printer_empty.png")), wxBITMAP_TYPE_PNG)); deps.btn->SetBitmap(create_scaled_bitmap("printer_empty.png")); From 20be57dc582b53014cca5e51b73a585ebdcff8c1 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 18 Mar 2019 23:22:38 +0100 Subject: [PATCH 179/236] Weird things happen as the Paint messages are floating around the windows being destructed. Avoid the Paint messages by hiding the main window. Also the application closes much faster without these unnecessary screen refreshes. In addition, there were some crashes due to the Paint events sent to already destructed windows. --- src/slic3r/GUI/MainFrame.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 4ded9b1ff..d69480b28 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -96,6 +96,12 @@ wxFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAUL return; } + // Weird things happen as the Paint messages are floating around the windows being destructed. + // Avoid the Paint messages by hiding the main window. + // Also the application closes much faster without these unnecessary screen refreshes. + // In addition, there were some crashes due to the Paint events sent to already destructed windows. + this->Show(false); + // Save the slic3r.ini.Usually the ini file is saved from "on idle" callback, // but in rare cases it may not have been called yet. wxGetApp().app_config->save(); From 42939e76a335319d391dce846eb210d780dc261c Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 09:21:27 +0100 Subject: [PATCH 180/236] Code cleanup --- src/libslic3r/Technologies.hpp | 2 - src/slic3r/GUI/GLCanvas3D.cpp | 122 ++------------------------------- src/slic3r/GUI/GLCanvas3D.hpp | 16 ----- src/slic3r/GUI/GLToolbar.cpp | 62 ----------------- src/slic3r/GUI/GLToolbar.hpp | 46 ------------- src/slic3r/GUI/GUI_Preview.cpp | 4 -- src/slic3r/GUI/GUI_Preview.hpp | 4 -- src/slic3r/GUI/Plater.cpp | 86 ----------------------- src/slic3r/GUI/Plater.hpp | 2 - 9 files changed, 7 insertions(+), 337 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index bbf746cda..bf869b99d 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -59,8 +59,6 @@ #define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #define ENABLE_CANVAS_GUI_REFACTORING 1 -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // _technologies_h_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index c152b0bf2..8dcb58cbb 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -733,13 +733,9 @@ GLCanvas3D::Mouse::Drag::Drag() GLCanvas3D::Mouse::Mouse() : dragging(false) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , left_down(false) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , position(DBL_MAX, DBL_MAX) , scene_position(DBL_MAX, DBL_MAX, DBL_MAX) , ignore_up_event(false) @@ -3721,13 +3717,9 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_use_VBOs(false) , m_apply_zoom_to_volumes_filter(false) , m_hover_volume_id(-1) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_toolbar_action_running(false) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_legend_texture_enabled(false) , m_picking_enabled(false) , m_moving_enabled(false) @@ -4031,9 +4023,7 @@ void GLCanvas3D::allow_multisample(bool allow) m_multisample_allowed = allow; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::enable_toolbar_item(const std::string& name, bool enable) { if (enable) @@ -4046,9 +4036,7 @@ bool GLCanvas3D::is_toolbar_item_pressed(const std::string& name) const { return m_toolbar.is_item_pressed(name); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::zoom_to_bed() { @@ -4102,9 +4090,7 @@ void GLCanvas3D::update_volumes_colors_by_extruder() m_volumes.update_colors_by_extruder(m_config); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLCanvas3D::update_toolbar_items_visibility() { ConfigOptionMode mode = wxGetApp().get_mode(); @@ -4113,10 +4099,7 @@ void GLCanvas3D::update_toolbar_items_visibility() m_toolbar.set_item_visible("splitvolumes", mode != comSimple); m_dirty = true; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - void GLCanvas3D::render() { @@ -4770,12 +4753,10 @@ void GLCanvas3D::on_size(wxSizeEvent& evt) void GLCanvas3D::on_idle(wxIdleEvent& evt) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING m_dirty |= m_toolbar.update_items_state(); m_dirty |= m_view_toolbar.update_items_state(); #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_dirty) return; @@ -5055,21 +5036,16 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING -// if (!evt.Entering() && !evt.Leaving()) -// { - bool processed_by_toolbar = m_toolbar.on_mouse(evt, *this); - processed_by_toolbar |= m_view_toolbar.on_mouse(evt, *this); + bool processed_by_toolbar = m_toolbar.on_mouse(evt, *this); + processed_by_toolbar |= m_view_toolbar.on_mouse(evt, *this); - if (processed_by_toolbar) - { - m_mouse.set_start_position_3D_as_invalid(); - return; - } -// } + if (processed_by_toolbar) + { + m_mouse.set_start_position_3D_as_invalid(); + return; + } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_picking_enabled) _set_current(); @@ -5078,14 +5054,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) int layer_editing_object_idx = is_layers_editing_enabled() ? selected_object_idx : -1; m_layers_editing.select_object(*m_model, layer_editing_object_idx); bool gizmos_overlay_contains_mouse = m_gizmos.overlay_contains_mouse(*this, m_mouse.position); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int toolbar_contains_mouse = m_toolbar.contains_mouse(m_mouse.position, *this); int view_toolbar_contains_mouse = m_view_toolbar.contains_mouse(m_mouse.position, *this); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_MOVE_MIN_THRESHOLD if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) @@ -5127,41 +5099,29 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { // to remove hover on objects when the mouse goes out of this canvas m_mouse.position = Vec2d(-1.0, -1.0); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // ensure m_mouse.left_down is reset (it may happen when switching canvas) m_mouse.left_down = false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.LeftDClick() && (toolbar_contains_mouse != -1)) { m_toolbar_action_running = true; m_mouse.set_start_position_3D_as_invalid(); m_toolbar.do_action((unsigned int)toolbar_contains_mouse, *this); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.LeftDClick() && (m_gizmos.get_current_type() != Gizmos::Undefined)) { m_mouse.ignore_up_event = true; } else if (evt.LeftDown() || evt.RightDown()) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_mouse.left_down = evt.LeftDown(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // If user pressed left or right button we first check whether this happened // on a volume or not. @@ -5214,9 +5174,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { // event was taken care of by the SlaSupports gizmo } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.LeftDown() && (view_toolbar_contains_mouse != -1)) m_view_toolbar.do_action((unsigned int)view_toolbar_contains_mouse, *this); else if (evt.LeftDown() && (toolbar_contains_mouse != -1)) @@ -5226,9 +5184,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_toolbar.do_action((unsigned int)toolbar_contains_mouse, *this); m_mouse.left_down = false; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else { // Select volume in this 3D canvas. @@ -5394,15 +5350,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } // do not process dragging if the mouse is into any of the HUD elements -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING else if (evt.Dragging() && !gizmos_overlay_contains_mouse) #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.Dragging() && !gizmos_overlay_contains_mouse && (toolbar_contains_mouse == -1) && (view_toolbar_contains_mouse == -1)) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { m_mouse.dragging = true; @@ -5412,15 +5364,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) _perform_layer_editing_action(&evt); } // do not process the dragging if the left mouse was set down in another canvas -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING else if (evt.LeftIsDown()) #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (m_mouse.left_down && evt.LeftIsDown()) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { // if dragging over blank area with left button, rotate #if ENABLE_MOVE_MIN_THRESHOLD @@ -5481,15 +5429,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // that's why the mouse_event function was called so that the gizmo can refuse the deselection in manual editing mode // deselect and propagate event through callback -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING if (!evt.ShiftDown() && m_picking_enabled && !m_mouse.ignore_up_event) #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!evt.ShiftDown() && m_picking_enabled && !m_toolbar_action_running && !m_mouse.ignore_up_event) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { m_selection.clear(); m_selection.set_mode(Selection::Instance); @@ -5569,14 +5513,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.set_start_position_3D_as_invalid(); m_mouse.set_start_position_2D_as_invalid(); m_mouse.dragging = false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_mouse.left_down = false; m_toolbar_action_running = false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_dirty = true; if (m_canvas->HasCapture()) @@ -5592,7 +5532,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (m_selection.is_empty()) m_gizmos.reset_all_states(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING if (tooltip.empty()) tooltip = m_toolbar.get_tooltip(); @@ -5600,7 +5539,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (tooltip.empty()) tooltip = m_view_toolbar.get_tooltip(); #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // updates toolbar overlay if (tooltip.empty()) tooltip = m_toolbar.update_hover_state(m_mouse.position, *this); @@ -5612,9 +5550,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (!tooltip.empty()) m_dirty = true; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ set_tooltip(tooltip); @@ -6012,15 +5948,11 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Add...") + " [" + GUI::shortkey_ctrl_prefix() + "I]"; item.sprite_id = 0; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ADD)); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_ADD; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6030,16 +5962,12 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Delete") + " [Del]"; item.sprite_id = 1; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE)); }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_delete(); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_DELETE; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6049,16 +5977,12 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Delete all") + " [" + GUI::shortkey_ctrl_prefix() + "Del]"; item.sprite_id = 2; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_delete_all(); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_DELETE_ALL; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6068,16 +5992,12 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Arrange [A]"); item.sprite_id = 3; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ARRANGE)); }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_arrange(); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_ARRANGE; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6090,17 +6010,13 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Add instance [+]"); item.sprite_id = 4; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); }; item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_increase_instances(); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_MORE; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6110,17 +6026,13 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Remove instance [-]"); item.sprite_id = 5; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); }; item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_decrease_instances(); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_FEWER; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6133,17 +6045,13 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to objects"); item.sprite_id = 6; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_OBJECTS)); }; item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_split_to_objects(); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_SPLIT_OBJECTS; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6153,17 +6061,13 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to parts"); item.sprite_id = 7; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_VOLUMES)); }; item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_split_to_volumes(); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_SPLIT_VOLUMES; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; @@ -6177,29 +6081,21 @@ bool GLCanvas3D::_init_toolbar() item.tooltip = GUI::L_str("Layers editing"); item.sprite_id = 8; item.is_toggable = true; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); }; item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_layers_editing(); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLTOOLBAR_LAYERSEDITING; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!m_toolbar.add_item(item)) return false; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ enable_toolbar_item("add", true); update_toolbar_items_visibility(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ return true; } @@ -6402,15 +6298,11 @@ void GLCanvas3D::_picking_pass() const { const Vec2d& pos = m_mouse.position; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING if (m_picking_enabled && !m_mouse.dragging && (pos != Vec2d(DBL_MAX, DBL_MAX))) #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (m_picking_enabled && !m_mouse.dragging && !m_mouse.left_down && (pos != Vec2d(DBL_MAX, DBL_MAX))) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { // Render the object for picking. // FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing. diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index b293857c5..229d70b4e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -314,13 +314,9 @@ class GLCanvas3D }; bool dragging; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool left_down; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Vec2d position; Vec3d scene_position; Drag drag; @@ -878,13 +874,9 @@ private: bool m_use_VBOs; bool m_apply_zoom_to_volumes_filter; mutable int m_hover_volume_id; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool m_toolbar_action_running; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool m_warning_texture_enabled; bool m_legend_texture_enabled; bool m_picking_enabled; @@ -963,14 +955,10 @@ public: void enable_dynamic_background(bool enable); void allow_multisample(bool allow); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void enable_toolbar_item(const std::string& name, bool enable); bool is_toolbar_item_pressed(const std::string& name) const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void zoom_to_bed(); void zoom_to_volumes(); @@ -979,13 +967,9 @@ public: void update_volumes_colors_by_extruder(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_toolbar_items_visibility(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool is_dragging() const { return m_gizmos.is_dragging() || m_moving; } diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 9678776c8..715eb7442 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -30,13 +30,11 @@ wxDEFINE_EVENT(EVT_GLTOOLBAR_LAYERSEDITING, SimpleEvent); wxDEFINE_EVENT(EVT_GLVIEWTOOLBAR_3D, SimpleEvent); wxDEFINE_EVENT(EVT_GLVIEWTOOLBAR_PREVIEW, SimpleEvent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING const GLToolbarItem::ActionCallback GLToolbarItem::Default_Action_Callback = [](){}; const GLToolbarItem::VisibilityCallback GLToolbarItem::Default_Visibility_Callback = []()->bool { return true; }; const GLToolbarItem::EnabledStateCallback GLToolbarItem::Default_Enabled_State_Callback = []()->bool { return true; }; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GLToolbarItem::Data::Data() : name("") @@ -47,43 +45,32 @@ GLToolbarItem::Data::Data() , sprite_id(-1) , is_toggable(false) , visible(true) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING , action_callback(Default_Action_Callback) , visibility_callback(Default_Visibility_Callback) , enabled_state_callback(Default_Enabled_State_Callback) #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { } GLToolbarItem::GLToolbarItem(GLToolbarItem::EType type, const GLToolbarItem::Data& data) : m_type(type) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING , m_state(Normal) #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_state(Disabled) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_data(data) { } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbarItem::do_action(wxEvtHandler *target) { wxPostEvent(target, SimpleEvent(m_data.action_event)); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool GLToolbarItem::update_visibility() { @@ -105,7 +92,6 @@ bool GLToolbarItem::update_enabled_state() return ret; } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const { @@ -188,12 +174,10 @@ GLToolbar::GLToolbar(GLToolbar::EType type) #if ENABLE_SVG_ICONS , m_icons_texture_dirty(true) #endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING , m_mouse_capture({false, false, false}) , m_tooltip("") #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ { } @@ -358,9 +342,7 @@ float GLToolbar::get_height() const return m_layout.height; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::enable_item(const std::string& name) { for (GLToolbarItem* item : m_items) @@ -384,9 +366,7 @@ void GLToolbar::disable_item(const std::string& name) } } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::select_item(const std::string& name) { @@ -436,9 +416,7 @@ bool GLToolbar::is_item_visible(const std::string& name) const return false; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::set_item_visible(const std::string& name, bool visible) { for (GLToolbarItem* item : m_items) @@ -464,11 +442,8 @@ void GLToolbar::set_item_visible(const std::string& name, bool visible) } } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool GLToolbar::update_items_state() { @@ -478,11 +453,8 @@ bool GLToolbar::update_items_state() return ret; } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) { if (!m_enabled) @@ -546,9 +518,7 @@ void GLToolbar::do_action(unsigned int item_id, GLCanvas3D& parent) } } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::render(const GLCanvas3D& parent) const { @@ -575,7 +545,6 @@ void GLToolbar::render(const GLCanvas3D& parent) const ::glPopMatrix(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) { @@ -624,7 +593,6 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) return processed; } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void GLToolbar::calc_layout() const { @@ -715,7 +683,6 @@ float GLToolbar::get_main_size() const return size; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING void GLToolbar::do_action(unsigned int item_id, GLCanvas3D& parent) { @@ -768,7 +735,6 @@ std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& pa } } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent) { @@ -979,7 +945,6 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan return tooltip; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { @@ -994,7 +959,6 @@ int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) } } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { @@ -1019,14 +983,10 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 float scaled_separator_size = m_layout.separator_size * factor; float scaled_gap_size = m_layout.gap_size * factor; float scaled_border = m_layout.border * factor; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float separator_stride = scaled_separator_size + scaled_gap_size; float icon_stride = scaled_icons_size + scaled_gap_size; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float left = m_layout.left + scaled_border; float top = m_layout.top - scaled_border; @@ -1041,7 +1001,6 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 continue; if (item->is_separator()) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING { float right = left + scaled_separator_size; @@ -1064,11 +1023,8 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 left = right; } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ left += separator_stride; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else { float right = left + scaled_icons_size; @@ -1078,7 +1034,6 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) return id; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING left = right; right += scaled_gap_size; @@ -1092,11 +1047,8 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 left = right; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ left += icon_stride; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } } @@ -1126,14 +1078,10 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& float scaled_separator_size = m_layout.separator_size * factor; float scaled_gap_size = m_layout.gap_size * factor; float scaled_border = m_layout.border * factor; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float separator_stride = scaled_separator_size + scaled_gap_size; float icon_stride = scaled_icons_size + scaled_gap_size; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ float left = m_layout.left + scaled_border; float top = m_layout.top - scaled_border; @@ -1148,7 +1096,6 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& continue; if (item->is_separator()) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING { float right = left + scaled_icons_size; @@ -1171,11 +1118,8 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& top = bottom; } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ top -= separator_stride; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else { float right = left + scaled_icons_size; @@ -1185,7 +1129,6 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) return id; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING top = bottom; bottom -= scaled_gap_size; @@ -1199,11 +1142,8 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& top = bottom; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ top -= icon_stride; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } } @@ -1558,7 +1498,6 @@ bool GLToolbar::generate_icons_texture() const } #endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool GLToolbar::update_items_visibility() { @@ -1603,7 +1542,6 @@ bool GLToolbar::update_items_enabled_state() return ret; } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index e6ef051d6..cd5d3f83f 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -31,13 +31,11 @@ wxDECLARE_EVENT(EVT_GLVIEWTOOLBAR_PREVIEW, SimpleEvent); class GLToolbarItem { public: -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING typedef std::function ActionCallback; typedef std::function VisibilityCallback; typedef std::function EnabledStateCallback; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ enum EType : unsigned char { @@ -65,32 +63,24 @@ public: std::string tooltip; unsigned int sprite_id; bool is_toggable; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wxEventType action_event; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool visible; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING ActionCallback action_callback; VisibilityCallback visibility_callback; EnabledStateCallback enabled_state_callback; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Data(); }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING static const ActionCallback Default_Action_Callback; static const VisibilityCallback Default_Visibility_Callback; static const EnabledStateCallback Default_Enabled_State_Callback; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ private: EType m_type; @@ -109,15 +99,11 @@ public: #endif // ENABLE_SVG_ICONS const std::string& get_tooltip() const { return m_data.tooltip; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING void do_action() { m_data.action_callback(); } #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void do_action(wxEvtHandler *target); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool is_enabled() const { return m_state != Disabled; } bool is_disabled() const { return m_state == Disabled; } @@ -126,35 +112,27 @@ public: bool is_toggable() const { return m_data.is_toggable; } bool is_visible() const { return m_data.visible; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_visible(bool visible) { m_data.visible = visible; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool is_separator() const { return m_type == Separator; } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING // returns true if the state changes bool update_visibility(); // returns true if the state changes bool update_enabled_state(); #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; private: GLTexture::Quad_UVs get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING void set_visible(bool visible) { m_data.visible = visible; } friend class GLToolbar; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; #if !ENABLE_SVG_ICONS @@ -272,7 +250,6 @@ private: mutable Layout m_layout; ItemsList m_items; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING struct MouseCapture { @@ -286,7 +263,6 @@ private: MouseCapture m_mouse_capture; std::string m_tooltip; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ public: #if ENABLE_SVG_ICONS @@ -327,58 +303,42 @@ public: float get_width() const; float get_height() const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void enable_item(const std::string& name); void disable_item(const std::string& name); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void select_item(const std::string& name); bool is_item_pressed(const std::string& name) const; bool is_item_disabled(const std::string& name) const; bool is_item_visible(const std::string& name) const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING const std::string& get_tooltip() const { return m_tooltip; } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING // returns true if any item changed its state bool update_items_state(); #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void set_item_visible(const std::string& name, bool visible); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent); // returns the id of the item under the given mouse position or -1 if none int contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; void do_action(unsigned int item_id, GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void render(const GLCanvas3D& parent) const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool on_mouse(wxMouseEvent& evt, GLCanvas3D& parent); #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ private: void calc_layout() const; @@ -387,20 +347,16 @@ private: float get_height_horizontal() const; float get_height_vertical() const; float get_main_size() const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING void do_action(unsigned int item_id, GLCanvas3D& parent); std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent); #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ std::string update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent); std::string update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING // returns the id of the item under the given mouse position or -1 if none int contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; int contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; @@ -411,14 +367,12 @@ private: bool generate_icons_texture() const; #endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING // returns true if any item changed its state bool update_items_visibility(); // returns true if any item changed its state bool update_items_enabled_state(); #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }; } // namespace GUI diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index dba51d06f..546815288 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -110,9 +110,7 @@ void View3D::mirror_selection(Axis axis) m_canvas->mirror_selection(axis); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void View3D::update_toolbar_items_visibility() { if (m_canvas != nullptr) @@ -124,9 +122,7 @@ void View3D::enable_toolbar_item(const std::string& name, bool enable) if (m_canvas != nullptr) m_canvas->enable_toolbar_item(name, enable); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int View3D::check_volumes_outside_state() const { diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 2191cd263..6c413ca17 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -50,14 +50,10 @@ public: void delete_selected(); void mirror_selection(Axis axis); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void update_toolbar_items_visibility(); void enable_toolbar_item(const std::string& name, bool enable); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int check_volumes_outside_state() const; bool is_layers_editing_enabled() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 098a647d5..cbe6a8178 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1217,7 +1217,6 @@ struct Plater::priv // Sets m_bed.m_polygon to limit the object placement. void set_bed_shape(const Pointfs& shape); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool can_delete() const; bool can_delete_all() const; @@ -1228,7 +1227,6 @@ struct Plater::priv bool can_arrange() const; bool can_layers_editing() const; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ private: bool init_object_menu(); @@ -1238,34 +1236,22 @@ private: bool complit_init_part_menu(); void init_view_toolbar(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_delete_object() const; bool can_increase_instances() const; bool can_decrease_instances() const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_set_instance_to_object() const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_split_to_objects() const; bool can_split_to_volumes() const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_split() const; bool layers_height_allowed() const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_delete_all() const; bool can_arrange() const; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool can_mirror() const; void update_fff_scene(); @@ -1825,17 +1811,13 @@ int Plater::priv::get_selected_volume_idx() const void Plater::priv::selection_changed() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D->enable_toolbar_item("delete", can_delete_object()); view3D->enable_toolbar_item("more", can_increase_instances()); view3D->enable_toolbar_item("fewer", can_decrease_instances()); view3D->enable_toolbar_item("splitobjects", can_split()); view3D->enable_toolbar_item("splitvolumes", printer_technology == ptFFF && can_split()); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // if the selection is not valid to allow for layer editing, we need to turn off the tool if it is running bool enable_layer_editing = layers_height_allowed(); @@ -1844,13 +1826,9 @@ void Plater::priv::selection_changed() on_action_layersediting(evt); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D->enable_toolbar_item("layersediting", enable_layer_editing); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // forces a frame render to update the view (to avoid a missed update if, for example, the context menu appears) view3D->render(); @@ -1858,15 +1836,11 @@ void Plater::priv::selection_changed() void Plater::priv::object_list_changed() { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Enable/disable buttons depending on whether there are any objects on the platter. view3D->enable_toolbar_item("deleteall", can_delete_all()); view3D->enable_toolbar_item("arrange", can_arrange()); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ const bool export_in_progress = this->background_process.is_export_scheduled(); // || ! send_gcode_file.empty()); // XXX: is this right? @@ -1946,14 +1920,10 @@ void Plater::priv::arrange() wxBusyCursor wait; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Disable the arrange button (to prevent reentrancies, we will call wxYied) view3D->enable_toolbar_item("arrange", can_arrange()); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ this->background_process.stop(); unsigned count = 0; @@ -2025,14 +1995,10 @@ void Plater::priv::arrange() statusbar()->set_cancel_callback(); // remove cancel button arranging.store(false); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // We enable back the arrange button view3D->enable_toolbar_item("arrange", can_arrange()); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // Do a full refresh of scene tree, including regenerating all the GLVolumes. //FIXME The update function shall just reload the modified matrices. @@ -2594,16 +2560,12 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) void Plater::priv::on_layer_editing_toggled(bool enable) { view3D->enable_layers_editing(enable); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (enable && !view3D->is_layers_editing_enabled()) { // Initialization of the OpenGL shaders failed. Disable the tool. view3D->enable_toolbar_item("layersediting", false); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view3D->set_as_dirty(); } @@ -2625,18 +2587,14 @@ void Plater::priv::on_action_split_volumes(SimpleEvent&) void Plater::priv::on_action_layersediting(SimpleEvent&) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING view3D->enable_layers_editing(!view3D->is_layers_editing_enabled()); #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool enable = !view3D->is_layers_editing_enabled(); view3D->enable_layers_editing(enable); if (enable && !view3D->is_layers_editing_enabled()) view3D->enable_toolbar_item("layersediting", false); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } void Plater::priv::on_object_select(SimpleEvent& evt) @@ -2761,15 +2719,11 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ if (q != nullptr) { q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_mirror()); }, item_mirror->GetId()); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete()); }, item_delete->GetId()); #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete_object()); }, item_delete->GetId()); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } return true; @@ -2874,15 +2828,11 @@ void Plater::priv::init_view_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("3D editor view") + " [" + GUI::shortkey_ctrl_prefix() + "5]"; item.sprite_id = 0; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (this->q != nullptr) wxPostEvent(this->q, SimpleEvent(EVT_GLVIEWTOOLBAR_3D)); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLVIEWTOOLBAR_3D; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.is_toggable = false; if (!view_toolbar.add_item(item)) return; @@ -2893,35 +2843,25 @@ void Plater::priv::init_view_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Preview") + " [" + GUI::shortkey_ctrl_prefix() + "6]"; item.sprite_id = 1; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (this->q != nullptr) wxPostEvent(this->q, SimpleEvent(EVT_GLVIEWTOOLBAR_PREVIEW)); }; #else -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.action_event = EVT_GLVIEWTOOLBAR_PREVIEW; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ item.is_toggable = false; if (!view_toolbar.add_item(item)) return; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view_toolbar.enable_item("3D"); view_toolbar.enable_item("Preview"); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ view_toolbar.select_item("3D"); view_toolbar.set_enabled(true); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_delete_object() const { int obj_idx = get_selected_object_idx(); @@ -2933,9 +2873,7 @@ bool Plater::priv::can_increase_instances() const int obj_idx = get_selected_object_idx(); return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_set_instance_to_object() const { @@ -2943,9 +2881,7 @@ bool Plater::priv::can_set_instance_to_object() const return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && (model.objects[obj_idx]->instances.size() > 1); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_decrease_instances() const { int obj_idx = get_selected_object_idx(); @@ -2966,9 +2902,7 @@ bool Plater::priv::can_split_to_volumes() const // return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && !model.objects[obj_idx]->is_multiparts(); return sidebar->obj_list()->is_splittable(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_split() const { @@ -2981,9 +2915,7 @@ bool Plater::priv::layers_height_allowed() const return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && config->opt_bool("variable_layer_height") && view3D->is_layers_editing_allowed(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_delete_all() const { return !model.objects.empty(); @@ -2993,9 +2925,7 @@ bool Plater::priv::can_arrange() const { return !model.objects.empty() && !arranging.load(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool Plater::priv::can_mirror() const { @@ -3012,7 +2942,6 @@ void Plater::priv::set_bed_shape(const Pointfs& shape) } } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool Plater::priv::can_delete() const { @@ -3056,19 +2985,14 @@ bool Plater::priv::can_layers_editing() const return layers_height_allowed(); } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void Plater::priv::update_object_menu() { sidebar->obj_list()->append_menu_items_add_volume(&object_menu); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (view3D != nullptr) view3D->update_toolbar_items_visibility(); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const @@ -3551,25 +3475,17 @@ void Plater::on_config_change(const DynamicPrintConfig &config) } else if(opt_key == "variable_layer_height") { if (p->config->opt_bool("variable_layer_height") != true) { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ p->view3D->enable_toolbar_item("layersediting", false); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ p->view3D->enable_layers_editing(false); p->view3D->set_as_dirty(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (p->view3D->is_layers_editing_allowed()) { p->view3D->enable_toolbar_item("layersediting", true); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #endif // !ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } else if(opt_key == "extruder_colour") { update_scheduled = true; @@ -3691,7 +3607,6 @@ void Plater::fix_through_netfabb(const int obj_idx, const int vol_idx/* = -1*/) void Plater::update_object_menu() { p->update_object_menu(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool Plater::can_delete() const { return p->can_delete(); } bool Plater::can_delete_all() const { return p->can_delete_all(); } @@ -3702,6 +3617,5 @@ bool Plater::can_split_to_volumes() const { return p->can_split_to_volumes(); } bool Plater::can_arrange() const { return p->can_arrange(); } bool Plater::can_layers_editing() const { return p->can_layers_editing(); } #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index eede860ca..8746c1eef 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -176,7 +176,6 @@ public: PrinterTechnology printer_technology() const; void set_printer_technology(PrinterTechnology printer_technology); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #if ENABLE_CANVAS_GUI_REFACTORING bool can_delete() const; bool can_delete_all() const; @@ -187,7 +186,6 @@ public: bool can_arrange() const; bool can_layers_editing() const; #endif // ENABLE_CANVAS_GUI_REFACTORING -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ private: struct priv; From bdaadcccd9b67ed8d8fb56c4c011c70108933705 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 19 Mar 2019 09:51:50 +0100 Subject: [PATCH 181/236] Implemented SPE-874 (Delete items from context menu for Simple mode) --- src/libslic3r/PrintConfig.cpp | 2 +- src/slic3r/GUI/GUI_ObjectList.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 46 ++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a9fc1c63f..8c67cc067 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -208,7 +208,7 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Horizontal width of the brim that will be printed around each object on the first layer."); def->sidetext = L("mm"); def->min = 0; - def->mode = comAdvanced; + def->mode = comSimple; def->default_value = new ConfigOptionFloat(0); def = this->add("clip_multipart_objects", coBool); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index abfc067ff..183820aed 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -871,7 +871,7 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu) const ConfigOptionMode mode = wxGetApp().get_mode(); - if (mode < comExpert) + if (mode == comAdvanced) { append_menu_item(menu, wxID_ANY, _(L("Add part")), "", [this](wxCommandEvent&) { load_subobject(ModelVolumeType::MODEL_PART); }, *m_bmp_vector[int(ModelVolumeType::MODEL_PART)]); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 56dc323b3..4c1d40048 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1089,6 +1089,15 @@ struct Plater::priv // SLA-Object popup menu PrusaMenu sla_object_menu; + // Removed/Prepended Items according to the view mode + std::vector items_increase; + std::vector items_decrease; + std::vector items_set_number_of_copies; + enum MenuIdentifier { + miObjectFFF=0, + miObjectSLA + }; + // Data Slic3r::DynamicPrintConfig *config; // FIXME: leak? Slic3r::Print fff_print; @@ -2582,6 +2591,32 @@ void Plater::priv::on_right_click(Vec2dEvent& evt) sidebar->obj_list()->append_menu_item_settings(menu); + /* Remove/Prepend "increase/decrease instances" menu items according to the view mode. + * Suppress to show those items for a Simple mode + */ + const MenuIdentifier id = printer_technology == ptSLA ? miObjectSLA : miObjectFFF; + if (wxGetApp().get_mode() == comSimple) { + if (menu->FindItem(_(L("Increase copies"))) != wxNOT_FOUND) + { + /* Detach an items from the menu, but don't delete them + * so that they can be added back later + * (after switching to the Advanced/Expert mode) + */ + menu->Remove(items_increase[id]); + menu->Remove(items_decrease[id]); + menu->Remove(items_set_number_of_copies[id]); + } + } + else { + if (menu->FindItem(_(L("Increase copies"))) == wxNOT_FOUND) + { + // Prepend items to the menu, if those aren't not there + menu->Prepend(items_set_number_of_copies[id]); + menu->Prepend(items_decrease[id]); + menu->Prepend(items_increase[id]); + } + } + if (q != nullptr) { #ifdef __linux__ // For some reason on Linux the menu isn't displayed if position is specified @@ -2618,6 +2653,10 @@ void Plater::priv::on_3dcanvas_mouse_dragging_finished(SimpleEvent&) bool Plater::priv::init_object_menu() { + items_increase.reserve(2); + items_decrease.reserve(2); + items_set_number_of_copies.reserve(2); + init_common_menu(&object_menu); complit_init_object_menu(); @@ -2643,6 +2682,11 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ [this](wxCommandEvent&) { q->decrease_instances(); }, "delete.png"); wxMenuItem* item_set_number_of_copies = append_menu_item(menu, wxID_ANY, _(L("Set number of copies")) + dots, _(L("Change the number of copies of the selected object")), [this](wxCommandEvent&) { q->set_number_of_copies(); }, "textfield.png"); + + items_increase.push_back(item_increase); + items_decrease.push_back(item_decrease); + items_set_number_of_copies.push_back(item_set_number_of_copies); + // Delete menu was moved to be after +/- instace to make it more difficult to be selected by mistake. item_delete = append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), [this](wxCommandEvent&) { q->remove_selected(); }, "brick_delete.png"); @@ -2713,7 +2757,7 @@ bool Plater::priv::complit_init_object_menu() { q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split()); }, item_split->GetId()); q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split()); }, item_split_objects->GetId()); - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split()); }, item_split_volumes->GetId()); + q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split() && wxGetApp().get_mode() > comSimple); }, item_split_volumes->GetId()); } return true; } From 334b5a82a630f5423cd971d2eecfa8a3be46ed21 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 10:04:19 +0100 Subject: [PATCH 182/236] Tech ENABLE_MOVE_MIN_THRESHOLD set as default --- src/libslic3r/Technologies.hpp | 2 -- src/slic3r/GUI/GLCanvas3D.cpp | 16 ---------------- src/slic3r/GUI/GLCanvas3D.hpp | 8 -------- 3 files changed, 26 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index bf869b99d..156a225bf 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -33,8 +33,6 @@ // Changed algorithm to extract euler angles from rotation matrix #define ENABLE_NEW_EULER_ANGLES (1 && ENABLE_1_42_0_ALPHA4) -// Added minimum threshold for click and drag movements -#define ENABLE_MOVE_MIN_THRESHOLD (1 && ENABLE_1_42_0_ALPHA4) // Modified initial default placement of generic subparts #define ENABLE_GENERIC_SUBPARTS_PLACEMENT (1 && ENABLE_1_42_0_ALPHA4) // Bunch of fixes related to volumes centering diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8dcb58cbb..2f7ed8c38 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -716,18 +716,14 @@ float GLCanvas3D::LayersEditing::reset_button_height(const GLCanvas3D &canvas) const Point GLCanvas3D::Mouse::Drag::Invalid_2D_Point(INT_MAX, INT_MAX); const Vec3d GLCanvas3D::Mouse::Drag::Invalid_3D_Point(DBL_MAX, DBL_MAX, DBL_MAX); -#if ENABLE_MOVE_MIN_THRESHOLD const int GLCanvas3D::Mouse::Drag::MoveThresholdPx = 5; -#endif // ENABLE_MOVE_MIN_THRESHOLD GLCanvas3D::Mouse::Drag::Drag() : start_position_2D(Invalid_2D_Point) , start_position_3D(Invalid_3D_Point) , move_volume_idx(-1) -#if ENABLE_MOVE_MIN_THRESHOLD , move_requires_threshold(false) , move_start_threshold_position_2D(Invalid_2D_Point) -#endif // ENABLE_MOVE_MIN_THRESHOLD { } @@ -5059,13 +5055,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) int view_toolbar_contains_mouse = m_view_toolbar.contains_mouse(m_mouse.position, *this); #endif // !ENABLE_CANVAS_GUI_REFACTORING -#if ENABLE_MOVE_MIN_THRESHOLD if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) { m_mouse.drag.move_requires_threshold = false; m_mouse.set_move_start_threshold_position_2D_as_invalid(); } -#endif // ENABLE_MOVE_MIN_THRESHOLD if (evt.ButtonDown() && wxWindow::FindFocus() != this->m_canvas) // Grab keyboard focus on any mouse click event. @@ -5206,13 +5200,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { bool add_as_single = !already_selected && !shift_down; m_selection.add(m_hover_volume_id, add_as_single); -#if ENABLE_MOVE_MIN_THRESHOLD m_mouse.drag.move_requires_threshold = !already_selected; if (already_selected) m_mouse.set_move_start_threshold_position_2D_as_invalid(); else m_mouse.drag.move_start_threshold_position_2D = pos; -#endif // ENABLE_MOVE_MIN_THRESHOLD } if (curr_idxs != m_selection.get_volume_idxs()) @@ -5249,10 +5241,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) else if (evt.Dragging() && evt.LeftIsDown() && !gizmos_overlay_contains_mouse && (m_layers_editing.state == LayersEditing::Unknown) && (m_mouse.drag.move_volume_idx != -1) && m_gizmos.get_current_type() != Gizmos::SlaSupports /* don't allow dragging objects with the Sla gizmo on */) { -#if ENABLE_MOVE_MIN_THRESHOLD if (!m_mouse.drag.move_requires_threshold) { -#endif // ENABLE_MOVE_MIN_THRESHOLD m_mouse.dragging = true; Vec3d cur_pos = m_mouse.drag.start_position_3D; @@ -5300,9 +5290,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) wxGetApp().obj_manipul()->update_settings_value(m_selection); m_dirty = true; -#if ENABLE_MOVE_MIN_THRESHOLD } -#endif // ENABLE_MOVE_MIN_THRESHOLD } else if (evt.Dragging() && m_gizmos.is_dragging()) { @@ -5371,11 +5359,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif // ENABLE_CANVAS_GUI_REFACTORING { // if dragging over blank area with left button, rotate -#if ENABLE_MOVE_MIN_THRESHOLD if ((m_hover_volume_id == -1) && m_mouse.is_start_position_3D_defined()) -#else - if (m_mouse.is_start_position_3D_defined()) -#endif // ENABLE_MOVE_MIN_THRESHOLD { const Vec3d& orig = m_mouse.drag.start_position_3D; m_camera.phi += (((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 229d70b4e..639d10120 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -297,17 +297,13 @@ class GLCanvas3D { static const Point Invalid_2D_Point; static const Vec3d Invalid_3D_Point; -#if ENABLE_MOVE_MIN_THRESHOLD static const int MoveThresholdPx; -#endif // ENABLE_MOVE_MIN_THRESHOLD Point start_position_2D; Vec3d start_position_3D; int move_volume_idx; -#if ENABLE_MOVE_MIN_THRESHOLD bool move_requires_threshold; Point move_start_threshold_position_2D; -#endif // ENABLE_MOVE_MIN_THRESHOLD public: Drag(); @@ -326,19 +322,15 @@ class GLCanvas3D void set_start_position_2D_as_invalid() { drag.start_position_2D = Drag::Invalid_2D_Point; } void set_start_position_3D_as_invalid() { drag.start_position_3D = Drag::Invalid_3D_Point; } -#if ENABLE_MOVE_MIN_THRESHOLD void set_move_start_threshold_position_2D_as_invalid() { drag.move_start_threshold_position_2D = Drag::Invalid_2D_Point; } -#endif // ENABLE_MOVE_MIN_THRESHOLD bool is_start_position_2D_defined() const { return (drag.start_position_2D != Drag::Invalid_2D_Point); } bool is_start_position_3D_defined() const { return (drag.start_position_3D != Drag::Invalid_3D_Point); } -#if ENABLE_MOVE_MIN_THRESHOLD bool is_move_start_threshold_position_2D_defined() const { return (drag.move_start_threshold_position_2D != Drag::Invalid_2D_Point); } bool is_move_threshold_met(const Point& mouse_pos) const { return (std::abs(mouse_pos(0) - drag.move_start_threshold_position_2D(0)) > Drag::MoveThresholdPx) || (std::abs(mouse_pos(1) - drag.move_start_threshold_position_2D(1)) > Drag::MoveThresholdPx); } -#endif // ENABLE_MOVE_MIN_THRESHOLD }; public: From 262f187699cdad6b51b4940072f9244cec962083 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 10:09:54 +0100 Subject: [PATCH 183/236] Fixed visual hints for position in case of single volume selection --- src/slic3r/GUI/GLCanvas3D.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index f38e257ac..481dcb712 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1698,8 +1698,11 @@ void GLCanvas3D::Selection::render_sidebar_hints(const std::string& sidebar_fiel } else if (is_single_volume() || is_single_modifier()) { - Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true) * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); ::glTranslated(center(0), center(1), center(2)); + Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); + if (!boost::starts_with(sidebar_field, "position")) + orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); + ::glMultMatrixd(orient_matrix.data()); } else From 6eafc97302c086c052ae26f5ead9c55fb5b5c74a Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 10:48:20 +0100 Subject: [PATCH 184/236] Alternate fix of #1976 --- src/slic3r/GUI/GUI_Preview.cpp | 21 +++++++++++++-------- src/slic3r/GUI/GUI_Preview.hpp | 8 ++++---- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 9860f26b1..9db490787 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -355,11 +355,11 @@ void Preview::set_drop_target(wxDropTarget* target) SetDropTarget(target); } -void Preview::load_print() +void Preview::load_print(bool keep_z_range) { PrinterTechnology tech = m_process->current_printer_technology(); if (tech == ptFFF) - load_print_as_fff(); + load_print_as_fff(keep_z_range); else if (tech == ptSLA) load_print_as_sla(); } @@ -390,7 +390,7 @@ void Preview::refresh_print() if (!IsShown()) return; - load_print(); + load_print(true); } void Preview::bind_event_handlers() @@ -447,10 +447,10 @@ void Preview::reset_sliders() m_double_slider_sizer->Hide((size_t)0); } -void Preview::update_sliders(const std::vector& layers_z) +void Preview::update_sliders(const std::vector& layers_z, bool keep_z_range) { m_enabled = true; - update_double_slider(layers_z); + update_double_slider(layers_z, keep_z_range); m_double_slider_sizer->Show((size_t)0); Layout(); } @@ -559,13 +559,18 @@ static int find_close_layer_idx(const std::vector& zs, double &z, double return -1; } -void Preview::update_double_slider(const std::vector& layers_z) +void Preview::update_double_slider(const std::vector& layers_z, bool keep_z_range) { // Save the initial slider span. double z_low = m_slider->GetLowerValueD(); double z_high = m_slider->GetHigherValueD(); bool was_empty = m_slider->GetMaxValue() == 0; bool force_sliders_full_range = was_empty; + if (!keep_z_range) + { + bool span_changed = layers_z.empty() || std::abs(layers_z.back() - m_slider->GetMaxValueD()) > 1e-6; + force_sliders_full_range |= span_changed; + } bool snap_to_min = force_sliders_full_range || m_slider->is_lower_at_min(); bool snap_to_max = force_sliders_full_range || m_slider->is_higher_at_max(); @@ -652,7 +657,7 @@ void Preview::update_double_slider_from_canvas(wxKeyEvent& event) event.Skip(); } -void Preview::load_print_as_fff() +void Preview::load_print_as_fff(bool keep_z_range) { if (m_loaded || m_process->current_printer_technology() != ptFFF) return; @@ -753,7 +758,7 @@ void Preview::load_print_as_fff() reset_sliders(); m_canvas_widget->Refresh(); } else - update_sliders(zs); + update_sliders(zs, keep_z_range); } } diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 59f62ded1..216583580 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -113,7 +113,7 @@ public: void select_view(const std::string& direction); void set_drop_target(wxDropTarget* target); - void load_print(); + void load_print(bool keep_z_range = false); void reload_print(bool keep_volumes = false); void refresh_print(); @@ -126,7 +126,7 @@ private: void show_hide_ui_elements(const std::string& what); void reset_sliders(); - void update_sliders(const std::vector& layers_z); + void update_sliders(const std::vector& layers_z, bool keep_z_range = false); void on_size(wxSizeEvent& evt); void on_choice_view_type(wxCommandEvent& evt); @@ -138,14 +138,14 @@ private: // Create/Update/Reset double slider on 3dPreview void create_double_slider(); - void update_double_slider(const std::vector& layers_z); + void update_double_slider(const std::vector& layers_z, bool keep_z_range = false); void fill_slider_values(std::vector> &values, const std::vector &layers_z); void reset_double_slider(); // update DoubleSlider after keyDown in canvas void update_double_slider_from_canvas(wxKeyEvent& event); - void load_print_as_fff(); + void load_print_as_fff(bool keep_z_range = false); void load_print_as_sla(); void on_sliders_scroll_changed(wxEvent& event); From 731e5a36b763a8d50569b2d5d364d0cd9fe26d6f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 10:54:54 +0100 Subject: [PATCH 185/236] Commit 4a8a1fac7b6ad690ed4f81eae9d31ae6e145a4c5 re-made as linux-only --- src/slic3r/GUI/GUI_Preview.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 9db490787..a2c2dbc39 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -366,12 +366,7 @@ void Preview::load_print(bool keep_z_range) void Preview::reload_print(bool keep_volumes) { - if (!IsShown()) - { - m_volumes_cleanup_required = !keep_volumes; - return; - } - +#ifndef __linux__ if (m_volumes_cleanup_required || !keep_volumes) { m_canvas->reset_volumes(); @@ -379,6 +374,23 @@ void Preview::reload_print(bool keep_volumes) m_loaded = false; m_volumes_cleanup_required = false; } +#endif // __linux__ + + if (!IsShown()) + { + m_volumes_cleanup_required = !keep_volumes; + return; + } + +#ifdef __linux__ + if (m_volumes_cleanup_required || !keep_volumes) + { + m_canvas->reset_volumes(); + m_canvas->reset_legend_texture(); + m_loaded = false; + m_volumes_cleanup_required = false; + } +#endif // __linux__ load_print(); } From 80c1a8d8e4fe3611f1bc2ca47fac136ffe6a1892 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 13:30:21 +0100 Subject: [PATCH 186/236] GLCanvas3D::Selection as a standalone class --- src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/GLCanvas3D.cpp | 1669 +---------------- src/slic3r/GUI/GLCanvas3D.hpp | 289 +-- src/slic3r/GUI/GUI_ObjectList.cpp | 15 +- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 16 +- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 25 +- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 16 +- src/slic3r/GUI/Gizmos/GLGizmoCut.hpp | 16 +- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp | 10 +- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 10 +- src/slic3r/GUI/Gizmos/GLGizmoMove.hpp | 10 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 18 +- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 24 +- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 12 +- src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 12 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 22 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 16 +- src/slic3r/GUI/Plater.cpp | 11 +- src/slic3r/GUI/Selection.cpp | 1670 ++++++++++++++++++ src/slic3r/GUI/Selection.hpp | 301 ++++ 23 files changed, 2111 insertions(+), 2069 deletions(-) create mode 100644 src/slic3r/GUI/Selection.cpp create mode 100644 src/slic3r/GUI/Selection.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 219f17082..ef60ab3fa 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -28,6 +28,8 @@ set(SLIC3R_GUI_SOURCES GUI/GLCanvas3D.cpp GUI/GLCanvas3DManager.hpp GUI/GLCanvas3DManager.cpp + GUI/Selection.hpp + GUI/Selection.cpp GUI/Gizmos/GLGizmoBase.cpp GUI/Gizmos/GLGizmoBase.hpp GUI/Gizmos/GLGizmoMove.cpp diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 68b343ba5..1236ee7b4 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1,9 +1,9 @@ +#include "libslic3r/libslic3r.h" #include "slic3r/GUI/Gizmos/GLGizmos.hpp" #include "GLCanvas3D.hpp" #include "admesh/stl.h" #include "polypartition.h" -#include "libslic3r/libslic3r.h" #include "libslic3r/ClipperUtils.hpp" #include "libslic3r/PrintConfig.hpp" #include "libslic3r/GCode/PreviewData.hpp" @@ -76,7 +76,6 @@ static const float DEFAULT_BG_DARK_COLOR[3] = { 0.478f, 0.478f, 0.478f }; static const float DEFAULT_BG_LIGHT_COLOR[3] = { 0.753f, 0.753f, 0.753f }; static const float ERROR_BG_DARK_COLOR[3] = { 0.478f, 0.192f, 0.039f }; static const float ERROR_BG_LIGHT_COLOR[3] = { 0.753f, 0.192f, 0.039f }; -static const float UNIFORM_SCALE_COLOR[3] = { 1.0f, 0.38f, 0.0f }; //static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } }; namespace Slic3r { @@ -738,1654 +737,6 @@ GLCanvas3D::Mouse::Mouse() { } -GLCanvas3D::Selection::VolumeCache::TransformCache::TransformCache() - : position(Vec3d::Zero()) - , rotation(Vec3d::Zero()) - , scaling_factor(Vec3d::Ones()) - , mirror(Vec3d::Ones()) - , rotation_matrix(Transform3d::Identity()) - , scale_matrix(Transform3d::Identity()) - , mirror_matrix(Transform3d::Identity()) - , full_matrix(Transform3d::Identity()) -{ -} - -GLCanvas3D::Selection::VolumeCache::TransformCache::TransformCache(const Geometry::Transformation& transform) - : position(transform.get_offset()) - , rotation(transform.get_rotation()) - , scaling_factor(transform.get_scaling_factor()) - , mirror(transform.get_mirror()) - , full_matrix(transform.get_matrix()) -{ - rotation_matrix = Geometry::assemble_transform(Vec3d::Zero(), rotation); - scale_matrix = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scaling_factor); - mirror_matrix = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), Vec3d::Ones(), mirror); -} - -GLCanvas3D::Selection::VolumeCache::VolumeCache(const Geometry::Transformation& volume_transform, const Geometry::Transformation& instance_transform) - : m_volume(volume_transform) - , m_instance(instance_transform) -{ -} - -GLCanvas3D::Selection::Selection() - : m_volumes(nullptr) - , m_model(nullptr) - , m_mode(Instance) - , m_type(Empty) - , m_valid(false) - , m_bounding_box_dirty(true) - , m_curved_arrow(16) - , m_scale_factor(1.0f) -{ -#if ENABLE_RENDER_SELECTION_CENTER - m_quadric = ::gluNewQuadric(); - if (m_quadric != nullptr) - ::gluQuadricDrawStyle(m_quadric, GLU_FILL); -#endif // ENABLE_RENDER_SELECTION_CENTER -} - -#if ENABLE_RENDER_SELECTION_CENTER -GLCanvas3D::Selection::~Selection() -{ - if (m_quadric != nullptr) - ::gluDeleteQuadric(m_quadric); -} -#endif // ENABLE_RENDER_SELECTION_CENTER - -void GLCanvas3D::Selection::set_volumes(GLVolumePtrs* volumes) -{ - m_volumes = volumes; - _update_valid(); -} - -bool GLCanvas3D::Selection::init(bool useVBOs) -{ - if (!m_arrow.init(useVBOs)) - return false; - - m_arrow.set_scale(5.0 * Vec3d::Ones()); - - if (!m_curved_arrow.init(useVBOs)) - return false; - - m_curved_arrow.set_scale(5.0 * Vec3d::Ones()); - return true; -} - -void GLCanvas3D::Selection::set_model(Model* model) -{ - m_model = model; - _update_valid(); -} - -void GLCanvas3D::Selection::add(unsigned int volume_idx, bool as_single_selection) -{ - if (!m_valid || ((unsigned int)m_volumes->size() <= volume_idx)) - return; - - const GLVolume* volume = (*m_volumes)[volume_idx]; - // wipe tower is already selected - if (is_wipe_tower() && volume->is_wipe_tower) - return; - - // resets the current list if needed - bool needs_reset = as_single_selection; - needs_reset |= volume->is_wipe_tower; - needs_reset |= is_wipe_tower() && !volume->is_wipe_tower; - needs_reset |= !is_modifier() && volume->is_modifier; - needs_reset |= is_modifier() && !volume->is_modifier; - - if (needs_reset) - clear(); - - if (volume->is_modifier) - m_mode = Volume; - else if (!contains_volume(volume_idx)) - m_mode = Instance; - // else -> keep current mode - - switch (m_mode) - { - case Volume: - { - if (volume->volume_idx() >= 0 && (is_empty() || (volume->instance_idx() == get_instance_idx()))) - _add_volume(volume_idx); - - break; - } - case Instance: - { - _add_instance(volume->object_idx(), volume->instance_idx()); - break; - } - } - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::remove(unsigned int volume_idx) -{ - if (!m_valid || ((unsigned int)m_volumes->size() <= volume_idx)) - return; - - GLVolume* volume = (*m_volumes)[volume_idx]; - - switch (m_mode) - { - case Volume: - { - _remove_volume(volume_idx); - break; - } - case Instance: - { - _remove_instance(volume->object_idx(), volume->instance_idx()); - break; - } - } - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::add_object(unsigned int object_idx, bool as_single_selection) -{ - if (!m_valid) - return; - - // resets the current list if needed - if (as_single_selection) - clear(); - - m_mode = Instance; - - _add_object(object_idx); - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::remove_object(unsigned int object_idx) -{ - if (!m_valid) - return; - - _remove_object(object_idx); - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::add_instance(unsigned int object_idx, unsigned int instance_idx, bool as_single_selection) -{ - if (!m_valid) - return; - - // resets the current list if needed - if (as_single_selection) - clear(); - - m_mode = Instance; - - _add_instance(object_idx, instance_idx); - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::remove_instance(unsigned int object_idx, unsigned int instance_idx) -{ - if (!m_valid) - return; - - _remove_instance(object_idx, instance_idx); - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::add_volume(unsigned int object_idx, unsigned int volume_idx, int instance_idx, bool as_single_selection) -{ - if (!m_valid) - return; - - // resets the current list if needed - if (as_single_selection) - clear(); - - m_mode = Volume; - - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { - GLVolume* v = (*m_volumes)[i]; - if ((v->object_idx() == object_idx) && (v->volume_idx() == volume_idx)) - { - if ((instance_idx != -1) && (v->instance_idx() == instance_idx)) - _add_volume(i); - } - } - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::remove_volume(unsigned int object_idx, unsigned int volume_idx) -{ - if (!m_valid) - return; - - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { - GLVolume* v = (*m_volumes)[i]; - if ((v->object_idx() == object_idx) && (v->volume_idx() == volume_idx)) - _remove_volume(i); - } - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::add_all() -{ - if (!m_valid) - return; - - m_mode = Instance; - clear(); - - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { - if (!(*m_volumes)[i]->is_wipe_tower) - _add_volume(i); - } - - _update_type(); - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::clear() -{ - if (!m_valid) - return; - - for (unsigned int i : m_list) - { - (*m_volumes)[i]->selected = false; - } - - m_list.clear(); - - _update_type(); - m_bounding_box_dirty = true; - - // resets the cache in the sidebar - wxGetApp().obj_manipul()->reset_cache(); -} - -// Update the selection based on the map from old indices to new indices after m_volumes changed. -// If the current selection is by instance, this call may select newly added volumes, if they belong to already selected instances. -void GLCanvas3D::Selection::volumes_changed(const std::vector &map_volume_old_to_new) -{ - assert(m_valid); - - // 1) Update the selection set. - IndicesList list_new; - std::vector> model_instances; - for (unsigned int idx : m_list) { - if (map_volume_old_to_new[idx] != size_t(-1)) { - unsigned int new_idx = (unsigned int)map_volume_old_to_new[idx]; - list_new.insert(new_idx); - if (m_mode == Instance) { - // Save the object_idx / instance_idx pair of selected old volumes, - // so we may add the newly added volumes of the same object_idx / instance_idx pair - // to the selection. - const GLVolume *volume = (*m_volumes)[new_idx]; - model_instances.emplace_back(volume->object_idx(), volume->instance_idx()); - } - } - } - m_list = std::move(list_new); - - if (! model_instances.empty()) { - // Instance selection mode. Add the newly added volumes of the same object_idx / instance_idx pair - // to the selection. - assert(m_mode == Instance); - sort_remove_duplicates(model_instances); - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++ i) { - const GLVolume* volume = (*m_volumes)[i]; - for (const std::pair &model_instance : model_instances) - if (volume->object_idx() == model_instance.first && volume->instance_idx() == model_instance.second) - this->_add_volume(i); - } - } - - _update_type(); - m_bounding_box_dirty = true; -} - -bool GLCanvas3D::Selection::is_single_full_instance() const -{ - if (m_type == SingleFullInstance) - return true; - - if (m_type == SingleFullObject) - return get_instance_idx() != -1; - - if (m_list.empty() || m_volumes->empty()) - return false; - - int object_idx = m_valid ? get_object_idx() : -1; - if ((object_idx < 0) || ((int)m_model->objects.size() <= object_idx)) - return false; - - int instance_idx = (*m_volumes)[*m_list.begin()]->instance_idx(); - - std::set volumes_idxs; - for (unsigned int i : m_list) - { - const GLVolume* v = (*m_volumes)[i]; - if ((object_idx != v->object_idx()) || (instance_idx != v->instance_idx())) - return false; - - int volume_idx = v->volume_idx(); - if (volume_idx >= 0) - volumes_idxs.insert(volume_idx); - } - - return m_model->objects[object_idx]->volumes.size() == volumes_idxs.size(); -} - -bool GLCanvas3D::Selection::is_from_single_object() const -{ - int idx = get_object_idx(); - return (0 <= idx) && (idx < 1000); -} - -bool GLCanvas3D::Selection::requires_uniform_scale() const -{ - if (is_single_full_instance() || is_single_modifier() || is_single_volume()) - return false; - - return true; -} - -int GLCanvas3D::Selection::get_object_idx() const -{ - return (m_cache.content.size() == 1) ? m_cache.content.begin()->first : -1; -} - -int GLCanvas3D::Selection::get_instance_idx() const -{ - if (m_cache.content.size() == 1) - { - const InstanceIdxsList& idxs = m_cache.content.begin()->second; - if (idxs.size() == 1) - return *idxs.begin(); - } - - return -1; -} - -const GLCanvas3D::Selection::InstanceIdxsList& GLCanvas3D::Selection::get_instance_idxs() const -{ - assert(m_cache.content.size() == 1); - return m_cache.content.begin()->second; -} - -const GLVolume* GLCanvas3D::Selection::get_volume(unsigned int volume_idx) const -{ - return (m_valid && (volume_idx < (unsigned int)m_volumes->size())) ? (*m_volumes)[volume_idx] : nullptr; -} - -const BoundingBoxf3& GLCanvas3D::Selection::get_bounding_box() const -{ - if (m_bounding_box_dirty) - _calc_bounding_box(); - - return m_bounding_box; -} - -void GLCanvas3D::Selection::start_dragging() -{ - if (!m_valid) - return; - - _set_caches(); -} - -void GLCanvas3D::Selection::translate(const Vec3d& displacement, bool local) -{ - if (!m_valid) - return; - - for (unsigned int i : m_list) - { - if ((m_mode == Volume) || (*m_volumes)[i]->is_wipe_tower) - { - if (local) - (*m_volumes)[i]->set_volume_offset(m_cache.volumes_data[i].get_volume_position() + displacement); - else - { - Vec3d local_displacement = (m_cache.volumes_data[i].get_instance_rotation_matrix() * m_cache.volumes_data[i].get_instance_scale_matrix() * m_cache.volumes_data[i].get_instance_mirror_matrix()).inverse() * displacement; - (*m_volumes)[i]->set_volume_offset(m_cache.volumes_data[i].get_volume_position() + local_displacement); - } - } - else if (m_mode == Instance) - (*m_volumes)[i]->set_instance_offset(m_cache.volumes_data[i].get_instance_position() + displacement); - } - -#if !DISABLE_INSTANCES_SYNCH - if (m_mode == Instance) - _synchronize_unselected_instances(SYNC_ROTATION_NONE); - else if (m_mode == Volume) - _synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - - m_bounding_box_dirty = true; -} - -static Eigen::Quaterniond rotation_xyz_diff(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) -{ - return - // From the current coordinate system to world. - Eigen::AngleAxisd(rot_xyz_to(2), Vec3d::UnitZ()) * Eigen::AngleAxisd(rot_xyz_to(1), Vec3d::UnitY()) * Eigen::AngleAxisd(rot_xyz_to(0), Vec3d::UnitX()) * - // From world to the initial coordinate system. - Eigen::AngleAxisd(-rot_xyz_from(0), Vec3d::UnitX()) * Eigen::AngleAxisd(-rot_xyz_from(1), Vec3d::UnitY()) * Eigen::AngleAxisd(-rot_xyz_from(2), Vec3d::UnitZ()); -} - -// This should only be called if it is known, that the two rotations only differ in rotation around the Z axis. -static double rotation_diff_z(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) -{ - Eigen::AngleAxisd angle_axis(rotation_xyz_diff(rot_xyz_from, rot_xyz_to)); - Vec3d axis = angle_axis.axis(); - double angle = angle_axis.angle(); -#ifndef NDEBUG - if (std::abs(angle) > 1e-8) { - assert(std::abs(axis.x()) < 1e-8); - assert(std::abs(axis.y()) < 1e-8); - } -#endif /* NDEBUG */ - return (axis.z() < 0) ? -angle : angle; -} - -// Rotate an object around one of the axes. Only one rotation component is expected to be changing. -void GLCanvas3D::Selection::rotate(const Vec3d& rotation, GLCanvas3D::TransformationType transformation_type) -{ - if (!m_valid) - return; - - // Only relative rotation values are allowed in the world coordinate system. - assert(! transformation_type.world() || transformation_type.relative()); - - int rot_axis_max = 0; - if (rotation.isApprox(Vec3d::Zero())) - { - for (unsigned int i : m_list) - { - GLVolume &volume = *(*m_volumes)[i]; - if (m_mode == Instance) - { - volume.set_instance_rotation(m_cache.volumes_data[i].get_instance_rotation()); - volume.set_instance_offset(m_cache.volumes_data[i].get_instance_position()); - } - else if (m_mode == Volume) - { - volume.set_volume_rotation(m_cache.volumes_data[i].get_volume_rotation()); - volume.set_volume_offset(m_cache.volumes_data[i].get_volume_position()); - } - } - } - else - { - //FIXME this does not work for absolute rotations (transformation_type.absolute() is true) - rotation.cwiseAbs().maxCoeff(&rot_axis_max); - - // For generic rotation, we want to rotate the first volume in selection, and then to synchronize the other volumes with it. - std::vector object_instance_first(m_model->objects.size(), -1); - auto rotate_instance = [this, &rotation, &object_instance_first, rot_axis_max, transformation_type](GLVolume &volume, int i) { - int first_volume_idx = object_instance_first[volume.object_idx()]; - if (rot_axis_max != 2 && first_volume_idx != -1) { - // Generic rotation, but no rotation around the Z axis. - // Always do a local rotation (do not consider the selection to be a rigid body). - assert(is_approx(rotation.z(), 0.0)); - const GLVolume &first_volume = *(*m_volumes)[first_volume_idx]; - const Vec3d &rotation = first_volume.get_instance_rotation(); - double z_diff = rotation_diff_z(m_cache.volumes_data[first_volume_idx].get_instance_rotation(), m_cache.volumes_data[i].get_instance_rotation()); - volume.set_instance_rotation(Vec3d(rotation(0), rotation(1), rotation(2) + z_diff)); - } else { - // extracts rotations from the composed transformation - Vec3d new_rotation = transformation_type.world() ? - Geometry::extract_euler_angles(Geometry::assemble_transform(Vec3d::Zero(), rotation) * m_cache.volumes_data[i].get_instance_rotation_matrix()) : - transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation(); - if (rot_axis_max == 2 && transformation_type.joint()) { - // Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis. - Vec3d offset = Geometry::assemble_transform(Vec3d::Zero(), Vec3d(0.0, 0.0, new_rotation(2) - m_cache.volumes_data[i].get_instance_rotation()(2))) * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); - volume.set_instance_offset(m_cache.dragging_center + offset); - } - volume.set_instance_rotation(new_rotation); - object_instance_first[volume.object_idx()] = i; - } - }; - - for (unsigned int i : m_list) - { - GLVolume &volume = *(*m_volumes)[i]; - if (is_single_full_instance()) - rotate_instance(volume, i); - else if (is_single_volume() || is_single_modifier()) - { - if (transformation_type.independent()) - volume.set_volume_rotation(volume.get_volume_rotation() + rotation); - else - { - Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); - Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); - volume.set_volume_rotation(new_rotation); - } - } - else - { - if (m_mode == Instance) - rotate_instance(volume, i); - else if (m_mode == Volume) - { - // extracts rotations from the composed transformation - Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); - Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); - if (transformation_type.joint()) - { - Vec3d local_pivot = m_cache.volumes_data[i].get_instance_full_matrix().inverse() * m_cache.dragging_center; - Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() - local_pivot); - volume.set_volume_offset(local_pivot + offset); - } - volume.set_volume_rotation(new_rotation); - } - } - } - } - -#if !DISABLE_INSTANCES_SYNCH - if (m_mode == Instance) - _synchronize_unselected_instances((rot_axis_max == 2) ? SYNC_ROTATION_NONE : SYNC_ROTATION_GENERAL); - else if (m_mode == Volume) - _synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::flattening_rotate(const Vec3d& normal) -{ - // We get the normal in untransformed coordinates. We must transform it using the instance matrix, find out - // how to rotate the instance so it faces downwards and do the rotation. All that for all selected instances. - // The function assumes that is_from_single_object() holds. - - if (!m_valid) - return; - - for (unsigned int i : m_list) - { - Transform3d wst = m_cache.volumes_data[i].get_instance_scale_matrix(); - Vec3d scaling_factor = Vec3d(1./wst(0,0), 1./wst(1,1), 1./wst(2,2)); - - Transform3d wmt = m_cache.volumes_data[i].get_instance_mirror_matrix(); - Vec3d mirror(wmt(0,0), wmt(1,1), wmt(2,2)); - - Vec3d rotation = Geometry::extract_euler_angles(m_cache.volumes_data[i].get_instance_rotation_matrix()); - Vec3d transformed_normal = Geometry::assemble_transform(Vec3d::Zero(), rotation, scaling_factor, mirror) * normal; - transformed_normal.normalize(); - - Vec3d axis = transformed_normal(2) > 0.999f ? Vec3d(1., 0., 0.) : Vec3d(transformed_normal.cross(Vec3d(0., 0., -1.))); - axis.normalize(); - - Transform3d extra_rotation = Transform3d::Identity(); - extra_rotation.rotate(Eigen::AngleAxisd(acos(-transformed_normal(2)), axis)); - - Vec3d new_rotation = Geometry::extract_euler_angles(extra_rotation * m_cache.volumes_data[i].get_instance_rotation_matrix() ); - (*m_volumes)[i]->set_instance_rotation(new_rotation); - } - -#if !DISABLE_INSTANCES_SYNCH - // we want to synchronize z-rotation as well, otherwise the flattening behaves funny - // when applied on one of several identical instances - if (m_mode == Instance) - _synchronize_unselected_instances(SYNC_ROTATION_FULL); -#endif // !DISABLE_INSTANCES_SYNCH - - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::scale(const Vec3d& scale, bool local) -{ - if (!m_valid) - return; - - for (unsigned int i : m_list) - { - if (is_single_full_instance()) - (*m_volumes)[i]->set_instance_scaling_factor(scale); - else if (is_single_volume() || is_single_modifier()) - (*m_volumes)[i]->set_volume_scaling_factor(scale); - else - { - Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scale); - if (m_mode == Instance) - { - Eigen::Matrix new_matrix = (m * m_cache.volumes_data[i].get_instance_scale_matrix()).matrix().block(0, 0, 3, 3); - // extracts scaling factors from the composed transformation - Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); - if (!local) - (*m_volumes)[i]->set_instance_offset(m_cache.dragging_center + m * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); - - (*m_volumes)[i]->set_instance_scaling_factor(new_scale); - } - else if (m_mode == Volume) - { - Eigen::Matrix new_matrix = (m * m_cache.volumes_data[i].get_volume_scale_matrix()).matrix().block(0, 0, 3, 3); - // extracts scaling factors from the composed transformation - Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); - if (!local) - { - Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() + m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); - (*m_volumes)[i]->set_volume_offset(m_cache.dragging_center - m_cache.volumes_data[i].get_instance_position() + offset); - } - (*m_volumes)[i]->set_volume_scaling_factor(new_scale); - } - } - } - -#if !DISABLE_INSTANCES_SYNCH - if (m_mode == Instance) - _synchronize_unselected_instances(SYNC_ROTATION_NONE); - else if (m_mode == Volume) - _synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - - _ensure_on_bed(); - - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::mirror(Axis axis) -{ - if (!m_valid) - return; - - bool single_full_instance = is_single_full_instance(); - - for (unsigned int i : m_list) - { - if (single_full_instance) - (*m_volumes)[i]->set_instance_mirror(axis, -(*m_volumes)[i]->get_instance_mirror(axis)); - else if (m_mode == Volume) - (*m_volumes)[i]->set_volume_mirror(axis, -(*m_volumes)[i]->get_volume_mirror(axis)); - } - -#if !DISABLE_INSTANCES_SYNCH - if (m_mode == Instance) - _synchronize_unselected_instances(SYNC_ROTATION_NONE); - else if (m_mode == Volume) - _synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::translate(unsigned int object_idx, const Vec3d& displacement) -{ - if (!m_valid) - return; - - for (unsigned int i : m_list) - { - GLVolume* v = (*m_volumes)[i]; - if (v->object_idx() == object_idx) - v->set_instance_offset(v->get_instance_offset() + displacement); - } - - std::set done; // prevent processing volumes twice - done.insert(m_list.begin(), m_list.end()); - - for (unsigned int i : m_list) - { - if (done.size() == m_volumes->size()) - break; - - int object_idx = (*m_volumes)[i]->object_idx(); - if (object_idx >= 1000) - continue; - - // Process unselected volumes of the object. - for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) - { - if (done.size() == m_volumes->size()) - break; - - if (done.find(j) != done.end()) - continue; - - GLVolume* v = (*m_volumes)[j]; - if (v->object_idx() != object_idx) - continue; - - v->set_instance_offset(v->get_instance_offset() + displacement); - done.insert(j); - } - } - - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::translate(unsigned int object_idx, unsigned int instance_idx, const Vec3d& displacement) -{ - if (!m_valid) - return; - - for (unsigned int i : m_list) - { - GLVolume* v = (*m_volumes)[i]; - if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) - v->set_instance_offset(v->get_instance_offset() + displacement); - } - - std::set done; // prevent processing volumes twice - done.insert(m_list.begin(), m_list.end()); - - for (unsigned int i : m_list) - { - if (done.size() == m_volumes->size()) - break; - - int object_idx = (*m_volumes)[i]->object_idx(); - if (object_idx >= 1000) - continue; - - // Process unselected volumes of the object. - for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) - { - if (done.size() == m_volumes->size()) - break; - - if (done.find(j) != done.end()) - continue; - - GLVolume* v = (*m_volumes)[j]; - if ((v->object_idx() != object_idx) || (v->instance_idx() != instance_idx)) - continue; - - v->set_instance_offset(v->get_instance_offset() + displacement); - done.insert(j); - } - } - - m_bounding_box_dirty = true; -} - -void GLCanvas3D::Selection::erase() -{ - if (!m_valid) - return; - - if (is_single_full_object()) - wxGetApp().obj_list()->delete_from_model_and_list(ItemType::itObject, get_object_idx(), 0); - else if (is_multiple_full_object()) - { - std::vector items; - items.reserve(m_cache.content.size()); - for (ObjectIdxsToInstanceIdxsMap::iterator it = m_cache.content.begin(); it != m_cache.content.end(); ++it) - { - items.emplace_back(ItemType::itObject, it->first, 0); - } - wxGetApp().obj_list()->delete_from_model_and_list(items); - } - else if (is_multiple_full_instance()) - { - std::set> instances_idxs; - for (ObjectIdxsToInstanceIdxsMap::iterator obj_it = m_cache.content.begin(); obj_it != m_cache.content.end(); ++obj_it) - { - for (InstanceIdxsList::reverse_iterator inst_it = obj_it->second.rbegin(); inst_it != obj_it->second.rend(); ++inst_it) - { - instances_idxs.insert(std::make_pair(obj_it->first, *inst_it)); - } - } - - std::vector items; - items.reserve(instances_idxs.size()); - for (const std::pair& i : instances_idxs) - { - items.emplace_back(ItemType::itInstance, i.first, i.second); - } - wxGetApp().obj_list()->delete_from_model_and_list(items); - } - else if (is_single_full_instance()) - wxGetApp().obj_list()->delete_from_model_and_list(ItemType::itInstance, get_object_idx(), get_instance_idx()); - else if (is_mixed()) - { - std::set items_set; - std::map volumes_in_obj; - - for (auto i : m_list) { - const auto gl_vol = (*m_volumes)[i]; - const auto glv_obj_idx = gl_vol->object_idx(); - const auto model_object = m_model->objects[glv_obj_idx]; - - if (model_object->instances.size() == 1) { - if (model_object->volumes.size() == 1) - items_set.insert(ItemForDelete(ItemType::itObject, glv_obj_idx, -1)); - else { - items_set.insert(ItemForDelete(ItemType::itVolume, glv_obj_idx, gl_vol->volume_idx())); - int idx = (volumes_in_obj.find(glv_obj_idx) == volumes_in_obj.end()) ? 0 : volumes_in_obj.at(glv_obj_idx); - volumes_in_obj[glv_obj_idx] = ++idx; - } - continue; - } - - const auto glv_ins_idx = gl_vol->instance_idx(); - - for (auto obj_ins : m_cache.content) { - if (obj_ins.first == glv_obj_idx) { - if (obj_ins.second.find(glv_ins_idx) != obj_ins.second.end()) { - if (obj_ins.second.size() == model_object->instances.size()) - items_set.insert(ItemForDelete(ItemType::itVolume, glv_obj_idx, gl_vol->volume_idx())); - else - items_set.insert(ItemForDelete(ItemType::itInstance, glv_obj_idx, glv_ins_idx)); - - break; - } - } - } - } - - std::vector items; - items.reserve(items_set.size()); - for (const ItemForDelete& i : items_set) { - if (i.type == ItemType::itVolume ) { - const int vol_in_obj_cnt = volumes_in_obj.find(i.obj_idx) == volumes_in_obj.end() ? 0 : volumes_in_obj.at(i.obj_idx); - if (vol_in_obj_cnt == m_model->objects[i.obj_idx]->volumes.size()) { - if (i.sub_obj_idx == vol_in_obj_cnt - 1) - items.emplace_back(ItemType::itObject, i.obj_idx, 0); - continue; - } - } - items.emplace_back(i.type, i.obj_idx, i.sub_obj_idx); - } - - wxGetApp().obj_list()->delete_from_model_and_list(items); - } - else - { - std::set> volumes_idxs; - for (unsigned int i : m_list) - { - const GLVolume* v = (*m_volumes)[i]; - // Only remove volumes associated with ModelVolumes from the object list. - // Temporary meshes (SLA supports or pads) are not managed by the object list. - if (v->volume_idx() >= 0) - volumes_idxs.insert(std::make_pair(v->object_idx(), v->volume_idx())); - } - - std::vector items; - items.reserve(volumes_idxs.size()); - for (const std::pair& v : volumes_idxs) - { - items.emplace_back(ItemType::itVolume, v.first, v.second); - } - - wxGetApp().obj_list()->delete_from_model_and_list(items); - } -} - -void GLCanvas3D::Selection::render(float scale_factor) const -{ - if (!m_valid || is_empty()) - return; - - m_scale_factor = scale_factor; - - // render cumulative bounding box of selected volumes - _render_selected_volumes(); - _render_synchronized_volumes(); -} - -#if ENABLE_RENDER_SELECTION_CENTER -void GLCanvas3D::Selection::render_center() const -{ - if (!m_valid || is_empty() || (m_quadric == nullptr)) - return; - - const Vec3d& center = get_bounding_box().center(); - - ::glDisable(GL_DEPTH_TEST); - - ::glEnable(GL_LIGHTING); - - ::glColor3f(1.0f, 1.0f, 1.0f); - ::glPushMatrix(); - ::glTranslated(center(0), center(1), center(2)); - ::gluSphere(m_quadric, 0.75, 32, 32); - ::glPopMatrix(); - - ::glDisable(GL_LIGHTING); -} -#endif // ENABLE_RENDER_SELECTION_CENTER - -void GLCanvas3D::Selection::render_sidebar_hints(const std::string& sidebar_field) const -{ - if (sidebar_field.empty()) - return; - - ::glClear(GL_DEPTH_BUFFER_BIT); - ::glEnable(GL_DEPTH_TEST); - - ::glEnable(GL_LIGHTING); - - ::glPushMatrix(); - - const Vec3d& center = get_bounding_box().center(); - - if (is_single_full_instance()) - { - ::glTranslated(center(0), center(1), center(2)); - if (!boost::starts_with(sidebar_field, "position")) - { - Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); - ::glMultMatrixd(orient_matrix.data()); - } - } - else if (is_single_volume() || is_single_modifier()) - { - ::glTranslated(center(0), center(1), center(2)); - Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); - if (!boost::starts_with(sidebar_field, "position")) - orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); - - ::glMultMatrixd(orient_matrix.data()); - } - else - { - ::glTranslated(center(0), center(1), center(2)); - if (requires_local_axes()) - { - Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); - ::glMultMatrixd(orient_matrix.data()); - } - } - - if (boost::starts_with(sidebar_field, "position")) - _render_sidebar_position_hints(sidebar_field); - else if (boost::starts_with(sidebar_field, "rotation")) - _render_sidebar_rotation_hints(sidebar_field); - else if (boost::starts_with(sidebar_field, "scale")) - _render_sidebar_scale_hints(sidebar_field); - else if (boost::starts_with(sidebar_field, "size")) - _render_sidebar_size_hints(sidebar_field); - - ::glPopMatrix(); - - ::glDisable(GL_LIGHTING); -} - -bool GLCanvas3D::Selection::requires_local_axes() const -{ - return (m_mode == Volume) && is_from_single_instance(); -} - -void GLCanvas3D::Selection::_update_valid() -{ - m_valid = (m_volumes != nullptr) && (m_model != nullptr); -} - -void GLCanvas3D::Selection::_update_type() -{ - m_cache.content.clear(); - m_type = Mixed; - - for (unsigned int i : m_list) - { - const GLVolume* volume = (*m_volumes)[i]; - int obj_idx = volume->object_idx(); - int inst_idx = volume->instance_idx(); - ObjectIdxsToInstanceIdxsMap::iterator obj_it = m_cache.content.find(obj_idx); - if (obj_it == m_cache.content.end()) - obj_it = m_cache.content.insert(ObjectIdxsToInstanceIdxsMap::value_type(obj_idx, InstanceIdxsList())).first; - - obj_it->second.insert(inst_idx); - } - - bool requires_disable = false; - - if (!m_valid) - m_type = Invalid; - else - { - if (m_list.empty()) - m_type = Empty; - else if (m_list.size() == 1) - { - const GLVolume* first = (*m_volumes)[*m_list.begin()]; - if (first->is_wipe_tower) - m_type = WipeTower; - else if (first->is_modifier) - { - m_type = SingleModifier; - requires_disable = true; - } - else - { - const ModelObject* model_object = m_model->objects[first->object_idx()]; - unsigned int volumes_count = (unsigned int)model_object->volumes.size(); - unsigned int instances_count = (unsigned int)model_object->instances.size(); - if (volumes_count * instances_count == 1) - { - m_type = SingleFullObject; - // ensures the correct mode is selected - m_mode = Instance; - } - else if (volumes_count == 1) // instances_count > 1 - { - m_type = SingleFullInstance; - // ensures the correct mode is selected - m_mode = Instance; - } - else - { - m_type = SingleVolume; - requires_disable = true; - } - } - } - else - { - if (m_cache.content.size() == 1) // single object - { - const ModelObject* model_object = m_model->objects[m_cache.content.begin()->first]; - unsigned int model_volumes_count = (unsigned int)model_object->volumes.size(); - unsigned int sla_volumes_count = 0; - for (unsigned int i : m_list) - { - if ((*m_volumes)[i]->volume_idx() < 0) - ++sla_volumes_count; - } - unsigned int volumes_count = model_volumes_count + sla_volumes_count; - unsigned int instances_count = (unsigned int)model_object->instances.size(); - unsigned int selected_instances_count = (unsigned int)m_cache.content.begin()->second.size(); - if (volumes_count * instances_count == (unsigned int)m_list.size()) - { - m_type = SingleFullObject; - // ensures the correct mode is selected - m_mode = Instance; - } - else if (selected_instances_count == 1) - { - if (volumes_count == (unsigned int)m_list.size()) - { - m_type = SingleFullInstance; - // ensures the correct mode is selected - m_mode = Instance; - } - else - { - unsigned int modifiers_count = 0; - for (unsigned int i : m_list) - { - if ((*m_volumes)[i]->is_modifier) - ++modifiers_count; - } - - if (modifiers_count == 0) - { - m_type = MultipleVolume; - requires_disable = true; - } - else if (modifiers_count == (unsigned int)m_list.size()) - { - m_type = MultipleModifier; - requires_disable = true; - } - } - } - else if ((selected_instances_count > 1) && (selected_instances_count * volumes_count == (unsigned int)m_list.size())) - { - m_type = MultipleFullInstance; - // ensures the correct mode is selected - m_mode = Instance; - } - } - else - { - int sels_cntr = 0; - for (ObjectIdxsToInstanceIdxsMap::iterator it = m_cache.content.begin(); it != m_cache.content.end(); ++it) - { - const ModelObject* model_object = m_model->objects[it->first]; - unsigned int volumes_count = (unsigned int)model_object->volumes.size(); - unsigned int instances_count = (unsigned int)model_object->instances.size(); - sels_cntr += volumes_count * instances_count; - } - if (sels_cntr == (unsigned int)m_list.size()) - { - m_type = MultipleFullObject; - // ensures the correct mode is selected - m_mode = Instance; - } - } - } - } - - int object_idx = get_object_idx(); - int instance_idx = get_instance_idx(); - for (GLVolume* v : *m_volumes) - { - v->disabled = requires_disable ? (v->object_idx() != object_idx) || (v->instance_idx() != instance_idx) : false; - } - -#if ENABLE_SELECTION_DEBUG_OUTPUT - std::cout << "Selection: "; - std::cout << "mode: "; - switch (m_mode) - { - case Volume: - { - std::cout << "Volume"; - break; - } - case Instance: - { - std::cout << "Instance"; - break; - } - } - - std::cout << " - type: "; - - switch (m_type) - { - case Invalid: - { - std::cout << "Invalid" << std::endl; - break; - } - case Empty: - { - std::cout << "Empty" << std::endl; - break; - } - case WipeTower: - { - std::cout << "WipeTower" << std::endl; - break; - } - case SingleModifier: - { - std::cout << "SingleModifier" << std::endl; - break; - } - case MultipleModifier: - { - std::cout << "MultipleModifier" << std::endl; - break; - } - case SingleVolume: - { - std::cout << "SingleVolume" << std::endl; - break; - } - case MultipleVolume: - { - std::cout << "MultipleVolume" << std::endl; - break; - } - case SingleFullObject: - { - std::cout << "SingleFullObject" << std::endl; - break; - } - case MultipleFullObject: - { - std::cout << "MultipleFullObject" << std::endl; - break; - } - case SingleFullInstance: - { - std::cout << "SingleFullInstance" << std::endl; - break; - } - case MultipleFullInstance: - { - std::cout << "MultipleFullInstance" << std::endl; - break; - } - case Mixed: - { - std::cout << "Mixed" << std::endl; - break; - } - } -#endif // ENABLE_SELECTION_DEBUG_OUTPUT -} - -void GLCanvas3D::Selection::_set_caches() -{ - m_cache.volumes_data.clear(); - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { - const GLVolume* v = (*m_volumes)[i]; - m_cache.volumes_data.emplace(i, VolumeCache(v->get_volume_transformation(), v->get_instance_transformation())); - } - m_cache.dragging_center = get_bounding_box().center(); -} - -void GLCanvas3D::Selection::_add_volume(unsigned int volume_idx) -{ - m_list.insert(volume_idx); - (*m_volumes)[volume_idx]->selected = true; -} - -void GLCanvas3D::Selection::_add_instance(unsigned int object_idx, unsigned int instance_idx) -{ - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { - GLVolume* v = (*m_volumes)[i]; - if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) - _add_volume(i); - } -} - -void GLCanvas3D::Selection::_add_object(unsigned int object_idx) -{ - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { - GLVolume* v = (*m_volumes)[i]; - if (v->object_idx() == object_idx) - _add_volume(i); - } -} - -void GLCanvas3D::Selection::_remove_volume(unsigned int volume_idx) -{ - IndicesList::iterator v_it = m_list.find(volume_idx); - if (v_it == m_list.end()) - return; - - m_list.erase(v_it); - - (*m_volumes)[volume_idx]->selected = false; -} - -void GLCanvas3D::Selection::_remove_instance(unsigned int object_idx, unsigned int instance_idx) -{ - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { - GLVolume* v = (*m_volumes)[i]; - if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) - _remove_volume(i); - } -} - -void GLCanvas3D::Selection::_remove_object(unsigned int object_idx) -{ - for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) - { - GLVolume* v = (*m_volumes)[i]; - if (v->object_idx() == object_idx) - _remove_volume(i); - } -} - -void GLCanvas3D::Selection::_calc_bounding_box() const -{ - m_bounding_box = BoundingBoxf3(); - if (m_valid) - { - for (unsigned int i : m_list) - { - m_bounding_box.merge((*m_volumes)[i]->transformed_convex_hull_bounding_box()); - } - } - m_bounding_box_dirty = false; -} - -void GLCanvas3D::Selection::_render_selected_volumes() const -{ - float color[3] = { 1.0f, 1.0f, 1.0f }; - _render_bounding_box(get_bounding_box(), color); -} - -void GLCanvas3D::Selection::_render_synchronized_volumes() const -{ - if (m_mode == Instance) - return; - - float color[3] = { 1.0f, 1.0f, 0.0f }; - - for (unsigned int i : m_list) - { - const GLVolume* volume = (*m_volumes)[i]; - int object_idx = volume->object_idx(); - int instance_idx = volume->instance_idx(); - int volume_idx = volume->volume_idx(); - for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) - { - if (i == j) - continue; - - const GLVolume* v = (*m_volumes)[j]; - if ((v->object_idx() != object_idx) || (v->volume_idx() != volume_idx)) - continue; - - _render_bounding_box(v->transformed_convex_hull_bounding_box(), color); - } - } -} - -void GLCanvas3D::Selection::_render_bounding_box(const BoundingBoxf3& box, float* color) const -{ - if (color == nullptr) - return; - - Vec3f b_min = box.min.cast(); - Vec3f b_max = box.max.cast(); - Vec3f size = 0.2f * box.size().cast(); - - ::glEnable(GL_DEPTH_TEST); - - ::glColor3fv(color); - ::glLineWidth(2.0f * m_scale_factor); - - ::glBegin(GL_LINES); - - ::glVertex3f(b_min(0), b_min(1), b_min(2)); ::glVertex3f(b_min(0) + size(0), b_min(1), b_min(2)); - ::glVertex3f(b_min(0), b_min(1), b_min(2)); ::glVertex3f(b_min(0), b_min(1) + size(1), b_min(2)); - ::glVertex3f(b_min(0), b_min(1), b_min(2)); ::glVertex3f(b_min(0), b_min(1), b_min(2) + size(2)); - - ::glVertex3f(b_max(0), b_min(1), b_min(2)); ::glVertex3f(b_max(0) - size(0), b_min(1), b_min(2)); - ::glVertex3f(b_max(0), b_min(1), b_min(2)); ::glVertex3f(b_max(0), b_min(1) + size(1), b_min(2)); - ::glVertex3f(b_max(0), b_min(1), b_min(2)); ::glVertex3f(b_max(0), b_min(1), b_min(2) + size(2)); - - ::glVertex3f(b_max(0), b_max(1), b_min(2)); ::glVertex3f(b_max(0) - size(0), b_max(1), b_min(2)); - ::glVertex3f(b_max(0), b_max(1), b_min(2)); ::glVertex3f(b_max(0), b_max(1) - size(1), b_min(2)); - ::glVertex3f(b_max(0), b_max(1), b_min(2)); ::glVertex3f(b_max(0), b_max(1), b_min(2) + size(2)); - - ::glVertex3f(b_min(0), b_max(1), b_min(2)); ::glVertex3f(b_min(0) + size(0), b_max(1), b_min(2)); - ::glVertex3f(b_min(0), b_max(1), b_min(2)); ::glVertex3f(b_min(0), b_max(1) - size(1), b_min(2)); - ::glVertex3f(b_min(0), b_max(1), b_min(2)); ::glVertex3f(b_min(0), b_max(1), b_min(2) + size(2)); - - ::glVertex3f(b_min(0), b_min(1), b_max(2)); ::glVertex3f(b_min(0) + size(0), b_min(1), b_max(2)); - ::glVertex3f(b_min(0), b_min(1), b_max(2)); ::glVertex3f(b_min(0), b_min(1) + size(1), b_max(2)); - ::glVertex3f(b_min(0), b_min(1), b_max(2)); ::glVertex3f(b_min(0), b_min(1), b_max(2) - size(2)); - - ::glVertex3f(b_max(0), b_min(1), b_max(2)); ::glVertex3f(b_max(0) - size(0), b_min(1), b_max(2)); - ::glVertex3f(b_max(0), b_min(1), b_max(2)); ::glVertex3f(b_max(0), b_min(1) + size(1), b_max(2)); - ::glVertex3f(b_max(0), b_min(1), b_max(2)); ::glVertex3f(b_max(0), b_min(1), b_max(2) - size(2)); - - ::glVertex3f(b_max(0), b_max(1), b_max(2)); ::glVertex3f(b_max(0) - size(0), b_max(1), b_max(2)); - ::glVertex3f(b_max(0), b_max(1), b_max(2)); ::glVertex3f(b_max(0), b_max(1) - size(1), b_max(2)); - ::glVertex3f(b_max(0), b_max(1), b_max(2)); ::glVertex3f(b_max(0), b_max(1), b_max(2) - size(2)); - - ::glVertex3f(b_min(0), b_max(1), b_max(2)); ::glVertex3f(b_min(0) + size(0), b_max(1), b_max(2)); - ::glVertex3f(b_min(0), b_max(1), b_max(2)); ::glVertex3f(b_min(0), b_max(1) - size(1), b_max(2)); - ::glVertex3f(b_min(0), b_max(1), b_max(2)); ::glVertex3f(b_min(0), b_max(1), b_max(2) - size(2)); - - ::glEnd(); -} - -void GLCanvas3D::Selection::_render_sidebar_position_hints(const std::string& sidebar_field) const -{ - if (boost::ends_with(sidebar_field, "x")) - { - ::glRotated(-90.0, 0.0, 0.0, 1.0); - _render_sidebar_position_hint(X); - } - else if (boost::ends_with(sidebar_field, "y")) - _render_sidebar_position_hint(Y); - else if (boost::ends_with(sidebar_field, "z")) - { - ::glRotated(90.0, 1.0, 0.0, 0.0); - _render_sidebar_position_hint(Z); - } -} - -void GLCanvas3D::Selection::_render_sidebar_rotation_hints(const std::string& sidebar_field) const -{ - if (boost::ends_with(sidebar_field, "x")) - { - ::glRotated(90.0, 0.0, 1.0, 0.0); - _render_sidebar_rotation_hint(X); - } - else if (boost::ends_with(sidebar_field, "y")) - { - ::glRotated(-90.0, 1.0, 0.0, 0.0); - _render_sidebar_rotation_hint(Y); - } - else if (boost::ends_with(sidebar_field, "z")) - _render_sidebar_rotation_hint(Z); -} - -void GLCanvas3D::Selection::_render_sidebar_scale_hints(const std::string& sidebar_field) const -{ - bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling(); - - if (boost::ends_with(sidebar_field, "x") || uniform_scale) - { - ::glPushMatrix(); - ::glRotated(-90.0, 0.0, 0.0, 1.0); - _render_sidebar_scale_hint(X); - ::glPopMatrix(); - } - - if (boost::ends_with(sidebar_field, "y") || uniform_scale) - { - ::glPushMatrix(); - _render_sidebar_scale_hint(Y); - ::glPopMatrix(); - } - - if (boost::ends_with(sidebar_field, "z") || uniform_scale) - { - ::glPushMatrix(); - ::glRotated(90.0, 1.0, 0.0, 0.0); - _render_sidebar_scale_hint(Z); - ::glPopMatrix(); - } -} - -void GLCanvas3D::Selection::_render_sidebar_size_hints(const std::string& sidebar_field) const -{ - _render_sidebar_scale_hints(sidebar_field); -} - -void GLCanvas3D::Selection::_render_sidebar_position_hint(Axis axis) const -{ - m_arrow.set_color(AXES_COLOR[axis], 3); - m_arrow.render(); -} - -void GLCanvas3D::Selection::_render_sidebar_rotation_hint(Axis axis) const -{ - m_curved_arrow.set_color(AXES_COLOR[axis], 3); - m_curved_arrow.render(); - - ::glRotated(180.0, 0.0, 0.0, 1.0); - m_curved_arrow.render(); -} - -void GLCanvas3D::Selection::_render_sidebar_scale_hint(Axis axis) const -{ - m_arrow.set_color(((requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling()) ? UNIFORM_SCALE_COLOR : AXES_COLOR[axis]), 3); - - ::glTranslated(0.0, 5.0, 0.0); - m_arrow.render(); - - ::glTranslated(0.0, -10.0, 0.0); - ::glRotated(180.0, 0.0, 0.0, 1.0); - m_arrow.render(); -} - -void GLCanvas3D::Selection::_render_sidebar_size_hint(Axis axis, double length) const -{ -} - -#ifndef NDEBUG -static bool is_rotation_xy_synchronized(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) -{ - Eigen::AngleAxisd angle_axis(rotation_xyz_diff(rot_xyz_from, rot_xyz_to)); - Vec3d axis = angle_axis.axis(); - double angle = angle_axis.angle(); - if (std::abs(angle) < 1e-8) - return true; - assert(std::abs(axis.x()) < 1e-8); - assert(std::abs(axis.y()) < 1e-8); - assert(std::abs(std::abs(axis.z()) - 1.) < 1e-8); - return std::abs(axis.x()) < 1e-8 && std::abs(axis.y()) < 1e-8 && std::abs(std::abs(axis.z()) - 1.) < 1e-8; -} -static void verify_instances_rotation_synchronized(const Model &model, const GLVolumePtrs &volumes) -{ - for (size_t idx_object = 0; idx_object < model.objects.size(); ++ idx_object) { - int idx_volume_first = -1; - for (int i = 0; i < (int)volumes.size(); ++ i) { - if (volumes[i]->object_idx() == idx_object) { - idx_volume_first = i; - break; - } - } - assert(idx_volume_first != -1); // object without instances? - if (idx_volume_first == -1) - continue; - const Vec3d &rotation0 = volumes[idx_volume_first]->get_instance_rotation(); - for (int i = idx_volume_first + 1; i < (int)volumes.size(); ++ i) - if (volumes[i]->object_idx() == idx_object) { - const Vec3d &rotation = volumes[i]->get_instance_rotation(); - assert(is_rotation_xy_synchronized(rotation, rotation0)); - } - } -} -#endif /* NDEBUG */ - -void GLCanvas3D::Selection::_synchronize_unselected_instances(SyncRotationType sync_rotation_type) -{ - std::set done; // prevent processing volumes twice - done.insert(m_list.begin(), m_list.end()); - - for (unsigned int i : m_list) - { - if (done.size() == m_volumes->size()) - break; - - const GLVolume* volume = (*m_volumes)[i]; - int object_idx = volume->object_idx(); - if (object_idx >= 1000) - continue; - - int instance_idx = volume->instance_idx(); - const Vec3d& rotation = volume->get_instance_rotation(); - const Vec3d& scaling_factor = volume->get_instance_scaling_factor(); - const Vec3d& mirror = volume->get_instance_mirror(); - - // Process unselected instances. - for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) - { - if (done.size() == m_volumes->size()) - break; - - if (done.find(j) != done.end()) - continue; - - GLVolume* v = (*m_volumes)[j]; - if ((v->object_idx() != object_idx) || (v->instance_idx() == instance_idx)) - continue; - - assert(is_rotation_xy_synchronized(m_cache.volumes_data[i].get_instance_rotation(), m_cache.volumes_data[j].get_instance_rotation())); - switch (sync_rotation_type) { - case SYNC_ROTATION_NONE: - // z only rotation -> keep instance z - // The X,Y rotations should be synchronized from start to end of the rotation. - assert(is_rotation_xy_synchronized(rotation, v->get_instance_rotation())); - break; - case SYNC_ROTATION_FULL: - // rotation comes from place on face -> force given z - v->set_instance_rotation(Vec3d(rotation(0), rotation(1), rotation(2))); - break; - case SYNC_ROTATION_GENERAL: - // generic rotation -> update instance z with the delta of the rotation. - double z_diff = rotation_diff_z(m_cache.volumes_data[i].get_instance_rotation(), m_cache.volumes_data[j].get_instance_rotation()); - v->set_instance_rotation(Vec3d(rotation(0), rotation(1), rotation(2) + z_diff)); - break; - } - - v->set_instance_scaling_factor(scaling_factor); - v->set_instance_mirror(mirror); - - done.insert(j); - } - } - -#ifndef NDEBUG - verify_instances_rotation_synchronized(*m_model, *m_volumes); -#endif /* NDEBUG */ -} - -void GLCanvas3D::Selection::_synchronize_unselected_volumes() -{ - for (unsigned int i : m_list) - { - const GLVolume* volume = (*m_volumes)[i]; - int object_idx = volume->object_idx(); - if (object_idx >= 1000) - continue; - - int volume_idx = volume->volume_idx(); - const Vec3d& offset = volume->get_volume_offset(); - const Vec3d& rotation = volume->get_volume_rotation(); - const Vec3d& scaling_factor = volume->get_volume_scaling_factor(); - const Vec3d& mirror = volume->get_volume_mirror(); - - // Process unselected volumes. - for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) - { - if (j == i) - continue; - - GLVolume* v = (*m_volumes)[j]; - if ((v->object_idx() != object_idx) || (v->volume_idx() != volume_idx)) - continue; - - v->set_volume_offset(offset); - v->set_volume_rotation(rotation); - v->set_volume_scaling_factor(scaling_factor); - v->set_volume_mirror(mirror); - } - } -} - -void GLCanvas3D::Selection::_ensure_on_bed() -{ - typedef std::map, double> InstancesToZMap; - InstancesToZMap instances_min_z; - - for (GLVolume* volume : *m_volumes) - { - if (!volume->is_wipe_tower && !volume->is_modifier) - { - double min_z = volume->transformed_convex_hull_bounding_box().min(2); - std::pair instance = std::make_pair(volume->object_idx(), volume->instance_idx()); - InstancesToZMap::iterator it = instances_min_z.find(instance); - if (it == instances_min_z.end()) - it = instances_min_z.insert(InstancesToZMap::value_type(instance, DBL_MAX)).first; - - it->second = std::min(it->second, min_z); - } - } - - for (GLVolume* volume : *m_volumes) - { - std::pair instance = std::make_pair(volume->object_idx(), volume->instance_idx()); - InstancesToZMap::iterator it = instances_min_z.find(instance); - if (it != instances_min_z.end()) - volume->set_instance_offset(Z, volume->get_instance_offset(Z) - it->second); - } -} - #if ENABLE_SVG_ICONS const float GLCanvas3D::Gizmos::Default_Icons_Size = 64; #endif // ENABLE_SVG_ICONS @@ -2574,7 +925,7 @@ void GLCanvas3D::Gizmos::set_overlay_scale(float scale) #endif // ENABLE_SVG_ICONS } -std::string GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const GLCanvas3D::Selection& selection) +std::string GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection) { std::string name = ""; @@ -2620,7 +971,7 @@ std::string GLCanvas3D::Gizmos::update_hover_state(const GLCanvas3D& canvas, con return name; } -void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const GLCanvas3D::Selection& selection) +void GLCanvas3D::Gizmos::update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection) { if (!m_enabled) return; @@ -2858,7 +1209,7 @@ bool GLCanvas3D::Gizmos::is_dragging() const return (curr != nullptr) ? curr->is_dragging() : false; } -void GLCanvas3D::Gizmos::start_dragging(const GLCanvas3D::Selection& selection) +void GLCanvas3D::Gizmos::start_dragging(const Selection& selection) { if (!m_enabled) return; @@ -2944,7 +1295,7 @@ void GLCanvas3D::Gizmos::set_flattening_data(const ModelObject* model_object) reinterpret_cast(it->second)->set_flattening_data(model_object); } -void GLCanvas3D::Gizmos::set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection) +void GLCanvas3D::Gizmos::set_sla_support_data(ModelObject* model_object, const Selection& selection) { if (!m_enabled) return; @@ -2968,7 +1319,7 @@ bool GLCanvas3D::Gizmos::mouse_event(SLAGizmoEventType action, const Vec2d& mous return false; } -void GLCanvas3D::Gizmos::render_current_gizmo(const GLCanvas3D::Selection& selection) const +void GLCanvas3D::Gizmos::render_current_gizmo(const Selection& selection) const { if (!m_enabled) return; @@ -2976,7 +1327,7 @@ void GLCanvas3D::Gizmos::render_current_gizmo(const GLCanvas3D::Selection& selec do_render_current_gizmo(selection); } -void GLCanvas3D::Gizmos::render_current_gizmo_for_picking_pass(const GLCanvas3D::Selection& selection) const +void GLCanvas3D::Gizmos::render_current_gizmo_for_picking_pass(const Selection& selection) const { if (!m_enabled) return; @@ -2986,7 +1337,7 @@ void GLCanvas3D::Gizmos::render_current_gizmo_for_picking_pass(const GLCanvas3D: curr->render_for_picking(selection); } -void GLCanvas3D::Gizmos::render_overlay(const GLCanvas3D& canvas, const GLCanvas3D::Selection& selection) const +void GLCanvas3D::Gizmos::render_overlay(const GLCanvas3D& canvas, const Selection& selection) const { if (!m_enabled) return; @@ -3018,7 +1369,7 @@ void GLCanvas3D::Gizmos::reset() m_gizmos.clear(); } -void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCanvas3D::Selection& selection) const +void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const Selection& selection) const { if (m_gizmos.empty()) return; @@ -3178,7 +1529,7 @@ void GLCanvas3D::Gizmos::do_render_overlay(const GLCanvas3D& canvas, const GLCan } } -void GLCanvas3D::Gizmos::do_render_current_gizmo(const GLCanvas3D::Selection& selection) const +void GLCanvas3D::Gizmos::do_render_current_gizmo(const Selection& selection) const { GLGizmoBase* curr = get_current(); if (curr != nullptr) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 639d10120..9653b138b 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -4,12 +4,12 @@ #include #include -#include "libslic3r/Technologies.hpp" #include "3DScene.hpp" #include "GLToolbar.hpp" #include "Event.hpp" #include "3DBed.hpp" #include "Camera.hpp" +#include "Selection.hpp" #include @@ -334,293 +334,6 @@ class GLCanvas3D }; public: - class TransformationType - { - public: - enum Enum { - // Transforming in a world coordinate system - World = 0, - // Transforming in a local coordinate system - Local = 1, - // Absolute transformations, allowed in local coordinate system only. - Absolute = 0, - // Relative transformations, allowed in both local and world coordinate system. - Relative = 2, - // For group selection, the transformation is performed as if the group made a single solid body. - Joint = 0, - // For group selection, the transformation is performed on each object independently. - Independent = 4, - - World_Relative_Joint = World | Relative | Joint, - World_Relative_Independent = World | Relative | Independent, - Local_Absolute_Joint = Local | Absolute | Joint, - Local_Absolute_Independent = Local | Absolute | Independent, - Local_Relative_Joint = Local | Relative | Joint, - Local_Relative_Independent = Local | Relative | Independent, - }; - - TransformationType() : m_value(World) {} - TransformationType(Enum value) : m_value(value) {} - TransformationType& operator=(Enum value) { m_value = value; return *this; } - - Enum operator()() const { return m_value; } - bool has(Enum v) const { return ((unsigned int)m_value & (unsigned int)v) != 0; } - - void set_world() { this->remove(Local); } - void set_local() { this->add(Local); } - void set_absolute() { this->remove(Relative); } - void set_relative() { this->add(Relative); } - void set_joint() { this->remove(Independent); } - void set_independent() { this->add(Independent); } - - bool world() const { return ! this->has(Local); } - bool local() const { return this->has(Local); } - bool absolute() const { return ! this->has(Relative); } - bool relative() const { return this->has(Relative); } - bool joint() const { return ! this->has(Independent); } - bool independent() const { return this->has(Independent); } - - private: - void add(Enum v) { m_value = Enum((unsigned int)m_value | (unsigned int)v); } - void remove(Enum v) { m_value = Enum((unsigned int)m_value & (~(unsigned int)v)); } - - Enum m_value; - }; - - class Selection - { - public: - typedef std::set IndicesList; - - enum EMode : unsigned char - { - Volume, - Instance - }; - - enum EType : unsigned char - { - Invalid, - Empty, - WipeTower, - SingleModifier, - MultipleModifier, - SingleVolume, - MultipleVolume, - SingleFullObject, - MultipleFullObject, - SingleFullInstance, - MultipleFullInstance, - Mixed - }; - - private: - struct VolumeCache - { - private: - struct TransformCache - { - Vec3d position; - Vec3d rotation; - Vec3d scaling_factor; - Vec3d mirror; - Transform3d rotation_matrix; - Transform3d scale_matrix; - Transform3d mirror_matrix; - Transform3d full_matrix; - - TransformCache(); - explicit TransformCache(const Geometry::Transformation& transform); - }; - - TransformCache m_volume; - TransformCache m_instance; - - public: - VolumeCache() {} - VolumeCache(const Geometry::Transformation& volume_transform, const Geometry::Transformation& instance_transform); - - const Vec3d& get_volume_position() const { return m_volume.position; } - const Vec3d& get_volume_rotation() const { return m_volume.rotation; } - const Vec3d& get_volume_scaling_factor() const { return m_volume.scaling_factor; } - const Vec3d& get_volume_mirror() const { return m_volume.mirror; } - const Transform3d& get_volume_rotation_matrix() const { return m_volume.rotation_matrix; } - const Transform3d& get_volume_scale_matrix() const { return m_volume.scale_matrix; } - const Transform3d& get_volume_mirror_matrix() const { return m_volume.mirror_matrix; } - const Transform3d& get_volume_full_matrix() const { return m_volume.full_matrix; } - - const Vec3d& get_instance_position() const { return m_instance.position; } - const Vec3d& get_instance_rotation() const { return m_instance.rotation; } - const Vec3d& get_instance_scaling_factor() const { return m_instance.scaling_factor; } - const Vec3d& get_instance_mirror() const { return m_instance.mirror; } - const Transform3d& get_instance_rotation_matrix() const { return m_instance.rotation_matrix; } - const Transform3d& get_instance_scale_matrix() const { return m_instance.scale_matrix; } - const Transform3d& get_instance_mirror_matrix() const { return m_instance.mirror_matrix; } - const Transform3d& get_instance_full_matrix() const { return m_instance.full_matrix; } - }; - - typedef std::map VolumesCache; - typedef std::set InstanceIdxsList; - typedef std::map ObjectIdxsToInstanceIdxsMap; - - struct Cache - { - // Cache of GLVolume derived transformation matrices, valid during mouse dragging. - VolumesCache volumes_data; - // Center of the dragged selection, valid during mouse dragging. - Vec3d dragging_center; - // Map from indices of ModelObject instances in Model::objects - // to a set of indices of ModelVolume instances in ModelObject::instances - // Here the index means a position inside the respective std::vector, not ModelID. - ObjectIdxsToInstanceIdxsMap content; - }; - - // Volumes owned by GLCanvas3D. - GLVolumePtrs* m_volumes; - // Model, not owned. - Model* m_model; - - bool m_valid; - EMode m_mode; - EType m_type; - // set of indices to m_volumes - IndicesList m_list; - Cache m_cache; - mutable BoundingBoxf3 m_bounding_box; - mutable bool m_bounding_box_dirty; - -#if ENABLE_RENDER_SELECTION_CENTER - GLUquadricObj* m_quadric; -#endif // ENABLE_RENDER_SELECTION_CENTER - mutable GLArrow m_arrow; - mutable GLCurvedArrow m_curved_arrow; - - mutable float m_scale_factor; - - public: - Selection(); -#if ENABLE_RENDER_SELECTION_CENTER - ~Selection(); -#endif // ENABLE_RENDER_SELECTION_CENTER - - void set_volumes(GLVolumePtrs* volumes); - bool init(bool useVBOs); - - Model* get_model() const { return m_model; } - void set_model(Model* model); - - EMode get_mode() const { return m_mode; } - void set_mode(EMode mode) { m_mode = mode; } - - void add(unsigned int volume_idx, bool as_single_selection = true); - void remove(unsigned int volume_idx); - - void add_object(unsigned int object_idx, bool as_single_selection = true); - void remove_object(unsigned int object_idx); - - void add_instance(unsigned int object_idx, unsigned int instance_idx, bool as_single_selection = true); - void remove_instance(unsigned int object_idx, unsigned int instance_idx); - - void add_volume(unsigned int object_idx, unsigned int volume_idx, int instance_idx, bool as_single_selection = true); - void remove_volume(unsigned int object_idx, unsigned int volume_idx); - - void add_all(); - - // Update the selection based on the map from old indices to new indices after m_volumes changed. - // If the current selection is by instance, this call may select newly added volumes, if they belong to already selected instances. - void volumes_changed(const std::vector &map_volume_old_to_new); - void clear(); - - bool is_empty() const { return m_type == Empty; } - bool is_wipe_tower() const { return m_type == WipeTower; } - bool is_modifier() const { return (m_type == SingleModifier) || (m_type == MultipleModifier); } - bool is_single_modifier() const { return m_type == SingleModifier; } - bool is_multiple_modifier() const { return m_type == MultipleModifier; } - bool is_single_full_instance() const; - bool is_multiple_full_instance() const { return m_type == MultipleFullInstance; } - bool is_single_full_object() const { return m_type == SingleFullObject; } - bool is_multiple_full_object() const { return m_type == MultipleFullObject; } - bool is_single_volume() const { return m_type == SingleVolume; } - bool is_multiple_volume() const { return m_type == MultipleVolume; } - bool is_mixed() const { return m_type == Mixed; } - bool is_from_single_instance() const { return get_instance_idx() != -1; } - bool is_from_single_object() const; - - bool contains_volume(unsigned int volume_idx) const { return std::find(m_list.begin(), m_list.end(), volume_idx) != m_list.end(); } - bool requires_uniform_scale() const; - - // Returns the the object id if the selection is from a single object, otherwise is -1 - int get_object_idx() const; - // Returns the instance id if the selection is from a single object and from a single instance, otherwise is -1 - int get_instance_idx() const; - // Returns the indices of selected instances. - // Can only be called if selection is from a single object. - const InstanceIdxsList& get_instance_idxs() const; - - const IndicesList& get_volume_idxs() const { return m_list; } - const GLVolume* get_volume(unsigned int volume_idx) const; - - const ObjectIdxsToInstanceIdxsMap& get_content() const { return m_cache.content; } - - unsigned int volumes_count() const { return (unsigned int)m_list.size(); } - const BoundingBoxf3& get_bounding_box() const; - - void start_dragging(); - - void translate(const Vec3d& displacement, bool local = false); - void rotate(const Vec3d& rotation, TransformationType transformation_type); - void flattening_rotate(const Vec3d& normal); - void scale(const Vec3d& scale, bool local); - void mirror(Axis axis); - - void translate(unsigned int object_idx, const Vec3d& displacement); - void translate(unsigned int object_idx, unsigned int instance_idx, const Vec3d& displacement); - - void erase(); - - void render(float scale_factor = 1.0) const; -#if ENABLE_RENDER_SELECTION_CENTER - void render_center() const; -#endif // ENABLE_RENDER_SELECTION_CENTER - void render_sidebar_hints(const std::string& sidebar_field) const; - - bool requires_local_axes() const; - - private: - void _update_valid(); - void _update_type(); - void _set_caches(); - void _add_volume(unsigned int volume_idx); - void _add_instance(unsigned int object_idx, unsigned int instance_idx); - void _add_object(unsigned int object_idx); - void _remove_volume(unsigned int volume_idx); - void _remove_instance(unsigned int object_idx, unsigned int instance_idx); - void _remove_object(unsigned int object_idx); - void _calc_bounding_box() const; - void _render_selected_volumes() const; - void _render_synchronized_volumes() const; - void _render_bounding_box(const BoundingBoxf3& box, float* color) const; - void _render_sidebar_position_hints(const std::string& sidebar_field) const; - void _render_sidebar_rotation_hints(const std::string& sidebar_field) const; - void _render_sidebar_scale_hints(const std::string& sidebar_field) const; - void _render_sidebar_size_hints(const std::string& sidebar_field) const; - void _render_sidebar_position_hint(Axis axis) const; - void _render_sidebar_rotation_hint(Axis axis) const; - void _render_sidebar_scale_hint(Axis axis) const; - void _render_sidebar_size_hint(Axis axis, double length) const; - enum SyncRotationType { - // Do not synchronize rotation. Either not rotating at all, or rotating by world Z axis. - SYNC_ROTATION_NONE = 0, - // Synchronize fully. Used from "place on bed" feature. - SYNC_ROTATION_FULL = 1, - // Synchronize after rotation by an axis not parallel with Z. - SYNC_ROTATION_GENERAL = 2, - }; - void _synchronize_unselected_instances(SyncRotationType sync_rotation_type); - void _synchronize_unselected_volumes(); - void _ensure_on_bed(); - }; - class ClippingPlane { double m_data[4]; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 183820aed..2dda6b7cd 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -10,6 +10,7 @@ #include "libslic3r/Model.hpp" #include "LambdaObjectDialog.hpp" #include "GLCanvas3D.hpp" +#include "Selection.hpp" #include #include "slic3r/Utils/FixModelByWin10.hpp" @@ -1275,7 +1276,7 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode if (obj_idx < 0) return; - const GLCanvas3D::Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); assert(obj_idx == selection.get_object_idx()); /** Any changes of the Object's composition is duplicated for all Object's Instances @@ -1563,7 +1564,7 @@ bool ObjectList::selected_instances_of_same_object() bool ObjectList::can_split_instances() { - const GLCanvas3D::Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); return selection.is_multiple_full_instance() || selection.is_single_full_instance(); } @@ -1873,7 +1874,7 @@ bool ObjectList::multiple_selection() const void ObjectList::update_selections() { - const GLCanvas3D::Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); wxDataViewItemArray sels; // We doesn't update selection if SettingsItem for the current object/part is selected @@ -1971,7 +1972,7 @@ void ObjectList::update_selections() void ObjectList::update_selections_on_canvas() { - GLCanvas3D::Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); const int sel_cnt = GetSelectedItemsCount(); if (sel_cnt == 0) { @@ -1980,8 +1981,8 @@ void ObjectList::update_selections_on_canvas() return; } - auto add_to_selection = [this](const wxDataViewItem& item, GLCanvas3D::Selection& selection, bool as_single_selection) - { + auto add_to_selection = [this](const wxDataViewItem& item, Selection& selection, bool as_single_selection) + { if (m_objects_model->GetParent(item) == wxDataViewItem(0)) { selection.add_object(m_objects_model->GetIdByItem(item), as_single_selection); return; @@ -2240,7 +2241,7 @@ void ObjectList::instances_to_separated_object(const int obj_idx, const std::set void ObjectList::split_instances() { - const GLCanvas3D::Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); const int obj_idx = selection.get_object_idx(); if (obj_idx == -1) return; diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index ab83df05d..d186f7057 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -7,6 +7,8 @@ #include "PresetBundle.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/Geometry.hpp" +#include "GLCanvas3D.hpp" +#include "Selection.hpp" #include @@ -155,7 +157,7 @@ void ObjectManipulation::UpdateAndShow(const bool show) OG_Settings::UpdateAndShow(show); } -void ObjectManipulation::update_settings_value(const GLCanvas3D::Selection& selection) +void ObjectManipulation::update_settings_value(const Selection& selection) { m_new_move_label_string = L("Position"); m_new_rotate_label_string = L("Rotation"); @@ -348,7 +350,7 @@ void ObjectManipulation::reset_settings_value() void ObjectManipulation::change_position_value(const Vec3d& position) { auto canvas = wxGetApp().plater()->canvas3D(); - GLCanvas3D::Selection& selection = canvas->get_selection(); + Selection& selection = canvas->get_selection(); selection.start_dragging(); selection.translate(position - m_cache.position, selection.requires_local_axes()); canvas->do_move(); @@ -359,10 +361,10 @@ void ObjectManipulation::change_position_value(const Vec3d& position) void ObjectManipulation::change_rotation_value(const Vec3d& rotation) { GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); - const GLCanvas3D::Selection& selection = canvas->get_selection(); + const Selection& selection = canvas->get_selection(); - GLCanvas3D::TransformationType transformation_type(GLCanvas3D::TransformationType::World_Relative_Joint); - if (selection.is_single_full_instance() || selection.requires_local_axes()) + TransformationType transformation_type(TransformationType::World_Relative_Joint); + if (selection.is_single_full_instance() || selection.requires_local_axes()) transformation_type.set_independent(); if (selection.is_single_full_instance()) { //FIXME GLCanvas3D::Selection::rotate() does not process absoulte rotations correctly: It does not recognize the axis index, which was changed. @@ -384,7 +386,7 @@ void ObjectManipulation::change_rotation_value(const Vec3d& rotation) void ObjectManipulation::change_scale_value(const Vec3d& scale) { Vec3d scaling_factor = scale; - const GLCanvas3D::Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); if (m_uniform_scale || selection.requires_uniform_scale()) { Vec3d abs_scale_diff = (scale - m_cache.scale).cwiseAbs(); @@ -418,7 +420,7 @@ void ObjectManipulation::change_scale_value(const Vec3d& scale) void ObjectManipulation::change_size_value(const Vec3d& size) { - const GLCanvas3D::Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); Vec3d ref_size = m_cache.size; if (selection.is_single_volume() || selection.is_single_modifier()) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 16160c84d..46e8cec81 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -4,7 +4,6 @@ #include #include "GUI_ObjectSettings.hpp" -#include "GLCanvas3D.hpp" class wxStaticText; class PrusaLockButton; @@ -12,6 +11,7 @@ class PrusaLockButton; namespace Slic3r { namespace GUI { +class Selection; class ObjectManipulation : public OG_Settings { @@ -90,7 +90,7 @@ public: bool IsShown() override; void UpdateAndShow(const bool show) override; - void update_settings_value(const GLCanvas3D::Selection& selection); + void update_settings_value(const Selection& selection); // Called from the App to update the UI if dirty. void update_if_dirty(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 290541a18..1e12674ec 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -184,7 +184,7 @@ void GLGizmoBase::disable_grabber(unsigned int id) on_disable_grabber(id); } -void GLGizmoBase::start_dragging(const GLCanvas3D::Selection& selection) +void GLGizmoBase::start_dragging(const Selection& selection) { m_dragging = true; @@ -208,7 +208,7 @@ void GLGizmoBase::stop_dragging() on_stop_dragging(); } -void GLGizmoBase::update(const UpdateData& data, const GLCanvas3D::Selection& selection) +void GLGizmoBase::update(const UpdateData& data, const Selection& selection) { if (m_hover_id != -1) on_update(data, selection); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index e8328bcd4..b70c1f8df 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -5,6 +5,7 @@ #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/Selection.hpp" class wxWindow; @@ -126,7 +127,7 @@ public: const std::string& get_icon_filename() const { return m_icon_filename; } #endif // ENABLE_SVG_ICONS - bool is_activable(const GLCanvas3D::Selection& selection) const { return on_is_activable(selection); } + bool is_activable(const Selection& selection) const { return on_is_activable(selection); } bool is_selectable() const { return on_is_selectable(); } unsigned int get_sprite_id() const { return m_sprite_id; } @@ -139,31 +140,31 @@ public: void enable_grabber(unsigned int id); void disable_grabber(unsigned int id); - void start_dragging(const GLCanvas3D::Selection& selection); + void start_dragging(const Selection& selection); void stop_dragging(); bool is_dragging() const { return m_dragging; } - void update(const UpdateData& data, const GLCanvas3D::Selection& selection); + void update(const UpdateData& data, const Selection& selection); - void render(const GLCanvas3D::Selection& selection) const { on_render(selection); } - void render_for_picking(const GLCanvas3D::Selection& selection) const { on_render_for_picking(selection); } - void render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) { on_render_input_window(x, y, bottom_limit, selection); } + void render(const Selection& selection) const { on_render(selection); } + void render_for_picking(const Selection& selection) const { on_render_for_picking(selection); } + void render_input_window(float x, float y, float bottom_limit, const Selection& selection) { on_render_input_window(x, y, bottom_limit, selection); } protected: virtual bool on_init() = 0; virtual std::string on_get_name() const = 0; virtual void on_set_state() {} virtual void on_set_hover_id() {} - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return true; } + virtual bool on_is_activable(const Selection& selection) const { return true; } virtual bool on_is_selectable() const { return true; } virtual void on_enable_grabber(unsigned int id) {} virtual void on_disable_grabber(unsigned int id) {} - virtual void on_start_dragging(const GLCanvas3D::Selection& selection) {} + virtual void on_start_dragging(const Selection& selection) {} virtual void on_stop_dragging() {} - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) = 0; - virtual void on_render(const GLCanvas3D::Selection& selection) const = 0; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const = 0; - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) {} + virtual void on_update(const UpdateData& data, const Selection& selection) = 0; + virtual void on_render(const Selection& selection) const = 0; + virtual void on_render_for_picking(const Selection& selection) const = 0; + virtual void on_render_input_window(float x, float y, float bottom_limit, const Selection& selection) {} // Returns the picking color for the given id, based on the BASE_ID constant // No check is made for clashing with other picking color (i.e. GLVolumes) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 54a39c6d5..e228706c0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -101,12 +101,12 @@ void GLGizmoCut::on_set_state() } } -bool GLGizmoCut::on_is_activable(const GLCanvas3D::Selection& selection) const +bool GLGizmoCut::on_is_activable(const Selection& selection) const { return selection.is_single_full_instance() && !selection.is_wipe_tower(); } -void GLGizmoCut::on_start_dragging(const GLCanvas3D::Selection& selection) +void GLGizmoCut::on_start_dragging(const Selection& selection) { if (m_hover_id == -1) { return; } @@ -118,14 +118,14 @@ void GLGizmoCut::on_start_dragging(const GLCanvas3D::Selection& selection) m_drag_center(2) = m_cut_z; } -void GLGizmoCut::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +void GLGizmoCut::on_update(const UpdateData& data, const Selection& selection) { if (m_hover_id != -1) { set_cut_z(m_start_z + calc_projection(data.mouse_ray)); } } -void GLGizmoCut::on_render(const GLCanvas3D::Selection& selection) const +void GLGizmoCut::on_render(const Selection& selection) const { if (m_grabbers[0].dragging) { set_tooltip("Z: " + format(m_cut_z, 2)); @@ -176,14 +176,14 @@ void GLGizmoCut::on_render(const GLCanvas3D::Selection& selection) const m_grabbers[0].render(m_hover_id == 0, box.max_size()); } -void GLGizmoCut::on_render_for_picking(const GLCanvas3D::Selection& selection) const +void GLGizmoCut::on_render_for_picking(const Selection& selection) const { ::glDisable(GL_DEPTH_TEST); render_grabbers_for_picking(selection.get_bounding_box()); } -void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit, const Selection& selection) { m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); m_imgui->set_next_window_bg_alpha(0.5f); @@ -207,7 +207,7 @@ void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit, co } } -void GLGizmoCut::update_max_z(const GLCanvas3D::Selection& selection) const +void GLGizmoCut::update_max_z(const Selection& selection) const { m_max_z = selection.get_bounding_box().size()(2); set_cut_z(m_cut_z); @@ -219,7 +219,7 @@ void GLGizmoCut::set_cut_z(double cut_z) const m_cut_z = std::max(0.0, std::min(m_max_z, cut_z)); } -void GLGizmoCut::perform_cut(const GLCanvas3D::Selection& selection) +void GLGizmoCut::perform_cut(const Selection& selection) { const auto instance_idx = selection.get_instance_idx(); const auto object_idx = selection.get_object_idx(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index beec6d1da..fd4e8d8dc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -33,17 +33,17 @@ protected: virtual bool on_init(); virtual std::string on_get_name() const; virtual void on_set_state(); - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); + virtual bool on_is_activable(const Selection& selection) const; + virtual void on_start_dragging(const Selection& selection); + virtual void on_update(const UpdateData& data, const Selection& selection); + virtual void on_render(const Selection& selection) const; + virtual void on_render_for_picking(const Selection& selection) const; + virtual void on_render_input_window(float x, float y, float bottom_limit, const Selection& selection); private: - void update_max_z(const GLCanvas3D::Selection& selection) const; + void update_max_z(const Selection& selection) const; void set_cut_z(double cut_z) const; - void perform_cut(const GLCanvas3D::Selection& selection); + void perform_cut(const Selection& selection); double calc_projection(const Linef3& mouse_ray) const; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index d72dc4913..2ed048677 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -32,12 +32,12 @@ std::string GLGizmoFlatten::on_get_name() const return L("Place on face [F]"); } -bool GLGizmoFlatten::on_is_activable(const GLCanvas3D::Selection& selection) const +bool GLGizmoFlatten::on_is_activable(const Selection& selection) const { return selection.is_single_full_instance(); } -void GLGizmoFlatten::on_start_dragging(const GLCanvas3D::Selection& selection) +void GLGizmoFlatten::on_start_dragging(const Selection& selection) { if (m_hover_id != -1) { @@ -47,7 +47,7 @@ void GLGizmoFlatten::on_start_dragging(const GLCanvas3D::Selection& selection) } } -void GLGizmoFlatten::on_render(const GLCanvas3D::Selection& selection) const +void GLGizmoFlatten::on_render(const Selection& selection) const { ::glClear(GL_DEPTH_BUFFER_BIT); @@ -83,7 +83,7 @@ void GLGizmoFlatten::on_render(const GLCanvas3D::Selection& selection) const ::glDisable(GL_BLEND); } -void GLGizmoFlatten::on_render_for_picking(const GLCanvas3D::Selection& selection) const +void GLGizmoFlatten::on_render_for_picking(const Selection& selection) const { ::glDisable(GL_DEPTH_TEST); ::glDisable(GL_BLEND); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp index c91924c5a..1bd17e5ef 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp @@ -49,11 +49,11 @@ public: protected: virtual bool on_init(); virtual std::string on_get_name() const; - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) {} - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + virtual bool on_is_activable(const Selection& selection) const; + virtual void on_start_dragging(const Selection& selection); + virtual void on_update(const UpdateData& data, const Selection& selection) {} + virtual void on_render(const Selection& selection) const; + virtual void on_render_for_picking(const Selection& selection) const; virtual void on_set_state() { if (m_state == On && is_plane_update_necessary()) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index d18d71c83..03151c433 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -51,7 +51,7 @@ std::string GLGizmoMove3D::on_get_name() const return L("Move [M]"); } -void GLGizmoMove3D::on_start_dragging(const GLCanvas3D::Selection& selection) +void GLGizmoMove3D::on_start_dragging(const Selection& selection) { if (m_hover_id != -1) { @@ -69,7 +69,7 @@ void GLGizmoMove3D::on_stop_dragging() m_displacement = Vec3d::Zero(); } -void GLGizmoMove3D::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +void GLGizmoMove3D::on_update(const UpdateData& data, const Selection& selection) { if (m_hover_id == 0) m_displacement(0) = calc_projection(data); @@ -79,7 +79,7 @@ void GLGizmoMove3D::on_update(const UpdateData& data, const GLCanvas3D::Selectio m_displacement(2) = calc_projection(data); } -void GLGizmoMove3D::on_render(const GLCanvas3D::Selection& selection) const +void GLGizmoMove3D::on_render(const Selection& selection) const { bool show_position = selection.is_single_full_instance(); const Vec3d& position = selection.get_bounding_box().center(); @@ -155,7 +155,7 @@ void GLGizmoMove3D::on_render(const GLCanvas3D::Selection& selection) const } } -void GLGizmoMove3D::on_render_for_picking(const GLCanvas3D::Selection& selection) const +void GLGizmoMove3D::on_render_for_picking(const Selection& selection) const { ::glDisable(GL_DEPTH_TEST); @@ -166,7 +166,7 @@ void GLGizmoMove3D::on_render_for_picking(const GLCanvas3D::Selection& selection render_grabber_extension(Z, box, true); } -void GLGizmoMove3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +void GLGizmoMove3D::on_render_input_window(float x, float y, float bottom_limit, const Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI bool show_position = selection.is_single_full_instance(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index d4d97de7f..ddab2b777 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -37,12 +37,12 @@ public: protected: virtual bool on_init(); virtual std::string on_get_name() const; - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); + virtual void on_start_dragging(const Selection& selection); virtual void on_stop_dragging(); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); + virtual void on_update(const UpdateData& data, const Selection& selection); + virtual void on_render(const Selection& selection) const; + virtual void on_render_for_picking(const Selection& selection) const; + virtual void on_render_input_window(float x, float y, float bottom_limit, const Selection& selection); private: double calc_projection(const UpdateData& data) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 4c6f66f4c..72b9ad18a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -80,7 +80,7 @@ bool GLGizmoRotate::on_init() return true; } -void GLGizmoRotate::on_start_dragging(const GLCanvas3D::Selection& selection) +void GLGizmoRotate::on_start_dragging(const Selection& selection) { const BoundingBoxf3& box = selection.get_bounding_box(); m_center = box.center(); @@ -91,7 +91,7 @@ void GLGizmoRotate::on_start_dragging(const GLCanvas3D::Selection& selection) m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; } -void GLGizmoRotate::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +void GLGizmoRotate::on_update(const UpdateData& data, const Selection& selection) { Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray, selection)); @@ -126,7 +126,7 @@ void GLGizmoRotate::on_update(const UpdateData& data, const GLCanvas3D::Selectio m_angle = theta; } -void GLGizmoRotate::on_render(const GLCanvas3D::Selection& selection) const +void GLGizmoRotate::on_render(const Selection& selection) const { if (!m_grabbers[0].enabled) return; @@ -183,7 +183,7 @@ void GLGizmoRotate::on_render(const GLCanvas3D::Selection& selection) const ::glPopMatrix(); } -void GLGizmoRotate::on_render_for_picking(const GLCanvas3D::Selection& selection) const +void GLGizmoRotate::on_render_for_picking(const Selection& selection) const { ::glDisable(GL_DEPTH_TEST); @@ -347,7 +347,7 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick ::glDisable(GL_LIGHTING); } -void GLGizmoRotate::transform_to_local(const GLCanvas3D::Selection& selection) const +void GLGizmoRotate::transform_to_local(const Selection& selection) const { ::glTranslated(m_center(0), m_center(1), m_center(2)); @@ -380,7 +380,7 @@ void GLGizmoRotate::transform_to_local(const GLCanvas3D::Selection& selection) c } } -Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, const GLCanvas3D::Selection& selection) const +Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const { double half_pi = 0.5 * (double)PI; @@ -457,7 +457,7 @@ std::string GLGizmoRotate3D::on_get_name() const return L("Rotate [R]"); } -void GLGizmoRotate3D::on_start_dragging(const GLCanvas3D::Selection& selection) +void GLGizmoRotate3D::on_start_dragging(const Selection& selection) { if ((0 <= m_hover_id) && (m_hover_id < 3)) m_gizmos[m_hover_id].start_dragging(selection); @@ -469,7 +469,7 @@ void GLGizmoRotate3D::on_stop_dragging() m_gizmos[m_hover_id].stop_dragging(); } -void GLGizmoRotate3D::on_render(const GLCanvas3D::Selection& selection) const +void GLGizmoRotate3D::on_render(const Selection& selection) const { ::glClear(GL_DEPTH_BUFFER_BIT); @@ -483,7 +483,7 @@ void GLGizmoRotate3D::on_render(const GLCanvas3D::Selection& selection) const m_gizmos[Z].render(selection); } -void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit, const Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI Vec3d rotation(Geometry::rad2deg(m_gizmos[0].get_angle()), Geometry::rad2deg(m_gizmos[1].get_angle()), Geometry::rad2deg(m_gizmos[2].get_angle())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index aca64c94e..f5946aa56 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -52,10 +52,10 @@ public: protected: virtual bool on_init(); virtual std::string on_get_name() const { return ""; } - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + virtual void on_start_dragging(const Selection& selection); + virtual void on_update(const UpdateData& data, const Selection& selection); + virtual void on_render(const Selection& selection) const; + virtual void on_render_for_picking(const Selection& selection) const; private: void render_circle() const; @@ -66,9 +66,9 @@ private: void render_grabber(const BoundingBoxf3& box) const; void render_grabber_extension(const BoundingBoxf3& box, bool picking) const; - void transform_to_local(const GLCanvas3D::Selection& selection) const; + void transform_to_local(const Selection& selection) const; // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate - Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const GLCanvas3D::Selection& selection) const; + Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const; }; class GLGizmoRotate3D : public GLGizmoBase @@ -102,7 +102,7 @@ protected: m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1); } } - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); } + virtual bool on_is_activable(const Selection& selection) const { return !selection.is_wipe_tower(); } virtual void on_enable_grabber(unsigned int id) { if ((0 <= id) && (id < 3)) @@ -113,17 +113,17 @@ protected: if ((0 <= id) && (id < 3)) m_gizmos[id].disable_grabber(0); } - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); + virtual void on_start_dragging(const Selection& selection); virtual void on_stop_dragging(); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) + virtual void on_update(const UpdateData& data, const Selection& selection) { for (GLGizmoRotate& g : m_gizmos) { g.update(data, selection); } } - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const + virtual void on_render(const Selection& selection) const; + virtual void on_render_for_picking(const Selection& selection) const { for (const GLGizmoRotate& g : m_gizmos) { @@ -131,7 +131,7 @@ protected: } } - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); + virtual void on_render_input_window(float x, float y, float bottom_limit, const Selection& selection); }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index acc44e00d..43152b56c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -51,7 +51,7 @@ std::string GLGizmoScale3D::on_get_name() const return L("Scale [S]"); } -void GLGizmoScale3D::on_start_dragging(const GLCanvas3D::Selection& selection) +void GLGizmoScale3D::on_start_dragging(const Selection& selection) { if (m_hover_id != -1) { @@ -60,7 +60,7 @@ void GLGizmoScale3D::on_start_dragging(const GLCanvas3D::Selection& selection) } } -void GLGizmoScale3D::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +void GLGizmoScale3D::on_update(const UpdateData& data, const Selection& selection) { if ((m_hover_id == 0) || (m_hover_id == 1)) do_scale_x(data); @@ -72,7 +72,7 @@ void GLGizmoScale3D::on_update(const UpdateData& data, const GLCanvas3D::Selecti do_scale_uniform(data); } -void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const +void GLGizmoScale3D::on_render(const Selection& selection) const { bool single_instance = selection.is_single_full_instance(); bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); @@ -121,7 +121,7 @@ void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const if (single_instance) { // calculate bounding box in instance local reference system - const GLCanvas3D::Selection::IndicesList& idxs = selection.get_volume_idxs(); + const Selection::IndicesList& idxs = selection.get_volume_idxs(); for (unsigned int idx : idxs) { const GLVolume* vol = selection.get_volume(idx); @@ -267,14 +267,14 @@ void GLGizmoScale3D::on_render(const GLCanvas3D::Selection& selection) const } } -void GLGizmoScale3D::on_render_for_picking(const GLCanvas3D::Selection& selection) const +void GLGizmoScale3D::on_render_for_picking(const Selection& selection) const { ::glDisable(GL_DEPTH_TEST); render_grabbers_for_picking(selection.get_bounding_box()); } -void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit, const Selection& selection) { #if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI bool single_instance = selection.is_single_full_instance(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index 8554e57a7..6e14a361e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -37,12 +37,12 @@ public: protected: virtual bool on_init(); virtual std::string on_get_name() const; - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const { return !selection.is_wipe_tower(); } - virtual void on_start_dragging(const GLCanvas3D::Selection& selection); - virtual void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection); + virtual bool on_is_activable(const Selection& selection) const { return !selection.is_wipe_tower(); } + virtual void on_start_dragging(const Selection& selection); + virtual void on_update(const UpdateData& data, const Selection& selection); + virtual void on_render(const Selection& selection) const; + virtual void on_render_for_picking(const Selection& selection) const; + virtual void on_render_input_window(float x, float y, float bottom_limit, const Selection& selection); private: void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 695564971..cd7e3b985 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -42,7 +42,7 @@ bool GLGizmoSlaSupports::on_init() return true; } -void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection) +void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection) { m_starting_center = Vec3d::Zero(); m_old_model_object = m_model_object; @@ -72,7 +72,7 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const G } } -void GLGizmoSlaSupports::on_render(const GLCanvas3D::Selection& selection) const +void GLGizmoSlaSupports::on_render(const Selection& selection) const { ::glEnable(GL_BLEND); ::glEnable(GL_DEPTH_TEST); @@ -123,14 +123,14 @@ void GLGizmoSlaSupports::render_selection_rectangle() const ::glPopAttrib(); // restore former MatrixMode } -void GLGizmoSlaSupports::on_render_for_picking(const GLCanvas3D::Selection& selection) const +void GLGizmoSlaSupports::on_render_for_picking(const Selection& selection) const { ::glEnable(GL_DEPTH_TEST); render_points(selection, true); } -void GLGizmoSlaSupports::render_points(const GLCanvas3D::Selection& selection, bool picking) const +void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const { if (m_quadric == nullptr || !selection.is_from_single_instance()) return; @@ -276,7 +276,7 @@ std::pair GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse igl::Hit hit; - const GLCanvas3D::Selection& selection = m_parent.get_selection(); + const Selection& selection = m_parent.get_selection(); const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); double z_offset = volume->get_sla_shift_z(); @@ -380,7 +380,7 @@ bool GLGizmoSlaSupports::mouse_event(SLAGizmoEventType action, const Vec2d& mous GLdouble projection_matrix[16]; ::glGetDoublev(GL_PROJECTION_MATRIX, projection_matrix); - const GLCanvas3D::Selection& selection = m_parent.get_selection(); + const Selection& selection = m_parent.get_selection(); const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); double z_offset = volume->get_sla_shift_z(); @@ -484,7 +484,7 @@ void GLGizmoSlaSupports::delete_selected_points(bool force) //m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); } -void GLGizmoSlaSupports::on_update(const UpdateData& data, const GLCanvas3D::Selection& selection) +void GLGizmoSlaSupports::on_update(const UpdateData& data, const Selection& selection) { if (m_editing_mode && m_hover_id != -1 && data.mouse_pos && (!m_editing_mode_cache[m_hover_id].support_point.is_new_island || !m_lock_unique_islands)) { std::pair pos_and_normal; @@ -542,7 +542,7 @@ void GLGizmoSlaSupports::update_cache_entry_normal(unsigned int i) const -void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) +void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit, const Selection& selection) { if (!m_model_object) return; @@ -686,14 +686,14 @@ RENDER_AGAIN: m_parent.set_as_dirty(); } -bool GLGizmoSlaSupports::on_is_activable(const GLCanvas3D::Selection& selection) const +bool GLGizmoSlaSupports::on_is_activable(const Selection& selection) const { if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA || !selection.is_from_single_instance()) return false; // Check that none of the selected volumes is outside. - const GLCanvas3D::Selection::IndicesList& list = selection.get_volume_idxs(); + const Selection::IndicesList& list = selection.get_volume_idxs(); for (const auto& idx : list) if (selection.get_volume(idx)->is_outside) return false; @@ -750,7 +750,7 @@ void GLGizmoSlaSupports::on_set_state() -void GLGizmoSlaSupports::on_start_dragging(const GLCanvas3D::Selection& selection) +void GLGizmoSlaSupports::on_start_dragging(const Selection& selection) { if (m_hover_id != -1) { select_point(NoPoints); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 492bb85ca..c27ff0b6d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -58,19 +58,19 @@ public: GLGizmoSlaSupports(GLCanvas3D& parent, unsigned int sprite_id); #endif // ENABLE_SVG_ICONS virtual ~GLGizmoSlaSupports(); - void set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection); + void set_sla_support_data(ModelObject* model_object, const Selection& selection); bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down); void delete_selected_points(bool force = false); std::pair get_sla_clipping_plane() const; private: bool on_init(); - void on_update(const UpdateData& data, const GLCanvas3D::Selection& selection); - virtual void on_render(const GLCanvas3D::Selection& selection) const; - virtual void on_render_for_picking(const GLCanvas3D::Selection& selection) const; + void on_update(const UpdateData& data, const Selection& selection); + virtual void on_render(const Selection& selection) const; + virtual void on_render_for_picking(const Selection& selection) const; void render_selection_rectangle() const; - void render_points(const GLCanvas3D::Selection& selection, bool picking = false) const; + void render_points(const Selection& selection, bool picking = false) const; bool is_mesh_update_necessary() const; void update_mesh(); void update_cache_entry_normal(unsigned int i) const; @@ -113,11 +113,11 @@ private: protected: void on_set_state() override; - void on_start_dragging(const GLCanvas3D::Selection& selection) override; - virtual void on_render_input_window(float x, float y, float bottom_limit, const GLCanvas3D::Selection& selection) override; + void on_start_dragging(const Selection& selection) override; + virtual void on_render_input_window(float x, float y, float bottom_limit, const Selection& selection) override; virtual std::string on_get_name() const; - virtual bool on_is_activable(const GLCanvas3D::Selection& selection) const; + virtual bool on_is_activable(const Selection& selection) const; virtual bool on_is_selectable() const; }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6ddb4c837..630586bb5 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -47,6 +47,7 @@ #include "MainFrame.hpp" #include "3DScene.hpp" #include "GLCanvas3D.hpp" +#include "Selection.hpp" #include "GLToolbar.hpp" #include "GUI_Preview.hpp" #include "3DBed.hpp" @@ -1153,8 +1154,8 @@ struct Plater::priv std::vector load_model_objects(const ModelObjectPtrs &model_objects); std::unique_ptr get_export_file(GUI::FileType file_type); - const GLCanvas3D::Selection& get_selection() const; - GLCanvas3D::Selection& get_selection(); + const Selection& get_selection() const; + Selection& get_selection(); int get_selected_object_idx() const; int get_selected_volume_idx() const; void selection_changed(); @@ -1641,7 +1642,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ // automatic selection of added objects if (!obj_idxs.empty() && (view3D != nullptr)) { - GLCanvas3D::Selection& selection = view3D->get_canvas3d()->get_selection(); + Selection& selection = view3D->get_canvas3d()->get_selection(); selection.clear(); for (size_t idx : obj_idxs) { @@ -1790,12 +1791,12 @@ std::unique_ptr Plater::priv::get_export_file(GUI::FileType return dlg; } -const GLCanvas3D::Selection& Plater::priv::get_selection() const +const Selection& Plater::priv::get_selection() const { return view3D->get_canvas3d()->get_selection(); } -GLCanvas3D::Selection& Plater::priv::get_selection() +Selection& Plater::priv::get_selection() { return view3D->get_canvas3d()->get_selection(); } diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp new file mode 100644 index 000000000..e5d221a5f --- /dev/null +++ b/src/slic3r/GUI/Selection.cpp @@ -0,0 +1,1670 @@ +#include "libslic3r/libslic3r.h" +#include "Selection.hpp" + +#include "GLCanvas3D.hpp" +#include "GUI_App.hpp" +#include "GUI_ObjectManipulation.hpp" +#include "GUI_ObjectList.hpp" +#include "Gizmos/GLGizmoBase.hpp" + +#include + +#include + +static const float UNIFORM_SCALE_COLOR[3] = { 1.0f, 0.38f, 0.0f }; + +namespace Slic3r { +namespace GUI { + +Selection::VolumeCache::TransformCache::TransformCache() + : position(Vec3d::Zero()) + , rotation(Vec3d::Zero()) + , scaling_factor(Vec3d::Ones()) + , mirror(Vec3d::Ones()) + , rotation_matrix(Transform3d::Identity()) + , scale_matrix(Transform3d::Identity()) + , mirror_matrix(Transform3d::Identity()) + , full_matrix(Transform3d::Identity()) +{ +} + +Selection::VolumeCache::TransformCache::TransformCache(const Geometry::Transformation& transform) + : position(transform.get_offset()) + , rotation(transform.get_rotation()) + , scaling_factor(transform.get_scaling_factor()) + , mirror(transform.get_mirror()) + , full_matrix(transform.get_matrix()) +{ + rotation_matrix = Geometry::assemble_transform(Vec3d::Zero(), rotation); + scale_matrix = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scaling_factor); + mirror_matrix = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), Vec3d::Ones(), mirror); +} + +Selection::VolumeCache::VolumeCache(const Geometry::Transformation& volume_transform, const Geometry::Transformation& instance_transform) + : m_volume(volume_transform) + , m_instance(instance_transform) +{ +} + +Selection::Selection() + : m_volumes(nullptr) + , m_model(nullptr) + , m_mode(Instance) + , m_type(Empty) + , m_valid(false) + , m_bounding_box_dirty(true) + , m_curved_arrow(16) + , m_scale_factor(1.0f) +{ +#if ENABLE_RENDER_SELECTION_CENTER + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +#endif // ENABLE_RENDER_SELECTION_CENTER +} + +#if ENABLE_RENDER_SELECTION_CENTER +Selection::~Selection() +{ + if (m_quadric != nullptr) + ::gluDeleteQuadric(m_quadric); +} +#endif // ENABLE_RENDER_SELECTION_CENTER + +void Selection::set_volumes(GLVolumePtrs* volumes) +{ + m_volumes = volumes; + _update_valid(); +} + +bool Selection::init(bool useVBOs) +{ + if (!m_arrow.init(useVBOs)) + return false; + + m_arrow.set_scale(5.0 * Vec3d::Ones()); + + if (!m_curved_arrow.init(useVBOs)) + return false; + + m_curved_arrow.set_scale(5.0 * Vec3d::Ones()); + return true; +} + +void Selection::set_model(Model* model) +{ + m_model = model; + _update_valid(); +} + +void Selection::add(unsigned int volume_idx, bool as_single_selection) +{ + if (!m_valid || ((unsigned int)m_volumes->size() <= volume_idx)) + return; + + const GLVolume* volume = (*m_volumes)[volume_idx]; + // wipe tower is already selected + if (is_wipe_tower() && volume->is_wipe_tower) + return; + + // resets the current list if needed + bool needs_reset = as_single_selection; + needs_reset |= volume->is_wipe_tower; + needs_reset |= is_wipe_tower() && !volume->is_wipe_tower; + needs_reset |= !is_modifier() && volume->is_modifier; + needs_reset |= is_modifier() && !volume->is_modifier; + + if (needs_reset) + clear(); + + if (volume->is_modifier) + m_mode = Volume; + else if (!contains_volume(volume_idx)) + m_mode = Instance; + // else -> keep current mode + + switch (m_mode) + { + case Volume: + { + if (volume->volume_idx() >= 0 && (is_empty() || (volume->instance_idx() == get_instance_idx()))) + _add_volume(volume_idx); + + break; + } + case Instance: + { + _add_instance(volume->object_idx(), volume->instance_idx()); + break; + } + } + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::remove(unsigned int volume_idx) +{ + if (!m_valid || ((unsigned int)m_volumes->size() <= volume_idx)) + return; + + GLVolume* volume = (*m_volumes)[volume_idx]; + + switch (m_mode) + { + case Volume: + { + _remove_volume(volume_idx); + break; + } + case Instance: + { + _remove_instance(volume->object_idx(), volume->instance_idx()); + break; + } + } + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::add_object(unsigned int object_idx, bool as_single_selection) +{ + if (!m_valid) + return; + + // resets the current list if needed + if (as_single_selection) + clear(); + + m_mode = Instance; + + _add_object(object_idx); + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::remove_object(unsigned int object_idx) +{ + if (!m_valid) + return; + + _remove_object(object_idx); + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::add_instance(unsigned int object_idx, unsigned int instance_idx, bool as_single_selection) +{ + if (!m_valid) + return; + + // resets the current list if needed + if (as_single_selection) + clear(); + + m_mode = Instance; + + _add_instance(object_idx, instance_idx); + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::remove_instance(unsigned int object_idx, unsigned int instance_idx) +{ + if (!m_valid) + return; + + _remove_instance(object_idx, instance_idx); + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::add_volume(unsigned int object_idx, unsigned int volume_idx, int instance_idx, bool as_single_selection) +{ + if (!m_valid) + return; + + // resets the current list if needed + if (as_single_selection) + clear(); + + m_mode = Volume; + + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) + { + GLVolume* v = (*m_volumes)[i]; + if ((v->object_idx() == object_idx) && (v->volume_idx() == volume_idx)) + { + if ((instance_idx != -1) && (v->instance_idx() == instance_idx)) + _add_volume(i); + } + } + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::remove_volume(unsigned int object_idx, unsigned int volume_idx) +{ + if (!m_valid) + return; + + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) + { + GLVolume* v = (*m_volumes)[i]; + if ((v->object_idx() == object_idx) && (v->volume_idx() == volume_idx)) + _remove_volume(i); + } + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::add_all() +{ + if (!m_valid) + return; + + m_mode = Instance; + clear(); + + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) + { + if (!(*m_volumes)[i]->is_wipe_tower) + _add_volume(i); + } + + _update_type(); + m_bounding_box_dirty = true; +} + +void Selection::clear() +{ + if (!m_valid) + return; + + for (unsigned int i : m_list) + { + (*m_volumes)[i]->selected = false; + } + + m_list.clear(); + + _update_type(); + m_bounding_box_dirty = true; + + // resets the cache in the sidebar + wxGetApp().obj_manipul()->reset_cache(); +} + +// Update the selection based on the map from old indices to new indices after m_volumes changed. +// If the current selection is by instance, this call may select newly added volumes, if they belong to already selected instances. +void Selection::volumes_changed(const std::vector &map_volume_old_to_new) +{ + assert(m_valid); + + // 1) Update the selection set. + IndicesList list_new; + std::vector> model_instances; + for (unsigned int idx : m_list) { + if (map_volume_old_to_new[idx] != size_t(-1)) { + unsigned int new_idx = (unsigned int)map_volume_old_to_new[idx]; + list_new.insert(new_idx); + if (m_mode == Instance) { + // Save the object_idx / instance_idx pair of selected old volumes, + // so we may add the newly added volumes of the same object_idx / instance_idx pair + // to the selection. + const GLVolume *volume = (*m_volumes)[new_idx]; + model_instances.emplace_back(volume->object_idx(), volume->instance_idx()); + } + } + } + m_list = std::move(list_new); + + if (!model_instances.empty()) { + // Instance selection mode. Add the newly added volumes of the same object_idx / instance_idx pair + // to the selection. + assert(m_mode == Instance); + sort_remove_duplicates(model_instances); + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) { + const GLVolume* volume = (*m_volumes)[i]; + for (const std::pair &model_instance : model_instances) + if (volume->object_idx() == model_instance.first && volume->instance_idx() == model_instance.second) + this->_add_volume(i); + } + } + + _update_type(); + m_bounding_box_dirty = true; +} + +bool Selection::is_single_full_instance() const +{ + if (m_type == SingleFullInstance) + return true; + + if (m_type == SingleFullObject) + return get_instance_idx() != -1; + + if (m_list.empty() || m_volumes->empty()) + return false; + + int object_idx = m_valid ? get_object_idx() : -1; + if ((object_idx < 0) || ((int)m_model->objects.size() <= object_idx)) + return false; + + int instance_idx = (*m_volumes)[*m_list.begin()]->instance_idx(); + + std::set volumes_idxs; + for (unsigned int i : m_list) + { + const GLVolume* v = (*m_volumes)[i]; + if ((object_idx != v->object_idx()) || (instance_idx != v->instance_idx())) + return false; + + int volume_idx = v->volume_idx(); + if (volume_idx >= 0) + volumes_idxs.insert(volume_idx); + } + + return m_model->objects[object_idx]->volumes.size() == volumes_idxs.size(); +} + +bool Selection::is_from_single_object() const +{ + int idx = get_object_idx(); + return (0 <= idx) && (idx < 1000); +} + +bool Selection::requires_uniform_scale() const +{ + if (is_single_full_instance() || is_single_modifier() || is_single_volume()) + return false; + + return true; +} + +int Selection::get_object_idx() const +{ + return (m_cache.content.size() == 1) ? m_cache.content.begin()->first : -1; +} + +int Selection::get_instance_idx() const +{ + if (m_cache.content.size() == 1) + { + const InstanceIdxsList& idxs = m_cache.content.begin()->second; + if (idxs.size() == 1) + return *idxs.begin(); + } + + return -1; +} + +const Selection::InstanceIdxsList& Selection::get_instance_idxs() const +{ + assert(m_cache.content.size() == 1); + return m_cache.content.begin()->second; +} + +const GLVolume* Selection::get_volume(unsigned int volume_idx) const +{ + return (m_valid && (volume_idx < (unsigned int)m_volumes->size())) ? (*m_volumes)[volume_idx] : nullptr; +} + +const BoundingBoxf3& Selection::get_bounding_box() const +{ + if (m_bounding_box_dirty) + _calc_bounding_box(); + + return m_bounding_box; +} + +void Selection::start_dragging() +{ + if (!m_valid) + return; + + _set_caches(); +} + +void Selection::translate(const Vec3d& displacement, bool local) +{ + if (!m_valid) + return; + + for (unsigned int i : m_list) + { + if ((m_mode == Volume) || (*m_volumes)[i]->is_wipe_tower) + { + if (local) + (*m_volumes)[i]->set_volume_offset(m_cache.volumes_data[i].get_volume_position() + displacement); + else + { + Vec3d local_displacement = (m_cache.volumes_data[i].get_instance_rotation_matrix() * m_cache.volumes_data[i].get_instance_scale_matrix() * m_cache.volumes_data[i].get_instance_mirror_matrix()).inverse() * displacement; + (*m_volumes)[i]->set_volume_offset(m_cache.volumes_data[i].get_volume_position() + local_displacement); + } + } + else if (m_mode == Instance) + (*m_volumes)[i]->set_instance_offset(m_cache.volumes_data[i].get_instance_position() + displacement); + } + +#if !DISABLE_INSTANCES_SYNCH + if (m_mode == Instance) + _synchronize_unselected_instances(SYNC_ROTATION_NONE); + else if (m_mode == Volume) + _synchronize_unselected_volumes(); +#endif // !DISABLE_INSTANCES_SYNCH + + m_bounding_box_dirty = true; +} + +static Eigen::Quaterniond rotation_xyz_diff(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) +{ + return + // From the current coordinate system to world. + Eigen::AngleAxisd(rot_xyz_to(2), Vec3d::UnitZ()) * Eigen::AngleAxisd(rot_xyz_to(1), Vec3d::UnitY()) * Eigen::AngleAxisd(rot_xyz_to(0), Vec3d::UnitX()) * + // From world to the initial coordinate system. + Eigen::AngleAxisd(-rot_xyz_from(0), Vec3d::UnitX()) * Eigen::AngleAxisd(-rot_xyz_from(1), Vec3d::UnitY()) * Eigen::AngleAxisd(-rot_xyz_from(2), Vec3d::UnitZ()); +} + +// This should only be called if it is known, that the two rotations only differ in rotation around the Z axis. +static double rotation_diff_z(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) +{ + Eigen::AngleAxisd angle_axis(rotation_xyz_diff(rot_xyz_from, rot_xyz_to)); + Vec3d axis = angle_axis.axis(); + double angle = angle_axis.angle(); +#ifndef NDEBUG + if (std::abs(angle) > 1e-8) { + assert(std::abs(axis.x()) < 1e-8); + assert(std::abs(axis.y()) < 1e-8); + } +#endif /* NDEBUG */ + return (axis.z() < 0) ? -angle : angle; +} + +// Rotate an object around one of the axes. Only one rotation component is expected to be changing. +void Selection::rotate(const Vec3d& rotation, TransformationType transformation_type) +{ + if (!m_valid) + return; + + // Only relative rotation values are allowed in the world coordinate system. + assert(!transformation_type.world() || transformation_type.relative()); + + int rot_axis_max = 0; + if (rotation.isApprox(Vec3d::Zero())) + { + for (unsigned int i : m_list) + { + GLVolume &volume = *(*m_volumes)[i]; + if (m_mode == Instance) + { + volume.set_instance_rotation(m_cache.volumes_data[i].get_instance_rotation()); + volume.set_instance_offset(m_cache.volumes_data[i].get_instance_position()); + } + else if (m_mode == Volume) + { + volume.set_volume_rotation(m_cache.volumes_data[i].get_volume_rotation()); + volume.set_volume_offset(m_cache.volumes_data[i].get_volume_position()); + } + } + } + else + { + //FIXME this does not work for absolute rotations (transformation_type.absolute() is true) + rotation.cwiseAbs().maxCoeff(&rot_axis_max); + + // For generic rotation, we want to rotate the first volume in selection, and then to synchronize the other volumes with it. + std::vector object_instance_first(m_model->objects.size(), -1); + auto rotate_instance = [this, &rotation, &object_instance_first, rot_axis_max, transformation_type](GLVolume &volume, int i) { + int first_volume_idx = object_instance_first[volume.object_idx()]; + if (rot_axis_max != 2 && first_volume_idx != -1) { + // Generic rotation, but no rotation around the Z axis. + // Always do a local rotation (do not consider the selection to be a rigid body). + assert(is_approx(rotation.z(), 0.0)); + const GLVolume &first_volume = *(*m_volumes)[first_volume_idx]; + const Vec3d &rotation = first_volume.get_instance_rotation(); + double z_diff = rotation_diff_z(m_cache.volumes_data[first_volume_idx].get_instance_rotation(), m_cache.volumes_data[i].get_instance_rotation()); + volume.set_instance_rotation(Vec3d(rotation(0), rotation(1), rotation(2) + z_diff)); + } + else { + // extracts rotations from the composed transformation + Vec3d new_rotation = transformation_type.world() ? + Geometry::extract_euler_angles(Geometry::assemble_transform(Vec3d::Zero(), rotation) * m_cache.volumes_data[i].get_instance_rotation_matrix()) : + transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation(); + if (rot_axis_max == 2 && transformation_type.joint()) { + // Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis. + Vec3d offset = Geometry::assemble_transform(Vec3d::Zero(), Vec3d(0.0, 0.0, new_rotation(2) - m_cache.volumes_data[i].get_instance_rotation()(2))) * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); + volume.set_instance_offset(m_cache.dragging_center + offset); + } + volume.set_instance_rotation(new_rotation); + object_instance_first[volume.object_idx()] = i; + } + }; + + for (unsigned int i : m_list) + { + GLVolume &volume = *(*m_volumes)[i]; + if (is_single_full_instance()) + rotate_instance(volume, i); + else if (is_single_volume() || is_single_modifier()) + { + if (transformation_type.independent()) + volume.set_volume_rotation(volume.get_volume_rotation() + rotation); + else + { + Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); + Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); + volume.set_volume_rotation(new_rotation); + } + } + else + { + if (m_mode == Instance) + rotate_instance(volume, i); + else if (m_mode == Volume) + { + // extracts rotations from the composed transformation + Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); + Vec3d new_rotation = Geometry::extract_euler_angles(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); + if (transformation_type.joint()) + { + Vec3d local_pivot = m_cache.volumes_data[i].get_instance_full_matrix().inverse() * m_cache.dragging_center; + Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() - local_pivot); + volume.set_volume_offset(local_pivot + offset); + } + volume.set_volume_rotation(new_rotation); + } + } + } + } + +#if !DISABLE_INSTANCES_SYNCH + if (m_mode == Instance) + _synchronize_unselected_instances((rot_axis_max == 2) ? SYNC_ROTATION_NONE : SYNC_ROTATION_GENERAL); + else if (m_mode == Volume) + _synchronize_unselected_volumes(); +#endif // !DISABLE_INSTANCES_SYNCH + + m_bounding_box_dirty = true; +} + +void Selection::flattening_rotate(const Vec3d& normal) +{ + // We get the normal in untransformed coordinates. We must transform it using the instance matrix, find out + // how to rotate the instance so it faces downwards and do the rotation. All that for all selected instances. + // The function assumes that is_from_single_object() holds. + + if (!m_valid) + return; + + for (unsigned int i : m_list) + { + Transform3d wst = m_cache.volumes_data[i].get_instance_scale_matrix(); + Vec3d scaling_factor = Vec3d(1. / wst(0, 0), 1. / wst(1, 1), 1. / wst(2, 2)); + + Transform3d wmt = m_cache.volumes_data[i].get_instance_mirror_matrix(); + Vec3d mirror(wmt(0, 0), wmt(1, 1), wmt(2, 2)); + + Vec3d rotation = Geometry::extract_euler_angles(m_cache.volumes_data[i].get_instance_rotation_matrix()); + Vec3d transformed_normal = Geometry::assemble_transform(Vec3d::Zero(), rotation, scaling_factor, mirror) * normal; + transformed_normal.normalize(); + + Vec3d axis = transformed_normal(2) > 0.999f ? Vec3d(1., 0., 0.) : Vec3d(transformed_normal.cross(Vec3d(0., 0., -1.))); + axis.normalize(); + + Transform3d extra_rotation = Transform3d::Identity(); + extra_rotation.rotate(Eigen::AngleAxisd(acos(-transformed_normal(2)), axis)); + + Vec3d new_rotation = Geometry::extract_euler_angles(extra_rotation * m_cache.volumes_data[i].get_instance_rotation_matrix()); + (*m_volumes)[i]->set_instance_rotation(new_rotation); + } + +#if !DISABLE_INSTANCES_SYNCH + // we want to synchronize z-rotation as well, otherwise the flattening behaves funny + // when applied on one of several identical instances + if (m_mode == Instance) + _synchronize_unselected_instances(SYNC_ROTATION_FULL); +#endif // !DISABLE_INSTANCES_SYNCH + + m_bounding_box_dirty = true; +} + +void Selection::scale(const Vec3d& scale, bool local) +{ + if (!m_valid) + return; + + for (unsigned int i : m_list) + { + if (is_single_full_instance()) + (*m_volumes)[i]->set_instance_scaling_factor(scale); + else if (is_single_volume() || is_single_modifier()) + (*m_volumes)[i]->set_volume_scaling_factor(scale); + else + { + Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scale); + if (m_mode == Instance) + { + Eigen::Matrix new_matrix = (m * m_cache.volumes_data[i].get_instance_scale_matrix()).matrix().block(0, 0, 3, 3); + // extracts scaling factors from the composed transformation + Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); + if (!local) + (*m_volumes)[i]->set_instance_offset(m_cache.dragging_center + m * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); + + (*m_volumes)[i]->set_instance_scaling_factor(new_scale); + } + else if (m_mode == Volume) + { + Eigen::Matrix new_matrix = (m * m_cache.volumes_data[i].get_volume_scale_matrix()).matrix().block(0, 0, 3, 3); + // extracts scaling factors from the composed transformation + Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); + if (!local) + { + Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() + m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); + (*m_volumes)[i]->set_volume_offset(m_cache.dragging_center - m_cache.volumes_data[i].get_instance_position() + offset); + } + (*m_volumes)[i]->set_volume_scaling_factor(new_scale); + } + } + } + +#if !DISABLE_INSTANCES_SYNCH + if (m_mode == Instance) + _synchronize_unselected_instances(SYNC_ROTATION_NONE); + else if (m_mode == Volume) + _synchronize_unselected_volumes(); +#endif // !DISABLE_INSTANCES_SYNCH + + _ensure_on_bed(); + + m_bounding_box_dirty = true; +} + +void Selection::mirror(Axis axis) +{ + if (!m_valid) + return; + + bool single_full_instance = is_single_full_instance(); + + for (unsigned int i : m_list) + { + if (single_full_instance) + (*m_volumes)[i]->set_instance_mirror(axis, -(*m_volumes)[i]->get_instance_mirror(axis)); + else if (m_mode == Volume) + (*m_volumes)[i]->set_volume_mirror(axis, -(*m_volumes)[i]->get_volume_mirror(axis)); + } + +#if !DISABLE_INSTANCES_SYNCH + if (m_mode == Instance) + _synchronize_unselected_instances(SYNC_ROTATION_NONE); + else if (m_mode == Volume) + _synchronize_unselected_volumes(); +#endif // !DISABLE_INSTANCES_SYNCH + + m_bounding_box_dirty = true; +} + +void Selection::translate(unsigned int object_idx, const Vec3d& displacement) +{ + if (!m_valid) + return; + + for (unsigned int i : m_list) + { + GLVolume* v = (*m_volumes)[i]; + if (v->object_idx() == object_idx) + v->set_instance_offset(v->get_instance_offset() + displacement); + } + + std::set done; // prevent processing volumes twice + done.insert(m_list.begin(), m_list.end()); + + for (unsigned int i : m_list) + { + if (done.size() == m_volumes->size()) + break; + + int object_idx = (*m_volumes)[i]->object_idx(); + if (object_idx >= 1000) + continue; + + // Process unselected volumes of the object. + for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) + { + if (done.size() == m_volumes->size()) + break; + + if (done.find(j) != done.end()) + continue; + + GLVolume* v = (*m_volumes)[j]; + if (v->object_idx() != object_idx) + continue; + + v->set_instance_offset(v->get_instance_offset() + displacement); + done.insert(j); + } + } + + m_bounding_box_dirty = true; +} + +void Selection::translate(unsigned int object_idx, unsigned int instance_idx, const Vec3d& displacement) +{ + if (!m_valid) + return; + + for (unsigned int i : m_list) + { + GLVolume* v = (*m_volumes)[i]; + if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) + v->set_instance_offset(v->get_instance_offset() + displacement); + } + + std::set done; // prevent processing volumes twice + done.insert(m_list.begin(), m_list.end()); + + for (unsigned int i : m_list) + { + if (done.size() == m_volumes->size()) + break; + + int object_idx = (*m_volumes)[i]->object_idx(); + if (object_idx >= 1000) + continue; + + // Process unselected volumes of the object. + for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) + { + if (done.size() == m_volumes->size()) + break; + + if (done.find(j) != done.end()) + continue; + + GLVolume* v = (*m_volumes)[j]; + if ((v->object_idx() != object_idx) || (v->instance_idx() != instance_idx)) + continue; + + v->set_instance_offset(v->get_instance_offset() + displacement); + done.insert(j); + } + } + + m_bounding_box_dirty = true; +} + +void Selection::erase() +{ + if (!m_valid) + return; + + if (is_single_full_object()) + wxGetApp().obj_list()->delete_from_model_and_list(ItemType::itObject, get_object_idx(), 0); + else if (is_multiple_full_object()) + { + std::vector items; + items.reserve(m_cache.content.size()); + for (ObjectIdxsToInstanceIdxsMap::iterator it = m_cache.content.begin(); it != m_cache.content.end(); ++it) + { + items.emplace_back(ItemType::itObject, it->first, 0); + } + wxGetApp().obj_list()->delete_from_model_and_list(items); + } + else if (is_multiple_full_instance()) + { + std::set> instances_idxs; + for (ObjectIdxsToInstanceIdxsMap::iterator obj_it = m_cache.content.begin(); obj_it != m_cache.content.end(); ++obj_it) + { + for (InstanceIdxsList::reverse_iterator inst_it = obj_it->second.rbegin(); inst_it != obj_it->second.rend(); ++inst_it) + { + instances_idxs.insert(std::make_pair(obj_it->first, *inst_it)); + } + } + + std::vector items; + items.reserve(instances_idxs.size()); + for (const std::pair& i : instances_idxs) + { + items.emplace_back(ItemType::itInstance, i.first, i.second); + } + wxGetApp().obj_list()->delete_from_model_and_list(items); + } + else if (is_single_full_instance()) + wxGetApp().obj_list()->delete_from_model_and_list(ItemType::itInstance, get_object_idx(), get_instance_idx()); + else if (is_mixed()) + { + std::set items_set; + std::map volumes_in_obj; + + for (auto i : m_list) { + const auto gl_vol = (*m_volumes)[i]; + const auto glv_obj_idx = gl_vol->object_idx(); + const auto model_object = m_model->objects[glv_obj_idx]; + + if (model_object->instances.size() == 1) { + if (model_object->volumes.size() == 1) + items_set.insert(ItemForDelete(ItemType::itObject, glv_obj_idx, -1)); + else { + items_set.insert(ItemForDelete(ItemType::itVolume, glv_obj_idx, gl_vol->volume_idx())); + int idx = (volumes_in_obj.find(glv_obj_idx) == volumes_in_obj.end()) ? 0 : volumes_in_obj.at(glv_obj_idx); + volumes_in_obj[glv_obj_idx] = ++idx; + } + continue; + } + + const auto glv_ins_idx = gl_vol->instance_idx(); + + for (auto obj_ins : m_cache.content) { + if (obj_ins.first == glv_obj_idx) { + if (obj_ins.second.find(glv_ins_idx) != obj_ins.second.end()) { + if (obj_ins.second.size() == model_object->instances.size()) + items_set.insert(ItemForDelete(ItemType::itVolume, glv_obj_idx, gl_vol->volume_idx())); + else + items_set.insert(ItemForDelete(ItemType::itInstance, glv_obj_idx, glv_ins_idx)); + + break; + } + } + } + } + + std::vector items; + items.reserve(items_set.size()); + for (const ItemForDelete& i : items_set) { + if (i.type == ItemType::itVolume) { + const int vol_in_obj_cnt = volumes_in_obj.find(i.obj_idx) == volumes_in_obj.end() ? 0 : volumes_in_obj.at(i.obj_idx); + if (vol_in_obj_cnt == m_model->objects[i.obj_idx]->volumes.size()) { + if (i.sub_obj_idx == vol_in_obj_cnt - 1) + items.emplace_back(ItemType::itObject, i.obj_idx, 0); + continue; + } + } + items.emplace_back(i.type, i.obj_idx, i.sub_obj_idx); + } + + wxGetApp().obj_list()->delete_from_model_and_list(items); + } + else + { + std::set> volumes_idxs; + for (unsigned int i : m_list) + { + const GLVolume* v = (*m_volumes)[i]; + // Only remove volumes associated with ModelVolumes from the object list. + // Temporary meshes (SLA supports or pads) are not managed by the object list. + if (v->volume_idx() >= 0) + volumes_idxs.insert(std::make_pair(v->object_idx(), v->volume_idx())); + } + + std::vector items; + items.reserve(volumes_idxs.size()); + for (const std::pair& v : volumes_idxs) + { + items.emplace_back(ItemType::itVolume, v.first, v.second); + } + + wxGetApp().obj_list()->delete_from_model_and_list(items); + } +} + +void Selection::render(float scale_factor) const +{ + if (!m_valid || is_empty()) + return; + + m_scale_factor = scale_factor; + + // render cumulative bounding box of selected volumes + _render_selected_volumes(); + _render_synchronized_volumes(); +} + +#if ENABLE_RENDER_SELECTION_CENTER +void Selection::render_center() const +{ + if (!m_valid || is_empty() || (m_quadric == nullptr)) + return; + + const Vec3d& center = get_bounding_box().center(); + + ::glDisable(GL_DEPTH_TEST); + + ::glEnable(GL_LIGHTING); + + ::glColor3f(1.0f, 1.0f, 1.0f); + ::glPushMatrix(); + ::glTranslated(center(0), center(1), center(2)); + ::gluSphere(m_quadric, 0.75, 32, 32); + ::glPopMatrix(); + + ::glDisable(GL_LIGHTING); +} +#endif // ENABLE_RENDER_SELECTION_CENTER + +void Selection::render_sidebar_hints(const std::string& sidebar_field) const +{ + if (sidebar_field.empty()) + return; + + ::glClear(GL_DEPTH_BUFFER_BIT); + ::glEnable(GL_DEPTH_TEST); + + ::glEnable(GL_LIGHTING); + + ::glPushMatrix(); + + const Vec3d& center = get_bounding_box().center(); + + if (is_single_full_instance()) + { + ::glTranslated(center(0), center(1), center(2)); + if (!boost::starts_with(sidebar_field, "position")) + { + Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); + ::glMultMatrixd(orient_matrix.data()); + } + } + else if (is_single_volume() || is_single_modifier()) + { + ::glTranslated(center(0), center(1), center(2)); + Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); + if (!boost::starts_with(sidebar_field, "position")) + orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); + + ::glMultMatrixd(orient_matrix.data()); + } + else + { + ::glTranslated(center(0), center(1), center(2)); + if (requires_local_axes()) + { + Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); + ::glMultMatrixd(orient_matrix.data()); + } + } + + if (boost::starts_with(sidebar_field, "position")) + _render_sidebar_position_hints(sidebar_field); + else if (boost::starts_with(sidebar_field, "rotation")) + _render_sidebar_rotation_hints(sidebar_field); + else if (boost::starts_with(sidebar_field, "scale")) + _render_sidebar_scale_hints(sidebar_field); + else if (boost::starts_with(sidebar_field, "size")) + _render_sidebar_size_hints(sidebar_field); + + ::glPopMatrix(); + + ::glDisable(GL_LIGHTING); +} + +bool Selection::requires_local_axes() const +{ + return (m_mode == Volume) && is_from_single_instance(); +} + +void Selection::_update_valid() +{ + m_valid = (m_volumes != nullptr) && (m_model != nullptr); +} + +void Selection::_update_type() +{ + m_cache.content.clear(); + m_type = Mixed; + + for (unsigned int i : m_list) + { + const GLVolume* volume = (*m_volumes)[i]; + int obj_idx = volume->object_idx(); + int inst_idx = volume->instance_idx(); + ObjectIdxsToInstanceIdxsMap::iterator obj_it = m_cache.content.find(obj_idx); + if (obj_it == m_cache.content.end()) + obj_it = m_cache.content.insert(ObjectIdxsToInstanceIdxsMap::value_type(obj_idx, InstanceIdxsList())).first; + + obj_it->second.insert(inst_idx); + } + + bool requires_disable = false; + + if (!m_valid) + m_type = Invalid; + else + { + if (m_list.empty()) + m_type = Empty; + else if (m_list.size() == 1) + { + const GLVolume* first = (*m_volumes)[*m_list.begin()]; + if (first->is_wipe_tower) + m_type = WipeTower; + else if (first->is_modifier) + { + m_type = SingleModifier; + requires_disable = true; + } + else + { + const ModelObject* model_object = m_model->objects[first->object_idx()]; + unsigned int volumes_count = (unsigned int)model_object->volumes.size(); + unsigned int instances_count = (unsigned int)model_object->instances.size(); + if (volumes_count * instances_count == 1) + { + m_type = SingleFullObject; + // ensures the correct mode is selected + m_mode = Instance; + } + else if (volumes_count == 1) // instances_count > 1 + { + m_type = SingleFullInstance; + // ensures the correct mode is selected + m_mode = Instance; + } + else + { + m_type = SingleVolume; + requires_disable = true; + } + } + } + else + { + if (m_cache.content.size() == 1) // single object + { + const ModelObject* model_object = m_model->objects[m_cache.content.begin()->first]; + unsigned int model_volumes_count = (unsigned int)model_object->volumes.size(); + unsigned int sla_volumes_count = 0; + for (unsigned int i : m_list) + { + if ((*m_volumes)[i]->volume_idx() < 0) + ++sla_volumes_count; + } + unsigned int volumes_count = model_volumes_count + sla_volumes_count; + unsigned int instances_count = (unsigned int)model_object->instances.size(); + unsigned int selected_instances_count = (unsigned int)m_cache.content.begin()->second.size(); + if (volumes_count * instances_count == (unsigned int)m_list.size()) + { + m_type = SingleFullObject; + // ensures the correct mode is selected + m_mode = Instance; + } + else if (selected_instances_count == 1) + { + if (volumes_count == (unsigned int)m_list.size()) + { + m_type = SingleFullInstance; + // ensures the correct mode is selected + m_mode = Instance; + } + else + { + unsigned int modifiers_count = 0; + for (unsigned int i : m_list) + { + if ((*m_volumes)[i]->is_modifier) + ++modifiers_count; + } + + if (modifiers_count == 0) + { + m_type = MultipleVolume; + requires_disable = true; + } + else if (modifiers_count == (unsigned int)m_list.size()) + { + m_type = MultipleModifier; + requires_disable = true; + } + } + } + else if ((selected_instances_count > 1) && (selected_instances_count * volumes_count == (unsigned int)m_list.size())) + { + m_type = MultipleFullInstance; + // ensures the correct mode is selected + m_mode = Instance; + } + } + else + { + int sels_cntr = 0; + for (ObjectIdxsToInstanceIdxsMap::iterator it = m_cache.content.begin(); it != m_cache.content.end(); ++it) + { + const ModelObject* model_object = m_model->objects[it->first]; + unsigned int volumes_count = (unsigned int)model_object->volumes.size(); + unsigned int instances_count = (unsigned int)model_object->instances.size(); + sels_cntr += volumes_count * instances_count; + } + if (sels_cntr == (unsigned int)m_list.size()) + { + m_type = MultipleFullObject; + // ensures the correct mode is selected + m_mode = Instance; + } + } + } + } + + int object_idx = get_object_idx(); + int instance_idx = get_instance_idx(); + for (GLVolume* v : *m_volumes) + { + v->disabled = requires_disable ? (v->object_idx() != object_idx) || (v->instance_idx() != instance_idx) : false; + } + +#if ENABLE_SELECTION_DEBUG_OUTPUT + std::cout << "Selection: "; + std::cout << "mode: "; + switch (m_mode) + { + case Volume: + { + std::cout << "Volume"; + break; + } + case Instance: + { + std::cout << "Instance"; + break; + } + } + + std::cout << " - type: "; + + switch (m_type) + { + case Invalid: + { + std::cout << "Invalid" << std::endl; + break; + } + case Empty: + { + std::cout << "Empty" << std::endl; + break; + } + case WipeTower: + { + std::cout << "WipeTower" << std::endl; + break; + } + case SingleModifier: + { + std::cout << "SingleModifier" << std::endl; + break; + } + case MultipleModifier: + { + std::cout << "MultipleModifier" << std::endl; + break; + } + case SingleVolume: + { + std::cout << "SingleVolume" << std::endl; + break; + } + case MultipleVolume: + { + std::cout << "MultipleVolume" << std::endl; + break; + } + case SingleFullObject: + { + std::cout << "SingleFullObject" << std::endl; + break; + } + case MultipleFullObject: + { + std::cout << "MultipleFullObject" << std::endl; + break; + } + case SingleFullInstance: + { + std::cout << "SingleFullInstance" << std::endl; + break; + } + case MultipleFullInstance: + { + std::cout << "MultipleFullInstance" << std::endl; + break; + } + case Mixed: + { + std::cout << "Mixed" << std::endl; + break; + } + } +#endif // ENABLE_SELECTION_DEBUG_OUTPUT +} + +void Selection::_set_caches() +{ + m_cache.volumes_data.clear(); + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) + { + const GLVolume* v = (*m_volumes)[i]; + m_cache.volumes_data.emplace(i, VolumeCache(v->get_volume_transformation(), v->get_instance_transformation())); + } + m_cache.dragging_center = get_bounding_box().center(); +} + +void Selection::_add_volume(unsigned int volume_idx) +{ + m_list.insert(volume_idx); + (*m_volumes)[volume_idx]->selected = true; +} + +void Selection::_add_instance(unsigned int object_idx, unsigned int instance_idx) +{ + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) + { + GLVolume* v = (*m_volumes)[i]; + if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) + _add_volume(i); + } +} + +void Selection::_add_object(unsigned int object_idx) +{ + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) + { + GLVolume* v = (*m_volumes)[i]; + if (v->object_idx() == object_idx) + _add_volume(i); + } +} + +void Selection::_remove_volume(unsigned int volume_idx) +{ + IndicesList::iterator v_it = m_list.find(volume_idx); + if (v_it == m_list.end()) + return; + + m_list.erase(v_it); + + (*m_volumes)[volume_idx]->selected = false; +} + +void Selection::_remove_instance(unsigned int object_idx, unsigned int instance_idx) +{ + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) + { + GLVolume* v = (*m_volumes)[i]; + if ((v->object_idx() == object_idx) && (v->instance_idx() == instance_idx)) + _remove_volume(i); + } +} + +void Selection::_remove_object(unsigned int object_idx) +{ + for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i) + { + GLVolume* v = (*m_volumes)[i]; + if (v->object_idx() == object_idx) + _remove_volume(i); + } +} + +void Selection::_calc_bounding_box() const +{ + m_bounding_box = BoundingBoxf3(); + if (m_valid) + { + for (unsigned int i : m_list) + { + m_bounding_box.merge((*m_volumes)[i]->transformed_convex_hull_bounding_box()); + } + } + m_bounding_box_dirty = false; +} + +void Selection::_render_selected_volumes() const +{ + float color[3] = { 1.0f, 1.0f, 1.0f }; + _render_bounding_box(get_bounding_box(), color); +} + +void Selection::_render_synchronized_volumes() const +{ + if (m_mode == Instance) + return; + + float color[3] = { 1.0f, 1.0f, 0.0f }; + + for (unsigned int i : m_list) + { + const GLVolume* volume = (*m_volumes)[i]; + int object_idx = volume->object_idx(); + int instance_idx = volume->instance_idx(); + int volume_idx = volume->volume_idx(); + for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) + { + if (i == j) + continue; + + const GLVolume* v = (*m_volumes)[j]; + if ((v->object_idx() != object_idx) || (v->volume_idx() != volume_idx)) + continue; + + _render_bounding_box(v->transformed_convex_hull_bounding_box(), color); + } + } +} + +void Selection::_render_bounding_box(const BoundingBoxf3& box, float* color) const +{ + if (color == nullptr) + return; + + Vec3f b_min = box.min.cast(); + Vec3f b_max = box.max.cast(); + Vec3f size = 0.2f * box.size().cast(); + + ::glEnable(GL_DEPTH_TEST); + + ::glColor3fv(color); + ::glLineWidth(2.0f * m_scale_factor); + + ::glBegin(GL_LINES); + + ::glVertex3f(b_min(0), b_min(1), b_min(2)); ::glVertex3f(b_min(0) + size(0), b_min(1), b_min(2)); + ::glVertex3f(b_min(0), b_min(1), b_min(2)); ::glVertex3f(b_min(0), b_min(1) + size(1), b_min(2)); + ::glVertex3f(b_min(0), b_min(1), b_min(2)); ::glVertex3f(b_min(0), b_min(1), b_min(2) + size(2)); + + ::glVertex3f(b_max(0), b_min(1), b_min(2)); ::glVertex3f(b_max(0) - size(0), b_min(1), b_min(2)); + ::glVertex3f(b_max(0), b_min(1), b_min(2)); ::glVertex3f(b_max(0), b_min(1) + size(1), b_min(2)); + ::glVertex3f(b_max(0), b_min(1), b_min(2)); ::glVertex3f(b_max(0), b_min(1), b_min(2) + size(2)); + + ::glVertex3f(b_max(0), b_max(1), b_min(2)); ::glVertex3f(b_max(0) - size(0), b_max(1), b_min(2)); + ::glVertex3f(b_max(0), b_max(1), b_min(2)); ::glVertex3f(b_max(0), b_max(1) - size(1), b_min(2)); + ::glVertex3f(b_max(0), b_max(1), b_min(2)); ::glVertex3f(b_max(0), b_max(1), b_min(2) + size(2)); + + ::glVertex3f(b_min(0), b_max(1), b_min(2)); ::glVertex3f(b_min(0) + size(0), b_max(1), b_min(2)); + ::glVertex3f(b_min(0), b_max(1), b_min(2)); ::glVertex3f(b_min(0), b_max(1) - size(1), b_min(2)); + ::glVertex3f(b_min(0), b_max(1), b_min(2)); ::glVertex3f(b_min(0), b_max(1), b_min(2) + size(2)); + + ::glVertex3f(b_min(0), b_min(1), b_max(2)); ::glVertex3f(b_min(0) + size(0), b_min(1), b_max(2)); + ::glVertex3f(b_min(0), b_min(1), b_max(2)); ::glVertex3f(b_min(0), b_min(1) + size(1), b_max(2)); + ::glVertex3f(b_min(0), b_min(1), b_max(2)); ::glVertex3f(b_min(0), b_min(1), b_max(2) - size(2)); + + ::glVertex3f(b_max(0), b_min(1), b_max(2)); ::glVertex3f(b_max(0) - size(0), b_min(1), b_max(2)); + ::glVertex3f(b_max(0), b_min(1), b_max(2)); ::glVertex3f(b_max(0), b_min(1) + size(1), b_max(2)); + ::glVertex3f(b_max(0), b_min(1), b_max(2)); ::glVertex3f(b_max(0), b_min(1), b_max(2) - size(2)); + + ::glVertex3f(b_max(0), b_max(1), b_max(2)); ::glVertex3f(b_max(0) - size(0), b_max(1), b_max(2)); + ::glVertex3f(b_max(0), b_max(1), b_max(2)); ::glVertex3f(b_max(0), b_max(1) - size(1), b_max(2)); + ::glVertex3f(b_max(0), b_max(1), b_max(2)); ::glVertex3f(b_max(0), b_max(1), b_max(2) - size(2)); + + ::glVertex3f(b_min(0), b_max(1), b_max(2)); ::glVertex3f(b_min(0) + size(0), b_max(1), b_max(2)); + ::glVertex3f(b_min(0), b_max(1), b_max(2)); ::glVertex3f(b_min(0), b_max(1) - size(1), b_max(2)); + ::glVertex3f(b_min(0), b_max(1), b_max(2)); ::glVertex3f(b_min(0), b_max(1), b_max(2) - size(2)); + + ::glEnd(); +} + +void Selection::_render_sidebar_position_hints(const std::string& sidebar_field) const +{ + if (boost::ends_with(sidebar_field, "x")) + { + ::glRotated(-90.0, 0.0, 0.0, 1.0); + _render_sidebar_position_hint(X); + } + else if (boost::ends_with(sidebar_field, "y")) + _render_sidebar_position_hint(Y); + else if (boost::ends_with(sidebar_field, "z")) + { + ::glRotated(90.0, 1.0, 0.0, 0.0); + _render_sidebar_position_hint(Z); + } +} + +void Selection::_render_sidebar_rotation_hints(const std::string& sidebar_field) const +{ + if (boost::ends_with(sidebar_field, "x")) + { + ::glRotated(90.0, 0.0, 1.0, 0.0); + _render_sidebar_rotation_hint(X); + } + else if (boost::ends_with(sidebar_field, "y")) + { + ::glRotated(-90.0, 1.0, 0.0, 0.0); + _render_sidebar_rotation_hint(Y); + } + else if (boost::ends_with(sidebar_field, "z")) + _render_sidebar_rotation_hint(Z); +} + +void Selection::_render_sidebar_scale_hints(const std::string& sidebar_field) const +{ + bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling(); + + if (boost::ends_with(sidebar_field, "x") || uniform_scale) + { + ::glPushMatrix(); + ::glRotated(-90.0, 0.0, 0.0, 1.0); + _render_sidebar_scale_hint(X); + ::glPopMatrix(); + } + + if (boost::ends_with(sidebar_field, "y") || uniform_scale) + { + ::glPushMatrix(); + _render_sidebar_scale_hint(Y); + ::glPopMatrix(); + } + + if (boost::ends_with(sidebar_field, "z") || uniform_scale) + { + ::glPushMatrix(); + ::glRotated(90.0, 1.0, 0.0, 0.0); + _render_sidebar_scale_hint(Z); + ::glPopMatrix(); + } +} + +void Selection::_render_sidebar_size_hints(const std::string& sidebar_field) const +{ + _render_sidebar_scale_hints(sidebar_field); +} + +void Selection::_render_sidebar_position_hint(Axis axis) const +{ + m_arrow.set_color(AXES_COLOR[axis], 3); + m_arrow.render(); +} + +void Selection::_render_sidebar_rotation_hint(Axis axis) const +{ + m_curved_arrow.set_color(AXES_COLOR[axis], 3); + m_curved_arrow.render(); + + ::glRotated(180.0, 0.0, 0.0, 1.0); + m_curved_arrow.render(); +} + +void Selection::_render_sidebar_scale_hint(Axis axis) const +{ + m_arrow.set_color(((requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling()) ? UNIFORM_SCALE_COLOR : AXES_COLOR[axis]), 3); + + ::glTranslated(0.0, 5.0, 0.0); + m_arrow.render(); + + ::glTranslated(0.0, -10.0, 0.0); + ::glRotated(180.0, 0.0, 0.0, 1.0); + m_arrow.render(); +} + +void Selection::_render_sidebar_size_hint(Axis axis, double length) const +{ +} + +#ifndef NDEBUG +static bool is_rotation_xy_synchronized(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) +{ + Eigen::AngleAxisd angle_axis(rotation_xyz_diff(rot_xyz_from, rot_xyz_to)); + Vec3d axis = angle_axis.axis(); + double angle = angle_axis.angle(); + if (std::abs(angle) < 1e-8) + return true; + assert(std::abs(axis.x()) < 1e-8); + assert(std::abs(axis.y()) < 1e-8); + assert(std::abs(std::abs(axis.z()) - 1.) < 1e-8); + return std::abs(axis.x()) < 1e-8 && std::abs(axis.y()) < 1e-8 && std::abs(std::abs(axis.z()) - 1.) < 1e-8; +} + +static void verify_instances_rotation_synchronized(const Model &model, const GLVolumePtrs &volumes) +{ + for (size_t idx_object = 0; idx_object < model.objects.size(); ++idx_object) { + int idx_volume_first = -1; + for (int i = 0; i < (int)volumes.size(); ++i) { + if (volumes[i]->object_idx() == idx_object) { + idx_volume_first = i; + break; + } + } + assert(idx_volume_first != -1); // object without instances? + if (idx_volume_first == -1) + continue; + const Vec3d &rotation0 = volumes[idx_volume_first]->get_instance_rotation(); + for (int i = idx_volume_first + 1; i < (int)volumes.size(); ++i) + if (volumes[i]->object_idx() == idx_object) { + const Vec3d &rotation = volumes[i]->get_instance_rotation(); + assert(is_rotation_xy_synchronized(rotation, rotation0)); + } + } +} +#endif /* NDEBUG */ + +void Selection::_synchronize_unselected_instances(SyncRotationType sync_rotation_type) +{ + std::set done; // prevent processing volumes twice + done.insert(m_list.begin(), m_list.end()); + + for (unsigned int i : m_list) + { + if (done.size() == m_volumes->size()) + break; + + const GLVolume* volume = (*m_volumes)[i]; + int object_idx = volume->object_idx(); + if (object_idx >= 1000) + continue; + + int instance_idx = volume->instance_idx(); + const Vec3d& rotation = volume->get_instance_rotation(); + const Vec3d& scaling_factor = volume->get_instance_scaling_factor(); + const Vec3d& mirror = volume->get_instance_mirror(); + + // Process unselected instances. + for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) + { + if (done.size() == m_volumes->size()) + break; + + if (done.find(j) != done.end()) + continue; + + GLVolume* v = (*m_volumes)[j]; + if ((v->object_idx() != object_idx) || (v->instance_idx() == instance_idx)) + continue; + + assert(is_rotation_xy_synchronized(m_cache.volumes_data[i].get_instance_rotation(), m_cache.volumes_data[j].get_instance_rotation())); + switch (sync_rotation_type) { + case SYNC_ROTATION_NONE: + // z only rotation -> keep instance z + // The X,Y rotations should be synchronized from start to end of the rotation. + assert(is_rotation_xy_synchronized(rotation, v->get_instance_rotation())); + break; + case SYNC_ROTATION_FULL: + // rotation comes from place on face -> force given z + v->set_instance_rotation(Vec3d(rotation(0), rotation(1), rotation(2))); + break; + case SYNC_ROTATION_GENERAL: + // generic rotation -> update instance z with the delta of the rotation. + double z_diff = rotation_diff_z(m_cache.volumes_data[i].get_instance_rotation(), m_cache.volumes_data[j].get_instance_rotation()); + v->set_instance_rotation(Vec3d(rotation(0), rotation(1), rotation(2) + z_diff)); + break; + } + + v->set_instance_scaling_factor(scaling_factor); + v->set_instance_mirror(mirror); + + done.insert(j); + } + } + +#ifndef NDEBUG + verify_instances_rotation_synchronized(*m_model, *m_volumes); +#endif /* NDEBUG */ +} + +void Selection::_synchronize_unselected_volumes() +{ + for (unsigned int i : m_list) + { + const GLVolume* volume = (*m_volumes)[i]; + int object_idx = volume->object_idx(); + if (object_idx >= 1000) + continue; + + int volume_idx = volume->volume_idx(); + const Vec3d& offset = volume->get_volume_offset(); + const Vec3d& rotation = volume->get_volume_rotation(); + const Vec3d& scaling_factor = volume->get_volume_scaling_factor(); + const Vec3d& mirror = volume->get_volume_mirror(); + + // Process unselected volumes. + for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) + { + if (j == i) + continue; + + GLVolume* v = (*m_volumes)[j]; + if ((v->object_idx() != object_idx) || (v->volume_idx() != volume_idx)) + continue; + + v->set_volume_offset(offset); + v->set_volume_rotation(rotation); + v->set_volume_scaling_factor(scaling_factor); + v->set_volume_mirror(mirror); + } + } +} + +void Selection::_ensure_on_bed() +{ + typedef std::map, double> InstancesToZMap; + InstancesToZMap instances_min_z; + + for (GLVolume* volume : *m_volumes) + { + if (!volume->is_wipe_tower && !volume->is_modifier) + { + double min_z = volume->transformed_convex_hull_bounding_box().min(2); + std::pair instance = std::make_pair(volume->object_idx(), volume->instance_idx()); + InstancesToZMap::iterator it = instances_min_z.find(instance); + if (it == instances_min_z.end()) + it = instances_min_z.insert(InstancesToZMap::value_type(instance, DBL_MAX)).first; + + it->second = std::min(it->second, min_z); + } + } + + for (GLVolume* volume : *m_volumes) + { + std::pair instance = std::make_pair(volume->object_idx(), volume->instance_idx()); + InstancesToZMap::iterator it = instances_min_z.find(instance); + if (it != instances_min_z.end()) + volume->set_instance_offset(Z, volume->get_instance_offset(Z) - it->second); + } +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp new file mode 100644 index 000000000..3a21122df --- /dev/null +++ b/src/slic3r/GUI/Selection.hpp @@ -0,0 +1,301 @@ +#ifndef slic3r_GUI_Selection_hpp_ +#define slic3r_GUI_Selection_hpp_ + +#include +#include "libslic3r/Geometry.hpp" +#include "3DScene.hpp" + +namespace Slic3r { +namespace GUI { + +class TransformationType +{ +public: + enum Enum { + // Transforming in a world coordinate system + World = 0, + // Transforming in a local coordinate system + Local = 1, + // Absolute transformations, allowed in local coordinate system only. + Absolute = 0, + // Relative transformations, allowed in both local and world coordinate system. + Relative = 2, + // For group selection, the transformation is performed as if the group made a single solid body. + Joint = 0, + // For group selection, the transformation is performed on each object independently. + Independent = 4, + + World_Relative_Joint = World | Relative | Joint, + World_Relative_Independent = World | Relative | Independent, + Local_Absolute_Joint = Local | Absolute | Joint, + Local_Absolute_Independent = Local | Absolute | Independent, + Local_Relative_Joint = Local | Relative | Joint, + Local_Relative_Independent = Local | Relative | Independent, + }; + + TransformationType() : m_value(World) {} + TransformationType(Enum value) : m_value(value) {} + TransformationType& operator=(Enum value) { m_value = value; return *this; } + + Enum operator()() const { return m_value; } + bool has(Enum v) const { return ((unsigned int)m_value & (unsigned int)v) != 0; } + + void set_world() { this->remove(Local); } + void set_local() { this->add(Local); } + void set_absolute() { this->remove(Relative); } + void set_relative() { this->add(Relative); } + void set_joint() { this->remove(Independent); } + void set_independent() { this->add(Independent); } + + bool world() const { return !this->has(Local); } + bool local() const { return this->has(Local); } + bool absolute() const { return !this->has(Relative); } + bool relative() const { return this->has(Relative); } + bool joint() const { return !this->has(Independent); } + bool independent() const { return this->has(Independent); } + +private: + void add(Enum v) { m_value = Enum((unsigned int)m_value | (unsigned int)v); } + void remove(Enum v) { m_value = Enum((unsigned int)m_value & (~(unsigned int)v)); } + + Enum m_value; +}; + +class Selection +{ +public: + typedef std::set IndicesList; + + enum EMode : unsigned char + { + Volume, + Instance + }; + + enum EType : unsigned char + { + Invalid, + Empty, + WipeTower, + SingleModifier, + MultipleModifier, + SingleVolume, + MultipleVolume, + SingleFullObject, + MultipleFullObject, + SingleFullInstance, + MultipleFullInstance, + Mixed + }; + +private: + struct VolumeCache + { + private: + struct TransformCache + { + Vec3d position; + Vec3d rotation; + Vec3d scaling_factor; + Vec3d mirror; + Transform3d rotation_matrix; + Transform3d scale_matrix; + Transform3d mirror_matrix; + Transform3d full_matrix; + + TransformCache(); + explicit TransformCache(const Geometry::Transformation& transform); + }; + + TransformCache m_volume; + TransformCache m_instance; + + public: + VolumeCache() {} + VolumeCache(const Geometry::Transformation& volume_transform, const Geometry::Transformation& instance_transform); + + const Vec3d& get_volume_position() const { return m_volume.position; } + const Vec3d& get_volume_rotation() const { return m_volume.rotation; } + const Vec3d& get_volume_scaling_factor() const { return m_volume.scaling_factor; } + const Vec3d& get_volume_mirror() const { return m_volume.mirror; } + const Transform3d& get_volume_rotation_matrix() const { return m_volume.rotation_matrix; } + const Transform3d& get_volume_scale_matrix() const { return m_volume.scale_matrix; } + const Transform3d& get_volume_mirror_matrix() const { return m_volume.mirror_matrix; } + const Transform3d& get_volume_full_matrix() const { return m_volume.full_matrix; } + + const Vec3d& get_instance_position() const { return m_instance.position; } + const Vec3d& get_instance_rotation() const { return m_instance.rotation; } + const Vec3d& get_instance_scaling_factor() const { return m_instance.scaling_factor; } + const Vec3d& get_instance_mirror() const { return m_instance.mirror; } + const Transform3d& get_instance_rotation_matrix() const { return m_instance.rotation_matrix; } + const Transform3d& get_instance_scale_matrix() const { return m_instance.scale_matrix; } + const Transform3d& get_instance_mirror_matrix() const { return m_instance.mirror_matrix; } + const Transform3d& get_instance_full_matrix() const { return m_instance.full_matrix; } + }; + + typedef std::map VolumesCache; + typedef std::set InstanceIdxsList; + typedef std::map ObjectIdxsToInstanceIdxsMap; + + struct Cache + { + // Cache of GLVolume derived transformation matrices, valid during mouse dragging. + VolumesCache volumes_data; + // Center of the dragged selection, valid during mouse dragging. + Vec3d dragging_center; + // Map from indices of ModelObject instances in Model::objects + // to a set of indices of ModelVolume instances in ModelObject::instances + // Here the index means a position inside the respective std::vector, not ModelID. + ObjectIdxsToInstanceIdxsMap content; + }; + + // Volumes owned by GLCanvas3D. + GLVolumePtrs* m_volumes; + // Model, not owned. + Model* m_model; + + bool m_valid; + EMode m_mode; + EType m_type; + // set of indices to m_volumes + IndicesList m_list; + Cache m_cache; + mutable BoundingBoxf3 m_bounding_box; + mutable bool m_bounding_box_dirty; + +#if ENABLE_RENDER_SELECTION_CENTER + GLUquadricObj* m_quadric; +#endif // ENABLE_RENDER_SELECTION_CENTER + mutable GLArrow m_arrow; + mutable GLCurvedArrow m_curved_arrow; + + mutable float m_scale_factor; + +public: + Selection(); +#if ENABLE_RENDER_SELECTION_CENTER + ~Selection(); +#endif // ENABLE_RENDER_SELECTION_CENTER + + void set_volumes(GLVolumePtrs* volumes); + bool init(bool useVBOs); + + Model* get_model() const { return m_model; } + void set_model(Model* model); + + EMode get_mode() const { return m_mode; } + void set_mode(EMode mode) { m_mode = mode; } + + void add(unsigned int volume_idx, bool as_single_selection = true); + void remove(unsigned int volume_idx); + + void add_object(unsigned int object_idx, bool as_single_selection = true); + void remove_object(unsigned int object_idx); + + void add_instance(unsigned int object_idx, unsigned int instance_idx, bool as_single_selection = true); + void remove_instance(unsigned int object_idx, unsigned int instance_idx); + + void add_volume(unsigned int object_idx, unsigned int volume_idx, int instance_idx, bool as_single_selection = true); + void remove_volume(unsigned int object_idx, unsigned int volume_idx); + + void add_all(); + + // Update the selection based on the map from old indices to new indices after m_volumes changed. + // If the current selection is by instance, this call may select newly added volumes, if they belong to already selected instances. + void volumes_changed(const std::vector &map_volume_old_to_new); + void clear(); + + bool is_empty() const { return m_type == Empty; } + bool is_wipe_tower() const { return m_type == WipeTower; } + bool is_modifier() const { return (m_type == SingleModifier) || (m_type == MultipleModifier); } + bool is_single_modifier() const { return m_type == SingleModifier; } + bool is_multiple_modifier() const { return m_type == MultipleModifier; } + bool is_single_full_instance() const; + bool is_multiple_full_instance() const { return m_type == MultipleFullInstance; } + bool is_single_full_object() const { return m_type == SingleFullObject; } + bool is_multiple_full_object() const { return m_type == MultipleFullObject; } + bool is_single_volume() const { return m_type == SingleVolume; } + bool is_multiple_volume() const { return m_type == MultipleVolume; } + bool is_mixed() const { return m_type == Mixed; } + bool is_from_single_instance() const { return get_instance_idx() != -1; } + bool is_from_single_object() const; + + bool contains_volume(unsigned int volume_idx) const { return std::find(m_list.begin(), m_list.end(), volume_idx) != m_list.end(); } + bool requires_uniform_scale() const; + + // Returns the the object id if the selection is from a single object, otherwise is -1 + int get_object_idx() const; + // Returns the instance id if the selection is from a single object and from a single instance, otherwise is -1 + int get_instance_idx() const; + // Returns the indices of selected instances. + // Can only be called if selection is from a single object. + const InstanceIdxsList& get_instance_idxs() const; + + const IndicesList& get_volume_idxs() const { return m_list; } + const GLVolume* get_volume(unsigned int volume_idx) const; + + const ObjectIdxsToInstanceIdxsMap& get_content() const { return m_cache.content; } + + unsigned int volumes_count() const { return (unsigned int)m_list.size(); } + const BoundingBoxf3& get_bounding_box() const; + + void start_dragging(); + + void translate(const Vec3d& displacement, bool local = false); + void rotate(const Vec3d& rotation, TransformationType transformation_type); + void flattening_rotate(const Vec3d& normal); + void scale(const Vec3d& scale, bool local); + void mirror(Axis axis); + + void translate(unsigned int object_idx, const Vec3d& displacement); + void translate(unsigned int object_idx, unsigned int instance_idx, const Vec3d& displacement); + + void erase(); + + void render(float scale_factor = 1.0) const; +#if ENABLE_RENDER_SELECTION_CENTER + void render_center() const; +#endif // ENABLE_RENDER_SELECTION_CENTER + void render_sidebar_hints(const std::string& sidebar_field) const; + + bool requires_local_axes() const; + +private: + void _update_valid(); + void _update_type(); + void _set_caches(); + void _add_volume(unsigned int volume_idx); + void _add_instance(unsigned int object_idx, unsigned int instance_idx); + void _add_object(unsigned int object_idx); + void _remove_volume(unsigned int volume_idx); + void _remove_instance(unsigned int object_idx, unsigned int instance_idx); + void _remove_object(unsigned int object_idx); + void _calc_bounding_box() const; + void _render_selected_volumes() const; + void _render_synchronized_volumes() const; + void _render_bounding_box(const BoundingBoxf3& box, float* color) const; + void _render_sidebar_position_hints(const std::string& sidebar_field) const; + void _render_sidebar_rotation_hints(const std::string& sidebar_field) const; + void _render_sidebar_scale_hints(const std::string& sidebar_field) const; + void _render_sidebar_size_hints(const std::string& sidebar_field) const; + void _render_sidebar_position_hint(Axis axis) const; + void _render_sidebar_rotation_hint(Axis axis) const; + void _render_sidebar_scale_hint(Axis axis) const; + void _render_sidebar_size_hint(Axis axis, double length) const; + enum SyncRotationType { + // Do not synchronize rotation. Either not rotating at all, or rotating by world Z axis. + SYNC_ROTATION_NONE = 0, + // Synchronize fully. Used from "place on bed" feature. + SYNC_ROTATION_FULL = 1, + // Synchronize after rotation by an axis not parallel with Z. + SYNC_ROTATION_GENERAL = 2, + }; + void _synchronize_unselected_instances(SyncRotationType sync_rotation_type); + void _synchronize_unselected_volumes(); + void _ensure_on_bed(); +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GUI_Selection_hpp_ From 9076fb2be1064dd67bdf3e3c81725ff06b427951 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 13:55:10 +0100 Subject: [PATCH 187/236] Removed png textures for printbed --- resources/icons/bed/mk2_4096_bottom.png | Bin 147912 -> 0 bytes resources/icons/bed/mk2_4096_top.png | Bin 372876 -> 0 bytes resources/icons/bed/mk2_8192_bottom.png | Bin 407988 -> 0 bytes resources/icons/bed/mk2_8192_top.png | Bin 813055 -> 0 bytes resources/icons/bed/mk2_bottom.png | Bin 64115 -> 0 bytes resources/icons/bed/mk2_top.png | Bin 162762 -> 0 bytes resources/icons/bed/mk3_4096_bottom.png | Bin 146657 -> 0 bytes resources/icons/bed/mk3_4096_top.png | Bin 369684 -> 0 bytes resources/icons/bed/mk3_8192_bottom.png | Bin 405418 -> 0 bytes resources/icons/bed/mk3_8192_top.png | Bin 809444 -> 0 bytes resources/icons/bed/mk3_bottom.png | Bin 64183 -> 0 bytes resources/icons/bed/mk3_top.png | Bin 162962 -> 0 bytes resources/icons/bed/sl1_4096_bottom.png | Bin 107621 -> 0 bytes resources/icons/bed/sl1_4096_top.png | Bin 284001 -> 0 bytes resources/icons/bed/sl1_8192_bottom.png | Bin 332103 -> 0 bytes resources/icons/bed/sl1_8192_top.png | Bin 689839 -> 0 bytes resources/icons/bed/sl1_bottom.png | Bin 29541 -> 0 bytes resources/icons/bed/sl1_top.png | Bin 20344 -> 0 bytes 18 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/icons/bed/mk2_4096_bottom.png delete mode 100644 resources/icons/bed/mk2_4096_top.png delete mode 100644 resources/icons/bed/mk2_8192_bottom.png delete mode 100644 resources/icons/bed/mk2_8192_top.png delete mode 100644 resources/icons/bed/mk2_bottom.png delete mode 100644 resources/icons/bed/mk2_top.png delete mode 100644 resources/icons/bed/mk3_4096_bottom.png delete mode 100644 resources/icons/bed/mk3_4096_top.png delete mode 100644 resources/icons/bed/mk3_8192_bottom.png delete mode 100644 resources/icons/bed/mk3_8192_top.png delete mode 100644 resources/icons/bed/mk3_bottom.png delete mode 100644 resources/icons/bed/mk3_top.png delete mode 100644 resources/icons/bed/sl1_4096_bottom.png delete mode 100644 resources/icons/bed/sl1_4096_top.png delete mode 100644 resources/icons/bed/sl1_8192_bottom.png delete mode 100644 resources/icons/bed/sl1_8192_top.png delete mode 100644 resources/icons/bed/sl1_bottom.png delete mode 100644 resources/icons/bed/sl1_top.png diff --git a/resources/icons/bed/mk2_4096_bottom.png b/resources/icons/bed/mk2_4096_bottom.png deleted file mode 100644 index dcded1f7ee60133ed43aa1a96399ed4f52bef218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147912 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
  • p8JgTlu%0TP;jd`2|AW|a>=tt(8qfByAmg4=PN5XR2pa~=3BMq~R8GSi zdg~woP3Kn4QFj#fOlz9RKomc93JBpZ*@jg^8DD4RE#G;t^-x8R&1uuV zm<6SpzxgTGze28a!ulzxpOTtWgujsj8F`bu_SoT#OzQ@y>rZ!_v?y#Y<;6d4vdrOr zPJ9gM{PozzqAVGAe`(~L3;ln$hm-K#UojA*p2!lx#EM0J1A4G0mpuM@`%~16?~BJ) zLD>wGK#r1oV3KM30%W?&AY$4-G1PThsGZc;C|U{dB&`T0Nv4lBL`<080}L-SuCuBR zhbBAryE2>eJTEdZ3fm_(dIQp%Putg?lpi8F_~OY z=;H?0>SsfNs5s%iKB;9);d?(MvqJo5`U*S-ak5#(pZ7BvdzPCS#SU-?aIKl)UT%*X zuC?cbnxc$V4NDHFcN}CYfPS6PYKW_*E2{4YuMUDk0;B1xXDK0|1m9gHCk++5yN7gA z!h70+JRAZ_O;$sY(ks9TzvM!W^@4bQXZnD#TX4s3E(z|j-@h)xzJ=>jGWLYJ98h%! zs6`(Jn1=PPKjnZkS52sM4%$h{26qphU8sEcy2Roag0G3xv^**;EzJ>~d>>Fe`vF#) zFe>jNnx|k*qlB`u(A2Zd;*`|5eXFl^PmIHGw==o-n8G5_h5Nht(^Q?oX@Fn@k}_UZ z%%{u^@DagLt|v!R0Gv<-u(9YWEyHYC(MfT@mE9RZtVXNK-iSHyJcq%ot-}k>hqFQ1 zqoz$z3?g(umHo*AJsq;+W!@e3!DxK!^sgv708Hkw6muH&m&^$>xtcJ^Vws6@n2^*a zj;bt&m|T6v@qlF%-e3TuXvJUeJ8+SKMs&BW>5RJKWuyjK3X9=(6{Bq&r=)qf1|`HM z`IeEGqk)!f2R!$A2S_Sx@c7E25o9@3vJrj3SPCG2&tSMn;t+Z|8JrCVPD50N2kysP z@NoeI1wMKUruw1n#0vl+rJ<)W07B}FCbITy7YRIwZ$%fX;wu<{(+tc))13hL%!jnx z=T4bp1@zwuwVBhNDDJIu;88~;(GOMl2eA_bcb`LoB%e3V7QNaR$aBj>7=}ZQ(Bt|- z0RH5W5+j%^*Ke^DgW}k4aEo8hTLu8I>pLHg0d?BT5t_UJJU+l zV55$~XWt8$JV_F*tQDEuSb7BSKW#F$fuuGOR107ukl3UcfQ^(KxlR)&@uR|U6&uj3 z;7B}t-kqHZhlKbh#(W}hQW6(jt`<6GOjp7ZK)dul#lNHQZdH;p$_Gdn>6Ov6xByA* zL||aXAs)V#OqGP)qtiB@jiry(zA!Qkw>k&#&Mq_bBLEf+PlkF3`&$ESE1F(0H4w_q z%bgiX%)`64(?BO!dX*ec2k>seUE*h0qg3$=`ja>YqCQ5SwP`JXPwn@sTpAeM8y+`U z?Ok&P){3quWkM{0^Y)J9ySU=I_xVhbAZYJXu=z?pOPu*d$w>!5g)YXY<=i?J0lF5v z*lsaZxyN(gR3_M~nzCRa>Vl0uOTBq~c(UGHFs6lxTSq_{!_$Ew&LtOeY!Js- z+@!Bt_TA||a!I(axBqvSeslHv8%-AI|A3@SSEeoOCI>DUaX*{>rzOeI0j5y|Jo&3T z$vH~GcdI}UH}?cMVF9tQ8-kGmxR5u0{d%+H@86N{l2jPC{|7qfVvT-++&~sTXCWYj ze+g7$|9Na_7hX7FLBnFf3mFu}O^JEU_R~R-(PjS@J!KH1ck)&a<^y8%ZCm#J_EKBq z*`Hm$tylM~-;#uU{Hwmy=Cg;)uGC)@%U&0)btoq0uw6H+)ApEX%awHH-j$D(E3EE zS}J!rt@henm6!an6xEc1Bu|XGp~}ou0;Lm|nG|0-0J-=WpIMb^Q}@^wbX&J16R7gm z3v5{1XFtS4AMzhW0R->6>u`dWFeI5^WBYQJ0+SV!f8OoshYDL8Zg%0xci|wYH}m{T zDB|D^sQ=;~JRW8eH^a|&9BNRY@hm${6yk zhb_SSbV9Rv+o!Pzh1O+b*_Vbx;MBypfihTSq<76p)QejKRw&L8CTkH{90MSlD4Ueb zq4*K!2bn!!Ei{t&x z{AmBlom2n>P3U0ci_-=MMlZ9qa2#G%7le-MgYY+yc8Y(#f9y=z~1_Ci>1FJ7O)N z;jV#_5b>!3j8S7gs382V8yxlHiSUkIz}4+~(tT!PD2(nbckZ<>$6Y{UBt6Hm?V%W7 zxAlV<$Eq;ErTz;bQujQAGB6{msIn(9n4sqP*41eY|3% z0yXW6I`;Uz9_7Wz^rQx;gR3UM$b@u8jR0Aagyv`kKn6!5U}E1yKtlOft*`6#E1e^B za)bw};4MUa+5maFUxh^{gD1QkhC>t2z*Wx6otpqMo8e2rmpm_$!Mn->7IsCcsYuh# z1mbRxIN(VF1mY=1;V<$w#J2)8O=*^8cT1+emI&ZYA8>|u_}-yS?~Bz3ELhhmys`W* z^6un&3@e3DC$%CyX3OZMrc)p3u;!}Xvvit5T2}T=QuZ(f7G!tJ3?ZaBngtU&2w0@- z)!17SwB6G{dkXW-yo~k`){6zgEFq1-!WDGhy?z!N`1GZ~!^??$GpEZsMJGc)+<#V3 zZV|_Se!v@?oEdab==?OO1#6E;SnTWG$UU+APe+YrVqigN;#yD#bq04+LL(rt`cz}c zsE9Zs-al__$0~uFSq@~mt)Mj#FdlAb!bomEE(CBpZLY9p@aKafkU@L4so*}JwfB?Y z8FsbVw4&)e{sL16xgY)*(ATwfkI5>uvUBk<^`3y|31ILXaZXB6E>@$CEbq|o0@)zX zmg3OHrs7wQOs@}1RBfh@aVq{`9C#PF8Vp`T+~VERt0TR?^Bn*s=)E?>1znVAvS{jd zyeNblxXnClse90-r`p-ad8iZ9k7~vvjxm9RhlK{bAj`zeqF9^2$Xc_iYrtDIglQ8n zQY8i)E^(XqWuni+=!CnDeWxT-`61}bdr-Y>bh6j@ewaMkMjHR_Dor1)6w5Bm;s^$2 zrt7{Jm(B;}hJ*QUgNieQY`N18?1nJ~fr<{uUZXZ?yN|B3=pKh1`@zt6?;XvFIJy%m zh2@AgyDy(17^4~R%gv6t)WN~k#5;^e^-87+B1Q8v!gay-mz z=#o-gvc8>RBaPA_UsH&>AR)7;958(Bj<3(pktY{dt_w%IEarOh`&~ca#ecm?4mmp+ z|1H_M1mwKG<~T)CT+9Q2lwHi zdQA<`KmoW`Gbwm)P7**81vr)|`&qi~N1xPyKySGr!&adnl+IC7=~lC7t<*1cOd)hHJK;$g+Cb_wP7eSrQl4e@jn4P%E~d{|bB# zzEHvWoBw`7`WEWnQ5t`D1ub!`kUc84=neDP#D2kSdfokS89q8A*&freY?|lEWCw~8rWYzL}mQj z2aGWS*^&E=6=yC;$)l{<$ebPzE6B1Ny49^CItd&#G@oJzr(jjaN2PfQ*G$46Py}LM)xJDm1|%`Y8Eev=*o&lccfdS|DHg-VXv`?Wt{dSMxn1#o)L>>L56(FC$H`WmJF z2T|4lENWKhmMc?Yl9|RUp)HE7_qdpPI+U4u9I`CVEcztL9HoyDMWMCz$5GxkZ()i6 zS@!&3bgpNhV?QcU{T?RK0#m(5OA(UnZ0?w2z+RgC{Q$_a_xlwvu!z3^|5P~FKyLfs zk6tZ}5AI7=GL5_cN#@3)EdKRNSr2&4*14%-u@KNXM{zuzclpz0M{*tZ`@381ZA;F) zwGSZ|$}lifvY<4}X1T*_|L$DpGy1n?zuP`vi-q66!@yWbX1M7a3nc)sa^i z_7t*mBy;*8bQch|1N-~G$@=bva}Ae-G@uZIph zGj$6|eshO4(0!S|RJz>LbX!J^y54+0Ll}^gcYw#py<&{=e|P<-XvdOD{~Rjjgz>MR zp_sJ#`-Q=KL>NOy!G&!8cEk7wF|Wxb3v@-u<}Y*V%y!FfM!%B=f zYT+{F`o}3PGJ=60U>Pn@R1u>K=N2;gdJ`qGe+9%27py6h_@c_QS`KYfw}YvBT5i!) zgwmtx%INF`-u>J0pMPgc1CnF~)YgWtdoRxxDa4&(`j!qL3rAxHq(U`&F*fwQTN9GC z*9XkU$o3e02AX5}a`p@yAV%l>3*_-rS1a~2*;Q=#IT;p6he0L&sJk`A1F%LBBYrwn z-UO~KnumDVw@==5N#W=uwz=8|n*$-Bl5btW$0yK2&hS{H-%n&;x; z>sHN1W^^>i>tu8-_c5StgQ70h&6bNNC~9U9nq}QyFUgj1+nZPl+z@WY4Wz*C`FYP) zFUN{3T@oyU9%L3-y=H3cuA{()bK-MnN-_5>fYVmTIWvU@r{7t|upmE7WY?cW)x&EB zbK?Yu*uIa8jD7}OHICT(k;>@c{6Uz}HoBJrHRaZj#YN_}j9NtlEagK^uHiUwG5I)l zRu;1>Bi#|(M88iFnsNb|!i+TCYXvPx@i2C-%}fCTJbU|_Gu6@4wBv(8+wmin{=l;< z$;-*rcGD_e({e{=u{?QvdavB9DT*p4?{v~k&lNuU#e49uMx&UI9!d&qo|4<;<}$61 zlGwWLMl3(>4+abq?BRxT74-p5Kqb;}z|w?=(H-Q@^`Ao}@Ya@zaf0L0b|)s>Q?>z~ zKqpX*B9p!-u%nJsHGy$boDT2Kt?~Te1ijqd_;A=H3DyaK5j*AJJ;{1!Y`L@nuAv{O zgy(#wuf@p@Pp$6ta(?j0!;zqp@U-iknkqZ}@K`elr@vAOj7}r zL4k=Sbmv_e@nBON=R}(tToeeB!>7UIZGdQm;G+cCko2ZQ<2|q;%~8M_B_ps&PBw5i z+FJhY$F_+^xFGNYi@kzY`h!@?K%*jvtPBb&z*!X*cf#ESg*!3o0}dDrLJ^O{16u+1 zqy^VMIMqB>0l+_obbdwAI5%(tI`r+E3-{vp!vW0~9E1l>QZJ3A^?JHs3?HLN0Gk1z z=R*M8{0>nT97-2wf*qgKTqSmJ%4otE#Yl_P1qJ71HR1HN6x@~Bf#iLvzNw!7fh z^kG&aUy2^h|1k)^A1{XXFL!(E#-%;_`xq=tAUw;#p}N8ZH9a#?xF*GaZz6=OwcjIm zXD)#h)r49p*-xskBqNI_=&{wnHELA_6Gr^ivq(5`O^M6=f@VP(BsY#rLFvj?oehE( ziTn`nj}Z0MQ1HfaXNzl%3$ec5AUm3eASC+))97Hy(=$Fv$x&=&J;n@#@w5yruj%6DTvBi0wfhuwu0lK7`EDq>tB)D>Ic9To<=$Mya8NC*m$mVHERK9S)W zUE5x>Yy0;ZLQs*kY#CMIu1!FAEuUzf@^WzgOGDcqokPS4nYJ=(S#(>hO{LX$lL}bq z4fSj-B>4iwH}+)4fe(!7ZChvdww+8_*}eD>JXB;i-+IW)<_lc+=d2bnnpo2Dxk(Dd zMsE4Js03p8*IMQO;zkYnZ?#?v@v({tbxzxxfhczq)dCcmDGYABFUDvUeH3Xbs*n z!ebN0`81}S5+40!ygaWhEpD>dvu6ZpW#{7Q89}91+Kbcjd{#45Yz31t|0JZI>$ZQ( zeiKH-|ERroZ7~L6bJB`hwRB3#mF|?D(<;j!j9zhn#AqSXKDji-xI z=I-tznI8OwomtOw0fE5R3u(JxUL3wj3!P8L(C$BN0NQtNXe&z?^URL49m8yRdtzQJ z3%~zS1Ik>j|F?_>ULO~=bgp1sZVX*^6C0HIPGym$I~H1N{^tL0ckW6Tn4|v4{T}`( zvGNIFSSlq0OSeGXx-9#(Ga`>K{a_%ls`FblxBMh90Bg|g^G&<(`!~1o7zY%ql@Y`i zX}`?lX$wJ#6>=v|>3epz^YwbMKtKF+4rF~$xPR8mgX!-!gboR7j7kmD>RIgA$rYNZ~22j`g zORaw0Oxye*Nttk{!~vDX3SwMMKYR$*fBy0muK5O zJUc>36P33IY~E(@!EBk+U6)2E05mBQ=Ag_fRVSg8&i=}gE2HumaBzoIG~%L(o4fCq z!0FqLvCs~H^Y-eS!mWD8Mk9ff5=i1ow`1RqV+D;gspI{6_3m8S)~dk|ny`b+g?(=$8Q(cTG3J_hEgJLM9 zKk7QV!1EH&%r65u_LI5}ja&0h6;6-A=;weUB%!AdqdKJkEn1Ix7S(>M(l365i(j>6 z*SPh$v#P;cxJ4)7L$!aTga!RU)a$kcCjo37U_rL;4r3E7KhLv{ejPiBgw{)J)&)VQ9>^~$B+jG1R#ws6Or;3@l;cj zMIy*=+Uo@GJ9gkGmK?${V58H~j%sfO&+AcyWUXZG%dNTfm@sX4a|Jib>Bc>#7u>bkz$+MP;Ofm|PqW zlL|o4mbb~Qkm5#aZQI8&F;=K`*#^j)=Rh}TzfQ~93dt#62&!O)tSmQFgDjLU1S#WN zv{byT-!z)Lzh+W&!(Ra*p(d?lb_}lXI$W3u&la8SKZ`P32BsZ91UiJdnoyf+uP$mY zT;{R=OmpZ8mRcR3{>w~Tt=((}_*qI!Oh7+&vfH#m?wmBf!TW)Vw~q>d9Urp8J(=bf zq;TJ6VaVHYYz@>eA|J$7+lk+`lc}5#yCY*N*qy_}(xg2aRm!wRE&0NgW0pz5KJ}GzO8Vmf@S@WyKCn;gEcU8uwLLHc}pJB4*=1F3pu%Dd2IR4QEl!iBpLMe_1FLA{{CbT0%G{z zVy-P|m!E~26UN_cp!`&H=zj`y&1>J!A>n`FkkA&N!#_7!xkW8q(sYftS z`_2FU{4N3{@v{>EA^anepZ}Eut23~G8CXiV1V1xEA}L%EiWCI_C@@DZCiF&y+%|GQ2~>(YBRcrueJec^W_DdeVMmll`Q182S0U*cCVb9NesdO zVRYJ-TNFn`jWAinC9g;1i)xx-_FQeMI7<(I1C)+PUgd6SbhC;x2S>kpMWc}Py5ulR zXFvuO+r!!bUp+e0-4_yjWz)n6z_U=XhqzXI2BG|t!P#)${xdsB!mKz|i=hJ~kp{Jh zcDC|H9Z`8_flcW`$5?3xI0iyGKOVrb+xKRTB%xv@!J&B!7)@t%Tes!mam@L%X)zHV z!@l80Vtkipcw+z<;OzWmHZ*HP>Ni-6J_w`x$B6~(#|wuHe*}92!(1)E32t#|ttT=N zU9&wCeXYu9Vtvg4CIPrKj>s35tEC1`1j(v*v(Ds@-BCg@^-7WWT9}Uro?Y!liD1=} zY-$eQDy@>1H4SRMH80K=-zDxvy->CM z01?`b2UJe+Q?8*`SUMAuCPQErvOAN*_T@2-22{h*1Iy%iqX13^0KIcVcmln33iee5 zX=wj?z@eVlP0yb7M>U3BVQB`4UXg<_$h^Noaue;qApnK6w)D>MISQL9v!xyA<4#Vq z-2{2pUxWFv%eAG6P8yM#9<=I!a}+AVE?teM>AHfndMxS4h?4pew3X%&H0Hx0) zp_J|tBc)n`uI*?Je^8bOif*;3_c;k31{D_HF~PobG4< zOLhyymIrbilix-=@Woqv+`8A8zev^E`6`ywC9Q8a{U<+Mzaj@vhhJpg-`7RIXA5;{ zqA09X*)V>lR(uTJS$3BU+=P3EE`O&7S?i7dcdOVlek3RFd750Vdo{lddt%3Yc9l( z=Be#p<1YF8Q%4xgEX$WJKP9znOafZNkW@^O9n(NqlCd7T-`w{N(_c`oeeC~6Vx1Q9 zqi*x8)Z5}e;q~ssi6oIfAo%SLzq=hM=+gS%*7L91x##klUE5Y(UUvg|dgX>cbZ)%+ z#dqlb#Ybx&P!F%$aq0a~c(di2-K4^yc(Wl|{y3t>#4aV;J|()y4wo7Ky%D|-TGm-D zSxzj-ZT^P+F!Ll18A8iIwUQOL=OZlqZb34&5LjbCu!Yy(Zjh_CFKeKmMf*-lf34Jz zJ|d8}H)WJum05J_30LF3?@|G$=iS?8XWHqEA?dTlR@MrsOj3Kvvjh|A?-n*7PM>7~ zUjqV1-XBLJ(lZq-M+>O+zcQzF#YhB_EA$;)o$WVhW5V>-@OQQ2zq9~5E9RXa6$U-K(eufI>MQpvjqma z74ZXp%XB(Dqg)$u8;8@KZ2h4l3dk zv+n!1;Jn7t6$6!}*j7z*d&-Svz00z!T9KuM2g_R1O>#{cd=SluZh3y@Ns9*WVoF`p z&a$K_s!Di5J1##(l+odlk32C8gdbqZ++ajp3Du?ure0r+Hg{*prdaiCkTv_G7f`vh z!Bg9cN-nhJ-N}@nsZ^9^%=l z?d-%GCKrmX8g-QR_qM!V(G)Z~bZJW1BQQuMC*gBsRjHmCztQ%{_-VgNa>mOSm)k0H zWe&Q|3YHd5`f;R&xpjyioTPS<)nC34m^6{T`Kl8Wor8_5sP*4cQ#j$r0UlVpIj?L~ z+mgdQ8@t~=-lwOSkW*uusH58`a6TmUjB<`|nNhLVJ$zrk%IWrO1a$4-)@r3hm_4JRT9f?8gt30wRAF2wT z2{Nil>1cTBMb@3;=@zA=TM4cc0s=kwPHV$WOGLmG+h#)dLgc$i zs?X|I?;Oc-=o$EvAX4+mUWMJ>d|Em9_{X6GxiXg>g>Sa91=Z{ng`Tt&Or-@LSX*+5 zP}kz_EYLXop;r3ZWqHNtzIv1{vg@@g@`@g}hHBmPaYi#}M`8BiS$}PFsY&^&7F(>u z=PUbuuh0um88j|3mW#>^*GawOw|13>XEoWHAcaxg!qqbYf(xoLg73$8<;rAiH`kp} zL!{t&fB9N?Tr{pi(jugXQLL9fKK6*QV0-iMja)sw8H`r!z5xD?Q7QAcBirO{oN{(PUEZJWHo)XpQnIJTI<5rjBOnx#>5u zO@?O_{Z=4b&oP5M`gMPbK@+c=i#tqy5N#v#WEh2ewh`(#Q!Z5aQ^8|YnyGWR$tZ>z zj&~5aYsQOOb-_4tkV~$$vBF__rk=tP0ZuqME4o6fVYze7IHfLzY1l;SJ#T;g2}g0V z5Gv+u9c-5ng}kw%Oyi~H=CC-ZOW2+^g(L@>8d#*qxVo7lWetrgYf+U`f%$(^DB$#YPt&D9yBh9=c59<)Z z_kQF(c{unw-5&8PNvVz=TX=SqDSzbM=j|M1x%_;(Xg2+|Xb$ss=W99bp=6)q{P$kb z?~t3#d zg-$Tvh?Cf~4{41RG7w|v>QTfL(R_8!0L?y6?WIzzkD%&Ue08CKM>dTwDk&kbXX4lc z%bHuNtG>9j!<1oomu80j8xVq5tNDsFJa;E*{lo-L)_AX#%vpf)I+@3jA1BOT^gg4^PVGy+PEZdIx z7!j`m37fHdb#c08g)K?>hKLsqwfLcdrr{FmQ$jdq$e{CH;jPr-w~`Mi_2>lF*mh6C zryBR7$wv;Icxlp3v}276AtKm5UEA3(dO8>1S3r=(rfH?hC#22#txc1+NJ~A{?&2O6 zP(jQES(c~Ux=VOgJJ8AR(2XLPB1{}cS(Iv(q&4^~@O0d7afkBQXm*t64pcnd!hGiN zITi?MyK|xUr~jU<+lXR7{I(1f@XTJq5yElxRM!GB8QnN^NV8_fn}Q)f zBJfDBO@7X<@AY)hs6D^MnK+fLYY9nH0N{Q(71Kr_y_gh(k0CJIX=tK=OWG0#@X_n?f|_J@qT4m7s3$Bp|40 zinKd|8itpjs@_~MXqxP6Te>pmykcs;IwfLrp}AkUbzDWZm|l|hY|u-hsjA&U^NBY^ z$|OGOgJMh7%{TcMC^{3yh08p&{GYAnu>i9h}VBq2KXHNrA#Vv`)Wm-Wm2c&;#tIH8>MK^|#(G z^aP69FXtmc|3IWv2NN^Ybvj6@x&anBE1>La^L-5}DQqkBJ%?}`3mB%gwONiT{OM~> zk>y0YM6|EMHfFb=oiXB)J_9~n1HPX2x(QEJ42ueUO-irE9?#LB#5`6#kU^H`gi$-O+G=u3{$u(X)*qUmdxMy+z|iqzkNCMqARPU3>Eze~UhW|mY0-U+^H zA0(GYGJ56sEoAd;=(!r)-nAI!-;R-E~PWnw>jF^=cyY~hqU z)xIG3ZuMYmI*QWBuiqPZ5z)0`h`L#HKt6aIw$u1hcKhjV3g>Hs z950B`6WYVDk$MR!ftjDodTpDhdgBR2YPay$up!B>v&Otc2PB;v`JQ!Fm1b>qz5L#& zvtp3oFd`W8Y@ngl{$R)CJ@Od>4<@Omt0l3zffh)Votpf0bA2Fp?&OWEkpT65v__sU zQC?|+jkhn7*6!~CmQTSHQDD0NVfZ~)Yo~%#E{wR;(SnYk7vZ$i1Z!*}mRs6i(Em!d z%P74ecbcd|?BqvP6=y5#y9u^XkPaZ{C%vd^8Zw$CGlvm0kv6&+zu>e|{?yE4>af_& z&&HhSO~r51*O8P*4-aPKsZrv|dT6>tA}cn?!4OZ?j=5+%4L|12*HGGSr(0`vlrz?L zdN`dNBx?QOn91}*$6O&Rgwy#bB|46C<9Vv#yT0C=TlMeLZM7VnD&G|N9~%u%^-vPO5T^N*IkadUOKU~tK{Z$N)0S~5ATp!P|8rOk2YE}r)1JNVwI zW3OB*ommswUqT+>M3bmSm%8)pD5>O0f_Y41Q^Z}5XXHFW64oNkGqyg^v~Y*jn>xY< z&IDyvXc2q}C1VI|{DS6%T{pJ1N@J-8L4uwQ?;DKKfu z2H|0CVr`=TG6ERDBn&M}EcAtXBnk7^4q@h{Jkz?d5jm&w_)$*&19n6-_wv{*g)AtM|)*)?G zdxbJT>T_UWe!M6vlCo&(N;-pu*r^$3#3gC@9<07lYT%i%w7Y(KLRc5rCXcKjN(VW- zu|GE`?}OEF>*p03eO?*s#xVCN47W zbKkPIcAX`(Vrgrx(Ka-#j>L8tnR$j;yCvc&9%d+rw>6_GzUg*4B3e}{4{_{Wd!?f` zWGJ*ai`Kghktu}uqo+8zZHtrgAO4nnx57YYOK`OJQA(Qw+k=VdPOQ1{0BnzR=AD=b;#jg)`m1qdF3ISbVG5bRZ3dz0rOulnky z`xUy}7SF8nPf!}j4lz8Ce!}8}XQy<3il%hM&4o+z7bN1#bF%nLNrZ`L<2}`1Zj4<_ zA}3%5uAP0VbbO8e8!NP9L!m(GS|q2hK0?O|=oHB^guIy`v9?Si*M;(Kb1|D#wk_X` z9c5y(a&{3WM~~)c2N^ogPR#R}IK6k3)-3;2XqI7htx#ianek+#W@uD4E;&$#H~UQy zCW*cDbl!0Uzm*|hNKM|Xqd{Z?N6G4#!bu%>j<*Bg<}P*)Gc zod(ia?p}TRLp+Nm0=}@?bHesXCyVyxU2*of7JU7X;@Yy7Tzv}ZW%_w4CVo2y|ETQ# zavRR<8Va^xP3gOW`pcnr1~I#lTDdk@oco|cZZ^ovGEGymeGA=mz|qOksnWFeg+^-K zh@k#VsvR4WK;$0zmRU)5t|lelf#*TfZHv@+2@c0kwb)Ab(%^PEw3duDE%@$`xcDZG zZn#gXYxDj$D4WzZ{IHB1MY7a0*An`$yZO?-%W@I@NnpvT} z0b`0U36S&kI1{QXd} z;9_&7P-F>|t5$pB_1h2gHk8L<_}7)nG#5_=8J%}Gb}^W_Be^fELS&>YBY*62R(t!Q zwdru4G{GGlgX)GFCK&rQrNPQ6a|7A{O2GqOo2T43ZT`hGUmQx_vLurW-W13xDrOrt z(!dWik$3ERCv=5w&ide|zNZmJR)*`?bg7$zA3Z;ZMRoj{A7#fP^LYpS4KeU4;$kH1 zR#WHoYm}Wx9-ug_$1EYEF#$ zy3+Rp#xqwKbCHD8y#$i zMO?<=icv>GJ0de{~Yg#)qF97y}9lRZ9_x3GuE-jN2pk@C}V0Y z_-=2SN*;IXpcB=Kra4ZzP1eB%MYomizuYcLy;GiDo*hcsLa4s>!Cp{gC6unr!e<`tYFBhjzMjWgGp8O7`8>SYVMn^BpoO#%Ul5fSSH^}9d?xUlB-`wY z%?#12#opR@<5BvPwE-?>14i4@t|PUY@_Y|dRz7f3eQE4H97~=trhFuSB8cUTs`MA2 z8^th*HKUoVVpL09L;9ZaLZ$l(XV+GIDbL<_v!W`u*cxk~JCv$o9?-pyM0FtmyBNbS z>%ZmVC%&Oh1cqN<=)E*#Iq57mKhl=ufuZ@i{7`AZ)?e0}rutqqQJth0#+nvA{;*?M zLpSJjfZweO?`LEQL{3(^dMV~=Y$jG#^F&Of6j%p0I(u7Aop)|0(#OUq~U@X$O&KVX> zq0j6ZyGgJxXmpDDot7^j?}f7l15SZWN9*lSL`=<-*$Z!M%?t8Bg`OSFBIjTOM6Le} zay|k1v>64GUXi5;SpHw8%pQG^dK@Y3-*c$)06&zz0=6&`)>NOt-mH2$SSzFC7I>4a z#mRmB)`#3+LOS;o!PaU0qlK;r^ybg9^tSYulZ6%qIxQ4Cg6koek+;W~#lWa!WQ51_ zM^=xFxu+Byr#$6r@H3@EksS!FJ#K9@ zeH^xR|1~pylv;YzV0IVHtH43FdZh+wBKXxgSIn&ELG%2Jh?(H)=aOoy5(4!yL1jN} zQ%Ur_72Ou1{9p{pooMCMVMG!6uGF~#WziujRDxOrG~~o|T*uLM03dcReb{t{bg|6>^EJ-A zbzp0E-92rdl_0q<8Q>f4;u&$+V}~{;hth#wdghUz@HGaI$SYz>fC~40ceP`eFY#zSs}j<~y}SMTypz{^z}`Q( zI7!F0$6@c)=GJiQHl}vqpo$>h(sdWT91OEAM8v3~$S2hJ`hU+i9{$1!(-E%nvdqDV_sZh~&QdvS{-%jk=0 z7m+??QR`h`0*rByy`rEU7pkEmO|n*Ya4*a}xx%e67*8qBuD>bPH_#y*Nxx0*RNqDY zLZ)Jc4Z3`}pis^Eu@UM@&ejc2xDcld6!- z%uvhGSt;&Rai!9!c;gxT!)l&7dwzY>>G4o9?GyQA{)f{|#Z&B7hH|aa$(98ip4AV{ z3~lK$dErrn2^OmGz6QVP=b-@U-dHWuT-GoVL{P1Hl6u_YPHR(y?S-Tbl`4;?X7~h3 zFGxKhmFI(VA!HXjXQpoz0FTv6-<(a_=dGzi7`{DzT?*scN%p!}7Oj|Qb#0*A?zhHI z*!F9M?HIP|^kRF1aKp>F{?DwWON~U-CJ|;A&bK8ti+=tv-Ttt}{`xpoQfu|zf%61@ z``>D_uRx1cE00HFeN0ZG)Rt&hVl`pw}GwY-cxL%Y_*!=bbk8!=E|;O zg1Ho?@3q}MC(BF~<92&BM7zg3F(ZEyjM%!;qkN9<>cZ9bP-_Ux@RH*5K~>R*bvR;hjVRljo1)C&%B-usvepAhm3P_mnx=+8P9 z8N4&AnL!BUq}g|J5A(tD?dpEvVguE{hwjuTE{{H2KB{*3*dl$k1(eIa|KWOd znSzHm_?4-*w&mT5!#HkbEbn*cxD>wP*1>Au8yOKG+=k9^(E7xo^tQ#x#=&qy?>NYo zimlyuJ{B0Y&T5F6XD;$QVtNu$N0cMY$K*O6Ac^r4+#q`nm16LGa5LgqC^ZLOT7=QrLUyEp}}pLFD%r3Sy9Cwylw=>qB>ohTB)|1v{ip=ke5=L6&)o!(G4W z%oGQC(u%^icYRu#L6Ayf{$P?{O<4$LD9p4%#ZjQMQo7@Yvppr6{QKtL8*v6hym_}A z4R|h)CGLuW)xA|}c?=9eBz7jM?V;}^>^~%wTxbwxI(zA8f8f=-9v|*h(#wB&)fEty zb9zR{tfQ%+DT1^0!H2P%2c~iIf{p5Gd%QHVB3)RaN{z+gBHdw#@BLUV*<|l8nIv7I zgd@s0{eeGk*0e>3QHKX~2C~aXX5#n=V{DvzIa4p=qK<5nMS$}3>4&Tt>+&XgUw;}(e|(`mHNO$4 z55||au54g{5OmA5qB?F|g9P_k?PgvcWAmkh+=QoxI~Kxsg^(4~M~h7Zyk3pwq=^eN z8f>>8kXLvFjLTXK%Kd|3LGpXf+<6n=S8880=05$4nJ^2I@8Iiit~y9cwhp3oPCS2X zzS(Yq^{TobZ&9yB`gjx6u>#Nl+Ev??m8z#&_Lpn_=^l_Y^Dgf+rSGLAkF^#`fp()^ z{g!TR8TQ^eHA5dE{yhJ+5SWFGJq7Zn+aqCI3A}mJ>{;GxSTVDvz_72sCPY@(KIB)10ZIij8FpE)eKHg2OAzu-0 zds$-E;Xe9h!sd(hk35>mUe~N156Ya*Q>WfUBUBY9 zXL-5Ovd?K7p6?X+DiUBoe?j$=xG~mhsn!wz8EjqU1#odrKh0-VI1E>_4WG3LG%>X5 z_sK!wyMFnD97`40(1It`MaF#__;8o;@q+(2__C?%6_?koCQkoDI`nfGf6$*z>KN`6 zH;zt8_eld!vcw~>VqH^O)fNEys@MPH>b(P+I^XwU>cUZ^PGnc1PzwUe2%FZ03IYlw zK}Hw?WiLY@kf24ufuN$YL1iZ)>=huOjDRdH9s-1bGD{c{Fa#13-Uq**R(~&l^`ExS zdCqOWZ@Q04fqASDoeShi-Z1_z<)+62q5?0`Y?B&q+<6g*UoeWcOVk}DnH`u;IvRp3=qr*!98=okp~-&!`q zl?KAKJL%WMqhImKPYxABez$`YoNl@?iiW~(2U`;H1;E&1>D%hKpZ}e%SDlrA+=LiYiS^6A9C!v zxM*n+r2l^vstG$prf}NP_0>W0sZNUO>3_&pLw=s#3E&>WyT@u#=-kJ%VP2eZ?Yoo8 z;JR_EW}Omvs0&iyZVk(TsAHLYM-byRj3 zzLfVTdVb$*O@_aLwVOI=F+=;ow4a9+jp7huY|V7ZDN~>SAm2?_V%OEhBWcmZMj};t zIJ+hco%r~zaj*&=|IY>VXg2TZ)OJvohSFLU2Tb7`Lu1PR28H@LyvpNA{D-VVo2|WX zyOY8*e&TlBssq!}JBsl|D**YC_0?+M}T&pADgu=s=c>S!=aKT*~`cKZE-FsBL zXyBI5-DM_}T&3zp>#r1N{{5)N`@O8SplCDWsccZg{@xlvjH5H;y_F24k0bU zW~E>0i*6aE=K?>ln$?ji3GX=v5{1pzxJsG4^nT+*$<=kU+qlWLDpM)OsV7l|__|N! z@4eQR+PTyA@4D6Pl9X(z(6hN%>{zO=Np_?X^@I<98u&pTEob6DMb ze(HRHfDK%iG$|M{YQ~Mcq|D{8*-rDe8M@(u5}pM*&J3pU@WH=^WF<~yn|Y&P*#K1E z0JUN9fQW`PLaugQz4(f10C*kwaJFN)F#OVT)P;q zWU0V!wSg92As*}gS)jB`i zEIq+sJ-x^fhEy&ed}~mSwc-f$$NRjf<%c%I(9t?QpP^g#9oJ2M?2n}AQIt-xpfJw z?n|(ez7=zJ58GnDw)572vVSWIwsr)30aiHQ%WnLhnAoYd;D<4yorb^aP>F!KQwmkn ze|=7utX&s}k&xRvKTfa~A(J>HZ3Q|Y6>#jeK4td8B));S3KuSzN(EdUsgzdwh`VUr ze5tkz#4KX-69_hTV0y)HjHpLlh650&1NhC&Qx6S8Fd(&;`W9xMtc{XyHt-BnP4cEB zZV<^<%qlGOSJf!>GG-|%k=lTgHXHsdnpVKYcY}<5M`}N9?&O`aP`~6C8)e5AM)!){ zGsPEE)+Xwiha=3}^k76eIIb9bk<+C(zNPB#(9{3oFh0{mV7$!Ksk++zTNoWAc%?sUzZ4Q}}mfq<7%JmeI<#Qh`%*^sE~t zPtA}rtCjIAwx?T^uA1q_9mLF(sis&HltD+-_!FzJ#;vmNf_tOCbW~K=MVVM1Z{%?a zf21DTe00ADSAmoc>n$8%67p?K5eWePKE4SO*tt{_guyLKmR`f#q|1Y?9vHB%Y`NJT zaUR`y{24kJeS!1v_*1Y_>jx0vEd^PAJhW9>7=NRLERrtqfAb`~*K6~B!FsO^yza2> zaefwPZ!SBA-EcGcRY=voKj}_ra18kip^^b?+E4=UFH9)jHJv1 zcff&fE(dmab05#HuBOsf-N2F0F~e*Ov<Lq%6Sa13kIr ze%9r|T#5i(aiz;Mir->0i>V;Tc1e|iw>6lmZ5(ma0Jof@N!&o*6b!ti*mLg3+}>79 zUa+3ez4!I9T^k)6vMC?iIrV{eT&wO9vqy6lH>hQA{cQ!zgPr_xmTj7`0#vVMC@i zJ`I*;`vL(tHe`ioxQV!GhLqC9*WNV_s5@{xCE!i~Z#Y_i|~Xeq=WnP z4ttT}hxzBOyS(-|m~pyKrR;^jK0};0C6D*L*&L@huUX}LC;N4mSJ1lN?HLPp${KtrR#hz9`i+mSdX^z76-_MC{q0 z?E_Q%T=QaK%lgy*rqU9py`cTK+#N)Nk*c)v1b4y@CJ@yOT-THl8&r>zM(?ymd;07N z7*PBw%XyRM9bPQLrPsqa95H`>VzhFiMHDs|DQ{bC4qHaJT`NI#tUPEG zjw%$EW6z?ucYAI^9y0T`%xo-YV(7~w4_FG90qucn7tjxH#~iXA#8!JFU;6)O+7r%Sc71YCwRj#N8UJ9_f4B)cN`?ty)S(PV z_2)c|c~)g&Yg9_Hs5}=U#dxzb)bBzCAQ}sya_Rk#BO9@H=p=8NB)d;R`iX#)dgkz- zsD*;rfOhLtr(>~hL<3usd`z!CDF&?nmnQmq0K>k^PF9*l^ti&v}3YB_5z$Bl9+pW;}&n!wFF z%{Wz?rwYng0zpXRd2>iCoo@Uo@@5-FbZLy~&5BQ}w^+S#64iPuC|NX?8RxJ*1 z5josGph8QFGf2~QxOO*x3PYsBgwZ+jzF|i&8DN~Qk+T+9NqC$yr09oC=*ywz6+hU! zgC%1!?KAUuy?niA%k1dh6aBj%H1&u7-j{|9!5cF)*2F+|sG7FPa=JBMV*?0jClZ4O z8sV{sI!Ok(dtk-F!c)hkw}byhn7F|n9P4i72Q@3sYQihTLcK0L*9tIDZ^x@9O2apF zTbCA44L-Xk4gF3TBd-JAfX0^o^zWitP2Y9Uq>y^N1zO!DqIRq$ttyI>$_j_JdsvN* z(>2=os%zmp%D>!WO)AiXW@2J<^`feeEH1d|UBrrEWt+3jO-9K)@?}CDNX;MaS%y@)6 z{&wYJe_mZM``BQiegW41%&AVUt#}a_Q?#q@{IW!fxqh1H zzi+?D@D&WhTf+Ck4eg?dl463;_maDy^-1ee5aj@=TK4w8{X>7-0I^M8p~Ylb@Jm3a zEm%lx`(lPbko~Qgd25Q6VINYfUK=YUu~VA~Yp0vNJ>1A=s{%N&(7rb~aupHG--G#D z4fo2611{88xZf5G7wXsWV9Xy5|GgK&Dbbf6bk{8OJrM!e{_NCiF=DTi|DA*&GxT`J zY%yWOA6dC-3z=??!Y+R_RPe^N_4>_h=_F%g8cz3Y5`)G4AYn^Sy&5iGgfE&=%%q+{ zFCU+$=M$?hxBW=FJQ9E@CTmG@NB_LU_JS4r|NW?7C-ThyRm9Em&8v9_$~Wq6)KoHf zwC>f19S>g5O37VEnMTx3HR(jSHb-|GBp_)DglR3q7hUR1))YrlxpoUUy2ueOyls-3cErc3WvH}@G{yL|k9E(O=3rf(*ouEA{SC$bq-4;n6CuOIgaoOv%%&Lp=CZ^H}^ z7S|F3!9ndfm5E?h6s5&&a9CUdqhjs)`&d}yb5YXK|7)SZ{X655;|vTuwH8ih!M@8eR<)HdTDHmkuII1Th!Jom=4n& zH9LOrPIk~v;7%MM_S%3TuBW&xM=kJMSkEZ8!Fsx%NQ@;fF0!@4EmwV;w>6m^0dVr0 zI9&PBlvb3M|JdL;w1D+0gur)ZvLhXd*u|%B^|OyIzN6*UL~$7tE9$<<@1j^b{@fLo zho9Q6Cbh&6`Tr+^2HYl=q7+*+AJ7)w)O~icH}dIrE8*|Ya$}4wLPqeMZZ(GnW8$T5 z#z`?1!vrrntM@if!XckBcfma>Z^rV?IZQ~m=543>9ErsBWp<|gOl%KaYNo<;L-2F<(RzEOakzRSncy-k^0`-e7&#!5dfn0}Or%%g;I zEKk1=g-ieuExL4G8f4j{4!JyM^sKhQ!Wj=FU7KLW@}B-D9zt0J$wUOAhj;R8G3Z>- z3N~~^jA%7PCQcic!~jd?|NZrS{9!1oI{GKl!(Llh$MrNj#>Jh;t-Zxm!(iE11bwI} z)RT-P(b5&sAKC#G_pUpeIfp=QJ51|<6mA2CLVD~0;;4V}&ajHWFDP}HL;>?>`gW~rmN4;XuvN;bjvH|s~|Hf2q<~7-CxS$+dgG;4*G=oZ>Q4Ys*m8u$^ zkVR)r|Jyc*4Aevwl1DXWVzRhrj^4a%kUMDpGj?f5l^*`iSfq3FTfCcYw#(_Zmjv$b`7KlQ&A5PElQzRnzLf&_x@mArF9!Y>kHxL4S7$|CTemxGo27-TZA9q$%df4BT`BQ(w zw;t5EEmI4B<)|=ap0Gzf$i9pdS|E3=A%DnH7vBSPR}LXa<^K(V{>fG~77L(bHAQ4) zz7MLe*7u*#^$Yq9u#dbs#cw|1x8==gLfJqgJ8RLFk!2S>PJJ^$@%F7lx-rgd0vMR$ zz4lLVM&V0Ca0bkOOY=OzpzCwkVde=!W7<_aRMEoK46SIvNcBU@)Q!LI@+(ss=jRso zi_U(tcG+aPcJd% z3#2gGcFrg3U+^?H37-o53ul6fDhNcX1ID=i4UNx-PHZ-6c9+-%LeE`X{vaf0R+5!( z6EOI(N;JWcJk&lNACMx`_Zv`4Q=54z%G*7wu2zz*1J;Ci)bYFkSGt zvyo{16MX0afsgRq4T!(VFMHvpTIOw38;&RhfPtIEPds~_(aVq{}2zxVFV$HKJm}wMz_>8w%^al8J2a zX`?O2#Kf{_!I=D?Nu)*q{OUUb)<}~KF5BhRx}TI%u@DRBeWogbz6ip?*SY#C&%61z ze?fPafWzny$I*P{cn9wI=;cHLWb&W&;v{q*vD7!6qF~9sJl6 zI{?Rep`U?N@KLYDQ*)OHReKEYr)5XKr$#Hme^-Ws%*Ty&BMM_;K9tT3%3%Co?X<^_6 z9O)D%B$>DQNRaoEg)fg@Y%0S#RHl912~4lDqKM*Jq~}6XjG{>OpUF9RVh3k-Rgz6t zgR<2ASf@JT!lD^+r``zXtQ{k^GH_wRs>HDl>o~TFO%yEFZNTRMBU57x?+7w2PQ`it z!oS5xWOlr(%~4Od1^VT7t(4p`xjydguusf9=0UV5sfC2`A&65T_Dq>IbF4Dg0JJa z&m;{pP@)&(l(~bbG#5dm^?d2JprL=XJ>s^BV0_&!#-plF3xF83Ip3x~O?tm;SF^_x z+k|H&<7Hy^9_pOlBJzDhiCyEhPo_NrLwKa)-J~~~L`VASY9pgYWt&qDnDpE(8|CTa z0IWm`Lj0OheTE-H=+a z0w)cS0j-(Yizbcwu(UOE9};-5k(Mgcy0|yIZxsFhPK2o%YRk>RmQO0D>kq0q2|7|~ zA63loZrqC$&rMIQ88iD z#}{aOp?O#d6QM*anNzcCz+M`E&bAeWjhy8bEmn&8b2C_ch50@sQ2vx1j9moZ#Y*e- z;lU#Ydr^nRau-Xyi?xmM7fqcF69U$4Ef5^3Dtokn(T;Lz8 z{Wzh!l5yJ3q;PK$RcqRfH_h6WI6m~8{u)X!9mtxsg$=f>$YTa?a}<668hpmF|7Aqd zP4xr^A#|t4h-juBZs6Z$0$azS`-?M(4bn=tN6RPyoG+|1&`d}ijSR8Li)){sY1d5E z54b1jt$8+0t2%u1F~GPa%%9t)B5^I=mEDkySj))?o;b3XOgDjW3z zvS#j5rfoyiAMx|0VjVlHCP7tRnY;p;YZ@f#c*;dkb8^Q3Hsask0a5uFvI(3Yl{4Bg zS`>d^3iUbhq676q31Mar(WKCSKx5xDjL7Zs8Wom+IfXH)=@Zx;?#l_z|2br7f@P{% z6XO`!Iu?p>^z5ULY`yct;eHHZ+7?zs9@bdgIOq~&Qg(fD*zFFl&B7v~)}WSG&3eIl z0x6`i2`%<{hH_si+_ka@X0E&1H6-KLb6%=Apw!Q z>mh$1S7FbmzfPA}QJIg<&IXIA7&V4l@Pm{$*Gak$)NRD2OV@qO+wMM?`_Pdbs*o2X zTYm#xDdx+~1IH(J+FGUur%0sK(@z18bH7q&Sf$1r?Dw!WLMkfvkq>LH916Mc*Xc07~8>~|*`->Sibu68}i16LCF5#N@MzJ}mDW$jKI5LR^Hel7uZ z;(vcPIl|QKa?cbcx+MMAt~j)v=-^nPU1oq@kB`2{Iz-Q@OgTP)J!)q0N+a z*(M3GelyRcKe9-~Ey7Zd~bXZ~?!=hwFO+IVy8n936M}Cw^;i@Wx=t3PX(#I8{)Vo>Y(OhhOFp#l#2V z{SsnC-_pBhAZ3S;^QD%}Ir|E*9-MiwyQ!3{r#P45;ZB*fdSoC2!8XqJ)maHuA|d5=x?NK+^~Wp24lD&j}1 zfJOC*G)BGTCBw#oSR{*Qdm)4@bY2T$p_|a0;x)3e?JCrWcK&E7nIu@f7TX z&SNC?Zk@#!Ks?|}Wf08NUoSR>Ml&3xG_vnIfV0;RTv&W+;}77XrN6HQY7Frqv3tx}`Fcti51!~`{fU2M5tuFIBB z1DW6#um`D>H2+h!_ALjU{n(}!GT|t$!^;(>59o%=Zuy1!Bv|U%k&kG! z7lch<)%w~J2PGNtnpF)%4b_}cU+l$87T${o==hhsl?(1D|6N1;C}OW)Ama@9+FnZ! zOob%kCfAwOl-H>;v*(D_=3c{s_biAaPWr~5brz&w!~Hp-zfchqB*94~}F_mnowv`a*Bw5cIgU$y(d4wYL#yQaDiD~LCzW&3Xf7aUpQ<_O<#cj%->eT!li~{aY&i}3PGBj(u$%18q z&BEmK944yn_59vJXLB`JGtR*jD1NGW%Sd&nh6c*W)3^NSn3i9fq`srE^$i^82)OF# z3f6D~yDJzJewyTmph@kA!2cmoSi~r|q6fYOzs5zB13cZ#`rDi6 zC$ASYAs7aMfu7qYBJK4+^ZZDD1|nx(7`_ATFud7`EPqLZ;;q$||Au5G)@x|j?C@E? zcyZ}|fpzvU#qfc{v0Y*Epi?36i#{(3t^#f~!TLA$8YFr{`kTKN(lS84cKt-R$LaNB zdXa#D1IPVAmxX)?F0T6VFW0=BD9te=N0zGaPrBs|VqF*}%e0#Fnmz9*Yv z4t+hYWQ2)2_4GWp1MqM{w=&W-mW=01kNI(5vud`_&2AR(*@+x&qlMD_A`ZS6<2M9= z%TdDYf&8k1(jF>Cuj0p*4IIx|I=wQkIe`y9<)P~gc5_A8f`u*LEfC2-PXs>l*$Sz_ zTTms~TNY8~|G_&nfXu2^l~;=E{E>wO#27JRMtWKL15Khy+8;&;hgZqNFNQ4XN4j60 z7AXnkDvU~pn_vhlj*mkdzO+vUm1=*oKF zo%qRzP=wY@FS0enp_;gI5Zp0Eer@4L*PxU`UVWtrZVJ0Z@ZgRev3GhpdI2wJVe^X9 z^Go*+ER=kt8TC(BOCVoWZ6-B?oT0L3jS;hAZ4+ppFf}UX(&RcEoqgyotq0meoJJT} zln&E$groB}fB9~jEQa;Gh!-XQA%h{{F%$Yde_~Y%vR=++f^_;BatKm_NuepuqN~1W!nCmT_hO#PK36fF9tM%;qNQD+PM zv2B}v5Ds9Q;_s%?8}MMZ`1c4W^bYP#6thVuA5M#}v8>Y(PAirN$8FZT5bgd-));sI zWiK8c*$@)V81Yhx3IH!^L~pPfy_m_uNImfozJL0*9<0dCq!OYD2{!c9;9B`&e35=% zp?LbUZ^fBP9sUCM(}P9m7}iw0^*H%y6{5_V<9u7n)Jxiea6X)Dkk9?m(T5VoGwAj5 zrG7$(o%#+tJ;q+ZO=b>&!kopOl#H8CVsZe*?>ys^v;v!6iI|8q{7R9o<@H>cRKq@b zvd5c8aQd3n?vK`9s~r82>m?}&K+{=IJLqh(lW}g@#w#E=a4mJ@tg_m@*~gOvt*n)Y z8?|~Rx4)||EArr~Es3&lEqrx>ziu?vDVNyuA^*H;M3Q#=YyuGm7&9jJi@GC><8O6V zk(~S539lW|(J2G9lxPhR5+rC(Iv?L$Nnk#&KM|lGtxv6gJx|qH!ZX9p_0UQYV@9o; zpJc5AaRv2xeB@#uf~Ig;-l;)~8_@qr;tvy|~Tlhi7w0}y-nlJICi>`ewc{97y)3dZ+2A6 z8r*6oD2f~b`rE3CED#y<`aIr+Nhdt8ad@Nftj;$}EV7c6+^6iwK(b8FKO zkQeuYgfjh$KTR4ovaKhJ$G+^#uYJs&KMdW0e~gr=6N_@*lLtb88vrcmgj`yst$wH5m@B+sbQw3w! zNnbc3J<9xv>HGa+0{PLkB zcQD>%^-g0f2*MkeIF1di>-Ebc0Q!6I&}v1QkOth1N)G)O`y#?hefJ$4Lo#Lce#;z} z-~(O=-G=thD@_cxIY+u}F+r0sZ3o4x9IWQUNLD+f7a^9OPiR+CA=wCUiM-OE{Yv}N zFB!MCH-z#7saw!KO_T@pey47aV}go#r?29P&q`H-EXldi;^L;YuzBz_Lm{}i()qft zH0=RTAaQtnK*Rx1yOS0}rZx!F%3JfHM1Q=Ri9y)bNt{oaI&tn0lwGxiLBSg^mpI0y zt!s7fp95N9W9((@B~G@s{zxez-LdW2hJ`QkwZA#Wzw$}32x&;r zzGAI98>a*N0q0{BxQoFa5zD&OH8$d%4aQ1EZ*y27KKx!Um<;GZc2m5$aSWy!>s_s_ zwtqLyd`V$}btQTiW21}JF6JL$aX?T_TqwC!7N0)XN#Hqiq#1#6o^bKhtL7^OLhKK& zB{)t!>!iZ7jaRHktgs}sv(LAZ@Zqy_pXzWCrFTEg%d9#2T13|ivN}9~u08ERI#e2Z zU?{~YM6PdDMW^S@ri+=gCe_v`4M03I4?V)z z3+xAsl62wK753Z7Op#|&=~pAeI!DxiRQ`rLD& zSwP$h1`+#wtF{QwlC0|4bY*9?XcSoIZs=4w-Y=bhIr3y`ArZLAC2Thwi3ZH}5VIlC zk^U-6i(-l|dJ>pOz7TsF5=;byQq#obNY7}7NtwROCH~S}OmDE~d_LgcXrCTbwiq$Z zOm5_eNPlx@{cIg&l#LA~Izda9+Z)b+S5_YAz&Y(0Os1M#t*zVRr){{t3dXtFV8~2L zZpuN2uVr|1cVA@GTBo)yV04|>#O3$XrpzFK8;$#$VY>l&y=;DDv`uLOsK*geHQVMx zJ6P%-Hgv|}oVcPzQcUk(&pXZ$BfvM+EtDil=rHP*N=@2&NND{eq>Hr)K%Gr z92_9#o&f#eqjFrs<86BaGT(=J%27)?X8*wumCe0SU^`s`vwp;_Kt6K- znlT#|-)szeQbj%{aOKI!wKV@;59pbV-3)8VG|;Gz=-L-?8-qq=@oGJug@U_Wj5D_2HTr(AKA zCsXxu%RDN7n-8#ws!^OC6_fHj^>MI)w%ITg>3EpnTDHheH=oC|kshYniqQjb7?4D) zZTtZ}_Zt>=JvX`XcEF-g&M>zuG$1rey4Hsy0Y<7gR;k!MW&8^tk+gs5b>O!J;OZo* zPBU-8Mi7C1z5OArl2{ER?bTB0CB(l!G`$cD_K|g;gZZAubV-S(Nv8URfk<1duY55o!Oy*|=P2HkIN0g%c_g47^4 zRFkOF>z{g2LWqmu3#y?8iS^;SKu$m+zwD%}HLmCD1FrP!>!jkE6&J(n9MQA;I#Dav zz(9+u?*Vte3xX!}b+Oy59S`m^^(9V@o+SmJ*L#(!u zaC}sSwc#K@kaV$ftyS3>-Db-c%gDn%}6x@mE{_quOm1V*xMN@cEE3=mhy2+ zMhIU=@k|ZSV=_`NlG>{5*}u9mo?)(?*)mw_P`9R}9DW{M3o`Tt;$q73dFAoZQi@$A z{Q})*M;0*?1V1nwuyX#E-n zpl1jfV8wQ($l_HdOv{`n)%Vgu^JZnOd^nmDEh$fPS7LXI7ltMWG3kEE=HXd-6{CC3 z|GF$c9Vi3bTM*5+yTa?-IiD`p^}OluW8Mb>^tP(?uUbx&PFBk)aUwnfESGTScuo0) zVqfPv(8Lckg`zS)bo57@<}`p^eX@7sarWrLG=JAyrsi#0%05`H0d8XjnEwj)=f#!HP>K;GV$*D zF=w&ze#z+uE9-YVwauG00-N7fl&{RUrL?T2u>3-FGgWNC45cLr>l$|mTbRHHHcIyM zSQlVAl<%u>M3zT7I3;yu?--P*fFV#nLz_Ym&&GWqOwlou9|>iVU}98 z6<*hMP~yM{7@kJu9LL*{C4JivGW2R&z zUtSx`KvP<2MDTR3Ll=K-60`&Ahmfj|vsk2DYkvD~!yf32uze}Rw!qfX7y=R)ZPMTM z?iRGQbkR$opiKBaYVdB7+;S zN}3u|pqJy&XF1iHcNqp!#(bwk#rE$h@Qyu%gv*7bI#|Qm_fb}k;kzeg`aat&Mg8gR z?EC#aEJLWSaC!fc&yNHW1Z5j~`stK98%!bKw3dH5$_*#C3lmvFu|y3!88-`u$08ro z8>rYpnc2~+z-qLZr6AVv$4b`KK?5!G>%g~98YDKRd1CqR(<6NNN8JVFyrJtF%J0I# zvP&M1-+k1`9~frV&zJ`TajS24#AIWSp1-I~0@3&i&gawu-WOfWib>33Bti#qaqw~y1?VljA z11=jCL+HJ9YN6T^yykBtUW^=5TCeiyMo~RS4b^{<&qs3S=&S%Nixiyu3(GlAW zjcBYz@`u(cgKX@(gPjo`X_nrY$E=gq14#kqZOZb0cQvWb{rqogXbNBLjM-I+$XLeD zp^UIgJb!=^W<#C?b=y%gb+otmcC~$_W%Gov6M^sw`?x_76X&Ymr@;(|dw4ase@Z8s z_#>g2(;*`XK9)|FX%229^pap`S{W4;5ZtXd+d`U`RyqLOfU5LMTqY-_Eu8ASoemEu z5HV_NCjoRmU2w>kYl%Q*I+V8s-|5g@YRvHX+QWQ^x!7-i_@geja6v1)=r2!glCHsX zO=;t-FldX+><>`ZWhZ4=q;R>gBW&!Sn2Eik>FaZ`o`e3?LiLnpeB#L-ZQ`sgB5Sz3 zn}JeqA6RLJCzQ@(b%TS234+0)R%zosz_6_)Mo~4b(u@-;miWk%Bl(_AM39j3x|K)0 zx{c10rynL#29mj2ir9wfr{o6l!uWx+lHx@x!xMNAezhD=Ep-i*@4|2LDT_`JuU@l- z=S{joOr>IXt}sS%k80*g#IWJ-VZBf_kzb7zS7w`p3x;af*J)x0E{1-HR4oP0ncm33 zP)WxZ`e76L@ec2+q8ytQpPpoDC+3J$L6T-zlcgCJs@H9Q zUvVU)nLBkZltUX|B^uTiMVSaA{~hRgE3mZg2K(!2ok;)6qP?UATfvp)-zLhxd|_1_ zniDPdTi+&9jHdVvH4_XhM>=7%?;$f{vA;9pflX9N2QO;ib4p6bMw9t>#zAYVXPe)i zHK!*KPyxgDrhJFRO;zo;++1FH%lgHvqS3%}$%Odnu~|L4x@hG{>3Sj&L;AC>*L8_* zl7AaJn3$&aMQ?y+>&AIIX3@R8<2)shP{$-GfwF&O3XxcKAm$bh6 z7c}Z0$QUJtGS4yrVdfgnCUHx-(tk5jiMEj7;_jR`jfW)exSVhVw1y)+eOrmWd$x9c zFePjt|Hd`W0=tDumscNt!y?XHeRa~Y(giXT=^w{W_&|NP!@a2=+LY`4TKEi#Eo)GR z?SCQkD=TJ7*4ij)FUP--j4~o%frSo>4;>fVWn)oDh1FIIt68tbIz*->J5(ac8!xbI zK=#0ZLvud>o^4+sowb)y)4c+*{mVv_;ig`foaMfC(^YMfP=mDGgy*u5iY?Sot~d1a-iIa^S?!1Xmw|#9Y<6M|8btb8_zCqVpZ%}l8wV{v zMg}SwTlCF9@_v)yU+G8v;g>jWF1m=UBB2ZLud6h>wnEXX#SUzy4fHL)Re^y`(#Tod z#vri$a#s89MEzW1-Snro-8|>!<}a#Mnz(BMS+SUXPU@pu<`idf@@inVT%1^sqY{dXx$XEhKIAP$`_J&GbMIAk0 zSXdq$_M1p5koZusB&((_fX^T*$Dhoxnc%SF5FJt9y-6aX`ykP5qQ%LZMW=x4xZQ9< zeFOGnSQ!11|h$6V}4yG-QLI>jf5dOXqj&6)QpP#Z|MBJUR>G~Y(vXsp9 z20W{XtUDQOVsJcd26Ro?(DUO@IqfVIp*X#lJ^$fzb@D@AaHS>spDiuyFEQI-o~%nH zPTyT9q(U^cG2Pj!qes>+;AL8=-T@TNjccdtAvu&R5-4`k^Alj^6MuCBC)@fdgHOIb zeh8-fX10jd*$CyJ#15pi-Qcoj{(BH+g5fL5Ikebi%H^Kq;SCwsw4i46dSu{DrNKvu zQgAupy-mP68%R_WS*SZ>p42OXMJZYKY$|@sP5R9F?A0*NddGlkd1ztg;F{$^V^Aec ziB;>%A#A_@X&;m|1CIYq0swp;^}|ci76l9MO8)w(6X=Lq_HF9rW;5)VF!7I>quO>? z59iHXggO8x4@_Uio8865v|iWT4|V#LB2_c^2|zG2SsG{g1LO4@X@(>$eajqeQH(f} zS#VKjLI`afVf3`B#`g_`o~*CHKGazEodcHPqCPjeiXESvk~E~u{8CG?Mt@#g@9~4H z;>F+HasG~9DEbvgo4eIR$Hj=V4VQn#zxE-T6azDK z^Y_)jwfQfB;SI10vlmRKR;;N$Aq`(&5{fqU>)~64kG0^;6&X$of}%iV;(a|FPVT5vHXj%)m775pOx>X}|# zw%@H+0ye|{{^^W!?c;a-wH$o9`H~jv3v4u6}glL)_a^!uuVsu*{jv2Mi ze2&z7^<}4_M>*Y_gX7?8=$ThfH0ioKfWuKN3YL#Byk_x)6+H!@HjEWC(~$&N8!(eR*!VG-rIWJW*ai62Yt`V8p;y7y!2R_5eBv3UlZBst zn6%ur$NGjZr(*j^URea$f+fKyK$I3N+{-nwAwWMkw|o=Ft998tEkdnbta zgA<$TMQlrG9IUdefC2EuJ!Hhe$OGW+8Bjn4b=OZ$buZk5dMt|M3|p6kq@(+q1|3T& zF9NrAew$#OrR405Ug%%`mB2dz!M)A zmnGPm$koP=1{Rlj$rq3ZStbSim6+?IqlO8iYdH%|I{`D%<@L%8S+l^+QC^tUI#FV8 z8v!!a=Ak)aySAB>$M{8D0wP|#*}CK#Q-Y6e0CGI!OQ%>?l%N5amL>QFc=^@^T5LM( z`JPK)t4lv2WaJb^O;zr>x`Q!w55fRCraRHZppz~k;q={^Yj6G}A_CMDP_(pC7%sdu zf%6P{X3vftK|qC&Js3xiK>>R>d4dcX;OCA1CvPH6kx|~x6`Ce2HonYzf%C|Is>%4;F_2wf-nh9H#HyR5*Zz294i6A*X zYv*Qv)ue|tMOU)e*BV3*G!A}#H~9(TYH{9T*MRwpd1Wk+^*Dfry(F^!W?cxfkE-QmNqz`{-0&9-6WRP*E241ZPw*{*uhGWI z+7b75dO@|=D9VZ%9Gu~v9wNB#DJ>0X;Zt41s{>XY!XjR7hu_-vZ@Fk9MG`)_v_{+a z>>}jD%v%66rdMjebO{gm-7NpeTKtLqr6Kpz5A4w*D)9BeMFP`OC1_fwM4+r?q@b7W z!f6SwoA|NkHJ2Q2-|Na50d02r7I1KqMQR*O4PjKQkM3Zw6~qoi2QYo%M^W2MEf$*b zMBdzPnciKHwK8t$_+^t@K)b_=^W!c)uY5;!VwUnMS!re^jroY)fD6C#=Q;$s)ANlw z168BxzMbp!#k}g{&oR^9>MsB9gEUYnp`dy&!M~}jZEjfO+PrlR<+!vOMdp3J;GT6& z(6@VKu(7a5rgXiJnB?zV*J~qx#4F2!=v2SO4|9!^0E|%Z0sG6(amHC}Vy7iv-*xNKlg*)*}5fO@s^|FQR;QB7s--*D`0 z5X&eE0>hv(V*?AF5ET_Gh(JOM0ck3MAQ)N*L7c&{0JZ^@60rdZB-GGJ02LJ>Djs?g z5Fr{Mp%?-QNuJHjIEwfEtarU1p0(b0J^%B8a`rj9TxXZ7{w}k^$Pj#mpd3nR8MaWK zp8b@%D{6dN~qc z$_N~qO^bLD*lkgIX&(60IbKP0=070ON>HSvD{kY0__S)ZL#+Iak}2N3|t zunj1}Dg~ySC!)ty12=fezhQ;fr2@C((eeWz);S&0T2hoq&UQaumG=oA#aL)V6TUV0 zP~N zLB-9p2RkJiT1%rN#ks%Ul5oH_ZQeN!t!E-GH56&ZVgPN;RaQ0z?s&R`+*@<+tEVAXs%h{8-TO8?>W zo10^JSN^5+ch`ze**%Lw>t6al2rutVzdtk2^g@A-- zHfNmd6#JnK8+#`%P=Pnu?cQkOW6#m|RE>>y(z2=PRAsK#&Ioj&&ZlNg02t1D5ut3p zW-*i%w)rW?mMc&N;#xbxP4j2E}+G|#2#>f zgut@35kyNKsxUK6J%-X+4D2TG&^9QS(rL?erEx#sxRu&|Eoyv7g{)FlY-TqxD<%ZE zzW;OO{b575G>DMD^Pz4=GIvG%m2v1)v45Rauc3wN*^UqRli~|;3(6C-69S#q%9g08 z3dujc+pR1SbfoBEa2Ry-XnEI%yM;J>KFB>3dvm}BN`SIK3L@2wt#?HZ7+SRxv0Qp^ z?0rx&($8)+fh|GtCKNsJvzDRK`E&6{iv#**LW`#cg!7=78N~Q z7WbQb=HkhBX~#7UK@Y1TM~Yl8ApFG($u^gvch_Fc~Mm>B&aK9B)B5E?1IGo9$rNsE_S$<_Js$Ux^!HCClOOZxi5JeYxf=c0cJ z3FCX#D{zkH013t?==>Q!Pe9;KjXgQeaaqB3bVSvJ5Uo1qjqHw=K3Regqh#j#p&Rc+&IA zKo21bUTHSA&Rvzhv~}0NHH3iNBi8(3d4mH}$6~rU;QN&f_;eL&=VB1-nzzLlpuHMF z0FM-Do!TH;X9p|k zZs3=kQ;p&r`32V0z6EhEDqNf-h{>IjgAkforSZOBj90!NHmclo_vCJC&6_QA{4LhB zU2YN0NEtTJ1Fi+b?v1gfc6D=G;h>-*yqJV1f`;8l!P+77GCXWTO%usO8!TSE*g(B< zOz7vqr6Gsx(T73$FU*;P`+6+rce}mXG>g>(EeF=^tw3${-R0ra`135*EGPsxIy4x5 z3Eceh5EToc?x!|Gj&EdU$OI6Oo>#?U{P0Db+8TpE?%JbeG{x2qMSy z;+Dekrghak@%wiF#C9vR>Q3}`y}}}|fE=9ORx4u0I_$fZ!gLElYO5nv_vpW&#{ayK z^5#Cs!>5%;!iwJ;CJ}@2Z|A-HlAi5Lohh}ORsjFDLxgZ;#^dj^>ouNwvj|2j?-bPw zy(T5--NY|%{qsBT*FmQsIf|+Um+=y5HXZe&dT5sDzdW>8!TBGz!C&m)m%pVjE@zx=&tm{c`v5zl0`%eTwg`96ur=C*|0fyyZ^OCWm6I3M+UC{ zI%WJSy5;AUL5=O~x*Tid)MTYza=|v|>r~eZN1uCE5Pj=@RJcClKBu7jEO;Aot&wH( zB~O^Y7j6PcD{r}-8y}NGVJZtYf7S(@*|mmre#Jxa^GzU!r~SEO)2+M<99V&T3i5ld zAW?lck=Y3EP8zymn=3Iu|98ux4=SIZ3&a(0$$Np{M$1y>3Hb%X`7_DLiX6Iq9Fvgc zUep;<@2JXy^-dHE9-gV#U;JjxqJ!K;Q__wX!1%m;>2(F@N*&Ww!{5{t_acRZ z%+nr@WHw>+bNfIZwj`H(N@d4#b~a!D-wc|s&$$7*x=MnbCL_a} z_wJ`~dwh!Eb)1r^oAdHdDtj`@_h&5(d>a@$UTZofDEy-F)btP+rz7RQV2}ci5hycD zzsYpm8PDcx@A!S?fNB7{MyYB$jIbL2apnh(IfjE4!Nyll0jDhI#}@^A<7Sq_+7=`4 zz`DD-mAat>g)?;X*cbT2FVDHYpa7rv;;IEoL|4(5oB#aIg9e@Ur10k}G58XG;;~`C z2hF%#-;Hl535%{#hVA;2|Km$J*0JFzEU%;+WG$Z1{&Ms0-!WSQ?|@{S@6sf5NJ_IeFp4W4g-(~yUT?~+qB)M8uU^*iaUK8K#3LbeN^3=9tNYcAv>I-1R zm)a5DV7t>oqQOYC?9;qIe)nqkf~4y(k1%~oXztj^QTy-Lk#EuSxiITjT3>3@cq;kf zOAXY5=`wZqf66>Am^J`K%3oLBrYlEbL0LUt;Jl`9dMpY}WBdE5Yau^$6^F%Tc>KsZkQrmc%S32<3 zb^os?Q=amvdK!R;9uGPKzi=#H>hKVM!$%Xczr<=0>To3iOI*+SS_!@hS&R?J;qm0phlZBKDWWD-fr^`Sd&J{Xwa?0B* zZ^>=MZv-k(Gj-+0$oOQcJMUVThpq`#>LBhB0O%Au%fRf}20q`{e{Z>uHb_Z{U25zv zuTdI4SqlGY5zONa&0X#+-U%`AEoX!9)b?HqB-e|~4GZj@t0Y&bx`&NVl(mNdiP=dW zBA(Zv7L(on9o;<8T5p2Nr{pfAVWlu(N6r$wSdb5$1&KOoJ_lj9SNt0n_BTa6c)%i1 zFW7CBuM>bf*fsn{a2l$Kn;VlIwR^?~hxtqDAzhWa$9WiW3aBg)X99CF{Jydw;B|J% zv+W$s3Ak-_d8YKhJRHCKh`<-;l$ago+1$}`t*d7eniV%E#__A>_U~S`^tY+Luh>8T|m; z@-?9F@A9A;E$@Ylhk8ik9ia3pp29z+ily1nwFcNjG8Fru#YWhX_j6{lOijEYsvI;A zH1|5w&41tjCSIa`er}8fy3R&ItEE-6r7m*UO+)|%;Z7vM9<#p(c#SeoK@Y&bwWC)zugQvA#Mnv46Ke@ z8MFUC8{He{(HxEzlS8ujad9jD^NF@i3g4x8w=%P~8*g8^(kLveqgeSeMW{6Av=eD=niwL@41W_Xi-!KBG&GH;ScMVf4+SYu zEAV0Q!xaoL58~s&6nNBB$P?aeoCNx8cFU|Swfs9;2YA?o|88`7RX=MT^o$-mi_@utsgs;v7)8xo=MALu*3S{M#|Kt>i z3w2bYt18SG(!{tAFxI?^Js>JYkD}p->bh7^Z#b7;{YWQB(yZ~ZJj}ru!N&9QbVh0v z{#!^c;unId!U2+%7*a8kTyzXeX;f}ikA2)~CK6@2W2y?w-UK{JO|`2kE0;Zwq;-H? zyIqXP?!m}y`N@)0!%pBBRt2rdt7q42pa2}d?1U_uBid8@CD~BsEGTrd|;HWgX&|D^e0F41}lhpebhB8!GI$C0$rP z$e0pcrnCG-CsoZs>5{giXOc-2`xkCE@pw{+@Bo;@m5~Rm_Qph%hvV5x!rAeBgVk!7 zI+>-NJUQ3vS8nUXTo}r^j<5~GIjcP&cMvxjRss;to0PiNVXkH&VWeN>d!TbUeE5Zyie1F@V<#McDn2wNV7$zusa{O zy_~rfFfRK$lAxd!VvE7s5Xd&-1!?b^o7GeoPeJWkuj!On|4LvIaH*FNAIE~MTAdZ| z;_R#2C!%vA-SEuutuLOrpy|>pf<;gW1p&aP&JR?dvV!p+sNc}uQp*su6xOfQSaHpw z3|c?cmeScM4IMLWDSM#P{h13@P_0q8yY^N3v;?=|+f!0?URVb(1U-Ftq)a-g3$#!>Vx&i#Ns+KqWBSz~5?WVx4g}KY&V_dr};3paE+yFChxiE2I;sw8vkmr;>pDT6n6hi)+6sl0B+$Q%Hv~86g&=IWA>lGByoDF zSZ*_*s-Tzq)?I3DILB?MF;_oN!HN$0St?9OC6dcpQ=fTO5wVO`PDIVv=Rd&t?wzPTv;tx} zXlF;$p3YZ_Ec+!nmQK@7!AIKil(W7SNAsM~m0&^IJE%JCC4|u|JC;pZJgew`o%|rl zqQ&}H_g&{Sf&)1xy7=h=g-BQnX&cS`g&X-I08_3rQa?u3c7D@_xgUuHFgOL91$DNK zax4M28+CnAI<@Q2Ku=$ysUNuT8W)Ah;hGo7HzSRm-WGGS&z{}H%i*4G4>Y-mq|>9l_7XeX;hv!) z%_3H4LXM)aFa25NYSfv7QNd#yitsFKsy6)mfa1b(*;dzPiyOZUI-S6fs-+9;84h7> z_X$&FGO4bfiC!l)(}8p*qTq}9_MaYMjTSi4Pn)PjK|;r>hvKw0!sm4zOxX?E7)`f< zS!q`PmUDcYV-+xgUm6!>YS=8X^qz(11v7m0cf9dOltwyUfp3uB6F^Xv-Z_pWy>W6+ zplyqX()8WgmKD;7D+1HU{@H=fRVSASM`R#Z4>2sQpdQKexl_>o&t~~=Ka6vil8=*w zc5r{qK6j&wj6|1OaR6PoqaeX+OQ%X7knRSKRgz0iFFZl^+dbjvJ0NCV!pJtL&vsHp z@8-x*`jkLK%|Nx4xVC>~S7X0X;!O^-|*uV*IPk=W%2<=L~`7RIah*SJWHETLW(yvoUF^?WMYT?C-`wcvBe;f^UoTe%SjKV zjo0zORn~7jwrWRzqdEi+1cr~8ZVD|Dvd&yP2GkoY!5^yro_scEP0;x?K1_rt%I)s3hYHH z-GLYIM@i{Ed^o-#4knE-%hTx=ocE7XzJciR*fAlLvf3azY^`&2=7v(8soFvJ+a&;) z9VMazl{^(>BIg8c8d=_m_{1Ut9s}2Paffx&_-_%W71G_}e8CmyQXyZJ22SZyyKps*sbWG0S#_2*k`B{9OX%S(!_({81By524Rc5j5gIvTGolUia zD0wqBK3=@1uIw}xf-92yP2zY|MLs}aviA>H?$?MN2SHU}+Vg<)*XI2lS90T~#_S&D zqvCnWbi1lNo!bM(6g@*St46LKdsjO@PLj@9_KWh~@*y;}+(q1On$UMlBl%XhTqUz^ zM}TTB%^(4hr3 z*o6v4IJ9;ycNWp1dj?h!0;` z0VlN#788USuNZObe>7Ylvo_?+6tC%7cWl(jc##(`fC^M>A5sMb$$YIV_FESaqQv$g z>dXfK>!~_l)yF2=-Hb5xey~tct1BJ8nY2A69>_mmFBWoSGH&HwL|Ho5j)?jM$9dUH9pOYPwe%F15`teWxs8R3SJ5 zNi=S#pv!?}iPO%`bf6cmXH034{uG#ntf{DPv?SMuyNksFgs*=noaUhEl;&$%c&GZe zZ*^|iP)vY{=I5Kb0}$6`tsv=rD3&13`q_!!X&1NpX_uSL`7TlMCmGfV!eoE zJ>KtCujcSo3S}bKkdMuYK)+HaTS{B1@uta|%1p5$@tonIHmy}iRC@0D?TT!jh!<;h z1>yeq%(#^g>H+%hyb^IzNOK%(B4WOhY*$76xm8jOfRr1Wgdz;?VCqPbfKIVSA<$?l z!1%tp!84IAG`Yw~hbFp}Ayu@<_kWCbQv6+-zF(&)9A`**#$?suv5RRBO^6_K*~k!K>gtmk=XwFCT2Q^?4NXB#TYANIZSEvWmVJp60wrF8Xb z#DdUA6@X-i&~RqQQ~Xh6r#b@2c^B?cwKOXs724T?R=06Q)62s@hP`bg-?bB4vQj|{48!WKAh*C}UBC62s6s?0dn`AQ zDje}z3A1=)hHnZvdszHTARO32vTL~0_!aM9dMqA0Wo~sZO0Nv7L2L)(HO_2~D{$dg zo-(PD#4HcsJeZvO0~hZ->9wWtMFpn!hQ%&de|?wZ%5=*LWuWE#gewk8s#F5BBhk7t zQ&G&5R^x3Z=ahoOg;gU{AdmCJAE8=kV#us9MFrR>>sp)@FIDusnVhZFClH1N>^?o< z{^cq2dsS^*S+nErmE7`r3~rwW-$BW^H#u=|z!nzt$29dhGpXOEZ9KP8zxIwwO_rBt z@iR$U*F+4n!q76^n;F;LEjH7sDbc7Q@`FfIO|xZTq2lMJ@5Xkj4NFh!4los|bQwAx zQKi`AAI@ecWGPny4a+VOFEHvv@`BQ;wLLiX*kM%P@edHc!A>#z5rh zyXAeN{?&eIz%V?txKmlOI@!&O+HsjM<#S+sgt#O%af$N{gYT5J#{}Bc!lc(t&FZle zt^Q2GYRDgm$6gdaBjK&)2kJIBG`%8W9hjf}A2_}?lKn@@l|sw=Q~N0?yVkF4yGb{k zTZq%JQz9HC0nwNAwccKf`VfP^Mf6fzH!STfjHcI@P}KCpo0#aThtj9`B<2aARA~;x zkH5jZYT<24b%MYB@f8Qz)my(2=HwkrZg9C_FjH~Ymg8RfFf`%x!k;R-{xE9+LB%Oh zr$%y6w-(fEeM>teay%Ov*b1iI(DP9o#j@;Sb#;c$HJQ3DJq!nMLNUZg<+XoEMNm+% zWR3=@e+yo17I~gn@#ls`bH0z=O!)V!+2> z@lXC>U|iFDBW$<<2a=SM4deLM9FTjelB<`-9#C>hyI)fPTpSJPI);N^3JvZLZcchv zA7WcpJ^Y8Ml2BqM>qfcQ1Yd!hW=qZO^9)=A5)lu|{qTH1W$Kn^`uXgSKq%wBSQyerJ7sde0HS??Ns*BZI;##yZRZQbG$WC_^{ zfjbU7VnzjEcDJ$bv`t}3%RiYl2=B&2J5pPgdCP8s&0*zqkFufs%~)jw^y_0!&uK*o zjqb?4bDRXUV$V%lywvz3j zr=L$(8r~mtq||i@b87M-QEsWK@}&CeGn_c{gT-CpAOEz9NJm)*oypbh$aV6BS zt2w>(<2_YgwoZtGo`(`*J_et;JfOPR?9JQM%7Mf!%A{4FK{#T-l1ibmBL=gZNk0Ln zMPjVp{>FC%E}zx4lgyew3dk83BPr%vx3s7{D3n`G)5sD(<lC#_EE+?L88cT+ICqwp-~W= zw9d`oyXoD}M7+prOW~;+DC6v<^rd+@9&(1px0W=Io0C(QJ2X?mJutTW;E~>hFkZcc7qHJ& zJEz*?bl}2d*AZeKB~+g_>bC1Nv*qt}+0SD2QS zlfpY71?Hb|-t$B`iZY$E&l-Ux^1=7=JjTtgf~@JR zI3b%*B*$Y#FI6&&X-^X!jMd+?*fa#!l}`Oppy$9t+c6VeYw?I`Xu}#)x*P~T?3`-5 zsv?~|^^8?)<$;i2OU(HrwE`Dt$;Nk?y?&}mUYiF;WM{1L{J0Mbm2lTYdR8>E+{<J1pOj+RGjCz}{H0M7&E7W}NC|{>;uliibYHC~Pk1GS~*cKbVYa6E#}{ z2B%DDPg#KUJ9esiX_gROMUn2STl987Wd#SPDSLe&^mb>Ozz}MrlBv~}`PIbQ&s!j0 zUa#b79|aL`kOGp?ps4;%Kj&F|w}u)oZN|zpbYHqhY4b=ny>kXy!Nwe@+c6O()&WE? z@z~eyNOpjOy+r{!mO{mlKX#!D0g@>k>KXWjl#dLl{Y)7Yh4Koj-Q;*YM?h0qgn#_; z%HuPijK;K>E$s7pNHR^U^BTxYH0%30`FRzC`0_@ld8GHGE9#;X$ z(^LD}MYK{8Pu*_3n;0(IN#WfcUZ?eD*-z31L$14(vs|&cm?uNk8&c6kN~E1QOYjV+ z|9Lb^%aLjl=X358Urw+7a}FiZF)<&cP#!Y)R*Yb63=u5uw2au-Zq;Jf-v}K-2Q5=_ zu{aa?#6133x@&GBj^AVEkEDiy%bsnY^06>Qyz`E>-^6Ro4uTJ1xC*Z zsApvrjo?Vn5pw4(_#?1*QW==@asidUChnMw=v&x^B}}CcqTnUv%un+%FTb@ju0E~Y z8d_y-45Ssb`fOGcw_yN;kypNt5~SUIKuInU>D7=2hCp;fQya_wQx1c66Kw3dAbP?Y znV7ruPIobfrgKfqg|>|;mFCU$8&-y0)^RFpEUFj1z-*k*-gvs=yDjlbPTtTQ>sx4? zfxw^Ae4vQngr`vZM%yxKE8#S= zsVH})aJB0ISSbVTz4X#Ol8LeMz2cljVmUNKm_4WM-AuXMDCGzkXWfBY@DRX?#1Be1 zlF=#7fp?P~&*t4MRQJ333*pl$iTsA{%XCBj_AX~mX8BR^J;4U(#bzzCCd30wp&u>- zAKj0&fsF%5#E)7eciWt8)wOc4Q8Q7hxPu2k)=tf&)l8rGD^l!MY|hE!Eil?PS#PZNj*dgI@4!PH z00xjrMM>b>QPptyrMTS<%C!n81JB;{7Obkduc0^2zV=3vbEApZ{TSqqh>mxEP z^1P(w-w&;y|5GCT{M5(meWL14QJAJ(YbRx;QCqpG-%|V_f^UfiDPsox4HPJAMp)yj zMqXPeGe6dn>^77WT~%&_pA_tYuDD`X{I1(cxPNPVZ_uyW2v(|Q>3Lao30$#%b62mv z9fyz*0JyFz&?69AmPmKM*-cs#AWK#Be!KU0Y@%_dY>m)Y2Ci;V{&~F*!!5n=Gp<#2 zL24pME*vt4mLdXj@0C|&wqpl>3F@${CShmC)S-5fF489yDHrKTc6RjRa&KT({2f{w z66oiOFPZmB`6qD-77}{>*txBI;fTbwM~jqrrhZ+=#NZ&|{Z*iYZ?G4*cayZYwWPH_Il@Z}qu8OKMKBVzAb1 zJDJEFaZhIst*fRg9K-=fv{(Co$FXIYBiZPa1T|{luKQE%(AkiW^=}}|)n7;s#knBK znOSJyYr~z1H^b<=!0d=zieJY}6e*uz;lh%pahkLIl=$}zO&nmO1;9EQ&?Q2|&_+ny zV#jZw+~h~4@j$>myiCfuj+dVT?zjC~{iLfYj%3O5xf;*b>NaSXvZ~RZi&~j~j!#_h zV<(QJH0pV-2%7cX&ho(Ac&-7t>ce=;KrbZWzfNQ$wF8JXSVzR$Wh}zQGBW8+gI^O3Kzl0kd zjDG|ChfatUD&@X5x2-hCfS2u`rtk98pUlT;mBk5LM_0hG^k`piO&qsj4ACr|ZAFc~ zUyc-K%tK3bsbtzV3!s7!^^}Q#)h{rw$xKxKgfM;sm`yhid6gAXU6G;@yG3b$!S(^2 z)!6oLXYa4H(0m{Io3ERnfRAW1uNF#)S;nuEx^VsO7S8kXgMp4bYBX)SOa~f zz(_Q)PF9#(u6S-1YPjB~4TV#07dBEgww~q+?a-dynuH4OP3sof10Y$fR3~?T_?Zx) z$knA!CLOseBM0y=%8aA-?RDg-16|0H!Or`V8@Y^nZKHzfF#T}LZ6eUA@5N*x z*dM%kH!nJ9d&`W`6ss zn8(q9HLcOP*L!6NF%%J*?Vh(fIXl{WmfWnM{7EdGNF5qcTkFibw4}0S2(k;bp6E%L zAxIQT9|?Syf@%2OK>kH!`r-7S6e;;gFba1*g02 z=5gJLAuqhDLRRJ^hXEsg9n~BNta~6wV1Jgx|028pOz&}Nh}DXO{o$Vnwbu0#pzZuI z=~>8BSHKJs7cOz5qkzTj;aJ4b$Ln}RPWh);nk+85q@i~>DA(UQ(AI(t69lcI*a_-e9TH7lJ{T3VVcbNWqtv>hD4 zNc3qNVmoOTuYGU?F+nqWMqC|~)=BYmM4i*9Rd&rFsZqrO2itUe^a8`w1Y*4DJMqhB zt4TAmlRU?DnL=+S3!3{rjLM_~JxF~9 zM5S~#X4|qc-QwzeY155oq5O@`x;z?pduDk8#nK6=!T0qpaY2!ss_5k}Q#(lb-kWRJ z*%PCe63e2jf`8YD&*6_l1C$H=*O_4sBKJBO*Ww~0IyW+E%>0dXDbx(s*m=WBK92vo zwX>;z@bz^u)_>s-(QVHo-AkVkmm6K4o^)iY)(#N1)gWk1jv7kACz6y}>E?k;Wy41( z1MD7k5YLZ-M<#?s=#=b8xio|REaWH^a#gp%a!|%}E?^4HR5948MV)*;m_+lggf_*} zz1rPP>&t2GRaw#lKM)cqTzTOd0CXWNkA$Q9WvSG zAU`XX_OG1cS-Q3QQw#fFb9*VRIUyp`*7J~;pZKcExhXanmI|cTA2ft$Uv{;e`{Y+t zj^cqd*YtCrHt~mAnEIPAzi;o>w@EKfOm@lBFn)MB$4~$9q3D>U|uXT37YkNR+j>@mP^% zI&T72#?f@)JdjoifN_wmyf2Lx7(t4VKv6}b{;zciN6a02v>HW0(^)e$3msH@;ev)u zlrmhb*Qmc5_}v|8o!|m10-N7sQ&`0(Q&Nf<-7hquW4;3bnv&dfx( z;(@|?J*s3^>Q!l49P8Z`R4Xu|l)s(bfhd#mH@NYE_(ol#pBJB&f(?i&)>$(w)R<6D z#}IKg__UUwpGTBwUdq7N*BpA+LKPY-W~UmsQo(|KPiT&Vz1^R~0iKHCXe!Y2`zH|C zR(^>%2T_itYg*f~)G~~fLEkEkSTCG~#?1(N;?9-{t{O5in}*0_kbv)9hE6tMHE@o8 zMspk7AL|%=?uS#D zt7)A}R~|@1`}UzKN;}sQ(b>#S8`#`r$)-acD}KH@!lW?o66y5vu0evlxr>Y4H&a34 z$|?3u^pPS|_8htrdblpTTH@rPQID-P90>~msQgL;zBJtxo>ShJI#6}6?(}ep>-)CK zhi0Lg{!=TVVt!Y0gM-9vw4=??mFExSp63Dtzbo-blQ7?hU*%DsdW+5Q1bCFf(1ZojJ7Fm(@^8LxhKJ~!3u_#n-MP!X*MtGVk|T_9KH?Dt(zrye(%tNi+SY2v@d-49 za1j^~XA*h~d%MaW--dH1#gFGf;IL#v8Wgp_JWFMWcw}CSG7MtkUQbR92z+#3lAEvX z?#@xEe5~!L$!sd%QG~o}-Y0b@O9W+>ksim~dCyd1OX@LsO!Ckt)^9WQetGLK)aZ!) z0V22EX&4%}&+li`mdPx^+LhJ) zbO-CE=-D#ia_G{^kM(2}&Luddf`aLqO_(x;*hn6u%k%E~={Enpj8gb0+uO%U(Z$k| zMW1^=nzrDB#r<209xE!PG7uDiqVj3?ICNA=HrMRUS<~|JF>G#Ar-Wi&-1TtDzz9PS zsXo}IY2{Y<+E@Y4QO?CCntT1+I@JLJ-_@e# z)}EqgYccLKFmD7am!-OK&Mp}op=S$sUKgFyrw2OA$pUQ2Pp)Y*Rx8U_Tn|~f919YZ zP%4aa?T;c%39ss!ww9)cI+BjVv&@K3iIYe1RDtrChg&u8+Pa=h3NEKqpG*yOg=h55 zO-SF~=@nfj74B>KlD-``!(vJat-AwYnKq>g>A)*Z z{LmTUUj2cAaN?Bee0o`M)2kBC;3*=g@U82Ns3dA2ns~BiDAfgy9XAO%>6N!?e8Sk# z*m*Rp6`X%pX=piTP!a-SKMYH>UGK~!zA8|M zv}xgP)m=en#K$OJNo~RsN~Qyf9?gW(P7n`(+;kAdk1??irgY>KOJA(kzU^ieG?>}q zJkI17No=0_Q}yG2Aq9(Tw~jiGaO38#9T<7k?qpj-06yQgr%W=4+=Se~xzHvKrUz${4n zWok3`!eaIr6ZB^c1w+x|2A%nA5yg;p#<7a+^(<-DK-@`7@-v*eR3*lB3W(n$V3CsOiIVODnxJUQKrl z%Ly!N8r8l_tj5jD+%6FS6N##GLcGm_&uF$;Qn0{ttgC~93(Wm%$D(Z*MfRP)QX%j7cLUsfbIywrexjI)f52XN@v)T&7StpN*nyb4PoRyQ%ES ztT&z;6V1?ZB0Mn7(lH6R8s^B$J2x)qEv(19ie{by7XKZE;&a@4#XB`@SnzCVaNQxc zU%>nP$>G6~TkRq>e-pSgPjIbWBx`&I&@ev;ev9j7+8a+4lQN{4?GM`V?hKthPs;pz z_wpl@VScj4R;oTS6E{4dY#SUYY8Nd)p|ZDam+=-DugA3G(<78oR^9!kj8(UDB#l~p zvm%`}ip7PZbqgBP5&q+*k`X~lO3*qZnHEVHmZFF1^yU3Yk4pEa>UgpwzC0gGSE7Ft zF}!y$ze<|l-uu3g$26A(O5eoIU6uFi%$O$wlR}-giPB?{#FBs^y|==~BU^70gAdm& zDxI?B}!|>`{_z^*KncdPIKez#swu4CfI&>G|K92tUfJE9zwBg(#p#Y zn8~HN)?NqBSri4w0IcdQU!g(%IyPPFG_8|Ju411$5P6qpGLt33Mx(N5#svv#YYqUn z*rzxCJ!q%@@EEITeLm{vsK5Ox`0vVBjPmJ1R=*?$s8n-p48AF3_2YH^4I^?Wp#%Z} z`Jbx)W?VeR%wB)-ykRAk~Yuevp0t>;5G_000QqsN%u5!J#pqI_Z&t;xX`z zT&kGTcY`FdJ-VR$u+@#2I`ED$6{Q{t+V7jGEA#LwjYcd~(52VgdxcA|W2VrZIH39W zFr8^~hK+X*3PdWvrH(Z^^SiUsEAyoHJwdmfv}SB8ur^LRL|!w0y3Lt%kKxGe#i#4Q zD|v1+KUa{uo zUZv*ouuwpn4&aP|X4+WR49Ma<>SPB&)Da;Lyyttkgmjrb{rh=e&fQHy)G#!lGoHx@O4!h9LL6WW2wycuG0TB!g z!&`7_BuRW(@JQvw^ih3#&CC{!5^PbV@N}NO1Nu?VPkE#%TImj)bT?01!t(6C6Ns=uGL(|5 z8mpvkI{{~!y&49+(fED3PhT(Wxe_|9;38i&Tj&+;G}2-5#K2(I0+clf$9?}?a58R| z2YV(lJswm@Co4l$>gp~}If==T*AMen4if-G|G?VC$id-umnpQ>tUSM&b0P1|5VNV( zqU&ukVH$1IvT-KXE!_%(6cmkMsf z{{LRtZIGSOin@}Dh6esiX#A}eFpC_W{}?0I)cz1GXrFj}Ggw&PUM!>`@Uvj=`W}}A z>tlZqHhf>O(EdMOU*PMG>a}UwN?Z+kI@h9~Xvz zlhkuTm7LwJym|EBsPie+e?Q#DO__2>{ac6X})v)r=<9|AtB&_(hynbDZVe!F7P@ulSH3gT4Sa;JYiPYNn&ubn$-;F#j*}+2b!X4M$># zKAn_h7PUxjQV=PRh(<8Vd*`dy%N+D64CfQywU<*LYGt6d;6FhPmWQs1Eem(YWAQN= zx2dWqUUp!>FHZU9z-K4j9o`s}cajVM+BuEK4X#&>*i!v8mLf~%OFoF9x*wKr4hjvGyi4y`oWNl?Rp1Dyi&G6_8%zfS{Dkf?fVenyrWyIeS0qm5Ff z07Y(~iBrBR3e&{%a)JZwh)w_CPXv<%`eP+$9{2nXd~-C6rbwEej&vjB+$ zQ5l&A>ip;7_oD4bUzCv&C(8urxC^Vw_luQ-@kgK7Q^-v`inE+Q1|oYsqN~p=><8MM z9Kl#z>?&FRAipHndgFT;fI#Wcur1PZ9#QYQX`g!p`Qd%bPb-7p5AqiQ6qQNb?VSA^ zKRXjIi=STx2q7QL0gMV)BX`f^?kjv(%cP@J$zJzmq<(e9BoY4BtO>+ zIUS!0$(U54JHY;k@?C6W!45k#aNUts10TWlEyJzEvE@picC(`>V4U6;MYja2b zx#SE|J~?H@&`|sC+d0AiWBUBxy!HLJ6;Z!WdKO#UcL`v|C?>%e=7T%0{=s^Z)U>(f#c|#+QFayGikq}$N%#}m-T!9 zeTr|Hu}$RRLf8JKf$&&9;~1N+`+qNoPAEGnQaA?-K3lLb`A6=)`5gWb>ruJ706S;= zOw8bt*RjRTNyY!Gz3+@_GV9uoFyg3`VSEMxK@dn*7v<{{*ZOwckb-7 z_qDHm?Q;%yKJCntmn{4In~XwD=tT3UGp7a3z0E4Qp1Uap?HCBvuhA{Kdp=Ax>g);8 zcYAr>nY=l7^UO`{LoHaW0^qho)BjUxNX0Q|rLVX5 zx{tO$X}lv)M36N7X-YGTxp`Eo+HPZYN^r?;o(WueeO;7gtG$Ku4k+D$+cb$yAh{or zor{#3I4rmX@N+%>{twnvt+VxL(>+mP;iT+_v$C;oWJrlpK^^17?)A1q8! zF*eGh$0j*bMwf>;Z7usTQhLJRHzPfMtyc}r+b|2H#9ox&Oh#LW&8OGGEP<;s$-nau zjV-P`$a#EmMagDKL#kR$E85X?7#S!(>!VLicaGzE;LGb!+aGb5V8?fy=CQ%xOrwwjK9hECc6zLm<|v;bLFeb0wo#!B ztqk=qqX}|iW$Jz(*XiiOyMg9Rg*k)k0T?DEDAwXjBmVt71VVlWZdDj(p*6D1{M%vn zTgw_#wvIx|`j2IAzIU z7PoVFbCrXoT;$sKY_&2hhDoF24mSmrD9ad*yL{y_Bfmf)!6ftbEjw-h;qgt5Yie$@ z8S(07KS;|6e9IsiucyMyJqcqOeOA=;i~KqOjC^iMAQ{oVrl@7^13z-6(=|2(uhRQprJ=288GF@NDVP; zYYGdi6c(-_R$y}}ur3GNzxO?vph`q#6A7e?B4@=xWoSe?)2u(dh=2N_h$1Y#CDF?D zxcZ6F{YhQeKwpoRu;5ZP<1p`&x9PB2+t@n4_^?{{*IWe2Mv;Nmj1Awy@6ve^ z)VPr3$;;(-)n1ez#WoQmH^cq+>pwqCMlfHKsM;?4Jw4)|U)#!rr}M_Pb!l;nyk}dW zA=aSG_NMQC?u3T3`}uoI8>#eseH;oaH-ql)`N{7t16pviyXxp6dU~kjl|NRL!fc1T z$c^X0Lun2mOMh6In+V#yc4e+ua(Bf|*CeII)GOzb7l~HT2ODu0O@`CoI~4jr6lJ0{ z$))tXDb!OR#&b{AT{HHG&C)6FjEgT89phLciC#ROaGPe}sQgwU1BPvVUKZ!*^M2ei zJQTq?{UzwY7Q^qhq%H$nt^-GXvt>n9Km!t#zdn7F@Ko=V@lSysBD9)={6k_}h8O{8 zvk&}8erUP|8V;0=7$X$-GP;mI_= zs}aWn%c062FGyl(V=6L!Ej7RCun}^dhpQdYN-nu3}a5dhqUwEmqKEU^< z5>_6yySlRrBg1V|_@U!88&IN|9`G>R(f1TZ5AjuXn8Kv32`CMtNMBK=-b08c`wijnvcI7G5#!QV}3LeDe|OM~)Y-E<^Y88vby(88^6Daw-e+Y+ejQ z$up0@7PS{x>HUDo%3Lh=A8|qizE$6hnk$fB@DXZ`(n0OSXr`O!M)zC7kw`#5?QNb6=t+~l>jo1Lh;l+b z^?Y%XsLX&4Ld!{nA=Y`P$bQ|QI5OujnD^sAPwkE1yM-DQH}}1$u;{(R9?yKy3H@c^8DxbWq%&FdVyGHj34AVw}*lJbfqn zT>Pj`{igSDqKP?eh@JK;O>N4U$gvaiOy zTX?f4NNL(Pl8id_ezgpTIY)c_GCOicAXk#u@^FjS#s$A&hLaB6>>5|ZveEO3jUECU zJ!Swsc~iAVK;1;W%DPyRWiiO&#e_M2PS9K9iD^xe$6oXSwbaSkIfZR`ugH_n2l*if zDv0*UDPk`S&>6(KOwC;bJ#lNv;Y0Rwe*5P4d>n{_@l7}TXq#qLZI2$ZIuJdW(gZ)d zd$Zb&*9M9rnrk);2IpiIhs6`$t82%~dnk?WFHkdg+6d@;k*PU{GPqYwahE%zR=CY; zV~9hgyv47HXn;EU zu0p3TWBA;v>kx?C@XX9l8Kz=skzMV_8uQLe0Gmf0e0LsXG~WzKy36Zz9suGH%>{ZC zXpjq&KsM!PWj=hHOk?XR4Y3Qiz!8Giz*ixauyFMuDNKvo$3Fy#O)hu|pwMp>{?3l= z*t^<)2rlWtt#Ga&E7R6B_Bvq|a|?_*C{Nz*(Tun=`;o5K|IEr*?_-Nj5ybxJW%<4a z-Sn}pv;0PU4)JLl8`Zw_8vfMx7Mcy*8Y@;;!`)}sLM0|#xmVPx{clgu-V`v7k)ela zQn*#s)`Nrds`|y10+c^{h_4{M=4Esy+6(#}%ewh)8Y1ee-v zQx5kzP)C$w{CIPbEVFv&!%2G56IY7h1qrBl5mVCCsazqN9(|>Ia>Ca8(L*Gh-T;?XGKQTE>UVoAGlm3qMA)j^H zRqMe?mq|Be0t4IW1h-0HjT9ThDBy|nv_F_T3R;Bd3q>twr6wJM>Hwl211erow|PdA zoJC~SNuFTxrB1uZ0y`<6NA{|0N2wAObkDf)-Cx=4{Xx!td(A)I#l9n5%w%ur?i!Zac@k-1DykUFMp| zE?n?Bo7dGh^J(WO^3oGV`J21b*g1;$UH8s{T5H8nZbTjNAcch!K%Ed< zJmDUCzalnhTL96 zJWV?4D-3+6YErSo+qVL}UTGrxg4WCMzOzp)@5pnzeUoZZ)gyV3^4x|dG)&n~M9p)$ zAuBF5Eto;%3uW2Ou`GAaWj@XSh}}Fp-HiC`_tHx=GPR{l_uQ_>`a@3|sHg{Y>}E~N z(ZESt2wWUk);Vr?kA>w0-c9}D*h9dvU<4L(JEe$*G9b#YzDKz-CVKQsj9=3|q)VMe z^gksBh8Dqs(o0HUGE5Wi;2+BK&GY2chl6T=TF6{l$Pg7+^h)#-h9Ns>V;)Z3zcKCR z{JRw`h?%q@9h81@M`e#X(x_*cDf2YRaxjK$X8w`eE8lL!ZGWUdlx9{H2CraIbxwp2 zLQShn1}TIBkPHTGVdpp@9Dp*Rdz^5Wh0Ph*tF4xNk!6z@W%7=!=)n$u!STaYYiyVH zkElF0xa%t%Nt`gOy-{~Bm1bjl`_yE%f-gGE^B{E5IYVjDEHt+waw`2)yQ#j$>z3cD z?6@s|7Qgv|;^W^-xH{dkiuJtE9a6H^^Ju-;EAZs*)V(9dXXu$FPKAT?*=L!^PNvo5DG5O4<-4qNZP`!@7HGn)CCq~P!3MwKxJ!0i9!t?s>Dn=(hn3{JS<&7;#GYa#u6U&Ya zzaU)h1|Asuf$6bly;f5y#N(lkz-g{@m7Ac^0_|wLgA0?7tcL8J@^o-7PpOlf1vfat zn{W~+`Drv6N8$dwuSocu)e_BWjC862wcW_?Q8)!67k8t}5X zB}J+U0s0%jtsJ_xqAs?n@nd;w6hF=ploUN&9dr^6q)BhR+5Aq>_B_^W1blNV4CF@R zM6$_ya${4c163HTB0U?i3_#~|CDyF(I!)&qsB>^wO3JDcUfyv34$zGNQ*R({P0rrvZWuntOdY1F_DZX>f*QGcOC z8KC4y0*FFt;cbgc`dAh^WAldAWDx~cqkn(H366OXpeHq9R22E-Z2icNeI%T8zj`R4 z4K>e1UyE=p#4f#qHX((I5Je*&E^#UUnRew!vO?x@YN98v_4U1NqLTs8=H%S8kCJX< z{{mL|vw(zZj*O* zeF}~gI`*%w6-Crgw9XR`U12%n#@qR}l@1k(%ZfWUGdi+`cip_S`&=JFu?5b<7GQjTx z78bMet^1PH{YH@lNw%msX@hy^^Chz-Ox1Z4?+6{^eTlqOGGLsjGA!$T`X0tqr#@42 zG^f}n>xyU(k91T z#l|tdTUF{VfOh|Qa=r3c9WO8JF)uZa$kEm$s#(9U%Gt9fWcCqC6R;dY8 z-8~As2QjHD=fOTrPY0{8#poMq;o-+-q5Q8OOzDgjZ#K}67OwhS6KYaSYZqNEYpHrk zQsEYZ0Y03fr8~~JK&-7RJiY&9VOaok7l6(vyM{v@VZa8VH@?w#6QFMsAcNkNzU?Px zeU)S?NjYx6G$XJjVN<~?pv0V|HzDJfN@@KbjOp-}-C_@~)~&-s@rx51A&v%nQzGA) zRzf9cH?wNrliAt3j8*-G_RW4CpJKh`_561B3l=CnzlYE$v25 z&aE7~r`34!E~r*Q`uR9Y57w{E_mXCA!yv=h*FkP)L>ND=)jJFy#}EUeH3E zK2z-3T4{x0`qcIJ|2|rSd@Np^pw`+g@!ZFt5ut}wDx#UwQOE20j#rCYwgRTJntxum zLqCCqy$EJIQc03jjWf8q&K32!8;xHT`|d-_hp9F&fmNkPM3F1sWM^Wz$tsVDob&{9 zhXo1#X?91!HBUvPd0Cjp2l>wm%W(zg4AS_hY26n^S~O&&CZ4oLjaBD|%GD)1TW{lP za%;Ii)VRJIcX4F<%X0rHLT&Iwx-Nj|JBs3G&x?QZB91o`=|2f>jrz@+bnr>lnzR-nLF{oL79oLo2LfsQ&dByladuc8UrgP*~pV% zPmeTpek;@1_N1_A)ng23*!9HPM@2=42fQFPNgHO|XPqa0CcJl24OzS<57rDzgpLL+ z<-7X7eu%OdH9}W>n5}-CsVVlx&;cfJ(Ivi6?)+fT`Qvs7WBR5bb92h7^tBqHHUP}L zQUkpyXjZ~zMVWk{6>o%}okjPn+~U_^YpYsAAQTF2=}6pn4Yd|6ytZ~QS6o~?KwOZ5 zUZ-#G7Ytlj`)j-BU#m<^4R_AX#m^8NI}-k1+Zoj^H6b9+vG)QJv#KG*q6KShyJ~L* zw{R>_L#j50@ase)0RaK6P`pLO-yiE YQv2$=?bMxb*f%?`qpzLwo8`U#0;ufJZ2$lO diff --git a/resources/icons/bed/mk2_4096_top.png b/resources/icons/bed/mk2_4096_top.png deleted file mode 100644 index 1fe8c670609e5b89929a6a10a6d370097abf9029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372876 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/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
      92E72|9xe2GpO&_Wkv0@54KcGB zsV_@;$ua#N!;sol5RJ%lOAC1=(P&)4+)sFDi1Qo9wsPj7bw~#gkUBlGAQ~G?S(6I0 zSi3wVX-9xxkO&4+rV|AP8|e?Fv3O{Wu>xv=w~V-tduq^Am%F|u^lKpq`jj+$PA&dL zDM0WGvcgyffg;?0tJm)EIOQ=3C=`pu45AY=R$>*woRR%e&;2NSN}4TH<21pmv5bve*1N_wTtlZO4-nV0ok^bFLKWk^$7 z{Dc6nrOkJmbihXXF|(+a8+fAsF!YbP)jpiH-t$&qV{I@L{{b@w>32nkun+g(oe}5R z=n1qTIlEB`AA$_hj!}k?=~BrX;|Z~u3?p2^KEemr6rHh_TOb}bi02T9hYhP_k;5LA zJoG-&xi#Gxq@^e5I18@k?|`Lc05|21(R3lxsgefc8qu~)gK;TRa~V~4{0Ag>u}Bif z=k>3UgHH3C5Mv%H)!{U6mxCO)t=|7#r*aySHlo}^={5r+2S~7n*0>a^FznmU zQa#2y&Ng}E{!8b@$N9?wWjrw;5(Q?s+@DMRoIkbQ{XFtBH(c z3Kr`+Hd@!{I$iK97-l7w9=j~6W8wIEoCJu8fQYHuJ1!Pb16sbieeB% zc4LvLyLl^9@yJJM@x;?*Q4u#YJ%N_;Fs0e?rZL4Nx#YHoOsQ_4vl}s*{of*O6#Ui% z*H`{6kY1e$G)J=oo7VbGly%xli|Tm&y94Yxzujn)=ZmzZOGA=!u25uHJxb7U<4c({s1$Wmm34(a~7F2{`X58u- zqr)M(>01!s&y%qmZ66KZrF0I}Lg(f=lLZmnMLh~h(Jvpj`*4VUC!#;*Xb6!2gJV-) zF~(EDwOnr7K@$l|7sVlIN4Z;eKr?W8K3SgmuolD;bOLhGAX^a4z(vDkO}zz?@r!!e z5E&_VUT~{DBEtCRa>H;08b%56@Xy?0Vu#xApy?YeGCQdMghDS?McqU}HbjppexvCx z-DIRmS?^3CE8H#J2BWwj58C89)@$#^zadtcdD!9jhyux+%b!I$8F<38^;?4c4?9$+ z?ZA$PH5yMBs6kAd;+G0XyW-6%%Q%8^-3*K9QSd8~wLQ9v!>MUPT=j8TjufYCiKhyI zuEH(51oGbKs?Vz)VqA6K2G=QZf~{U#pvVN!AYXP@oQew-q2r78=ps9`xMlNw#@{FJGXYgX+^|P!Xe$Z>9_zYyZU6;067Lu>` zOZDjEq!Lyl$vqA}3?My6&Z_z^YyQ9I6-oU%az z%!_YNVBMs}8y&GbPL^AljxT4OrjX$G3M@TA@=0$;6izyNDAG@c#w<7ev;Cs{hLlmZw39CR&+ZRxKAXju7qN@v5B_4KvNWN69 zp3HOH4UCg(c4$%_Im{41qUB!7*1&ANnfgn*fTEUD_5oqZXwN&lZrnt`KyYATu+UmO z=vmft&SXX#)&sp4T6K1fKY?xjF-ak1J&z11dE00AmJ>Kry)+ z9yfCo674QoY!@-U$MZlFwRG8lI4@A#Nc3xv5NAX`Sms$Xij<#%t@e)fTbWF@vph8O zs<+ZST{d0k^RP7E>_0rz+zm+&&SB_a$vI*L^xm>X?7ggWkp0-WHfRd*rXJ_C?_N0a z0An2ylKda$$}`#JUPVT(T5a2C9(s3)#2GEv3284!AWHK{2-H(6>r?ctbseyz5L1Pi z`F<;<&$^C|9u?;2De$Dg^FM1<_EBM`4G<)*5fJ}ItYqBd3+nctsDNQZ=V%^UjBWFs z8II1=g+=g$kO`jzXcQ*}%hKB%z8S zq{(9M)<(<_J~AQl#d&{cIRZ%M?()|zl_Kz45l0nv0qUokHK|~%sT$an;n5DkCV(6I zIt+b$TW@MI9$h9hx^Dfj0f?F_v>B#Jq%8@fbE=j{FSBk!q6&f-8B(l~xgN*O&Q)G^ zwD3y%!f|l;AsH9c>p~hAM!zFVDiM1!kk~t5*V}x`P4&a(Lsd*s!)b675@sQ6>Shj4 z#(*PvsihYk7-wO!p}h2BL>LgfaH9{QEi_)fEQ%NE?*o)?)DZc?b028jt1aZ`1v<3u+ zqt+7-N#-C9FfH0}4uNX*g6Y4fUJ7C2jNqSa`dahIIV*kvnk$VH#!1ppUpTq!O`!RU z9X)<`Tuyn$>O1Sp8PfD9neg<0;&T)T3EV}g{=J>DoK)9T?>r?iy=v7{g&1~w^9@F# zHjl2k^|S4O73_l{>pS}^p+N-!hll|^ivy^sELb9IEsD>|x6Tsn%e!UR9a8C55c92w*Ltn@51z_CD*uTj}M#%$_9?v&;}%e&Bj!}gok5NOg|}gQjE=U zJAnH=N)!V($15)hZcbbRpr^QFclteKVc1S3pHa1Dz<(k8=!^0cSM6zN*#nsM0f>n9 zu^*Qi`Dt9Jpe0P?XZi(afxdW*d!2V2KMOTkdVi0#7Dsty^3?&uIPjrxLR3J%$O>Jl z{xF1(UNEd)9+{2OG?gG`(jIOlbgB%9VB85kn50$}lJ&#qG>jy7H|>quipT82add$0 zV)kU%HJ9~kFFrIy_@z$fDzJ2B;IXv{62l4MVOXa_A-x*)kib>$ya-OC9QgR^F#>8-M4#4+0t`Lw4^;cEcaJ47B1J$zCTj)9%jXTCkhKP{(@{i~B`(4v1_|&WFJE1Y2}1J;58^FRxbxbzV^2R@ewxeNn_| zYKS|avu2sPzMNDeG=j3gUQuC2kS#7C39B}WXRx;zL31@M_v*W{A@}x$F1V8ZE8ZIp zEdsYTAV>u~7y4eE6#8g$m;NC0sLgDOGOQytzqzVv7(m5)S3E`*x}<91v+n)T)r>8F zAT$#wg4UVg+q83D(Yo8&hEjuaeyZ*tsik1_WO`fbrYt$irfV|Q)=t;d;- zKymkcwy*m{yc18E+E*l;JQgM{6zwS}<7Y%I(muL2xDkz>}Be8VqWa>YYDA_~+*ORfet< zUE!l7C&{lGvUZSc9>zxA_UL7401*caY*$phcxPj5)dn6&asCP)N-@JLFY{xOrTkc0 zweNk~11!vE9RAtl8VIwlFkm*lU#YKLkH4L~0~=o}oNk7y(OtfR+WfDzVH8V)VVHP3 zNRQm5?Hqi0}TokgVg;CPD2`0{H7z0lYx41IhHxA^x-P5f9F5 zEp%CFwb6&+bzZsdyEA#m*h3eDIKzvp(^V2C+?Jt-dsxl;Tl3oyA3R|n!r|u9Qhfbx ztvMVJ{BlpA(Uw#}+$OJl1s(_)JFpSyJ?OqH zOc%R77N0V5X8y#xdvokY%UHByG|LGW%9iA9o1yqSA*-NgzV|*sy`PEMRJ+ia0BNd~ z$-e`fLuX1INBtTfmRgRcyiXC1pk(0n>U2r*VzbJnmdQsl?lBtK(MG)&Odx{6j_Z8|AZ3=#es#Moki4?C`WxQ{kWV`bKd4W6AW`J>XwoCthz_J(a$pqUv_`4 zflPbw6c`|Q%@CA;!a&T6r}RIr=PQ67!A;%xEZ@%l-SAluD+1re*7a#*s*l({eGF5I z%6TL>;>P%UHzTX9*U;xp{)Vv+27_Y-AJzpQ_AN#vV5d&EG(13ZzCpU;jp>gKQnXmA z$$~?86;Ht2wzLgz1@89ix^X@e_OTlU{Rtb98Mphc1) zPZMEoMm=hsk8%qVEjQ6%ZtmtLvSAzhmkg34L;H3T?`+s~C%D+IsaYAkon1tHWiT*OkrJ1Qmz=Z9P@`L;=I_}Dd(^|bvq@0avy=QJ1&SHluvV8bp8oC&RROx-&-^?p(D-*& z8ftvsj)?;-aAOsUTd=n%Q=JMY_53V+m@q9@9_;c$_j%_)T@l9Jg7NF+EQRE?gFife zM$zXbZrME`H{9^XS|mpT)kJRCK%`N(Bn|G5w>F&#jXgJToY{Z2@?+O!((kHRx z5!#D=xAP{Eh)v)aAd?I&8j|`XYy|V)w;wM-)YmQ5MsbE~hz-nDZ@3Y+lkSoy?*xwz zW7F7Tw4fa0H;wSxd=!5z?a^u5i+9`z{PIX!kq$;SkzfphUk zM3ykv`$mzwh-{|F*KYu)*(r3)IdX}~l4EFh!j~z239HCnnT+)tJ$OgZSR7OQl>Vo8 zoN~7WXrC3VV`u5o=@<^Rq~?SOWpUKzPs_+e8S^fhU+YGJIOU3N6~i=~z!h`xyirIsYP~T;bhkVeUNNH&H$i(&MG15K z3A*`4z(_yd1>jk*iX<#@2EJ-Ld{x%F;z?10l?ErpZz4at*lYLIa5S(aJ~_;5O8DOt zpZ0*!P`x9Z&13iazaAFR?!5%%Z)sBA4%VSsijNe4n)M%z9((x=IV*6bUuh^#xBm|O z=JW5uOc@y861V{)kxQRhvWzD)*r+wd>^BJ@5>T<+9izv#OMv~` zI~+U(H<$ErUu%?jQ9ZnVTM@{ah|IR1_BA<$%h1P7%yK(-fWHJm1>Myf~Ez`%9IQe+_CA6R?d~&KprD zsIGUeJnOCIv+biO;Yu2u&Bi`#bb5a$F`5qotpIfKoD%exBGvmIs1+-`RpK=sJd$(~ zCXSUti82#$h<8NL9;7e+!djloO2fj6JHS+=_yM*cPcgf;YU|+cw(TUd>olYzXzs>6 z<#HP9K@aX;)r;DeR0syD!B@0*^3Ht*PniV_?fzW_f)l5#XZFF6uLxWD*mc&D=I!4( zeEG0tBOB_tY^dY5lUXj`S(1!x_|A;eN>J0yL!wMqSY=1BM_=O?Ntl*HaRb2$<1T

      0b#_3np*;&0srBc$3Er`rgm9vHqu?xUJd(c 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 z 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 diff --git a/resources/icons/bed/mk2_8192_bottom.png b/resources/icons/bed/mk2_8192_bottom.png deleted file mode 100644 index ccc83d3111ac6ee7dd4377048872ffa0cbe0e1ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 407988 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�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 IkNxrg0?yKzDgXcg diff --git a/resources/icons/bed/mk2_8192_top.png b/resources/icons/bed/mk2_8192_top.png deleted file mode 100644 index 5e2ab6a5001a1f9e164a5af2ac013f4cff1ec089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813055 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

      xh5Zw6KYsl9 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

      Stn?_*9$8q&V3kqDJ{4adN{7AM)* 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 &)gT1?b}o%;1Q4D#cQ1yU;hDt?GxfTUsUKe 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

      Gs5>|}$#YIa@*<Fn+zi;iIxxOjxmDjKL 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 diff --git a/resources/icons/bed/mk2_bottom.png b/resources/icons/bed/mk2_bottom.png deleted file mode 100644 index ed94b0d62145711fbd079ae4c32ebbea2c8bbf5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64115 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

      pT$6#F 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

      Be^t*E1^cAQ&Ju=p??;_ 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

      v9PbGP8KxJonT8aVn|Npqk6J#h85Al^O$d= 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 HIz;~u1jptJ diff --git a/resources/icons/bed/mk3_4096_bottom.png b/resources/icons/bed/mk3_4096_bottom.png deleted file mode 100644 index 4a02aaefff55628303c3db0e4240a13b87725397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146657 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

      `D`3S9R?oV;y`Eb=!_9ye zifH(wIe7~jY4&?(Oz3()inDad!vVJjU$>^~<{*!dS5v8w^9TIKx|d(~B{6my1pk^vzu)PjEsv*uxv; zW5iAM-+mUepL8|Tzni1jcG~2$MT~~g30-VTc(z?G>@TIJvvugZ>FC(VtpNTRaN{Dl zSIiuvA=r8PvyO_;o(r?AhWX!2&UPX+pwk@TMj2GCZfrDG7AXCu^O}BUv)P~G2Pi8ub`9QP}U4R+l{!S;H$rs9iSB}U7F7glg9m#;9%%=u@d3g zu9T3nT@9_1?nnigQ1mv6YhsL!?3LfoUJ~M7F)Nc&ctj)FCAmjA-}UA%AWDXlnd zF}zsN3S9Egmpl)TL@(G99wozid&F5<5aUt~O@MxM4$DkTzNpfX3m2UMkpX<*8dX)u z{Qw(b)RYZfx9dF#lX)9UIT!=Q3!Qgvew`=S&+d+)s+*!)l5Rxl(*fcbxat1B%BF^M zQ;TiM_M3%KSII#;UV5foz)jNQU*ooeJ_*?k957}`%YNN_L)Kl6aJ#MWXAn6TRg?sa zp|^CgJHyJD1K#mWDYzIcY>XhX#L%oy*ZP#hasV?3=Rrii^rtB-_qZ_oy~{V)+*Jrq zvX6%qdcLxBVm_$Q*Kyw{wjDc zh6@JxdH*WNH<}svTFZVS!BD;2dmDAu~xQL`_|8 zl*%obv1Lw#=W*>_sh@shL3LAn*^(T6vQ!=t%xrNmdQ`j7u{SWp`r4q@od$|-5oAqu zRB@xxAX^iBWQF1Eqa|7U^yzLWfAv-C z>*sZ7FipO%9ASE}3c4n0a5DA)qO6Eoxd)v*mtdtcJ0NtTDMUA<$UtNXh0<)<@H?fx zP<6nBWla?oz*!l1k5J&?eZ~`A@Pa7|Jo+$#?iIWfrisPRFLWagAl{1VCUeClNMIMR z2eB~vd+Y3Lq8h2{Ovb|g2dcQ_ABbBy*rBxXF%+{s@2WfE-7XsPfl@c3u$|jX}=jrLBPj-$xxVH1=>_iT;L=2L7!lejy3e%pc#$ zp|XM|96XedZAc5UWk$V@p{#Fv)=o(+?2)Bb3y(ixdcdUT25O`NZK3rw-S}$yXT#x! zln@ubX4ElWhv`i0cf}7k$xNuLctgG93>O1IBb=r^SUT}<>+}hQ(3wleHx8_kTN%u( zQE;!Cg(bAdKvJb%_>-dq(k!l9hnR)vVpdkpyjxy9s?-08(GJjaJyoaAjLF!vgvD;r zqXHYB*N@nmubw_dnP$nm86!SwxZagn{MIe*;-2$`1liz#e`Sfe5**r!Gm<>saI1*fCe(rmZK^b zeBi>r_q_JggNmaCZxWwqpeI5iyxcdLsq#Br^i0Ynv;~+DXN5T#4;TZr(qlJ!#DA)m z@^lJ}DHc%}Qx3Nx>9!LGeIo2l?0FU&N*~{f!Ip&cR(4a^oxldUj^$yrCa<8R&K%1w zFfPj!oH~nJxYJ_)nC=G~<4?*=H$n*mf5EY=iwDt#7?nEW60X(35cgpRMku11&;wQw zK?if`osWTPA#0D7@@YI3Jtq0W>$ny9jK1gL$ZQ)`ULVm$$IO;?6L3e&&fZ;JYqet` zhsQ@vD`ylN4ECnK{mP5d#fQ>O4}L(HuqnYJ*}~0#Sl-{7i9m+ul>XwhI%sZ;1jB2N zgKLSFDSTD_RscMR%=bX=iN~*QLR5Db{XCFI6t1qz0ru)5!O+p_E`O%!Wbm%5DcC^} z?fn}od>XGHOKdBye~s&Ynp=&Yze50{M=~beU(|S8bw9 zeS9&C4{rS-J{Y?5{@Dxq*@6Dbi;l9fCM)iEA9k*$B=)YdRNZr!oU40J7E=d5vUhun z71N80PD=P?5+1EQi~0c`*$h2RuD**cq87uys}S!Ty8oG8{%F&$b_j#;DRT=-S^k zsN*F|-H&#@Mx<2hv6Z`sN$ytSVYw2pscp%JD^xCi(j`(B#NI}y^l5-`OeLe)y=7^y?D%ATtJkD=L0w2Xg~GfAY6IZEcM_% za6FvcSrlZpv^~sr5IliHuzy)r!auq7Zb}WW%KpXsVOuG$I*ir+e24O(*rh~l0DIRG zcku~=?dh@WM+rA5mYsh*v84Q3&9(ETv|L^R*NxD07d1W}uJqsLN!!NYmZ@mrvxci&4Zz~9cOBN}^%JjPI} zSeS5;!n;sw`%;8(KBv^P$3K`|SK6Otj)mmXa^b!Sj0eF0QWtC6EF=*m>;(MXMpIwnjZiWIMur>DEL%x$A_vMsA~*C7(_5qs~)* zT^7R+zxNhlYz66ZTmYsUo}EphCgh{JIN7N=u?p>8_=$YtV>rIZD*Xo35JF|(5qc=} z4W9RFp@Ax{k!TV;7v-kv5WBi&4~w17)0~inoOF=|=W6f%>J!jNTUNqN8(@S<&R|qd zJAG0KD%Gnd)uU6JJi0cQc;RG&K!LOgMR5DW7@69iw6>-w&ZbWBNLZxWaUZC= z#^Q(%bmUzBPT|Sh22=FW=0QB>9ttbI;||SyEuF1#A9ya_pPs9yo6Fek)eY?f2m7A7 zzzHa@U$b{?S6}vl6K1}5!jx>!H=AMm`0w?R;qi1orWl+Zm|gDlGP^1oNxzsybAxkq z++F|f*BgukwQ3f3APIJcFq+)O!uSjqh0?2H#N})jdNqK5PbzVebuO~S(Wa#v{3Sf1gE7Xa!x`(Csh;;U^R9V4HE{3bkrdnkCrNI;q>;L#9=@WU>r(L@pXMRrkBekNost5C0gHyJ&B&QVs(zL>)F`Iv&PEQ;FRbHsb-ikoU-ANF`L!m3RA1 zw0adg8)wO;t;d%)kAfJzCFxQwA22}}^cm{iG5g z(}f1QAKz_3)#!3sMBN0$-k)^v81&}W$Hgq)<$B{^psR<0E4cst{4JjI{%P)9=tzQe zP!n2%ujeDAxAAFewLabHAN>$BP}Si0qem`bU6?*(#rft>31+Gg;Q^MwT)Firo1vum zhS+S?FS_b{7vDz2eUO8o$C&cUznyp=6a=A*HP_H5+6uHN<1>xnDWGjg9C}g9W(4dx?OP_MvN*)&lxd zjzr2p3Lql)JyT}UBi*LzQDi_K*CYL>SU+)L>%)1O1MkR{Tyu=i4p&#sgk&1z zb*Y~dZOG@1dEU2hN0P;Var!d(y|)@fDH2Mu6VUrwBj@GrJcJfyYT05~>wn6JH1J6I zyMtZMj~_{=xhIW}#*CpOkM(>cH)%$skS?f4F2}S(j)?U zlK$-VExv>e8TTEdpc_03hy~YK!GxKP?(9(B7@?K088`Y81hbOW`|vkrLy9g%>LUK; zlCI@M{J}*|JI6Bu?`9_zS zLAhx=0PbHM-dHTxD-rTJ!zF7S?@gbk|wG=T%tetk-^oJh>Qw$@1E zsoB5&U;IpiZH=3*dU0kU0Op%oCC1@)t*p&x=C+JVo{4e~C|b`4y)2-zF-9x37Qa5$ zCI!sjh&E{s!j6Q*()+NK!JO2D{56GxhE)xQ%=iP@kQ1M6sJLQ5^He)(WI_iEtUWZnZ$s?|EUkPan*#i4y#$+#PCnbJevBAsi z%@_w2*ThtUR-QFTVD_uv+8He;`OF%Ex4~nfZ>;4Ba=XU3@JYS|B}K~SiVHcOmL)_z z>^!??Tc7aKZhVpF$xUV&SJBsgpBca1G2f;f_A+SLMi|2rlVG8I4>stFLz9Ax><@s; z&M>w%T=8Dvv4jnILf`eENxrXzHm|6PlXEW#J#hsW0+&17vCpI}I-X_1&{yaxcTI}Z zli>P2fFHY@aQ`TOxc%-LWk&gTZw`Zrm$0BC)iG(pY&}UKNq06LE&RYP%Z}=_a#wGz z3bTChyQ9imt+kr&ft3xzNl865nQOuY>MTT&=|Q#+mc+z>ySf+QN*ASI)8~k@7VIWo z9FP;(OCkUIvq(aF0oXCO-Hw%-^Zz<{X0bw;u4Wg$3l$C-IglCsbYk}X*i!de;G5Dc z96|mjFr8yEERO$>UWr@5B68&9mMj{*9$%J*q;(gIJq}UwI`BauZiX>n7;AkQx@MbGs`{Q# zQx9{86$jn3t%nv+MYVXO)rQ}9hoA5P(jd%^y(?t+I~>zPl=77!9_DnuEXjH8p7p%S zPTDnX*WsIKtqAO8?4z)|JD(Si5afCLe$1`~=ow^Kmi}AlKv&`^A;MF=N%_p>NvdR( znCCio$P?$rkL8rc(I(qoha&AkbEC<*R47>+EyveWLSLMot#?lDQ&y`uu2Xh%POY)U zqa<1Uj8IkrXz1SMy`lWb!0#Ev`vqey6&FP-Ua**`Y7doyXSQz^BOV-8Pn+}|ku9O_ zDdcm9b;>49o<|njUJEZ@iaVlHvT!u!Oyn-=HsaU~NM}z~kqt zk@gcw+G6){MHR_bq5IZ;PCAQQE2lFiX6S1vW=?CqPpDwPiXypl0jYjExNhv8{lxQ3TTlb~z8%|8 z8(&NUyUFVRq$)y)<-i7|kLRhhk`$=AqF|m55^!4L* zNnJGptR4*hG9RhUQl{%wrJv8dGjgfL`3insFwsZe-H>}gj7qux;e1p*ZWTZ8av1aU z-JTPIi;?jjWB#(9>j>Zu7`ngx&cp~~)bsPotio%{h_}~icg<`-R-#L00Qk<4H^a;B z*24jAxStr9+*!-V)LSKk{d*wV*0+5fQb8sv0Ebn93XE)l9{Z(6u+d zIZNivN9)cAUoq!PLv&aPa1nocRpLsoe~k3SHY^i+m)F61HS_!srVmF_7j6`mD2hkq zUJ)@g?_A`2+U2)JMNv}|+qUN8)y z=D#;uiXBuK5QrD)wnN~JQQsc4a8k@%XdJr%w;x`~xLux<^+AF+&;f~hyPw0%b5{kajv3efR2O=PmzQ1OO;7aH+Sp~VP-kg3gVAuL= zE;b}mo9(l%*GsV_SmZ$KK*33O?|UWwhuDCqe2)!wDjd~fqWRTelvrA1jv%GV-<7iB z)uO1Cr@ZZOh8ONh^(WA0L1XNM_@k>H866;5uS9^Gv4yaUhF@+@Ga=mGi08Z>(2v9& z%lYcaXrBCWYnTjp%N1*G2%cW{&q?AR-TInAYa`QY@|ar<14T6u&1M#F-)Bf(Cmo6UO%2M^o%` zS$1Uno+G9lM-NF?*UgWGO3nT;t6X{HvCvRZt5OxmXS>E19!tD3zaFE2 z{K1NC%?!%BuZO6?9qZtjI}@YPF4N_B+XIUvAKu{);S2e{_4}hL%Rcp`}Z@W)x9GYDlFOP}svWv46rxdZE`+z5#2+fBf!?0pPF#ZvCTrscT?Q?lLL9s1L z*6n)=qk}!Uy?!|4I)x>h-TPz3zDX6bDF0aO5V#iix9dOx?q%=M*`}O%-EPu#My#A& zr*{qQ))tZ{2z|8o@K#$Uirpu0J8*m^zcY z;{P};PiBv&DN1r+`?~d3I*=D=>?5!e`sDQ$vI3b*-uYCuF-$jh8mrfr^+=<@wA z^p&<^#REY>CVoX3j4p|+bteJUfas9DFXTFn#5$Tt!ZM*|LA13Z-YlVA`vQ)Em3P~e z2HXaf#cdTl9ow+}$RtB%?TBu6v$B=b9BY4tH$RTZWpeB~2dPJu7Jb6AcDnaK^A~s8 z>quWXw@-825jE9~6I4w*!ec!hKV`=*9eR&iM14GR1RU9%u4b z4bxr0l>MldAg_CkbaltFWM10iU}b_bkQKPP>;04?TwZ{FeT?{gyz*3OSL$Lv7f!u+ zS2fCGGxo$lz)`&|bP|rL%+Cu+$E!^dW8l&BX9xn)o)Hb|{zFp=i@2^h7Aop?hgUqW zpyJO(ME_HUwmOfYAK+o2qIye*9JsjZH3Vf>v?CVGcGDyd%S2z4p+8A+LoX-Ek|~4R z<9|gS1ZUG7Tcmu_iXi&EjS~$i1}zVy%@U~@?=bJgS~Tx7C-*K#41En_I;@|hkm>f+ zHKN`$CSp+wqIUG)F?b$usY1~s{K>og8@MR%ywIPF zyijPMgggp@qCml(?EO-XfQkgp2efTI{~@rl(eEb)K~BgOTa{B(ZFV_-1b0>wi% zm;(E+uQTX5{*@yYV61MJ^@&`@%k<1B^af70WkEX@&|8lE44ziI+IgywNJwbY zBc`?f2)az$ak{hty_$#100{lHcc3cAnhRZP&#L~=>W`fD*?Z_{v^F{$Zsc?vJpC5V zfYAZoVv%IE!V}&pDaxc&P!YNB=kl2 z6P{I9DsE_L%&p#E*gFD+yJ3B$c?$PEe21H)`p%LCdYS%a_6>;xPJfGd+pG4s4ZnJu z%n=_1S)Z)oHFu29$iOC$86V6Di$(S}sNCQGilE7|UD8O?D`GQG34n@OahyQY`mgXH z+GaF-kUaj98&%ex3U9v1L1Y?d#2-?u=&0kOqz|*>4BDDk)hMyn)5dqCr0UKl&3@6} z_?{MZ@Dm~F_IO}0JznTxN75Jhq#fi}A*i~JUhy`<$7Qmb;Q-?4&$8Q(WPXzO;`$~2 z(-7s6BEms6qmV~6-n<;rviCYC^v;^BeCkT0FmVaie$w+Dgp*^Wf>$g%_cQ@a*%Mpw z#!14{ye)K%;8C@ix<-aI5FU8Hg%1Wosb9_Qe-b4E5Zw6+k96m0zxRO3zGI18w&g=< zJ;kETAWIe$zwM|qigbXzY2;7#XWtmPx?dj7GSN)IoYCq(!HPbR`(iroz+-edm|GP4 z3h)?zTsiAXP3ZA|x)#Ey6Hs_eqDrX8#QJjM>dMNyj8`j>yumDX*`-gi!(|`yHE^<(<%zoKY*z5jU1UD>8 z-|UQ?i&0~s!`C(Vs+hpjP~dPD#jb`sNF)|rhSWgy<(fH4ZtuR%1-16rJ01DPF!SS^ahu8D}5*Dk2o?s6!#N@j7Yi(2s(xX*_pR$liOXiJ>HSm$6;zoX!t4Nm0@Mw}i4VxEsW9o0PpIM8 zm5KTK5WwL|&x*)nHaGm8Cf$!J3zMp#6$YTTa@+cykQ0P7$I5~Ruvu||;H^a>9Zk6qghF7LyWrmOj1 z*QBPX!Ay@@f!{E0PFBvhkh^E}Ls zejEYa$TpOrb;N;OsNm~^lmOtZo};tD4BvML$M}QOiTbm=OyMN`KwhxP?aAr;)OQqE zox(eYYkvl$XBh%x|BE(JD93YGq^0|cBV$}tWNq#|IE+NdoevllgN3G=gI<3WP3)!= z;Cmpyi<8Ef?zy5FtzPKozr+v23vuKF_RZ}El?*tIZWJ$|{*71dN5sgxbI~p;U_hi3 zQIGV9MB{>(el_;+pOBe~=2w>Su6-!;Lmx}J9{~ZY*M%LccgJ?}mbRk*qH*Re9mshf zT9SD=Y;NS2cerpg8lEwG3Va)jKW;Mt)M{R19Z`UQH%l?(M1X#x4sOJeqI}~m_PJ%h zlvSjD{tCF!=3JnB=?N^zOH|Sb&m1wm#4O>`n2yDsTIu21B6ZEH2&AHFAFMhHwG3ms8>$d3 z?+k|<&?)HOT}KLPEE8eO*5M9iw%JNs)&Em@dT^uyCOX?!s=5$r&}_d3niG91lH-Hl z5->;~0?!Ataw&M#rKT1~YC^&4k)4~CKknK@HN7s$3#p}-nLGzKas&~};Ft;>GV1`q zjFK>d659*!ci9T_6lZN;7OjOh+V6$7lyq-!nhi4&?hakoh%MBj1(3mV1$x7LFrOJM zRJMM(Ty;#sV0BhAdU@(a{?b1;(dM1mEl2UT>GUehf_~L2CVKp@E`0FX;@!ahdqyk? zH(5HVjj78Xj}ZxuwO{ALVi_3gjuBRm^$RVDSBP#f5d-UZ*9sq>lE5d~6G{uErvE^m4Ou<|$(LgG(E3N*W*Fbj>XF0r#Oa zw@h_AT=BvKwr(Q%O0ko%GQjdsLrF2wYsVSb>1Om;x1>Zh;^>3`)`!#P&sW8rvxHZ| z>Xa>2Y@O~f!zCZ!-@#M#}8_;ouu8;D0{%@d9^AJ>6#I{(xEp1DS(C%K+HK^GU4W-isjf zKq8I&O&%1F&Z)lw$J|5>+6_AWk-}Pk-U~f|Cm%Zo|9Jstn0tx0roCqE0}6($+nb(w zAYKt)d3S$ZJpImSsx~1sHrhM;r8NQOThf<$>d~5;onDeC7ba!hyhe(5;Np>r6YZ(H z`OcSdBSTwZvs;<*>DtUw(rr&YX}?vqcAoKjnee@)`Ry)YaEFCV>$yeeFO?dqPEV2? z+q}wj#01kL3ssKPmYCFRLt;8`52dkj3N}Gu39~q0_{X##)JbLRo}Kh@iTp){+!{iK z_uOSNGP6Z&11QWV2yuqNF_zI%P(@u;$0{x7$->6Tb*0EgGrU@v{7NgFYVOnRVudB# z46>C6Y7EmjBZ13FMVDz|Mm-JZsZJFsuYk@gbgda^Ho)@rCk`tGR#?E(Y*xd@$?%UNwoDEOvaI;BPCt;b-YRMNK1Q4 ze3N}zsRWV2yKB6`_<%ZqdGuYMcNt#uMhd^tWk5#}EicxA(~o&dvhArC;kOU1ogP0Z z`LnRkTYfBl;%<88%c*tMz^z&eSN~TCXoXCOfK-AxRxPQnFY;RbJv13wC*roTd3?Ve zNStTp0!eBUL}{8Vc2A}tAD&NgCC=P=(*48LeQU`awaB9^UJ0H~aW!K5P?8;jsiJSY zlhmUOwaSM=29ANfX#Oc4?#m9SbD+HUp(c|}5NMnBSYa4@y>-dcEW94nL`dB_0``OG z5U@gcZium3B7O>nC^i}(g8SyC_6D!5QyDA7oMif$64};>m$jM4AtF@-UZxUKpB>>W zK&Fi_KtwaiR$)egU;~EVF#_9&=XI=x zfgkBQu}Sp?OmDv-s--t&&)@39XBGLiThGT{@ks@Mg58U-Q|-se=EcTK8Wb(FF-+2N z$%_3A+LPVZ0D|1-G0qMCjeP6VD38S2#yh4%J5-psh~$q!;07Fu8xN=V@WxGc8XFCP z*@&ZktsXnaCn7um2ZT+`v3sUEM*E$JCYXc~pT9;4EP^`>qUF^(W^*)Uj=L(9C6WBz z?a|)W!}sE7Nfl+7JBE<4fy0X$m3*#re%LkRR^v9m05ZjR&p)FWZNEjuTjbyK`Xey5 z&mj-wiC)aD;(WEJTz*7}VF&QaKA30(7Qq6ySND%ydxris#mJ4g9J76$3fuz9)>Rk* zb0EAdI`(p6#if;4p#@~jenj*94`|uw#$Gw?aga-l15BRr!;h6^tEuFDB2Ne4JX~ue zwW7@|3^h_dK_~0yA0JR1_MqXF&GhRbE`0BQ{aVO;}1Z_cV}*=;rv+bayk|&@D6(z`=9b3N`0x;YiQJ z#}YyDl=iFn{*8h)LSDvLbXL;DZF&Rr=5_~*RDiyd%Zj7*6*aXg$hb~-KEELyxgSHC z_tAyut}fq|1Pc#)6#KVc2ZNeYGQ`!P-?LLnQ~_)UY@W)ViU8vXWc_9!Bw}bznn$ZL z@CH_?j5)6D$5g?a=R7zyU?%V~GSsH3N`EEp;;?MhUJ1BnbGS@<4Zmiv)>3&Xo3jqu zag;${w-!}R zV;%{^%rO)IkxUO`shfaJK*p*CrTh-rM|CfZH$@~@l=q?fbogU!FO+`WAA)DVRWSsh zlKh-C<8R3CDkn~VjCAASIV#C^#_9W1S6nKIe_+&cLJ7sgXdC|5Dau<41VjZe@2fw6 zqt(i=4C$WE?(B`GBN;a>CGPb`Em6Z48W(PVPj}`?*6ZoRQHr(b)L{teY#*i^{V|Vx z4USYn>NCXIh^Tjl6#_X0_RD; z4{}SZq$MVw{V2GOEDS5MqsmEF=Is?NMZv|85r7tM@Q)$3Z8*C%f;(<5ZLznB+ zZmH;yZquYM%kJbwhm7Bk7gd6cBXvz7lCM1Ai9q~_TqYOeb)V_Cy$>`-uunr@4x5n3 z5_f$26&0vWiIy6a_m)A1P)79apC6`C6Xz0~JV2B1#WL1L;RBlmV1kX@Tey#Y$*|^P zbpr^q)Uf)?qHeZ z7rVX;?jha31A5e;9uy$$&0-D_yef0IZ0S|m5TcIs370HuRE}d*p9gCq!&ickTWLF4 z^NtNv8Rek}d5QOqL>IBdLVBvgNgZ?}z#}zxnRI7>Wii&QrfxPHcYn1@T`79+hiAph z#o=96p2xOX@V9HXt3dWL%A&KLCdO?A8-|`|Y7fA~0q9WIJJ=(=*)4e-7elc!lHf&W zVk{vwp{;yH&ZZNAtGxu&h#K|OIzCS$R_*ScsS#FgxfVqrP3p!J-oj+vIZE= zaWzLeXoVa&vHc-~sa<`*I!*|TCGSurzvMZKa(O_Y1jHY2;mJ&wgUbhNR~;nXYn;d? z8j&l-1s>8cn$Kd|mT&{agyt|siXrdi)1-(+bOPyxKs;={7|L{3jzJo(A4h+UyonT$W<8YK3fmL<9vG7e z$|>!p=eawTEy6A9kqSs&#(6x@xju~SkyhQ;K!mn;*kpxq%DQFzwo+}!>M$o);KS(N z>rP=NktU6M8&2w7N=>qs0+T1dZ+kF-x>CyIDEfjV$W+ zjEFW)qwiqTubRdNUXTsfSvg~flz^VrYj~+E;vQnx z!)XG;9R#`qgRdT3f46#m2TTYY7QE?X0Z=z9c(SL@5dAKrWhAIDrkX--hPH(^UBCNx zd1>C0NsSYup90gqe25C3A%NuKX!Wg4iz}u|-YotTu5X!0EZFK|i<)NxOz?dT7qdPH zeCq~A_??tF>!xBfEgz2{IMkK#JE<5h(y(r`%Q0d91GShMv~M{CnCx=hfz;ONBmVBd zbV3DSue1KMjyBvGiz(aKQw9CH545w5x}eD6+SLNLgP&#S`;vp=H^$Vev_)a@)(@*z z6XWuT|FME^(AFw@v$%kii`5mv6K}HkkGo2Ena^%5ynkr%02hF=b(Zt>+a)fVO=ubo zcoA&Ctq-P#Bd-*C0&vV>XWz03R6Ue}2j(E#Gn` zPp~g^p7`c@%hUayq$u-h=!F+ZS*&MDOxAD&i{*QVksUX}JJ0$_|L6(JCXQ3%Lj^9^ zS2MKqx6|uXqIqu13)}DV)#6I08N}P?*^JHi2fzpGU32|7$CVrv7M+?#rJfP&2UAj! z*Mc5AB>8*|n#>p%l5tarmjBb?3P|W`U2NR=!BGWodGCWa%bQJIb2S$bj{zD%u*ygV z+kTq*94&ucdkex#(p6d-r6m|%^MGtFj`LKaud(iN{L7s>!0D@rT}R&y#4}|X6>yR^ zr=;3Crj;R;$&9C;d6Kl8Nh32@j#F5FIm6`pGvg*p1M-YcV7W?I%p5rTAf=jahZ#-G z;`2HGLQmHZwF`#qi|Q1uB=7WHn&sETNQLl(9@4*A_8{ac)W;@>e+->FtiE4|yWrDJ z+5um$-rVm50>*2)CNs*M-CsP<*E%_Ry`6sk>!DZN-r%;RSV@PQw8z}~5E2A4t@JS3 z1X&}GaA7S;Uo2=xi{TXkuQo!C_GbIj;n4^KxH1*8^Q)@5jW6j&n8xlJ!Pgbxn?*dA z^_Qhb;#85a!2o2mV%F=cP3vZ_)QFZMb;U{_P3-bdv~k5nN@YSZC+Kh zifVjRn2Pj&_MtKJ=5+IK<1aa}_xnB*B9-p0{efg6^IleXIc?HwRWW}Q#A1sBlDsiHo)j$egUtaF2 zpJ_K)2p}vPj4f3NBZ>D5Jn7B_Spb!Q6d0*#D>1Z!#cE4t4Z~d|6@XvcJR?5(#UVaQ z1l{o;kq#8}W=?r~KV8i^_6rAGlT{01RWg0P94t#Cuy!*ehg*2RTep^j_6>adgBB)}uFQq!i+- ztL=Y8BbB2wml|b_=(i1q4RrZ7QiK?N_Nz#gPT~fu>;n?MJ9%!dnBQ4f6Y&29$hc6# z7vb>_K+1Z-d1YP8!S%IxAX(|_AUR6^8frN%%4 zEx&G5)4dHQz>{MN9y-%(5au`R%FlD#R;IPvH)wNYQf-Y3NbR zo9f%VrH4uxf}Nd;x_RDeS5ah>=Mg1ctfOL~+st7pP2HLw!CHDpzb<>zEc1e1jALdt zC2}~-T#X@}qtN@3Xdue~`NM-xr}8)RIRr?PmdNqw&DHP$vuns+}_fgZ5Ln8bFuSedS5tvgnU-tngL z1dxu7H$2rfc7?Tlv;3RYL!mCxTgxg%te4JTUNPJYSYaVCN2pCT9m*AdcM^xRCd$Db z$NERi%z@h7-3+ovLiZ;3xJvYRhGr}=$1hm68_`>oJ>hT}!FwH#{P9DZ-I^x33a?`m zOc3P&|(T3K7Ykm7ZC>AFP#L8oCpx_Sm9*05gu>(-dkmOd``-@K!F9 zG{hhm%K}&;9A(GS#PqavvD*A5TQpE_h3mf5g`qe>=2yLpMgg9JN+rGd(2VV^$M4gO z3BvASTu>4yn_0Q3igQ>_>DILRoO{{;b`>NE5#er3qMcwu zD@yf7MpbbbORJ_YDlR;nDIZUJdNYCxq_3!i(^vFua}U5(etXSRsYdSdc|I$>XHx=qk_@+KX>=!$LsH;+m!|8NZgi)lw z)b}QKOMhr+=tF6o88c^use0VuppNhBx|+{(ew2@S-v;Rv$oR1B;nIH1$!b`hJpDwv z=cRf-E5r=91t3e1oLehJL#Ip?D{ejkjp=uVj*=f&BhJ3Ge)8a|e_tvFV zlyBMO-e(4fB>!m6Pz^{)kMsrbcK46Wq(7&PB&xXF`tioDMh-EjjxZfN1^jqcE6=Xso`^I$8r-aC67>17Deq?=gMfkva=P)9s4(OIUu` z^J4ydO2$9UBNo)fk9izB$8kwt8t&Dg)A8IOw(y2?mk=n$_JGWO^3}cYca&D;+e&}< z7f;f=snB8kNgp`btv_qK9UK#k^1n?B$9-AmH6eTQKlaH9>4Mn5UgRR)8f}zGOqD(d zU+!A7jNX2}Z&Q4Kp;&zmu(=2v!B~kR7az>m$L;S7yr*CF6ue0~$s9NF6MW$YWOVZ| zo99vdG5CXkLa07>2j?`-zQfhTn-NjgfkUjdSAV~{Y1xZzSr)>EqdOT^T-a_=!8v48 z4*H9;s?X1lTm6C}RpClIqRQt{3DXsir|S!FB0P738X(0rO9XPjGcL+~`N=AB;1TVH z^NZN^nV8_;qHYN0o3yx>3!cgo%+aauhvfb*}3*9!=y>u}yzP->2+hBT_Kkptl$A zc5xAvgcf}bnC*CJ^8>FIFOB=%!U`AcG>R;;#gJs9uN33d8%pHyAhO_ zckaD)nJn{(++=i0Oc)#&75{5yc>qh3XV$?<0^^?J-)HlkqBhQz_bgmBEu*A^iMqm- z8gz`Y1diD9F{dZDHQx8eMdC?ZSC0Wb{OSG9l%3J)7Zza*#;55jL89}zy&32)R?bMn zsLif-5zsa>Glp7{G-2L_C3Vao>9Pxc8Gwhgwo8ShSlGXhHOn^5*HiI`_GRC+^#At9 zsN}+0+z|6h#2#mM^i?e1RUf3=Zon#YKO}epc(w+&t|!O1jP4nWwiwHU4n*=R`|#z4 zYu!rsUkIJCJdBk4V}KNBi?;f2q=-vKhY@Zc#lJtc!n_1O(oRVkEDy2Sp&V^kd-qe&Ma)Q|5d9ln4D(g+9KfxOI!gtmA z^r9(%c}qF#%6&7g;+bW11ke+g^}LhDG^KG@-?#-Dg5I>-e>0Rsd#!ONl=)kd*UxqE zyRl;dYd_Tu&TJfB$(*S>+Y}UKzx4y)5_+1`2zJpV1O+AhOOzCKH*Ncu@N4$+9&IW^*>f z!J5?bf*4WMtqovYNn)Tv0I4>;%lEjL%MBBV$z-fvhPw5$PU|cgF0)XCr0AQeK|-BJ z%Z6`5S)QjqxApb`6b@f{nxXKeoH|sPfp~HV9y9?_qvV-$kGF1;0IA`KeygSXM#0%g zShkh^`O0zIG@!fi`;h3bC9jEqQ znlTe6jgfBdyOk~<63~?V$wOo^O_8fp#c%uOB%XhFjmW!NbuiAuV{{oJ{$mixy;k4! z6~&(V%p!kD=^q(82ZKkkn{NWaIfQ~KM7M|Mz zLCIQI_WVS9XN5`XNh~&{{d_0^I^h@*|7f?M9F1kb*bnQGQ1ZO+yM7gkO(5;yT)?4b zyjq@5D5%zIxAB3NPOTqa%W{qku+raFf6g$`6yZ2+pJ2a*{AA@PSw|nh zlV4e#yBhW8LE+oxDv9U1iv5qLs{{Xswv{Z$;gt$t8|G-VJCpNNK)Djz_kmoAEWjb^ z0pFVv1S`WyR-kDSg~!ijy?_HD+(1@ajo6h2PXGWQT}tE=p?Li<7Q#fcK9JJ2l55ok z?<{2N_gDo!dF?>zZwsAS-g*;%z1wD{ZP?0&tcDguR;L+mN*PtvNTkZPu;l1z^cr@G*p$jBp(=$+#&EUQ$!#$Sn3Mq|XfB<0K zx}BW}h|Q0siCqpZui95)M0>Ct7f9@OO9XEGg_!uII_h;IBNlE60!d#APdd+scf}jt z+quE$0pjs)2;SrZw@G3YV5g?|)4FLo?@Lwj4vZ%qbU&8@EInyAEB&fRK>X;xTs0>~ z9dI>wa>W26_H;nS-Ro#WZ(91*5|%=T;Ow*_fT>7S$N8%4^MX5P?p%M_wr)O*52Q5b%#0{ zF-m;8?Oe)9RE$Gww$d%53Y55dz|}~v9Ns2J%dS-rGS#Dn6cA^XeJb|7o}Zv|jA>Ni zFzM46dPCh_8qx`tp2Nr-;XLEbu84rv_CwA%wStbG$A9%ARnD3miD9FX-GTm*?xD&8 z3unF@VO%Z0SS@!|WU$JLql*t!7G5TPhKhQtemMg?6!Erujp6$ddY9V;f<=TwAe*u&Z;f*E$Ai5y~Gi`Q)+&Z)g{*kkI|2L&f=G_d#_Wx(6MOj ztmBX4l?b}r9@NtCXLO;|2a6YVGY$_v%Nwylf|2E^iFE2p@;Y-1wnT|gxu8FWu+M~| z-#iSzovdq_mP!|}b1UvYAxhMgsyEVUYOYC&6WTH@OX6z6lG4DZ_?eVtwT{EQuyQ z2?NY8&*D_`pXA``Yg{ewNA97A&<&->C!Nc`l~>dnaY5!d+r#2Y0Y4nLjWp#||B9$1 z3$U`SUv6uRNTd7OGDmaALs`ymb*%|9fbl*)Eh2OHV9xV4Vm~w#R`7f-4!kD37}#&K zHBxP5g)}VO?8+vDRwiZLL~nHY-k|1bwoLP4-@k|-NPt=L2mL-k8;+P1^Qq%@(DM8gP2V^_jGaI0#M?AjLNEx!iZ!}qsTh` z`tDUv+nf8L%UyHR+G%`7clRlgRP7(RQ1Pj0Tt*HGTdV-$OQ+ZTqg$)FB5T2J@nG@p z8ZTG}q01NL&R_scm5fOHv7;pWk@?9Ve#F26a z(|@+)ukk}#>$5Ss1K^rj52gkjGUtSTsgPkbE$Tas$a`^FzMNyC(ByghmBvGvBo=P; z-lYH_I+SelMkpC6+9)Qkgyqhp(T>eS-2fs5K#G(Wrg8iMa);FaS$y$dmiNQds;Olt z+MsbxuR$v#kuDcloT|QVwCQItBT>jg@-aPun$VGPx}I|fh~S;+l$pwc@$nSjE&a6n zrMS$gTl*dN0EB!~FZAD_!|?|j+| zbjvZBm2($71f+s0?OeL=V-qUStXUoPmSmF&UYXe#iRc@dI12x%ov}~3Aq@=c2r>-} z%U0(Hn=7@(P!$@&zh_P1JhyIT;Ap7^3Vw&`Z_%;QivvPTt{VEgm)(b|b}U*4DD~w5 zHV0uz@2rIa89IA1uVM@B`eI?|>ttmM)XjY?e$F-LC|(kAXL8?=!Fp9 z9x%&_(bBc=og&zC()*bT83`m_+Ec~^oCj=Zdb`n`k-vD$Kx-vvuV(y4s@%!c#LDEd z6F9)%k;6$Vr)k+2T{`nm^FbIObR=CTAhlO&BmOLGSh-Upi!P@r3QOHV! zHTTK#r9`s$Q8TUdbM_SisN#bgBPejlqMFXa}{j6N1Atoc7RN>W4MMzU4SK*Ki zFR05|!JFRA{KVqZZJ62&Z$WwrAl`~Jl1yaBR0n_)6KZ~Eo2K*uQKNtoi2VJx%_+v* zub-se@@3(PXcU$(z(3sI41RFsRJhoR04xe>09oGOJo*56Mnz?~l6C9kE!@ZT);}>x zuA!Nv*|)=o#G`4b$MG+$IeyL6n*t@!gL={K2RLgxYu!&spXfj05Gw#3)iH`Wo)3FA z!?8l&Ib2j2S~MA8Cxns|Yc&|>c?Q~-3}CyyQ2_l?a!4O=;3XqB^fzoH-*^HTggpy1P^Dm~13Upb6ThnLCAh(B zVP>@Whwva6yysKgH5X2-a4*3p>kcw`C~;jGs$bQ?=|N?Di*23XEx8yz;8Q8u50R(h zNiN#e0hfI|cZFX8%@V$fdE$C{w8tJ&Vz#gL94YV{Y&JiO)vRc2fmjx7%lCu)-o_&6aLV&xmF0j9Fttylz$<96Lqhdqw$Jgc`jexXt80L z`|}AqW)z-hdhWp#C%T-F+S}?ayz|3^Iv4bRld2_?XB5Ae_}8RrfkR=YrN_zhHZ-5;;%YiDA68l~D8wM5hGUyu`4L2> z&SO}BI@#tJ=p&9QfA`)fw9~TC4S7*Bsi;2_{hdZ}&l)XaC=G5cl@-<$W};vQ(wWbw zslZx21JDNr4_Uz?AG_6uE|=U%inN6{A=XLpK;;k@99{Ysx1tq)6=buQb;|&@*A6gs zG8kto?rOIp;C6rMyVfEY({9D?tKezU-najabjg${ZAeoSDIm{!NMijaC2YkDrV6u* z-QRS@_!~On9ah)J#-ptpFVJ;q)QDoigOl$-|BtxtFPZ!-XSI1k?f&wf=0Lmv+~?fB z&O#nym_r`}3Ug}Fyqp}=zu(8JrOtA1Q)ZH+1gFt8k*_fo0G5GJFRjbEaWQddkHXN$ zckVUaOtaevBT)_>F33%a;m~^1_4YKOr-kjH$Y$Y41T)d)`w>#T^8=Zu5vPXFeGI}w*b=BgV?t#{!$pS(sqfT#+1H&Vo(&5D~Hyxve~w%X^h z=Vu~7PD%U>L(>i%X8uC=b%%1S11O6>Wxcom8Tacou<@IE!RhQ!mqA1N<5Qqv(5Z2*Evt^H)4W(w4P)Rd#S0vc zh}PNMZS4t8bY;@nou9#k-Q-Fc9qY#<^EreaIGqcw+0{UXps4vcyIpgB8Kl_wk*jbE zn=nC0g!`ZfQ^!KELbP)4nSuA+Pn#wjs}IX7*#jWnaCt$ib)X1MxR5gD&(*v4n!jC7J>J^_Yxm>=#8wBz(_D7Nj|$Dwh`L*y<8tqBT?#34Oasc)sCoxlY31BLWJ$b zp+yGX{V4$cB9O*Zd~w~lJsK^5e#%Y%#Ep1G)zqm;LxhtnH~0eIbW~j@Nq)fHZo1k~ z)vU2b_Y8+xpkF-4fqhy$)&Z&>dHRwcoybGpjSKyc+R+8U zhsl8ENi&1KL6%KkrO8mpslzj{?B} z@{EV?4Yt9*=8nh^sl*}7aoqd8niI7@KS+V^c(WX;i;0Up0WQH~3rDYGCdkjm60Sm{ z{n?_IYVN#T+j8PhZ2QI)BcjruC2x#^rf{SnQULMt*JccmsA+NM^r4}wZ4!{E#!W<1;M~6z`L4_|Hl3%`T zN2Jn7=ciE{@?PPYIVF|Jh#ys%+sE@X!{0ri^7ymH(THi1->^dL1#@i>zujMd?N z2IcBJRK~ilAL}G)@!3ia>iTT(rejq+L6zZ=sFRCwQaN-y@<3qN%KG z!fP;_;dlWG`eRtcnV@yLBIIGL=_xK|iLpAED1hsSQYe9i)nlK1mJN#5h?pj1+T4&S z#sc;$uUGqhMTQz8Zh15=6%lM8SHMyIU65mS9gn+?ja+BkRI4APtA$NejHX%(3w1@kLr&GC7Wucg%mU{Gx zDdmBGd)X$mn>zKH!v3KyIPRA)<_b&+BQ~S+^@E3bOtaf}1@%8s);v^M{Wr#qA{InC z=XV2Wok6%0Am1JGRVUUm{+ly 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బVo^ZO%O z!|L~2Pb;PCM1m2`g*jZ%U~0PU?2J>mIY`-k;~O@j~z zSG4t65%0~^6qZkDDsP?Ip4Y^j4aGhD{@!=)MpF9~@e2QCTT}Gk(r@p=FfN|>IziZj zxTj-fQdiuyKTGtqz7!3Qt%3i|swnjOTtpqW6e1bk1JP&)WIhQA2Td*m86QH zBKmFE-2Q--qy1zT>F%kr%>uktcNour5p8Y`QD$nCdU2Q2SLLiYs+_Y!-YW zy%TghVBG!US?GU_`&j zyQMF1WT$LsXIZ$ag`~9suAcoyPICFu8m|-@k^kyq>HS~EgH#%V@Y3=kbMN&Ry-aR} zsWY4;?b7fkn()^~t`h!Jf)W6G^oJ{>#Wz&&3ep+R^QvMkcSO*lObOZ5G<3K`-FnY0 zb1PP@!jr${ED{x&sH_Liz<+eB1*_gLYslk2gX3oW@Il9CYg5vz;^Q|#J`N#YtFC-J-z)TJcQZ}OVOPaHmu z8K?}tEOy~erz5SaV`-gJpy?^JiT+&Wr;Uq2BHjCnt110<<&dt`xg@ixn-Zk|o>goP zJWPER1YoHNfn$^V^QDm0)6K$vTWYOD7piKVR#Z^nLA8@idoeuNCv5T^q{N2WRQ(w^ zXsiggvtpmBllzj#i}L0wOSK!OGC@y3M&%&+f$;W(Hy(!5Bo7p&WEsi*|i z?aCtqabFiUh=TQ-MEjN)h;n=-bv2o%8PD+!xGOkcoFk4Gr+pjKG5bKZtAcJLmbyHy zZVfz@nu4V&DOS#M2i$w1C?&tptvh1siJy@B!jC(_3-}|dY=~7qA)r*4EOsP~EF{zf z<7D7RvvTn;FiCyT)#7a39(|3$I!oY%1pfxf0ah4JvgD57SSd%sX=#z?^Qv@QJtM=^ zdj9Uf*pFyCc9%*0oYI;P|0>L3-rFH#?+Z8xT$b%0-2^b;*U*?<>?vJmMDe2~e>3y+ z4uqWy>DUd>nj=?Lm|88UZ94V#m_?EFx*2yS7EIP$i^?cY?pG}&KEnsvz@#;^$8380 z3SAynO=ffukz#e=1O?;yuK1RVB#-#woVqNsk`!ytl2Q`(wW=VY&6jouD z6XEI-Ho8XdlJYbVB>1T4egKO(Wjk+%W(9hy6&RE|Y>Wr2gkP&7=HahQuF&eD;ZKU= z*K0)u+dQ4Mv3(VO7?%h>z-l$6n;QOE7o{22aFI?dG>^8&WqQi}#UFSXUX2WCJ{YNT z45q`sd-Z(2KKz;?n*P@wQytz=WGR+pyWPPu9xJy86}B}=ww zXxFIdayw2=*uHh;y!+ffnBY>#ODR3|^GviJVEo6(b(94)%v7Dkpgw z9;s@yvHh+Xl=uf|H{{H>Fd1{pIA`wGPu0zAoz_Om4~Yj|9-0xR%w|7>Ieuh`y7s4A zy1Ns3fsl3c%TfN9gQ;+}^q%oU$oy^vt>M?s7$I&cEGwmn;FtAUvXX`^uw3(Uz1l#p zQLBTc7sE`ocs-7pVcR+;n-gzxb@v`6k*pl3HkS zt2k;_xEFs%-5E_$;7t6uU*7|E91({W4|mQrV&U(Wkl_-8r2Ui+#c_^R^?D zWrbtyTo=A3ucsKR)9PdUn1A`KeFsBx;bOMbqrUKs(zqmx%Nb?RnzJ3Oox7uNvb{>o z0}rEg^A+b+35sMe6l*SdMEA#W?v2P#*-YFowS&H$02-=T*d~uZ1w$&P9%CotYNsQY zD#@M<+$MqKEw~#po+J`|_*y?phV%hg3?#eQIYVxM;N#FTT5z%p{7kK;mC>|DBC@>D2&PniPux{Ww-@*QB(}IWivn;5 za5?S>pYDQl6+l_X&sBJ&xz_fMxD>cG)K#&L%FoR*FUg8>S?22J^)56;i`U{Oh#2)l zDjnruym?aY)bQ(dsU8=?ohu3r%WD-Z@5cUcUvaG&Aq#_p#HMaKtTzwX2u&mhiOEfZOpt`1bD5{V@Nyt| z;CaKELad?py~8I3U0eZEl%13GEV6xtOCDOcD+1D{!k;{OFx8)UV(epJ7UR-Ec@*Ae z&mB}!ZvS~8*;RQ(k3C{qLYq`Q8tvJC%|=2iv_!!rgNA^fen%uEC6;)|l*sNJ^T5PG zT1S!16smjZ1dhWC&^NEb18Y02qo%sX@U52&ApuB|uL;UP%KNVsvX`BWS{P$<($D0< zNZc>f4{Luz%+b3K2k_Ot& zB9g#0`H2m}nt9EqMT^&;5YHc$>lS8JJPlBa8w_xfcTpK@6#0<$ z?yhsMR~gyySHNs6P^S-){KRETJd>SH9@CiX&k1xT)4VEsO}tQyixA-j4aT~$69b2@ z0H^HQLKE7UvM^w~=EBOfmrc$UTJCHt^}&WNjxyiNtR$)0)xvNfwbZse^dv6NEK713 zSZVu^L{iU+>3^2knJHI;>(`x5fF=rX_2@UUE=d-7 z^@=NV|6FlhdoGIph8&1~+8vR2o7Kv*Bgk$FzWKK#1QYLC7IZj@y-(OfcMaDy^RhVA ze5|@VWAt|0_a2L|!!rpkrU6H{7MY?0m;3Tfo+YyKM!BoFxBCn0C(W#j`(NN6p4b(R3Qc4Q-zj$PspAa( z3(OgLeAnoIpSl%#RfU9q`tK~KDeU# zIfbK6-58aNXcWQ!pq$?P&hKQq^L*IEJr@;~(7smLxUEzA;GP`u65pcvzB}kb^*Oit+hN#w&e_-1ec;Q9Otnos?;YvAw8GE-Cc8K114H z6wg)a-jH*%KHi00=sY}Bi?jO>>)@PI;DhE{Jre?y`mTxm+7*D$ zum{9raW@Q+`?SV9=ZUgUQEgQW3=#u(XR8%{ZSS`&#|gkq)E%X0T*{gtW|jF{2pl-% z1%0{Y$4m{lbETDN9o1;(QxTG?gJx9gg}z=%x#i6D_^MUe7hj_5DPR&WU6>iB4_2)f z<&L5 zftDhNuSI!crywWh2yghems%eC=NKC?%|kv=1tLPfNtgMTkF_J=S!ne;olX!U@1TL1 zk$uJnqQCT;SmDRyM80`f6epKhMgL~*l|as5_#gG3pvQUlB9UmcV>MUf^i)_W*EUq8 z!ZK>S0x)vsXB|NI2(RQP6qGa=y{-drlwlXsykJ*tcWv*pbsa%-LL;?XC-b(HS(uF1 zs^w2iL(3H|+?H&OKa3I;So!$d_pE;$t+s>O-2{=akt?a{O#n6xTmV=@zFitk$5nfe zAdKj}vRTqpHOOne3@oCO12pTDE*PA9+gn%nem4DwaAsVM%5^1Uj=GNN0$9zpeqEdD zl)IkHb!+-g^0t)88t)AnG2Zv1O-dM46JZ;Dt+iu!#9@@hsV0@azx3Z{c@VJ2 zPIs5-nZ0KFPL8h!FwWt@0b3GdaZs%3m!pW6QS)~gi&qKz28`Oulj5`k*!z8NvLUv% z_$Lr0`tOOsx8+s=0|eIRNh=0E1lMw-khcIJP>?RV!R-g}1qYwW5;GRTo6iMDQjo}s zd}4|8^Bd{ZxfDOopebXbaiOE!OKe>lHK0xjNZV9IoF`b)ogTMOA#EQbE<9qBxzn}M zM_Xb0@rU8$!XCe~!ONH3`J-CsNnvk>wUgGfnZ@{l!!&*wm6YG(u3Z&3k#fn*;-pcN zB6w!!Fcu)Ya;c*|cOCuyQm|i~4Ns3uM1L35KA3;-E$fIcN%0sQ=j0PFzUGdqN2?59W*Z{D9e;W^}2ec(~2ZjX9rBTinif<|O_R zHKzH#rr5k}rP^11`iM%kuCmoCsj6917RJnkVA$w%aitILh4Ev83*5pD zyPdt!^Gf2Nq8PGnuYvDwXLT~DNLO}P--2hTAl2x-j|UmRBoq`RWbt;GbZW8;WG)<< z&bKSqmtlV)wwNR4-U*qa(8Lq4kcv1Mw24kAQWwK$?RE?&>`C!NTRA)$+K$&Q&tM!B zd@>92gb*Z)1&4s=6t>GUhq2it|K%4L4rNVR(`f#9XycpA;N_2l_ZEytO|VxeZXKJy zPYgZXQcmcNF9}ewCE##F@nLGz;L;R{DlK^5v(ZfWrJmX7{_{b^Tzbn=R(ONZgwVJ} zLQt-`7@im?%YeLp0F{kIr}dUGkYbejl@C=xJJFLrNA+306{~GhugR*Gxg>{0o_jK% zq8FvKPi?V%C~wnj%H-W$?0v^)YC=+-m^+yd8o%t1yE1ftNMY&Wf0#$(81nP>& z)i;Nv;lA9(-qieYbtnvacS|8lH&^ijA7QiS+H-0}+SxIN>Aqjqu-5m=%$BlhbpN%x z4mzi&9;qDs5RkaO$_t9~x2jKfDu7JeAKxRKLhEO)1gH&IM?<2ci2fyh0`2b2XL=zp zQ;<|Dr%yt;HP+0INWNF(xze{P=#QhF=ER_2eV7ztt%ok8a<)B{x?xZ+HeOi8t zaw5ODaFT*d{p&$dzV}#lA*(XRO!ECaHrK~^!3GBd*$yZeh1Q_v?*x0f{SneKKi9+-HSUL6Pl){7Yqq&Rk|d97LKP-M)$JId%U2i zDi2fz)=`iK)4I0v!bO3Ft+U}Kp0|gSb|`1=4JKo7)eO;SF4MF(8q(7;;UPWIKB_pa zeFCcy>s#h69&d|%*1@!@{tgHqxG!Qv&KwfgfNbgsWO$yJTP8vfR_cehP*3bn^=l>69$PplsDrt-MHW; zmFfmp&pdivJUuM`sN(cjK za!dSSZ4u3?Y=Pi|DdY@}#g4YFhaBMkkcNNh0;&S_8rMmqkGwPQu^z9A^cN3+@!+%> z5cy!qhu9OYNb&e0)cZ|~euO(O!^H0P;20~Wuo12dKQYcpcSFG33>cGa3l|QWJ!N=W z+w9qF6>tpujon1C);z69^+(|(YjDD@r`VwYh#1~OKwN}?K_WwixBRf7EaP(A2)GUK zYa6F`Q}o873z#06CCL(ut0yT@^7S&-ic52r6lR@~v+m(MUv#jfEjmNB8Wp)#Bl^ot z?v&a+whoCUSVU{LkRbgvB|}cQgATS@@gQcU-dqJ>V|RgG{7e_lUsPCtxI_n8R17Cu zmz-Vyc=rgai* zA1i5un($0etg^z&br{OdgzI`#S9=0Jz7lYe-4{qBe#^9WQ`VQ7lou5DJg2A^^ov;@ zR0p?-n_!vM)@;gN2<)q|gzBMd90Ijq+=qM`^5=Fgq_IsZ^rKVeZQfVEgN8dz9KT;{ zSgOYgNFqeK_b;p@pYeoD3~Lm_?|Mtx0|=ot>tG&1s<`OLM{HK;z-$$1I0fb%CGOWB zj_9}Qk&U-)&^Rlu2i5?x4Od5#Da3sGw|H|^UOgX5=Xpx+(;TjmnfH{Y6!x6-TU%|D*4VG!2phCm#ce-0x4ipPNTt(3Y9= zTW#A2kCtS~8WSBtt`sw7<<0t>nYQ7pa?&$knUY(ycgkoc{sx6b9R=>$go$E%)JCw~3g80-)+b=RFVEu;ZQM)@@{E8*cgecvBy5k;&Z-rgN z9PrFaD@j3l0~$h7&WGal%|3^ILeR6Y&)z9o}d;=%5~v8RqOjwm}%t?@Fw9mnfc7PV5NL zQq^)NVye-kGW=vbUM*LL)f*+|+C7xJigk38$5>W-OJ=pzKjzrw*GFQ?jETxE5>SXneznKc-{V;#*VS((;)c@LWVM1l)J29PB_6jXdmviBtUqjV{-7Z8HkjNMH^!JJ zZ>#kwekPk2rKZ?WQuYZCTQyWrQ+D=dZ~_R6COH1PZ?9_Wv=BIRTB+CD+@_XMt+Sl0 zd&(NFkPCYD-I`KT#$%<`)jr}kW?xE6&9O@)0=8ZGgRV8c1UEF6M70=yEolfQO)u9=?Y&Us4BpR;kH!h zMJqS`vdFL^9wHb2J_9t*H7}&MX@U5Q{oxn7(^Crir?VV0nJb1GZv$1>T!9o)@FCl> z3r9hklAnHeqNpYQq4dMjk&3eMY7H`!{v3tT*?oFDf>m)RPyjX?W!Eo31P*Ba=vx`7 zTv;ll;@C3n&j3y!_1a8m?w_3oZ4f@^kM|r zJ4dqOv=fa2y&xhRg^0ml$=6Kz&^rybLR-*!_}cAI>jgx3t{2MliYft*5+|+KiTbM5 zA$tq1XvWwLTev#ty0b|Iy{VC#V=LuCI^^!o3IfO`i{B=Vzs7l}pL-s`)&i#+K|i~m zev${`N+yQ@Z8QeW=d_8(aM#T;`VRstDeRWxmlCiZirx4PWu5i z30=3FhT&8nrL`qHi!P7cb}Dq14-0!X4$}y$UQ1@&a2;A;WSBS}>T?^*^J}9)_Fcti zP33Lg-cAi@6Y!894seJF5r721p?T)4SKEJ|8_@MqdbEDDjq48Og;EquDF@WV3fX(1 zm@JQ}RiWBHQx0xVzeJq1>0dMu7Jdnr4DME`PPHzOJ_l1Moh~vCj5J5iaMBPC7vNjWGXzv>DJ8+M zC^0iVFgQ9}Ph+fIC0dn)CIqO8Gk8Vtaei|##xz4LN&_r3*DlPkOwU8?m7?J09=Y_-{K~(LcLu-9s_-l6fv0ocAbHD!ST%i+z+AnQ(TNFnbVdL z1ibJK=sZOYa2WU}Aq=@b&N#Ov*crjnyZl*3RdXe06?_+xMEGi^e524 zmm_vTrXsl3-6PGmo98NAfcEaFf*i;sKYsRAD|Ox3z+JNO^bq^mBXFqR2F)ohgyMYE zV1&TREB~Cq^z*h*53fDdx@~*d)*haIE%GW491WKRulAjcdeK59R!JphlK#)7QGtxn zQd02I{V*YKJA7@Z(3)*d>%MwzwqX2vN=w_1$PO=Uv#6b|M1Usj6D>oshBx><=gm#I zZUb_t)=+!LB$RizF2$;N1?^J+r2_Mjsmm=|DXI}tbUNOL-yu_+D0YR#!bo79X=4}B z%jW5@e+^SAQ;BXt({x6jFPr*40Io;<_$Rs^gL_dzsm|b(ul`(27O!gRb0%FTYQ(k2i%D;ZDe z%4gCP75q-+D?IO=c}u|2O(88yvs#l2ne>JdG*zel?uGOEGi-3i3h#Zyi`$@ft)c;4 z$;v4BUVCHSI9AN|)gI-mj8F$M$y5Mww^S3VO=w3j3(gcAZx! zL9$8@3MM8g>UZ+{69HQAQ!J4rUapHMI$urU_q-OcT-v5vsRpT|yMpGqnVY|_6Sjs^ zWMwtp6PYV>C#U1Q>zajBz{cc&HOonU0oQS@)9kr9UHWZl6;bIfcbn`kQ#1l6OxrDq zc4E?yGk32qEl(y4EX>j=(xjykm=14ckmnk5nJQi2M%ikC^V7hZjZPLhsO9z0-%LUJ zG`0md+O=u&`y-%#YY&@D>nX7hB9uW@E_Jt)8&MP}TV-czjwcj4TP`h9aT8fZd7BSH_!XKsSJ z1|O6AhupZA0eHp74C!^y$e^PFotwpK2_ojvJ;g(}lNv(-Pru2lYnU$GFT^M4MXs2< zB>$rwyBr`68BI2bXd&klbETEZhcwC>tc&!HM!S2Rk+;e1`k(0S~r*A!CqgZeM53U(lVz>gzNg zO!`U`a?0KfU2T_3CrP7+1;c3P@O*nOM|m}c{h_V0)Zj`BEid>qp~3DSccwtF?}Wc> z{Z8uzbr1!kJ-fp?(*bhB-xpLlSKWY7t6`x}%K4?g$fw55`1OtX8D(kh-f zVn8U}(ZP4E@NX}ROq(1F1wN_V{xfDK!e0CoclJb!#1u#_z^0=JiKIwe%7&C(L$9L) z!mK0|=IKml`SZ@?`QYu13dS{ojN$enI7OejZtH#>c5`+T2B|E+Dflu8W%-KS4s{A# z9jL+1jHp9C6BD30fG$&1Ph|l`s4+3s)ad&x*~v59Ucx;~pyDU;b&b%1az3j2Z@usD z@doUO$v}qu`r~TU{yWzzX0yDw?PW zuP+p+1rrv233D-`1Ut%);~EyT2flzxlf?!Krv!(^A+F*N;8_53%KM}hwr?YM4JKG?HSIbV$dKf8y} zhS;}ZCO-lh;BepvkLTu4XF-J{9Rl042|f0y1g5+h@{h6O24KT8JF1|BE{=0}9uYr) zVBY5>s5_hH>lCGwGtX*UM3rj{Kd)Q*s($saf^glBH=sTcOZ@}u6{WV#GUr_QCsqOR zB|f6Q@YCd2Bgla-wL+awt3Q}HkS{NP35AAktL!n< zg~a0O-06>C4u#4oR;ZaQR<&a3eQ)?uQ%y(WfVh9WU*^os!oqWqwBYtcX=R-E`@HGb zLa&HJ;=4S&1#MDkE50AMc#+6WFe%03xL~gFLxK@qq<)X_+E5}lR?zRX+OrDP5-lN2$bNTA8FyqC#&7El~)p6FP zdfvmSV7W@{_$_27(vfYZvcMY?xI9kDaVMExv*7g6Yr1~SGR?%?QZ5c2me26C*%MQb zJk2pvshiZz?dd4$pI&A%RypfnvwC`+uTN+ScncnOkNJ5UIOAMz*n#n19xrcSYNm8B z-MlCAJnj*1hX0a&8pi-**0*7M0#{k>M+Nk_G8mVa$VH7Q6oY0jZh8U2u3$n+{lcBrNm=uE&Us}3rIJqFGA|F!GW*l5;`HFMp z<+L}qOH+)A^5|;4nU7dMj)^39)Vcc^ec-qEq~}r^Pbz=RlM;+0b-7ilQ3PRSH1v3bZs)jUHJ8A|0~4mxN#On$+pXv!Ar zXcN+*p*&6Cec@4+Sq#OcDcM_UfJ;hxbI!`81%#Y)%etJX9An{+=$5V8DH4vCL#CW~ zJ1+CN8dWt*&V(|~$9{mXz=610)?Smk8PZE>I*;nl0w~{qoTRSG>f{JpAN~ zxWm8s1&vKAKMKV^ct6wrTs{4#SVm^>2c9Z*Zw*WrbBX6nbZYl8qNdFG*(!Bow>Vj5 zs+96(E0L9{EPD3+R;^pj%m%VDaPlEfTyq8otjy>vkGrvi{{+z#T_Wwskd4Lh0;0s% zOSyWb#fkZ!xY`TgWo`cUoN`MKL{(M)&L zg&8a*MZ*@V-FrJvJ)4aB2svw=4dDOkBDNYbHtykOAN+Gr%Xx#+f`A9MZK1AZt&R|^ zJF@1Ou&{Kg`9w=>bip8NCdU_V<9jiTuy)?NU*sg+r<}AJY%QH|muTSMc zzKVh-jpYruFDZw@@fLAV$&fc;UiF-?t_nbFLcXdPvHl$JU{MpVLDDKHkX9?bH|Nzc z-I*w;<_$XMhMuds6;(r(9KjmUmA1JqOqj>VMxg(Hy=<=AK4v9k?;6)bj}$59l38yw zho-381zp*3Yc67)8ITzq2SMu{Iq#80KsN=m5pr+E49f1#)Wi7{(cEj`2s8i(p6L-1fHI^wt*oP!YHU_ zL^a>bal|hI!b;+yIg^8#&}AcoB4k0ZZ-m=@8!De-cZ0#%#3#X@Az&r;sl zHrp7&ToQn$2-`Zp-Vs6?Y%bEEySx|9T{-Af%!;{m|9{@gVxW4${jbblbht2DF3x2^ zm^U@;I8>BvJlC-PIqjX7e_H{AVut^st~~wF!Wh4*dEE_Qfw(4n*w{1hrQxr!@t^2I zb?^Dv27*rhZ+$76poHsu@LZhk&)a@EmRdmOlnvyu3g7eNm(xFgj(Ps9c(-s7fwJpL z2i(Sam)pTMs8B8&D5Y?JR+=-yk*v`@^X@4E3XssGNBTqt&f$gjSN{7u%8l~6bM`G( zlA)BExyON@_4xJ_9j{F9Z}V{3TU}1`K{@0V-s>gJeF!#fWzm+M=tQmewVwA-48jen z(w}$KTFqlL=z3A~d{AJui=mnTZ0K8XPu#geLu*-N8F;k5?!Gp}i-zZeZiqskmfc(N zp^i~i4ppGHD7_+@!Qr^;E25Jd{fyUzG_TCRHw5*?NEIB}Ix$mYz%5YSeb^1o`#P0g z@F)xJUQTT$di6wKSg1M$wbaN`mkhjbJNDSps37s=+t@Z6sF6k~8M#k4?V}_W?#$n( zwIlR@cZl%#1oej)_*zOH+SFz{ttk5>(by_R_;wb0R@>(XSEL-Wb1^Wi^a-bUg~#$8 zaz|@omriX08r3Ts=i$a12-CRsiRr{((X+BssR<^Vk^6m28j4P)^k1dyBpjLFmh$*Z5iX0@%0}|4g z_NUfLQhmwXqLUT09!Eqe{$ZbYV-`|=M{wlv>`e3{Xx{ZJqlwqc?iGN;r75D_J31MZ z6c>l!X{E1sT9~T@>WH%V=klrhit0;-e$J)cg-~Sv*|F$?TA`v)nivN;v|o-PhPJ6F z3zj`LUM6|NVqJ9CaX~cyZ1nL444X0SgCu9B_ zS?^l#FGzT9KJHIOSU1;u@blFFl`kvuSxDHQ-7$3L=L~;2iXP3)vio`IUvmHdT-5y! zp^$%1^S{{Q-@@a+aPdD!M*f=v{%h6$%>n;~i+^*#uegBye61(ttin;Q(oNnx4fmc7VF-f z|J`Pn>f*xSRbd-quWq=1Wgqb3@o@@;@AO%)=)ApTW0@+zpOi@+>inlhzxnBZ{`?Qf z|9$G;nD`G2{KxYdhW6R#1=U0j{aBFVGrGDiRe7=$K2~MSc`q*QW*L?u=wfi%lVq~nX=aX zPXN}tb<}DGfk7@lh=&<4u`_mG%X_k>P-GQ+;x{{3u{j&;eg9@3|J~=t>lK0)?rm$4g zXhq3{_#JId+z|4nVLyg1iUHwMDJo>NT;{_%H1Fw_y3Q;#O&TYE3BCUj&F)xXzxC~S z^lc}qB1A5r>3>c3R9$=L5waw{cnxuEyN~{gJ<}c1*>J-(OJ?h&9KMF`v6AE!?we!z zfr*AGSR%6H7VP5AD`YBZiOM&sQIwy%&1_b=5wT z`)_G?Zfzd38@A>*>ffH)t+XUo3Dz9HP?RLY{5hD(*mryOx|sZPXs@Kisoj5fuxlcT zM1|QV#Z~qL#g0wH;Bo7(k;CK^)FN^A%QfS;;o+S4X~(f=3TpiHWc;-0#C&T0vu8u} z$Y3q4+xo9~{l~}m$>*&#r^{pzr~zx{xi+4v*kGU*Zqs~a zb^LV2nsN2>^MzTu}Bz+m6HT@KIo z$4{rnPoq*GF3^Z!RrIiD4L2!T1|e{ke&wziCq3gayr4g}$hU4%gdd(YN`XMph%qgu z(}c85Us;lF*weEx{|=b9^9=spz%#`oj|H#;yH`TBEijE#ks*Y_UAsu%f4W$vc0>PU zN-^oAN^s^T74u=EX*98HK}^zT==`ro#!ZNxx2lk>d;T>&YZyl>UQLL*{$J^t2Dc1f zYi+X1t#G~zcUQy~O;{l7GD&Mq>mo8LXv5e5cb+(@t*YEM_5?5;EHV$4rJ{6-KT(Sz?Yj+iecR=GklNo`H>{)wsz1IzjCkk4!bVBQi<+J6z+UTN+;(cKci7j!n!j17r58$M#v1Xm{>?yg95rIgy>r zG1Su*OcrhpN8d@f+AF)=f3AB`he>yFj)JLBv~PLFHj|bjj1i)HotE`I##zLld;Wc= zf26!XFWczM(mSyMz-YXm&5yIujdZTp8*a}fF4E9NpQ-}|#y<91n7*&bo`=6Mfl#Io}-%ImxXt!3ZwAEQV9Aq$oZEH_ydC~q)JE8SNc zwwXm=Y5Zfq^>)RlWoG)%8}ZDnnvyh@SMsBwfZnxt&btJrG53)91-cb$LPhsaUrOo` z=4Fn2e5+HHxL5eeyq-(D5PjbAg}}o%Qrpn3xl|>m zqw5votf0R>mLuz_OPy|@)lX}TWSUX>?&>A@@7JOvPaY6!>=`QIFxKr!H5R<<&!%N> zwRt(iGn=_6`1=80`G^l+w1+1pFQ@NGa51O}z3xFw=)Uze$58_@1N9TYsuecJ=yTeIE!F*#nR>E-%bC-;$8@g7v4XUs@Oa+ z1wy{I}kdl>Az>y z#jZ2S_a1!n*ZBgA$(}yH`zX6%XJ9<5^3E&o-*dE8iK^P~zH|0nZG5hr(JcAE&B>Sl ze*WFir!7yHm>PTlOtZ%hWtnw6dEirqiz8rPbJ7}jX%Fsc8V*VOPjc+2$&0h$N4`?m zvw^7dQo@dq;Qr^Ds_s(&w3hUWZ~c~zh`2jdLac7`D&J89j8yl-RXZ!_$wo@A=4h*tO>i@?f1YC zp#cQOrwqr=IyLvoD;41t78{;~fM1{aKd3me<+-GI+nXJOcNf}!k6Fpi9SZ8Z?-(+& zpW4`8E$*txY@Wd*X0nF_f4p;iz28g6g!q^Ayz#zJZ6mc~81Bpyt}xHKko^Jlzz~jg zVz1^;mJdh!O^PUykB>aLG`UJCaf!C<<9)Q-}k3%^t#p5{8Xxv*6^no z9=8ue>H8S21Ci3*BVu^R`+>ZTAK#<}{#?eNMW2k}P! ze8L!Pf^Y9|ro{ew8f5-xwH(Mm9 zXs2X1Es#4lJzCFG=WA7KWq5LCT!z}#RAFuq(&D`HxM)M~a zvJid4ZnLX|$|Ca1BY>GSyAG@V$gDfDr^X~F3>SyUyL0{jsqV_-q1>bXxGkz1g_|&z zmTRe`j4WfBx(0;?A+nanE{v@#4Z3xWY@;a4&@?DymvyW)t|1I%7_yU{L6e>9{f+9r z_jdn&|9IygKF{OxIKOkw_j|tQ{N{NcpYf;)V-~Z$>{DTm!~I5$bE6oDAnqxhvWrev{oPZ zRlr}2dP3(mk{YF^R3;Icb-4NZon$$L&4toSX(+Md!$#TM4*ZgOEA^Mjo~DfnDRSZp zH*^WM`w}{{cM!5gg2LFWaxpIUS+DWZiEzi;M!RYc7GbMLLPVy#{X(!h@13l>k6(4S zM#|v6C^y`QV^yq0N{i}lhLD;G&PuWG01{rj&IqK)`Za%kc@mZ6G4@v67MO2nCOFq! z1Kth1C{R9gGOlxXEDf-5!siSLWc_Nn4xl*e9)}`x$@h@p872dI=+EECUjnO?D%Cur zt(dDqiN4qH*tt}*D}IFzBo5bjt-8fd2GNq&ANJ~2e1u1==S({F!lY~wvtD+c|6@_F zoHf%>?ci1KA^HL{7Q5it+Irs#6fi_F-cm^s zKvnuP(XyKA+`F@5vLDUQloUwbe$BmJgbl$?aTSNFoj*`6JUo5mJ`X6g0ZE26+dOM< z67Q^J+W=~v>#UkvKp+a0G>OhNp^&`U;>KPtYJ&N_mbeD*mx&n__PZ6H7$Lp%M3bHC zrBuhoyKC>}qSLm}Rf-VUk(k65g)gJZ$CxJvSRpdxvpweVGO1f{72{@$Zw>;1cCn7t zIpReRy1An$SyM6kQC}{U`rNfct>H^>xvzH0*kB5tA4zxJ{gi0jC@vb zT6q8`_a!TL-m|KIgMR3WTS>i+2xjtRcvE7PZr{d6QJ`OM zadlIR9}IX&bD;PcD1Q$Mm5ldPbaolOe4VX>031S)M6cOBV6Zf1iUg8q zW(;6!1)nU^OW}Ydbfulu=uo7qHo`>KMDxV>0fH~aJ>>2M&)yF==t>RhD40{`p7vLW z3eB62d~{#>^dN+N3yRV)vzT;VF<`u1p-=-L~M&lwxc%8^f&cEObj$w}#E8 zYnCePH3Hok8*gzZ`CC!Qp!MukqvWX<0^g};sty65*=yT;?hWTOvCrtgw210h^sU1>Gv zFlfw5^q4mo@%3W~#M0}zc-)kB$Y2lT1tJF$dNemfWHN#3!1d5EQfddX1~8#^u|dc% z3ECGF7w$0~Gl53=Hh&c!dy(&+Cm9_(VOE(dD$(L?Qzc_ zt!vh~_$8HVcn`Ww6Nzu%?6)g=U%u`&0nuA$&5y;P6YV{QJwM!^vS~w>c|-)Np6h}R z;PlFh(*0RosQd6`+URjXFNInsy88rSjq63mQ1m^Z490C1p@r>r35LK*O)gxnNWj-x z^fnqMH6Gg#mbhPhJHhit)7shk076apvq_OYF^G)gHapm>Syzhj+BsVuC8i=ZJ%!3# z$YbW)S3e6FFcuX{sorD7c*vzE8#bnhcfGq;q;?WP?AQ$3ad8d9$5RtYQHiG=8xANd zczRov8Sk|``w08th}n`_x_MayWGg5#GZ0zgX9?U0Otsq&IwdGjIWW9CuojUqWbjys z+sfJVo3#dV|FX6;p#Fv4w*Ss4M#fobicz4>6P=DO9Ql5#9UE2JQabI=W($}IVQV9; zK8|Lj#zqmE#VQg#9`vel2Bp+SQj5`fHl;8%cjwj`)ng^{5GKO8nqQ?es_mtj@E!E5 zl8I(qrf$Q-DdpKHw9ozFY%PZ&cl}nfPX>U zbCnKg$dE4Y9!)YdyAngv;0GN2sW{2o8Wb1E^Mn?4OwTdzc~Sr?XIJgmf()U5@nm!#Re&$%8`B>Wf=afX@cn)=ZWg#Z~mlTd0U37OTkfywJOoKWXZiepO za0y`PWeAerS*fVS?}+DKJ9ZK@gCxK@TmfZpX*7+sodh`OMeN}We1Y;WINmW81!E zh&!FKOp+VVBC)@u^>f4cZ-j1FG#3QZxPAm==am{#ldL`$?$$^$aBAj2 z^pmd`lBQ!E1KjWa6GJib07Kr7*p&qC-8{9;TeUV?JPXD43(HPw21xCu`MrCKTuO?4 zvHNy8gyfJ0DbYU>6*w*W>cS0i-12LFph~x?Auck z(a{po(JZ8L!s!z)0fk zsBJ6or0cdP*Ww43I<>(AW0V5V*2v$B2~9cYno$4Bu~e<|O&gUuRhjFHv=B`-Q@rRU zk8K(4NKz*zWUbf5GwR<@b!AMbLzyG_gi1w`+VRfNU)!}r`yhKQ-}wT>+y+ff6{jg> zsJFghs@E+@4+_ExC{ia|tQ61@fPA{+`qu*dAVM(KE95bdXdmCPS?7y<&1_DLBLsr! zx?yegMXhe?2rp~_xXZ>waN66>c7k7J?2hAcT@F;=r(g#&um+k-?Q@M%|=WUQk}(+z$#&S zd-^~1Yt*qg@D=Y`%doaUA)s1)v|#%!4+478+6*bFM{Jw7({=RHW=O<2kCz%_03irm z)=-rB` zMad-QL#!f6Zk;6eaK7b<)WpS8wQ$244jI3V9fRWFzpHPJN>O+KB7Ak5x!6W^h0>HHidmkt88SE>GB(%Rmi z+d2fM#$4e)~Pn zq=q0Z=olp})31U_+?HLqVIT{D;sxI4}1YzkYXa0R* zf1LAy^0-I&_A*!Db5`bh`AQx}-c=4UyV9FGMncQrNAY37MUCbMz2pm5QXBWe?|Q>e z+^{wii-JaEGCDbG6O3v|=RkMNHY>nmT-`Py3lNYNpF?v;!|?RT%^2ZVLzW>jt=rvz zZo}i>;F3rax~)|5HXqv6^sIG&~H{;6Ay}7@uaM-S7-~9OnU<6Q_k{%`DVSMP0_GkQIY^6cn#_saqui z)2H+Z$veKntli&gE1-l1qps(HJ1||MT0rM`6@&SNAB%&nH+=fQ)UA5ajPcERpv_8( z5eLo_C>1c&Q_f>^&wP`*d(Yc6@S10p!t%V4*=&0wxl%I@n(wU*-u3Vg40+Z%vT~+y zH|nbUnoyqHYNEEr-Q4c^b=w0U&t-PEUwByV4>l6eTSx8ty2^_1Lpz&%&35*dx+UeZ z%#%|`qovVPX%eZpY|SdC-AahAMA%iertkdx2r{(6LD+J{w<=YgK zSI5DC*2t#H2#fvLX6Isdj4xpCJn1oLOAQM5HH#GmN+@G)#)~ftNhLE=mt`a|5>MsP zBflQ2rZ&0VBDA!{Wt<@kK%HDtt@|wXOUI^NM;28#bL@|w!56t&zAkxSxE|kPi9LMg z{1bGcyh4;qy;gvSUUGVtUlt)X5ADMmHuXBUSFW3d&R z8>kL(v3xTppZ4Y)hIC}3T>fIBC#3f!#gQXB9n};}#)r-<6ke(lyxw=|Hw)-uPvV@u zGpyW&^_KuS>;r-e(olv^=$Of?nH7Lehbguh_eCm@Kaxhlb)kb%%V= zP!04@uPNQm9t^s``16Vmyg0|m} z-7SZMmNQ>>;5$+p08-f6MxeCpfvk%=dmc3SA=2`v$Nty!hjIMzUoE# zP-Gk;M+|2>U^<_j(SKuiJ=!)g?w;wlF4z2h?vj}tu z&5yVvfgKdcYy{{Py@4*ge9l9no!$QKc2=4(9R600s@Xz@282xgX&ScqqXk>Io_&tA z*5_G3m~i$ltNgX;s!{o~h$aVmq`tT7(!G|o3LmEE_3k9a?lwy1x)5hqY*D%PFq$6p zJM{xN4=4L0M{aIzwvc&Y=C>lBl;+J~`+L?QhYMTpT?Rplf`U=mM9dnO*|NfCEp0Gd zNJ{U(bjdp`X|hMs4-ns#6)?!D+1XOkkF~L};ia)L85OkUz_ajrK=FS!${gH;c&?XL z2ZnVJe!_e3@esl9`-#Hax4Q^m`0*b62dgC;!xbq)f#An5*#NIZV*FHMaN>LPJV@z`Hr wubnpf!?lBHn?4#FIMjb){rvg=@wV$qQ09PCTK;>^?Tv74O+AfV^&7wc56$wK4*&oF diff --git a/resources/icons/bed/mk3_4096_top.png b/resources/icons/bed/mk3_4096_top.png deleted file mode 100644 index a2a1824dd260a9c1164c3572bfef63f7539bc6d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369684 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%0DNjgRVqfA@Hvw7!ucRvyzHV`{b0givE0w2Oe3OYD z2!5=;DK_YMX4y74fWTBAnKEq7J)ywRu@1Yx%U(ta#MZtPOxZvz{vj4}Y|(UM3R$t> z0huXt%GqKG3MEg;`?RK~Za0o$xk7Yay z(tsc?6>HRj;_6eF3-{5Pls{&6EU4b=e4^gAY!pf!p5G0vaHMBcrcn~XD<``z82 zN>dxhZ0g4+emKDH!VwZH=z#J7F!R=CO6~{IU?N|G9`{m`c2}kv|XNM z&ypm<;h5T?Yr_tbL}mwav1ge7F0KFj(mads1T@_M(w=myXd_7n?D7|`;8T8w{21^R z>ghKD4 z=NxPz#t1ODqQL94nxjmg608h<8byX;%H=T+MnZ4E!$|v@TlFI`%+(veaKqiNyspbW zOka~7e97(PsFT``a4|^j6C62i90Pz3P=tW6kBgfR-%zbNgf7|nfN(uxW|zsQbUWv$|J+M605cetfyha@ z;(bZzRM-V`+rHu?UOU3=df+yM0rX-6e40|Fy`~d*!6Yeof>v%NVb2g%O@47R3GkV7 zavqo|fiMCn1i3amZIAg!Y;$wE%j=dZC1{lT>< zH3hi~Jbs=8doFqC*N&)ymtbYMvEbT(1!1*uS#^7-6?n^6&MCt=`S-^td%Y+y{Z~WB zgK?By){K@CAvf)=nw*0_ASpiyTYm+)JY zk2#z;gn;f-^byX+x$;~3SJi$KH`QOq8)DrVBYmUc4X64FnBmHf8!bkEwf zsAeH-L1DXu;~K=Lm9c*}DnvA_k`G@oC+E`Oc6DVcD0Qhvo{N#?Y)9E)AqC7_K4|)J z-sam`xD2Xl6b$kUx9E~GvWH25m@#qJpX)32-h4{3umlqE)EL+k@JOHmRhwkX6`+9O1r4JjiQ2 zJqyv1TZkoC%K)b)t#jIy#b9SPIDZRQZ>@hEeSIULOY4|ZRF8$|f}r0R7eV^4{8lh7 z1=FYVdK0V3?>;T>{dz$WZePZ5jYI`NU`bGD4A9R_2&iS?%z-b7CKtn;r#G{%^aZw_ z1^EA`<&lMecIIxG+{W_u8axSBk~&(fGk?J8Xhc^t9NBU15OP+uarW3bNHIkd)|O?U zP&M@{-%uK@<(d4e%t)fVF;+unm_rqH%RaV_Mg`6c<>BFC{W$X*6atgtoaZ4UOAf9p z(^=xiEXj}+Aj5qjNXI2Y zC^McBN#Y_pKpxmVP-sj*@B-G*b!7By%pYr?a|(xBmQ_AMy_&R3Rr%2nJC#TNG4f4< z(ndhXyPT{6gYXkV-Z0pOI_#u)_T~O2juaHOqkNcwN|*8??#(FR-Op%8TghB>roEeTyMQr zP8Obip`qmc0X+0m>|d4J7>RHKbn}{ol}0FReubM3q6}`n@FqmXBaK*$ z#KOIpXZBSzLc0;EbtmM{`&Io>(UO1ajs{eW543||by@aDi{7-_PBW@TD4zSgM<)6@UNJ+D(av4x)0(Aw)}Mn12@ z-S+RiAXudB)Q>CS7v%r9pz+7(fr7ke1IKiXg8g9c>5c%tD>Z3i;gwETZ(Wut-BCTR zvNE%8n>Ab-|Kq|zWE}4eU@?4`5|>y2!{kVY2}It6q4!ve&h?~M3opgY_J>&}^rUC4 zgKlOa%$BJ&gi&MxG%(PhBt->Q7FH?QG((`#=Iu12-fk%O+W_U4pr{0Z59vDDNw4_r zTt5ao61s;yV_(=6YZNLo9>(v0eOB{{V_E z@<@q+Z}GmMY*TMe`I)E@HkUP{&54Iy#>Y?g% z%_DPZCWuOh8+n-dLpfzh8e+Yu*7=d4Mt}6PQFXFI=E9Su=iAwTg`PQZTMoI5>3K90 zv;y?%-Tmzt1;hgbMz9##AfDQSEO?qQ^7XR?=cII`kvz73*Qly6aj9s^!w6lw&e^OZ zs(F~T9D%Wj98Wg^BlA~jD0K5m^DH7B$xm=XcK|847h2$>(cq0Qm8Ub>LNYpQ%aQl) z$n1xdaox^G*#mo`BC0+t!}%SOa6qHA4d|KOq=xJ|$xono6r=1-T#eBHmi7T}@ol{P ztgcROy(a&h0pZP2r0mMph^V*w)hdt!{CyERN~fUygS4_WawKXZ+p~~Ex`B9(P%B;S z-UJ>Wz=N~u6ZQv-a@D#;(tN=|5Eez zW<9T0df^(O8Vd-;tv^R%IN-gHmCNq0!Z7(qKln8J6svQccZAzokOD!Ou*}Iy#6!~x z;a%XJSTKgOlCqp34!s8P2IQiFke_+w7ZQRox4=nh+TX=m!+yLqJ0e=mwE`{_I&3bj zKn&7zQOZCa(db$DNMt=rQxpTJ7r#}I6eDqfTNgcAWv*YZgJ;fNfv>G5G621QJJb4k ze97#R=0b)^yNF8%t)E}Y36~vtnA8tsMIzLR*#(NR#;ylk=Tn{$URiyxfk4Wvg*M%` zrbAV54T=OfsDb;4Y;bx6iyBuxs^*LGyKCB1gOFj;UZW58`>2ke?VQ7bx%TZKWt3gQ za``s;IzjOrpQyKTLJ(~|!USZtUdl97r)qg91zdp52h8X;IyX${F7st9^6bU$k7KV3d*nk{#T%1!|l0`|A4jz>e1%=W@F2RVy40M73)rssjlM zJdal`37>7I2)Vns`yziQBn;Q<_$@GZqd~7Bt1+4?Q-^f1uU`_u#xoBKg#7}7)@JTD zM2!8l)Ck~2e(|!O7D4M-4!juQgBIR(a|!u?RY^2(Q#I55T9vLyS}8D1J8okP1^hNZ4sN_#KbzrTEFIW{|M&QH-!IAc6i z`W@OHD7k>*%foPwt2HS;{TZQ}vs!o{=xIcgw$^(i+xQ_Go zC#&nwPIq{+;it@)U2h;2n{~U6n>}^$2*jF^(+{iRwbkHPo&v`=q^ujC8EQ`bR0mqe zTV@WSOcNT2syAsXB=`Aax>1`)Gr4y3ovaH7p}d-&=Y;)Bu*pdzWtJAb8qVHAyBexu zk);fy!0yo;pN6BQQ2=@0;CE;u4y?KEdD?SFGdl*U0H6LYuzyWJDAUXNW6-T@I>fQl zEp;%n8KT^l9gzY(^;g@Fr2&Bm*O8^EYCwe$dAcEmyyoRsop0gFR|MMQI(lCK*^!Dj zBREN(CfwK`Oci*bB1VwC1Evh}I=sQA8Z32CrZF&wg=BTBw4q3Z3_-2QTkd*%RSX5~ z@0 zv?p_q6wSrqf-}whhsmd|Y99(Hi=Incm)G{!ridduTGh0FXr+dhQr3As`_Z9FP3~Ms z$hH$f(>-dZ20dI|h#S`xmk?6!)=ge%b0^#&e%xHXdi6);%o~HoottQRCXocz(VK5p zzAgRa8nShVNF2Yi660nac_K^-T2gHt{>SFCOmdWa&9#dWr0E@RIjM1pXBZE8C)}th z>IF0wyVMM&25-t1K0{1j(p-;by{R+Fq-i^Sl}YQvCx(83QX~v&ew1btt`HTWUqika z5;nb^e}1@}--2gsV_pAbMSs2~$~m&W%PTCZ*LF_>$}in)n*A6bJC!z)T}%_hH2xQ; zrqOboZDTj33UY*l=<}4@Gdc@Uz3XAz@$R@M+X!ju2S;=1FSD9snBI{H4X2$~Zi8^t zN41I?xj<2V8_o}pe{4&8($4AO`0^M0?*J`=z5C$<=G zu1H8;@@Mp^l!5y#MXB>`Jp1#SzL|z_TR*7Lc7SuyA|Re_t8XG5Xb(M&y~5^tw5P|B zN=-+%l<^SGOr^2Ltf(pkAjG*TUYaY7qJFOIOu5k{8Z*$H)2__#Q;FO)UOgTdO_22o z3r9~N-zY`fK&3V4v8m-ZE*Vs_quIkqkB%{Ei-&HR<5(1R;q=>-EZtFB(~|x>QALhc zg&to|WRdg49WgFyJxW^6lA!rBqP@jI|4OfHEPu zAI4DPY`!8;UpP)it!0@kz8K|ODoy0aU_)Dd*1d&tN+w%|ma_7A=gW(1vuQKaX0b9{ zY82EjJ{LE(hg90-6$}g$bx84y@$`)}spxg#kEAFf-?woaS9jw-F-!}mZ{@XyQjH1D z^(H&9kxbu&#~8j=>AX|0-#TccPD$~q=+#F4tnWISK!1ML2v1j|C3?%|2BLJI1){KP zlA{=vy!}5zE%YavF^s;m9m>3~mKVfa>|BpVeI*Es1|^mFF?xyo+TzL)VyRj7RE7l= zLr7UVW>|Ka!c&B@ZbM@&ht|%-M8`k5oLr~Le|{E-)$j43CW*6)t9sa_rnSM?ACc~) zX}G?aiXKg%CsJgL<~0u)`Eum=Yr_drl-!%9XA4$;v}|N--^3}hZuOxWM$j2UbaW(i zIiE*pk;h}PP*^EoE7Ldf-$ADTJBTa{azqN%xq0-X%#pS2S*MRYNlC6&iw086=LH8kVVt@A+$&{ zRf(yIOMV3E4!)ESZGIVra<#%P`DrCbY{}ch!4`6oTWkNJYctw1&<9$qP z)+wiO`8g-(U@wnP=g!{vV$|!{dN&9)ErZ58cF2IqnhkH z18rIrpds4064^OZ=%+^i$A|^F?Mdpy3>NZ%o z!fHy*26CiW=d%27_sMZI%%M0$$;wf-%$Z+TmQFn)29I(yqMP>{n<(E*tDz?HVatDK zK>o9xcMAWXF{U#5{d}lf`6!w^LluQuvauD|>AWL7%GKv+gmBMU8y%|6%ZjnsXRbLg zg>a*?2gFPJrTBJQLK%f6`Mb1=OO;|BBT)7ED6+gc1cj3MsS_@U1ZVr^8JqC4zkfZ$RpBk+n%clNaPA#&Wm@F8Cv(elUg$nPByo;G?J{$N- zy=cO^Jb>S%L)9N<(Cg@OCZPQ#+d`f;Qnxc@Q;~IFNNE?0+U1i#m*ed`M90Dyc!+mQ z@$O^xKR+4xvcEaK>oZiejvXJ^-=P@!bs%}TYMfYF+2dE$CH9K7uzFcs&tgAB7;8E( zl~Lp86T^7BzXO{+WQdn9&(jP9lf1Ly%6Na`7SbA?eqPowAL?Z>@v-CsOV|~Ae$&tx z2v&~v436s29PU7w7#s3-9soi%m>U8iqmhpjS}^OXv5KFLXn4_}Ola4Yko z+Oo13b@bQj&uf4iQ9ao~HxHG)&2DLa{X1q=EfAssflAHc`Sznm+sdIxlusfLe4|a) zw!$$iC&4Wjlijz2d|X^&e4spaVM#5}B|&t$S2M4&t-Ls|M{79n&~5XdW(#D-#7qw` zL$KlT^mXNEvK#~A3d!QsX-A5Y_^dg^aVB#c`*Sv%JI15-CJc9Z1vZI3z@^`Qdw+;I z5s`En!!j6d`hYFee>{%y{q8i?fKRb8zd24pm48!d{9G+mBFVBQ?8TRVb97>01XDMC z!+>&i4roH({F@O6dvkuA0~OE``mj8%M*|kLpT4@Yl4{+zwQt7C91hQzy0(L@n%^BG zax`OI`SbmA&ZJW7-edWQ^4aUr>2F6W8}tlLh0P1L)85ySJGTWY2X2fW(TiTaa38w` zLKK}}*Dl1M@O!k&+tu5$OjPIKhN^T5C~Xd%(s|l#1SV7z^u&f8H(Uv`uPSdHda`c} zsr(;dGlh|t`R(O5t)o_o4Akl22hp#FjQ7!B?I)Hu@@wJrYZO;9vWtcG=fL=iZ}dGo zSB%vb3ts8xZwC;m@w{f|Ftnrj3lN4Md%VK5mqcD(UM~g)JfAc)*eo}0x~+(Yoe%)q z)D!L}Rr)I}!AjlE8m-;~J|q3vQbhAV7Yp&d>bcGih$mG3N@WtW;rL=o&3IXzF(G16ba z5|rOgU-ka6J+BI;p)9O3>K}2`rX^>oj%pd}4<#^Uvf)T-z&?sqEoU^M#-N?t!{hxz zQT*5077V6Q)=%SorrZ#;liSt2xfmhe_|R!s0BO|#Ey+lqzSiWe6Eq09+h7^Nm+Ao~I}aWEmS=SE(ew?p zqjU23Qe(^Dytv5WX)D$T#&eIBnitCU3z9BRsF^(l{c&h~D-MDZFFZ^zLmtsOrKg<& zIJnrUk!MdIG|mE$&f+a*IOFor%)({B^#pa!_TSTKhM^6jkx&4f-@-Sz~&uFbIX|rm_V4TW|RtM9g z#cIfd_^6UWd}z`aG91u_wABU-IV^;i^K$q;mi4$n*6)rpHm>3iZ|`AV`w`pEzM@m& z<)sf8k#7aS!k3SaXUf@Ss;#n|N^OIa%NhvKptxB7s8&NlLuqC_2s7rYvtX z&VPj9!i(Ig$Fn1Mz=lif@(6qx*Gmo&zqpU>PWXJ)nE;)|l76?XZhYI;*4Bp=kKTiH z{L<3WtD{vF6@QW!Jcx5W>UpL;>ZPX6!s~(lI*c_8^?AlXU4%P@rULS^(c$c};HHZr z+}C!liC}~iDx4z`rsj2dggNvKsG*LMrz>BiKv%mDk4Xa~BR9!efD?6!Cx?WD6xogo z1cH}g0Df+Ds@^S`$tkeZ^v+lA03K~_0+S3~Y5ocF5hp0vjrxYRZ@A;80w#KuKOk1+|l$7qxJ0z-KUs(63Dn=%HeHoiESQ z9Z95rSll0?dN$^r?#UUdH51FBkOX@;M+a<{{)~Wr#y{B3K~bwNN0Z??5Bo4+1j3BS z3NuBz022x^Y-VKwW^1_n;iZwNQd`tf}JbJADhy71GjiyKZ z7_h<)h4DRPc-B?t?6jPEXl6kK1oVAu+2i=xl`dy&>1ls6Gc)ISA-w(Pu^X%E>a4yE zj(6r)sf@kAz$WpK%`7moD=mt`4=+n5s3exiN=)c{oyyaSESVpj{Y3a3XCT#%J5xZ+!qf4 zKBfgb*~tDsRDB0n(^nUF00os16a_&6t%F)+8ITc%ib7iyR8$0H*91WX8c2k&6a|!_ zRg0`J6;yV^jx1TVh5)j{9%_ORf*J@T1itg9@B4l4=kxS=YTDe~aqhWi{C?-eW4S*f zTGLskcwG%RulybkjYs2F3|?#gSo~Z=qNYIunF096IFKV^B8I<_COKv$c0r#V(QsUU zPZGJEVxEt^K`PNqr1ra-;7;tC3FvdcgA8&08hPGV^9?BaEQvKz?YER(Q1*r^x7Vg5 zRy1FScGN9@*6Mk-;iB`NF==pOV_TG_V;Mo&G&>iQM2cdBV*^*Tk{Uk5-KzS7s9SZ{ zkR8+U!l(l6@oH)tlcS|dJq{kU9bEe>__uqO>@sL0ldyBJ z=panGlV_NjmzP(g^TCqpYQvR{SE~)POIi%OuDVlZ%8XlA-A%aq^h6zgQz1lF4%UUO zbQ~G075i!;%Q+G-vjul1k=hvS+u9$-sjBH!i~~)>x%K3qr*8}M^S6`W)o2P^`S!6j z1{CiEmo}?$42l!1P6JQy&qn8$?agUGuTw9qUG|hnx59=ER)jeC^3xs5kYOR2BD4Rg0LN$l>RhKxou?x%*tJ>K~U9WaYCWa z<449Xx&M53So@nT5jrN(l+i`C6H+Pvkf6J&f@a7U%X<}Sl&J+lqjT8oLTJ(WK#!Gk zdg~JKR%<6794^#4GZe>7%D=Ssrlk6?vEGNW*`>5u#ntNNwfD?c7NT5ae1VlscG@4! zZuWCpe5+vYXI+i|F#NuoYfe)tnpz_b_l9^_Gux5wo#RE$U+*X^uA!@;lDaAnI=Bj( zZEL^ppk~h7T^(xhd)+?D^0zh=8-F=sW{VIj1w#cj+#v$=As#PU7(5*} zzx}=M;nn4txVSh(``D}n!V^_D-|K*19X&79&8y>=zE+i5h4%8HW4lfxuh0Md(La;) zcC-n|KYVDX4tmQEbeLO6NDXsfpn6X5EFmE>Y~`PS{`p%qY&2wH2Q;VW{jG|7qq-{D3+DR=~4A>oM#8lT+T8fosnkF9)+pq4;lQ zMIi-?z?}YR6Xo@4lKZ^R4*r{;pB1$WpeZ2vK5grphkJMT)La>UIMO;+rj$0^;FlK2 zQcVBSF#I$Bb(r79vM9&3U4`Qlg2XA~GxJX3CvO!Lt|~qZ;e+= z#C#Dn*#YVnoOaE&h!2zcUh-`XFlOMgrN$J+XvZP>hR^DCQNsisi> zsTrRz@;9offZFUZy4*YAy!zSsNVu~1@YIy&w=9Jk4^9{#8Y`C|WOw(;Qm!|!s=wY` zp^Pq3JZ8GTYP!amm)s|1+PByW^4yHD#y9;|gq?>gwcT_%+tmIIbRh0#%8;f&488rJ)wZ;$ z1HTV`-f-}<)unXr;Qsec$5x)jM=hGPSmi=f;kB>m7^E34IW(;3ecd-hlSeknNJS;f zx*GU13#RbJkj?d6;KK{qcVvmX;{tjW;sVTl+O#F8nXi(PQkL9I_dskjyS|d_I;4pj zE8Flj^l2(_J11&sTlO*C9N`AiZPkA^)KANf)%^bt4M@1S2AU1Z_0vIRbF{xm+W>|i>#hS}%{HsZdz8iB+z+6ES21qD$Oqzb^0 zfziF%Ua+cD#JC68o2kt=k7LN!_4bZZXC+=krTLAwR3+zU4l<>w2Ue=aja&gfT7XQy zStDDw>nC@o;?O$Nm20`cMSQioo3^%i5va_Wz4myWUR!tnUZu7+5rQ^`E>9NWZ}aUH z$yn;EX>i#i`W|PaGXFi4 zp8;DI-oGi+R_+>uYl{CVW+PE4ZoX$HM<+Q&1n2Gqu{lxB{;?Zk$194SnZ$0qo)&;l z>EM5`a?>;-ZR65YPcQ6eM6q0Qb=f=;7I#l#2*+(2mVP9?uX<76tkS5X{Q^f`Q? z^HWWXiyD0g{I**XIFxZ<=)|-rWd|^VN;EsTs!V5l`{b#*x^;^)B_%~h-QFu-d)YI# z1za!1#F(l?1xkB2%=>O-1YdT-AdjJrx-}#5rY;ix$~m=6Xnv!mfH_WBpA6VL1@|ig zHTiY-srdHz75+c}{MtFYptd}F*;(EfI^u%!Q&QsU*J1A-*J(=D9-ilj4SKi1sv)->3;?$9pZ~551C>&jZ=PM z%b~vB5E*%B)`i`~Z#c6V#7PpDQPJxGs~4@zC6~1J4-EX&+uLg%>O9{ld}z9Q%MY4( z%R@<;L0o184%U6gdaejV6*ZRh*+D$wwth#ao&Rbv z*}n!&Y%uzQbHaU=8o$a6q{X$kgh5Tk0^W@gukU;7)O*mgqhV`8g3thY1l`DF?6Tfv z&^Sudd73gs-$Hnd$%2E#oxbxYmQ7SH%+Z^@HX-kn@dSVGj-tHiN$u z6?S!t>Ei5PjgorE)+~F*jX*4qb=S@fU0-{fx)CKi&Fg_Egt(HvJ44=^n;HVOZtIU+ z54+6z?cih)BwO-|YCWWg1~aT{l(lT!d71>bL~mLClq^?mPruz z#Mvc7fd8P&D7<7L^Bb}Gy2Cn}*J24@K@^a^U!IcUEAt?Xv=tj}ES9<#nuVrM2Vaq9 zVJ#W5-kfA(su;0;w|4GTyqgM>08-_q3HziCqoB{7b z?Lbxu!=+CfO?bOoJB*{Cug8F>g@oz8<&HgP!icH6l83Yf*H)WMEeZZ3zBlU&r#S)J z1<3a2W7_mI*-J4W+9LKdugyViNFDHl3|X$`iTiL5g`#W-?BK}pbK}PnSBCU8nVQLo z5Y*i_Lw^@b7voezG^wC=Qj%ye!g}HVO=@Ss{AuTqveWLAhBS8-)?Gz6K2zQIGB9sO z@Ml&1Bi=D$s3&a%*DB~~x7Z$$3?-I`lPWl)-mobnEB))fo5OcKRXDu|< zSDs^N2#tZu2RvhInKKbjyH?+QVM!k}1ev+)0G5eYX{!+uN#T^(jGckNr+#~xN%*E( zsc_tSq}q?su|nTON~4DN8cxTQ58P4iOf^?wuh&q_LsOKRsuWe+)AvU7lVmU_oW09>E;|>$=k%uV<4k6hl}bTo z%6jBOkSOMicFb3{yE$VgL!JN5YW#>%Yan<)?JdQ#f#HUv2P>?2LJS5c4|xb!6YK+M z7&eopW3+oaKu2L<1xkQ9nOYwUd1wj220n1?lEXszKAn5nRF}09>%_oX$nWE&s2wUr z5b=ZMz*W*3zWMCQ$}f{F>HY9g?SLoTE-y$~tp~9Th?_ZpU3)Hwor#F~RJ}$_ujaqg zNHSnqgh0BN+Tlbl+RO*+B+P%lC&@Q?VgD9ho7De~6Ub;dlDZ>Rlb-sO|F^~;(<6gW znfa@fj5o)myTmfl;2Rx6H~7A|^m=?J3w@i`&&cYZbgKt*saD=DD)&Zoo)$(Kvc@ zy>VtiIan494keh$=qLCzbt-VyC&C!;@{vJi(hD-M(r#nGee4wK|9|rW%AL0tP9ini4mWfXVx4ii}bXZX!D}!=i@% zz{T}z3xeq_27coHeTeaV*%q!aexT>co>;w!{~d>ok)VQ+EkhN5DY)rx0hx`FeW)`; z3%6c~y2uHRbT}fWse^xyt#e3#6=0W(R}4X~RA&`{j-YZABl;81mJ%>nYUD4(*40N- zPJ`Y+Oe1gNl-J<+!iN0KWMZN;D}x3KL33d0H7p>NdO@`QGu&i5Z{6N2_+fAaAkpi^ zkpWgXYERw5PKZ!#e+<0v*x`o!HfhK<`}ZlvnSIGqC(4K14xHaV$#+$xl%00=4mj-q zt^|ote?v=;&*;xj3h?2`@FBliFFDv)z>W(+>Zg0;c{(Vla+{W4OQ?P^iQ|!xHXN8dAHGcR^ZsvJe7OF@?ybFk}PE z>dH;Zx`17Bi0d@SWK~D-Tycq*SFs1~@nIc9jc&C-@sV8Ym~Z9NnE#QakItQu{V!jX2Z5 z;A2DJt$zbaiMyXxP_n*;fhoyM1j1F9DTbBeU$!mnx#I4xCk9DUjB~Lj(*ZTqrqtIO zbqn>DeAZV_?jv`=fg>4u3o}xcloW;wr)JVxK)n~b_%z7m0`9f6ls=gcD(v;)0jOk+ zn5B1;M7UzWVc=foNFTpRqM}8%4UP=h8AVK(Xkox8O{}1?l#mroJ%Gj{^fv$mwDd{t zROA#EB7$X@U8U%vk!X99r|Ukn5qJ!w{hyZ8TB00L{4gtDi)~$u0o#MainPc45SLoU zK9-xf2RC3qCA*-o`p)oab~(T`9|wMngvT$ha3HIQk?byxgRFNsb4PI=ifa@tG+KHj z^{7kv3u9kGNLe0p2T#|5y_F4SR&dbgo(8|+e@y>Dg|9%kHIV7c}K!1Ou zAF8+;$Iy`FN7NJ`qA*T&Z#JC>;7EO%lsn(R%Ojv>lJSlWX^(62=;NFQqH zy7OY#^(B{slK?=fBo`-KjB$w?G#gpiA^Xqpn3z5=n3Dw$Iu^PCw?vocx$&zK?<;!5 zw}29ZjZr5iMgT}GGGPZuzk?%4KR7Xv<5QsjbE9M*v>X|-Jf2UAM}I+O4%>1MoE$kX zc;`xXv!Ew%+1D;JWEuBZU=oy9gWL>c5zYXVw9`r41Mb1UIt8+Kn_2g&+$^BWBv%EP zhgzziM5-&F4H@69PAAG?AF}~)VbG-bLA6b{R{@%s?C>tTR}B*q*AUg|m0$k=Oxl_@ z6i-W&zC$2Fl=E#xRif*fC0>UgoK+!75ufZNHH9V~W;IWqp*JQK^ZwNdAU1j0*&qXA zKB1jE>x~g9j{)q_K^)A+wBAY-TJavNvklp~>E(31U%KqTOZ-gS7e7*UNw?xHyCD&^8Yb^ASn&>j^SswcdwJaOw6NiLTGc_GHxHw zMUn43B7QJ&)BB#3mz2DNdx|a6HhhS$;P~&>*g+muX;e0&q}(GfuW<5pLCa);Da-ZW zf%c9$q4vD#6IcBtN*tBrZam4fAV&{t+0Y+EfLX|h2(fSn-Ga>LvO^pJU|F6)gqW6r zbvZz;J%DVY3;@R=SsWEkMujgr*#<9e8j|FSaQ0?$AxL0To%E+clEm_Kfi`H}!=UQa zl}ONFk6sn*ffzsQA87}9Jq$z~q8dOA=`Wz3F9m%v`{mK7@z_w;yvo1{&go^0t~DOb z^YzKBfFDP;!~4ptUUA)C5NMfWV>h80jX&~i_p0*hQ|WS85u&UwL&W8uK5f;@cjnq_ z2=U7MOKXbdpg9Efs2Z=n=0$~I10pGoA|x{fkig$o&>LY8$IeS&M>&MiMF~f3IAVZ5 zsuB-hc3umP-uwZ}X6QO{GlcGJE2ac~H{o}5^1aode+9X)TJ#INjTol{m#~J~sRubA zIU|sM#NADDQ$_GPQm8Y$WB`^tVpI{+zPPP%l)+{FLbSqtqK_S!EYRe7V)G6&ZHw!? z0Xm8?xtoQY)~iB~*G09H1;#j6t3)-T2uE4J4t3nIh-xyo;aeJ>t?)1I=R@+VKtqx~ zW+1x)%#2rs$yweNvrENwh;EfBMh+{dI_nkur!sz`1nxKR3X2JkmXZQOMe2Dv=h~O% z$4~zU{bOC7^hD7BGvGBl(y0)l+q2^=$YERxwBg+I#B!@Q@&VY-1!b*AwD$3uG{Qr~ z*xOOjyt3e-=_<6viN*F&2DCp&4QbR!RKq9lz1O+2qtlSISxZ<8ppmVZRvJB_Z(-yAB+X zU_oK%Zlt}=EBCkx_&2R_(+$Vny*n@2p6$Ho5YlN+Mo@j=zVW4eWkkZCrX30{-coJ) zgt2$sUt0GLeau;4S{+(=YTO57^=yY*CLcEqw4*)a@6nvR91p}WDlle+E3P|liu%B< z=`spi%-G>ilA)M#6umjOm49|m0L0FCzQ@DfWzU$Lj*`e6=CSFW;CN|cT_os#u<*Z`FdkqsXuY7DbCR=Ofm;0r zfcE;mK70sFqs5CFWN#Eje`BDNaRd?O>lHeQiYQwG74DnX9{jf?&eVc| z4w(Iua+FMew9Ixt#)uxa@bd1wYy&$AI_K7Iu+6x)cS*1B z7eTqC;q_G)@ANYsQq3sXYw7efeY{5~F2dlJcgd(nUO|q>mP)bcCXCSjH!e`t&B6iCl=ox$JtBi$2CPNdk#LcNYP^b$*Ds#8Z6FGGK!`)@p2xQ1~Dk-i? zUzMmTC{X80a9-vlgH~6v4O02*{~P5ZMoWS%#%m0D;CP40h^C5y(_;RToga=sfZRhX zttrsdNXa{(IUZD4b(Wv-*N?3YA9gtE!UuWflle5n6jQ~;8?U>_LurSFDS<94ihjpl zx@NbUyd{9{ZxacU`>|U*lvu@8tYj__hx?o(2Qyb|eW@A?Y zeAQ2#5DO|^xS_8=r&$pHrr(DYH~XrqICnn1sN0 z($;bQl#MZ%OB4h?+|1GPDK;D14KC9FFAr@#aYkQ)9+o?>mn4phs%kP669U!%o+vq} z`L@IHx}|2T*K%V8YG6#gIuryayKI%CbFuyanuu)aCA?0bDq-Dil4gQ0{Blh( zP-|!O$pnGVLee!7C(cfe&!M*k0?==0Sd_cbxB<}d5&Wm-XDL2&9hX49Q?dY?{JFp+G zpiAj}$W_N8u{}W1#!*BNh|ykScL8dT!OWWw{6I|!1{YW5dQiLVcvwwB$f(9jJNKK3_g5zisBqbH z!SoI|J&K3Er?ucaq^(Z@jOhWGLW)5|NJBhqLGB@u;d3xikrnGGB7hKCEID#v?}-Z|euB2=0ykTF zk`@~vzIVvw5a=7}d$8oNY_G}Sb;KnWyD)sc_;6wo=04_=QMlj~Xc`;qx$cX$zfU%PFujRlIXWEAAa8Hxe_RfrjhP^?Lql^R*8188|vP^Li zWE`9G^@CM#{VVZy#F}x zWe!6k@lZHc>VgT$gd^4z++Nif?P@!7=p(Tal4`hX^0>}xP143=j%fT3+nE%v9(}lrP;%MO!kar3;i9b6+ssk0QTTv!8;Grt)+l zyv70-LajIjoY+1TH{$_X5ei|R;3}OQK2N(((Xx4)_@{vZh7rys4rye+LgXfmY4f{H zOL?UWz9AGwhB-p&Cf*=X4)-7gMcZ6yje1+%6)d~?<#eH6x{Ka@S2a#VlAD!5``g|A zeM(^U%Ndt#5ZtGDJ1N>+oa?!0Q`&SBb_k3}7VMA+Lyu`$Un3&R7EX$})R!*YCr8MV zx|}9zT&pqATWfRCeZFeJe9v~{k`#N;&dZTmIzO#Mcz{W=&A6-^Ub7xWF#HH_jY`na z7<6I7@jg;M`lv|M@GkD=lLMB5zZn!LkEF-?wA#2j=mWoRT?!WpzW&tk&ypiQ4ZxPe z?i@gt1wk`|#I2A=LkTuj%Avm3WQY8{nHgwZDOddPZY7dMyH2vg{U%eLO|A8KjU4og zoaD!zgGVEykB=xEVx9#_v%JSAW{LV6hU_DG4O3tEJ&93JST8XS)PZm`C{ zuG4Qcp6gjtb@s8y){(;t)$zu?$eJ!7cWm^_)0QU-Dd%*WL$g4fzr8;5+ zt6hpzl5{g1@_79s!Q)kKjz=Dql_-MyErBUgOb#bV9XBa*HF4SaE&Vz>v5?=+?H9p9 zVy^8&V533jReb6CSzWNyX|6r?LMLG*L6-9phIx?&P8!4GrZ^Ct?k~A7pxE-L#^wB-Pj7IaWzwfr)N2k^v6=-ZSab~jX~~~$9?4k=GUSnqyJqd$aN5;{UC(Kia>Hv z*m}E-;ZL0ohwPD@(63P7WbIOTIPEW2kx0QYe_PiS!o+$!J_g73A=9(>ylovy(j?qK-cQ zQMPNZxs7^*72M8&seFTFcM}#QZ72~J8P5ruQE3lvN3`dnZQR%%UaL5t_(ba|4A84c zlEf>Zh^;(d9b)!1&d2_cuJ_c%qU@BVG6;}&0FDo7!$5kgaa6yVu>i;36HAypB6@sx z(XdlvgTS7%8)rS#{(B;tYk)1n48SiN!WlEqv zCF|XJg)sLJe~jfGnP|Mb98Z)UFeSi%w=}+9MU6;2SuJ#hq2}8qgt`zKf)yykN{n?6 zl$O8P8Xj{FUd{^^U`;_t8KNkyQh@o#kEM#BmW-gqN5gR*o?+0K*4e~q8kQBAMS)ApJtb#Nby|NADSGnaL`FhJK(zxg(_f{0tubAWqHb%{4R1sLg z>mD$sRqB z^@AT|K$J{Xg9hJe&cU~&rm(gQxwA9RhK~{^k~5bK93XAna!a|##0FEvT~;HForRqR)WUxB@)K=mC~nl7kWWo%^Z;I$9Z{hl4aweS~V1L~H_ccTp>PvjYLQ4`^P|@+!6& z%ZG{?{NT@G9$NiLewSa8i#Qiec*nf(I|zQcnPn~2@YWh;y@(I;{53epTSKzx_mWIC z;x>>(ImbaxUI|z`gobGe+}RYtZ@Dgi5hh@~TjFA~)9+k!wY=V@tFrF!olH5HYEb`% zZff&)SBPc)Uyp1F0(B8T`4ZXOqF%&$R>s9Sin1Xqb}qeZWtXSR8et;%T%Sq*0V*si zR0B70h8ciZCU8a;@VHoer+j!~z}+Y!fN^1u!OPLKj~a3c!;7--e_`L~t<=j{BKIzV z`FBKORT0Gr>zf$aGt@tBG=2s$!Ryn3uQA(=o+gNKe&S!S@bA80S=wXkRjMaPmnO7m z+(uG;^mg*9^f7&fc0ZMuNY_^b_nT)-6fm7mUUT!+*R5ecl^dMgY^S@uKDsKdU(tZ> zt?Fg5xq0P8Td$#gVD(F}pDaS+as0@l-dj=Bt%GxCHhpA>LF)0jDL&Pj-eerv%iT(g zNdQUNX9yDGTBfdk_g)8>PB0Yg^ESu%9;KN!=u8$1F0d5X)XRkIFn8Ii^o{uN_57o@ zpAoM^cqaA0LSk>Fg?|sCUCvv8Njn($=ZBW1NJWm?*j2Ar2dV+JQ5`|Os|fi=t{AGG z)1F{5XaN8ye%WAKbdysg zaFI)H_x0{C*AtN=1T3SJ?2e}^U>c21P8C-5LWCi~a4I_9P*j^DNP9YtRzeIn zn4CQXOpFHYyae7VtnrZ_p7$qfayNYSIRQ|K_LfiOAGO}sL}PDj;UWVoEBq@){~ZU} z&AC{!_D9Mpu(_TvtY?yijpIx{W0I@Uy3}CzoJJ|pdtTi~gvuI5*e44&8%xP%$<$`M zrln40%J65RJR&P*#m|B+`1GZXPZVe5#xqaDRj`3HxL;cUN!&LSc(hWSAv_s8+q44L zx*Bn;dm&3{lRCo9SJzfOvZ(qL$H>PS>v2BDL31U0_E~n@R6&O2bk`~hnE;T z@UnOdpx<4#0cB|ha%O29Kyhl9_4^TpcQ6CxV^i7#w&$HM_-jtMUu(&3w$UMBGg_eZ za-uXyI}i5npg-lZ?%AyelU~K!dv4Mn>=33U{8i;qe-o-}M}lGp6Rm`mxDj_P$Hlt1 z0<_GV_7y~2vId>WF~-_9^exm5qfv&ESKcdle=;LMUWPxp)Yy%7f1pDNNo(XTaxPI&_;5(v4rLdgFIzInD&N<2%pxpv@^%)nNGYg(!4 zVZ!e?jtPHY)${eMc*8r6O;(=2kb}BvOR|#m@?G?F|2_D#0c`~(4E_Mu9nvOzv4f*F zv@Ni!=_d+lTlkGe+G>1;D9xt`e07+*nX>K%S`xAE!=od0X&(0-yJeLFy5#^8u!{<* zq-_Ebz8s1~v{^~ni<$^DCgA11rwv$hEL3XDyF35rqo<}UR8t`|HS{CnWs!S(tulK60>TZm(M!iXx5MlyHozo=Rwh{jElV@dA zw0Pv@#)B4sbILmK<&c`4e{$9FjtiE`o#)Jy1Hf9;HTNOZBkqAX>Q+r?eBaGGfvdE| z(TW(9?5bBS`rGdvywqVW%Yl?9ib)acRuO2XNDtU;`wL-x-;39dwn=UDt^MzC^QZqa z+(y(b;XR#&0SOmWhOp18s4jL;n(PW$6N3!Wo4EO&%ZQpZlNMoPpDjH5`1Jc-jMQBB z1v6>g?sJF^11n%~H{hVQl5bNs_>xZ4;@?H#!V|d$rgNuW7S$2Ak^kTxY3q#DlBlVP zcPGuSU!Zev1uzP=sPM_rj_d#Uz8+@I`k2ZLMC=>5<)+ebL)DWgkZ<>UCBoh%T@qyo zA-UzO3Pl$HoAE`+o5tcrPS!XCUy<^ z;JKMWsx)?Z_52kOWp`gCPGgN7q^^z9)T&wa&jRuu%A554V z3D1`llO8Hg#z9Q+e!P zZ*58BYxwzed{%+-2zLzJOmN5Lpx}h9t?@iuP-!@C^|IeoYEc>Y4v3Rq!MHCoqKnCQizWH>QrhWH@fmf!Tse-nU=~yS zOv!T-|C~i)Box%nC_DfSbTeRBUC1mV8JLw~3GnXvCH5p^2c!Pl(=Mp*&y5+Tl7K|t zWNOC4s1Etr)2usmo-dR$EospN&Teyl&WQuWi zkL8O!dK)q;X8x$PpVWJuJj+QnE|y?LEj>396GBYrY{@eh2@qw=QYq_0Cou1~@GqF@ zbfam}5NnU=U3Nc~s7gcu>v9lvmuEO0VeyD%M=CENl-5WQ$p>_A=iyA>H*RV>&ugX(|^sZZrQfeojwSDV?&^FH-CiPL+amr>4oH4cAk>@kz%> zjM{#Y2}(L|I`nkdf^4PgkO-n9Lq{A2%{V_~LTXvY2uP*m=txkPJxanh$YRL2^r7$y zs3J?jR}sT#-VrPf!I(;?I!~oP?4O)f5nYH#@Q60v;H$@iIt@Bs&3CJpZNS0_DrFrY z$`=5;p5DF!B!9)RH=>XDUP)-J6Gr&Hz!!0jRD9rU_!72G-*!1$7oK(48nfaE7tQJI zO$w+vfpFqmD`1<0+}*P)XUYc;uFi%+*ULll^75X-QNnOQU%%Ajsw17U>%Zl>nTV_$ zL3XvKi7ylZA-NeaH0LjpAJ^nL7IR~EVIC`x$ z^gOr>N?DnqN}kaPOgsNxRRUB*QGp@}&w!-y`)<|xh_8&7gkQSIxK_FfH9HORFRO+S zA>0Pq$=Xck#&o*0i<(*I67)yX(2%bf`aLEhE`fPky3^WB8a5;kGmsLui51x&Ar!@L zMg2wgo)`IX)5oiZF*;T5{P&#uUPKn_%=pzwDdJ`1Hk%@fzP}8ibANjGB&Ys`7>sse zt_!Xhq(>>8qgS=`=qj|0rD3b7C%|KnVq|HGWh@E*a=<;T(q6kkZ?5W49C~k`l^MBw zTeJ(3DcJ!3kOez*1 zx9*@~{pf9U`o@`nUU{(9&Y1!E44(hL&QbvI0#Iz|{Y6=g(>!t{cI9i>=i3r0KbBWi zs5u!I+z^qLhXg?bqEkPQ8O@K*1b%gZm{xN(EI>F>qU8>CCZ zlpx3lXk$K*0RRXWA0mpEME$%})ew~jYz@|p^K7erHH_K{K**}bRH$J5zDiKKBkYpR zxL#Afda?&C41?C9OlX)6DDr}}vqky&u`9DLSM^d22)Ne@vQuPjbI@0z%U^O~DFdOl z-ZMq~N)o`yQV){enVb;f|LGS+899e9G=3_xPBg%^%n?qI7i9Rh5cfW3Dy)~8dU@?9 zrM2~?q#6bOb!%}vDh44cuiYRJsQLj@7xTgzd)Cr+`MmM_v`|o3C=YcN66m*k&Lg`G zkJJSl$4-Oq+yOvkM<#U*tMnguIeWyw2H_`sHBm%Tp}53fZp?Jr+3NIMFcWsbcLGkm zU)K4TjeQ9Ej`3Fz4E_YP+e}%Mn4P{L^yyzZy`jfB%-g%|p#DoRltY(YB|490q$Lkr zqI3?Q`MPY$;~gUmDa*Dva-dFOnr%H9pEzgLGJK*E(|883nMHNXOX?*NleutICn^7E ztY!g67$LLSuTAqoV*n>_U)?M{2?H$caX1S|51N$0y! z4iF}R$3a}3wR3Ptx%KMhYbR0$vW&V0yT0Z~(#-%hxyYtxc6Xe|JK-*TA{+gZ{pZRr5U671Pj_#lL5< z1Xir{6VjiP?8-8Oq+qtGG|7D7c3-nt&104AU zX}&E)$*j$0iX({UEZjaULLq=k-^|6TbU_u6IcQyVorvmthPrxDIBNi`vWq^kuh^QOW(_$#(x{h1=7RiBh*4ur;cpk>@#U0p$73kuGb8g-LoJI|X6 zf$T3VJ!S2vi|YlVngsVqs%3KjE}9s*{VqWScrQ|K!qom8-uuw*<5f2m?h(WggPmFb zo^sh4Yk6nXznr5&=qpbq56&qcS8iDS?_|&P*t(Mu50~*a^%qyD60kUa6dc?eVb_ERnfz(&K$6<3pCa(pQH7M=V_NTN^Kc!cRul+ANzNKrNmK34!hk9L;Af6RyKm#@uu5Q@yz~Y~<$wRU z;A*u@z}iT=vWV{%`Q_^cQD@KE8p0fuAZ&p)qdHG8;&|bxv=V zdx|vD7T&P?a~yM)ez-Rry7Vk8aPfTv+T@DS(x)eeAK+41?Re%K8u-ntj_<{PXf;^F z(k)V~Wxat`y#{mdZ_H7{&eGOa1u+V>U+*e8C&l&YXa_3+4Ii=MnQ5O-n0 z1>|XmQNwl0_=RBTIQ^j~zMOlhDCm-3*IB(CVSIep<(1)4AtixWVlx}e#>S|wj;m@o zL96O1{DR>;LV<0D&cH@1Nd?xy6LJals{vEcB7EWN&HPZJZ|{P(;XrF3Qs||*tj~$Y zUQiQmL_w#D!jSQtJ5eLv*$VQ0nFx53J!WnkLtugpUq>NRvY`!o>$~KmweeSE}mxZiR+e5enyEiun zJHIYpHhq3>X@za-9L&O`Z|$@qy$({fNeWPCYpi|-v7F9GN!2CJGi{l$&>U5Fm1*lCdXd?@CK#&{{^13Nsne8i{bkmx%#eh?3jD#=`l~%B| z-W4LGU~z3p(o-b-84ph@aXB+R-Y_!n%)HNy1@xMakBov_n>qs|-&AWM*D#CP$e9KVu(V9xLiSTPB3^b5!-ab)zm8ba~9g zm|aE{Bv@a>!~BTw;69gzRo8#`@ZoPCpPM%g&uARr>>aocZwv(Kb0!B}ecEPBaGz9k z9Au#9)5!-|Z|LOrl_U9$s|$rCpBp&PH!Wlg_pL_*g>zk2*y1R|$i4lVs4G{m?p}g| z3(}3GX#Z~XOeqNLzwt%vv;nf}LMGbd_h&OY5M7Kj-t~lK6(NL*cG2Ic$9+P;I98rF zGlegql>=`4nlv%m&4r>qBO@xSq8fXJDE8&`vAjEnkgx%O5)iyc^(~?b5`z+I47&3N z(KOe>Qqz4rs5>afw*!0bJm7wm%zxjAxzkdBwh2F7ae4zx29`;9sawn?XB;0xapc(r zI12)yt5{h{xq*8&p z3$ILnClPV`$5Rz`e0j2K&RD9xn)gEQfX1LLtQIRQHNy(`T&mf=mJ_dHY`9+GW|W6} z8Z^?Kof$fCJt}nIOQN%d`bVPd2Ms-8CLV~@*rNFkP8bS%EzJ}Zs7E#JZIHQB(`Ai?z>|%4C-w^vq%n7Rk(BUX z7J5by@L-^amrsM$b7PxSz0|EWWv6W*ZYLuwCb>ui+%W$g^nxI2t)ikLsxI78oTI|G z`gf#Pb!8(&6?~IXiJWX};eah9byCreTxj>hd!Dj177IlidoDr(M}{mxL{B^&Qb6rC z4)Xt0p?S4(?2g}gub0T?QHT)51TQ1tF@PGW2w7K^v!R6Z$`OL5vm$$%9Pd%Ew*%dd zRnbKX{xdO#pnk1x57Dp2ZmNzoN33M# zr7;qOHQkeAyixFoWu(1}ejHGv7a?6?hDGF9Iv~|KX<)SDU#2}6NC&Y}%o8&mR@fQ; zQx<@N@&Y~(1PetWgtfC$Qz}kRLMun-3}Zm+O!!rXU(!@@$9c0ExF~Q!vdVznL?SI( z7941QbN23bMg}@fBpiQbWen$u6umnURsdi%NGHf30s@|dU)Z$=W+yGAMevugGdia% z03?V9zjPCi;9gsvD zPrmW!w9JCf$%GMt-D`^Y2dQz7?3WG z_jpMmR$rIspggZd)k`@0cb~(~be#RalR@GG9V-p1B3zm9Ag-#azZkB{W=Pq;DuUm> za-STJo4hf8W-|Y95QMSeW~YE?N5_v|$kEyUzazop2Lw?$OcMtgX;V0#tF3xURHhm` zw3TUEjZk<2W6*r2l(dkMCpZp4T`TM`?5T9X4cqHaIiXMDBAM7?!oc;H`|PJ)V-Utr zRDZ;<*pLJ&VCbI7^9|fh3nGrQ>BAWEL~7xe&?RWfEQ3#U!Q2)T4ji6Hj$7 zCNK?-rgA7Z2Qn#t90j`g}o9E6)CdA#%DTFfgFOeyU^JU0a>OL$U(PWwq z`38j~JK?pD#)iLMw1byiQ zlij1(9DkloZyV$!hN<8(Ygz#D6}g;Afl`H0L}ugCpDhWqe~B^*Zo07Nx?}+Xy>qxt zjL`U|#5o+WJJgzlrDCPKBy)=8Iv-->t|^v4h%Y6{=m1*FShpLE1&uZI_<>Vw%!5d{ zXuGPf=ca^uF#Ro!XI{2Ua#vdn-WoKAicl$y!*!_eK9hQ~8Am}I>f3K;|4h;$h7F#F zD4X7lznR{QPIvL)7nQK6##)#k1o;vGHOOV%u5#^Vs@M06h2xw7-ENnWLYU-qc8B(> zQx9_blTrxJX+E`TD6Vt(2!tS&$Q$(u zs1D)uYjpJq8ooU#`~L7>wg80I?gw5DDGmu1&YS7MC?2`0PY%1=pV8UCmWNF~3(wRA z*kolY1ho`l6gQRShCbGVj4?j zDWPsRTZSa0!e~a8G1iuQYs}cnSOzWEk{POD#29|(tgR@@h^0jI!=+1>?%lO+@PE!?s9oX3l2eO410U+u zjThey>64L6ya>D5v687Ib~fk3(*bv4s61yPWa)g2iCURQ;mdV98G$ zn_G*ykmgXE*l8RH-#ml;==P+ zFPsd=HHbc``DU8jl{EMIgjx?OSA5<;{kiZzPvwx<ct_6aY5K@orm$xzd2U#ceaXomjcp7Q@kiJhWUrcazZi7opZir_&mfM$>>wQimr2 zjz(QL-4%Aix^mkFp0(g^$p6j9KSYCVWeml)7XGnq<_u5&aCAlqsJB0`9u zITGZZW%mRK$a{2s&6fwU!w5E9Eku95YYH(mEWh2!oKK4tyE-@%&poc7>{c3ZgJzea z7mIr_gjT@c?3sw0{TCN&(*J!V!Lp`=#?1i`h^sl@3@+7l7hEcfb!vjVkT}ev{1~ta z8UQVrm05e4FGG+;-Q$ev1JA*FYaNa}eKMVYi1=*e^M(&>|4DDC*n6lqACGy29JOXA zMq|Bo?ilQDT|qX)d6V|utDqQEsTX8O9kl>X{eaXv7TzM2*mGE+~up-au zett|2audcCgMZU?%G8;UCqB~2fp8V1+A0PCM|l=Xm7BCsD1S-q>&Aq{0q$i?(>A7G zD0?maHAMrsYZ?Gc0&ZM($Z+m`9}RVK!SlV)g1Jk*4f^vyRIJr|K#`sYaEEP!o5Ad}TPM#b%<^06e$skQ{iM<^y<)JX4gnG7Mr)BhJUO zx_8eYtUZ&4qnZM>4bNtQTcL@rbetX0p%PupPyId~Aa7y#?Ny}Nn-E-=Fu^U%rxJ;FU;(qq32>PjvH7&(B0VpS=S zOTkMi)*?A$rya|Dx7rSW=yApfa=c&;wA(=Eq6M7}u6xOlH4yfKm}QjAPz3phXaBc& z^o%{{8s*iFk8EPQ#8R-4pOkYFPmaW+VX&qj4}=gIZbriK6*2{%i- z?f=+(e$>=}xYJdj@_^A#g32Cl8t*(a)!Ni`KXvu|MCvo%AsQLJ*W#H=vm63EAbpqX z+Scx3EBLi9Fm(}sH42KJz2#6h`|1B7Ui&9fzxT4&E_!}ry5!oRXHW|DOxaQu^vsh(M}j-9KbQ1EbAD$p&Xk5*kAo>3R1LjQ7pf71BGpQ52LjEfCF*N z0sJ^jn;9s#X~zm**9)rm5p|i3&nckBSOs2t=7|X=OWTy`zvfD51`il-5Gn(1@sTB) z)_vH^06?~!Myl74VY<|Q43px_y)b-1R#L1reB(1j3|97Q^!r6BbCNtx+X|GvPSL!O zh=CD<`37gp{%ewORU|XH60j$>VfMQ~kx1|U&MkPl9yetMBHGsOY^y68e^{jZRy#6T z6i>GwVEWqr4;qsftbao{Q7XP-hQCHn6ctoq<*|+cT6T)mu|lrGp5KX z!Q-a(hdeB#bgzSg)rlg@)8+!juao5vd21pXUu8Ao%-Odl@mIy3g=IaC5@oRqrfII* z*;ef4sd&mBH)PhDS3m^=qs~Bh9r6y5)Kjp)1jaS-6i_8f~v<7d$toyHVW?)cK)vHTiJTJ4FIP=w1 zaAQZ$9ve7GLkDnHiT05zHj&mt!VCNW0th>BpkIzLs?amMVGqJN95JtwY1617B^w|v01`@1lgPT7nlTL0f_$_pai z^`(70m8D-RxXSuD!@BA*1Q0y#)<>=-O)20H5=G6mfRuYwl-O6GD^?>XhVUBm>UV5x z@_3Oqo&d)DL%{w$VTw5l_+%`aG`Z}fa^IVTxcZK|;1X+yRMl_*w;|>%t0^y@ei##- zIN3gy1jhq%zYDhEC$ETiR1<=q4gR1f6Q`$4u@!CsDYZ`u0J6QyTAd4*AfFTt+bL`+ z4*;ngEB48gMkl7WUPi`1{)X4{X{?)91Sxdb375!IIL3FD0LOgZP(hj$8k{DYVRdp< zsOLig@C5n;wLUdmm{Vvd^sTKPK_v$)Mlm5-Fmr^ zr?7wE5E+@rT!E1F9Gp#2VRkPtj*NkT&KKOp=Zq_moE!Jd-$_hqEzrq{Czk4fk~XLd ze1b(dR5TI9%aQ#%*Q@=G%KBQx);)X>8=xnQw@xN6C&-y(2lw!9S6e=6^caSJ@2=G7 zKeZqlZqy7e;dG}nq+^Z(4u^lr1S^o?9Y96qTlUxz^rmGl)Z6hXSD&VnIuQD)!bR|Z zC$$S7r_GNig+wD8iW}|ximYrh;Wd(1IMLIQ z66-WG!G{2A9ct?UWpd|!-T|_|rXa4jW01TdXMA#74N*{@HkQQdQf+JM?M^S2+=-B; z$M4XTs|zU3#N&F9aG2R!ty~4RIyO#MKFoGsGIpxfbnnB+Y{@mGJxHGncIBvmt&X@7 zZ;yh0X)Q1C&|Nx(!WQd@r*K6#yczHshV9t3Y{47_BXt9@Szrk zZ(Bu&Ni!+K)rn)y2FGw$5D0d;G*Nc`S)4M^4o3g14pX$3W2B zL=W&QF*1Evx=omzS;TCO&sgA+Aa8E<5Y#Z9YCq-Y41g|MVYnQ2Ssa`ikL^G09Ro{s zGDhA--HzjaW(eY!ZkQmYUy186zE_HEO1gmJu76%b_HO(}1-DjbhW*0HtY-HR;&f*kqJg!ep>W>fc0Ig^%bLrXH=3UE?=7sQTs1Rzs;W!L*o3t zrM7uLV6bPpT+F9Cw_PRd5oCe$R_$)d^;u)=!n15^cf_!kLmS;|Qg;FIzZzXhqF95D zo1WUNCy?30ZU3)4N*9Wwq5nztwUL}4!LA-}@FMEQi?Z?20f|(<#h9Y-=kuCcO?ker zruQS})k14$)B~*88^<2B=CyH^6+?N~9UGzw9mKOe}lSJ08cgMkY zb}?r)rTKDk8~=Nf!nuT2=o^RqRuyDJ7`p%puBx+fc!oKV_)02kF@@p}rrI1)m>ZDc zV4>EY@NExaDh3EBe-8!!3zFCxl+SomJosBbcOK=zD>0NRa`tAp8V-j<`>5e$%@lKMNHHGMpW#nSoK8dkW|C&Jr>=N3vtG zEq%Gr3B)e6elyPl@d^3Uvbl%&jIOD$qEj~~55(c2HDM;$)A@-Y1@Dj|!Vz3`QywdwT_tDkN7xftPAQVd=yXQ`$ zl)pMzUEvwAt#?!I{v)P!UJ;V3ARbgC53`CX!uQhlACsu-`UnYv61_`Is=}_BvJohff-b->O z^IKMxCH8h!0`~O|KlfeF2Me;j;rG!i>+f)I3IN7aNjbiaO)&w*UTM<90oxvv5L?L6 zNTAaJSe}oD0tm&4t@kG-6_`m)LxZPtoq~%7X!_8UDt=N;lp{~y6PE={tM?T-^ z`%*w%jej4~vT>qRZ~3A-8poXi44m;VeF4Sj|Lrj~CORdO!5YzR$R@+astNZ4S(as0mzp5c8&o8+tdeJA=QOfb zBaS9P5tY0Y5o@wuS? zu}H~TUKf~mcjbIJ{~#$sO*Rnsfy+ymxj1!A+I)$ayL#jvQga0>D%OG)Qd@u9^yPj5 z6%Uug+w;dfik|rchH}+N3OJeasDD1rH8(~mXxJEWlo2Nrs*JbHT4u#lde%i=Ue@rQ zAZ^|`1zwcspW0{k*<)Zuo?yK8jVERF6?X$>KTWGv2^zeLUrshH5?ZxnPo0er3p~X({CLTK(zFST^ zKV2((J5P&8UbkSf3N;+1P+#(bgL`I%F<|e7dcR|~!X~f^`TLFA7%3iGWi-lRYtSSx zj~I5g5aK0ZP`TCuRSPAA0;Nk0X*aXD%|gkE4t)S}tucE?zxRE9R0N5mL_BXh=qgNI z=WSero$Bz8F4Z!yfw9u|WA0Q_xtH8mH-O3Mw9h|Lv(o+x(3{M9m}Sh%yo67g!zo&U z$qPx8Y`lLFI*$3o1;W;y@F(nR=82quV%_)h*OxY=#Tru9ZmY{(N(;SD{_zs!b83{7HbDDuuEY9w_S1Y^(_Yt@8v2GQk zP}@&&GLpT9ENePh2SqDi&M6FH{aj7D%n+>Y4GBN(GsG9;>B?eN=DNCLvW~^NBqyWk z&cmR~?QC_IGXgs7HCS2jF@L@~T7iUE4o%hRj?%0v4e-}{Kkby03Tvf^1qJVsaT%i% zbU_wLP+=$&tm_1q%812SeivLF!c!{&DZhb!ekfj7U&?>>5zN<)Ch|FfvNLB5y_rJb zMjZGt3Ni@G>dq{raHyI`m&hz~ED;<^!M9eh$}UhzNX-V%lI zG>`QYuQhSS9_L8U-Q ze&a!Dx%fovfOXa;lAL(RPof4<3A=j2s}Nj9_b#33$XQ${7;fffts&zu2Ck>>_~AG? z<>5&<8^k5h-31hOkRhQz_m0z5MEyKNc!f|F9G$Av#Set=RO!!89TQftUgms;2ODg? z6R61@7v9|-{?ZB#5{!7lA9;($lhPm{EFRf^j%em6P$(6a!&pu9O(fprY2#!0o1hL( zJLozX@WmkH0q|8c=%TgIS~!Xp6djOo0(4Av$o#mwqn)m>n00_mY~G*}X(&)2p&^78 zc{=i6KV!%R9UvD6-(XeUMO+i;ihJk8Sb~=-^ssG;Z;gSCU6Jc7Z9f8KQ8uD%B(Y}r z^WW4eCOB%F6_(Uc*m%ptJ!nP`+6zMCVY@5c;oZ2e4mZyiRBf0B)lQIs&pF%gVvF@R z7jEyndoBASzsY59H8YR^xqkMF#cUMm@|Dr#?0c*pb#jn-1mg;LX?)pSySDH*FbNd; zHY_axSy?t@ssnaYcD>t(F||83s04t1#ObBu+DUR9NzlL$Uh5 z0S-Z#WTePMm7sz}%?R#O-Yxw2~k!}4iEXPH-m?zsMAXTN-d2d1 zH<>+Ml0{{vhD7^TFl5Q#@YGdS7o>@gog7%jLE#XqPO^!^on(h5OTSQJnO763*&$n>~*e(1b=Ces<_*LIVnwx*o+UNTHP)!lPk`Lk* zkl+HlrNy%b>zGJy8ZaRXboZ{GefMIi-^;$I;`T>zCoo3xCM{>zEtk!c!DUS@Vvh8E zRw229q11WE2v#`0?#j*{-$EU+qhVS5A!C*q0GhlG5Q#8eq+mlFRwaiQ3Uvzm>#7G1 zF<6nL9o*i#%vw{)HugSI?vSmYdnLp=6OcV$Emq~fG)mRYVIFB;flXj_sbdk&$8fY6B2n+3_EMPVc&3`VIfK*TZG~j& zAsXainxv>tF`?i00w9a^KBg(}=qw~D*(OQrb0*3j=S5kkpPp@s>Q)i_eS$}CzhkMs zmJctz5jDIM_8j6mkWTAfM*XzZ!}>&;!;Z2juHn^6f_D)6ZWsaYJ#x?7TTW1#I0pV- z^!Nj~Byc(TTT``v7N8B9<`9oN5pvTA)2Ht{03paIf7KAh|BCt?UG_ESFK&HX-`w-s z%2|@u_Fd2O3edn;x1l`qjq0j8P^K=P;}32xD`6-$G~$Zi4Gex9z`a9tFU^}yqEWMY zD5u4o%O0yo*kK_8Ye+}y=OC{docV3|wCE)Bu;0rfFvECTsqOGWnsq_Y_pJ^FIBoi# zRJzBB)Y?b*<3n5I$8(9JTI2+eyJ%rsv)c5#wGai}#u?or$U0%=TLQ*P@gF0!@9CU3HIrdEYdst zhMrn8V@$iwYy-qq6)n6Ev_F!)qISAMImvYqVniMTRhAp zA91XQdgS%~T6V0j&B{7qd?FJ)OncP^t_j7@rY2Wyr-m-;($%QR@4KgOWbi}hJ785H zHee|_0`Q~zm^*E%mJM|M>x+>@r*Ezu;U`pu{;+hdV8D=_Wr9}_>v~mnBO#>a4^_&h z@7q|brXkkAYVrSu0Rz0Ov;w*~8(E}0sB$2w)M3dSeUvw`NwOmgpLvk{(jsNpyL0XK zDzG$J?JFdRyxel5ciu#Wy$X7;78DU=m`h9FWkIT^0hiPiB?m2+3zz#HboLSlp`W4P z=3J-r3Hx7<4v6<>fb$4GUePL8*4*@sHF~t=$;sy0BJnJMBIL|1XN?+o`omu^BST+S z#PwjB$Ywx!7UaS(mt(wJvpf|L{6mIi)4zCItEz+Xyu2@9!Y=QNTUm$ge+Y)NWgk?X z-^(U~Up-u<`K2NC2uWE~)NfhP_zvKVq&kpXv91+KNNH+(_ajtIIB>MrRdLcCry^3E~I541ZusV{9N|I*x6Mi zcSoU_oTTWEeH^_6eS5sHF$KJI4Nvs`#)WH5{Hn@Ob`vchr#?5Lr2jzsgK! zKySRJ@QQp$C0{I7ASC6^CWa49owl!$2x|E+LcrYe<{6RUp2Mn=|KNVG5{xO-c z!u_|I9P*{W-9!cB;;|=y!79-Ldd-n=cnDhB>Gw2t@em1C zCMSSHTVfFX8R|6bPKwOjHuplQHfDGm7%R3-lB4_it2=YHj$E0vnz)wM7f`%*Sb!|# zFn#6B?~2$&O6MViGB}|&M%OB9W++0No(?HTf%4pB0|rUK$V?rr1ea~3kQ_sW1h5dC zSTJr5f{5`drPDXq$1byE2b_@*5weOuBlqW|&Se=!36pg7dsx*H@RinoX}DuXk{3Oo z&fR0a1oMx?GiJayxQYv%^qaU>pq>mV_Geh~BifT6TC!^rHixSO#-o9;?VQmBK1Mc*D60gF1f3 z?2ZksRP~&o8+nl8%LMU;Z+!C^zf|F^S8d;m-cv+c; zj39vH3^kE|5^;^h|IYau9z35U+zBFL@g+|iyU&aG9MT}C{I>7<-MkGnfH|zA^GV2A z$9WzlKI49a+Y>e(XMRY#@G1WY6VR2?==EFcO5$R-h&ah^B z7f3c}F-g%~0M=BDWT}oo=blAb)XH(pAd;^2kK`>rB^nCs2B2re=wV_Tf0t)qGDN14 zTSYaK{ftz$4urL;w*n-b64mx-zF_ILp{qu$wad&4)LY}XKC{hAdK+TK_x^^q0b%q) zE(Ms##rmF~A6w!t&-v=nz&HN%ePQ&^bpT~7Hhx{p92#C!a~DiXX% z$(0@z6H7AC#_PrQ>Vc<*@1A5p6Xn^)C8-4Z9J?S*8#hLe6}*o%Oi+Lj(rWQRLk1G~ zG5g(-Li}7-n?1a-u$F#KFF7JqxC04Ja1$@ux~!1wT^QBEoKG)6!ohcusK9ETf#CLu zoVG%dF{(x??hld>|FE6*k?vh$JX&&@Ig5&O^fsW<9Ki4Ju7j*Dq&~7gS=eHpZ(RAY zq3naRy~~B%$X0dpHLxXokwlLys6;v>TEs3ce5tOe9m#pGcT)Pa3#tsh zWI{>6$rTr6x(|X7fNlxzI^r-5W~M1tfa1BKP&=bXHXtbeh4MZ(GENEVtb4Ps4MtBq zE<}vx6Ub9xuPx(L*z>}N0Zo7TwsE%U(C~WT;>T2j#)|p)C1@&n2NAU$QYdRh#15&( zs{e0$Xs>8=ZXAlHw)iZxA2v*-IarNfJrO;g0d=Tvapg=YW?@%oXwRr3m{x0;_DXIWEaGf7KEZ}ThWiBrd=H=#kK zxM7KkT!zY58+GO=Z{ECF_isU$ir^=)G8Rs6ykyh7Vz+0gs0n`ULE~K#@@tQVSvK%% zCh2>CqdWtGJl?#mf>pdtR7U5yok&$9l+b>S*Sv)LK0(!(*Owj=E;dWkDFVM%y)U*- zGp~flDc72I!41XA7+=&5xJrRA#@!gtozKb|NWFW)LRa-K2vMZfASbU*n;(i*N+y!B zlE|veCq*%1iL4fzfCsBkl7I!IN$w-tsBdS!4$d}IL&@COKe5khYdvzUA_6CEmnQZ4 zmYy5hn0CZg&wq<2j&f2L8WIu|jG^oze7}JJlnTfkvcSI2&hPF1SNWASUi?gqTBuTlQ83e^|A>E?$y-t2s6Vmzo^2^zxl64s^qE1dDlQw&R4OwB6aL44yPSnxj>~3zxI#*bWSVv!=v_TE{RG)j(bq$^a=8 z{&5+rXk`=`Ok>aS#270e6~MmUczYz9rO?rDD>$3G*S95rH zRRl*xT<8=bk|MGJ-Gq%dUL1};4R!a=Y)2=JQ5KPtxoC4(v;k=BWj$dIMM?n7*Tl3A zH1Ci_?On-zVgCQIY8Zff@oD>2I;1h_ze( zeD@bemD4BJFj{s5AcwFVF-uAVSd<6kbv4AAC{*V~j=0&mZeX7z6NwJ6O;n*Mz(H!( zrHUB$`R&^AqT)OFk5$kTz`1v>b&0v;`BrmbC`KYAFJ`4IdCa^~Hy=2%=lk%LR%7`u zr$-We49&o#0$Vs5aDG;SDI9!!Hl$i-p&QiW(NMjbLWBbYpO)>ruAu6j$4RIjf}DD% z3i-h*?ePbHOh$WcchH@eE<%x0a4?j_NpVYdn$~9Gq@~D5i=xlzj~6e-ZJvZXr#*g^ z)u{%-i&|OF2A2z znp#>6jUQVGsbBc^CMohGhP%f=nOgVlwNc8O9n2@+1q53oMXC_zkpX3^&>eZHm#MS< z&1>eDk4Yc5E4)5ZuqJHX!KgQD0^>j9wjX&TtJq9>=lO6qz4V3spWVN$_efpkS9i^{ z-`>PCvhr9*_|49jHT{QGx1KX9IvnXaFRLQ=?F4S+wl$=T`}O>#r45)j?8$mQnfr#A zCz|{9!LuskQHjKw%gW@O%5(9)^!30k&+jtTA-$Qeg;19JFEnkn!ya5Ydu9aKnt!_D zDP+wK{+kXxWevHuOP6+HFb2w1uN(G~@+snfhm0G*pTB&hpD>;&pRH{kQ8})9y*6vFbOdIJTLCHt>H725Q|_2Hp{#es+7%_}HxEMZ%fbazhEx z=17lsosLSge$s}&mTF%LxR(2=PsyfCJv!HJW0SWu&;(ZJFUnP(Oj7WLg|Dwh|92Iv zw|=PjD`IhObaV=h{#MJSl(#q1)Pw_-G3-UlJON=zQM%2UM-RCyh)w#}#+49j`rAVh z`$k&Y$gH2Z@x>)!kWW{(Co^WuPVX>siGPj#W*GaS;)3&b?8Wy9=n-tq&7ca_?%IiR zrWxJm4jK9m-vP;hZp-=5)OyH7O>+FPzUvPaWyx)MCg5LFKCv+y1V1TvKtWcQ3a$@8XARDEH}FI7^dnL+Wh>i=RTO>&yQLS=i&3DTo?Hoa(y z0J&OFw;r7Ou!;*!NOPBjVC?aD6o$iBv)4A=i2nFDvO%Ov6&&CGR8P@|4Ig0JjeYu! zu{{;Qw76@j|J>4vZwK(&eQi5g-#?_x4QV`0vFe}sMLMix>n}iOTN;10kO=6aM%Gk= z*XrsUInwe#aOWOq zPanHj-5W$qmW(BZ_ML@}rgK9s&dxJ4F{>0=Sp1Ojj!zv9dNZTshyTq4h`C?SM1EZD zx<|iZR=?`aV)aD(q#ZqQNKFIO?m{TtxUp0xSS7q{)F&{X4T{aW4Ta z9Yws6zL=2?P8IVHv1&s0RP2%@mA4POHnOm{XY{uiz2+U`^uIr*VMBWOH9VU>eeCf+ zN_v^55+^{QhVQ8N za`=buZWsf@xc{Txn}*(Mbbobd{_L!Kndg7Unh)HE2dHqBScRDoqy71?W@-d98d!mO z86)$SFBj8`4kMs!PU0F({MfJ6E>>acpm2n@U2xkTUer~*lJyZed#1Cqv#l2^$H&Lx zm#jDZgkB+5PMz*JXb5Jss?@A|ZE72e2#}bQaTra;3}>9g{AFLtqzobNsrXGuwy7`s zbuN3aU-;W2w%}+Zp)Ch6YOOmTMX@@cF1^Xz3LDZM6QBQCL($4NX&SZ?aUV+bQ+B<5 zJK0BMt6+-9$!Dv7o)ifyUaHs7QTcZMT_L_Nvur@EiDM83u=34pSHePYFy zo(%SbKN5xsNF)`_cC~v4-e9)on)sk{q|w8f-ZBHX+Y?1OYKDDvNgl0!NsFzA}M8=;V zzy5N*OLT+%?3WhUX!hxE|o^Qj8&M{K`kiWAA>^#m(ojZ3<>GeN7o8s8|-*xLwT6i$PC)7JM3Gr1i1q zBx2#eZ1xSiILEcvt2WvJV8kNe{hYujm5bXf^)S~X%ke4Jmn}H=L;y}uy0o!nARH?B7k9 zpOyyN+uQ47Lr$M=Nvz#Mb3pbFu7Md;gqsCZ5b%ZWr-6M_*fZ((@`$5qvcpxfmt20C zwEm@`_QL?MdmVI}?sCC^sji$#vxV5iyKh#e@^HBh?GEny`y7wvJ7{aObLU@6x1=pg z7oHlg;x$m1jZnOp+iy z`FEk&EsNjNmn@ckLS4Y5sK_w81;OPlgStb0I8hla5JcPaU zPfTU3B`7u57->(eb#_k9Q$fw1nGWUP<^2b2uKLWmvp%U%SHNDqZV1?QUMyF%RRqNW z7?@@IJOYig@t>;t-4$vvosodoK?6ny+>+bgOC_uQvS9L`VxM?1cWY^B9pdZ}v7?q2 zikS)!ENucL~1u$XsRQUC(Cg(QETS3c|y{QcpL6*(G`}dt4J*p zi11hqIKv1)F2FHMK)N1vZ2cg+{&%tCcc^jq+^RV{?iy>g)NfQ?^UFik)ewD}ACt2P zvVu(EC8-(XHWc{HK_FKvECdx-MG>tI)NfoI;MwYJ^7f%`k}5ShRY zm(ATpnU)!KuDIj4>FUVFnCa$4P)GJw@z!0gZqdPy0cTTd;&?H_N1!$xgU{7LeaTs2 z)7Wv9+PrORtc?X4fEF{YdEf+4-SH!>`7Q@3(+YcHDG)WMB+EU^kcrZgd*PPPspqGk@ zTsIHw%Wjguiu0RI9ADR`3so;p$)W}uFBA7;XBFrV7O+}`7H>bF8M!b5_`NpsaU%Ol z*0J%hFS|OGkRc7JG{3Qul7_Lt3@9`3IPKb0`{m6s)bOqim&C1kxQsPOSQ>3T)0#GZ z)rF@oNVn16cit+4SJ0!9i(zztd%K#XCY|m^x3wwIpQpu%pp*1$L_@!D#TDZFJ+u}C zFm|o>`8$5T(r?uj)OT*+#9R5Mn{_JYV!|I4y8otQHgU5s-G-+JAqJH&`x$v`YAxe@ z8vdGY{2i*?s0^we{lyzK+HBdB#t6vBQso6$%Mgx32)SkPUb@Z7!fu&J{m&0>!2ps% zP@Usfp%%uv>MRZTpj1Z=QY5|({?K&@T4l|u4igQo2$e^YYoB-P0{^v!Aln5rn zV%E7e&Aapr%6kJt1`96^4>T$!t-P;~zYbs^3>VwPFtR0#l3lfNT~(L<~)j%X>YZQ?*7}_;TQY#g4+=d;Z|2b z&FH&dn|-8bfqnCZxFw`L!@7C`wq)Bdaf|PiVq2a*{(kL9Utp>9Mvl>VB)0j28{$SJrv2mp+T3$+U%@rbH2v+q9nmw8Prrj6TwZOFhbajzaMo9 zO1Gexem{gO?fQU%$$sp(eZ}$3s3x5qutFH3-39952b>-Tl17qP_ngVW&^>4>s)_K2 zK;bcI z^@PaZB{AvpZl z9J9{D=8Udm?qWe%Z4|J1D*YLP@Vms#I(>Iap)@U+q;KBs;J&@e&b$ov#el--P(q~T zoG#Si)XTg*Xix@VC+l4Yfb&^EQ^f)G%A-rJZ-t}-1z(xx(zE$W%=Uq~Y-&_ZqgnMU zQuoIDcTZ>s$fJ(Tjt(U}`1ZG+){m*c!VHk9@cY`2xndt#POfEZF!!F51i^syqq6yw zN>#i=m1r+pC^qyBPSvc?%zPy1xy@ToT z+!kI!23KSBpG6=CsFUI7gXI$p-{>hP0BEXoT)u`pz0ZIW-gy|qhm1T+1;1{@H^hvr zDUfyMpJYO&m!2EV!(i|4OT6V|xPyVQU_I6VGMy?{-_sNyGy=5ao4q-o1CxX{(1U5m-}J}gwb0yY&ljznx>+b}B>Xek@4Gw;v;77X zL&U^l_qvI@%YoQlQ`yFS^#_f1pnqQ% zU09k?7m#>@hm4}gykc+l2lNkxf>b@EJ#YXZ9sNrKf;=aJ*Fo1T*LrNAD*y}^SLRol z#2`q)$D?k*)F+KF|0SRu?e*kX)`I_E`T3;3i5xrsqAv}U8hyb${q+1D*FG-;r8_rat$eyQ*j1e|y)|Gk|8(3P(L=nSWeHT}@ zc=tJj_*Fb7oM-2+#3w?ja(lPey}S50QE|FWA1<;zc_;J+R{ALy6IPC>fN;R|g?F3v zy^HQAvr`5qokXv^Wl_V@%{<4?cWp<25_YrL8_24iL7&0xZ>p6Y-L@NE=cJ2=Ype6{hZn z$l+;#18&Q7fkt@cunnmQx&juF!}08o%++F3M+604@*ooKU$Qq6(}TS&Fk)Q<*=P*6 zLyrO=%EfzbtB}iakB05@FVy7eL)Kqi*HKVf%CDNTz*rOxXBI<%ykXs?mr&60@x})> zFOr#(RySU>mZS_bS7gcwVG5^QtUyA=ieU}Y9grw%Kk8a$dSzYP>-s+PP)x}rRANEe zlB;Sn>o&j+;MAMQl|gEoKfT|G(lpmHI98}>HS-4W$nCzd(;Wx&DD6tj2T*&EZSqu#WA)4*|6BaWUeANzhotkN}F3FZwu(NE-CbPdwf~ z8M~1;=>xM+K{oGzUU1XK?Ii{>8re4gTSz)Qwdx&iK;Uc0))r{TF)LT_L)_)#_}*>< zsmFnCxb2Clp*J;t(F*E@;I&0m7R*GKqMQw6P9t#ztHerVxa^=apeg_vNos1q)?z9S z+ZYIXzrWY|IfL0jN%SiG$Kx*XJ8`FhG{PS2)Ygy!u!a1uun>!`V?VSr{mD^I3~ED_ z1minK2NWYYa@!GTKfy%}I6rU1#5|N&{%S)sKl-A)m;Qb9+)K_c^URd#-|gC_Aq*`? zazH~z_J>g*ZgRT6(QNy0p){;El4O7~B<+cGEueBRjr(OXSFpsD{(g{LH()cbzvkX+ z=D$?CUW8aUYaYtU=a&=j#hEVtSNY9@{#T^&9t|kmEjb18K^*~Hi8yJ;App7k?h4M( zB@;gZIu5IF-9jnmq0*Lbobx3|M$&qXF~x&G^1Y~CSdy4C4yjT-3IiF+`j?N;-$r6m zpovU14K{3fZkw!vU~Ub-3c`|E6Zvf6h-&);^~2!3C(@@U&vSW~sQYp?u_1(xBS>b# zK~Ipz?@(YCYWf1*oa%;Oo3y$Vf9yUoSaJp|bPm@5Ra<=2)#ww_xRo@Z`VP5wga6ch z#F2v8sW;l1R#>z=FOX|>vAs^%%Raap?LGSY^@3^Upt+_yQ~=*|#1S}HM9r4~!iPmE zi`bIp_5QQ`VT~ql--Z!8Q)yMtpFlO?WK5lIp7fW4aVQT{j8Qxxs$iAH$vU{}!#4o3 z1kgL6>D9!i0E92%XEC`|bNxQ-B#J=2Kl|F{1>mQ4=`oOjc0qk**h^6UUQNB7TQ-2+ zThVZ;9VS-{H%IU{9;vzN^Rvm?E>;P97QcB28}m@{!=4Gw?gNv5Q+A$YJCLuRdjfg! zKt z`)Uo+>hxS`%(90AWyN^Ual~3z`xd1M&d}dB+Pkg*`c_df*EBd>W)yw}d8vU|2)J#5 zOO7mWQH@F%h>TgUloOdoJ$aqCiM$5sVqV)?OY0~7VP^)gC(wwU2hhPyT8|w9)&Cs# z1?!L@LpZEM0mNfli=d>yt9w14{~kKsDL)*|om^BxO&3|>{#z0}vF&~7zX)RVBxU(bpj~7>1t{k+C*r62;7`)nJ zeBh?eruF-m=HoqOIO{>9j{2|3?_SX~oT&^7I%W5=wTNq+?)r&hH&M>Q#ETM{GGoFW zv+j=+!_aazB}W$cX-t{Xw(Pw=+h+i)29C0SVd{=Pf4S-Mw_rfXg5Md;=r{mRkd6O? zOz-)CYYla7Z%?sbI>{)1oD{z)LQRIC9yPu(b$gVpUN@1FF%Lj-`}sJ2hdmlTbSSh4 zzoCcvve`w4(tZ%&u`rWez^>(nirj^AZk%B9%PmmxL;T4=%!^Z}h2^yko}ZHd+VdbC z3ZM=g?q5*U0BvipJd!7b6a6c8zIBR3byZQjyhP@iZVJ#{+TK%iL^zsL8 zHZcKljm^*tYw<#c^;=CASj{@f+l9J*>)Ff;^zw9?yyQp+jbJsaD7#9=pxPqpG|<_u zA?E?lP5odT_W;8$)Wr2QRW)ZK1*$%f=dZ~Nd4v7Cx0UJ_-m>{|I&iPR9?FDVEg)c2 zDma~c#u49l4KWP>iuF6XEpV0sQ zB*CkBL)+CCcMJbFMgVL}-q&w!%*MF0K=z`>$4a&QJ*;3l7<^*}*%nHyjh%17OI4UFA$0I)91BeJHb%wMp zD7)pA$gwl)38d3n8QY?u#RAwF+7`QkK6;FuiHSOVd`)MM)TsmwIpXd($u4}!O69`h62Usl?a^- zpftG`dFnZ4cDaVE^A-NdUVvqSqtNoAVaDt}fg4cU+$&2^$=!;)<|X=dpW6--d^e6b zEd?p2oqEuA;eEfu5StFq5UiTKJ6C2U~|D3`)i`>_WI z`YvduZ04E7!jY%CGqZpG#($U_a+5c}_gi?;8i`1jqvk zjzayoK?Kh$85at|0^5P)1pwG+=haacOaxlZU+%kfu|n3y?X;c=vzQ}W7V%b7NOPa}FI4Ag2~@@Qg%=*!2gbv`UZH@J4yHN! z7g1yC?pIl^{4l^yt7YQ!k^?e@7}yfE@41KmlmIPLlBIuYIaFV+Cd7J zG@N!FGAr0tc))-@;LZoIr!}&4NHSOfIt6$#Bbo@%b8`f*v8Gqs3o2TTkh2lo*a4rZ zGyGzYePq=9Sc~8WAbMaeRfSNT*R#RIydJ-Amn0|&q7qk{2uE|6s#!WC!@J%rLXaNb zGz8%?D94Iu$&Q1gah*>T1$Q^PeicF(|5LM zGDqf*wl{1+obJ7?zX&iS}xm>s$fs z4Qol3f`rL?2m>KVt&f6G$p>yS)z-zkM26)1v@1Iu|&P2L|?e;B@(vv_MDz0${p6?{)I_IuVo%tQ8yjrU$K(n1zFK(cB+a zr~$X!L9^$yn`KaHUV^#frD{Go`NreO9F~jCwEODdmsu z7;x1NHr18ilhl6yc599%dyNi8kRyfzFMYpUbHx6tVi`+D-1lm=en^wcOVh8fMEJbV z?yBz_i6$gCdAMFWWX7zW7M9)qdL!s!*60#pxAmY`dtdJ-+&8pxBd4|i)8VT(yEsKw zweU|?Wl~DaE;jbEl~uCiN82mb%r5t>ubtcf>1}IAix4Ohg1G^Anp_9}5lfYmb!z7F zQG=iPBlut3dG?k$scg5N1V97SW3{M3Sw}mb)ANWsZI}8OFFF`jzBR&{B6P#Kp3i0# zsIph%08qMU$6SRl?`cb52jYBDn5)%bpX&o>K-%Xg(Lh~|%XuC#`Y}G6E9_$o|FF9+ zW&8xErt`DXU;hn-oO`#7;562jVA}hs$w-@EM>nj%?Q%ty5tLx)Dj z2YB`I`(^0qWGI~;lw{{_)%H?*G-jEX@Qu^(wB3>m6&NlR4U}#z3GXQ&GZ1--P&L*N zPQZ}*X8q=EM4yH;ZxMNJkrqo0oT@j66ANU7>WrqAfmjp%f#G8u8IFVDpviV7o%z`1 z?H^z^)Q1g)dv`*Q*xzBI<+G>r$DBk1@tD_ED1>ax3a(I^kEyRBdwP(XT{^Rlem92m z*xgQ@gtJ}f>GCm!@sB`g0YaB*yhY+M{Qh|Nk&=~MMt*``8f5o_NVhJe>4yN5XM543 zT~%Bg8(eN~n@#O4Q%pZ}qHW>muKOv8ol1>cx08`w_@qu{tlZ-U;&tb5`}|b5eLl<% zS~;nZSVvZ+eJc35)$deG$|4aChCDNRVU$?$FY7^pnL}@~`w37d`kAtB-MmnilZxya zE+w!vQRzAXX@<%HhlEp4MkZF)unJN0b!JN%wgiV~B}|QWY;vBVl*TQmK758-S8D2m zahAA2(&RXbqS=z;24$?g`n4e^sX-Kf8Ma(`ZX*7#xIi~Qu+E@Sc@p|Z2ldzfvvq>o znc>rQ;Yap!?Wbm28KE6PbHGSpX56$|H-NWDG~1a-TbKf`oVo-Cj-qrWsd$(Gb7RM@ zccvty9@diSnl)cC`hxy?`M0ju7Q2OHBbc=&Xu!*?GRVsh6fFuW2wAR5o*m3+r{yY2 z@u$D!IEUSF-QeIWwih?guBek^Je?o}KigRhr|Zl*JRm3xem>u77m~)o$M2MO0DuTC z9Rv$Z%e=Po^aRZhmcTF z*}>{QLZEH;Dy*<_1-&^KEug=X{aZ56Spkr+eR~LEu=s2F^22%}Rd=rIo@p1SBiQEN zuu@er-Fy=q^FYhH+qMRLHC1Emui;s-Y1fwdPh5LN^mz=ZQzb6jJC8F89(44nkulIj ze(K{}tf?71mNXg31m$?G=i`4!fU`6eM_m+-Mn%UfC|!zNVZUGWD~(_JZ&-K^6q$+@c?-aLu`e?3#Xtp)q!f$KV z=J0v5+>NU;vybbQd4*vTj1Z-q!dq<7vY;diPc+_h(Tp-sCL_F2e!<-L_@R<#yeF36 z9npwk#9f9 zZ}rc&y%)-t=f>-C2VsZ(JCMdc=FMJffht?J$C4g3Q;E18CN7#OI%Cc}Hn^+5;SWS} zkxasaI1C&* z-Vt`BGi!gkJ|}7X6{4jC(@E8t-_jtPe&xXB1LZ64QJ9WXi-L*oXjmuQu<53e;+)JZ z^_^y3@5jSb2)@7mH>IQP{4vzJ8xeE36Jen%wHw)oy<88TQ!_bnw2EUHpIbR^7nts-&nrvUV|(L!XXth?#+2$ zaGD8Hp=Tkxq$_aFgDT5B?-+`7ZW@DUE3{@_tqM?J^N4A~CJ}v~4?cK1`{>no z*IW0q-=QZbJ0(`o>kr25G*C29MrFiNPahS#yFKMn+Kj@nJ5ax5nrTs;akFYh9i>S3 zLnKeN`XR}Z`miRpo@E@V4@&RlOlyR)Z{iQtB*(4E>2OWkjS8zh?0AN0-8ncs*^p0n z-gyAPuLy>as|tz>y0D-*<J-~hg;9EyDw?0Y~D}qCsXVj-c2I+Ljvl0|IB$OR}{CHz*wH(wDxfr&rJGnCz zL-y+vT@R8Tsc|q(LisnZd~lzP4gI%o+FrgxHZ)_DhmZqBhE$!xN!3ovR`Bk1{`LA3 zI`@s1GtsqL2eCT3wMmUqnvEf&h|1;`^j@z3W;cwIHS-Sjp(O*gkVDPu4Q~!n(siAQ zfwCvpH&Uys-b{(-6zedYp*#c)bFS1pY<;JcuAc7ti~rW%MT9s~`CIMkdsbXV0weEE zCRy}|H$6d5G!uu`Ue%fPSI6bEmP2sIesJdLlAfj8r+l68xQ4AhR;L)TBdTvm!WTYA zdqDk%!7Ib5?`uhzE;$b*6?nR7_|Co6z{EUA!7rD_#$%x`PA3QGc`Kdp_3|)gg7HvG z4j$Ds$uHvqoxz@L_w_Srv z@JDo;V~X|SM`U7|&-ppxb+u&SK9BBxo5zoOu3U8a&dq3$wSodOD=Yrp&rAGIlk8{? zDO^0Eh-*c$T-TG;b&*Gc*D{7lvX_H8N9!|~aH-f``JC!p%S;$YFaSkf8bqST=ia8I^8&bm>ab6Be?id4ntbWP?GhKHwSB#V~;@xkJi z+k1`lUu51pw5hAFWjR*yh0omaJ;SW?h?FeQnX>i%l|A=bf9qx&Lv9(V|Lp0KY2sx_ z$+CNUujX6ddjm>7=Nla6FbV}Gsac1N{DX7Tq#}RLH4Gt(CvYWQ5)Zq6#hs1RJ2znN z=ip${-I4YpBaDtGrpnt!miiYJWKKD&9ctm8$Ljf@7knQf@()3%GlP_bHH4Q#Gq-i# zm%KKfdP6~q9id5O5vs#lLRP*l2z%2p!asDmV$`>b%yG}mI$jw5+C0fzr?uxQxtK&# z5#Cx|5#2d^U7=j)!K#s}sO}go*bv249>Aiv_PC@ne$x+*%MGi01X}dSpKNq}1UGiM zz=5*#i?2ZZ*%@<)L4&0$#{)LD1O=H?MR6HA}Wus=#GcI+7i}gAy{zk zfsYhq=>1k-)YA%T)w^c2w_9Ka24#$mLfP`2TTl2UuZ^QB3QlT^YgxI_NgQ3FNTTlI#1En_BM4&p6e6%_^3pmzyi!vSbu(l!gnxolI2U^a_c&t=Nl28Hf*eQ}D$~oa=qb zFXT#UzY2jCgKLrf?=s5bI(CFHWxA5SNnZp)j^m5iFFl^x_@vvWD~#^7y=RXx8sL14 z<1=p5jc=%X*wWgKgGCLBXUUjvciZFmHmoVC49o!ZS6EjLierSvc(&J}j zXKWGg-6JDbA&<7xu>i}B6odVec(T0zxG5_Sd$H%(tu!)?%AU?2FF6f zD4De=<93TB$6VFMzty=HISCw}l>lw=qlg>LCs0t6HKTEr8nh3_iq}TI1$+rta&EEU zKQ0mJ^T+eo&mNmGTi86>Fz#^1YIoNE__HVC>PCWT<_WEMO&cH$42Y>o0xTDdscC6w ztPL!AA2+s7Utd2NG?2x&qqAOJ->R=^y0?3@^4aT~+mithYMpnr`>+gw`fpaAs>nz= z6a+At5cE;a3{Dm)XaFQuss)6s&A5M_(_(vY zXlKxzkXJLN#>BG-DbS?$s_w>Mg8=Sjel0Yx%S8Pb@Mb1808!#|0rHh zqz*nCD`k|Y1y}93V-K%*MaP?u>^Jml#CY41J{9?PU8`NUHk)Y%@1G+v(wH--J=Y3B zmsP5mm_2<75&oudGtC&_ldChqoaLo7{CQ8#af4p}q7;{m$)~1!MH{*ed+BugCDTNU z2rpamx9}#w#Vl@ARyKL18CImi*z^4G}?MUXCG! zYnONur^o-96p6OwOlCsrgA)@&L&cvqjvkeT`nBdCLfHE9Y+&6N!X@oI4&IhM*(Zv6 zX}JWay}zwclT2ez9o<{qhY`meH+I;^s9JW%42^P(KLrlNZWXpMddC{;`$U?9)$4{< zHT|OjCPV2OM1pVzV%m9{qM7b5E^PU#b8ftG5_s#PXNHsYwY9VU>5t}9XtkrGO-)S& zPB+zNis(UG$nz*cxPpgTZsvys!_<*bZ5X2KhTWurPo-|PV!?Jfsl~IugUj4E4XJAAICrS$o3wJdYI3FGBT0GR>`@;bX zAID;BxFk*wstKeU1v+Vu$Hv3t+nDB)b}3y=hJVZS{mAEV#zv^=(Lq^zu4M&wU!Dp} zw3BC&r(1Tq@Pi^zQ&S`T_UymAYn+;yY4E|8xog+1HDE zS#)=G^~$?@nhG9IjNdg>pR29i@pTG0Vq>sda%@hxml-Ln5TxY56AW*TUQ~UH5a`%F z4fBBOLi4js66mm>E-nny>&zjuK9^8Nn+vm={7y!4%)p^=NRa?|kkm4I$;rt_Cq@P1 zA1BwTBW1Lx;-HXPju#oXocx6lq=fJb;OmePfEn$8jcqmcRi-WT)OpDX>*GEbI$7Fo zd4-^8MhS2klr~O`Bu;xq)(eym?cDieOYxpf3nx3uqbYnqCE4Te{{H*#=V>PXo#T^x z+sjNyT-ZOAXiFJuAb!X#f@VUEk7^mHecg~iK8AX0CGO7t&9<`gA2ThON}QdiQsR;A z-n@Q1q)7oaQ_?3<=twL`F!26mT#*1e?kt!a%qHL7l}yMHn>KBF-t+2u^4HIA^l>ja zW0OgVi65r`0WBr_eSWjB*rWQ(hsVq5OP~f6t@$Vy1*bE3d_j~QCz=^_pO`C|`1-_V zgFrp_{x)>6Ts_#uibL=qoIK{!g5rjRE9ln6Lh6qePQx9X{!P!c!rGQAjwkDk{ONes zs{dh8^Q25(Uf%ORwz}W@+|R5$8I6(;=}`Zf@!V*s;&{>hz;?_2enb7yAGi|FBGK-m zls6AMO`hK#dvW`xE1BVbcLAbnEs&{rue@)y%CZ6e2OuCT&t_PKO>Y#c^=z95#NYFz zaZ%FGbenJ4RU5Czs#vn#w0{GpN#QS*o3Egf{~5*%hfc@*{#FIOQ*XNuWPxkq*;%sF z>Fnb#v?2zoo>OS^PA{AI_V@F_dfR@JlWto3t7ne9v-#&w-JKh*OX^d#*dp)e*t@fs z(b^e)U&&srEr59@12^XN&Ms# zBY+I!9B!Vn?72EN7$U9w-9F=P>3Emvoelq>DSv8<|8eSwRyH7UedK!?fW~Q+;1{m|68ScfRdvt;zJI#%7Tu-)pa0}9)C|mMc|ce88~^^5Gd8;T>(=ez&#XG$ zUz|ki$p8J{FYB&+qMsgboB$e0d-5AFSO-4ee4wYQsyaCFrJlLM-i50l@s##^$S0sPc?yE*$oMQ^}! z5(3*sg2SHBZRfQ`S5`<{U!HdRa9Gh`wG`KR7vNxl8$MU;N51=GbObsWuX!{%-k;!S z=J&NPtkP=g5`4a0*)gMc&5|fIjyAFw;8WGcx&j}5sri83NcYX81qWKxUL>A8`4ia- zI$1yS;A4;9ubcS4{t#Wh`{kVS)i+6?>W5lJ{klG2Z9iOkH&!s8U9n|f^yu5$&)tMNGKfGbYHL9M|kt_j(T5)1B;=Q8h>P$|b#ht4k10$L)b)0*bSifxWP#yMsnvY< zZPkR@hA(RCb52#%PRv^`ebmstZ634KR_7a^_D_8iS}ChN<$bQ1kzKE39JC8j@pM-{>0f-`gfA8 z&1B2n+tK5npN|i}+qeGeD~qo5~m7ijm1AH(y6J7T3*$5^}7;t`29}OlxuvPyxwNvynAhl zMV`cl>h^B!T{BwL@^@A8zoynltWxqjKfcjh+Ql#OoOqBlbp5K1%L|()yO4(*|1q@E zbH|@}XwFRTd$U_&(^vIT`dhiqgTVHlz`eq@o#)YmRk}ORVPa%oFz@sDpA!$NB#Ojc zL!VpU6(9HBV3%8Uruh8h`A9Iag5wbFniSb|^`h2})lxO_iztdFXH#ghL@}s{yz~>J zotO5#u8wN{bu{t_#z0%}i7F3KqTBZL=!uaLK+Y@8zU3Q6J}3XT-O)y$AsJC=@Rf0% z{&^tU|DH1@!!7Q8$!qi++Q+cHksq(^=4Dn)`auacqD94uIr*9F*SCBEMRL=EyLu5a zPL$0$&Qt7MwLh4D>#b`qc%{fV80;=hH@F>_e;~xl$L5HX5gr%mB2eH&hB#9+`+nc{ zJacsSDpYq(x6y5QY2X!D;@DeufptXFwZLLTt9tLnR z(X~?18qp;Z>*Qp$#H8RZI`Nh^v}y5Z#o)}dAP(M?%epi-guc}5`z5M|KSCftIw3Nd zBWJEp&Z)O~&vz;R~?`!d>b(heqB&LQ{nBk$}y${~F;u6gHmD8mO(ujev-`&kx zKlz<(RgQmr_;9(&sOxk#1j?ca5KimPOM_$@FkmjvSjB6umj` z3%V48rQlF>^xnOT)wQ)f8YA-*wD4U$Tv>CI|0<0sOU^1N^Fby9uWLT|1mXU@sQ#uT;|mzM0xDZ zO^*u8(hp~yI>&v;HxK4*fSmZ~>~vKuRW=>0xTqmm_^?tPZ3*dr^pah>`YC+oZ|Gfm zf+J7n{JZ4@=Mgog2oU}_w*7D1WnW*t$*1F`t5&T#s~K3bKwU@Y-QSb8qfaL#iZXX? z*=9yY?^l}7f~!*@TtP|{i2&Yu)>d@0?!7jVqUMp1J=u;X*4*J~-%hStT=eXr@SXn| zcLysZNZ`7}&v9enOMCk2vo1>XJ23ah)JEgu;@IOpEt8QXE;;(fO6ki!#HxCH|g!bdI>T zc|qd)1*ByRV?jE8J1Z@1EtonaKm8QNT1V$+HMKoD`RiZ z-X(~G%Go^e?mM!~aOe%05p~jyMEsP#L?{!)>|VaVahvuom_U({3j7Zrb{%NheX&J$ z;4cj5#zGVT^;d~(I_@9g|DR`arQG2d_^R!vzlwGIU1M)TClK3!dc_^_`s!rWe;h8F=S zGUIT^Caa#{S?}v!l!h3#29TL&30(^56yq>Ru#)lXa7pfZiqPG#NpW(xE~?752%9WN zON1w8$X9PzK}Q(bQKv%a>=@9Xo$ka#eOE>0#V_{9kCf%HRnwh3z^8v7iCygY=uxJoy-&b&mcCPXsP0A-_F@%20;h&nfA41b%;Tu^4F{a znGj_3@Uv61t5}mb&u~^amw`j#M)b{+!0WoYq$2c9NBUC#ZGj|Zx_F%a?Zz=zAD0Ei zj@z|DsiU$bo5;m2;i-iSmlYnRp`pld0djIEV{ps4bgC6SOdF~#E}1Oo&CNg*zGGUJ zR$v@5!{4=KbQyQ0}nx4Ata!o)>12ui-65MAphU~Z~WKmwusn#;hAe*Jk zo$u_ybS{omwQ<^sT$p}3Jz&3Ccfo8aR=`t()-%@)=M^{SQUyxlTS6J+6i|&1PCmbv zjbI-I3TNye4P3iT-}WB2@L6Sq=_`jeO-Ggv=?6LSErO{RQTY4z14H<2=&KcUxN;5C z+l|4sUU%#?bFZMeBAPt|HBO5oUSCcPt~n`m#{l*~RjD^pt#DLDiq@>$=EJdCSOVTB zHBtmN5J6mPE=RS?XO*wg?!L@%6dX?|W?38gTuYr<=ARIUI=3W<0OwF9o!$jM`Ok<# zqwRrwiw67~L0~dNgqFT@1Gff*KFj!9X+`M2F?7Qx%-{dYFcQo!D-SkqRz_wAc^I0x zjvF_4#U}Ku*b!x5YaK#vOo)(bB~y}x-UcE2Y7u#k$m#w!f_^)uzM#{|d@ATWBgobp zX`SVYIH?rtY&lpJr~MHxoGCe~heCql6%6Ij-9Mx4s!r`ise~-{8n97`*ka;Y8$Z%c zCaQ~9=pacaLJ|5Y)(@wekL~9-*we6)E?&0Ar~oB%s$d(BxaxDi)9HMnRcDydoS zEs>8>=xLv?0b!B@Ie6LfRG}zhwP)luzh}RXLGL$vMG5o<>MysX<>cH-Q~hgi?X$h! z!l~eS$8b#j-IRc$uGr49ToR;`H+7BhhEpZ0G%sDQNr+XJ;%Fb46?z5RoU)1$vmf;j+rT1Qm(AxsFHy(j}=m z;?n$Fekn522|gMneR+z^0Q_k4dFQP!^|U$@2gm_c-lH)Ym_fO>S!?4@CT{asIGtYl z*wK|J#cotWL@~V#82irY6@3@RWpJV#BcxAvyfxD_elv?qa%%=4rpbxP5Xx{U0jDi% z4a_C-B84S9Rq;clbQ({7{Jw`}*lUD-2$~Bd=iA8<)<(=Jcv1S-!}p6tKAb{zk!}E@ ze^@~VKajOCzIogJ(^Vea!5k{$f@E5UG1TJ;B>$g@IsmZ5aN!?iE(n1a}S>P+KPVbL3iL+>PIo^gmRjdOqFDJHrMWtU_&$S1o0DnAg9Nl$= z1U}Bn$}n1A>(Fn?cCeMqks|DiZNLb!Qkl*k^M?k;k~kHtNk~a2Ar5N|hnmPDqM~X8 zO3B~y4JZKAJ|;B?d-i*?O-ug4&OH~%>45#?;+9rae486udgtFn zjJm5sSPin}Q%lq$EuzELBtgzA4KyFQ(OMJ~;s976n5`vR$j$9n zv)%SAo3ksv_RN9KoqBHm)1}V(5^_}_R9}=`*tksv#XDxW@w6Zt*m0TxA?PE8`7qE7 z#Ru(;fqmmO>%ctdkNILT4{Wr>t2Xswv!~V+WJ7+4t(v^zbJF~(ID(r2T`(n^4C5vh z>#sG-mO4sQ#1eZ8Cf_qsw)K#q`RGu&E&JKLg;9E)-jltzQ68BLC`wNJ9LSkJ!Yx3H zr86EoFeScAHzBrpwF(Ev1z1&8wDP2ycg>h^{U>(KjLDWT!6#;z#F-4E3C@qBaF?7E zEL{u}!VeVQc2ROd)+ZfZSI9W6J2H7-L)heBOJ!7pL7Y*2aL#zPN_DUxgDFW=-#EFh z*52Rxo;?HUqbYNqiBBbtsv#$rK01p1qOw=euwV9ce&iAMR8%iYq|R?S%1+;H+bmnR ztX^PH(U+L9N2*j;zpQxG`d*^VF&vhN%74>IaA~?YlT@@s-#W<&Q%m#+1?-iC>Z=F2 zP=@)LV_f=?Xm-XX$;lCK?K=-%yRL^Byhf9^2plzgPT>Z10AfDuu zi=BfxCSW%CTH!sl2LN#yd~%C;m0@3bS+OLT&pE(b)ae*HXvc(P$V4eA8R2r87Jq~v zb)>*2WX=po2K703D)N#&T63-lQjWHGuP3@xyh=IOz@8yHJIlUnD!jX=Z>&~;dK_|D z3Rbb&Ppt^uU_D-by_{(IQ1yiJ2gn}O5 zoJ==AxMQ?*O*~P{Y5bA-g7MXf%6~mNNB&C-nYAf%4qXBSDGr=YU-pe%juM4)oJZ*l zzIC^@Y=766F8OXIJLRZg%11(3rgk@_L^ni8NqJQQ2-1Q*xpHh7D_ki&%^|4Gtl(?+ ztUDCERFOH2skv=p*~rgZi7>r`NlCWrxkbH7ISlCrL((p^=BZhBb2IP+hC@OJwT$8w@K9^!wSrFINuZrk z*Hh0!8vICQ8%-}W*5kINv_w!}Ae-xeytoIsF(TR$*1M?7HM<-5BSahB4Z25eH19mf z^!JbYdZ`Fh1dQTOC%=9Cofx+Kc7wRxCof>2D#tB1V~a?~9X>bF2lX;-yWjI5g*`Em z*eFRXd^WtTs~7bOH~KK0Va8Vb>kP%PNBBH!TDzXm+KT$GX<Wa-arNmUHUR%npNZ zF;VFhlndN85eL)$=$Gx3lkNb$fRir%Yz18_gy_Ql^jviNb%&)JR>n7gC4UN(E0<2q z=t6Jp!N&%6$GGvh-Pdhj30^$pnzjY^SrHFADb=Cx8qyEtR6gpyI+ff* z42GtKJq@x+16zgoYy%k1yR)fmDzF2q7onQfbG(q{;wx7jQCZprzpLA1ChM8CBg6OT z#CL%D-S%9D@u&<@wkflg2j{EI63cDF3=~BOdUS!KC1ls>``>$#IMW8NWZbs(h)3n2 zo=un6#F0tMBNKfK;Akxh%7ohhVG1ePhlU;ejOVPzw_#K%Y+76u$=N_~`c9lP17aik z*lvQ}3OtRE>B%q11g(BP*HpSC>-S7mZly z_uK_i#dLkx^SGpkRS546wZb#o=8~}|neuF^xgi2X=&tbR+SZ=y*1ktdo5nJL>=NIb z7r}nqW~AHe)0cqa#{4AY;JOJmC0$`j@v-H8u7sh1rI#ANMYuvWWU9WAtPj%NViO#E zWzQ&@o$)^}`?lD@J^0y4p~rS*6Zl7nr6~rP@)RwJzJ!ka8t>n+h;#)^2`(Gk0iHqA zjDUMrhDTD)q}pF4VO@LN z&*e~^c}{@(-;aTh+QLsg;t|%IiE2O{anYQd`gzPBnD&?iwfwSzxI;)_+58u>;0iF< zfah;Y3Z%E8ASF$c4cps8>5*u@(J|viAbOqgIkX7rKY9AtlHD@nG2YkCxBni`QEelMEBRa+nAVvI*TI|h4_qae0fVecOLZ0}Vc zfv@u~91@+?|2v;)R%FU7S{~+ZA{(T$hy0#}n}Mac_~x(jT0pcV6Mbu(LokD(#tmDq z1>7oc@e+uZb5MdhDP!}}Tj2ZT0O=`Kgsjj3WF~06Oo{&6h4+-ijm>uCURol^rbHG1 z#+BtBdQ198N`FYQv}D06L&@r0+Eq|5Ul;0t&l?e9fW?5_jFlIspEErF?nf4-M3V@M zodZ7_7`uFw;shF0FY^g55VRLX!{@g`h3R;`dhqgKfMT8WhfrKfss=9SZXym-$zl`S zaA+IV|GxKr3D?A;b7#$lzK#}axL5NBTIdW@HRFA&K*i~#kARmf%nEs2b7Nw~W)ypr z%taDC$jpl#f@2kvfnqaMA_vzV{jJl#ruj~=6!p}jx)F0Ox2gLWux=H`q2!G%KV>6O zp=}(thhJ`tby`lfc4sjC0IjGif|N6v*A~+3ot89#kyH&r|JwI>93EU=%IUPRVantT2?g_UG zZ-t|mV#=bSN1kjY2=TXw`_(&)R4Y<@r?Z{)19T13qiYZ)I>)`uHkP`}h!k)U z?Wp8!RFoWp2rjbIa>JAcm#Q-4%H6bSr?7tf-64?%Y#w?%r0mB4%$n;96|WcnY-oCRooX7T~F(XVKY$ zwM)vMBxMNgAPXTeN(e~c7JmHhKd-|t(fSx^p^l`R-apLmYGl7tO^F{>a=r)iBY^0V z8_kZ9Cxyn&-DAD6aQ^@l@MRS;+Od3U0ypbo%ewXy%qn$~DqsS31M25XF#*!|!v<>d zbltiM!b5-0+2*rWL;oWHekuPHA-IIqhbH?1rLMpRyI8;S9j6p#QCH0CG(Vd8KGDn| zga281_nnf>zNi}&FUFHEHUNb|anre{fIs)|zdwzWB>4e{&+sqC;)+^T=F5(}Lblr; zS^U{@TF@L~#n$h*J_AsLG-aNmh8LZu8a@>}+~au1+T>ojRJ-VMuhp(3#0PAC$l7D{ z@?d97#e?$Job#(%QRJ#BqLQCM2Wt=J|3E$Xg~}vNbuwTC#sIQnL~eI|!{R&ksI=U7 zTC_ z9Yn!pcOk>q`;^x{V))D)r!Q27-7jGoqsOAy&pN7&oPt9NB+CHzoNc~79Bwym4@Dd} zE#J}6qh}k7)N@3MYKYKY6@i6nz1gevAfshu_r{BeTMbMJ%!|BVXj?5&*2+a0$E4fDQ)T+L?2Zm698JRU(IX1^vNL!L97bAX|kq1?t-O{d}q8h zCEeSrl+hV~G`pp%Ro(aJ@}29`tnCLG)Ues?EoNlwm2M65dpWrnFa2w$FBmPwg;9rI zqFE!pq;oUG-YLT{NuGD2?}A?(yzX8 z%@^OTq&l#p5@A096?i1jt!G^e`VNm&sndEaE=3)mo9@r&?2729Q4fm}x;nvr_1a3b zoxu|jBX22OtmX811~O)=q0T6yISHT?xO4%1n8A!dO?Q|t7|kZVdP=%8^GrUwI?6aK z%C~Dw6kOcwte+Tyl4m@wVBKu=-=%K7(V}ptcLNq@EaVUR!;2*A_!`!j6*reeVnPz0 zj@=z*z2_Irpm^?ZqljL6%9_coaqEe55ouxh%W2BXD&@&(sZ+H=*HwJkatJRgegy ziK_*XDu-~}Lw^clVMJW6A)&omBtL3Tq2c#Snj%F|ZiH9VkDXtZEgJl|&fBn7dHj-a zo9B`{p5ME3pe!#riU$x=?*x1Q^^b*ZVP;G#@te7K#W zTr%1gDYmwd$}pNd(HluA-N>4!`hVxa_fX2!&3l5Teo%%uLXZi6;!}dOGcJ-y*W&)x zzb5)Ay}Mt@!m74iaa34av^P+2@{!jhX$5KGIurcQ)QYtUbEk9Ua-Len>YrtaeScxU z5bl~91$ij6MD9D3sxGC3Tj@qw%;r}pcD(e_`6b+!b=we$DC8}>5tLm{t)~+=&H;d0 z^Y5cX^vP(E4mnx6Cn~xB-7l&9SV#S>NN#?8JR$>u^8Ni^O0#|y7`B!t2!A)jWaJQp z5*v{F!=o?OH<>nX0}+zVe3;ad0_ zZ~^s^vVjg4k5Jl~#4br#>6 zZbL;o;7|`%zxLx(J#ku%4s;1#C(I&9Z`(RQ!aN0zi%k7(3L8Nk0QZp4`F?j>SZ{`E zx+|-Zq;mC8d^kruPZW(-OX;rZs*xtm%8BG+V%%|GsE`8dyT|25i*w{$V!EEGbZ5tC zyO9`rMdhy!!@l(|9+Hd}H#z$zDFbd48(lBj&J?w>&k1p&C2*cr(3L~@DhH!rCNU3} zZhXIgekc*7wiEB9Sn1Pcpb=lTfm?QVU23IPcB0k3evBbwVgY*&45XbQ zf*#3HIZ~olxR+Sf(d5AKM=F-pEPV@4bFIqvl4C?G%xWhd-aGa3U40IY%2@ z{I9B$kw-Qa{z2F97!;&&JdC}CpR*A$bgo8_Op(1B$h$f1n#ORhImbdP$A8cRZ33UE zSgReK=`!W}NKPBLdFjJ#&sDJ$K2sy6sg&rD`h*jO_Z#-gP{V2ln9odab(UG_nCESH z6Zm!?@z5itUSqQ@C;fLM`v4+L90Cw)O04+In0Wk1XXEo7H6mJ&3SS)uaLEuK70>D# ze%CF$>(K{PYiG-za%B>m*+LDz^1wBxlyoOoiPYi!+0laJ`4)Ve;`P58tIWqcB;n#H zAxDCeY$SPF{ajKQfO*6h^xw^p=lg4YTYR{b@hx4rW4m$lIuv_Tx~LrS$Q>$PN7fsU z%LgnX{+$NSAJ8K5oTG8A_pd+b6vzqm&fR;$Rwr&B^-%oMa>Q4l#Z>KDv0eGjRu=3> znQ}rvnA1e@LCD$7TSi(Dl=>vR)rtVnseC#bcQ5qSYlFXci1#**S-n(&LSGYM^R%`w z&;|H^b>**M`$f$FCb7&GN=QQa;L-rsV5G>l>;LIvE{(}5waXcV|sNo z(|Z-`*7dmXJ@7%&>B@X{BD>?wvCY34@)7JnE9iq!K$Z(vs0AQZuN<045>d%6{d4>S z9P8V6?5z41)*c%HldU~+=<@EQGcQ-4gwMLO?f=;5O;Iys6N7JXhl}~AV1$V*+`krN zj-v?h9r2-YzxBm$*1LEM!A%;Enqn(HC0wbQ z$QOLNX4YwcsK|7msm+x~1q%N@- zXjY2gFs_z}B8gF{yD(kBKwUzBT~He(6XXyVqsTFQ?I#(g%oT4P0Y>YfaqHJ^HeuGv zSD3t7k1>`buE5tO`UnXzE82A9p&d&tVMjSM_!0>ws#tMffD5E@gvM zh(=o-X5yk*3+m<;HMses?q0DxRu7Sb7k$5iN-$YeJ^_Y+AG7tJqD#tsml>Eg4B(%AT6U?HGCZ zwdfFGYkae)=ym7emd4C~V*@(hBu86z8q@`%re(H6po1*g5Q1lx z5W67elyH>vitDwV_$iVg)hG9%!lEQRr^~cybi$Xge8Sh>=gJ zB=zmVsA#~NsHD=(TZRgLgPB3{%WOOGiY-?}NY>G?SIFQC+(1>ZcE?mUzJDJgJhjcp3X+K( zRD_Z7F-m7Y%uVk30R$Lkz~1H#CTR%?D}ZOP6Ua23Oifuh>!D9n3|hKAqD7o~vaU`x z<14Uuks&}GAAv68k37@v7ShQX(5GgA0c6V2@`3b;5^A5UtDP0zZfJ#rWBXxzhE0=q zfpew;$W^t(>E33=9r4akvU!(#jO8AeInaBk0)ZU-edfApt_ z8XsQjPHjulze5)D^bT zik1u-uODQ2GKYX*!^B%7V-#KvG`5i2X!0+Utm1aPt z+^D#_eJaGlnEz3rIw+iLeXnUc(%k==BVF$X?cb7fi2H92QctQDlExgQUb+kK97=IC z4mNgrAtF(1;>bBRsvCP38_`J?p_@FjaMVM{drjhc(z@*8O%c8n-yIm^4)){qL7?P> zDKbi#8V|zfbiUsaQ%*tP(lElNx}6)GeMGX`C;A(9YW%SESuVw^SFCKDO-(K8E1I*-zd`bmw z0}&ubiHRNDBq<%BR{}B4NE;3(V{K=%A{M_8$@M@tZzfOE zlFJ~(6HRvUZ1RbC*+43$ebSD(trRQx+%SURd^#DM(hg_kSnQ0(^t9=tPueVYs%U^1 z#f?lYiWKT^!~T&#rE;R?Z$Txe;S9utxYG~?91_ZLE?>HEPPo;l{8Z7(@p2yw@vxto zW$}0B0>N2#M|fwBW!*?VgQiNGJC`KGmMIsHEcl{)$Tvv~wulF+GQb;SR%4NJbfiI0 zfv^M7K|frd-RWpu1a{F-k`j!6sDWZ79AqI!|gz=z)5ZKIzsRWr--{PWS%UIf(h)Oh-74vCMg$A9rDm5 zD~~UC#G6U9{W0FnE|*u9ji#4h=P^1R?*%WVM&83fQ|V(Qp;94_h~2_;aT!FP4=WWY5vc6saEH;kL<>ANDF7dn@-NfYR; znE`d&Ysg27RK11=ZH8;>$Dg&)HkZbh_or*g_Ajr>tTwT#wVQHC!1#5EJTPqDq==IC z)4gvcvb~2#I8nS|5k)J+j_!A@|)Otq4dbL&Ny`z zGIT&C>xGlqG(u9*^=#~pqH}{$IPq|R!>;{zc?g)flmS}&9fi|${>agP1opsuP1gv& zmEn1zRduwXwkRM_kT{j0nu-ot9*nAeS46ez1{n0^yKj5M7w41ug+u3#&P*rMb=${{ z7!sQJ#)`-JO0r8hebU*cG}h|joa_Le*KhaNdQmRvRgc26kV^veG}8^ zWdF_3$k_NC*@pIcz=QS+I}Uw3pFhcTj~@T}ymI_)<;UogNl6dbEm{XFWj{fAh&Vwi z|H+V{)$m7j?a5!IJEipOiQtk^9pDiUMkmxi^^Kb-%gytJ2XkE8k{e7&JIJelo8qki z@^FCm{_(86{TSG@v+v(~C({Pvo)!7v$!Sv-#G&-=aw?F{wsL}(wLG;Mg3>{!$KqOQ z$KX!G?f~EJ+lxRslWdyCEqebyYdGBugc*r{Eerkp>qz~Js4tU$B^ciS&>;~~th^?? z`XS^uC~jy$4U1NTi5UC>;3e7CVln7c$+ePsNUQPi^0+hPxK)ev+Snn&DomC)oMOx7 zZheKJFM38D+CAwCxSZapmnws1oO%_p0m*}4oA&A0tyUk8b3A&KtIP}Q?E-bN3#C8d z%ZU15qqci!v(jjuLO4-8ZZKr&)o&EdN^q+r#Cba7EHrT1_&oYGYROUg>igHhJA*r! z|4o!)<*kp}J+N%8+}f)iw59WCB=;XdvgbV6Hd}GUZ_=3WT}P#)a5eViDWI$dCR;gmf1$N z%n8~WGc5SFBe5tUIQROgG;n8I!SyEUPqp|=Xz)(EJtF3hew@5>=gy0X!Ml?;&YYRq zB>#{fTQQ8+tQ>{!NWxV#o{_uMd3x*VJSwYKfmrunuPsZIn!{B23DYdhOhQIM;XM z?eBU4wn8_q{E4npNl9IvGD}CZOpJ`Yd+Zi@imE!uLm8vuWs6D*5NR8q>ua^rH7}ac zG!o>3pq{wG)F#@h$Xqwg?-;}#J5GjMNO4m)Tn5Y)av6PTSh=heP4kk`|Lf3X8-QYW z4-IxUP81bQJ_Jz1*FCH~^tm9z%2{ilWSOlmbgWfplDm*9Ik5_)@P*ULimKCVU#N(v z+s1Z~)lI(-OlW33eQUiaWU4B03N=9)#QR6CO+4@1&9jEYTwuli*2zjwUuRG*xr@T= zvf@ce=;znH-z$qI(~lolcqy@qZKtJkBm`TAtOS6IKYMvt?Qw_BeKfvdp-joXD$aoj zgJ=AXw=ZZesC00}4+hM8T|1kCD@lfvXAMiaUGnK7#oYG`VidKe6$W|#%krqYDGNPHH zkO|pGDmnI4W@M?f6QWJFQAY;DaLT?`mWi>%*oHCBb^HFF=k=UF&g-0)x$pb4f3E9& zz2Dc>!>?NoI`*U5ajaajCW_*~)#T5WZP0oW4jLb+*}?Px=f(FY*Miaw#0t%RElw#= zA@BZ`TCycmNV=eUpb|?S=Zmd_&}Sk0`7mX&1lPL_hdb8k$>hdacY9 zN<;WGKe@~RTp;x1s#4i`auX<%p1=(EyGSHfhy4x*IUN2JYYv@Gtt|x?Q@S+ zgs?(kOBk-*e*$DCUR@uZ#4{j4D7e(I%WAmyV`={U|Hc@w3e)o&u0bL|XykzTFvV;1 z-w$7>*CBb^dP#`s*nQw5uc+Vn@%**WB^zfHc1mlgO#1`*+Q=NxlMs}ZyQXH$7Jnze z(I&Dg7g$v%S*l#Pzw*kb6`FnF!QFv_o1m&?!FsLH(=swLoALtdJa6|1U-jsQd-$Ox zNW-D<>Y#>Z`jy*7w%Ph6-({*nSZFdP#pnz;@vApd&RLLYBwmm)RcQgGfa`g9lq!XoRI3+NAG50qyh(xdYDRn-;Ql4D&MLM_mu! zLET(b=$8hCOg983oaz`H=Fen6C5ZFbhs~v`=nk3I51-UO;M>#W0X03-{F)uAb*hxy zu68T542^%5sfLn58v3_j9#us+OJ)z6?`6nWf z8vC~N{J%$4hB(x8lF8)<$?NLqBss!z1NmfJLV_kpB!B0YXNtt<#9~o9%)ssY-eqmS z{{MPX_;2$1^tCD*=ASI0byqVoY;r+BS+iIu9t>a9EE;;5?H^i;uQd36U4Fu>Y;h`Y zkn}`w&n?D-O&+|$To$rRi*coU+X&l+x!w=-EgW>c2+Tm?SUo=(V zRnx>x6ctc$_d&CK!(N=6w)d%9G#&+$YR%OA0je6Gs{^9Xv1{T^s2QAU3`=dpv7%%s z1P=vG(M7TPt#B?=JlFRm#rY51BJp6FiN2bpcLwx?&Z!c!hPDf+RmY%+apBNT~v{`Y8hO&wZAxA0AI(ns#6;O@zcg-L;Zx$tDgizako^d!K0 z0w$mqtwH&>A!^tF_4a33qwRA)6v|KiaxwhcO&lKa4i7Gilq!NktGBCE!yPw{$!!Y& znYxB|=UQ|43Ce>G#-E_H1IR#x-)u=YE4~V3?24gXv zeqRXGzJQ-lX?d$iDUw7Se)H9)W6EfPrnd-^oG3ImfgLET;EKMx7_j{J;Uize&kuc) z(&m7r^hME|6VA(tlW8{=H)M!GXMSY5CtTbopE-NIEqMBL=y;?m{BHfc{LeP+HL1n( zx%GpPkL=mkU+Ag7E13FVOjUlbPS33~9bhcabumN?r?ZkWRHm!0m4+$N4+cFTIYpD=? z{4Jj*IO~G=d_An+AMhm9N9*M@TIU!L^@vRs4v73jzfM z{FpIeIhe(%oxx+J8viJ4g$e>dU53gyPh6x<4_yeTt2881mwTexwX323Qe`>JZfYcr z954lS1!REU3BPxhTl3$Aq43{mz1J&OuC(;1Dk|2Bc}WQ30)$8L}A=~$ zTMbhx$a4k2k$hm40fE-9HL@rKLx1w`f{EDxda+Ufm~E9gEZ7T~#@wA@ATeo14H!1~@Rxt{QmO>jC#oz<4uy+IV=KOiK04doVIXT*f_Dq0Kt&Mgx z?iMl`Qb(uKe|AGA!_RwyN0mR_mpTnXU8usd1TOot0`V+hsUBWIk@N2^#D0*P0vPKJ zsE6O|l7G-Y69+-Pl3m!5QW{bI70RGSDE@@h$K^4x_w}9gXeA$eOY<3wN&r!)G_^(CAvw zIlMuEO2`N(#hSyX1#nb`Qg+|c0>c#SVnz{QRqG(0k-m4^$eW8)NHl6%zwY-KszA$| zfnvX<^=qhgqghY<0UrZ8CkxCsPA8bejB?!6p;tP{)vpmn;CDeZ3zN2Yhu_m~sBKuZ zF9}tjvF3rGiKoSRYw&V5^-73ETLA1}NhHE|*9>R-4neVCuCJ#?-GpF?_x1gSbze^bXe=YcThu^rPDMX-3 z;2Z)c^%_biTHRXlL2>xv8pf8o9#Sy?*5MIcYsMDJu~2G$Bp`&4$WKzn*l0l3U<`)P z@9$UIy`L&Ob!dQqJD6a@5^@Hr3}iU)kYL9jDgWO;h&?_e;m%o#<#mB?5uD` z>dh$eMc6yfY-hqFP(5n;SP1o;I1qAu%&A^&oZ>S~;P1iy5HM|(gEC1=Zv@Gb0>a7| zvxMTn>+igCo8FcYnEGVtrN17_O`}0uDhwly(_Lt8_}^0%1BF~1-AIlE9#({G5RlB{ zf8F}>kXx~x^QT<_ildL4N@l($TH(?q*9|ZCm!1bM(K>op6$jH9_|s(1_{`&>fDCIJfP9aaBNbid%8^xkm#lhzr%PeAS6BTi4;2w&ha~3V>fV!aR+I%{S+H zH1=D&gw`o^UPm*Ojex*qjxcyB- zf?wXZIiD2`WLtC)MvG8yr?{sC_u_8lcL|nqLXl_hoFAk=0FuOo=Q@;zW>{3`H93up%G>EIs*gj;VHlpJ;-H zVpe2+Kh-9!gNHIyssuS`R!2sbp&1M7Gl)ItC% z58;zC0zA*-v&K^1VmKfr~HpFc6k*)j%WY# zxv#CFKG=)JoLNA5!*{$OJCt_Jj6QZSYC1iz7zWZr78WluWu+&3R%Eo5B zoM0~)H|1%_*M(?5UV7sUA85-E>6Q@*4v2XuL5l!;vo4>s(=Cjbrwv)Sl6Ju_-~z44 z4fdzcT@ynX=Q)l(Ur)o?OC*A)AX;jzwM2-^YI)Kv9H znvp&)JCm{-{wx7x1C!#?s$6v04*_)PxPd&QL*vTy)?=xlMkfe?G!&Nsq9l8WJUqh| z|HO*uC0IdXP;f0uK1_5$TSTb7vTNqc)|K{`~p8Q(*wIb!_bo3DZ?cd?QB$02;ZBHAB_ z1HcM;7?Qp!WtqYa)adJ?1$%Lnd=@L1Kq?k|U0qivHIEqFU-i@BcO+@mK%n0)X0gKb zLkDVWN!lMyjlf4>F)?Z3oKAQSrYh#De@Xp~H{usb(41v(%lAyWsY2jTy%Y%IbuVa3 zz%r5hV>BG8Uwc*ipV0N+0v{ITLe^soV3viVSS<;UoP|YSf)Omh#`#|lgY&S{`=FrQ zzVbf-@=ej%)|s+u0x)`ZucJiw{U5Y!hwo)?YK4&5{v%oY3KE>agx16rbp%pPx4-B| z(m=Rh#X+N(QakRfxmKjx(gHH^77?HnukB!8bG<;H00qfF;sr3(>2>tGo6 z#$t8SMBfaMlC|V+hGA59B-wHeOz{JsBDV z;9$6y7zS@Hl*(eN{|B%B;e6ll z-X=!vJX8KJYySF^`*$zjc>U{S_z`iY%|^BBh8q*2LgYPNw{mUkM1MNyw; zKBrv346gkk|8tTUw9(srs}U#J(LEw?&sZbPFZ&D}57986voBmmJn%m69*!|EhGYx( zjoZ+7*d7WO{5=-Y73^vTxjjFqXU*))vt*xnT3~Lc`ze-j&0?|epBsGdnUXg;QS9zq(Od*59V28!q4M@>b6DI zR;Ip5H1$ z(R>>?(|-aP)cWA|llEqDy(hCq1{vp{EdN-MmaXX1+_Fi&JStt-l58IeRrejXMQYpT*az15CSu4vO)>+HBOdnQwpTF- z9iI*_%^LH-rzuP%-R(?#k<+N?KXtnNpzD`9Lpn{dv*P#My3(Y#*8Mkg`alKuExs($ z&|ZI!d=q4li89vm_rTL~y@=>6viE6B?6vbv-eN?%_qH4A%UsBCt0y7U-5(Nu7VZlA z$w}Vgn|wFKeS?%C8OJKgR^$}5tKDql?jOsyHDd($q3;dS#u~CE=oNz{h25l+-hwYo z{O|h0BAm}aWU--XK$d>JF=A|cP7P0>GynJDp@d^k+YtKTZU&@-eG=lnN#A{o=k)Xe zZ^62=_uVF?=~Ri)A)em38Jt7yaWD2EQ>6Y7aSYj`%$>64_fDW=$b&T$OknR_qnnhF z(|2?Gxwx{&E!5JdGNg;~nDG);mvUxRqk@CFRZ;aJQ(agFFp1fUA{;H(|GXkFJlHQ( zImI7gF_Gom)#T^chrHOwn`e(lo0|Vs=y?+}zP-XpCG=^0*?Lch8X1RbON{~~80o!e zt3T~1I4a`!=|0&>a+NgG+(Ou_l`x=C^aR`=M3jTyX{#eKGv zrV@$Xxn-k^Ja6mJz4ZmlCO4@v>FImM;0W-8?Z|v;O{?H%D~oVG?_N0Je34@HZOrOF z4To0ebA@_pN_m}=YF*!$PeNqf3rKL^DH z+M9jt1)j=hCB(S)n--Q6X-%}$P2S|&EVp6o)#88Oigw;du69Rom(Paesj?mJ>3&vX zsx!$d?hpLo3B1U%dre)2x>p$X zAn&n$0_9J{SoJqSBD6_P^n3%Al~H4%QNU7qt_+6N0nwIm3B)Jyg;Up%MP8#fah`!^ zvMua%lht*h7r$PV{rA{mX9Ch&6wUn$aPTnpsd!y;yMm+@0~n5}FwQxqZ-L_o1Ixh;{7v!Q|3w&)@rg-kQ22tdCjZLRZm<=YfAPITV5q|n_Kffhg)($% zhamG3li_syTS7)w4^K}hLs6Zi2PP$R`fkN`e3cS4*lrG9!?gfkTM%p9{L8P_2x+b&w55lmd4F6fi@j*V*3>jaj zq{=NUB0*|yh8swR)fO7Q=qQ+2mN$9|l!lTVoCT`LprP=Uf3OyoK;HF#uc+$6g9WtN zZIlB^6tvu?8;;bBN$TFq;`Cj=NL18KjA(C)55pR88^y=YZFtAx6}Q7g>Sgtidq#`~ zfC-4U0xLWiG)WmiSSEjP?uR{+)3u1F)0R&ntpS2Fb+G>18)pW7quDbZ%bL7qb?^+C zHugbhU-!o$=Pouk9!Y~jom7JXnN0oH_7tc1iQ6e@?vZWKc&8Brv95wZTJMivSk0jL zu&fq1nT-basuU#2Pu$K5*-|bSgo&kjL3vviP5JM6{sThko-*G%DQSsu#zZ-KD5Uk! z6UJp^iK(}vTYfwm;~56Yyx@Lle=Qz>3u?8Y>u6%0DRRkJJER(q7>{A5GZcA|Ar+m~ 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 z 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�Ph;nV4*FiA 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 z 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�#}(*((Qk;4jdyXcP~( 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

      I-o0WK+qF7 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 z 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

      )rS* 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 diff --git a/resources/icons/bed/sl1_4096_bottom.png b/resources/icons/bed/sl1_4096_bottom.png deleted file mode 100644 index 0998c0e3bff3124176345363f2382fb06099db80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107621 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 z 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 diff --git a/resources/icons/bed/sl1_8192_bottom.png b/resources/icons/bed/sl1_8192_bottom.png deleted file mode 100644 index 4e38fc9204af87da38ea39ae3f70aa3c877d6778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332103 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 GpZwo7AFJE| diff --git a/resources/icons/bed/sl1_8192_top.png b/resources/icons/bed/sl1_8192_top.png deleted file mode 100644 index c01d59c7b4569fa9c40e4c6fa96487cfa293d128..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689839 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

      _-oUc^^Pm%C!mw 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
      B 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

      Qwifs>AUbxKr+)KZhsdN4iso-Cfe9N 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
        P;EW1Ae@vTjtBXU8YOi=&q*8A>u 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 diff --git a/resources/icons/bed/sl1_bottom.png b/resources/icons/bed/sl1_bottom.png deleted file mode 100644 index 04272ac22c5dfa547c32520188568040ce1e98ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29541 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‡n?7yb8yml5v6g#_$ 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 From b7a1bd927aec366478238269a6f9f0fef542fce3 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 19 Mar 2019 14:36:32 +0100 Subject: [PATCH 188/236] Some improvements --- src/slic3r/GUI/GUI_App.cpp | 7 +++++++ src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/GUI_ObjectList.cpp | 3 +-- src/slic3r/GUI/Plater.cpp | 11 ++++++++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 1cf2ca17c..94b070e47 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -743,6 +743,13 @@ wxNotebook* GUI_App::tab_panel() const return mainframe->m_tabpanel; } +int GUI_App::extruders_cnt() const +{ + const Preset& preset = preset_bundle->printers.get_selected_preset(); + return preset.printer_technology() == ptSLA ? 1 : + preset.config.option("nozzle_diameter")->values.size(); +} + void GUI_App::window_pos_save(wxTopLevelWindow* window, const std::string &name) { if (name.empty()) { return; } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 4c23e3eb7..81ef3d040 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -163,6 +163,7 @@ public: Plater* plater_{ nullptr }; wxNotebook* tab_panel() const ; + int extruders_cnt() const; std::vector tabs_list; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 7eef82063..d0f78a6da 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -51,8 +51,7 @@ static DynamicPrintConfig& printer_config() static int extruders_count() { - return printer_technology() == ptSLA ? 1 : - printer_config().option("nozzle_diameter")->values.size(); + return wxGetApp().extruders_cnt(); } ObjectList::ObjectList(wxWindow* parent) : diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index b5074ccc1..92b9c4171 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -295,8 +295,17 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * wxGetApp().tab_panel()->ChangeSelection(page_id); - tab->select_preset(GetString(GetSelection()).ToUTF8().data()); + /* In a case of a multi-material printing, for editing another Filament Preset + * it's needed to select this preset for the "Filament settings" Tab + */ + if (preset_type == Preset::TYPE_FILAMENT && wxGetApp().extruders_cnt() > 1) + { + const std::string& selected_preset = GetString(GetSelection()).ToUTF8().data(); + // Call select_preset() only if there is new preset and not just modified + if ( !boost::algorithm::ends_with(selected_preset, "(modified)") ) + tab->select_preset(selected_preset); + } })); } From 78ac357d3438347ccd3833b4603940e2ab6b01a5 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 19 Mar 2019 15:01:58 +0100 Subject: [PATCH 189/236] Enabling convex hull optimization for arrange. Seems to work nicely --- src/libslic3r/ModelArrange.cpp | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp index fd3cf8648..4942e35b6 100644 --- a/src/libslic3r/ModelArrange.cpp +++ b/src/libslic3r/ModelArrange.cpp @@ -556,29 +556,7 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model) { // TODO export the exact 2D projection. Cannot do it as libnest2d // does not support concave shapes (yet). ClipperLib::Path clpath; -//WIP Vojtech's optimization of the calculation of the convex hull is not working correctly yet. -#if 1 - { - TriangleMesh rmesh = objptr->raw_mesh(); - ModelInstance * finst = objptr->instances.front(); - - // Object instances should carry the same scaling and - // x, y rotation that is why we use the first instance. - // The next line will apply only the full mirroring and scaling - rmesh.transform(finst->get_matrix(true, true, false, false)); - rmesh.rotate_x(float(finst->get_rotation()(X))); - rmesh.rotate_y(float(finst->get_rotation()(Y))); - - // TODO export the exact 2D projection. Cannot do it as libnest2d - // does not support concave shapes (yet). - auto p = rmesh.convex_hull(); - - p.make_clockwise(); - p.append(p.first_point()); - clpath = Slic3rMultiPoint_to_ClipperPath(p); - } -#else // Object instances should carry the same scaling and // x, y rotation that is why we use the first instance. { @@ -593,7 +571,6 @@ ShapeData2D projectModelFromTop(const Slic3r::Model &model) { p.append(p.first_point()); clpath = Slic3rMultiPoint_to_ClipperPath(p); } -#endif for(ModelInstance* objinst : objptr->instances) { if(objinst) { From b57f6c9fe0d2f848ed0995870e322004a9850a0e Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 15:33:09 +0100 Subject: [PATCH 190/236] Fixed build on Linux and Mac --- src/slic3r/GUI/GLCanvas3D.hpp | 2 +- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 9653b138b..aec8a4a17 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -448,7 +448,7 @@ private: void set_flattening_data(const ModelObject* model_object); - void set_sla_support_data(ModelObject* model_object, const GLCanvas3D::Selection& selection); + void set_sla_support_data(ModelObject* model_object, const Selection& selection); bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position = Vec2d::Zero(), bool shift_down = false); void delete_current_grabber(bool delete_all = false); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index d186f7057..fb75414ed 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -367,7 +367,7 @@ void ObjectManipulation::change_rotation_value(const Vec3d& rotation) if (selection.is_single_full_instance() || selection.requires_local_axes()) transformation_type.set_independent(); if (selection.is_single_full_instance()) { - //FIXME GLCanvas3D::Selection::rotate() does not process absoulte rotations correctly: It does not recognize the axis index, which was changed. + //FIXME Selection::rotate() does not process absoulte rotations correctly: It does not recognize the axis index, which was changed. // transformation_type.set_absolute(); transformation_type.set_local(); } From 3b31976b0964e4be188a6c514e30b1fb7fe21e3b Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 19 Mar 2019 15:58:18 +0100 Subject: [PATCH 191/236] Another fix for Linuz and Mac builds --- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 1 - src/slic3r/GUI/GUI_ObjectManipulation.hpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index fb75414ed..f759250b3 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -7,7 +7,6 @@ #include "PresetBundle.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/Geometry.hpp" -#include "GLCanvas3D.hpp" #include "Selection.hpp" #include diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 46e8cec81..a5a180a56 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -4,6 +4,7 @@ #include #include "GUI_ObjectSettings.hpp" +#include "GLCanvas3D.hpp" class wxStaticText; class PrusaLockButton; From df250039dfb170c420649ec2dadcd2891b2aab27 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 20 Mar 2019 09:33:30 +0100 Subject: [PATCH 192/236] Tech ENABLE_CANVAS_GUI_REFACTORING set as default --- src/libslic3r/Technologies.hpp | 2 - src/slic3r/GUI/GLCanvas3D.cpp | 143 --------------------------- src/slic3r/GUI/GLCanvas3D.hpp | 15 --- src/slic3r/GUI/GLToolbar.cpp | 173 --------------------------------- src/slic3r/GUI/GLToolbar.hpp | 50 +--------- src/slic3r/GUI/GUI_Preview.cpp | 14 --- src/slic3r/GUI/GUI_Preview.hpp | 4 - src/slic3r/GUI/Plater.cpp | 138 -------------------------- src/slic3r/GUI/Plater.hpp | 2 - 9 files changed, 1 insertion(+), 540 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 156a225bf..ea3d87888 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -57,6 +57,4 @@ #define ENABLE_SVG_ICONS (1 && ENABLE_1_42_0_ALPHA8 && ENABLE_TEXTURES_FROM_SVG) -#define ENABLE_CANVAS_GUI_REFACTORING 1 - #endif // _technologies_h_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1236ee7b4..7fb1ad25e 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -728,9 +728,6 @@ GLCanvas3D::Mouse::Drag::Drag() GLCanvas3D::Mouse::Mouse() : dragging(false) -#if !ENABLE_CANVAS_GUI_REFACTORING - , left_down(false) -#endif // !ENABLE_CANVAS_GUI_REFACTORING , position(DBL_MAX, DBL_MAX) , scene_position(DBL_MAX, DBL_MAX, DBL_MAX) , ignore_up_event(false) @@ -2067,9 +2064,6 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_use_VBOs(false) , m_apply_zoom_to_volumes_filter(false) , m_hover_volume_id(-1) -#if !ENABLE_CANVAS_GUI_REFACTORING - , m_toolbar_action_running(false) -#endif // !ENABLE_CANVAS_GUI_REFACTORING , m_legend_texture_enabled(false) , m_picking_enabled(false) , m_moving_enabled(false) @@ -2373,21 +2367,6 @@ void GLCanvas3D::allow_multisample(bool allow) m_multisample_allowed = allow; } -#if !ENABLE_CANVAS_GUI_REFACTORING -void GLCanvas3D::enable_toolbar_item(const std::string& name, bool enable) -{ - if (enable) - m_toolbar.enable_item(name); - else - m_toolbar.disable_item(name); -} - -bool GLCanvas3D::is_toolbar_item_pressed(const std::string& name) const -{ - return m_toolbar.is_item_pressed(name); -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - void GLCanvas3D::zoom_to_bed() { _zoom_to_bounding_box(m_bed.get_bounding_box()); @@ -2440,17 +2419,6 @@ void GLCanvas3D::update_volumes_colors_by_extruder() m_volumes.update_colors_by_extruder(m_config); } -#if !ENABLE_CANVAS_GUI_REFACTORING -void GLCanvas3D::update_toolbar_items_visibility() -{ - ConfigOptionMode mode = wxGetApp().get_mode(); - m_toolbar.set_item_visible("more", mode != comSimple); - m_toolbar.set_item_visible("fewer", mode != comSimple); - m_toolbar.set_item_visible("splitvolumes", mode != comSimple); - m_dirty = true; -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - void GLCanvas3D::render() { wxCHECK_RET(!m_in_render, "GLCanvas3D::render() called recursively"); @@ -3103,10 +3071,8 @@ void GLCanvas3D::on_size(wxSizeEvent& evt) void GLCanvas3D::on_idle(wxIdleEvent& evt) { -#if ENABLE_CANVAS_GUI_REFACTORING m_dirty |= m_toolbar.update_items_state(); m_dirty |= m_view_toolbar.update_items_state(); -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_dirty) return; @@ -3386,7 +3352,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ } -#if ENABLE_CANVAS_GUI_REFACTORING bool processed_by_toolbar = m_toolbar.on_mouse(evt, *this); processed_by_toolbar |= m_view_toolbar.on_mouse(evt, *this); @@ -3395,7 +3360,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.set_start_position_3D_as_invalid(); return; } -#endif // ENABLE_CANVAS_GUI_REFACTORING if (m_picking_enabled) _set_current(); @@ -3404,10 +3368,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) int layer_editing_object_idx = is_layers_editing_enabled() ? selected_object_idx : -1; m_layers_editing.select_object(*m_model, layer_editing_object_idx); bool gizmos_overlay_contains_mouse = m_gizmos.overlay_contains_mouse(*this, m_mouse.position); -#if !ENABLE_CANVAS_GUI_REFACTORING - int toolbar_contains_mouse = m_toolbar.contains_mouse(m_mouse.position, *this); - int view_toolbar_contains_mouse = m_view_toolbar.contains_mouse(m_mouse.position, *this); -#endif // !ENABLE_CANVAS_GUI_REFACTORING if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) { @@ -3447,30 +3407,14 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { // to remove hover on objects when the mouse goes out of this canvas m_mouse.position = Vec2d(-1.0, -1.0); -#if !ENABLE_CANVAS_GUI_REFACTORING - // ensure m_mouse.left_down is reset (it may happen when switching canvas) - m_mouse.left_down = false; -#endif // !ENABLE_CANVAS_GUI_REFACTORING m_dirty = true; } -#if !ENABLE_CANVAS_GUI_REFACTORING - else if (evt.LeftDClick() && (toolbar_contains_mouse != -1)) - { - m_toolbar_action_running = true; - m_mouse.set_start_position_3D_as_invalid(); - m_toolbar.do_action((unsigned int)toolbar_contains_mouse, *this); - } -#endif // !ENABLE_CANVAS_GUI_REFACTORING else if (evt.LeftDClick() && (m_gizmos.get_current_type() != Gizmos::Undefined)) { m_mouse.ignore_up_event = true; } else if (evt.LeftDown() || evt.RightDown()) { -#if !ENABLE_CANVAS_GUI_REFACTORING - m_mouse.left_down = evt.LeftDown(); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - // If user pressed left or right button we first check whether this happened // on a volume or not. m_layers_editing.state = LayersEditing::Unknown; @@ -3522,17 +3466,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) { // event was taken care of by the SlaSupports gizmo } -#if !ENABLE_CANVAS_GUI_REFACTORING - else if (evt.LeftDown() && (view_toolbar_contains_mouse != -1)) - m_view_toolbar.do_action((unsigned int)view_toolbar_contains_mouse, *this); - else if (evt.LeftDown() && (toolbar_contains_mouse != -1)) - { - m_toolbar_action_running = true; - m_mouse.set_start_position_3D_as_invalid(); - m_toolbar.do_action((unsigned int)toolbar_contains_mouse, *this); - m_mouse.left_down = false; - } -#endif // !ENABLE_CANVAS_GUI_REFACTORING else { // Select volume in this 3D canvas. @@ -3692,11 +3625,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } // do not process dragging if the mouse is into any of the HUD elements -#if ENABLE_CANVAS_GUI_REFACTORING else if (evt.Dragging() && !gizmos_overlay_contains_mouse) -#else - else if (evt.Dragging() && !gizmos_overlay_contains_mouse && (toolbar_contains_mouse == -1) && (view_toolbar_contains_mouse == -1)) -#endif // ENABLE_CANVAS_GUI_REFACTORING { m_mouse.dragging = true; @@ -3706,11 +3635,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) _perform_layer_editing_action(&evt); } // do not process the dragging if the left mouse was set down in another canvas -#if ENABLE_CANVAS_GUI_REFACTORING else if (evt.LeftIsDown()) -#else - else if (m_mouse.left_down && evt.LeftIsDown()) -#endif // ENABLE_CANVAS_GUI_REFACTORING { // if dragging over blank area with left button, rotate if ((m_hover_volume_id == -1) && m_mouse.is_start_position_3D_defined()) @@ -3767,11 +3692,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // that's why the mouse_event function was called so that the gizmo can refuse the deselection in manual editing mode // deselect and propagate event through callback -#if ENABLE_CANVAS_GUI_REFACTORING if (!evt.ShiftDown() && m_picking_enabled && !m_mouse.ignore_up_event) -#else - if (!evt.ShiftDown() && m_picking_enabled && !m_toolbar_action_running && !m_mouse.ignore_up_event) -#endif // ENABLE_CANVAS_GUI_REFACTORING { m_selection.clear(); m_selection.set_mode(Selection::Instance); @@ -3851,10 +3772,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.set_start_position_3D_as_invalid(); m_mouse.set_start_position_2D_as_invalid(); m_mouse.dragging = false; -#if !ENABLE_CANVAS_GUI_REFACTORING - m_mouse.left_down = false; - m_toolbar_action_running = false; -#endif // !ENABLE_CANVAS_GUI_REFACTORING m_dirty = true; if (m_canvas->HasCapture()) @@ -3870,25 +3787,11 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (m_selection.is_empty()) m_gizmos.reset_all_states(); -#if ENABLE_CANVAS_GUI_REFACTORING if (tooltip.empty()) tooltip = m_toolbar.get_tooltip(); if (tooltip.empty()) tooltip = m_view_toolbar.get_tooltip(); -#else - // updates toolbar overlay - if (tooltip.empty()) - tooltip = m_toolbar.update_hover_state(m_mouse.position, *this); - - // updates view toolbar overlay - if (tooltip.empty()) - { - tooltip = m_view_toolbar.update_hover_state(m_mouse.position, *this); - if (!tooltip.empty()) - m_dirty = true; - } -#endif // ENABLE_CANVAS_GUI_REFACTORING set_tooltip(tooltip); @@ -4286,11 +4189,7 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Add...") + " [" + GUI::shortkey_ctrl_prefix() + "I]"; item.sprite_id = 0; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ADD)); }; -#else - item.action_event = EVT_GLTOOLBAR_ADD; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; @@ -4300,12 +4199,8 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Delete") + " [Del]"; item.sprite_id = 1; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE)); }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_delete(); }; -#else - item.action_event = EVT_GLTOOLBAR_DELETE; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; @@ -4315,12 +4210,8 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Delete all") + " [" + GUI::shortkey_ctrl_prefix() + "Del]"; item.sprite_id = 2; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_delete_all(); }; -#else - item.action_event = EVT_GLTOOLBAR_DELETE_ALL; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; @@ -4330,12 +4221,8 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Arrange [A]"); item.sprite_id = 3; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ARRANGE)); }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_arrange(); }; -#else - item.action_event = EVT_GLTOOLBAR_ARRANGE; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; @@ -4348,13 +4235,9 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Add instance [+]"); item.sprite_id = 4; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_MORE)); }; item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_increase_instances(); }; -#else - item.action_event = EVT_GLTOOLBAR_MORE; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; @@ -4364,13 +4247,9 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Remove instance [-]"); item.sprite_id = 5; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_FEWER)); }; item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_decrease_instances(); }; -#else - item.action_event = EVT_GLTOOLBAR_FEWER; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; @@ -4383,13 +4262,9 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to objects"); item.sprite_id = 6; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_OBJECTS)); }; item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_split_to_objects(); }; -#else - item.action_event = EVT_GLTOOLBAR_SPLIT_OBJECTS; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; @@ -4399,13 +4274,9 @@ bool GLCanvas3D::_init_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Split to parts"); item.sprite_id = 7; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_SPLIT_VOLUMES)); }; item.visibility_callback = []()->bool { return wxGetApp().get_mode() != comSimple; }; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_split_to_volumes(); }; -#else - item.action_event = EVT_GLTOOLBAR_SPLIT_VOLUMES; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; @@ -4419,22 +4290,12 @@ bool GLCanvas3D::_init_toolbar() item.tooltip = GUI::L_str("Layers editing"); item.sprite_id = 8; item.is_toggable = true; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); }; item.visibility_callback = GLToolbarItem::Default_Visibility_Callback; item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_layers_editing(); }; -#else - item.action_event = EVT_GLTOOLBAR_LAYERSEDITING; -#endif // ENABLE_CANVAS_GUI_REFACTORING if (!m_toolbar.add_item(item)) return false; -#if !ENABLE_CANVAS_GUI_REFACTORING - enable_toolbar_item("add", true); - - update_toolbar_items_visibility(); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - return true; } @@ -4636,11 +4497,7 @@ void GLCanvas3D::_picking_pass() const { const Vec2d& pos = m_mouse.position; -#if ENABLE_CANVAS_GUI_REFACTORING if (m_picking_enabled && !m_mouse.dragging && (pos != Vec2d(DBL_MAX, DBL_MAX))) -#else - if (m_picking_enabled && !m_mouse.dragging && !m_mouse.left_down && (pos != Vec2d(DBL_MAX, DBL_MAX))) -#endif // ENABLE_CANVAS_GUI_REFACTORING { // Render the object for picking. // FIXME This cannot possibly work in a multi - sampled context as the color gets mangled by the anti - aliasing. diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index aec8a4a17..4cbabc438 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -310,9 +310,6 @@ class GLCanvas3D }; bool dragging; -#if !ENABLE_CANVAS_GUI_REFACTORING - bool left_down; -#endif // !ENABLE_CANVAS_GUI_REFACTORING Vec2d position; Vec3d scene_position; Drag drag; @@ -579,9 +576,6 @@ private: bool m_use_VBOs; bool m_apply_zoom_to_volumes_filter; mutable int m_hover_volume_id; -#if !ENABLE_CANVAS_GUI_REFACTORING - bool m_toolbar_action_running; -#endif // !ENABLE_CANVAS_GUI_REFACTORING bool m_warning_texture_enabled; bool m_legend_texture_enabled; bool m_picking_enabled; @@ -660,11 +654,6 @@ public: void enable_dynamic_background(bool enable); void allow_multisample(bool allow); -#if !ENABLE_CANVAS_GUI_REFACTORING - void enable_toolbar_item(const std::string& name, bool enable); - bool is_toolbar_item_pressed(const std::string& name) const; -#endif // !ENABLE_CANVAS_GUI_REFACTORING - void zoom_to_bed(); void zoom_to_volumes(); void zoom_to_selection(); @@ -672,10 +661,6 @@ public: void update_volumes_colors_by_extruder(); -#if !ENABLE_CANVAS_GUI_REFACTORING - void update_toolbar_items_visibility(); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - bool is_dragging() const { return m_gizmos.is_dragging() || m_moving; } void render(); diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 715eb7442..5ac5bf92f 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -30,11 +30,9 @@ wxDEFINE_EVENT(EVT_GLTOOLBAR_LAYERSEDITING, SimpleEvent); wxDEFINE_EVENT(EVT_GLVIEWTOOLBAR_3D, SimpleEvent); wxDEFINE_EVENT(EVT_GLVIEWTOOLBAR_PREVIEW, SimpleEvent); -#if ENABLE_CANVAS_GUI_REFACTORING const GLToolbarItem::ActionCallback GLToolbarItem::Default_Action_Callback = [](){}; const GLToolbarItem::VisibilityCallback GLToolbarItem::Default_Visibility_Callback = []()->bool { return true; }; const GLToolbarItem::EnabledStateCallback GLToolbarItem::Default_Enabled_State_Callback = []()->bool { return true; }; -#endif // ENABLE_CANVAS_GUI_REFACTORING GLToolbarItem::Data::Data() : name("") @@ -45,33 +43,19 @@ GLToolbarItem::Data::Data() , sprite_id(-1) , is_toggable(false) , visible(true) -#if ENABLE_CANVAS_GUI_REFACTORING , action_callback(Default_Action_Callback) , visibility_callback(Default_Visibility_Callback) , enabled_state_callback(Default_Enabled_State_Callback) -#endif // ENABLE_CANVAS_GUI_REFACTORING { } GLToolbarItem::GLToolbarItem(GLToolbarItem::EType type, const GLToolbarItem::Data& data) : m_type(type) -#if ENABLE_CANVAS_GUI_REFACTORING , m_state(Normal) -#else - , m_state(Disabled) -#endif // ENABLE_CANVAS_GUI_REFACTORING , m_data(data) { } -#if !ENABLE_CANVAS_GUI_REFACTORING -void GLToolbarItem::do_action(wxEvtHandler *target) -{ - wxPostEvent(target, SimpleEvent(m_data.action_event)); -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - -#if ENABLE_CANVAS_GUI_REFACTORING bool GLToolbarItem::update_visibility() { bool visible = m_data.visibility_callback(); @@ -91,7 +75,6 @@ bool GLToolbarItem::update_enabled_state() return ret; } -#endif // ENABLE_CANVAS_GUI_REFACTORING void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const { @@ -174,10 +157,8 @@ GLToolbar::GLToolbar(GLToolbar::EType type) #if ENABLE_SVG_ICONS , m_icons_texture_dirty(true) #endif // ENABLE_SVG_ICONS -#if ENABLE_CANVAS_GUI_REFACTORING , m_mouse_capture({false, false, false}) , m_tooltip("") -#endif // ENABLE_CANVAS_GUI_REFACTORING { } @@ -342,32 +323,6 @@ float GLToolbar::get_height() const return m_layout.height; } -#if !ENABLE_CANVAS_GUI_REFACTORING -void GLToolbar::enable_item(const std::string& name) -{ - for (GLToolbarItem* item : m_items) - { - if ((item->get_name() == name) && (item->get_state() == GLToolbarItem::Disabled)) - { - item->set_state(GLToolbarItem::Normal); - return; - } - } -} - -void GLToolbar::disable_item(const std::string& name) -{ - for (GLToolbarItem* item : m_items) - { - if (item->get_name() == name) - { - item->set_state(GLToolbarItem::Disabled); - return; - } - } -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - void GLToolbar::select_item(const std::string& name) { if (is_item_disabled(name)) @@ -416,35 +371,6 @@ bool GLToolbar::is_item_visible(const std::string& name) const return false; } -#if !ENABLE_CANVAS_GUI_REFACTORING -void GLToolbar::set_item_visible(const std::string& name, bool visible) -{ - for (GLToolbarItem* item : m_items) - { - if ((item->get_name() == name) && (item->is_visible() != visible)) - { - item->set_visible(visible); - m_layout.dirty = true; - break; - } - } - - // updates separators visibility to avoid having two consecutive - bool any_item_visible = false; - for (GLToolbarItem* item : m_items) - { - if (!item->is_separator()) - any_item_visible |= item->is_visible(); - else - { - item->set_visible(any_item_visible); - any_item_visible = false; - } - } -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - -#if ENABLE_CANVAS_GUI_REFACTORING bool GLToolbar::update_items_state() { bool ret = false; @@ -452,73 +378,6 @@ bool GLToolbar::update_items_state() ret |= update_items_enabled_state(); return ret; } -#endif // ENABLE_CANVAS_GUI_REFACTORING - -#if !ENABLE_CANVAS_GUI_REFACTORING -std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) -{ - if (!m_enabled) - return ""; - - switch (m_layout.type) - { - default: - case Layout::Horizontal: { return update_hover_state_horizontal(mouse_pos, parent); } - case Layout::Vertical: { return update_hover_state_vertical(mouse_pos, parent); } - } -} - -int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const -{ - if (!m_enabled) - return -1; - - switch (m_layout.type) - { - default: - case Layout::Horizontal: { return contains_mouse_horizontal(mouse_pos, parent); } - case Layout::Vertical: { return contains_mouse_vertical(mouse_pos, parent); } - } -} - -void GLToolbar::do_action(unsigned int item_id, GLCanvas3D& parent) -{ - if (item_id < (unsigned int)m_items.size()) - { - GLToolbarItem* item = m_items[item_id]; - if ((item != nullptr) && !item->is_separator() && item->is_hovered()) - { - if (item->is_toggable()) - { - GLToolbarItem::EState state = item->get_state(); - if (state == GLToolbarItem::Hover) - item->set_state(GLToolbarItem::HoverPressed); - else if (state == GLToolbarItem::HoverPressed) - item->set_state(GLToolbarItem::Hover); - - parent.render(); - item->do_action(parent.get_wxglcanvas()); - } - else - { - if (m_type == Radio) - select_item(item->get_name()); - else - item->set_state(GLToolbarItem::HoverPressed); - - parent.render(); - item->do_action(parent.get_wxglcanvas()); - if ((m_type == Normal) && (item->get_state() != GLToolbarItem::Disabled)) - { - // the item may get disabled during the action, if not, set it back to hover state - item->set_state(GLToolbarItem::Hover); - parent.render(); - } - } - } - } -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING void GLToolbar::render(const GLCanvas3D& parent) const { @@ -545,7 +404,6 @@ void GLToolbar::render(const GLCanvas3D& parent) const ::glPopMatrix(); } -#if ENABLE_CANVAS_GUI_REFACTORING bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) { Vec2d mouse_pos((double)evt.GetX(), (double)evt.GetY()); @@ -592,7 +450,6 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) return processed; } -#endif // ENABLE_CANVAS_GUI_REFACTORING void GLToolbar::calc_layout() const { @@ -683,7 +540,6 @@ float GLToolbar::get_main_size() const return size; } -#if ENABLE_CANVAS_GUI_REFACTORING void GLToolbar::do_action(unsigned int item_id, GLCanvas3D& parent) { if (item_id < (unsigned int)m_items.size()) @@ -734,7 +590,6 @@ std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& pa case Layout::Vertical: { return update_hover_state_vertical(mouse_pos, parent); } } } -#endif // ENABLE_CANVAS_GUI_REFACTORING std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent) { @@ -945,7 +800,6 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan return tooltip; } -#if ENABLE_CANVAS_GUI_REFACTORING int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { if (!m_enabled) @@ -958,7 +812,6 @@ int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) case Layout::Vertical: { return contains_mouse_vertical(mouse_pos, parent); } } } -#endif // ENABLE_CANVAS_GUI_REFACTORING int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { @@ -983,10 +836,6 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 float scaled_separator_size = m_layout.separator_size * factor; float scaled_gap_size = m_layout.gap_size * factor; float scaled_border = m_layout.border * factor; -#if !ENABLE_CANVAS_GUI_REFACTORING - float separator_stride = scaled_separator_size + scaled_gap_size; - float icon_stride = scaled_icons_size + scaled_gap_size; -#endif // !ENABLE_CANVAS_GUI_REFACTORING float left = m_layout.left + scaled_border; float top = m_layout.top - scaled_border; @@ -1001,7 +850,6 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 continue; if (item->is_separator()) -#if ENABLE_CANVAS_GUI_REFACTORING { float right = left + scaled_separator_size; float bottom = top - scaled_icons_size; @@ -1022,9 +870,6 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 left = right; } -#else - left += separator_stride; -#endif // ENABLE_CANVAS_GUI_REFACTORING else { float right = left + scaled_icons_size; @@ -1034,7 +879,6 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) return id; -#if ENABLE_CANVAS_GUI_REFACTORING left = right; right += scaled_gap_size; @@ -1046,9 +890,6 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 } left = right; -#else - left += icon_stride; -#endif // ENABLE_CANVAS_GUI_REFACTORING } } @@ -1078,10 +919,6 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& float scaled_separator_size = m_layout.separator_size * factor; float scaled_gap_size = m_layout.gap_size * factor; float scaled_border = m_layout.border * factor; -#if !ENABLE_CANVAS_GUI_REFACTORING - float separator_stride = scaled_separator_size + scaled_gap_size; - float icon_stride = scaled_icons_size + scaled_gap_size; -#endif // !ENABLE_CANVAS_GUI_REFACTORING float left = m_layout.left + scaled_border; float top = m_layout.top - scaled_border; @@ -1096,7 +933,6 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& continue; if (item->is_separator()) -#if ENABLE_CANVAS_GUI_REFACTORING { float right = left + scaled_icons_size; float bottom = top - scaled_separator_size; @@ -1117,9 +953,6 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& top = bottom; } -#else - top -= separator_stride; -#endif // ENABLE_CANVAS_GUI_REFACTORING else { float right = left + scaled_icons_size; @@ -1129,7 +962,6 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& if ((left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top)) return id; -#if ENABLE_CANVAS_GUI_REFACTORING top = bottom; bottom -= scaled_gap_size; @@ -1141,9 +973,6 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& } top = bottom; -#else - top -= icon_stride; -#endif // ENABLE_CANVAS_GUI_REFACTORING } } @@ -1498,7 +1327,6 @@ bool GLToolbar::generate_icons_texture() const } #endif // ENABLE_SVG_ICONS -#if ENABLE_CANVAS_GUI_REFACTORING bool GLToolbar::update_items_visibility() { bool ret = false; @@ -1541,7 +1369,6 @@ bool GLToolbar::update_items_enabled_state() return ret; } -#endif // ENABLE_CANVAS_GUI_REFACTORING } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index cd5d3f83f..07d1fcb92 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -31,11 +31,9 @@ wxDECLARE_EVENT(EVT_GLVIEWTOOLBAR_PREVIEW, SimpleEvent); class GLToolbarItem { public: -#if ENABLE_CANVAS_GUI_REFACTORING typedef std::function ActionCallback; typedef std::function VisibilityCallback; typedef std::function EnabledStateCallback; -#endif // ENABLE_CANVAS_GUI_REFACTORING enum EType : unsigned char { @@ -63,24 +61,17 @@ public: std::string tooltip; unsigned int sprite_id; bool is_toggable; -#if !ENABLE_CANVAS_GUI_REFACTORING - wxEventType action_event; -#endif // !ENABLE_CANVAS_GUI_REFACTORING bool visible; -#if ENABLE_CANVAS_GUI_REFACTORING ActionCallback action_callback; VisibilityCallback visibility_callback; EnabledStateCallback enabled_state_callback; -#endif // ENABLE_CANVAS_GUI_REFACTORING Data(); }; -#if ENABLE_CANVAS_GUI_REFACTORING static const ActionCallback Default_Action_Callback; static const VisibilityCallback Default_Visibility_Callback; static const EnabledStateCallback Default_Enabled_State_Callback; -#endif // ENABLE_CANVAS_GUI_REFACTORING private: EType m_type; @@ -99,11 +90,7 @@ public: #endif // ENABLE_SVG_ICONS const std::string& get_tooltip() const { return m_data.tooltip; } -#if ENABLE_CANVAS_GUI_REFACTORING void do_action() { m_data.action_callback(); } -#else - void do_action(wxEvtHandler *target); -#endif // ENABLE_CANVAS_GUI_REFACTORING bool is_enabled() const { return m_state != Disabled; } bool is_disabled() const { return m_state == Disabled; } @@ -112,27 +99,20 @@ public: bool is_toggable() const { return m_data.is_toggable; } bool is_visible() const { return m_data.visible; } -#if !ENABLE_CANVAS_GUI_REFACTORING - void set_visible(bool visible) { m_data.visible = visible; } -#endif // !ENABLE_CANVAS_GUI_REFACTORING bool is_separator() const { return m_type == Separator; } -#if ENABLE_CANVAS_GUI_REFACTORING // returns true if the state changes bool update_visibility(); // returns true if the state changes bool update_enabled_state(); -#endif // ENABLE_CANVAS_GUI_REFACTORING void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; private: GLTexture::Quad_UVs get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; -#if ENABLE_CANVAS_GUI_REFACTORING void set_visible(bool visible) { m_data.visible = visible; } friend class GLToolbar; -#endif // ENABLE_CANVAS_GUI_REFACTORING }; #if !ENABLE_SVG_ICONS @@ -250,7 +230,7 @@ private: mutable Layout m_layout; ItemsList m_items; -#if ENABLE_CANVAS_GUI_REFACTORING + struct MouseCapture { bool left; @@ -262,7 +242,6 @@ private: MouseCapture m_mouse_capture; std::string m_tooltip; -#endif // ENABLE_CANVAS_GUI_REFACTORING public: #if ENABLE_SVG_ICONS @@ -303,42 +282,21 @@ public: float get_width() const; float get_height() const; -#if !ENABLE_CANVAS_GUI_REFACTORING - void enable_item(const std::string& name); - void disable_item(const std::string& name); -#endif // !ENABLE_CANVAS_GUI_REFACTORING void select_item(const std::string& name); bool is_item_pressed(const std::string& name) const; bool is_item_disabled(const std::string& name) const; bool is_item_visible(const std::string& name) const; -#if ENABLE_CANVAS_GUI_REFACTORING const std::string& get_tooltip() const { return m_tooltip; } -#endif // ENABLE_CANVAS_GUI_REFACTORING -#if ENABLE_CANVAS_GUI_REFACTORING // returns true if any item changed its state bool update_items_state(); -#else - void set_item_visible(const std::string& name, bool visible); -#endif // ENABLE_CANVAS_GUI_REFACTORING - -#if !ENABLE_CANVAS_GUI_REFACTORING - std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent); - - // returns the id of the item under the given mouse position or -1 if none - int contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; - - void do_action(unsigned int item_id, GLCanvas3D& parent); -#endif // !ENABLE_CANVAS_GUI_REFACTORING void render(const GLCanvas3D& parent) const; -#if ENABLE_CANVAS_GUI_REFACTORING bool on_mouse(wxMouseEvent& evt, GLCanvas3D& parent); -#endif // ENABLE_CANVAS_GUI_REFACTORING private: void calc_layout() const; @@ -347,16 +305,12 @@ private: float get_height_horizontal() const; float get_height_vertical() const; float get_main_size() const; -#if ENABLE_CANVAS_GUI_REFACTORING void do_action(unsigned int item_id, GLCanvas3D& parent); std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent); -#endif // ENABLE_CANVAS_GUI_REFACTORING std::string update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent); std::string update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent); -#if ENABLE_CANVAS_GUI_REFACTORING // returns the id of the item under the given mouse position or -1 if none int contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; -#endif // ENABLE_CANVAS_GUI_REFACTORING int contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; int contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; @@ -367,12 +321,10 @@ private: bool generate_icons_texture() const; #endif // ENABLE_SVG_ICONS -#if ENABLE_CANVAS_GUI_REFACTORING // returns true if any item changed its state bool update_items_visibility(); // returns true if any item changed its state bool update_items_enabled_state(); -#endif // ENABLE_CANVAS_GUI_REFACTORING }; } // namespace GUI diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index b76628b8d..be3fad9ec 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -110,20 +110,6 @@ void View3D::mirror_selection(Axis axis) m_canvas->mirror_selection(axis); } -#if !ENABLE_CANVAS_GUI_REFACTORING -void View3D::update_toolbar_items_visibility() -{ - if (m_canvas != nullptr) - m_canvas->update_toolbar_items_visibility(); -} - -void View3D::enable_toolbar_item(const std::string& name, bool enable) -{ - if (m_canvas != nullptr) - m_canvas->enable_toolbar_item(name, enable); -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - int View3D::check_volumes_outside_state() const { return (m_canvas != nullptr) ? m_canvas->check_volumes_outside_state() : false; diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 5a244abb7..182eaa952 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -50,10 +50,6 @@ public: void delete_selected(); void mirror_selection(Axis axis); -#if !ENABLE_CANVAS_GUI_REFACTORING - void update_toolbar_items_visibility(); - void enable_toolbar_item(const std::string& name, bool enable); -#endif // !ENABLE_CANVAS_GUI_REFACTORING int check_volumes_outside_state() const; bool is_layers_editing_enabled() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 630586bb5..f6efb1d91 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1227,7 +1227,6 @@ struct Plater::priv // Sets m_bed.m_polygon to limit the object placement. void set_bed_shape(const Pointfs& shape); -#if ENABLE_CANVAS_GUI_REFACTORING bool can_delete() const; bool can_delete_all() const; bool can_increase_instances() const; @@ -1236,7 +1235,6 @@ struct Plater::priv bool can_split_to_volumes() const; bool can_arrange() const; bool can_layers_editing() const; -#endif // ENABLE_CANVAS_GUI_REFACTORING private: bool init_object_menu(); @@ -1246,22 +1244,9 @@ private: bool complit_init_part_menu(); void init_view_toolbar(); -#if !ENABLE_CANVAS_GUI_REFACTORING - bool can_delete_object() const; - bool can_increase_instances() const; - bool can_decrease_instances() const; -#endif // !ENABLE_CANVAS_GUI_REFACTORING bool can_set_instance_to_object() const; -#if !ENABLE_CANVAS_GUI_REFACTORING - bool can_split_to_objects() const; - bool can_split_to_volumes() const; -#endif // !ENABLE_CANVAS_GUI_REFACTORING bool can_split() const; bool layers_height_allowed() const; -#if !ENABLE_CANVAS_GUI_REFACTORING - bool can_delete_all() const; - bool can_arrange() const; -#endif // !ENABLE_CANVAS_GUI_REFACTORING bool can_mirror() const; void update_fff_scene(); @@ -1821,14 +1806,6 @@ int Plater::priv::get_selected_volume_idx() const void Plater::priv::selection_changed() { -#if !ENABLE_CANVAS_GUI_REFACTORING - view3D->enable_toolbar_item("delete", can_delete_object()); - view3D->enable_toolbar_item("more", can_increase_instances()); - view3D->enable_toolbar_item("fewer", can_decrease_instances()); - view3D->enable_toolbar_item("splitobjects", can_split()); - view3D->enable_toolbar_item("splitvolumes", printer_technology == ptFFF && can_split()); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - // if the selection is not valid to allow for layer editing, we need to turn off the tool if it is running bool enable_layer_editing = layers_height_allowed(); if (!enable_layer_editing && view3D->is_layers_editing_enabled()) { @@ -1836,22 +1813,12 @@ void Plater::priv::selection_changed() on_action_layersediting(evt); } -#if !ENABLE_CANVAS_GUI_REFACTORING - view3D->enable_toolbar_item("layersediting", enable_layer_editing); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - // forces a frame render to update the view (to avoid a missed update if, for example, the context menu appears) view3D->render(); } void Plater::priv::object_list_changed() { -#if !ENABLE_CANVAS_GUI_REFACTORING - // Enable/disable buttons depending on whether there are any objects on the platter. - view3D->enable_toolbar_item("deleteall", can_delete_all()); - view3D->enable_toolbar_item("arrange", can_arrange()); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - const bool export_in_progress = this->background_process.is_export_scheduled(); // || ! send_gcode_file.empty()); // XXX: is this right? const bool model_fits = view3D->check_volumes_outside_state() == ModelInstance::PVS_Inside; @@ -1930,11 +1897,6 @@ void Plater::priv::arrange() wxBusyCursor wait; -#if !ENABLE_CANVAS_GUI_REFACTORING - // Disable the arrange button (to prevent reentrancies, we will call wxYied) - view3D->enable_toolbar_item("arrange", can_arrange()); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - this->background_process.stop(); unsigned count = 0; for(auto obj : model.objects) count += obj->instances.size(); @@ -2005,11 +1967,6 @@ void Plater::priv::arrange() statusbar()->set_cancel_callback(); // remove cancel button arranging.store(false); -#if !ENABLE_CANVAS_GUI_REFACTORING - // We enable back the arrange button - view3D->enable_toolbar_item("arrange", can_arrange()); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - // Do a full refresh of scene tree, including regenerating all the GLVolumes. //FIXME The update function shall just reload the modified matrices. update(true); @@ -2570,12 +2527,6 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt) void Plater::priv::on_layer_editing_toggled(bool enable) { view3D->enable_layers_editing(enable); -#if !ENABLE_CANVAS_GUI_REFACTORING - if (enable && !view3D->is_layers_editing_enabled()) { - // Initialization of the OpenGL shaders failed. Disable the tool. - view3D->enable_toolbar_item("layersediting", false); - } -#endif // !ENABLE_CANVAS_GUI_REFACTORING view3D->set_as_dirty(); } @@ -2597,14 +2548,7 @@ void Plater::priv::on_action_split_volumes(SimpleEvent&) void Plater::priv::on_action_layersediting(SimpleEvent&) { -#if ENABLE_CANVAS_GUI_REFACTORING view3D->enable_layers_editing(!view3D->is_layers_editing_enabled()); -#else - bool enable = !view3D->is_layers_editing_enabled(); - view3D->enable_layers_editing(enable); - if (enable && !view3D->is_layers_editing_enabled()) - view3D->enable_toolbar_item("layersediting", false); -#endif // ENABLE_CANVAS_GUI_REFACTORING } void Plater::priv::on_object_select(SimpleEvent& evt) @@ -2764,11 +2708,7 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ if (q != nullptr) { q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_mirror()); }, item_mirror->GetId()); -#if ENABLE_CANVAS_GUI_REFACTORING q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete()); }, item_delete->GetId()); -#else - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete_object()); }, item_delete->GetId()); -#endif // ENABLE_CANVAS_GUI_REFACTORING } return true; @@ -2873,11 +2813,7 @@ void Plater::priv::init_view_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("3D editor view") + " [" + GUI::shortkey_ctrl_prefix() + "5]"; item.sprite_id = 0; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (this->q != nullptr) wxPostEvent(this->q, SimpleEvent(EVT_GLVIEWTOOLBAR_3D)); }; -#else - item.action_event = EVT_GLVIEWTOOLBAR_3D; -#endif // ENABLE_CANVAS_GUI_REFACTORING item.is_toggable = false; if (!view_toolbar.add_item(item)) return; @@ -2888,67 +2824,21 @@ void Plater::priv::init_view_toolbar() #endif // ENABLE_SVG_ICONS item.tooltip = GUI::L_str("Preview") + " [" + GUI::shortkey_ctrl_prefix() + "6]"; item.sprite_id = 1; -#if ENABLE_CANVAS_GUI_REFACTORING item.action_callback = [this]() { if (this->q != nullptr) wxPostEvent(this->q, SimpleEvent(EVT_GLVIEWTOOLBAR_PREVIEW)); }; -#else - item.action_event = EVT_GLVIEWTOOLBAR_PREVIEW; -#endif // ENABLE_CANVAS_GUI_REFACTORING item.is_toggable = false; if (!view_toolbar.add_item(item)) return; -#if !ENABLE_CANVAS_GUI_REFACTORING - view_toolbar.enable_item("3D"); - view_toolbar.enable_item("Preview"); -#endif // !ENABLE_CANVAS_GUI_REFACTORING - view_toolbar.select_item("3D"); view_toolbar.set_enabled(true); } -#if !ENABLE_CANVAS_GUI_REFACTORING -bool Plater::priv::can_delete_object() const -{ - int obj_idx = get_selected_object_idx(); - return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()); -} - -bool Plater::priv::can_increase_instances() const -{ - int obj_idx = get_selected_object_idx(); - return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()); -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - bool Plater::priv::can_set_instance_to_object() const { const int obj_idx = get_selected_object_idx(); return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && (model.objects[obj_idx]->instances.size() > 1); } -#if !ENABLE_CANVAS_GUI_REFACTORING -bool Plater::priv::can_decrease_instances() const -{ - int obj_idx = get_selected_object_idx(); - return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && (model.objects[obj_idx]->instances.size() > 1); -} - -bool Plater::priv::can_split_to_objects() const -{ - int obj_idx = get_selected_object_idx(); - return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && !model.objects[obj_idx]->is_multiparts(); -} - -bool Plater::priv::can_split_to_volumes() const -{ - if (printer_technology == ptSLA) - return false; -// int obj_idx = get_selected_object_idx(); -// return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && !model.objects[obj_idx]->is_multiparts(); - return sidebar->obj_list()->is_splittable(); -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - bool Plater::priv::can_split() const { return sidebar->obj_list()->is_splittable(); @@ -2960,18 +2850,6 @@ bool Plater::priv::layers_height_allowed() const return (0 <= obj_idx) && (obj_idx < (int)model.objects.size()) && config->opt_bool("variable_layer_height") && view3D->is_layers_editing_allowed(); } -#if !ENABLE_CANVAS_GUI_REFACTORING -bool Plater::priv::can_delete_all() const -{ - return !model.objects.empty(); -} - -bool Plater::priv::can_arrange() const -{ - return !model.objects.empty() && !arranging.load(); -} -#endif // !ENABLE_CANVAS_GUI_REFACTORING - bool Plater::priv::can_mirror() const { return get_selection().is_from_single_instance(); @@ -2987,7 +2865,6 @@ void Plater::priv::set_bed_shape(const Pointfs& shape) } } -#if ENABLE_CANVAS_GUI_REFACTORING bool Plater::priv::can_delete() const { return !get_selection().is_empty(); @@ -3029,15 +2906,10 @@ bool Plater::priv::can_layers_editing() const { return layers_height_allowed(); } -#endif // ENABLE_CANVAS_GUI_REFACTORING void Plater::priv::update_object_menu() { sidebar->obj_list()->append_menu_items_add_volume(&object_menu); -#if !ENABLE_CANVAS_GUI_REFACTORING - if (view3D != nullptr) - view3D->update_toolbar_items_visibility(); -#endif // !ENABLE_CANVAS_GUI_REFACTORING } void Plater::priv::show_action_buttons(const bool is_ready_to_slice) const @@ -3520,17 +3392,9 @@ void Plater::on_config_change(const DynamicPrintConfig &config) } else if(opt_key == "variable_layer_height") { if (p->config->opt_bool("variable_layer_height") != true) { -#if !ENABLE_CANVAS_GUI_REFACTORING - p->view3D->enable_toolbar_item("layersediting", false); -#endif // !ENABLE_CANVAS_GUI_REFACTORING p->view3D->enable_layers_editing(false); p->view3D->set_as_dirty(); } -#if !ENABLE_CANVAS_GUI_REFACTORING - else if (p->view3D->is_layers_editing_allowed()) { - p->view3D->enable_toolbar_item("layersediting", true); - } -#endif // !ENABLE_CANVAS_GUI_REFACTORING } else if(opt_key == "extruder_colour") { update_scheduled = true; @@ -3652,7 +3516,6 @@ void Plater::fix_through_netfabb(const int obj_idx, const int vol_idx/* = -1*/) void Plater::update_object_menu() { p->update_object_menu(); } -#if ENABLE_CANVAS_GUI_REFACTORING bool Plater::can_delete() const { return p->can_delete(); } bool Plater::can_delete_all() const { return p->can_delete_all(); } bool Plater::can_increase_instances() const { return p->can_increase_instances(); } @@ -3661,6 +3524,5 @@ bool Plater::can_split_to_objects() const { return p->can_split_to_objects(); } bool Plater::can_split_to_volumes() const { return p->can_split_to_volumes(); } bool Plater::can_arrange() const { return p->can_arrange(); } bool Plater::can_layers_editing() const { return p->can_layers_editing(); } -#endif // ENABLE_CANVAS_GUI_REFACTORING }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 8746c1eef..dc5a50cf1 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -176,7 +176,6 @@ public: PrinterTechnology printer_technology() const; void set_printer_technology(PrinterTechnology printer_technology); -#if ENABLE_CANVAS_GUI_REFACTORING bool can_delete() const; bool can_delete_all() const; bool can_increase_instances() const; @@ -185,7 +184,6 @@ public: bool can_split_to_volumes() const; bool can_arrange() const; bool can_layers_editing() const; -#endif // ENABLE_CANVAS_GUI_REFACTORING private: struct priv; From 4ceba39d99c8f46218920954cfc3eeaa7dc530e2 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 20 Mar 2019 10:13:00 +0100 Subject: [PATCH 193/236] Decreased number of polygons on the SLA support point marks for faster rendering --- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index cd7e3b985..56452ae73 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -201,12 +201,12 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const float cone_height = 0.75f; ::glPushMatrix(); ::glTranslatef(0.f, 0.f, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale); - ::gluCylinder(m_quadric, 0.f, cone_radius, cone_height, 36, 1); + ::gluCylinder(m_quadric, 0.f, cone_radius, cone_height, 24, 1); ::glTranslatef(0.f, 0.f, cone_height); - ::gluDisk(m_quadric, 0.0, cone_radius, 36, 1); + ::gluDisk(m_quadric, 0.0, cone_radius, 24, 1); ::glPopMatrix(); } - ::gluSphere(m_quadric, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale, 64, 36); + ::gluSphere(m_quadric, m_editing_mode_cache[i].support_point.head_front_radius * RenderPointScale, 24, 12); ::glPopMatrix(); } From 438010f0f86723bdd32ffc4c8d4f8e4b0676b2fb Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 20 Mar 2019 10:14:49 +0100 Subject: [PATCH 194/236] Some code refactoring --- src/slic3r/GUI/Plater.cpp | 4 ++-- src/slic3r/GUI/Preset.hpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 92b9c4171..b0140a197 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -281,7 +281,7 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * edit_btn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); #endif edit_btn->SetBitmap(create_scaled_bitmap("cog.png")); - edit_btn->SetToolTip(_(L("Click to Edit a selected Filament Preset"))); + edit_btn->SetToolTip(_(L("Click to edit preset"))); edit_btn->Bind(wxEVT_BUTTON, ([preset_type, this](wxCommandEvent) { @@ -303,7 +303,7 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * const std::string& selected_preset = GetString(GetSelection()).ToUTF8().data(); // Call select_preset() only if there is new preset and not just modified - if ( !boost::algorithm::ends_with(selected_preset, "(modified)") ) + if ( !boost::algorithm::ends_with(selected_preset, Preset::suffix_modified()) ) tab->select_preset(selected_preset); } })); diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index 074e665c9..511313715 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -201,6 +201,7 @@ public: static const std::vector& sla_print_options(); static void update_suffix_modified(); + static const std::string& suffix_modified(); static void normalize(DynamicPrintConfig &config); // Report configuration fields, which are misplaced into a wrong group, remove them from the config. static std::string remove_invalid_keys(DynamicPrintConfig &config, const DynamicPrintConfig &default_config); @@ -210,7 +211,6 @@ protected: friend class PresetBundle; // Resize the extruder specific vectors () static void set_num_extruders(DynamicPrintConfig &config, unsigned int n); - static const std::string& suffix_modified(); static std::string remove_suffix_modified(const std::string &name); }; From 2f244895d2799d53d6bc0a2ab98f41cee7052320 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 20 Mar 2019 11:12:37 +0100 Subject: [PATCH 195/236] Small fix for cancel button text on Linux --- src/slic3r/GUI/ProgressStatusBar.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/ProgressStatusBar.cpp b/src/slic3r/GUI/ProgressStatusBar.cpp index 8cdb53c9d..83c5e5b24 100644 --- a/src/slic3r/GUI/ProgressStatusBar.cpp +++ b/src/slic3r/GUI/ProgressStatusBar.cpp @@ -5,8 +5,11 @@ #include #include #include + #include "GUI_App.hpp" +#include "I18N.hpp" + #include namespace Slic3r { @@ -22,7 +25,7 @@ ProgressStatusBar::ProgressStatusBar(wxWindow *parent, int id): wxDefaultSize)), m_cancelbutton(new wxButton(self, -1, - "Cancel", + _(L("Cancel")), wxDefaultPosition, wxDefaultSize)) { @@ -33,6 +36,9 @@ ProgressStatusBar::ProgressStatusBar(wxWindow *parent, int id): int w[] = {-1, 150, 155}; self->SetStatusWidths(3, w); + wxSize s = m_cancelbutton->GetTextExtent(m_cancelbutton->GetLabel()); + self->SetMinHeight(int(2 * self->GetBorderY() + 1.2 * s.GetHeight())); + self->Bind(wxEVT_TIMER, [this](const wxTimerEvent&) { if (m_prog->IsShown()) m_timer->Stop(); if(is_busy()) m_prog->Pulse(); From e2349bdd2eb99094c561e503bca8a7d3ed7ce70f Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 20 Mar 2019 11:54:48 +0100 Subject: [PATCH 196/236] Added workaround for the non-editable wxBitmapComboBoxs under OSXDisableAllSmartSubstitutions + experiments with Linux --- src/slic3r/GUI/Field.cpp | 16 ++++++++++++++-- src/slic3r/GUI/OptionsGroup.cpp | 6 +++--- src/slic3r/GUI/OptionsGroup.hpp | 8 ++++---- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 217b9380a..026b62ab5 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -515,8 +515,20 @@ void Choice::BUILD() { m_is_editable = true; temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); } - else - temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); + else { +#ifdef __WXOSX__ + /* wxBitmapComboBox with wxCB_READONLY style return NULL for GetTextCtrl(), + * so ToolTip doesn't shown. + * Next workaround helps to solve this problem + */ + temp = new wxBitmapComboBox(); + temp->SetTextCtrlStyle(wxTE_READONLY); + temp->Create(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr); +#else + temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); +#endif //__WXOSX__ + } + temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); temp->SetBackgroundStyle(wxBG_STYLE_PAINT); diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 5e9c9ac30..df2f7b582 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -138,7 +138,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) { wxSizer* tmp_sizer; -#ifdef __WXGTK__ +#if 0//#ifdef __WXGTK__ tmp_sizer = new wxBoxSizer(wxVERTICAL); m_panel->SetSizer(tmp_sizer); m_panel->Layout(); @@ -160,7 +160,7 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n } auto grid_sizer = m_grid_sizer; -#ifdef __WXGTK__ +#if 0//#ifdef __WXGTK__ m_panel->SetSizer(m_grid_sizer); m_panel->Layout(); #endif /* __WXGTK__ */ @@ -443,7 +443,7 @@ void ConfigOptionsGroup::Hide() void ConfigOptionsGroup::Show(const bool show) { sizer->ShowItems(show); -#ifdef __WXGTK__ +#if 0//#ifdef __WXGTK__ m_panel->Show(show); m_grid_sizer->Show(show); #endif /* __WXGTK__ */ diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index 661aadbd7..dbe1ea1a2 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -100,13 +100,13 @@ public: /// Accessor function is because users are not allowed to change the parent /// but defining it as const means a lot of const_casts to deal with wx functions. inline wxWindow* parent() const { -#ifdef __WXGTK__ +#if 0//#ifdef __WXGTK__ return m_panel; #else return m_parent; #endif /* __WXGTK__ */ } -#ifdef __WXGTK__ +#if 0//#ifdef __WXGTK__ wxWindow* get_parent() const { return m_parent; } @@ -176,7 +176,7 @@ public: m_grid_sizer = new wxFlexGridSizer(0, num_columns, 1,0); static_cast(m_grid_sizer)->SetFlexibleDirection(wxBOTH/*wxHORIZONTAL*/); static_cast(m_grid_sizer)->AddGrowableCol(label_width == 0 ? 0 : !extra_column ? 1 : 2 ); -#ifdef __WXGTK__ +#if 0//#ifdef __WXGTK__ m_panel = new wxPanel( _parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); sizer->Fit(m_panel); sizer->Add(m_panel, 0, wxEXPAND | wxALL, wxOSX||!staticbox ? 0: 5); @@ -204,7 +204,7 @@ protected: // This panel is needed for correct showing of the ToolTips for Button, StaticText and CheckBox // Tooltips on GTK doesn't work inside wxStaticBoxSizer unless you insert a panel // inside it before you insert the other controls. -#ifdef __WXGTK__ +#if 0//#ifdef__WXGTK__ wxPanel* m_panel {nullptr}; #endif /* __WXGTK__ */ From 2728e45646b239284260dd2c956810fa2c4ea206 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 20 Mar 2019 10:46:41 +0100 Subject: [PATCH 197/236] Renamed function mouse_event to gizmo_event --- src/slic3r/GUI/GLCanvas3D.cpp | 30 ++++++++++---------- src/slic3r/GUI/GLCanvas3D.hpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 2 +- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7fb1ad25e..3226ba373 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1304,14 +1304,14 @@ void GLCanvas3D::Gizmos::set_sla_support_data(ModelObject* model_object, const S // Returns true if the gizmo used the event to do something, false otherwise. -bool GLCanvas3D::Gizmos::mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down) +bool GLCanvas3D::Gizmos::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down) { if (!m_enabled) return false; GizmosMap::const_iterator it = m_gizmos.find(SlaSupports); if (it != m_gizmos.end()) - return reinterpret_cast(it->second)->mouse_event(action, mouse_position, shift_down); + return reinterpret_cast(it->second)->gizmo_event(action, mouse_position, shift_down); return false; } @@ -3100,7 +3100,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case 'a': case 'A': case WXK_CONTROL_A: - if (m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.mouse_event(SLAGizmoEventType::SelectAll)) // Sla gizmo selects all support points + if (m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::SelectAll)) // Sla gizmo selects all support points m_dirty = true; else post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL)); @@ -3120,14 +3120,14 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) { // key ESC case WXK_ESCAPE: { - if (m_gizmos.get_current_type() != Gizmos::SlaSupports || !m_gizmos.mouse_event(SLAGizmoEventType::DiscardChanges)) + if (m_gizmos.get_current_type() != Gizmos::SlaSupports || !m_gizmos.gizmo_event(SLAGizmoEventType::DiscardChanges)) m_gizmos.reset_all_states(); m_dirty = true; break; } case WXK_RETURN: { - if (m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.mouse_event(SLAGizmoEventType::ApplyChanges)) + if (m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::ApplyChanges)) m_dirty = true; break; } @@ -3137,7 +3137,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) #else /* __APPLE__ */ case WXK_DELETE: #endif /* __APPLE__ */ - if (m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.mouse_event(SLAGizmoEventType::Delete)) + if (m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::Delete)) m_dirty = true; else post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE)); @@ -3156,7 +3156,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case 'A': case 'a': { if (m_gizmos.get_current_type() == Gizmos::SlaSupports) { - if (m_gizmos.mouse_event(SLAGizmoEventType::AutomaticGeneration)) + if (m_gizmos.gizmo_event(SLAGizmoEventType::AutomaticGeneration)) m_dirty = true; } else @@ -3173,7 +3173,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case 'z': { m_selection.is_empty() ? zoom_to_volumes() : zoom_to_selection(); break; } case 'M': case 'm': { - if (m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.mouse_event(SLAGizmoEventType::ManualEditing)) { + if (m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::ManualEditing)) { m_dirty = true; break; } @@ -3207,7 +3207,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) // Enable switching between 3D and Preview with Tab // m_canvas->HandleAsNavigationKey(evt); // XXX: Doesn't work in some cases / on Linux post_event(SimpleEvent(EVT_GLCANVAS_TAB)); - } else if (m_gizmos.get_current_type() == Gizmos::SlaSupports && keyCode == WXK_SHIFT && m_gizmos.mouse_event(SLAGizmoEventType::ShiftUp)) { + } else if (m_gizmos.get_current_type() == Gizmos::SlaSupports && keyCode == WXK_SHIFT && m_gizmos.gizmo_event(SLAGizmoEventType::ShiftUp)) { // shift has been just released - SLA gizmo might want to close rectangular selection. m_dirty = true; } @@ -3443,7 +3443,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) _update_gizmos_data(); m_dirty = true; } - else if (evt.LeftDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && evt.ShiftDown() && m_gizmos.mouse_event(SLAGizmoEventType::LeftDown, Vec2d(pos(0), pos(1)), evt.ShiftDown())) + else if (evt.LeftDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && evt.ShiftDown() && m_gizmos.gizmo_event(SLAGizmoEventType::LeftDown, Vec2d(pos(0), pos(1)), evt.ShiftDown())) { // the gizmo got the event and took some action, there is no need to do anything more } @@ -3462,7 +3462,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } - else if ((selected_object_idx != -1) && evt.RightDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.mouse_event(SLAGizmoEventType::RightDown)) + else if ((selected_object_idx != -1) && evt.RightDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::RightDown)) { // event was taken care of by the SlaSupports gizmo } @@ -3619,7 +3619,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } - else if (evt.Dragging() && m_gizmos.get_current_type() == Gizmos::SlaSupports && evt.ShiftDown() && m_gizmos.mouse_event(SLAGizmoEventType::Dragging, Vec2d(pos(0), pos(1)), evt.ShiftDown())) + else if (evt.Dragging() && m_gizmos.get_current_type() == Gizmos::SlaSupports && evt.ShiftDown() && m_gizmos.gizmo_event(SLAGizmoEventType::Dragging, Vec2d(pos(0), pos(1)), evt.ShiftDown())) { // the gizmo got the event and took some action, no need to do anything more here m_dirty = true; @@ -3672,7 +3672,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_layers_editing.accept_changes(*this); } else if (evt.LeftUp() && m_gizmos.get_current_type() == Gizmos::SlaSupports && !m_gizmos.is_dragging() - && !m_mouse.dragging && m_gizmos.mouse_event(SLAGizmoEventType::LeftUp, Vec2d(pos(0), pos(1)), evt.ShiftDown())) + && !m_mouse.dragging && m_gizmos.gizmo_event(SLAGizmoEventType::LeftUp, Vec2d(pos(0), pos(1)), evt.ShiftDown())) { // the gizmo got the event and took some action, no need to do anything more } @@ -3686,10 +3686,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); } else if (evt.LeftUp() && !m_mouse.dragging && (m_hover_volume_id == -1) && !gizmos_overlay_contains_mouse && !m_gizmos.is_dragging() - && !is_layers_editing_enabled() && (m_gizmos.get_current_type() != Gizmos::SlaSupports || !m_gizmos.mouse_event(SLAGizmoEventType::LeftUp, Vec2d(pos(0), pos(1)), evt.ShiftDown()))) + && !is_layers_editing_enabled() && (m_gizmos.get_current_type() != Gizmos::SlaSupports || !m_gizmos.gizmo_event(SLAGizmoEventType::LeftUp, Vec2d(pos(0), pos(1)), evt.ShiftDown()))) { // SLA gizmo cannot be deselected by clicking in canvas area to avoid inadvertent unselection and losing manual changes - // that's why the mouse_event function was called so that the gizmo can refuse the deselection in manual editing mode + // that's why the gizmo_event function was called so that the gizmo can refuse the deselection in manual editing mode // deselect and propagate event through callback if (!evt.ShiftDown() && m_picking_enabled && !m_mouse.ignore_up_event) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 4cbabc438..d9e38c4e0 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -446,8 +446,7 @@ private: void set_flattening_data(const ModelObject* model_object); void set_sla_support_data(ModelObject* model_object, const Selection& selection); - bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position = Vec2d::Zero(), bool shift_down = false); - void delete_current_grabber(bool delete_all = false); + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position = Vec2d::Zero(), bool shift_down = false); void render_current_gizmo(const Selection& selection) const; void render_current_gizmo_for_picking_pass(const Selection& selection) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 56452ae73..a9abdadca 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -307,7 +307,7 @@ std::pair GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse // The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is // aware that the event was reacted to and stops trying to make different sense of it. If the gizmo // concludes that the event was not intended for it, it should return false. -bool GLGizmoSlaSupports::mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down) +bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down) { if (m_editing_mode) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index c27ff0b6d..6e5e8a16e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -59,7 +59,7 @@ public: #endif // ENABLE_SVG_ICONS virtual ~GLGizmoSlaSupports(); void set_sla_support_data(ModelObject* model_object, const Selection& selection); - bool mouse_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down); + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down); void delete_selected_points(bool force = false); std::pair get_sla_clipping_plane() const; From df01af975a33fbdaaa5e2943a70d3389080138a9 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 20 Mar 2019 14:04:20 +0100 Subject: [PATCH 198/236] SLA gizmo now forces objects to use their normal color (not SELECTED_COLOR) --- src/slic3r/GUI/3DScene.cpp | 23 ++++++++++++++--------- src/slic3r/GUI/3DScene.hpp | 2 ++ src/slic3r/GUI/GLCanvas3D.cpp | 4 +++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index deb2bb08d..419f1baae 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -249,6 +249,7 @@ GLVolume::GLVolume(float r, float g, float b, float a) , is_wipe_tower(false) , is_extrusion_path(false) , force_transparent(false) + , force_native_color(false) , tverts_range(0, size_t(-1)) , qverts_range(0, size_t(-1)) { @@ -280,16 +281,20 @@ void GLVolume::set_render_color(const float* rgba, unsigned int size) void GLVolume::set_render_color() { - if (selected) - set_render_color(is_outside ? SELECTED_OUTSIDE_COLOR : SELECTED_COLOR, 4); - else if (hover) - set_render_color(HOVER_COLOR, 4); - else if (disabled) - set_render_color(DISABLED_COLOR, 4); - else if (is_outside && shader_outside_printer_detection_enabled) - set_render_color(OUTSIDE_COLOR, 4); - else + if (force_native_color) set_render_color(color, 4); + else { + if (selected) + set_render_color(is_outside ? SELECTED_OUTSIDE_COLOR : SELECTED_COLOR, 4); + else if (hover) + set_render_color(HOVER_COLOR, 4); + else if (disabled) + set_render_color(DISABLED_COLOR, 4); + else if (is_outside && shader_outside_printer_detection_enabled) + set_render_color(OUTSIDE_COLOR, 4); + else + set_render_color(color, 4); + } if (force_transparent) render_color[3] = color[3]; diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 15ac6a3a1..d571f862f 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -302,6 +302,8 @@ public: bool is_extrusion_path; // Wheter or not to always render this volume using its own alpha bool force_transparent; + // Whether or not always use the volume's own color (not using SELECTED/HOVER/DISABLED/OUTSIDE) + bool force_native_color; // Interleaved triangles & normals with indexed triangles & quads. GLIndexedVertexArray indexed_vertex_array; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 3226ba373..fc3537730 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2231,8 +2231,10 @@ void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject { for (GLVolume* vol : m_volumes.volumes) { if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) - && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx)) + && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx)) { vol->is_active = visible; + vol->force_native_color = (instance_idx != -1); + } } if (visible && !mo) toggle_sla_auxiliaries_visibility(true); From 8466c55b7883af00fb000be8b378db614126d7b9 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 20 Mar 2019 14:04:59 +0100 Subject: [PATCH 199/236] SLA gizmo - points are added on leftdown event, not leftup as before --- src/slic3r/GUI/GLCanvas3D.cpp | 23 ++++---- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 59 ++++++++++---------- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 3 +- 3 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index fc3537730..1c09096a8 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3445,10 +3445,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) _update_gizmos_data(); m_dirty = true; } - else if (evt.LeftDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && evt.ShiftDown() && m_gizmos.gizmo_event(SLAGizmoEventType::LeftDown, Vec2d(pos(0), pos(1)), evt.ShiftDown())) - { - // the gizmo got the event and took some action, there is no need to do anything more - } else if (evt.LeftDown() && !m_selection.is_empty() && m_gizmos.grabber_contains_mouse()) { _update_gizmos_data(); @@ -3464,6 +3460,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } + else if (evt.LeftDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::LeftDown, Vec2d(pos(0), pos(1)), evt.ShiftDown())) + { + // the gizmo got the event and took some action, there is no need to do anything more + } else if ((selected_object_idx != -1) && evt.RightDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::RightDown)) { // event was taken care of by the SlaSupports gizmo @@ -3621,7 +3621,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } - else if (evt.Dragging() && m_gizmos.get_current_type() == Gizmos::SlaSupports && evt.ShiftDown() && m_gizmos.gizmo_event(SLAGizmoEventType::Dragging, Vec2d(pos(0), pos(1)), evt.ShiftDown())) + else if (evt.Dragging() && m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::Dragging, Vec2d(pos(0), pos(1)), evt.ShiftDown())) { // the gizmo got the event and took some action, no need to do anything more here m_dirty = true; @@ -3674,11 +3674,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_layers_editing.accept_changes(*this); } else if (evt.LeftUp() && m_gizmos.get_current_type() == Gizmos::SlaSupports && !m_gizmos.is_dragging() - && !m_mouse.dragging && m_gizmos.gizmo_event(SLAGizmoEventType::LeftUp, Vec2d(pos(0), pos(1)), evt.ShiftDown())) + && !m_mouse.dragging) { - // the gizmo got the event and took some action, no need to do anything more + // in case SLA gizmo is selected, we just pass the LeftUp event and stop processing - neither + // object moving or selecting is suppressed in that case + m_gizmos.gizmo_event(SLAGizmoEventType::LeftUp, Vec2d(pos(0), pos(1)), evt.ShiftDown()); } - else if ((m_mouse.drag.move_volume_idx != -1) && m_mouse.dragging && m_gizmos.get_current_type() != Gizmos::SlaSupports) + else if ((m_mouse.drag.move_volume_idx != -1) && m_mouse.dragging) { m_regenerate_volumes = false; do_move(); @@ -3688,11 +3690,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); } else if (evt.LeftUp() && !m_mouse.dragging && (m_hover_volume_id == -1) && !gizmos_overlay_contains_mouse && !m_gizmos.is_dragging() - && !is_layers_editing_enabled() && (m_gizmos.get_current_type() != Gizmos::SlaSupports || !m_gizmos.gizmo_event(SLAGizmoEventType::LeftUp, Vec2d(pos(0), pos(1)), evt.ShiftDown()))) + && !is_layers_editing_enabled()) { - // SLA gizmo cannot be deselected by clicking in canvas area to avoid inadvertent unselection and losing manual changes - // that's why the gizmo_event function was called so that the gizmo can refuse the deselection in manual editing mode - // deselect and propagate event through callback if (!evt.ShiftDown() && m_picking_enabled && !m_mouse.ignore_up_event) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index a9abdadca..ef3129a5c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -326,39 +326,19 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous return true; } - // dragging the selection rectangle: - if (action == SLAGizmoEventType::Dragging && m_selection_rectangle_active) { - m_selection_rectangle_end_corner = mouse_position; - return true; - } - - // mouse up without selection rectangle - place point on the mesh: - if (action == SLAGizmoEventType::LeftUp && !m_selection_rectangle_active && !shift_down) { - if (m_ignore_up_event) { - m_ignore_up_event = false; - return false; - } - - int instance_id = m_parent.get_selection().get_instance_idx(); - if (m_old_instance_id != instance_id) - { - bool something_selected = (m_old_instance_id != -1); - m_old_instance_id = instance_id; - if (something_selected) - return false; - } - if (instance_id == -1) - return false; - + // left down without selection rectangle - place point on the mesh: + if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle_active && !shift_down) { // If there is some selection, don't add new point and deselect everything instead. if (m_selection_empty) { try { std::pair pos_and_normal = unproject_on_mesh(mouse_position); // don't create anything if this throws m_editing_mode_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); m_unsaved_changes = true; + m_parent.set_as_dirty(); + m_wait_for_up_event = true; } - catch (...) { // not clicked on object - return true; // prevents deselection of the gizmo by GLCanvas3D + catch (...) { // not clicked on object + return false; } } else @@ -368,10 +348,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } // left up with selection rectangle - select points inside the rectangle: - if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp) - && m_selection_rectangle_active) { - if (action == SLAGizmoEventType::ShiftUp) - m_ignore_up_event = true; + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp) && m_selection_rectangle_active) { const Transform3d& instance_matrix = m_model_object->instances[m_active_instance]->get_transformation().get_matrix(); GLint viewport[4]; ::glGetIntegerv(GL_VIEWPORT, viewport); @@ -421,6 +398,28 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous return true; } + // left up with no selection rectangle + if (action == SLAGizmoEventType::LeftUp) { + if (m_wait_for_up_event) { + m_wait_for_up_event = false; + return true; + } + } + + // dragging the selection rectangle: + if (action == SLAGizmoEventType::Dragging) { + if (m_wait_for_up_event) + return true; // point has been placed and the button not released yet + // this prevents GLCanvas from starting scene rotation + + if (m_selection_rectangle_active) { + m_selection_rectangle_end_corner = mouse_position; + return true; + } + + return false; + } + if (action == SLAGizmoEventType::Delete) { // delete key pressed delete_selected_points(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 6e5e8a16e..993ab06bf 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -87,8 +87,7 @@ private: bool m_selection_rectangle_active = false; Vec2d m_selection_rectangle_start_corner; Vec2d m_selection_rectangle_end_corner; - bool m_ignore_up_event = false; - bool m_combo_box_open = false; // To ensure proper rendering of the imgui combobox. + bool m_wait_for_up_event = false; bool m_unsaved_changes = false; // Are there unsaved changes in manual mode? bool m_selection_empty = true; EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) From 9f06dbd6157f4daabb9fbad617a9e02fca7193a6 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 20 Mar 2019 15:17:07 +0100 Subject: [PATCH 200/236] Added a mention of ASAN in the wiki --- doc/How to build - Linux et al.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/How to build - Linux et al.md b/doc/How to build - Linux et al.md index cf7bc86f2..14ec23b2d 100644 --- a/doc/How to build - Linux et al.md +++ b/doc/How to build - Linux et al.md @@ -58,11 +58,20 @@ Note that Slic3r PE is tested with wxWidgets 3.0 somewhat sporadically and so th ### Build variant -By default Scli3r builds the release variant. +By default Slic3r builds the release variant. To create a debug build, use the following CMake flag: -DCMAKE_BUILD_TYPE=Debug +### Enabling address sanitizer + +If you're using GCC/Clang compiler, it is possible to build Slic3r with the built-in address sanitizer enabled to help detect memory-corruption issues. +To enable it, simply use the following CMake flag: + + -DSLIC3R_ASAN=1 + +This requires GCC>4.8 or Clang>3.1. + ### Installation At runtime, Slic3r needs a way to access its resource files. By default, it looks for a `resources` directory relative to its binary. From 42c5d624cb70c4493ee3f225458f2d6cd9e60b32 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 20 Mar 2019 15:30:03 +0100 Subject: [PATCH 201/236] Fix into GLToolbar::on_mouse() --- src/slic3r/GUI/GLToolbar.cpp | 24 ++++++++++++++++++++---- src/slic3r/GUI/GLToolbar.hpp | 2 ++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 5ac5bf92f..ac79784ad 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -157,7 +157,7 @@ GLToolbar::GLToolbar(GLToolbar::EType type) #if ENABLE_SVG_ICONS , m_icons_texture_dirty(true) #endif // ENABLE_SVG_ICONS - , m_mouse_capture({false, false, false}) + , m_mouse_capture({ false, false, false, nullptr }) , m_tooltip("") { } @@ -418,8 +418,17 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) m_mouse_capture.middle = false; else if (evt.RightUp()) m_mouse_capture.right = false; - else if (m_mouse_capture.any() && evt.Dragging()) - processed = true; + else if (m_mouse_capture.any()) + { + if (evt.Dragging()) + processed = true; + else if (evt.Entering() && (m_mouse_capture.parent == &parent)) + // Resets the mouse capture state to avoid setting the dragging event as processed when, for example, + // the item action opens a modal dialog + // Keeps the mouse capture state if the entering event happens on different parent from the one + // who received the button down event, to prevent, for example, dragging when switching between scene views + m_mouse_capture.reset(); + } int item_id = contains_mouse(mouse_pos, parent); if (item_id == -1) @@ -429,10 +438,11 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) } else { - // mouse inside toolbar only + // mouse inside toolbar if (evt.LeftDown() || evt.LeftDClick()) { m_mouse_capture.left = true; + m_mouse_capture.parent = &parent; if ((item_id != -2) && !m_items[item_id]->is_separator()) { // mouse is inside an icon @@ -441,9 +451,15 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) } } else if (evt.MiddleDown()) + { m_mouse_capture.middle = true; + m_mouse_capture.parent = &parent; + } else if (evt.RightDown()) + { m_mouse_capture.right = true; + m_mouse_capture.parent = &parent; + } else if (evt.LeftUp()) processed = true; } diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 07d1fcb92..95953795f 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -236,8 +236,10 @@ private: bool left; bool middle; bool right; + GLCanvas3D* parent; bool any() const { return left || middle || right; } + void reset() { left = middle = right = false; parent = nullptr; } }; MouseCapture m_mouse_capture; From 8b73608e9f70457ac6d6f76dc3a5b22ccf393d0f Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 20 Mar 2019 15:35:43 +0100 Subject: [PATCH 202/236] SLA gizmo can be activated if the supports are outside the bed Otherwise there is a possibility that the object gets out of bed when the gizmo is active (supports are generated with object close to the edge), which the gizmo does not expect --- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index ef3129a5c..619ae3b3f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -691,10 +691,10 @@ bool GLGizmoSlaSupports::on_is_activable(const Selection& selection) const || !selection.is_from_single_instance()) return false; - // Check that none of the selected volumes is outside. + // Check that none of the selected volumes is outside. Only SLA auxiliaries (supports) are allowed outside. const Selection::IndicesList& list = selection.get_volume_idxs(); for (const auto& idx : list) - if (selection.get_volume(idx)->is_outside) + if (selection.get_volume(idx)->is_outside && selection.get_volume(idx)->composite_id.volume_id >= 0) return false; return true; From 452eb62f1102e0a59d0b3979fc1101a6421029a5 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 20 Mar 2019 16:22:01 +0100 Subject: [PATCH 203/236] Some code refactoring --- src/slic3r/GUI/GUI_App.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 38 ++++++++++++++++++-------------------- src/slic3r/GUI/Tab.hpp | 4 +++- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 3b7ddd1d8..d68257a0a 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -530,7 +530,7 @@ void GUI_App::update_mode() sidebar().update_mode(); for (auto tab : tabs_list) - tab->update_visibility(); + tab->update_mode(); plater()->update_object_menu(); } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d54d01572..46a6de6ab 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -705,25 +705,28 @@ void Tab::reload_config() // Thaw(); } -void Tab::update_visibility() +void Tab::update_mode() { - const ConfigOptionMode mode = wxGetApp().get_mode(); -// Freeze(); - - for (auto page : m_pages) - page->update_visibility(mode); - update_page_tree_visibility(); + m_mode = wxGetApp().get_mode(); // update mode for ModeSizer - m_mode_sizer->SetMode(mode); + m_mode_sizer->SetMode(m_mode); + + update_visibility(); +} + +void Tab::update_visibility() +{ + Freeze(); // There is needed Freeze/Thaw to avoid a flashing after Show/Layout + + for (auto page : m_pages) + page->update_visibility(m_mode); + update_page_tree_visibility(); Layout(); -// Thaw(); + Thaw(); - // to update tree items color -// wxTheApp->CallAfter([this]() { - update_changed_tree_ui(); -// }); + update_changed_tree_ui(); } Field* Tab::get_field(const t_config_option_key& opt_key, int opt_index/* = -1*/) const @@ -2264,7 +2267,7 @@ void TabPrinter::update_pages() else m_pages_sla.empty() ? build_sla() : m_pages.swap(m_pages_sla); - rebuild_page_tree(true); + rebuild_page_tree(); } void TabPrinter::update() @@ -2470,10 +2473,8 @@ void Tab::load_current_preset() } //Regerenerate content of the page tree. -void Tab::rebuild_page_tree(bool tree_sel_change_event /*= false*/) +void Tab::rebuild_page_tree() { -// Freeze(); - // get label of the currently selected item const auto sel_item = m_treectrl->GetSelection(); const auto selected = sel_item ? m_treectrl->GetItemText(sel_item) : ""; @@ -2486,10 +2487,7 @@ void Tab::rebuild_page_tree(bool tree_sel_change_event /*= false*/) auto itemId = m_treectrl->AppendItem(rootItem, p->title(), p->iconID()); m_treectrl->SetItemTextColour(itemId, p->get_item_colour()); if (p->title() == selected) { -// if (!(p->title() == _(L("Machine limits")) || p->title() == _(L("Single extruder MM setup")))) // These Pages have to be updated inside OnTreeSelChange -// m_disable_tree_sel_changed_event = !tree_sel_change_event; m_treectrl->SelectItem(itemId); - m_disable_tree_sel_changed_event = false; have_selection = 1; } } diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 81a79c58c..15ae0443c 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -209,6 +209,7 @@ protected: int m_em_unit; // To avoid actions with no-completed Tab bool m_complited { false }; + ConfigOptionMode m_mode = comSimple; public: PresetBundle* m_preset_bundle; @@ -236,7 +237,7 @@ public: void create_preset_tab(); void load_current_preset(); - void rebuild_page_tree(bool tree_sel_change_event = false); + void rebuild_page_tree(); void update_page_tree_visibility(); void select_preset(std::string preset_name = ""); bool may_discard_current_dirty_preset(PresetCollection* presets = nullptr, const std::string& new_printer_name = ""); @@ -270,6 +271,7 @@ public: void update_tab_ui(); void load_config(const DynamicPrintConfig& config); virtual void reload_config(); + void update_mode(); void update_visibility(); Field* get_field(const t_config_option_key& opt_key, int opt_index = -1) const; bool set_value(const t_config_option_key& opt_key, const boost::any& value); From 19a96336ffad44ad3c38383e0d7c93047c4258ad Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 20 Mar 2019 18:03:11 +0100 Subject: [PATCH 204/236] WIP on slice indexing --- src/libslic3r/SLAPrint.cpp | 300 +++++++++++++++++++++++++------------ src/libslic3r/SLAPrint.hpp | 112 ++++++++++---- 2 files changed, 289 insertions(+), 123 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 83fa61fdd..62ddba84b 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -567,6 +567,18 @@ sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c) { return scfg; } +sla::PoolConfig make_pool_config(const SLAPrintObjectConfig& c) { + sla::PoolConfig pcfg; + + pcfg.min_wall_thickness_mm = c.pad_wall_thickness.getFloat(); + pcfg.wall_slope = c.pad_wall_slope.getFloat(); + pcfg.edge_radius_mm = c.pad_edge_radius.getFloat(); + pcfg.max_merge_distance_mm = c.pad_max_merge_distance.getFloat(); + pcfg.min_wall_height_mm = c.pad_wall_height.getFloat(); + + return pcfg; +} + void swapXY(ExPolygon& expoly) { for(auto& p : expoly.contour.points) std::swap(p(X), p(Y)); for(auto& h : expoly.holes) for(auto& p : h.points) std::swap(p(X), p(Y)); @@ -647,18 +659,58 @@ void SLAPrint::process() // Slicing the model object. This method is oversimplified and needs to // be compared with the fff slicing algorithm for verification auto slice_model = [this, ilh](SLAPrintObject& po) { - double lh = po.m_config.layer_height.getFloat(); - TriangleMesh mesh = po.transformed_mesh(); + + // We need to prepare the slice index... + + auto&& bb3d = mesh.bounding_box(); + float minZ = float(bb3d.min(Z)) - float(po.get_elevation()); + float maxZ = float(bb3d.max(Z)); + auto flh = float(po.m_config.layer_height.getFloat()); + + auto slh = [](float h) { return LevelID( double(h) / SCALING_FACTOR); }; + + po.m_slice_index.clear(); + po.m_slice_index.reserve(size_t(maxZ - (minZ + ilh) / flh) + 1); + po.m_slice_index.emplace_back(slh(minZ + ilh), minZ + ilh / 2.f, ilh); + + for(float h = minZ + ilh + flh; h <= maxZ; h += flh) { + po.m_slice_index.emplace_back(slh(h), h - flh / 2.f, flh); + } + + + using SlRec = SLAPrintObject::SliceRecord; + auto slindex_it = std::lower_bound(po.m_slice_index.begin(), + po.m_slice_index.end(), + float(bb3d.min(Z)), // model start z + [](const SlRec& sr1, const SlRec& sr2){ + return sr1.slice_level() < sr2.slice_level(); + }); + + if(slindex_it == po.m_slice_index.end()) + throw std::runtime_error(L("Slicing had to be stopped " + "due to an internal error.")); + + po.m_height_levels.clear(); + po.m_height_levels.reserve(po.m_slice_index.size()); + for(auto it = slindex_it; it != po.m_slice_index.end(); ++it) + po.m_height_levels.emplace_back(it->slice_level()); + TriangleMeshSlicer slicer(&mesh); - // The 1D grid heights - std::vector heights = calculate_heights(mesh.bounding_box(), - float(po.get_elevation()), - ilh, float(lh)); + po.m_model_slices.clear(); + slicer.slice(po.m_height_levels, + float(po.config().slice_closing_radius.value), + &po.m_model_slices, + [this](){ throw_if_canceled(); }); - auto& layers = po.m_model_slices; layers.clear(); - slicer.slice(heights, float(po.config().slice_closing_radius.value), &layers, [this](){ throw_if_canceled(); }); + auto mit = slindex_it; + for(size_t id = 0; + id < po.m_model_slices.size() && mit != po.m_slice_index.end(); + id++) + { + mit->set_model_slice_idx(id); ++mit; + } }; // In this step we check the slices, identify island and cover them with @@ -680,12 +732,8 @@ void SLAPrint::process() if (mo.sla_points_status != sla::PointsStatus::UserModified) { // calculate heights of slices (slices are calculated already) - double lh = po.m_config.layer_height.getFloat(); - - std::vector heights = - calculate_heights(po.transformed_mesh().bounding_box(), - float(po.get_elevation()), - ilh, float(lh)); + auto&& bb = po.transformed_mesh().bounding_box(); + std::vector heights = po.get_slice_levels(float(bb.min(Z))); this->throw_if_canceled(); SLAAutoSupports::Config config; @@ -837,79 +885,86 @@ void SLAPrint::process() auto lh = float(po.m_config.layer_height.getFloat()); sd->support_slices = sd->support_tree_ptr->slice(lh, ilh); } + + for(size_t i = 0; + i < sd->support_slices.size() && i < po.m_slice_index.size(); + ++i) + { + po.m_slice_index[i].set_support_slice_idx(i); + } }; // We have the layer polygon collection but we need to unite them into // an index where the key is the height level in discrete levels (clipper) auto index_slices = [this, ilhd](SLAPrintObject& po) { - po.m_slice_index.clear(); - auto sih = LevelID(scale_(ilhd)); +// po.m_slice_index.clear(); +// auto sih = LevelID(scale_(ilhd)); - // Establish the slice grid boundaries - auto bb = po.transformed_mesh().bounding_box(); - double modelgnd = bb.min(Z); - double elevation = po.get_elevation(); - double lh = po.m_config.layer_height.getFloat(); - double minZ = modelgnd - elevation; +// // Establish the slice grid boundaries +// auto bb = po.transformed_mesh().bounding_box(); +// double modelgnd = bb.min(Z); +// double elevation = po.get_elevation(); +// double lh = po.m_config.layer_height.getFloat(); +// double minZ = modelgnd - elevation; - // scaled values: - auto sminZ = LevelID(scale_(minZ)); - auto smaxZ = LevelID(scale_(bb.max(Z))); - auto smodelgnd = LevelID(scale_(modelgnd)); - auto slh = LevelID(scale_(lh)); +// // scaled values: +// auto sminZ = LevelID(scale_(minZ)); +// auto smaxZ = LevelID(scale_(bb.max(Z))); +// auto smodelgnd = LevelID(scale_(modelgnd)); +// auto slh = LevelID(scale_(lh)); - // It is important that the next levels match the levels in - // model_slice method. Only difference is that here it works with - // scaled coordinates - po.m_level_ids.clear(); - for(LevelID h = sminZ + sih; h < smaxZ; h += slh) - if(h >= smodelgnd) po.m_level_ids.emplace_back(h); +// // It is important that the next levels match the levels in +// // model_slice method. Only difference is that here it works with +// // scaled coordinates +// po.m_level_ids.clear(); +// for(LevelID h = sminZ + sih; h < smaxZ; h += slh) +// if(h >= smodelgnd) po.m_level_ids.emplace_back(h); - std::vector& oslices = po.m_model_slices; +// std::vector& oslices = po.m_model_slices; - // If everything went well this code should not run at all, but - // let's be robust... - // assert(levelids.size() == oslices.size()); - if(po.m_level_ids.size() < oslices.size()) { // extend the levels until... +// // If everything went well this code should not run at all, but +// // let's be robust... +// // assert(levelids.size() == oslices.size()); +// if(po.m_level_ids.size() < oslices.size()) { // extend the levels until... - BOOST_LOG_TRIVIAL(warning) - << "Height level mismatch at rasterization!\n"; +// BOOST_LOG_TRIVIAL(warning) +// << "Height level mismatch at rasterization!\n"; - LevelID lastlvl = po.m_level_ids.back(); - while(po.m_level_ids.size() < oslices.size()) { - lastlvl += slh; - po.m_level_ids.emplace_back(lastlvl); - } - } +// LevelID lastlvl = po.m_level_ids.back(); +// while(po.m_level_ids.size() < oslices.size()) { +// lastlvl += slh; +// po.m_level_ids.emplace_back(lastlvl); +// } +// } - for(size_t i = 0; i < oslices.size(); ++i) { - LevelID h = po.m_level_ids[i]; +// for(size_t i = 0; i < oslices.size(); ++i) { +// LevelID h = po.m_level_ids[i]; - float fh = float(double(h) * SCALING_FACTOR); +// float fh = float(double(h) * SCALING_FACTOR); - // now for the public slice index: - SLAPrintObject::SliceRecord& sr = po.m_slice_index[fh]; - // There should be only one slice layer for each print object - assert(sr.model_slices_idx == SLAPrintObject::SliceRecord::NONE); - sr.model_slices_idx = i; - } +// // now for the public slice index: +// SLAPrintObject::SliceRecord& sr = po.m_slice_index[fh]; +// // There should be only one slice layer for each print object +// assert(sr.model_slices_idx == SLAPrintObject::SliceRecord::NONE); +// sr.model_slices_idx = i; +// } - if(po.m_supportdata) { // deal with the support slices if present - std::vector& sslices = po.m_supportdata->support_slices; - po.m_supportdata->level_ids.clear(); - po.m_supportdata->level_ids.reserve(sslices.size()); +// if(po.m_supportdata) { // deal with the support slices if present +// std::vector& sslices = po.m_supportdata->support_slices; +// po.m_supportdata->level_ids.clear(); +// po.m_supportdata->level_ids.reserve(sslices.size()); - for(int i = 0; i < int(sslices.size()); ++i) { - LevelID h = sminZ + sih + i * slh; - po.m_supportdata->level_ids.emplace_back(h); +// for(int i = 0; i < int(sslices.size()); ++i) { +// LevelID h = sminZ + sih + i * slh; +// po.m_supportdata->level_ids.emplace_back(h); - float fh = float(double(h) * SCALING_FACTOR); +// float fh = float(double(h) * SCALING_FACTOR); - SLAPrintObject::SliceRecord& sr = po.m_slice_index[fh]; - assert(sr.support_slices_idx == SLAPrintObject::SliceRecord::NONE); - sr.support_slices_idx = SLAPrintObject::SliceRecord::Idx(i); - } - } +// SLAPrintObject::SliceRecord& sr = po.m_slice_index[fh]; +// assert(sr.support_slices_idx == SLAPrintObject::SliceRecord::NONE); +// sr.support_slices_idx = SLAPrintObject::SliceRecord::Idx(i); +// } +// } // Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update status to the 3D preview to load the SLA slices. report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW); @@ -923,31 +978,33 @@ void SLAPrint::process() m_printer_input.clear(); for(SLAPrintObject * o : m_objects) { - auto& po = *o; - std::vector& oslices = po.m_model_slices; +// auto& po = *o; +// std::vector& oslices = po.m_model_slices; - // We need to adjust the min Z level of the slices to be zero - LevelID smfirst = - po.m_supportdata && !po.m_supportdata->level_ids.empty() ? - po.m_supportdata->level_ids.front() : 0; - LevelID mfirst = po.m_level_ids.empty()? 0 : po.m_level_ids.front(); - LevelID gndlvl = -(std::min(smfirst, mfirst)); +// // We need to adjust the min Z level of the slices to be zero +// LevelID smfirst = +// po.m_supportdata && !po.m_supportdata->level_ids.empty() ? +// po.m_supportdata->level_ids.front() : 0; +// LevelID mfirst = po.m_level_ids.empty()? 0 : po.m_level_ids.front(); +// LevelID gndlvl = -(std::min(smfirst, mfirst)); - // now merge this object's support and object slices with the rest - // of the print object slices +// // now merge this object's support and object slices with the rest +// // of the print object slices - for(size_t i = 0; i < oslices.size(); ++i) { - auto& lyrs = m_printer_input[gndlvl + po.m_level_ids[i]]; - lyrs.emplace_back(oslices[i], po.m_instances); - } +// for(size_t i = 0; i < oslices.size(); ++i) { +// auto& lyrs = m_printer_input[gndlvl + po.m_level_ids[i]]; +// lyrs.emplace_back(oslices[i], po.m_instances); +// } - if(!po.m_supportdata) continue; - std::vector& sslices = po.m_supportdata->support_slices; - for(size_t i = 0; i < sslices.size(); ++i) { - LayerRefs& lyrs = - m_printer_input[gndlvl + po.m_supportdata->level_ids[i]]; - lyrs.emplace_back(sslices[i], po.m_instances); - } +// if(!po.m_supportdata) continue; +// std::vector& sslices = po.m_supportdata->support_slices; +// for(size_t i = 0; i < sslices.size(); ++i) { +// LayerRefs& lyrs = +// m_printer_input[gndlvl + po.m_supportdata->level_ids[i]]; +// lyrs.emplace_back(sslices[i], po.m_instances); +// } + +// for(size_t i = 0; i < o->m_sli) } // collect all the keys @@ -1474,11 +1531,7 @@ double SLAPrintObject::get_elevation() const { // its walls but currently it is half of its thickness. Whatever it // will be in the future, we provide the config to the get_pad_elevation // method and we will have the correct value - sla::PoolConfig pcfg; - pcfg.min_wall_height_mm = m_config.pad_wall_height.getFloat(); - pcfg.min_wall_thickness_mm = m_config.pad_wall_thickness.getFloat(); - pcfg.edge_radius_mm = m_config.pad_edge_radius.getFloat(); - pcfg.max_merge_distance_mm = m_config.pad_max_merge_distance.getFloat(); + sla::PoolConfig pcfg = make_pool_config(m_config); ret += sla::get_pad_elevation(pcfg); } @@ -1509,6 +1562,33 @@ const std::vector& SLAPrintObject::get_support_points() const return m_supportdata->support_points; } +SliceIterator SLAPrintObject::get_slices(SliceOrigin so, LevelID k) const +{ + SliceIterator ret = so == soModel ? get_model_slices().end() : + get_support_slices().end(); + + auto it = std::lower_bound(m_slice_index.begin(), + m_slice_index.end(), + k, + SliceRecord::cmpfn); + + if(it != m_slice_index.end()) { + ret = it->get_slices(*this, so); + } + + return ret; +} + +SliceRange SLAPrintObject::get_slices(SliceOrigin so, + float from_level, + float to_level) const +{ + auto from = LevelID(double(from_level) / SCALING_FACTOR); + auto to = LevelID(double(to_level) / SCALING_FACTOR); + + return SliceRange(get_slices(so, from), get_slices(so, to)); +} + const std::vector &SLAPrintObject::get_support_slices() const { // assert(is_step_done(slaposSliceSupports)); @@ -1516,12 +1596,28 @@ const std::vector &SLAPrintObject::get_support_slices() const return m_supportdata->support_slices; } -const SLAPrintObject::SliceIndex &SLAPrintObject::get_slice_index() const +const std::vector& +SLAPrintObject::get_slice_index() const { // assert(is_step_done(slaposIndexSlices)); return m_slice_index; } +std::vector SLAPrintObject::get_slice_levels(float from_eq) const +{ + using SlRec = SLAPrintObject::SliceRecord; + auto it = std::lower_bound(m_slice_index.begin(), + m_slice_index.end(), + from_eq, // model start z + [](const SlRec& sr1, const SlRec& sr2){ + return sr1.slice_level() < sr2.slice_level(); + }); + + std::vector heights; heights.reserve(m_slice_index.size()); + for(; it != m_slice_index.end(); ++it) + heights.emplace_back(it->slice_level()); +} + const std::vector &SLAPrintObject::get_model_slices() const { // assert(is_step_done(slaposObjectSlice)); @@ -1639,4 +1735,18 @@ std::string SLAPrintStatistics::finalize_output_path(const std::string &path_in) return final_path; } +SliceIterator SLAPrintObject::SliceRecord::get_slices(const SLAPrintObject &po, + SliceOrigin so) const +{ + + const std::vector& v = so == soModel? po.get_model_slices() : + po.get_support_slices(); + + Idx idx = so == soModel ? m_model_slices_idx : m_support_slices_idx; + + using DiffT = std::vector::const_iterator::difference_type; + + return idx == NONE? v.end() : v.begin() + DiffT(idx); +} + } // namespace Slic3r diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index c06e2fc77..4d5f1d0da 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -35,12 +35,34 @@ using _SLAPrintObjectBase = // the printer (rasterizer) in the SLAPrint class. using LevelID = long long; +template struct Range { + It from, to; + It begin() const { return from; } + It end() const { return to; } + using Type = It; + + Range() = default; + explicit Range(It &&b, It &&e): + from(std::forward(b)), to(std::forward(e)) {} +}; + +enum SliceOrigin { soSlice, soModel }; + +using SliceStore = std::vector; +using SliceIterator = SliceStore::const_iterator; +using SliceRange = Range; + class SLAPrintObject : public _SLAPrintObjectBase { private: // Prevents erroneous use by other classes. using Inherited = _SLAPrintObjectBase; public: + + // I refuse to grantee copying (Tamas) + SLAPrintObject(const SLAPrintObject&) = delete; + SLAPrintObject& operator=(const SLAPrintObject&) = delete; + const SLAPrintObjectConfig& config() const { return m_config; } const Transform3d& trafo() const { return m_trafo; } @@ -82,6 +104,66 @@ public: // pad is not, then without the pad, otherwise the full value is returned. double get_current_elevation() const; + // This method returns the support points of this SLAPrintObject. + const std::vector& get_support_points() const; + +private: + + // An index record referencing the slices + // (get_model_slices(), get_support_slices()) where the keys are the height + // levels of the model in scaled-clipper coordinates. The levels correspond + // to the z coordinate of the object coordinate system. + class SliceRecord { + public: + using Key = LevelID; + + private: + using Idx = size_t; + static const Idx NONE = Idx(-1); // this will be the max limit of size_t + + LevelID m_print_z = 0; // Top of the layer + float m_slice_z = 0.f; // Exact level of the slice + float m_height = 0.f; // Height of the sliced layer + Idx m_model_slices_idx = NONE; + Idx m_support_slices_idx = NONE; + + public: + + SliceRecord(Key key, float slicez, float height): + m_print_z(key), m_slice_z(slicez), m_height(height) {} + + inline static bool cmpfn(const SliceRecord& sr1, const SliceRecord& sr2) + { + return sr1.key() < sr2.key(); + } + + inline Key key() const { return m_print_z; } + inline float slice_level() const { return m_slice_z; } + inline float layer_height() const { return m_height; } + + SliceIterator get_slices(const SLAPrintObject& po, + SliceOrigin so) const; + + void set_model_slice_idx(Idx id) { m_model_slices_idx = id; } + void set_support_slice_idx(Idx id) { m_support_slices_idx = id; } + }; + + + // Retrieve the slice index which is readable only after slaposIndexSlices + // is done. + const std::vector& get_slice_index() const; + + std::vector get_slice_levels(float from_eq) const; + +public: + + SliceIterator get_slices(SliceOrigin so, LevelID k) const; + + SliceRange get_slices( + SliceOrigin so, + float from_level, + float to_level = std::numeric_limits::infinity()) const; + // These two methods should be callable on the client side (e.g. UI thread) // when the appropriate steps slaposObjectSlice and slaposSliceSupports // are ready. All the print objects are processed before slapsRasterize so @@ -89,33 +171,6 @@ public: const std::vector& get_model_slices() const; const std::vector& get_support_slices() const; - // This method returns the support points of this SLAPrintObject. - const std::vector& get_support_points() const; - - // An index record referencing the slices - // (get_model_slices(), get_support_slices()) where the keys are the height - // levels of the model in scaled-clipper coordinates. The levels correspond - // to the z coordinate of the object coordinate system. - struct SliceRecord { - using Key = float; - - using Idx = size_t; - static const Idx NONE = Idx(-1); // this will be the max limit of size_t - - Idx model_slices_idx = NONE; - Idx support_slices_idx = NONE; - }; - - using SliceIndex = std::map; - - // Retrieve the slice index which is readable only after slaposIndexSlices - // is done. - const SliceIndex& get_slice_index() const; - - // I refuse to grantee copying (Tamas) - SLAPrintObject(const SLAPrintObject&) = delete; - SLAPrintObject& operator=(const SLAPrintObject&) = delete; - protected: // to be called from SLAPrint only. friend class SLAPrint; @@ -154,11 +209,12 @@ private: // Exact (float) height levels mapped to the slices. Each record contains // the index to the model and the support slice vectors. - SliceIndex m_slice_index; + std::vector m_slice_index; // The height levels corrected and scaled up in integer values. This will // be used at rasterization. std::vector m_level_ids; + std::vector m_height_levels; // Caching the transformed (m_trafo) raw mesh of the object mutable CachedObject m_transformed_rmesh; From 0198e717893f7b3766469ec220549507afe6cbbb Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 21 Mar 2019 09:04:11 +0100 Subject: [PATCH 205/236] Implemented issue #1990 --- src/slic3r/GUI/GUI_ObjectList.cpp | 39 ++++++++++++++++++++----------- src/slic3r/GUI/GUI_ObjectList.hpp | 4 ++-- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 2dda6b7cd..928924b3e 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -96,7 +96,7 @@ ObjectList::ObjectList(wxWindow* parent) : #endif //__WXMSW__ }); -// Bind(wxEVT_CHAR, [this](wxKeyEvent& event) { key_event(event); }); // doesn't work on OSX + Bind(wxEVT_CHAR, [this](wxKeyEvent& event) { key_event(event); }); // doesn't work on OSX #ifdef __WXMSW__ GetMainWindow()->Bind(wxEVT_MOTION, [this](wxMouseEvent& event) { @@ -443,8 +443,6 @@ void ObjectList::OnContextMenu(wxDataViewEvent&) if (is_windows10()) fix_through_netfabb(); } - else if (title == _("Extruder")) - show_extruder_selection_menu(); #ifndef __WXMSW__ GetMainWindow()->SetToolTip(""); // hide tooltip @@ -458,7 +456,7 @@ void ObjectList::show_context_menu() if (selected_instances_of_same_object()) wxGetApp().plater()->PopupMenu(&m_menu_instance); else - show_extruder_selection_menu(); + show_multi_selection_menu(); return; } @@ -990,10 +988,14 @@ wxMenuItem* ObjectList::append_menu_item_instance_to_object(wxMenu* menu) [this](wxCommandEvent&) { split_instances(); }, "", menu); } -void ObjectList::append_menu_item_rename(wxMenu* menu) +void ObjectList::append_menu_items_osx(wxMenu* menu) { + append_menu_item(menu, wxID_ANY, _(L("Delete item")), "", + [this](wxCommandEvent&) { remove(); }, "", menu); + append_menu_item(menu, wxID_ANY, _(L("Rename")), "", [this](wxCommandEvent&) { rename_item(); }, "", menu); + menu->AppendSeparator(); } @@ -1016,7 +1018,7 @@ void ObjectList::append_menu_item_export_stl(wxMenu* menu) const void ObjectList::create_object_popupmenu(wxMenu *menu) { #ifdef __WXOSX__ - append_menu_item_rename(menu); + append_menu_items_osx(menu); #endif // __WXOSX__ append_menu_item_export_stl(menu); @@ -1037,7 +1039,7 @@ void ObjectList::create_object_popupmenu(wxMenu *menu) void ObjectList::create_sla_object_popupmenu(wxMenu *menu) { #ifdef __WXOSX__ - append_menu_item_rename(menu); + append_menu_items_osx(menu); #endif // __WXOSX__ append_menu_item_export_stl(menu); @@ -1049,7 +1051,7 @@ void ObjectList::create_sla_object_popupmenu(wxMenu *menu) void ObjectList::create_part_popupmenu(wxMenu *menu) { #ifdef __WXOSX__ - append_menu_item_rename(menu); + append_menu_items_osx(menu); #endif // __WXOSX__ append_menu_item_fix_through_netfabb(menu); @@ -1857,8 +1859,11 @@ void ObjectList::remove() { if (m_objects_model->GetParent(item) == wxDataViewItem(0)) delete_from_model_and_list(itObject, m_objects_model->GetIdByItem(item), -1); - else + else { + if (sels.size() == 1) + select_item(m_objects_model->GetParent(item)); del_subobject_item(item); + } } } @@ -2358,7 +2363,7 @@ void ObjectList::OnEditingDone(wxDataViewEvent &event) _(L("the following characters are not allowed:")) + " <>:/\\|?*\""); } -void ObjectList::show_extruder_selection_menu() +void ObjectList::show_multi_selection_menu() { wxDataViewItemArray sels; GetSelections(sels); @@ -2369,9 +2374,17 @@ void ObjectList::show_extruder_selection_menu() return; wxMenu* menu = new wxMenu(); - append_menu_item(menu, wxID_ANY, _(L("Set extruder for selected items")), - _(L("Select extruder number for selected objects and/or parts")), - [this](wxCommandEvent&) { extruder_selection(); }, "", menu); + +#ifdef __WXOSX__ + append_menu_item(menu, wxID_ANY, _(L("Delete items")), "", + [this](wxCommandEvent&) { remove(); }, "", menu); +#endif //__WXOSX__ + + if (extruders_count() > 1) + append_menu_item(menu, wxID_ANY, _(L("Set extruder for selected items")), + _(L("Select extruder number for selected objects and/or parts")), + [this](wxCommandEvent&) { extruder_selection(); }, "", menu); + PopupMenu(menu); } diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index fa4db8f9d..e0df8dd40 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -184,7 +184,7 @@ public: wxMenuItem* append_menu_item_settings(wxMenu* menu); wxMenuItem* append_menu_item_change_type(wxMenu* menu); wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu); - void append_menu_item_rename(wxMenu* menu); + void append_menu_items_osx(wxMenu* menu); void append_menu_item_fix_through_netfabb(wxMenu* menu); void append_menu_item_export_stl(wxMenu* menu) const ; void create_object_popupmenu(wxMenu *menu); @@ -283,7 +283,7 @@ private: void ItemValueChanged(wxDataViewEvent &event); void OnEditingDone(wxDataViewEvent &event); - void show_extruder_selection_menu(); + void show_multi_selection_menu(); void extruder_selection(); void set_extruder_for_selected_items(const int extruder) const ; From 8105fc33d5d43484e8f4d2bc3c85295e7ed44b44 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 21 Mar 2019 10:46:40 +0100 Subject: [PATCH 206/236] Fixed a merge issue --- src/slic3r/GUI/Tab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 271d8e350..46a6de6ab 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -724,7 +724,7 @@ void Tab::update_visibility() update_page_tree_visibility(); Layout(); -// Thaw(); + Thaw(); update_changed_tree_ui(); } From 213ff2852a247d2ba8d27d750879bf13d3c08190 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 21 Mar 2019 11:44:39 +0100 Subject: [PATCH 207/236] We are getting mysterious crashes on Linux in gtk due to OpenGL context activation GH #1874 #1955. So we are applying a workaround here, just on linux. --- src/slic3r/GUI/GUI_Preview.cpp | 22 ++++++++++------------ src/slic3r/GUI/GUI_Preview.hpp | 4 ++++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index be3fad9ec..e5e2ce6be 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -354,23 +354,14 @@ void Preview::load_print(bool keep_z_range) void Preview::reload_print(bool keep_volumes) { -#ifndef __linux__ - if (m_volumes_cleanup_required || !keep_volumes) - { - m_canvas->reset_volumes(); - m_canvas->reset_legend_texture(); - m_loaded = false; - m_volumes_cleanup_required = false; - } -#endif // __linux__ - +#ifdef __linux__ + // We are getting mysterious crashes on Linux in gtk due to OpenGL context activation GH #1874 #1955. + // So we are applying a workaround here: a delayed release of OpenGL vertex buffers. if (!IsShown()) { m_volumes_cleanup_required = !keep_volumes; return; } - -#ifdef __linux__ if (m_volumes_cleanup_required || !keep_volumes) { m_canvas->reset_volumes(); @@ -378,6 +369,13 @@ void Preview::reload_print(bool keep_volumes) m_loaded = false; m_volumes_cleanup_required = false; } +#else // __linux__ + if (!keep_volumes) + { + m_canvas->reset_volumes(); + m_canvas->reset_legend_texture(); + m_loaded = false; + } #endif // __linux__ load_print(); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 182eaa952..96c49e54f 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -84,7 +84,11 @@ class Preview : public wxPanel BackgroundSlicingProcess* m_process; GCodePreviewData* m_gcode_preview_data; +#ifdef __linux__ + // We are getting mysterious crashes on Linux in gtk due to OpenGL context activation GH #1874 #1955. + // So we are applying a workaround here. bool m_volumes_cleanup_required; +#endif /* __linux__ */ // Calling this function object forces Plater::schedule_background_process. std::function m_schedule_background_process; From f76880cd5e5eed894e6ee0e9fac58ebf4d3e243c Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 21 Mar 2019 11:54:25 +0100 Subject: [PATCH 208/236] Fix and optimization of the previous commit. --- src/slic3r/GUI/GUI_Preview.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index e5e2ce6be..980843e8c 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -174,7 +174,9 @@ Preview::Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_t , m_loaded(false) , m_enabled(false) , m_schedule_background_process(schedule_background_process_func) +#ifdef __linux__ , m_volumes_cleanup_required(false) +#endif // __linux__ { if (init(parent, bed, camera, view_toolbar)) { @@ -362,21 +364,19 @@ void Preview::reload_print(bool keep_volumes) m_volumes_cleanup_required = !keep_volumes; return; } - if (m_volumes_cleanup_required || !keep_volumes) + if ( +#ifdef __linux__ + m_volumes_cleanup_required || +#endif /* __linux__ */ + !keep_volumes) { m_canvas->reset_volumes(); m_canvas->reset_legend_texture(); m_loaded = false; +#ifdef __linux__ m_volumes_cleanup_required = false; +#endif /* __linux__ */ } -#else // __linux__ - if (!keep_volumes) - { - m_canvas->reset_volumes(); - m_canvas->reset_legend_texture(); - m_loaded = false; - } -#endif // __linux__ load_print(); } From f9e3b935d3a8960d51c89c23d74243ed0577ef08 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 21 Mar 2019 12:09:14 +0100 Subject: [PATCH 209/236] Yet another fix. --- src/slic3r/GUI/GUI_Preview.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 980843e8c..9bb6c9790 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -364,6 +364,7 @@ void Preview::reload_print(bool keep_volumes) m_volumes_cleanup_required = !keep_volumes; return; } +#endif /* __linux __ */ if ( #ifdef __linux__ m_volumes_cleanup_required || From d4dde12d0d031970113706a5dd954907776216ed Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 21 Mar 2019 12:25:33 +0100 Subject: [PATCH 210/236] Slic3r compiles with the new slice index interface. --- src/libslic3r/SLAPrint.cpp | 151 +++++++++++++++++++++++---------- src/libslic3r/SLAPrint.hpp | 32 ++++--- src/slic3r/GUI/GLCanvas3D.cpp | 66 +++++++++----- src/slic3r/GUI/GUI_Preview.cpp | 6 +- 4 files changed, 172 insertions(+), 83 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 62ddba84b..938f148a3 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -678,14 +678,7 @@ void SLAPrint::process() po.m_slice_index.emplace_back(slh(h), h - flh / 2.f, flh); } - - using SlRec = SLAPrintObject::SliceRecord; - auto slindex_it = std::lower_bound(po.m_slice_index.begin(), - po.m_slice_index.end(), - float(bb3d.min(Z)), // model start z - [](const SlRec& sr1, const SlRec& sr2){ - return sr1.slice_level() < sr2.slice_level(); - }); + auto slindex_it = po.search_slice_index(float(bb3d.min(Z))); if(slindex_it == po.m_slice_index.end()) throw std::runtime_error(L("Slicing had to be stopped " @@ -715,7 +708,7 @@ void SLAPrint::process() // In this step we check the slices, identify island and cover them with // support points. Then we sprinkle the rest of the mesh. - auto support_points = [this, ilh](SLAPrintObject& po) { + auto support_points = [this](SLAPrintObject& po) { const ModelObject& mo = *po.m_model_object; po.m_supportdata.reset( new SLAPrintObject::SupportData(po.transformed_mesh()) ); @@ -732,8 +725,7 @@ void SLAPrint::process() if (mo.sla_points_status != sla::PointsStatus::UserModified) { // calculate heights of slices (slices are calculated already) - auto&& bb = po.transformed_mesh().bounding_box(); - std::vector heights = po.get_slice_levels(float(bb.min(Z))); + const std::vector& heights = po.m_height_levels; this->throw_if_canceled(); SLAAutoSupports::Config config; @@ -896,7 +888,7 @@ void SLAPrint::process() // We have the layer polygon collection but we need to unite them into // an index where the key is the height level in discrete levels (clipper) - auto index_slices = [this, ilhd](SLAPrintObject& po) { + auto index_slices = [this/*, ilhd*/](SLAPrintObject& /*po*/) { // po.m_slice_index.clear(); // auto sih = LevelID(scale_(ilhd)); @@ -978,6 +970,19 @@ void SLAPrint::process() m_printer_input.clear(); for(SLAPrintObject * o : m_objects) { + LevelID gndlvl = o->get_slice_index().front().key(); + for(auto& slicerecord : o->get_slice_index()) { + auto& lyrs = m_printer_input[slicerecord.key() - gndlvl]; + auto objslit = slicerecord.get_slices(*o, soModel); + auto supslit = slicerecord.get_slices(*o, soSupport); + + if(objslit != o->get_model_slices().end()) + lyrs.emplace_back(*objslit, o->instances()); + + if(supslit != o->get_support_slices().end()) + lyrs.emplace_back(*supslit, o->instances()); + } + // auto& po = *o; // std::vector& oslices = po.m_model_slices; @@ -1003,8 +1008,6 @@ void SLAPrint::process() // m_printer_input[gndlvl + po.m_supportdata->level_ids[i]]; // lyrs.emplace_back(sslices[i], po.m_instances); // } - -// for(size_t i = 0; i < o->m_sli) } // collect all the keys @@ -1306,13 +1309,13 @@ void SLAPrint::fill_statistics() // find highest object // Which is a better bet? To compare by max_z or by number of layers in the index? - double max_z = 0.; + float max_z = 0.; size_t max_layers_cnt = 0; size_t highest_obj_idx = 0; for (SLAPrintObject *&po : m_objects) { const SLAPrintObject::SliceIndex& slice_index = po->get_slice_index(); if (! slice_index.empty()) { - double z = (-- slice_index.end())->first; + float z = (-- slice_index.end())->slice_level(); size_t cnt = slice_index.size(); //if (z > max_z) { if (cnt > max_layers_cnt) { @@ -1332,7 +1335,7 @@ void SLAPrint::fill_statistics() int sliced_layer_cnt = 0; for (const auto& layer : highest_obj_slice_index) { - const double l_height = (layer.first == highest_obj_slice_index.begin()->first) ? init_layer_height : layer_height; + const double l_height = (layer.key() == highest_obj_slice_index.begin()->key()) ? init_layer_height : layer_height; // Calculation of the consumed material @@ -1344,18 +1347,19 @@ void SLAPrint::fill_statistics() const SLAPrintObject::SliceRecord *record = nullptr; { const SLAPrintObject::SliceIndex& index = po->get_slice_index(); - auto key = layer.first; - const SLAPrintObject::SliceIndex::const_iterator it_key = index.lower_bound(key - float(EPSILON)); - if (it_key == index.end() || it_key->first > key + EPSILON) + auto it = po->search_slice_index(layer.slice_level() - float(EPSILON)); + if (it == index.end() || it->slice_level() > layer.slice_level() + float(EPSILON)) continue; - record = &it_key->second; + record = &(*it); } - if (record->model_slices_idx != SLAPrintObject::SliceRecord::NONE) - append(model_polygons, get_all_polygons(po->get_model_slices()[record->model_slices_idx], po->instances())); + auto modelslice_it = record->get_slices(*po, soModel); + if (modelslice_it != po->get_model_slices().end()) + append(model_polygons, get_all_polygons(*modelslice_it, po->instances())); - if (record->support_slices_idx != SLAPrintObject::SliceRecord::NONE) - append(supports_polygons, get_all_polygons(po->get_support_slices()[record->support_slices_idx], po->instances())); + auto supportslice_it = record->get_slices(*po, soSupport); + if (supportslice_it != po->get_support_slices().end()) + append(supports_polygons, get_all_polygons(*supportslice_it, po->instances())); } model_polygons = union_(model_polygons); @@ -1562,15 +1566,74 @@ const std::vector& SLAPrintObject::get_support_points() const return m_supportdata->support_points; } +SLAPrintObject::SliceIndex::iterator +SLAPrintObject::search_slice_index(float slice_level) +{ + SliceRecord query(0, slice_level, 0); + auto it = std::lower_bound(m_slice_index.begin(), m_slice_index.end(), + query, + [](const SliceRecord& r1, const SliceRecord& r2) + { + return r1.slice_level() < r2.slice_level(); + }); + + return it; +} + +SLAPrintObject::SliceIndex::const_iterator +SLAPrintObject::search_slice_index(float slice_level) const +{ + SliceRecord query(0, slice_level, 0); + auto it = std::lower_bound(m_slice_index.cbegin(), m_slice_index.cend(), + query, + [](const SliceRecord& r1, const SliceRecord& r2) + { + return r1.slice_level() < r2.slice_level(); + }); + + return it; +} + +SLAPrintObject::SliceIndex::iterator +SLAPrintObject::search_slice_index(SLAPrintObject::SliceRecord::Key key) +{ + SliceRecord query(key, 0.f, 0.f); + auto it = std::lower_bound(m_slice_index.begin(), m_slice_index.end(), + query, + [](const SliceRecord& r1, const SliceRecord& r2) + { + return r1.key() < r2.key(); + }); + + // Return valid iterator only if the keys really match + if(it != m_slice_index.end() && it->key() != key) it = m_slice_index.end(); + + return it; +} + +SLAPrintObject::SliceIndex::const_iterator +SLAPrintObject::search_slice_index(SLAPrintObject::SliceRecord::Key key) const +{ + SliceRecord query(key, 0.f, 0.f); + auto it = std::lower_bound(m_slice_index.cbegin(), m_slice_index.cend(), + query, + [](const SliceRecord& r1, const SliceRecord& r2) + { + return r1.key() < r2.key(); + }); + + // Return valid iterator only if the keys really match + if(it != m_slice_index.end() && it->key() != key) it = m_slice_index.end(); + + return it; +} + SliceIterator SLAPrintObject::get_slices(SliceOrigin so, LevelID k) const { SliceIterator ret = so == soModel ? get_model_slices().end() : get_support_slices().end(); - auto it = std::lower_bound(m_slice_index.begin(), - m_slice_index.end(), - k, - SliceRecord::cmpfn); + auto it = search_slice_index(k); if(it != m_slice_index.end()) { ret = it->get_slices(*this, so); @@ -1603,20 +1666,22 @@ SLAPrintObject::get_slice_index() const return m_slice_index; } -std::vector SLAPrintObject::get_slice_levels(float from_eq) const -{ - using SlRec = SLAPrintObject::SliceRecord; - auto it = std::lower_bound(m_slice_index.begin(), - m_slice_index.end(), - from_eq, // model start z - [](const SlRec& sr1, const SlRec& sr2){ - return sr1.slice_level() < sr2.slice_level(); - }); +//std::vector SLAPrintObject::get_slice_levels(float from_eq) const +//{ +// using SlRec = SLAPrintObject::SliceRecord; +// auto it = std::lower_bound(m_slice_index.begin(), +// m_slice_index.end(), +// from_eq, // model start z +// [](const SlRec& sr1, const SlRec& sr2){ +// return sr1.slice_level() < sr2.slice_level(); +// }); - std::vector heights; heights.reserve(m_slice_index.size()); - for(; it != m_slice_index.end(); ++it) - heights.emplace_back(it->slice_level()); -} +// std::vector heights; heights.reserve(m_slice_index.size()); +// for(; it != m_slice_index.end(); ++it) +// heights.emplace_back(it->slice_level()); + + +//} const std::vector &SLAPrintObject::get_model_slices() const { @@ -1742,7 +1807,7 @@ SliceIterator SLAPrintObject::SliceRecord::get_slices(const SLAPrintObject &po, const std::vector& v = so == soModel? po.get_model_slices() : po.get_support_slices(); - Idx idx = so == soModel ? m_model_slices_idx : m_support_slices_idx; + size_t idx = so == soModel ? m_model_slices_idx : m_support_slices_idx; using DiffT = std::vector::const_iterator::difference_type; diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 4d5f1d0da..620462875 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -46,7 +46,7 @@ template struct Range { from(std::forward(b)), to(std::forward(e)) {} }; -enum SliceOrigin { soSlice, soModel }; +enum SliceOrigin { soSupport, soModel }; using SliceStore = std::vector; using SliceIterator = SliceStore::const_iterator; @@ -118,25 +118,19 @@ private: using Key = LevelID; private: - using Idx = size_t; - static const Idx NONE = Idx(-1); // this will be the max limit of size_t + static const size_t NONE = size_t(-1); // this will be the max limit of size_t + size_t m_model_slices_idx = NONE; + size_t m_support_slices_idx = NONE; LevelID m_print_z = 0; // Top of the layer float m_slice_z = 0.f; // Exact level of the slice float m_height = 0.f; // Height of the sliced layer - Idx m_model_slices_idx = NONE; - Idx m_support_slices_idx = NONE; public: SliceRecord(Key key, float slicez, float height): m_print_z(key), m_slice_z(slicez), m_height(height) {} - inline static bool cmpfn(const SliceRecord& sr1, const SliceRecord& sr2) - { - return sr1.key() < sr2.key(); - } - inline Key key() const { return m_print_z; } inline float slice_level() const { return m_slice_z; } inline float layer_height() const { return m_height; } @@ -144,16 +138,22 @@ private: SliceIterator get_slices(const SLAPrintObject& po, SliceOrigin so) const; - void set_model_slice_idx(Idx id) { m_model_slices_idx = id; } - void set_support_slice_idx(Idx id) { m_support_slices_idx = id; } + + void set_model_slice_idx(size_t id) { m_model_slices_idx = id; } + void set_support_slice_idx(size_t id) { m_support_slices_idx = id; } + }; + using SliceIndex = std::vector; // Retrieve the slice index which is readable only after slaposIndexSlices // is done. - const std::vector& get_slice_index() const; + const SliceIndex& get_slice_index() const; - std::vector get_slice_levels(float from_eq) const; + SliceIndex::iterator search_slice_index(float slice_level); + SliceIndex::const_iterator search_slice_index(float slice_level) const; + SliceIndex::iterator search_slice_index(SliceRecord::Key key); + SliceIndex::const_iterator search_slice_index(SliceRecord::Key key) const; public: @@ -171,6 +171,10 @@ public: const std::vector& get_model_slices() const; const std::vector& get_support_slices() const; + inline const std::vector& get_height_levels() const { + return m_height_levels; + } + protected: // to be called from SLAPrint only. friend class SLAPrint; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1c09096a8..7bd63aa3c 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4937,32 +4937,52 @@ void GLCanvas3D::_render_sla_slices() const if ((bottom_obj_triangles.empty() || bottom_sup_triangles.empty() || top_obj_triangles.empty() || top_sup_triangles.empty()) && obj->is_step_done(slaposIndexSlices)) { - const std::vector& model_slices = obj->get_model_slices(); - const std::vector& support_slices = obj->get_support_slices(); + // FIXME: is this all right (by Tamas)? + SliceRange model_slices = obj->get_slices(soModel, float(min_z), float(max_z)); + SliceRange support_slices = obj->get_slices(soSupport, float(min_z), float(max_z)); - const SLAPrintObject::SliceIndex& index = obj->get_slice_index(); - SLAPrintObject::SliceIndex::const_iterator it_min_z = std::find_if(index.begin(), index.end(), [min_z](const SLAPrintObject::SliceIndex::value_type& id) -> bool { return std::abs(min_z - id.first) < EPSILON; }); - SLAPrintObject::SliceIndex::const_iterator it_max_z = std::find_if(index.begin(), index.end(), [max_z](const SLAPrintObject::SliceIndex::value_type& id) -> bool { return std::abs(max_z - id.first) < EPSILON; }); + // calculate model bottom cap + if(bottom_obj_triangles.empty() && model_slices.from != obj->get_model_slices().end()) + bottom_obj_triangles = triangulate_expolygons_3d(*model_slices.from, min_z, true); - if (it_min_z != index.end()) - { - // calculate model bottom cap - if (bottom_obj_triangles.empty() && (it_min_z->second.model_slices_idx < model_slices.size())) - bottom_obj_triangles = triangulate_expolygons_3d(model_slices[it_min_z->second.model_slices_idx], min_z, true); - // calculate support bottom cap - if (bottom_sup_triangles.empty() && (it_min_z->second.support_slices_idx < support_slices.size())) - bottom_sup_triangles = triangulate_expolygons_3d(support_slices[it_min_z->second.support_slices_idx], min_z, true); - } + // calculate support bottom cap + if(bottom_sup_triangles.empty() && support_slices.from != obj->get_support_slices().end()) + bottom_sup_triangles = triangulate_expolygons_3d(*support_slices.from, min_z, true); - if (it_max_z != index.end()) - { - // calculate model top cap - if (top_obj_triangles.empty() && (it_max_z->second.model_slices_idx < model_slices.size())) - top_obj_triangles = triangulate_expolygons_3d(model_slices[it_max_z->second.model_slices_idx], max_z, false); - // calculate support top cap - if (top_sup_triangles.empty() && (it_max_z->second.support_slices_idx < support_slices.size())) - top_sup_triangles = triangulate_expolygons_3d(support_slices[it_max_z->second.support_slices_idx], max_z, false); - } + // calculate model top cap + if(top_obj_triangles.empty() && model_slices.to != obj->get_model_slices().end()) + top_obj_triangles = triangulate_expolygons_3d(*model_slices.to, max_z, true); + + // calculate support top cap + if(top_sup_triangles.empty() && support_slices.to != obj->get_support_slices().end()) + top_sup_triangles = triangulate_expolygons_3d(*support_slices.to, max_z, true); + +// const std::vector& model_slices = obj->get_model_slices(); +// const std::vector& support_slices = obj->get_support_slices(); + +// const SLAPrintObject::SliceIndex& index = obj->get_slice_index(); +// SLAPrintObject::SliceIndex::const_iterator it_min_z = std::find_if(index.begin(), index.end(), [min_z](const SLAPrintObject::SliceIndex::value_type& id) -> bool { return std::abs(min_z - id.first) < EPSILON; }); +// SLAPrintObject::SliceIndex::const_iterator it_max_z = std::find_if(index.begin(), index.end(), [max_z](const SLAPrintObject::SliceIndex::value_type& id) -> bool { return std::abs(max_z - id.first) < EPSILON; }); + +// if (it_min_z != index.end()) +// { +// // calculate model bottom cap +// if (bottom_obj_triangles.empty() && (it_min_z->second.model_slices_idx < model_slices.size())) +// bottom_obj_triangles = triangulate_expolygons_3d(model_slices[it_min_z->second.model_slices_idx], min_z, true); +// // calculate support bottom cap +// if (bottom_sup_triangles.empty() && (it_min_z->second.support_slices_idx < support_slices.size())) +// bottom_sup_triangles = triangulate_expolygons_3d(support_slices[it_min_z->second.support_slices_idx], min_z, true); +// } + +// if (it_max_z != index.end()) +// { +// // calculate model top cap +// if (top_obj_triangles.empty() && (it_max_z->second.model_slices_idx < model_slices.size())) +// top_obj_triangles = triangulate_expolygons_3d(model_slices[it_max_z->second.model_slices_idx], max_z, false); +// // calculate support top cap +// if (top_sup_triangles.empty() && (it_max_z->second.support_slices_idx < support_slices.size())) +// top_sup_triangles = triangulate_expolygons_3d(support_slices[it_max_z->second.support_slices_idx], max_z, false); +// } } if (!bottom_obj_triangles.empty() || !top_obj_triangles.empty() || !bottom_sup_triangles.empty() || !top_sup_triangles.empty()) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index be3fad9ec..f691850b4 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -776,10 +776,10 @@ void Preview::load_print_as_sla() double shift_z = obj->get_current_elevation(); if (obj->is_step_done(slaposIndexSlices)) { - const SLAPrintObject::SliceIndex& index = obj->get_slice_index(); - for (const SLAPrintObject::SliceIndex::value_type& id : index) + const std::vector& hlvls = obj->get_height_levels(); + for (float h : hlvls) { - zs.insert(shift_z + id.first); + zs.insert(shift_z + double(h)); } } } From 562343cd2a1b932dcc21ac24d7029c37d2a9c1ce Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 21 Mar 2019 14:33:55 +0100 Subject: [PATCH 211/236] Localization fix of the warning texts in the 3D scene. Improved anti-aliasing of the warning texts in the 3D scene and the G-code legend. A ClearType rendering has been suppressed by rendering of the text into a red channel only. --- src/slic3r/GUI/GLCanvas3D.cpp | 146 ++++++++++++++++++++++++++-------- 1 file changed, 111 insertions(+), 35 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1c09096a8..b08688784 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -34,6 +34,7 @@ #include #include #include +#include // Print now includes tbb, and tbb includes Windows. This breaks compilation of wxWidgets if included before wx. #include "libslic3r/Print.hpp" @@ -1659,13 +1660,69 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool _generate(text, canvas, red_colored); // GUI::GLTexture::reset() is called at the beginning of generate(...) } -bool GLCanvas3D::WarningTexture::_generate(const std::string& msg, const GLCanvas3D& canvas, const bool red_colored/* = false*/) + +#ifdef __WXMSW__ +static bool is_font_cleartype(const wxFont &font) +{ + // Native font description: on MSW, it is a version number plus the content of LOGFONT, separated by semicolon. + wxString font_desc = font.GetNativeFontInfoDesc(); + // Find the quality field. + wxString sep(";"); + size_t startpos = 0; + for (size_t i = 0; i < 12; ++ i) + startpos = font_desc.find(sep, startpos + 1); + ++ startpos; + size_t endpos = font_desc.find(sep, startpos); + int quality = wxAtoi(font_desc(startpos, endpos - startpos)); + return quality == CLEARTYPE_QUALITY; +} + +// ClearType produces renders, which are difficult to convert into an alpha blended OpenGL texture. +// Therefore it is better to disable it, though Vojtech found out, that the font returned with ClearType +// disabled is signifcantly thicker than the default ClearType font. +// This function modifies the font provided. +static void msw_disable_cleartype(wxFont &font) +{ + // Native font description: on MSW, it is a version number plus the content of LOGFONT, separated by semicolon. + wxString font_desc = font.GetNativeFontInfoDesc(); + // Find the quality field. + wxString sep(";"); + size_t startpos_weight = 0; + for (size_t i = 0; i < 5; ++ i) + startpos_weight = font_desc.find(sep, startpos_weight + 1); + ++ startpos_weight; + size_t endpos_weight = font_desc.find(sep, startpos_weight); + // Parse the weight field. + unsigned int weight = atoi(font_desc(startpos_weight, endpos_weight - startpos_weight)); + size_t startpos = endpos_weight; + for (size_t i = 0; i < 6; ++ i) + startpos = font_desc.find(sep, startpos + 1); + ++ startpos; + size_t endpos = font_desc.find(sep, startpos); + int quality = wxAtoi(font_desc(startpos, endpos - startpos)); + if (quality == CLEARTYPE_QUALITY) { + // Replace the weight with a smaller value to compensate the weight of non ClearType font. + wxString sweight = std::to_string(weight * 2 / 4); + size_t len_weight = endpos_weight - startpos_weight; + wxString squality = std::to_string(ANTIALIASED_QUALITY); + font_desc.replace(startpos_weight, len_weight, sweight); + font_desc.replace(startpos + sweight.size() - len_weight, endpos - startpos, squality); + font.SetNativeFontInfo(font_desc); + wxString font_desc2 = font.GetNativeFontInfoDesc(); + } + wxString font_desc2 = font.GetNativeFontInfoDesc(); +} +#endif /* __WXMSW__ */ + +bool GLCanvas3D::WarningTexture::_generate(const std::string& msg_utf8, const GLCanvas3D& canvas, const bool red_colored/* = false*/) { reset(); - if (msg.empty()) + if (msg_utf8.empty()) return false; + wxString msg = GUI::from_u8(msg_utf8); + wxMemoryDC memDC; // select default font const float scale = canvas.get_canvas_size().get_scale_factor(); @@ -1676,46 +1733,47 @@ bool GLCanvas3D::WarningTexture::_generate(const std::string& msg, const GLCanva // calculates texture size wxCoord w, h; -// memDC.GetTextExtent(msg, &w, &h); memDC.GetMultiLineTextExtent(msg, &w, &h); - int pow_of_two_size = next_highest_power_of_2(std::max(w, h)); - m_original_width = (int)w; m_original_height = (int)h; - m_width = pow_of_two_size; - m_height = pow_of_two_size; + m_width = (int)next_highest_power_of_2((uint32_t)w); + m_height = (int)next_highest_power_of_2((uint32_t)h); // generates bitmap wxBitmap bitmap(m_width, m_height); memDC.SelectObject(bitmap); - memDC.SetBackground(wxBrush(wxColour(Background_Color[0], Background_Color[1], Background_Color[2]))); + memDC.SetBackground(wxBrush(*wxBLACK)); memDC.Clear(); // draw message - memDC.SetTextForeground(red_colored ? wxColour(255,72,65/*204,204*/) : *wxWHITE); -// memDC.DrawText(msg, 0, 0); - memDC.DrawLabel(msg, wxRect(0,0, m_original_width, m_original_height), wxALIGN_CENTER); + memDC.SetTextForeground(*wxRED); + memDC.DrawLabel(msg, wxRect(0,0, m_original_width, m_original_height), wxALIGN_CENTER); memDC.SelectObject(wxNullBitmap); // Convert the bitmap into a linear data ready to be loaded into the GPU. wxImage image = bitmap.ConvertToImage(); - image.SetMaskColour(Background_Color[0], Background_Color[1], Background_Color[2]); // prepare buffer std::vector data(4 * m_width * m_height, 0); + const unsigned char *src = image.GetData(); for (int h = 0; h < m_height; ++h) { - int hh = h * m_width; - unsigned char* px_ptr = data.data() + 4 * hh; + unsigned char* dst = data.data() + 4 * h * m_width; for (int w = 0; w < m_width; ++w) { - *px_ptr++ = image.GetRed(w, h); - *px_ptr++ = image.GetGreen(w, h); - *px_ptr++ = image.GetBlue(w, h); - *px_ptr++ = image.IsTransparent(w, h) ? 0 : Opacity; + *dst++ = 255; + if (red_colored) { + *dst++ = 72; // 204 + *dst++ = 65; // 204 + } else { + *dst++ = 255; + *dst++ = 255; + } + *dst++ = (unsigned char)std::min(255, *src); + src += 3; } } @@ -1839,7 +1897,15 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c const int scaled_border = Px_Border * scale; // select default font - const wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale_gl); + wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale_gl); +#ifdef __WXMSW__ + // Disabling ClearType works, but the font returned is very different (much thicker) from the default. +// msw_disable_cleartype(font); + bool cleartype = is_font_cleartype(font); +#else + bool cleartype = false; +#endif /* __WXMSW__ */ + memDC.SetFont(font); mask_memDC.SetFont(font); @@ -1863,10 +1929,8 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c if (items_count > 1) m_original_height += (items_count - 1) * scaled_square_contour; - int pow_of_two_size = (int)next_highest_power_of_2(std::max(m_original_width, m_original_height)); - - m_width = pow_of_two_size; - m_height = pow_of_two_size; + m_width = (int)next_highest_power_of_2((uint32_t)m_original_width); + m_height = (int)next_highest_power_of_2((uint32_t)m_original_height); // generates bitmap wxBitmap bitmap(m_width, m_height); @@ -1883,16 +1947,13 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c // draw title memDC.SetTextForeground(*wxWHITE); - mask_memDC.SetTextForeground(*wxWHITE); + mask_memDC.SetTextForeground(*wxRED); int title_x = scaled_border; int title_y = scaled_border; memDC.DrawText(title, title_x, title_y); mask_memDC.DrawText(title, title_x, title_y); - mask_memDC.SetPen(wxPen(*wxWHITE)); - mask_memDC.SetBrush(wxBrush(*wxWHITE)); - // draw icons contours as background int squares_contour_x = scaled_border; int squares_contour_y = scaled_border + title_height + scaled_title_offset; @@ -1907,7 +1968,6 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c memDC.SetPen(pen); memDC.SetBrush(brush); memDC.DrawRectangle(wxRect(squares_contour_x, squares_contour_y, squares_contour_width, squares_contour_height)); - mask_memDC.DrawRectangle(wxRect(squares_contour_x, squares_contour_y, squares_contour_width, squares_contour_height)); // draw items (colored icon + text) int icon_x = squares_contour_x + scaled_square_contour; @@ -1943,7 +2003,6 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c memDC.DrawRectangle(wxRect(icon_x_inner, icon_y + 1, px_inner_square, px_inner_square)); // draw text - memDC.DrawText(GUI::from_u8(item.text), text_x, icon_y + text_y_offset); mask_memDC.DrawText(GUI::from_u8(item.text), text_x, icon_y + text_y_offset); // update y @@ -1959,17 +2018,34 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c // prepare buffer std::vector data(4 * m_width * m_height, 0); - for (int h = 0; h < m_height; ++h) + const unsigned char *src_image = image.GetData(); + const unsigned char *src_mask = mask_image.GetData(); + for (int h = 0; h < m_height; ++h) { int hh = h * m_width; unsigned char* px_ptr = data.data() + 4 * hh; for (int w = 0; w < m_width; ++w) { - unsigned char alpha = (mask_image.GetRed(w, h) + mask_image.GetGreen(w, h) + mask_image.GetBlue(w, h)) / 3; - *px_ptr++ = image.GetRed(w, h); - *px_ptr++ = image.GetGreen(w, h); - *px_ptr++ = image.GetBlue(w, h); - *px_ptr++ = (alpha == 0) ? 128 : 255; + if (w >= squares_contour_x && w < squares_contour_x + squares_contour_width && + h >= squares_contour_y && h < squares_contour_y + squares_contour_height) { + // Color palette, use the color verbatim. + *px_ptr++ = *src_image++; + *px_ptr++ = *src_image++; + *px_ptr++ = *src_image++; + *px_ptr++ = 255; + } else { + // Text or background + unsigned char alpha = *src_mask; + // Compensate the white color for the 50% opacity reduction at the character edges. + //unsigned char color = (unsigned char)floor(alpha * 255.f / (128.f + 0.5f * alpha)); + unsigned char color = alpha; + *px_ptr++ = color; + *px_ptr++ = color; // *src_mask ++; + *px_ptr++ = color; // *src_mask ++; + *px_ptr++ = 128 + (alpha / 2); // (alpha > 0) ? 255 : 128; + src_image += 3; + } + src_mask += 3; } } From 4be6c17fd358d19e8fce0766a85b081f9315afe5 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 21 Mar 2019 14:56:20 +0100 Subject: [PATCH 212/236] Limit number of perimeters to 10 thousands, that is 50 meters with 0.2mm nozzle. The number of perimeters has to be limited due to a numerical overflow of fixed point 32bit coordinates in the offsetting algorithm. --- src/libslic3r/PrintConfig.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 8c67cc067..630dbfb5f 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1375,6 +1375,7 @@ void PrintConfigDef::init_fff_params() def->sidetext = L("(minimum)"); def->aliases = { "perimeter_offsets" }; def->min = 0; + def->max = 10000; def->default_value = new ConfigOptionInt(3); def = this->add("post_process", coStrings); From 24a5dd4235764cd767e0bdfd7f69ee45f85deba2 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 21 Mar 2019 15:16:33 +0100 Subject: [PATCH 213/236] FIx for broken slice preview --- src/libslic3r/SLAPrint.cpp | 46 ++++++++++++++-------------------- src/libslic3r/SLAPrint.hpp | 12 ++++----- src/slic3r/GUI/GLCanvas3D.cpp | 22 ++++++++-------- src/slic3r/GUI/GUI_Preview.cpp | 6 ++--- 4 files changed, 40 insertions(+), 46 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 938f148a3..e12dc7f23 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -30,7 +30,6 @@ public: std::vector support_points; // all the support points (manual/auto) SupportTreePtr support_tree_ptr; // the supports SlicedSupports support_slices; // sliced supports - std::vector level_ids; inline SupportData(const TriangleMesh& trmesh): emesh(trmesh) {} }; @@ -603,25 +602,9 @@ std::string SLAPrint::validate() const return ""; } -std::vector SLAPrint::calculate_heights(const BoundingBoxf3& bb3d, - float elevation, - float initial_layer_height, - float layer_height) const -{ - std::vector heights; - float minZ = float(bb3d.min(Z)) - float(elevation); - float maxZ = float(bb3d.max(Z)); - auto flh = float(layer_height); - auto gnd = float(bb3d.min(Z)); - - for(float h = minZ + initial_layer_height; h < maxZ; h += flh) - if(h >= gnd) heights.emplace_back(h); - - return heights; -} - template -void report_status(SLAPrint& p, int st, const std::string& msg, Args&&...args) { +void report_status(SLAPrint& p, int st, const std::string& msg, Args&&...args) +{ BOOST_LOG_TRIVIAL(info) << st << "% " << msg; p.set_status(st, msg, std::forward(args)...); } @@ -684,15 +667,17 @@ void SLAPrint::process() throw std::runtime_error(L("Slicing had to be stopped " "due to an internal error.")); - po.m_height_levels.clear(); - po.m_height_levels.reserve(po.m_slice_index.size()); + po.m_model_height_levels.clear(); + po.m_model_height_levels.reserve(po.m_slice_index.size()); for(auto it = slindex_it; it != po.m_slice_index.end(); ++it) - po.m_height_levels.emplace_back(it->slice_level()); + { + po.m_model_height_levels.emplace_back(it->slice_level()); + } TriangleMeshSlicer slicer(&mesh); po.m_model_slices.clear(); - slicer.slice(po.m_height_levels, + slicer.slice(po.m_model_height_levels, float(po.config().slice_closing_radius.value), &po.m_model_slices, [this](){ throw_if_canceled(); }); @@ -725,7 +710,7 @@ void SLAPrint::process() if (mo.sla_points_status != sla::PointsStatus::UserModified) { // calculate heights of slices (slices are calculated already) - const std::vector& heights = po.m_height_levels; + const std::vector& heights = po.m_model_height_levels; this->throw_if_canceled(); SLAAutoSupports::Config config; @@ -1646,10 +1631,17 @@ SliceRange SLAPrintObject::get_slices(SliceOrigin so, float from_level, float to_level) const { - auto from = LevelID(double(from_level) / SCALING_FACTOR); - auto to = LevelID(double(to_level) / SCALING_FACTOR); + auto it_from = search_slice_index(from_level); + auto it_to = search_slice_index(to_level); - return SliceRange(get_slices(so, from), get_slices(so, to)); + SliceRange ret; + + auto endit = so == soModel? get_model_slices().end() : get_support_slices().end(); + + ret.from = it_from == m_slice_index.end() ? endit : it_from->get_slices(*this, so); + ret.to = it_to == m_slice_index.end() ? endit : it_to->get_slices(*this, so); + + return ret; } const std::vector &SLAPrintObject::get_support_slices() const diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 620462875..e86080963 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -171,8 +171,9 @@ public: const std::vector& get_model_slices() const; const std::vector& get_support_slices() const; - inline const std::vector& get_height_levels() const { - return m_height_levels; + inline size_t get_slice_count() const { return m_slice_index.size(); } + inline float get_slice_level(size_t idx) const { + return m_slice_index[idx].slice_level(); } protected: @@ -204,8 +205,10 @@ protected: private: // Object specific configuration, pulled from the configuration layer. SLAPrintObjectConfig m_config; + // Translation in Z + Rotation by Y and Z + Scaling / Mirroring. Transform3d m_trafo = Transform3d::Identity(); + std::vector m_instances; // Individual 2d slice polygons from lower z to higher z levels @@ -215,10 +218,7 @@ private: // the index to the model and the support slice vectors. std::vector m_slice_index; - // The height levels corrected and scaled up in integer values. This will - // be used at rasterization. - std::vector m_level_ids; - std::vector m_height_levels; + std::vector m_model_height_levels; // Caching the transformed (m_trafo) raw mesh of the object mutable CachedObject m_transformed_rmesh; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7bd63aa3c..90656c93b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4938,24 +4938,26 @@ void GLCanvas3D::_render_sla_slices() const if ((bottom_obj_triangles.empty() || bottom_sup_triangles.empty() || top_obj_triangles.empty() || top_sup_triangles.empty()) && obj->is_step_done(slaposIndexSlices)) { // FIXME: is this all right (by Tamas)? - SliceRange model_slices = obj->get_slices(soModel, float(min_z), float(max_z)); - SliceRange support_slices = obj->get_slices(soSupport, float(min_z), float(max_z)); + SliceRange obj_range = obj->get_slices(soModel, float(min_z), float(max_z)); + SliceRange sup_range = obj->get_slices(soSupport, float(min_z), float(max_z)); + auto obj_end = obj->get_model_slices().end(); + auto sup_end = obj->get_support_slices().end(); // calculate model bottom cap - if(bottom_obj_triangles.empty() && model_slices.from != obj->get_model_slices().end()) - bottom_obj_triangles = triangulate_expolygons_3d(*model_slices.from, min_z, true); + if(bottom_obj_triangles.empty() && obj_range.from != obj_end) + bottom_obj_triangles = triangulate_expolygons_3d(*obj_range.from, min_z, true); // calculate support bottom cap - if(bottom_sup_triangles.empty() && support_slices.from != obj->get_support_slices().end()) - bottom_sup_triangles = triangulate_expolygons_3d(*support_slices.from, min_z, true); + if(bottom_sup_triangles.empty() && sup_range.from != sup_end) + bottom_sup_triangles = triangulate_expolygons_3d(*sup_range.from, min_z, true); // calculate model top cap - if(top_obj_triangles.empty() && model_slices.to != obj->get_model_slices().end()) - top_obj_triangles = triangulate_expolygons_3d(*model_slices.to, max_z, true); + if(top_obj_triangles.empty() && obj_range.to != obj_end) + top_obj_triangles = triangulate_expolygons_3d(*obj_range.to, max_z, false); // calculate support top cap - if(top_sup_triangles.empty() && support_slices.to != obj->get_support_slices().end()) - top_sup_triangles = triangulate_expolygons_3d(*support_slices.to, max_z, true); + if(top_sup_triangles.empty() && sup_range.to != sup_end) + top_sup_triangles = triangulate_expolygons_3d(*sup_range.to, max_z, false); // const std::vector& model_slices = obj->get_model_slices(); // const std::vector& support_slices = obj->get_support_slices(); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index f691850b4..477673342 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -776,10 +776,10 @@ void Preview::load_print_as_sla() double shift_z = obj->get_current_elevation(); if (obj->is_step_done(slaposIndexSlices)) { - const std::vector& hlvls = obj->get_height_levels(); - for (float h : hlvls) + size_t cnt = obj->get_slice_count(); + for (size_t i = 0; i < cnt; i++) { - zs.insert(shift_z + double(h)); + zs.insert(shift_z + double(obj->get_slice_level(i))); } } } From 63a899b239a6ee8717102871aaea0122aab1ed34 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 21 Mar 2019 16:14:26 +0100 Subject: [PATCH 214/236] Using same slicing grid for the supports and the model. --- src/libslic3r/SLA/SLASupportTree.cpp | 12 ++++++++ src/libslic3r/SLA/SLASupportTree.hpp | 2 ++ src/libslic3r/SLAPrint.cpp | 45 +++++++--------------------- src/libslic3r/SLAPrint.hpp | 35 ++++++++++++++++++---- 4 files changed, 54 insertions(+), 40 deletions(-) diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index df9990822..34dd80cee 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -2240,6 +2240,18 @@ SlicedSupports SLASupportTree::slice(float layerh, float init_layerh) const return ret; } +SlicedSupports SLASupportTree::slice(const std::vector &heights, + float cr) const +{ + TriangleMesh fullmesh = m_impl->merged_mesh(); + fullmesh.merge(get_pad()); + TriangleMeshSlicer slicer(&fullmesh); + SlicedSupports ret; + slicer.slice(heights, cr, &ret, get().ctl().cancelfn); + + return ret; +} + const TriangleMesh &SLASupportTree::add_pad(const SliceLayer& baseplate, const PoolConfig& pcfg) const { diff --git a/src/libslic3r/SLA/SLASupportTree.hpp b/src/libslic3r/SLA/SLASupportTree.hpp index 74d7da9ca..66677e4d7 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SLASupportTree.hpp @@ -181,6 +181,8 @@ public: /// Get the sliced 2d layers of the support geometry. SlicedSupports slice(float layerh, float init_layerh = -1.0) const; + SlicedSupports slice(const std::vector&, float closing_radius) const; + /// Adding the "pad" (base pool) under the supports const TriangleMesh& add_pad(const SliceLayer& baseplate, const PoolConfig& pcfg) const; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index e12dc7f23..bbf53ef7e 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -856,11 +856,19 @@ void SLAPrint::process() // Slicing the support geometries similarly to the model slicing procedure. // If the pad had been added previously (see step "base_pool" than it will // be part of the slices) - auto slice_supports = [ilh](SLAPrintObject& po) { + auto slice_supports = [](SLAPrintObject& po) { auto& sd = po.m_supportdata; if(sd && sd->support_tree_ptr) { - auto lh = float(po.m_config.layer_height.getFloat()); - sd->support_slices = sd->support_tree_ptr->slice(lh, ilh); + sd->support_slices.clear(); + + std::vector heights; heights.reserve(po.m_slice_index.size()); + + for(auto& rec : po.m_slice_index) { + heights.emplace_back(rec.slice_level()); + } + + sd->support_slices = sd->support_tree_ptr->slice( + heights, float(po.config().slice_closing_radius.value)); } for(size_t i = 0; @@ -1613,20 +1621,6 @@ SLAPrintObject::search_slice_index(SLAPrintObject::SliceRecord::Key key) const return it; } -SliceIterator SLAPrintObject::get_slices(SliceOrigin so, LevelID k) const -{ - SliceIterator ret = so == soModel ? get_model_slices().end() : - get_support_slices().end(); - - auto it = search_slice_index(k); - - if(it != m_slice_index.end()) { - ret = it->get_slices(*this, so); - } - - return ret; -} - SliceRange SLAPrintObject::get_slices(SliceOrigin so, float from_level, float to_level) const @@ -1658,23 +1652,6 @@ SLAPrintObject::get_slice_index() const return m_slice_index; } -//std::vector SLAPrintObject::get_slice_levels(float from_eq) const -//{ -// using SlRec = SLAPrintObject::SliceRecord; -// auto it = std::lower_bound(m_slice_index.begin(), -// m_slice_index.end(), -// from_eq, // model start z -// [](const SlRec& sr1, const SlRec& sr2){ -// return sr1.slice_level() < sr2.slice_level(); -// }); - -// std::vector heights; heights.reserve(m_slice_index.size()); -// for(; it != m_slice_index.end(); ++it) -// heights.emplace_back(it->slice_level()); - - -//} - const std::vector &SLAPrintObject::get_model_slices() const { // assert(is_step_done(slaposObjectSlice)); diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index e86080963..3e0a0c5e3 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -122,7 +122,7 @@ private: size_t m_model_slices_idx = NONE; size_t m_support_slices_idx = NONE; - LevelID m_print_z = 0; // Top of the layer + LevelID m_print_z = 0; // Top of the layer float m_slice_z = 0.f; // Exact level of the slice float m_height = 0.f; // Height of the sliced layer @@ -131,34 +131,54 @@ private: SliceRecord(Key key, float slicez, float height): m_print_z(key), m_slice_z(slicez), m_height(height) {} + // The key will be the integer height level of the top of the layer. inline Key key() const { return m_print_z; } + + // Returns the exact floating point Z coordinate of the slice inline float slice_level() const { return m_slice_z; } + + // Returns the current layer height inline float layer_height() const { return m_height; } - SliceIterator get_slices(const SLAPrintObject& po, - SliceOrigin so) const; - + // Returns the slices for eighter the model or the supports. The return + // value is an iterator to po.get_model_slices() or po.get_support_slices + // depending on the SliceOrigin parameter. + SliceIterator get_slices(const SLAPrintObject& po, SliceOrigin so) const; + // Methods for setting the indixes into the slice vectors. void set_model_slice_idx(size_t id) { m_model_slices_idx = id; } void set_support_slice_idx(size_t id) { m_support_slices_idx = id; } - }; + // Slice index will be a plain vector sorted by the integer height levels using SliceIndex = std::vector; // Retrieve the slice index which is readable only after slaposIndexSlices // is done. const SliceIndex& get_slice_index() const; + // Search slice index for the closest slice to the given level SliceIndex::iterator search_slice_index(float slice_level); SliceIndex::const_iterator search_slice_index(float slice_level) const; + + // Search the slice index for a particular level in integer coordinates. + // If no such layer is present, it will return m_slice_index.end() SliceIndex::iterator search_slice_index(SliceRecord::Key key); SliceIndex::const_iterator search_slice_index(SliceRecord::Key key) const; public: - SliceIterator get_slices(SliceOrigin so, LevelID k) const; + // ///////////////////////////////////////////////////////////////////////// + // The following methods can be used after the model and the support slicing + // steps have been succesfully finished. + // ///////////////////////////////////////////////////////////////////////// + // Getting slices for either the model or the supports for a particular + // height ID. +// SliceIterator get_slices(SliceOrigin so, LevelID k) const; + + // Getting slices (model or supports) for a Z coordinate range. The returned + // iterators should include the slices for the given boundaries as well. SliceRange get_slices( SliceOrigin so, float from_level, @@ -171,7 +191,10 @@ public: const std::vector& get_model_slices() const; const std::vector& get_support_slices() const; + // Returns the total number of slices in the slice grid (model and supports) inline size_t get_slice_count() const { return m_slice_index.size(); } + + // One can query the Z coordinate of the slice for a given inline float get_slice_level(size_t idx) const { return m_slice_index[idx].slice_level(); } From 5e646562cd2194cb03c80f68b871a6b3f9636d52 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 21 Mar 2019 18:01:41 +0100 Subject: [PATCH 215/236] Fixes for the duplicated layer issues... --- src/libslic3r/SLAPrint.cpp | 51 ++++++++++++++++++++-------------- src/libslic3r/SLAPrint.hpp | 51 ++++++++++++++++++---------------- src/slic3r/GUI/GUI_Preview.cpp | 2 +- 3 files changed, 58 insertions(+), 46 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index bbf53ef7e..58386c0bd 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -615,12 +615,19 @@ void SLAPrint::process() using namespace sla; using ExPolygon = Slic3r::ExPolygon; + if(m_objects.empty()) return; + // Assumption: at this point the print objects should be populated only with // the model objects we have to process and the instances are also filtered // shortcut to initial layer height double ilhd = m_material_config.initial_layer_height.getFloat(); auto ilh = float(ilhd); + double lhd = m_objects.front()->m_config.layer_height.getFloat(); + float lh = float(lhd); + + LevelID ilhs = ilhd / SCALING_FACTOR; + LevelID lhs = lhd / SCALING_FACTOR; const size_t objcount = m_objects.size(); const unsigned min_objstatus = 0; // where the per object operations start @@ -641,24 +648,26 @@ void SLAPrint::process() // Slicing the model object. This method is oversimplified and needs to // be compared with the fff slicing algorithm for verification - auto slice_model = [this, ilh](SLAPrintObject& po) { + auto slice_model = [this, ilhs, lhs, ilh, lh](SLAPrintObject& po) { TriangleMesh mesh = po.transformed_mesh(); // We need to prepare the slice index... auto&& bb3d = mesh.bounding_box(); - float minZ = float(bb3d.min(Z)) - float(po.get_elevation()); - float maxZ = float(bb3d.max(Z)); - auto flh = float(po.m_config.layer_height.getFloat()); + double minZ = bb3d.min(Z) - po.get_elevation(); + double maxZ = bb3d.max(Z); + + LevelID minZs = minZ / SCALING_FACTOR; + LevelID maxZs = maxZ / SCALING_FACTOR; auto slh = [](float h) { return LevelID( double(h) / SCALING_FACTOR); }; po.m_slice_index.clear(); - po.m_slice_index.reserve(size_t(maxZ - (minZ + ilh) / flh) + 1); - po.m_slice_index.emplace_back(slh(minZ + ilh), minZ + ilh / 2.f, ilh); + po.m_slice_index.reserve(size_t(maxZs - (minZs + ilhs) / lhs) + 1); + po.m_slice_index.emplace_back(minZs + ilhs, minZ + ilh / 2.f, ilh); - for(float h = minZ + ilh + flh; h <= maxZ; h += flh) { - po.m_slice_index.emplace_back(slh(h), h - flh / 2.f, flh); + for(LevelID h = minZs + ilhs + lhs; h <= maxZs; h += lhs) { + po.m_slice_index.emplace_back(h, h*SCALING_FACTOR - lh / 2.f, lh); } auto slindex_it = po.search_slice_index(float(bb3d.min(Z))); @@ -1337,7 +1346,7 @@ void SLAPrint::fill_statistics() for (SLAPrintObject * po : m_objects) { - const SLAPrintObject::SliceRecord *record = nullptr; + const SLAPrintObject::_SliceRecord *record = nullptr; { const SLAPrintObject::SliceIndex& index = po->get_slice_index(); auto it = po->search_slice_index(layer.slice_level() - float(EPSILON)); @@ -1562,10 +1571,10 @@ const std::vector& SLAPrintObject::get_support_points() const SLAPrintObject::SliceIndex::iterator SLAPrintObject::search_slice_index(float slice_level) { - SliceRecord query(0, slice_level, 0); + _SliceRecord query(0, slice_level, 0); auto it = std::lower_bound(m_slice_index.begin(), m_slice_index.end(), query, - [](const SliceRecord& r1, const SliceRecord& r2) + [](const _SliceRecord& r1, const _SliceRecord& r2) { return r1.slice_level() < r2.slice_level(); }); @@ -1576,10 +1585,10 @@ SLAPrintObject::search_slice_index(float slice_level) SLAPrintObject::SliceIndex::const_iterator SLAPrintObject::search_slice_index(float slice_level) const { - SliceRecord query(0, slice_level, 0); + _SliceRecord query(0, slice_level, 0); auto it = std::lower_bound(m_slice_index.cbegin(), m_slice_index.cend(), query, - [](const SliceRecord& r1, const SliceRecord& r2) + [](const _SliceRecord& r1, const _SliceRecord& r2) { return r1.slice_level() < r2.slice_level(); }); @@ -1588,12 +1597,12 @@ SLAPrintObject::search_slice_index(float slice_level) const } SLAPrintObject::SliceIndex::iterator -SLAPrintObject::search_slice_index(SLAPrintObject::SliceRecord::Key key) +SLAPrintObject::search_slice_index(SLAPrintObject::_SliceRecord::Key key) { - SliceRecord query(key, 0.f, 0.f); + _SliceRecord query(key, 0.f, 0.f); auto it = std::lower_bound(m_slice_index.begin(), m_slice_index.end(), query, - [](const SliceRecord& r1, const SliceRecord& r2) + [](const _SliceRecord& r1, const _SliceRecord& r2) { return r1.key() < r2.key(); }); @@ -1605,12 +1614,12 @@ SLAPrintObject::search_slice_index(SLAPrintObject::SliceRecord::Key key) } SLAPrintObject::SliceIndex::const_iterator -SLAPrintObject::search_slice_index(SLAPrintObject::SliceRecord::Key key) const +SLAPrintObject::search_slice_index(SLAPrintObject::_SliceRecord::Key key) const { - SliceRecord query(key, 0.f, 0.f); + _SliceRecord query(key, 0.f, 0.f); auto it = std::lower_bound(m_slice_index.cbegin(), m_slice_index.cend(), query, - [](const SliceRecord& r1, const SliceRecord& r2) + [](const _SliceRecord& r1, const _SliceRecord& r2) { return r1.key() < r2.key(); }); @@ -1645,7 +1654,7 @@ const std::vector &SLAPrintObject::get_support_slices() const return m_supportdata->support_slices; } -const std::vector& +const std::vector& SLAPrintObject::get_slice_index() const { // assert(is_step_done(slaposIndexSlices)); @@ -1769,7 +1778,7 @@ std::string SLAPrintStatistics::finalize_output_path(const std::string &path_in) return final_path; } -SliceIterator SLAPrintObject::SliceRecord::get_slices(const SLAPrintObject &po, +SliceIterator SLAPrintObject::_SliceRecord::get_slices(const SLAPrintObject &po, SliceOrigin so) const { diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 3e0a0c5e3..b33bfdeb0 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -107,30 +107,21 @@ public: // This method returns the support points of this SLAPrintObject. const std::vector& get_support_points() const; -private: - - // An index record referencing the slices - // (get_model_slices(), get_support_slices()) where the keys are the height - // levels of the model in scaled-clipper coordinates. The levels correspond - // to the z coordinate of the object coordinate system. class SliceRecord { public: using Key = LevelID; private: - static const size_t NONE = size_t(-1); // this will be the max limit of size_t - size_t m_model_slices_idx = NONE; - size_t m_support_slices_idx = NONE; - LevelID m_print_z = 0; // Top of the layer float m_slice_z = 0.f; // Exact level of the slice float m_height = 0.f; // Height of the sliced layer - public: - + protected: SliceRecord(Key key, float slicez, float height): m_print_z(key), m_slice_z(slicez), m_height(height) {} + public: + // The key will be the integer height level of the top of the layer. inline Key key() const { return m_print_z; } @@ -139,8 +130,25 @@ private: // Returns the current layer height inline float layer_height() const { return m_height; } + }; - // Returns the slices for eighter the model or the supports. The return +private: + + // An index record referencing the slices + // (get_model_slices(), get_support_slices()) where the keys are the height + // levels of the model in scaled-clipper coordinates. The levels correspond + // to the z coordinate of the object coordinate system. + class _SliceRecord: public SliceRecord { + private: + static const size_t NONE = size_t(-1); // this will be the max limit of size_t + size_t m_model_slices_idx = NONE; + size_t m_support_slices_idx = NONE; + + public: + _SliceRecord(Key key, float slicez, float height): + SliceRecord(key, slicez, height) {} + + // Returns the slices for either the model or the supports. The return // value is an iterator to po.get_model_slices() or po.get_support_slices // depending on the SliceOrigin parameter. SliceIterator get_slices(const SLAPrintObject& po, SliceOrigin so) const; @@ -151,7 +159,7 @@ private: }; // Slice index will be a plain vector sorted by the integer height levels - using SliceIndex = std::vector; + using SliceIndex = std::vector<_SliceRecord>; // Retrieve the slice index which is readable only after slaposIndexSlices // is done. @@ -163,8 +171,8 @@ private: // Search the slice index for a particular level in integer coordinates. // If no such layer is present, it will return m_slice_index.end() - SliceIndex::iterator search_slice_index(SliceRecord::Key key); - SliceIndex::const_iterator search_slice_index(SliceRecord::Key key) const; + SliceIndex::iterator search_slice_index(_SliceRecord::Key key); + SliceIndex::const_iterator search_slice_index(_SliceRecord::Key key) const; public: @@ -173,10 +181,6 @@ public: // steps have been succesfully finished. // ///////////////////////////////////////////////////////////////////////// - // Getting slices for either the model or the supports for a particular - // height ID. -// SliceIterator get_slices(SliceOrigin so, LevelID k) const; - // Getting slices (model or supports) for a Z coordinate range. The returned // iterators should include the slices for the given boundaries as well. SliceRange get_slices( @@ -194,9 +198,8 @@ public: // Returns the total number of slices in the slice grid (model and supports) inline size_t get_slice_count() const { return m_slice_index.size(); } - // One can query the Z coordinate of the slice for a given - inline float get_slice_level(size_t idx) const { - return m_slice_index[idx].slice_level(); + inline const SliceRecord& get_slice_record(size_t idx) const { + return m_slice_index[idx]; } protected: @@ -239,7 +242,7 @@ private: // Exact (float) height levels mapped to the slices. Each record contains // the index to the model and the support slice vectors. - std::vector m_slice_index; + std::vector<_SliceRecord> m_slice_index; std::vector m_model_height_levels; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 148b83081..10a4a12c7 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -778,7 +778,7 @@ void Preview::load_print_as_sla() size_t cnt = obj->get_slice_count(); for (size_t i = 0; i < cnt; i++) { - zs.insert(shift_z + double(obj->get_slice_level(i))); + zs.insert(shift_z + obj->get_slice_record(i).key() * SCALING_FACTOR); } } } From a5fd9a34e88b22cdde9883516637d1786f86efba Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 22 Mar 2019 09:47:40 +0100 Subject: [PATCH 216/236] Do not consider modifiers when centering an object after 3mf and amf import --- src/libslic3r/Model.cpp | 6 +++++- src/libslic3r/Model.hpp | 4 ++++ src/slic3r/GUI/Plater.cpp | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 68f71c308..f9db9fea0 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -997,12 +997,16 @@ Polygon ModelObject::convex_hull_2d(const Transform3d &trafo_instance) return hull; } +#if ENABLE_VOLUMES_CENTERING_FIXES +void ModelObject::center_around_origin(bool include_modifiers) +#else void ModelObject::center_around_origin() +#endif // ENABLE_VOLUMES_CENTERING_FIXES { // calculate the displacements needed to // center this object around the origin #if ENABLE_VOLUMES_CENTERING_FIXES - BoundingBoxf3 bb = full_raw_mesh_bounding_box(); + BoundingBoxf3 bb = include_modifiers ? full_raw_mesh_bounding_box() : raw_mesh_bounding_box(); #else BoundingBoxf3 bb; for (ModelVolume *v : this->volumes) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 1260500ee..8a48f8ee9 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -236,7 +236,11 @@ public: // This method is used by the auto arrange function. Polygon convex_hull_2d(const Transform3d &trafo_instance); +#if ENABLE_VOLUMES_CENTERING_FIXES + void center_around_origin(bool include_modifiers = true); +#else void center_around_origin(); +#endif // ENABLE_VOLUMES_CENTERING_FIXES void ensure_on_bed(); void translate_instances(const Vec3d& vector); void translate_instance(size_t instance_idx, const Vec3d& vector); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 2acc2cec4..906a5009a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1617,7 +1617,11 @@ std::vector Plater::priv::load_files(const std::vector& input_ if (type_3mf || type_any_amf) { #endif // !ENABLE_VOLUMES_CENTERING_FIXES for (ModelObject* model_object : model.objects) { +#if ENABLE_VOLUMES_CENTERING_FIXES + model_object->center_around_origin(false); +#else model_object->center_around_origin(); +#endif // ENABLE_VOLUMES_CENTERING_FIXES model_object->ensure_on_bed(); } #if !ENABLE_VOLUMES_CENTERING_FIXES From 0848617fd37e16f9404a208192d0dc8f9e18925a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 22 Mar 2019 10:56:51 +0100 Subject: [PATCH 217/236] SLA gizmo fix: adding points to selection by Shift+click should now work again (was broken by 8466c55) --- src/slic3r/GUI/GLCanvas3D.cpp | 8 ++++---- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index b08688784..1bcc53efd 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3521,6 +3521,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) _update_gizmos_data(); m_dirty = true; } + else if (evt.LeftDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::LeftDown, Vec2d(pos(0), pos(1)), evt.ShiftDown())) + { + // the gizmo got the event and took some action, there is no need to do anything more + } else if (evt.LeftDown() && !m_selection.is_empty() && m_gizmos.grabber_contains_mouse()) { _update_gizmos_data(); @@ -3536,10 +3540,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } - else if (evt.LeftDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::LeftDown, Vec2d(pos(0), pos(1)), evt.ShiftDown())) - { - // the gizmo got the event and took some action, there is no need to do anything more - } else if ((selected_object_idx != -1) && evt.RightDown() && m_gizmos.get_current_type() == Gizmos::SlaSupports && m_gizmos.gizmo_event(SLAGizmoEventType::RightDown)) { // event was taken care of by the SlaSupports gizmo diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 619ae3b3f..c629f2172 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -328,6 +328,10 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous // left down without selection rectangle - place point on the mesh: if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle_active && !shift_down) { + // If any point is in hover state, this should initiate its move - return control back to GLCanvas: + if (m_hover_id != -1) + return false; + // If there is some selection, don't add new point and deselect everything instead. if (m_selection_empty) { try { From bbb2a6d714d0c89f00847b47b1569b0849dd4f60 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 22 Mar 2019 11:51:10 +0100 Subject: [PATCH 218/236] Fixed non-uniform scale of single volumes selection when made using the sidebar matrix fields --- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index f759250b3..6c8fdcab7 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -209,8 +209,8 @@ void ObjectManipulation::update_settings_value(const Selection& selection) m_new_position = volume->get_volume_offset(); m_new_rotation = volume->get_volume_rotation(); m_new_scale = volume->get_volume_scaling_factor(); - m_new_size = volume->get_instance_transformation().get_matrix(true, true) * volume->get_volume_transformation().get_matrix(true, true) * volume->bounding_box.size(); - m_new_enabled = true; + m_new_size = volume->get_volume_transformation().get_matrix(true, true) * volume->bounding_box.size(); + m_new_enabled = true; } else if (wxGetApp().obj_list()->multiple_selection()) { From f5516f24c444d26c0c791f4c239eb35ba60f9f37 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 22 Mar 2019 12:11:23 +0100 Subject: [PATCH 219/236] Fix of 1.42 beta crash when deleting printer profile created by configuration assistant #1985 Fixed an issue, where deleting a profile did not correctly update profile dependences, and deleting a profile would not test dirty status of depending profiles, which would be switched thus user changes would be lost. Fixed enabling / disabling the --default FFF-- / --default SLA-- profiles when deleting the last printer profile. Little refactoring (don't compare by strings but by symbolic names). Making a copy of a profile - "Copy" suffix is added to a system profile. --- src/slic3r/GUI/Preset.cpp | 21 ++++++--- src/slic3r/GUI/Preset.hpp | 5 ++- src/slic3r/GUI/Tab.cpp | 94 ++++++++++++++++++++++++--------------- src/slic3r/GUI/Tab.hpp | 3 +- 4 files changed, 79 insertions(+), 44 deletions(-) diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 656658b0b..e63ae32f7 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -740,6 +740,8 @@ void PresetCollection::save_current_preset(const std::string &new_name) return; // Overwriting an existing preset. preset.config = std::move(m_edited_preset.config); + // The newly saved preset will be activated -> make it visible. + preset.is_visible = true; } else { // Creating a new preset. Preset &preset = *m_presets.insert(it, m_edited_preset); @@ -761,18 +763,20 @@ void PresetCollection::save_current_preset(const std::string &new_name) preset.is_default = false; preset.is_system = false; preset.is_external = false; - } + // The newly saved preset will be activated -> make it visible. + preset.is_visible = true; + } // 2) Activate the saved preset. this->select_preset_by_name(new_name, true); // 2) Store the active preset to disk. this->get_selected_preset().save(); } -void PresetCollection::delete_current_preset() +bool PresetCollection::delete_current_preset() { const Preset &selected = this->get_selected_preset(); - if (selected.is_default) - return; + if (selected.is_default) + return false; if (! selected.is_external && ! selected.is_system) { // Erase the preset file. boost::nowide::remove(selected.file.c_str()); @@ -786,6 +790,7 @@ void PresetCollection::delete_current_preset() if (new_selected_idx == m_presets.size()) for (--new_selected_idx; new_selected_idx > 0 && !m_presets[new_selected_idx].is_visible; --new_selected_idx); this->select_preset(new_selected_idx); + return true; } bool PresetCollection::load_bitmap_default(const std::string &file_name) @@ -843,7 +848,9 @@ void PresetCollection::set_default_suppressed(bool default_suppressed) { if (m_default_suppressed != default_suppressed) { m_default_suppressed = default_suppressed; - m_presets.front().is_visible = ! default_suppressed || (m_presets.size() > m_num_default_presets && m_idx_selected > 0); + bool default_visible = ! default_suppressed || m_idx_selected < m_num_default_presets; + for (size_t i = 0; i < m_num_default_presets; ++ i) + m_presets[i].is_visible = default_visible; } } @@ -1114,7 +1121,9 @@ Preset& PresetCollection::select_preset(size_t idx) idx = first_visible_idx(); m_idx_selected = idx; m_edited_preset = m_presets[idx]; - m_presets.front().is_visible = ! m_default_suppressed || m_idx_selected == 0; + bool default_visible = ! m_default_suppressed || m_idx_selected < m_num_default_presets; + for (size_t i = 0; i < m_num_default_presets; ++i) + m_presets[i].is_visible = default_visible; return m_presets[idx]; } diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index 511313715..c84c37029 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -115,6 +115,8 @@ public: // Is this preset compatible with the currently active printer? bool is_compatible = true; + bool is_user() const { return ! this->is_default && ! this->is_system; } + // Name of the preset, usually derived form the file name. std::string name; // File name of the preset. This could be a Print / Filament / Printer preset, @@ -269,7 +271,8 @@ public: void save_current_preset(const std::string &new_name); // Delete the current preset, activate the first visible preset. - void delete_current_preset(); + // returns true if the preset was deleted successfully. + bool delete_current_preset(); // Load default bitmap to be placed at the wxBitmapComboBox of a MainFrame. bool load_bitmap_default(const std::string &file_name); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 46a6de6ab..d38e96ca2 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -385,7 +385,7 @@ void Tab::update_changed_ui() if (m_postpone_update_ui) return; - const bool deep_compare = (m_name == "printer" || m_name == "sla_material"); + const bool deep_compare = (m_type == Slic3r::Preset::TYPE_PRINTER || m_type == Slic3r::Preset::TYPE_SLA_MATERIAL); auto dirty_options = m_presets->current_dirty_options(deep_compare); auto nonsys_options = m_presets->current_different_from_parent_options(deep_compare); if (m_type == Slic3r::Preset::TYPE_PRINTER) { @@ -2395,7 +2395,7 @@ void Tab::load_current_preset() (preset.is_default || preset.is_system) ? m_btn_delete_preset->Disable() : m_btn_delete_preset->Enable(true); update(); - if (m_name == "printer") { + if (m_type == Slic3r::Preset::TYPE_PRINTER) { // For the printer profile, generate the extruder pages. if (preset.printer_technology() == ptFFF) on_preset_loaded(); @@ -2425,7 +2425,7 @@ void Tab::load_current_preset() update_tab_ui(); // update show/hide tabs - if (m_name == "printer") { + if (m_type == Slic3r::Preset::TYPE_PRINTER) { const PrinterTechnology printer_technology = m_presets->get_edited_preset().printer_technology(); if (printer_technology != static_cast(this)->m_printer_technology) { @@ -2458,7 +2458,7 @@ void Tab::load_current_preset() } else { on_presets_changed(); - if (m_type == Preset::TYPE_SLA_PRINT || m_type == Preset::TYPE_PRINT)// if (m_name == "print") + if (m_type == Preset::TYPE_SLA_PRINT || m_type == Preset::TYPE_PRINT) update_frequently_changed_parameters(); } @@ -2526,20 +2526,35 @@ void Tab::update_page_tree_visibility() } -// Called by the UI combo box when the user switches profiles. +// Called by the UI combo box when the user switches profiles, and also to delete the current profile. // Select a preset by a name.If !defined(name), then the default preset is selected. // If the current profile is modified, user is asked to save the changes. -void Tab::select_preset(std::string preset_name) +void Tab::select_preset(std::string preset_name, bool delete_current) { - // If no name is provided, select the "-- default --" preset. - if (preset_name.empty()) - preset_name = m_presets->default_preset().name; - bool current_dirty = m_presets->current_is_dirty(); + if (preset_name.empty()) { + if (delete_current) { + // Find an alternate preset to be selected after the current preset is deleted. + const std::deque &presets = this->m_presets->get_presets(); + size_t idx_current = this->m_presets->get_idx_selected(); + // Find the next visible preset. + size_t idx_new = idx_current + 1; + if (idx_new < presets.size()) + for (; idx_new < presets.size() && ! presets[idx_new].is_visible; ++ idx_new) ; + if (idx_new == presets.size()) + for (idx_new = idx_current - 1; idx_new > 0 && ! presets[idx_new].is_visible; -- idx_new); + preset_name = presets[idx_new].name; + } else { + // If no name is provided, select the "-- default --" preset. + preset_name = m_presets->default_preset().name; + } + } + assert(! delete_current || (m_presets->get_edited_preset().name != preset_name && m_presets->get_edited_preset().is_user())); + bool current_dirty = ! delete_current && m_presets->current_is_dirty(); bool print_tab = m_presets->type() == Preset::TYPE_PRINT || m_presets->type() == Preset::TYPE_SLA_PRINT; bool printer_tab = m_presets->type() == Preset::TYPE_PRINTER; bool canceled = false; m_dependent_tabs = {}; - if (current_dirty && !may_discard_current_dirty_preset()) { + if (current_dirty && ! may_discard_current_dirty_preset()) { canceled = true; } else if (print_tab) { // Before switching the print profile to a new one, verify, whether the currently active filament or SLA material @@ -2602,6 +2617,19 @@ void Tab::select_preset(std::string preset_name) } } } + + if (! canceled && delete_current) { + // Delete the file and select some other reasonable preset. + // It does not matter which preset will be made active as the preset will be re-selected from the preset_name variable. + // The 'external' presets will only be removed from the preset list, their files will not be deleted. + try { + m_presets->delete_current_preset(); + } catch (const std::exception & /* e */) { + //FIXME add some error reporting! + canceled = true; + } + } + if (canceled) { update_tab_ui(); // Trigger the on_presets_changed event so that we also restore the previous value in the plater selector, @@ -2610,17 +2638,19 @@ void Tab::select_preset(std::string preset_name) } else { if (current_dirty) m_presets->discard_current_changes(); - const bool is_selected = m_presets->select_preset_by_name(preset_name, false); + + const bool is_selected = m_presets->select_preset_by_name(preset_name, false) || delete_current; + assert(m_presets->get_edited_preset().name == preset_name || ! is_selected); // Mark the print & filament enabled if they are compatible with the currently selected preset. // The following method should not discard changes of current print or filament presets on change of a printer profile, // if they are compatible with the current printer. - if (current_dirty || print_tab || printer_tab) + if (current_dirty || delete_current || print_tab || printer_tab) m_preset_bundle->update_compatible(true); // Initialize the UI from the current preset. if (printer_tab) static_cast(this)->update_pages(); - if (!is_selected && printer_tab) + if (! is_selected && printer_tab) { /* There is a case, when : * after Config Wizard applying we try to select previously selected preset, but @@ -2631,15 +2661,10 @@ void Tab::select_preset(std::string preset_name) * to the corresponding printer_technology */ const PrinterTechnology printer_technology = m_presets->get_edited_preset().printer_technology(); - if (printer_technology == ptFFF && m_dependent_tabs.front() != Preset::Type::TYPE_PRINT || - printer_technology == ptSLA && m_dependent_tabs.front() != Preset::Type::TYPE_SLA_PRINT ) - { - m_dependent_tabs.clear(); - if (printer_technology == ptFFF) - m_dependent_tabs = { Preset::Type::TYPE_PRINT, Preset::Type::TYPE_FILAMENT }; - else - m_dependent_tabs = { Preset::Type::TYPE_SLA_PRINT, Preset::Type::TYPE_SLA_MATERIAL }; - } + if (printer_technology == ptFFF && m_dependent_tabs.front() != Preset::Type::TYPE_PRINT) + m_dependent_tabs = { Preset::Type::TYPE_PRINT, Preset::Type::TYPE_FILAMENT }; + else if (printer_technology == ptSLA && m_dependent_tabs.front() != Preset::Type::TYPE_SLA_PRINT) + m_dependent_tabs = { Preset::Type::TYPE_SLA_PRINT, Preset::Type::TYPE_SLA_MATERIAL }; } load_current_preset(); } @@ -2771,11 +2796,14 @@ void Tab::save_preset(std::string name /*= ""*/) //! m_treectrl->OnSetFocus(); if (name.empty()) { - auto preset = m_presets->get_selected_preset(); + const Preset &preset = m_presets->get_selected_preset(); auto default_name = preset.is_default ? "Untitled" : preset.name; + if (preset.is_system) { + default_name += " - "; + default_name += _(L("Copy")).ToUTF8().data(); + } bool have_extention = boost::iends_with(default_name, ".ini"); - if (have_extention) - { + if (have_extention) { size_t len = default_name.length()-4; default_name.resize(len); } @@ -2819,7 +2847,7 @@ void Tab::save_preset(std::string name /*= ""*/) // If current profile is saved, "delete preset" button have to be enabled m_btn_delete_preset->Enable(true); - if (m_name == "printer") + if (m_type == Preset::TYPE_PRINTER) static_cast(this)->m_initial_extruders_count = static_cast(this)->m_extruders_count; update_changed_ui(); } @@ -2836,15 +2864,9 @@ void Tab::delete_preset() if (current_preset.is_default || wxID_YES != wxMessageDialog(parent(), msg, title, wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal()) return; - // Delete the file and select some other reasonable preset. - // The 'external' presets will only be removed from the preset list, their files will not be deleted. - try{ m_presets->delete_current_preset(); } - catch (const std::exception & /* e */) - { - return; - } - // Load the newly selected preset into the UI, update selection combo boxes with their dirty flags. - load_current_preset(); + // Select will handle of the preset dependencies, of saving & closing the depending profiles, and + // finally of deleting the preset. + this->select_preset("", true); } void Tab::toggle_show_hide_incompatible() diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 15ae0443c..58950990c 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -239,7 +239,8 @@ public: void load_current_preset(); void rebuild_page_tree(); void update_page_tree_visibility(); - void select_preset(std::string preset_name = ""); + // Select a new preset, possibly delete the current one. + void select_preset(std::string preset_name = "", bool delete_current = false); bool may_discard_current_dirty_preset(PresetCollection* presets = nullptr, const std::string& new_printer_name = ""); bool may_switch_to_SLA_preset(); From db21c67f1869eed13483c56ce0a42bfd9d982056 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 22 Mar 2019 13:03:34 +0100 Subject: [PATCH 220/236] Changed logic for releasing mouse capture into GLToolbar::on_mouse() --- src/slic3r/GUI/GLToolbar.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index ac79784ad..1b6570eab 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -411,24 +411,19 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) // mouse anywhere if (evt.Moving()) + { m_tooltip = update_hover_state(mouse_pos, parent); + if ((m_mouse_capture.parent != nullptr) && (m_mouse_capture.parent != &parent)) + m_mouse_capture.reset(); + } else if (evt.LeftUp()) m_mouse_capture.left = false; else if (evt.MiddleUp()) m_mouse_capture.middle = false; else if (evt.RightUp()) m_mouse_capture.right = false; - else if (m_mouse_capture.any()) - { - if (evt.Dragging()) - processed = true; - else if (evt.Entering() && (m_mouse_capture.parent == &parent)) - // Resets the mouse capture state to avoid setting the dragging event as processed when, for example, - // the item action opens a modal dialog - // Keeps the mouse capture state if the entering event happens on different parent from the one - // who received the button down event, to prevent, for example, dragging when switching between scene views - m_mouse_capture.reset(); - } + else if (evt.Dragging() && m_mouse_capture.any()) + processed = true; int item_id = contains_mouse(mouse_pos, parent); if (item_id == -1) From 6bf0cf946669cba253c9b19db449727d0c003670 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 22 Mar 2019 14:35:26 +0100 Subject: [PATCH 221/236] Another tweak to the logic for releasing mouse capture into GLToolbar::on_mouse() --- src/slic3r/GUI/GLToolbar.cpp | 30 +++++++++++++++++++++++++++--- src/slic3r/GUI/GLToolbar.hpp | 4 ++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 1b6570eab..1a8539aef 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -157,7 +157,9 @@ GLToolbar::GLToolbar(GLToolbar::EType type) #if ENABLE_SVG_ICONS , m_icons_texture_dirty(true) #endif // ENABLE_SVG_ICONS - , m_mouse_capture({ false, false, false, nullptr }) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// , m_mouse_capture({ false, false, false, nullptr }) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_tooltip("") { } @@ -410,12 +412,27 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) bool processed = false; // mouse anywhere - if (evt.Moving()) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + if (evt.Moving() || evt.LeftDown() || evt.MiddleDown() || evt.RightDown() || evt.LeftDClick() || evt.RightDClick()) { - m_tooltip = update_hover_state(mouse_pos, parent); if ((m_mouse_capture.parent != nullptr) && (m_mouse_capture.parent != &parent)) + { m_mouse_capture.reset(); + std::cout << "Dragging restored by toolbar" << std::endl; + } } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + if (evt.Moving()) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + m_tooltip = update_hover_state(mouse_pos, parent); +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +// if ((m_mouse_capture.parent != nullptr) && (m_mouse_capture.parent != &parent)) +// m_mouse_capture.reset(); +// } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.LeftUp()) m_mouse_capture.left = false; else if (evt.MiddleUp()) @@ -423,7 +440,14 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) else if (evt.RightUp()) m_mouse_capture.right = false; else if (evt.Dragging() && m_mouse_capture.any()) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + { + std::cout << "Dragging prevented by toolbar" << std::endl; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ processed = true; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int item_id = contains_mouse(mouse_pos, parent); if (item_id == -1) diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 95953795f..3d72266c9 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -238,6 +238,10 @@ private: bool right; GLCanvas3D* parent; +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + MouseCapture() { reset(); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + bool any() const { return left || middle || right; } void reset() { left = middle = right = false; parent = nullptr; } }; From d165dbb49842a6fd44193318443259dabc0b0ef6 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 22 Mar 2019 15:31:38 +0100 Subject: [PATCH 222/236] Refactoring changes to the slice index. --- src/libslic3r/MTUtils.hpp | 107 +++++++++++++++++ src/libslic3r/SLAPrint.cpp | 206 +++++++++------------------------ src/libslic3r/SLAPrint.hpp | 119 +++++++++++-------- src/slic3r/GUI/GLCanvas3D.cpp | 26 +++-- src/slic3r/GUI/GUI_Preview.cpp | 6 +- 5 files changed, 249 insertions(+), 215 deletions(-) diff --git a/src/libslic3r/MTUtils.hpp b/src/libslic3r/MTUtils.hpp index 1e0fb426a..1f6ca1a23 100644 --- a/src/libslic3r/MTUtils.hpp +++ b/src/libslic3r/MTUtils.hpp @@ -56,6 +56,113 @@ public: } }; +template +class IndexBasedIterator { + static const size_t NONE = size_t(-1); + + std::reference_wrapper m_index_ref; + size_t m_idx = NONE; +public: + + using value_type = Value; + using pointer = Value *; + using reference = Value &; + using difference_type = long; + using iterator_category = std::random_access_iterator_tag; + + inline explicit + IndexBasedIterator(Vector& index, size_t idx): + m_index_ref(index), m_idx(idx) {} + + // Post increment + inline IndexBasedIterator operator++(int) { + IndexBasedIterator cpy(*this); ++m_idx; return cpy; + } + + inline IndexBasedIterator operator--(int) { + IndexBasedIterator cpy(*this); --m_idx; return cpy; + } + + inline IndexBasedIterator& operator++() { + ++m_idx; return *this; + } + + inline IndexBasedIterator& operator--() { + --m_idx; return *this; + } + + inline IndexBasedIterator& operator+=(difference_type l) { + m_idx += size_t(l); return *this; + } + + inline IndexBasedIterator operator+(difference_type l) { + auto cpy = *this; cpy += l; return cpy; + } + + inline IndexBasedIterator& operator-=(difference_type l) { + m_idx -= size_t(l); return *this; + } + + inline IndexBasedIterator operator-(difference_type l) { + auto cpy = *this; cpy -= l; return cpy; + } + + operator difference_type() { return difference_type(m_idx); } + + inline bool is_end() const { return m_idx >= m_index_ref.get().size();} + + inline Value & operator*() const { + assert(m_idx < m_index_ref.get().size()); + return m_index_ref.get().operator[](m_idx); + } + + inline Value * operator->() const { + assert(m_idx < m_index_ref.get().size()); + return &m_index_ref.get().operator[](m_idx); + } + + inline bool operator ==(const IndexBasedIterator& other) { + size_t e = m_index_ref.get().size(); + return m_idx == other.m_idx || (m_idx >= e && other.m_idx >= e); + } + + inline bool operator !=(const IndexBasedIterator& other) { + return !(*this == other); + } + + inline bool operator <=(const IndexBasedIterator& other) { + return (m_idx < other.m_idx) || (*this == other); + } + + inline bool operator <(const IndexBasedIterator& other) { + return m_idx < other.m_idx && (*this != other); + } + + inline bool operator >=(const IndexBasedIterator& other) { + return m_idx > other.m_idx || *this == other; + } + + inline bool operator >(const IndexBasedIterator& other) { + return m_idx > other.m_idx && *this != other; + } +}; + +template class Range { + It from, to; +public: + It begin() const { return from; } + It end() const { return to; } + using Type = It; + + Range() = default; + Range(It &&b, It &&e): + from(std::forward(b)), to(std::forward(e)) {} + + inline size_t size() const { return end() - begin(); } + inline bool empty() const { return size() == 0; } +}; + } #endif // MTUTILS_HPP diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 58386c0bd..4d34b8e7d 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -626,8 +626,8 @@ void SLAPrint::process() double lhd = m_objects.front()->m_config.layer_height.getFloat(); float lh = float(lhd); - LevelID ilhs = ilhd / SCALING_FACTOR; - LevelID lhs = lhd / SCALING_FACTOR; + auto ilhs = LevelID(ilhd / SCALING_FACTOR); + auto lhs = LevelID(lhd / SCALING_FACTOR); const size_t objcount = m_objects.size(); const unsigned min_objstatus = 0; // where the per object operations start @@ -657,17 +657,15 @@ void SLAPrint::process() double minZ = bb3d.min(Z) - po.get_elevation(); double maxZ = bb3d.max(Z); - LevelID minZs = minZ / SCALING_FACTOR; - LevelID maxZs = maxZ / SCALING_FACTOR; - - auto slh = [](float h) { return LevelID( double(h) / SCALING_FACTOR); }; + auto minZs = LevelID(minZ / SCALING_FACTOR); + auto maxZs = LevelID(maxZ / SCALING_FACTOR); po.m_slice_index.clear(); po.m_slice_index.reserve(size_t(maxZs - (minZs + ilhs) / lhs) + 1); - po.m_slice_index.emplace_back(minZs + ilhs, minZ + ilh / 2.f, ilh); + po.m_slice_index.emplace_back(minZs + ilhs, float(minZ) + ilh / 2.f, ilh); for(LevelID h = minZs + ilhs + lhs; h <= maxZs; h += lhs) { - po.m_slice_index.emplace_back(h, h*SCALING_FACTOR - lh / 2.f, lh); + po.m_slice_index.emplace_back(h, float(h*SCALING_FACTOR) - lh / 2.f, lh); } auto slindex_it = po.search_slice_index(float(bb3d.min(Z))); @@ -867,8 +865,10 @@ void SLAPrint::process() // be part of the slices) auto slice_supports = [](SLAPrintObject& po) { auto& sd = po.m_supportdata; + + if(sd) sd->support_slices.clear(); + if(sd && sd->support_tree_ptr) { - sd->support_slices.clear(); std::vector heights; heights.reserve(po.m_slice_index.size()); @@ -891,75 +891,6 @@ void SLAPrint::process() // We have the layer polygon collection but we need to unite them into // an index where the key is the height level in discrete levels (clipper) auto index_slices = [this/*, ilhd*/](SLAPrintObject& /*po*/) { -// po.m_slice_index.clear(); -// auto sih = LevelID(scale_(ilhd)); - -// // Establish the slice grid boundaries -// auto bb = po.transformed_mesh().bounding_box(); -// double modelgnd = bb.min(Z); -// double elevation = po.get_elevation(); -// double lh = po.m_config.layer_height.getFloat(); -// double minZ = modelgnd - elevation; - -// // scaled values: -// auto sminZ = LevelID(scale_(minZ)); -// auto smaxZ = LevelID(scale_(bb.max(Z))); -// auto smodelgnd = LevelID(scale_(modelgnd)); -// auto slh = LevelID(scale_(lh)); - -// // It is important that the next levels match the levels in -// // model_slice method. Only difference is that here it works with -// // scaled coordinates -// po.m_level_ids.clear(); -// for(LevelID h = sminZ + sih; h < smaxZ; h += slh) -// if(h >= smodelgnd) po.m_level_ids.emplace_back(h); - -// std::vector& oslices = po.m_model_slices; - -// // If everything went well this code should not run at all, but -// // let's be robust... -// // assert(levelids.size() == oslices.size()); -// if(po.m_level_ids.size() < oslices.size()) { // extend the levels until... - -// BOOST_LOG_TRIVIAL(warning) -// << "Height level mismatch at rasterization!\n"; - -// LevelID lastlvl = po.m_level_ids.back(); -// while(po.m_level_ids.size() < oslices.size()) { -// lastlvl += slh; -// po.m_level_ids.emplace_back(lastlvl); -// } -// } - -// for(size_t i = 0; i < oslices.size(); ++i) { -// LevelID h = po.m_level_ids[i]; - -// float fh = float(double(h) * SCALING_FACTOR); - -// // now for the public slice index: -// SLAPrintObject::SliceRecord& sr = po.m_slice_index[fh]; -// // There should be only one slice layer for each print object -// assert(sr.model_slices_idx == SLAPrintObject::SliceRecord::NONE); -// sr.model_slices_idx = i; -// } - -// if(po.m_supportdata) { // deal with the support slices if present -// std::vector& sslices = po.m_supportdata->support_slices; -// po.m_supportdata->level_ids.clear(); -// po.m_supportdata->level_ids.reserve(sslices.size()); - -// for(int i = 0; i < int(sslices.size()); ++i) { -// LevelID h = sminZ + sih + i * slh; -// po.m_supportdata->level_ids.emplace_back(h); - -// float fh = float(double(h) * SCALING_FACTOR); - -// SLAPrintObject::SliceRecord& sr = po.m_slice_index[fh]; -// assert(sr.support_slices_idx == SLAPrintObject::SliceRecord::NONE); -// sr.support_slices_idx = SLAPrintObject::SliceRecord::Idx(i); -// } -// } - // Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update status to the 3D preview to load the SLA slices. report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW); }; @@ -975,41 +906,16 @@ void SLAPrint::process() LevelID gndlvl = o->get_slice_index().front().key(); for(auto& slicerecord : o->get_slice_index()) { auto& lyrs = m_printer_input[slicerecord.key() - gndlvl]; - auto objslit = slicerecord.get_slices(*o, soModel); - auto supslit = slicerecord.get_slices(*o, soSupport); - if(objslit != o->get_model_slices().end()) - lyrs.emplace_back(*objslit, o->instances()); + const ExPolygons& objslices = o->get_slices_from_record(slicerecord, soModel); + const ExPolygons& supslices = o->get_slices_from_record(slicerecord, soSupport); - if(supslit != o->get_support_slices().end()) - lyrs.emplace_back(*supslit, o->instances()); + if(!objslices.empty()) + lyrs.emplace_back(objslices, o->instances()); + + if(!supslices.empty()) + lyrs.emplace_back(supslices, o->instances()); } - -// auto& po = *o; -// std::vector& oslices = po.m_model_slices; - -// // We need to adjust the min Z level of the slices to be zero -// LevelID smfirst = -// po.m_supportdata && !po.m_supportdata->level_ids.empty() ? -// po.m_supportdata->level_ids.front() : 0; -// LevelID mfirst = po.m_level_ids.empty()? 0 : po.m_level_ids.front(); -// LevelID gndlvl = -(std::min(smfirst, mfirst)); - -// // now merge this object's support and object slices with the rest -// // of the print object slices - -// for(size_t i = 0; i < oslices.size(); ++i) { -// auto& lyrs = m_printer_input[gndlvl + po.m_level_ids[i]]; -// lyrs.emplace_back(oslices[i], po.m_instances); -// } - -// if(!po.m_supportdata) continue; -// std::vector& sslices = po.m_supportdata->support_slices; -// for(size_t i = 0; i < sslices.size(); ++i) { -// LayerRefs& lyrs = -// m_printer_input[gndlvl + po.m_supportdata->level_ids[i]]; -// lyrs.emplace_back(sslices[i], po.m_instances); -// } } // collect all the keys @@ -1355,13 +1261,13 @@ void SLAPrint::fill_statistics() record = &(*it); } - auto modelslice_it = record->get_slices(*po, soModel); - if (modelslice_it != po->get_model_slices().end()) - append(model_polygons, get_all_polygons(*modelslice_it, po->instances())); - - auto supportslice_it = record->get_slices(*po, soSupport); - if (supportslice_it != po->get_support_slices().end()) - append(supports_polygons, get_all_polygons(*supportslice_it, po->instances())); + const ExPolygons &modelslices = po->get_slices_from_record(*record, soModel); + if (!modelslices.empty()) + append(model_polygons, get_all_polygons(modelslices, po->instances())); + + const ExPolygons &supportslices = po->get_slices_from_record(*record, soSupport); + if (!supportslices.empty()) + append(supports_polygons, get_all_polygons(supportslices, po->instances())); } model_polygons = union_(model_polygons); @@ -1561,6 +1467,7 @@ double SLAPrintObject::get_current_elevation() const namespace { // dummy empty static containers for return values in some methods const std::vector EMPTY_SLICES; const TriangleMesh EMPTY_MESH; +const ExPolygons EMPTY_SLICE; } const std::vector& SLAPrintObject::get_support_points() const @@ -1597,7 +1504,8 @@ SLAPrintObject::search_slice_index(float slice_level) const } SLAPrintObject::SliceIndex::iterator -SLAPrintObject::search_slice_index(SLAPrintObject::_SliceRecord::Key key) +SLAPrintObject::search_slice_index(SLAPrintObject::_SliceRecord::Key key, + bool exact) { _SliceRecord query(key, 0.f, 0.f); auto it = std::lower_bound(m_slice_index.begin(), m_slice_index.end(), @@ -1608,13 +1516,15 @@ SLAPrintObject::search_slice_index(SLAPrintObject::_SliceRecord::Key key) }); // Return valid iterator only if the keys really match - if(it != m_slice_index.end() && it->key() != key) it = m_slice_index.end(); + if(exact && it != m_slice_index.end() && it->key() != key) + it = m_slice_index.end(); return it; } SLAPrintObject::SliceIndex::const_iterator -SLAPrintObject::search_slice_index(SLAPrintObject::_SliceRecord::Key key) const +SLAPrintObject::search_slice_index(SLAPrintObject::_SliceRecord::Key key, + bool exact) const { _SliceRecord query(key, 0.f, 0.f); auto it = std::lower_bound(m_slice_index.cbegin(), m_slice_index.cend(), @@ -1625,28 +1535,12 @@ SLAPrintObject::search_slice_index(SLAPrintObject::_SliceRecord::Key key) const }); // Return valid iterator only if the keys really match - if(it != m_slice_index.end() && it->key() != key) it = m_slice_index.end(); + if(exact && it != m_slice_index.end() && it->key() != key) + it = m_slice_index.end(); return it; } -SliceRange SLAPrintObject::get_slices(SliceOrigin so, - float from_level, - float to_level) const -{ - auto it_from = search_slice_index(from_level); - auto it_to = search_slice_index(to_level); - - SliceRange ret; - - auto endit = so == soModel? get_model_slices().end() : get_support_slices().end(); - - ret.from = it_from == m_slice_index.end() ? endit : it_from->get_slices(*this, so); - ret.to = it_to == m_slice_index.end() ? endit : it_to->get_slices(*this, so); - - return ret; -} - const std::vector &SLAPrintObject::get_support_slices() const { // assert(is_step_done(slaposSliceSupports)); @@ -1654,6 +1548,28 @@ const std::vector &SLAPrintObject::get_support_slices() const return m_supportdata->support_slices; } +const ExPolygons &SLAPrintObject::get_slices_from_record( + const _SliceRecord &rec, + SliceOrigin o) const +{ + size_t idx = o == soModel ? rec.get_model_slice_idx() : + rec.get_support_slice_idx(); + + const std::vector& v = o == soModel? get_model_slices() : + get_support_slices(); + + if(idx >= v.size()) return EMPTY_SLICE; + + return idx >= v.size() ? EMPTY_SLICE : v[idx]; +} + +const ExPolygons &SLAPrintObject::get_slices_from_record( + SLAPrintObject::SliceRecordConstIterator it, SliceOrigin o) const +{ + if(it.is_end()) return EMPTY_SLICE; + return get_slices_from_record(*it, o); +} + const std::vector& SLAPrintObject::get_slice_index() const { @@ -1778,18 +1694,4 @@ std::string SLAPrintStatistics::finalize_output_path(const std::string &path_in) return final_path; } -SliceIterator SLAPrintObject::_SliceRecord::get_slices(const SLAPrintObject &po, - SliceOrigin so) const -{ - - const std::vector& v = so == soModel? po.get_model_slices() : - po.get_support_slices(); - - size_t idx = so == soModel ? m_model_slices_idx : m_support_slices_idx; - - using DiffT = std::vector::const_iterator::difference_type; - - return idx == NONE? v.end() : v.begin() + DiffT(idx); -} - } // namespace Slic3r diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index b33bfdeb0..ff715fb5e 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -6,6 +6,7 @@ #include "PrintExport.hpp" #include "Point.hpp" #include "MTUtils.hpp" +#include namespace Slic3r { @@ -35,23 +36,8 @@ using _SLAPrintObjectBase = // the printer (rasterizer) in the SLAPrint class. using LevelID = long long; -template struct Range { - It from, to; - It begin() const { return from; } - It end() const { return to; } - using Type = It; - - Range() = default; - explicit Range(It &&b, It &&e): - from(std::forward(b)), to(std::forward(e)) {} -}; - enum SliceOrigin { soSupport, soModel }; -using SliceStore = std::vector; -using SliceIterator = SliceStore::const_iterator; -using SliceRange = Range; - class SLAPrintObject : public _SLAPrintObjectBase { private: // Prevents erroneous use by other classes. @@ -107,12 +93,14 @@ public: // This method returns the support points of this SLAPrintObject. const std::vector& get_support_points() const; + // The public Slice record structure. It corresponds to one printable layer. + // To get the sliced polygons, use SLAPrintObject::get_slices_from_record class SliceRecord { public: using Key = LevelID; private: - LevelID m_print_z = 0; // Top of the layer + Key m_print_z = 0; // Top of the layer float m_slice_z = 0.f; // Exact level of the slice float m_height = 0.f; // Height of the sliced layer @@ -139,8 +127,9 @@ private: // levels of the model in scaled-clipper coordinates. The levels correspond // to the z coordinate of the object coordinate system. class _SliceRecord: public SliceRecord { - private: + public: static const size_t NONE = size_t(-1); // this will be the max limit of size_t + private: size_t m_model_slices_idx = NONE; size_t m_support_slices_idx = NONE; @@ -148,14 +137,12 @@ private: _SliceRecord(Key key, float slicez, float height): SliceRecord(key, slicez, height) {} - // Returns the slices for either the model or the supports. The return - // value is an iterator to po.get_model_slices() or po.get_support_slices - // depending on the SliceOrigin parameter. - SliceIterator get_slices(const SLAPrintObject& po, SliceOrigin so) const; - - // Methods for setting the indixes into the slice vectors. + // Methods for setting the indices into the slice vectors. void set_model_slice_idx(size_t id) { m_model_slices_idx = id; } void set_support_slice_idx(size_t id) { m_support_slices_idx = id; } + + inline size_t get_model_slice_idx() const { return m_model_slices_idx; } + inline size_t get_support_slice_idx() const { return m_support_slices_idx; } }; // Slice index will be a plain vector sorted by the integer height levels @@ -171,37 +158,78 @@ private: // Search the slice index for a particular level in integer coordinates. // If no such layer is present, it will return m_slice_index.end() - SliceIndex::iterator search_slice_index(_SliceRecord::Key key); - SliceIndex::const_iterator search_slice_index(_SliceRecord::Key key) const; + // This behavior can be suppressed by the second parameter. If it is true + // the method will return the closest (non-equal) record + SliceIndex::iterator search_slice_index(_SliceRecord::Key key, bool exact = false); + SliceIndex::const_iterator search_slice_index(_SliceRecord::Key key, bool = false) const; + + const std::vector& get_model_slices() const; + const std::vector& get_support_slices() const; public: - // ///////////////////////////////////////////////////////////////////////// - // The following methods can be used after the model and the support slicing - // steps have been succesfully finished. - // ///////////////////////////////////////////////////////////////////////// - - // Getting slices (model or supports) for a Z coordinate range. The returned - // iterators should include the slices for the given boundaries as well. - SliceRange get_slices( - SliceOrigin so, - float from_level, - float to_level = std::numeric_limits::infinity()) const; + // Should work as a polymorphic bidirectional iterator to the slice records + using SliceRecordConstIterator = + IndexBasedIterator; + // ///////////////////////////////////////////////////////////////////////// + // // These two methods should be callable on the client side (e.g. UI thread) // when the appropriate steps slaposObjectSlice and slaposSliceSupports // are ready. All the print objects are processed before slapsRasterize so // it is safe to call them during and/or after slapsRasterize. - const std::vector& get_model_slices() const; - const std::vector& get_support_slices() const; + // + // ///////////////////////////////////////////////////////////////////////// - // Returns the total number of slices in the slice grid (model and supports) - inline size_t get_slice_count() const { return m_slice_index.size(); } + // Get the slice records from a range of slice levels (inclusive). Floating + // point keys are the levels where the model was sliced with the mesh + // slicer. Integral keys are the keys of the slice records, which + // correspond to the top of each layer.. The end() method of the returned + // range points *after* the last valid element. This is for being + // consistent with std and makeing range based for loops work. use + // std::prev(range.end()) or --range.end() to get the last element. + template Range + get_slice_records(Key from, Key to = std::numeric_limits::max()) const + { + SliceIndex::const_iterator it_from, it_to; + if(std::is_integral::value) { + it_from = search_slice_index(SliceRecord::Key(from)); + it_to = search_slice_index(SliceRecord::Key(to)); + } else if(std::is_floating_point::value) { + it_from = search_slice_index(float(from)); + it_to = search_slice_index(float(to)); + } else return { + SliceRecordConstIterator(m_slice_index, _SliceRecord::NONE ), + SliceRecordConstIterator(m_slice_index, _SliceRecord::NONE ), + }; - inline const SliceRecord& get_slice_record(size_t idx) const { - return m_slice_index[idx]; + auto start = m_slice_index.begin(); + + size_t bidx = it_from == m_slice_index.end() ? _SliceRecord::NONE : + size_t(it_from - start); + + size_t eidx = it_to == m_slice_index.end() ? _SliceRecord::NONE : + size_t(it_to - start) + 1; + + return { + SliceRecordConstIterator(m_slice_index, bidx), + SliceRecordConstIterator(m_slice_index, eidx), + }; } + // Get all the slice records as a range. + inline Range get_slice_records() const { + return { + SliceRecordConstIterator(m_slice_index, 0), + SliceRecordConstIterator(m_slice_index, m_slice_index.size()) + }; + } + + const ExPolygons& get_slices_from_record(SliceRecordConstIterator it, + SliceOrigin o) const; + + const ExPolygons& get_slices_from_record(const _SliceRecord& rec, + SliceOrigin o) const; protected: // to be called from SLAPrint only. friend class SLAPrint; @@ -242,7 +270,7 @@ private: // Exact (float) height levels mapped to the slices. Each record contains // the index to the model and the support slice vectors. - std::vector<_SliceRecord> m_slice_index; + std::vector<_SliceRecord> m_slice_index; std::vector m_model_height_levels; @@ -335,11 +363,6 @@ private: // Invalidate steps based on a set of parameters changed. bool invalidate_state_by_config_options(const std::vector &opt_keys); - std::vector calculate_heights(const BoundingBoxf3& bb, - float elevation, - float initial_layer_height, - float layer_height) const; - void fill_statistics(); SLAPrintConfig m_print_config; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 0f1e15b76..8acb5ad53 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5014,26 +5014,28 @@ void GLCanvas3D::_render_sla_slices() const if ((bottom_obj_triangles.empty() || bottom_sup_triangles.empty() || top_obj_triangles.empty() || top_sup_triangles.empty()) && obj->is_step_done(slaposIndexSlices)) { // FIXME: is this all right (by Tamas)? - SliceRange obj_range = obj->get_slices(soModel, float(min_z), float(max_z)); - SliceRange sup_range = obj->get_slices(soSupport, float(min_z), float(max_z)); - auto obj_end = obj->get_model_slices().end(); - auto sup_end = obj->get_support_slices().end(); + auto slice_range = obj->get_slice_records(coord_t(min_z / SCALING_FACTOR), + coord_t(max_z / SCALING_FACTOR)); + const ExPolygons& obj_bottom = obj->get_slices_from_record(slice_range.begin(), soModel); + const ExPolygons& obj_top = obj->get_slices_from_record(std::prev(slice_range.end()), soModel); + const ExPolygons& sup_bottom = obj->get_slices_from_record(slice_range.begin(), soSupport); + const ExPolygons& sup_top = obj->get_slices_from_record(std::prev(slice_range.end()), soSupport); // calculate model bottom cap - if(bottom_obj_triangles.empty() && obj_range.from != obj_end) - bottom_obj_triangles = triangulate_expolygons_3d(*obj_range.from, min_z, true); + if(bottom_obj_triangles.empty() && !obj_bottom.empty()) + bottom_obj_triangles = triangulate_expolygons_3d(obj_bottom, min_z, true); // calculate support bottom cap - if(bottom_sup_triangles.empty() && sup_range.from != sup_end) - bottom_sup_triangles = triangulate_expolygons_3d(*sup_range.from, min_z, true); + if(bottom_sup_triangles.empty() && !sup_bottom.empty()) + bottom_sup_triangles = triangulate_expolygons_3d(sup_bottom, min_z, true); // calculate model top cap - if(top_obj_triangles.empty() && obj_range.to != obj_end) - top_obj_triangles = triangulate_expolygons_3d(*obj_range.to, max_z, false); + if(top_obj_triangles.empty() && !obj_top.empty()) + top_obj_triangles = triangulate_expolygons_3d(obj_top, max_z, false); // calculate support top cap - if(top_sup_triangles.empty() && sup_range.to != sup_end) - top_sup_triangles = triangulate_expolygons_3d(*sup_range.to, max_z, false); + if(top_sup_triangles.empty() && !sup_top.empty()) + top_sup_triangles = triangulate_expolygons_3d(sup_top, max_z, false); // const std::vector& model_slices = obj->get_model_slices(); // const std::vector& support_slices = obj->get_support_slices(); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 10a4a12c7..5edca6c96 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -775,10 +775,10 @@ void Preview::load_print_as_sla() double shift_z = obj->get_current_elevation(); if (obj->is_step_done(slaposIndexSlices)) { - size_t cnt = obj->get_slice_count(); - for (size_t i = 0; i < cnt; i++) + auto slicerecords = obj->get_slice_records(); + for (auto& rec : slicerecords) { - zs.insert(shift_z + obj->get_slice_record(i).key() * SCALING_FACTOR); + zs.insert(shift_z + /*rec.slice_level()*/ rec.key() * SCALING_FACTOR); } } } From ae9356904402ada309f9a2f82e2a53084f379528 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 22 Mar 2019 15:45:51 +0100 Subject: [PATCH 223/236] Call Config Wizard from the Printer combo box at both the plater and the parameter tab. --- src/slic3r/GUI/Plater.cpp | 9 ++++--- src/slic3r/GUI/Plater.hpp | 8 ++++-- src/slic3r/GUI/Preset.cpp | 47 +++++++++++++++++++++++++++++++-- src/slic3r/GUI/Preset.hpp | 5 ++++ src/slic3r/GUI/PresetBundle.cpp | 1 + src/slic3r/GUI/Tab.cpp | 3 +++ 6 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 906a5009a..a2ab8c3f1 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -57,6 +57,7 @@ #include "BackgroundSlicingProcess.hpp" #include "ProgressStatusBar.hpp" #include "PrintHostDialogs.hpp" +#include "ConfigWizard.hpp" #include "../Utils/ASCIIFolding.hpp" #include "../Utils/PrintHost.hpp" #include "../Utils/FixModelByWin10.hpp" @@ -233,9 +234,11 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * auto selected_item = this->GetSelection(); auto marker = reinterpret_cast(this->GetClientData(selected_item)); - if (marker == LABEL_ITEM_MARKER) { + if (marker == LABEL_ITEM_MARKER || marker == LABEL_ITEM_CONFIG_WIZARD) { this->SetSelection(this->last_selected); evt.StopPropagation(); + if (marker == LABEL_ITEM_CONFIG_WIZARD) + wxTheApp->CallAfter([]() { Slic3r::GUI::config_wizard(Slic3r::GUI::ConfigWizard::RR_USER); }); } else if ( this->last_selected != selected_item || wxGetApp().get_tab(this->preset_type)->get_presets()->current_is_dirty() ) { this->last_selected = selected_item; @@ -317,9 +320,9 @@ PresetComboBox::~PresetComboBox() } -void PresetComboBox::set_label_marker(int item) +void PresetComboBox::set_label_marker(int item, LabelItemType label_item_type) { - this->SetClientData(item, (void*)LABEL_ITEM_MARKER); + this->SetClientData(item, (void*)label_item_type); } void PresetComboBox::check_selection() diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index f3e195ad0..f830edce3 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -48,14 +48,18 @@ public: wxButton* edit_btn { nullptr }; - void set_label_marker(int item); + enum LabelItemType { + LABEL_ITEM_MARKER = 0x4d, + LABEL_ITEM_CONFIG_WIZARD = 0x4e + }; + + void set_label_marker(int item, LabelItemType label_item_type = LABEL_ITEM_MARKER); void set_extruder_idx(const int extr_idx) { extruder_idx = extr_idx; } int get_extruder_idx() const { return extruder_idx; } void check_selection(); private: typedef std::size_t Marker; - enum { LABEL_ITEM_MARKER = 0x4d }; Preset::Type preset_type; int last_selected; diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index e63ae32f7..6ed711c95 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -519,6 +519,7 @@ PresetCollection::PresetCollection(Preset::Type type, const std::vectorLoadFile(wxString::FromUTF8(Slic3r::var(file_name).c_str()), wxBITMAP_TYPE_PNG); } +bool PresetCollection::load_bitmap_add(const std::string &file_name) +{ + return m_bitmap_add->LoadFile(wxString::FromUTF8(Slic3r::var(file_name).c_str()), wxBITMAP_TYPE_PNG); +} + const Preset* PresetCollection::get_selected_preset_parent() const { const std::string &inherits = this->get_edited_preset().inherits(); @@ -903,7 +911,7 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) wxString selected = ""; if (!this->m_presets.front().is_visible) ui->set_label_marker(ui->Append("------- " + _(L("System presets")) + " -------", wxNullBitmap)); - for (size_t i = this->m_presets.front().is_visible ? 0 : m_num_default_presets; i < this->m_presets.size(); ++i) { + for (size_t i = this->m_presets.front().is_visible ? 0 : m_num_default_presets; i < this->m_presets.size(); ++ i) { const Preset &preset = this->m_presets[i]; if (! preset.is_visible || (! preset.is_compatible && i != m_idx_selected)) continue; @@ -953,6 +961,30 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) selected_preset_item = ui->GetCount() - 1; } } + if (m_type == Preset::TYPE_PRINTER) { + std::string bitmap_key = ""; + // If the filament preset is not compatible and there is a "red flag" icon loaded, show it left + // to the filament color image. + if (wide_icons) + bitmap_key += "wide,"; + bitmap_key += "add_printer"; + wxBitmap *bmp = m_bitmap_cache->find(bitmap_key); + if (bmp == nullptr) { + // Create the bitmap with color bars. + std::vector bmps; + if (wide_icons) + // Paint a red flag for incompatible presets. + bmps.emplace_back(m_bitmap_cache->mkclear(16, 16)); + // Paint the color bars. + bmps.emplace_back(m_bitmap_cache->mkclear(4, 16)); + bmps.emplace_back(*m_bitmap_main_frame); + // Paint a lock at the system presets. + bmps.emplace_back(m_bitmap_cache->mkclear(6, 16)); + bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); + bmp = m_bitmap_cache->insert(bitmap_key, bmps); + } + ui->set_label_marker(ui->Append("------- " + _(L("Add a new printer")) + " -------", *bmp), GUI::PresetComboBox::LABEL_ITEM_CONFIG_WIZARD); + } ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); @@ -1001,7 +1033,7 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati if (i == m_idx_selected) selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()); } - if (i + 1 == m_num_default_presets) + if (i + 1 == m_num_default_presets) ui->Append("------- " + _(L("System presets")) + " -------", wxNullBitmap); } if (!nonsys_presets.empty()) @@ -1013,6 +1045,17 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati selected_preset_item = ui->GetCount() - 1; } } + if (m_type == Preset::TYPE_PRINTER) { + wxBitmap *bmp = m_bitmap_cache->find("add_printer_tab"); + if (bmp == nullptr) { + // Create the bitmap with color bars. + std::vector bmps; + bmps.emplace_back(*m_bitmap_main_frame); + bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); + bmp = m_bitmap_cache->insert("add_printer_tab", bmps); + } + ui->Append("------- " + _(L("Add a new printer")) + " -------", *bmp); + } ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); ui->Thaw(); diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index c84c37029..cc0a51588 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -277,6 +277,9 @@ public: // Load default bitmap to be placed at the wxBitmapComboBox of a MainFrame. bool load_bitmap_default(const std::string &file_name); + // Load "add new printer" bitmap to be placed at the wxBitmapComboBox of a MainFrame. + bool load_bitmap_add(const std::string &file_name); + // Compatible & incompatible marks, to be placed at the wxBitmapComboBox items. void set_bitmap_compatible (const wxBitmap *bmp) { m_bitmap_compatible = bmp; } void set_bitmap_incompatible(const wxBitmap *bmp) { m_bitmap_incompatible = bmp; } @@ -467,6 +470,8 @@ private: // Marks placed at the wxBitmapComboBox of a MainFrame. // These bitmaps are owned by PresetCollection. wxBitmap *m_bitmap_main_frame; + // "Add printer profile" icon, owned by PresetCollection. + wxBitmap *m_bitmap_add; // Path to the directory to store the config files into. std::string m_dir_path; diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index b8c9fedac..b7e26a66c 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -107,6 +107,7 @@ PresetBundle::PresetBundle() : this->filaments .load_bitmap_default("spool.png"); this->sla_materials.load_bitmap_default("package_green.png"); this->printers .load_bitmap_default("printer_empty.png"); + this->printers .load_bitmap_add("add.png"); this->load_compatible_bitmaps(); // Re-activate the default presets, so their "edited" preset copies will be updated with the additional configuration values above. diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d38e96ca2..e5044935e 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -29,6 +29,7 @@ #include "GUI_App.hpp" #include "GUI_ObjectList.hpp" +#include "ConfigWizard.hpp" namespace Slic3r { namespace GUI { @@ -252,6 +253,8 @@ void Tab::create_preset_tab() /*selected_string == "------- System presets -------" || selected_string == "------- User presets -------"*/) { m_presets_choice->SetSelection(m_selected_preset_item); + if (selected_string == "------- " + _(L("Add a new printer")) + " -------") + wxTheApp->CallAfter([]() { Slic3r::GUI::config_wizard(Slic3r::GUI::ConfigWizard::RR_USER); }); return; } m_selected_preset_item = selected_item; From 8e18605bd720f895cc6f0088b1dd27c49dd4fb69 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 22 Mar 2019 15:48:20 +0100 Subject: [PATCH 224/236] Fix for incorrect model slices after elevation has changed. --- src/libslic3r/SLAPrint.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 4d34b8e7d..79834908f 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1363,11 +1363,15 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vector Date: Fri, 22 Mar 2019 17:07:12 +0100 Subject: [PATCH 225/236] Refactored the -------- xxxx ---------- menu items to use a generic code to generate these separators. Now using the connected dashes (unicode emdash characters) on OSX and Windows. --- src/slic3r/GUI/Preset.cpp | 21 +++++++++++++-------- src/slic3r/GUI/Preset.hpp | 9 +++++++++ src/slic3r/GUI/PresetBundle.cpp | 8 ++++---- src/slic3r/GUI/Tab.cpp | 4 ++-- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 6ed711c95..3da4c1871 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -910,7 +910,7 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) std::map nonsys_presets; wxString selected = ""; if (!this->m_presets.front().is_visible) - ui->set_label_marker(ui->Append("------- " + _(L("System presets")) + " -------", wxNullBitmap)); + ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap)); for (size_t i = this->m_presets.front().is_visible ? 0 : m_num_default_presets; i < this->m_presets.size(); ++ i) { const Preset &preset = this->m_presets[i]; if (! preset.is_visible || (! preset.is_compatible && i != m_idx_selected)) @@ -950,11 +950,11 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()); } if (i + 1 == m_num_default_presets) - ui->set_label_marker(ui->Append("------- " + _(L("System presets")) + " -------", wxNullBitmap)); + ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap)); } if (!nonsys_presets.empty()) { - ui->set_label_marker(ui->Append("------- " + _(L("User presets")) + " -------", wxNullBitmap)); + ui->set_label_marker(ui->Append(PresetCollection::separator(L("User presets")), wxNullBitmap)); for (std::map::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { ui->Append(it->first, *it->second); if (it->first == selected) @@ -983,7 +983,7 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); bmp = m_bitmap_cache->insert(bitmap_key, bmps); } - ui->set_label_marker(ui->Append("------- " + _(L("Add a new printer")) + " -------", *bmp), GUI::PresetComboBox::LABEL_ITEM_CONFIG_WIZARD); + ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add a new printer")), *bmp), GUI::PresetComboBox::LABEL_ITEM_CONFIG_WIZARD); } ui->SetSelection(selected_preset_item); @@ -1002,7 +1002,7 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati std::map nonsys_presets; wxString selected = ""; if (!this->m_presets.front().is_visible) - ui->Append("------- " + _(L("System presets")) + " -------", wxNullBitmap); + ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap); for (size_t i = this->m_presets.front().is_visible ? 0 : m_num_default_presets; i < this->m_presets.size(); ++i) { const Preset &preset = this->m_presets[i]; if (! preset.is_visible || (! show_incompatible && ! preset.is_compatible && i != m_idx_selected)) @@ -1034,11 +1034,11 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()); } if (i + 1 == m_num_default_presets) - ui->Append("------- " + _(L("System presets")) + " -------", wxNullBitmap); + ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap); } if (!nonsys_presets.empty()) { - ui->Append("------- " + _(L("User presets")) + " -------", wxNullBitmap); + ui->Append(PresetCollection::separator(L("User presets")), wxNullBitmap); for (std::map::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { ui->Append(it->first, *it->second); if (it->first == selected) @@ -1054,7 +1054,7 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); bmp = m_bitmap_cache->insert("add_printer_tab", bmps); } - ui->Append("------- " + _(L("Add a new printer")) + " -------", *bmp); + ui->Append(PresetCollection::separator("Add a new printer"), *bmp); } ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); @@ -1284,6 +1284,11 @@ std::string PresetCollection::path_from_name(const std::string &new_name) const return (boost::filesystem::path(m_dir_path) / file_name).make_preferred().string(); } +wxString PresetCollection::separator(const std::string &label) +{ + return wxString::FromUTF8(PresetCollection::separator_head()) + _(label) + wxString::FromUTF8(PresetCollection::separator_tail()); +} + const Preset& PrinterPresetCollection::default_preset_for(const DynamicPrintConfig &config) const { const ConfigOptionEnumGeneric *opt_printer_technology = config.opt("printer_technology"); diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index cc0a51588..ee795f2b9 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -410,6 +410,15 @@ public: // Generate a file path from a profile name. Add the ".ini" suffix if it is missing. std::string path_from_name(const std::string &new_name) const; +#ifdef __linux__ + static const char* separator_head() { return "------- "; } + static const char* separator_tail() { return " -------"; } +#else /* __linux__ */ + static const char* separator_head() { return "————— "; } + static const char* separator_tail() { return " —————"; } +#endif /* __linux__ */ + static wxString separator(const std::string &label); + protected: // Select a preset, if it exists. If it does not exist, select an invalid (-1) index. // This is a temporary state, which shall be fixed immediately by the following step. diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index b7e26a66c..9f4261372 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1406,7 +1406,7 @@ void PresetBundle::export_configbundle(const std::string &path, bool export_syst // an optional "(modified)" suffix will be removed from the filament name. void PresetBundle::set_filament_preset(size_t idx, const std::string &name) { - if (name.find_first_of("-------") == 0) + if (name.find_first_of(PresetCollection::separator_head()) == 0) return; if (idx >= filament_presets.size()) @@ -1462,7 +1462,7 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr std::map nonsys_presets; wxString selected_str = ""; if (!this->filaments().front().is_visible) - ui->set_label_marker(ui->Append("------- " + _(L("System presets")) + " -------", wxNullBitmap)); + ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap)); for (int i = this->filaments().front().is_visible ? 0 : 1; i < int(this->filaments().size()); ++i) { const Preset &preset = this->filaments.preset(i); bool selected = this->filament_presets[idx_extruder] == preset.name; @@ -1515,12 +1515,12 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr selected_str = wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()); } if (preset.is_default) - ui->set_label_marker(ui->Append("------- " + _(L("System presets")) + " -------", wxNullBitmap)); + ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap)); } if (!nonsys_presets.empty()) { - ui->set_label_marker(ui->Append("------- " + _(L("User presets")) + " -------", wxNullBitmap)); + ui->set_label_marker(ui->Append(PresetCollection::separator(L("User presets")), wxNullBitmap)); for (std::map::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { ui->Append(it->first, *it->second); if (it->first == selected_str) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index e5044935e..48d9ece47 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -249,11 +249,11 @@ void Tab::create_preset_tab() return; if (selected_item >= 0) { std::string selected_string = m_presets_choice->GetString(selected_item).ToUTF8().data(); - if (selected_string.find("-------") == 0 + if (selected_string.find(PresetCollection::separator_head()) == 0 /*selected_string == "------- System presets -------" || selected_string == "------- User presets -------"*/) { m_presets_choice->SetSelection(m_selected_preset_item); - if (selected_string == "------- " + _(L("Add a new printer")) + " -------") + if (wxString::FromUTF8(selected_string.c_str()) == PresetCollection::separator(L("Add a new printer"))) wxTheApp->CallAfter([]() { Slic3r::GUI::config_wizard(Slic3r::GUI::ConfigWizard::RR_USER); }); return; } From 2fe27a29e0eb9420f14a2cad0e6cb42276be27d4 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 22 Mar 2019 21:26:58 +0100 Subject: [PATCH 226/236] Fixed the SLA layer preview. --- src/libslic3r/SLAPrint.hpp | 5 ++ src/slic3r/GUI/GLCanvas3D.cpp | 91 ++++++++++++---------------------- src/slic3r/GUI/GUI_Preview.cpp | 18 +++---- 3 files changed, 44 insertions(+), 70 deletions(-) diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index ff715fb5e..fbe2821b2 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -350,6 +350,11 @@ public: } const PrintObjects& objects() const { return m_objects; } + const SLAPrintConfig& print_config() const { return m_print_config; } + const SLAPrinterConfig& printer_config() const { return m_printer_config; } + const SLAMaterialConfig& material_config() const { return m_material_config; } + + std::string output_filename() const override; const SLAPrintStatistics& print_statistics() const { return m_print_statistics; } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 0018ae1cc..8be187dec 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4971,24 +4971,20 @@ void GLCanvas3D::_render_sla_slices() const { const SLAPrintObject* obj = print_objects[i]; - double shift_z = obj->get_current_elevation(); - double min_z = clip_min_z - shift_z; - double max_z = clip_max_z - shift_z; - SlaCap::ObjectIdToTrianglesMap::iterator it_caps_bottom = m_sla_caps[0].triangles.find(i); SlaCap::ObjectIdToTrianglesMap::iterator it_caps_top = m_sla_caps[1].triangles.find(i); { if (it_caps_bottom == m_sla_caps[0].triangles.end()) it_caps_bottom = m_sla_caps[0].triangles.emplace(i, SlaCap::Triangles()).first; - if (! m_sla_caps[0].matches(min_z)) { - m_sla_caps[0].z = min_z; + if (! m_sla_caps[0].matches(clip_min_z)) { + m_sla_caps[0].z = clip_min_z; it_caps_bottom->second.object.clear(); it_caps_bottom->second.supports.clear(); } if (it_caps_top == m_sla_caps[1].triangles.end()) it_caps_top = m_sla_caps[1].triangles.emplace(i, SlaCap::Triangles()).first; - if (! m_sla_caps[1].matches(max_z)) { - m_sla_caps[1].z = max_z; + if (! m_sla_caps[1].matches(clip_max_z)) { + m_sla_caps[1].z = clip_max_z; it_caps_top->second.object.clear(); it_caps_top->second.supports.clear(); } @@ -5008,61 +5004,40 @@ void GLCanvas3D::_render_sla_slices() const std::vector instance_transforms; for (const SLAPrintObject::Instance& inst : instances) { - instance_transforms.push_back({ to_3d(unscale(inst.shift), shift_z), Geometry::rad2deg(inst.rotation) }); + instance_transforms.push_back({ to_3d(unscale(inst.shift), 0.), Geometry::rad2deg(inst.rotation) }); } if ((bottom_obj_triangles.empty() || bottom_sup_triangles.empty() || top_obj_triangles.empty() || top_sup_triangles.empty()) && obj->is_step_done(slaposIndexSlices)) { - // FIXME: is this all right (by Tamas)? - auto slice_range = obj->get_slice_records(coord_t(min_z / SCALING_FACTOR), - coord_t(max_z / SCALING_FACTOR)); - const ExPolygons& obj_bottom = obj->get_slices_from_record(slice_range.begin(), soModel); - const ExPolygons& obj_top = obj->get_slices_from_record(std::prev(slice_range.end()), soModel); - const ExPolygons& sup_bottom = obj->get_slices_from_record(slice_range.begin(), soSupport); - const ExPolygons& sup_top = obj->get_slices_from_record(std::prev(slice_range.end()), soSupport); + double initial_layer_height = print->material_config().initial_layer_height.value; + LevelID key_zero = obj->get_slice_records().begin()->key(); + LevelID key_low = LevelID((clip_min_z - initial_layer_height) / SCALING_FACTOR) + key_zero; + LevelID key_high = LevelID((clip_max_z - initial_layer_height) / SCALING_FACTOR) + key_zero; + auto slice_range = obj->get_slice_records(key_low - LevelID(SCALED_EPSILON), key_high - LevelID(SCALED_EPSILON)); + auto it_low = slice_range.begin(); + auto it_high = std::prev(slice_range.end()); + + if (! it_low.is_end() && it_low->key() < key_low + LevelID(SCALED_EPSILON)) { + const ExPolygons& obj_bottom = obj->get_slices_from_record(it_low, soModel); + const ExPolygons& sup_bottom = obj->get_slices_from_record(it_low, soSupport); + // calculate model bottom cap + if (bottom_obj_triangles.empty() && !obj_bottom.empty()) + bottom_obj_triangles = triangulate_expolygons_3d(obj_bottom, clip_min_z, true); + // calculate support bottom cap + if (bottom_sup_triangles.empty() && !sup_bottom.empty()) + bottom_sup_triangles = triangulate_expolygons_3d(sup_bottom, clip_min_z, true); + } - // calculate model bottom cap - if(bottom_obj_triangles.empty() && !obj_bottom.empty()) - bottom_obj_triangles = triangulate_expolygons_3d(obj_bottom, min_z, true); - - // calculate support bottom cap - if(bottom_sup_triangles.empty() && !sup_bottom.empty()) - bottom_sup_triangles = triangulate_expolygons_3d(sup_bottom, min_z, true); - - // calculate model top cap - if(top_obj_triangles.empty() && !obj_top.empty()) - top_obj_triangles = triangulate_expolygons_3d(obj_top, max_z, false); - - // calculate support top cap - if(top_sup_triangles.empty() && !sup_top.empty()) - top_sup_triangles = triangulate_expolygons_3d(sup_top, max_z, false); - -// const std::vector& model_slices = obj->get_model_slices(); -// const std::vector& support_slices = obj->get_support_slices(); - -// const SLAPrintObject::SliceIndex& index = obj->get_slice_index(); -// SLAPrintObject::SliceIndex::const_iterator it_min_z = std::find_if(index.begin(), index.end(), [min_z](const SLAPrintObject::SliceIndex::value_type& id) -> bool { return std::abs(min_z - id.first) < EPSILON; }); -// SLAPrintObject::SliceIndex::const_iterator it_max_z = std::find_if(index.begin(), index.end(), [max_z](const SLAPrintObject::SliceIndex::value_type& id) -> bool { return std::abs(max_z - id.first) < EPSILON; }); - -// if (it_min_z != index.end()) -// { -// // calculate model bottom cap -// if (bottom_obj_triangles.empty() && (it_min_z->second.model_slices_idx < model_slices.size())) -// bottom_obj_triangles = triangulate_expolygons_3d(model_slices[it_min_z->second.model_slices_idx], min_z, true); -// // calculate support bottom cap -// if (bottom_sup_triangles.empty() && (it_min_z->second.support_slices_idx < support_slices.size())) -// bottom_sup_triangles = triangulate_expolygons_3d(support_slices[it_min_z->second.support_slices_idx], min_z, true); -// } - -// if (it_max_z != index.end()) -// { -// // calculate model top cap -// if (top_obj_triangles.empty() && (it_max_z->second.model_slices_idx < model_slices.size())) -// top_obj_triangles = triangulate_expolygons_3d(model_slices[it_max_z->second.model_slices_idx], max_z, false); -// // calculate support top cap -// if (top_sup_triangles.empty() && (it_max_z->second.support_slices_idx < support_slices.size())) -// top_sup_triangles = triangulate_expolygons_3d(support_slices[it_max_z->second.support_slices_idx], max_z, false); -// } + if (! it_high.is_end() && it_high->key() < key_high + LevelID(SCALED_EPSILON)) { + const ExPolygons& obj_top = obj->get_slices_from_record(it_high, soModel); + const ExPolygons& sup_top = obj->get_slices_from_record(it_high, soSupport); + // calculate model top cap + if (top_obj_triangles.empty() && !obj_top.empty()) + top_obj_triangles = triangulate_expolygons_3d(obj_top, clip_max_z, false); + // calculate support top cap + if (top_sup_triangles.empty() && !sup_top.empty()) + top_sup_triangles = triangulate_expolygons_3d(sup_top, clip_max_z, false); + } } if (!bottom_obj_triangles.empty() || !top_obj_triangles.empty() || !bottom_sup_triangles.empty() || !top_sup_triangles.empty()) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 5edca6c96..2361ff6d3 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -769,19 +769,17 @@ void Preview::load_print_as_sla() unsigned int n_layers = 0; const SLAPrint* print = m_process->sla_print(); - std::set zs; + std::vector zs; + double initial_layer_height = print->material_config().initial_layer_height.value; for (const SLAPrintObject* obj : print->objects()) - { - double shift_z = obj->get_current_elevation(); if (obj->is_step_done(slaposIndexSlices)) { auto slicerecords = obj->get_slice_records(); + auto low_coord = slicerecords.begin()->key(); for (auto& rec : slicerecords) - { - zs.insert(shift_z + /*rec.slice_level()*/ rec.key() * SCALING_FACTOR); - } + zs.emplace_back(initial_layer_height + (rec.key() - low_coord) * SCALING_FACTOR); } - } + sort_remove_duplicates(zs); n_layers = (unsigned int)zs.size(); if (n_layers == 0) @@ -796,11 +794,7 @@ void Preview::load_print_as_sla() show_hide_ui_elements("none"); if (n_layers > 0) - { - std::vector layer_zs; - std::copy(zs.begin(), zs.end(), std::back_inserter(layer_zs)); - update_sliders(layer_zs); - } + update_sliders(zs); m_loaded = true; } From b2ef3ba291e3df265a52e8e69e3b99b10178aa75 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 22 Mar 2019 23:00:23 +0100 Subject: [PATCH 227/236] Fixed the options override box at the side bar. --- src/slic3r/GUI/GUI_ObjectSettings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp index 3781cbf45..db9af7cce 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.cpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp @@ -40,7 +40,7 @@ void OG_Settings::Hide() void OG_Settings::UpdateAndShow(const bool show) { Show(show); -// m_parent->Layout(); +// m_parent->Layout(); } wxSizer* OG_Settings::get_sizer() @@ -119,7 +119,7 @@ void ObjectSettings::update_settings_list() if (cat.second.size() == 1 && cat.second[0] == "extruder") continue; - auto optgroup = std::make_shared(m_parent, cat.first, config, false, extra_column); + auto optgroup = std::make_shared(m_og->ctrl_parent(), cat.first, config, false, extra_column); optgroup->label_width = 15 * wxGetApp().em_unit();//150; optgroup->sidetext_width = 7 * wxGetApp().em_unit();//70; From c623cbc4d72bbd5e05c27946292139fd2576b7fc Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 22 Mar 2019 23:10:11 +0100 Subject: [PATCH 228/236] Fix of Perl bindings --- src/slic3r/GUI/Preset.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index ee795f2b9..ac1171e18 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -11,9 +11,10 @@ #include "slic3r/Utils/Semver.hpp" class wxBitmap; -class wxChoice; class wxBitmapComboBox; +class wxChoice; class wxItemContainer; +class wxString; namespace Slic3r { From 4f585f11575d49dd086bc65badd4b3ebe2f10955 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 23 Mar 2019 08:23:22 +0100 Subject: [PATCH 229/236] Improved rendering when deleting an option from object's overrides. Replaced the single column icon with an empty icon. Will it break something? The single column added an ugly spacer in front of non-editable combo boxes. --- src/slic3r/GUI/Field.cpp | 5 ++++- src/slic3r/GUI/GUI_ObjectSettings.cpp | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 026b62ab5..9cd933160 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -540,7 +540,10 @@ void Choice::BUILD() { else{ for (auto el : m_opt.enum_labels.empty() ? m_opt.enum_values : m_opt.enum_labels) { const wxString& str = _(el);//m_opt_id == "support" ? _(el) : el; - temp->Append(str, create_scaled_bitmap("empty_icon.png")); + //FIXME Vojtech: Why is the single column empty icon necessary? It is a workaround of some kind, but what for? + // Please document such workarounds by comments! + // temp->Append(str, create_scaled_bitmap("empty_icon.png")); + temp->Append(str, wxNullBitmap); } set_selection(); } diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp index db9af7cce..dbfdb8e6c 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.cpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp @@ -10,6 +10,8 @@ #include "I18N.hpp" +#include + namespace Slic3r { namespace GUI @@ -84,6 +86,7 @@ void ObjectSettings::update_settings_list() btn->Bind(wxEVT_BUTTON, [opt_key, config, this](wxEvent &event) { config->erase(opt_key); wxTheApp->CallAfter([this]() { + wxWindowUpdateLocker noUpdates(m_parent); update_settings_list(); m_parent->Layout(); }); From 9652e8193a48d53441c2210a6f2d988b3ba811e1 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 23 Mar 2019 10:04:44 +0100 Subject: [PATCH 230/236] Fixed caching of profile selections at the plater. --- src/slic3r/GUI/Plater.cpp | 6 +----- src/slic3r/GUI/Preset.cpp | 1 + src/slic3r/GUI/PresetBundle.cpp | 1 + 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a2ab8c3f1..f9c598ce3 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -327,8 +327,7 @@ void PresetComboBox::set_label_marker(int item, LabelItemType label_item_type) void PresetComboBox::check_selection() { - if (this->last_selected != GetSelection()) - this->last_selected = GetSelection(); + this->last_selected = GetSelection(); } // Frequently changed parameters @@ -829,10 +828,7 @@ void Sidebar::update_presets(Preset::Type preset_type) preset_bundle.sla_materials.update_platter_ui(p->combo_sla_material); } // Update the printer choosers, update the dirty flags. - auto prev_selection = p->combo_printer->GetSelection(); preset_bundle.printers.update_platter_ui(p->combo_printer); - if (prev_selection != p->combo_printer->GetSelection()) - p->combo_printer->check_selection(); // Update the filament choosers to only contain the compatible presets, update the color preview, // update the dirty flags. if (print_tech == ptFFF) { diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 3da4c1871..82223b15c 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -988,6 +988,7 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui) ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); + ui->check_selection(); ui->Thaw(); } diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 9f4261372..f78a04126 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1529,6 +1529,7 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr } ui->SetSelection(selected_preset_item); ui->SetToolTip(ui->GetString(selected_preset_item)); + ui->check_selection(); ui->Thaw(); } From 3f7f8f978eb6b08e27454c2c090f28dcb4c00a96 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Sun, 24 Mar 2019 13:35:09 +0100 Subject: [PATCH 231/236] Fix of sla gizmo (it sometimes showed supports for hidden objects) --- src/slic3r/GUI/GLCanvas3D.cpp | 10 ++++++---- src/slic3r/GUI/GLCanvas3D.hpp | 5 ++++- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8be187dec..3192e7861 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2293,11 +2293,13 @@ int GLCanvas3D::check_volumes_outside_state() const return (int)state; } -void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible) +void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) { for (GLVolume* vol : m_volumes.volumes) { - if (vol->composite_id.volume_id < 0) - vol->is_active = visible; + if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) + && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx) + && vol->composite_id.volume_id < 0) + vol->is_active = visible; } m_render_sla_auxiliaries = visible; @@ -2313,7 +2315,7 @@ void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject } } if (visible && !mo) - toggle_sla_auxiliaries_visibility(true); + toggle_sla_auxiliaries_visibility(true, mo, instance_idx); if (!mo && !visible && !m_model->objects.empty() && (m_model->objects.size() > 1 || m_model->objects.front()->instances.size() > 1)) _set_warning_texture(WarningTexture::SomethingNotShown, true); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index d9e38c4e0..29e0fbb08 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -584,6 +584,9 @@ private: bool m_regenerate_volumes; bool m_moving; bool m_tab_down; + + // Following variable is obsolete and it should be safe to remove it. + // I just don't want to do it now before a release (Lukas Matena 24.3.2019) bool m_render_sla_auxiliaries; std::string m_color_by; @@ -610,7 +613,7 @@ public: void reset_volumes(); int check_volumes_outside_state() const; - void toggle_sla_auxiliaries_visibility(bool visible); + void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void set_config(const DynamicPrintConfig* config); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index c629f2172..31f6b0278 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -666,7 +666,7 @@ RENDER_AGAIN: m_imgui->end(); if (m_editing_mode != m_old_editing_state) { // user toggled between editing/non-editing mode - m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode); + m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode, m_model_object, m_active_instance); force_refresh = true; } m_old_editing_state = m_editing_mode; From dd3ac4017a3001da6ab01d2b9ce54f42d0891b99 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 25 Mar 2019 08:48:41 +0100 Subject: [PATCH 232/236] Yet another tweak to the logic for releasing mouse capture into GLToolbar::on_mouse() --- src/slic3r/GUI/GLToolbar.cpp | 59 ++++++++++++++++++++++++++++++++---- src/slic3r/GUI/GLToolbar.hpp | 2 +- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 1a8539aef..00596a9cc 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -413,14 +413,60 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) // mouse anywhere //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - if (evt.Moving() || evt.LeftDown() || evt.MiddleDown() || evt.RightDown() || evt.LeftDClick() || evt.RightDClick()) + if (!evt.Dragging() && !evt.Leaving() && !evt.Entering() && (m_mouse_capture.parent != nullptr)) { - if ((m_mouse_capture.parent != nullptr) && (m_mouse_capture.parent != &parent)) - { - m_mouse_capture.reset(); - std::cout << "Dragging restored by toolbar" << std::endl; - } + if (m_mouse_capture.any() && (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())) + // prevents loosing selection into the scene if mouse down was done inside the toolbar and mouse up was down outside it, + // as when switching between views + processed = true; + + m_mouse_capture.reset(); + + + std::cout << "Dragging restored by toolbar ["; + if (evt.Entering()) + std::cout << "Entering"; + else if (evt.Leaving()) + std::cout << "Leaving"; + else if (evt.Dragging()) + std::cout << "Dragging"; + else if (evt.Moving()) + std::cout << "Moving"; + else if (evt.Magnify()) + std::cout << "Magnify"; + else if (evt.LeftDown()) + std::cout << "LeftDown"; + else if (evt.LeftUp()) + std::cout << "LeftUp"; + else if (evt.LeftDClick()) + std::cout << "LeftDClick"; + else if (evt.MiddleDown()) + std::cout << "MiddleDown"; + else if (evt.MiddleUp()) + std::cout << "MiddleUp"; + else if (evt.MiddleDClick()) + std::cout << "MiddleDClick"; + else if (evt.RightDown()) + std::cout << "RightDown"; + else if (evt.RightUp()) + std::cout << "RightUp"; + else if (evt.RightDClick()) + std::cout << "RightDClick"; + else + std::cout << "UNKNOWN "; + std::cout << "]" << std::endl; } + + +// if (evt.Moving() || evt.LeftDown() || evt.MiddleDown() || evt.RightDown() || evt.LeftDClick() || evt.RightDClick()) +// { +// std::cout << m_name << " - " << (void*)m_mouse_capture.parent << std::endl; +// if ((m_mouse_capture.parent != nullptr) && (m_mouse_capture.parent != &parent)) +// { +// m_mouse_capture.reset(); +// std::cout << "Dragging restored by toolbar" << std::endl; +// } +// } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (evt.Moving()) @@ -444,6 +490,7 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) { std::cout << "Dragging prevented by toolbar" << std::endl; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + // if the button down was done on this toolbar, prevent from dragging into the scene processed = true; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 3d72266c9..a0c0d9ca7 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -239,7 +239,7 @@ private: GLCanvas3D* parent; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - MouseCapture() { reset(); } + MouseCapture() { reset(); } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool any() const { return left || middle || right; } From 149551946ca2f6f932d7e9f1f0ba461b956615cb Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 25 Mar 2019 12:07:43 +0100 Subject: [PATCH 233/236] Fix of #1998 --- src/libslic3r/Format/AMF.cpp | 11 ++++++----- src/slic3r/GUI/Plater.cpp | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index f5219263d..ff1da37cc 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -175,6 +175,11 @@ struct AMFParserContext bool mirrory_set; float mirrorz; bool mirrorz_set; + + bool anything_set() const { return deltax_set || deltay_set || deltaz_set || + rx_set || ry_set || rz_set || + scalex_set || scaley_set || scalez_set || + mirrorx_set || mirrory_set || mirrorz_set; } }; struct Object { @@ -644,11 +649,7 @@ void AMFParserContext::endDocument() continue; } for (const Instance &instance : object.second.instances) -#if ENABLE_VOLUMES_CENTERING_FIXES - { -#else - if (instance.deltax_set && instance.deltay_set) { -#endif // ENABLE_VOLUMES_CENTERING_FIXES + if (instance.anything_set()) { ModelInstance *mi = m_model.objects[object.second.idx]->add_instance(); mi->set_offset(Vec3d(instance.deltax_set ? (double)instance.deltax : 0.0, instance.deltay_set ? (double)instance.deltay : 0.0, instance.deltaz_set ? (double)instance.deltaz : 0.0)); mi->set_rotation(Vec3d(instance.rx_set ? (double)instance.rx : 0.0, instance.ry_set ? (double)instance.ry : 0.0, instance.rz_set ? (double)instance.rz : 0.0)); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f9c598ce3..e15882125 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1713,8 +1713,8 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode object->center_around_origin(); new_instances.emplace_back(object->add_instance()); #else /* AUTOPLACEMENT_ON_LOAD */ - // if object has no defined position(s) we need to rearrange everything after loading object->center_around_origin(); - need_arrange = true; + // if object has no defined position(s) we need to rearrange everything after loading + need_arrange = true; // add a default instance and center object around origin object->center_around_origin(); // also aligns object to Z = 0 ModelInstance* instance = object->add_instance(); From 3e0ec8098bce46673c4b0325b85825008ead9d03 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 25 Mar 2019 14:13:20 +0100 Subject: [PATCH 234/236] Code cleanup --- src/slic3r/GUI/GLToolbar.cpp | 65 ------------------------------------ src/slic3r/GUI/GLToolbar.hpp | 2 -- 2 files changed, 67 deletions(-) diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 00596a9cc..2f7f13f6f 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -157,9 +157,6 @@ GLToolbar::GLToolbar(GLToolbar::EType type) #if ENABLE_SVG_ICONS , m_icons_texture_dirty(true) #endif // ENABLE_SVG_ICONS -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// , m_mouse_capture({ false, false, false, nullptr }) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ , m_tooltip("") { } @@ -412,7 +409,6 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) bool processed = false; // mouse anywhere -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if (!evt.Dragging() && !evt.Leaving() && !evt.Entering() && (m_mouse_capture.parent != nullptr)) { if (m_mouse_capture.any() && (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())) @@ -421,64 +417,10 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) processed = true; m_mouse_capture.reset(); - - - std::cout << "Dragging restored by toolbar ["; - if (evt.Entering()) - std::cout << "Entering"; - else if (evt.Leaving()) - std::cout << "Leaving"; - else if (evt.Dragging()) - std::cout << "Dragging"; - else if (evt.Moving()) - std::cout << "Moving"; - else if (evt.Magnify()) - std::cout << "Magnify"; - else if (evt.LeftDown()) - std::cout << "LeftDown"; - else if (evt.LeftUp()) - std::cout << "LeftUp"; - else if (evt.LeftDClick()) - std::cout << "LeftDClick"; - else if (evt.MiddleDown()) - std::cout << "MiddleDown"; - else if (evt.MiddleUp()) - std::cout << "MiddleUp"; - else if (evt.MiddleDClick()) - std::cout << "MiddleDClick"; - else if (evt.RightDown()) - std::cout << "RightDown"; - else if (evt.RightUp()) - std::cout << "RightUp"; - else if (evt.RightDClick()) - std::cout << "RightDClick"; - else - std::cout << "UNKNOWN "; - std::cout << "]" << std::endl; } - -// if (evt.Moving() || evt.LeftDown() || evt.MiddleDown() || evt.RightDown() || evt.LeftDClick() || evt.RightDClick()) -// { -// std::cout << m_name << " - " << (void*)m_mouse_capture.parent << std::endl; -// if ((m_mouse_capture.parent != nullptr) && (m_mouse_capture.parent != &parent)) -// { -// m_mouse_capture.reset(); -// std::cout << "Dragging restored by toolbar" << std::endl; -// } -// } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - if (evt.Moving()) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// { -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ m_tooltip = update_hover_state(mouse_pos, parent); -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -// if ((m_mouse_capture.parent != nullptr) && (m_mouse_capture.parent != &parent)) -// m_mouse_capture.reset(); -// } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ else if (evt.LeftUp()) m_mouse_capture.left = false; else if (evt.MiddleUp()) @@ -486,15 +428,8 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) else if (evt.RightUp()) m_mouse_capture.right = false; else if (evt.Dragging() && m_mouse_capture.any()) -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - { - std::cout << "Dragging prevented by toolbar" << std::endl; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // if the button down was done on this toolbar, prevent from dragging into the scene processed = true; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ int item_id = contains_mouse(mouse_pos, parent); if (item_id == -1) diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index a0c0d9ca7..5fac1f5b2 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -238,9 +238,7 @@ private: bool right; GLCanvas3D* parent; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ MouseCapture() { reset(); } -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool any() const { return left || middle || right; } void reset() { left = middle = right = false; parent = nullptr; } From aca2ffcdfbefecf00437d89a965d1ccdade567e6 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 25 Mar 2019 15:06:29 +0100 Subject: [PATCH 235/236] doc: Warn about build dir being too nested on Windows --- doc/How to build - Windows.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index 627f1c99b..020b28958 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -91,6 +91,10 @@ You can also use the Visual Studio GUI or other generators as mentioned above. The `DESTDIR` option is the location where the bundle will be installed. This may be customized. If you leave it empty, the `DESTDIR` will be places inside the same `build` directory. +Warning: If the `build` directory is nested too deep inside other folders, various file paths during the build +become too long and the build might fail due to file writing errors. For this reason, it is recommended to +place the `build` directory relatively close to the drive root. + Note that the build variant that you may choose using Visual Studio (i.e. _Release_ or _Debug_ etc.) when building the dependency package is **not relevant**. The dependency build will by default build _both_ the _Release_ and _Debug_ variants regardless of what you choose in Visual Studio. You can disable building of the debug variant by passing the `-DDEP_DEBUG=OFF` option to CMake, this will only produce a _Release_ build. From ba66f34c4572beae3600a8557f89435ceaac2f5f Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Mon, 25 Mar 2019 15:50:07 +0100 Subject: [PATCH 236/236] Build: Add an option to choose GTK version on Linux, fix #1937 --- CMakeLists.txt | 2 ++ src/CMakeLists.txt | 1 + 2 files changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 90ebd1e5b..1e6cf45bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,8 @@ option(SLIC3R_PERL_XS "Compile XS Perl module and enable Perl unit and option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0) option(SLIC3R_SYNTAXONLY "Only perform source code correctness checking, no binary output (UNIX only)" 0) +set(SLIC3R_GTK "2" CACHE STRING "GTK version to use with wxWidgets on Linux") + # Proposal for C++ unit tests and sandboxes option(SLIC3R_BUILD_SANDBOXES "Build development sandboxes" OFF) option(SLIC3R_BUILD_TESTS "Build unit tests" OFF) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aae3436ae..a6ae94391 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -60,6 +60,7 @@ if (SLIC3R_GUI) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + set (wxWidgets_CONFIG_OPTIONS "--toolkit=gtk${SLIC3R_GTK}") if (SLIC3R_WX_STABLE) find_package(wxWidgets 3.0 REQUIRED COMPONENTS base core adv html gl) else ()

      5LV$Htv-^rtlYFndc~ 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