From fd1c5dd2181a03641ae99218b4178fecba2ca95e Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 31 Oct 2018 16:22:36 +0100 Subject: [PATCH] WIP: SL1 profiles, SL1 in wizard, switching between FFF / SLA --- .../printers/PrusaResearch_MK2.5MMU2.png | Bin 0 -> 71328 bytes .../icons/printers/PrusaResearch_SL1.png | Bin 0 -> 41541 bytes resources/profiles/PrusaResearch.idx | 2 + resources/profiles/PrusaResearch.ini | 254 ++++++++++++++++-- slic3r.sublime-project | 2 +- src/libslic3r/Config.hpp | 5 +- src/libslic3r/GCode.cpp | 4 +- src/libslic3r/Print.hpp | 2 +- src/slic3r/Config/Snapshot.cpp | 4 +- src/slic3r/GUI/BackgroundSlicingProcess.cpp | 2 +- src/slic3r/GUI/BedShapeDialog.cpp | 6 +- src/slic3r/GUI/ConfigWizard.hpp | 2 +- src/slic3r/GUI/GUI.cpp | 4 +- src/slic3r/GUI/GUI_App.cpp | 12 +- src/slic3r/GUI/Plater.cpp | 45 ++-- src/slic3r/GUI/Preset.cpp | 66 +++-- src/slic3r/GUI/Preset.hpp | 30 ++- src/slic3r/GUI/PresetBundle.cpp | 59 ++-- src/slic3r/GUI/PresetBundle.hpp | 2 +- src/slic3r/GUI/Tab.cpp | 44 +-- src/slic3r/GUI/Tab.hpp | 11 +- 21 files changed, 408 insertions(+), 148 deletions(-) create mode 100644 resources/icons/printers/PrusaResearch_MK2.5MMU2.png create mode 100644 resources/icons/printers/PrusaResearch_SL1.png diff --git a/resources/icons/printers/PrusaResearch_MK2.5MMU2.png b/resources/icons/printers/PrusaResearch_MK2.5MMU2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb5dccf08c6492825f2706d64805e2ba526d354c GIT binary patch literal 71328 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

X=%+NZBI531A>dAY2^iq9WcOZK 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

JEdk^NC_(}C2HjTtCe_E1U^ zB~cjct|M}3(3)V#aU8s3no_UTX*L^d+PaVgU6CNCsT1k4msQ9XhBc#80F>v!+vo_ii*xu5go=f9ruW8a~?^BeT7UzDs_+P|h&o8F|OT{83*1MT9ZXYA@-luG&HrB@UklQE+calLX-cPtGseX ztzIL|5;ko)6Di=;qjcIOY-5D3MYtMcj-tzzp%g4!TP0}Rhj5D@!<&_r_ML`lET;C912D=I- zD}5D44IN5lbfHg%Q5ZD}Vnq1K+v>g6{F{(BjC}s+e2o$=@2i^TDnclgq`TDSoC~kI z0l2l(UU?-#jAr5(Tg}9g0&6_N$7E?89SKTblE`4V7=g7BUJj)x;P~+)yyTUy$NPwX z`1_A>_St9iu0MM(=bd{V|NR$#mal&O8~o+R{*E|KAK#$8_Y`HoYoB)Q6{Km35Q4NG z^}g|yFWqt9cfWPbmp}K}SG?fIUiS0jQm6g$l^xmSQ6roR4*pX6#6nGmM%z*Cl z3TJM;HooGj3-GQeosUx)MFG)(x}y0w{8)4(~7%MB~#Uv9B!0ec!UDwe3gtzl$SUkwsa{a%|^z)M-FlQjd!Aw8q>{5 zyf-+R(;MGJ*(uRF9nE+tMc8_~OFfciiqsNY7*v)J>u{mGDM3ag6BBfMEyUEt)U~F+ zG)J>OhVz16zr*r!j+GHR&e_hUb#)9u=tc~uepR2yyAw=x=v+sJ>%?kTz|hr51aA0V zLr;8y6sMu}#m;>rOLc8uz8%&cF}*S`8SoE1FlSwDb|B_Dp@UvYh-$upk&JpRjDevR71 z1PhCcquRw|tstB$1X-H0Yu7G5_qi|fm9KoAJHB@>S-t+gXkv_q_CBb;`_1crVcQwo zNRuj2%2H~z8gZmZvY4!%obYHgGmI8xDNB-Aamgi@#{gcM!kL^#Bc;}?W4%KvNtUIg zNkW{YWVIT#%Ba`Pu4j679pC-dXF0O}L1tz)hnawBttzp*An96`;bK&ttfJ+v#*-B_ zRZ4-gVJd*q0k(T+=YIM|Fg`v(lBF0Gv*+%w)4t=&GbXen{N6!mJ38P@RvkAPnlmNYKFkV=I2?B!6D5yDIGg3^XDB(W0M(v1eucRC#!6BAr;*+ooFHTj3X z|0tjR!e@B?3tr6mmp_p|{?p&%uG?;PGc(hVtIHvW$(@vf(pZijpX2z#Joi8F5LZ3v zi61@d!V9|dx#tU?|Ce7F^m~j=PLN~?NtO_&DM^-+XhkG7ky4{atRi$IO6MhUTqDh5 z4G<-�v634eL|tS&bw~NRpT|i&njJqrq5njCC6~bMGDBV*jo?nVec5NaR|N8g;!7 z22J%joC`l&6XbE7wbgTB`z?xqmr4=h(@v+$;&Pv{u?dE?1ur%Ce&?GQ9iuL|nxefD z;!*2x#!(1Z>=i68bm+AP^jZV*&LAW_aRW8IiDazK(%xgNeB&z&Zhb#DfBWk^uxls% zq7TxNCNZ@v!}x-w#bvtfUL_Hrs$C~MhC(|+40oO(FQN*wq&VUA!7f9SvDE5>o8p8U zWbL`|#wc z(BOu$Zs1&?zl?ZJQnPv8I^OjMZ{=;j^UJ*U)j!3DKl({l1|9y}ulx*Y67j?*JvqR3 zk2Ae%gu``veKu{}Kvrv11r*OYXP;Bvd;f!fc-QxC{k{7ixNr83+irW#)1LjDuO2+G z|Aafm8WA$};Zx4zl|YH8blxKGSLD>T-h@+S+tI=w=*n8*A=*dY2J1)g| zLmX?&prAh}a7xndmmFX0a%`nfQ5cl;bRT(y<6r+a`|di-^7M8NpM3@2oqPs|7Fq~j zk{2a-Phkqcp`|9z3l^7JVMIek1#mVztO=r#Zirj^P%QG!;|?*UK`DrdzAD-TZ+rCc0e;{|evCK#>hJQ6uY8$reB+C}=5;^8ul&+)^R9Qj zlh^*(ODF~dYW4c4n);Xq?LBhXsEQXvkpyXR!m_x$z=-`II+HD1H_=G5(hMx6gTmPqK*ze2S|PO~ zPD;`=CP_1Djeuy>>J7GTJriR~zH|LQ5i7{*&5;0&_d(vEDEbVwtw)Wum1jQjYd8U6 z08s$`ho4sv!mQGiP$ zv2LG*K}n$^bgXIbJI2Fz9pKQq3pq~A1K;@y5AVJYmDE58;xt7@idMJ9QhNyqe2}H3 zWd? i{Z8if)=)WQ!dfYmPKRv|X;JhluT%sU^XfQ_vltH$rDyu&+>DGk=zaKqTu zunh;@c8jUmO@l4l&;2}MH}3&`V1Q>}iV{->#-w)+YdvKdzV|XhM2aMi@Gek;m6YI0 zyfYvK!$RHWty{V2d*9*eYcA#XJ8tE-f9vg>eg64;=p%na(eLrjcmEZaJmGS`u($x? zq+RBurK^c5Hr%x!k)d(b2Y`Kfd4Zq#sn@*iYhV8CTkgI07C!NbkALnpKkZnLFHM5@P_#`)f z`(G%#i%d?ftArc_gyozI2Au~lt+hHKeq6hTrEP1%7z80j(9B@XHts?qq@=*u0wp7G zjwFd$SXgA=!#g?u>Z>{84b7s<#>tFCNe(Y{D3l0{omf*82JK<6aFm0awo`7skmUGb zcJ129^5P=vH*O|N6Y$XK_OR9v)niIiU`#=$Thj0M86O|RI=dQTgoAw)8ZksK@M82i zopGZbYIuXgYGHA0$RVm6LR7z8#k9k+&S0(M+>5XJ5-@C4>I{wAc|Rykz|VsW#c-rY za3UoV6-|&tDF{QQ1cpH3(FnOJ(_0J%tSl_@!H@m}&wJJjc*i^bkS~4xi~Po0f1B65 z`VIWapZ+PGe$F$W@l2MNmrrZZ65$;p>`5Mn5T2Q-2{vw+Wy88@Vx_p~qV27p`sttf zSQIt6?S@;NUoj z89MJ_m*-eW#_9Fus26h_I((G<2M;naF-e-Flx0XrTPtk_-9BTrafAy3I=x<>m6bMH zpX3-u(C}(Fv05G+eoiq8A*7P45MKqC2_Z*e#1Q`-q9h^wk|X?lNP6mZ+MIFLh5MW1 zlQ$At#o7cZvmP+O`+lDH1E<|tj14`%LJ%5divktKzg2(7gABX1w;p49_=@bdw6MU- zUi?am#d-e6Z~g+8UHSyx^Oqmu@=Kq{>t6p#Zu#!Fxb)&n81x5^rVE_3v^c>P1TJ$? zl!1J01A(XA>hKG{@P?oI>X*LqLpOZ!GZTOO$A9=U$@utksmkuYR2$ zd(F!q_2y0}BZMW5J=T^PK$0dtj%uVbCCdck%?yR2(Hvv**6lp_z+D`AnQRZDWOyKtSP04v}XRu z5pF)zBFQ4_AtKKLe(|KLE9=G&Nom#^BUHD{Zl-A!^Seze`S@sJv8P%FpyFf-a7{U9x4(zg3~CCCyEsK z94QN^#$HPyakvUf^~g2dTGN^x65>D-Q2dyaI{zt#}gX5ddp|2G0`qQ_6_*-B3 z`YX3>*-{1lqhNg%^Ve7rInq>Py=egGIJIfgKqoOel4ME7_{0QT&p3;t#}2Ub{%~pP!tZJQ=5X)Y8>Ej{qSdz*$dOSkjut5sDB;kIr-HCFg$UeeeH^SH0#nul>8D z?L)lrCtvgNCtZ4t(?WluDtDhyuu@7Jk0MeU;YAIgR;#J# zFb8CfVGP-5)_EeO*neP-eS7w@ecN8n*mf3;&D+DNt2aqEZf0fwZjRpiO_mmx*mw9C zah4G&MYrEY2}PFH$cqBJ8}Uz+RCr?v8UUVFYXOtz44b!h;#D@sOu)Y5T z<9Dk#U*Kp|Bqv|R)x%w&dc6>W?#eRLGn+c=H=p?>LL%7WMDLu3d&m}pJRg=I!Mkc$ zYN!opT|@XOyiaky#M&_O+SvfTn*yWisY!Xi(5#&fvh>L+vC9k=k= z&wYlUd-Jbw?Ngq?{QTUb(3+E%thOm}0+_EPWl>;_4e*K&cmDj`BF}&R(?9-^4}a** zQ&Zd7d1#(5fBpJ@_})FYzx&?1?~NH&CaMagK$OBuQZ&lC5ORz)yi8+Ml#ymlHg4Wb zVd0jWzJR8nRvQ~36Qhb4Vd|(G#*5BY{fH&j7>o_xdbrgNv-aUc0Ou{vh6`_pMV6`< zQ<~t7hf=`4+Q!3VuvH>cz1~2l<2 zTX}HzBg9dRA|NZ)2L0>Ogn5iwuL`#d8RQ!r0%uB!!Ez<%AXed8R-s!?^3=gQ8iY6C zEp~{}j$XEA=VgfQ49|zbSA{36LpZQyiT9qfFTUbSz`Xaq@ZNV=8#{;a10iH7Dh@}e zmaHC|M3ATw=li%S;kK@h^{OHl62^DH0lqBL^3wLj^_9* zx8M3zTz{U)$r+FWrNaDZS^4`RjWWz%sqPvV!VYiEC>|cFKsoP6UU0RHTfNa5OiU?F zo|klbJyg}f9K41c@e>5T!h&s3Y8sy;N}DXV1{~>o_Am7~cyNwRwi5`vX!nj^{C@xIzTB~!t zb|+MoAdWR9`Cx@8N-9h@gh#fDIY*NfhC8STM1N;(P(4NBysUBshpi?c4F7Hz9T8g4 zoGCFy9tc!66#krtUZ+jg81rYIckyQd9P)k@2l2h8C|hhOoU$LU-}7Yr``{Hhcwj zh0kh@AxmRo1-)*EW@9WscEjq|u$Z$Nu@cmNhZRXxk$wOXILyX6lpH3s5-BwZi7BfI zy>X0`k~m62^8t!(cOGXtBuR>KLp^M90=?j5PKL9gbU#8WZ7U~yK3RWd8`Rg znv|i*SA^mNgMN?mpK$HBl+wGcwL%Ed0RRa>_P%<~xnUw$NGVGxr3rt-nPCW|mBI=I z1jw+T=eV*9woPdYB(j1QT`021!1vKr_|O~l=yf~%(`P=*6<0oqU-`8+^G~1tG++GE zH}D>Q@t1#rYp%Zbsn37j55Ie6cKWU3V-wAw${A^*IA~pj zj*?_(YW&R4{KQ|~a_3DKyz`IW`BPV3cGaCaiMaW`o4EJRd)JSTO|fp>G&g_!#@BuG ztJnWaZ)xeA?Ps6OgM0S!&|NpNesT;M#UOmu?ai9ZzCt*>Lskv2s};Zs&^NY{-VLR2 zfgH9Coq$iDfaFw{-dIbcR%7GLB!fcuQa3GIp3!&m;K^1|MaLc`$&8=@9c zs_K|S__U^`jfzvEBtz;ba8Fc3uiIwB*6qt1ww(EO=bU!VwXLaoHsaULm@~?gc7)_%UcRd&jliul%je~xcRgYcw2_1VxZgU@uC;MgfD*O^Su5i zUdm6r{-?O{TQ`x$32*)NU**1C4{~JT*z~9V^;2&?ws3sMV;M7qp2Ab+jm8+VT1p&0 zri&js1O>=iEh~TN*M9MXZ~mn>efXb0^Utri|L!|q)W{moU0GU~-nem^o4)zAjo-cb zJ3oBQwNGL58E5d&{Wr62BBL;pcBhR}fjFeASip_KC0S+V9$De1-dAy^wN>b05H^UT zyCF2Mwgb%n7qX#ZX)rq4dQbiPHUd7CYyfCD3Mx+(} zeh=5RWLXWFWOO>ckieRVZnuMVVK%x}P|G6HBs3660oIl{7gc%0unT)gyA)MJvO2lXp@hbjfkN?^23^I@qPkjkctYYhqS36K>feYp zUx)jdVpSEt32Y&VeCsr;v)oKyy9b%@&R!No@;eD!bMhJ(CDj3W?OO0h8crNiCwG6Kc&dwQtvh zKfULko6cFkaU+94AE`82C1^Fks1j#GSBL_zp@CHhDgnR>oA$xeIOixzLt+B-WUa0G z+bl{5LNkQN`%1vTSzKu`&fu-7DvJW49BGm&c^w465ZE2$q{TQ+HTJJnG>a_-)RF4|qq*8H` z#*D8!n>)XE%QegU?w*;RnHn`y25}ey$3aT0TCM8&inKF~_B^4>LHH0GJMXIbhO!DX z+!|vWQcXvns5)AK@Cqj?NVEC~ag@-gH>r14FwRk!vI;RO{2R4KeaV9#Rxv#|a22*I zM8zo)71P%XoYW%(V$^{m120&sP$pK@>=>=1poApVXy@_-2+&v9`cNh~7-@);MfHOh zk48F19vdnSN7(B7-4>Ixn-=R6v)@}eq-*;)6y7~Ee zH#RoL_20anxBb@J&e*(uy)u9UYgjw18ij2k6ipOL2DD;`B&cfZH*QVhBRtNU zFt|~Kc6eKbAFeX}VbT;n*ec{EL>Rn|P#yK~z*5=mQ z+ak9MyI zSR@hN30xpoKej=y!8b=Q9G1UNv({E*Wo6LXdmjU-_dbjlIYi%F<$7C=mc!k_S8<}K zcBD$us1k9HbVRHp(ln-?)rjIs20{2owayJGo+t90t4km}5+8Pip>OgQ=gKugn3aKh zL)mLHz3qaXUM9Pi7LG?nQ7ju{3S&%etu35$r7^~O@2&UVE-x>;BS((-dcE#H_`whQ zy?gd@-BX@wN^2;~lBJ~;uDtRJUiZpp^T5tMeBgbb!FNjXL7$R*bnS!}I9paXS%5gL zvsKC6v9i(zr_oxmytGKaDDX&>)L3t;UQ%`1QsF4%VAV_e#~{p$lfDj(S_8^^9}&u> zvG+a$+}Pwqe(N{CMA4cf&FWRvYc(_wReY*sgcNxd#|({km2ozVPs0faVkQtehfNuj zPHmiHWgMWoNRG%&VY{v5zpBcg_YP6bso=Ep7ih@Fylx2=F9`6H$ z7rbSaU{yDmuZ%TRGDGaW%G(`woC|~u$)QpTsT6S(c86M)QBP|`N{>qXL&2OOCnabH zo(SU!AxGzP$a@(=RUUzq8YwI3FG8i!7KUtmeGxThZ(Eo@7WI4GZc(kWEK6gCPPw#| zQM={kWj7cM{9rKP3t#v`KUEAZz4yv{uYt%p z7b~Sa5Z!m%P3Nr~eS~_mj`gP6B15l8D5Uw-H}fIv5W-f*yb3=JjoMZ5q7Z(Bau{PV zrKK!Olq!P3NEZZPs#0O7=J^Wpk__9IoDKTBkxod`I?Y;9#pMx7_EBN=1ZfTZNuf zsz(72H>1Qjczijkc&>WwRZeu^uB?V#4p2yRl#-0Ezq{4yv^y({Vvy&>U@$0)q9}`^ zFhx<=q9|-xmUb{0xS}Y0tJQKvQTQ)>;S1hc>j665u8_4_&=${9mRpN_<|{WNorAi9 zSQ2F^Ns?9Zf8d=98_M>=gG3>P7!~fc)_5OU>_&6rg(s3an2H-#0#9SmYeSAI0&`+$ zaHn2k%|rSiw2Sv_lBtD&?MGgQ*xMZ6a*L!^&d#04lU)K`6#Ji`JSXO=$QA zLP&HahOTu)S>}``$C@xK(%B#>X1qs=>L&A{>0kHH#YQkdmKeMAdMqBGE9|C zMMUI0o({&Bgf=lMR-Xp7s$_*%-~&%)IJnAHaGs(Pr4|yQ1xiP#C_24|Uel>C?4ds4 z;-6-n;H8~&3W$|bd*_cI|KYoC{L0HG$D4RTCA(#+Sk#8CuQb@A#2Zspv_io`7%`f+ zB8A6!8R($+(G)ByTsBZ4-3ak;&fv`S`5?sWYoM%AX}TIKArR;&BCRz7Y$i2v z6cgnUd9KN&Knh1mprsmT@xq~`Lkw~0s+&!VFjZ9`*2r^JA&FE-snJn_(sB4+M|cro zoT&QqEcqZuN?my=hsRb4a`;5n8vL z_Xr2kup`9>aeVJQLP?yeb`d$m!zH%#^!s_Ju2yvdsTIzIk==)mAEdRs%voohO|nLZ z{FDa02HSAMKtpiqrqh!QSvco}_g;AKg|#+Hl4O6c*Sql6uYdNpV+~426lGC4m5O`e zL0ChT%7$38N)m@eBfCZ%1|MjS5~?0FftLa&UB!nEj5}+>yh0%aUU{Tj?UP%(+YFP$ zP^PZ7ZBfZo#eoN*bwm`$#8FI7DO5EavQUyD?^W1xh-F08<|G9uZ;_%Jo+CWcRZ5#u z;bnqUF*?f7QAUy^#BoBFWF)mQvf3C*$KmWt8F(wKcCQ#S)Ux(qhWSBA-ispexs@bL z-yM#(7J^6zK1rmcAL#K1Tb=&l_R3Px>2y}w?RKl%?Y4ToUVAVYbbGyCuiNbodc9sz z6h+zTbj-@iN`Cn8VLuoQR(-w@OioS;WlA!oF{Z3ErWM|ppk19vq!wTbTqU~}l9m!- z!w#cF2(X;DL26g1(46Z+2fFi;!$%Ht_|T!Sn>)|`NA_(vbK4n@ZO|tfuEb-d5|rgB z1wBr9@i1v~&Y`qk$_Ilj_kH)q_xQ43YfMZ~=0!+`oE$-B!V!ucqjI(w9qiECg=B5m z?8+*4qw0uIGHh2$+Nygc%qf>DsyZ_WSZ>vvAgitwMAdsI<){EK)LQe^>mpsv%dEO` zJr=1211Si6WfdxxUSJ%!O2$_X<5w(NdV*l6uELB6sZ(@ZL&c3M+(<~`lq9Q>q&3pC zMifOA8UnKFya~C3#8?}~*9nQOJaR}HeU&7yUJrcO6+$C}Axi|ELX?N*=JQT#X-l`$ zY4v(N(d+kJzuzAW27_*%7mHyOloJ z5^qa{3u5O=NUV1hCdO04dlPg7qc~6+N>7>Pu0LY8qctnm^Os^s`^HCp@*$Zm1u*o6%8~*X{%6I*rSxtIB7!|;hw&Owl2+f>iIN1RVg!MTYK;lKoGNCx z87d`5UKbR)LOgtR!-cZA9VJy^#9A18A%({a&4IaAbm++OC$yFqSXx@7+wC&w56XNn z$W3Vmg(-X1ntomuy;wxOOo{H3E;zrlZQGgCM~)q9*`hdDi{pH$-MQn_U;5%lmY0`( z6Cb1`qzJ-4RFi<6!@3SmBfhLA&^2!N^@0YWUORPg*s zoD#<=Dyk91VFaC$5s^xeDylqGD9(iZK#Z7%Fx*l6NVMH~QyFx?pojEK?`=qW1*A#L zp~XJOm)b&z&>xy+HB_XjHR_Qm%g8&|2s@Su{h!tnS~|BZvNWZoc(UI?(_Ek0s;{J|yo#B2|HN3lydwb_yTZk;auIX@pb~SCz!68hDd9 zMN}jGmX?mPu(*hbV!GWfwR)YI$#LTJaSVF+O@(X-=baV^qDcF0cVL=>f;2rb5O>ab z@4Yj|cpKQ@#u$@DX?pbRORxNgvNU6H8tq}{o}cO;p1+p%H0>k%)g~s!r({2_WwZ3Q zY@|Io!T8~$Ob>GU&e3y*!jzQW;ph@z~DPi-ZfUZE_`BSlW6EU|=0I;1y2U(FTRq8GfO z5J+bcN+7*PdP^iCw2o1+4)9ghAgN8Fvj#e@q2m}Wb$}|R8a4M0^9?+q?+-@&<`Ie^ zEW<7$YfaVJ9}Hv|893+363ueAVCVihI-NH8pvRy;pezcE3x%yXPLQ&iUtYGyN`YhwA+8gymVR(PSq zdGlUXT!WL1xiVyoG0ug+))-^@Wj?4cx4Y3GZp`_)qZhXJJ^VDi&}YzHX62zjoW#*!oa0BIAvj!|iX6hU$}k#U8D_(}jKkd^$1 zMmnsbRsoc$+SNu-oeD{^~8fbg-Krec{vJ`YX5eAG-bcJX7_!ikl4sQ=*Y1QWCis?VCgh zB3W39t% zN@3f0pWa-byN+AFYb5RRC|Y`Ywuhft$F|umq(=@=m;n!!F$e9TFqfkuRp_Bpk^WG!Vb=0M* zDx9n0EFQl`#i{C~##Kt00m11Bz?Zl|i7G&f93^wK4nvxh2se_}8liN+v~^V7xCSZ0 zX9>-}1o26410hO=lKGIll}x&kRQLP8QH z#9HH>MW+dk@o`qlKIX>z`Kj;R%@19Xz`YMd_uRPe;=ZaQkz_uci9%WmBdCd(dgPI^ zz}u3tEQrz+B}C8#i9(KotaclUkR3#dZm-YEay!76#emJ5&tPnPk_Yd;ho!kiw0;~M z`jpT5U?7b~?WAWBT8ER@@ArLKmd;x1@;tZJTGNWBj&8jB!+*2+rvLrMvUV=BS%mO? zWYNGjA&DbwXOV5jVNFa?SZcP%ah>s%<8#c-tvGO`}6QPA@sZ@X;M8W8T7hUTTnHjX*j1vP_g{nFzKzTmi7d~Q;5e!bts|LDU_M3 z8>$KsgwUfKE8I|_Kw#FKQEwc+TuTQS`W1@^(55n-NV7U;Y(IlEFKPel%}jsi9{M=G zx2MgwA34O%PD0kq=;lR8>YYW(h!Tx(234#OxiD3>0E`saiY{a$@KRD>@G{6mBtW~{ zj#f>f9DXn42_eq z67(wAaFFMtVgnPx0?6I+UMR|vSk}vA`H2vRCVf}?w+&v+;hz}=QqD^%V)eNj$@J}*?L?yx4v=U z$%Qi6Fgh35lfL+3X{sz@=V#c)RZQ;Rx^Gg?-|-$|YgL*2%#Qb-IBdv;#Fi$^&USXQ zX$-$TXrVW?`??Moh_b9ObqP&$EUOAr*BED;(X)`!2(R%`*q2!EC{0bIBc`UOxZ)yERXsuSx-As^hAxxdMsC-tNfVESz69xOhsRM zG!p9}af-}}Kx}CYL+eR>L>4I?`NAW#mM`+ESG|V3u0bhIoOqml^9%gIKllOu@Q?q1 zqAdUB4(&a3dtZ9|s;VlCF}^HIUlfG{#CSZm#u&!^&H0P*Rlk1U{OkMo|JCpQrx-^o zicrcE35)Y1ymPdoly)5RNMZQcC}*RtY5NL14c~C66-!{ng`NKv&xUW7iX9OdXqMa1 zRSX-OkZQzn%wRaA-|si=Ww`~A4_J<-%0c3y+5jNN(q`lgP;q zC#H$cVuuq?t_Ci3_U(&^OMd4QpVM4hgmlR_aDcE$G$wGC)V0CXRT%tjDn^3vnWYPG zQl({c@p__Givx!bv1@*oJKuLF?|Az=$tPd8uGl{Kkk^Kn%)qN6P2n}>w&$}r7-Np# z$6O@o_>5t(&aPz0H))A=p1R1{Ta58}Nt7k@+A|d861~lwQ?;cmhm0=P+;jImTzT#F z%%fC0~#vi9dJl92YNM^v$yD`u)DG zs*2%YV8;2F(<`Gh|KCQ7e7Hs{)7YY9T;?RLgxTI4sg9@x^sAEC7HH=fPf9xzjy&PF zZyKlYO)4}gJ5QqV7WUbDX6I({-m$(hz`LM%I6XB*tKBAwB9xMhh9frned@X<(wc6s zM^O}v$K$O!rywBvCIxLFwtV)@+dP4doZ=3-R^OIagl%b z@BTdt3;Vd`=9@2k)edcK;A?n7?Rls9BuPY)B$Q?8&!0c=25yDg^MqExZIjG2D~oTi zE<#S4G;%9nmqKvt`Wv|NiYxf^r#{6y{^U>D80O4$67unoJRf6~#t6aCdH#tV8eQTFbJG*|{#i@bkaO=O23DOTJ)vdD&lc%{3f7dX&Y*Md7`7qtS@* zc+6lhup8@Z5U1;eMOHG$V?l#<5^@afC5-qiqtXY~2nf%+NLuEJl;hAsQ!| zIQ7IKC++yHT)p{>JDu10W=h0wkFtf=Y}4C@uGplmydB|XBTh7l)RVk^a`9er0fl#F zNB*(({yTqe76G)<4d0(f3+Q&c-1fZZQB{Vwz4gEF*?aCq0=-s5Z4BoZm+>Bq4^um+{n3yAfV3^xikl%X}ZpJPXFWbcs$(pWKCU*~nN|L(Pa`V&9>rWd{N zg>N5@hD7m`1C+!T5WP7*|MpjZji3L8pL^05?0jvn*Ar=)qQVq`+}PZx^Ks7gH{3LP z>rFR4y0N-AlO`=jqcMZw5Mv!xT~n1sAW3wV+JuPcU6{-c)CB=A>vlvQAp)Aq+Q0*m zX6cqg$4Lx6aEU0XsOz9=8btvZw_7S%TRn8&{6D$s8Vdr%b{7d3hN7`t|jQ0-+9Q`o(?Qr8{QN-{iC@$GMZ7msvj`N8k} z2b{iej-uK;{bN7){r~i(FMZVq2gBjo+WH#3Zio5#g(p29`qi&~O*k1Uv}oV;uD|#y zd^uRZ-}n7~e{zUxfmGk|t>5`0hxQ(N({Q-ji*(G=;v%)RXcafzuX>B{MR*@dk%BNu zWPHN}Ps1hbc9h=)MP3jmF;`uA6~obp&5aF4!x52I?B2Zxnz=dC)Pw(2e$5>{Oz~BYiEx8#60_nk8j;S*&A#{+exI| zcG}7Jo~#Nx-)H;1#TVU5F-d;uD|v6f@Hu4j(?q z`SXj^&NfKD$p$;Cm zoay`%u$jVz0(Mup@kPvV1#Y|%9Y=^ppXIToQ(SfBk@vspM}O(N_U~O742L7mpFiJ- z!hU)7(Jxy9`3fd>+`4bR~lcj*~F+=$)e~A&W!4jp3sv2~`8pW^zL?El4BH#a(4{`SDoA|jm{=;8= z+3mOgg0)bU1!)BK=i|`e5P=jsBILe{=PwY&Ni+H% z0E7L(fQ^mK?In2!1kX0Pc^t=RDY0f!z6yx6&^!sPZqY0kvQg3YO=~%)qmkuA!S&vkj!-sb>*jOje3xo9M{qiO;ch$h8x4acBFf)uQolGbd8!{7cq9=zwHY~JgbAI;j~OWyDsKk(Yw zzxbBxZv61M3+EV)hs})T-^{)qhkoKVTMmYU>aG9zZNK;4_uqNX54`>d?%lU%j_>*I z@8aU>3Q-)B7vpC7qNb`#ob_b7MNyR)Q{lX$Z0=V|VsW@CFwIxSP*&B}EMe6!;#=29 zRM;>m8(O=;eOz;rZKDGoE8TF_h1}5jroBy=co9C@E)ml3amWCKl4_z@8yv1I%P=FS zcUB)Jslud6GdVm>`K&2NPKt8gIpQb^4F7e#P1mI)G6_-EG-QZM>!z+AH-iA7q0>%U zO>QYjk_2lFgMObVia2=aAgxx5&wlzdoI7`xBUc__&)z+F=ecnH0w+$KATLX#n&4f+ zCcP*N#^VAVCxL;;%Oa8@wIZIU*BuPT2(bh#^ciF1JTVqI)n1zJ}X6I%Zjz-*l_uY&~V~!j-jFOTwr_M0WN35)@Qsgyp9Dw#h zg!3>Q4yn(a;rzLCR7FV=H#K()NU%0^3>~3jHR;Ok%=J|RFK`W3Ml_l?PD+fBoIZb+ z>r2D_zyH1bljHZGKY2pD&-q?nF&LE8O)3#0(@uI=%a^z9`Hg0IkZNlb9zghz za;Sz2E>fXfCBpVUP;M!S#S;n1f$2GH3hTu<46n+NMku8kB1zluLTo#!lp(bUjUXD< zqcBb;Wtd)e4KMVh?!B`FhZHEG5mCsQr3e^{EKUP6YMwJ;8=U~3y!XUWgw8V3EF%kL zQ#_%roF*|9p2llbCu|ZiDlvTmFs8B)@H}%||0|ZJb$|_8^$2w~E z8BJc?knL1;6|mP&*t7-!mDu{6ax!P=gXFez9^*aBgRoim)^o+{krK>hK`x|N2>PsOW zTOakc^Sop{=!f&F6^qMDq)OB6PB9t<=649ZZ&J`8;sO(XlBSe(6^28bW!&Q_tBSlV z@iZ(rMKe3-9Ck+m;)&O}1p2dc7;Cw(xe>Z}s}G`-2|;Z~ zSu*e%PSO>ao13|0HGDFA%Bmb}udp7F$3J(^+s~al{ee!aGv6OS`jXz4gbk zoo{Ug+~((ob!1BpObJkt-hz>a3qWm&{UlMszWw{@Om%4`8ROvyDJ8piEs$mzWsx%) zkI_;xKQ+zj<~om^JV{+u6W9Tx@fh!6db&%m*CS0+#^ao_$f+99A^<6M2(xTgPA0Y! zN&vyRJYn-2(h>naMC?g5r3t7F;48oOZg?v@1p===*OAO6W#fAed8Woc+{ zNmR;p*Bs-_>LSMWMTGapggiY$q-wPAT}1?QojEc>ECL%PsYky3#4VN|OT z6EcLMQE40Qj^?!!y49WxSX?C}RzoR0H9^DMIgj*$NGMcOPLW9H^&*%*!( zj)%lLq9`jYkR%Z^)6=wCEy}87G#pZt}@~V+ncFyCPfmfu!+dvGYR8S_!vJ?p%IB<~J*|`RG0I^D_YU8Uq@CklB_Ebh_ zctR;}$L$k?m$~N1Rj=u4eqqp&9G$(EPk;Q=l)$lTZX&f~;<})6mVP~^FeRBzsV6OR zV;fF1MO7P&EpgUtZ3=xer0QH9@FGHCUD(7(1eJ3{0*+-FyW@nSDj4J=taoTUr4KcU zOe<>VxllUBgz0qEib=HKST2~U9Yf)$rDQ{RHZTke%aARpsL%~Lh5 zkfLAOl$k`pvJ48hSt|)jy^|B{cW~vwmg29q%{bTO=ZUyd!;0#>V{LtdrKM$F@(N25 z#UKQgffVP9BKJj6P*sy7_qEy6m2&Ki))SbTYW`ie+a0dE>gaEsJo5-%YRXz8+Zk!C zaFxSEBIImB5l6j-W6q(I7@Q5Wbbt^V;|1Q7NCFL&@nJ+hXz>}mw|E`sW~(Zs4i-fw zG&9a&eT8VJ^txT@s$@nx>Twmgfn!B2B-Ln)sSVTJjDv>{lO+k_>=J96LvW7KU_fa+ zrGd`wX?j_TuPxRG^d2@~uWM5?=@q(W=Wd$Pqf&~gPD+$!42L6%vH<1TzkfHjtdVt1 zuiGWD1|4b2stn|g(ROsSrlziZAUbT8FzFxh)YrrXC0kxhv$6LQBHi} zBx|edTTHYQkW*C|^p0|+YnWYyn&`vt>{`ljQ3{EQf~I?tWK7LW^H(4E5T84KFRyvk zt1)#IBu32N9fyV|cj}#Kr@M0Bk?+eyboIewcVNEoIC}gDdsKw6hIMBs2N6ap^2*Sz z6dS&xmN`l&>H-QJW06u@sKpp1A(Ba$KlC-00;>elOQJZ%);Mjp{`P9kJv$%edw433)q;`%-Ma*Yy+O_}*#mX|dgW3zCPDW%sbtH*|WY$64 z>(XwwNs$zlp>mEeN1&-}j=+;dahTalB39Q{*&K}+3=0nJ+0U)deKCLj-gi({IW4J4 zmBvpcTs(Ikv$le15QN@4Vy(l{?rA!Tg#3RC$=6Vc`R!#q=#i%N%%Zl83MhM2$h)PCS z6EQ3u{kq218NQGV8DoV36EiU2?UE-B4SWOhqxR zj$kHD&_&4?KJ`haTPY&yaZ{yv!Aiw{9xgMCV3-ey6{LwGOXF~nR5i|n(y~zi3zZh{ z3A}-m0pF%A9-?O8D=CVCxw%=4G3TtUl@PKOCrPYzl)U|q-YGWLH;AG}Nx%oKb){ft zW{O?Ac43U=^y$-qL|%mryq1BiveW4-uWzg`q^&HZJWWnMGds(B-}{$*_TJ-|CK~VA zzyGdYcY3_OzTTuPU%QE~{FJBUy(bRtU;Mlm{IlC{d(p4wt4sW=XP>8&+z*4WnL}H! z0g#W=U^K)IFyJDvI&k7S0jePbEF^dno+C7r8Y%&mr?#5PTS{AFjHAvS<4R+Ur;lZ$ zt}sQ+bZd&L9dZ2evpCI`G${#*_xKc{}@X3=W|EQ`e zEriU3AlkEMS1JVQ#>PeqXybj$d)IZI3~0r1BN4QHf~^_uh;_SiFl6 zK5J^5H3*MTiohll+OKFC9M~EJ9-$J1@Ca&zbI3?RB)~P4t;&Nd!u!c6+;2UggG6xQ zp%p<@f^C2{m4$K~#BZEnq%({&n7m|MM2vlmDIHZ&vw>uYz?Q)&m5VTWi)EWLBFDNe zrm87S&WFl2D^bQ2p^k0|lms(vi4~Hw{XSAeY{m(%WXS)x;Q;TyaFI8h*u<`F?W26#W9a8VZCN#@h^!p>c4^qh8UYCX4yP-17^rpGt=4au(=g;5u7rQ;K)9dwS z5}hvex}DjXx!K-mG@8Eh%EQ?&|Epj54Qu_{>dFdAKdB7LCHCxR-Sni7Jsl~>PP?RN zc-uGK_Uc=X-H_b#fxEa_4`@x5R2wrP+By#%ot~CoHqz1@Uj66ISI}n zw8A+7g$)QV+2o7XLZKQ2MbPjLWHJh&l7_+4AR-!x2?x1A_|Tye5=7z2~N# z?7@2;FpoWcmOaO=q<6A}^%c@o zjR#^ds;PB(@D<1yi15~9qX=&+ye~ip=`|-y@EV#qy9u>HP%4sO1;Pfdi@?Ftfbyjv zq(VUi-d6_El8Cf|x&SNiMiY4RYlIy^w}p%puZpI4-TEfKxi;q1V<))r4d20FWtRW` z*_^|1haY?1^I6|N#b5r^ojf)u`L7owZ-{f2Z9y+h>9pGoqpCwoO~GDXzv-sua$x?z_}~22+j#XgDYw6T8AK=G2%K#2(V#?46iMFx9?2hGd>;Ec zEn>aN-pn(VD1^-EwMI-O9`8n^ew`$?Olg=2oZe^&Ee%N`8WzuxhUf&K8=`ocgGhl+ zctIk<1>hA}2{OVCOUiMMNCMHL@J(CH>m~v_g!WYDEpFA&dXa)wi92H%e@Y>z74g9o z7a1^s@|2aORpk8a-+MNPZ@GgHz57mn{%yakw zdp~y%|ML@P$a-ydXB}z>kqqST{r-@RjXur^q9_JDX__|3yD<5!bwsb*{jZBli*FhZ zht=QKIse~bdNNb@blH)Ehq(1w&*sIq-@%E~r>gr-F0s2>LquzsAlMg{YT-c%qPT{$ zEByZAOL^Cg?`7|9Pu^dJs-~A1#+!XaKgSgXN^YWDNhA!j@sM7-!Ryd0tOB_WdaV^nTcXB(nr*Gm3^HxZm1S{@vr<#{>eZ8*F5my zySSp8F|d~3zWaXWfj@fdTgh(P%?m#NLjL4`eUt}2_5oUPOqQh7WzB_i7Z{Dkfyp$A z5K@q)DQTKAQDNwGIvX=Hvu~=Z>VFQ0!>8>$|6MWt>N{RcU6;K7u8%!sZ`y9R_|{jx zk{gd5V}5oH0hFf3CDts&8FySW0J(}Yt)`PygRx*0%q2XuXt}4lf$I)Su0OWILm$-` zopQy^imbDTGmj|pk>cPD0u{m1V{q;ytaQRY&zdHH`kHcFlkI`tyyN0yLmZp#fA=4IElD3|M|h3z4Vz|^6dVFBsTtqPGw_<_S) z@RcX(c|=B&X9qlkw{gP?3KvdYr0RL%k-?6JXux=bQl2D%o2({&^b{96Ij_Fsb{=@( z1jmh`({0o5k2rh!ELByLW*LIO(bwv<8X4iBfj&1k`|fVH`=dgL#XKMLbO*1$3#NrN z{LGL4G?hqs{IQ4eUt{6preoK$Z|`1aXJ)zL&>;>VJV;g742DCTbL^X*Vs*{98{*?! zy?YbJjdq?ZL3=PZV8N~A?$dBFc@Ed@gL+W2x#YO=*$Pp^`YF&gL^VXEV0gh(E_zzl zqjQ=WO@WdE=LALyuDwoC)e`42%Dl@p&yU!DOmp{pJ!K`4X{ekC4@7XGhTWsLbK~AI z4C6)xSv6Fp28;GtVm@BMx`keaNF81!cp~saNZQ={ApFVt z!;C-nZ+YOp`)17f#dIXsv#--A;bj@4%6KBbZ*_TxYXC;%9&IXNi;QYX*n(x;>&s zQ)M_B(I1V#d*UnrSdwm!%C_B&GpC4VN7(g*3E!=^5@JD=X0W`;UoS7vy7qSV9jQ6> z8G)$PW<#wapB@JB2Ceq zjB}@!nV;{Wg{HQi`GsBdre_-}Fi*SP{*2c8`|G-Tq^`|Zg&}?>nN~_M=nv3yGweGu zM=}1|_6){Y3ZEllLA#yNCcEVEnT6eSANoT7$gU00U7RyvIra&Y_N<5n>t}|1!o7mI z!&kBN;6-c=`>vK01Hoz$v^N|O$1q-p^&riGr{BcSuURQw7L)_AsYZfsC5D%Je^sAke5osfHJ}U900TqUI-Kmgwi%xKA@0%u1 z9Pz-q;n5oAVi|A`B48kd7etd8y=Ho3X10s-BJk`9YmbgWoCJ!Y`9f%*~@x?i_>Se254D`#GN@Yx#QC)9WyU<}?1w2B}f z^5LZ(_VDdob=2W2!G(t%XCDer_r_BykID(rT|sX*BngxQFr}w1A6~XtyOR7edNHG(&&oK5kR@aqYeoh9yF0A>`N1Zj&&X;;RZ@ z(&(`ixPGIx*z&mZ0(%DH>qUtALV*ifeQ3?`O~DF|IR{n*RN-V2L`}M;k}#tvG+=NB zl5WbO!$;V?u!r2#)DE&Jd0Ubs|ER8A9dOEDUAOI-YC3?UEOMbk+EzS8HT6q>NffcT zqS#xU{th~Q>}HRE&helO-YL{fhIwq62L`vZ_a!%B?K*=MuugF8^C8Iun@b*@!P#a^fpP9cy`So~O^j|k*p@UaU>e;-D_bmGaEA|6>8@WZ-=KDM9t57yZ@yF!u# z!A{Zea^xNgp}FedULHGnnrNJ(?sPYaUP8nnImA{@UxV&7g=t8qjfQP?#{RXNM{ChxYL1?t6&jI@Oe7P+Kb3VdF%H zyzW6dMHzMR?HSZu#(0=vqL{IW*t0)lv?e*eC^4xd?Z)&gU^g5;54|zOEr?nnMX5&+ zr{L$HKMGySV$|p8=x$zoP=_)iAe2DJ5J9VfC%Qrs$r?Yhh_*(=z|dkg6e1I3w|H#r zKn96mAB&K37z0}Jk#)tuE8ckIARpbG@Lg~DRsQ3z{SJTmmv^$alOTM+NvYcL;|C7$ zt-tug{Pof~-u-8vWPNp&x!Jj2RFVFbsVITY`_~lp;V#wYU*W0{;;ESi^h&ZXHyIfV&0)l%;?bwv09T%H#B12 zH(2PY&^*$L`xkRQjpcpU&Jo8YH}pF6rh3hsWS}}Ltl@}>c-gnSfU_4L<$GTDz2xIA z@Agy0`G;6Ae{~+EoVSDlpm6%6}V+kj@fb?l2suganPA`NqoQ) zMZh6KC$hAVXmAEwXIL{sRj!k(nEv#Lx#zU8(qU@TkOg^=;IXux6*2mZr92UlTsvsYMl3QFGuB@Rppi*qw3fN>os5Ddz z(jFL(uUm*#3v9qwu(<(IjA(W7J_nN{9jGkDQ6iHJQ4LV-6eUYyC+UbW3zdN=rKqaV zWYIdXIibKid{oi8IbwXTLG}cyYms|HQ^YHYl%9CT~qEv{h;`?_ndzM8tOX(bt2DF*qN zwb6j+8@#fy)3g&Ht~t!ER6Q;AOCNQR#o9qmJ^T{qdJyX{E=!Dv(x$%VfpOS8Ndd9g z#!DovP$`fCp%Q#mfGrVm9BRXL2}&c<1nL@*7kC{ZvUbRWbrSH-J_r&y5#fZwxd^JJ z;UU_vVel%VSoICQPJ6VX4PEM4AB+K8_JO#+NxlMNGuug?EtmLuz1)&_BM?YzLJbN88D z-|~CWsdxO4^Ks}5QZ&CxLL?htlEq8k@JZDmL(_%23Qi}3qL)aMklXqSRCtWqf@~r+ z7R(T`9(aSOOT2K1PSEsr)ff>6aFh>R1CTZIiay9H2NrN2(imYIGKP?T_*#I75WPlf z&JiNIF?i(=MGgjhy9L4`?Fct+@!Z${#J~Tc!=JtL_uu&^ciwv7&~LX_ zXKb^tG@DEBLMo(W0QY+p(j(K5xY(Kic5cvjz6LEqx`aTAA*1M;YBsz6FMst_SMm9K z?&Z|#GS|=V>ra^Zl?Wqe%G#|-6I0hzWf^3gpFn{nL}1tFtDwjFMlvm=25+#758;f1 zuXBw2OPTNvmrmtn^4y=x&VKMWWh%i}csE2a9U`DF0s)|n0+FBw5I7xt2w}mC(9f1p z5VTR?E84`K5T0g$RP7mr!XS+U&T0(EOR28+P&oUtfoghysL2n}bCbE!7J&l)}V5&e#6(vZW069*T zVZc*`jgv@v&B#=a*B-CZP^}P6)Rr;$I*3n59iqFZIR-8a;s!|6xv^+oUJOQ=Q~}Lt7J$n{X$e zz7a#|Ju-Xk z7^T;+@j*oACGW~=O<}t%>{;N4URdxm|Lu?HB^kHA zn5cCXNlQ_?f~fF{wn)v%2ip~@XE*Zcq^f(?T<9hH56ws~r}AQ{?aOhmQ|KvQRnvJn zo=K(XYKo3fc_xRxrB&WmL@inSNT`0`gpNu`ON3Df*+W=~XqSj2l-FF58#3zf~H8FKrF+A}(+M*$Oa7 zTcccwv=y2PZHA~qL1j?IDt;sp#Rf`@h|Hd*ek(o-?k1i5CG)^$s}Obs{Mi5&Grbk&qmgQ+U2yYZ<( zw_S=9>to$gU8gqMo_1SDX(#KdX=WvMeeHxF6`vQ+`}Pm2ea|^9`BJy133XZXE{oU%K!iX07*qoM6N<$g6i%i As{jB1 literal 0 HcmV?d00001 diff --git a/resources/icons/printers/PrusaResearch_SL1.png b/resources/icons/printers/PrusaResearch_SL1.png new file mode 100644 index 0000000000000000000000000000000000000000..281d7a62026fa00c912eee93650f290c9bc8bdf4 GIT binary patch literal 41541 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 +notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +support_material_extruder = 5 +support_material_interface_extruder = 5 +perimeter_speed = 40 +solid_infill_speed = 40 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 30 + +[print:0.15mm OPTIMAL MK3 SOLUBLE INTERFACE] +inherits = 0.15mm OPTIMAL MK3 SOLUBLE FULL +notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 + [print:0.15mm OPTIMAL SOLUBLE FULL] inherits = *0.15mm*; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 and num_extruders>1 external_perimeter_speed = 25 notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder perimeter_speed = 40 solid_infill_speed = 40 top_infill_extrusion_width = 0.45 top_solid_infill_speed = 30 -wipe_tower = 1 [print:0.15mm OPTIMAL SOLUBLE INTERFACE] inherits = 0.15mm OPTIMAL SOLUBLE FULL @@ -404,6 +428,7 @@ max_print_speed = 200 perimeter_speed = 45 solid_infill_speed = 200 top_solid_infill_speed = 50 + [print:*0.20mm*] inherits = *common* bottom_solid_layers = 4 @@ -436,7 +461,7 @@ top_solid_infill_speed = 50 [print:0.20mm 100mms Linear Advance] inherits = *0.20mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 50 infill_speed = 100 max_print_speed = 150 @@ -458,9 +483,27 @@ perimeter_speed = 45 solid_infill_speed = 200 top_solid_infill_speed = 50 +[print:0.20mm FAST MK3 SOLUBLE FULL] +inherits = 0.20mm FAST MK3; *soluble_support* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder +support_material_extruder = 5 +support_material_interface_extruder = 5 +perimeter_speed = 40 +solid_infill_speed = 40 +top_infill_extrusion_width = 0.45 +top_solid_infill_speed = 30 + +[print:0.20mm FAST MK3 SOLUBLE INTERFACE] +inherits = 0.20mm FAST MK3 SOLUBLE FULL +notes = Set your solluble extruder in Multiple Extruders > Support material/raft interface extruder +support_material_extruder = 0 +support_material_interface_layers = 3 +support_material_with_sheath = 0 + [print:0.20mm NORMAL] inherits = *0.20mm* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 [print:0.20mm NORMAL 0.6 nozzle] inherits = *0.20mm*; *0.6nozzle* @@ -468,7 +511,7 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and [print:0.20mm NORMAL SOLUBLE FULL] inherits = *0.20mm*; *soluble_support* -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 and num_extruders>1 external_perimeter_speed = 30 notes = Set your solluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder perimeter_speed = 40 @@ -519,7 +562,7 @@ top_solid_layers = 4 [print:0.35mm FAST] inherits = *0.35mm* bridge_flow_ratio = 0.95 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 first_layer_extrusion_width = 0.42 perimeter_extrusion_width = 0.43 solid_infill_extrusion_width = 0.7 @@ -547,6 +590,53 @@ support_material_interface_layers = 2 support_material_with_sheath = 0 support_material_xy_spacing = 150% +# XXXXXXXXXXXXXXXXXXXXXX +# XXX----- MK2.5 ----XXX +# XXXXXXXXXXXXXXXXXXXXXX + +[print:0.15mm 100mms Linear Advance MK2.5] +inherits = 0.15mm 100mms Linear Advance +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +[print:0.15mm OPTIMAL MK2.5] +inherits = 0.15mm OPTIMAL +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +[print:0.15mm OPTIMAL SOLUBLE FULL MK2.5] +inherits = 0.15mm OPTIMAL SOLUBLE FULL +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 + +[print:0.15mm OPTIMAL SOLUBLE INTERFACE MK2.5] +inherits = 0.15mm OPTIMAL SOLUBLE INTERFACE +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 + +[print:0.20mm 100mms Linear Advance MK2.5] +inherits = 0.20mm 100mms Linear Advance +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +[print:0.20mm NORMAL MK2.5] +inherits = 0.20mm NORMAL +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + +[print:0.20mm NORMAL SOLUBLE FULL MK2.5] +inherits = 0.20mm NORMAL SOLUBLE FULL +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +single_extruder_multi_material_priming = 0 + +[print:0.20mm NORMAL SOLUBLE INTERFACE MK2.5] +inherits = 0.20mm NORMAL SOLUBLE INTERFACE +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +single_extruder_multi_material_priming = 0 + +[print:0.35mm FAST MK2.5] +inherits = 0.35mm FAST +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 +single_extruder_multi_material_priming = 0 + # XXXXXXxxXXXXXXXXXXXXXX # XXX--- filament ---XXX # XXXXXXXXxxXXXXXXXXXXXX @@ -555,7 +645,7 @@ support_material_xy_spacing = 150% cooling = 1 compatible_printers = # For now, all but selected filaments are disabled for the MMU 2.0 -compatible_printers_condition = ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material) +compatible_printers_condition = ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) end_filament_gcode = "; Filament-specific end gcode" extrusion_multiplier = 1 filament_loading_speed = 28 @@ -655,7 +745,7 @@ temperature = 240 [filament:ColorFabb Brass Bronze] 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_MK3.*/ and single_extruder_multi_material) +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 @@ -687,7 +777,7 @@ filament_density = 1.24 [filament:ColorFabb Woodfil] 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_MK3.*/ and single_extruder_multi_material) +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 @@ -789,7 +879,7 @@ temperature = 275 [filament:Fillamentum Timberfil] 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_MK3.*/ and single_extruder_multi_material) +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 = 68 filament_density = 1.15 @@ -851,7 +941,7 @@ filament_notes = "List of materials tested with standart ABS print settings for [filament:*ABS MMU2*] inherits = Prusa ABS -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material filament_cooling_final_speed = 50 filament_cooling_initial_speed = 10 filament_cooling_moves = 5 @@ -889,7 +979,7 @@ filament_notes = "List of manufacturers tested with standart PET print settings [filament:*PET MMU2*] inherits = Prusa PET -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material temperature = 230 first_layer_temperature = 230 filament_cooling_final_speed = 1 @@ -915,9 +1005,16 @@ filament_cost = 25.4 filament_density = 1.24 filament_notes = "List of materials tested with standart PLA print settings for MK2:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladeč PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH" +[filament:Prusament PLA] +inherits = *PLA* +temperature = 215 +filament_cost = 24.99 +filament_density = 1.24 +filament_notes = "Affordable filament for everyday printing in premium quality manufactured in-house by Josef Prusa" + [filament:*PLA MMU2*] inherits = Prusa PLA -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material temperature = 205 filament_cooling_final_speed = 1 filament_cooling_initial_speed = 2 @@ -934,6 +1031,9 @@ inherits = *PLA MMU2* [filament:Prusa PLA MMU2] inherits = *PLA MMU2* +[filament:Prusament PLA MMU2] +inherits = *PLA MMU2* + [filament:SemiFlex or Flexfill 98A] inherits = *FLEX* filament_cost = 82 @@ -998,7 +1098,7 @@ temperature = 210 [filament:Verbatim BVOH MMU2] inherits = Verbatim BVOH -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material +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 @@ -1037,7 +1137,22 @@ min_fan_speed = 100 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}10{endif}; Filament gcode" temperature = 220 +[sla_material:*common*] +layer_height = 0.05 +initial_layer_height = 0.3 +exposure_time = 10 +initial_exposure_time = 15 +material_correction_printing = 1, 1, 1 +material_correction_curing = 1, 1, 1 + +[sla_material:Material 1] +inherits = *common* + +[sla_material:Material 2] +inherits = *common* + [printer:*common*] +printer_technology = FFF bed_shape = 0x0,250x0,250x210,0x210 before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n between_objects_gcode = @@ -1098,7 +1213,7 @@ z_offset = 0 printer_model = MK2S printer_variant = 0.4 default_print_profile = 0.15mm OPTIMAL -default_filament_profile = Prusa PLA +default_filament_profile = Prusament PLA [printer:*multimaterial*] inherits = *common* @@ -1193,19 +1308,83 @@ default_print_profile = 0.20mm NORMAL 0.6 nozzle inherits = Original Prusa i3 MK2 printer_model = MK2.5 remaining_times = 1 -start_gcode = M115 U3.3.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.4.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 + +[printer:Original Prusa i3 MK2.5 MMU2 Single] +inherits = Original Prusa i3 MK2.5; *mm2* +printer_model = MK2.5MMU2 +single_extruder_multi_material = 0 +max_print_height = 200 +remaining_times = 1 +silent_mode = 0 +retract_lift_below = 199 +machine_max_acceleration_e = 10000 +machine_max_acceleration_extruding = 2000 +machine_max_acceleration_retracting = 1500 +machine_max_acceleration_x = 9000 +machine_max_acceleration_y = 9000 +machine_max_acceleration_z = 500 +machine_max_feedrate_e = 120 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 12 +machine_max_jerk_e = 2.5 +machine_max_jerk_x = 10 +machine_max_jerk_y = 10 +machine_max_jerk_z = 0.2 +machine_min_extruding_rate = 0 +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.4.2 ; 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\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\nT?\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 MK2.5 MMU2] +inherits = Original Prusa i3 MK2.5; *mm2* +printer_model = MK2.5MMU2 +max_print_height = 200 +remaining_times = 1 +silent_mode = 0 +retract_lift_below = 199 +machine_max_acceleration_e = 10000 +machine_max_acceleration_extruding = 2000 +machine_max_acceleration_retracting = 1500 +machine_max_acceleration_x = 9000 +machine_max_acceleration_y = 9000 +machine_max_acceleration_z = 500 +machine_max_feedrate_e = 120 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 12 +machine_max_jerk_e = 2.5 +machine_max_jerk_x = 10 +machine_max_jerk_y = 10 +machine_max_jerk_z = 0.2 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +default_print_profile = 0.15mm OPTIMAL MK2.5 +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 +single_extruder_multi_material = 1 +# The 5x nozzle diameter defines the number of extruders. Other extruder parameters +# (for example the retract values) are duplicaed from the first value, so they do not need +# to be defined explicitely. +nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 +extruder_colour = #FF8000;#0080FF;#00FFFF;#FF4F4F;#9FFF9F +start_gcode = M107\nM115 U3.4.2 ; 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 MK2.5 0.25 nozzle] inherits = Original Prusa i3 MK2 0.25 nozzle printer_model = MK2.5 remaining_times = 1 -start_gcode = M115 U3.3.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.4.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 [printer:Original Prusa i3 MK2.5 0.6 nozzle] inherits = Original Prusa i3 MK2 0.6 nozzle printer_model = MK2.5 remaining_times = 1 -start_gcode = M115 U3.3.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.4.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 # XXXXXXXXXXXXXXXXX # XXX--- MK3 ---XXX @@ -1221,8 +1400,8 @@ machine_max_acceleration_x = 1000,960 machine_max_acceleration_y = 1000,960 machine_max_acceleration_z = 1000,1000 machine_max_feedrate_e = 120,120 -machine_max_feedrate_x = 200,172 -machine_max_feedrate_y = 200,172 +machine_max_feedrate_x = 200,100 +machine_max_feedrate_y = 200,100 machine_max_feedrate_z = 12,12 machine_max_jerk_e = 1.5,1.5 machine_max_jerk_x = 8,8 @@ -1235,7 +1414,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.3.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.05}100{else}95{endif} +start_gcode = M115 U3.4.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.05}100{else}95{endif} printer_model = MK3 default_print_profile = 0.15mm OPTIMAL MK3 @@ -1265,11 +1444,12 @@ retract_length_toolchange = 3 extra_loading_move = -13 printer_model = MK3MMU2 default_print_profile = 0.15mm OPTIMAL MK3 -default_filament_profile = Prusa PLA MMU2 +default_filament_profile = Prusament PLA MMU2 [printer:Original Prusa i3 MK3 MMU2 Single] inherits = *mm2* -start_gcode = M107\nM115 U3.4.0-RC2 ; 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\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\nT?\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 +single_extruder_multi_material = 0 +start_gcode = M107\nM115 U3.4.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\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\nT?\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] @@ -1280,9 +1460,27 @@ inherits = *mm2* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#0080FF;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M107\nM115 U3.4.0-RC2 ; 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.4.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 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 = Material 1 +bed_shape = 0x0,150x0,150x100,0x100 +max_print_height = 100 +display_width = 150 +display_height = 100 +display_pixels_x = 2000 +display_pixels_y = 1000 +printer_correction = 1,1,1 + +[printer:Original Prusa SL1 dummy] +inherits = Original Prusa SL1 +printer_variant = dummy +default_sla_material_profile = Material 2 + # The obsolete presets will be removed when upgrading from the legacy configuration structure (up to Slic3r 1.39.2) to 1.40.0 and newer. [obsolete_presets] print="0.05mm DETAIL 0.25 nozzle";"0.05mm DETAIL MK3";"0.05mm DETAIL";"0.20mm NORMAL MK3";"0.35mm FAST MK3";"print:0.15mm OPTIMAL MK3 MMU2";"print:0.20mm FAST MK3 MMU2" diff --git a/slic3r.sublime-project b/slic3r.sublime-project index 3f2fc36dc..785dddba4 100644 --- a/slic3r.sublime-project +++ b/slic3r.sublime-project @@ -76,7 +76,7 @@ { "path": ".", // "folder_exclude_patterns": [".svn", "._d", ".metadata", ".settings"], - "file_exclude_patterns": ["XS.c"] + "file_exclude_patterns": ["XS.c", "*.pch", "*.ilk", "*.js" ] } ], diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 4deafbdaf..fb42a85ae 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1276,8 +1276,11 @@ public: void read_cli(const std::vector &tokens, t_config_option_keys* extra); bool read_cli(int argc, char** argv, t_config_option_keys* extra); -private: typedef std::map t_options_map; + t_options_map::const_iterator cbegin() const { return options.cbegin(); } + t_options_map::const_iterator cend() const { return options.cend(); } + +private: t_options_map options; }; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c4d0c1bd9..52bdf1d1b 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1652,8 +1652,8 @@ void GCode::append_full_config(const Print& print, std::string& str) } const DynamicConfig &full_config = print.placeholder_parser().config(); for (const char *key : { - "print_settings_id", "filament_settings_id", "printer_settings_id", - "printer_model", "printer_variant", "default_print_profile", "default_filament_profile", + "print_settings_id", "filament_settings_id", "sla_material_settings_id", "printer_settings_id", + "printer_model", "printer_variant", "default_print_profile", "default_filament_profile", "default_sla_material_profile", "compatible_printers_condition_cummulative", "inherits_cummulative" }) { const ConfigOption *opt = full_config.option(key); if (opt != nullptr) diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 514cc0e0f..2d3343c63 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -495,7 +495,7 @@ public: }; CancelStatus cancel_status() const { return m_cancel_status; } // Has the calculation been canceled? - bool canceled() const { return m_cancel_status; } + bool canceled() const { return m_cancel_status != NOT_CANCELED; } // Cancel the running computation. Stop execution of all the background threads. void cancel() { m_cancel_status = CANCELED_BY_USER; } void cancel_internal() { m_cancel_status = CANCELED_INTERNAL; } diff --git a/src/slic3r/Config/Snapshot.cpp b/src/slic3r/Config/Snapshot.cpp index 704fbcfa1..e92c829c0 100644 --- a/src/slic3r/Config/Snapshot.cpp +++ b/src/slic3r/Config/Snapshot.cpp @@ -406,7 +406,7 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: cfg.version.min_slic3r_version = it->min_slic3r_version; cfg.version.max_slic3r_version = it->max_slic3r_version; } - } catch (const std::runtime_error &err) { + } catch (const std::runtime_error & /* err */) { } snapshot.vendor_configs.emplace_back(std::move(cfg)); } @@ -521,7 +521,7 @@ SnapshotDB& SnapshotDB::singleton() // Update the min / max slic3r versions compatible with the configurations stored inside the snapshots // based on the min / max slic3r versions defined by the vendor specific config indices. instance.update_slic3r_versions(index_db); - } catch (std::exception &ex) { + } catch (std::exception & /* ex */) { } } return instance; diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index ce65acd5f..f2b07c51e 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -74,7 +74,7 @@ void BackgroundSlicingProcess::thread_proc() this->set_step_done(bspsGCodeFinalize); } } - } catch (CanceledException &ex) { + } catch (CanceledException & /* ex */) { // Canceled, this is all right. assert(m_print->canceled()); } catch (std::exception &ex) { diff --git a/src/slic3r/GUI/BedShapeDialog.cpp b/src/slic3r/GUI/BedShapeDialog.cpp index 407da7ae3..656e0847f 100644 --- a/src/slic3r/GUI/BedShapeDialog.cpp +++ b/src/slic3r/GUI/BedShapeDialog.cpp @@ -234,13 +234,13 @@ void BedShapePanel::update_shape() Vec2d rect_origin(Vec2d::Zero()); try{ rect_size = boost::any_cast(m_optgroups[SHAPE_RECTANGULAR]->get_value("rect_size")); } - catch (const std::exception &e){ + catch (const std::exception & /* e */){ return; } try{ rect_origin = boost::any_cast(m_optgroups[SHAPE_RECTANGULAR]->get_value("rect_origin")); } - catch (const std::exception &e){ + catch (const std::exception & /* e */){ return;} auto x = rect_size(0); @@ -269,7 +269,7 @@ void BedShapePanel::update_shape() try{ diameter = boost::any_cast(m_optgroups[SHAPE_CIRCULAR]->get_value("diameter")); } - catch (const std::exception &e){ + catch (const std::exception & /* e */){ return; } if (diameter == 0.0) return ; diff --git a/src/slic3r/GUI/ConfigWizard.hpp b/src/slic3r/GUI/ConfigWizard.hpp index 73fce7cd2..6ac1bcbd8 100644 --- a/src/slic3r/GUI/ConfigWizard.hpp +++ b/src/slic3r/GUI/ConfigWizard.hpp @@ -39,7 +39,7 @@ private: struct priv; std::unique_ptr p; - friend class ConfigWizardPage; + friend struct ConfigWizardPage; }; diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 9e18cac02..1a21f8a9f 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -68,7 +68,7 @@ void enable_screensaver() bool debugged() { #ifdef _WIN32 - return IsDebuggerPresent(); + return IsDebuggerPresent() == TRUE; #else return false; #endif /* _WIN32 */ @@ -233,7 +233,7 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt break; } } - catch (const std::exception &e) + catch (const std::exception & /* e */) { int i = 0;//no reason, just experiment } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index a40bf4438..ae39c125c 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -91,7 +91,7 @@ bool GUI_App::OnInit() load_language(); // Suppress the '- default -' presets. - preset_bundle->set_default_suppressed(app_config->get("no_defaults").empty() ? false : true); + preset_bundle->set_default_suppressed(app_config->get("no_defaults") == "1"); // eval{ preset_bundle->load_presets(*app_config); // }; @@ -601,8 +601,9 @@ void GUI_App::add_config_menu(wxMenuBar *menu) bool GUI_App::check_unsaved_changes() { std::string dirty; + PrinterTechnology printer_technology = preset_bundle->printers.get_edited_preset().printer_technology(); for (Tab *tab : tabs_list) - if (tab->current_preset_is_dirty()) + if (tab->supports_printer_technology(printer_technology) && tab->current_preset_is_dirty()) if (dirty.empty()) dirty = tab->name(); else @@ -636,9 +637,10 @@ void GUI_App::delete_tab_from_list(Tab* tab) // Update UI / Tabs to reflect changes in the currently loaded presets void GUI_App::load_current_presets() { - for (Tab *tab : tabs_list) { - tab->load_current_preset(); - } + PrinterTechnology printer_technology = preset_bundle->printers.get_edited_preset().printer_technology(); + for (Tab *tab : tabs_list) + if (tab->supports_printer_technology(printer_technology)) + tab->load_current_preset(); } Sidebar& GUI_App::sidebar() diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 59ebe10b2..29b2b8eec 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -418,7 +418,7 @@ struct Sidebar::priv void Sidebar::priv::show_preset_comboboxes() { - const bool showSLA = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA; + const bool showSLA = wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA; wxWindowUpdateLocker noUpdates(wxGetApp().mainframe); @@ -562,40 +562,49 @@ void Sidebar::remove_unused_filament_combos(const int current_extruder_count) void Sidebar::update_presets(Preset::Type preset_type) { + PresetBundle &preset_bundle = *wxGetApp().preset_bundle; + switch (preset_type) { case Preset::TYPE_FILAMENT: if (p->combos_filament.size() == 1) { // Single filament printer, synchronize the filament presets. - const std::string &name = wxGetApp().preset_bundle->filaments.get_selected_preset().name; - wxGetApp().preset_bundle->set_filament_preset(0, name); + const std::string &name = preset_bundle.filaments.get_selected_preset().name; + preset_bundle.set_filament_preset(0, name); } for (size_t i = 0; i < p->combos_filament.size(); i++) { - wxGetApp().preset_bundle->update_platter_filament_ui(i, p->combos_filament[i]); + preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]); } break; case Preset::TYPE_PRINT: - wxGetApp().preset_bundle->prints.update_platter_ui(p->combo_print); + preset_bundle.prints.update_platter_ui(p->combo_print); break; case Preset::TYPE_SLA_MATERIAL: - wxGetApp().preset_bundle->sla_materials.update_platter_ui(p->combo_sla_material); + preset_bundle.sla_materials.update_platter_ui(p->combo_sla_material); break; - case Preset::TYPE_PRINTER: - // Update the print choosers to only contain the compatible presets, update the dirty flags. - wxGetApp().preset_bundle->prints.update_platter_ui(p->combo_print); - // Update the printer choosers, update the dirty flags. - wxGetApp().preset_bundle->printers.update_platter_ui(p->combo_printer); - // Update the filament choosers to only contain the compatible presets, update the color preview, - // update the dirty flags. - for (size_t i = 0; i < p->combos_filament.size(); i++) { - wxGetApp().preset_bundle->update_platter_filament_ui(i, p->combos_filament[i]); - } - p->show_preset_comboboxes(); - break; + case Preset::TYPE_PRINTER: + { + PrinterTechnology printer_technology = preset_bundle.printers.get_edited_preset().printer_technology(); + // Update the print choosers to only contain the compatible presets, update the dirty flags. + if (printer_technology == ptFFF) + preset_bundle.prints.update_platter_ui(p->combo_print); + else + preset_bundle.sla_materials.update_platter_ui(p->combo_sla_material); + // Update the printer choosers, update the dirty flags. + preset_bundle.printers.update_platter_ui(p->combo_printer); + // Update the filament choosers to only contain the compatible presets, update the color preview, + // update the dirty flags. + if (printer_technology == ptFFF) { + for (size_t i = 0; i < p->combos_filament.size(); ++ i) + preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]); + } + p->show_preset_comboboxes(); + break; + } default: break; } diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 07410e325..6aa255612 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -210,23 +210,20 @@ void Preset::normalize(DynamicPrintConfig &config) } } -DynamicPrintConfig& Preset::load(const std::vector &keys, const StaticPrintConfig &defaults) +std::string Preset::remove_invalid_keys(DynamicPrintConfig &config, const DynamicPrintConfig &default_config) { - // Set the configuration from the defaults. - this->config.apply_only(defaults, keys.empty() ? defaults.keys() : keys); - if (! this->is_default) { - // Load the preset file, apply preset values on top of defaults. - try { - this->config.load_from_ini(this->file); - Preset::normalize(this->config); - } catch (const std::ifstream::failure &err) { - throw std::runtime_error(std::string("The selected preset cannot be loaded: ") + this->file + "\n\tReason: " + err.what()); - } catch (const std::runtime_error &err) { - throw std::runtime_error(std::string("Failed loading the preset file: ") + this->file + "\n\tReason: " + err.what()); + std::string incorrect_keys; + for (const std::string &key : config.keys()) + if (! default_config.has(key)) { + if (incorrect_keys.empty()) + incorrect_keys = key; + else { + incorrect_keys += ", "; + incorrect_keys += key; + } + config.erase(key); } - } - this->loaded = true; - return this->config; + return incorrect_keys; } void Preset::save() @@ -390,6 +387,7 @@ const std::vector& Preset::sla_material_options() "exposure_time", "initial_exposure_time", "material_correction_printing", "material_correction_curing", "material_notes", + "default_sla_material_profile", "compatible_printers", "compatible_printers_condition", "inherits" }; @@ -436,7 +434,8 @@ void PresetCollection::add_default_preset(const std::vector &keys, { // Insert just the default preset. m_presets.emplace_back(Preset(this->type(), preset_name, true)); - m_presets.back().load(keys, defaults); + m_presets.back().config.apply_only(defaults, keys.empty() ? defaults.keys() : keys); + m_presets.back().loaded = true; ++ m_num_default_presets; } @@ -446,7 +445,6 @@ void PresetCollection::load_presets(const std::string &dir_path, const std::stri { boost::filesystem::path dir = boost::filesystem::canonical(boost::filesystem::path(dir_path) / subdir).make_preferred(); m_dir_path = dir.string(); - t_config_option_keys keys = this->default_preset().config.keys(); std::string errors_cummulative; for (auto &dir_entry : boost::filesystem::directory_iterator(dir)) if (boost::filesystem::is_regular_file(dir_entry.status()) && boost::algorithm::iends_with(dir_entry.path().filename().string(), ".ini")) { @@ -462,8 +460,26 @@ void PresetCollection::load_presets(const std::string &dir_path, const std::stri try { Preset preset(m_type, name, false); preset.file = dir_entry.path().string(); - //FIXME One should initialize with SLAFullPrintConfig for the SLA profiles! - preset.load(keys, static_cast(FullPrintConfig::defaults())); + // Load the preset file, apply preset values on top of defaults. + try { + DynamicPrintConfig config; + config.load_from_ini(preset.file); + // Find a default preset for the config. The PrintPresetCollection provides different default preset based on the "printer_technology" field. + const Preset &default_preset = this->default_preset_for(config); + preset.config = default_preset.config; + preset.config.apply(std::move(config)); + Preset::normalize(preset.config); + // Report configuration fields, which are misplaced into a wrong group. + std::string incorrect_keys = Preset::remove_invalid_keys(config, default_preset.config); + if (! incorrect_keys.empty()) + BOOST_LOG_TRIVIAL(error) << "Error in a preset file: The preset \"" << + preset.file << "\" contains the following incorrect keys: " << incorrect_keys << ", which were removed"; + preset.loaded = true; + } catch (const std::ifstream::failure &err) { + throw std::runtime_error(std::string("The selected preset cannot be loaded: ") + preset.file + "\n\tReason: " + err.what()); + } catch (const std::runtime_error &err) { + throw std::runtime_error(std::string("Failed loading the preset file: ") + preset.file + "\n\tReason: " + err.what()); + } m_presets.emplace_back(preset); } catch (const std::runtime_error &err) { errors_cummulative += err.what(); @@ -491,8 +507,8 @@ static bool profile_print_params_same(const DynamicPrintConfig &cfg1, const Dyna // Following keys are used by the UI, not by the slicing core, therefore they are not important // when comparing profiles for equality. Ignore them. for (const char *key : { "compatible_printers", "compatible_printers_condition", "inherits", - "print_settings_id", "filament_settings_id", "printer_settings_id", - "printer_model", "printer_variant", "default_print_profile", "default_filament_profile" }) + "print_settings_id", "filament_settings_id", "sla_material_settings_id", "printer_settings_id", + "printer_model", "printer_variant", "default_print_profile", "default_filament_profile", "default_sla_material_profile" }) diff.erase(std::remove(diff.begin(), diff.end(), key), diff.end()); // Preset with the same name as stored inside the config exists. return diff.empty(); @@ -718,7 +734,7 @@ size_t PresetCollection::update_compatible_with_printer_internal(const Preset &a Preset &preset_edited = selected ? m_edited_preset : preset_selected; if (! preset_edited.update_compatible_with_printer(active_printer, &config) && selected && unselect_if_incompatible) - m_idx_selected = (size_t)-1; + m_idx_selected = -1; if (selected) preset_selected.is_compatible = preset_edited.is_compatible; } @@ -1018,4 +1034,10 @@ std::string PresetCollection::path_from_name(const std::string &new_name) const return (boost::filesystem::path(m_dir_path) / file_name).make_preferred().string(); } +const Preset& PrinterPresetCollection::default_preset_for(const DynamicPrintConfig &config) const +{ + const ConfigOptionEnumGeneric *opt_printer_technology = config.opt("printer_technology"); + return this->default_preset((opt_printer_technology == nullptr || opt_printer_technology->value == 0) ? 0 : 1); +} + } // namespace Slic3r diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index 2d56e96c2..96c313b1b 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -125,9 +125,6 @@ public: // Configuration data, loaded from a file, or set from the defaults. DynamicPrintConfig config; - // Load this profile for the following keys only. - DynamicPrintConfig& load(const std::vector &keys, const StaticPrintConfig &defaults); - void save(); // Return a label of this preset, consisting of a name and a "(modified)" suffix, if this preset is dirty. @@ -177,8 +174,10 @@ public: static const std::vector& sla_printer_options(); static const std::vector& sla_material_options(); - static void update_suffix_modified(); - static void normalize(DynamicPrintConfig &config); + static void update_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); protected: friend class PresetCollection; @@ -200,9 +199,11 @@ public: typedef std::deque::iterator Iterator; typedef std::deque::const_iterator ConstIterator; Iterator begin() { return m_presets.begin() + m_num_default_presets; } - ConstIterator begin() const { return m_presets.begin() + m_num_default_presets; } + ConstIterator begin() const { return m_presets.cbegin() + m_num_default_presets; } + ConstIterator cbegin() const { return m_presets.cbegin() + m_num_default_presets; } Iterator end() { return m_presets.end(); } - ConstIterator end() const { return m_presets.end(); } + ConstIterator end() const { return m_presets.cend(); } + ConstIterator cend() const { return m_presets.cend(); } void reset(bool delete_files); @@ -279,8 +280,9 @@ public: static const std::string& get_suffix_modified(); // Return a preset possibly with modifications. - Preset& default_preset() { return m_presets.front(); } - const Preset& default_preset() const { return m_presets.front(); } + Preset& default_preset(size_t idx = 0) { assert(idx < m_num_default_presets); return m_presets[idx]; } + const Preset& default_preset(size_t idx = 0) const { assert(idx < m_num_default_presets); return m_presets[idx]; } + virtual const Preset& default_preset_for(const DynamicPrintConfig & /* config */) const { return this->default_preset(); } // Return a preset by an index. If the preset is active, a temporary copy is returned. Preset& preset(size_t idx) { return (int(idx) == m_idx_selected) ? m_edited_preset : m_presets[idx]; } const Preset& preset(size_t idx) const { return const_cast(this)->preset(idx); } @@ -440,6 +442,16 @@ private: friend class PresetBundle; }; +// Printer supports the FFF and SLA technologies, with different set of configuration values, +// therefore this PresetCollection needs to handle two defaults. +class PrinterPresetCollection : public PresetCollection +{ +public: + PrinterPresetCollection(Preset::Type type, const std::vector &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "- default -") : + PresetCollection(type, keys, defaults, default_name) {} + const Preset& default_preset_for(const DynamicPrintConfig &config) const override; +}; + } // namespace Slic3r #endif /* slic3r_Preset_hpp_ */ diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index f0f53ff6c..0bd7d2e15 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -79,13 +79,17 @@ PresetBundle::PresetBundle() : this->printers.preset(1).printer_technology() = ptSLA; for (size_t i = 0; i < 2; ++ i) { // The following ugly switch is to avoid printers.preset(0) to return the edited instance, as the 0th default is the current one. - Preset &preset = (i == 0) ? this->printers.default_preset() : this->printers.preset(1); + Preset &preset = this->printers.default_preset(i); preset.config.optptr("printer_settings_id", true); preset.config.optptr("printer_vendor", true); preset.config.optptr("printer_model", true); preset.config.optptr("printer_variant", true); - preset.config.optptr("default_print_profile", true); - preset.config.option("default_filament_profile", true)->values = { "" }; + if (i == 0) { + preset.config.optptr("default_print_profile", true); + preset.config.option("default_filament_profile", true)->values = { "" }; + } else + preset.config.optptr("default_sla_material_profile", true); + // default_sla_material_profile preset.inherits(); } @@ -315,7 +319,7 @@ void PresetBundle::load_selections(const AppConfig &config) sla_materials.select_preset_by_name_strict(initial_sla_material_profile_name); printers.select_preset_by_name(initial_printer_profile_name, true); - if (printers.get_selected_preset().printer_technology() == ptFFF){ + if (printers.get_selected_preset().printer_technology() == ptFFF) { // Load the names of the other filament profiles selected for a multi-material printer. auto *nozzle_diameter = dynamic_cast(printers.get_selected_preset().config.option("nozzle_diameter")); size_t num_extruders = nozzle_diameter->values.size(); @@ -342,8 +346,8 @@ void PresetBundle::load_selections(const AppConfig &config) // Export selections (current print, current filaments, current printer) into config.ini void PresetBundle::export_selections(AppConfig &config) { - assert(filament_presets.size() >= 1); - assert(filament_presets.size() > 1 || filaments.get_selected_preset_name() == filament_presets.front()); + assert(this->printers.get_edited_preset().printer_technology() != ptFFF || filament_presets.size() >= 1); + assert(this->printers.get_edited_preset().printer_technology() != ptFFF || filament_presets.size() > 1 || filaments.get_selected_preset_name() == filament_presets.front()); config.clear_section("presets"); config.set("presets", "print", prints.get_selected_preset_name()); config.set("presets", "filament", filament_presets.front()); @@ -975,7 +979,7 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla } else if (boost::starts_with(section.first, "sla_material:")) { presets = &this->sla_materials; loaded = &loaded_sla_materials; - preset_name = section.first.substr(9); + preset_name = section.first.substr(13); } else if (boost::starts_with(section.first, "printer:")) { presets = &this->printers; loaded = &loaded_printers; @@ -1025,25 +1029,25 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla continue; if (presets != nullptr) { // Load the print, filament or printer preset. - const DynamicPrintConfig &default_config = presets->default_preset().config; - DynamicPrintConfig config(default_config); - for (auto &kvp : section.second) - config.set_deserialize(kvp.first, kvp.second.data()); + const DynamicPrintConfig *default_config = nullptr; + DynamicPrintConfig config; + if (presets == &this->printers) { + // Select the default config based on the printer_technology field extracted from kvp. + DynamicPrintConfig config_src; + for (auto &kvp : section.second) + config_src.set_deserialize(kvp.first, kvp.second.data()); + default_config = &presets->default_preset_for(config_src).config; + config = *default_config; + config.apply(config_src); + } else { + default_config = &presets->default_preset().config; + config = *default_config; + for (auto &kvp : section.second) + config.set_deserialize(kvp.first, kvp.second.data()); + } Preset::normalize(config); // Report configuration fields, which are misplaced into a wrong group. - std::string incorrect_keys; - size_t n_incorrect_keys = 0; - for (const std::string &key : config.keys()) - if (! default_config.has(key)) { - if (incorrect_keys.empty()) - incorrect_keys = key; - else { - incorrect_keys += ", "; - incorrect_keys += key; - } - config.erase(key); - ++ n_incorrect_keys; - } + std::string incorrect_keys = Preset::remove_invalid_keys(config, *default_config); if (! incorrect_keys.empty()) BOOST_LOG_TRIVIAL(error) << "Error in a Vendor Config Bundle \"" << path << "\": The printer preset \"" << section.first << "\" contains the following incorrect keys: " << incorrect_keys << ", which were removed"; @@ -1207,12 +1211,11 @@ void PresetBundle::update_compatible_with_printer(bool select_other_if_incompati } case ptSLA: { - const std::string &prefered_print_profile = printer_preset.config.opt_string("default_print_profile"); - const std::vector &prefered_filament_profiles = printer_preset.config.option("default_filament_profile")->values; - prefered_print_profile.empty() ? + const std::string &prefered_sla_material_profile = printer_preset.config.opt_string("default_sla_material_profile"); + prefered_sla_material_profile.empty() ? this->sla_materials.update_compatible_with_printer(printer_preset, select_other_if_incompatible) : this->sla_materials.update_compatible_with_printer(printer_preset, select_other_if_incompatible, - [&prefered_print_profile](const std::string& profile_name){ return profile_name == prefered_print_profile; }); + [&prefered_sla_material_profile](const std::string& profile_name){ return profile_name == prefered_sla_material_profile; }); } } } diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp index e116b0ff9..a7d9ab7d2 100644 --- a/src/slic3r/GUI/PresetBundle.hpp +++ b/src/slic3r/GUI/PresetBundle.hpp @@ -41,7 +41,7 @@ public: PresetCollection prints; PresetCollection filaments; PresetCollection sla_materials; - PresetCollection printers; + PrinterPresetCollection printers; // Filament preset names for a multi-extruder or multi-material print. // extruders.size() should be the same as printers.get_edited_preset().config.nozzle_diameter.size() std::vector filament_presets; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index bba5161cc..c19027581 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -627,7 +627,8 @@ 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(){ +void Tab::reload_config() +{ Freeze(); for (auto page : m_pages) page->reload_config(); @@ -787,6 +788,7 @@ void Tab::update_preset_description_line() ", ver: " + parent->vendor->config_version.to_string(); if (name() == "printer"){ const std::string &printer_model = preset.config.opt_string("printer_model"); + //FIXME add prefered_sla_material_profile for SLA const std::string &default_print_profile = preset.config.opt_string("default_print_profile"); const std::vector &default_filament_profiles = preset.config.option("default_filament_profile")->values; if (!printer_model.empty()) @@ -2045,7 +2047,8 @@ void TabPrinter::on_preset_loaded() void TabPrinter::update_pages() { // update m_pages ONLY if printer technology is changed - if (m_presets->get_edited_preset().printer_technology() == m_printer_technology) + const PrinterTechnology new_printer_technology = m_presets->get_edited_preset().printer_technology(); + if (new_printer_technology == m_printer_technology) return; // hide all old pages @@ -2057,7 +2060,8 @@ void TabPrinter::update_pages() // build Tab according to the technology, if it's not exist jet OR // set m_pages_(technology after changing) to m_pages - if (m_presets->get_edited_preset().printer_technology() == ptFFF) + // m_printer_technology will be set by Tab::load_current_preset() + if (new_printer_technology == ptFFF) m_pages_fff.empty() ? build_fff() : m_pages.swap(m_pages_fff); else m_pages_sla.empty() ? build_sla() : m_pages.swap(m_pages_sla); @@ -2207,35 +2211,35 @@ void Tab::load_current_preset() update_tab_ui(); // update show/hide tabs - if (m_name == "printer"){ + if (m_name == "printer") { PrinterTechnology& printer_technology = m_presets->get_edited_preset().printer_technology(); if (printer_technology != static_cast(this)->m_printer_technology) { - for (auto& tab : wxGetApp().mainframe->get_preset_tabs()){ + for (auto& tab : wxGetApp().mainframe->get_preset_tabs()) { if (tab.technology != printer_technology) { int page_id = wxGetApp().tab_panel()->FindPage(tab.panel); wxGetApp().tab_panel()->GetPage(page_id)->Show(false); wxGetApp().tab_panel()->RemovePage(page_id); - } - else + } else wxGetApp().tab_panel()->InsertPage(wxGetApp().tab_panel()->FindPage(this), tab.panel, tab.panel->title()); } - static_cast(this)->m_printer_technology = printer_technology; } - } - - on_presets_changed(); - - if (name() == "print") - update_frequently_changed_parameters(); - if (m_name == "printer"){ - static_cast(this)->m_initial_extruders_count = static_cast(this)->m_extruders_count; - const Preset* parent_preset = m_presets->get_selected_preset_parent(); - static_cast(this)->m_sys_extruders_count = parent_preset == nullptr ? 0 : - static_cast(parent_preset->config.option("nozzle_diameter"))->values.size(); + on_presets_changed(); + if (printer_technology == ptFFF) { + static_cast(this)->m_initial_extruders_count = static_cast(this)->m_extruders_count; + const Preset* parent_preset = m_presets->get_selected_preset_parent(); + static_cast(this)->m_sys_extruders_count = parent_preset == nullptr ? 0 : + static_cast(parent_preset->config.option("nozzle_diameter"))->values.size(); + } } + else { + on_presets_changed(); + if (m_name == "print") + update_frequently_changed_parameters(); + } + m_opt_status_value = (m_presets->get_selected_preset_parent() ? osSystemValue : 0) | osInitValue; init_options_list(); update_changed_ui(); @@ -2543,7 +2547,7 @@ void Tab::delete_preset() // 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) + catch (const std::exception & /* e */) { return; } diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 196114256..942a50908 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -213,6 +213,7 @@ public: wxString title() const { return m_title; } std::string name() const { return m_name; } Preset::Type type() const { return m_type; } + virtual bool supports_printer_technology(const PrinterTechnology tech) = 0; void create_preset_tab(); void load_current_preset(); @@ -291,6 +292,7 @@ public: void reload_config() override; void update() override; void OnActivate() override; + bool supports_printer_technology(const PrinterTechnology tech) override { return tech == ptFFF; } }; //Slic3r::GUI::Tab::Filament; @@ -308,6 +310,7 @@ public: void reload_config() override; void update() override; void OnActivate() override; + bool supports_printer_technology(const PrinterTechnology tech) override { return tech == ptFFF; } }; //Slic3r::GUI::Tab::Printer; @@ -321,9 +324,9 @@ class TabPrinter : public Tab std::vector m_pages_fff; std::vector m_pages_sla; public: - wxButton* m_serial_test_btn; - wxButton* m_print_host_test_btn; - wxButton* m_printhost_browse_btn; + wxButton* m_serial_test_btn = nullptr; + wxButton* m_print_host_test_btn = nullptr; + wxButton* m_printhost_browse_btn = nullptr; size_t m_extruders_count; size_t m_extruders_count_old = 0; @@ -349,6 +352,7 @@ public: void build_extruder_pages(); void on_preset_loaded() override; void init_options_list() override; + bool supports_printer_technology(const PrinterTechnology /* tech */) override { return true; } }; class TabSLAMaterial : public Tab @@ -362,6 +366,7 @@ public: void build() override; void update() override; void init_options_list() override; + bool supports_printer_technology(const PrinterTechnology tech) override { return tech == ptSLA; } }; class SavePresetWindow :public wxDialog