From 2368d929fe969a2dd6c799edde9619e3d9d298f0 Mon Sep 17 00:00:00 2001 From: Stone Li Date: Mon, 3 Jul 2023 21:48:19 +0800 Subject: [PATCH] NEW: rearch calibration Change-Id: I20ee304eba1a63e08d0a36abdf06ebe6a6e4451f Signed-off-by: Stone Li --- resources/images/cali_page_after_flow.png | Bin 0 -> 2795 bytes resources/images/cali_page_after_pa.png | Bin 0 -> 3194 bytes resources/images/cali_page_before_flow.png | Bin 0 -> 2916 bytes resources/images/cali_page_before_pa.png | Bin 0 -> 3239 bytes resources/images/cali_page_caption_help.svg | 4 + .../images/cali_page_caption_help_hover.svg | 4 + resources/images/cali_page_caption_prev.svg | 3 + .../images/cali_page_caption_prev_hover.svg | 3 + src/libslic3r/Calib.hpp | 5 +- src/slic3r/CMakeLists.txt | 12 +- src/slic3r/GUI/CaliHistoryDialog.cpp | 421 ++ src/slic3r/GUI/CaliHistoryDialog.hpp | 57 + src/slic3r/GUI/CalibrationPanel.cpp | 169 +- src/slic3r/GUI/CalibrationPanel.hpp | 20 +- src/slic3r/GUI/CalibrationWizard.cpp | 4789 +++-------------- src/slic3r/GUI/CalibrationWizard.hpp | 476 +- src/slic3r/GUI/CalibrationWizardCaliPage.cpp | 404 ++ src/slic3r/GUI/CalibrationWizardCaliPage.hpp | 46 + src/slic3r/GUI/CalibrationWizardPage.cpp | 601 ++- src/slic3r/GUI/CalibrationWizardPage.hpp | 272 +- .../GUI/CalibrationWizardPresetPage.cpp | 1408 +++++ .../GUI/CalibrationWizardPresetPage.hpp | 259 + src/slic3r/GUI/CalibrationWizardSavePage.cpp | 1252 +++++ src/slic3r/GUI/CalibrationWizardSavePage.hpp | 284 + src/slic3r/GUI/CalibrationWizardStartPage.cpp | 304 ++ src/slic3r/GUI/CalibrationWizardStartPage.hpp | 80 + src/slic3r/GUI/DeviceManager.cpp | 108 +- src/slic3r/GUI/DeviceManager.hpp | 52 +- .../GUI/EditCalibrationHistoryDialog.cpp | 198 - .../GUI/EditCalibrationHistoryDialog.hpp | 31 - src/slic3r/GUI/HMSPanel.cpp | 3 +- src/slic3r/GUI/MainFrame.hpp | 17 +- src/slic3r/GUI/Monitor.cpp | 299 +- src/slic3r/GUI/Monitor.hpp | 19 +- src/slic3r/GUI/Plater.cpp | 50 +- src/slic3r/GUI/Plater.hpp | 3 +- src/slic3r/GUI/PresetComboBoxes.cpp | 16 +- src/slic3r/GUI/StatusPanel.cpp | 1243 ++--- src/slic3r/GUI/StatusPanel.hpp | 85 +- src/slic3r/GUI/UpgradePanel.cpp | 1 + src/slic3r/GUI/Widgets/SideTools.cpp | 361 +- src/slic3r/GUI/Widgets/SideTools.hpp | 57 +- src/slic3r/Utils/CalibUtils.cpp | 136 +- src/slic3r/Utils/CalibUtils.hpp | 9 +- 44 files changed, 7710 insertions(+), 5851 deletions(-) create mode 100644 resources/images/cali_page_after_flow.png create mode 100644 resources/images/cali_page_after_pa.png create mode 100644 resources/images/cali_page_before_flow.png create mode 100644 resources/images/cali_page_before_pa.png create mode 100644 resources/images/cali_page_caption_help.svg create mode 100644 resources/images/cali_page_caption_help_hover.svg create mode 100644 resources/images/cali_page_caption_prev.svg create mode 100644 resources/images/cali_page_caption_prev_hover.svg create mode 100644 src/slic3r/GUI/CaliHistoryDialog.cpp create mode 100644 src/slic3r/GUI/CaliHistoryDialog.hpp create mode 100644 src/slic3r/GUI/CalibrationWizardCaliPage.cpp create mode 100644 src/slic3r/GUI/CalibrationWizardCaliPage.hpp create mode 100644 src/slic3r/GUI/CalibrationWizardPresetPage.cpp create mode 100644 src/slic3r/GUI/CalibrationWizardPresetPage.hpp create mode 100644 src/slic3r/GUI/CalibrationWizardSavePage.cpp create mode 100644 src/slic3r/GUI/CalibrationWizardSavePage.hpp create mode 100644 src/slic3r/GUI/CalibrationWizardStartPage.cpp create mode 100644 src/slic3r/GUI/CalibrationWizardStartPage.hpp delete mode 100644 src/slic3r/GUI/EditCalibrationHistoryDialog.cpp delete mode 100644 src/slic3r/GUI/EditCalibrationHistoryDialog.hpp diff --git a/resources/images/cali_page_after_flow.png b/resources/images/cali_page_after_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce6761771b2ebb2a381b7af43068a509177ebbf GIT binary patch literal 2795 zcmdT``B&137RPK#E9>~IQ=;ZGni|v5NKC;kZNUYxqQ)UTn$LyI1rtqi!>nv`$tA=E z%*iFoT%a@*C8wt-DO8vyxYSc2Lq$bE{fa*NFQy;va_+r9-19k~d(Y?ISu|2_8+aQC z1k&?xKXo1i(%PrVzv^t!c!Q8<)0&_gs{?8k%_;XKj}RL?X1F|irv z>g@^wHRWz!3;G2F+LrEd%Jo8`)~v{`;NWTSmM>!uZ1kPKK+-_VI!0f$o&QFD)-er& zL>6Y#%^Ghgv`m+^l2zCLYnL~mIO^0UALETW`kX?l;);5>+!PB&t3;@f4&i4&+t!=3 zf73sDB0F8{>gFA1A(zv^TG|6T`yQWp1G3$;<>^n;T4w^L^8z22+4bd#+)+rbW9+uYlUsP-<$#$>f(C?R2tD5($S65P4V;!^ya3%&@Frm2rwv)2}jRQr>@ zRjj6Mpm`^G9^b#zx6KKimcQI=OO~~(p2oYVmjt7#aS}Uub-G3sU(B8;#?glH*72oL z9ZF$D+eYRt=jF?6_Ds3F?YeqZVbtbjNnNR}p$XYP_Db00vNj*+?6Wm_=>t;LP@_+h z_uB!Pd70~r@2q83LI&TtO}5!@n53jGR{9fDBRQ?u2G$~XPSXH#Re?#w)=d}9dP|y*~HoJKv2VJEn`U$vm1uSw#I4TU{VsEU*dUqt|_omAO#@%gPN1QDHx=*>2=Q$ERO z*-;P47mA;SR2CrX%cO-tnXiijs-Tmet!RAg|KwO2E*X0mxc^|^{hGdEB_gT^I_d0& z2vx!bY(sK`ART2y?`sN$!}5jbD!N+3Ba#Y`vC9X}^+{(eOyZR7^>&I^m$ZXL=0j`- zs+uCGz?ItkB1~H7+UrwY3Q;Ui7WmL2AwY_Tj7mjOOfU3c410Z5s+NQs=r$R@OWGL* zh68tXd+Q4L&5{F{UTjz!)m&C+9%QrATh@@_rT+b6+}*ft!|Jf#9AeMo0$ebamZg&L zIwBPb?lr=*nq-#DBh{TDYFHhNbrBo}o~g)r>G|gr?TzCgJv(yalW(9C(-bBuJ5iPi zm-3*v_Ci~#BR{;1Lr8e9+?Y$hXNcg;Cwr)^eEGpr$L78BN}D{2Bj)-NcFi%Ig#3( z$Cf+#F0g2T79*g!s5}38LLV%m(zTjEi|-oF*?kN)c1fl`R`J^%r-B_6= z9SF&g)ZwA@v#SLz`pjLJU4)G6csE{GX}#(8;DHz$QgCSeB_ z-IM7k>Op@xDmt2jC}Db9&F&8G_|$W6I1PyT7AAvM>*MdNi5^qB6UeYR1{Z1)ZIX&g zuQPGP(EYpQ0nMc!PP+v+lLpg1zQ=(dM%4j+HNQ%jSVU-`gU_G~EdP=W7t$Wz%2=mH z^-%D`+ z?f`fgveinFdI4{JiL;r%s!&kmNe*mRR-e_BPFVCDFD20yQ=Ptvh0XW&G8jP7wUmYUUre b{Mz=V$Us-$bFoDlZ3^-@jXqWHb~)q!zh)*B literal 0 HcmV?d00001 diff --git a/resources/images/cali_page_after_pa.png b/resources/images/cali_page_after_pa.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf3655fe49fd6004023b3135ba1ca783593041d GIT binary patch literal 3194 zcmds4`#Tc~AD<>lE*;J(N8;@`8Kqn%=CX}AE{#oi>yS(?8_{j<_gke-3}F)Sc24Y| zw#qHHh}yEvbWCk0roE8e5HuoD2#)bVzA4NOt_@}UD~NZoN`diqKADcWIZ&Lj1ba@rf4P9L8#)@xhq z^FDg4H@4Qk$g(mW7l}%Wh}V>Vk@;ZfzVCIS=eL^tRG&J5p_iBmvb>F2=TynXyN~j= zeC`H@_j@&2hyDCs-|Fr~O?~eZYK4ysfFAxuDkhDToYKIE|9e`I%rPl8g5D49NwLn9 zO(owU^SYC-IHs>HtV(9+!e;Wz`}l)ScA1hPPym7k4nEsntd*!(njRFkjKI#lmm;I9 zW7#BM_?BX2UgY)~%Iisumnw;MSzXN=koZ}~>cT{e@ZCc<)_!z`_4(ekMCk^6b3NjH z@$t|eNan_uj^?@#FN%+zCHe5Ox0D{2WTY?N{qJ`5Dc3&CZ_q0($p#Vbe5I6)ZWhP% zZ^*>tfti6Ddzv-sFYwy+K*+}=@Fz~+)@J%lnpjVbQ)=RQ2KePwzPi)Py0t@Lf7a<( zhs}AWrtFmAHWl(BHFM>4%N^GXbQ9H$yc9lDA1|qEx_V5-htlqJCyS9FRBebdL%@6> z%&!VgDUrFGex^5D6+yj&#<1@E<+JGbjN=eOq+dtOFMn#Wo=h@ zFAvh6Pxa!(Q6;Cvnl6|M5!W7mmUaRiTF<3QBs)1j35Fzv>GeIGmGwAsGrz`U=3GbX zFc4_b2}YPkYa7Fyl@hw;Ib}@9$xF#d+Q2dbhnFi0FIC})NQwwAecemk3MeLr_HvrQ zMz_Ycy1Ihr<0Ig;=;lTvtE$<*%mQ^=bh9cw3@VQ>64t}*N@GBy*7~~wxtq!jbh^a< zbPuJ^!I*mWSe#>p4;C?q(QOwSGLDFM)HQn7K zj?i3NQhn-!SF}#EK_QEHmQ7?J*rI73OjQ* zY35#B?I>j;{bOjOXzYiF_tf_Zh$DX7Wuu?K{0C~^QCaM0Fw=W`h3aP%j>0l?vA@%j z(R`UGatUPUfVYVxn@M-zrv>#vKO_?DW(w0k-Cr|J$~!17yG)hU{|1OyQLfdjj+s`5N0BHeJ@WuYNo+RuU&`3ls5 zP+)iu?7?-LmEg5<3T_3qSShlKm^kJbi~)`5tUCnoEKmf3{ccs-FVT@PUQaQzpX+7Hp`bK{ht9#3@)qE{b0lycRJ23Mo+U-+%4me-Jo}k60)!_T5imTiC zN(`ZDm^)^vlT#DlXwhn(Z(}?$8=wXAm|3?-e#OdQxzeFg#-=mFF2hO;83eZ+9(U0f zWZi4T+$@FepU<6$!Kk!qiHTE^y?>AW>dEJh`oA+lU@-ctS`68o-R{~+V>aqwpEQaTZAw$0mHPuypQ^#@JC>ssECz1Um{*vo?A~g zGU4RLM)jG3$0pAXfaz_%*L2E@!!Z3t2R2p1?8H@vmxBo(5ZUO8nP5VE(DT!#GzX@U zOKNIni1y_pQV5|^%!bZM%=bnO{TlSO+v2H(K&7v^Y5W|w zfFG47bKLp2-F{hqnSgP$qq6>^xr5|JvD${OruPeB*AO>qw-z%;{r#` zQ&6xI`c4Am^M&8_;tdnsf1KS=i|}Hg={ahsMa9EI)JQ+3@m`1HItA8@Kh+m+w10xN zbhICkdpQ_`S1f0kL=%4O#8q^1QJft%0_^ITrBSB!p7ECZ$g*BLfXl#-dsnZ7lDyB4 zbbObR^Z5{6gvf5O6$67v$CbiY-A~0sWgv2cECdFvf@_T{vn=U1>V@(yw#^j!NOEX; zS+RDmQpP{|Ak&z;iQ^Gm>7LpzT)y;Qb5IopdrR@4r&!{?Gsb literal 0 HcmV?d00001 diff --git a/resources/images/cali_page_before_flow.png b/resources/images/cali_page_before_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..80e01aa204ffa5bb1ae7a6d013028a8b105d9061 GIT binary patch literal 2916 zcmdT``CHQY7RD^wEL-kOX_}Rl*EW|HQxtS;(sHSEZe0wQ28ByzsJP*VjXiU_m9}UJ z0#cJ;R^oFdQ4GPdA{L=>BLuG%=r;cHg8 ztO9{RYfeNQiv@w~Hrw(~D;#WoW6BeaEv(FlfMG$P)f>N=9jJ!d_tt95g=HYns<{)#LVwA(n^3ggh4;HG`}pX*|FW!Ye09i8L8kBSw{HlW zD-pj&-Mr!Jd-`>0R=!<6Xy`@z*tztUx6={vJrPAo{Z+{JTXGaBX9hCVo-y_LP2`r4 zm-r*48|>`+R&0K7yc2YIiNoXdJ|X3$b{CgAp7uyCb@^UOqdY}`$*kvL@QVwxKQsl; zd_X8*3np2TqEO$_YM$kqbqdJWk7W~#7rMd066+k`k;DUP3t6^u-Z}aUJ-4vXJki?9 zT4)#J+zY-uoH#oVQ1L81*L;~|2r~7>E!UIUMJA3>0)D}=O!uD3h*!Yoke$|sKvR3Hat$j;t^Gp3P1H`lRwQP zXtL8joC_H_#g46T$6GSfz>EV)1sd9rbi3aJs9DRLu$uM530>&^Z>a{sF%I@YQRy5E(G>Q}_o^9%w8T`@f_I{u4W{DG^FYozvOukyJXdNyoq#vm<4BvEyjcKcsO62zng@j?= zqSZVx2T+IG2GiI3V9$vXrfoPrEaM0MeRsq_L#{Ojb&XS-o;6FU$n1mMxiYQ5@FrN@ zbIqK0a~m%j|0lk-7S`-`STRVAeg;UIFWmRR4l$KA#>P}~I?}lc1ioC#$Z>Y|VefU1 zt&aPhY<_GIX90Bug3JxEQvy#a9D)&=MoE}N-wdZ%0Y8POP6q;J}h%Oq0!XF8sSt=7zg310tQ&Xb|M^7(;};L%T0WDyf%>p z3kiI`w~3R*4tpKdf~^;Wt}8DXDk}&vWJysUWX|91K%7oVLoHfrB~@Up%UaD*x&FBL zI`T=!N!-TMP2Bl0T|C}Kf+057Vh~L%%ntK@b-tbcIlf-QX1IEkq3R%hk0Mq?%MI4{ zokSu(-rHGhqs7!e0K&_vWI6S4qlifM;ENC6Qr!;1joZs}N=6C|I_3CJs<7LeMx@`G9ycF`-= zMP)mhase!&SlnPDX_bkD;j%f=4rz&`hN77hs(KaBp{+!utgADMx4~#->W*xoqanNI zQnf6L;R?3j?({Y0F0gD|dWKo8nbf3s^#)y&q1F7D6Pjp*UN6NZgVy0H!x|Uw4uJPnx#h0L>$}n1b&+=F* zdYlZFb>M5^7)B~1PXd;KuT-Yfl{jy_`{AcGTh3QhVu7!{yn#+JJFW?6NKGjnXTU zMb#MEr7bnhKn-#aG_RLa-7MAPpsB<_K}gMladK)WTUDW5e7gk$U;m0-hRm%}btel= zG&pe#AV$xSinDYu2irP4EmLw;vgg9R2f|BP!uz=*UngARA#;>@WHx*&PW_}*nDb2Z zbeaecTLPB(+C!o8+^q)s8hS}j%v1CY*S)ga=~xaKYzKY#yyQ26m9)HopPn&whyI5x56xAg9jPjy~QcDhZDlwcxc?=&dO+ zp5;;OxJ{aAT(F`(jGBTx&Q!-QPjfh~o5U55AtZP*&f7kPmv{i)meD_B+&1%^_-@~( zxBHpt=16u_Ths^0 zUb-{Q3q{xc$|*6~eSO6VtEGC);{YppFAy*W>w-n2&hx-b$b$;lkCJwLEg~gZx?$vy z9Fo_^P6Oup9sk&eHWV_vWUNJB!#|e~IljLtDCu~{r1>)cguSh>P(~2Q2qU^bUd9i8 z9V`eW0JE;fwj)+eJvH~!UE;~woDraH-BC2%_hE%<969jbIYXo57Yp{7>+FHc_lga!2zsZ{>lHU!95gI=P&lut&r{HQ)t+UV_h@rw z?0_qHq((v-e+MFbe0Kx~HTg8{%BCA@M{ZmsE=12Ad@u7hr|zx{{NO}zzKJd)YIed= z$d-Xf#`cH2B<}|PzGx<%k$S%=09oN5$%9$DFQrr5-1hJbMv180oac~dP>HzB&tCA% zCv`B%8grCpY0y6!3!13HN{=vain+#pUxw96X)b&j_b^KhzNY7p+4D^p$-x}(aM!$lVC%3t_^Igv z0!wxLJzL4t<=yvt(>NdV8Vx{o^G&qG7zGeN2o&7%O$}_YI;B6_a>l9{a@*+BIj6$M m*?+&XQiu}( literal 0 HcmV?d00001 diff --git a/resources/images/cali_page_before_pa.png b/resources/images/cali_page_before_pa.png new file mode 100644 index 0000000000000000000000000000000000000000..2e52dd064bac473d045b1452975fa65b8f0df1cd GIT binary patch literal 3239 zcmds4=~ohn7RPx_r)8Yp%h$79@->x?!4@-czt$G&X_X5m zZab)Ox+CvUpcu0t+seSo;W%+pw@R$84cW1M*sjXSH8ClNMKg@Jg~~<`qKj8$6LGYq z6sff4x9vmD%M81a)RJ9fgKp(?7F~KHQzPeLdyn2O<-Ocd<}{ryqOt??{J^TH%#U{s zYkQjafY+~XNN7ECyJz~$a$HavSXqyDL&DJN2;2U`M`QyvUwZeX-KtC`b}c6r)k=$U zfoamoHIL9nAKq?&TlhM^n#{utqueK zzISiTXIhUov)g%b^nl$T{i)m$PMPv2n8$LrTDs|E7!ckWrcnrxdnTto`j1ZU#Cu|v zFA#*@r0k9PNt>X)E=i6~qfB<5fi3TSUS-tDSR3^YYTxF?1a9|Pc({t|*;C$@OSylt z3Y#*$t#AK{eMcVWU1Exb4pGD6Pz!g(!lI<@9x9zAn*A}*efmo9;b-u?*P?;Jo5v8$ zhfWs1a!_rh$WAK`HI`JejCIqN39;(B`5Pc4w+C#DRer9*vIGb-5vsiuL8;BN3@I#f z{*?3vh)d?@0U@=0rG~`7dl?g>`tUZFO;=YHmK6tv{vMF zw1C0RlxJuY6)H zIIFE2mb7*iCBSg2tyF4#%okaPU>qM*o1ivPUzFcJh8#B*+-z8F@+(+sDo>o^h9p^! zLeK@X$2C$5vrD|NY1(7*+lEuCF zN2-Kkr@>VAOKClq%mQTnR$FyiGc+;xNyoj+|pKnf`g3(A*COGVWU zbQ7|)%)yOKG*7!fd2i*awE&@s$8VULnhvLx!E4~79x?cqkXB@A&4g1>t}nXLwz?oj zS<>iHjAk`Kq_x-8_?Gk1TMjS(0EOcaIT>Jo#6d<4`J=YyFXsE*uD@Q>L`gAnCjOjsh^y`g z#XSGPSaQdQ%m&AL67n16AFKqmXX<*-LC!)h78rUli{)|Yz{FRK0tpf-uCF|Qsek-# zvBEF6ki$>;1j}`J$!r4U7tMQukjwxyEWCk_bk)^eg*+Y&S@3|O*XPNkIRy(Gw?Vj; z6OKMhQe?@j1t6}r;2|@(>AIfB;6)ML~C|Sj*y7G#gw2#@V-01#5T4z zDSQ-P2j}tSnFj=R>Uyzr{@C6VmMO&F?IA{vcl~Xr|wBk4I;PmC;RE!akAs&Qfye(gIUY#&O}9M|NCGG70)=B`T41c&FpFe{f^5G zC4-<)dqemXybTjqB#&DUHno>v^&it=1?oSQF&&ex5@9Pg0kUxslTpE7RREi1r?9Sy z_l$<_n*O&0f3H{7`g?Dxtg5iEYSHom+rWMhRF{CDDBibX`ts?bw?z8n`tvlC2jiK8 z^B3--tXDSbTC6`TS|BdEHuo$__|YU{Ds+!c+z|);rLe)kd?OU}1l5@xBPa*gG}aeT zkRH^Gnu9y>@eyKs@eLQP^*hJ9w&~PEypjyYfQxG8Q5BckNrc9jJ{qCnmt=AccF3oR^pBjt^| zCc7$+N+^8Pgh+V^A>6N%{@!_Fq1}RSZkVWmnv$&xVcSG0Ge^`d$O-${g&@K zg7%=V;WgsRmPjHY;JagnBd5@U^DJmMPs?J@#J=Ag-Z=l_lpkZr9ei(M7zs2*wl1ZP_}Z z_Ly+xwX9=m|BV9_Zp#r`!=u7(cJE?lE>TnM$_bX2CRK*b+%Xo&G)kfHRG=?Ed4$*d z-wAU~O>JKWX?EwFmG@(%>FXKT_~*t#`V!wuQ+c$H5`8&_EbH{bQ2a3z534FpxQ!`m zQ+d2y{j73q*-q#(?C20RokqtbIJ08#jak~~^_&*2qoDR69cKZdYcA(u1hQ&d)7TtB z;R`l6HAW0qW_$)er>Tujyb=<0zWUz;i~AOs=>JO(1RWr0+$k*R=YJj9`YQll=OO2) IXRqG*AHuZvqW}N^ literal 0 HcmV?d00001 diff --git a/resources/images/cali_page_caption_help.svg b/resources/images/cali_page_caption_help.svg new file mode 100644 index 0000000000..70babeb017 --- /dev/null +++ b/resources/images/cali_page_caption_help.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/cali_page_caption_help_hover.svg b/resources/images/cali_page_caption_help_hover.svg new file mode 100644 index 0000000000..70babeb017 --- /dev/null +++ b/resources/images/cali_page_caption_help_hover.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/cali_page_caption_prev.svg b/resources/images/cali_page_caption_prev.svg new file mode 100644 index 0000000000..b34eca2cc1 --- /dev/null +++ b/resources/images/cali_page_caption_prev.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/cali_page_caption_prev_hover.svg b/resources/images/cali_page_caption_prev_hover.svg new file mode 100644 index 0000000000..b34eca2cc1 --- /dev/null +++ b/resources/images/cali_page_caption_prev_hover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/libslic3r/Calib.hpp b/src/libslic3r/Calib.hpp index a18840ae4d..a519dc4808 100644 --- a/src/libslic3r/Calib.hpp +++ b/src/libslic3r/Calib.hpp @@ -32,11 +32,8 @@ struct PrinterCaliInfo std::string dev_id; CalibMode mode; CalibState state; - //std::string filament_preset; - //std::vector tray_ids; + /* tray index -> filament preset name */ std::map filament_presets; - //float nozzle_dia; - //int bed_type; }; struct Calib_Params diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 12a0591d02..42d5d76289 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -392,14 +392,22 @@ set(SLIC3R_GUI_SOURCES GUI/ReleaseNote.cpp GUI/SingleChoiceDialog.hpp GUI/SingleChoiceDialog.cpp + GUI/CaliHistoryDialog.hpp + GUI/CaliHistoryDialog.cpp GUI/CalibrationPanel.hpp GUI/CalibrationPanel.cpp GUI/CalibrationWizard.hpp GUI/CalibrationWizard.cpp - GUI/EditCalibrationHistoryDialog.cpp - GUI/EditCalibrationHistoryDialog.hpp GUI/CalibrationWizardPage.cpp GUI/CalibrationWizardPage.hpp + GUI/CalibrationWizardStartPage.cpp + GUI/CalibrationWizardStartPage.hpp + GUI/CalibrationWizardPresetPage.cpp + GUI/CalibrationWizardPresetPage.hpp + GUI/CalibrationWizardCaliPage.cpp + GUI/CalibrationWizardCaliPage.hpp + GUI/CalibrationWizardSavePage.cpp + GUI/CalibrationWizardSavePage.hpp GUI/calib_dlg.cpp GUI/calib_dlg.hpp GUI/Calibration.hpp diff --git a/src/slic3r/GUI/CaliHistoryDialog.cpp b/src/slic3r/GUI/CaliHistoryDialog.cpp new file mode 100644 index 0000000000..cc3b8ca5af --- /dev/null +++ b/src/slic3r/GUI/CaliHistoryDialog.cpp @@ -0,0 +1,421 @@ +#include "CaliHistoryDialog.hpp" +#include "I18N.hpp" + +#include "libslic3r/Utils.hpp" +#include "GUI.hpp" +#include "GUI_App.hpp" +#include "format.hpp" +#include "MsgDialog.hpp" +#include "slic3r/Utils/CalibUtils.hpp" + +namespace Slic3r { +namespace GUI { + + +#define HISTORY_WINDOW_SIZE wxSize(FromDIP(600), FromDIP(450)) +#define EDIT_HISTORY_DIALOG_INPUT_SIZE wxSize(FromDIP(160), FromDIP(24)) +#define HISTORY_WINDOW_ITEMS_COUNT 4 + +HistoryWindow::HistoryWindow(wxWindow* parent, const std::vector& calib_results_history) + : DPIDialog(parent, wxID_ANY, _L("Pressure Advance Calibration Result"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) + , m_calib_results_history(calib_results_history) +{ + this->SetBackgroundColour(*wxWHITE); + auto main_sizer = new wxBoxSizer(wxVERTICAL); + + auto scroll_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL); + scroll_window->SetScrollRate(5, 5); + scroll_window->SetBackgroundColour(*wxWHITE); + + auto scroll_sizer = new wxBoxSizer(wxVERTICAL); + scroll_window->SetSizer(scroll_sizer); + + wxPanel* comboBox_panel = new wxPanel(scroll_window); + comboBox_panel->SetBackgroundColour(wxColour(238, 238, 238)); + auto comboBox_sizer = new wxBoxSizer(wxVERTICAL); + comboBox_panel->SetSizer(comboBox_sizer); + comboBox_sizer->AddSpacer(10); + + auto nozzle_dia_title = new wxStaticText(comboBox_panel, wxID_ANY, _L("Nozzle Diameter")); + nozzle_dia_title->SetFont(Label::Head_14); + comboBox_sizer->Add(nozzle_dia_title, 0, wxLEFT | wxRIGHT, FromDIP(15)); + comboBox_sizer->AddSpacer(10); + + m_comboBox_nozzle_dia = new ComboBox(comboBox_panel, wxID_ANY, "", wxDefaultPosition, wxSize(FromDIP(500), FromDIP(24)), 0, nullptr, wxCB_READONLY); + comboBox_sizer->Add(m_comboBox_nozzle_dia, 0, wxLEFT | wxRIGHT, FromDIP(15)); + comboBox_sizer->AddSpacer(10); + + scroll_sizer->Add(comboBox_panel); + + scroll_sizer->AddSpacer(FromDIP(15)); + + wxPanel* tips_panel = new wxPanel(scroll_window, wxID_ANY); + auto tips_sizer = new wxBoxSizer(wxVERTICAL); + tips_panel->SetSizer(tips_sizer); + m_tips = new wxStaticText(tips_panel, wxID_ANY, ""); + m_tips->SetForegroundColour({ 145, 145, 145 }); + tips_sizer->Add(m_tips, 0, wxEXPAND); + + scroll_sizer->Add(tips_panel, 0, wxEXPAND); + + scroll_sizer->AddSpacer(FromDIP(15)); + + m_history_data_panel = new wxPanel(scroll_window); + + scroll_sizer->Add(m_history_data_panel, 1, wxEXPAND); + + main_sizer->Add(scroll_window, 1, wxEXPAND | wxALL, FromDIP(10)); + SetSizer(main_sizer); + main_sizer->Fit(this); + SetMinSize(HISTORY_WINDOW_SIZE); + SetSize(HISTORY_WINDOW_SIZE); + CenterOnParent(); + + wxGetApp().UpdateDlgDarkUI(this); + + m_comboBox_nozzle_dia->Bind(wxEVT_COMBOBOX, &HistoryWindow::on_select_nozzle, this); + + m_refresh_timer = new wxTimer(); + m_refresh_timer->SetOwner(this); + m_refresh_timer->Start(200); + Bind(wxEVT_TIMER, &HistoryWindow::on_timer, this); +} + +HistoryWindow::~HistoryWindow() +{ + m_refresh_timer->Stop(); +} + +void HistoryWindow::sync_history_result(MachineObject* obj) +{ + BOOST_LOG_TRIVIAL(info) << "sync_history_result"; + + m_calib_results_history.clear(); + if (obj) + m_calib_results_history = obj->pa_calib_tab; + + if (m_calib_results_history.empty()) { + // for test + /* + std::vector temp_test; + PACalibResult test{ 0, 0, 0.0f, "test", "test", "test_name", 0.1f, 0.5f }; + temp_test.push_back(test); + test.tray_id = 1; + temp_test.push_back(test); + test.tray_id = 2; + temp_test.push_back(test); + test.tray_id = 3; + temp_test.push_back(test); + m_calib_results_history = temp_test; + */ + } + + sync_history_data(); + + if (m_calib_results_history.empty()) { + m_tips->SetLabel(_L("No History Result")); + } + else { + m_tips->SetLabel("Success to get history result"); + } + m_tips->Refresh(); + +} + +void HistoryWindow::on_device_connected(MachineObject* obj) +{ + if (!obj) { + return; + } + + curr_obj = obj; + // init nozzle value + static std::array nozzle_diameter_list = { 0.2f, 0.4f, 0.6f, 0.8f }; + int selection = 1; + for (int i = 0; i < nozzle_diameter_list.size(); i++) { + m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f mm", nozzle_diameter_list[i])); + if (abs(curr_obj->nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) { + selection = i; + } + } + m_comboBox_nozzle_dia->SetSelection(selection); + + // trigger on_select nozzle + wxCommandEvent evt(wxEVT_COMBOBOX); + evt.SetEventObject(m_comboBox_nozzle_dia); + wxPostEvent(m_comboBox_nozzle_dia, evt); +} + +void HistoryWindow::on_timer(wxTimerEvent& event) +{ + update(curr_obj); +} + +void HistoryWindow::update(MachineObject* obj) +{ + if (!obj) return; + + if (obj->cali_version != history_version) { + if (obj->has_get_pa_calib_tab) { + history_version = obj->cali_version; + reqeust_history_result(obj); + } + } + + // sync when history is not empty + if (obj->has_get_pa_calib_tab && m_calib_results_history.empty()) { + sync_history_result(curr_obj); + } +} + +void HistoryWindow::on_select_nozzle(wxCommandEvent& evt) +{ + reqeust_history_result(curr_obj); + +} + +void HistoryWindow::reqeust_history_result(MachineObject* obj) +{ + if (curr_obj) { + curr_obj->reset_pa_cali_history_result(); + sync_history_result(curr_obj); + + float nozzle_value = get_nozzle_value(); + if (nozzle_value > 0) { + CalibUtils::emit_get_PA_calib_infos(nozzle_value); + m_tips->SetLabel("Refreshing the historical pressure advance records"); + BOOST_LOG_TRIVIAL(info) << "request calib history"; + } + } +} + +void HistoryWindow::sync_history_data() { + m_history_data_panel->DestroyChildren(); + wxGridBagSizer* gbSizer; + gbSizer = new wxGridBagSizer(FromDIP(0), FromDIP(80)); + gbSizer->SetFlexibleDirection(wxBOTH); + gbSizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); + + m_history_data_panel->SetSizer(gbSizer, true); + + auto title_material = new wxStaticText(m_history_data_panel, wxID_ANY, _L("Material")); + title_material->SetFont(Label::Head_14); + gbSizer->Add(title_material, { 0, 0 }, { 1, 1 }, wxBOTTOM, FromDIP(15)); + + auto title_k = new wxStaticText(m_history_data_panel, wxID_ANY, _L("K")); + title_k->SetFont(Label::Head_14); + gbSizer->Add(title_k, { 0, 1 }, { 1, 1 }, wxBOTTOM, FromDIP(15)); + + // Hide + //auto title_n = new wxStaticText(m_history_data_panel, wxID_ANY, _L("N")); + //title_n->SetFont(Label::Head_14); + //gbSizer->Add(title_n, { 0, 2 }, { 1, 1 }, wxBOTTOM, FromDIP(15)); + + auto title_action = new wxStaticText(m_history_data_panel, wxID_ANY, _L("Action")); + title_action->SetFont(Label::Head_14); + gbSizer->Add(title_action, { 0, 2 }, { 1, 1 }); + + int i = 1; + for (auto& result : m_calib_results_history) { + wxString material_name = ""; + material_name = result.name; + auto material_name_value = new wxStaticText(m_history_data_panel, wxID_ANY, material_name); + auto k_str = wxString::Format("%.3f", result.k_value); + auto n_str = wxString::Format("%.3f", result.n_coef); + auto k_value = new wxStaticText(m_history_data_panel, wxID_ANY, k_str); + auto n_value = new wxStaticText(m_history_data_panel, wxID_ANY, n_str); + n_value->Hide(); + auto delete_button = new Button(m_history_data_panel, _L("Delete")); + delete_button->SetBackgroundColour(*wxWHITE); + delete_button->SetMinSize(wxSize(-1, FromDIP(24))); + delete_button->SetCornerRadius(FromDIP(12)); + delete_button->Bind(wxEVT_BUTTON, [this, gbSizer, i, &result](auto& e) { + for (int j = 0; j < HISTORY_WINDOW_ITEMS_COUNT; j++) { + auto item = gbSizer->FindItemAtPosition({ i, j }); + item->GetWindow()->Hide(); + } + gbSizer->SetEmptyCellSize({ 0,0 }); + m_history_data_panel->Layout(); + m_history_data_panel->Fit(); + CalibUtils::delete_PA_calib_result({ result.tray_id, result.cali_idx, result.nozzle_diameter, result.filament_id }); + }); + + auto edit_button = new Button(m_history_data_panel, _L("Edit")); + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), + std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); + edit_button->SetBackgroundColour(*wxWHITE); + edit_button->SetBackgroundColor(btn_bg_green); + edit_button->SetBorderColor(wxColour(0, 174, 66)); + edit_button->SetTextColor(wxColour("#FFFFFE")); + edit_button->SetMinSize(wxSize(-1, FromDIP(24))); + edit_button->SetCornerRadius(FromDIP(12)); + edit_button->Bind(wxEVT_BUTTON, [this, &result, k_value, material_name_value](auto& e) { + PACalibResult result_buffer = result; + result_buffer.k_value = stof(k_value->GetLabel().ToStdString()); + result_buffer.name = material_name_value->GetLabel().ToStdString(); + EditCalibrationHistoryDialog dlg(this, result_buffer); + if (dlg.ShowModal() == wxID_OK) { + auto new_result = dlg.get_result(); + + wxString new_k_str = wxString::Format("%.3f", new_result.k_value); + k_value->SetLabel(new_k_str); + material_name_value->SetLabel(new_result.name); + + new_result.tray_id = -1; + CalibUtils::set_PA_calib_result({ new_result }); + + // TODO Re-request history and refresh page + //wxCommandEvent evt(wxEVT_COMBOBOX); + //evt.SetEventObject(m_comboBox_nozzle_dia); + //wxPostEvent(m_comboBox_nozzle_dia, evt); + } + }); + + gbSizer->Add(material_name_value, { i, 0 }, { 1, 1 }, wxBOTTOM, FromDIP(15)); + gbSizer->Add(k_value, { i, 1 }, { 1, 1 }, wxBOTTOM, FromDIP(15)); + //gbSizer->Add(n_value, { i, 2 }, { 1, 1 }, wxBOTTOM, FromDIP(15)); + gbSizer->Add(delete_button, { i, 2 }, { 1, 1 }, wxBOTTOM, FromDIP(15)); + gbSizer->Add(edit_button, { i, 3 }, { 1, 1 }, wxBOTTOM, FromDIP(15)); + i++; + } + + Layout(); +} + +float HistoryWindow::get_nozzle_value() +{ + double nozzle_value = 0.0; + wxString nozzle_value_str = m_comboBox_nozzle_dia->GetValue(); + try { + nozzle_value_str.ToDouble(&nozzle_value); + } + catch (...) { + ; + } + + return nozzle_value; +} + + +EditCalibrationHistoryDialog::EditCalibrationHistoryDialog(wxWindow* parent, const PACalibResult& result) + : DPIDialog(parent, wxID_ANY, _L("Edit Pressure Advance"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) + , m_new_result(result) +{ + this->SetBackgroundColour(*wxWHITE); + auto main_sizer = new wxBoxSizer(wxVERTICAL); + + auto top_panel = new wxPanel(this); + auto panel_sizer = new wxBoxSizer(wxVERTICAL); + top_panel->SetSizer(panel_sizer); + + auto flex_sizer = new wxFlexGridSizer(0, 2, FromDIP(15), FromDIP(30)); + flex_sizer->SetFlexibleDirection(wxBOTH); + flex_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); + + wxStaticText* material_name_title = new wxStaticText(top_panel, wxID_ANY, _L("Material")); + TextInput* material_name_value = new TextInput(top_panel, m_new_result.name, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER); + material_name_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, material_name_value](auto& e) { + if (!material_name_value->GetTextCtrl()->GetValue().IsEmpty()) + m_new_result.name = material_name_value->GetTextCtrl()->GetValue().ToStdString(); + }); + material_name_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, material_name_value](auto& e) { + if (!material_name_value->GetTextCtrl()->GetValue().IsEmpty()) + m_new_result.name = material_name_value->GetTextCtrl()->GetValue().ToStdString(); + e.Skip(); + }); + flex_sizer->Add(material_name_title); + flex_sizer->Add(material_name_value); + + wxStaticText* k_title = new wxStaticText(top_panel, wxID_ANY, _L("K Factor")); + auto k_str = wxString::Format("%.3f", m_new_result.k_value); + TextInput* k_value = new TextInput(top_panel, k_str, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER); + k_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, k_value](auto& e) { + float k = 0.0f; + if (!CalibUtils::validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k)) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } + wxString k_str = wxString::Format("%.3f", k); + k_value->GetTextCtrl()->SetValue(k_str); + m_new_result.k_value = k; + }); + k_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, k_value](auto& e) { + float k = 0.0f; + if (!CalibUtils::validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k)) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } + wxString k_str = wxString::Format("%.3f", k); + k_value->GetTextCtrl()->SetValue(k_str); + m_new_result.k_value = k; + e.Skip(); + }); + flex_sizer->Add(k_title); + flex_sizer->Add(k_value); + + // Hide: + //wxStaticText* n_title = new wxStaticText(top_panel, wxID_ANY, _L("N Factor")); + //TextInput* n_value = new TextInput(top_panel, n, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER); + //flex_sizer->Add(n_title); + //flex_sizer->Add(n_value); + + panel_sizer->Add(flex_sizer); + + panel_sizer->AddSpacer(FromDIP(25)); + + auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); + Button* save_btn = new Button(top_panel, _L("Save")); + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), + std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); + save_btn->SetBackgroundColour(*wxWHITE); + save_btn->SetBackgroundColor(btn_bg_green); + save_btn->SetBorderColor(wxColour(0, 174, 66)); + save_btn->SetTextColor(wxColour("#FFFFFE")); + save_btn->SetMinSize(wxSize(-1, FromDIP(24))); + save_btn->SetCornerRadius(FromDIP(12)); + Button* cancel_btn = new Button(top_panel, _L("Cancel")); + cancel_btn->SetBackgroundColour(*wxWHITE); + cancel_btn->SetMinSize(wxSize(-1, FromDIP(24))); + cancel_btn->SetCornerRadius(FromDIP(12)); + save_btn->Bind(wxEVT_BUTTON, &EditCalibrationHistoryDialog::on_save, this); + cancel_btn->Bind(wxEVT_BUTTON, &EditCalibrationHistoryDialog::on_cancel, this); + btn_sizer->AddStretchSpacer(); + btn_sizer->Add(save_btn); + btn_sizer->AddSpacer(FromDIP(20)); + btn_sizer->Add(cancel_btn); + panel_sizer->Add(btn_sizer, 0, wxEXPAND, 0); + + + main_sizer->Add(top_panel, 1, wxEXPAND | wxALL, FromDIP(20)); + + SetSizer(main_sizer); + Layout(); + Fit(); + CenterOnParent(); + + wxGetApp().UpdateDlgDarkUI(this); +} + +EditCalibrationHistoryDialog::~EditCalibrationHistoryDialog() { +} + +PACalibResult EditCalibrationHistoryDialog::get_result() { + return m_new_result; +} + +void EditCalibrationHistoryDialog::on_save(wxCommandEvent& event) { + EndModal(wxID_OK); +} + +void EditCalibrationHistoryDialog::on_cancel(wxCommandEvent& event) { + EndModal(wxID_CANCEL); +} + +void EditCalibrationHistoryDialog::on_dpi_changed(const wxRect& suggested_rect) +{ +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/CaliHistoryDialog.hpp b/src/slic3r/GUI/CaliHistoryDialog.hpp new file mode 100644 index 0000000000..001006cd12 --- /dev/null +++ b/src/slic3r/GUI/CaliHistoryDialog.hpp @@ -0,0 +1,57 @@ +#ifndef slic3r_GUI_CaliHistory_hpp_ +#define slic3r_GUI_CaliHistory_hpp_ + +#include "GUI_Utils.hpp" +#include "wxExtensions.hpp" +#include "Widgets/ComboBox.hpp" +#include "DeviceManager.hpp" + +namespace Slic3r { +namespace GUI { + +class HistoryWindow : public DPIDialog { +public: + HistoryWindow(wxWindow* parent, const std::vector& calib_results_history); + ~HistoryWindow(); + void on_dpi_changed(const wxRect& suggested_rect) {} + void on_select_nozzle(wxCommandEvent& evt); + void reqeust_history_result(MachineObject* obj); + void sync_history_result(MachineObject* obj); + void on_device_connected(MachineObject* obj); + void on_timer(wxTimerEvent& event); + void update(MachineObject* obj); +protected: + void sync_history_data(); + float get_nozzle_value(); + + wxPanel* m_history_data_panel; + ComboBox* m_comboBox_nozzle_dia; + wxStaticText* m_tips; + + wxTimer* m_refresh_timer { nullptr }; + + std::vector m_calib_results_history; + MachineObject* curr_obj { nullptr }; + int history_version = -1; +}; + +class EditCalibrationHistoryDialog : public DPIDialog +{ +public: + EditCalibrationHistoryDialog(wxWindow* parent, const PACalibResult& result); + ~EditCalibrationHistoryDialog(); + void on_dpi_changed(const wxRect& suggested_rect) override; + PACalibResult get_result(); + +protected: + virtual void on_save(wxCommandEvent& event); + virtual void on_cancel(wxCommandEvent& event); + +protected: + PACalibResult m_new_result; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/CalibrationPanel.cpp b/src/slic3r/GUI/CalibrationPanel.cpp index e48fbaf2db..7c33da2cd1 100644 --- a/src/slic3r/GUI/CalibrationPanel.cpp +++ b/src/slic3r/GUI/CalibrationPanel.cpp @@ -459,20 +459,19 @@ CalibrationPanel::CalibrationPanel(wxWindow* parent, wxWindowID id, const wxPoin void CalibrationPanel::init_tabpanel() { m_side_tools = new SideTools(this, wxID_ANY); - m_side_tools->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CalibrationPanel::on_printer_clicked), NULL, this); + m_side_tools->get_panel()->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CalibrationPanel::on_printer_clicked), NULL, this); wxBoxSizer* sizer_side_tools = new wxBoxSizer(wxVERTICAL); sizer_side_tools->Add(m_side_tools, 1, wxEXPAND, 0); m_tabpanel = new Tabbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, sizer_side_tools, wxNB_LEFT | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME); + m_side_tools->set_table_panel(m_tabpanel); m_tabpanel->SetBackgroundColour(*wxWHITE); m_cali_panels[0] = new PressureAdvanceWizard(m_tabpanel); m_cali_panels[1] = new FlowRateWizard(m_tabpanel); m_cali_panels[2] = new MaxVolumetricSpeedWizard(m_tabpanel); - //m_cali_panels[3] = new TemperatureWizard(m_tabpanel); - //m_cali_panels[4] = new RetractionWizard(m_tabpanel); for (int i = 0; i < (int)CALI_MODE_COUNT; i++) { bool selected = false; @@ -487,11 +486,7 @@ void CalibrationPanel::init_tabpanel() { for (int i = 0; i < (int)CALI_MODE_COUNT; i++) m_tabpanel->SetPageImage(i, ""); - m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent&) { - wxCommandEvent e (EVT_CALIBRATION_TAB_CHANGED); - e.SetEventObject(m_tabpanel->GetCurrentPage()); - wxPostEvent(m_tabpanel->GetCurrentPage(), e); - }, m_tabpanel->GetId()); + m_initialized = true; } void CalibrationPanel::init_timer() @@ -507,60 +502,137 @@ void CalibrationPanel::on_timer(wxTimerEvent& event) { } void CalibrationPanel::update_print_error_info(int code, std::string msg, std::string extra) { - for (int i = 0; i < m_tabpanel->GetPageCount(); i++) { - if(m_tabpanel->GetPage(i)) - static_cast(m_tabpanel->GetPage(i))->update_print_error_info(code, msg, extra); + // update current wizard only + int curr_selected = m_tabpanel->GetSelection(); + if (curr_selected >= 0 && curr_selected < CALI_MODE_COUNT) { + if (m_cali_panels[curr_selected]) { + auto page = m_cali_panels[curr_selected]->get_curr_step()->page; + if(page && page->get_page_type() == CaliPageType::CALI_PAGE_PRESET){ + auto preset_page = static_cast(page); + if (preset_page->get_page_status() == CaliPresetPageStatus::CaliPresetStatusSending) + preset_page->update_print_error_info(code, msg, extra); + } + } } } void CalibrationPanel::update_all() { - for (int i = 0; i < (int)CALI_MODE_COUNT; i++) { - m_cali_panels[i]->update_printer(); - if (m_cali_panels[i]->IsShown()) - m_cali_panels[i]->update_print_progress(); - } NetworkAgent* m_agent = wxGetApp().getAgent(); Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) + if (!dev) return; + obj = dev->get_selected_machine(); + + // update current wizard only + int curr_selected = m_tabpanel->GetSelection(); + + if (curr_selected >= 0 && curr_selected < CALI_MODE_COUNT) { + if (m_cali_panels[curr_selected]) + m_cali_panels[curr_selected]->update(obj); + } + + // check valid machine + if (obj && dev->get_my_machine(obj->dev_id) == nullptr) { + dev->set_selected_machine(""); + if (m_agent) + m_agent->set_user_selected_machine(""); + show_status((int)MONITOR_NO_PRINTER); return; - MachineObject* obj = dev->get_selected_machine(); + } + + if (wxGetApp().is_user_login()) { + dev->check_pushing(); + try { + m_agent->refresh_connection(); + } + catch (...) { + ; + } + } + + if (obj) { + wxGetApp().reset_to_active(); + if (obj->connection_type() != last_conn_type) { + last_conn_type = obj->connection_type(); + } + } + + m_side_tools->update_status(obj); if (!obj) { - m_side_tools->set_none_printer_mode(); + show_status((int)MONITOR_NO_PRINTER); return; } - /* Update Device Info */ - m_side_tools->set_current_printer_name(obj->dev_name); + if (obj->is_connecting()) { + show_status(MONITOR_CONNECTING); + return; + } + else if (!obj->is_connected()) { + int server_status = 0; + // only disconnected server in cloud mode + if (obj->connection_type() != "lan") { + if (m_agent) { + server_status = m_agent->is_server_connected() ? 0 : (int)MONITOR_DISCONNECTED_SERVER; + } + } + show_status((int)MONITOR_DISCONNECTED + server_status); + return; + } - // update wifi signal image - int wifi_signal_val = 0; - if (!obj->is_connected() || obj->is_connecting()) { - m_side_tools->set_current_printer_signal(WifiSignal::NONE); - } - else { - if (!obj->wifi_signal.empty() && boost::ends_with(obj->wifi_signal, "dBm")) { - try { - wifi_signal_val = std::stoi(obj->wifi_signal.substr(0, obj->wifi_signal.size() - 3)); - } - catch (...) { - ; - } - if (wifi_signal_val > -45) { - m_side_tools->set_current_printer_signal(WifiSignal::STRONG); - } - else if (wifi_signal_val <= -45 && wifi_signal_val >= -60) { - m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE); - } - else { - m_side_tools->set_current_printer_signal(WifiSignal::WEAK); + show_status(MONITOR_NORMAL); +} + +void CalibrationPanel::show_status(int status) +{ + if (!m_initialized) return; + if (last_status == status)return; + if (last_status & (int)MonitorStatus::MONITOR_CONNECTING != 0) { + NetworkAgent* agent = wxGetApp().getAgent(); + json j; + j["dev_id"] = obj ? obj->dev_id : "obj_nullptr"; + if (status & (int)MonitorStatus::MONITOR_DISCONNECTED != 0) { + j["result"] = "failed"; + if (agent) { + agent->track_event("connect_dev", j.dump()); } } - else { - m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE); + else if (status & (int)MonitorStatus::MONITOR_NORMAL != 0) { + j["result"] = "success"; + if (agent) { + agent->track_event("connect_dev", j.dump()); + } } } + last_status = status; + + BOOST_LOG_TRIVIAL(info) << "monitor: show_status = " << status; + + + Freeze(); + // update panels + if (m_side_tools) { m_side_tools->show_status(status); }; + + if ((status & (int)MonitorStatus::MONITOR_NO_PRINTER) != 0) { + set_default(); + m_tabpanel->Layout(); + } + else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0) + || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)) + { + + if (((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)) + { + set_default(); + } + m_tabpanel->Layout(); + } + Layout(); + Thaw(); } bool CalibrationPanel::Show(bool show) { @@ -596,8 +668,15 @@ void CalibrationPanel::on_printer_clicked(wxMouseEvent& event) } } +void CalibrationPanel::set_default() +{ + obj = nullptr; + last_conn_type = "undefined"; + wxGetApp().sidebar().load_ams_list({}, {}); +} + CalibrationPanel::~CalibrationPanel() { - m_side_tools->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CalibrationPanel::on_printer_clicked), NULL, this); + m_side_tools->get_panel()->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CalibrationPanel::on_printer_clicked), NULL, this); if (m_refresh_timer) m_refresh_timer->Stop(); delete m_refresh_timer; diff --git a/src/slic3r/GUI/CalibrationPanel.hpp b/src/slic3r/GUI/CalibrationPanel.hpp index 09af9f7501..9f7026c084 100644 --- a/src/slic3r/GUI/CalibrationPanel.hpp +++ b/src/slic3r/GUI/CalibrationPanel.hpp @@ -86,7 +86,7 @@ private: wxBoxSizer* m_sizer_my_devices{ nullptr }; wxScrolledWindow* m_scrolledWindow{ nullptr }; wxTimer* m_refresh_timer{ nullptr }; - std::vector m_user_list_machine_panel; + std::vector m_user_list_machine_panel; boost::thread* get_print_info_thread{ nullptr }; std::string m_print_info; std::map m_bind_machine_list; @@ -107,21 +107,25 @@ public: Tabbook* get_tabpanel() { return m_tabpanel; }; void update_print_error_info(int code, std::string msg, std::string extra); void update_all(); + void show_status(int status); bool Show(bool show); void on_printer_clicked(wxMouseEvent& event); + void set_default(); protected: void init_tabpanel(); void init_timer(); void on_timer(wxTimerEvent& event); -private: - SideTools* m_side_tools{ nullptr }; - Tabbook* m_tabpanel{ nullptr }; - SelectMObjectPopup m_mobjectlist_popup; - CalibrationWizard* m_cali_panels[CALI_MODE_COUNT]; - - wxTimer* m_refresh_timer = nullptr; + int last_status; + bool m_initialized { false }; + std::string last_conn_type = "undedefined"; + MachineObject* obj{ nullptr }; + SideTools* m_side_tools{ nullptr }; + Tabbook* m_tabpanel{ nullptr }; + SelectMObjectPopup m_mobjectlist_popup; + CalibrationWizard* m_cali_panels[CALI_MODE_COUNT]; + wxTimer* m_refresh_timer = nullptr; }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index 4dac663cfd..cf0c480db3 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -2,244 +2,25 @@ #include "I18N.hpp" #include "GUI_App.hpp" #include "MsgDialog.hpp" +#include "CalibrationWizardPage.hpp" #include "../../libslic3r/Calib.hpp" #include "Tabbook.hpp" -#include "MainFrame.hpp" +#include "CaliHistoryDialog.hpp" namespace Slic3r { namespace GUI { #define CALIBRATION_DEBUG -#define PRESET_GAP FromDIP(25) -#define CALIBRATION_COMBOX_SIZE wxSize(FromDIP(500), FromDIP(24)) -#define CALIBRATION_FILAMENT_COMBOX_SIZE wxSize(FromDIP(250), FromDIP(24)) -#define CALIBRATION_OPTIMAL_INPUT_SIZE wxSize(FromDIP(300), FromDIP(24)) -#define CALIBRATION_FROM_TO_INPUT_SIZE wxSize(FromDIP(160), FromDIP(24)) -#define CALIBRATION_FGSIZER_HGAP FromDIP(50) -#define CALIBRATION_TEXT_MAX_LENGTH FromDIP(90) + CALIBRATION_FGSIZER_HGAP + 2 * CALIBRATION_FILAMENT_COMBOX_SIZE.x -#define CALIBRATION_PROGRESSBAR_LENGTH FromDIP(600) +wxDEFINE_EVENT(EVT_DEVICE_CHANGED, wxCommandEvent); +wxDEFINE_EVENT(EVT_CALIBRATION_JOB_FINISHED, wxCommandEvent); + static const wxString NA_STR = _L("N/A"); -wxDEFINE_EVENT(EVT_CALIBRATION_TRAY_SELECTION_CHANGED, SimpleEvent); -wxDEFINE_EVENT(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES, SimpleEvent); -wxDEFINE_EVENT(EVT_CALIBRATION_TAB_CHANGED, wxCommandEvent); - -static bool is_high_end_type(MachineObject* obj) { - if (obj) { - if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002") - return true; - else if (obj->printer_type == "C11" || obj->printer_type == "C12") - return false; - } - - return false; -} - -static bool validate_input_flow_ratio(wxString flow_ratio, float* output_value) { - float default_flow_ratio = 1.0f; - - if (flow_ratio.IsEmpty()) { - *output_value = default_flow_ratio; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - double flow_ratio_value = 0.0; - try { - flow_ratio.ToDouble(&flow_ratio_value); - } - catch (...) { - ; - } - - if (flow_ratio_value <= 0.0 || flow_ratio_value >= 2.0) { - *output_value = default_flow_ratio; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - *output_value = flow_ratio_value; - return true; -} - -static bool validate_input_k_value(wxString k_text, float* output_value) -{ - float default_k = 0.0f; - if (k_text.IsEmpty()) { - *output_value = default_k; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - double k_value = 0.0; - try { - k_text.ToDouble(&k_value); - } - catch (...) { - ; - } - - if (k_value < 0 || k_value > 0.5) { - *output_value = default_k; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - *output_value = k_value; - return true; -}; - -static bool validate_input_n_value(wxString n_text, float* output_value) { - float default_n = 1.0f; - if (n_text.IsEmpty()) { - *output_value = default_n; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (N in 0.6~2.0)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - double n_value = 0.0; - try { - n_text.ToDouble(&n_value); - } - catch (...) { - ; - } - - if (n_value < 0.6 || n_value > 2.0) { - *output_value = default_n; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (N in 0.6~2.0)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - *output_value = n_value; - return true; -} - -wxString get_calibration_wiki_page(CalibMode cali_mode) -{ - switch (cali_mode) { - case CalibMode::Calib_PA_Line: - return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_pa"); - case CalibMode::Calib_Flow_Rate: - return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_flow_rate"); - case CalibMode::Calib_Vol_speed_Tower: - return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_volumetric"); - case CalibMode::Calib_Temp_Tower: - return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_temperature"); - case CalibMode::Calib_Retraction_tower: - return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_retraction"); - default: - return ""; - } -} - -FilamentComboBox::FilamentComboBox(wxWindow* parent, const wxPoint& pos, const wxSize& size) - : wxPanel(parent, wxID_ANY, pos, size, wxTAB_TRAVERSAL) -{ - wxBoxSizer* main_sizer = new wxBoxSizer(wxHORIZONTAL); - - m_comboBox = new CalibrateFilamentComboBox(this); - m_comboBox->SetSize(CALIBRATION_FILAMENT_COMBOX_SIZE); - m_comboBox->SetMinSize(CALIBRATION_FILAMENT_COMBOX_SIZE); - main_sizer->Add(m_comboBox->clr_picker, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8)); - main_sizer->Add(m_comboBox, 0, wxALIGN_CENTER); - - this->SetSizer(main_sizer); - this->Layout(); - main_sizer->Fit(this); -} - -void FilamentComboBox::set_select_mode(FilamentSelectMode mode) -{ - m_mode = mode; - if (m_checkBox) - m_checkBox->Show(m_mode == FSMCheckBoxMode); - if (m_radioBox) - m_radioBox->Show(m_mode == FSMRadioMode); - - Layout(); -} - -void FilamentComboBox::load_tray_from_ams(int id, DynamicPrintConfig& tray) -{ - m_comboBox->load_tray(tray); - - m_tray_id = id; - m_tray_name = m_comboBox->get_tray_name(); - m_is_bbl_filamnet = MachineObject::is_bbl_filament(m_comboBox->get_tag_uid()); - Enable(m_comboBox->is_tray_exist()); - if (m_comboBox->is_tray_exist()) { - if (!m_comboBox->is_compatible_with_printer()) - SetValue(false); - if (m_radioBox) - m_radioBox->Enable(m_comboBox->is_compatible_with_printer()); - if (m_checkBox) - m_checkBox->Enable(m_comboBox->is_compatible_with_printer()); - } -} - -void FilamentComboBox::update_from_preset() { m_comboBox->update(); } - -bool FilamentComboBox::Show(bool show) -{ - bool result = true; - if (m_radioBox && m_mode == FSMRadioMode) - result = result && m_radioBox->Show(show); - if (m_checkBox && m_mode == FSMCheckBoxMode) - result = result && m_checkBox->Show(show); - result = result && wxPanel::Show(show); - return result; -} - -bool FilamentComboBox::Enable(bool enable) { - if (!enable) - SetValue(false); - - bool result = true; - if (m_radioBox) - result = result && m_radioBox->Enable(enable); - if (m_checkBox) - result = result && m_checkBox->Enable(enable); - result = result && wxPanel::Enable(enable); - return result; -} - -void FilamentComboBox::SetValue(bool value, bool send_event) { - if (m_radioBox) { - if (value == m_radioBox->GetValue()) { - if (m_checkBox) { - if (value == m_checkBox->GetValue()) - return; - } - else { - return; - } - } - } - if (m_radioBox) - m_radioBox->SetValue(value); - if (m_checkBox) - m_checkBox->SetValue(value); - if (send_event) { - SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED); - e.ResumePropagation(wxEVENT_PROPAGATE_MAX); - e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); - } -} CalibrationWizard::CalibrationWizard(wxWindow* parent, CalibMode mode, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxPanel(parent, id, pos, size, style) , m_mode(mode) { - m_wiki_url = get_calibration_wiki_page(m_mode); - SetBackgroundColour(wxColour(0xEEEEEE)); wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); @@ -260,1641 +41,126 @@ CalibrationWizard::CalibrationWizard(wxWindow* parent, CalibMode mode, wxWindowI this->Layout(); main_sizer->Fit(this); - init_bitmaps(); - init_printer_calib_info_from_appconfig(); - - Bind(EVT_CALIBRATIONPAGE_PREV, &CalibrationWizard::on_click_btn_prev, this); - Bind(EVT_CALIBRATIONPAGE_NEXT, &CalibrationWizard::on_click_btn_next, this); - Bind(EVT_CALIBRATION_TRAY_SELECTION_CHANGED, &CalibrationWizard::on_select_tray, this); - Bind(EVT_SHOW_ERROR_INFO, [this](auto& e) {show_send_failed_info(true); }); - -#ifdef CALIBRATION_DEBUG - this->Bind(wxEVT_CHAR_HOOK, [this](auto& evt) { - const int keyCode = evt.GetKeyCode(); - switch (keyCode) - { - case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: - show_page(get_curr_page()->get_prev_page()); - break; - case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: - { - show_page(get_curr_page()->get_next_page()); - break; - } - default: - evt.Skip(); - break; - } - }); -#endif + Bind(EVT_CALIBRATION_JOB_FINISHED, &CalibrationWizard::on_cali_job_finished, this); } -CalibrationWizardPage* CalibrationWizard::create_presets_page(bool need_custom_range) { - auto page = new CalibrationWizardPage(m_scrolledWindow); - page->set_page_type(PageType::Preset); - page->set_highlight_step_text(PageType::Preset); - - auto page_content_sizer = page->get_content_vsizer(); - - m_presets_panel = new wxPanel(page); - page_content_sizer->Add(m_presets_panel, 0, wxEXPAND, 0); - auto panel_sizer = new wxBoxSizer(wxVERTICAL); - m_presets_panel->SetSizer(panel_sizer); - - auto nozzle_combo_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Nozzle"), wxDefaultPosition, wxDefaultSize, 0); - nozzle_combo_text->Wrap(-1); - nozzle_combo_text->SetFont(Label::Head_14); - panel_sizer->Add(nozzle_combo_text, 0, wxALL, 0); - m_comboBox_nozzle_dia = new ComboBox(m_presets_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); - panel_sizer->Add(m_comboBox_nozzle_dia, 0, wxALL, 0); - - panel_sizer->AddSpacer(PRESET_GAP); - - auto plate_type_combo_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Plate Type"), wxDefaultPosition, wxDefaultSize, 0); - plate_type_combo_text->Wrap(-1); - plate_type_combo_text->SetFont(Label::Head_14); - panel_sizer->Add(plate_type_combo_text, 0, wxALL, 0); - m_comboBox_bed_type = new ComboBox(m_presets_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); - panel_sizer->Add(m_comboBox_bed_type, 0, wxALL, 0); - - panel_sizer->AddSpacer(PRESET_GAP); - - {// Hide - auto process_combo_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Process"), wxDefaultPosition, wxDefaultSize, 0); - process_combo_text->Hide(); - process_combo_text->Wrap(-1); - panel_sizer->Add(process_combo_text, 0, wxALL, 0); - m_comboBox_process = new ComboBox(m_presets_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); - m_comboBox_process->Hide(); - panel_sizer->Add(m_comboBox_process, 0, wxALL, 0); - }// Hide - - m_select_ams_mode_panel = new wxPanel(m_presets_panel); - auto choose_ams_sizer = new wxBoxSizer(wxVERTICAL); - auto filament_from_text = new wxStaticText(m_select_ams_mode_panel, wxID_ANY, _L("Filament From"), wxDefaultPosition, wxDefaultSize, 0); - filament_from_text->SetFont(Label::Head_14); - choose_ams_sizer->Add(filament_from_text, 0); - auto raioBox_sizer = new wxFlexGridSizer(2, 1, 0, FromDIP(10)); - m_ams_radiobox = new wxRadioButton(m_select_ams_mode_panel, wxID_ANY, _L("AMS")); - m_ams_radiobox->SetValue(true); - raioBox_sizer->Add(m_ams_radiobox, 0); - //auto ams_text = new wxStaticText(m_choose_ams_panel, wxID_ANY, _L("AMS"), wxDefaultPosition, wxDefaultSize, 0); - //raioBox_sizer->Add(ams_text); - m_ext_spool_radiobox = new wxRadioButton(m_select_ams_mode_panel, wxID_ANY, _L("External Spool")); - raioBox_sizer->Add(m_ext_spool_radiobox, 0); - //auto ext_spool_text = new wxStaticText(m_choose_ams_panel, wxID_ANY, _L("External Spool"), wxDefaultPosition, wxDefaultSize, 0); - //raioBox_sizer->Add(ext_spool_text, 0); - choose_ams_sizer->Add(raioBox_sizer, 0); - m_select_ams_mode_panel->SetSizer(choose_ams_sizer); - panel_sizer->Add(m_select_ams_mode_panel, 0); - - panel_sizer->AddSpacer(PRESET_GAP); - - auto filament_for_title_sizer = new wxBoxSizer(wxHORIZONTAL); - auto filament_for_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Filament For Calibration"), wxDefaultPosition, wxDefaultSize, 0); - filament_for_text->SetFont(Label::Head_14); - filament_for_title_sizer->Add(filament_for_text, 0, wxALIGN_CENTER); - filament_for_title_sizer->AddSpacer(FromDIP(25)); - m_ams_sync_button = new ScalableButton(m_presets_panel, wxID_ANY, "ams_fila_sync", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, false, 18); - m_ams_sync_button->SetBackgroundColour(*wxWHITE); - m_ams_sync_button->SetToolTip(_L("Synchronize filament list from AMS")); - filament_for_title_sizer->Add(m_ams_sync_button, 0, wxALIGN_CENTER, 0); - panel_sizer->Add(filament_for_title_sizer); - m_filament_list_panel = new wxPanel(m_presets_panel); - auto filament_list_sizer = new wxBoxSizer(wxVERTICAL); - auto filament_list_tips = new wxStaticText(m_filament_list_panel, wxID_ANY, _L("Please select same type of material, because plate temperature might not be compatible with different type of material"), wxDefaultPosition, wxDefaultSize, 0); - filament_list_tips->Hide(); - filament_list_tips->SetFont(Label::Body_13); - filament_list_tips->SetForegroundColour(wxColour(145, 145, 145)); - filament_list_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - filament_list_sizer->Add(filament_list_tips); - filament_list_sizer->AddSpacer(FromDIP(10)); - m_muilti_ams_panel = new wxPanel(m_filament_list_panel); - auto multi_ams_sizer = new wxBoxSizer(wxVERTICAL); - auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL); - for (int i = 0; i < 4; i++) { - AMSinfo temp_info = AMSinfo{ std::to_string(i), std::vector{} }; - auto amsitem = new AMSItem(m_muilti_ams_panel, wxID_ANY, temp_info); - amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) { - on_switch_ams(amsitem->m_amsinfo.ams_id); - e.Skip(); - }); - m_ams_item_list.push_back(amsitem); - ams_items_sizer->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6)); - } - multi_ams_sizer->Add(ams_items_sizer, 0); - multi_ams_sizer->AddSpacer(FromDIP(10)); - m_muilti_ams_panel->SetSizer(multi_ams_sizer); - filament_list_sizer->Add(m_muilti_ams_panel); - m_muilti_ams_panel->Hide(); - auto filament_fgSizer = new wxFlexGridSizer(2, 2, FromDIP(10), CALIBRATION_FGSIZER_HGAP); - for (int i = 0; i < 16; i++) { - auto filament_comboBox_sizer = new wxBoxSizer(wxHORIZONTAL); - wxRadioButton* radio_btn = new wxRadioButton(m_filament_list_panel, wxID_ANY, ""); - CheckBox* check_box = new CheckBox(m_filament_list_panel); - check_box->SetBackgroundColour(*wxWHITE); - FilamentComboBox* fcb = new FilamentComboBox(m_filament_list_panel); - fcb->SetRadioBox(radio_btn); - fcb->SetCheckBox(check_box); - fcb->set_select_mode(FilamentSelectMode::FSMRadioMode); - filament_comboBox_sizer->Add(radio_btn, 0, wxALIGN_CENTER); - filament_comboBox_sizer->Add(check_box, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8)); - filament_comboBox_sizer->Add(fcb, 0, wxALIGN_CENTER); - filament_fgSizer->Add(filament_comboBox_sizer, 0); - radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent& event) { - SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED); - e.SetEventObject(this); - wxPostEvent(this, e); - event.Skip(); - }); - check_box->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& event) { - SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED); - e.SetEventObject(this); - wxPostEvent(this, e); - event.Skip(); - }); - m_filament_comboBox_list.push_back(fcb); - - if (i >= 4) - fcb->Show(false); - } - filament_list_sizer->Add(filament_fgSizer, 0); - m_filament_list_panel->SetSizer(filament_list_sizer); - panel_sizer->Add(m_filament_list_panel, 0); - - {// Hide - m_virtual_panel = new wxPanel(m_presets_panel); - auto virtual_sizer = new wxBoxSizer(wxHORIZONTAL); - virtual_sizer->AddSpacer(FromDIP(10)); - wxRadioButton* radio_btn = new wxRadioButton(m_virtual_panel, wxID_ANY, ""); - CheckBox* check_box = new CheckBox(m_virtual_panel); - m_virtual_tray_comboBox = new FilamentComboBox(m_virtual_panel); - m_virtual_tray_comboBox->SetRadioBox(radio_btn); - m_virtual_tray_comboBox->SetCheckBox(check_box); - m_virtual_tray_comboBox->set_select_mode(FilamentSelectMode::FSMRadioMode); - radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent& event) { - SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED); - e.SetEventObject(this); - wxPostEvent(this, e); - event.Skip(); - }); - virtual_sizer->Add(radio_btn, 0, wxALIGN_CENTER); - virtual_sizer->Add(check_box, 0, wxALIGN_CENTER); - virtual_sizer->Add(m_virtual_tray_comboBox, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8)); - m_virtual_panel->SetSizer(virtual_sizer); - m_virtual_panel->Hide(); - panel_sizer->Add(m_virtual_panel, 0); - }// Hide - - m_filaments_incompatible_tips = new wxStaticText(m_presets_panel, wxID_ANY, _L("")); - m_filaments_incompatible_tips->SetFont(Label::Body_13); - m_filaments_incompatible_tips->SetForegroundColour(wxColour(230, 92, 92)); - m_filaments_incompatible_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - m_filaments_incompatible_tips->Hide(); - panel_sizer->Add(m_filaments_incompatible_tips, 0, wxEXPAND); - - m_bed_type_incompatible_tips = new wxStaticText(m_presets_panel, wxID_ANY, _L("")); - m_bed_type_incompatible_tips->SetFont(Label::Body_13); - m_bed_type_incompatible_tips->SetForegroundColour(wxColour(230, 92, 92)); - m_bed_type_incompatible_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - m_bed_type_incompatible_tips->Hide(); - panel_sizer->Add(m_bed_type_incompatible_tips, 0, wxEXPAND); - - panel_sizer->AddSpacer(PRESET_GAP); - - if (need_custom_range) { - wxBoxSizer* horiz_sizer; - horiz_sizer = new wxBoxSizer(wxHORIZONTAL); - - wxBoxSizer* from_sizer; - from_sizer = new wxBoxSizer(wxVERTICAL); - m_from_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("From"), wxDefaultPosition, wxDefaultSize, 0); - m_from_text->Wrap(-1); - m_from_text->SetFont(::Label::Body_14); - from_sizer->Add(m_from_text, 0, wxALL, 0); - m_from_value = new TextInput(m_presets_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0); - m_from_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - from_sizer->Add(m_from_value, 0, wxALL, 0); - horiz_sizer->Add(from_sizer, 0, wxEXPAND, 0); - - horiz_sizer->Add(FromDIP(10), 0, 0, wxEXPAND, 0); - - wxBoxSizer* to_sizer; - to_sizer = new wxBoxSizer(wxVERTICAL); - m_to_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("To"), wxDefaultPosition, wxDefaultSize, 0); - m_to_text->Wrap(-1); - m_to_text->SetFont(::Label::Body_14); - to_sizer->Add(m_to_text, 0, wxALL, 0); - m_to_value = new TextInput(m_presets_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0); - m_to_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - to_sizer->Add(m_to_value, 0, wxALL, 0); - horiz_sizer->Add(to_sizer, 0, wxEXPAND, 0); - - horiz_sizer->Add(FromDIP(10), 0, 0, wxEXPAND, 0); - - wxBoxSizer* step_sizer; - step_sizer = new wxBoxSizer(wxVERTICAL); - m_step_text = new wxStaticText(m_presets_panel, wxID_ANY, _L("Step"), wxDefaultPosition, wxDefaultSize, 0); - m_step_text->Wrap(-1); - m_step_text->SetFont(::Label::Body_14); - step_sizer->Add(m_step_text, 0, wxALL, 0); - m_step = new TextInput(m_presets_panel, "5", _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0); - m_step->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - step_sizer->Add(m_step, 0, wxALL, 0); - horiz_sizer->Add(step_sizer, 0, wxEXPAND, 0); - panel_sizer->Add(horiz_sizer, 0, wxEXPAND, 0); - - panel_sizer->AddSpacer(PRESET_GAP); - } - else { - m_from_text = nullptr; - m_to_text = nullptr; - m_from_value = nullptr; - m_to_value = nullptr; - m_step_text = nullptr; - m_step = nullptr; - } - - auto printing_param_panel = new wxPanel(m_presets_panel); - printing_param_panel->SetBackgroundColour(wxColour(238, 238, 238)); - printing_param_panel->SetMinSize(wxSize(CALIBRATION_TEXT_MAX_LENGTH * 1.7f, -1)); - auto printing_param_sizer = new wxBoxSizer(wxVERTICAL); - printing_param_panel->SetSizer(printing_param_sizer); - - printing_param_sizer->AddSpacer(FromDIP(10)); - - auto preset_panel_tips = new wxStaticText(printing_param_panel, wxID_ANY, _L("A test model will be printed. Please clear the build plate and place it back to the hot bed before calibration.")); - preset_panel_tips->SetFont(Label::Body_14); - preset_panel_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH * 1.5f); - printing_param_sizer->Add(preset_panel_tips, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); - - printing_param_sizer->AddSpacer(FromDIP(10)); - - auto info_sizer = new wxFlexGridSizer(0, 3, 0, FromDIP(10)); - info_sizer->SetFlexibleDirection(wxBOTH); - info_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); - - auto nozzle_temp_sizer = new wxBoxSizer(wxVERTICAL); - auto nozzle_temp_text = new wxStaticText(printing_param_panel, wxID_ANY, _L("Nozzle temperature")); - nozzle_temp_text->SetFont(Label::Body_12); - m_nozzle_temp = new TextInput(printing_param_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); - m_nozzle_temp->SetBorderWidth(0); - nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT); - nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND); - nozzle_temp_text->Hide(); - m_nozzle_temp->Hide(); - - auto bed_temp_sizer = new wxBoxSizer(wxHORIZONTAL); - auto printing_param_text = new wxStaticText(printing_param_panel, wxID_ANY, _L("Printing Parameters")); - printing_param_text->SetFont(Label::Head_12); - printing_param_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - bed_temp_sizer->Add(printing_param_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20)); - auto bed_temp_text = new wxStaticText(printing_param_panel, wxID_ANY, _L("Bed temperature")); - bed_temp_text->SetFont(Label::Body_12); - m_bed_temp = new TextInput(printing_param_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); - m_bed_temp->SetBorderWidth(0); - bed_temp_sizer->Add(bed_temp_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10)); - bed_temp_sizer->Add(m_bed_temp, 0, wxALIGN_CENTER); - - auto max_flow_sizer = new wxBoxSizer(wxVERTICAL); - auto max_flow_text = new wxStaticText(printing_param_panel, wxID_ANY, _L("Max volumetric speed")); - max_flow_text->SetFont(Label::Body_12); - m_max_volumetric_speed = new TextInput(printing_param_panel, wxEmptyString, _L("mm\u00B3"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); - m_max_volumetric_speed->SetBorderWidth(0); - max_flow_sizer->Add(max_flow_text, 0, wxALIGN_LEFT); - max_flow_sizer->Add(m_max_volumetric_speed, 0, wxEXPAND); - max_flow_text->Hide(); - m_max_volumetric_speed->Hide(); - - m_nozzle_temp->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {}); - m_bed_temp->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {}); - m_max_volumetric_speed->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {}); - - info_sizer->Add(nozzle_temp_sizer); - info_sizer->Add(bed_temp_sizer); - info_sizer->Add(max_flow_sizer); - printing_param_sizer->Add(info_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); - - printing_param_sizer->AddSpacer(FromDIP(10)); - - panel_sizer->Add(printing_param_panel, 0); - - init_presets_selections(); - - - auto page_btn_sizer = page->get_btn_hsizer(); - - auto page_prev_btn = page->get_prev_btn(); - page_prev_btn->SetLabel(_L("Restart")); - page_prev_btn->SetButtonType(ButtonType::Restart); - - auto page_next_btn = page->get_next_btn(); - page_next_btn->SetLabel(_L("Calibrate")); - page_next_btn->SetButtonType(ButtonType::Calibrate); - - // send bar - m_send_progress_panel = new wxPanel(page); - m_send_progress_panel->Hide(); - auto send_panel_sizer = new wxBoxSizer(wxVERTICAL); - m_send_progress_panel->SetSizer(send_panel_sizer); - - m_send_progress_bar = std::shared_ptr(new BBLStatusBarSend(m_send_progress_panel)); - m_send_progress_bar->set_cancel_callback_fina([this]() { - BOOST_LOG_TRIVIAL(info) << "CalibrationWizard::print_job: enter canceled"; - if (CalibUtils::print_job) { - if (CalibUtils::print_job->is_running()) { - BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled"; - CalibUtils::print_job->cancel(); - } - CalibUtils::print_job->join(); - } - show_send_progress_bar(false); - }); - send_panel_sizer->Add(m_send_progress_bar->get_panel(), 0); - page_btn_sizer->Insert(1, m_send_progress_panel, 0, wxALIGN_CENTER, 0); - - // show bind failed info - m_sw_print_failed_info = new wxScrolledWindow(m_send_progress_panel, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(380), FromDIP(125)), wxVSCROLL); - m_sw_print_failed_info->SetBackgroundColour(*wxWHITE); - m_sw_print_failed_info->SetScrollRate(0, 5); - m_sw_print_failed_info->SetMinSize(wxSize(FromDIP(380), FromDIP(125))); - m_sw_print_failed_info->SetMaxSize(wxSize(FromDIP(380), FromDIP(125))); - m_sw_print_failed_info->Hide(); - send_panel_sizer->Add(m_sw_print_failed_info, 0); - - wxBoxSizer* sizer_print_failed_info = new wxBoxSizer(wxVERTICAL); - m_sw_print_failed_info->SetSizer(sizer_print_failed_info); - - wxBoxSizer* sizer_error_code = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer* sizer_extra_info = new wxBoxSizer(wxHORIZONTAL); - - auto st_title_error_code = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Error code")); - auto st_title_error_code_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": "); - m_st_txt_error_code = new Label(m_sw_print_failed_info, wxEmptyString); - st_title_error_code->SetForegroundColour(0x909090); - st_title_error_code_doc->SetForegroundColour(0x909090); - m_st_txt_error_code->SetForegroundColour(0x909090); - st_title_error_code->SetFont(::Label::Body_13); - st_title_error_code_doc->SetFont(::Label::Body_13); - m_st_txt_error_code->SetFont(::Label::Body_13); - st_title_error_code->SetMinSize(wxSize(FromDIP(74), -1)); - st_title_error_code->SetMaxSize(wxSize(FromDIP(74), -1)); - m_st_txt_error_code->SetMinSize(wxSize(FromDIP(260), -1)); - m_st_txt_error_code->SetMaxSize(wxSize(FromDIP(260), -1)); - sizer_error_code->Add(st_title_error_code, 0, wxALL, 0); - sizer_error_code->Add(st_title_error_code_doc, 0, wxALL, 0); - sizer_error_code->Add(m_st_txt_error_code, 0, wxALL, 0); - - auto st_title_error_desc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Error desc")); - auto st_title_error_desc_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": "); - m_st_txt_error_desc = new Label(m_sw_print_failed_info, wxEmptyString); - st_title_error_desc->SetForegroundColour(0x909090); - st_title_error_desc_doc->SetForegroundColour(0x909090); - m_st_txt_error_desc->SetForegroundColour(0x909090); - st_title_error_desc->SetFont(::Label::Body_13); - st_title_error_desc_doc->SetFont(::Label::Body_13); - m_st_txt_error_desc->SetFont(::Label::Body_13); - st_title_error_desc->SetMinSize(wxSize(FromDIP(74), -1)); - st_title_error_desc->SetMaxSize(wxSize(FromDIP(74), -1)); - m_st_txt_error_desc->SetMinSize(wxSize(FromDIP(260), -1)); - m_st_txt_error_desc->SetMaxSize(wxSize(FromDIP(260), -1)); - sizer_error_desc->Add(st_title_error_desc, 0, wxALL, 0); - sizer_error_desc->Add(st_title_error_desc_doc, 0, wxALL, 0); - sizer_error_desc->Add(m_st_txt_error_desc, 0, wxALL, 0); - - auto st_title_extra_info = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Extra info")); - auto st_title_extra_info_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": "); - m_st_txt_extra_info = new Label(m_sw_print_failed_info, wxEmptyString); - st_title_extra_info->SetForegroundColour(0x909090); - st_title_extra_info_doc->SetForegroundColour(0x909090); - m_st_txt_extra_info->SetForegroundColour(0x909090); - st_title_extra_info->SetFont(::Label::Body_13); - st_title_extra_info_doc->SetFont(::Label::Body_13); - m_st_txt_extra_info->SetFont(::Label::Body_13); - st_title_extra_info->SetMinSize(wxSize(FromDIP(74), -1)); - st_title_extra_info->SetMaxSize(wxSize(FromDIP(74), -1)); - m_st_txt_extra_info->SetMinSize(wxSize(FromDIP(260), -1)); - m_st_txt_extra_info->SetMaxSize(wxSize(FromDIP(260), -1)); - sizer_extra_info->Add(st_title_extra_info, 0, wxALL, 0); - sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0); - sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0); - - sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5); - sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); - sizer_print_failed_info->Add(sizer_error_desc, 0, wxLEFT, 5); - sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); - sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5); - // send bar - - m_presets_panel->Layout(); - panel_sizer->Fit(m_presets_panel); - - m_comboBox_nozzle_dia->Bind(wxEVT_COMBOBOX, &CalibrationWizard::on_select_nozzle, this); - Bind(EVT_CALIBRATION_TAB_CHANGED, &CalibrationWizard::on_select_nozzle, this); - m_comboBox_bed_type->Bind(wxEVT_COMBOBOX, &CalibrationWizard::on_select_bed_type, this); - m_ams_sync_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { - on_update_ams_filament(); - }); - m_ams_radiobox->Bind(wxEVT_RADIOBUTTON, &CalibrationWizard::on_choose_ams, this); - m_ext_spool_radiobox->Bind(wxEVT_RADIOBUTTON, &CalibrationWizard::on_choose_ext_spool, this); - - return page; -} - -CalibrationWizardPage* CalibrationWizard::create_print_page() { - auto page = new CalibrationWizardPage(m_scrolledWindow); - page->set_page_type(PageType::Calibration); - page->set_highlight_step_text(PageType::Calibration); - auto sizer = page->get_content_vsizer(); - - m_print_picture = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - sizer->Add(m_print_picture, 0, wxALIGN_CENTER, 0); - sizer->AddSpacer(FromDIP(20)); - - m_print_panel = new wxPanel(page); - m_print_panel->SetSize({ CALIBRATION_PROGRESSBAR_LENGTH, -1 }); - m_print_panel->SetMinSize({ CALIBRATION_PROGRESSBAR_LENGTH, -1 }); - - page->get_prev_btn()->Hide(); - - m_btn_next = page->get_next_btn(); - m_btn_next->SetLabel(_L("Next")); - m_btn_next->SetButtonType(ButtonType::Next); - - m_btn_recali = page->get_prev_btn(); - m_btn_recali->SetLabel(_L("Re-Calibrate")); - m_btn_recali->SetButtonType(ButtonType::Recalibrate); - - sizer->Add(m_print_panel, 0, wxALIGN_CENTER, 0); - auto panel_sizer = new wxBoxSizer(wxVERTICAL); - - - m_staticText_profile_value = new wxStaticText(m_print_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); - m_staticText_profile_value->Wrap(-1); - m_staticText_profile_value->SetFont(Label::Body_14); - m_staticText_profile_value->SetForegroundColour(0x6B6B6B); - - - m_printing_stage_value = new wxStaticText(m_print_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); - m_printing_stage_value->SetFont(Label::Body_14); - m_printing_stage_value->Wrap(-1); - m_printing_stage_value->SetForegroundColour(wxColour(0, 174, 66)); - - - wxPanel* panel_text = new wxPanel(m_print_panel); - panel_text->SetBackgroundColour(*wxWHITE); - - wxBoxSizer* text_sizer = new wxBoxSizer(wxHORIZONTAL); - - m_staticText_progress_percent = new wxStaticText(panel_text, wxID_ANY, "0%", wxDefaultPosition, wxDefaultSize, 0); - m_staticText_progress_percent->SetFont(::Label::Head_18); - m_staticText_progress_percent->SetForegroundColour(wxColour(0, 174, 66)); - - m_staticText_layers = new wxStaticText(panel_text, wxID_ANY, _L("Layer: N/A")); - m_staticText_layers->SetFont(::Label::Body_15); - m_staticText_layers->SetForegroundColour(wxColour(146, 146, 146)); - - m_staticText_progress_left_time = new wxStaticText(panel_text, wxID_ANY, NA_STR, wxDefaultPosition, wxDefaultSize, 0); - m_staticText_progress_left_time->Wrap(-1); - m_staticText_progress_left_time->SetFont(::Label::Body_15); - m_staticText_progress_left_time->SetForegroundColour(wxColour(146, 146, 146)); - - text_sizer->Add(m_staticText_progress_percent, 0, wxALIGN_CENTER, 0); - text_sizer->Add(0, 0, 1, wxEXPAND, 0); - text_sizer->Add(m_staticText_layers, 0, wxALIGN_CENTER | wxALL, 0); - text_sizer->Add(0, 0, 0, wxLEFT, FromDIP(20)); - text_sizer->Add(m_staticText_progress_left_time, 0, wxALIGN_CENTER | wxALL, 0); - text_sizer->AddSpacer(FromDIP(90)); - - panel_text->SetSizer(text_sizer); - - - auto panel_progressbar = new wxPanel(m_print_panel, wxID_ANY); - panel_progressbar->SetBackgroundColour(*wxWHITE); - auto progressbar_sizer = new wxBoxSizer(wxHORIZONTAL); - - m_print_gauge_progress = new ProgressBar(panel_progressbar, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize); - m_print_gauge_progress->SetValue(0); - m_print_gauge_progress->SetHeight(FromDIP(8)); - m_print_gauge_progress->SetSize(wxSize(FromDIP(400), -1)); - m_print_gauge_progress->SetMinSize(wxSize(FromDIP(400), -1)); - - m_button_pause_resume = new ScalableButton(panel_progressbar, wxID_ANY, "print_control_pause", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); - - m_button_abort = new ScalableButton(panel_progressbar, wxID_ANY, "print_control_stop", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); - m_button_abort->SetToolTip(_L("Stop")); - - progressbar_sizer->Add(m_print_gauge_progress, 1, wxALIGN_CENTER_VERTICAL, 0); - progressbar_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18)); - progressbar_sizer->Add(m_button_pause_resume, 0, wxALL, FromDIP(5)); - progressbar_sizer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(18)); - progressbar_sizer->Add(m_button_abort, 0, wxALL, FromDIP(5)); - - panel_progressbar->SetSizer(progressbar_sizer); - - panel_sizer->AddSpacer(FromDIP(15)); - panel_sizer->Add(m_staticText_profile_value, 0, wxEXPAND | wxTOP, FromDIP(5)); - panel_sizer->Add(m_printing_stage_value, 0, wxEXPAND | wxTOP, FromDIP(5)); - panel_sizer->Add(panel_text, 0, wxEXPAND, 0); - panel_sizer->Add(panel_progressbar, 0, wxEXPAND, 0); - panel_sizer->AddSpacer(FromDIP(15)); - - m_print_panel->SetSizer(panel_sizer); - - m_print_panel->SetSizer(panel_sizer); - m_print_panel->Layout(); - panel_sizer->Fit(m_print_panel); - - - m_button_pause_resume->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { - if (m_button_pause_resume->GetToolTipText() == _L("Pause")) { - m_button_pause_resume->SetBitmap(m_bitmap_pause_hover.bmp()); - } - - if (m_button_pause_resume->GetToolTipText() == _L("Resume")) { - m_button_pause_resume->SetBitmap(m_bitmap_resume_hover.bmp()); - } - }); - m_button_pause_resume->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { - if (m_button_pause_resume->GetToolTipText() == _L("Pause")) { - m_button_pause_resume->SetBitmap(m_bitmap_pause.bmp()); - } - - if (m_button_pause_resume->GetToolTipText() == _L("Resume")) { - m_button_pause_resume->SetBitmap(m_bitmap_resume.bmp()); - } - }); - m_button_pause_resume->Bind(wxEVT_BUTTON, &CalibrationWizard::on_subtask_pause_resume, this); - m_button_abort->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { - m_button_abort->SetBitmap(m_bitmap_abort_hover.bmp()); - }); - m_button_abort->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { - m_button_abort->SetBitmap(m_bitmap_abort.bmp()); } - ); - m_button_abort->Bind(wxEVT_BUTTON, &CalibrationWizard::on_subtask_abort, this); - - return page; -} - -CalibrationWizardPage* CalibrationWizard::create_save_page() { - auto page = new CalibrationWizardPage(m_scrolledWindow); - page->set_page_type(PageType::Save); - page->set_highlight_step_text(PageType::Save); - auto sizer = page->get_content_vsizer(); - - m_save_panel = new wxPanel(page); - sizer->Add(m_save_panel, 0, wxALIGN_CENTER, 0); - auto panel_sizer = new wxBoxSizer(wxVERTICAL); - m_save_panel->SetSizer(panel_sizer); - - create_save_panel_content(panel_sizer); - - auto page_prev_btn = page->get_prev_btn(); - page_prev_btn->SetLabel(_L("Restart")); - page_prev_btn->SetButtonType(ButtonType::Restart); - - auto page_next_btn = page->get_next_btn(); - page_next_btn->SetLabel(_L("Save")); - page_next_btn->SetButtonType(ButtonType::Save); - - return page; -} - -void CalibrationWizard::update_print_error_info(int code, std::string msg, std::string extra) +CalibrationWizard::~CalibrationWizard() { - m_print_error_code = code; - m_print_error_msg = msg; - m_print_error_extra = extra; + ; } -void CalibrationWizard::show_send_failed_info(bool show, int code, wxString description, wxString extra) { - if (show) { - if (!m_sw_print_failed_info->IsShown()) { - m_sw_print_failed_info->Show(true); - - m_st_txt_error_code->SetLabelText(wxString::Format("%d", m_print_error_code)); - m_st_txt_error_desc->SetLabelText(wxGetApp().filter_string(m_print_error_msg)); - m_st_txt_extra_info->SetLabelText(wxGetApp().filter_string(m_print_error_extra)); - - m_st_txt_error_code->Wrap(FromDIP(260)); - m_st_txt_error_desc->Wrap(FromDIP(260)); - m_st_txt_extra_info->Wrap(FromDIP(260)); - } - else { - m_sw_print_failed_info->Show(false); - } - Layout(); - Fit(); - } - else { - if (!m_sw_print_failed_info->IsShown()) { return; } - m_sw_print_failed_info->Show(false); - m_st_txt_error_code->SetLabelText(wxEmptyString); - m_st_txt_error_desc->SetLabelText(wxEmptyString); - m_st_txt_extra_info->SetLabelText(wxEmptyString); - Layout(); - Fit(); - } -} - - -void CalibrationWizard::show_send_progress_bar(bool show) +void CalibrationWizard::on_cali_job_finished(wxCommandEvent& event) { - m_send_progress_panel->Show(show); - - get_curr_page()->get_prev_btn()->Show(!show); - get_curr_page()->get_next_btn()->Show(!show); - - Layout(); + this->on_cali_job_finished(); + event.Skip(); } -void CalibrationWizard::on_choose_ams(wxCommandEvent& event) { - m_filament_list_panel->Show(); - m_virtual_panel->Hide(); - m_filament_from_ext_spool = false; - m_virtual_tray_comboBox->SetValue(false); - - Layout(); - Refresh(); -} - -void CalibrationWizard::on_choose_ext_spool(wxCommandEvent& event) { - m_virtual_panel->Show(); - m_filament_list_panel->Hide(); - m_filament_from_ext_spool = true; - for (int i = 0; i < m_filament_comboBox_list.size(); i++) { - m_filament_comboBox_list[i]->SetValue(false); - } - - Layout(); - Refresh(); -} - -void CalibrationWizard::show_page(CalibrationWizardPage* page) { - if (!page) +void CalibrationWizard::show_step(CalibrationWizardPageStep* step) +{ + if (!step) return; - auto page_node = m_first_page; - while (page_node) - { - page_node->Hide(); - page_node = page_node->get_next_page(); - } - m_curr_page = page; - m_curr_page->Show(); - - Layout(); -} - -void CalibrationWizard::reset_preset_page() { - m_filament_presets.clear(); - init_presets_selections(); - change_ams_select_mode(); - on_update_ams_filament(false); - on_switch_ams(m_ams_item_list[0]->m_amsinfo.ams_id); - for (auto fcb : m_filament_comboBox_list) - fcb->SetValue(false); - m_virtual_tray_comboBox->SetValue(false); -} - -void CalibrationWizard::on_click_btn_prev(IntEvent& event) -{ - bool recalibration = false; - ButtonType button_type = static_cast(event.get_data()); - switch (button_type) - { - case Slic3r::GUI::Back: - show_page(get_curr_page()->get_prev_page()); - break; - case Slic3r::GUI::Recalibrate: { - if (!curr_obj || - curr_obj->is_system_printing() || - curr_obj->is_in_printing()) { - MessageDialog msg_dlg(nullptr, _L("Is in printing. Please wait for printing to complete"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return; - } - MessageDialog msg_dlg(nullptr, _L("It will restart to get the results. Do you confirm to re-calibrate?"), wxEmptyString, wxICON_WARNING | wxYES | wxNO); - auto answer = msg_dlg.ShowModal(); - if (answer == wxID_NO) - return; - recalibration = true; - } - case Slic3r::GUI::Restart: - if (!recalibration) { - MessageDialog msg_dlg(nullptr, _L("It will restart to get the results. Do you confirm to restart?"), wxEmptyString, wxICON_WARNING | wxYES | wxNO); - auto answer = msg_dlg.ShowModal(); - if (answer == wxID_NO) - return; - } - - reset_preset_page(); - if (m_mode == CalibMode::Calib_Flow_Rate) { - auto flow_rate_wizard = static_cast(this); - flow_rate_wizard->reset_reuse_panels(); - } - show_page(get_frist_page()); - save_to_printer_calib_info(PageType::Start); - break; - } -} - -void CalibrationWizard::on_click_btn_next(IntEvent& event) -{ - ButtonType button_type = static_cast(event.get_data()); - switch (button_type) - { - case Slic3r::GUI::Start: - show_page(get_curr_page()->get_next_page()); - break; - case Slic3r::GUI::Next: - set_save_name(); - show_page(get_curr_page()->get_next_page()); - save_to_printer_calib_info(m_curr_page->get_page_type()); - break; - case Slic3r::GUI::Calibrate: { - if(!curr_obj){ - MessageDialog msg_dlg(nullptr, _L("No Printer Connected!"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return; - } - - if (curr_obj->is_connecting() || !curr_obj->is_connected()) { - MessageDialog msg_dlg(nullptr, _L("Printer is not connected yet."), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return; - } - - if (!m_printer_preset || m_filament_presets.empty() || !m_print_preset) { - wxString tips; - if (!m_printer_preset) { - tips = _L("Please select a printer and nozzle for calibration."); - } - else if (!m_print_preset) { - tips = _L("No print preset"); - } - else { - tips = _L("Please select filament for calibration."); - } - MessageDialog msg_dlg(nullptr, tips, wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return; - } - - if (curr_obj->is_system_printing() || - curr_obj->is_in_printing()) { - MessageDialog msg_dlg(nullptr, _L("Is in printing. Please wait for printing to complete"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return; - } - - std::string nozzle_temp_str = m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString(); - std::string bed_temp_str = m_bed_temp->GetTextCtrl()->GetValue().ToStdString(); - std::string max_volumetric_speed_str = m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString(); - if (nozzle_temp_str.empty() || bed_temp_str.empty() || max_volumetric_speed_str.empty()) { - MessageDialog msg_dlg(nullptr, _L("The printing parameters is empty, please reselect nozzle and plate type."), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return; - } - - std::vector tray_ids = get_selected_tray(); - if (start_calibration(tray_ids)) { - is_between_start_and_runing = true; - if (m_mode != CalibMode::Calib_Flow_Rate) { - save_to_printer_calib_info(PageType::Calibration); - } - } - break; - } - case Slic3r::GUI::Save: - if (!curr_obj || - curr_obj->is_system_printing() || - curr_obj->is_in_printing()) { - MessageDialog msg_dlg(nullptr, _L("Is in printing. Please wait for printing to complete"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return; - } - if (save_calibration_result()) { - MessageDialog msg_dlg(nullptr, _L("Saved success."), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - save_to_printer_calib_info(PageType::Finish); - } - break; - default: - break; - } -} - -void CalibrationWizard::init_printer_calib_info_from_appconfig() { - std::vector infos = wxGetApp().app_config->get_printer_cali_infos(); - for (int i = 0; i < infos.size(); i++) { - if (m_printer_calib_infos.find(infos[i].dev_id) == m_printer_calib_infos.end()) { - m_printer_calib_infos[infos[i].dev_id].dev_id = infos[i].dev_id; - m_printer_calib_infos[infos[i].dev_id].filament_presets = infos[i].filament_presets; - m_printer_calib_infos[infos[i].dev_id].mode = infos[i].mode; - m_printer_calib_infos[infos[i].dev_id].state = infos[i].state; - //m_printer_calib_infos[infos[i].dev_id].nozzle_dia = infos[i].nozzle_dia; - //m_printer_calib_infos[infos[i].dev_id].bed_type = infos[i].bed_type; - } - } -} - -void CalibrationWizard::save_to_printer_calib_info(PageType page_type) { - if (curr_obj) { - m_printer_calib_infos[curr_obj->dev_id].dev_id = curr_obj->dev_id; - m_printer_calib_infos[curr_obj->dev_id].mode = m_mode; - m_printer_calib_infos[curr_obj->dev_id].state = static_cast(page_type); - for (auto filament_preset : m_filament_presets) { - m_printer_calib_infos[curr_obj->dev_id].filament_presets[filament_preset.first] = filament_preset.second->name; - } - //m_printer_calib_infos[curr_obj->dev_id].nozzle_dia = stof(m_comboBox_nozzle_dia->GetValue().ToStdString()); - //m_printer_calib_infos[curr_obj->dev_id].bed_type = (int)(m_comboBox_bed_type->GetSelection() + btDefault + 1); - wxGetApp().app_config->save_printer_cali_infos(m_printer_calib_infos[curr_obj->dev_id]); - } -} - -void CalibrationWizard::update_print_progress() -{ - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev || !curr_obj) { - reset_printing_values(); - return; + if (m_curr_step) { + m_curr_step->page->Hide(); } - // check valid machine - if (dev->get_my_machine(curr_obj->dev_id) == nullptr) { - reset_printing_values(); - return; - } + m_curr_step = step; - if (curr_obj->is_connecting()) { - reset_printing_values(); - return; - } - else if (!curr_obj->is_connected()) { - reset_printing_values(); - return; - } - - m_print_panel->Freeze(); - - if (curr_obj->is_support_layer_num) { - m_staticText_layers->Show(); - } - else { - m_staticText_layers->Hide(); - } - - if (curr_obj->print_status == "RUNNING") { - is_between_start_and_runing = false; - m_btn_recali->Hide(); - m_print_panel->GetParent()->Layout(); - } - - if (curr_obj->is_system_printing()) { - reset_printing_values(); - } - else if (curr_obj->is_in_printing() || curr_obj->print_status == "FINISH" || curr_obj->print_status == "IDLE") { - if (curr_obj->is_in_prepare() || curr_obj->print_status == "SLICING") { - reset_printing_values(); - - wxString prepare_text; - if (curr_obj->is_in_prepare()) - prepare_text = wxString::Format(_L("Downloading...")); - else if (curr_obj->print_status == "SLICING") { - if (curr_obj->queue_number <= 0) { - prepare_text = wxString::Format(_L("Cloud Slicing...")); - } - else { - prepare_text = wxString::Format(_L("In Cloud Slicing Queue, there are %s tasks ahead."), std::to_string(curr_obj->queue_number)); - } - } - else - prepare_text = wxString::Format(_L("Downloading...")); - - if (curr_obj->gcode_file_prepare_percent >= 0 && curr_obj->gcode_file_prepare_percent <= 100) - prepare_text += wxString::Format("(%d%%)", curr_obj->gcode_file_prepare_percent); - m_printing_stage_value->SetLabelText(prepare_text); - wxString subtask_text = wxString::Format("%s", GUI::from_u8(curr_obj->subtask_name)); - if (curr_obj->get_modeltask() && curr_obj->get_modeltask()->design_id > 0) { - if (!m_staticText_profile_value->IsShown()) { m_staticText_profile_value->Show(); } - m_staticText_profile_value->SetLabelText(wxString::FromUTF8(curr_obj->get_modeltask()->profile_name)); - } - else { - m_staticText_profile_value->SetLabelText(wxEmptyString); - m_staticText_profile_value->Hide(); - } - } - else { - if (curr_obj->can_resume()) { - m_button_pause_resume->SetBitmap(m_bitmap_resume.bmp()); - if (m_button_pause_resume->GetToolTipText() != _L("Resume")) { m_button_pause_resume->SetToolTip(_L("Resume")); } - } - else { - m_button_pause_resume->SetBitmap(m_bitmap_pause.bmp()); - if (m_button_pause_resume->GetToolTipText() != _L("Pause")) { m_button_pause_resume->SetToolTip(_L("Pause")); } - } - - if ((curr_obj->print_status == "FINISH" || curr_obj->print_status == "IDLE")) { - if (is_between_start_and_runing) { - // just entering, fake status - reset_printing_values(); - m_print_panel->Thaw(); - return; - } - else { - // true status - m_btn_recali->Show(); - if (curr_obj->print_status == "IDLE") - reset_printing_values(); - - if (m_curr_page->get_page_type() == PageType::Calibration || m_curr_page->get_page_type() == PageType::Save) - { - request_calib_result(); - } - if (curr_obj->print_status == "FINISH" || curr_obj->print_status == "IDLE") - { - m_button_abort->Enable(false); - m_button_abort->SetBitmap(m_bitmap_abort_disable.bmp()); - m_button_pause_resume->Enable(false); - m_button_pause_resume->SetBitmap(m_bitmap_resume_disable.bmp()); - m_btn_next->Enable(true); - } - m_print_panel->GetParent()->Layout(); - } - } - else { - m_button_abort->Enable(true); - m_button_abort->SetBitmap(m_bitmap_abort.bmp()); - m_button_pause_resume->Enable(true); - m_btn_next->Enable(false); - } - - // update printing stage - m_printing_stage_value->SetLabelText(curr_obj->get_curr_stage()); - // update left time - std::string left_time; - try { - left_time = get_bbl_monitor_time_dhm(curr_obj->mc_left_time); - } - catch (...) { - ; - } - wxString left_time_text = left_time.empty() ? NA_STR : wxString::Format("-%s", left_time); - m_staticText_progress_left_time->SetLabelText(left_time_text); - - if (curr_obj->subtask_) { - m_print_gauge_progress->SetValue(curr_obj->subtask_->task_progress); - m_staticText_progress_percent->SetLabelText(wxString::Format("%d%%", curr_obj->subtask_->task_progress)); - m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %d/%d"), curr_obj->curr_layer, curr_obj->total_layers)); - - } - else { - m_print_gauge_progress->SetValue(0); - m_staticText_progress_percent->SetLabelText(NA_STR); - m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR)); - } - } - - wxString subtask_text = wxString::Format("%s", GUI::from_u8(curr_obj->subtask_name)); - - if (curr_obj->get_modeltask() && curr_obj->get_modeltask()->design_id > 0) { - if (!m_staticText_profile_value->IsShown()) { m_staticText_profile_value->Show(); } - m_staticText_profile_value->SetLabelText(wxString::FromUTF8(curr_obj->get_modeltask()->profile_name)); - } - else { - m_staticText_profile_value->SetLabelText(wxEmptyString); - m_staticText_profile_value->Hide(); - } - } - else { - reset_printing_values(); - if (curr_obj->print_status == "FAILED" && !is_between_start_and_runing) { - m_btn_recali->Show(); - m_printing_stage_value->SetLabelText(_L("FAILED")); - } - } - - if (is_between_start_and_runing) { - m_btn_recali->Hide(); - m_print_panel->GetParent()->Layout(); - } - - check_sync_printer_status(); - - m_print_panel->Layout(); - - m_print_panel->Thaw(); -} - -void CalibrationWizard::reset_printing_values() -{ - m_button_pause_resume->Enable(false); - m_button_pause_resume->SetBitmap(m_bitmap_pause_disable.bmp()); - - m_button_abort->Enable(false); - m_button_abort->SetBitmap(m_bitmap_abort_disable.bmp()); - - m_btn_next->Enable(false); - - m_staticText_profile_value->SetLabelText(wxEmptyString); - m_staticText_profile_value->Hide(); - m_printing_stage_value->SetLabelText(""); - m_print_gauge_progress->SetValue(0); - m_staticText_progress_left_time->SetLabelText(NA_STR); - m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR)); - m_staticText_progress_percent->SetLabelText(NA_STR); - m_print_panel->Layout(); -} - -void CalibrationWizard::on_subtask_pause_resume(wxCommandEvent& event) -{ - if (curr_obj) { - if (curr_obj->can_resume()) - curr_obj->command_task_resume(); - else - curr_obj->command_task_pause(); - } -} - -void CalibrationWizard::on_subtask_abort(wxCommandEvent& event) -{ - MessageDialog msg_dlg(nullptr, _L("Are you sure you want to cancel this calibration? It will return to start page"), wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL); - if (msg_dlg.ShowModal() == wxID_OK) { - if (curr_obj) curr_obj->command_task_abort(); - m_btn_recali->Show(); - if (m_mode == CalibMode::Calib_Flow_Rate) { - auto flow_rate_wizard = static_cast(this); - flow_rate_wizard->reset_reuse_panels(); - } - show_page(get_frist_page()); - save_to_printer_calib_info(PageType::Start); - } - //if (abort_dlg == nullptr) { - // abort_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Cancel print")); - // abort_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent& e) { - // if (obj) obj->command_task_abort(); - // }); - //} - //abort_dlg->update_text(_L("Are you sure you want to cancel this print?")); - //abort_dlg->on_show(); -} - -void CalibrationWizard::set_ams_select_mode(FilamentSelectMode mode) { - for (int i = 0; i < m_filament_comboBox_list.size(); i++) { - m_filament_comboBox_list[i]->set_select_mode(mode); - if (i >= 4) - m_filament_comboBox_list[i]->GetCheckBox()->Show(false); - } -} - -std::vector CalibrationWizard::get_selected_tray() -{ - std::vector tray_ids; - - if (m_filament_from_ext_spool) { - if(m_virtual_tray_comboBox->GetRadioBox()->GetValue()) - tray_ids.push_back(m_virtual_tray_comboBox->get_tray_id()); - } - else { - if (get_ams_select_mode() == FilamentSelectMode::FSMCheckBoxMode) { - for (auto& fcb : m_filament_comboBox_list) { - if (fcb->GetCheckBox()->GetValue()) { - tray_ids.push_back(fcb->get_tray_id()); - } - } - } - else if (get_ams_select_mode() == FilamentSelectMode::FSMRadioMode) { - for (auto& fcb : m_filament_comboBox_list) { - if (fcb->GetRadioBox()->GetValue()) { - tray_ids.push_back(fcb->get_tray_id()); - } - } - } - } - return tray_ids; -} - -void CalibrationWizard::set_selected_tray(const std::vector& tray_ids) -{ - if (tray_ids.empty()) - return; - - if (tray_ids[0] == VIRTUAL_TRAY_ID) { - assert(tray_ids.size() == 1); - m_filament_from_ext_spool = true; - m_virtual_tray_comboBox->SetValue(true, false); - } - else { - m_filament_from_ext_spool = false; - for (int tray_id : tray_ids) { - if (get_ams_select_mode() == FilamentSelectMode::FSMCheckBoxMode) { - for (auto& fcb : m_filament_comboBox_list) { - if (fcb->get_tray_id() == tray_id) { - fcb->SetValue(true, false); - } - } - } - else if (get_ams_select_mode() == FilamentSelectMode::FSMRadioMode) { - for (auto& fcb : m_filament_comboBox_list) { - if (fcb->get_tray_id() == tray_id) { - fcb->SetValue(true, false); - } - } - } - } - } - recommend_input_value(); -} - -FilamentComboBoxList CalibrationWizard::get_selected_filament_comboBox() -{ - FilamentComboBoxList fcb_list; - - if (m_filament_from_ext_spool) { - if (m_virtual_tray_comboBox->GetRadioBox()->GetValue()) - fcb_list.push_back(m_virtual_tray_comboBox); - } - else { - if (get_ams_select_mode() == FilamentSelectMode::FSMCheckBoxMode) { - for (auto& fcb : m_filament_comboBox_list) { - if (fcb->GetCheckBox()->GetValue()) { - fcb_list.push_back(fcb); - } - } - } - else if (get_ams_select_mode() == FilamentSelectMode::FSMRadioMode) { - for (auto& fcb : m_filament_comboBox_list) { - if (fcb->GetRadioBox()->GetValue()) { - fcb_list.push_back(fcb); - } - } - } - } - return fcb_list; -} - -void CalibrationWizard::init_presets_selections() { - init_nozzle_selections(); - init_bed_type_selections(); - init_process_selections(); -} - -void CalibrationWizard::init_nozzle_selections() -{ - m_comboBox_nozzle_dia->Clear(); - m_printer_preset = nullptr; - if (curr_obj) { - m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f", 0.2)); - m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f", 0.4)); - m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f", 0.6)); - m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f", 0.8)); - m_comboBox_nozzle_dia->SetSelection(-1); - if (is_high_end_type(curr_obj) && - (abs(curr_obj->nozzle_diameter - 0.2f) < 1e-3 || - abs(curr_obj->nozzle_diameter - 0.4f) < 1e-3 || - abs(curr_obj->nozzle_diameter - 0.6f) < 1e-3 || - abs(curr_obj->nozzle_diameter - 0.8f) < 1e-3) - ) { - m_comboBox_nozzle_dia->SetValue(wxString::Format("%1.1f", curr_obj->nozzle_diameter)); - wxCommandEvent evt(wxEVT_COMBOBOX); - evt.SetEventObject(m_comboBox_nozzle_dia); - wxPostEvent(m_comboBox_nozzle_dia, evt); - } - else { - m_comboBox_nozzle_dia->SetValue(""); - } - } -} - -void CalibrationWizard::init_bed_type_selections() -{ - m_comboBox_bed_type->Clear(); - int curr_selection = 0; - if (curr_obj) { - const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type"); - if (bed_type_def && bed_type_def->enum_keys_map) { - for (auto item : bed_type_def->enum_labels) { - m_comboBox_bed_type->AppendString(_L(item)); - } - m_comboBox_bed_type->SetSelection(curr_selection); - } - } -} - -void CalibrationWizard::init_process_selections() -{ - m_comboBox_process->Clear(); - m_print_preset = nullptr; - wxArrayString print_items; - PresetBundle* preset_bundle = wxGetApp().preset_bundle; - - double nozzle_value = 0.4; - wxString nozzle_value_str = m_comboBox_nozzle_dia->GetValue(); - try { - nozzle_value_str.ToDouble(&nozzle_value); - } - catch (...) { - ; - } - - if (preset_bundle && curr_obj) { - for (auto print_it = preset_bundle->prints.begin(); print_it != preset_bundle->prints.end(); print_it++) { - ConfigOption* printer_opt = print_it->config.option("compatible_printers"); - ConfigOptionStrings* printer_strs = dynamic_cast(printer_opt); - for (auto printer_str : printer_strs->values) { - if (m_printer_preset && m_printer_preset->name == printer_str) { - wxString process_name = wxString::FromUTF8(print_it->name); - print_items.Add(process_name); - break; - } - } - } - m_comboBox_process->Set(print_items); - m_comboBox_process->SetSelection((print_items.size() + 1) / 2 - 1); - - for (auto print_it = preset_bundle->prints.begin(); print_it != preset_bundle->prints.end(); print_it++) { - wxString print_name = wxString::FromUTF8(print_it->name); - if (print_name.compare(m_comboBox_process->GetValue()) == 0) { - m_print_preset = &*print_it; - } - } - } -} - -void CalibrationWizard::check_has_ams(MachineObject* obj) { - if (obj->amsList.size() == 0 || obj->ams_exist_bits == 0) { - m_select_ams_mode_panel->Hide(); - wxCommandEvent radioBox_evt(wxEVT_RADIOBUTTON); - radioBox_evt.SetEventObject(m_ext_spool_radiobox); - wxPostEvent(m_ext_spool_radiobox, radioBox_evt); - } - else { - m_select_ams_mode_panel->Show(); - wxCommandEvent radioBox_evt(wxEVT_RADIOBUTTON); - radioBox_evt.SetEventObject(m_ams_radiobox); - wxPostEvent(m_ams_radiobox, radioBox_evt); - } -} - -void CalibrationWizard::update_printer() { - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) return; - MachineObject* new_obj = dev->get_selected_machine(); - if (new_obj) { - check_has_ams(new_obj); - - if (new_obj != curr_obj) { - curr_obj = new_obj; - wxGetApp().sidebar().load_ams_list(new_obj->dev_id, new_obj); - wxGetApp().preset_bundle->set_calibrate_printer(""); - init_presets_selections(); - change_ams_select_mode(); - on_update_ams_filament(false); - on_switch_ams(m_ams_item_list[0]->m_amsinfo.ams_id); - for (auto& fcb : m_filament_comboBox_list) - fcb->SetValue(false); - m_virtual_tray_comboBox->SetValue(false); - - // for pa & flow rate calibration, need to change high end or low end pages - SimpleEvent e(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES); - e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); - - auto it = m_printer_calib_infos.find(curr_obj->dev_id); - if (it != m_printer_calib_infos.end() && it->second.mode == m_mode) { - PresetBundle* preset_bundle = wxGetApp().preset_bundle; - if (preset_bundle) { - for (auto filament_preset : m_printer_calib_infos[curr_obj->dev_id].filament_presets) { - for (auto filament_it = preset_bundle->filaments.begin(); filament_it != preset_bundle->filaments.end(); filament_it++) { - if (filament_it->name == filament_preset.second) { - m_filament_presets[filament_preset.first] = (&*filament_it); - } - } - } - } - std::vector tray_ids; - for (auto filament_preset : it->second.filament_presets) { - tray_ids.push_back(filament_preset.first); - } - set_selected_tray(tray_ids); - jump_to_page(static_cast(m_printer_calib_infos[curr_obj->dev_id].state)); - } - else { - // reset to first page - show_page(m_first_page); - } - } - } - else { - curr_obj = nullptr; - } -} - -void CalibrationWizard::on_select_nozzle(wxCommandEvent& evt) { - if (curr_obj) { - double nozzle_value = 0.0; - wxString nozzle_value_str = m_comboBox_nozzle_dia->GetValue(); - try { - nozzle_value_str.ToDouble(&nozzle_value); - } - catch (...) { - ; - } - PresetBundle* preset_bundle = wxGetApp().preset_bundle; - for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) { - // only use system printer preset - if (!printer_it->is_system) continue; - - ConfigOption* printer_nozzle_opt = printer_it->config.option("nozzle_diameter"); - ConfigOptionFloats* printer_nozzle_vals = nullptr; - if (printer_nozzle_opt) - printer_nozzle_vals = dynamic_cast(printer_nozzle_opt); - std::string model_id = printer_it->get_current_printer_type(preset_bundle); - if (model_id.compare(curr_obj->printer_type) == 0 - && printer_nozzle_vals - && abs(printer_nozzle_vals->get_at(0) - nozzle_value) < 1e-3) { - m_printer_preset = &*printer_it; - } - } - - if (m_printer_preset) { - preset_bundle->set_calibrate_printer(m_printer_preset->name); - on_update_ams_filament(false); - - init_process_selections(); - } - } -} - -void CalibrationWizard::on_select_bed_type(wxCommandEvent& evt) { - recommend_input_value(); -} - -void CalibrationWizard::on_switch_ams(std::string ams_id) -{ - for (auto i = 0; i < m_ams_item_list.size(); i++) { - AMSItem* item = m_ams_item_list[i]; - if (item->m_amsinfo.ams_id == ams_id) { - item->OnSelected(); - } - else { - item->UnSelected(); - } - } - - for (int i = 0; i < m_filament_comboBox_list.size(); i++) { - if (stoi(ams_id) * 4 <= i && i < stoi(ams_id) * 4 + 4) - m_filament_comboBox_list[i]->Show(true); - else { - m_filament_comboBox_list[i]->SetValue(false); - m_filament_comboBox_list[i]->Show(false); - } + if (m_curr_step) { + m_curr_step->page->Show(); } Layout(); } -static std::map filament_is_high_temp{ - {"PLA", false}, - {"PLA-CF", false}, - //{"PETG", true}, - {"ABS", true}, - {"TPU", false}, - {"PA", true}, - {"PA-CF", true}, - {"PET-CF", true}, - {"PC", true}, - {"ASA", true}, - {"HIPS", true} -}; - -void CalibrationWizard::on_select_tray(SimpleEvent& evt) { - // when set selection of comboBox or select a checkbox/radio will enter - - FilamentComboBoxList fcb_list = get_selected_filament_comboBox(); - if (fcb_list.empty()) { - m_filament_presets.clear(); - m_filaments_incompatible_tips->SetLabel(""); - m_filaments_incompatible_tips->Hide(); - recommend_input_value(); - return; - } - // check compatibility - bool has_high_temperature_filament = false; - bool has_low_temperature_filament = false; - wxString hight_temp_filament_type = ""; - wxString low_temp_filament_type = ""; - for (auto& fcb : fcb_list) { - wxString filament_type = ""; - if (fcb->GetComboBox()->get_selected_preset()) - filament_type = fcb->GetComboBox()->get_selected_preset()->alias; - for (auto& item : filament_is_high_temp) { - if (filament_type.Contains(item.first)) { - if (item.second == true) { - has_high_temperature_filament = true; - hight_temp_filament_type = item.first; - } - else { - has_low_temperature_filament = true; - low_temp_filament_type = item.first; - } - } - } - } - if (has_high_temperature_filament && has_low_temperature_filament) { - m_filament_presets.clear(); - wxString tips = wxString::Format(_L("Unable to print %s and %s together. Filaments have large bed temperature difference"), hight_temp_filament_type, low_temp_filament_type); - m_filaments_incompatible_tips->SetLabel(tips); - m_filaments_incompatible_tips->Show(); - Layout(); - } - else { - for (auto& fcb : fcb_list) { - Preset* preset = const_cast(fcb->GetComboBox()->get_selected_preset()); - if (preset) - m_filament_presets[fcb->get_tray_id()] = preset; - } - m_filaments_incompatible_tips->SetLabel(""); - m_filaments_incompatible_tips->Hide(); - Layout(); - } - - recommend_input_value(); -} - -void CalibrationWizard::on_update_ams_filament(bool dialog) +void CalibrationWizard::update(MachineObject* obj) { - auto& list = wxGetApp().preset_bundle->filament_ams_list; - if (list.empty() && dialog) { - MessageDialog dlg(this, _L("No AMS filaments. Please select a printer to load AMS info."), _L("Sync filaments with AMS"), wxOK); - dlg.ShowModal(); - return; - } + curr_obj = obj; - // clear selections while changing printer - for (auto& fcb : m_filament_comboBox_list) - fcb->update_from_preset(); - m_virtual_tray_comboBox->update_from_preset(); - - // update tray info - DynamicPrintConfig empty_config; - empty_config.set_key_value("filament_id", new ConfigOptionStrings{ "" }); - empty_config.set_key_value("tag_uid", new ConfigOptionStrings{ "" }); - empty_config.set_key_value("filament_type", new ConfigOptionStrings{ "" }); - empty_config.set_key_value("tray_name", new ConfigOptionStrings{ "" }); - empty_config.set_key_value("filament_colour", new ConfigOptionStrings{ "" }); - empty_config.set_key_value("filament_exist", new ConfigOptionBools{ false }); - for (int i = 0; i < m_filament_comboBox_list.size(); i++) { - auto it = std::find_if(list.begin(), list.end(), [i](auto& entry) { - return entry.first == i; - }); - if (it != list.end()) { - m_filament_comboBox_list[i]->load_tray_from_ams(i, it->second); - } - else { - m_filament_comboBox_list[i]->load_tray_from_ams(i, empty_config); - } + /* only update curr step + if (m_curr_step) { + m_curr_step->page->update(obj); } - auto it = std::find_if(list.begin(), list.end(), [](auto& entry) { - return entry.first == VIRTUAL_TRAY_ID; - }); - if (it != list.end()) { - m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, it->second); + */ + if (!obj) { + for (int i = 0; i < m_page_steps.size(); i++) { + if (m_page_steps[i]->page) + m_page_steps[i]->page->on_reset_page(); + } } else { - m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, empty_config); + if (last_obj != obj && obj->is_info_ready()) { + for (int i = 0; i < m_page_steps.size(); i++) { + if (m_page_steps[i]->page) + m_page_steps[i]->page->on_device_connected(obj); + } + this->on_device_connected(obj); + + last_obj = obj; + } } - // update m_ams_item_list - std::vector ams_info; - if (curr_obj) { - for (auto ams = curr_obj->amsList.begin(); ams != curr_obj->amsList.end(); ams++) { - AMSinfo info; - info.ams_id = ams->first; - if (ams->second->is_exists && info.parse_ams_info(ams->second, curr_obj->ams_calibrate_remain_flag, curr_obj->is_support_ams_humidity)) ams_info.push_back(info); - } + // update all page steps + for (int i = 0; i < m_page_steps.size(); i++) { + if (m_page_steps[i]->page) + m_page_steps[i]->page->update(obj); } - for (auto i = 0; i < m_ams_item_list.size(); i++) { - AMSItem* item = m_ams_item_list[i]; - if (ams_info.size() > 1) { - m_muilti_ams_panel->Show(); - if (i < ams_info.size()) { - item->Update(ams_info[i]); - item->Open(); - } - else { - item->Close(); - } - } - else { - m_muilti_ams_panel->Hide(); - item->Close(); - } - } - Layout(); } -bool CalibrationWizard::recommend_input_value() { - if (m_filament_presets.empty()) { - m_nozzle_temp->GetTextCtrl()->SetValue(wxEmptyString); - m_bed_temp->GetTextCtrl()->SetValue(wxEmptyString); - m_max_volumetric_speed->GetTextCtrl()->SetValue(wxEmptyString); - m_bed_type_incompatible_tips->SetLabel(""); - m_bed_type_incompatible_tips->Hide(); +void CalibrationWizard::on_device_connected(MachineObject* obj) +{ + if (!m_page_steps.empty()) + show_step(m_page_steps.front()); +} + +void CalibrationWizard::set_cali_method(CalibrationMethod method) +{ + m_cali_method = method; + for (int i = 0; i < m_page_steps.size(); i++) { + if (m_page_steps[i]->page) + m_page_steps[i]->page->set_cali_method(method); + } +} + +bool CalibrationWizard::save_preset(const std::string &old_preset_name, const std::string &new_preset_name, const std::map &key_values, std::string& message) +{ + if (new_preset_name.empty()) { + message = L("The name cannot be empty."); return false; } - int bed_temp_int = -1; - bool bed_temp_compatible = true; - PresetBundle* preset_bundle = wxGetApp().preset_bundle; - if (preset_bundle) { - for (auto& filament_preset : m_filament_presets) { - // update nozzle temperature - ConfigOption* opt_nozzle_temp = filament_preset.second->config.option("nozzle_temperature"); - if (opt_nozzle_temp) { - ConfigOptionInts* opt_min_ints = dynamic_cast(opt_nozzle_temp); - if (opt_min_ints) { - wxString text_nozzle_temp = wxString::Format("%d", opt_min_ints->get_at(0)); - m_nozzle_temp->GetTextCtrl()->SetValue(text_nozzle_temp); - } - } - // update bed temperature - bed_temp_int = get_bed_temp(&filament_preset.second->config); - wxString bed_temp_text = wxString::Format("%d", bed_temp_int); - m_bed_temp->GetTextCtrl()->SetValue(bed_temp_text); - // update max flow speed - ConfigOption* opt_flow_speed = filament_preset.second->config.option("filament_max_volumetric_speed"); - if (opt_flow_speed) { - ConfigOptionFloats* opt_flow_floats = dynamic_cast(opt_flow_speed); - if (opt_flow_floats) { - wxString flow_val_text = wxString::Format("%0.2f", opt_flow_floats->get_at(0)); - m_max_volumetric_speed->GetTextCtrl()->SetValue(flow_val_text); - } - } - - // check compatibility - if (m_bed_temp->GetTextCtrl()->GetValue().compare("0") <= 0) { - m_nozzle_temp->GetTextCtrl()->SetValue(wxEmptyString); - m_bed_temp->GetTextCtrl()->SetValue(wxEmptyString); - m_max_volumetric_speed->GetTextCtrl()->SetValue(wxEmptyString); - wxString tips = wxString::Format(_L("%s is not compatible with %s"), m_comboBox_bed_type->GetValue(), filament_preset.second->alias); - m_bed_type_incompatible_tips->SetLabel(tips); - m_bed_type_incompatible_tips->Update(); - m_bed_type_incompatible_tips->Show(); - Layout(); - bed_temp_compatible = false; - } - else { - m_bed_type_incompatible_tips->SetLabel(""); - m_bed_type_incompatible_tips->Hide(); - } - } + PresetCollection *filament_presets = &wxGetApp().preset_bundle->filaments; + Preset* preset = filament_presets->find_preset(old_preset_name); + if (!preset) { + message = L("The selected preset has been deleted."); + return false; } - return bed_temp_compatible; -} -int CalibrationWizard::get_bed_temp(DynamicPrintConfig* config) -{ - BedType curr_bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1); - const ConfigOptionInts* opt_bed_temp_ints = config->option(get_bed_temp_key(curr_bed_type)); - if (opt_bed_temp_ints) { - return opt_bed_temp_ints->get_at(0); - } - return -1; -} - -bool CalibrationWizard::save_presets(Preset *preset, const std::string &config_key, ConfigOption *config_value, const std::string &new_preset_name, std::string& message) -{ - PresetCollection* filament_presets = &wxGetApp().preset_bundle->filaments; - - std::string new_name = filament_presets->get_preset_name_by_alias(new_preset_name); - std::string curr_preset_name = preset->name; - preset = filament_presets->find_preset(curr_preset_name); Preset temp_preset = *preset; + std::string new_name = filament_presets->get_preset_name_by_alias(new_preset_name); bool exist_preset = false; // If name is current, get the editing preset Preset *new_preset = filament_presets->find_preset(new_name); if (new_preset) { if (new_preset->is_system) { - message = "The name cannot be the same as the system preset name."; + message = L("The name cannot be the same as the system preset name."); return false; } if (new_preset != preset) { - message = "The name is the same as another existing preset name"; + message = L("The name is the same as another existing preset name"); return false; } - if (new_preset != &filament_presets->get_edited_preset()) - new_preset = &temp_preset; + if (new_preset != &filament_presets->get_edited_preset()) new_preset = &temp_preset; exist_preset = true; } else { new_preset = &temp_preset; } - new_preset->config.set_key_value(config_key, config_value); + for (auto item : key_values) { + new_preset->config.set_key_value(item.first, item.second); + } // Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini filament_presets->save_current_preset(new_name, false, false, new_preset); @@ -1904,6 +170,7 @@ bool CalibrationWizard::save_presets(Preset *preset, const std::string &config_k // Preset* preset = &m_presets.preset(it - m_presets.begin(), true); if (!new_preset) { BOOST_LOG_TRIVIAL(info) << "create new preset failed"; + message = L("create new preset failed."); return false; } @@ -1924,2345 +191,885 @@ bool CalibrationWizard::save_presets(Preset *preset, const std::string &config_k wxGetApp().preset_bundle->update_compatible(PresetSelectCompatibleType::Never); // BBS if create a new prset name, preset changed from preset name to new preset name - if (!exist_preset) { - wxGetApp().plater()->sidebar().update_presets_from_to(Preset::Type::TYPE_FILAMENT, curr_preset_name, new_preset->name); - } + if (!exist_preset) { wxGetApp().plater()->sidebar().update_presets_from_to(Preset::Type::TYPE_FILAMENT, old_preset_name, new_preset->name); } - wxGetApp().mainframe->update_filament_tab_ui(); + // todo: zhimin + // wxGetApp().mainframe->update_filament_tab_ui(); return true; } -void CalibrationWizard::jump_to_page(PageType page_type) { - if (page_type == PageType::Finish) { - show_page(m_first_page); - return; - } - - auto tabbook = static_cast(GetParent()); - for (int i = 0; i < tabbook->GetPageCount(); i++) { - if (static_cast(tabbook->GetPage(i))->get_calibration_mode() == m_mode) - tabbook->SetSelection(i); - } - auto page_node = m_first_page; - while (page_node) - { - if (page_node->get_page_type() == page_type) { - m_curr_page = page_node; - show_page(m_curr_page); - break; - } - page_node = page_node->get_next_page(); - } -} - -void CalibrationWizard::init_bitmaps() +void CalibrationWizard::on_cali_go_home() { - m_bitmap_pause = ScalableBitmap(this, "print_control_pause", 18); - m_bitmap_pause_hover = ScalableBitmap(this, "print_control_pause_hover", 18); - m_bitmap_resume = ScalableBitmap(this, "print_control_resume", 18); - m_bitmap_resume_hover = ScalableBitmap(this, "print_control_resume_hover", 18); - m_bitmap_pause_disable = ScalableBitmap(this, "print_control_pause_disable", 18); - m_bitmap_resume_disable = ScalableBitmap(this, "print_control_resume_disable", 18); - m_bitmap_abort = ScalableBitmap(this, "print_control_stop", 18); - m_bitmap_abort_hover = ScalableBitmap(this, "print_control_stop_hover", 18); - m_bitmap_abort_disable = ScalableBitmap(this, "print_control_stop_disable", 18); -} + // can go home? confirm to continue + CalibrationMethod method; + int cali_stage = 0; + CalibMode obj_cali_mode = get_obj_calibration_mode(curr_obj, method, cali_stage); -HistoryWindow::HistoryWindow(wxWindow* parent) - : DPIDialog(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) -{ - create(); - wxGetApp().UpdateDlgDarkUI(this); -} + if (obj_cali_mode == m_mode && curr_obj && curr_obj->is_in_printing()) { + if (go_home_dialog == nullptr) + go_home_dialog = new SecondaryCheckDialog(this, wxID_ANY, _L("Confirm")); -void HistoryWindow::create() { - this->SetBackgroundColour(*wxWHITE); - auto main_sizer = new wxBoxSizer(wxVERTICAL); + go_home_dialog->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this, method](wxCommandEvent &e) { + if (curr_obj) { + curr_obj->command_task_abort(); + } else { + assert(false); + } + if (!m_page_steps.empty()) + show_step(m_page_steps.front()); + }); - auto scroll_window = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL); - scroll_window->SetScrollRate(5, 5); - scroll_window->SetBackgroundColour(*wxWHITE); - - auto scroll_sizer = new wxBoxSizer(wxVERTICAL); - scroll_window->SetSizer(scroll_sizer); - - m_history_data_panel = new wxPanel(scroll_window); - - scroll_sizer->Add(m_history_data_panel, 1, wxALIGN_CENTER); - - main_sizer->Add(scroll_window, 1, wxEXPAND | wxALL, FromDIP(10)); - - SetSizer(main_sizer); - Layout(); - Fit(); - SetMinSize(wxSize(FromDIP(960), FromDIP(720))); - SetSize(wxSize(FromDIP(960), FromDIP(720))); - CenterOnParent(); + go_home_dialog->update_text(_L("Are you sure to cancel the current calibration and return to the home page?")); + go_home_dialog->on_show(); + } else { + if (!m_page_steps.empty()) show_step(m_page_steps.front()); + } } PressureAdvanceWizard::PressureAdvanceWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : CalibrationWizard(parent, CalibMode::Calib_PA_Line, id, pos, size, style) { create_pages(); - init_bitmaps(); - set_ams_select_mode(FSMCheckBoxMode); - - Bind(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES, &PressureAdvanceWizard::switch_pages, this); -} - -void PressureAdvanceWizard::create_save_panel_content(wxBoxSizer* sizer) -{ - // low end save panel - { - m_low_end_save_panel = new wxPanel(m_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - auto low_end_sizer = new wxBoxSizer(wxVERTICAL); - m_low_end_save_panel->SetSizer(low_end_sizer); - - auto complete_text_panel = new wxPanel(m_low_end_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL); - auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("Please find the best line on your plate")); - complete_text->SetFont(Label::Head_14); - complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER); - complete_text_panel->SetSizer(complete_text_sizer); - low_end_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0); - - low_end_sizer->AddSpacer(FromDIP(20)); - - m_record_picture = new wxStaticBitmap(m_low_end_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - low_end_sizer->Add(m_record_picture, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0); - - low_end_sizer->AddSpacer(FromDIP(20)); - - auto value_sizer = new wxBoxSizer(wxHORIZONTAL); - auto k_value_text = new wxStaticText(m_low_end_save_panel, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0); - k_value_text->Wrap(-1); - k_value_text->SetFont(::Label::Body_14); - auto n_value_text = new wxStaticText(m_low_end_save_panel, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0); - n_value_text->Wrap(-1); - n_value_text->SetFont(::Label::Body_14); - m_k_val = new TextInput(m_low_end_save_panel, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0); - m_n_val = new TextInput(m_low_end_save_panel, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0); - n_value_text->Hide(); - m_n_val->Hide(); - value_sizer->Add(k_value_text, 0, wxALIGN_CENTER_VERTICAL, 0); - value_sizer->AddSpacer(FromDIP(10)); - value_sizer->Add(m_k_val, 0); - value_sizer->AddSpacer(FromDIP(50)); - value_sizer->Add(n_value_text, 0, wxALIGN_CENTER_VERTICAL, 0); - value_sizer->AddSpacer(FromDIP(10)); - value_sizer->Add(m_n_val, 0); - low_end_sizer->Add(value_sizer, 0, wxALIGN_CENTER); - - sizer->Add(m_low_end_save_panel, 0, wxEXPAND); - } - - // high end save panel (Hide) - { - m_high_end_save_panel = new wxPanel(m_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - auto high_end_sizer = new wxBoxSizer(wxVERTICAL); - m_high_end_save_panel->SetSizer(high_end_sizer); - - auto complete_text_panel = new wxPanel(m_high_end_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL); - auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("We found the best Pressure Advance Factor")); - complete_text->SetFont(Label::Head_14); - complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER); - complete_text_panel->SetSizer(complete_text_sizer); - high_end_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0); - - high_end_sizer->AddSpacer(FromDIP(20)); - - m_grid_panel = new wxPanel(m_high_end_save_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - high_end_sizer->Add(m_grid_panel, 0, wxALIGN_CENTER); - - sizer->Add(m_high_end_save_panel, 0, wxEXPAND); - - m_high_end_save_panel->Hide(); - } -} - -CalibrationWizardPage* PressureAdvanceWizard::create_start_page() -{ - auto page = new CalibrationWizardPage(m_scrolledWindow); - page->set_page_type(PageType::Start); - page->set_highlight_step_text(PageType::Start); - auto page_content_sizer = page->get_content_vsizer(); - - auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Pressure Advance Calibration")); - when_title->SetFont(Label::Head_14); - when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_title); - auto when_text = new wxStaticText(page, wxID_ANY, _L("uneven extrusion")); - when_text->SetFont(Label::Body_14); - when_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL); - auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap1->SetMinSize(wxSize(560, 450)); - bitmap1->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap1, 0, wxALL, 0); - bitmap_sizer->AddSpacer(FromDIP(20)); - auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap2->SetMinSize(wxSize(560, 450)); - bitmap2->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap2, 0, wxALL, 0); - page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto about_title = new wxStaticText(page, wxID_ANY, _L("About this calibration")); - about_title->SetFont(Label::Head_14); - about_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(about_title); - auto about_text = new wxStaticText(page, wxID_ANY, _L("After calibration, the linear compensation factor(K) will be recorded and applied to printing. This factor would be different if device, degree of usage, material, and material family type are different")); - about_text->SetFont(Label::Body_14); - about_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(about_text); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki")); - wiki->SetFont(Label::Head_14); - wiki->SetForegroundColour({ 0, 88, 220 }); - wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_HAND); - }); - wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_ARROW); - }); - wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { - if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url); - }); - page_content_sizer->Add(wiki, 0); - - - auto page_prev_btn = page->get_prev_btn(); - page_prev_btn->Hide(); - page_prev_btn->SetLabel(_L("Manage Result")); - page_prev_btn->SetButtonType(ButtonType::Back); - page_prev_btn->Bind(wxEVT_BUTTON, [this](auto& e) { - if (is_high_end_type(curr_obj)) { - sync_history_window_data(); - } - }); - - auto page_next_btn = page->get_next_btn(); - page_next_btn->SetLabel(_L("Start")); - page_next_btn->SetButtonType(ButtonType::Start); - - return page; } void PressureAdvanceWizard::create_pages() { - create_history_window(); - // page 0 : start page - m_page0 = create_start_page(); - m_page0->set_page_title(_L("Pressure Advance")); - m_all_pages_sizer->Add(m_page0, 1, wxEXPAND | wxALL, FromDIP(25)); + start_step = new CalibrationWizardPageStep(new CalibrationPAStartPage(m_scrolledWindow)); + preset_step = new CalibrationWizardPageStep(new CalibrationPresetPage(m_scrolledWindow, m_mode, false)); + cali_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode)); + save_step = new CalibrationWizardPageStep(new CalibrationPASavePage(m_scrolledWindow)); + + m_all_pages_sizer->Add(start_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(preset_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(cali_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(save_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); - // page 1 : preset page - m_page1 = create_presets_page(false); - m_page1->set_page_title(_L("Pressure Advance")); - m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25)); - // page 2 : print page - m_page2 = create_print_page(); - m_page2->set_page_title(_L("Pressure Advance")); - m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25)); + m_page_steps.push_back(start_step); + m_page_steps.push_back(preset_step); + m_page_steps.push_back(cali_step); + m_page_steps.push_back(save_step); - // page 3 : save page - m_page3 = create_save_page(); - m_page3->set_page_title(_L("Pressure Advance")); - m_page3->Bind(wxEVT_SHOW, [this](auto&) { - sync_save_page_data(); - }); - m_all_pages_sizer->Add(m_page3, 1, wxEXPAND | wxALL, FromDIP(25)); + for (int i = 0; i < m_page_steps.size() -1; i++) { + m_page_steps[i]->chain(m_page_steps[i+1]); + } - // link page - m_first_page = m_page0; - m_curr_page = m_page0; - m_page0->chain(m_page1)->chain(m_page2)->chain(m_page3); - show_page(m_curr_page); + for (int i = 0; i < m_page_steps.size(); i++) { + m_page_steps[i]->page->Hide(); + m_page_steps[i]->page->Bind(EVT_CALI_ACTION, &PressureAdvanceWizard::on_cali_action, this); + } + + if (!m_page_steps.empty()) + show_step(m_page_steps.front()); } -void PressureAdvanceWizard::create_history_window() +void PressureAdvanceWizard::on_cali_action(wxCommandEvent& evt) { - m_history_page = new HistoryWindow(this); + CaliPageActionType action = static_cast(evt.GetInt()); + if (action == CaliPageActionType::CALI_ACTION_MANAGE_RESULT) { + HistoryWindow history_dialog(this, m_calib_results_history); + history_dialog.on_device_connected(curr_obj); + history_dialog.ShowModal(); + } + else if (action == CaliPageActionType::CALI_ACTION_MANUAL_CALI) { + preset_step->page->set_cali_filament_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE); + set_cali_method(CalibrationMethod::CALI_METHOD_MANUAL); + preset_step->page->on_device_connected(curr_obj); + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_AUTO_CALI) { + CalibrationFilamentMode fila_mode = get_cali_filament_mode(curr_obj, m_mode); + preset_step->page->set_cali_filament_mode(fila_mode); + set_cali_method(CalibrationMethod::CALI_METHOD_AUTO); + preset_step->page->on_device_connected(curr_obj); + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_NEXT) { + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_CALI_NEXT) { + (static_cast(save_step->page))->sync_cali_result(curr_obj); + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_PREV) { + show_step(m_curr_step->prev); + } + else if (action == CaliPageActionType::CALI_ACTION_CALI) { + on_cali_start(); + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_GO_HOME) { + on_cali_go_home(); + } else if (action == CaliPageActionType::CALI_ACTION_PA_SAVE) { + on_cali_save(); + } } -void PressureAdvanceWizard::request_calib_result() { - if (is_high_end_type(curr_obj)) { - if (is_first_time_get_result) { - curr_obj->has_get_pa_calib_result = false; - CalibUtils::emit_get_PA_calib_results(curr_obj->nozzle_diameter); - is_first_time_get_result = false; - } - if (curr_obj->has_get_pa_calib_result) { - if (!has_get_result) { - CalibUtils::get_PA_calib_results(m_calib_results); - if (m_calib_results.size() > 0) { - has_get_result = true; - sync_save_page_data(); +void PressureAdvanceWizard::update(MachineObject* obj) +{ + CalibrationWizard::update(obj); +} + +void PressureAdvanceWizard::on_device_connected(MachineObject* obj) +{ + CalibrationWizard::on_device_connected(obj); + + CalibrationMethod method; + int cali_stage = 0; + CalibMode obj_cali_mode = get_obj_calibration_mode(obj, method, cali_stage); + + // show cali step when obj is in pa calibration + if (obj) { + CalibrationWizard::set_cali_method(method); + + if (m_curr_step != cali_step) { + if (obj_cali_mode == m_mode) { + if (obj->is_in_printing() || obj->is_printing_finished()) { + CalibrationWizard::set_cali_method(method); + show_step(cali_step); } } } } } -void PressureAdvanceWizard::sync_history_window_data() { - auto history_data_panel = m_history_page->m_history_data_panel; - history_data_panel->DestroyChildren(); - - wxGridBagSizer* gbSizer; - gbSizer = new wxGridBagSizer(FromDIP(15), FromDIP(0)); - gbSizer->SetFlexibleDirection(wxBOTH); - gbSizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); - - history_data_panel->SetSizer(gbSizer, true); - - auto title_nozzle = new wxStaticText(history_data_panel, wxID_ANY, _L("Nozzle Diameter")); - title_nozzle->SetFont(Label::Head_14); - gbSizer->Add(title_nozzle, { 0, 0 }, {1, 1}, wxRIGHT, FromDIP(80)); - - auto title_material = new wxStaticText(history_data_panel, wxID_ANY, _L("Material")); - title_material->SetFont(Label::Head_14); - gbSizer->Add(title_material, { 0, 1 }, { 1, 1 }, wxRIGHT, FromDIP(80)); - - auto title_k = new wxStaticText(history_data_panel, wxID_ANY, _L("K")); - title_k->SetFont(Label::Head_14); - gbSizer->Add(title_k, { 0, 2 }, { 1, 1 }, wxRIGHT, FromDIP(80)); - - // Hide - //auto title_n = new wxStaticText(history_data_panel, wxID_ANY, _L("N")); - //title_n->SetFont(Label::Head_14); - //gbSizer->Add(title_n, { 0, 3 }, { 1, 1 }, wxRIGHT, FromDIP(80)); - - auto title_action = new wxStaticText(history_data_panel, wxID_ANY, _L("Action")); - title_action->SetFont(Label::Head_14); - gbSizer->Add(title_action, { 0, 3 }, { 1, 1 }); - - int i = 1; - for (auto& result : m_calib_results_history) { - auto nozzle_dia_str = wxString::Format("%1.1f", result.nozzle_diameter); - auto nozzle_dia_value = new wxStaticText(history_data_panel, wxID_ANY, nozzle_dia_str); - wxString material_name = NA_STR; - material_name = result.name; - auto material_name_value = new wxStaticText(history_data_panel, wxID_ANY, material_name); - auto k_str = wxString::Format("%.3f", result.k_value); - auto n_str = wxString::Format("%.3f", result.n_coef); - auto k_value = new wxStaticText(history_data_panel, wxID_ANY, k_str); - auto n_value = new wxStaticText(history_data_panel, wxID_ANY, n_str); - n_value->Hide(); - auto delete_button = new PageButton(history_data_panel, _L("Delete"), ButtonType::Back); - delete_button->Bind(wxEVT_BUTTON, [gbSizer, i, history_data_panel, &result](auto &e) { - for (int j = 0; j < 5; j++) { - auto item = gbSizer->FindItemAtPosition({ i, j }); - item->GetWindow()->Hide(); - } - gbSizer->SetEmptyCellSize({ 0,0 }); - history_data_panel->Layout(); - history_data_panel->Fit(); - CalibUtils::delete_PA_calib_result({result.tray_id, result.cali_idx, result.nozzle_diameter, result.filament_id}); - }); - auto edit_button = new PageButton(history_data_panel, _L("Edit"), ButtonType::Next); - edit_button->Bind(wxEVT_BUTTON, [this, &result, nozzle_dia_str, k_value, n_value, material_name_value](auto& e) { - EditCalibrationHistoryDialog dlg(m_history_page, k_value->GetLabel(), n_value->GetLabel(), material_name_value->GetLabel(), nozzle_dia_str); - if (dlg.ShowModal() == wxID_OK) { - float k = 0.0f; - k = dlg.get_k_value(); - wxString new_k_str = wxString::Format("%.3f", k); - - wxString new_material_name = dlg.get_material_name_value(); - - k_value->SetLabel(new_k_str); - material_name_value->SetLabel(new_material_name); - PACalibResult new_result = result; - new_result.tray_id = -1; - new_result.name = new_material_name.ToStdString(); - new_result.k_value = k; - CalibUtils::set_PA_calib_result({ new_result }); - } - }); - - gbSizer->Add(nozzle_dia_value, { i, 0 }, { 1, 1 }, wxRIGHT, FromDIP(80)); - gbSizer->Add(material_name_value, { i, 1 }, { 1, 1 }, wxRIGHT, FromDIP(80)); - gbSizer->Add(k_value, { i, 2 }, { 1, 1 }, wxRIGHT, FromDIP(80)); - //gbSizer->Add(n_value, { i, 3 }, { 1, 1 }, wxRIGHT, FromDIP(80)); - gbSizer->Add(delete_button, { i, 3 }, { 1, 1 }, wxRIGHT, FromDIP(25)); - gbSizer->Add(edit_button, { i, 4 }, { 1, 1 }); - i++; - } - - if (m_calib_results_history.empty()) { - MessageDialog msg_dlg(nullptr, _L("No History Result"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - } - else { - m_history_page->ShowModal(); - } - - m_history_page->Layout(); -} - -void PressureAdvanceWizard::sync_save_page_data() { - FilamentComboBoxList fcb_list = get_selected_filament_comboBox(); - - m_grid_panel->DestroyChildren(); - wxBoxSizer* grid_sizer = new wxBoxSizer(wxHORIZONTAL); - const int COLUMN_GAP = FromDIP(50); - const int ROW_GAP = FromDIP(30); - wxBoxSizer* left_title_sizer = new wxBoxSizer(wxVERTICAL); - left_title_sizer->AddSpacer(FromDIP(52)); - auto k_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("FactorK"), wxDefaultPosition, wxDefaultSize, 0); - k_title->SetFont(Label::Head_14); - left_title_sizer->Add(k_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - auto n_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("FactorN"), wxDefaultPosition, wxDefaultSize, 0); - n_title->SetFont(Label::Head_14); - // hide n value - n_title->Hide(); - left_title_sizer->Add(n_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - auto brand_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0); - brand_title->SetFont(Label::Head_14); - left_title_sizer->Add(brand_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - grid_sizer->Add(left_title_sizer); - grid_sizer->AddSpacer(COLUMN_GAP); - - for (auto& fcb : fcb_list) { - bool result_failed = false; - auto it_result = std::find_if(m_calib_results.begin(), m_calib_results.end(), [fcb](auto& calib_result) { - return calib_result.tray_id == fcb->get_tray_id(); - }); - if (it_result != m_calib_results.end()) { - result_failed = false; - } - else { - result_failed = true; - } - int index = it_result - m_calib_results.begin(); - - wxBoxSizer* column_data_sizer = new wxBoxSizer(wxVERTICAL); - auto tray_title = new wxStaticText(m_grid_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0); - tray_title->SetFont(Label::Head_14); - tray_title->SetLabel(fcb->get_tray_name()); - column_data_sizer->Add(tray_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - - auto k_value = new TextInput(m_grid_panel, NA_STR, "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_PROCESS_ENTER); - auto n_value = new TextInput(m_grid_panel, NA_STR, "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_PROCESS_ENTER); - k_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - n_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - auto k_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); - auto n_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); - - if (!result_failed) { - auto k_str = wxString::Format("%.3f", m_calib_results[index].k_value); - auto n_str = wxString::Format("%.3f", m_calib_results[index].n_coef); - k_value->GetTextCtrl()->SetValue(k_str); - n_value->GetTextCtrl()->SetValue(n_str); - } - - k_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, result_failed, index, fcb, k_value](auto& e) { - if (!result_failed) { - float k = 0.0f; - validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k); - wxString k_str = wxString::Format("%.3f", k); - k_value->GetTextCtrl()->SetValue(k_str); - m_calib_results[index].k_value = k; - } - }); - k_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, result_failed, index, fcb, k_value](auto& e) { - if (!result_failed) { - float k = 0.0f; - validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k); - wxString k_str = wxString::Format("%.3f", k); - k_value->GetTextCtrl()->SetValue(k_str); - m_calib_results[index].k_value = k; - } - e.Skip(); - }); - column_data_sizer->Add(k_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - column_data_sizer->Add(n_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - column_data_sizer->Add(k_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - column_data_sizer->Add(n_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - - auto comboBox_tray_name = new ComboBox(m_grid_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0, nullptr); - auto tray_name_failed = new wxStaticText(m_grid_panel, wxID_ANY, " - ", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); - wxArrayString selections; - static std::vector filtered_results; - filtered_results.clear(); - for (auto history : m_calib_results_history) { - if (history.setting_id == m_filament_presets[fcb->get_tray_id()]->setting_id) { - filtered_results.push_back(history); - selections.push_back(history.name); - } - } - comboBox_tray_name->Set(selections); - - auto set_edit_mode = [this, k_value, n_value, k_value_failed, n_value_failed, comboBox_tray_name, tray_name_failed](std::string str) { - if (str == "normal") { - comboBox_tray_name->Show(); - tray_name_failed->Show(false); - k_value->Show(); - n_value->Show(); - k_value_failed->Show(false); - n_value_failed->Show(false); - } - if (str == "failed") { - comboBox_tray_name->Show(false); - tray_name_failed->Show(); - k_value->Show(false); - n_value->Show(false); - k_value_failed->Show(); - n_value_failed->Show(); - } - - // hide n value - n_value->Hide(); - n_value_failed->Hide(); - - m_grid_panel->Layout(); - m_grid_panel->Update(); - }; - - if (result_failed) { - set_edit_mode("failed"); - } - else { - comboBox_tray_name->SetValue(fcb->GetComboBox()->GetValue()); - m_calib_results[index].name = comboBox_tray_name->GetValue().ToStdString(); - set_edit_mode("normal"); - comboBox_tray_name->GetTextCtrl()->Bind(wxEVT_KEY_DOWN, [this, result_failed, index, fcb, comboBox_tray_name](auto& e) { - if (wxGetKeyState(WXK_RETURN)) { - this->m_calib_results[index].name = comboBox_tray_name->GetTextCtrl()->GetValue().ToStdString(); - } - else - e.Skip(); - }); - comboBox_tray_name->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, result_failed, index, fcb, comboBox_tray_name](auto& e) { - this->m_calib_results[index].name = comboBox_tray_name->GetTextCtrl()->GetValue().ToStdString(); - e.Skip(); - }); - } - - comboBox_tray_name->Bind(wxEVT_COMBOBOX, [this, result_failed, index, fcb, comboBox_tray_name, k_value, n_value, set_edit_mode](auto& e) { - int selection = comboBox_tray_name->GetSelection(); - set_edit_mode("normal"); - auto history = filtered_results[selection]; - - if (!result_failed) { - this->m_calib_results[index].name = history.name; - } - }); - - column_data_sizer->Add(comboBox_tray_name, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - column_data_sizer->Add(tray_name_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - - grid_sizer->Add(column_data_sizer); - grid_sizer->AddSpacer(COLUMN_GAP); - } - m_grid_panel->SetSizer(grid_sizer, true); - m_grid_panel->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - m_grid_panel->SetFocusIgnoringChildren(); - }); - Layout(); -} - -void PressureAdvanceWizard::switch_pages(SimpleEvent& evt) { - if (curr_obj) { - if (is_high_end_type(curr_obj)) - { - m_low_end_save_panel->Hide(); - m_high_end_save_panel->Show(); - - m_page0->get_prev_btn()->Show(); - - sync_save_page_data(); // CALIBRATION_DEBUG - } - else - { - m_high_end_save_panel->Hide(); - m_low_end_save_panel->Show(); - - m_page0->get_prev_btn()->Hide(); - } - Layout(); - } -} - -void PressureAdvanceWizard::change_ams_select_mode() { - if (is_high_end_type(curr_obj)) { - set_ams_select_mode(FSMCheckBoxMode); - } - else{ - set_ams_select_mode(FSMRadioMode); - } -} - -bool PressureAdvanceWizard::start_calibration(std::vector tray_ids) +static bool get_preset_info(const DynamicConfig& config, const BedType plate_type, int& nozzle_temp, int& bed_temp, float& max_volumetric_speed) { - int nozzle_temp = -1; - int bed_temp = -1; - float max_volumetric_speed = -1; + const ConfigOptionInts* nozzle_temp_opt = config.option("nozzle_temperature"); + const ConfigOptionInts* opt_bed_temp_ints = config.option(get_bed_temp_key(plate_type)); + const ConfigOptionFloats* speed_opt = config.option("filament_max_volumetric_speed"); + if (nozzle_temp_opt && speed_opt && opt_bed_temp_ints) { + nozzle_temp = nozzle_temp_opt->get_at(0); + max_volumetric_speed = speed_opt->get_at(0); + bed_temp = opt_bed_temp_ints->get_at(0); + if (bed_temp >= 0 && nozzle_temp >= 0 && max_volumetric_speed >= 0) { + return true; + } + } + return false; +} - if (m_nozzle_temp->GetTextCtrl()->GetValue().IsEmpty() || - m_bed_temp->GetTextCtrl()->GetValue().IsEmpty() || - m_max_volumetric_speed->GetTextCtrl()->GetValue().IsEmpty()) - return false; - nozzle_temp = stoi(m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString()); - bed_temp = stoi(m_bed_temp->GetTextCtrl()->GetValue().ToStdString()); - max_volumetric_speed = stof(m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString()); - - if (bed_temp < 0 || nozzle_temp < 0 || max_volumetric_speed < 0) { - MessageDialog msg_dlg(nullptr, _L("Make sure bed_temp > 0 \nnozzle_temp > 0\nmax_volumetric_speed > 0"), wxEmptyString, wxICON_WARNING | wxOK); +void PressureAdvanceWizard::on_cali_start() +{ + if (!curr_obj) { + MessageDialog msg_dlg(nullptr, _L("No Printer Connected!"), wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); - return false; + return; } - if (is_high_end_type(curr_obj)) { - m_calib_results.clear(); + if (curr_obj->is_connecting() || !curr_obj->is_connected()) { + MessageDialog msg_dlg(nullptr, _L("Printer is not connected yet."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return; + } + + //clean PA result + curr_obj->reset_pa_cali_result(); + + float nozzle_dia = -1; + std::string setting_id; + BedType plate_type = BedType::btDefault; + + CalibrationPresetPage* preset_page = (static_cast(preset_step->page)); + + std::map selected_filaments = preset_page->get_selected_filaments(); + + curr_obj->selected_cali_preset.clear(); + for (auto& item : selected_filaments) { + CaliPresetInfo result; + result.tray_id = item.first; + result.nozzle_diameter = nozzle_dia; + result.filament_id = item.second->filament_id; + result.setting_id = item.second->setting_id; + result.name = item.second->name; + curr_obj->selected_cali_preset.push_back(result); + } + + preset_page->get_preset_info(nozzle_dia, plate_type); + + if (nozzle_dia < 0 || plate_type == BedType::btDefault) { + BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info, nozzle and plate type error"; + return; + } + + if (curr_obj->printer_type == "BL-P001" + || curr_obj->printer_type == "BL-P002") { X1CCalibInfos calib_infos; - for (int tray_id : tray_ids) { - if (m_filament_presets.find(tray_id) == m_filament_presets.end()) - return false; + for (auto& item : selected_filaments) { + int nozzle_temp = -1; + int bed_temp = -1; + float max_volumetric_speed = -1; + + if (!get_preset_info(item.second->config, plate_type, nozzle_temp, bed_temp, max_volumetric_speed)) { + BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info error"; + continue; + } + X1CCalibInfos::X1CCalibInfo calib_info; - calib_info.tray_id = tray_id; - calib_info.nozzle_diameter = dynamic_cast(m_printer_preset->config.option("nozzle_diameter"))->get_at(0); - calib_info.filament_id = m_filament_presets[tray_id]->filament_id; - calib_info.setting_id = m_filament_presets[tray_id]->setting_id; + calib_info.tray_id = item.first; + calib_info.nozzle_diameter = nozzle_dia; + calib_info.filament_id = item.second->filament_id; + calib_info.setting_id = item.second->setting_id; calib_info.bed_temp = bed_temp; calib_info.nozzle_temp = nozzle_temp; calib_info.max_volumetric_speed = max_volumetric_speed; calib_infos.calib_datas.push_back(calib_info); } + std::string error_message; - CalibUtils::calib_PA(calib_infos, error_message); - if (!error_message.empty()) { - MessageDialog msg_dlg(nullptr, error_message, wxEmptyString, wxICON_WARNING | wxOK); + wxString wx_err_string; + if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { + CalibUtils::calib_PA(calib_infos, 0, error_message); // mode = 0 for auto + wx_err_string = from_u8(error_message); + } else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { + CalibUtils::calib_PA(calib_infos, 1, error_message); // mode = 1 for manual + wx_err_string = from_u8(error_message); + } else { + assert(false); + } + if (!wx_err_string.empty()) { + MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); - return false; } - is_first_time_get_result = true; - has_get_result = false; - show_page(get_curr_page()->get_next_page()); - return true; } - else { - curr_obj->command_start_extrusion_cali(tray_ids[0], nozzle_temp, bed_temp, max_volumetric_speed, m_filament_presets.begin()->second->setting_id); - show_page(get_curr_page()->get_next_page()); - return true; - } - - return false; -} - -bool PressureAdvanceWizard::save_calibration_result() -{ - if (is_high_end_type(curr_obj)) { - for (auto& result : m_calib_results) { - if (result.k_value > 0.5 || result.k_value < 0) { - wxString k_tips = _L("Please input a valid value (K in 0~0.5)"); - MessageDialog msg_dlg(nullptr, k_tips, wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } + else if (curr_obj->printer_type == "C11" + || curr_obj->printer_type == "C12") { + if (selected_filaments.empty()) { + BOOST_LOG_TRIVIAL(warning) << "CaliPreset: selected filaments is empty"; + return; } - CalibUtils::set_PA_calib_result(m_calib_results); - return true; - } - else { - float k = 0.0f; - validate_input_k_value(m_k_val->GetTextCtrl()->GetValue(), &k); - wxString k_str = wxString::Format("%.3f", k); - m_k_val->GetTextCtrl()->SetValue(k_str); - double n = 0.0; - //n_text.ToDouble(&n); - - // set values int nozzle_temp = -1; int bed_temp = -1; float max_volumetric_speed = -1; - std::string setting_id; - std::string name; + if (!get_preset_info(selected_filaments.begin()->second->config, plate_type, nozzle_temp, bed_temp, max_volumetric_speed)) { + BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info error"; + return; + } - nozzle_temp = stoi(m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString()); - bed_temp = stoi(m_bed_temp->GetTextCtrl()->GetValue().ToStdString()); - max_volumetric_speed = stof(m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString()); - setting_id = m_filament_presets.begin()->second->setting_id; - name = m_filament_presets.begin()->second->name; - - // send command - std::vector tray_ids = get_selected_tray(); - curr_obj->command_extrusion_cali_set(tray_ids[0], setting_id, name, k, n, bed_temp, nozzle_temp, max_volumetric_speed); - return true; + curr_obj->command_start_extrusion_cali(selected_filaments.begin()->first, + nozzle_temp, bed_temp, max_volumetric_speed, setting_id); + } else { + assert(false); } - return false; } -bool PressureAdvanceWizard::recommend_input_value() +void PressureAdvanceWizard::on_cali_save() { - return CalibrationWizard::recommend_input_value(); -} + if (curr_obj) { + if (curr_obj->printer_type == "BL-P001" + || curr_obj->printer_type == "BL-P002") { + if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { + std::vector new_pa_cali_results; + auto save_page = static_cast(save_step->page); + if (!save_page->get_auto_result(new_pa_cali_results)) { + return; + } + CalibUtils::set_PA_calib_result(new_pa_cali_results); + } + else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { + PACalibResult new_pa_cali_result; + auto save_page = static_cast(save_step->page); + if (!save_page->get_manual_result(new_pa_cali_result)) { + return; + } + CalibUtils::set_PA_calib_result({ new_pa_cali_result }); + } + } + else if (curr_obj->printer_type == "C11" + || curr_obj->printer_type == "C12") { + auto save_page = static_cast(save_step->page); + float new_k_value = 0.0f; + float new_n_value = 0.0f; + if (!save_page->get_p1p_result(&new_k_value, &new_n_value)) { + return; + } -void PressureAdvanceWizard::init_bitmaps() -{ - m_print_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400)); - m_record_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400)); -} + float nozzle_dia = 0.4; + BedType plate_type = BedType::btDefault; + CalibrationPresetPage* preset_page = (static_cast(preset_step->page)); + preset_page->get_preset_info(nozzle_dia, plate_type); + std::map selected_filaments = preset_page->get_selected_filaments(); + int tray_id = selected_filaments.begin()->first; + std::string setting_id = selected_filaments.begin()->second->setting_id; -void PressureAdvanceWizard::check_sync_printer_status() -{ - // todo: sync the printer result - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) - return; + int nozzle_temp = -1; + int bed_temp = -1; + float max_volumetric_speed = -1; + if (!get_preset_info(selected_filaments.begin()->second->config, plate_type, nozzle_temp, bed_temp, max_volumetric_speed)) { + BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info error"; + return; + } - MachineObject *obj_ = dev->get_selected_machine(); - if (!obj_) - return; - - if (m_cali_version != obj_->cali_version) { - m_cali_version = obj_->cali_version; - CalibUtils::emit_get_PA_calib_info(obj_->nozzle_diameter, ""); + curr_obj->command_extrusion_cali_set(tray_id, setting_id, "", new_k_value, new_n_value, bed_temp, nozzle_temp, max_volumetric_speed); + } + else { + assert(false); + } + MessageDialog msg_dlg(nullptr, _L("Pressure advance calibration result has been saved to the printer"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); } - - if (CalibUtils::get_PA_calib_tab(m_calib_results_history)) { - obj_->has_get_pa_calib_tab = false; - - //PACalibIndexInfo cali_info; - //PACalibResult result_0 = m_calib_results_history[0]; - - //cali_info.tray_id = 0; - //cali_info.cali_idx = result_0.cali_idx; - //cali_info.nozzle_diameter = result_0.nozzle_diameter; - //cali_info.filament_id = result_0.filament_id; - //CalibUtils::select_PA_calib_result(cali_info); - - //result_0 = m_calib_results_history[2]; - //cali_info.tray_id = 2; - //cali_info.cali_idx = result_0.cali_idx; - //cali_info.nozzle_diameter = result_0.nozzle_diameter; - //cali_info.filament_id = result_0.filament_id; - //CalibUtils::select_PA_calib_result(cali_info); - - //result_0 = m_calib_results_history[3]; - //cali_info.tray_id = 3; - //cali_info.cali_idx = result_0.cali_idx; - //cali_info.nozzle_diameter = result_0.nozzle_diameter; - //cali_info.filament_id = result_0.filament_id; - //CalibUtils::select_PA_calib_result(cali_info); - } - - //if (m_calib_results_history.size() > 10) { - // PACalibIndexInfo cali_info; - // PACalibResult result_0 = m_calib_results_history[0]; - - // cali_info.tray_id = 0; - // cali_info.cali_idx = result_0.cali_idx; - // cali_info.nozzle_diameter = result_0.nozzle_diameter; - // cali_info.filament_id = result_0.filament_id; - // CalibUtils::delete_PA_calib_result(cali_info); - //} } FlowRateWizard::FlowRateWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : CalibrationWizard(parent, CalibMode::Calib_Flow_Rate, id, pos, size, style) { create_pages(); - init_bitmaps(); - Bind(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES, &FlowRateWizard::switch_pages, this); -} - -void FlowRateWizard::set_save_name() { - if (m_filament_presets.size() > 0) { - m_save_name = m_filament_presets.begin()->second->alias + "-Calibrated"; - } - else { m_save_name = ""; } - if (!is_high_end_type(curr_obj)) { - m_save_name_input1->GetTextCtrl()->SetValue(m_save_name); - m_save_name_input2->GetTextCtrl()->SetValue(m_save_name); - } -} - -void FlowRateWizard::create_save_panel_content(wxBoxSizer* sizer) -{ - auto complete_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0); - complete_text->SetFont(Label::Head_14); - complete_text->Wrap(-1); - sizer->Add(complete_text, 0, 0, 0); - sizer->AddSpacer(FromDIP(20)); - - m_low_record_picture2 = new wxStaticBitmap(m_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - m_low_record_picture2->SetMinSize(wxSize(560, 450)); - m_low_record_picture2->SetBackgroundColour(*wxBLACK); - sizer->Add(m_low_record_picture2, 0, wxALIGN_CENTER, 0); - - sizer->AddSpacer(FromDIP(20)); - - auto fine_value_sizer = new wxBoxSizer(wxVERTICAL); - auto fine_value_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Fill in the value above the block with smoothest top surface"), wxDefaultPosition, wxDefaultSize, 0); - fine_value_text->Wrap(-1); - fine_value_text->SetFont(::Label::Head_14); - m_optimal_block_fine = new ComboBox(m_save_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0, nullptr, wxCB_READONLY); - wxArrayString fine_block_items; - for (int i = 0; i < 10; i++) - { - fine_block_items.Add(std::to_string(-9 + (i))); - } - m_optimal_block_fine->Set(fine_block_items); - m_fine_calc_result_text = new wxStaticText(m_save_panel, wxID_ANY, ""); - fine_value_sizer->Add(fine_value_text, 0, 0); - fine_value_sizer->Add(m_optimal_block_fine, 0, 0); - fine_value_sizer->Add(m_fine_calc_result_text, 0); - sizer->Add(fine_value_sizer, 0, 0, 0); - sizer->AddSpacer(FromDIP(20)); - - auto save_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0); - save_text->Wrap(-1); - save_text->SetFont(Label::Head_14); - sizer->Add(save_text, 0, 0, 0); - - m_save_name_input2 = new TextInput(m_save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0); - sizer->Add(m_save_name_input2, 0, 0, 0); - m_save_name_input2->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) { - if (!m_save_name_input2->GetTextCtrl()->GetValue().IsEmpty()) - m_save_name = m_save_name_input2->GetTextCtrl()->GetValue().ToStdString(); - else - m_save_name = ""; - }); -} - -void FlowRateWizard::create_low_end_pages() { - // page 3 : save coarse result - m_low_end_page3 = new CalibrationWizardPage(m_scrolledWindow, false); - m_low_end_page3->set_page_title(_L("Flow Rate")); - m_low_end_page3->set_page_type(PageType::CoarseSave); - m_low_end_page3->set_highlight_step_text(PageType::CoarseSave); - - auto page3_content_sizer = m_low_end_page3->get_content_vsizer(); - - auto page3_description = new wxStaticText(m_low_end_page3, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0); - page3_description->SetFont(Label::Head_14); - page3_description->Wrap(-1); - page3_content_sizer->Add(page3_description, 0, 0, 0); - page3_content_sizer->AddSpacer(FromDIP(20)); - - m_low_record_picture1 = new wxStaticBitmap(m_low_end_page3, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - m_low_record_picture1->SetMinSize(wxSize(560, 450)); - m_low_record_picture1->SetBackgroundColour(*wxBLACK); - page3_content_sizer->Add(m_low_record_picture1, 0, 0, 0); - - page3_content_sizer->AddSpacer(FromDIP(20)); - - auto coarse_value_sizer = new wxBoxSizer(wxVERTICAL); - auto coarse_value_text = new wxStaticText(m_low_end_page3, wxID_ANY, _L("Fill in the value above the block with smoothest top surface"), wxDefaultPosition, wxDefaultSize, 0); - coarse_value_text->SetFont(Label::Head_14); - coarse_value_text->Wrap(-1); - m_optimal_block_coarse = new ComboBox(m_low_end_page3, wxID_ANY, "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0, nullptr, wxCB_READONLY); - wxArrayString coarse_block_items; - for (int i = 0; i < 9; i++) - { - coarse_block_items.Add(std::to_string(-20 + (i * 5))); - } - m_optimal_block_coarse->Set(coarse_block_items); - m_coarse_calc_result_text = new wxStaticText(m_low_end_page3, wxID_ANY, ""); - coarse_value_sizer->Add(coarse_value_text, 0, 0); - coarse_value_sizer->Add(m_optimal_block_coarse, 0, 0); - coarse_value_sizer->Add(m_coarse_calc_result_text, 0); - page3_content_sizer->Add(coarse_value_sizer, 0, 0, 0); - page3_content_sizer->AddSpacer(FromDIP(20)); - - auto checkBox_panel = new wxPanel(m_low_end_page3); - auto cb_sizer = new wxBoxSizer(wxHORIZONTAL); - checkBox_panel->SetSizer(cb_sizer); - m_checkBox_skip_calibration = new CheckBox(checkBox_panel); - cb_sizer->Add(m_checkBox_skip_calibration); - - auto cb_text = new wxStaticText(checkBox_panel, wxID_ANY, _L("Skip Calibration2")); - cb_sizer->Add(cb_text); - cb_text->Bind(wxEVT_LEFT_DOWN, [this](auto &) { - m_checkBox_skip_calibration->SetValue(!m_checkBox_skip_calibration->GetValue()); - wxCommandEvent event(wxEVT_TOGGLEBUTTON); - event.SetEventObject(m_checkBox_skip_calibration); - m_checkBox_skip_calibration->GetEventHandler()->ProcessEvent(event); - }); - - page3_content_sizer->Add(checkBox_panel, 0, 0, 0); - - auto save_panel = new wxPanel(m_low_end_page3); - auto save_sizer = new wxBoxSizer(wxVERTICAL); - save_panel->SetSizer(save_sizer); - - auto save_text = new wxStaticText(save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0); - save_text->Wrap(-1); - save_text->SetFont(Label::Head_14); - save_sizer->Add(save_text, 0, 0, 0); - - m_save_name_input1 = new TextInput(save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0); - save_sizer->Add(m_save_name_input1, 0, 0, 0); - m_save_name_input1->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) { - if (!m_save_name_input1->GetTextCtrl()->GetValue().IsEmpty()) - m_save_name = m_save_name_input1->GetTextCtrl()->GetValue().ToStdString(); - else - m_save_name = ""; - }); - - page3_content_sizer->Add(save_panel, 0, 0, 0); - save_panel->Hide(); - - auto page3_prev_btn = m_low_end_page3->get_prev_btn(); - page3_prev_btn->SetLabel(_L("Restart")); - page3_prev_btn->SetButtonType(ButtonType::Restart); - - auto page3_next_btn = m_low_end_page3->get_next_btn(); - page3_next_btn->SetLabel(_L("Calibrate")); - page3_next_btn->SetButtonType(ButtonType::Calibrate); - - m_checkBox_skip_calibration->Bind(wxEVT_TOGGLEBUTTON, [this, save_panel](auto& e) { - if (m_checkBox_skip_calibration->GetValue()) { - m_low_end_page3->get_next_btn()->SetLabel(_L("Save")); - m_low_end_page3->get_next_btn()->SetButtonType(ButtonType::Save); - save_panel->Show(); - } - else { - m_low_end_page3->get_next_btn()->SetLabel(_L("Calibrate")); - m_low_end_page3->get_next_btn()->SetButtonType(ButtonType::Calibrate); - save_panel->Hide(); - m_low_end_page3->get_next_btn()->Bind(wxEVT_BUTTON, &FlowRateWizard::on_fine_tune, this); - } - Layout(); - e.Skip(); - }); - - m_all_pages_sizer->Add(m_low_end_page3, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 4 : print page - m_low_end_page4 = new CalibrationWizardPage(m_scrolledWindow, true); - m_low_end_page4->set_page_title(_L("Flow Rate")); - m_low_end_page4->set_page_type(PageType::FineCalibration); - m_low_end_page4->set_highlight_step_text(PageType::FineCalibration); - - m_low_end_page4->get_prev_btn()->Hide(); - - auto page4_next_btn = m_low_end_page4->get_next_btn(); - page4_next_btn->SetLabel(_L("Next")); - page4_next_btn->SetButtonType(ButtonType::Next); - - auto page4_content_sizer = m_low_end_page4->get_content_vsizer(); - m_low_print_picture2 = new wxStaticBitmap(m_low_end_page4, wxID_ANY, create_scaled_bitmap("flow_rate_calibration_fine", nullptr, 400), wxDefaultPosition, wxDefaultSize, 0); - page4_content_sizer->Add(m_low_print_picture2, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0); - page4_content_sizer->AddSpacer(FromDIP(20)); - m_all_pages_sizer->Add(m_low_end_page4, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 5 : save fine result - m_low_end_page5 = create_save_page(); - m_low_end_page5->set_page_title(_L("Flow Rate")); - m_all_pages_sizer->Add(m_low_end_page5, 1, wxEXPAND | wxALL, FromDIP(25)); - - // link page - m_page2->chain(m_low_end_page3)->chain(m_low_end_page4)->chain(m_low_end_page5); - show_page(m_curr_page); - - m_optimal_block_coarse->Bind(wxEVT_COMBOBOX, [this](auto& e) { - if (m_filament_presets.begin()->second) { - DynamicPrintConfig& filament_config = m_filament_presets.begin()->second->config; - auto curr_flow_ratio = filament_config.option("filament_flow_ratio")->get_at(0); - m_coarse_calc_result = curr_flow_ratio * (100.0f + stof(m_optimal_block_coarse->GetValue().ToStdString())) / 100.0f; - m_coarse_calc_result_text->SetLabel(wxString::Format(_L("flow ratio : %s "), std::to_string(m_coarse_calc_result))); - } - }); - m_optimal_block_fine->Bind(wxEVT_COMBOBOX, [this](auto& e) { - if (m_filament_presets.begin()->second) { - DynamicPrintConfig& filament_config = m_filament_presets.begin()->second->config; - auto curr_flow_ratio = filament_config.option("filament_flow_ratio")->get_at(0); - m_fine_calc_result = curr_flow_ratio * (100.0f + stof(m_optimal_block_fine->GetValue().ToStdString())) / 100.0f; - m_fine_calc_result_text->SetLabel(wxString::Format(_L("flow ratio : %s "), std::to_string(m_fine_calc_result))); - } - }); -} - -void FlowRateWizard::create_high_end_pages() { - // page 3 : save fine result - m_high_end_page3 = new CalibrationWizardPage(m_scrolledWindow, false); - m_high_end_page3->set_page_title(_L("Flow Rate")); - m_high_end_page3->set_page_type(PageType::Save); - m_high_end_page3->set_highlight_step_text(PageType::Save); - - auto high_end_page3_content_sizer = m_high_end_page3->get_content_vsizer(); - auto complete_text_panel = new wxPanel(m_high_end_page3, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL); - auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("We found the best flow ratio for you")); - complete_text->SetFont(Label::Head_14); - complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER); - complete_text_panel->SetSizer(complete_text_sizer); - high_end_page3_content_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0); - - high_end_page3_content_sizer->AddSpacer(FromDIP(20)); - - m_grid_panel = new wxPanel(m_high_end_page3, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - high_end_page3_content_sizer->Add(m_grid_panel, 0, wxALIGN_CENTER); - - auto high_end_page3_prev_btn = m_high_end_page3->get_prev_btn(); - high_end_page3_prev_btn->SetLabel(_L("Restart")); - high_end_page3_prev_btn->SetButtonType(ButtonType::Restart); - - auto high_end_page3_next_btn = m_high_end_page3->get_next_btn(); - high_end_page3_next_btn->SetLabel(_L("Save")); - high_end_page3_next_btn->SetButtonType(ButtonType::Save); - - m_all_pages_sizer->Add(m_high_end_page3, 1, wxEXPAND | wxALL, FromDIP(25)); - - m_high_end_page3->Bind(wxEVT_SHOW, [this](auto&) { - sync_save_page_data(); - }); - // link page - m_page2->chain(m_high_end_page3); - show_page(m_curr_page); -} - -CalibrationWizardPage* FlowRateWizard::create_start_page() -{ - auto page = new CalibrationWizardPage(m_scrolledWindow); - page->set_page_type(PageType::Start); - page->set_highlight_step_text(PageType::Start); - auto page_content_sizer = page->get_content_vsizer(); - - auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Flow Rate Calibration")); - when_title->SetFont(Label::Head_14); - when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_title); - auto when_text = new wxStaticText(page, wxID_ANY, _L("Over-extrusion or under extrusion")); - when_text->SetFont(Label::Body_14); - when_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto recommend_title = new wxStaticText(page, wxID_ANY, _L("Flow Rate calibration is recommended when you print with:")); - recommend_title->SetFont(Label::Head_14); - recommend_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(recommend_title); - auto recommend_text1 = new wxStaticText(page, wxID_ANY, _L("material with significant thermal shrinkage/expansion, such as...")); - recommend_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - recommend_text1->SetFont(Label::Body_14); - page_content_sizer->Add(recommend_text1); - auto recommend_text2 = new wxStaticText(page, wxID_ANY, _L("materials with inaccurate filament diameter")); - recommend_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - recommend_text2->SetFont(Label::Body_14); - page_content_sizer->Add(recommend_text2); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL); - auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap1->SetMinSize(wxSize(560, 450)); - bitmap1->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap1, 0, wxALL, 0); - bitmap_sizer->AddSpacer(FromDIP(20)); - auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap2->SetMinSize(wxSize(560, 450)); - bitmap2->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap2, 0, wxALL, 0); - page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki")); //todo set wiki url - wiki->SetFont(Label::Head_14); - wiki->SetForegroundColour({ 0, 88, 220 }); - wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_HAND); - }); - wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_ARROW); - }); - wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { - if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url); - }); - page_content_sizer->Add(wiki, 0); - - - page->get_prev_btn()->Hide(); - - auto page_next_btn = page->get_next_btn(); - page_next_btn->SetLabel(_L("Start")); - page_next_btn->SetButtonType(ButtonType::Start); - - return page; } void FlowRateWizard::create_pages() { - // page 0 : start page - m_page0 = create_start_page(); - m_page0->set_page_title(_L("Flow Rate")); - m_all_pages_sizer->Add(m_page0, 1, wxEXPAND | wxALL, FromDIP(25)); + start_step = new CalibrationWizardPageStep(new CalibrationFlowRateStartPage(m_scrolledWindow)); + preset_step = new CalibrationWizardPageStep(new CalibrationPresetPage(m_scrolledWindow, m_mode, false)); - // page 1 : preset page - m_page1 = create_presets_page(false); - m_page1->set_page_title(_L("Flow Rate")); + // manual + cali_coarse_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode, CaliPageType::CALI_PAGE_CALI)); + coarse_save_step = new CalibrationWizardPageStep(new CalibrationFlowCoarseSavePage(m_scrolledWindow)); + cali_fine_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode, CaliPageType::CALI_PAGE_FINE_CALI)); + fine_save_step = new CalibrationWizardPageStep(new CalibrationFlowFineSavePage(m_scrolledWindow)); + + // auto + cali_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode)); + save_step = new CalibrationWizardPageStep(new CalibrationFlowX1SavePage(m_scrolledWindow)); - // Hide - { - auto page1_content_sizer = m_page1->get_content_vsizer(); - m_choose_step_panel = new wxPanel(m_page1); - auto choose_step_sizer = new wxBoxSizer(wxVERTICAL); - m_choose_step_panel->SetSizer(choose_step_sizer); - m_complete_radioBox = new wxRadioButton(m_choose_step_panel, wxID_ANY, _L("Complete Calibration")); - m_complete_radioBox->SetValue(true); - choose_step_sizer->Add(m_complete_radioBox); - choose_step_sizer->AddSpacer(FromDIP(10)); - m_fine_radioBox = new wxRadioButton(m_choose_step_panel, wxID_ANY, _L("Fine Calibration based on flow ratio")); - choose_step_sizer->Add(m_fine_radioBox); - choose_step_sizer->AddSpacer(FromDIP(10)); - TextInput* flow_ratio_input = new TextInput(m_choose_step_panel, wxEmptyString,"", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); - flow_ratio_input->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - float default_flow_ratio = 1.0f; - auto flow_ratio_str = wxString::Format("%.3f", default_flow_ratio); - flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str); - flow_ratio_input->Hide(); - choose_step_sizer->Add(flow_ratio_input, 0, wxLEFT, FromDIP(18)); - flow_ratio_input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, flow_ratio_input](auto& e) { - float flow_ratio = 0.0f; - validate_input_flow_ratio(flow_ratio_input->GetTextCtrl()->GetValue(), &flow_ratio); - auto flow_ratio_str = wxString::Format("%.3f", flow_ratio); - flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str); - m_coarse_calc_result = flow_ratio; - }); - flow_ratio_input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, flow_ratio_input](auto& e) { - float flow_ratio = 0.0f; - validate_input_flow_ratio(flow_ratio_input->GetTextCtrl()->GetValue(), &flow_ratio); - auto flow_ratio_str = wxString::Format("%.3f", flow_ratio); - flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str); - m_coarse_calc_result = flow_ratio; - e.Skip(); - }); - m_page1->Bind(wxEVT_LEFT_DOWN, [this](auto&e) { - m_page1->SetFocusIgnoringChildren(); - }); - m_complete_radioBox->Bind(wxEVT_RADIOBUTTON, [this, flow_ratio_input](auto& e) { - flow_ratio_input->Show(false); - this->Layout(); - }); - m_fine_radioBox->Bind(wxEVT_RADIOBUTTON, [this, flow_ratio_input](auto& e) { - flow_ratio_input->Show(); - this->Layout(); - }); + m_all_pages_sizer->Add(start_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(preset_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(cali_coarse_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(coarse_save_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(cali_fine_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(fine_save_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); - page1_content_sizer->AddSpacer(PRESET_GAP); - page1_content_sizer->Add(m_choose_step_panel, 0); + m_all_pages_sizer->Add(cali_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(save_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + + m_page_steps.push_back(start_step); + m_page_steps.push_back(preset_step); + m_page_steps.push_back(cali_coarse_step); + m_page_steps.push_back(coarse_save_step); + m_page_steps.push_back(cali_fine_step); + m_page_steps.push_back(fine_save_step); + + //m_page_steps.push_back(cali_step); + //m_page_steps.push_back(save_step); + + for (int i = 0; i < m_page_steps.size() - 1; i++) { + m_page_steps[i]->chain(m_page_steps[i + 1]); } - // Hide - m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 2 : print page - m_page2 = create_print_page(); - m_page2->set_page_title(_L("Flow Rate")); - m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25)); - - m_page0->chain(m_page1)->chain(m_page2); - m_first_page = m_page0; - m_curr_page = m_page0; - show_page(m_curr_page); - - create_low_end_pages(); -} - -void FlowRateWizard::request_calib_result() { - - if (is_high_end_type(curr_obj)) { - if (is_first_time_get_result) { - curr_obj->has_get_flow_ratio_result = false; - CalibUtils::emit_get_flow_ratio_calib_results(curr_obj->nozzle_diameter); - is_first_time_get_result = false; - } - if (curr_obj->has_get_flow_ratio_result) { - if (!has_get_result) { - CalibUtils::get_flow_ratio_calib_results(m_calib_results); - if (m_calib_results.size() > 0) { - has_get_result = true; - sync_save_page_data(); - } - } - } + // hide all pages + cali_step->page->Hide(); + save_step->page->Hide(); + for (int i = 0; i < m_page_steps.size(); i++) { + m_page_steps[i]->page->Hide(); + m_page_steps[i]->page->Bind(EVT_CALI_ACTION, &FlowRateWizard::on_cali_action, this); } + + + cali_step->page->Bind(EVT_CALI_ACTION, &FlowRateWizard::on_cali_action, this); + save_step->page->Bind(EVT_CALI_ACTION, &FlowRateWizard::on_cali_action, this); + + if (!m_page_steps.empty()) + show_step(m_page_steps.front()); + + set_cali_method(CalibrationMethod::CALI_METHOD_MANUAL); } -void FlowRateWizard::sync_save_page_data() { - m_high_end_save_names.clear(); - m_grid_panel->DestroyChildren(); - wxBoxSizer* grid_sizer = new wxBoxSizer(wxHORIZONTAL); - const int COLUMN_GAP = FromDIP(50); - const int ROW_GAP = FromDIP(30); - wxBoxSizer* left_title_sizer = new wxBoxSizer(wxVERTICAL); - left_title_sizer->AddSpacer(FromDIP(49)); - auto flow_ratio_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Flow Ratio"), wxDefaultPosition, wxDefaultSize, 0); - flow_ratio_title->SetFont(Label::Head_14); - left_title_sizer->Add(flow_ratio_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - auto brand_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0); - brand_title->SetFont(Label::Head_14); - left_title_sizer->Add(brand_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - grid_sizer->Add(left_title_sizer); - grid_sizer->AddSpacer(COLUMN_GAP); - - FilamentComboBoxList fcb_list = get_selected_filament_comboBox(); - for (auto& fcb : fcb_list) { - bool result_failed = false; - auto it_result = std::find_if(m_calib_results.begin(), m_calib_results.end(), [fcb](auto& calib_result) { - return calib_result.tray_id == fcb->get_tray_id(); - }); - if (it_result != m_calib_results.end()) { - result_failed = false; - } - else { - result_failed = true; - } - int index = it_result - m_calib_results.begin(); - - wxBoxSizer* column_data_sizer = new wxBoxSizer(wxVERTICAL); - auto tray_title = new wxStaticText(m_grid_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0); - tray_title->SetFont(Label::Head_14); - tray_title->SetLabel(fcb->get_tray_name()); - column_data_sizer->Add(tray_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - - auto flow_ratio_value = new TextInput(m_grid_panel, NA_STR, "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_PROCESS_ENTER); - auto flow_ratio_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); - flow_ratio_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - if (!result_failed) { - auto flow_ratio_str = wxString::Format("%.3f", it_result->flow_ratio); - flow_ratio_value->GetTextCtrl()->SetValue(flow_ratio_str); - } - flow_ratio_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, fcb, flow_ratio_value, index](auto& e) { - float flow_ratio = 0.0f; - validate_input_flow_ratio(flow_ratio_value->GetTextCtrl()->GetValue(), &flow_ratio); - auto flow_ratio_str = wxString::Format("%.3f", flow_ratio); - flow_ratio_value->GetTextCtrl()->SetValue(flow_ratio_str); - m_calib_results[index].flow_ratio = flow_ratio; - }); - flow_ratio_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, fcb, flow_ratio_value, index](auto& e) { - float flow_ratio = 0.0f; - validate_input_flow_ratio(flow_ratio_value->GetTextCtrl()->GetValue(), &flow_ratio); - auto flow_ratio_str = wxString::Format("%.3f", flow_ratio); - flow_ratio_value->GetTextCtrl()->SetValue(flow_ratio_str); - m_calib_results[index].flow_ratio = flow_ratio; - e.Skip(); - }); - column_data_sizer->Add(flow_ratio_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - column_data_sizer->Add(flow_ratio_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - - auto save_name_input = new TextInput(m_grid_panel, fcb->GetComboBox()->GetValue() + "-Calibrated", "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_PROCESS_ENTER); - auto save_name_input_failed = new wxStaticText(m_grid_panel, wxID_ANY, " - ", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); - - auto set_edit_mode = [this, flow_ratio_value, flow_ratio_value_failed, save_name_input, save_name_input_failed](std::string str) { - if (str == "normal") { - save_name_input->Show(); - save_name_input_failed->Show(false); - flow_ratio_value->Show(); - flow_ratio_value_failed->Show(false); - } - if (str == "failed") { - save_name_input->Show(false); - save_name_input_failed->Show(); - flow_ratio_value->Show(false); - flow_ratio_value_failed->Show(); - } - m_grid_panel->Layout(); - m_grid_panel->Update(); - }; - - if (!result_failed) { - m_high_end_save_names[fcb->get_tray_id()] = save_name_input->GetTextCtrl()->GetValue().ToStdString(); - save_name_input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, fcb, save_name_input](auto& e) { - m_high_end_save_names[fcb->get_tray_id()] = save_name_input->GetTextCtrl()->GetValue().ToStdString(); - }); - save_name_input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, fcb, save_name_input](auto& e) { - m_high_end_save_names[fcb->get_tray_id()] = save_name_input->GetTextCtrl()->GetValue().ToStdString(); - e.Skip(); - }); - set_edit_mode("normal"); - } - else { - set_edit_mode("failed"); - } - column_data_sizer->Add(save_name_input, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - column_data_sizer->Add(save_name_input_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); - - grid_sizer->Add(column_data_sizer); - grid_sizer->AddSpacer(COLUMN_GAP); - } - m_grid_panel->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - m_grid_panel->SetFocusIgnoringChildren(); - }); - m_grid_panel->SetSizer(grid_sizer, true); - Layout(); -} - -void FlowRateWizard::switch_pages(SimpleEvent& evt) { - if (curr_obj) { - if (is_high_end_type(curr_obj)) { - m_choose_step_panel->Hide(); - } - else { - m_choose_step_panel->Show(); - } - - if (is_high_end_type(curr_obj)) - { - if (m_low_end_page3) { - m_low_end_page3->Destroy(); - m_low_end_page3 = nullptr; - } - if (m_low_end_page4) { - m_low_end_page4->Destroy(); - m_low_end_page4 = nullptr; - } - if (m_low_end_page5) { - m_low_end_page5->Destroy(); - m_low_end_page5 = nullptr; - } - if (m_high_end_page3) { - m_high_end_page3->Destroy(); - m_high_end_page3 = nullptr; - } - - create_high_end_pages(); - - sync_save_page_data(); // CALIBRATION_DEBUG - } - else - { - if (m_high_end_page3) { - m_high_end_page3->Destroy(); - m_high_end_page3 = nullptr; - } - if (m_low_end_page3) { - m_low_end_page3->Destroy(); - m_low_end_page3 = nullptr; - } - if (m_low_end_page4) { - m_low_end_page4->Destroy(); - m_low_end_page4 = nullptr; - } - if (m_low_end_page5) { - m_low_end_page5->Destroy(); - m_low_end_page5 = nullptr; - } - - create_low_end_pages(); - } - Layout(); - } -} - -void FlowRateWizard::change_ams_select_mode() { - //if (is_high_end_type(curr_obj)) { - // set_ams_select_mode(FSMCheckBoxMode); - //} - //else { - // set_ams_select_mode(FSMRadioMode); - //} - set_ams_select_mode(FSMRadioMode); -} - -bool FlowRateWizard::start_calibration(std::vector tray_ids) +void FlowRateWizard::on_cali_action(wxCommandEvent& evt) { - int nozzle_temp = -1; - int bed_temp = -1; - float max_volumetric_speed = -1; - - if (m_nozzle_temp->GetTextCtrl()->GetValue().IsEmpty() || - m_bed_temp->GetTextCtrl()->GetValue().IsEmpty() || - m_max_volumetric_speed->GetTextCtrl()->GetValue().IsEmpty()) - return false; - nozzle_temp = stoi(m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString()); - bed_temp = stoi(m_bed_temp->GetTextCtrl()->GetValue().ToStdString()); - max_volumetric_speed = stof(m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString()); - - if (bed_temp < 0 || nozzle_temp < 0 || max_volumetric_speed < 0) { - MessageDialog msg_dlg(nullptr, _L("Make sure bed_temp > 0 \nnozzle_temp > 0\nmax_volumetric_speed > 0"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + CaliPageActionType action = static_cast(evt.GetInt()); + if (action == CaliPageActionType::CALI_ACTION_MANAGE_RESULT) { + ; } + else if (action == CaliPageActionType::CALI_ACTION_MANUAL_CALI) { + preset_step->page->set_cali_filament_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE); + this->set_cali_method(CalibrationMethod::CALI_METHOD_MANUAL); + preset_step->page->on_device_connected(curr_obj); + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_AUTO_CALI) { + CalibrationFilamentMode fila_mode = get_cali_filament_mode(curr_obj, m_mode); + preset_step->page->set_cali_filament_mode(fila_mode); + this->set_cali_method(CalibrationMethod::CALI_METHOD_AUTO); + preset_step->page->on_device_connected(curr_obj); + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_NEXT) { + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_PREV) { + show_step(m_curr_step->prev); + } + else if (action == CaliPageActionType::CALI_ACTION_CALI) { + if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { + on_cali_start(); + // show next step when print job is sending finished. + show_step(m_curr_step->next); + } + else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { + CaliPresetStage stage = CaliPresetStage::CALI_MANULA_STAGE_NONE; + float cali_value = 0.0f; + static_cast(preset_step->page)->get_cali_stage(stage, cali_value); + on_cali_start(stage, cali_value); + if (stage == CaliPresetStage::CALI_MANUAL_STAGE_2) { + // set next step page + m_curr_step->chain(cali_fine_step); + } + show_step(m_curr_step->next); + } + else { + on_cali_start(); + show_step(m_curr_step->next); + } + } + else if (action == CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2) { + if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { + float new_flow_ratio = 0.0f; + wxString temp_name = ""; // unused + auto coarse_save_page = static_cast(m_curr_step->page); + if (!coarse_save_page->get_result(&new_flow_ratio, &temp_name)) { + return; + } + on_cali_start(CaliPresetStage::CALI_MANUAL_STAGE_2, new_flow_ratio); + show_step(m_curr_step->next); + } + } + else if (action == CaliPageActionType::CALI_ACTION_FLOW_SAVE) { + on_cali_save(); + } + else if (action == CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE) { + auto coarse_save_page = static_cast(coarse_save_step->page); + if (coarse_save_page->is_skip_fine_calibration()) { + on_cali_save(); + } + } + else if (action == CaliPageActionType::CALI_ACTION_FLOW_FINE_SAVE) { + on_cali_save(); + } + else if (action == CaliPageActionType::CALI_ACTION_GO_HOME) { + on_cali_go_home(); + } +} - if (is_high_end_type(curr_obj)) { - m_calib_results.clear(); +void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value) +{ + if (!curr_obj) return; + + //clean flow rate result + curr_obj->flow_ratio_results.clear(); + + float nozzle_dia = 0.4; + std::string setting_id; + BedType plate_type = BedType::btDefault; + + CalibrationPresetPage* preset_page = (static_cast(preset_step->page)); + + preset_page->get_preset_info(nozzle_dia, plate_type); + + std::map selected_filaments = preset_page->get_selected_filaments(); + + if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { X1CCalibInfos calib_infos; - for (int tray_id : tray_ids) { - if (m_filament_presets.find(tray_id) == m_filament_presets.end()) - return false; + for (auto& item : selected_filaments) { + int nozzle_temp = -1; + int bed_temp = -1; + float max_volumetric_speed = -1; + + if (!get_preset_info(item.second->config, plate_type, nozzle_temp, bed_temp, max_volumetric_speed)) { + BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info error"; + } + X1CCalibInfos::X1CCalibInfo calib_info; - calib_info.tray_id = tray_id; - calib_info.nozzle_diameter = dynamic_cast(m_printer_preset->config.option("nozzle_diameter"))->get_at(0); - calib_info.filament_id = m_filament_presets.at(tray_id)->filament_id; - calib_info.setting_id = m_filament_presets.at(tray_id)->setting_id; - calib_info.bed_temp = bed_temp; - calib_info.nozzle_temp = nozzle_temp; + calib_info.tray_id = item.first; + calib_info.nozzle_diameter = nozzle_dia; + calib_info.filament_id = item.second->filament_id; + calib_info.setting_id = item.second->setting_id; + calib_info.bed_temp = bed_temp; + calib_info.nozzle_temp = nozzle_temp; calib_info.max_volumetric_speed = max_volumetric_speed; - calib_info.flow_rate = m_filament_presets.at(tray_id)->config.option("filament_flow_ratio")->get_at(0); calib_infos.calib_datas.push_back(calib_info); } + + wxString wx_err_string; std::string error_message; CalibUtils::calib_flowrate_X1C(calib_infos, error_message); - if (!error_message.empty()) { - MessageDialog msg_dlg(nullptr, error_message, wxEmptyString, wxICON_WARNING | wxOK); + wx_err_string = from_u8(error_message); + if (!wx_err_string.empty()) { + MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); - return false; } - is_first_time_get_result = true; - has_get_result = false; - show_page(get_curr_page()->get_next_page()); - save_to_printer_calib_info(PageType::Calibration); - return true; } - else { - int pass = -1; - if (m_fine_radioBox->GetValue()) { - m_curr_page = m_low_end_page3; - reset_print_panel_to_page(m_low_end_page4, m_low_end_page4->get_content_vsizer()); - DynamicPrintConfig* filament_config = &m_filament_presets.begin()->second->config; - filament_config->set_key_value("filament_flow_ratio", new ConfigOptionFloats{ m_coarse_calc_result }); - } - if (get_curr_page() == m_page1) { - pass = 1; - } - else if (get_curr_page() == m_low_end_page3) - pass = 2; - else - return false; - + else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { CalibInfo calib_info; - calib_info.dev_id = curr_obj->dev_id; - calib_info.select_ams = "[" + std::to_string(tray_ids[0]) + "]"; - calib_info.process_bar = m_send_progress_bar; - calib_info.bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1); - calib_info.printer_prest = m_printer_preset; - calib_info.filament_prest = m_filament_presets.begin()->second; - calib_info.print_prest = m_print_preset; + calib_info.dev_id = curr_obj->dev_id; + Preset* temp_filament_preset = nullptr; + int cali_stage = -1; + wxString wx_err_string; - std::string error_message; - CalibUtils::calib_flowrate(pass, calib_info, error_message); - if (!error_message.empty()) { - MessageDialog msg_dlg(nullptr, error_message, wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + if (!selected_filaments.empty()) { + calib_info.select_ams = "[" + std::to_string(selected_filaments.begin()->first) + "]"; + Preset* preset = selected_filaments.begin()->second; + temp_filament_preset = new Preset(preset->type, preset->name + "_temp"); + temp_filament_preset->config = preset->config; + + calib_info.bed_type = plate_type; + calib_info.process_bar = preset_page->get_sending_progress_bar(); + calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, nozzle_dia); + calib_info.print_prest = preset_page->get_print_preset(); + calib_info.params.mode = CalibMode::Calib_Flow_Rate; + + if (stage == CaliPresetStage::CALI_MANUAL_STAGE_1) { + cali_stage = 1; + } + else if (stage == CaliPresetStage::CALI_MANUAL_STAGE_2) { + cali_stage = 2; + temp_filament_preset->config.set_key_value("filament_flow_ratio", new ConfigOptionFloats{ cali_value }); + } + calib_info.filament_prest = temp_filament_preset; + + if (cali_stage > 0) { + std::string error_message; + CalibUtils::calib_flowrate(cali_stage, calib_info, error_message); + wx_err_string = from_u8(error_message); + } + else { + wx_err_string = _L("Internal Error") + wxString(": Invalid calibration stage"); + } + } else { + wx_err_string = _L("Please select at least one filament for calibration"); } - show_send_progress_bar(true); - if (pass == 1) - save_to_printer_calib_info(PageType::Calibration); - else if(pass == 2) - save_to_printer_calib_info(PageType::FineCalibration); - return true; + + if (!wx_err_string.empty()) { + MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } + preset_page->on_cali_start_job(); + if (temp_filament_preset) + delete temp_filament_preset; + } else { + assert(false); } } -bool FlowRateWizard::save_calibration_result() +void FlowRateWizard::on_cali_save() { - if (is_high_end_type(curr_obj)) { - for (auto& result : m_calib_results) { - if (result.flow_ratio <= 0 || result.flow_ratio >= 2) { - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + if (curr_obj) { + if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { + std::vector> new_results; + auto save_page = static_cast(save_step->page); + if (!save_page->get_result(new_results)) { + return; } - } - for (int i = 0; i < m_calib_results.size(); i++) { - auto it = m_high_end_save_names.find(m_calib_results[i].tray_id); - if (it != m_high_end_save_names.end() && !it->second.empty()) { - if (m_filament_presets.find(m_calib_results[i].tray_id) == m_filament_presets.end()) - return false; + + std::string old_preset_name; + CalibrationPresetPage* preset_page = (static_cast(preset_step->page)); + std::map selected_filaments = preset_page->get_selected_filaments(); + old_preset_name = selected_filaments.begin()->second->name; + + for (int i = 0; i < new_results.size(); i++) { + std::map key_value_map; + key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloats{ new_results[i].second })); std::string message; - if(save_presets(m_filament_presets.at(m_calib_results[i].tray_id), "filament_flow_ratio", new ConfigOptionFloats{ m_calib_results[i].flow_ratio }, it->second, message)) - return true; - else { - MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + if (!save_preset(old_preset_name, new_results[i].first.ToStdString(), key_value_map, message)) { + MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK); + error_msg_dlg.ShowModal(); } } - if (it != m_high_end_save_names.end() && it->second.empty()) { - MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + MessageDialog msg_dlg(nullptr, _L("Flow rate calibration result has been saved to preset"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } + else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { + float new_flow_ratio = 0.0f; + wxString new_preset_name = ""; + if(m_curr_step->page->get_page_type() == CaliPageType::CALI_PAGE_COARSE_SAVE) + { + auto coarse_save_page = static_cast(m_curr_step->page); + if (!coarse_save_page->get_result(&new_flow_ratio, &new_preset_name)) { + return; + } } - } - return false; - } - else { - bool valid = true; - float result_value; - if (m_fine_radioBox->GetValue()) { - result_value = m_fine_calc_result; - if (m_optimal_block_fine->GetValue().IsEmpty()) - valid = false; - } - else { - if (m_checkBox_skip_calibration->GetValue()) { - result_value = m_coarse_calc_result; - if (m_optimal_block_coarse->GetValue().IsEmpty()) - valid = false; + else if (m_curr_step->page->get_page_type() == CaliPageType::CALI_PAGE_FINE_SAVE) + { + auto fine_save_page = static_cast(m_curr_step->page); + if (!fine_save_page->get_result(&new_flow_ratio, &new_preset_name)) { + return; + } } else { - result_value = m_fine_calc_result; - if (m_optimal_block_coarse->GetValue().IsEmpty() || m_optimal_block_fine->GetValue().IsEmpty()) - valid = false; + return; + } + std::string old_preset_name; + CalibrationPresetPage* preset_page = (static_cast(preset_step->page)); + std::map selected_filaments = preset_page->get_selected_filaments(); + old_preset_name = selected_filaments.begin()->second->name; + + std::map key_value_map; + key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloats{ new_flow_ratio })); + + std::string message; + if (!save_preset(old_preset_name, new_preset_name.ToStdString(), key_value_map, message)) { + MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK); + error_msg_dlg.ShowModal(); + } + + MessageDialog msg_dlg(nullptr, _L("Flow rate calibration result has been saved to preset"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } + else { + assert(false); + } + } +} + +void FlowRateWizard::update(MachineObject* obj) +{ + CalibrationWizard::update(obj); +} + +void FlowRateWizard::on_device_connected(MachineObject* obj) +{ + CalibrationWizard::on_device_connected(obj); + + CalibrationMethod method; + int cali_stage = 0; + CalibMode obj_cali_mode = get_obj_calibration_mode(obj, method, cali_stage); + + // show cali step when obj is in pa calibration + if (obj) { + this->set_cali_method(method); + if (obj_cali_mode == m_mode) { + if (obj->is_in_printing() || obj->is_printing_finished()) { + if (method == CalibrationMethod::CALI_METHOD_MANUAL) { + if (cali_stage == 1) { + if (m_curr_step != cali_coarse_step) + show_step(cali_coarse_step); + } + else if (cali_stage == 2) { + if (m_curr_step != cali_fine_step) { + show_step(cali_fine_step); + } + } + else + show_step(cali_coarse_step); + } + else if (method == CalibrationMethod::CALI_METHOD_AUTO) { + if (m_curr_step != cali_step) + show_step(cali_step); + } } } - if (!valid) - { - MessageDialog msg_dlg(nullptr, _L("Choose a block with smoothest top surface."), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - if (m_save_name.empty()) { - MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - std::string message; - if (!save_presets(m_filament_presets.begin()->second, "filament_flow_ratio", new ConfigOptionFloats{ result_value }, m_save_name, message)) { - MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - reset_reuse_panels(); - return true; } - return false; } -bool FlowRateWizard::recommend_input_value() +void FlowRateWizard::set_cali_method(CalibrationMethod method) { - return CalibrationWizard::recommend_input_value(); -} + m_cali_method = method; + if (method == CalibrationMethod::CALI_METHOD_AUTO) { + m_page_steps.clear(); + m_page_steps.push_back(start_step); + m_page_steps.push_back(preset_step); + m_page_steps.push_back(cali_step); + m_page_steps.push_back(save_step); -void FlowRateWizard::reset_reuse_panels() { - reset_send_progress_to_page(m_page1, m_page1->get_btn_hsizer()); - reset_print_panel_to_page(m_page2, m_page2->get_content_vsizer()); -} - -void FlowRateWizard::reset_print_panel_to_page(CalibrationWizardPage* page, wxBoxSizer* sizer) -{ - m_btn_next = page->get_next_btn(); - m_btn_recali = page->get_prev_btn(); - m_print_panel->Reparent(page); - sizer->Remove(sizer->GetItemCount() - 1); - sizer->Add(m_print_panel, 0, wxALIGN_CENTER, 0); - Layout(); -} - -void FlowRateWizard::reset_send_progress_to_page(CalibrationWizardPage* page, wxBoxSizer* sizer) -{ - m_send_progress_panel->Reparent(page); - sizer->Remove(1); - sizer->Insert(1, m_send_progress_panel, 0, wxALIGN_CENTER, 0); - Layout(); -} - -void FlowRateWizard::on_fine_tune(wxCommandEvent& e) { - if (m_optimal_block_coarse->GetValue().IsEmpty()){ - MessageDialog msg_dlg(nullptr, _L("Choose a block with smoothest top surface."), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return; + for (int i = 0; i < m_page_steps.size() - 1; i++) { + m_page_steps[i]->chain(m_page_steps[i + 1]); + } } + else if (method == CalibrationMethod::CALI_METHOD_MANUAL) { + m_page_steps.clear(); + m_page_steps.push_back(start_step); + m_page_steps.push_back(preset_step); + m_page_steps.push_back(cali_coarse_step); + m_page_steps.push_back(coarse_save_step); + m_page_steps.push_back(cali_fine_step); + m_page_steps.push_back(fine_save_step); - DynamicPrintConfig& filament_config = m_filament_presets.begin()->second->config; - filament_config.set_key_value("filament_flow_ratio", new ConfigOptionFloats{ m_coarse_calc_result }); - - reset_send_progress_to_page(m_low_end_page3, m_low_end_page3->get_btn_hsizer()); - - reset_print_panel_to_page(m_low_end_page4, m_low_end_page4->get_content_vsizer()); - - e.Skip(); + for (int i = 0; i < m_page_steps.size() - 1; i++) { + m_page_steps[i]->chain(m_page_steps[i + 1]); + } + } + else { + assert(false); + } + CalibrationWizard::set_cali_method(method); } -void FlowRateWizard::init_bitmaps() +void FlowRateWizard::on_cali_job_finished() { - m_print_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration", nullptr, 400)); - m_low_record_picture1->SetMinSize(wxSize(560, 450)); - m_low_record_picture1->SetBackgroundColour(*wxBLACK); - m_low_print_picture2->SetBitmap(create_scaled_bitmap("flow_rate_calibration_fine", nullptr, 400)); - m_low_record_picture2->SetMinSize(wxSize(560, 450)); - m_low_record_picture2->SetBackgroundColour(*wxBLACK); + static_cast(preset_step->page)->on_cali_finished_job(); + + show_step(m_curr_step->next); } + MaxVolumetricSpeedWizard::MaxVolumetricSpeedWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : CalibrationWizard(parent, CalibMode::Calib_Vol_speed_Tower, id, pos, size, style) { create_pages(); - init_bitmaps(); - m_optimal_max_speed->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) { - if (!m_optimal_max_speed->GetTextCtrl()->GetValue().IsEmpty()) { - m_calc_result = stof(m_optimal_max_speed->GetTextCtrl()->GetValue().ToStdString()); // todo determine to select an object or input target value directly - m_calc_result_text->SetLabel(wxString::Format(_L("max volumetric speed : %s "), std::to_string(m_calc_result))); - } - }); -} - -void MaxVolumetricSpeedWizard::set_save_name() { - if (m_filament_presets.begin()->second) { - m_save_name = m_filament_presets.begin()->second->alias + "-Calibrated"; - } - else { m_save_name = ""; } - m_save_name_input->GetTextCtrl()->SetValue(m_save_name); -} - -CalibrationWizardPage* MaxVolumetricSpeedWizard::create_start_page() -{ - auto page = new CalibrationWizardPage(m_scrolledWindow); - page->set_page_type(PageType::Start); - page->set_highlight_step_text(PageType::Start); - auto page_content_sizer = page->get_content_vsizer(); - - auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Max Volumetric Speed Calibration")); - when_title->SetFont(Label::Head_14); - when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_title); - auto when_text = new wxStaticText(page, wxID_ANY, _L("Under-extrusion")); - when_text->SetFont(Label::Body_14); - when_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto explain_title = new wxStaticText(page, wxID_ANY, _L("What will happen if the Max Volumetric Speed is not set up properly")); - explain_title->SetFont(Label::Head_14); - explain_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(explain_title); - auto explain_text1 = new wxStaticText(page, wxID_ANY, _L("Under-extrusion: If the value is set too high, under-extrusion will happen and cause poor apperance on the printed model")); - explain_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - explain_text1->SetFont(Label::Body_14); - page_content_sizer->Add(explain_text1); - auto explain_text2 = new wxStaticText(page, wxID_ANY, _L("Print speed is limited: If the value is set too low, the print speed will be limited and make the print time longer. Take the model on the right picture for example. max volumetric speed [n] mm^3/s costs [x] minutes. max volumetric speed [m] mm^3/s costs [y] minutes")); - explain_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - explain_text2->SetFont(Label::Body_14); - page_content_sizer->Add(explain_text2); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL); - auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap1->SetMinSize(wxSize(560, 450)); - bitmap1->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap1, 0, wxALL, 0); - bitmap_sizer->AddSpacer(FromDIP(20)); - auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap2->SetMinSize(wxSize(560, 450)); - bitmap2->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap2, 0, wxALL, 0); - page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki")); - wiki->SetFont(Label::Head_14); - wiki->SetForegroundColour({ 0, 88, 220 }); - wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_HAND); - }); - wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_ARROW); - }); - wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { - if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url); - }); - page_content_sizer->Add(wiki, 0); - - page->get_prev_btn()->Hide(); - - auto page_next_btn = page->get_next_btn(); - page_next_btn->SetLabel(_L("Start")); - page_next_btn->SetButtonType(ButtonType::Start); - - return page; -} - -void MaxVolumetricSpeedWizard::create_save_panel_content(wxBoxSizer* sizer) -{ - auto complete_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0); - complete_text->SetFont(::Label::Head_14); - complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - sizer->Add(complete_text, 0, 0, 0); - - sizer->AddSpacer(FromDIP(20)); - - m_record_picture = new wxStaticBitmap(m_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0); - - sizer->AddSpacer(FromDIP(20)); - - auto value_sizer = new wxBoxSizer(wxVERTICAL); - auto value_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Input Value"), wxDefaultPosition, wxDefaultSize, 0); - value_text->SetFont(Label::Head_14); - value_text->Wrap(-1); - m_optimal_max_speed = new TextInput(m_save_panel, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, wxTE_PROCESS_ENTER); - m_optimal_max_speed->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - m_calc_result_text = new wxStaticText(m_save_panel, wxID_ANY, ""); - value_sizer->Add(value_text, 0, 0, 0); - value_sizer->Add(m_optimal_max_speed, 0); - value_sizer->Add(m_calc_result_text, 0); - sizer->Add(value_sizer, 0, 0); - - sizer->AddSpacer(FromDIP(20)); - - auto save_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0); - save_text->Wrap(-1); - save_text->SetFont(Label::Head_14); - sizer->Add(save_text, 0, 0, 0); - - m_save_name_input = new TextInput(m_save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0); - sizer->Add(m_save_name_input, 0, 0, 0); - m_save_name_input->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) { - if (!m_save_name_input->GetTextCtrl()->GetValue().IsEmpty()) - m_save_name = m_save_name_input->GetTextCtrl()->GetValue().ToStdString(); - else - m_save_name = ""; - }); } void MaxVolumetricSpeedWizard::create_pages() { - // page 0 : start page - m_page0 = create_start_page(); - m_page0->set_page_title(_L("Max Volumetric Speed")); - m_all_pages_sizer->Add(m_page0, 1, wxEXPAND | wxALL, FromDIP(25)); + start_step = new CalibrationWizardPageStep(new CalibrationMaxVolumetricSpeedStartPage(m_scrolledWindow)); + preset_step = new CalibrationWizardPageStep(new MaxVolumetricSpeedPresetPage(m_scrolledWindow, m_mode, true)); - // page 1 : preset page - m_page1 = create_presets_page(true); - m_page1->set_page_title(_L("Max Volumetric Speed")); + // manual + cali_step = new CalibrationWizardPageStep(new CalibrationCaliPage(m_scrolledWindow, m_mode)); + save_step = new CalibrationWizardPageStep(new CalibrationMaxVolumetricSpeedSavePage(m_scrolledWindow)); - m_from_text->SetLabel(_L("From Volumetric Speed")); - m_to_text->SetLabel(_L("To Volumetric Speed")); - m_from_value->SetLabel(_L("mm\u00B3/s")); - m_to_value->SetLabel(_L("mm\u00B3/s")); - m_step->SetLabel(_L("mm\u00B3/s")); - auto step_str = wxString::Format("%1.1f", 0.5f); - m_step->GetTextCtrl()->SetValue(step_str); + m_all_pages_sizer->Add(start_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(preset_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(cali_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); + m_all_pages_sizer->Add(save_step->page, 1, wxEXPAND | wxALL, FromDIP(25)); - m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25)); + m_page_steps.push_back(start_step); + m_page_steps.push_back(preset_step); + m_page_steps.push_back(cali_step); + m_page_steps.push_back(save_step); - // page 2 : print page - m_page2 = create_print_page(); - m_page2->set_page_title(_L("Max Volumetric Speed")); - m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 3 : save page - m_page3 = create_save_page(); - m_page3->set_page_title(_L("Max Volumetric Speed")); - m_all_pages_sizer->Add(m_page3, 1, wxEXPAND | wxALL, FromDIP(25)); - - // link page - m_page0->chain(m_page1)->chain(m_page2)->chain(m_page3); - - m_first_page = m_page0; - m_curr_page = m_page0; - show_page(m_curr_page); -} - -bool MaxVolumetricSpeedWizard::start_calibration(std::vector tray_ids) -{ - Calib_Params params; - m_from_value->GetTextCtrl()->GetValue().ToDouble(¶ms.start); - m_to_value->GetTextCtrl()->GetValue().ToDouble(¶ms.end); - m_step->GetTextCtrl()->GetValue().ToDouble(¶ms.step); - params.mode = CalibMode::Calib_Vol_speed_Tower; - - if (params.start <= 0 || params.step <= 0 || params.end < (params.start + params.step) || params.end > 60) { - MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nFrom > 0\nTo < 60\nStep >= 0\nTo > From + Step"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + for (int i = 0; i < m_page_steps.size() - 1; i++) { + m_page_steps[i]->chain(m_page_steps[i + 1]); } - CalibInfo calib_info; - calib_info.params = params; - calib_info.dev_id = curr_obj->dev_id; - calib_info.select_ams = "[" + std::to_string(tray_ids[0]) + "]"; - calib_info.process_bar = m_send_progress_bar; - calib_info.bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1); - calib_info.printer_prest = m_printer_preset; - calib_info.filament_prest = m_filament_presets.begin()->second; - calib_info.print_prest = m_print_preset; + for (int i = 0; i < m_page_steps.size(); i++) { + m_page_steps[i]->page->Hide(); + m_page_steps[i]->page->Bind(EVT_CALI_ACTION, &MaxVolumetricSpeedWizard::on_cali_action, this); + } + for (auto page_step : m_page_steps) { + page_step->page->Hide(); + } + + if (!m_page_steps.empty()) + show_step(m_page_steps.front()); + return; +} + +void MaxVolumetricSpeedWizard::on_cali_action(wxCommandEvent& evt) +{ + CaliPageActionType action = static_cast(evt.GetInt()); + + if (action == CaliPageActionType::CALI_ACTION_START) { + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_PREV) { + show_step(m_curr_step->prev); + } + else if (action == CaliPageActionType::CALI_ACTION_CALI) { + on_cali_start(); + } + else if (action == CaliPageActionType::CALI_ACTION_NEXT) { + show_step(m_curr_step->next); + } + else if (action == CaliPageActionType::CALI_ACTION_COMMON_SAVE) { + on_cali_save(); + } + else if (action == CaliPageActionType::CALI_ACTION_GO_HOME) { + on_cali_go_home(); + } +} + +void MaxVolumetricSpeedWizard::on_cali_start() +{ + float nozzle_dia = 0.4; + std::string setting_id; + BedType plate_type = BedType::btDefault; + + CalibrationPresetPage *preset_page = (static_cast(preset_step->page)); + + preset_page->get_preset_info(nozzle_dia, plate_type); + + wxArrayString values = preset_page->get_custom_range_values(); + Calib_Params params; + if (values.size() != 3) { + MessageDialog msg_dlg(nullptr, _L("The input value size must be 3."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return; + } + else { + values[0].ToDouble(¶ms.start); + values[1].ToDouble(¶ms.end); + values[2].ToDouble(¶ms.step); + } + params.mode = m_mode; + + std::map selected_filaments = preset_page->get_selected_filaments(); + + CalibInfo calib_info; + calib_info.params = params; + calib_info.dev_id = curr_obj->dev_id; + if (!selected_filaments.empty()) { + calib_info.select_ams = "[" + std::to_string(selected_filaments.begin()->first) + "]"; + calib_info.filament_prest = selected_filaments.begin()->second; + } + + calib_info.bed_type = plate_type; + calib_info.process_bar = preset_page->get_sending_progress_bar(); + calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, nozzle_dia); + calib_info.print_prest = preset_page->get_print_preset(); + + wxString wx_err_string; std::string error_message; CalibUtils::calib_max_vol_speed(calib_info, error_message); - if (!error_message.empty()) { - MessageDialog msg_dlg(nullptr, _L(error_message), wxEmptyString, wxICON_WARNING | wxOK); + wx_err_string = from_u8(error_message); + if (!wx_err_string.empty()) { + MessageDialog msg_dlg(nullptr, wx_err_string, wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); - return false; } - show_send_progress_bar(true); - return true; + + preset_page->on_cali_start_job(); } -bool MaxVolumetricSpeedWizard::save_calibration_result() +void MaxVolumetricSpeedWizard::on_cali_save() { - if (m_optimal_max_speed->GetTextCtrl()->GetValue().IsEmpty()) - { - MessageDialog msg_dlg(nullptr, _L("Input a value."), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + std::string old_preset_name; + std::string new_preset_name; + + CalibrationPresetPage *preset_page = (static_cast(preset_step->page)); + std::map selected_filaments = preset_page->get_selected_filaments(); + if (!selected_filaments.empty()) { + old_preset_name = selected_filaments.begin()->second->name; } - double max_volumetric_speed; - m_optimal_max_speed->GetTextCtrl()->GetValue().ToDouble(&max_volumetric_speed); - if (m_save_name.empty()) { - MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + + double value = 0; + CalibrationMaxVolumetricSpeedSavePage *save_page = (static_cast(save_step->page)); + if (!save_page->get_save_result(value, new_preset_name)) { + return; } + + std::map key_value_map; + key_value_map.insert(std::make_pair("filament_max_volumetric_speed", new ConfigOptionFloats{ value })); + std::string message; - if (!save_presets(m_filament_presets.begin()->second, "filament_max_volumetric_speed", new ConfigOptionFloats{ max_volumetric_speed }, m_save_name, message)) { - MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; + if (!save_preset(old_preset_name, new_preset_name, key_value_map, message)) { + MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK); + error_msg_dlg.ShowModal(); } - return true; } -bool MaxVolumetricSpeedWizard::recommend_input_value() +void MaxVolumetricSpeedWizard::on_cali_job_finished() { - if (!CalibrationWizard::recommend_input_value()) { - m_from_value->GetTextCtrl()->SetValue(wxEmptyString); - m_to_value->GetTextCtrl()->SetValue(wxEmptyString); - m_step->GetTextCtrl()->SetValue(wxEmptyString); - return false; - } - else { - m_from_value->GetTextCtrl()->SetValue("5"); - m_to_value->GetTextCtrl()->SetValue("20"); - auto step_str = wxString::Format("%1.1f", 0.5f); - m_step->GetTextCtrl()->SetValue(step_str); - return true; - } -} + static_cast(preset_step->page)->on_cali_finished_job(); -void MaxVolumetricSpeedWizard::init_bitmaps() + show_step(m_curr_step->next); +} +void MaxVolumetricSpeedWizard::on_device_connected(MachineObject *obj) { - m_print_picture->SetBitmap(create_scaled_bitmap("max_volumetric_speed_calibration", nullptr, 400)); - m_record_picture->SetMinSize(wxSize(500, 400)); - m_record_picture->SetBackgroundColour(*wxBLACK); -} + CalibrationWizard::on_device_connected(obj); -TemperatureWizard::TemperatureWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) - : CalibrationWizard(parent, CalibMode::Calib_Temp_Tower, id, pos, size, style) -{ - create_pages(); - init_bitmaps(); -} + CalibrationMethod method; + int cali_stage = 0; + CalibMode obj_cali_mode = get_obj_calibration_mode(obj, method, cali_stage); -void TemperatureWizard::set_save_name() { - if (m_filament_presets.begin()->second) { - m_save_name = m_filament_presets.begin()->second->alias + "-Calibrated"; - } - else { m_save_name = ""; } - m_save_name_input->GetTextCtrl()->SetValue(m_save_name); -} - -CalibrationWizardPage* TemperatureWizard::create_start_page() -{ - auto page = new CalibrationWizardPage(m_scrolledWindow); - page->set_page_type(PageType::Start); - page->set_highlight_step_text(PageType::Start); - auto page_content_sizer = page->get_content_vsizer(); - - auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Temperature Calibration")); - when_title->SetFont(Label::Head_14); - when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_title); - auto when_text1 = new wxStaticText(page, wxID_ANY, _L("Model stringing")); - when_text1->SetFont(Label::Body_14); - when_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text1); - auto when_text2 = new wxStaticText(page, wxID_ANY, _L("Layer adhesion problem")); - when_text2->SetFont(Label::Body_14); - when_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text2); - auto when_text3 = new wxStaticText(page, wxID_ANY, _L("Warping(overhang)")); - when_text3->SetFont(Label::Body_14); - when_text3->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text3); - auto when_text4 = new wxStaticText(page, wxID_ANY, _L("Bridging")); - when_text4->SetFont(Label::Body_14); - when_text4->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text4); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL); - auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap1->SetMinSize(wxSize(560, 450)); - bitmap1->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap1, 0, wxALL, 0); - bitmap_sizer->AddSpacer(FromDIP(20)); - auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap2->SetMinSize(wxSize(560, 450)); - bitmap2->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap2, 0, wxALL, 0); - page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki")); - wiki->SetFont(Label::Head_14); - wiki->SetForegroundColour({ 0, 88, 220 }); - wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_HAND); - }); - wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_ARROW); - }); - wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { - if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url); - }); - page_content_sizer->Add(wiki, 0); - - - page->get_prev_btn()->Hide(); - - auto page_next_btn = page->get_next_btn(); - page_next_btn->SetLabel(_L("Start")); - page_next_btn->SetButtonType(ButtonType::Start); - - return page; -} - -void TemperatureWizard::create_save_panel_content(wxBoxSizer* sizer) -{ - auto complete_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0); - complete_text->SetFont(::Label::Head_14); - complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - sizer->Add(complete_text, 0, 0, 0); - sizer->AddSpacer(FromDIP(20)); - - m_record_picture = new wxStaticBitmap(m_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0); - sizer->AddSpacer(FromDIP(20)); - - auto optimal_temp_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Optimal Temp"), wxDefaultPosition, wxDefaultSize, 0); - optimal_temp_text->Wrap(-1); - optimal_temp_text->SetFont(Label::Head_14); - sizer->Add(optimal_temp_text, 0, 0, 0); - - m_optimal_temp = new TextInput(m_save_panel, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0); - m_optimal_temp->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - sizer->Add(m_optimal_temp, 0, 0, 0); - - sizer->AddSpacer(FromDIP(20)); - - auto save_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0); - save_text->Wrap(-1); - save_text->SetFont(Label::Head_14); - sizer->Add(save_text, 0, 0, 0); - - m_save_name_input = new TextInput(m_save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0); - sizer->Add(m_save_name_input, 0, 0, 0); - m_save_name_input->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) { - if (!m_save_name_input->GetTextCtrl()->GetValue().IsEmpty()) - m_save_name = m_save_name_input->GetTextCtrl()->GetValue().ToStdString(); - else - m_save_name = ""; - }); -} - -void TemperatureWizard::create_pages() -{ - // page 0 : start page - m_page0 = create_start_page(); - m_page0->set_page_title(_L("Temperature Calibration")); - m_all_pages_sizer->Add(m_page0, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 1 : preset page - m_page1 = create_presets_page(true); - m_page1->set_page_title(_L("Temperature Calibration")); - - m_from_text->SetLabel(_L("From Temp")); - m_to_text->SetLabel(_L("To Temp")); - m_step->Enable(false); - - m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 2 : print page - m_page2 = create_print_page(); - m_page2->set_page_title(_L("Temperature Calibration")); - - m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 3 : save page - m_page3 = create_save_page(); - m_page3->set_page_title(_L("Temperature Calibration")); - m_all_pages_sizer->Add(m_page3, 1, wxEXPAND | wxALL, FromDIP(25)); - - - // link pages - m_page0->chain(m_page1)->chain(m_page2)->chain(m_page3); - - m_first_page = m_page0; - m_curr_page = m_page0; - show_page(m_curr_page); -} - -bool TemperatureWizard::start_calibration(std::vector tray_ids) -{ - Calib_Params params; - m_from_value->GetTextCtrl()->GetValue().ToDouble(¶ms.start); - m_to_value->GetTextCtrl()->GetValue().ToDouble(¶ms.end); - params.mode = CalibMode::Calib_Temp_Tower; - - if (params.start < 180 || params.end > 350 || params.end < (params.start + 5) || (params.end - params.start) >= 120) { // todo - MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nFrom temp: >= 180\nTo temp: <= 350\nFrom temp <= To temp - Step\n From temp - To temp < 120"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - CalibInfo calib_info; - calib_info.params = params; - calib_info.dev_id = curr_obj->dev_id; - calib_info.select_ams = "[" + std::to_string(tray_ids[0]) + "]"; - calib_info.process_bar = m_send_progress_bar; - calib_info.bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1); - calib_info.printer_prest = m_printer_preset; - calib_info.filament_prest = m_filament_presets.begin()->second; - calib_info.print_prest = m_print_preset; - - std::string error_message; - CalibUtils::calib_temptue(calib_info, error_message); - if (!error_message.empty()) { - MessageDialog msg_dlg(nullptr, _L(error_message), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - show_send_progress_bar(true); - return true; -} - -bool TemperatureWizard::save_calibration_result() -{ - if (m_optimal_temp->GetTextCtrl()->GetValue().IsEmpty()) // todo need a valid range - { - MessageDialog msg_dlg(nullptr, _L("Input an optiaml temperature."), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - int temp = stoi(m_optimal_temp->GetTextCtrl()->GetValue().ToStdString()); - if (m_save_name.empty()) { - MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - std::string message; - if (!save_presets(m_filament_presets.begin()->second, "nozzle_temperature", new ConfigOptionInts(1, temp), m_save_name, message)) { - MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - return true; -} - -bool TemperatureWizard::recommend_input_value() -{ - if (!CalibrationWizard::recommend_input_value()) { - m_from_value->GetTextCtrl()->SetValue(wxEmptyString); - m_to_value->GetTextCtrl()->SetValue(wxEmptyString); - m_step->GetTextCtrl()->SetValue(wxEmptyString); - return false; - } - else { - wxString filament_name = m_filament_presets.begin()->second->alias; - - int start, end; - if (filament_name.Contains("ABS") || filament_name.Contains("ASA")) {//todo supplement - start = 230; - end = 270; + if (obj) { + this->set_cali_method(method); + if (obj_cali_mode == m_mode) { + if (obj->is_in_printing() || obj->is_printing_finished()) { + if (m_curr_step != cali_step) { + show_step(cali_step); + } + } } - else if (filament_name.Contains("PETG")) { - start = 230; - end = 260; - } - else if (filament_name.Contains("TPU")) { - start = 210; - end = 240; - } - else if (filament_name.Contains("PA-CF")) { - start = 280; - end = 320; - } - else if (filament_name.Contains("PET-CF")) { - start = 280; - end = 320; - } - else if (filament_name.Contains("PLA")) { - start = 190; - end = 230; - } - else { - start = 190; - end = 230; - } - m_from_value->GetTextCtrl()->SetValue(std::to_string(start)); - m_to_value->GetTextCtrl()->SetValue(std::to_string(end)); - m_step->GetTextCtrl()->SetValue("5"); - - return true; } } - -void TemperatureWizard::init_bitmaps() -{ - m_print_picture->SetBitmap(create_scaled_bitmap("temperature_calibration", nullptr, 400)); - m_record_picture->SetBitmap(create_scaled_bitmap("temperature_record", nullptr, 400)); -} - -RetractionWizard::RetractionWizard(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) - : CalibrationWizard(parent, CalibMode::Calib_Retraction_tower, id, pos, size, style) -{ - create_pages(); - init_bitmaps(); -} - -void RetractionWizard::set_save_name() { - if (m_filament_presets.begin()->second) { - m_save_name = m_filament_presets.begin()->second->alias + "-Calibrated"; - } - else { m_save_name = ""; } - m_save_name_input->GetTextCtrl()->SetValue(m_save_name); -} - - -void RetractionWizard::create_save_panel_content(wxBoxSizer* sizer) -{ - auto complete_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0); - complete_text->SetFont(::Label::Head_14); - complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - sizer->Add(complete_text, 0, 0, 0); - sizer->AddSpacer(FromDIP(20)); - - m_record_picture = new wxStaticBitmap(m_save_panel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0); - sizer->AddSpacer(FromDIP(20)); - - auto optimal_temp_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Optimal Retraction Length"), wxDefaultPosition, wxDefaultSize, 0); - optimal_temp_text->Wrap(-1); - optimal_temp_text->SetFont(Label::Head_14); - sizer->Add(optimal_temp_text, 0, 0, 0); - - m_optimal_retraction = new TextInput(m_save_panel, wxEmptyString, _L("mm"), "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0); - m_optimal_retraction->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); - sizer->Add(m_optimal_retraction, 0, 0, 0); - - sizer->AddSpacer(FromDIP(20)); - - auto save_text = new wxStaticText(m_save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0); - save_text->Wrap(-1); - save_text->SetFont(Label::Head_14); - sizer->Add(save_text, 0, 0, 0); - - m_save_name_input = new TextInput(m_save_panel, m_save_name, "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0); - sizer->Add(m_save_name_input, 0, 0, 0); - m_save_name_input->GetTextCtrl()->Bind(wxEVT_TEXT, [this](auto& e) { - if (!m_save_name_input->GetTextCtrl()->GetValue().IsEmpty()) - m_save_name = m_save_name_input->GetTextCtrl()->GetValue().ToStdString(); - else - m_save_name = ""; - }); -} - -CalibrationWizardPage* RetractionWizard::create_start_page() -{ - auto page = new CalibrationWizardPage(m_scrolledWindow); - page->set_page_type(PageType::Start); - page->set_highlight_step_text(PageType::Start); - auto page_content_sizer = page->get_content_vsizer(); - - auto when_title = new wxStaticText(page, wxID_ANY, _L("When you need Temperature Calibration")); - when_title->SetFont(Label::Head_14); - when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_title); - auto when_text1 = new wxStaticText(page, wxID_ANY, _L("Model stringing")); - when_text1->SetFont(Label::Body_14); - when_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text1); - auto when_text2 = new wxStaticText(page, wxID_ANY, _L("Layer adhesion problem")); - when_text2->SetFont(Label::Body_14); - when_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text2); - auto when_text3 = new wxStaticText(page, wxID_ANY, _L("Warping(overhang)")); - when_text3->SetFont(Label::Body_14); - when_text3->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text3); - auto when_text4 = new wxStaticText(page, wxID_ANY, _L("Bridging")); - when_text4->SetFont(Label::Body_14); - when_text4->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - page_content_sizer->Add(when_text4); - - auto bitmap_sizer = new wxBoxSizer(wxHORIZONTAL); - auto bitmap1 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap1->SetMinSize(wxSize(560, 450)); - bitmap1->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap1, 0, wxALL, 0); - bitmap_sizer->AddSpacer(FromDIP(20)); - auto bitmap2 = new wxStaticBitmap(page, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); - bitmap2->SetMinSize(wxSize(560, 450)); - bitmap2->SetBackgroundColour(*wxBLACK); - bitmap_sizer->Add(bitmap2, 0, wxALL, 0); - page_content_sizer->Add(bitmap_sizer, 0, wxALL, 0); - - page_content_sizer->AddSpacer(PRESET_GAP); - - auto wiki = new wxStaticText(page, wxID_ANY, _L("Wiki")); - wiki->SetFont(Label::Head_14); - wiki->SetForegroundColour({ 0, 88, 220 }); - wiki->Bind(wxEVT_ENTER_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_HAND); - }); - wiki->Bind(wxEVT_LEAVE_WINDOW, [this, wiki](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_ARROW); - }); - wiki->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { - if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url); - }); - page_content_sizer->Add(wiki, 0); - - - page->get_prev_btn()->Hide(); - - auto page_next_btn = page->get_next_btn(); - page_next_btn->SetLabel(_L("Start")); - page_next_btn->SetButtonType(ButtonType::Start); - - return page; -} - -void RetractionWizard::create_pages() -{ - // page 1 : preset page - m_page1 = create_presets_page(true); - m_page1->set_page_title(_L("Retraction Calibration")); - - m_from_text->SetLabel(_L("From Retraction Length")); - m_to_text->SetLabel(_L("To Retraction Length")); - m_from_value->SetLabel(_L("mm")); - m_to_value->SetLabel(_L("mm")); - m_step->SetLabel(_L("mm")); - auto step_str = wxString::Format("%1.1f", 0.1f); - m_step->GetTextCtrl()->SetValue(step_str); - - m_all_pages_sizer->Add(m_page1, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 2 : print page - m_page2 = create_print_page(); - m_page2->set_page_title(_L("Retraction Calibration")); - - m_all_pages_sizer->Add(m_page2, 1, wxEXPAND | wxALL, FromDIP(25)); - - // page 3 : save page - m_page3 = create_save_page(); - m_page3->set_page_title(_L("Retraction Calibration")); - m_all_pages_sizer->Add(m_page3, 1, wxEXPAND | wxALL, FromDIP(25)); - - - // link pages - m_page1->chain(m_page2)->chain(m_page3); - - m_first_page = m_page1; - m_curr_page = m_page1; - show_page(m_curr_page); -} - -bool RetractionWizard::start_calibration(std::vector tray_ids) -{ - Calib_Params params; - m_from_value->GetTextCtrl()->GetValue().ToDouble(¶ms.start); - m_to_value->GetTextCtrl()->GetValue().ToDouble(¶ms.end); - params.mode = CalibMode::Calib_Retraction_tower; - - // todo limit - //if (params.start < 180 || params.end > 350 || params.end < (params.start + 5) || (params.end - params.start) >= 120) { // todo - // MessageDialog msg_dlg(nullptr, _L("Please input valid values:\nFrom temp: >= 180\nTo temp: <= 350\nFrom temp <= To temp - Step\n From temp - To temp < 120"), wxEmptyString, wxICON_WARNING | wxOK); - // msg_dlg.ShowModal(); - // return false; - //} - - CalibInfo calib_info; - calib_info.params = params; - calib_info.dev_id = curr_obj->dev_id; - calib_info.select_ams = "[" + std::to_string(tray_ids[0]) + "]"; - calib_info.process_bar = m_send_progress_bar; - calib_info.bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1); - calib_info.printer_prest = m_printer_preset; - calib_info.filament_prest = m_filament_presets.begin()->second; - calib_info.print_prest = m_print_preset; - - std::string error_message; - CalibUtils::calib_retraction(calib_info, error_message); - if (!error_message.empty()) { - MessageDialog msg_dlg(nullptr, _L(error_message), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - show_send_progress_bar(true); - return true; -} - -bool RetractionWizard::save_calibration_result() -{ - if (m_optimal_retraction->GetTextCtrl()->GetValue().IsEmpty()) // todo need a valid range - { - MessageDialog msg_dlg(nullptr, _L("Input an optiaml retraction length."), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - float length = stof(m_optimal_retraction->GetTextCtrl()->GetValue().ToStdString()); - if (m_save_name.empty()) { - MessageDialog msg_dlg(nullptr, _L("Input name of filament preset to save"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - std::string message; - if (!save_presets(m_filament_presets.begin()->second, "retraction_length", new ConfigOptionFloats{ length }, m_save_name, message)) { - MessageDialog msg_dlg(nullptr, _L(message), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - return true; -} - -bool RetractionWizard::recommend_input_value() -{ - if (!CalibrationWizard::recommend_input_value()) { - m_from_value->GetTextCtrl()->SetValue(wxEmptyString); - m_to_value->GetTextCtrl()->SetValue(wxEmptyString); - m_step->GetTextCtrl()->SetValue(wxEmptyString); - return false; - } - else { - m_from_value->GetTextCtrl()->SetValue("0"); - m_to_value->GetTextCtrl()->SetValue("2"); - auto step_str = wxString::Format("%1.1f", 0.1f); - m_step->GetTextCtrl()->SetValue(step_str); - return true; - } -} - -void RetractionWizard::init_bitmaps() -{ - m_print_picture->SetBitmap(create_scaled_bitmap("temperature_calibration", nullptr, 400)); - m_record_picture->SetBitmap(create_scaled_bitmap("temperature_record", nullptr, 400)); -} - -}} \ No newline at end of file +}} diff --git a/src/slic3r/GUI/CalibrationWizard.hpp b/src/slic3r/GUI/CalibrationWizard.hpp index 943beac387..a9ab9f9e8d 100644 --- a/src/slic3r/GUI/CalibrationWizard.hpp +++ b/src/slic3r/GUI/CalibrationWizard.hpp @@ -1,445 +1,165 @@ #ifndef slic3r_GUI_CalibrationWizard_hpp_ #define slic3r_GUI_CalibrationWizard_hpp_ +#include "../slic3r/Utils/CalibUtils.hpp" + #include "DeviceManager.hpp" #include "CalibrationWizardPage.hpp" -#include "Widgets/ComboBox.hpp" -#include "Widgets/TextInput.hpp" -#include "Widgets/AMSControl.hpp" -#include "Widgets/ProgressBar.hpp" -#include "SavePresetDialog.hpp" -#include "PresetComboBoxes.hpp" -#include "EditCalibrationHistoryDialog.hpp" -#include "../slic3r/Utils/CalibUtils.hpp" +#include "CalibrationWizardStartPage.hpp" +#include "CalibrationWizardPresetPage.hpp" +#include "CalibrationWizardCaliPage.hpp" +#include "CalibrationWizardSavePage.hpp" namespace Slic3r { namespace GUI { -wxDECLARE_EVENT(EVT_CALIBRATION_TRAY_SELECTION_CHANGED, SimpleEvent); -wxDECLARE_EVENT(EVT_CALIBRATION_NOTIFY_CHANGE_PAGES, SimpleEvent); -wxDECLARE_EVENT(EVT_CALIBRATION_TAB_CHANGED, wxCommandEvent); -enum FilamentSelectMode { - FSMCheckBoxMode, - FSMRadioMode -}; - - -wxString get_calibration_wiki_page(CalibMode cali_mode); - -class FilamentComboBox : public wxPanel +class CalibrationWizardPageStep { public: - FilamentComboBox(wxWindow* parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); - ~FilamentComboBox() {}; - - void set_select_mode(FilamentSelectMode mode); - FilamentSelectMode get_select_mode() { return m_mode; } - void load_tray_from_ams(int id, DynamicPrintConfig& tray); - void update_from_preset(); - int get_tray_id() { return m_tray_id; } - bool is_bbl_filament() { return m_is_bbl_filamnet; } - std::string get_tray_name() { return m_tray_name; } - CalibrateFilamentComboBox* GetComboBox() { return m_comboBox; } - CheckBox* GetCheckBox() { return m_checkBox; } - void SetCheckBox(CheckBox* cb) { m_checkBox = cb; } - wxRadioButton* GetRadioBox() { return m_radioBox; } - void SetRadioBox(wxRadioButton* btn) { m_radioBox = btn; } - virtual bool Show(bool show = true); - virtual bool Enable(bool enable); - virtual void SetValue(bool value, bool send_event = true); - -protected: - int m_tray_id; - std::string m_tray_name; - bool m_is_bbl_filamnet{ false }; - - CheckBox* m_checkBox{nullptr}; - //RadioBox* m_radioBox; - wxRadioButton* m_radioBox{ nullptr }; - CalibrateFilamentComboBox* m_comboBox{ nullptr }; - FilamentSelectMode m_mode{ FSMRadioMode }; + CalibrationWizardPageStep(CalibrationWizardPage* data) { + page = data; + } + + CalibrationWizardPageStep* prev { nullptr }; + CalibrationWizardPageStep* next { nullptr }; + CalibrationWizardPage* page { nullptr }; + void chain(CalibrationWizardPageStep* step) { + if (!step) return; + this->next = step; + step->prev = this; + } }; -typedef std::vector FilamentComboBoxList; - class CalibrationWizard : public wxPanel { public: - CalibrationWizard(wxWindow* parent, CalibMode mode, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); - ~CalibrationWizard() {}; - CalibrationWizardPage* get_curr_page() { return m_curr_page; } - CalibrationWizardPage* get_frist_page() { return m_first_page; } - void show_page(CalibrationWizardPage* page); - void update_print_error_info(int code, std::string msg, std::string extra); - void show_send_progress_bar(bool show); - void update_printer(); - void update_print_progress(); + CalibrationWizard(wxWindow* parent, CalibMode mode, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + ~CalibrationWizard(); + + void on_cali_job_finished(wxCommandEvent& event); + + virtual void on_cali_job_finished() {} + + CalibrationWizardPageStep* get_curr_step() { return m_curr_step; } + + void show_step(CalibrationWizardPageStep* step); + + virtual void update(MachineObject* obj); + + virtual void on_device_connected(MachineObject* obj); + + virtual void set_cali_style(CalibrationStyle style) { + m_cali_style = style; + } + + virtual void set_cali_method(CalibrationMethod method); + CalibMode get_calibration_mode() { return m_mode; } -protected: - virtual CalibrationWizardPage* create_start_page() { return nullptr; } - virtual CalibrationWizardPage* create_presets_page(bool need_custom_range); - virtual CalibrationWizardPage* create_print_page(); - virtual CalibrationWizardPage* create_save_page(); - virtual void create_save_panel_content(wxBoxSizer* sizer) {} - virtual void create_pages() = 0; - virtual bool start_calibration(std::vector tray_ids) = 0; - virtual bool save_calibration_result() = 0; - virtual bool recommend_input_value(); - virtual void set_save_name() {}; - virtual void request_calib_result() {}; - virtual void jump_to_page(PageType page_type); - virtual void change_ams_select_mode() {}; - virtual void init_bitmaps(); - virtual void check_sync_printer_status() {}; - -private: - ScalableBitmap m_bitmap_pause; - ScalableBitmap m_bitmap_pause_hover; - ScalableBitmap m_bitmap_resume; - ScalableBitmap m_bitmap_resume_hover; - ScalableBitmap m_bitmap_pause_disable; - ScalableBitmap m_bitmap_resume_disable; - ScalableBitmap m_bitmap_abort; - ScalableBitmap m_bitmap_abort_hover; - ScalableBitmap m_bitmap_abort_disable; + bool save_preset(const std::string &old_preset_name, const std::string &new_preset_name, const std::map &key_values, std::string& message); protected: - wxString m_wiki_url; - - std::map m_printer_calib_infos; - bool is_between_start_and_runing = false; - CalibMode m_mode; - MachineObject* curr_obj{ nullptr }; + void on_cali_go_home(); +protected: + /* wx widgets*/ wxScrolledWindow* m_scrolledWindow; wxBoxSizer* m_all_pages_sizer; - CalibrationWizardPage* m_curr_page{ nullptr }; - CalibrationWizardPage* m_first_page{ nullptr }; + CalibMode m_mode; + CalibrationStyle m_cali_style; + CalibrationMethod m_cali_method { CalibrationMethod::CALI_METHOD_MANUAL }; + MachineObject* curr_obj { nullptr }; + MachineObject* last_obj { nullptr }; - // preset panel - wxPanel* m_presets_panel; - wxPanel* m_select_ams_mode_panel; - //RadioBox* m_ams_radiobox; - //RadioBox* m_ext_spool_radiobox; - wxRadioButton* m_ams_radiobox; - wxRadioButton* m_ext_spool_radiobox; - bool m_filament_from_ext_spool{ false }; - wxPanel* m_muilti_ams_panel; - std::vector m_ams_item_list; - wxPanel* m_filament_list_panel; - ScalableButton* m_ams_sync_button; - FilamentComboBoxList m_filament_comboBox_list; - wxPanel* m_virtual_panel; - FilamentComboBox* m_virtual_tray_comboBox; - ComboBox* m_comboBox_nozzle_dia; - ComboBox* m_comboBox_bed_type; - ComboBox* m_comboBox_process; - Preset* m_printer_preset{nullptr}; - //Preset* m_filament_preset{ nullptr }; - std::map m_filament_presets; - Preset* m_print_preset{ nullptr }; - wxStaticText* m_from_text; - wxStaticText* m_to_text; - wxStaticText* m_step_text; - TextInput* m_from_value; - TextInput* m_to_value; - TextInput* m_step; - TextInput* m_nozzle_temp; - TextInput* m_bed_temp; - TextInput* m_max_volumetric_speed; - wxStaticText* m_filaments_incompatible_tips; - wxStaticText* m_bed_type_incompatible_tips; - wxPanel* m_send_progress_panel; - // send bar - std::shared_ptr m_send_progress_bar; - wxScrolledWindow* m_sw_print_failed_info{ nullptr }; - int m_print_error_code; - std::string m_print_error_msg; - std::string m_print_error_extra; - Label* m_st_txt_error_code{ nullptr }; - Label* m_st_txt_error_desc{ nullptr }; - Label* m_st_txt_extra_info{ nullptr }; + CalibrationWizardPageStep* m_curr_step { nullptr }; - // print panel - wxPanel* m_print_panel; - wxStaticBitmap* m_print_picture; - wxStaticText* m_staticText_profile_value; - wxStaticText* m_printing_stage_value; - wxStaticText* m_staticText_progress_percent; - wxStaticText* m_staticText_progress_left_time; - wxStaticText* m_staticText_layers; - ScalableButton* m_button_pause_resume; - ScalableButton* m_button_abort; - ProgressBar* m_print_gauge_progress; // for print - PageButton* m_btn_recali; - PageButton* m_btn_next; + CalibrationWizardPageStep* start_step { nullptr }; + CalibrationWizardPageStep* preset_step { nullptr }; + CalibrationWizardPageStep* cali_step { nullptr }; + CalibrationWizardPageStep* save_step { nullptr }; + + CalibrationWizardPageStep* cali_coarse_step { nullptr }; + CalibrationWizardPageStep* coarse_save_step { nullptr }; + CalibrationWizardPageStep* cali_fine_step { nullptr }; + CalibrationWizardPageStep* fine_save_step { nullptr }; - // save panel - wxPanel* m_save_panel; + /* save steps of calibration pages */ + std::vector m_page_steps; - void init_printer_calib_info_from_appconfig(); - void save_to_printer_calib_info(PageType page_type); - - // preset - void init_presets_selections(); - void init_nozzle_selections(); - void init_bed_type_selections(); - void init_process_selections(); - void check_has_ams(MachineObject * obj); - int get_bed_temp(DynamicPrintConfig* config); - FilamentSelectMode get_ams_select_mode() { if (!m_filament_comboBox_list.empty()) return m_filament_comboBox_list[0]->get_select_mode(); return FilamentSelectMode::FSMRadioMode; } - void set_ams_select_mode(FilamentSelectMode mode); - std::vector get_selected_tray(); - void set_selected_tray(const std::vector& tray_ids); - FilamentComboBoxList get_selected_filament_comboBox(); - void show_send_failed_info(bool show, int code = 0, wxString description = wxEmptyString, wxString extra = wxEmptyString); - void reset_preset_page(); - - // print - void reset_printing_values(); - - // save - bool save_presets(Preset* preset, const std::string& config_key, ConfigOption* config_value, const std::string& name, std::string& message); - - // event handlers - void on_select_nozzle(wxCommandEvent& evt); - void on_select_tray(SimpleEvent& evt); - void on_select_bed_type(wxCommandEvent& evt); - void on_click_btn_prev(IntEvent& event); - void on_click_btn_next(IntEvent& event); - void on_subtask_abort(wxCommandEvent& event); - void on_subtask_pause_resume(wxCommandEvent& event); - void on_choose_ams(wxCommandEvent& event); - void on_choose_ext_spool(wxCommandEvent& event); - void on_update_ams_filament(bool dialog = true); - void on_switch_ams(std::string ams_id); + SecondaryCheckDialog *go_home_dialog = nullptr; }; -class HistoryWindow : public DPIDialog { -public: - HistoryWindow(wxWindow* parent); - ~HistoryWindow() {}; - void on_dpi_changed(const wxRect& suggested_rect) {} - void create(); - - wxPanel* m_history_data_panel; -}; - -class PressureAdvanceWizard : public CalibrationWizard{ +class PressureAdvanceWizard : public CalibrationWizard { public: PressureAdvanceWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); ~PressureAdvanceWizard() {}; protected: - virtual CalibrationWizardPage* create_start_page() override; - void create_history_window(); - virtual void create_pages() override; - virtual void create_save_panel_content(wxBoxSizer* sizer) override; - virtual bool start_calibration(std::vector tray_ids) override; - virtual bool save_calibration_result() override; - virtual bool recommend_input_value() override; - virtual void request_calib_result() override; - virtual void change_ams_select_mode() override; - virtual void init_bitmaps() override; - virtual void check_sync_printer_status() override; + void create_pages(); - void sync_history_window_data(); - void sync_save_page_data(); - void switch_pages(SimpleEvent& evt); -private: - // history page - HistoryWindow* m_history_page{ nullptr }; + void on_cali_start(); - // start page - CalibrationWizardPage* m_page0{ nullptr }; + void on_cali_save(); - // preset page - CalibrationWizardPage* m_page1{ nullptr }; + void on_cali_action(wxCommandEvent& evt); - // print page - CalibrationWizardPage* m_page2{ nullptr }; + void update(MachineObject* obj) override; - // save page - CalibrationWizardPage* m_page3{ nullptr }; - wxStaticBitmap* m_record_picture; - wxPanel* m_low_end_save_panel; - TextInput* m_k_val; - TextInput* m_n_val; + void on_device_connected(MachineObject* obj) override; - wxPanel* m_high_end_save_panel; - std::vector m_calib_results; std::vector m_calib_results_history; - wxPanel* m_grid_panel; - - bool is_first_time_get_result = true; - bool has_get_result = false; - - int m_cali_version = -1; }; class FlowRateWizard : public CalibrationWizard { public: FlowRateWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); ~FlowRateWizard() {}; - void reset_reuse_panels(); + + void set_cali_method(CalibrationMethod method) override; + + void on_cali_job_finished() override; + protected: - virtual CalibrationWizardPage* create_start_page() override; - void create_low_end_pages(); - void create_high_end_pages(); - virtual void create_pages() override; - virtual void create_save_panel_content(wxBoxSizer* sizer) override; - virtual bool start_calibration(std::vector tray_ids) override; - virtual bool save_calibration_result() override; - virtual bool recommend_input_value() override; - virtual void set_save_name() override; - virtual void request_calib_result() override; - virtual void change_ams_select_mode() override; - virtual void init_bitmaps() override; + void create_pages(); - void sync_save_page_data(); - void switch_pages(SimpleEvent& evt); -private: - // start page - CalibrationWizardPage* m_page0{ nullptr }; + void on_cali_action(wxCommandEvent& evt); - // preset page - CalibrationWizardPage* m_page1{ nullptr }; - wxPanel* m_choose_step_panel; - wxRadioButton* m_complete_radioBox; - wxRadioButton* m_fine_radioBox; + void on_cali_start(CaliPresetStage stage = CaliPresetStage::CALI_MANULA_STAGE_NONE, float cali_value = 0.0f); - // print page - CalibrationWizardPage* m_page2{ nullptr }; + void on_cali_save(); - // page 3 - CalibrationWizardPage* m_low_end_page3{ nullptr }; - wxStaticBitmap* m_low_record_picture1; - ComboBox* m_optimal_block_coarse; - wxStaticText* m_coarse_calc_result_text; - float m_coarse_calc_result; - CheckBox* m_checkBox_skip_calibration; - TextInput* m_save_name_input1; + void update(MachineObject* obj) override; - CalibrationWizardPage* m_high_end_page3{ nullptr }; - std::vector m_calib_results; - wxPanel* m_grid_panel; - std::map m_high_end_save_names; - - // page 4 - CalibrationWizardPage* m_low_end_page4{ nullptr }; - wxStaticBitmap* m_low_print_picture2; - - // save page - CalibrationWizardPage* m_low_end_page5{ nullptr }; - wxStaticBitmap* m_low_record_picture2; - ComboBox* m_optimal_block_fine; - wxStaticText* m_fine_calc_result_text; - float m_fine_calc_result; - TextInput* m_save_name_input2; - std::string m_save_name; - bool is_first_time_get_result = true; - bool has_get_result = false; - - void reset_print_panel_to_page(CalibrationWizardPage* page, wxBoxSizer* sizer); - void reset_send_progress_to_page(CalibrationWizardPage* page, wxBoxSizer* sizer); - void on_fine_tune(wxCommandEvent&); + void on_device_connected(MachineObject* obj) override; }; class MaxVolumetricSpeedWizard : public CalibrationWizard { public: MaxVolumetricSpeedWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); ~MaxVolumetricSpeedWizard() {}; + + void on_cali_job_finished() override; + protected: - virtual CalibrationWizardPage* create_start_page() override; - virtual void create_pages() override; - virtual void create_save_panel_content(wxBoxSizer* sizer) override; - virtual bool start_calibration(std::vector tray_ids) override; - virtual bool save_calibration_result() override; - virtual bool recommend_input_value() override; - virtual void set_save_name() override; - virtual void init_bitmaps() override; -private: - // start page - CalibrationWizardPage* m_page0; + void create_pages(); - // preset page - CalibrationWizardPage* m_page1; + void on_cali_action(wxCommandEvent& evt); - // print page - CalibrationWizardPage* m_page2; + void on_cali_start(); - // save page - CalibrationWizardPage* m_page3; - wxStaticBitmap* m_record_picture; - TextInput* m_optimal_max_speed; - wxStaticText* m_calc_result_text; - float m_calc_result; - TextInput* m_save_name_input; - std::string m_save_name; + void on_cali_save(); + + void on_device_connected(MachineObject *obj) override; }; -class TemperatureWizard : public CalibrationWizard { -public: - TemperatureWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); - ~TemperatureWizard() {}; -protected: - virtual CalibrationWizardPage* create_start_page() override; - virtual void create_pages() override; - virtual void create_save_panel_content(wxBoxSizer* sizer) override; - virtual bool start_calibration(std::vector tray_ids) override; - virtual bool save_calibration_result() override; - virtual bool recommend_input_value() override; - virtual void set_save_name() override; - virtual void init_bitmaps() override; -private: - // start page - CalibrationWizardPage* m_page0; - - // preset page - CalibrationWizardPage* m_page1; - - // print page - CalibrationWizardPage* m_page2; - - // save page - CalibrationWizardPage* m_page3; - wxStaticBitmap* m_record_picture; - TextInput* m_optimal_temp; - TextInput* m_save_name_input; - std::string m_save_name; -}; - -class RetractionWizard : public CalibrationWizard { -public: - RetractionWizard(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); - ~RetractionWizard() {}; -protected: - virtual CalibrationWizardPage* create_start_page() override; - virtual void create_pages() override; - virtual void create_save_panel_content(wxBoxSizer* sizer) override; - virtual bool start_calibration(std::vector tray_ids) override; - virtual bool save_calibration_result() override; - virtual bool recommend_input_value() override; - virtual void set_save_name() override; - virtual void init_bitmaps() override; -private: - // start page - CalibrationWizardPage* m_page0; - - // preset page - CalibrationWizardPage* m_page1; - - // print page - CalibrationWizardPage* m_page2; - - // save page - CalibrationWizardPage* m_page3; - wxStaticBitmap* m_record_picture; - TextInput* m_optimal_retraction; - TextInput* m_save_name_input; - std::string m_save_name; -}; +// save printer_type in command event +wxDECLARE_EVENT(EVT_DEVICE_CHANGED, wxCommandEvent); +wxDECLARE_EVENT(EVT_CALIBRATION_JOB_FINISHED, wxCommandEvent); }} // namespace Slic3r::GUI -#endif \ No newline at end of file +#endif diff --git a/src/slic3r/GUI/CalibrationWizardCaliPage.cpp b/src/slic3r/GUI/CalibrationWizardCaliPage.cpp new file mode 100644 index 0000000000..eb0031693c --- /dev/null +++ b/src/slic3r/GUI/CalibrationWizardCaliPage.cpp @@ -0,0 +1,404 @@ +#include "CalibrationWizardCaliPage.hpp" +#include "I18N.hpp" +#include "Widgets/Label.hpp" + +namespace Slic3r { namespace GUI { + +static const wxString NA_STR = _L("N/A"); + + +CalibrationCaliPage::CalibrationCaliPage(wxWindow* parent, CalibMode cali_mode, CaliPageType cali_type, + wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationWizardPage(parent, id, pos, size, style) +{ + m_cali_mode = cali_mode; + + m_page_type = cali_type; + + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +CalibrationCaliPage::~CalibrationCaliPage() +{ + m_printing_panel->get_pause_resume_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CalibrationCaliPage::on_subtask_pause_resume), NULL, this); + m_printing_panel->get_abort_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CalibrationCaliPage::on_subtask_abort), NULL, this); +} + +void CalibrationCaliPage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, m_cali_mode); + m_page_caption->show_prev_btn(true); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration")); + steps.Add(_L("Record")); + m_step_panel = new CaliPageStepGuide(parent, steps); + m_step_panel->set_steps(1); + m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0); + + m_printing_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap); + m_top_sizer->Add(m_printing_picture, 0, wxALIGN_CENTER, 0); + m_top_sizer->AddSpacer(FromDIP(20)); + + set_cali_img(); + + m_printing_panel = new PrintingTaskPanel(parent, PrintingTaskType::CALIBRATION); + m_printing_panel->SetDoubleBuffered(true); + m_printing_panel->SetSize({ CALIBRATION_PROGRESSBAR_LENGTH, -1 }); + m_printing_panel->SetMinSize({ CALIBRATION_PROGRESSBAR_LENGTH, -1 }); + m_printing_panel->enable_pause_resume_button(false, "resume_disable"); + m_printing_panel->enable_abort_button(false); + + m_top_sizer->Add(m_printing_panel, 0, wxALIGN_CENTER, 0); + m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_CALI); + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); + + m_printing_panel->get_pause_resume_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CalibrationCaliPage::on_subtask_pause_resume), NULL, this); + m_printing_panel->get_abort_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(CalibrationCaliPage::on_subtask_abort), NULL, this); + + Layout(); +} + +void CalibrationCaliPage::on_subtask_pause_resume(wxCommandEvent& event) +{ + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + MachineObject* obj = dev->get_selected_machine(); + if (!obj) return; + + if (obj->can_resume()) + obj->command_task_resume(); + else + obj->command_task_pause(); +} + +void CalibrationCaliPage::on_subtask_abort(wxCommandEvent& event) +{ + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + MachineObject* obj = dev->get_selected_machine(); + if (!obj) return; + + if (abort_dlg == nullptr) { + abort_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Cancel print")); + abort_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this, obj](wxCommandEvent& e) { + if (obj) obj->command_task_abort(); + }); + } + abort_dlg->update_text(_L("Are you sure you want to cancel this print?")); + abort_dlg->on_show(); +} + + +void CalibrationCaliPage::set_cali_img() +{ + if (m_cali_mode == CalibMode::Calib_PA_Line) { + m_printing_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400)); + } + else if (m_cali_mode == CalibMode::Calib_Flow_Rate) { + if (m_page_type == CaliPageType::CALI_PAGE_CALI) + m_printing_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration", nullptr, 400)); + if (m_page_type == CaliPageType::CALI_PAGE_FINE_CALI) + m_printing_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration_fine", nullptr, 400)); + else + m_printing_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration", nullptr, 400)); + } + else if (m_cali_mode == CalibMode::Calib_Vol_speed_Tower) { + m_printing_picture->SetBitmap(create_scaled_bitmap("max_volumetric_speed_calibration", nullptr, 400)); + } +} + +void CalibrationCaliPage::update(MachineObject* obj) +{ + static int get_result_count = 0; + // enable calibration when finished + bool enable_cali = false; + if (obj) { + if (m_cali_mode == CalibMode::Calib_PA_Line) { + if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { + if (obj->get_pa_calib_result) { + enable_cali = true; + } else { + if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) { + // use selected diameter, add a counter to timeout, add a warning tips when get result failed + CalibUtils::emit_get_PA_calib_results(get_selected_calibration_nozzle_dia(obj)); + BOOST_LOG_TRIVIAL(trace) << "CalibUtils::emit_get_PA_calib_results, auto count = " << get_result_count++; + } else { + ; + } + } + } else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { + if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) { + enable_cali = true; + } else { + enable_cali = false; + } + } else { + assert(false); + } + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_CALI_NEXT, enable_cali); + } else if (m_cali_mode == CalibMode::Calib_Flow_Rate) { + if (m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { + if (obj->get_flow_calib_result) { + enable_cali = true; + } else { + if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) { + // use selected diameter, add a counter to timeout, add a warning tips when get result failed + CalibUtils::emit_get_flow_ratio_calib_results(get_selected_calibration_nozzle_dia(obj)); + } else { + ; + } + } + } else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { + if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) { + // use selected diameter, add a counter to timeout, add a warning tips when get result failed + CalibUtils::emit_get_flow_ratio_calib_results(get_selected_calibration_nozzle_dia(obj)); + enable_cali = true; + } + else { + enable_cali = false; + } + } else { + assert(false); + } + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_NEXT, enable_cali); + } + else if (m_cali_mode == CalibMode::Calib_Vol_speed_Tower) { + if (get_obj_calibration_mode(obj) == m_cali_mode && obj->is_printing_finished()) { + enable_cali = true; + } else { + ; + } + } + else { + assert(false); + } + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_NEXT, enable_cali); + } + + // only display calibration printing status + if (get_obj_calibration_mode(obj) == m_cali_mode) { + update_subtask(obj); + } else { + update_subtask(nullptr); + } +} + +void CalibrationCaliPage::update_subtask(MachineObject* obj) +{ + if (!obj) return; + + if (obj->is_support_layer_num) { + m_printing_panel->update_layers_num(true); + } + else { + m_printing_panel->update_layers_num(false); + } + + if (obj->is_system_printing() + || obj->is_in_calibration()) { + reset_printing_values(); + } + else if (obj->is_in_printing() || obj->print_status == "FINISH") { + if (obj->is_in_prepare() || obj->print_status == "SLICING") { + m_printing_panel->get_market_scoring_button()->Hide(); + m_printing_panel->enable_abort_button(false); + m_printing_panel->enable_pause_resume_button(false, "pause_disable"); + wxString prepare_text; + bool show_percent = true; + + if (obj->is_in_prepare()) { + prepare_text = wxString::Format(_L("Downloading...")); + } + else if (obj->print_status == "SLICING") { + if (obj->queue_number <= 0) { + prepare_text = wxString::Format(_L("Cloud Slicing...")); + } + else { + prepare_text = wxString::Format(_L("In Cloud Slicing Queue, there are %s tasks ahead."), std::to_string(obj->queue_number)); + show_percent = false; + } + } + else + prepare_text = wxString::Format(_L("Downloading...")); + + if (obj->gcode_file_prepare_percent >= 0 && obj->gcode_file_prepare_percent <= 100 && show_percent) + prepare_text += wxString::Format("(%d%%)", obj->gcode_file_prepare_percent); + + m_printing_panel->update_stage_value(prepare_text, 0); + m_printing_panel->update_progress_percent(NA_STR, wxEmptyString); + m_printing_panel->update_left_time(NA_STR); + m_printing_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR)); + m_printing_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name))); + + + if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) { + m_printing_panel->show_profile_info(true, wxString::FromUTF8(obj->get_modeltask()->profile_name)); + } + else { + m_printing_panel->show_profile_info(false); + } + + update_basic_print_data(false, obj->slice_info->weight, obj->slice_info->prediction); + } + else { + if (obj->can_resume()) { + m_printing_panel->enable_pause_resume_button(true, "resume"); + + } + else { + m_printing_panel->enable_pause_resume_button(true, "pause"); + } + if (obj->print_status == "FINISH") { + + m_printing_panel->enable_abort_button(false); + m_printing_panel->enable_pause_resume_button(false, "resume_disable"); + + bool is_market_task = obj->get_modeltask() && obj->get_modeltask()->design_id > 0; + if (is_market_task) { + m_printing_panel->get_market_scoring_button()->Show(); + BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_BTU: design_id [" << obj->get_modeltask()->design_id << "] print_finish [" << m_print_finish << "]"; + if (!m_print_finish && IsShownOnScreen()) { + m_print_finish = true; + } + } + else { + m_printing_panel->get_market_scoring_button()->Hide(); + } + } + else { + m_printing_panel->enable_abort_button(true); + m_printing_panel->get_market_scoring_button()->Hide(); + if (m_print_finish) { + m_print_finish = false; + } + } + // update printing stage + + m_printing_panel->update_left_time(obj->mc_left_time); + if (obj->subtask_) { + m_printing_panel->update_stage_value(obj->get_curr_stage(), obj->subtask_->task_progress); + m_printing_panel->update_progress_percent(wxString::Format("%d", obj->subtask_->task_progress), "%"); + m_printing_panel->update_layers_num(true, wxString::Format(_L("Layer: %d/%d"), obj->curr_layer, obj->total_layers)); + + } + else { + m_printing_panel->update_stage_value(obj->get_curr_stage(), 0); + m_printing_panel->update_progress_percent(NA_STR, wxEmptyString); + m_printing_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR)); + } + } + + m_printing_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name))); + + if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) { + m_printing_panel->show_profile_info(wxString::FromUTF8(obj->get_modeltask()->profile_name)); + } + else { + m_printing_panel->show_profile_info(false); + } + + } + else { + reset_printing_values(); + } + + this->Layout(); +} + +void CalibrationCaliPage::update_basic_print_data(bool def, float weight, int prediction) +{ + if (def) { + wxString str_prediction = wxString::Format("%s", get_bbl_time_dhms(prediction)); + wxString str_weight = wxString::Format("%.2fg", weight); + + m_printing_panel->show_priting_use_info(true, str_prediction, str_weight); + } + else { + m_printing_panel->show_priting_use_info(false, "0m", "0g"); + } +} + +void CalibrationCaliPage::reset_printing_values() +{ + m_printing_panel->enable_pause_resume_button(false, "pause_disable"); + m_printing_panel->enable_abort_button(false); + m_printing_panel->reset_printing_value(); + m_printing_panel->update_subtask_name(NA_STR); + m_printing_panel->show_profile_info(false); + m_printing_panel->update_stage_value(wxEmptyString, 0); + m_printing_panel->update_progress_percent(NA_STR, wxEmptyString); + m_printing_panel->get_market_scoring_button()->Hide(); + m_printing_panel->update_left_time(NA_STR); + m_printing_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR)); + update_basic_print_data(false); + this->Layout(); +} + +void CalibrationCaliPage::on_device_connected(MachineObject* obj) +{ + ; +} + +void CalibrationCaliPage::set_cali_method(CalibrationMethod method) +{ + m_cali_method = method; + + wxArrayString auto_steps; + auto_steps.Add(_L("Preset")); + auto_steps.Add(_L("Calibration")); + auto_steps.Add(_L("Record")); + + wxArrayString manual_steps; + manual_steps.Add(_L("Preset")); + manual_steps.Add(_L("Calibration1")); + manual_steps.Add(_L("Calibration2")); + manual_steps.Add(_L("Record")); + + if (method == CalibrationMethod::CALI_METHOD_AUTO) { + m_step_panel->set_steps_string(auto_steps); + m_step_panel->set_steps(1); + } + else if (method == CalibrationMethod::CALI_METHOD_MANUAL) { + if (m_cali_mode == CalibMode::Calib_PA_Line) { + m_step_panel->set_steps_string(auto_steps); + m_step_panel->set_steps(1); + } else { + m_step_panel->set_steps_string(manual_steps); + if (m_page_type == CaliPageType::CALI_PAGE_CALI) + m_step_panel->set_steps(1); + else if (m_page_type == CaliPageType::CALI_PAGE_FINE_CALI) { + m_step_panel->set_steps(2); + } + else { + m_step_panel->set_steps(1); + } + } + } + else { + assert(false); + } +} + +float CalibrationCaliPage::get_selected_calibration_nozzle_dia(MachineObject* obj) +{ + // return selected if this is set + if (obj->cali_selected_nozzle_dia > 1e-3 && obj->cali_selected_nozzle_dia < 10.0f) + return obj->cali_selected_nozzle_dia; + + // return default nozzle if nozzle diameter is set + if (obj->nozzle_diameter > 1e-3 && obj->nozzle_diameter < 10.0f) + return obj->nozzle_diameter; + + // return 0.4 by default + return 0.4; +} + +}} \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationWizardCaliPage.hpp b/src/slic3r/GUI/CalibrationWizardCaliPage.hpp new file mode 100644 index 0000000000..d7cf211352 --- /dev/null +++ b/src/slic3r/GUI/CalibrationWizardCaliPage.hpp @@ -0,0 +1,46 @@ +#ifndef slic3r_GUI_CalibrationWizardCaliPage_hpp_ +#define slic3r_GUI_CalibrationWizardCaliPage_hpp_ + +#include "CalibrationWizardPage.hpp" +#include "StatusPanel.hpp" + +namespace Slic3r { namespace GUI { + +class CalibrationCaliPage : public CalibrationWizardPage +{ +public: + CalibrationCaliPage(wxWindow* parent, + CalibMode cali_mode, + CaliPageType cali_type = CaliPageType::CALI_PAGE_CALI, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + ~CalibrationCaliPage(); + + void create_page(wxWindow* parent); + void on_subtask_pause_resume(wxCommandEvent& event); + void on_subtask_abort(wxCommandEvent& event); + void set_cali_img(); + void update(MachineObject* obj) override; + void update_subtask(MachineObject* obj); + void update_basic_print_data(bool def, float weight = 0.0, int prediction = 0); + void reset_printing_values(); + void on_device_connected(MachineObject* obj) override; + + void set_cali_method(CalibrationMethod method) override; + +protected: + float get_selected_calibration_nozzle_dia(MachineObject* obj); + + bool m_print_finish {false}; + wxBoxSizer* m_top_sizer; + CaliPageStepGuide* m_step_panel { nullptr }; + PrintingTaskPanel* m_printing_panel { nullptr }; + wxStaticBitmap* m_printing_picture; + SecondaryCheckDialog* abort_dlg { nullptr }; +}; + +}} // namespace Slic3r::GUI + +#endif \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationWizardPage.cpp b/src/slic3r/GUI/CalibrationWizardPage.cpp index dd80b52073..d5cf2c9013 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPage.cpp @@ -1,14 +1,124 @@ #include "CalibrationWizardPage.hpp" #include "I18N.hpp" #include "Widgets/Label.hpp" +#include "MsgDialog.hpp" namespace Slic3r { namespace GUI { -wxDEFINE_EVENT(EVT_CALIBRATIONPAGE_PREV, IntEvent); -wxDEFINE_EVENT(EVT_CALIBRATIONPAGE_NEXT, IntEvent); +wxDEFINE_EVENT(EVT_CALI_ACTION, wxCommandEvent); +wxDEFINE_EVENT(EVT_CALI_TRAY_CHANGED, wxCommandEvent); -PageButton::PageButton(wxWindow* parent, wxString text, ButtonType type) - : m_type(type), + +CalibrationStyle get_cali_style(MachineObject* obj) +{ + if (!obj) return CalibrationStyle::CALI_STYLE_DEFAULT; + + if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002") + return CalibrationStyle::CALI_STYLE_X1; + else if (obj->printer_type == "C11" || obj->printer_type == "C12") + return CalibrationStyle::CALI_STYLE_P1P; + + return CalibrationStyle::CALI_STYLE_DEFAULT; +} + +wxString get_cali_mode_caption_string(CalibMode mode) +{ + if (mode == CalibMode::Calib_PA_Line) + return _L("Pressure Advance Calibration"); + if (mode == CalibMode::Calib_Flow_Rate) + return _L("Flow Rate Calibration"); + if (mode == CalibMode::Calib_Vol_speed_Tower) + return _L("Max Volumetric Speed"); + return "no cali_mode_caption"; +} + +wxString get_calibration_wiki_page(CalibMode cali_mode) +{ + switch (cali_mode) { + case CalibMode::Calib_PA_Line: + return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_pa"); + case CalibMode::Calib_Flow_Rate: + return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_flow_rate"); + case CalibMode::Calib_Vol_speed_Tower: + return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_volumetric"); + case CalibMode::Calib_Temp_Tower: + return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_temperature"); + case CalibMode::Calib_Retraction_tower: + return wxString("https://wiki.bambulab.com/en/software/bambu-studio/calibration_retraction"); + default: + return ""; + } +} + +CalibrationFilamentMode get_cali_filament_mode(MachineObject* obj, CalibMode mode) +{ + // default + if (!obj) return CalibrationFilamentMode::CALI_MODEL_SINGLE; + + + if (mode == CalibMode::Calib_PA_Line) { + if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002") + return CalibrationFilamentMode::CALI_MODEL_MULITI; + else if (obj->printer_type == "C11" || obj->printer_type == "C12") + return CalibrationFilamentMode::CALI_MODEL_SINGLE; + } + else if (mode == CalibMode::Calib_Flow_Rate) { + if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002") + return CalibrationFilamentMode::CALI_MODEL_SINGLE; + else if (obj->printer_type == "C11" || obj->printer_type == "C12") + return CalibrationFilamentMode::CALI_MODEL_SINGLE; + } + + return CalibrationFilamentMode::CALI_MODEL_SINGLE; +} + +CalibMode get_obj_calibration_mode(const MachineObject* obj) +{ + CalibrationMethod method; + int cali_stage; + return get_obj_calibration_mode(obj, method, cali_stage); +} + +CalibMode get_obj_calibration_mode(const MachineObject* obj, int& cali_stage) +{ + CalibrationMethod method; + return get_obj_calibration_mode(obj, method, cali_stage); +} + +CalibMode get_obj_calibration_mode(const MachineObject* obj, CalibrationMethod& method, int& cali_stage) +{ + method = CalibrationMethod::CALI_METHOD_MANUAL; + + if (!obj) return CalibMode::Calib_None; + + if (boost::contains(obj->m_gcode_file, "auto_filament_cali")) { + method = CalibrationMethod::CALI_METHOD_AUTO; + return CalibMode::Calib_PA_Line; + } + if (boost::contains(obj->m_gcode_file, "user_cali_manual_pa")) { + method = CalibrationMethod::CALI_METHOD_MANUAL; + return CalibMode::Calib_PA_Line; + } + if (boost::contains(obj->m_gcode_file, "extrusion_cali")) { + method == CalibrationMethod::CALI_METHOD_MANUAL; + return CalibMode::Calib_PA_Line; + } + + if (boost::contains(obj->m_gcode_file, "abs_flowcalib_cali")) { + method = CalibrationMethod::CALI_METHOD_AUTO; + return CalibMode::Calib_Flow_Rate; + } + + CalibMode cali_mode = CalibUtils::get_calib_mode_by_name(obj->subtask_name, cali_stage); + if (cali_mode != CalibMode::Calib_None) { + method = CalibrationMethod::CALI_METHOD_MANUAL; + } + return cali_mode; +} + + +CaliPageButton::CaliPageButton(wxWindow* parent, CaliPageActionType type, wxString text) + : m_action_type(type), Button(parent, text) { StateColor btn_bg_green(std::pair(wxColour(206, 206, 206), StateColor::Disabled), @@ -33,18 +143,77 @@ PageButton::PageButton(wxWindow* parent, wxString text, ButtonType type) StateColor btn_text_white(std::pair(wxColour(255, 255, 254), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - switch (m_type) + switch (m_action_type) { - case Slic3r::GUI::Back: - case Slic3r::GUI::Recalibrate: + case CaliPageActionType::CALI_ACTION_MANAGE_RESULT: + this->SetLabel(_L("Manage Result")); + break; + case CaliPageActionType::CALI_ACTION_MANUAL_CALI: + this->SetLabel(_L("Maual Calibration")); + this->SetToolTip(_L("Result can be read by human eyes.")); + break; + case CaliPageActionType::CALI_ACTION_AUTO_CALI: + this->SetLabel(_L("Auto-Calibration")); + this->SetToolTip(_L("We would use Lidar to read the calibration result")); + break; + case CaliPageActionType::CALI_ACTION_START: + this->SetLabel(_L("Start Calibration")); + break; + case CaliPageActionType::CALI_ACTION_PREV: + this->SetLabel(_L("Prev")); + break; + case CaliPageActionType::CALI_ACTION_RECALI: + this->SetLabel(_L("Recalibration")); + break; + case CaliPageActionType::CALI_ACTION_NEXT: + this->SetLabel(_L("Next")); + break; + case CaliPageActionType::CALI_ACTION_CALI_NEXT: + this->SetLabel(_L("Next")); + break; + case CaliPageActionType::CALI_ACTION_CALI: + this->SetLabel(_L("Calibrate")); + break; + case CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2: + this->SetLabel(_L("Calibrate")); + break; + case CaliPageActionType::CALI_ACTION_PA_SAVE: + this->SetLabel(_L("Finish")); + break; + case CaliPageActionType::CALI_ACTION_FLOW_SAVE: + this->SetLabel(_L("Finish")); + break; + case CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE: + this->SetLabel(_L("Finish")); + break; + case CaliPageActionType::CALI_ACTION_FLOW_FINE_SAVE: + this->SetLabel(_L("Finish")); + break; + case CaliPageActionType::CALI_ACTION_COMMON_SAVE: + this->SetLabel(_L("Finish")); + break; + default: + this->SetLabel("Unknown"); + break; + } + + switch (m_action_type) + { + case CaliPageActionType::CALI_ACTION_PREV: + case CaliPageActionType::CALI_ACTION_RECALI: SetBackgroundColor(btn_bg_white); SetBorderColor(btn_bd_white); SetTextColor(btn_text_white); break; - case Slic3r::GUI::Start: - case Slic3r::GUI::Next: - case Slic3r::GUI::Calibrate: - case Slic3r::GUI::Save: + case CaliPageActionType::CALI_ACTION_START: + case CaliPageActionType::CALI_ACTION_NEXT: + case CaliPageActionType::CALI_ACTION_CALI: + case CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2: + case CaliPageActionType::CALI_ACTION_PA_SAVE: + case CaliPageActionType::CALI_ACTION_FLOW_SAVE: + case CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE: + case CaliPageActionType::CALI_ACTION_FLOW_FINE_SAVE: + case CaliPageActionType::CALI_ACTION_COMMON_SAVE: SetBackgroundColor(btn_bg_green); SetBorderColor(btn_bd_green); SetTextColor(btn_text_green); @@ -59,102 +228,358 @@ PageButton::PageButton(wxWindow* parent, wxString text, ButtonType type) SetCornerRadius(FromDIP(12)); } -CalibrationWizardPage::CalibrationWizardPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + +FilamentComboBox::FilamentComboBox(wxWindow* parent, const wxPoint& pos, const wxSize& size) + : wxPanel(parent, wxID_ANY, pos, size, wxTAB_TRAVERSAL) +{ + wxBoxSizer* main_sizer = new wxBoxSizer(wxHORIZONTAL); + + m_comboBox = new CalibrateFilamentComboBox(this); + m_comboBox->SetSize(CALIBRATION_FILAMENT_COMBOX_SIZE); + m_comboBox->SetMinSize(CALIBRATION_FILAMENT_COMBOX_SIZE); + main_sizer->Add(m_comboBox->clr_picker, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8)); + main_sizer->Add(m_comboBox, 0, wxALIGN_CENTER); + + this->SetSizer(main_sizer); + this->Layout(); + main_sizer->Fit(this); +} + +void FilamentComboBox::set_select_mode(CalibrationFilamentMode mode) +{ + m_mode = mode; + if (m_checkBox) + m_checkBox->Show(m_mode == CalibrationFilamentMode::CALI_MODEL_MULITI); + if (m_radioBox) + m_radioBox->Show(m_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE); + + Layout(); +} + +void FilamentComboBox::load_tray_from_ams(int id, DynamicPrintConfig& tray) +{ + m_comboBox->load_tray(tray); + + m_tray_id = id; + m_tray_name = m_comboBox->get_tray_name(); + m_is_bbl_filamnet = MachineObject::is_bbl_filament(m_comboBox->get_tag_uid()); + Enable(m_comboBox->is_tray_exist()); + + if (m_comboBox->is_tray_exist()) { + if (!m_comboBox->is_compatible_with_printer()) { + SetValue(false); + } + } +} + +void FilamentComboBox::update_from_preset() { m_comboBox->update(); } + +bool FilamentComboBox::Show(bool show) +{ + return wxPanel::Show(show); +} + +bool FilamentComboBox::Enable(bool enable) { + if (!enable) + SetValue(false); + + if (m_radioBox) + m_radioBox->Enable(enable); + if (m_checkBox) + m_checkBox->Enable(enable); + return wxPanel::Enable(enable); +} + +void FilamentComboBox::SetValue(bool value, bool send_event) { + if (m_radioBox) { + if (value == m_radioBox->GetValue()) { + if (m_checkBox) { + if (value == m_checkBox->GetValue()) + return; + } + else { + return; + } + } + } + if (m_radioBox) + m_radioBox->SetValue(value); + if (m_checkBox) + m_checkBox->SetValue(value); +} + + + +CaliPageCaption::CaliPageCaption(wxWindow* parent, CalibMode cali_mode, + wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxPanel(parent, id, pos, size, style) { - SetBackgroundColour(*wxWHITE); + init_bitmaps(); - wxBoxSizer* page_sizer; - page_sizer = new wxBoxSizer(wxVERTICAL); + auto top_sizer = new wxBoxSizer(wxVERTICAL); + auto caption_sizer = new wxBoxSizer(wxHORIZONTAL); + m_prev_btn = new ScalableButton(this, wxID_ANY, "cali_page_caption_prev", + wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true, 30); + m_prev_btn->SetBackgroundColour(*wxWHITE); + caption_sizer->Add(m_prev_btn, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10)); - wxBoxSizer* title_sizer; - title_sizer = new wxBoxSizer(wxHORIZONTAL); + wxString title = get_cali_mode_caption_string(cali_mode); + wxStaticText* title_text = new wxStaticText(this, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, 0); + title_text->Wrap(-1); + title_text->SetFont(Label::Head_16); + caption_sizer->Add(title_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10)); - m_title = new wxStaticText(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0); - m_title->Wrap(-1); - m_title->SetFont(Label::Head_16); - title_sizer->Add(m_title, 0, wxALL | wxEXPAND, 0); + m_help_btn = new ScalableButton(this, wxID_ANY, "cali_page_caption_help", + wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true, 30); + m_help_btn->SetBackgroundColour(*wxWHITE); + caption_sizer->Add(m_help_btn, 0, wxALIGN_CENTER); - title_sizer->AddStretchSpacer(); + top_sizer->Add(caption_sizer, 1, wxEXPAND); + top_sizer->AddSpacer(FromDIP(35)); + this->SetSizer(top_sizer); + top_sizer->Fit(this); - page_sizer->Add(title_sizer, 0, wxEXPAND, 0); + // hover effect + m_prev_btn->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { + m_prev_btn->SetBitmap(m_prev_bmp_hover.bmp()); + }); - page_sizer->AddSpacer(FromDIP(20)); + m_prev_btn->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { + m_prev_btn->SetBitmap(m_prev_bmp_normal.bmp()); + }); - m_top_sizer = new wxBoxSizer(wxHORIZONTAL); - m_top_sizer->AddStretchSpacer(); - m_preset_text = new wxStaticText(this, wxID_ANY, _L("Preset"), wxDefaultPosition, wxDefaultSize, 0); - m_preset_text->SetFont(::Label::Head_14); - m_top_sizer->Add(m_preset_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15)); - auto line1 = new wxPanel(this, wxID_ANY, wxDefaultPosition, {FromDIP(200), 1}); - line1->SetBackgroundColour(*wxBLACK); - m_top_sizer->Add(line1, 1, wxALIGN_CENTER, 0); - m_calibration_text = new wxStaticText(this, wxID_ANY, _L("Calibration"), wxDefaultPosition, wxDefaultSize, 0); - m_calibration_text->SetFont(::Label::Head_14); - m_top_sizer->Add(m_calibration_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15)); - auto line2 = new wxPanel(this, wxID_ANY, wxDefaultPosition, { FromDIP(200), 1}); - line2->SetBackgroundColour(*wxBLACK); - m_top_sizer->Add(line2, 1, wxALIGN_CENTER, 0); - m_record_text = new wxStaticText(this, wxID_ANY, _L("Record"), wxDefaultPosition, wxDefaultSize, 0); - m_record_text->SetFont(::Label::Head_14); - m_top_sizer->Add(m_record_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15)); - m_top_sizer->AddStretchSpacer(); - page_sizer->Add(m_top_sizer, 0, wxEXPAND, 0); + // hover effect + m_help_btn->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { + m_help_btn->SetBitmap(m_help_bmp_hover.bmp()); + }); - page_sizer->AddSpacer(FromDIP(40)); + m_help_btn->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { + m_help_btn->SetBitmap(m_help_bmp_normal.bmp()); + }); - m_content_sizer = new wxBoxSizer(wxVERTICAL); - - page_sizer->Add(m_content_sizer, 0, wxALIGN_CENTER, 0); - - page_sizer->AddSpacer(FromDIP(40)); - - m_btn_sizer = new wxBoxSizer(wxHORIZONTAL); - m_btn_sizer->AddStretchSpacer(); - m_btn_prev = new PageButton(this, "Back", Back); - m_btn_sizer->Add(m_btn_prev, 0); - m_btn_sizer->AddSpacer(FromDIP(10)); - m_btn_next = new PageButton(this, "Next", Next); - m_btn_sizer->Add(m_btn_next, 0); - m_btn_sizer->AddStretchSpacer(); - - page_sizer->Add(m_btn_sizer, 0, wxEXPAND, 0); - - this->SetSizer(page_sizer); - this->Layout(); - page_sizer->Fit(this); - - m_btn_prev->Bind(wxEVT_BUTTON, &CalibrationWizardPage::on_click_prev, this); - m_btn_next->Bind(wxEVT_BUTTON, &CalibrationWizardPage::on_click_next, this); + // send event + m_prev_btn->Bind(wxEVT_BUTTON, [this](auto& e) { + wxCommandEvent event(EVT_CALI_ACTION); + event.SetEventObject(m_parent); + event.SetInt((int)(CaliPageActionType::CALI_ACTION_GO_HOME)); + wxPostEvent(m_parent, event); + }); } -void CalibrationWizardPage::set_highlight_step_text(PageType page_type) { - if (page_type == PageType::Start) { - m_top_sizer->Clear(true); - Layout(); - return; +void CaliPageCaption::init_bitmaps() { + m_prev_bmp_normal = ScalableBitmap(this, "cali_page_caption_prev", 30); + m_prev_bmp_hover = ScalableBitmap(this, "cali_page_caption_prev_hover", 30); + m_help_bmp_normal = ScalableBitmap(this, "cali_page_caption_help", 30); + m_help_bmp_hover = ScalableBitmap(this, "cali_page_caption_help_hover", 30); +} + +void CaliPageCaption::show_prev_btn(bool show) +{ + m_prev_btn->Show(show); +} + +void CaliPageCaption::show_help_icon(bool show) +{ + m_help_btn->Show(show); +} + +CaliPageStepGuide::CaliPageStepGuide(wxWindow* parent, wxArrayString steps, + wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : wxPanel(parent, id, pos, size, style), + m_steps(steps) +{ + auto top_sizer = new wxBoxSizer(wxVERTICAL); + + m_step_sizer = new wxBoxSizer(wxHORIZONTAL); + m_step_sizer->AddSpacer(FromDIP(90)); + for (int i = 0; i < m_steps.size(); i++) { + wxStaticText* step_text = new wxStaticText(this, wxID_ANY, m_steps[i]); + step_text->SetForegroundColour(wxColour(181, 181, 181)); + m_text_steps.push_back(step_text); + m_step_sizer->Add(step_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15)); + if (i != m_steps.size() - 1) { + auto line = new wxPanel(this, wxID_ANY, wxDefaultPosition, { FromDIP(200), 1 }); + line->SetBackgroundColour(*wxBLACK); + m_step_sizer->Add(line, 1, wxALIGN_CENTER); + } } - m_preset_text->SetForegroundColour(wxColour(181, 181, 181)); - m_calibration_text->SetForegroundColour(wxColour(181, 181, 181)); - m_record_text->SetForegroundColour(wxColour(181, 181, 181)); - if(page_type == PageType::Preset) - m_preset_text->SetForegroundColour(*wxBLACK); - if (page_type == PageType::Calibration || page_type == PageType::CoarseSave || page_type == PageType::FineCalibration) - m_calibration_text->SetForegroundColour(*wxBLACK); - if (page_type == PageType::Save) - m_record_text->SetForegroundColour(*wxBLACK); + m_step_sizer->AddSpacer(FromDIP(90)); + + top_sizer->Add(m_step_sizer, 0, wxEXPAND); + top_sizer->AddSpacer(FromDIP(30)); + this->SetSizer(top_sizer); + top_sizer->Fit(this); } -void CalibrationWizardPage::on_click_prev(wxCommandEvent&) +void CaliPageStepGuide::set_steps(int index) { - IntEvent e(EVT_CALIBRATIONPAGE_PREV, static_cast(m_btn_prev->GetButtonType()), m_parent); - m_parent->GetEventHandler()->ProcessEvent(e); + for (wxStaticText* text_step : m_text_steps) { + text_step->SetForegroundColour(wxColour(181, 181, 181)); + } + m_text_steps[index]->SetForegroundColour(*wxBLACK); } -void CalibrationWizardPage::on_click_next(wxCommandEvent&) +void CaliPageStepGuide::set_steps_string(wxArrayString steps) { - IntEvent e(EVT_CALIBRATIONPAGE_NEXT, static_cast(m_btn_next->GetButtonType()), m_parent); - m_parent->GetEventHandler()->ProcessEvent(e); + m_steps.Clear(); + m_text_steps.clear(); + m_step_sizer->Clear(true); + m_steps = steps; + m_step_sizer->AddSpacer(FromDIP(90)); + for (int i = 0; i < m_steps.size(); i++) { + wxStaticText* step_text = new wxStaticText(this, wxID_ANY, m_steps[i]); + step_text->SetForegroundColour(wxColour(181, 181, 181)); + m_text_steps.push_back(step_text); + m_step_sizer->Add(step_text, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(15)); + if (i != m_steps.size() - 1) { + auto line = new wxPanel(this, wxID_ANY, wxDefaultPosition, { FromDIP(200), 1 }); + line->SetBackgroundColour(*wxBLACK); + m_step_sizer->Add(line, 1, wxALIGN_CENTER); + } + } + m_step_sizer->AddSpacer(FromDIP(90)); + Layout(); } -}} \ No newline at end of file + +CaliPageActionPanel::CaliPageActionPanel(wxWindow* parent, + CalibMode cali_mode, + CaliPageType page_type, + wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : wxPanel(parent, id, pos, size, style) +{ + m_parent = parent; + + wxWindow* btn_parent = this; + + if (cali_mode == CalibMode::Calib_PA_Line) { + if (page_type == CaliPageType::CALI_PAGE_START) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_MANAGE_RESULT)); + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_MANUAL_CALI)); + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_AUTO_CALI)); + } + else if (page_type == CaliPageType::CALI_PAGE_PRESET) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_CALI)); + } + else if (page_type == CaliPageType::CALI_PAGE_CALI) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_CALI_NEXT)); + } + else if (page_type == CaliPageType::CALI_PAGE_PA_SAVE) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_PA_SAVE)); + } + } + else if (cali_mode == CalibMode::Calib_Flow_Rate) { + if (page_type == CaliPageType::CALI_PAGE_START) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_MANUAL_CALI)); + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_AUTO_CALI)); + } + else if (page_type == CaliPageType::CALI_PAGE_PRESET) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_CALI)); + } + else if (page_type == CaliPageType::CALI_PAGE_CALI) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_NEXT)); + } + else if (page_type == CaliPageType::CALI_PAGE_COARSE_SAVE) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE)); + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2)); + } + else if (page_type == CaliPageType::CALI_PAGE_FINE_SAVE) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_FLOW_FINE_SAVE)); + } + else if (page_type == CaliPageType::CALI_PAGE_FLOW_SAVE) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_FLOW_SAVE)); + } + } + else { + if (page_type == CaliPageType::CALI_PAGE_START) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_START)); + } + else if (page_type == CaliPageType::CALI_PAGE_PRESET) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_CALI)); + } + else if (page_type == CaliPageType::CALI_PAGE_CALI) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_NEXT)); + } + else if (page_type == CaliPageType::CALI_PAGE_COMMON_SAVE) { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_COMMON_SAVE)); + } + else { + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_PREV)); + m_action_btns.push_back(new CaliPageButton(btn_parent, CaliPageActionType::CALI_ACTION_NEXT)); + } + + } + + auto top_sizer = new wxBoxSizer(wxHORIZONTAL); + + top_sizer->Add(0, 0, 1, wxEXPAND, 5); + for (int i = 0; i < m_action_btns.size(); i++) { + top_sizer->Add(m_action_btns[i], 0, wxALL, 5); + + m_action_btns[i]->Bind(wxEVT_BUTTON, + [this, i](wxCommandEvent& evt) { + wxCommandEvent event(EVT_CALI_ACTION); + event.SetEventObject(m_parent); + event.SetInt((int)m_action_btns[i]->get_action_type()); + wxPostEvent(m_parent, event); + }); + } + top_sizer->Add(0, 0, 1, wxEXPAND, 5); + + this->SetSizer(top_sizer); + top_sizer->Fit(this); +} + +void CaliPageActionPanel::bind_button(CaliPageActionType action_type, bool is_block) +{ + for (int i = 0; i < m_action_btns.size(); i++) { + if (m_action_btns[i]->get_action_type() == action_type) { + + if (is_block) { + m_action_btns[i]->Bind(wxEVT_BUTTON, + [this](wxCommandEvent& evt) { + MessageDialog msg(nullptr, _L("The current firmware version of the printer does not support calibration.\nPlease upgrade the printer firmware."), _L("Calibration not supported"), wxOK | wxICON_WARNING); + msg.ShowModal(); + }); + } + else { + m_action_btns[i]->Bind(wxEVT_BUTTON, + [this, i](wxCommandEvent& evt) { + wxCommandEvent event(EVT_CALI_ACTION); + event.SetEventObject(m_parent); + event.SetInt((int)m_action_btns[i]->get_action_type()); + wxPostEvent(m_parent, event); + }); + } + } + } + +} + +void CaliPageActionPanel::show_button(CaliPageActionType action_type, bool show) +{ + for (int i = 0; i < m_action_btns.size(); i++) { + if (m_action_btns[i]->get_action_type() == action_type) { + m_action_btns[i]->Show(show); + } + } +} + +void CaliPageActionPanel::enable_button(CaliPageActionType action_type, bool enable) +{ + for (int i = 0; i < m_action_btns.size(); i++) { + if (m_action_btns[i]->get_action_type() == action_type) { + m_action_btns[i]->Enable(enable); + } + } +} + +CalibrationWizardPage::CalibrationWizardPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : wxPanel(parent, id, pos, size, style) + , m_parent(parent) +{ + SetBackgroundColour(*wxWHITE); +} + + +}} diff --git a/src/slic3r/GUI/CalibrationWizardPage.hpp b/src/slic3r/GUI/CalibrationWizardPage.hpp index 60d9a0166e..99df3ae76c 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPage.hpp @@ -1,45 +1,206 @@ #ifndef slic3r_GUI_CalibrationWizardPage_hpp_ #define slic3r_GUI_CalibrationWizardPage_hpp_ +#include "wx/event.h" #include "Widgets/Button.hpp" -#include "Event.hpp" +#include "Widgets/ComboBox.hpp" +#include "Widgets/TextInput.hpp" +#include "Widgets/AMSControl.hpp" +#include "Widgets/ProgressBar.hpp" +#include "wxExtensions.hpp" +#include "PresetComboBoxes.hpp" + +#include "../slic3r/Utils/CalibUtils.hpp" +#include "../../libslic3r/Calib.hpp" namespace Slic3r { namespace GUI { -wxDECLARE_EVENT(EVT_CALIBRATIONPAGE_PREV, IntEvent); -wxDECLARE_EVENT(EVT_CALIBRATIONPAGE_NEXT, IntEvent); + +#define PRESET_GAP FromDIP(25) +#define CALIBRATION_COMBOX_SIZE wxSize(FromDIP(500), FromDIP(24)) +#define CALIBRATION_FILAMENT_COMBOX_SIZE wxSize(FromDIP(250), FromDIP(24)) +#define CALIBRATION_OPTIMAL_INPUT_SIZE wxSize(FromDIP(300), FromDIP(24)) +#define CALIBRATION_FROM_TO_INPUT_SIZE wxSize(FromDIP(160), FromDIP(24)) +#define CALIBRATION_FGSIZER_HGAP FromDIP(50) +#define CALIBRATION_TEXT_MAX_LENGTH FromDIP(90) + CALIBRATION_FGSIZER_HGAP + 2 * CALIBRATION_FILAMENT_COMBOX_SIZE.x +#define CALIBRATION_PROGRESSBAR_LENGTH FromDIP(690) class CalibrationWizard; -enum ButtonType + +enum class CalibrationStyle : int { - Start, - Restart, - Back, - Next, - Calibrate, - Recalibrate, - Save, + CALI_STYLE_DEFAULT = 0, + CALI_STYLE_X1, + CALI_STYLE_P1P, }; -class PageButton : public Button +CalibrationStyle get_cali_style(MachineObject* obj); + +wxString get_cali_mode_caption_string(CalibMode mode); + +enum CalibrationFilamentMode { + /* calibration single filament at once */ + CALI_MODEL_SINGLE = 0, + /* calibration multi filament at once */ + CALI_MODEL_MULITI, +}; + +enum CalibrationMethod { + CALI_METHOD_MANUAL = 0, + CALI_METHOD_AUTO, + CALI_METHOD_NONE, +}; + +wxString get_calibration_wiki_page(CalibMode cali_mode); + +CalibrationFilamentMode get_cali_filament_mode(MachineObject* obj, CalibMode mode); + +CalibMode get_obj_calibration_mode(const MachineObject* obj); + +CalibMode get_obj_calibration_mode(const MachineObject* obj, int& cali_stage); + +CalibMode get_obj_calibration_mode(const MachineObject* obj, CalibrationMethod& method, int& cali_stage); + + +enum class CaliPageType { + CALI_PAGE_START = 0, + CALI_PAGE_PRESET, + CALI_PAGE_CALI, + CALI_PAGE_COARSE_SAVE, + CALI_PAGE_FINE_CALI, + CALI_PAGE_FINE_SAVE, + CALI_PAGE_PA_SAVE, + CALI_PAGE_FLOW_SAVE, + CALI_PAGE_COMMON_SAVE, +}; + +class FilamentComboBox : public wxPanel { public: - PageButton(wxWindow* parent, wxString text, ButtonType type); - void SetButtonType(ButtonType rhs_type) { m_type = rhs_type; } - ButtonType GetButtonType() { return m_type; } - ~PageButton() {}; -private: - ButtonType m_type; + FilamentComboBox(wxWindow* parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + ~FilamentComboBox() {}; + + void set_select_mode(CalibrationFilamentMode mode); + CalibrationFilamentMode get_select_mode() { return m_mode; } + void load_tray_from_ams(int id, DynamicPrintConfig& tray); + void update_from_preset(); + int get_tray_id() { return m_tray_id; } + bool is_bbl_filament() { return m_is_bbl_filamnet; } + std::string get_tray_name() { return m_tray_name; } + CalibrateFilamentComboBox* GetComboBox() { return m_comboBox; } + CheckBox* GetCheckBox() { return m_checkBox; } + void SetCheckBox(CheckBox* cb) { m_checkBox = cb; } + wxRadioButton* GetRadioBox() { return m_radioBox; } + void SetRadioBox(wxRadioButton* btn) { m_radioBox = btn; } + virtual bool Show(bool show = true); + virtual bool Enable(bool enable); + virtual void SetValue(bool value, bool send_event = true); + +protected: + int m_tray_id { -1 }; + std::string m_tray_name; + bool m_is_bbl_filamnet{ false }; + + CheckBox* m_checkBox{ nullptr }; + wxRadioButton* m_radioBox{ nullptr }; + CalibrateFilamentComboBox* m_comboBox{ nullptr }; + CalibrationFilamentMode m_mode { CalibrationFilamentMode::CALI_MODEL_SINGLE }; }; -enum class PageType { - Start, - Preset, - Calibration, - CoarseSave, - FineCalibration, - Save, - Finish, +typedef std::vector FilamentComboBoxList; + +class CaliPageCaption : public wxPanel +{ +public: + CaliPageCaption(wxWindow* parent, + CalibMode cali_mode, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void show_prev_btn(bool show = true); + void show_help_icon(bool show = true); + +protected: + ScalableButton* m_prev_btn; + ScalableButton* m_help_btn; + +private: + void init_bitmaps(); + + ScalableBitmap m_prev_bmp_normal; + ScalableBitmap m_prev_bmp_hover; + ScalableBitmap m_help_bmp_normal; + ScalableBitmap m_help_bmp_hover; +}; + +class CaliPageStepGuide : public wxPanel +{ +public: + CaliPageStepGuide(wxWindow* parent, + wxArrayString steps, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void set_steps(int index); + void set_steps_string(wxArrayString steps); +protected: + wxArrayString m_steps; + wxBoxSizer* m_step_sizer; + std::vector m_text_steps; +}; + +enum class CaliPageActionType : int +{ + CALI_ACTION_MANAGE_RESULT = 0, + CALI_ACTION_MANUAL_CALI, + CALI_ACTION_AUTO_CALI, + CALI_ACTION_START, + CALI_ACTION_CALI, + CALI_ACTION_FLOW_CALI_STAGE_2, + CALI_ACTION_RECALI, + CALI_ACTION_PREV, + CALI_ACTION_NEXT, + CALI_ACTION_CALI_NEXT, + CALI_ACTION_PA_SAVE, + CALI_ACTION_FLOW_SAVE, + CALI_ACTION_FLOW_COARSE_SAVE, + CALI_ACTION_FLOW_FINE_SAVE, + CALI_ACTION_COMMON_SAVE, + CALI_ACTION_GO_HOME, + CALI_ACTION_COUNT +}; + +class CaliPageButton : public Button +{ +public: + CaliPageButton(wxWindow* parent, CaliPageActionType type, wxString text = wxEmptyString); + + CaliPageActionType get_action_type() { return m_action_type; } +private: + CaliPageActionType m_action_type; +}; + +class CaliPageActionPanel : public wxPanel +{ +public: + CaliPageActionPanel(wxWindow* parent, + CalibMode cali_mode, + CaliPageType page_type, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void bind_button(CaliPageActionType action_type, bool is_block); + void show_button(CaliPageActionType action_type, bool show = true); + void enable_button(CaliPageActionType action_type, bool enable = true); + +protected: + std::vector m_action_btns; }; class CalibrationWizardPage : public wxPanel @@ -48,6 +209,8 @@ public: CalibrationWizardPage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); ~CalibrationWizardPage() {}; + CaliPageType get_page_type() { return m_page_type; } + CalibrationWizardPage* get_prev_page() { return m_prev_page; } CalibrationWizardPage* get_next_page() { return m_next_page; } void set_prev_page(CalibrationWizardPage* prev) { m_prev_page = prev; } @@ -59,36 +222,43 @@ public: return next; } - wxBoxSizer* get_top_hsizer() { return m_top_sizer; } - wxBoxSizer* get_content_vsizer() { return m_content_sizer; } - wxBoxSizer* get_btn_hsizer() { return m_btn_sizer; } - PageButton* get_prev_btn() { return m_btn_prev; } - PageButton* get_next_btn() { return m_btn_next; } - PageType get_page_type() { return m_page_type; } + virtual void update(MachineObject* obj) { curr_obj = obj; } + /* device changed and connected */ + virtual void on_device_connected(MachineObject* obj) {} - void set_page_type(PageType type) { m_page_type = type; } - void set_page_title(wxString title) { m_title->SetLabel(title); } - void set_highlight_step_text(PageType page_type); + virtual void on_reset_page() {} + + virtual void set_cali_filament_mode(CalibrationFilamentMode mode) { + m_cali_filament_mode = mode; + } + + virtual void set_cali_method(CalibrationMethod method) { + m_cali_method = method; + if (method == CalibrationMethod::CALI_METHOD_MANUAL) { + set_cali_filament_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE); + } + } + +protected: + CalibMode m_cali_mode; + CaliPageType m_page_type; + CalibrationFilamentMode m_cali_filament_mode; + CalibrationMethod m_cali_method{ CalibrationMethod::CALI_METHOD_MANUAL }; + MachineObject* curr_obj { nullptr }; + + wxWindow* m_parent { nullptr }; + CaliPageCaption* m_page_caption { nullptr }; + CaliPageActionPanel* m_action_panel { nullptr }; private: - wxStaticText* m_title; - wxBoxSizer* m_top_sizer; - wxStaticText* m_preset_text; - wxStaticText* m_calibration_text; - wxStaticText* m_record_text; - wxBoxSizer* m_content_sizer; - wxBoxSizer* m_btn_sizer; - PageButton* m_btn_prev; - PageButton* m_btn_next; - PageType m_page_type; - - CalibrationWizardPage* m_prev_page{nullptr}; - CalibrationWizardPage* m_next_page{nullptr}; - - void on_click_prev(wxCommandEvent&); - void on_click_next(wxCommandEvent&); + CalibrationWizardPage* m_prev_page {nullptr}; + CalibrationWizardPage* m_next_page {nullptr}; }; +wxDECLARE_EVENT(EVT_CALI_ACTION, wxCommandEvent); +wxDECLARE_EVENT(EVT_CALI_TRAY_CHANGED, wxCommandEvent); + + }} // namespace Slic3r::GUI #endif \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp new file mode 100644 index 0000000000..adf40f243e --- /dev/null +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -0,0 +1,1408 @@ +#include "CalibrationWizardPresetPage.hpp" +#include "I18N.hpp" +#include "Widgets/Label.hpp" +#include "MsgDialog.hpp" +#include "libslic3r/Print.hpp" + +namespace Slic3r { namespace GUI { +std::string float_to_string(float value, int precision = 2) +{ + std::stringstream stream; + stream << std::fixed << std::setprecision(precision) << value; + return stream.str(); +} + +CaliPresetCaliStagePanel::CaliPresetCaliStagePanel( + wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) + : wxPanel(parent, id, pos, size, style) +{ + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_panel(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CaliPresetCaliStagePanel::create_panel(wxWindow* parent) +{ + auto title = new wxStaticText(parent, wxID_ANY, _L("Calibration Type")); + title->SetFont(Label::Head_14); + m_top_sizer->Add(title); + m_top_sizer->AddSpacer(FromDIP(15)); + + m_complete_radioBox = new wxRadioButton(parent, wxID_ANY, _L("Complete Calibration")); + m_complete_radioBox->SetValue(true); + m_stage = CALI_MANUAL_STAGE_1; + m_top_sizer->Add(m_complete_radioBox); + m_top_sizer->AddSpacer(FromDIP(10)); + + m_fine_radioBox = new wxRadioButton(parent, wxID_ANY, _L("Fine Calibration based on flow ratio")); + m_top_sizer->Add(m_fine_radioBox); + + auto input_panel = new wxPanel(parent); + input_panel->Hide(); + auto input_sizer = new wxBoxSizer(wxHORIZONTAL); + input_panel->SetSizer(input_sizer); + flow_ratio_input = new TextInput(input_panel, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); + flow_ratio_input->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + float default_flow_ratio = 1.0f; + auto flow_ratio_str = wxString::Format("%.3f", default_flow_ratio); + flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str); + input_sizer->AddSpacer(FromDIP(18)); + input_sizer->Add(flow_ratio_input, 0, wxTOP, FromDIP(10)); + m_top_sizer->Add(input_panel); + + m_top_sizer->AddSpacer(PRESET_GAP); + + // events + m_complete_radioBox->Bind(wxEVT_RADIOBUTTON, [this, input_panel](auto& e) { + input_panel->Show(false); + m_stage = CALI_MANUAL_STAGE_1; + GetParent()->Layout(); + }); + m_fine_radioBox->Bind(wxEVT_RADIOBUTTON, [this, input_panel](auto& e) { + input_panel->Show(); + m_stage = CALI_MANUAL_STAGE_2; + GetParent()->Layout(); + }); + flow_ratio_input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this](auto& e) { + float flow_ratio = 0.0f; + if (!CalibUtils::validate_input_flow_ratio(flow_ratio_input->GetTextCtrl()->GetValue(), &flow_ratio)) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } + auto flow_ratio_str = wxString::Format("%.3f", flow_ratio); + flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str); + m_flow_ratio_value = flow_ratio; + }); + flow_ratio_input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this](auto& e) { + float flow_ratio = 0.0f; + if (!CalibUtils::validate_input_flow_ratio(flow_ratio_input->GetTextCtrl()->GetValue(), &flow_ratio)) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + } + auto flow_ratio_str = wxString::Format("%.3f", flow_ratio); + flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio_str); + m_flow_ratio_value = flow_ratio; + e.Skip(); + }); + Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + SetFocusIgnoringChildren(); + }); +} + +void CaliPresetCaliStagePanel::set_cali_stage(CaliPresetStage stage, float value) +{ + if (stage == CaliPresetStage::CALI_MANUAL_STAGE_1) { + wxCommandEvent radioBox_evt(wxEVT_RADIOBUTTON); + radioBox_evt.SetEventObject(m_complete_radioBox); + wxPostEvent(m_complete_radioBox, radioBox_evt); + m_stage = stage; + } + else if(stage == CaliPresetStage::CALI_MANUAL_STAGE_2){ + wxCommandEvent radioBox_evt(wxEVT_RADIOBUTTON); + radioBox_evt.SetEventObject(m_fine_radioBox); + wxPostEvent(m_fine_radioBox, radioBox_evt); + m_stage = stage; + m_flow_ratio_value = value; + } +} + +void CaliPresetCaliStagePanel::get_cali_stage(CaliPresetStage& stage, float& value) +{ + stage = m_stage; + value = (m_stage == CALI_MANUAL_STAGE_2) ? m_flow_ratio_value : value; +} + +void CaliPresetCaliStagePanel::set_flow_ratio_value(wxString flow_ratio) +{ + flow_ratio_input->GetTextCtrl()->SetValue(flow_ratio); +} + +CaliPresetWarningPanel::CaliPresetWarningPanel( + wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) + : wxPanel(parent, id, pos, size, style) +{ + m_top_sizer = new wxBoxSizer(wxHORIZONTAL); + + create_panel(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CaliPresetWarningPanel::create_panel(wxWindow* parent) +{ + m_warning_text = new wxStaticText(parent, wxID_ANY, wxEmptyString); + m_warning_text->SetFont(Label::Body_13); + m_warning_text->SetForegroundColour(wxColour(230, 92, 92)); + m_warning_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + m_top_sizer->Add(m_warning_text, 0, wxEXPAND); +} + +void CaliPresetWarningPanel::set_warning(wxString text) +{ + m_warning_text->SetLabel(text); +} + +CaliPresetCustomRangePanel::CaliPresetCustomRangePanel( + wxWindow* parent, + int input_value_nums, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) + : wxPanel(parent, id, pos, size, style) + , m_input_value_nums(input_value_nums) +{ + m_title_texts.resize(input_value_nums); + m_value_inputs.resize(input_value_nums); + + m_top_sizer = new wxBoxSizer(wxHORIZONTAL); + + create_panel(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CaliPresetCustomRangePanel::set_unit(wxString unit) +{ + for (size_t i = 0; i < m_input_value_nums; ++i) { + m_value_inputs[i]->SetLabel(unit); + } +} + +void CaliPresetCustomRangePanel::set_titles(wxArrayString titles) +{ + if (titles.size() != m_input_value_nums) + return; + + for (size_t i = 0; i < m_input_value_nums; ++i) { + m_title_texts[i]->SetLabel(titles[i]); + } +} + +void CaliPresetCustomRangePanel::set_values(wxArrayString values) { + if (values.size() != m_input_value_nums) + return; + + for (size_t i = 0; i < m_input_value_nums; ++i) { + m_value_inputs[i]->GetTextCtrl()->SetValue(values[i]); + } +} + +wxArrayString CaliPresetCustomRangePanel::get_values() +{ + wxArrayString result; + for (size_t i = 0; i < m_input_value_nums; ++i) { + result.push_back(m_value_inputs[i]->GetTextCtrl()->GetValue()); + } + return result; +} + +void CaliPresetCustomRangePanel::create_panel(wxWindow* parent) +{ + wxBoxSizer* horiz_sizer; + horiz_sizer = new wxBoxSizer(wxHORIZONTAL); + + for (size_t i = 0; i < m_input_value_nums; ++i) { + if (i > 0) { + horiz_sizer->Add(FromDIP(10), 0, 0, wxEXPAND, 0); + } + + wxBoxSizer *item_sizer; + item_sizer = new wxBoxSizer(wxVERTICAL); + m_title_texts[i] = new wxStaticText(parent, wxID_ANY, _L("Title"), wxDefaultPosition, wxDefaultSize, 0); + m_title_texts[i]->Wrap(-1); + m_title_texts[i]->SetFont(::Label::Body_14); + item_sizer->Add(m_title_texts[i], 0, wxALL, 0); + m_value_inputs[i] = new TextInput(parent, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, 0); + m_value_inputs[i]->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + item_sizer->Add(m_value_inputs[i], 0, wxALL, 0); + horiz_sizer->Add(item_sizer, 0, wxEXPAND, 0); + } + + m_top_sizer->Add(horiz_sizer, 0, wxEXPAND, 0); +} + + +CaliPresetTipsPanel::CaliPresetTipsPanel( + wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) + : wxPanel(parent, id, pos, size, style) +{ + this->SetBackgroundColour(wxColour(238, 238, 238)); + this->SetMinSize(wxSize(CALIBRATION_TEXT_MAX_LENGTH * 1.7f, -1)); + + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_panel(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CaliPresetTipsPanel::create_panel(wxWindow* parent) +{ + m_top_sizer->AddSpacer(FromDIP(10)); + + auto preset_panel_tips = new wxStaticText(parent, wxID_ANY, _L("A test model will be printed. Please clear the build plate and place it back to the hot bed before calibration.")); + preset_panel_tips->SetFont(Label::Body_14); + preset_panel_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH * 1.5f); + m_top_sizer->Add(preset_panel_tips, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); + + m_top_sizer->AddSpacer(FromDIP(10)); + + auto info_sizer = new wxFlexGridSizer(0, 3, 0, FromDIP(10)); + info_sizer->SetFlexibleDirection(wxBOTH); + info_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); + + auto nozzle_temp_sizer = new wxBoxSizer(wxVERTICAL); + auto nozzle_temp_text = new wxStaticText(parent, wxID_ANY, _L("Nozzle temperature")); + nozzle_temp_text->SetFont(Label::Body_12); + m_nozzle_temp = new TextInput(parent, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); + m_nozzle_temp->SetBorderWidth(0); + nozzle_temp_sizer->Add(nozzle_temp_text, 0, wxALIGN_LEFT); + nozzle_temp_sizer->Add(m_nozzle_temp, 0, wxEXPAND); + nozzle_temp_text->Hide(); + m_nozzle_temp->Hide(); + + auto bed_temp_sizer = new wxBoxSizer(wxHORIZONTAL); + auto printing_param_text = new wxStaticText(parent, wxID_ANY, _L("Printing Parameters")); + printing_param_text->SetFont(Label::Head_12); + printing_param_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + bed_temp_sizer->Add(printing_param_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20)); + auto bed_temp_text = new wxStaticText(parent, wxID_ANY, _L("Bed temperature")); + bed_temp_text->SetFont(Label::Body_12); + m_bed_temp = new TextInput(parent, wxEmptyString, _L("\u2103"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); + m_bed_temp->SetBorderWidth(0); + bed_temp_sizer->Add(bed_temp_text, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(10)); + bed_temp_sizer->Add(m_bed_temp, 0, wxALIGN_CENTER); + + auto max_flow_sizer = new wxBoxSizer(wxVERTICAL); + auto max_flow_text = new wxStaticText(parent, wxID_ANY, _L("Max volumetric speed")); + max_flow_text->SetFont(Label::Body_12); + m_max_volumetric_speed = new TextInput(parent, wxEmptyString, _L("mm\u00B3"), "", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE, wxTE_READONLY); + m_max_volumetric_speed->SetBorderWidth(0); + max_flow_sizer->Add(max_flow_text, 0, wxALIGN_LEFT); + max_flow_sizer->Add(m_max_volumetric_speed, 0, wxEXPAND); + max_flow_text->Hide(); + m_max_volumetric_speed->Hide(); + + m_nozzle_temp->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {}); + m_bed_temp->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {}); + m_max_volumetric_speed->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto&) {}); + + info_sizer->Add(nozzle_temp_sizer); + info_sizer->Add(bed_temp_sizer); + info_sizer->Add(max_flow_sizer); + m_top_sizer->Add(info_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); + + m_top_sizer->AddSpacer(FromDIP(10)); +} + +void CaliPresetTipsPanel::set_params(int nozzle_temp, int bed_temp, float max_volumetric) +{ + wxString text_nozzle_temp = wxString::Format("%d", nozzle_temp); + m_nozzle_temp->GetTextCtrl()->SetValue(text_nozzle_temp); + + wxString bed_temp_text = wxString::Format("%d", bed_temp); + m_bed_temp->GetTextCtrl()->SetValue(bed_temp_text); + + wxString flow_val_text = wxString::Format("%0.2f", max_volumetric); + m_max_volumetric_speed->GetTextCtrl()->SetValue(flow_val_text); +} + +void CaliPresetTipsPanel::get_params(int& nozzle_temp, int& bed_temp, float& max_volumetric) +{ + try { + nozzle_temp = stoi(m_nozzle_temp->GetTextCtrl()->GetValue().ToStdString()); + bed_temp = stoi(m_bed_temp->GetTextCtrl()->GetValue().ToStdString()); + max_volumetric = stof(m_max_volumetric_speed->GetTextCtrl()->GetValue().ToStdString()); + } + catch(...) { + ; + } +} + +CalibrationPresetPage::CalibrationPresetPage( + wxWindow* parent, + CalibMode cali_mode, + bool custom_range, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) + : CalibrationWizardPage(parent, id, pos, size, style) + , m_show_custom_range(custom_range) +{ + m_cali_mode = cali_mode; + m_page_type = CaliPageType::CALI_PAGE_PRESET; + m_cali_filament_mode = CalibrationFilamentMode::CALI_MODEL_SINGLE; + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationPresetPage::create_selection_panel(wxWindow* parent) +{ + auto panel_sizer = new wxBoxSizer(wxVERTICAL); + + auto nozzle_combo_text = new wxStaticText(parent, wxID_ANY, _L("Please select the nozzle diameter of your printer"), wxDefaultPosition, wxDefaultSize, 0); + nozzle_combo_text->Wrap(-1); + nozzle_combo_text->SetFont(Label::Head_14); + panel_sizer->Add(nozzle_combo_text, 0, wxALL, 0); + m_comboBox_nozzle_dia = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); + panel_sizer->Add(m_comboBox_nozzle_dia, 0, wxALL, 0); + + panel_sizer->AddSpacer(PRESET_GAP); + + auto plate_type_combo_text = new wxStaticText(parent, wxID_ANY, _L("Please select the plate type of your printer"), wxDefaultPosition, wxDefaultSize, 0); + plate_type_combo_text->Wrap(-1); + plate_type_combo_text->SetFont(Label::Head_14); + panel_sizer->Add(plate_type_combo_text, 0, wxALL, 0); + m_comboBox_bed_type = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); + panel_sizer->Add(m_comboBox_bed_type, 0, wxALL, 0); + + panel_sizer->AddSpacer(PRESET_GAP); + + m_filament_from_panel = new wxPanel(parent); + auto filament_from_sizer = new wxBoxSizer(wxVERTICAL); + auto filament_from_text = new wxStaticText(m_filament_from_panel, wxID_ANY, _L("filament position")); + filament_from_text->SetFont(Label::Head_14); + filament_from_sizer->Add(filament_from_text, 0); + auto raioBox_sizer = new wxFlexGridSizer(2, 1, 0, FromDIP(10)); + m_ams_radiobox = new wxRadioButton(m_filament_from_panel, wxID_ANY, _L("AMS")); + m_ams_radiobox->SetValue(true); + filament_from_text->Hide(); + m_ams_radiobox->Hide(); + + raioBox_sizer->Add(m_ams_radiobox, 0); + m_ext_spool_radiobox = new wxRadioButton(m_filament_from_panel, wxID_ANY, _L("External Spool")); + m_ext_spool_radiobox->Hide(); + raioBox_sizer->Add(m_ext_spool_radiobox, 0); + filament_from_sizer->Add(raioBox_sizer, 0); + m_filament_from_panel->SetSizer(filament_from_sizer); + panel_sizer->Add(m_filament_from_panel, 0); + + panel_sizer->AddSpacer(PRESET_GAP); + + auto filament_for_title_sizer = new wxBoxSizer(wxHORIZONTAL); + auto filament_for_text = new wxStaticText(parent, wxID_ANY, _L("Filament For Calibration"), wxDefaultPosition, wxDefaultSize, 0); + filament_for_text->SetFont(Label::Head_14); + filament_for_title_sizer->Add(filament_for_text, 0, wxALIGN_CENTER); + filament_for_title_sizer->AddSpacer(FromDIP(25)); + m_ams_sync_button = new ScalableButton(parent, wxID_ANY, "ams_fila_sync", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, false, 18); + m_ams_sync_button->SetBackgroundColour(*wxWHITE); + m_ams_sync_button->SetToolTip(_L("Synchronize filament list from AMS")); + filament_for_title_sizer->Add(m_ams_sync_button, 0, wxALIGN_CENTER, 0); + panel_sizer->Add(filament_for_title_sizer); + + parent->SetSizer(panel_sizer); + panel_sizer->Fit(parent); + + m_ams_radiobox->Bind(wxEVT_RADIOBUTTON, &CalibrationPresetPage::on_choose_ams, this); + m_ext_spool_radiobox->Bind(wxEVT_RADIOBUTTON, &CalibrationPresetPage::on_choose_ext_spool, this); + m_ams_sync_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { + sync_ams_info(curr_obj); + }); + + m_comboBox_nozzle_dia->Bind(wxEVT_COMBOBOX, &CalibrationPresetPage::on_select_nozzle, this); + + m_comboBox_bed_type->Bind(wxEVT_COMBOBOX, &CalibrationPresetPage::on_select_plate_type, this); +} + +#define NOZZLE_LIST_COUNT 4 +#define NOZZLE_LIST_DEFAULT 1 +float nozzle_diameter_list[NOZZLE_LIST_COUNT] = {0.2, 0.4, 0.6, 0.8 }; + +void CalibrationPresetPage::init_selection_values() +{ + // init nozzle diameter + for (int i = 0; i < NOZZLE_LIST_COUNT; i++) { + m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f mm", nozzle_diameter_list[i])); + } + m_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); + + // init plate type + int curr_selection = 0; + const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type"); + if (bed_type_def && bed_type_def->enum_keys_map) { + for (auto item : bed_type_def->enum_labels) { + m_comboBox_bed_type->AppendString(_L(item)); + } + m_comboBox_bed_type->SetSelection(curr_selection); + } +} + +void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent) +{ + auto panel_sizer = new wxBoxSizer(wxVERTICAL); + + auto filament_list_tips = new wxStaticText(parent, wxID_ANY, _L("Please select same type of material, because plate temperature might not be compatible with different type of material"), wxDefaultPosition, wxDefaultSize, 0); + filament_list_tips->Hide(); + filament_list_tips->SetFont(Label::Body_13); + filament_list_tips->SetForegroundColour(wxColour(145, 145, 145)); + filament_list_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + panel_sizer->Add(filament_list_tips); + panel_sizer->AddSpacer(FromDIP(10)); + + // ams panel + m_multi_ams_panel = new wxPanel(parent); + auto multi_ams_sizer = new wxBoxSizer(wxVERTICAL); + auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL); + for (int i = 0; i < 4; i++) { + AMSinfo temp_info = AMSinfo{ std::to_string(i), std::vector{} }; + auto amsitem = new AMSItem(m_multi_ams_panel, wxID_ANY, temp_info); + amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) { + on_switch_ams(amsitem->m_amsinfo.ams_id); + e.Skip(); + }); + m_ams_item_list.push_back(amsitem); + ams_items_sizer->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6)); + } + multi_ams_sizer->Add(ams_items_sizer, 0); + multi_ams_sizer->AddSpacer(FromDIP(10)); + m_multi_ams_panel->SetSizer(multi_ams_sizer); + + panel_sizer->Add(m_multi_ams_panel); + m_multi_ams_panel->Hide(); + + auto filament_fgSizer = new wxFlexGridSizer(2, 2, FromDIP(10), CALIBRATION_FGSIZER_HGAP); + for (int i = 0; i < 4; i++) { + auto filament_comboBox_sizer = new wxBoxSizer(wxHORIZONTAL); + wxRadioButton* radio_btn = new wxRadioButton(m_filament_list_panel, wxID_ANY, ""); + CheckBox* check_box = new CheckBox(m_filament_list_panel); + check_box->SetBackgroundColour(*wxWHITE); + FilamentComboBox* fcb = new FilamentComboBox(m_filament_list_panel); + fcb->SetRadioBox(radio_btn); + fcb->SetCheckBox(check_box); + fcb->set_select_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE); + filament_comboBox_sizer->Add(radio_btn, 0, wxALIGN_CENTER); + filament_comboBox_sizer->Add(check_box, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8)); + filament_comboBox_sizer->Add(fcb, 0, wxALIGN_CENTER); + filament_fgSizer->Add(filament_comboBox_sizer, 0); + + radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent& evt) { + wxCommandEvent event(EVT_CALI_TRAY_CHANGED); + event.SetEventObject(this); + wxPostEvent(this, event); + }); + check_box->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { + wxCommandEvent event(EVT_CALI_TRAY_CHANGED); + event.SetEventObject(this); + wxPostEvent(this, event); + evt.Skip(); + }); + m_filament_comboBox_list.push_back(fcb); + + if (i == 0) + radio_btn->SetValue(true); + } + panel_sizer->Add(filament_fgSizer, 0); + + parent->SetSizer(panel_sizer); + panel_sizer->Fit(parent); +} + +void CalibrationPresetPage::create_ext_spool_panel(wxWindow* parent) +{ + auto panel_sizer = new wxBoxSizer(wxHORIZONTAL); + panel_sizer->AddSpacer(FromDIP(10)); + wxRadioButton* radio_btn = new wxRadioButton(parent, wxID_ANY, ""); + CheckBox* check_box = new CheckBox(parent); + m_virtual_tray_comboBox = new FilamentComboBox(parent); + m_virtual_tray_comboBox->SetRadioBox(radio_btn); + m_virtual_tray_comboBox->SetCheckBox(check_box); + m_virtual_tray_comboBox->set_select_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE); + radio_btn->SetValue(true); + + panel_sizer->Add(radio_btn, 0, wxALIGN_CENTER); + panel_sizer->Add(check_box, 0, wxALIGN_CENTER); + panel_sizer->Add(m_virtual_tray_comboBox, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8)); + parent->SetSizer(panel_sizer); + panel_sizer->Fit(parent); +} + +void CalibrationPresetPage::create_sending_panel(wxWindow* parent) +{ + auto panel_sizer = new wxBoxSizer(wxVERTICAL); + parent->SetSizer(panel_sizer); + + m_send_progress_bar = std::shared_ptr(new BBLStatusBarSend(parent)); + m_send_progress_bar->set_cancel_callback_fina([this]() { + BOOST_LOG_TRIVIAL(info) << "CalibrationWizard::print_job: enter canceled"; + if (CalibUtils::print_job) { + if (CalibUtils::print_job->is_running()) { + BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled"; + CalibUtils::print_job->cancel(); + } + CalibUtils::print_job->join(); + } + show_status(CaliPresetStatusNormal); + }); + panel_sizer->Add(m_send_progress_bar->get_panel(), 0); + + m_sw_print_failed_info = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(380), FromDIP(125)), wxVSCROLL); + m_sw_print_failed_info->SetBackgroundColour(*wxWHITE); + m_sw_print_failed_info->SetScrollRate(0, 5); + m_sw_print_failed_info->SetMinSize(wxSize(FromDIP(380), FromDIP(125))); + m_sw_print_failed_info->SetMaxSize(wxSize(FromDIP(380), FromDIP(125))); + + m_sw_print_failed_info->Hide(); + + panel_sizer->Add(m_sw_print_failed_info, 0); + + // create error info panel + wxBoxSizer* sizer_print_failed_info = new wxBoxSizer(wxVERTICAL); + m_sw_print_failed_info->SetSizer(sizer_print_failed_info); + + wxBoxSizer* sizer_error_code = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* sizer_extra_info = new wxBoxSizer(wxHORIZONTAL); + + auto st_title_error_code = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Error code")); + auto st_title_error_code_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": "); + m_st_txt_error_code = new Label(m_sw_print_failed_info, wxEmptyString); + st_title_error_code->SetForegroundColour(0x909090); + st_title_error_code_doc->SetForegroundColour(0x909090); + m_st_txt_error_code->SetForegroundColour(0x909090); + st_title_error_code->SetFont(::Label::Body_13); + st_title_error_code_doc->SetFont(::Label::Body_13); + m_st_txt_error_code->SetFont(::Label::Body_13); + st_title_error_code->SetMinSize(wxSize(FromDIP(74), -1)); + st_title_error_code->SetMaxSize(wxSize(FromDIP(74), -1)); + m_st_txt_error_code->SetMinSize(wxSize(FromDIP(260), -1)); + m_st_txt_error_code->SetMaxSize(wxSize(FromDIP(260), -1)); + sizer_error_code->Add(st_title_error_code, 0, wxALL, 0); + sizer_error_code->Add(st_title_error_code_doc, 0, wxALL, 0); + sizer_error_code->Add(m_st_txt_error_code, 0, wxALL, 0); + + auto st_title_error_desc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Error desc")); + auto st_title_error_desc_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": "); + m_st_txt_error_desc = new Label(m_sw_print_failed_info, wxEmptyString); + st_title_error_desc->SetForegroundColour(0x909090); + st_title_error_desc_doc->SetForegroundColour(0x909090); + m_st_txt_error_desc->SetForegroundColour(0x909090); + st_title_error_desc->SetFont(::Label::Body_13); + st_title_error_desc_doc->SetFont(::Label::Body_13); + m_st_txt_error_desc->SetFont(::Label::Body_13); + st_title_error_desc->SetMinSize(wxSize(FromDIP(74), -1)); + st_title_error_desc->SetMaxSize(wxSize(FromDIP(74), -1)); + m_st_txt_error_desc->SetMinSize(wxSize(FromDIP(260), -1)); + m_st_txt_error_desc->SetMaxSize(wxSize(FromDIP(260), -1)); + sizer_error_desc->Add(st_title_error_desc, 0, wxALL, 0); + sizer_error_desc->Add(st_title_error_desc_doc, 0, wxALL, 0); + sizer_error_desc->Add(m_st_txt_error_desc, 0, wxALL, 0); + + auto st_title_extra_info = new wxStaticText(m_sw_print_failed_info, wxID_ANY, _L("Extra info")); + auto st_title_extra_info_doc = new wxStaticText(m_sw_print_failed_info, wxID_ANY, ": "); + m_st_txt_extra_info = new Label(m_sw_print_failed_info, wxEmptyString); + st_title_extra_info->SetForegroundColour(0x909090); + st_title_extra_info_doc->SetForegroundColour(0x909090); + m_st_txt_extra_info->SetForegroundColour(0x909090); + st_title_extra_info->SetFont(::Label::Body_13); + st_title_extra_info_doc->SetFont(::Label::Body_13); + m_st_txt_extra_info->SetFont(::Label::Body_13); + st_title_extra_info->SetMinSize(wxSize(FromDIP(74), -1)); + st_title_extra_info->SetMaxSize(wxSize(FromDIP(74), -1)); + m_st_txt_extra_info->SetMinSize(wxSize(FromDIP(260), -1)); + m_st_txt_extra_info->SetMaxSize(wxSize(FromDIP(260), -1)); + sizer_extra_info->Add(st_title_extra_info, 0, wxALL, 0); + sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0); + sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0); + + sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5); + sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); + sizer_print_failed_info->Add(sizer_error_desc, 0, wxLEFT, 5); + sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); + sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5); + + + Bind(EVT_SHOW_ERROR_INFO, [this](auto& e) { + show_send_failed_info(true); + }); +} + +void CalibrationPresetPage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, m_cali_mode); + m_page_caption->show_prev_btn(true); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + + if (m_cali_mode == CalibMode::Calib_Flow_Rate) { + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration1")); + steps.Add(_L("Calibration2")); + steps.Add(_L("Record Factor")); + m_step_panel = new CaliPageStepGuide(parent, steps); + m_step_panel->set_steps(0); + } + else { + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration")); + steps.Add(_L("Record")); + m_step_panel = new CaliPageStepGuide(parent, steps); + m_step_panel->set_steps(0); + } + + m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0); + + if (m_cali_mode == CalibMode::Calib_Flow_Rate) { + m_cali_stage_panel = new CaliPresetCaliStagePanel(parent); + m_top_sizer->Add(m_cali_stage_panel, 0); + } + + m_selection_panel = new wxPanel(parent); + create_selection_panel(m_selection_panel); + init_selection_values(); + + m_filament_list_panel = new wxPanel(parent); + create_filament_list_panel(m_filament_list_panel); + + m_ext_spool_panel = new wxPanel(parent); + create_ext_spool_panel(m_ext_spool_panel); + m_ext_spool_panel->Hide(); + + m_warning_panel = new CaliPresetWarningPanel(parent); + + m_tips_panel = new CaliPresetTipsPanel(parent); + + m_sending_panel = new wxPanel(parent); + create_sending_panel(m_sending_panel); + + m_sending_panel->Hide(); + + if (m_show_custom_range) { + m_custom_range_panel = new CaliPresetCustomRangePanel(parent); + } + + m_top_sizer->Add(m_selection_panel, 0); + m_top_sizer->Add(m_filament_list_panel, 0); + m_top_sizer->Add(m_ext_spool_panel, 0); + m_top_sizer->Add(m_warning_panel, 0); + if (m_show_custom_range) { + m_top_sizer->Add(m_custom_range_panel, 0); + m_top_sizer->AddSpacer(PRESET_GAP); + } + m_top_sizer->Add(m_tips_panel, 0); + + m_top_sizer->Add(m_sending_panel, 0); + + m_top_sizer->AddSpacer(PRESET_GAP); + + m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_PRESET); + + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); + + Bind(EVT_CALI_TRAY_CHANGED, &CalibrationPresetPage::on_select_tray, this); +} + +void CalibrationPresetPage::on_select_nozzle(wxCommandEvent& evt) +{ + update_combobox_filaments(curr_obj); +} + +void CalibrationPresetPage::on_select_plate_type(wxCommandEvent& evt) +{ + select_default_compatible_filament(); + check_filament_compatible(); +} + +void CalibrationPresetPage::on_choose_ams(wxCommandEvent& event) +{ + select_default_compatible_filament(); + + m_filament_list_panel->Show(); + m_ams_sync_button->Show(); + m_ext_spool_panel->Hide(); + Layout(); +} + +void CalibrationPresetPage::on_choose_ext_spool(wxCommandEvent& event) +{ + m_filament_list_panel->Hide(); + m_ams_sync_button->Hide(); + m_ext_spool_panel->Show(); + Layout(); +} + +void CalibrationPresetPage::on_select_tray(wxCommandEvent& event) +{ + check_filament_compatible(); + + on_recommend_input_value(); +} + +void CalibrationPresetPage::on_switch_ams(std::string ams_id) +{ + for (auto i = 0; i < m_ams_item_list.size(); i++) { + AMSItem* item = m_ams_item_list[i]; + if (item->m_amsinfo.ams_id == ams_id) { + item->OnSelected(); + } + else { + item->UnSelected(); + } + } + + update_filament_combobox(ams_id); + + select_default_compatible_filament(); + + Layout(); +} + +void CalibrationPresetPage::on_recommend_input_value() +{ + //TODO fix this + std::map selected_filaments = get_selected_filaments(); + if (selected_filaments.empty()) + return; + + if (m_cali_mode == CalibMode::Calib_PA_Line) { + + } + else if (m_cali_mode == CalibMode::Calib_Flow_Rate && m_cali_stage_panel) { + Preset *selected_filament_preset = selected_filaments.begin()->second; + if (selected_filament_preset) { + float flow_ratio = selected_filament_preset->config.option("filament_flow_ratio")->get_at(0); + m_cali_stage_panel->set_flow_ratio_value(float_to_string(flow_ratio)); + } + } + else if (m_cali_mode == CalibMode::Calib_Vol_speed_Tower) { + Preset* selected_filament_preset = selected_filaments.begin()->second; + if (selected_filament_preset) { + double max_volumetric_speed = selected_filament_preset->config.option("filament_max_volumetric_speed")->get_at(0); + if (m_custom_range_panel) { + wxArrayString values; + values.push_back(float_to_string(max_volumetric_speed - 5)); + values.push_back(float_to_string(max_volumetric_speed + 5)); + values.push_back("0.5"); + m_custom_range_panel->set_values(values); + } + } + } +} + +void CalibrationPresetPage::check_filament_compatible() +{ + std::map selected_filaments = get_selected_filaments(); + std::string incompatiable_filament_name; + std::string error_tips; + int bed_temp = 0; + + std::vector selected_filaments_list; + for (auto& item: selected_filaments) + selected_filaments_list.push_back(item.second); + + if (!is_filaments_compatiable(selected_filaments_list, bed_temp, incompatiable_filament_name, error_tips)) { + m_tips_panel->set_params(0, 0, 0.0f); + if (!error_tips.empty()) { + wxString tips = from_u8(error_tips); + } else { + wxString tips = wxString::Format(_L("%s is not compatible with %s"), m_comboBox_bed_type->GetValue(), incompatiable_filament_name); + m_warning_panel->set_warning(tips); + m_warning_panel->Show(); + } + } else { + m_tips_panel->set_params(0, bed_temp, 0); + m_warning_panel->set_warning(""); + m_warning_panel->Hide(); + } + Layout(); +} + +bool CalibrationPresetPage::is_filaments_compatiable(const std::vector& prests) +{ + std::string incompatiable_filament_name; + std::string error_tips; + int bed_temp = 0; + return is_filaments_compatiable(prests, bed_temp, incompatiable_filament_name, error_tips); +} + +bool CalibrationPresetPage::is_filaments_compatiable(const std::vector &prests, + int& bed_temp, + std::string& incompatiable_filament_name, + std::string& error_tips) +{ + if (prests.empty()) return true; + + bed_temp = 0; + std::vector filament_types; + for (auto &item : prests) { + if (!item) + continue; + + // update bed temperature + BedType curr_bed_type = BedType(m_comboBox_bed_type->GetSelection() + btDefault + 1); + const ConfigOptionInts *opt_bed_temp_ints = item->config.option(get_bed_temp_key(curr_bed_type)); + int bed_temp_int = 0; + if (opt_bed_temp_ints) { + bed_temp_int = opt_bed_temp_ints->get_at(0); + } + + if (bed_temp_int <= 0) { + if (!item->alias.empty()) + incompatiable_filament_name = item->alias; + else + incompatiable_filament_name = item->name; + + return false; + } else { + // set for firset preset + if (bed_temp == 0) + bed_temp = bed_temp_int; + } + std::string display_filament_type; + filament_types.push_back(item->config.get_filament_type(display_filament_type, 0)); + } + + if (!Print::check_multi_filaments_compatibility(filament_types)) { + error_tips = L("Can not print multiple filaments which have large difference of temperature together. Otherwise, the extruder and nozzle may be blocked or damaged during printing"); + return false; + } + + return true; +} + +void CalibrationPresetPage::update_combobox_filaments(MachineObject* obj) +{ + //step 1: update combobox filament list + float nozzle_value = get_nozzle_value(); + obj->cali_selected_nozzle_dia = nozzle_value; + if (nozzle_value < 1e-3) { + return; + } + + Preset* printer_preset = get_printer_preset(obj, nozzle_value); + + // sync ams filaments list info + PresetBundle* preset_bundle = wxGetApp().preset_bundle; + if (preset_bundle && printer_preset) { + preset_bundle->set_calibrate_printer(printer_preset->name); + update_filament_combobox(); + } + + //step 2: sync ams info from object by default + sync_ams_info(obj); + + //step 3: select the default compatible filament to calibration + select_default_compatible_filament(); +} + +void CalibrationPresetPage::show_status(CaliPresetPageStatus status) +{ + if (status == CaliPresetPageStatus::CaliPresetStatusSending) { + m_sending_panel->Show(); + } + else { + m_sending_panel->Hide(); + } +} + +float CalibrationPresetPage::get_nozzle_value() +{ + double nozzle_value = 0.0; + wxString nozzle_value_str = m_comboBox_nozzle_dia->GetValue(); + try { + nozzle_value_str.ToDouble(&nozzle_value); + } + catch (...) { + ; + } + + return nozzle_value; +} + +void CalibrationPresetPage::update(MachineObject* obj) +{ + curr_obj = obj; +} + +void CalibrationPresetPage::on_device_connected(MachineObject* obj) +{ + init_with_machine(obj); + update_combobox_filaments(obj); +} + +void CalibrationPresetPage::update_print_error_info(int code, const std::string& msg, const std::string& extra) +{ + m_print_error_code = code; + m_print_error_msg = msg; + m_print_error_extra = extra; +} + +void CalibrationPresetPage::show_send_failed_info(bool show, int code, wxString description, wxString extra) +{ + if (show) { + if (!m_sw_print_failed_info->IsShown()) { + m_sw_print_failed_info->Show(true); + + m_st_txt_error_code->SetLabelText(wxString::Format("%d", m_print_error_code)); + m_st_txt_error_desc->SetLabelText(wxGetApp().filter_string(m_print_error_msg)); + m_st_txt_extra_info->SetLabelText(wxGetApp().filter_string(m_print_error_extra)); + + m_st_txt_error_code->Wrap(FromDIP(260)); + m_st_txt_error_desc->Wrap(FromDIP(260)); + m_st_txt_extra_info->Wrap(FromDIP(260)); + } + else { + m_sw_print_failed_info->Show(false); + } + Layout(); + Fit(); + } + else { + if (!m_sw_print_failed_info->IsShown()) { return; } + m_sw_print_failed_info->Show(false); + m_st_txt_error_code->SetLabelText(wxEmptyString); + m_st_txt_error_desc->SetLabelText(wxEmptyString); + m_st_txt_extra_info->SetLabelText(wxEmptyString); + Layout(); + Fit(); + } +} + +void CalibrationPresetPage::set_cali_filament_mode(CalibrationFilamentMode mode) +{ + CalibrationWizardPage::set_cali_filament_mode(mode); + + for (int i = 0; i < m_filament_comboBox_list.size(); i++) { + m_filament_comboBox_list[i]->set_select_mode(mode); + } +} + +void CalibrationPresetPage::set_cali_method(CalibrationMethod method) +{ + if (method == CalibrationMethod::CALI_METHOD_MANUAL && m_cali_mode == CalibMode::Calib_Flow_Rate) { + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration1")); + steps.Add(_L("Calibration2")); + steps.Add(_L("Record Factor")); + m_step_panel->set_steps_string(steps); + m_step_panel->set_steps(0); + if (m_cali_stage_panel) + m_cali_stage_panel->Show(); + } + else { + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration")); + steps.Add(_L("Record Factor")); + m_step_panel->set_steps_string(steps); + m_step_panel->set_steps(0); + if (m_cali_stage_panel) + m_cali_stage_panel->Show(false); + } +} + +void CalibrationPresetPage::on_cali_start_job() +{ + show_status(CaliPresetPageStatus::CaliPresetStatusSending); +} + +void CalibrationPresetPage::on_cali_finished_job() +{ + show_status(CaliPresetPageStatus::CaliPresetStatusNormal); +} + +void CalibrationPresetPage::init_with_machine(MachineObject* obj) +{ + if (!obj) return; + + bool nozzle_is_set = false; + for (int i = 0; i < NOZZLE_LIST_COUNT; i++) { + if (abs(obj->nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) { + if (m_comboBox_nozzle_dia->GetCount() > i) { + m_comboBox_nozzle_dia->SetSelection(i); + nozzle_is_set = true; + } + } + } + + if (nozzle_is_set) { + wxCommandEvent event(wxEVT_COMBOBOX); + event.SetEventObject(this); + wxPostEvent(m_comboBox_nozzle_dia, event); + m_comboBox_nozzle_dia->SetToolTip(_L("The nozzle diameter has been synchronized from the printer Settings")); + } else { + m_comboBox_nozzle_dia->SetToolTip(wxEmptyString); + // set default to 0.4 + if (m_comboBox_nozzle_dia->GetCount() > NOZZLE_LIST_DEFAULT) + m_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); + } + + // init default for filament source + if ( !obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_ID)) ) + { + m_ext_spool_radiobox->SetValue(true); + wxCommandEvent event(wxEVT_RADIOBUTTON); + event.SetEventObject(this); + wxPostEvent(this->m_ext_spool_radiobox, event); + } + else { + m_ams_radiobox->SetValue(true); + wxCommandEvent event(wxEVT_RADIOBUTTON); + event.SetEventObject(this); + wxPostEvent(this->m_ams_radiobox, event); + } + Layout(); + // init filaments for calibration + sync_ams_info(obj); +} + +void CalibrationPresetPage::sync_ams_info(MachineObject* obj) +{ + std::map full_filament_ams_list = wxGetApp().sidebar().build_filament_ams_list(obj); + + if (!obj) return; + + // sync filament_ams_list from obj ams list + filament_ams_list.clear(); + for (auto& ams_item : obj->amsList) { + for (auto& tray_item: ams_item.second->trayList) { + int tray_id = -1; + if (!tray_item.second->id.empty()) { + try { + tray_id = stoi(tray_item.second->id) + stoi(ams_item.second->id) * 4; + } + catch (...) { + ; + } + } + auto filament_ams = full_filament_ams_list.find(tray_id); + if (filament_ams != full_filament_ams_list.end()) { + filament_ams_list[tray_id] = filament_ams->second; + } + } + } + + // init virtual tray info + if (full_filament_ams_list.find(VIRTUAL_TRAY_ID) != full_filament_ams_list.end()) { + filament_ams_list[VIRTUAL_TRAY_ID] = full_filament_ams_list[VIRTUAL_TRAY_ID]; + } + + + // update filament from panel, display only obj has ams + // update multi ams panel, display only obj has multi ams + if (obj->has_ams()) { + m_filament_from_panel->Show(); + + if (obj->amsList.size() > 1) { + m_multi_ams_panel->Show(); + on_switch_ams(obj->amsList.begin()->first); + } else { + m_multi_ams_panel->Hide(); + update_filament_combobox(); + } + } + else { + m_multi_ams_panel->Hide(); + m_filament_from_panel->Hide(); + } + + std::vector ams_info; + for (auto ams = obj->amsList.begin(); ams != obj->amsList.end(); ams++) { + AMSinfo info; + info.ams_id = ams->first; + if (ams->second->is_exists + && info.parse_ams_info(ams->second, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity)) { + ams_info.push_back(info); + } + } + + for (auto i = 0; i < m_ams_item_list.size(); i++) { + AMSItem* item = m_ams_item_list[i]; + if (ams_info.size() > 1) { + if (i < ams_info.size()) { + item->Update(ams_info[i]); + item->Open(); + } else { + item->Close(); + } + } else { + item->Close(); + } + } + + Layout(); +} + +void CalibrationPresetPage::select_default_compatible_filament() +{ + if (!curr_obj) + return; + + if (m_ams_radiobox->GetValue()) { + for (auto &fcb : m_filament_comboBox_list) { + if (!fcb->GetRadioBox()->IsEnabled()) + continue; + + Preset* preset = const_cast(fcb->GetComboBox()->get_selected_preset()); + std::vector multi_select_filaments; + if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) { + if (is_filaments_compatiable({preset})) { + fcb->GetRadioBox()->SetValue(true); + wxCommandEvent event(wxEVT_RADIOBUTTON); + event.SetEventObject(this); + wxPostEvent(fcb->GetRadioBox(), event); + Layout(); + break; + } else + fcb->GetRadioBox()->SetValue(false); + } else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_MULITI) { + multi_select_filaments.push_back(preset); + if (!is_filaments_compatiable(multi_select_filaments)) { + multi_select_filaments.pop_back(); + fcb->GetCheckBox()->SetValue(false); + } + else + fcb->GetCheckBox()->SetValue(true); + + wxCommandEvent event(wxEVT_CHECKBOX); + event.SetEventObject(this); + wxPostEvent(fcb->GetCheckBox(), event); + Layout(); + } + } + } + else if (m_ext_spool_radiobox->GetValue()){ + Preset *preset = const_cast(m_virtual_tray_comboBox->GetComboBox()->get_selected_preset()); + if (is_filaments_compatiable({preset})) { + m_virtual_tray_comboBox->GetRadioBox()->SetValue(true); + } else + m_virtual_tray_comboBox->GetRadioBox()->SetValue(false); + + wxCommandEvent event(wxEVT_RADIOBUTTON); + event.SetEventObject(this); + wxPostEvent(m_virtual_tray_comboBox->GetRadioBox(), event); + Layout(); + } + else { + assert(false); + } + + check_filament_compatible(); +} + +std::vector CalibrationPresetPage::get_selected_filament_combobox() +{ + std::vector fcb_list; + + if (m_ext_spool_radiobox->GetValue()) { + if (m_ext_spool_panel) { + if (m_virtual_tray_comboBox->GetRadioBox()->GetValue()) + fcb_list.push_back(m_virtual_tray_comboBox); + } + } else if (m_ams_radiobox->GetValue()) { + if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_MULITI) { + for (auto& fcb : m_filament_comboBox_list) { + if (fcb->GetCheckBox()->GetValue()) { + fcb_list.push_back(fcb); + } + } + } + else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) { + for (auto& fcb : m_filament_comboBox_list) { + if (fcb->GetRadioBox()->GetValue()) { + fcb_list.push_back(fcb); + } + } + } + } else { + assert(false); + } + + return fcb_list; +} + +std::map CalibrationPresetPage::get_selected_filaments() +{ + std::map out; + std::vector fcb_list = get_selected_filament_combobox(); + + for (int i = 0; i < fcb_list.size(); i++) { + Preset* preset = const_cast(fcb_list[i]->GetComboBox()->get_selected_preset()); + // valid tray id + if (fcb_list[i]->get_tray_id() >= 0) { + out.emplace(std::make_pair(fcb_list[i]->get_tray_id(), preset)); + } + } + + + return out; +} + +void CalibrationPresetPage::get_preset_info(float& nozzle_dia, BedType& plate_type) +{ + if (m_comboBox_nozzle_dia->GetSelection() >=0 && m_comboBox_nozzle_dia->GetSelection() < NOZZLE_LIST_COUNT) { + nozzle_dia = nozzle_diameter_list[m_comboBox_nozzle_dia->GetSelection()]; + } else { + nozzle_dia = -1.0f; + } + + if (m_comboBox_bed_type->GetSelection() >= 0) + plate_type = static_cast(m_comboBox_bed_type->GetSelection() + 1); +} + +void CalibrationPresetPage::get_cali_stage(CaliPresetStage& stage, float& value) +{ + m_cali_stage_panel->get_cali_stage(stage, value); +} + +void CalibrationPresetPage::update_filament_combobox(std::string ams_id) +{ + for (auto& fcb : m_filament_comboBox_list) { + fcb->update_from_preset(); + fcb->set_select_mode(m_cali_filament_mode); + } + + DynamicPrintConfig empty_config; + empty_config.set_key_value("filament_id", new ConfigOptionStrings{ "" }); + empty_config.set_key_value("tag_uid", new ConfigOptionStrings{ "" }); + empty_config.set_key_value("filament_type", new ConfigOptionStrings{ "" }); + empty_config.set_key_value("tray_name", new ConfigOptionStrings{ "" }); + empty_config.set_key_value("filament_colour", new ConfigOptionStrings{ "" }); + empty_config.set_key_value("filament_exist", new ConfigOptionBools{ false }); + + /* update virtual tray combo box*/ + m_virtual_tray_comboBox->update_from_preset(); + auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [](auto& entry) { + return entry.first == VIRTUAL_TRAY_ID; + }); + + if (it != filament_ams_list.end()) { + m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, it->second); + } + else { + m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_ID, empty_config); + } + + if (filament_ams_list.empty()) + return; + + int ams_id_int = 0; + try { + if (!ams_id.empty()) + ams_id_int = stoi(ams_id.c_str()); + + } catch (...) {} + + for (int i = 0; i < 4; i++) { + int tray_index = ams_id_int * 4 + i; + + auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [tray_index](auto& entry) { + return entry.first == tray_index; + }); + + if (it != filament_ams_list.end()) { + m_filament_comboBox_list[i]->load_tray_from_ams(tray_index, it->second); + } + else { + m_filament_comboBox_list[i]->load_tray_from_ams(tray_index, empty_config); + } + } +} + +Preset* CalibrationPresetPage::get_printer_preset(MachineObject* obj, float nozzle_value) +{ + if (!obj) return nullptr; + + Preset* printer_preset = nullptr; + PresetBundle* preset_bundle = wxGetApp().preset_bundle; + for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) { + // only use system printer preset + if (!printer_it->is_system) continue; + + ConfigOption* printer_nozzle_opt = printer_it->config.option("nozzle_diameter"); + ConfigOptionFloats* printer_nozzle_vals = nullptr; + if (printer_nozzle_opt) + printer_nozzle_vals = dynamic_cast(printer_nozzle_opt); + std::string model_id = printer_it->get_current_printer_type(preset_bundle); + if (model_id.compare(obj->printer_type) == 0 + && printer_nozzle_vals + && abs(printer_nozzle_vals->get_at(0) - nozzle_value) < 1e-3) { + printer_preset = &(*printer_it); + } + } + + return printer_preset; +} + +Preset* CalibrationPresetPage::get_print_preset() +{ + Preset* printer_preset = get_printer_preset(curr_obj, get_nozzle_value()); + + Preset* print_preset; + wxArrayString print_items; + + // get default print profile + std::string default_print_profile_name; + if (printer_preset && printer_preset->config.has("default_print_profile")) { + default_print_profile_name = printer_preset->config.opt_string("default_print_profile"); + } + + PresetBundle* preset_bundle = wxGetApp().preset_bundle; + if (preset_bundle) { + for (auto print_it = preset_bundle->prints.begin(); print_it != preset_bundle->prints.end(); print_it++) { + if (print_it->name == default_print_profile_name) { + print_preset = &(*print_it); + BOOST_LOG_TRIVIAL(trace) << "CaliPresetPage: get_print_preset = " << print_preset->name; + } + } + } + + return print_preset; +} + +std::string CalibrationPresetPage::get_print_preset_name() +{ + Preset* print_preset = get_print_preset(); + if (print_preset) + return print_preset->name; + return ""; +} + +wxArrayString CalibrationPresetPage::get_custom_range_values() +{ + if (m_show_custom_range && m_custom_range_panel) { + return m_custom_range_panel->get_values(); + } + return wxArrayString(); +} + +MaxVolumetricSpeedPresetPage::MaxVolumetricSpeedPresetPage( + wxWindow *parent, CalibMode cali_mode, bool custom_range, wxWindowID id, const wxPoint &pos, const wxSize &size, long style) + : CalibrationPresetPage(parent, cali_mode, custom_range, id, pos, size, style) +{ + if (custom_range && m_custom_range_panel) { + wxArrayString titles; + titles.push_back(_L("From Volumetric Speed")); + titles.push_back(_L("To Volumetric Speed")); + titles.push_back(_L("Step")); + m_custom_range_panel->set_titles(titles); + + m_custom_range_panel->set_unit(_L("mm\u00B3/s")); + } +} +}} diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp new file mode 100644 index 0000000000..22724e82ba --- /dev/null +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp @@ -0,0 +1,259 @@ +#ifndef slic3r_GUI_CalibrationWizardPresetPage_hpp_ +#define slic3r_GUI_CalibrationWizardPresetPage_hpp_ + +#include "CalibrationWizardPage.hpp" + +namespace Slic3r { namespace GUI { + +enum CaliPresetStage { + CALI_MANULA_STAGE_NONE = 0, + CALI_MANUAL_STAGE_1, + CALI_MANUAL_STAGE_2, +}; + +class CaliPresetCaliStagePanel : public wxPanel +{ +public: + CaliPresetCaliStagePanel(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + void create_panel(wxWindow* parent); + + void set_cali_stage(CaliPresetStage stage, float value); + void get_cali_stage(CaliPresetStage& stage, float& value); + + void set_flow_ratio_value(wxString flow_ratio); + +protected: + CaliPresetStage m_stage; + wxBoxSizer* m_top_sizer; + wxRadioButton* m_complete_radioBox; + wxRadioButton* m_fine_radioBox; + TextInput * flow_ratio_input; + float m_flow_ratio_value; +}; + +class CaliPresetWarningPanel : public wxPanel +{ +public: + CaliPresetWarningPanel(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_panel(wxWindow* parent); + + void set_warning(wxString text); +protected: + wxBoxSizer* m_top_sizer; + wxStaticText* m_warning_text; +}; + +class CaliPresetTipsPanel : public wxPanel +{ +public: + CaliPresetTipsPanel(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_panel(wxWindow* parent); + + void set_params(int nozzle_temp, int bed_temp, float max_volumetric); + void get_params(int& nozzle_temp, int& bed_temp, float& max_volumetric); +protected: + wxBoxSizer* m_top_sizer; + TextInput* m_nozzle_temp; + TextInput* m_bed_temp; + TextInput* m_max_volumetric_speed; +}; + +class CaliPresetCustomRangePanel : public wxPanel +{ +public: + CaliPresetCustomRangePanel(wxWindow* parent, + int input_value_nums = 3, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_panel(wxWindow* parent); + + void set_unit(wxString unit); + void set_titles(wxArrayString titles); + void set_values(wxArrayString values); + wxArrayString get_values(); + +protected: + wxBoxSizer* m_top_sizer; + int m_input_value_nums; + std::vector m_title_texts; + std::vector m_value_inputs; +}; + +enum CaliPresetPageStatus +{ + CaliPresetStatusInit = 0, + CaliPresetStatusNormal, + CaliPresetStatusSending, +}; + +class CalibrationPresetPage : public CalibrationWizardPage +{ +public: + CalibrationPresetPage(wxWindow* parent, + CalibMode cali_mode, + bool custom_range = false, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow* parent); + + void update(MachineObject* obj) override; + + void on_device_connected(MachineObject* obj) override; + + void update_print_error_info(int code, const std::string& msg, const std::string& extra); + + void show_send_failed_info(bool show, int code = 0, wxString description = wxEmptyString, wxString extra = wxEmptyString); + + void set_cali_filament_mode(CalibrationFilamentMode mode) override; + + void set_cali_method(CalibrationMethod method) override; + + void on_cali_start_job(); + + void on_cali_finished_job(); + + void init_with_machine(MachineObject* obj); + + void sync_ams_info(MachineObject* obj); + + void select_default_compatible_filament(); + + std::vector get_selected_filament_combobox(); + + // key is tray_id + std::map get_selected_filaments(); + + void get_preset_info( + float& nozzle_dia, + BedType& plate_type); + + void get_cali_stage(CaliPresetStage& stage, float& value); + + std::shared_ptr get_sending_progress_bar() { + return m_send_progress_bar; + } + + Preset* get_printer_preset(MachineObject* obj, float nozzle_value); + Preset* get_print_preset(); + std::string get_print_preset_name(); + + wxArrayString get_custom_range_values(); + + CaliPresetPageStatus get_page_status() { return m_page_status; } +protected: + void create_selection_panel(wxWindow* parent); + void create_filament_list_panel(wxWindow* parent); + void create_ext_spool_panel(wxWindow* parent); + void create_sending_panel(wxWindow* parent); + + void init_selection_values(); + void update_filament_combobox(std::string ams_id = ""); + + void on_select_nozzle(wxCommandEvent& evt); + void on_select_plate_type(wxCommandEvent& evt); + + void on_choose_ams(wxCommandEvent& event); + void on_choose_ext_spool(wxCommandEvent& event); + + void on_select_tray(wxCommandEvent& event); + + void on_switch_ams(std::string ams_id = ""); + + void on_recommend_input_value(); + + void check_filament_compatible(); + bool is_filaments_compatiable(const std::vector& prests); + bool is_filaments_compatiable(const std::vector& prests, + int& bed_temp, + std::string& incompatiable_filament_name, + std::string& error_tips); + + void update_combobox_filaments(MachineObject* obj); + + float get_nozzle_value(); + + void show_status(CaliPresetPageStatus status); + + CaliPageStepGuide* m_step_panel { nullptr }; + CaliPresetCaliStagePanel* m_cali_stage_panel { nullptr }; + wxPanel* m_selection_panel { nullptr }; + wxPanel* m_filament_from_panel { nullptr }; + wxPanel* m_multi_ams_panel { nullptr }; + wxPanel* m_filament_list_panel { nullptr }; + wxPanel* m_ext_spool_panel { nullptr }; + CaliPresetWarningPanel* m_warning_panel { nullptr }; + CaliPresetCustomRangePanel* m_custom_range_panel { nullptr }; + CaliPresetTipsPanel* m_tips_panel { nullptr }; + wxPanel* m_sending_panel { nullptr }; + + wxBoxSizer* m_top_sizer; + + // m_selection_panel widgets + ComboBox* m_comboBox_nozzle_dia; + ComboBox* m_comboBox_bed_type; + ComboBox* m_comboBox_process; + + wxRadioButton* m_ams_radiobox; + wxRadioButton* m_ext_spool_radiobox; + + ScalableButton* m_ams_sync_button; + FilamentComboBoxList m_filament_comboBox_list; + FilamentComboBox* m_virtual_tray_comboBox; + + // m_sending panel widgets + std::shared_ptr m_send_progress_bar; + wxScrolledWindow* m_sw_print_failed_info { nullptr }; + Label* m_st_txt_error_code { nullptr }; + Label* m_st_txt_error_desc { nullptr }; + Label* m_st_txt_extra_info { nullptr }; + int m_print_error_code; + std::string m_print_error_msg; + std::string m_print_error_extra; + + std::vector m_ams_item_list; + + // for update filament combobox, key : tray_id + std::map filament_ams_list; + + CaliPresetPageStatus m_page_status { CaliPresetPageStatus::CaliPresetStatusInit }; + + bool m_show_custom_range { false }; + + MachineObject* curr_obj { nullptr }; +}; + +class MaxVolumetricSpeedPresetPage : public CalibrationPresetPage +{ +public: + MaxVolumetricSpeedPresetPage(wxWindow * parent, + CalibMode cali_mode, + bool custom_range = false, + wxWindowID id = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, + const wxSize & size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); +}; + +}} // namespace Slic3r::GUI + +#endif \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationWizardSavePage.cpp b/src/slic3r/GUI/CalibrationWizardSavePage.cpp new file mode 100644 index 0000000000..2c487f3336 --- /dev/null +++ b/src/slic3r/GUI/CalibrationWizardSavePage.cpp @@ -0,0 +1,1252 @@ +#include "CalibrationWizardSavePage.hpp" +#include "I18N.hpp" +#include "Widgets/Label.hpp" +#include "MsgDialog.hpp" + + +namespace Slic3r { namespace GUI { + + +static wxString get_default_name(wxString filament_type, CalibMode mode){ + switch (mode) + { + case Slic3r::CalibMode::Calib_None: + break; + case Slic3r::CalibMode::Calib_PA_Line: + if (filament_type.StartsWith("Generic")) { + filament_type.Replace("Generic", "Brand", true); + } + break; + case Slic3r::CalibMode::Calib_PA_Tower: + break; + case Slic3r::CalibMode::Calib_Flow_Rate: + filament_type += "Flow_Rate_Calibrated"; + break; + case Slic3r::CalibMode::Calib_Temp_Tower: + filament_type += "Temperature_Calibrated"; + break; + case Slic3r::CalibMode::Calib_Vol_speed_Tower: + filament_type += "Max_Volumetric_Speed_Calibrated"; + break; + case Slic3r::CalibMode::Calib_VFA_Tower: + break; + case Slic3r::CalibMode::Calib_Retraction_tower: + break; + default: + break; + } + return filament_type; +} + +CalibrationCommonSavePage::CalibrationCommonSavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationWizardPage(parent, id, pos, size, style) +{ + ; +} + +enum class GridTextInputType { + K, + N, + FlowRatio, + Name +}; + +class GridTextInput : public TextInput +{ +public: + GridTextInput(wxWindow* parent, wxString text, wxString label, wxSize size, int col_idx, GridTextInputType type); + int get_col_idx() { return m_col_idx; } + void set_col_idx(int idx) { m_col_idx = idx; } + GridTextInputType get_type() { return m_type; } + void set_type(GridTextInputType type) { m_type = type; } +private: + int m_col_idx; + GridTextInputType m_type; +}; + +GridTextInput::GridTextInput(wxWindow* parent, wxString text, wxString label, wxSize size, int col_idx, GridTextInputType type) + : TextInput(parent, text, label, "", wxDefaultPosition, size, wxTE_PROCESS_ENTER) + , m_col_idx(col_idx) + , m_type(type) +{ +} + +class GridComboBox : public ComboBox { +public: + GridComboBox(wxWindow* parent, wxSize size, int col_idx); + int get_col_idx() { return m_col_idx; } + void set_col_idx(int idx) { m_col_idx = idx; } +private: + int m_col_idx; +}; + +GridComboBox::GridComboBox(wxWindow* parent, wxSize size, int col_idx) + : ComboBox(parent, wxID_ANY, "", wxDefaultPosition, size, 0, nullptr) + , m_col_idx(col_idx) +{ + +} + +CaliPASaveAutoPanel::CaliPASaveAutoPanel( + wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) + : wxPanel(parent, id, pos, size, style) +{ + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_panel(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + + +void CaliPASaveAutoPanel::create_panel(wxWindow* parent) +{ + auto complete_text_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL); + auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("We found the best Pressure Advance Factor")); + complete_text->SetFont(Label::Head_14); + complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER); + complete_text_panel->SetSizer(complete_text_sizer); + m_top_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0); + + m_top_sizer->AddSpacer(FromDIP(20)); + + m_grid_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_top_sizer->Add(m_grid_panel, 0, wxALIGN_CENTER); +} + +void CaliPASaveAutoPanel::sync_cali_result(const std::vector& cali_result) +{ + m_calib_results = cali_result; + m_grid_panel->DestroyChildren(); + auto grid_sizer = new wxBoxSizer(wxHORIZONTAL); + const int COLUMN_GAP = FromDIP(50); + const int ROW_GAP = FromDIP(30); + wxBoxSizer* left_title_sizer = new wxBoxSizer(wxVERTICAL); + left_title_sizer->AddSpacer(FromDIP(52)); + auto k_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0); + k_title->SetFont(Label::Head_14); + left_title_sizer->Add(k_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + auto n_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0); + n_title->SetFont(Label::Head_14); + // hide n value + n_title->Hide(); + left_title_sizer->Add(n_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + auto brand_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0); + brand_title->SetFont(Label::Head_14); + left_title_sizer->Add(brand_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + grid_sizer->Add(left_title_sizer); + grid_sizer->AddSpacer(COLUMN_GAP); + + int index = 0; + for (auto& item : cali_result) { + bool result_failed = false; + if (item.confidence != 0) + result_failed = true; + + wxBoxSizer* column_data_sizer = new wxBoxSizer(wxVERTICAL); + auto tray_title = new wxStaticText(m_grid_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0); + tray_title->SetFont(Label::Head_14); + char prefix = 'A' + (item.tray_id / 4); + char suffix = '0' + 1 + item.tray_id % 4; + wxString tray_name = std::string(1, prefix) + std::string(1, suffix); + tray_title->SetLabel(tray_name); + + auto k_value = new GridTextInput(m_grid_panel, "", "", CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id, GridTextInputType::K); + auto n_value = new GridTextInput(m_grid_panel, "", "", CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id, GridTextInputType::N); + k_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + n_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + auto k_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); + auto n_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); + + auto comboBox_tray_name = new GridComboBox(m_grid_panel, CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id); + auto tray_name_failed = new wxStaticText(m_grid_panel, wxID_ANY, " - ", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); + wxArrayString selections; + static std::vector filtered_results; + filtered_results.clear(); + // TODO get history + //for (auto history : m_calib_results_history) { + // if (history.setting_id == m_filament_presets[fcb->get_tray_id()]->setting_id) { + // filtered_results.push_back(history); + // selections.push_back(history.name); + // } + //} + comboBox_tray_name->Set(selections); + + column_data_sizer->Add(tray_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(k_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(n_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(k_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(n_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(comboBox_tray_name, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(tray_name_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + + auto set_edit_mode = [this, k_value, n_value, k_value_failed, n_value_failed, comboBox_tray_name, tray_name_failed](std::string str) { + if (str == "normal") { + comboBox_tray_name->Show(); + tray_name_failed->Show(false); + k_value->Show(); + n_value->Show(); + k_value_failed->Show(false); + n_value_failed->Show(false); + } + if (str == "failed") { + comboBox_tray_name->Show(false); + tray_name_failed->Show(); + k_value->Show(false); + n_value->Show(false); + k_value_failed->Show(); + n_value_failed->Show(); + } + + // hide n value + n_value->Hide(); + n_value_failed->Hide(); + + m_grid_panel->Layout(); + m_grid_panel->Update(); + }; + + if (!result_failed) { + set_edit_mode("normal"); + + auto k_str = wxString::Format("%.3f", item.k_value); + auto n_str = wxString::Format("%.3f", item.n_coef); + k_value->GetTextCtrl()->SetValue(k_str); + n_value->GetTextCtrl()->SetValue(n_str); + for (auto& info : m_obj->selected_cali_preset) { + if (item.tray_id == info.tray_id) { + comboBox_tray_name->SetValue(get_default_name(info.name, CalibMode::Calib_PA_Line) + "_" + tray_name); + break; + } + else { + BOOST_LOG_TRIVIAL(trace) << "CaliPASaveAutoPanel : obj->selected_cali_preset doesn't contain correct tray_id"; + } + } + + comboBox_tray_name->Bind(wxEVT_COMBOBOX, [this, index, comboBox_tray_name, k_value, n_value](auto& e) { + int selection = comboBox_tray_name->GetSelection(); + auto history = filtered_results[selection]; + m_calib_results[index].name = history.name; + }); + } + else { + set_edit_mode("failed"); + } + + grid_sizer->Add(column_data_sizer); + grid_sizer->AddSpacer(COLUMN_GAP); + index++; + } + + m_grid_panel->SetSizer(grid_sizer, true); + m_grid_panel->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + SetFocusIgnoringChildren(); + }); + Layout(); +} + +void CaliPASaveAutoPanel::save_to_result_from_widgets(wxWindow* window, bool* out_is_valid) { + if (!window) + return; + + //operate + auto input = dynamic_cast(window); + if (input) { + int tray_id = input->get_col_idx(); + if (input->get_type() == GridTextInputType::K) { + float k = 0.0f; + if (!CalibUtils::validate_input_k_value(input->GetTextCtrl()->GetValue(), &k)) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + *out_is_valid = false; + } + m_calib_results[tray_id].k_value = k; + } + else if (input->get_type() == GridTextInputType::N) { + } + } + + auto comboBox = dynamic_cast(window); + if (comboBox) { + int tray_id = comboBox->get_col_idx(); + wxString name = comboBox->GetTextCtrl()->GetValue().ToStdString(); + if (name.IsEmpty()) { + MessageDialog msg_dlg(nullptr, _L("Please enter the name you want to save to printer."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + *out_is_valid = false; + } + else if (name.Length() > 20) { + MessageDialog msg_dlg(nullptr, _L("The name cannot exceed 20 characters."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + *out_is_valid = false; + } + m_calib_results[tray_id].name = name.ToStdString(); + } + + auto childern = window->GetChildren(); + for (auto child : childern) { + save_to_result_from_widgets(child, out_is_valid); + } +}; + +bool CaliPASaveAutoPanel::get_result(std::vector& out_result) { + // Check if the value is valid and save to m_calib_results + bool is_valid = true; + save_to_result_from_widgets(m_grid_panel, &is_valid); + if (is_valid) { + out_result = m_calib_results; + return true; + } + else { + return false; + } +} + +CaliPASaveManualPanel::CaliPASaveManualPanel( + wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) + : wxPanel(parent, id, pos, size, style) +{ + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_panel(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CaliPASaveManualPanel::create_panel(wxWindow* parent) +{ + auto complete_text_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL); + auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("Please find the best line on your plate")); + complete_text->SetFont(Label::Head_14); + complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER); + complete_text_panel->SetSizer(complete_text_sizer); + m_top_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0); + + m_top_sizer->AddSpacer(FromDIP(20)); + + m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); + m_top_sizer->Add(m_record_picture, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0); + set_save_img(); + + m_top_sizer->AddSpacer(FromDIP(20)); + + auto value_sizer = new wxBoxSizer(wxHORIZONTAL); + auto k_value_text = new wxStaticText(parent, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0); + k_value_text->Wrap(-1); + k_value_text->SetFont(::Label::Head_14); + auto n_value_text = new wxStaticText(parent, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0); + n_value_text->Wrap(-1); + n_value_text->SetFont(::Label::Head_14); + m_k_val = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0); + m_n_val = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0); + n_value_text->Hide(); + m_n_val->Hide(); + value_sizer->Add(k_value_text, 0, wxALIGN_CENTER_VERTICAL, 0); + value_sizer->AddSpacer(FromDIP(10)); + value_sizer->Add(m_k_val, 0); + value_sizer->AddSpacer(FromDIP(50)); + value_sizer->Add(n_value_text, 0, wxALIGN_CENTER_VERTICAL, 0); + value_sizer->AddSpacer(FromDIP(10)); + value_sizer->Add(m_n_val, 0); + m_top_sizer->Add(value_sizer, 0, wxALIGN_CENTER); + + m_top_sizer->AddSpacer(FromDIP(20)); + + auto save_text = new wxStaticText(parent, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0); + save_text->SetFont(Label::Head_14); + m_top_sizer->Add(save_text, 0, 0, 0); + + m_save_name_input = new TextInput(parent, "", "", "", wxDefaultPosition, { CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24) }, 0); + m_top_sizer->Add(m_save_name_input, 0, 0, 0); + + Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + SetFocusIgnoringChildren(); + }); +} + +void CaliPASaveManualPanel::set_save_img() { + m_record_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400)); +} + +void CaliPASaveManualPanel::set_default_name(const wxString& name) { + m_save_name_input->GetTextCtrl()->SetValue(name); +} + +bool CaliPASaveManualPanel::get_result(PACalibResult& out_result) { + // Check if the value is valid + float k; + if (!CalibUtils::validate_input_k_value(m_k_val->GetTextCtrl()->GetValue(), &k)) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + + wxString name = m_save_name_input->GetTextCtrl()->GetValue(); + if (name.IsEmpty()) { + MessageDialog msg_dlg(nullptr, _L("Please enter the name you want to save to printer."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + else if (name.Length() > 20) { + MessageDialog msg_dlg(nullptr, _L("The name cannot exceed 20 characters."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + + out_result.k_value = k; + out_result.name = name.ToStdString(); + if (m_obj) { + assert(m_obj->selected_cali_preset.size() <= 1); + if (!m_obj->selected_cali_preset.empty()) { + out_result.tray_id = m_obj->selected_cali_preset[0].tray_id; + out_result.nozzle_diameter = m_obj->selected_cali_preset[0].nozzle_diameter; + out_result.filament_id = m_obj->selected_cali_preset[0].filament_id; + out_result.setting_id = m_obj->selected_cali_preset[0].setting_id; + } + else { + BOOST_LOG_TRIVIAL(trace) << "CaliPASaveManual: obj->selected_cali_preset is empty"; + return false; + } + } + else { + BOOST_LOG_TRIVIAL(trace) << "CaliPASaveManual::get_result(): obj is nullptr"; + return false; + } + + return true; +} + +bool CaliPASaveManualPanel::Show(bool show) { + if (show) { + if (m_obj) { + assert(m_obj->selected_cali_preset.size() <= 1); + if (!m_obj->selected_cali_preset.empty()) { + wxString default_name = get_default_name(m_obj->selected_cali_preset[0].name, CalibMode::Calib_PA_Line); + set_default_name(default_name); + } + } + else { + BOOST_LOG_TRIVIAL(trace) << "CaliPASaveManual::Show(): obj is nullptr"; + } + } + return wxPanel::Show(show); +} + +CaliPASaveP1PPanel::CaliPASaveP1PPanel( + wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style) + : wxPanel(parent, id, pos, size, style) +{ + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_panel(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CaliPASaveP1PPanel::create_panel(wxWindow* parent) +{ + auto complete_text_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL); + auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("Please find the best line on your plate")); + complete_text->SetFont(Label::Head_14); + complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER); + complete_text_panel->SetSizer(complete_text_sizer); + m_top_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0); + + m_top_sizer->AddSpacer(FromDIP(20)); + + m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); + m_top_sizer->Add(m_record_picture, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0); + set_save_img(); + + m_top_sizer->AddSpacer(FromDIP(20)); + + auto value_sizer = new wxBoxSizer(wxHORIZONTAL); + auto k_value_text = new wxStaticText(parent, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0); + k_value_text->Wrap(-1); + k_value_text->SetFont(::Label::Head_14); + auto n_value_text = new wxStaticText(parent, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0); + n_value_text->Wrap(-1); + n_value_text->SetFont(::Label::Head_14); + m_k_val = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0); + m_n_val = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0); + n_value_text->Hide(); + m_n_val->Hide(); + value_sizer->Add(k_value_text, 0, wxALIGN_CENTER_VERTICAL, 0); + value_sizer->AddSpacer(FromDIP(10)); + value_sizer->Add(m_k_val, 0); + value_sizer->AddSpacer(FromDIP(50)); + value_sizer->Add(n_value_text, 0, wxALIGN_CENTER_VERTICAL, 0); + value_sizer->AddSpacer(FromDIP(10)); + value_sizer->Add(m_n_val, 0); + m_top_sizer->Add(value_sizer, 0, wxALIGN_CENTER); + + Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + SetFocusIgnoringChildren(); + }); +} + +void CaliPASaveP1PPanel::set_save_img() { + m_record_picture->SetBitmap(create_scaled_bitmap("extrusion_calibration_tips_en", nullptr, 400)); +} + +bool CaliPASaveP1PPanel::get_result(float* out_k, float* out_n){ + // Check if the value is valid + if (!CalibUtils::validate_input_k_value(m_k_val->GetTextCtrl()->GetValue(), out_k)) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + return true; +} + +CaliSavePresetValuePanel::CaliSavePresetValuePanel( + wxWindow *parent, + wxWindowID id, + const wxPoint &pos, + const wxSize &size, + long style) + : wxPanel(parent, id, pos, size, style) +{ + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_panel(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CaliSavePresetValuePanel::create_panel(wxWindow *parent) +{ + m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); + + m_value_title = new wxStaticText(parent, wxID_ANY, _L("Input Value"), wxDefaultPosition, wxDefaultSize, 0); + m_value_title->SetFont(Label::Head_14); + m_value_title->Wrap(-1); + m_input_value = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, wxTE_PROCESS_ENTER); + m_input_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + + m_save_name_title = new wxStaticText(parent, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0); + m_save_name_title->Wrap(-1); + m_save_name_title->SetFont(Label::Head_14); + + m_input_name = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, {CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24)}, 0); + + m_top_sizer->Add(m_record_picture, 0, wxALIGN_CENTER); + m_top_sizer->AddSpacer(FromDIP(20)); + m_top_sizer->Add(m_value_title, 0, wxALIGN_CENTER); + m_top_sizer->AddSpacer(FromDIP(10)); + m_top_sizer->Add(m_input_value, 0, wxALIGN_CENTER); + m_top_sizer->AddSpacer(FromDIP(20)); + m_top_sizer->Add(m_save_name_title, 0, wxALIGN_CENTER); + m_top_sizer->AddSpacer(FromDIP(10)); + m_top_sizer->Add(m_input_name, 0, wxALIGN_CENTER); +} + +void CaliSavePresetValuePanel::set_img(const std::string& bmp_name_in) +{ + m_record_picture->SetBitmap(create_scaled_bitmap(bmp_name_in, nullptr, 400)); +} + +void CaliSavePresetValuePanel::set_value_title(const wxString& title) { + m_value_title->SetLabel(title); +} + +void CaliSavePresetValuePanel::set_save_name_title(const wxString& title) { + m_save_name_title->SetLabel(title); +} + +void CaliSavePresetValuePanel::get_value(double& value) +{ + m_input_value->GetTextCtrl()->GetValue().ToDouble(&value); +} + +void CaliSavePresetValuePanel::get_save_name(std::string& name) +{ + name = m_input_name->GetTextCtrl()->GetValue().ToStdString(); +} + +void CaliSavePresetValuePanel::set_save_name(const std::string& name) +{ + m_input_name->GetTextCtrl()->SetValue(name); +} + +CalibrationPASavePage::CalibrationPASavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationCommonSavePage(parent, id, pos, size, style) +{ + m_cali_mode = CalibMode::Calib_PA_Line; + + m_page_type = CaliPageType::CALI_PAGE_PA_SAVE; + + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationPASavePage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, m_cali_mode); + m_page_caption->show_prev_btn(true); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration")); + steps.Add(_L("Record")); + m_step_panel = new CaliPageStepGuide(parent, steps); + m_step_panel->set_steps(2); + m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0); + + m_manual_panel = new CaliPASaveManualPanel(parent, wxID_ANY); + m_auto_panel = new CaliPASaveAutoPanel(parent, wxID_ANY); + m_p1p_panel = new CaliPASaveP1PPanel(parent, wxID_ANY); + + m_top_sizer->Add(m_manual_panel, 0); + m_top_sizer->Add(m_auto_panel, 0); + m_top_sizer->Add(m_p1p_panel, 0); + + m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_PA_SAVE); + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); +} + +void CalibrationPASavePage::sync_cali_result(MachineObject* obj) +{ + // only auto need sync cali_result + if (obj && m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { + m_auto_panel->sync_cali_result(obj->pa_calib_results); + } else { + std::vector empty_result; + m_auto_panel->sync_cali_result(empty_result); + } +} + +void CalibrationPASavePage::show_panels(CalibrationMethod method, const std::string& printer_type) { + if (printer_type == "BL-P001" + || printer_type == "BL-P002") { + if (method == CalibrationMethod::CALI_METHOD_MANUAL) { + m_manual_panel->Show(); + m_auto_panel->Show(false); + } + else { + m_auto_panel->Show(); + m_manual_panel->Show(false); + } + m_p1p_panel->Show(false); + } + else if (printer_type == "C11" + || printer_type == "C12") { + m_auto_panel->Show(false); + m_manual_panel->Show(false); + m_p1p_panel->Show(); + } + Layout(); +} + +void CalibrationPASavePage::set_cali_method(CalibrationMethod method) +{ + CalibrationWizardPage::set_cali_method(method); + if (curr_obj) { + show_panels(method, curr_obj->printer_type); + } +} + +void CalibrationPASavePage::on_device_connected(MachineObject* obj) +{ + ; +} + +void CalibrationPASavePage::update(MachineObject* obj) +{ + CalibrationWizardPage::update(obj); + + if (m_auto_panel && m_auto_panel->IsShown()) + m_auto_panel->set_machine_obj(obj); + if (m_manual_panel && m_manual_panel->IsShown()) + m_manual_panel->set_machine_obj(obj); +} + +CalibrationFlowX1SavePage::CalibrationFlowX1SavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationCommonSavePage(parent, id, pos, size, style) +{ + m_cali_mode = CalibMode::Calib_Flow_Rate; + + m_page_type = CaliPageType::CALI_PAGE_FLOW_SAVE; + + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationFlowX1SavePage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, m_cali_mode); + m_page_caption->show_prev_btn(true); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration")); + steps.Add(_L("Record")); + m_step_panel = new CaliPageStepGuide(parent, steps); + m_step_panel->set_steps(2); + m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0); + + auto complete_text_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + wxBoxSizer* complete_text_sizer = new wxBoxSizer(wxVERTICAL); + auto complete_text = new wxStaticText(complete_text_panel, wxID_ANY, _L("We found the best flow ratio for you")); + complete_text->SetFont(Label::Head_14); + complete_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + complete_text_sizer->Add(complete_text, 0, wxALIGN_CENTER); + complete_text_panel->SetSizer(complete_text_sizer); + m_top_sizer->Add(complete_text_panel, 0, wxALIGN_CENTER, 0); + + m_top_sizer->AddSpacer(FromDIP(20)); + + m_grid_panel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_top_sizer->Add(m_grid_panel, 0, wxALIGN_CENTER); + + m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_FLOW_SAVE); + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); +} + +void CalibrationFlowX1SavePage::sync_cali_result(const std::vector& cali_result) +{ + m_save_results.clear(); + m_grid_panel->DestroyChildren(); + wxBoxSizer* grid_sizer = new wxBoxSizer(wxHORIZONTAL); + const int COLUMN_GAP = FromDIP(50); + const int ROW_GAP = FromDIP(30); + wxBoxSizer* left_title_sizer = new wxBoxSizer(wxVERTICAL); + left_title_sizer->AddSpacer(FromDIP(49)); + auto flow_ratio_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Flow Ratio"), wxDefaultPosition, wxDefaultSize, 0); + flow_ratio_title->SetFont(Label::Head_14); + left_title_sizer->Add(flow_ratio_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + auto brand_title = new wxStaticText(m_grid_panel, wxID_ANY, _L("Brand Name"), wxDefaultPosition, wxDefaultSize, 0); + brand_title->SetFont(Label::Head_14); + left_title_sizer->Add(brand_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + grid_sizer->Add(left_title_sizer); + grid_sizer->AddSpacer(COLUMN_GAP); + + for (auto& item : cali_result) { + bool result_failed = false; + if (item.confidence != 0) + result_failed = true; + + wxBoxSizer* column_data_sizer = new wxBoxSizer(wxVERTICAL); + auto tray_title = new wxStaticText(m_grid_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0); + tray_title->SetFont(Label::Head_14); + char prefix = 'A' + (item.tray_id / 4); + char suffix = '0' + 1 + item.tray_id % 4; + wxString tray_name = std::string(1, prefix) + std::string(1, suffix); + tray_title->SetLabel(tray_name); + + auto flow_ratio_value = new GridTextInput(m_grid_panel, "", "", CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id, GridTextInputType::FlowRatio); + flow_ratio_value->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + auto flow_ratio_value_failed = new wxStaticText(m_grid_panel, wxID_ANY, _L("Failed"), wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); + + auto save_name_input = new GridTextInput(m_grid_panel, "", "", CALIBRATION_FROM_TO_INPUT_SIZE, item.tray_id, GridTextInputType::Name); + auto save_name_input_failed = new wxStaticText(m_grid_panel, wxID_ANY, " - ", wxDefaultPosition, CALIBRATION_FROM_TO_INPUT_SIZE); + + column_data_sizer->Add(tray_title, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(flow_ratio_value, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(flow_ratio_value_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(save_name_input, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + column_data_sizer->Add(save_name_input_failed, 0, wxALIGN_CENTER | wxBOTTOM, ROW_GAP); + + auto set_edit_mode = [this, flow_ratio_value, flow_ratio_value_failed, save_name_input, save_name_input_failed](std::string str) { + if (str == "normal") { + save_name_input->Show(); + save_name_input_failed->Show(false); + flow_ratio_value->Show(); + flow_ratio_value_failed->Show(false); + } + if (str == "failed") { + save_name_input->Show(false); + save_name_input_failed->Show(); + flow_ratio_value->Show(false); + flow_ratio_value_failed->Show(); + } + m_grid_panel->Layout(); + m_grid_panel->Update(); + }; + + if (!result_failed) { + set_edit_mode("normal"); + + auto flow_ratio_str = wxString::Format("%.3f", item.flow_ratio); + flow_ratio_value->GetTextCtrl()->SetValue(flow_ratio_str); + for (auto& info : curr_obj->selected_cali_preset) { + if (item.tray_id == info.tray_id) { + save_name_input->GetTextCtrl()->SetValue(get_default_name(info.name, CalibMode::Calib_Flow_Rate) + "_" + tray_name); + break; + } + else { + BOOST_LOG_TRIVIAL(trace) << "CalibrationFlowX1Save : obj->selected_cali_preset doesn't contain correct tray_id"; + } + } + } + else { + set_edit_mode("failed"); + } + + grid_sizer->Add(column_data_sizer); + grid_sizer->AddSpacer(COLUMN_GAP); + } + m_grid_panel->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + m_grid_panel->SetFocusIgnoringChildren(); + }); + m_grid_panel->SetSizer(grid_sizer, true); + Layout(); +} + +void CalibrationFlowX1SavePage::save_to_result_from_widgets(wxWindow* window, bool* out_is_valid) +{ + if (!window) + return; + + //operate + auto input = dynamic_cast(window); + if (input) { + int tray_id = input->get_col_idx(); + if (input->get_type() == GridTextInputType::FlowRatio) { + float flow_ratio = 0.0f; + if (!CalibUtils::validate_input_flow_ratio(input->GetTextCtrl()->GetValue(), &flow_ratio)) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0.0 < flow ratio < 0.2)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + *out_is_valid = false; + } + m_save_results[tray_id].second = flow_ratio; + } + else if (input->get_type() == GridTextInputType::Name) { + if (input->GetTextCtrl()->GetValue().IsEmpty()) { + MessageDialog msg_dlg(nullptr, _L("Please enter the name of the preset you want to save."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + *out_is_valid = false; + } + m_save_results[tray_id].first = input->GetTextCtrl()->GetValue().ToStdString(); + } + } + + auto childern = window->GetChildren(); + for (auto child : childern) { + save_to_result_from_widgets(child, out_is_valid); + } +} + +bool CalibrationFlowX1SavePage::get_result(std::vector>& out_results) +{ + // Check if the value is valid and save to m_calib_results + bool is_valid = true; + save_to_result_from_widgets(m_grid_panel, &is_valid); + if (is_valid) { + // obj->cali_result contain failure results, so use m_save_results to record value + for (auto& item : m_save_results) { + out_results.push_back(item.second); + } + return true; + } + else { + return false; + } +} + +CalibrationFlowCoarseSavePage::CalibrationFlowCoarseSavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationCommonSavePage(parent, id, pos, size, style) +{ + m_cali_mode = CalibMode::Calib_Flow_Rate; + + m_page_type = CaliPageType::CALI_PAGE_COARSE_SAVE; + + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationFlowCoarseSavePage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, m_cali_mode); + m_page_caption->show_prev_btn(true); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration1")); + steps.Add(_L("Calibration2")); + steps.Add(_L("Record")); + m_step_panel = new CaliPageStepGuide(parent, steps); + m_step_panel->set_steps(1); + m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0); + + auto complete_text = new wxStaticText(parent, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0); + complete_text->SetFont(Label::Head_14); + complete_text->Wrap(-1); + m_top_sizer->Add(complete_text, 0, 0, 0); + m_top_sizer->AddSpacer(FromDIP(20)); + + m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); + m_top_sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0); + set_save_img(); + + m_top_sizer->AddSpacer(FromDIP(20)); + + auto coarse_value_sizer = new wxBoxSizer(wxVERTICAL); + auto coarse_value_text = new wxStaticText(parent, wxID_ANY, _L("Fill in the value above the block with smoothest top surface"), wxDefaultPosition, wxDefaultSize, 0); + coarse_value_text->SetFont(Label::Head_14); + coarse_value_text->Wrap(-1); + m_optimal_block_coarse = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0, nullptr, wxCB_READONLY); + wxArrayString coarse_block_items; + for (int i = 0; i < 9; i++) { + coarse_block_items.Add(std::to_string(-20 + (i * 5))); + } + m_optimal_block_coarse->Set(coarse_block_items); + auto coarse_calc_result_text = new wxStaticText(parent, wxID_ANY, ""); + coarse_value_sizer->Add(coarse_value_text, 0, 0); + coarse_value_sizer->Add(m_optimal_block_coarse, 0, 0); + coarse_value_sizer->Add(coarse_calc_result_text, 0); + m_top_sizer->Add(coarse_value_sizer, 0, 0, 0); + m_top_sizer->AddSpacer(FromDIP(20)); + + auto checkBox_panel = new wxPanel(parent); + auto cb_sizer = new wxBoxSizer(wxHORIZONTAL); + checkBox_panel->SetSizer(cb_sizer); + auto checkBox_skip_calibration = new CheckBox(checkBox_panel); + cb_sizer->Add(checkBox_skip_calibration); + + auto cb_text = new wxStaticText(checkBox_panel, wxID_ANY, _L("Skip Calibration2")); + cb_sizer->Add(cb_text); + cb_text->Bind(wxEVT_LEFT_DOWN, [this, checkBox_skip_calibration](auto&) { + checkBox_skip_calibration->SetValue(!checkBox_skip_calibration->GetValue()); + wxCommandEvent event(wxEVT_TOGGLEBUTTON); + event.SetEventObject(checkBox_skip_calibration); + checkBox_skip_calibration->GetEventHandler()->ProcessEvent(event); + }); + + m_top_sizer->Add(checkBox_panel, 0, 0, 0); + + auto save_panel = new wxPanel(parent); + auto save_sizer = new wxBoxSizer(wxVERTICAL); + save_panel->SetSizer(save_sizer); + + auto save_text = new wxStaticText(save_panel, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0); + save_text->Wrap(-1); + save_text->SetFont(Label::Head_14); + save_sizer->Add(save_text, 0, 0, 0); + + m_save_name_input = new TextInput(save_panel, "", "", "", wxDefaultPosition, {CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24)}, 0); + save_sizer->Add(m_save_name_input, 0, 0, 0); + + m_top_sizer->Add(save_panel, 0, 0, 0); + save_panel->Hide(); + + checkBox_skip_calibration->Bind(wxEVT_TOGGLEBUTTON, [this, save_panel, checkBox_skip_calibration](wxCommandEvent& e) { + if (checkBox_skip_calibration->GetValue()) { + m_skip_fine_calibration = true; + save_panel->Show(); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2, false); + } + else { + m_skip_fine_calibration = false; + save_panel->Hide(); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE, false); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_CALI_STAGE_2); + } + Layout(); + e.Skip(); + }); + + m_optimal_block_coarse->Bind(wxEVT_COMBOBOX, [this, coarse_calc_result_text](auto& e) { + m_coarse_flow_ratio = m_curr_flow_ratio * (100.0f + stof(m_optimal_block_coarse->GetValue().ToStdString())) / 100.0f; + coarse_calc_result_text->SetLabel(wxString::Format(_L("flow ratio : %s "), std::to_string(m_coarse_flow_ratio))); + }); + + m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_COARSE_SAVE); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_FLOW_COARSE_SAVE, false); + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); +} + +void CalibrationFlowCoarseSavePage::set_save_img() { + m_record_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration", nullptr, 400)); +} + +void CalibrationFlowCoarseSavePage::set_default_name(const wxString& name) { + m_save_name_input->GetTextCtrl()->SetValue(name); +} + +bool CalibrationFlowCoarseSavePage::is_skip_fine_calibration() { + return m_skip_fine_calibration; +} + +void CalibrationFlowCoarseSavePage::set_curr_flow_ratio(const float value) { + m_curr_flow_ratio = value; +} + +bool CalibrationFlowCoarseSavePage::get_result(float* out_value, wxString* out_name) { + if (!m_skip_fine_calibration) + return false; + + // Check if the value is valid + if (m_coarse_flow_ratio <= 0.0 || m_coarse_flow_ratio >= 2.0) { + MessageDialog msg_dlg(nullptr, _L("Please choose a block with smoothest top surface"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + if (m_save_name_input->GetTextCtrl()->GetValue().IsEmpty()) { + MessageDialog msg_dlg(nullptr, _L("Please enter the name of the preset you want to save."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + *out_value = m_coarse_flow_ratio; + *out_name = m_save_name_input->GetTextCtrl()->GetValue(); + return true; +} + +bool CalibrationFlowCoarseSavePage::Show(bool show) { + if (show) { + if (curr_obj) { + assert(curr_obj->selected_cali_preset.size() <= 1); + if (!curr_obj->selected_cali_preset.empty()) { + wxString default_name = get_default_name(curr_obj->selected_cali_preset[0].name, CalibMode::Calib_Flow_Rate); + set_default_name(default_name); + } + } + else { + BOOST_LOG_TRIVIAL(trace) << "CalibrationFlowCoarseSave::Show(): obj is nullptr"; + } + } + return wxPanel::Show(show); +} + +CalibrationFlowFineSavePage::CalibrationFlowFineSavePage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationCommonSavePage(parent, id, pos, size, style) +{ + m_cali_mode = CalibMode::Calib_Flow_Rate; + + m_page_type = CaliPageType::CALI_PAGE_FINE_SAVE; + + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationFlowFineSavePage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, m_cali_mode); + m_page_caption->show_prev_btn(true); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration1")); + steps.Add(_L("Calibration2")); + steps.Add(_L("Record")); + m_step_panel = new CaliPageStepGuide(parent, steps); + m_step_panel->set_steps(3); + m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0); + + auto complete_text = new wxStaticText(parent, wxID_ANY, _L("Please find the best object on your plate"), wxDefaultPosition, wxDefaultSize, 0); + complete_text->SetFont(Label::Head_14); + complete_text->Wrap(-1); + m_top_sizer->Add(complete_text, 0, 0, 0); + m_top_sizer->AddSpacer(FromDIP(20)); + + m_record_picture = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); + m_top_sizer->Add(m_record_picture, 0, wxALIGN_CENTER, 0); + set_save_img(); + + m_top_sizer->AddSpacer(FromDIP(20)); + + auto fine_value_sizer = new wxBoxSizer(wxVERTICAL); + auto fine_value_text = new wxStaticText(parent, wxID_ANY, _L("Fill in the value above the block with smoothest top surface"), wxDefaultPosition, wxDefaultSize, 0); + fine_value_text->Wrap(-1); + fine_value_text->SetFont(::Label::Head_14); + m_optimal_block_fine = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_OPTIMAL_INPUT_SIZE, 0, nullptr, wxCB_READONLY); + wxArrayString fine_block_items; + for (int i = 0; i < 10; i++) { + fine_block_items.Add(std::to_string(-9 + (i))); + } + m_optimal_block_fine->Set(fine_block_items); + auto fine_calc_result_text = new wxStaticText(parent, wxID_ANY, ""); + fine_value_sizer->Add(fine_value_text, 0, 0); + fine_value_sizer->Add(m_optimal_block_fine, 0, 0); + fine_value_sizer->Add(fine_calc_result_text, 0); + m_top_sizer->Add(fine_value_sizer, 0, 0, 0); + m_top_sizer->AddSpacer(FromDIP(20)); + + auto save_text = new wxStaticText(parent, wxID_ANY, _L("Save to Filament Preset"), wxDefaultPosition, wxDefaultSize, 0); + save_text->Wrap(-1); + save_text->SetFont(Label::Head_14); + m_top_sizer->Add(save_text, 0, 0, 0); + + m_save_name_input = new TextInput(parent, "", "", "", wxDefaultPosition, {CALIBRATION_TEXT_MAX_LENGTH, FromDIP(24)}, 0); + m_top_sizer->Add(m_save_name_input, 0, 0, 0); + + m_optimal_block_fine->Bind(wxEVT_COMBOBOX, [this, fine_calc_result_text](auto& e) { + m_fine_flow_ratio = m_curr_flow_ratio * (100.0f + stof(m_optimal_block_fine->GetValue().ToStdString())) / 100.0f; + fine_calc_result_text->SetLabel(wxString::Format(_L("flow ratio : %s "), std::to_string(m_fine_flow_ratio))); + }); + + m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_FINE_SAVE); + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); +} + +void CalibrationFlowFineSavePage::set_save_img() { + m_record_picture->SetBitmap(create_scaled_bitmap("flow_rate_calibration_fine", nullptr, 400)); +} + +void CalibrationFlowFineSavePage::set_default_name(const wxString& name) { + m_save_name_input->GetTextCtrl()->SetValue(name); +} + +void CalibrationFlowFineSavePage::set_curr_flow_ratio(const float value) { + m_curr_flow_ratio = value; +} + +bool CalibrationFlowFineSavePage::get_result(float* out_value, wxString* out_name) { + // Check if the value is valid + if (m_fine_flow_ratio <= 0.0 || m_fine_flow_ratio >= 2.0) { + MessageDialog msg_dlg(nullptr, _L("Please choose a block with smoothest top surface."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + if (m_save_name_input->GetTextCtrl()->GetValue().IsEmpty()) { + MessageDialog msg_dlg(nullptr, _L("Please enter the name of the preset you want to save."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + *out_value = m_fine_flow_ratio; + *out_name = m_save_name_input->GetTextCtrl()->GetValue(); + return true; +} + +bool CalibrationFlowFineSavePage::Show(bool show) { + if (show) { + if (curr_obj) { + assert(curr_obj->selected_cali_preset.size() <= 1); + if (!curr_obj->selected_cali_preset.empty()) { + wxString default_name = get_default_name(curr_obj->selected_cali_preset[0].name, CalibMode::Calib_Flow_Rate); + set_default_name(default_name); + } + } + else { + BOOST_LOG_TRIVIAL(trace) << "CalibrationFlowFineSave::Show(): obj is nullptr"; + } + } + return wxPanel::Show(show); +} + +CalibrationMaxVolumetricSpeedSavePage::CalibrationMaxVolumetricSpeedSavePage( + wxWindow *parent, + wxWindowID id, + const wxPoint &pos, + const wxSize &size, + long style) + : CalibrationCommonSavePage(parent, id, pos, size, style) +{ + m_cali_mode = CalibMode::Calib_Vol_speed_Tower; + + m_page_type = CaliPageType::CALI_PAGE_COMMON_SAVE; + + m_top_sizer = new wxBoxSizer(wxVERTICAL); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationMaxVolumetricSpeedSavePage::create_page(wxWindow *parent) +{ + m_page_caption = new CaliPageCaption(parent, m_cali_mode); + m_page_caption->show_prev_btn(true); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + + wxArrayString steps; + steps.Add(_L("Preset")); + steps.Add(_L("Calibration")); + steps.Add(_L("Record")); + m_step_panel = new CaliPageStepGuide(parent, steps); + m_step_panel->set_steps(2); + m_top_sizer->Add(m_step_panel, 0, wxEXPAND, 0); + + m_save_preset_panel = new CaliSavePresetValuePanel(parent, wxID_ANY); + + set_save_img(); + + m_top_sizer->Add(m_save_preset_panel, 0); + + m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_COMMON_SAVE); + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); +} + +void CalibrationMaxVolumetricSpeedSavePage::set_save_img() { + m_save_preset_panel->set_img("max_volumetric_speed_calibration"); +} + +bool CalibrationMaxVolumetricSpeedSavePage::get_save_result(double& value, std::string& name) { + // Check if the value is valid + m_save_preset_panel->get_save_name(name); + m_save_preset_panel->get_value(value); + if (value < 0 || value > 60) { + MessageDialog msg_dlg(nullptr, _L("Please input a valid value (0 <= Max Volumetric Speed <= 60)"), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + if (name.empty()) { + MessageDialog msg_dlg(nullptr, _L("Please enter the name of the preset you want to save."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return false; + } + return true; +} + +bool CalibrationMaxVolumetricSpeedSavePage::Show(bool show) { + if (show) { + if (curr_obj) { + assert(curr_obj->selected_cali_preset.size() <= 1); + if (!curr_obj->selected_cali_preset.empty()) { + wxString default_name = get_default_name(curr_obj->selected_cali_preset[0].name, CalibMode::Calib_Vol_speed_Tower); + m_save_preset_panel->set_save_name(default_name.ToStdString()); + } + } + else { + BOOST_LOG_TRIVIAL(trace) << "CalibrationMaxVolumetricSpeedSave::Show(): obj is nullptr"; + } + } + return wxPanel::Show(show); +} + + +}} \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationWizardSavePage.hpp b/src/slic3r/GUI/CalibrationWizardSavePage.hpp new file mode 100644 index 0000000000..652fbe9f8d --- /dev/null +++ b/src/slic3r/GUI/CalibrationWizardSavePage.hpp @@ -0,0 +1,284 @@ +#ifndef slic3r_GUI_CalibrationWizardSavePage_hpp_ +#define slic3r_GUI_CalibrationWizardSavePage_hpp_ + +#include "CalibrationWizardPage.hpp" +#include "Widgets/TextInput.hpp" + +namespace Slic3r { namespace GUI { + +enum CaliSaveStyle { + CALI_SAVE_P1P_STYLE = 0, + CALI_SAVE_X1_STYLE, +}; + + +class CalibrationCommonSavePage : public CalibrationWizardPage +{ +public: + CalibrationCommonSavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); + +protected: + wxBoxSizer* m_top_sizer; +}; + +class PAColumnDataPanel : wxPanel { +public: + PAColumnDataPanel( + wxWindow* parent, + bool is_failed, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + bool is_failed() { return m_is_failed; } + int get_col_idx() { return m_col_idx; } + wxString get_k_str(); + wxString get_n_str(); + wxString get_name(); + void set_data(wxString k_str, wxString n_str, wxString name); + +private: + wxBoxSizer* m_top_sizer; + TextInput* m_k_value_input; + TextInput* m_n_value_input; + ComboBox* m_comboBox_tray_name; + int m_col_idx; + bool m_is_failed; +}; + +class CaliSavePresetValuePanel : public wxPanel +{ +protected: + wxBoxSizer* m_top_sizer; + wxStaticBitmap* m_record_picture; + wxStaticText* m_value_title; + wxStaticText* m_save_name_title; + ::TextInput* m_input_value; + ::TextInput* m_input_name; + + +public: + CaliSavePresetValuePanel( + wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_panel(wxWindow* parent); + + void set_img(const std::string& bmp_name_in); + void set_value_title(const wxString& title); + void set_save_name_title(const wxString& title); + void get_value(double& value); + void get_save_name(std::string& name); + void set_save_name(const std::string& name); +}; + + +class CaliPASaveAutoPanel : public wxPanel +{ +public: + CaliPASaveAutoPanel( + wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_panel(wxWindow* parent); + + void set_machine_obj(MachineObject* obj) { m_obj = obj; } + + void sync_cali_result(const std::vector& cali_result); + void save_to_result_from_widgets(wxWindow* window, bool* out_is_valid); + bool get_result(std::vector& out_result); + +protected: + wxBoxSizer* m_top_sizer; + wxPanel* m_grid_panel{ nullptr }; + std::vector m_calib_results; + + MachineObject* m_obj; +}; + +class CaliPASaveManualPanel : public wxPanel +{ +public: + CaliPASaveManualPanel( + wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + void create_panel(wxWindow* parent); + void set_save_img(); + + void set_machine_obj(MachineObject* obj) { m_obj = obj; } + + void set_default_name(const wxString& name); + + bool get_result(PACalibResult& out_result); + + virtual bool Show(bool show = true) override; + +protected: + wxBoxSizer* m_top_sizer; + wxStaticBitmap* m_record_picture; + ::TextInput* m_save_name_input; + ::TextInput* m_k_val; + ::TextInput* m_n_val; + + MachineObject* m_obj; +}; + +class CaliPASaveP1PPanel : public wxPanel +{ +public: + CaliPASaveP1PPanel( + wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + void create_panel(wxWindow* parent); + void set_save_img(); + + bool get_result(float* out_k, float* out_n); + +protected: + wxBoxSizer* m_top_sizer; + wxStaticBitmap* m_record_picture; + ::TextInput* m_k_val; + ::TextInput* m_n_val; +}; + +class CalibrationPASavePage : public CalibrationCommonSavePage +{ +public: + CalibrationPASavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow* parent); + void set_cali_method(CalibrationMethod method) override; + // sync widget value from obj cali result + void sync_cali_result(MachineObject* obj); + bool get_auto_result(std::vector& result) { return m_auto_panel->get_result(result); } + bool get_manual_result(PACalibResult& result) { return m_manual_panel->get_result(result); } + bool get_p1p_result(float* k, float* n) { return m_p1p_panel->get_result(k, n); } + + void show_panels(CalibrationMethod method, const std::string& printer_type); + + void on_device_connected(MachineObject* obj); + + void update(MachineObject* obj) override; + +protected: + CaliPageStepGuide* m_step_panel { nullptr }; + CaliPASaveAutoPanel* m_auto_panel { nullptr }; + CaliPASaveManualPanel* m_manual_panel { nullptr }; + CaliPASaveP1PPanel* m_p1p_panel{ nullptr }; + + CaliSaveStyle m_save_style; + + std::vector m_calib_results_history; +}; + +class CalibrationFlowX1SavePage : public CalibrationCommonSavePage +{ +public: + CalibrationFlowX1SavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow* parent); + + // sync widget value from cali flow rate result + void sync_cali_result(const std::vector& cali_result); + void save_to_result_from_widgets(wxWindow* window, bool* out_is_valid); + bool get_result(std::vector>& out_results); + +protected: + CaliPageStepGuide* m_step_panel{ nullptr }; + wxPanel* m_grid_panel{ nullptr }; + + std::map> m_save_results; // map> +}; + +class CalibrationFlowCoarseSavePage : public CalibrationCommonSavePage +{ +public: + CalibrationFlowCoarseSavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow* parent); + void set_save_img(); + + void set_default_name(const wxString& name); + + bool is_skip_fine_calibration(); + + void set_curr_flow_ratio(float value); + + bool get_result(float* out_value, wxString* out_name); + + virtual bool Show(bool show = true) override; + +protected: + CaliPageStepGuide* m_step_panel{ nullptr }; + wxStaticBitmap* m_record_picture; + ComboBox* m_optimal_block_coarse; + TextInput* m_save_name_input; + + bool m_skip_fine_calibration = false; + float m_curr_flow_ratio; + float m_coarse_flow_ratio; +}; + +class CalibrationFlowFineSavePage : public CalibrationCommonSavePage +{ +public: + CalibrationFlowFineSavePage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow* parent); + void set_save_img(); + + void set_default_name(const wxString& name); + + void set_curr_flow_ratio(float value); + + bool get_result(float* out_value, wxString* out_name); + + virtual bool Show(bool show = true) override; + +protected: + CaliPageStepGuide* m_step_panel{ nullptr }; + wxStaticBitmap* m_record_picture; + ComboBox* m_optimal_block_fine; + TextInput* m_save_name_input; + + float m_curr_flow_ratio; + float m_fine_flow_ratio; +}; + +class CalibrationMaxVolumetricSpeedSavePage : public CalibrationCommonSavePage +{ +public: + CalibrationMaxVolumetricSpeedSavePage(wxWindow *parent, wxWindowID id = wxID_ANY, + const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow *parent); + void set_save_img(); + + bool get_save_result(double &value, std::string &name); + + void set_prest_name(const std::string &name) { m_save_preset_panel->set_save_name(name); }; + + virtual bool Show(bool show = true) override; + +protected: + CaliPageStepGuide *m_step_panel{nullptr}; + CaliSavePresetValuePanel *m_save_preset_panel; +}; + + +}} // namespace Slic3r::GUI + +#endif \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationWizardStartPage.cpp b/src/slic3r/GUI/CalibrationWizardStartPage.cpp new file mode 100644 index 0000000000..d042342e77 --- /dev/null +++ b/src/slic3r/GUI/CalibrationWizardStartPage.cpp @@ -0,0 +1,304 @@ +#include "CalibrationWizardStartPage.hpp" +#include "I18N.hpp" +#include "Widgets/Label.hpp" + +namespace Slic3r { namespace GUI { + + +CalibrationStartPage::CalibrationStartPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + :CalibrationWizardPage(parent, id, pos, size, style) +{ + m_top_sizer = new wxBoxSizer(wxVERTICAL); +} + +void CalibrationStartPage::create_wiki(wxWindow* parent) +{ + m_wiki_text = new wxStaticText(parent, wxID_ANY, _L("Wiki")); + m_wiki_text->SetFont(Label::Head_14); + m_wiki_text->SetForegroundColour({ 0, 88, 220 }); + m_wiki_text->Bind(wxEVT_ENTER_WINDOW, [this](wxMouseEvent& e) { + e.Skip(); + SetCursor(wxCURSOR_HAND); + }); + m_wiki_text->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { + e.Skip(); + SetCursor(wxCURSOR_ARROW); + }); + m_wiki_text->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { + if (!m_wiki_url.empty()) + wxLaunchDefaultBrowser(m_wiki_url); + }); +} + +void CalibrationStartPage::create_when(wxWindow* parent, wxString title, wxString content) +{ + m_when_title = new wxStaticText(this, wxID_ANY, title); + m_when_title->SetFont(Label::Head_14); + m_when_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + + m_when_content = new wxStaticText(this, wxID_ANY, content); + m_when_content->SetFont(Label::Body_14); + m_when_content->Wrap(CALIBRATION_TEXT_MAX_LENGTH); +} + +void CalibrationStartPage::create_bitmap(wxWindow* parent, const wxBitmap& before_img, const wxBitmap& after_img) +{ + m_images_sizer = new wxBoxSizer(wxHORIZONTAL); + m_before_bmp = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); + m_before_bmp->SetBitmap(before_img); + m_images_sizer->Add(m_before_bmp, 0, wxALL, 0); + m_images_sizer->AddSpacer(FromDIP(20)); + m_after_bmp = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0); + m_after_bmp->SetBitmap(after_img); + m_images_sizer->Add(m_after_bmp, 0, wxALL, 0); +} + +void CalibrationStartPage::create_bitmap(wxWindow* parent, std::string before_img, std::string after_img) +{ + wxBitmap before_bmp = create_scaled_bitmap(before_img, nullptr, 400); + wxBitmap after_bmp = create_scaled_bitmap(after_img, nullptr, 400); + + create_bitmap(parent, before_bmp, after_bmp); +} + +CalibrationPAStartPage::CalibrationPAStartPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationStartPage(parent, id, pos, size, style) +{ + m_cali_mode = CalibMode::Calib_PA_Line; + m_page_type = CaliPageType::CALI_PAGE_START; + + m_wiki_url = get_calibration_wiki_page(m_cali_mode); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationPAStartPage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, CalibMode::Calib_PA_Line); + m_page_caption->show_prev_btn(false); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + create_when(parent, + _L("When you need Pressure Advance Calibration"), + _L("uneven extrusion")); + + m_top_sizer->Add(m_when_title); + m_top_sizer->Add(m_when_content); + m_top_sizer->AddSpacer(PRESET_GAP); + + create_bitmap(parent, "cali_page_before_pa", "cali_page_after_pa"); + m_top_sizer->Add(m_images_sizer, 0, wxALL, 0); + + m_top_sizer->AddSpacer(PRESET_GAP); + + auto about_title = new wxStaticText(parent, wxID_ANY, _L("About this calibration")); + about_title->SetFont(Label::Head_14); + about_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + m_top_sizer->Add(about_title); + auto about_text = new wxStaticText(parent, wxID_ANY, _L("After calibration, the linear compensation factor(K) will be recorded and applied to printing. This factor would be different if device, degree of usage, material, and material family type are different")); + about_text->SetFont(Label::Body_14); + about_text->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + m_top_sizer->Add(about_text); + + + m_top_sizer->AddSpacer(PRESET_GAP); + + create_wiki(parent); + m_top_sizer->Add(m_wiki_text, 0); + + m_action_panel = new CaliPageActionPanel(parent, CalibMode::Calib_PA_Line, CaliPageType::CALI_PAGE_START); + + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); +} + +void CalibrationPAStartPage::on_reset_page() +{ + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false); + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); +} + +void CalibrationPAStartPage::on_device_connected(MachineObject* obj) +{ + //enable all button + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, true); + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true); + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + + if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002") { + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, true); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + + if (obj->cali_version <= -1) { + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, true); + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true); + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + } + else { + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); + } + } + else if (obj->printer_type == "C11" || obj->printer_type == "C12") { + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + + if (obj->cali_version <= -1) { + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + } + else { + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); + } + } +} + +CalibrationFlowRateStartPage::CalibrationFlowRateStartPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationStartPage(parent, id, pos, size, style) +{ + m_cali_mode = CalibMode::Calib_Flow_Rate; + + m_wiki_url = get_calibration_wiki_page(m_cali_mode); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationFlowRateStartPage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, CalibMode::Calib_Flow_Rate); + m_page_caption->show_prev_btn(false); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + create_when(parent, + _L("When you need Flow Rate Calibration"), + _L("Over-extrusion or under extrusion")); + + m_top_sizer->Add(m_when_title); + m_top_sizer->Add(m_when_content); + m_top_sizer->AddSpacer(PRESET_GAP); + + auto recommend_title = new wxStaticText(parent, wxID_ANY, _L("Flow Rate calibration is recommended when you print with:")); + recommend_title->SetFont(Label::Head_14); + recommend_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + m_top_sizer->Add(recommend_title); + auto recommend_text1 = new wxStaticText(parent, wxID_ANY, _L("material with significant thermal shrinkage/expansion, such as...")); + recommend_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + recommend_text1->SetFont(Label::Body_14); + m_top_sizer->Add(recommend_text1); + auto recommend_text2 = new wxStaticText(parent, wxID_ANY, _L("materials with inaccurate filament diameter")); + recommend_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + recommend_text2->SetFont(Label::Body_14); + m_top_sizer->Add(recommend_text2); + + m_top_sizer->AddSpacer(PRESET_GAP); + + create_bitmap(parent, "cali_page_before_flow", "cali_page_after_flow"); + + m_top_sizer->Add(m_images_sizer, 0, wxALL, 0); + + m_top_sizer->AddSpacer(PRESET_GAP); + + create_wiki(parent); + m_top_sizer->Add(m_wiki_text, 0); + + m_action_panel = new CaliPageActionPanel(parent, CalibMode::Calib_Flow_Rate, CaliPageType::CALI_PAGE_START); + + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); +} + +void CalibrationFlowRateStartPage::on_reset_page() +{ + //disable all button + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false); + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); +} + +void CalibrationFlowRateStartPage::on_device_connected(MachineObject* obj) +{ + //enable all button + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, true); + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true); + m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + + if (obj->printer_type == "BL-P001" || obj->printer_type == "BL-P002") { + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + + if (obj->cali_version <= -1) { + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true); + } + else { + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); + } + } + else if (obj->printer_type == "C11" || obj->printer_type == "C12") { + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); + } +} + +CalibrationMaxVolumetricSpeedStartPage::CalibrationMaxVolumetricSpeedStartPage(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) + : CalibrationStartPage(parent, id, pos, size, style) +{ + m_cali_mode = CalibMode::Calib_Vol_speed_Tower; + + m_wiki_url = get_calibration_wiki_page(m_cali_mode); + + create_page(this); + + this->SetSizer(m_top_sizer); + m_top_sizer->Fit(this); +} + +void CalibrationMaxVolumetricSpeedStartPage::create_page(wxWindow* parent) +{ + m_page_caption = new CaliPageCaption(parent, m_cali_mode); + m_page_caption->show_prev_btn(false); + m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0); + create_when(parent, _L("When you need Max Volumetric Speed Calibration"), _L("Over-extrusion or under extrusion")); + + m_top_sizer->Add(m_when_title); + m_top_sizer->Add(m_when_content); + m_top_sizer->AddSpacer(PRESET_GAP); + + auto recommend_title = new wxStaticText(parent, wxID_ANY, _L("Max Volumetric Speed calibration is recommended when you print with:")); + recommend_title->SetFont(Label::Head_14); + recommend_title->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + m_top_sizer->Add(recommend_title); + auto recommend_text1 = new wxStaticText(parent, wxID_ANY, _L("material with significant thermal shrinkage/expansion, such as...")); + recommend_text1->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + recommend_text1->SetFont(Label::Body_14); + m_top_sizer->Add(recommend_text1); + auto recommend_text2 = new wxStaticText(parent, wxID_ANY, _L("materials with inaccurate filament diameter")); + recommend_text2->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + recommend_text2->SetFont(Label::Body_14); + m_top_sizer->Add(recommend_text2); + + m_top_sizer->AddSpacer(PRESET_GAP); + + create_bitmap(parent, "cali_page_before_flow", "cali_page_after_flow"); + + m_top_sizer->Add(m_images_sizer, 0, wxALL, 0); + + m_top_sizer->AddSpacer(PRESET_GAP); + + create_wiki(parent); + m_top_sizer->Add(m_wiki_text, 0); + + m_action_panel = new CaliPageActionPanel(parent, m_cali_mode, CaliPageType::CALI_PAGE_START); + + m_top_sizer->Add(m_action_panel, 0, wxEXPAND, 0); +} + +}} \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationWizardStartPage.hpp b/src/slic3r/GUI/CalibrationWizardStartPage.hpp new file mode 100644 index 0000000000..914b3d622e --- /dev/null +++ b/src/slic3r/GUI/CalibrationWizardStartPage.hpp @@ -0,0 +1,80 @@ +#ifndef slic3r_GUI_CalibrationWizardStartPage_hpp_ +#define slic3r_GUI_CalibrationWizardStartPage_hpp_ + +#include "CalibrationWizardPage.hpp" + +namespace Slic3r { namespace GUI { + + + +class CalibrationStartPage : public CalibrationWizardPage +{ +public: + CalibrationStartPage(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + +protected: + CalibMode m_cali_mode; + wxString m_wiki_url; + + wxBoxSizer* m_top_sizer; + wxBoxSizer* m_images_sizer; + wxStaticText* m_wiki_text; + wxStaticText* m_when_title; + wxStaticText* m_when_content; + wxStaticBitmap* m_before_bmp; + wxStaticBitmap* m_after_bmp; + + void create_wiki(wxWindow* parent); + void create_when(wxWindow* parent, wxString title, wxString content); + void create_bitmap(wxWindow* parent, const wxBitmap& before_img, const wxBitmap& after_img); + void create_bitmap(wxWindow* parent, std::string before_img, std::string after_img); +}; + +class CalibrationPAStartPage : public CalibrationStartPage +{ +public: + CalibrationPAStartPage(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow* parent); + + void on_reset_page(); + void on_device_connected(MachineObject* obj); +}; + +class CalibrationFlowRateStartPage : public CalibrationStartPage +{ +public: + CalibrationFlowRateStartPage(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow* parent); + void on_reset_page(); + void on_device_connected(MachineObject* obj); +}; + +class CalibrationMaxVolumetricSpeedStartPage : public CalibrationStartPage +{ +public: + CalibrationMaxVolumetricSpeedStartPage(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL); + + void create_page(wxWindow* parent); +}; + +}} // namespace Slic3r::GUI + +#endif \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 48af9eaf14..c8338445a5 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1186,6 +1186,14 @@ bool MachineObject::is_system_printing() return false; } +bool MachineObject::check_pa_result_validation(PACalibResult& result) +{ + if (result.k_value < 0 || result.k_value > 10) + return false; + + return true; +} + bool MachineObject::is_axis_at_home(std::string axis) { if (home_flag < 0) @@ -1248,6 +1256,8 @@ bool MachineObject::is_in_calibration() return false; } + + bool MachineObject::is_calibration_done() { return calibration_done; @@ -1983,7 +1993,10 @@ int MachineObject::command_set_pa_calibration(const std::vector& for (int i = 0; i < pa_calib_values.size(); ++i) { if (pa_calib_values[i].tray_id >= 0) - j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id; + j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id; + if (pa_calib_values[i].cali_idx >= 0) + j["print"]["filaments"][i]["cali_idx"] = pa_calib_values[i].cali_idx; + j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id; j["print"]["filaments"][i]["filament_id"] = pa_calib_values[i].filament_id; j["print"]["filaments"][i]["setting_id"] = pa_calib_values[i].setting_id; j["print"]["filaments"][i]["name"] = pa_calib_values[i].name; @@ -2016,6 +2029,8 @@ int MachineObject::command_delete_pa_calibration(const PACalibIndexInfo& pa_cali int MachineObject::command_get_pa_calibration_tab(float nozzle_diameter, const std::string &filament_id) { + reset_pa_cali_history_result(); + if ((printer_type == "BL-P001" || printer_type == "BL-P002")) { json j; j["print"]["command"] = "extrusion_cali_get"; @@ -3852,13 +3867,31 @@ int MachineObject::parse_json(std::string payload) extrusion_cali_set_hold_start = std::chrono::system_clock::now(); } else if (jj["command"].get() == "extrusion_cali_get") { -#ifdef CALI_DEBUG - std::string str = jj.dump(); - BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get: " << str; -#endif - if (jj["filaments"].is_array()) { + reset_pa_cali_history_result(); + has_get_pa_calib_tab = true; + + if (jj.contains("nozzle_diameter")) { + if (jj["nozzle_diameter"].is_number_float()) { + pa_calib_tab_nozzle_dia = jj["nozzle_diameter"].get(); + } + else if (jj["nozzle_diameter"].is_string()) { + pa_calib_tab_nozzle_dia = stof(jj["nozzle_diameter"].get().c_str()); + } + else { + assert(false); + } + } + else { + assert(false); + } + + if (jj.contains("filaments") && jj["filaments"].is_array()) { try { - pa_calib_tab.clear(); +#ifdef CALI_DEBUG + std::string str = jj.dump(); + BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get: " << str; +#endif + for (auto it = jj["filaments"].begin(); it != jj["filaments"].end(); it++) { PACalibResult pa_calib_result; pa_calib_result.filament_id = (*it)["filament_id"].get(); @@ -3882,23 +3915,31 @@ int MachineObject::parse_json(std::string payload) else if ((*it)["n_coef"].is_string()) pa_calib_result.n_coef = stof((*it)["n_coef"].get().c_str()); - pa_calib_tab.push_back(pa_calib_result); + if (check_pa_result_validation(pa_calib_result)) + pa_calib_tab.push_back(pa_calib_result); + else { + BOOST_LOG_TRIVIAL(info) << "pa result is invalid"; + } } - has_get_pa_calib_tab = true; + } catch (...) { } } + // notify cali history to update } else if (jj["command"].get() == "extrusion_cali_get_result") { -#ifdef CALI_DEBUG - std::string str = jj.dump(); - BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get_result: " << str; -#endif - if (jj["filaments"].is_array()) { + reset_pa_cali_result(); + get_pa_calib_result = true; + + if (jj.contains("filaments") && jj["filaments"].is_array()) { try { - pa_calib_results.clear(); +#ifdef CALI_DEBUG + std::string str = jj.dump(); + BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get_result: " << str; +#endif + for (auto it = jj["filaments"].begin(); it != jj["filaments"].end(); it++) { PACalibResult pa_calib_result; pa_calib_result.tray_id = (*it)["tray_id"].get(); @@ -3921,23 +3962,35 @@ int MachineObject::parse_json(std::string payload) else if ((*it)["n_coef"].is_string()) pa_calib_result.n_coef = stof((*it)["n_coef"].get().c_str()); - if ((*it).contains("confidence")) + if (it->contains("confidence")) { pa_calib_result.confidence = (*it)["confidence"].get(); + } else { + pa_calib_result.confidence = 0; + } - pa_calib_results.push_back(pa_calib_result); + if (check_pa_result_validation(pa_calib_result)) + pa_calib_results.push_back(pa_calib_result); + else { + BOOST_LOG_TRIVIAL(info) << "pa result is invalid"; + } } - has_get_pa_calib_result = true; } catch (...) {} } + + if (pa_calib_results.empty()) { + BOOST_LOG_TRIVIAL(info) << "no pa calib result"; + } } else if (jj["command"].get() == "flowrate_get_result") { -#ifdef CALI_DEBUG - std::string str = jj.dump(); - BOOST_LOG_TRIVIAL(info) << "flowrate_get_result: " << str; -#endif - if (jj["filaments"].is_array()) { + this->reset_flow_rate_cali_result(); + + get_flow_calib_result = true; + if (jj.contains("filaments") && jj["filaments"].is_array()) { try { - flow_ratio_results.clear(); +#ifdef CALI_DEBUG + std::string str = jj.dump(); + BOOST_LOG_TRIVIAL(info) << "flowrate_get_result: " << str; +#endif for (auto it = jj["filaments"].begin(); it != jj["filaments"].end(); it++) { FlowRatioCalibResult flow_ratio_calib_result; flow_ratio_calib_result.tray_id = (*it)["tray_id"].get(); @@ -3945,10 +3998,15 @@ int MachineObject::parse_json(std::string payload) flow_ratio_calib_result.setting_id = (*it)["setting_id"].get(); flow_ratio_calib_result.nozzle_diameter = stof(jj["nozzle_diameter"].get().c_str()); flow_ratio_calib_result.flow_ratio = stof((*it)["flow_ratio"].get().c_str()); + if (it->contains("confidence")) { + flow_ratio_calib_result.confidence = (*it)["confidence"].get(); + } else { + flow_ratio_calib_result.confidence = 0; + } flow_ratio_results.push_back(flow_ratio_calib_result); } - has_get_flow_ratio_result = true; + } catch (...) {} } } diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 840268eb3d..205d7a0208 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -327,10 +327,26 @@ public: std::vector calib_datas; }; +class CaliPresetInfo +{ +public: + int tray_id; + float nozzle_diameter; + std::string filament_id; + std::string setting_id; + std::string name; +}; + + class PACalibResult { public: - int tray_id; + enum CalibResult { + CALI_RESULT_SUCCESS = 0, + CALI_RESULT_PROBLEM = 1, + CALI_RESULT_FAILED = 2, + }; + int tray_id; int cali_idx; float nozzle_diameter; std::string filament_id; @@ -338,7 +354,7 @@ public: std::string name; float k_value; float n_coef; - int confidence = -1; + int confidence = -1; // 0: success 1: uncertain 2: failed }; struct PACalibIndexInfo @@ -357,6 +373,7 @@ public: std::string filament_id; std::string setting_id; float flow_ratio; + int confidence; // 0: success 1: uncertain 2: failed }; #define UpgradeNoError 0 @@ -661,12 +678,37 @@ public: bool is_support_layer_num { false }; int cali_version = -1; - bool has_get_pa_calib_tab = false; - bool has_get_pa_calib_result = false; - bool has_get_flow_ratio_result = false; + float cali_selected_nozzle_dia { 0.0 }; + // 1: record when start calibration in preset page + // 2: reset when start calibration in start page + // 3: save tray_id, filament_id, setting_id, and name, nozzle_dia + std::vector selected_cali_preset; + + bool has_get_pa_calib_tab{ false }; std::vector pa_calib_tab; + float pa_calib_tab_nozzle_dia; + bool get_pa_calib_result { false }; std::vector pa_calib_results; + bool get_flow_calib_result { false }; std::vector flow_ratio_results; + void reset_pa_cali_history_result() + { + pa_calib_tab_nozzle_dia = 0.4f; + has_get_pa_calib_tab = false; + pa_calib_tab.clear(); + } + + void reset_pa_cali_result() { + get_pa_calib_result = false; + pa_calib_results.clear(); + } + + void reset_flow_rate_cali_result() { + get_flow_calib_result = false; + flow_ratio_results.clear(); + } + + bool check_pa_result_validation(PACalibResult& result); std::vector stage_list_info; int stage_curr = 0; diff --git a/src/slic3r/GUI/EditCalibrationHistoryDialog.cpp b/src/slic3r/GUI/EditCalibrationHistoryDialog.cpp deleted file mode 100644 index 19916542e5..0000000000 --- a/src/slic3r/GUI/EditCalibrationHistoryDialog.cpp +++ /dev/null @@ -1,198 +0,0 @@ -#include "EditCalibrationHistoryDialog.hpp" -#include "MsgDialog.hpp" -#include "GUI_App.hpp" - -namespace Slic3r { namespace GUI { - -#define EDIT_HISTORY_DIALOG_INPUT_SIZE wxSize(FromDIP(160), FromDIP(24)) - -static bool validate_input_k_value(wxString k_text, float* output_value) -{ - float default_k = 0.0f; - if (k_text.IsEmpty()) { - *output_value = default_k; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - double k_value = 0.0; - try { - k_text.ToDouble(&k_value); - } - catch (...) { - ; - } - - if (k_value < 0 || k_value > 0.5) { - *output_value = default_k; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (K in 0~0.5)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - *output_value = k_value; - return true; -}; - -static bool validate_input_n_value(wxString n_text, float* output_value) { - float default_n = 1.0f; - if (n_text.IsEmpty()) { - *output_value = default_n; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (N in 0.6~2.0)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - double n_value = 0.0; - try { - n_text.ToDouble(&n_value); - } - catch (...) { - ; - } - - if (n_value < 0.6 || n_value > 2.0) { - *output_value = default_n; - MessageDialog msg_dlg(nullptr, _L("Please input a valid value (N in 0.6~2.0)"), wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal(); - return false; - } - - *output_value = n_value; - return true; -} - -EditCalibrationHistoryDialog::EditCalibrationHistoryDialog(wxWindow* parent, wxString k, wxString n, wxString material_name, wxString nozzle_dia) - : DPIDialog(parent, wxID_ANY, _L("Edit Pressure Advance"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) -{ - create(k, n, material_name, nozzle_dia); - wxGetApp().UpdateDlgDarkUI(this); -} - -EditCalibrationHistoryDialog::~EditCalibrationHistoryDialog() { -} - -void EditCalibrationHistoryDialog::create(const wxString& k, const wxString& n, const wxString& material_name, const wxString& nozzle_dia) -{ - this->SetBackgroundColour(*wxWHITE); - auto main_sizer = new wxBoxSizer(wxVERTICAL); - - auto top_panel = new wxPanel(this); - auto panel_sizer = new wxBoxSizer(wxVERTICAL); - top_panel->SetSizer(panel_sizer); - - auto flex_sizer = new wxFlexGridSizer(0, 2, FromDIP(15), FromDIP(30)); - flex_sizer->SetFlexibleDirection(wxBOTH); - flex_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); - - wxStaticText* nozzle_title = new wxStaticText(top_panel, wxID_ANY, _L("Nozzle Diameter")); - wxStaticText* nozzle_value = new wxStaticText(top_panel, wxID_ANY, nozzle_dia); - flex_sizer->Add(nozzle_title); - flex_sizer->Add(nozzle_value); - - wxStaticText* material_name_title = new wxStaticText(top_panel, wxID_ANY, _L("Material")); - TextInput* material_name_value = new TextInput(top_panel, material_name, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER); - m_material_name = material_name.ToStdString(); - material_name_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, material_name_value](auto& e) { - if (!material_name_value->GetTextCtrl()->GetValue().IsEmpty()) - m_material_name = material_name_value->GetTextCtrl()->GetValue().ToStdString(); - }); - material_name_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, material_name_value](auto& e) { - if (!material_name_value->GetTextCtrl()->GetValue().IsEmpty()) - m_material_name = material_name_value->GetTextCtrl()->GetValue().ToStdString(); - e.Skip(); - }); - flex_sizer->Add(material_name_title); - flex_sizer->Add(material_name_value); - - wxStaticText* k_title = new wxStaticText(top_panel, wxID_ANY, _L("K Factor")); - TextInput* k_value = new TextInput(top_panel, k, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER); - double double_k = 0.0; - k_value->GetTextCtrl()->GetValue().ToDouble(&double_k); - m_k_value = double_k; - k_value->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, k_value](auto& e) { - float k = 0.0f; - validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k); - wxString k_str = wxString::Format("%.3f", k); - k_value->GetTextCtrl()->SetValue(k_str); - m_k_value = k; - }); - k_value->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, k_value](auto& e) { - float k = 0.0f; - validate_input_k_value(k_value->GetTextCtrl()->GetValue(), &k); - wxString k_str = wxString::Format("%.3f", k); - k_value->GetTextCtrl()->SetValue(k_str); - m_k_value = k; - e.Skip(); - }); - flex_sizer->Add(k_title); - flex_sizer->Add(k_value); - - // Hide: - //wxStaticText* n_title = new wxStaticText(top_panel, wxID_ANY, _L("N Factor")); - //TextInput* n_value = new TextInput(top_panel, n, "", "", wxDefaultPosition, EDIT_HISTORY_DIALOG_INPUT_SIZE, wxTE_PROCESS_ENTER); - //flex_sizer->Add(n_title); - //flex_sizer->Add(n_value); - - panel_sizer->Add(flex_sizer); - - panel_sizer->AddSpacer(FromDIP(25)); - - auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); - Button* save_btn = new Button(top_panel, _L("Save")); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), - std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(wxColour(0, 174, 66), StateColor::Normal)); - save_btn->SetBackgroundColour(*wxWHITE); - save_btn->SetBackgroundColor(btn_bg_green); - save_btn->SetBorderColor(wxColour(0, 174, 66)); - save_btn->SetTextColor(wxColour("#FFFFFE")); - save_btn->SetMinSize(wxSize(-1, FromDIP(24))); - save_btn->SetCornerRadius(FromDIP(12)); - Button* cancel_btn = new Button(top_panel, _L("Cancel")); - cancel_btn->SetBackgroundColour(*wxWHITE); - cancel_btn->SetMinSize(wxSize(-1, FromDIP(24))); - cancel_btn->SetCornerRadius(FromDIP(12)); - save_btn->Bind(wxEVT_BUTTON, &EditCalibrationHistoryDialog::on_save, this); - cancel_btn->Bind(wxEVT_BUTTON, &EditCalibrationHistoryDialog::on_cancel, this); - btn_sizer->AddStretchSpacer(); - btn_sizer->Add(save_btn); - btn_sizer->AddSpacer(FromDIP(20)); - btn_sizer->Add(cancel_btn); - panel_sizer->Add(btn_sizer, 0, wxEXPAND, 0); - - - main_sizer->Add(top_panel, 1, wxEXPAND | wxALL, FromDIP(20)); - - SetSizer(main_sizer); - Layout(); - Fit(); - CenterOnParent(); -} - -float EditCalibrationHistoryDialog::get_k_value(){ - return m_k_value; -} - -float EditCalibrationHistoryDialog::get_n_value(){ - return m_n_value; -} - -wxString EditCalibrationHistoryDialog::get_material_name_value() { - return m_material_name; -} - -void EditCalibrationHistoryDialog::on_save(wxCommandEvent& event) { - EndModal(wxID_OK); -} - -void EditCalibrationHistoryDialog::on_cancel(wxCommandEvent& event) { - EndModal(wxID_CANCEL); -} - -void EditCalibrationHistoryDialog::on_dpi_changed(const wxRect& suggested_rect) -{ -} - -}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/EditCalibrationHistoryDialog.hpp b/src/slic3r/GUI/EditCalibrationHistoryDialog.hpp deleted file mode 100644 index 05be3db262..0000000000 --- a/src/slic3r/GUI/EditCalibrationHistoryDialog.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef slic3r_EditCalibrationHistoryDialog_hpp_ -#define slic3r_EditCalibrationHistoryDialog_hpp_ - -#include "GUI_Utils.hpp" - -namespace Slic3r { namespace GUI { - -class EditCalibrationHistoryDialog : public DPIDialog -{ -public: - EditCalibrationHistoryDialog(wxWindow* parent, wxString k, wxString n, wxString material_name, wxString nozzle_dia); - ~EditCalibrationHistoryDialog(); - void on_dpi_changed(const wxRect& suggested_rect) override; - float get_k_value(); - float get_n_value(); - wxString get_material_name_value(); - -protected: - void create(const wxString& k, const wxString& n, const wxString& material_name, const wxString& nozzle_dia); - virtual void on_save(wxCommandEvent& event); - virtual void on_cancel(wxCommandEvent& event); - -protected: - float m_k_value; - float m_n_value; - std::string m_material_name; -}; - -}} // namespace Slic3r::GUI - -#endif diff --git a/src/slic3r/GUI/HMSPanel.cpp b/src/slic3r/GUI/HMSPanel.cpp index 810a53b156..9992e37af4 100644 --- a/src/slic3r/GUI/HMSPanel.cpp +++ b/src/slic3r/GUI/HMSPanel.cpp @@ -1,5 +1,6 @@ #include "HMS.hpp" #include "HMSPanel.hpp" +#include #include #include #include "GUI.hpp" @@ -231,4 +232,4 @@ bool HMSPanel::Show(bool show) return wxPanel::Show(show); } -}} \ No newline at end of file +}} diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index a8a141ac82..9a0f3ca783 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -217,15 +217,14 @@ public: //BBS GUI refactor enum TabPosition { - tpHome = 0, - tp3DEditor = 1, - //tpSettings = 1, - tpPreview = 2, - tpMonitor = 3, - tpProject = 4, - tpCalibration = 5, - toAuxiliary = 6, - toDebugTool = 7, + tpHome = 0, + tp3DEditor = 1, + tpPreview = 2, + tpMonitor = 3, + tpProject = 4, + tpAuxiliary = 5, + tpCalibration = 6, + toDebugTool = 7, }; //BBS: add slice&&print status update logic diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index 232753fca5..fade6c1429 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -160,162 +160,9 @@ MonitorPanel::~MonitorPanel() { m_side_tools = new SideTools(this, wxID_ANY); wxBoxSizer* sizer_side_tools = new wxBoxSizer(wxVERTICAL); - - /* auto warning_panel = new wxPanel(this, wxID_ANY); - warning_panel->SetBackgroundColour(wxColour(255, 111, 0)); - warning_panel->SetSize(wxSize(FromDIP(220), FromDIP(25))); - warning_panel->SetMinSize(wxSize(FromDIP(220), FromDIP(25))); - warning_panel->SetMaxSize(wxSize(FromDIP(220), FromDIP(25))); - sizer_side_tools->Add(warning_panel, 0, wxEXPAND, 0); - - wxBoxSizer *sizer_boxh = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *sizer_boxv = new wxBoxSizer(wxHORIZONTAL);*/ - - m_connection_info = new Button(this, wxEmptyString); - m_connection_info->SetBackgroundColor(wxColour(255, 111, 0)); - m_connection_info->SetBorderColor(wxColour(255, 111, 0)); - m_connection_info->SetTextColor(*wxWHITE); - m_connection_info->SetFont(::Label::Body_13); - m_connection_info->SetCornerRadius(0); - m_connection_info->SetSize(wxSize(FromDIP(-1), FromDIP(25))); - m_connection_info->SetMinSize(wxSize(FromDIP(-1), FromDIP(25))); - m_connection_info->SetMaxSize(wxSize(FromDIP(-1), FromDIP(25))); - - - wxBoxSizer* connection_sizer_V = new wxBoxSizer(wxVERTICAL); - wxBoxSizer* connection_sizer_H = new wxBoxSizer(wxHORIZONTAL); - - m_hyperlink = new wxHyperlinkCtrl(m_connection_info, wxID_ANY, _L("Failed to connect to the server"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); - m_hyperlink->SetBackgroundColour(wxColour(255, 111, 0)); - - m_more_err_open = ScalableBitmap(this, "monitir_err_open", 16); - m_more_err_close = ScalableBitmap(this, "monitir_err_close", 16); - m_more_button = new ScalableButton(m_connection_info, wxID_ANY, "monitir_err_open"); - m_more_button->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); - m_more_button->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); - m_more_button->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - if (!m_more_err_state) { - m_more_button->SetBitmap(m_more_err_close.bmp()); - Freeze(); - m_side_error_panel->Show(); - m_more_err_state = true; - m_tabpanel->Refresh(); - m_tabpanel->Layout(); - Thaw(); - } - else { - m_more_button->SetBitmap(m_more_err_open.bmp()); - Freeze(); - m_side_error_panel->Hide(); - m_more_err_state = false; - m_tabpanel->Refresh(); - m_tabpanel->Layout(); - Thaw(); - } - - }); - - connection_sizer_H->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5); - connection_sizer_H->Add(m_more_button, 0, wxALIGN_CENTER | wxALL, 3); - connection_sizer_V->Add(connection_sizer_H, 0, wxALIGN_CENTER, 0); - - m_connection_info->SetSizer(connection_sizer_V); - m_connection_info->Layout(); - connection_sizer_V->Fit(m_connection_info); - - m_side_error_panel = new wxWindow(this,wxID_ANY); - m_side_error_panel->SetBackgroundColour(wxColour(255,232,214)); - m_side_error_panel->SetMinSize(wxSize(-1, -1)); - m_side_error_panel->SetMaxSize(wxSize(-1, -1)); - - m_side_error_panel->Hide(); - m_more_button->Hide(); - m_connection_info->Hide(); - - wxBoxSizer* sizer_print_failed_info = new wxBoxSizer(wxVERTICAL); - m_side_error_panel->SetSizer(sizer_print_failed_info); - - wxBoxSizer* sizer_error_code = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer* sizer_extra_info = new wxBoxSizer(wxHORIZONTAL); - - m_link_network_state = new Label(m_side_error_panel, _L("Check cloud service status"), wxALIGN_CENTER_HORIZONTAL|wxST_ELLIPSIZE_END); - m_link_network_state->SetMinSize(wxSize(FromDIP(220), -1)); - m_link_network_state->SetMaxSize(wxSize(FromDIP(220), -1)); - m_link_network_state->SetForegroundColour(0x00AE42); - m_link_network_state->SetFont(::Label::Body_12); - m_link_network_state->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_network_check(); }); - m_link_network_state->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_HAND); }); - m_link_network_state->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_ARROW); }); - - auto st_title_error_code = new wxStaticText(m_side_error_panel, wxID_ANY, _L("code"),wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); - auto st_title_error_code_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": "); - m_st_txt_error_code = new Label(m_side_error_panel, wxEmptyString); - st_title_error_code->SetForegroundColour(0x909090); - st_title_error_code_doc->SetForegroundColour(0x909090); - m_st_txt_error_code->SetForegroundColour(0x909090); - st_title_error_code->SetFont(::Label::Body_12); - st_title_error_code_doc->SetFont(::Label::Body_12); - m_st_txt_error_code->SetFont(::Label::Body_12); - st_title_error_code->SetMinSize(wxSize(FromDIP(32), -1)); - st_title_error_code->SetMaxSize(wxSize(FromDIP(32), -1)); - m_st_txt_error_code->SetMinSize(wxSize(FromDIP(175), -1)); - m_st_txt_error_code->SetMaxSize(wxSize(FromDIP(175), -1)); - sizer_error_code->Add(st_title_error_code, 0, wxALL, 0); - sizer_error_code->Add(st_title_error_code_doc, 0, wxALL, 0); - sizer_error_code->Add(m_st_txt_error_code, 0, wxALL, 0); - - - auto st_title_error_desc = new wxStaticText(m_side_error_panel, wxID_ANY, wxT("desc"),wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); - auto st_title_error_desc_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": "); - m_st_txt_error_desc = new Label(m_side_error_panel, wxEmptyString); - st_title_error_desc->SetForegroundColour(0x909090); - st_title_error_desc_doc->SetForegroundColour(0x909090); - m_st_txt_error_desc->SetForegroundColour(0x909090); - st_title_error_desc->SetFont(::Label::Body_12); - st_title_error_desc_doc->SetFont(::Label::Body_12); - m_st_txt_error_desc->SetFont(::Label::Body_12); - st_title_error_desc->SetMinSize(wxSize(FromDIP(32), -1)); - st_title_error_desc->SetMaxSize(wxSize(FromDIP(32), -1)); - m_st_txt_error_desc->SetMinSize(wxSize(FromDIP(175), -1)); - m_st_txt_error_desc->SetMaxSize(wxSize(FromDIP(175), -1)); - sizer_error_desc->Add(st_title_error_desc, 0, wxALL, 0); - sizer_error_desc->Add(st_title_error_desc_doc, 0, wxALL, 0); - sizer_error_desc->Add(m_st_txt_error_desc, 0, wxALL, 0); - - auto st_title_extra_info = new wxStaticText(m_side_error_panel, wxID_ANY, wxT("info"),wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); - auto st_title_extra_info_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": "); - m_st_txt_extra_info = new Label(m_side_error_panel, wxEmptyString); - st_title_extra_info->SetForegroundColour(0x909090); - st_title_extra_info_doc->SetForegroundColour(0x909090); - m_st_txt_extra_info->SetForegroundColour(0x909090); - st_title_extra_info->SetFont(::Label::Body_12); - st_title_extra_info_doc->SetFont(::Label::Body_12); - m_st_txt_extra_info->SetFont(::Label::Body_12); - st_title_extra_info->SetMinSize(wxSize(FromDIP(32), -1)); - st_title_extra_info->SetMaxSize(wxSize(FromDIP(32), -1)); - m_st_txt_extra_info->SetMinSize(wxSize(FromDIP(175), -1)); - m_st_txt_extra_info->SetMaxSize(wxSize(FromDIP(175), -1)); - sizer_extra_info->Add(st_title_extra_info, 0, wxALL, 0); - sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0); - sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0); - - sizer_print_failed_info->Add(m_link_network_state, 0, wxALIGN_CENTER, 3); - sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5); - sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); - sizer_print_failed_info->Add(sizer_error_desc, 0, wxLEFT, 5); - sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); - sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5); - - m_st_txt_error_desc->SetLabel(""); - m_st_txt_error_desc->Wrap(FromDIP(170)); - - - - sizer_side_tools->Add(m_connection_info, 0, wxEXPAND, 0); - sizer_side_tools->Add(m_side_error_panel, 0, wxEXPAND, 0); sizer_side_tools->Add(m_side_tools, 1, wxEXPAND, 0); m_tabpanel = new Tabbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, sizer_side_tools, wxNB_LEFT | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME); + m_side_tools->set_table_panel(m_tabpanel); m_tabpanel->SetBackgroundColour(wxColour("#FEFFFF")); m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent& e) { auto page = m_tabpanel->GetCurrentPage(); @@ -344,24 +191,6 @@ MonitorPanel::~MonitorPanel() show_status((int)MonitorStatus::MONITOR_NO_PRINTER); } -void MonitorPanel::update_connect_err_info(int code, wxString desc, wxString info) -{ - m_st_txt_error_code->SetLabelText(wxString::Format("%d", code)); - m_st_txt_error_desc->SetLabelText(desc); - m_st_txt_extra_info->SetLabelText(info); - - m_st_txt_error_code->Wrap(FromDIP(175)); - m_st_txt_error_desc->Wrap(FromDIP(175)); - m_st_txt_extra_info->Wrap(FromDIP(175)); - - if (code == BAMBU_NETWORK_ERR_CONNECTION_TO_PRINTER_FAILED) { - m_link_network_state->Hide(); - } - else if(code == BAMBU_NETWORK_ERR_CONNECTION_TO_SERVER_FAILED){ - m_link_network_state->Show(); - } -} - void MonitorPanel::set_default() { obj = nullptr; @@ -403,7 +232,6 @@ void MonitorPanel::msw_rescale() /* side_tool rescale */ m_side_tools->msw_rescale(); - m_tabpanel->Rescale(); //m_status_add_machine_panel->msw_rescale(); m_status_info_panel->msw_rescale(); @@ -411,11 +239,6 @@ void MonitorPanel::msw_rescale() m_upgrade_panel->msw_rescale(); m_hms_panel->msw_rescale(); - m_connection_info->SetCornerRadius(0); - m_connection_info->SetSize(wxSize(FromDIP(220), FromDIP(25))); - m_connection_info->SetMinSize(wxSize(FromDIP(220), FromDIP(25))); - m_connection_info->SetMaxSize(wxSize(FromDIP(220), FromDIP(25))); - Layout(); Refresh(); } @@ -489,41 +312,6 @@ void MonitorPanel::on_size(wxSizeEvent &event) Refresh(); } - void MonitorPanel::update_status(MachineObject* obj) -{ - if (!obj) return; - - /* Update Device Info */ - m_side_tools->set_current_printer_name(obj->dev_name); - - // update wifi signal image - int wifi_signal_val = 0; - if (!obj->is_connected() || obj->is_connecting()) { - m_side_tools->set_current_printer_signal(WifiSignal::NONE); - } else { - if (!obj->wifi_signal.empty() && boost::ends_with(obj->wifi_signal, "dBm")) { - try { - wifi_signal_val = std::stoi(obj->wifi_signal.substr(0, obj->wifi_signal.size() - 3)); - } - catch (...) { - ; - } - if (wifi_signal_val > -45) { - m_side_tools->set_current_printer_signal(WifiSignal::STRONG); - } - else if (wifi_signal_val <= -45 && wifi_signal_val >= -60) { - m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE); - } - else { - m_side_tools->set_current_printer_signal(WifiSignal::WEAK); - } - } - else { - m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE); - } - } -} - void MonitorPanel::update_all() { NetworkAgent* m_agent = wxGetApp().getAgent(); @@ -561,13 +349,10 @@ void MonitorPanel::update_all() } m_status_info_panel->obj = obj; - m_upgrade_panel->update(obj); - - m_status_info_panel->m_media_play_ctrl->SetMachineObject(obj); + m_upgrade_panel->update(obj); m_media_file_panel->SetMachineObject(obj); - - update_status(obj); + m_side_tools->update_status(obj); if (!obj) { show_status((int)MONITOR_NO_PRINTER); @@ -659,10 +444,7 @@ void MonitorPanel::update_side_panel() void MonitorPanel::show_status(int status) { if (!m_initialized) return; - - if (last_status == status) - return; - + if (last_status == status)return; if (last_status & (int)MonitorStatus::MONITOR_CONNECTING != 0) { NetworkAgent* agent = wxGetApp().getAgent(); json j; @@ -684,49 +466,14 @@ void MonitorPanel::show_status(int status) BOOST_LOG_TRIVIAL(info) << "monitor: show_status = " << status; - if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0) || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)) { - if ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER)) { - m_hyperlink->SetLabel(_L("Failed to connect to the server")); - update_connect_err_info(BAMBU_NETWORK_ERR_CONNECTION_TO_SERVER_FAILED, - _L("Failed to connect to cloud service"), - _L("Please click on the hyperlink above to view the cloud service status")); - } - else { - m_hyperlink->SetLabel(_L("Failed to connect to the printer")); - update_connect_err_info(BAMBU_NETWORK_ERR_CONNECTION_TO_PRINTER_FAILED, - _L("Connection to printer failed"), - _L("Please check the network connection of the printer and Studio.")); - } - - m_hyperlink->Show(); - m_connection_info->SetLabel(wxEmptyString); - m_connection_info->SetBackgroundColor(0xFF6F00); - m_connection_info->SetBorderColor(0xFF6F00); - m_connection_info->Show(); - m_more_button->Show(); - - - + #if !BBL_RELEASE_TO_PUBLIC - m_upgrade_panel->update(nullptr); + m_upgrade_panel->update(nullptr); #endif - } else if ((status & (int) MonitorStatus::MONITOR_NORMAL) != 0) { - m_connection_info->Hide(); - m_more_button->Hide(); - m_side_error_panel->Hide(); - } else if ((status & (int) MonitorStatus::MONITOR_CONNECTING) != 0) { - m_hyperlink->Hide(); - m_connection_info->SetLabel(_L("Connecting...")); - m_connection_info->SetBackgroundColor(0x00AE42); - m_connection_info->SetBorderColor(0x00AE42); - m_connection_info->Show(); - m_more_button->Hide(); - m_side_error_panel->Hide(); - } - - Freeze(); +Freeze(); // update panels + if (m_side_tools) { m_side_tools->show_status(status); }; m_status_info_panel->show_status(status); m_hms_panel->show_status(status); m_upgrade_panel->show_status(status); @@ -734,31 +481,23 @@ void MonitorPanel::show_status(int status) if ((status & (int)MonitorStatus::MONITOR_NO_PRINTER) != 0) { set_default(); - m_side_tools->set_none_printer_mode(); - m_connection_info->Hide(); - m_side_error_panel->Hide(); - m_more_button->Hide(); - m_tabpanel->Refresh(); m_tabpanel->Layout(); -#if !BBL_RELEASE_TO_PUBLIC - m_upgrade_panel->update(nullptr); -#endif - } else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0) - || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) - || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) - || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) - ) { - if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0) - || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) - || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)) { - m_side_tools->set_current_printer_signal(WifiSignal::NONE); + } else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0) + || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) ) + { + + if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)) + { set_default(); } - m_tabpanel->Refresh(); m_tabpanel->Layout(); } Layout(); - Thaw(); +Thaw(); } } // GUI diff --git a/src/slic3r/GUI/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp index bb2899a232..71f2b80de2 100644 --- a/src/slic3r/GUI/Monitor.hpp +++ b/src/slic3r/GUI/Monitor.hpp @@ -83,9 +83,6 @@ private: MediaFilePanel* m_media_file_panel; UpgradePanel* m_upgrade_panel; HMSPanel* m_hms_panel; - Button * m_connection_info{nullptr}; - wxWindow * m_side_error_panel{nullptr}; - wxHyperlinkCtrl* m_hyperlink{nullptr}; /* side tools */ SideTools* m_side_tools{nullptr}; @@ -94,12 +91,6 @@ private: wxStaticText* m_staticText_printer_name; wxStaticBitmap* m_bitmap_wifi_signal; wxBoxSizer * m_side_tools_sizer; - - Label* m_link_network_state; - Label* m_st_txt_error_code; - Label* m_st_txt_error_desc; - Label* m_st_txt_extra_info; - SelectMachinePopup m_select_machine; /* images */ @@ -110,15 +101,10 @@ private: wxBitmap m_printer_img; wxBitmap m_arrow_img; - ScalableButton* m_more_button; - bool m_more_err_state{false}; - ScalableBitmap m_more_err_open; - ScalableBitmap m_more_err_close; - int last_wifi_signal = -1; - wxTimer* m_refresh_timer = nullptr; int last_status; bool m_initialized { false }; + wxTimer* m_refresh_timer = nullptr; public: MonitorPanel(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); @@ -136,7 +122,6 @@ public: void init_bitmap(); void init_timer(); void init_tabpanel(); - void update_connect_err_info(int code, wxString desc, wxString info); Tabbook* get_tabpanel() { return m_tabpanel; }; void set_default(); wxWindow* create_side_tools(); @@ -152,7 +137,6 @@ public: void on_size(wxSizeEvent &event); /* update apis */ - void update_status(MachineObject* obj); //void update_ams(MachineObject* obj); void update_all(); @@ -165,6 +149,7 @@ public: std::string last_conn_type = "undedefined"; }; + } // GUI } // Slic3r diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 68a710984c..351bdc44ce 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1406,18 +1406,10 @@ void Sidebar::on_bed_type_change(BedType bed_type) m_bed_type_list->SetSelection(sel_idx); } -void Sidebar::load_ams_list(std::string const &device, MachineObject* obj) +std::map Sidebar::build_filament_ams_list(MachineObject* obj) { std::map filament_ams_list; - - if (!obj) { - p->ams_list_device = device; - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " clear list"; - wxGetApp().preset_bundle->filament_ams_list = filament_ams_list; - for (auto c : p->combos_filament) - c->update(); - return; - } + if (!obj) return filament_ams_list; auto vt_tray = obj->vt_tray; bool is_support_virtual_tray = obj->is_function_supported(PrinterFunction::FUNC_VIRTUAL_TYAY); @@ -1426,8 +1418,8 @@ void Sidebar::load_ams_list(std::string const &device, MachineObject* obj) vt_tray_config.set_key_value("filament_id", new ConfigOptionStrings{ vt_tray.setting_id }); vt_tray_config.set_key_value("tag_uid", new ConfigOptionStrings{ vt_tray.tag_uid }); vt_tray_config.set_key_value("filament_type", new ConfigOptionStrings{ vt_tray.type }); - vt_tray_config.set_key_value("tray_name", new ConfigOptionStrings{std::string("Ext")}); - vt_tray_config.set_key_value("filament_colour", new ConfigOptionStrings{into_u8(wxColour("#" + vt_tray.color).GetAsString(wxC2S_HTML_SYNTAX))}); + vt_tray_config.set_key_value("tray_name", new ConfigOptionStrings{ std::string("Ext") }); + vt_tray_config.set_key_value("filament_colour", new ConfigOptionStrings{ into_u8(wxColour("#" + vt_tray.color).GetAsString(wxC2S_HTML_SYNTAX)) }); vt_tray_config.set_key_value("filament_exist", new ConfigOptionBools{ true }); filament_ams_list.emplace(VIRTUAL_TRAY_ID, std::move(vt_tray_config)); @@ -1438,19 +1430,35 @@ void Sidebar::load_ams_list(std::string const &device, MachineObject* obj) char n = ams.first.front() - '0' + 'A'; for (auto tray : ams.second->trayList) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ - << boost::format(": ams %1% tray %2% id %3% color %4%") % ams.first % tray.first % tray.second->setting_id % tray.second->color; + << boost::format(": ams %1% tray %2% id %3% color %4%") % ams.first % tray.first % tray.second->setting_id % tray.second->color; char t = tray.first.front() - '0' + '1'; DynamicPrintConfig tray_config; - tray_config.set_key_value("filament_id", new ConfigOptionStrings{tray.second->setting_id}); + tray_config.set_key_value("filament_id", new ConfigOptionStrings{ tray.second->setting_id }); tray_config.set_key_value("tag_uid", new ConfigOptionStrings{ tray.second->tag_uid }); - tray_config.set_key_value("filament_type", new ConfigOptionStrings{tray.second->type}); - tray_config.set_key_value("tray_name", new ConfigOptionStrings{std::string(1, n) + std::string(1, t)}); - tray_config.set_key_value("filament_colour", new ConfigOptionStrings{into_u8(wxColour("#" + tray.second->color).GetAsString(wxC2S_HTML_SYNTAX))}); - tray_config.set_key_value("filament_exist", new ConfigOptionBools{tray.second->is_exists}); + tray_config.set_key_value("filament_type", new ConfigOptionStrings{ tray.second->type }); + tray_config.set_key_value("tray_name", new ConfigOptionStrings{ std::string(1, n) + std::string(1, t) }); + tray_config.set_key_value("filament_colour", new ConfigOptionStrings{ into_u8(wxColour("#" + tray.second->color).GetAsString(wxC2S_HTML_SYNTAX)) }); + tray_config.set_key_value("filament_exist", new ConfigOptionBools{ tray.second->is_exists }); filament_ams_list.emplace(((n - 'A') * 4 + t - '1'), std::move(tray_config)); } } + return filament_ams_list; +} + +void Sidebar::load_ams_list(std::string const &device, MachineObject* obj) +{ + std::map filament_ams_list = build_filament_ams_list(obj); + + if (!obj) { + p->ams_list_device = device; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " clear list"; + wxGetApp().preset_bundle->filament_ams_list = filament_ams_list; + for (auto c : p->combos_filament) + c->update(); + return; + } + p->ams_list_device = device; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": %1% items") % filament_ams_list.size(); wxGetApp().preset_bundle->filament_ams_list = filament_ams_list; @@ -10789,9 +10797,11 @@ void Plater::send_calibration_job_finished(wxCommandEvent & evt) auto calibration_panel = p->main_frame->m_calibration; if (calibration_panel) { auto curr_wizard = static_cast(calibration_panel->get_tabpanel()->GetPage(evt.GetInt())); - curr_wizard->show_send_progress_bar(false); - curr_wizard->show_page(curr_wizard->get_curr_page()->get_next_page()); + wxCommandEvent event(EVT_CALIBRATION_JOB_FINISHED); + event.SetEventObject(curr_wizard); + wxPostEvent(curr_wizard, event); } + evt.Skip(); } void Plater::print_job_finished(wxCommandEvent &evt) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index de29ca4ea6..a3d8b3739a 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -127,6 +127,7 @@ public: // BBS void on_bed_type_change(BedType bed_type); void load_ams_list(std::string const & device, MachineObject* obj); + std::map build_filament_ams_list(MachineObject* obj); void sync_ams_list(); ObjectList* obj_list(); @@ -331,7 +332,7 @@ public: void export_gcode(bool prefer_removable); void export_gcode_3mf(bool export_all = false); void send_gcode_finish(wxString name); - void export_core_3mf(); + void export_core_3mf(); static TriangleMesh combine_mesh_fff(const ModelObject& mo, int instance_id, std::function notify_func = {}); void export_stl(bool extended = false, bool selection_only = false); //BBS: remove amf diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index e79cc7e3c1..0ce3f3e61d 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -1522,16 +1522,12 @@ void GUI::CalibrateFilamentComboBox::OnSelect(wxCommandEvent &evt) } m_is_compatible = true; static_cast(m_parent)->Enable(true); - std::string selected_name = evt.GetString().ToUTF8().data(); - selected_name = Preset::remove_suffix_modified(selected_name); - m_selected_preset = m_collection->find_preset(selected_name); - std::string preset_name = m_collection->get_preset_name_by_alias(selected_name); - m_selected_preset = m_collection->find_preset(preset_name); - SimpleEvent e(EVT_CALIBRATION_TRAY_SELECTION_CHANGED); - auto cali_tab = wxGetApp().mainframe->m_calibration->get_tabpanel(); - auto calibration_wizard = static_cast(cali_tab->GetPage(cali_tab->GetSelection())); - e.SetEventObject(calibration_wizard); - wxPostEvent(calibration_wizard, e); + std::string preset_name = m_collection->get_preset_name_by_alias(evt.GetString().ToUTF8().data()); + m_selected_preset = m_collection->find_preset(preset_name); + + wxCommandEvent e(EVT_CALI_TRAY_CHANGED); + e.SetEventObject(m_parent); + wxPostEvent(m_parent, e); } } // namespace Slic3r diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 8db4279202..d4ab741d37 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -4,6 +4,8 @@ #include "Widgets/Label.hpp" #include "Widgets/Button.hpp" #include "Widgets/StepCtrl.hpp" +#include "Widgets/SideTools.hpp" + #include "BitmapCache.hpp" #include "GUI_App.hpp" @@ -101,6 +103,510 @@ static std::vector message_containing_retry{ #define AXIS_MIN_SIZE (wxSize(FromDIP(220), FromDIP(220))) #define EXTRUDER_IMAGE_SIZE (wxSize(FromDIP(48), FromDIP(76))) +PrintingTaskPanel::PrintingTaskPanel(wxWindow* parent, PrintingTaskType type) + : wxPanel(parent, wxID_ANY,wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL) +{ + m_type = type; + create_panel(this); + SetBackgroundColour(*wxWHITE); +} + +PrintingTaskPanel::~PrintingTaskPanel() +{ +} + + +void PrintingTaskPanel::create_panel(wxWindow* parent) +{ + wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *bSizer_printing_title = new wxBoxSizer(wxHORIZONTAL); + + m_panel_printing_title = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(-1, PAGE_TITLE_HEIGHT), wxTAB_TRAVERSAL); + m_panel_printing_title->SetBackgroundColour(STATUS_TITLE_BG); + + m_staticText_printing = new wxStaticText(m_panel_printing_title, wxID_ANY ,_L("Printing Progress")); + m_staticText_printing->Wrap(-1); + m_staticText_printing->SetFont(PAGE_TITLE_FONT); + m_staticText_printing->SetForegroundColour(PAGE_TITLE_FONT_COL); + + bSizer_printing_title->Add(m_staticText_printing, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, PAGE_TITLE_LEFT_MARGIN); + bSizer_printing_title->Add(0, 0, 1, wxEXPAND, 0); + + m_panel_printing_title->SetSizer(bSizer_printing_title); + m_panel_printing_title->Layout(); + bSizer_printing_title->Fit(m_panel_printing_title); + + m_bitmap_thumbnail = new wxStaticBitmap(parent, wxID_ANY, m_thumbnail_placeholder.bmp(), wxDefaultPosition, TASK_THUMBNAIL_SIZE, 0); + + + + wxBoxSizer *bSizer_subtask_info = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *bSizer_task_name = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *bSizer_task_name_hor = new wxBoxSizer(wxHORIZONTAL); + wxPanel* task_name_panel = new wxPanel(parent); + + m_staticText_subtask_value = new wxStaticText(task_name_panel, wxID_ANY, _L("N/A"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); + m_staticText_subtask_value->Wrap(-1); + #ifdef __WXOSX_MAC__ + m_staticText_subtask_value->SetFont(::Label::Body_13); + #else + m_staticText_subtask_value->SetFont(wxFont(13, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); + #endif + m_staticText_subtask_value->SetForegroundColour(wxColour(44, 44, 46)); + + m_bitmap_static_use_time = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_time.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16))); + + m_staticText_consumption_of_time = new wxStaticText(task_name_panel, wxID_ANY, "0m", wxDefaultPosition, wxDefaultSize, 0); + m_staticText_consumption_of_time->SetFont(::Label::Body_12); + m_staticText_consumption_of_time->SetForegroundColour(wxColour(0x68, 0x68, 0x68)); + m_staticText_consumption_of_time->Wrap(-1); + + + m_bitmap_static_use_weight = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_weight.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16))); + + + m_staticText_consumption_of_weight = new wxStaticText(task_name_panel, wxID_ANY, "0g", wxDefaultPosition, wxDefaultSize, 0); + m_staticText_consumption_of_weight->SetFont(::Label::Body_12); + m_staticText_consumption_of_weight->SetForegroundColour(wxColour(0x68, 0x68, 0x68)); + m_staticText_consumption_of_weight->Wrap(-1); + + bSizer_task_name_hor->Add(m_staticText_subtask_value, 1, wxALL | wxEXPAND, 0); + bSizer_task_name_hor->Add(0, 0, 1, wxEXPAND, 0); + bSizer_task_name_hor->Add(m_bitmap_static_use_time, 0, wxALIGN_CENTER_VERTICAL, 0); + bSizer_task_name_hor->Add(m_staticText_consumption_of_time, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, FromDIP(3)); + bSizer_task_name_hor->Add(0, 0, 0, wxLEFT, FromDIP(20)); + bSizer_task_name_hor->Add(m_bitmap_static_use_weight, 0, wxALIGN_CENTER_VERTICAL, 0); + bSizer_task_name_hor->Add(m_staticText_consumption_of_weight, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(3)); + bSizer_task_name_hor->Add(0, 0, 0, wxRIGHT, FromDIP(10)); + + + task_name_panel->SetSizer(bSizer_task_name_hor); + task_name_panel->Layout(); + task_name_panel->Fit(); + + bSizer_task_name->Add(task_name_panel, 0, wxEXPAND, FromDIP(5)); + + + /* wxFlexGridSizer *fgSizer_task = new wxFlexGridSizer(2, 2, 0, 0); + fgSizer_task->AddGrowableCol(0); + fgSizer_task->SetFlexibleDirection(wxVERTICAL); + fgSizer_task->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);*/ + + m_printing_stage_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); + m_printing_stage_value->Wrap(-1); + #ifdef __WXOSX_MAC__ + m_printing_stage_value->SetFont(::Label::Body_11); + #else + m_printing_stage_value->SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); + #endif + + m_printing_stage_value->SetForegroundColour(STAGE_TEXT_COL); + + + m_staticText_profile_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); + m_staticText_profile_value->Wrap(-1); +#ifdef __WXOSX_MAC__ + m_staticText_profile_value->SetFont(::Label::Body_11); +#else + m_staticText_profile_value->SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); +#endif + + m_staticText_profile_value->SetForegroundColour(0x6B6B6B); + + + auto m_panel_progress = new wxPanel(parent, wxID_ANY); + m_panel_progress->SetBackgroundColour(*wxWHITE); + auto m_sizer_progressbar = new wxBoxSizer(wxHORIZONTAL); + m_gauge_progress = new ProgressBar(m_panel_progress, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize); + m_gauge_progress->SetValue(0); + m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT); + m_gauge_progress->SetMaxSize(wxSize(FromDIP(600), -1)); + m_panel_progress->SetSizer(m_sizer_progressbar); + m_panel_progress->Layout(); + m_panel_progress->SetSize(wxSize(-1, FromDIP(24))); + m_panel_progress->SetMaxSize(wxSize(-1, FromDIP(24))); + + wxBoxSizer *bSizer_task_btn = new wxBoxSizer(wxHORIZONTAL); + + bSizer_task_btn->Add(FromDIP(10), 0, 0); + + m_button_pause_resume = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_pause", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER,true); + + m_button_pause_resume->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { + if (m_button_pause_resume->GetToolTipText() == _L("Pause")) { + m_button_pause_resume->SetBitmap_("print_control_pause_hover"); + } + + if (m_button_pause_resume->GetToolTipText() == _L("Resume")) { + m_button_pause_resume->SetBitmap_("print_control_resume_hover"); + } + }); + + m_button_pause_resume->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { + auto buf = m_button_pause_resume->GetClientData(); + if (m_button_pause_resume->GetToolTipText() == _L("Pause")) { + m_button_pause_resume->SetBitmap_("print_control_pause"); + } + + if (m_button_pause_resume->GetToolTipText() == _L("Resume")) { + m_button_pause_resume->SetBitmap_("print_control_resume"); + } + }); + + m_button_abort = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_stop", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); + m_button_abort->SetToolTip(_L("Stop")); + + m_button_abort->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { + m_button_abort->SetBitmap_("print_control_stop_hover"); + }); + + m_button_abort->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { + m_button_abort->SetBitmap_("print_control_stop"); } + ); + + m_sizer_progressbar->Add(m_gauge_progress, 1, wxALIGN_CENTER_VERTICAL, 0); + m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18)); + m_sizer_progressbar->Add(m_button_pause_resume, 0, wxALL, FromDIP(5)); + m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18)); + m_sizer_progressbar->Add(m_button_abort, 0, wxALL, FromDIP(5)); + + wxBoxSizer *bSizer_buttons = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer *bSizer_text = new wxBoxSizer(wxHORIZONTAL); + wxPanel* penel_bottons = new wxPanel(parent); + wxPanel* penel_text = new wxPanel(penel_bottons); + + penel_text->SetBackgroundColour(*wxWHITE); + penel_bottons->SetBackgroundColour(*wxWHITE); + + wxBoxSizer *sizer_percent = new wxBoxSizer(wxVERTICAL); + sizer_percent->Add(0, 0, 1, wxEXPAND, 0); + + wxBoxSizer *sizer_percent_icon = new wxBoxSizer(wxVERTICAL); + sizer_percent_icon->Add(0, 0, 1, wxEXPAND, 0); + + + m_staticText_progress_percent = new wxStaticText(penel_text, wxID_ANY, L("0"), wxDefaultPosition, wxDefaultSize, 0); + m_staticText_progress_percent->SetFont(::Label::Head_18); + m_staticText_progress_percent->SetMaxSize(wxSize(-1, FromDIP(20))); + m_staticText_progress_percent->SetForegroundColour(wxColour(0, 174, 66)); + + m_staticText_progress_percent_icon = new wxStaticText(penel_text, wxID_ANY, L("%"), wxDefaultPosition, wxDefaultSize, 0); + m_staticText_progress_percent_icon->SetFont(::Label::Body_11); + m_staticText_progress_percent_icon->SetMaxSize(wxSize(-1, FromDIP(13))); + m_staticText_progress_percent_icon->SetForegroundColour(wxColour(0, 174, 66)); + + sizer_percent->Add(m_staticText_progress_percent, 0, 0, 0); + + #ifdef __WXOSX_MAC__ + sizer_percent_icon->Add(m_staticText_progress_percent_icon, 0, wxBOTTOM, FromDIP(2)); + #else + sizer_percent_icon->Add(m_staticText_progress_percent_icon, 0, 0, 0); + #endif + + + m_staticText_progress_left = new wxStaticText(penel_text, wxID_ANY, L("N/A"), wxDefaultPosition, wxDefaultSize, 0); + m_staticText_progress_left->Wrap(-1); + m_staticText_progress_left->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); + m_staticText_progress_left->SetForegroundColour(wxColour(146, 146, 146)); + + //fgSizer_task->Add(bSizer_buttons, 0, wxEXPAND, 0); + //fgSizer_task->Add(0, 0, 0, wxEXPAND, FromDIP(5)); + + wxPanel* panel_button_block = new wxPanel(penel_bottons, wxID_ANY); + panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1)); + panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1)); + panel_button_block->SetSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 2, -1)); + panel_button_block->SetBackgroundColour(*wxWHITE); + + m_staticText_layers = new wxStaticText(penel_text, wxID_ANY, _L("Layer: N/A")); + m_staticText_layers->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); + m_staticText_layers->SetForegroundColour(wxColour(146, 146, 146)); + m_staticText_layers->Hide(); + + //bSizer_text->Add(m_staticText_progress_percent, 0, wxALL, 0); + bSizer_text->Add(sizer_percent, 0, wxEXPAND, 0); + bSizer_text->Add(sizer_percent_icon, 0, wxEXPAND, 0); + bSizer_text->Add(0, 0, 1, wxEXPAND, 0); + bSizer_text->Add(m_staticText_layers, 0, wxALIGN_CENTER | wxALL, 0); + bSizer_text->Add(0, 0, 0, wxLEFT, FromDIP(20)); + bSizer_text->Add(m_staticText_progress_left, 0, wxALIGN_CENTER | wxALL, 0); + + penel_text->SetMaxSize(wxSize(FromDIP(600), -1)); + penel_text->SetSizer(bSizer_text); + penel_text->Layout(); + + bSizer_buttons->Add(penel_text, 1, wxEXPAND | wxALL, 0); + bSizer_buttons->Add(panel_button_block, 0, wxALIGN_CENTER | wxALL, 0); + + penel_bottons->SetSizer(bSizer_buttons); + penel_bottons->Layout(); + + StateColor btn_bg_green(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(wxColour(27, 136, 68), StateColor::Pressed), + std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + StateColor btn_bd_green(std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Disabled), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); + + m_button_market_scoring = new Button(parent, _L("Immediately score")); + m_button_market_scoring->SetBackgroundColor(btn_bg_green); + m_button_market_scoring->SetBorderColor(btn_bd_green); + m_button_market_scoring->SetTextColor(wxColour("#FFFFFE")); + m_button_market_scoring->SetSize(wxSize(FromDIP(128), FromDIP(26))); + m_button_market_scoring->SetMinSize(wxSize(-1, FromDIP(26))); + m_button_market_scoring->SetCornerRadius(FromDIP(13)); + + wxBoxSizer *bSizer_market_scoring = new wxBoxSizer(wxHORIZONTAL); + bSizer_market_scoring->Add(m_button_market_scoring); + bSizer_market_scoring->Add(0, 0, 1, wxEXPAND, 0); + m_button_market_scoring->Hide(); + + bSizer_subtask_info->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); + bSizer_subtask_info->Add(bSizer_task_name, 0, wxEXPAND|wxRIGHT, FromDIP(18)); + bSizer_subtask_info->Add(m_staticText_profile_value, 0, wxEXPAND | wxTOP, FromDIP(5)); + bSizer_subtask_info->Add(m_printing_stage_value, 0, wxEXPAND | wxTOP, FromDIP(5)); + bSizer_subtask_info->Add(bSizer_market_scoring, 0, wxEXPAND | wxTOP, FromDIP(5)); + bSizer_subtask_info->Add(penel_bottons, 0, wxEXPAND | wxTOP, FromDIP(10)); + bSizer_subtask_info->Add(m_panel_progress, 0, wxEXPAND|wxRIGHT, FromDIP(25)); + + + m_printing_sizer = new wxBoxSizer(wxHORIZONTAL); + m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1)); + m_printing_sizer->Add(m_bitmap_thumbnail, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxLEFT, FromDIP(12)); + m_printing_sizer->Add(FromDIP(8), 0, 0, wxEXPAND, 0); + m_printing_sizer->Add(bSizer_subtask_info, 1, wxALL | wxEXPAND, 0); + + + m_staticline = new wxPanel( parent, wxID_ANY); + m_staticline->SetBackgroundColour(wxColour(238,238,238)); + m_staticline->Layout(); + m_staticline->Hide(); + + m_panel_error_txt = new wxPanel(parent, wxID_ANY); + m_panel_error_txt->SetBackgroundColour(*wxWHITE); + + wxBoxSizer *static_text_sizer = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer *text_sizer = new wxBoxSizer(wxHORIZONTAL); + + m_error_text = new ErrorMsgStaticText(m_panel_error_txt); + m_error_text->SetForegroundColour(wxColour(255, 0, 0)); + text_sizer->Add(m_error_text, 1, wxEXPAND|wxLEFT, FromDIP(17)); + + m_button_clean = new Button(m_panel_error_txt, _L("Clear")); + StateColor clean_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), + std::pair(wxColour(255, 255, 255), StateColor::Normal)); + StateColor clean_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + StateColor clean_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); + + + m_button_clean->SetBackgroundColor(clean_bg); + m_button_clean->SetBorderColor(clean_bd); + m_button_clean->SetTextColor(clean_text); + m_button_clean->SetFont(Label::Body_10); + m_button_clean->SetMinSize(TASK_BUTTON_SIZE2); + + static_text_sizer->Add(text_sizer, 1, wxEXPAND, 0); + static_text_sizer->Add( FromDIP(10), 0, 0, 0, 0 ); + static_text_sizer->Add(m_button_clean, 0, wxALIGN_CENTRE_VERTICAL|wxRIGHT, FromDIP(5)); + + m_panel_error_txt->SetSizer(static_text_sizer); + m_panel_error_txt->Hide(); + + sizer->Add(m_panel_printing_title, 0, wxEXPAND | wxALL, 0); + sizer->Add(0, FromDIP(12), 0); + sizer->Add(m_printing_sizer, 0, wxEXPAND | wxALL, 0); + sizer->Add(0, 0, 0, wxTOP, FromDIP(15)); + sizer->Add(m_staticline, 0, wxEXPAND | wxALL, FromDIP(10)); + sizer->Add(m_panel_error_txt, 0, wxEXPAND | wxALL, 0); + sizer->Add(0, FromDIP(12), 0); + + if (m_type == CALIBRATION) { + m_panel_printing_title->Hide(); + m_bitmap_thumbnail->Hide(); + task_name_panel->Hide(); + m_staticText_profile_value->Hide(); + } + + parent->SetSizer(sizer); + parent->Layout(); + parent->Fit(); +} + +void PrintingTaskPanel::msw_rescale() +{ + m_panel_printing_title->SetSize(wxSize(-1, FromDIP(PAGE_TITLE_HEIGHT))); + m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1)); + m_staticText_printing->SetMinSize(wxSize(PAGE_TITLE_TEXT_WIDTH, PAGE_TITLE_HEIGHT)); + m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT); + m_gauge_progress->Rescale(); + m_button_abort->msw_rescale(); + m_bitmap_thumbnail->SetSize(TASK_THUMBNAIL_SIZE); +} + +void PrintingTaskPanel::init_bitmaps() +{ + m_thumbnail_placeholder = ScalableBitmap(this, "monitor_placeholder", 120); + m_bitmap_use_time = ScalableBitmap(this, "print_info_time", 16); + m_bitmap_use_weight = ScalableBitmap(this, "print_info_weight", 16); +} + +void PrintingTaskPanel::init_scaled_buttons() +{ + m_button_clean->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); + m_button_clean->SetCornerRadius(FromDIP(12)); +} + +void PrintingTaskPanel::error_info_reset() +{ + if (m_panel_error_txt->IsShown()) { + m_staticline->Hide(); + m_panel_error_txt->Hide(); + m_panel_error_txt->GetParent()->Layout(); + m_error_text->SetLabel(wxEmptyString); + } +} + +void PrintingTaskPanel::show_error_msg(wxString msg) +{ + m_staticline->Show(); + m_panel_error_txt->Show(); + m_error_text->SetLabel(msg); +} + +void PrintingTaskPanel::reset_printing_value() +{ + m_bitmap_thumbnail->SetBitmap(m_thumbnail_placeholder.bmp()); +} + +void PrintingTaskPanel::enable_pause_resume_button(bool enable, std::string type) +{ + if (!enable) { + m_button_pause_resume->Enable(false); + + if (type == "pause_disable") { + m_button_pause_resume->SetBitmap_("print_control_pause_disable"); + } + else if (type == "resume_disable") { + m_button_pause_resume->SetBitmap_("print_control_resume_disable"); + } + } + else { + m_button_pause_resume->Enable(true); + if (type == "resume") { + m_button_pause_resume->SetBitmap_("print_control_resume"); + if (m_button_pause_resume->GetToolTipText() != _L("Resume")) { m_button_pause_resume->SetToolTip(_L("Resume")); } + } + else if (type == "pause") { + m_button_pause_resume->SetBitmap_("print_control_pause"); + if (m_button_pause_resume->GetToolTipText() != _L("Pause")) { m_button_pause_resume->SetToolTip(_L("Pause")); } + } + } +} + +void PrintingTaskPanel::enable_abort_button(bool enable) +{ + if (!enable) { + m_button_abort->Enable(false); + m_button_abort->SetBitmap_("print_control_stop_disable"); + } + else { + m_button_abort->Enable(true); + m_button_abort->SetBitmap_("print_control_stop"); + } +} + +void PrintingTaskPanel::update_subtask_name(wxString name) +{ + m_staticText_subtask_value->SetLabelText(name); +} + +void PrintingTaskPanel::update_stage_value(wxString stage, int val) +{ + m_printing_stage_value->SetLabelText(stage); + m_gauge_progress->SetValue(val); +} + +void PrintingTaskPanel::update_progress_percent(wxString percent, wxString icon) +{ + m_staticText_progress_percent->SetLabelText(percent); + m_staticText_progress_percent_icon->SetLabelText(icon); +} + +void PrintingTaskPanel::update_left_time(wxString time) +{ + m_staticText_progress_left->SetLabelText(time); +} + +void PrintingTaskPanel::update_left_time(int mc_left_time) +{ + // update gcode progress + std::string left_time; + wxString left_time_text = NA_STR; + + try { + left_time = get_bbl_monitor_time_dhm(mc_left_time); + } + catch (...) { + ; + } + + if (!left_time.empty()) left_time_text = wxString::Format("-%s", left_time); + update_left_time(left_time_text); +} + +void PrintingTaskPanel::update_layers_num(bool show, wxString num) +{ + if (show) { + m_staticText_layers->Show(true); + m_staticText_layers->SetLabelText(num); + } + else { + m_staticText_layers->Show(false); + m_staticText_layers->SetLabelText(num); + } +} + +void PrintingTaskPanel::show_priting_use_info(bool show, wxString time /*= wxEmptyString*/, wxString weight /*= wxEmptyString*/) +{ + if (show) { + if (!m_staticText_consumption_of_time->IsShown()) { + m_bitmap_static_use_time->Show(); + m_staticText_consumption_of_time->Show(); + } + + if (!m_staticText_consumption_of_weight->IsShown()) { + m_bitmap_static_use_weight->Show(); + m_staticText_consumption_of_weight->Show(); + } + + m_staticText_consumption_of_time->SetLabelText(time); + m_staticText_consumption_of_weight->SetLabelText(weight); + } + else { + m_staticText_consumption_of_time->SetLabelText("0m"); + m_staticText_consumption_of_weight->SetLabelText("0g"); + if (m_staticText_consumption_of_time->IsShown()) { + m_bitmap_static_use_time->Hide(); + m_staticText_consumption_of_time->Hide(); + } + + if (m_staticText_consumption_of_weight->IsShown()) { + m_bitmap_static_use_weight->Hide(); + m_staticText_consumption_of_weight->Hide(); + } } +} + + +void PrintingTaskPanel::show_profile_info(bool show, wxString profile /*= wxEmptyString*/) +{ + if (show) { + if (!m_staticText_profile_value->IsShown()) { m_staticText_profile_value->Show(); } + m_staticText_profile_value->SetLabelText(profile); + } + else { + m_staticText_profile_value->SetLabelText(wxEmptyString); + m_staticText_profile_value->Hide(); + } +} + StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name) : wxScrolledWindow(parent, id, pos, size, wxHSCROLL | wxVSCROLL) { @@ -136,13 +642,8 @@ StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint m_panel_separotor1->SetMaxSize(wxSize(-1, PAGE_SPACING)); m_monitoring_sizer->Add(m_panel_separotor1, 0, wxEXPAND, 0); - m_project_task_panel = new wxPanel(this); - m_project_task_panel->SetBackgroundColour(*wxWHITE); - - auto m_project_task_sizer = create_project_task_page(m_project_task_panel); - m_project_task_panel->SetSizer(m_project_task_sizer); - m_project_task_panel->Layout(); - m_project_task_sizer->Fit(m_project_task_panel); + m_project_task_panel = new PrintingTaskPanel(this, PrintingTaskType::PRINGINT); + m_project_task_panel->init_bitmaps(); m_monitoring_sizer->Add(m_project_task_panel, 0, wxALL | wxEXPAND , 0); // auto m_panel_separotor2 = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); @@ -191,7 +692,6 @@ StatusBasePanel::~StatusBasePanel() void StatusBasePanel::init_bitmaps() { static Slic3r::GUI::BitmapCache cache; - m_item_placeholder = create_scaled_bitmap("monitor_placeholder", nullptr, 60); m_bitmap_item_prediction = create_scaled_bitmap("monitor_item_prediction", nullptr, 16); m_bitmap_item_cost = create_scaled_bitmap("monitor_item_cost", nullptr, 16); m_bitmap_item_print = create_scaled_bitmap("monitor_item_print", nullptr, 18); @@ -202,9 +702,7 @@ void StatusBasePanel::init_bitmaps() m_bitmap_fan_off = ScalableBitmap(this, "monitor_fan_off", 22); m_bitmap_speed = ScalableBitmap(this, "monitor_speed", 24); m_bitmap_speed_active = ScalableBitmap(this, "monitor_speed_active", 24); - m_bitmap_use_time = ScalableBitmap(this, "print_info_time", 16); - m_bitmap_use_weight = ScalableBitmap(this, "print_info_weight", 16); - m_thumbnail_placeholder = ScalableBitmap(this, "monitor_placeholder", 120); + m_thumbnail_brokenimg = ScalableBitmap(this, "monitor_brokenimg", 120); m_thumbnail_sdcard = ScalableBitmap(this, "monitor_sdcard_thumbnail", 120); //m_bitmap_camera = create_scaled_bitmap("monitor_camera", nullptr, 18); @@ -314,332 +812,6 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page() return sizer; } -wxBoxSizer *StatusBasePanel::create_project_task_page(wxWindow *parent) -{ - wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *bSizer_printing_title = new wxBoxSizer(wxHORIZONTAL); - - m_panel_printing_title = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(-1, PAGE_TITLE_HEIGHT), wxTAB_TRAVERSAL); - m_panel_printing_title->SetBackgroundColour(STATUS_TITLE_BG); - - m_staticText_printing = new Label(m_panel_printing_title, _L("Printing Progress")); - m_staticText_printing->Wrap(-1); - m_staticText_printing->SetFont(PAGE_TITLE_FONT); - m_staticText_printing->SetForegroundColour(PAGE_TITLE_FONT_COL); - bSizer_printing_title->Add(m_staticText_printing, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, PAGE_TITLE_LEFT_MARGIN); - - bSizer_printing_title->Add(0, 0, 1, wxEXPAND, 0); - - m_panel_printing_title->SetSizer(bSizer_printing_title); - m_panel_printing_title->Layout(); - bSizer_printing_title->Fit(m_panel_printing_title); - - sizer->Add(m_panel_printing_title, 0, wxEXPAND | wxALL, 0); - sizer->Add(0, FromDIP(12), 0); - - m_printing_sizer = new wxBoxSizer(wxHORIZONTAL); - - m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1)); - m_bitmap_thumbnail = new wxStaticBitmap(parent, wxID_ANY, m_thumbnail_placeholder.bmp(), wxDefaultPosition, TASK_THUMBNAIL_SIZE, 0); - - m_printing_sizer->Add(m_bitmap_thumbnail, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxLEFT, FromDIP(12)); - - m_printing_sizer->Add(FromDIP(8), 0, 0, wxEXPAND, 0); - - wxBoxSizer *bSizer_subtask_info = new wxBoxSizer(wxVERTICAL); - - wxBoxSizer *bSizer_task_name = new wxBoxSizer(wxVERTICAL); - - wxBoxSizer *bSizer_task_name_hor = new wxBoxSizer(wxHORIZONTAL); - wxPanel* task_name_panel = new wxPanel(parent); - - m_staticText_subtask_value = new wxStaticText(task_name_panel, wxID_ANY, _L("N/A"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); - m_staticText_subtask_value->Wrap(-1); - #ifdef __WXOSX_MAC__ - m_staticText_subtask_value->SetFont(::Label::Body_13); - #else - m_staticText_subtask_value->SetFont(wxFont(13, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); - #endif - m_staticText_subtask_value->SetForegroundColour(wxColour(44, 44, 46)); - - m_bitmap_static_use_time = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_time.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16))); - - m_staticText_consumption_of_time = new wxStaticText(task_name_panel, wxID_ANY, "0m", wxDefaultPosition, wxDefaultSize, 0); - m_staticText_consumption_of_time->SetFont(::Label::Body_12); - m_staticText_consumption_of_time->SetForegroundColour(wxColour(0x68, 0x68, 0x68)); - m_staticText_consumption_of_time->Wrap(-1); - - - m_bitmap_static_use_weight = new wxStaticBitmap(task_name_panel, wxID_ANY, m_bitmap_use_weight.bmp(), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16))); - - - m_staticText_consumption_of_weight = new wxStaticText(task_name_panel, wxID_ANY, "0g", wxDefaultPosition, wxDefaultSize, 0); - m_staticText_consumption_of_weight->SetFont(::Label::Body_12); - m_staticText_consumption_of_weight->SetForegroundColour(wxColour(0x68, 0x68, 0x68)); - m_staticText_consumption_of_weight->Wrap(-1); - - bSizer_task_name_hor->Add(m_staticText_subtask_value, 1, wxALL | wxEXPAND, 0); - bSizer_task_name_hor->Add(0, 0, 1, wxEXPAND, 0); - bSizer_task_name_hor->Add(m_bitmap_static_use_time, 0, wxALIGN_CENTER_VERTICAL, 0); - bSizer_task_name_hor->Add(m_staticText_consumption_of_time, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, FromDIP(3)); - bSizer_task_name_hor->Add(0, 0, 0, wxLEFT, FromDIP(20)); - bSizer_task_name_hor->Add(m_bitmap_static_use_weight, 0, wxALIGN_CENTER_VERTICAL, 0); - bSizer_task_name_hor->Add(m_staticText_consumption_of_weight, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(3)); - bSizer_task_name_hor->Add(0, 0, 0, wxRIGHT, FromDIP(10)); - - - task_name_panel->SetSizer(bSizer_task_name_hor); - task_name_panel->Layout(); - task_name_panel->Fit(); - - bSizer_task_name->Add(task_name_panel, 0, wxEXPAND, FromDIP(5)); - - - /* wxFlexGridSizer *fgSizer_task = new wxFlexGridSizer(2, 2, 0, 0); - fgSizer_task->AddGrowableCol(0); - fgSizer_task->SetFlexibleDirection(wxVERTICAL); - fgSizer_task->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);*/ - - m_printing_stage_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); - m_printing_stage_value->Wrap(-1); - #ifdef __WXOSX_MAC__ - m_printing_stage_value->SetFont(::Label::Body_11); - #else - m_printing_stage_value->SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); - #endif - - m_printing_stage_value->SetForegroundColour(STAGE_TEXT_COL); - - - m_staticText_profile_value = new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT | wxST_ELLIPSIZE_END); - m_staticText_profile_value->Wrap(-1); -#ifdef __WXOSX_MAC__ - m_staticText_profile_value->SetFont(::Label::Body_11); -#else - m_staticText_profile_value->SetFont(wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); -#endif - - m_staticText_profile_value->SetForegroundColour(0x6B6B6B); - - - auto m_panel_progress = new wxPanel(parent, wxID_ANY); - m_panel_progress->SetBackgroundColour(*wxWHITE); - auto m_sizer_progressbar = new wxBoxSizer(wxHORIZONTAL); - m_gauge_progress = new ProgressBar(m_panel_progress, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize); - m_gauge_progress->SetValue(0); - m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT); - m_gauge_progress->SetMaxSize(wxSize(FromDIP(600), -1)); - m_panel_progress->SetSizer(m_sizer_progressbar); - m_panel_progress->Layout(); - m_panel_progress->SetSize(wxSize(-1, FromDIP(24))); - m_panel_progress->SetMaxSize(wxSize(-1, FromDIP(24))); - - wxBoxSizer *bSizer_task_btn = new wxBoxSizer(wxHORIZONTAL); - - bSizer_task_btn->Add(FromDIP(10), 0, 0); - - /* m_button_report = new Button(m_panel_progress, _L("Report")); - StateColor report_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed), - std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), - std::pair(wxColour(255, 255, 255), StateColor::Normal)); - m_button_report->SetBackgroundColor(report_bg); - m_button_report->SetMinSize(TASK_BUTTON_SIZE2); - StateColor report_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - m_button_report->SetBorderColor(report_bd); - StateColor report_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - m_button_report->SetTextColor(report_text); - m_button_report->SetFont(Label::Body_10); - m_button_report->Hide(); - m_sizer_progressbar->Add(m_button_report, 0, wxALL, FromDIP(5));*/ - - m_button_pause_resume = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_pause", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER,true); - - m_button_pause_resume->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { - if (m_button_pause_resume->GetToolTipText() == _L("Pause")) { - m_button_pause_resume->SetBitmap_("print_control_pause_hover"); - } - - if (m_button_pause_resume->GetToolTipText() == _L("Resume")) { - m_button_pause_resume->SetBitmap_("print_control_resume_hover"); - } - }); - - m_button_pause_resume->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { - auto buf = m_button_pause_resume->GetClientData(); - if (m_button_pause_resume->GetToolTipText() == _L("Pause")) { - m_button_pause_resume->SetBitmap_("print_control_pause"); - } - - if (m_button_pause_resume->GetToolTipText() == _L("Resume")) { - m_button_pause_resume->SetBitmap_("print_control_resume"); - } - }); - - m_button_abort = new ScalableButton(m_panel_progress, wxID_ANY, "print_control_stop", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); - m_button_abort->SetToolTip(_L("Stop")); - - m_button_abort->Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { - m_button_abort->SetBitmap_("print_control_stop_hover"); - }); - - m_button_abort->Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { - m_button_abort->SetBitmap_("print_control_stop"); } - ); - - m_sizer_progressbar->Add(m_gauge_progress, 1, wxALIGN_CENTER_VERTICAL, 0); - m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18)); - m_sizer_progressbar->Add(m_button_pause_resume, 0, wxALL, FromDIP(5)); - m_sizer_progressbar->Add(0, 0, 0, wxEXPAND|wxLEFT, FromDIP(18)); - m_sizer_progressbar->Add(m_button_abort, 0, wxALL, FromDIP(5)); - - //fgSizer_task->Add(bSizer_task_btn, 0, wxEXPAND, 0); - - wxBoxSizer *bSizer_buttons = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *bSizer_text = new wxBoxSizer(wxHORIZONTAL); - wxPanel* penel_bottons = new wxPanel(parent); - wxPanel* penel_text = new wxPanel(penel_bottons); - - penel_text->SetBackgroundColour(*wxWHITE); - penel_bottons->SetBackgroundColour(*wxWHITE); - - wxBoxSizer *sizer_percent = new wxBoxSizer(wxVERTICAL); - sizer_percent->Add(0, 0, 1, wxEXPAND, 0); - - wxBoxSizer *sizer_percent_icon = new wxBoxSizer(wxVERTICAL); - sizer_percent_icon->Add(0, 0, 1, wxEXPAND, 0); - - - m_staticText_progress_percent = new wxStaticText(penel_text, wxID_ANY, L("0"), wxDefaultPosition, wxDefaultSize, 0); - m_staticText_progress_percent->SetFont(::Label::Head_18); - m_staticText_progress_percent->SetMaxSize(wxSize(-1, FromDIP(20))); - m_staticText_progress_percent->SetForegroundColour(wxColour(0, 174, 66)); - - m_staticText_progress_percent_icon = new wxStaticText(penel_text, wxID_ANY, L("%"), wxDefaultPosition, wxDefaultSize, 0); - m_staticText_progress_percent_icon->SetFont(::Label::Body_11); - m_staticText_progress_percent_icon->SetMaxSize(wxSize(-1, FromDIP(13))); - m_staticText_progress_percent_icon->SetForegroundColour(wxColour(0, 174, 66)); - - sizer_percent->Add(m_staticText_progress_percent, 0, 0, 0); - - #ifdef __WXOSX_MAC__ - sizer_percent_icon->Add(m_staticText_progress_percent_icon, 0, wxBOTTOM, FromDIP(2)); - #else - sizer_percent_icon->Add(m_staticText_progress_percent_icon, 0, 0, 0); - #endif - - - m_staticText_progress_left = new wxStaticText(penel_text, wxID_ANY, L("N/A"), wxDefaultPosition, wxDefaultSize, 0); - m_staticText_progress_left->Wrap(-1); - m_staticText_progress_left->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); - m_staticText_progress_left->SetForegroundColour(wxColour(146, 146, 146)); - - //fgSizer_task->Add(bSizer_buttons, 0, wxEXPAND, 0); - //fgSizer_task->Add(0, 0, 0, wxEXPAND, FromDIP(5)); - - wxPanel* panel_button_block = new wxPanel(penel_bottons, wxID_ANY); - panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1)); - panel_button_block->SetMinSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 4, -1)); - panel_button_block->SetSize(wxSize(TASK_BUTTON_SIZE.x * 2 + FromDIP(5) * 2, -1)); - panel_button_block->SetBackgroundColour(*wxWHITE); - - m_staticText_layers = new wxStaticText(penel_text, wxID_ANY, _L("Layer: N/A")); - m_staticText_layers->SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("HarmonyOS Sans SC"))); - m_staticText_layers->SetForegroundColour(wxColour(146, 146, 146)); - m_staticText_layers->Hide(); - - //bSizer_text->Add(m_staticText_progress_percent, 0, wxALL, 0); - bSizer_text->Add(sizer_percent, 0, wxEXPAND, 0); - bSizer_text->Add(sizer_percent_icon, 0, wxEXPAND, 0); - bSizer_text->Add(0, 0, 1, wxEXPAND, 0); - bSizer_text->Add(m_staticText_layers, 0, wxALIGN_CENTER | wxALL, 0); - bSizer_text->Add(0, 0, 0, wxLEFT, FromDIP(20)); - bSizer_text->Add(m_staticText_progress_left, 0, wxALIGN_CENTER | wxALL, 0); - - penel_text->SetMaxSize(wxSize(FromDIP(600), -1)); - penel_text->SetSizer(bSizer_text); - penel_text->Layout(); - - bSizer_buttons->Add(penel_text, 1, wxEXPAND | wxALL, 0); - bSizer_buttons->Add(panel_button_block, 0, wxALIGN_CENTER | wxALL, 0); - - penel_bottons->SetSizer(bSizer_buttons); - penel_bottons->Layout(); - - StateColor btn_bg_green(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(wxColour(27, 136, 68), StateColor::Pressed), - std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); - StateColor btn_bd_green(std::pair(AMS_CONTROL_WHITE_COLOUR, StateColor::Disabled), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Enabled)); - - m_button_market_scoring = new Button(parent, _L("Immediately score")); - m_button_market_scoring->SetBackgroundColor(btn_bg_green); - m_button_market_scoring->SetBorderColor(btn_bd_green); - m_button_market_scoring->SetTextColor(wxColour("#FFFFFE")); - m_button_market_scoring->SetSize(wxSize(FromDIP(128), FromDIP(26))); - m_button_market_scoring->SetMinSize(wxSize(-1, FromDIP(26))); - m_button_market_scoring->SetCornerRadius(FromDIP(13)); - - wxBoxSizer *bSizer_market_scoring = new wxBoxSizer(wxHORIZONTAL); - bSizer_market_scoring->Add(m_button_market_scoring); - bSizer_market_scoring->Add(0, 0, 1, wxEXPAND, 0); - m_button_market_scoring->Hide(); - - bSizer_subtask_info->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); - bSizer_subtask_info->Add(bSizer_task_name, 0, wxEXPAND|wxRIGHT, FromDIP(18)); - bSizer_subtask_info->Add(m_staticText_profile_value, 0, wxEXPAND | wxTOP, FromDIP(5)); - bSizer_subtask_info->Add(m_printing_stage_value, 0, wxEXPAND | wxTOP, FromDIP(5)); - bSizer_subtask_info->Add(bSizer_market_scoring, 0, wxEXPAND | wxTOP, FromDIP(5)); - bSizer_subtask_info->Add(penel_bottons, 0, wxEXPAND | wxTOP, FromDIP(10)); - bSizer_subtask_info->Add(m_panel_progress, 0, wxEXPAND|wxRIGHT, FromDIP(25)); - - m_printing_sizer->Add(bSizer_subtask_info, 1, wxALL | wxEXPAND, 0); - - sizer->Add(m_printing_sizer, 0, wxEXPAND | wxALL, 0); - - m_staticline = new wxPanel( parent, wxID_ANY); - m_staticline->SetBackgroundColour(wxColour(238,238,238)); - m_staticline->Layout(); - m_staticline->Hide(); - - sizer->Add(0, 0, 0, wxTOP, FromDIP(15)); - sizer->Add(m_staticline, 0, wxEXPAND|wxALL, FromDIP(10)); - - m_panel_error_txt = new wxPanel(parent, wxID_ANY); - m_panel_error_txt->SetBackgroundColour(*wxWHITE); - - wxBoxSizer *static_text_sizer = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer *text_sizer = new wxBoxSizer(wxHORIZONTAL); - - m_error_text = new ErrorMsgStaticText(m_panel_error_txt); - m_error_text->SetForegroundColour(wxColour(255, 0, 0)); - text_sizer->Add(m_error_text, 1, wxEXPAND|wxLEFT, FromDIP(17)); - - m_button_clean = new Button(m_panel_error_txt, _L("Clear")); - StateColor clean_bg(std::pair(wxColour(255, 255, 255), StateColor::Disabled), std::pair(wxColour(206, 206, 206), StateColor::Pressed), - std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), - std::pair(wxColour(255, 255, 255), StateColor::Normal)); - StateColor clean_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - StateColor clean_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - - - m_button_clean->SetBackgroundColor(clean_bg); - m_button_clean->SetBorderColor(clean_bd); - m_button_clean->SetTextColor(clean_text); - m_button_clean->SetFont(Label::Body_10); - m_button_clean->SetMinSize(TASK_BUTTON_SIZE2); - - static_text_sizer->Add(text_sizer, 1, wxEXPAND, 0); - static_text_sizer->Add( FromDIP(10), 0, 0, 0, 0 ); - static_text_sizer->Add(m_button_clean, 0, wxALIGN_CENTRE_VERTICAL|wxRIGHT, FromDIP(5)); - - m_panel_error_txt->SetSizer(static_text_sizer); - m_panel_error_txt->Hide(); - sizer->Add(m_panel_error_txt, 0, wxEXPAND | wxALL,0); - sizer->Add(0, FromDIP(12), 0); - - m_tasklist_sizer = new wxBoxSizer(wxVERTICAL); - sizer->Add(m_tasklist_sizer, 0, wxEXPAND | wxALL, 0); - return sizer; -} - wxBoxSizer *StatusBasePanel::create_machine_control_page(wxWindow *parent) { wxBoxSizer *bSizer_right = new wxBoxSizer(wxVERTICAL); @@ -1247,16 +1419,8 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co : StatusBasePanel(parent, id, pos, size, style) , m_fan_control_popup(new FanControlPopup(this)) { - create_tasklist_info(); - update_tasklist_info(); - init_scaled_buttons(); - - //m_buttons.push_back(m_button_report); - //m_buttons.push_back(m_button_pause_resume); - //m_buttons.push_back(m_button_abort); m_buttons.push_back(m_button_unload); - m_buttons.push_back(m_button_clean); m_buttons.push_back(m_bpButton_z_10); m_buttons.push_back(m_bpButton_z_1); m_buttons.push_back(m_bpButton_z_down_1); @@ -1272,11 +1436,9 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co m_switch_cham_fan->SetValue(false); /* set default enable state */ - m_button_pause_resume->Enable(false); - m_button_pause_resume->SetBitmap_("print_control_resume_disable"); + m_project_task_panel->enable_pause_resume_button(false, "resume_disable"); + m_project_task_panel->enable_abort_button(false); - m_button_abort->Enable(false); - m_button_abort->SetBitmap_("print_control_stop_disable"); Bind(wxEVT_WEBREQUEST_STATE, &StatusPanel::on_webrequest_state, this); @@ -1291,16 +1453,14 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co // Connect Events - //m_bitmap_thumbnail->Connect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_enter), NULL, this); - //m_bitmap_thumbnail->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this); - m_bitmap_thumbnail->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::refresh_thumbnail_webrequest), NULL, this); + m_project_task_panel->get_bitmap_thumbnail()->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::refresh_thumbnail_webrequest), NULL, this); + m_project_task_panel->get_pause_resume_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this); + m_project_task_panel->get_abort_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this); + m_project_task_panel->get_market_scoring_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_market_scoring), NULL, this); + m_project_task_panel->get_clean_button()->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_print_error_clean), NULL, this); + m_setting_button->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this); m_setting_button->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this); - m_project_task_panel->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this); - m_button_pause_resume->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this); - m_button_abort->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this); - m_button_clean->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_print_error_clean), NULL, this); - m_button_market_scoring->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_market_scoring), NULL, this); m_tempCtrl_bed->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_kill_focus), NULL, this); m_tempCtrl_bed->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this); m_tempCtrl_nozzle->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this); @@ -1339,15 +1499,14 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co StatusPanel::~StatusPanel() { // Disconnect Events - //m_bitmap_thumbnail->Disconnect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_enter), NULL, this); - //m_bitmap_thumbnail->Disconnect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this); - m_bitmap_thumbnail->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::refresh_thumbnail_webrequest), NULL, this); + m_project_task_panel->get_bitmap_thumbnail()->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::refresh_thumbnail_webrequest), NULL, this); + m_project_task_panel->get_pause_resume_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this); + m_project_task_panel->get_abort_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this); + m_project_task_panel->get_market_scoring_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_market_scoring), NULL, this); + m_project_task_panel->get_clean_button()->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_print_error_clean), NULL, this); + m_setting_button->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this); m_setting_button->Disconnect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this); - m_button_pause_resume->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this); - m_button_abort->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this); - m_button_clean->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_print_error_clean), NULL, this); - m_button_market_scoring->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_market_scoring), NULL, this); m_tempCtrl_bed->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_kill_focus), NULL, this); m_tempCtrl_bed->Disconnect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this); m_tempCtrl_nozzle->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this); @@ -1384,14 +1543,7 @@ StatusPanel::~StatusPanel() void StatusPanel::init_scaled_buttons() { - // m_button_report->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); - // m_button_report->SetCornerRadius(FromDIP(12)); - //m_button_pause_resume->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); - //m_button_pause_resume->SetCornerRadius(FromDIP(12)); - //m_button_abort->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); - //m_button_abort->SetCornerRadius(FromDIP(12)); - m_button_clean->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); - m_button_clean->SetCornerRadius(FromDIP(12)); + m_project_task_panel->init_scaled_buttons(); m_button_unload->SetMinSize(wxSize(-1, FromDIP(24))); m_button_unload->SetCornerRadius(FromDIP(12)); m_bpButton_z_10->SetMinSize(Z_BUTTON_SIZE); @@ -1408,43 +1560,6 @@ void StatusPanel::init_scaled_buttons() m_bpButton_e_down_10->SetCornerRadius(FromDIP(12)); } -void StatusPanel::create_tasklist_info() -{ - m_tasklist_caption_sizer = new wxBoxSizer(wxHORIZONTAL); - m_text_tasklist_caption = new wxStaticText(this, wxID_ANY, _L("Printing List"), wxDefaultPosition, wxDefaultSize, 0); - m_text_tasklist_caption->Wrap(-1); - m_text_tasklist_caption->SetFont(Label::Body_16); - m_text_tasklist_caption->SetForegroundColour(GROUP_TITLE_FONT_COL); - - m_tasklist_caption_sizer->Add(m_text_tasklist_caption, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, GROUP_TITLE_LEFT_MARGIN); - - auto staticline = new StaticLine(this); - staticline->SetLineColour(GROUP_STATIC_LINE_COL); - m_tasklist_caption_sizer->Add(staticline, 1, wxRIGHT | wxLEFT | wxALIGN_CENTER_VERTICAL, GROUP_TITLE_LINE_MARGIN); - m_tasklist_caption_sizer->Add(GROUP_TITLE_RIGHT_MARGIN - GROUP_TITLE_LINE_MARGIN, 0, 0, wxEXPAND, 0); - - m_tasklist_sizer->Add(m_tasklist_caption_sizer, 0, wxEXPAND | wxALL, 0); - - show_task_list_info(false); -} - -void StatusPanel::show_task_list_info(bool show) -{ - if (show) { - m_tasklist_sizer->Show(m_tasklist_caption_sizer); - } else { - m_tasklist_sizer->Hide(m_tasklist_caption_sizer); - } - Layout(); - -} - -void StatusPanel::update_tasklist_info() -{ - // BBS do not show tasklist - return; -} - void StatusPanel::on_market_scoring(wxCommandEvent &event) { if (obj && obj->get_modeltask() && obj->get_modeltask()->design_id > 0) { market_model_scoring_page(obj->get_modeltask()->design_id); @@ -1475,10 +1590,7 @@ void StatusPanel::on_subtask_abort(wxCommandEvent &event) void StatusPanel::error_info_reset() { - m_staticline->Hide(); - m_panel_error_txt->Hide(); - m_panel_error_txt->GetParent()->Layout(); - m_error_text->SetLabel(""); + m_project_task_panel->error_info_reset(); before_error_code = 0; } @@ -1499,15 +1611,15 @@ void StatusPanel::on_webrequest_state(wxWebRequestEvent &evt) case wxWebRequest::State_Completed: { wxImage img(*evt.GetResponse().GetStream()); img_list.insert(std::make_pair(m_request_url, img)); - wxImage resize_img = img.Scale(m_bitmap_thumbnail->GetSize().x, m_bitmap_thumbnail->GetSize().y, wxIMAGE_QUALITY_HIGH); - m_bitmap_thumbnail->SetBitmap(resize_img); + wxImage resize_img = img.Scale(m_project_task_panel->get_bitmap_thumbnail()->GetSize().x, m_project_task_panel->get_bitmap_thumbnail()->GetSize().y, wxIMAGE_QUALITY_HIGH); + m_project_task_panel->get_bitmap_thumbnail()->SetBitmap(resize_img); task_thumbnail_state = ThumbnailState::TASK_THUMBNAIL; break; } case wxWebRequest::State_Failed: case wxWebRequest::State_Cancelled: case wxWebRequest::State_Unauthorized: { - m_bitmap_thumbnail->SetBitmap(m_thumbnail_brokenimg.bmp()); + m_project_task_panel->get_bitmap_thumbnail()->SetBitmap(m_thumbnail_brokenimg.bmp()); task_thumbnail_state = ThumbnailState::BROKEN_IMG; break; } @@ -1517,6 +1629,24 @@ void StatusPanel::on_webrequest_state(wxWebRequestEvent &evt) } } +void StatusPanel::refresh_thumbnail_webrequest(wxMouseEvent& event) +{ + if (!obj) return; + if (task_thumbnail_state != ThumbnailState::BROKEN_IMG) return; + + if (obj->slice_info) { + m_request_url = wxString(obj->slice_info->thumbnail_url); + if (!m_request_url.IsEmpty()) { + web_request = wxWebSession::GetDefault().CreateRequest(this, m_request_url); + BOOST_LOG_TRIVIAL(trace) << "monitor: create new webrequest, state = " << web_request.GetState() << ", url = " << m_request_url; + if (web_request.GetState() == wxWebRequest::State_Idle) + web_request.Start(); + BOOST_LOG_TRIVIAL(trace) << "monitor: start new webrequest, state = " << web_request.GetState() << ", url = " << m_request_url; + } + } +} + + bool StatusPanel::is_task_changed(MachineObject* obj) { if (!obj) @@ -1553,10 +1683,7 @@ void StatusPanel::update(MachineObject *obj) update_temp_ctrl(obj); update_misc_ctrl(obj); - // BBS hide tasklist info - // update_tasklist(obj); update_ams(obj); - update_cali(obj); if (obj) { @@ -1680,18 +1807,9 @@ void StatusPanel::market_model_scoring_page(int design_id) void StatusPanel::show_error_message(MachineObject* obj, wxString msg, std::string print_error_str) { if (msg.IsEmpty()) { - if (m_panel_error_txt->IsShown()) { - error_info_reset(); - } - if (m_print_error_dlg != nullptr) { - /*if (m_print_error_dlg->IsShown()) { - m_print_error_dlg->on_hide(); - }*/ - } + error_info_reset(); } else { - m_error_text->SetLabel(msg); - m_staticline->Show(); - m_panel_error_txt->Show(); + m_project_task_panel->show_error_msg(msg); auto it = std::find(message_containing_retry.begin(), message_containing_retry.end(), print_error_str); @@ -1788,7 +1906,6 @@ void StatusPanel::show_printing_status(bool ctrl_area, bool temp_area) m_switch_printing_fan->Enable(); m_switch_cham_fan->Enable(); m_bpButton_xy->Enable(); - m_text_tasklist_caption->SetForegroundColour(GROUP_TITLE_FONT_COL); m_bpButton_z_10->Enable(); m_bpButton_z_1->Enable(); m_bpButton_z_down_1->Enable(); @@ -2320,23 +2437,6 @@ void StatusPanel::update_cali(MachineObject *obj) } } -void StatusPanel::update_left_time(int mc_left_time) -{ - // update gcode progress - std::string left_time; - wxString left_time_text = NA_STR; - - try { - left_time = get_bbl_monitor_time_dhm(mc_left_time); - } catch (...) { - ; - } - if (!left_time.empty()) left_time_text = wxString::Format("-%s", left_time); - - // update current subtask progress - m_staticText_progress_left->SetLabelText(left_time_text); -} - void StatusPanel::update_basic_print_data(bool def) { if (def) { @@ -2345,31 +2445,10 @@ void StatusPanel::update_basic_print_data(bool def) wxString prediction = wxString::Format("%s", get_bbl_time_dhms(obj->slice_info->prediction)); wxString weight = wxString::Format("%.2fg", obj->slice_info->weight); - if (!m_staticText_consumption_of_time->IsShown()) { - m_bitmap_static_use_time->Show(); - m_staticText_consumption_of_time->Show(); - } - - if (!m_staticText_consumption_of_weight->IsShown()) { - m_bitmap_static_use_weight->Show(); - m_staticText_consumption_of_weight->Show(); - } - - m_staticText_consumption_of_time->SetLabelText(prediction); - m_staticText_consumption_of_weight->SetLabelText(weight); - } else { - if (m_staticText_consumption_of_time->IsShown()) { - m_bitmap_static_use_time->Hide(); - m_staticText_consumption_of_time->Hide(); - } - - if (m_staticText_consumption_of_weight->IsShown()) { - m_bitmap_static_use_weight->Hide(); - m_staticText_consumption_of_weight->Hide(); - } - - m_staticText_consumption_of_time->SetLabelText("0m"); - m_staticText_consumption_of_weight->SetLabelText("0g"); + m_project_task_panel->show_priting_use_info(true, prediction, weight); + } + else { + m_project_task_panel->show_priting_use_info(false, "0m", "0g"); } } @@ -2398,10 +2477,10 @@ void StatusPanel::update_subtask(MachineObject *obj) if (!obj) return; if (obj->is_support_layer_num) { - m_staticText_layers->Show(); + m_project_task_panel->update_layers_num(true); } else { - m_staticText_layers->Hide(); + m_project_task_panel->update_layers_num(false); } update_model_info(); @@ -2411,12 +2490,9 @@ void StatusPanel::update_subtask(MachineObject *obj) reset_printing_values(); } else if (obj->is_in_printing() || obj->print_status == "FINISH") { if (obj->is_in_prepare() || obj->print_status == "SLICING") { - m_button_market_scoring->Hide(); - m_button_abort->Enable(false); - m_button_abort->SetBitmap_("print_control_stop_disable"); - - m_button_pause_resume->Enable(false); - m_button_pause_resume->SetBitmap_("print_control_pause_disable"); + m_project_task_panel->get_market_scoring_button()->Hide(); + m_project_task_panel->enable_abort_button(false); + m_project_task_panel->enable_pause_resume_button(false, "pause_disable"); wxString prepare_text; bool show_percent = true; @@ -2435,99 +2511,86 @@ void StatusPanel::update_subtask(MachineObject *obj) if (obj->gcode_file_prepare_percent >= 0 && obj->gcode_file_prepare_percent <= 100 && show_percent) prepare_text += wxString::Format("(%d%%)", obj->gcode_file_prepare_percent); - m_printing_stage_value->SetLabelText(prepare_text); - m_gauge_progress->SetValue(0); - m_staticText_progress_percent->SetLabelText(NA_STR); - m_staticText_progress_percent_icon->SetLabelText(wxEmptyString); - m_staticText_progress_left->SetLabel(NA_STR); - m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR)); - wxString subtask_text = wxString::Format("%s", GUI::from_u8(obj->subtask_name)); - m_staticText_subtask_value->SetLabelText(subtask_text); + + m_project_task_panel->update_stage_value(prepare_text, 0); + m_project_task_panel->update_progress_percent(NA_STR, wxEmptyString); + m_project_task_panel->update_left_time(NA_STR); + m_project_task_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR)); + m_project_task_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name))); if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) { - if (!m_staticText_profile_value->IsShown()) { m_staticText_profile_value->Show(); } - m_staticText_profile_value->SetLabelText(wxString::FromUTF8(obj->get_modeltask()->profile_name)); + m_project_task_panel->show_profile_info(true, wxString::FromUTF8(obj->get_modeltask()->profile_name)); } else { - m_staticText_profile_value->SetLabelText(wxEmptyString); - m_staticText_profile_value->Hide(); + m_project_task_panel->show_profile_info(false); } update_basic_print_data(false); } else { if (obj->can_resume()) { - m_button_pause_resume->SetBitmap_("print_control_resume"); - if (m_button_pause_resume->GetToolTipText() != _L("Resume")) { m_button_pause_resume->SetToolTip(_L("Resume")); } + m_project_task_panel->enable_pause_resume_button(true, "resume"); + } else { - m_button_pause_resume->SetBitmap_("print_control_pause"); - if (m_button_pause_resume->GetToolTipText() != _L("Pause")) { m_button_pause_resume->SetToolTip(_L("Pause")); } + m_project_task_panel->enable_pause_resume_button(true, "pause"); } if (obj->print_status == "FINISH") { - m_button_abort->Enable(false); - m_button_abort->SetBitmap_("print_control_stop_disable"); - m_button_pause_resume->Enable(false); - m_button_pause_resume->SetBitmap_("print_control_resume_disable"); - if (wxGetApp().has_model_mall()) { - bool is_market_task = obj->get_modeltask() && obj->get_modeltask()->design_id > 0; - if (is_market_task) { - m_button_market_scoring->Show(); - BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_BTU: design_id [" << obj->get_modeltask()->design_id << "] print_finish [" << m_print_finish << "]"; - if (!m_print_finish && IsShownOnScreen()) { - m_print_finish = true; - int job_id = obj->get_modeltask()->job_id; - if (wxGetApp().app_config->get("not_show_score_dialog") != "1" && rated_model_id.find(job_id) == rated_model_id.end()) { - MessageDialog dlg(this, _L("Please give a score for your favorite Bambu Market model."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Score"), - wxYES_NO | wxYES_DEFAULT | wxCENTRE); - dlg.show_dsa_button(); - int old_design_id = obj->get_modeltask()->design_id; - auto res = dlg.ShowModal(); - if (dlg.get_checkbox_state()) { wxGetApp().app_config->set("not_show_score_dialog", "1"); } - if (res == wxID_YES) { market_model_scoring_page(old_design_id); } - rated_model_id.insert(job_id); - BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_DLG: design_id [" << old_design_id << "] print_finish [" << m_print_finish << "] not_show [" - << wxGetApp().app_config->get("not_show_score_dialog") << "] job_id [" << job_id << "]"; - } + + m_project_task_panel->enable_abort_button(false); + m_project_task_panel->enable_pause_resume_button(false, "resume_disable"); + + bool is_market_task = obj->get_modeltask() && obj->get_modeltask()->design_id > 0; + if (is_market_task) { + m_project_task_panel->get_market_scoring_button()->Show(); + BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_BTU: design_id [" << obj->get_modeltask()->design_id << "] print_finish [" << m_print_finish << "]"; + if (!m_print_finish && IsShownOnScreen()) { + m_print_finish = true; + int job_id = obj->get_modeltask()->job_id; + if (wxGetApp().app_config->get("not_show_score_dialog") != "1" && rated_model_id.find(job_id) == rated_model_id.end()) { + MessageDialog dlg(this, _L("Please give a score for your favorite Bambu Market model."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Score"), + wxYES_NO | wxYES_DEFAULT | wxCENTRE); + dlg.show_dsa_button(); + int old_design_id = obj->get_modeltask()->design_id; + auto res = dlg.ShowModal(); + if (dlg.get_checkbox_state()) { wxGetApp().app_config->set("not_show_score_dialog", "1"); } + if (res == wxID_YES) { market_model_scoring_page(old_design_id); } + rated_model_id.insert(job_id); + BOOST_LOG_TRIVIAL(info) << "SHOW_SCORE_DLG: design_id [" << old_design_id << "] print_finish [" << m_print_finish << "] not_show [" + << wxGetApp().app_config->get("not_show_score_dialog") << "] job_id [" << job_id << "]"; } - } else { - m_button_market_scoring->Hide(); } + } else { + m_project_task_panel->get_market_scoring_button()->Hide(); } } else { - m_button_abort->Enable(true); - m_button_abort->SetBitmap_("print_control_stop"); - m_button_pause_resume->Enable(true); - m_button_market_scoring->Hide(); + m_project_task_panel->enable_abort_button(true); + m_project_task_panel->get_market_scoring_button()->Hide(); if (m_print_finish) { m_print_finish = false; } } // update printing stage - m_printing_stage_value->SetLabelText(obj->get_curr_stage()); - update_left_time(obj->mc_left_time); + + m_project_task_panel->update_left_time(obj->mc_left_time); if (obj->subtask_) { - m_gauge_progress->SetValue(obj->subtask_->task_progress); - m_staticText_progress_percent->SetLabelText(wxString::Format("%d", obj->subtask_->task_progress)); - m_staticText_progress_percent_icon->SetLabelText("%"); - m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %d/%d"), obj->curr_layer, obj->total_layers)); + m_project_task_panel->update_stage_value(obj->get_curr_stage(), obj->subtask_->task_progress); + m_project_task_panel->update_progress_percent(wxString::Format("%d", obj->subtask_->task_progress), "%"); + m_project_task_panel->update_layers_num(true, wxString::Format(_L("Layer: %d/%d"), obj->curr_layer, obj->total_layers)); } else { - m_gauge_progress->SetValue(0); - m_staticText_progress_percent->SetLabelText(NA_STR); - m_staticText_progress_percent_icon->SetLabelText(wxEmptyString); - m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR)); + m_project_task_panel->update_stage_value(obj->get_curr_stage(), 0); + m_project_task_panel->update_progress_percent(NA_STR, wxEmptyString); + m_project_task_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR)); } } - wxString subtask_text = wxString::Format("%s", GUI::from_u8(obj->subtask_name)); - m_staticText_subtask_value->SetLabelText(subtask_text); + + m_project_task_panel->update_subtask_name(wxString::Format("%s", GUI::from_u8(obj->subtask_name))); if (obj->get_modeltask() && obj->get_modeltask()->design_id > 0) { - if(!m_staticText_profile_value->IsShown()){ m_staticText_profile_value->Show();} - m_staticText_profile_value->SetLabelText(wxString::FromUTF8(obj->get_modeltask()->profile_name)); + m_project_task_panel->show_profile_info(wxString::FromUTF8(obj->get_modeltask()->profile_name)); } else { - m_staticText_profile_value->SetLabelText(wxEmptyString); - m_staticText_profile_value->Hide(); + m_project_task_panel->show_profile_info(false); } //update thumbnail @@ -2569,8 +2632,8 @@ void StatusPanel::update_cloud_subtask(MachineObject *obj) std::map::iterator it = img_list.find(m_request_url); if (it != img_list.end()) { img = it->second; - wxImage resize_img = img.Scale(m_bitmap_thumbnail->GetSize().x, m_bitmap_thumbnail->GetSize().y); - m_bitmap_thumbnail->SetBitmap(resize_img); + wxImage resize_img = img.Scale(m_project_task_panel->get_bitmap_thumbnail()->GetSize().x, m_project_task_panel->get_bitmap_thumbnail()->GetSize().y); + m_project_task_panel->get_bitmap_thumbnail()->SetBitmap(resize_img); task_thumbnail_state = ThumbnailState::TASK_THUMBNAIL; BOOST_LOG_TRIVIAL(trace) << "web_request: use cache image"; } else { @@ -2589,7 +2652,7 @@ void StatusPanel::update_sdcard_subtask(MachineObject *obj) if (!obj) return; if (!m_load_sdcard_thumbnail) { - m_bitmap_thumbnail->SetBitmap(m_thumbnail_sdcard.bmp()); + m_project_task_panel->get_bitmap_thumbnail()->SetBitmap(m_thumbnail_sdcard.bmp()); task_thumbnail_state = ThumbnailState::SDCARD_THUMBNAIL; m_load_sdcard_thumbnail = true; } @@ -2597,24 +2660,21 @@ void StatusPanel::update_sdcard_subtask(MachineObject *obj) void StatusPanel::reset_printing_values() { - m_button_pause_resume->Enable(false); - m_button_pause_resume->SetBitmap_("print_control_pause_disable"); + m_project_task_panel->enable_pause_resume_button(false, "pause_disable"); + m_project_task_panel->enable_abort_button(false); + m_project_task_panel->reset_printing_value(); + m_project_task_panel->update_subtask_name(NA_STR); + m_project_task_panel->show_profile_info(false); + m_project_task_panel->update_stage_value(wxEmptyString, 0); + m_project_task_panel->update_progress_percent(NA_STR, wxEmptyString); - m_button_abort->Enable(false); - m_button_abort->SetBitmap_("print_control_stop_disable"); - m_gauge_progress->SetValue(0); - m_staticText_subtask_value->SetLabelText(NA_STR); - m_staticText_profile_value->SetLabelText(wxEmptyString); - m_staticText_profile_value->Hide(); - m_button_market_scoring->Hide(); + m_project_task_panel->get_market_scoring_button()->Hide(); update_basic_print_data(false); - m_printing_stage_value->SetLabelText(""); - m_staticText_progress_left->SetLabelText(NA_STR); - m_staticText_layers->SetLabelText(wxString::Format(_L("Layer: %s"), NA_STR)); - m_staticText_progress_percent->SetLabelText(NA_STR); - m_staticText_progress_percent_icon->SetLabelText(wxEmptyString); - m_bitmap_thumbnail->SetBitmap(m_thumbnail_placeholder.bmp()); + m_project_task_panel->update_left_time(NA_STR); + m_project_task_panel->update_layers_num(true, wxString::Format(_L("Layer: %s"), NA_STR)); + + task_thumbnail_state = ThumbnailState::PLACE_HOLDER; m_start_loading_thumbnail = false; m_load_sdcard_thumbnail = false; @@ -3373,54 +3433,6 @@ void StatusPanel::on_lamp_switch(wxCommandEvent &event) } } -void StatusPanel::on_thumbnail_enter(wxMouseEvent &event) -{ - if (obj) { - if (!obj->slice_info || !obj->subtask_) return; - /* do not popup when print status is failed */ - if (obj->print_status.compare("FAILED") == 0) { - return; - } - - if (m_slice_info_popup && m_slice_info_popup->IsShown()) - return; - if (obj->slice_info) { - m_slice_info_popup = std::make_shared(this, m_bitmap_thumbnail->GetBitmap(), obj->slice_info); - wxWindow *ctrl = (wxWindow *) event.GetEventObject(); - wxPoint pos = ctrl->ClientToScreen(wxPoint(0, 0)); - wxSize sz = ctrl->GetSize(); - m_slice_info_popup->Position(pos, wxSize(sz.x / 2, sz.y / 2)); - m_slice_info_popup->Popup(); - } - } -} - -void StatusPanel::on_thumbnail_leave(wxMouseEvent &event) -{ - if (obj && m_slice_info_popup) { - if (!m_bitmap_thumbnail->GetRect().Contains(event.GetPosition())) { - m_slice_info_popup->Dismiss(); - } - } -} - -void StatusPanel::refresh_thumbnail_webrequest(wxMouseEvent &event) -{ - if (!obj) return; - if (task_thumbnail_state != ThumbnailState::BROKEN_IMG) return; - - if (obj->slice_info) { - m_request_url = wxString(obj->slice_info->thumbnail_url); - if (!m_request_url.IsEmpty()) { - web_request = wxWebSession::GetDefault().CreateRequest(this, m_request_url); - BOOST_LOG_TRIVIAL(trace) << "monitor: create new webrequest, state = " << web_request.GetState() << ", url = " << m_request_url; - if (web_request.GetState() == wxWebRequest::State_Idle) - web_request.Start(); - BOOST_LOG_TRIVIAL(trace) << "monitor: start new webrequest, state = " << web_request.GetState() << ", url = "<< m_request_url; - } - } -} - void StatusPanel::on_switch_vcamera(wxMouseEvent &event) { //if (!obj) return; @@ -3558,7 +3570,6 @@ void StatusPanel::show_status(int status) || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) || ((status & (int)MonitorStatus::MONITOR_NO_PRINTER) != 0) ) { - m_text_tasklist_caption->SetForegroundColour(DISCONNECT_TEXT_COL); show_printing_status(false, false); m_calibration_btn->Disable(); m_options_btn->Disable(); @@ -3636,7 +3647,7 @@ void StatusPanel::rescale_camera_icons() void StatusPanel::on_sys_color_changed() { - m_button_abort->msw_rescale(); + m_project_task_panel->msw_rescale(); m_bitmap_speed.msw_rescale(); m_bitmap_speed_active.msw_rescale(); m_switch_speed->SetImages(m_bitmap_speed, m_bitmap_speed); @@ -3649,15 +3660,11 @@ void StatusPanel::on_sys_color_changed() void StatusPanel::msw_rescale() { init_bitmaps(); - + m_project_task_panel->init_bitmaps(); + m_project_task_panel->msw_rescale(); m_panel_monitoring_title->SetSize(wxSize(-1, FromDIP(PAGE_TITLE_HEIGHT))); m_staticText_monitoring->SetMinSize(wxSize(PAGE_TITLE_TEXT_WIDTH, PAGE_TITLE_HEIGHT)); m_bmToggleBtn_timelapse->Rescale(); - m_panel_printing_title->SetSize(wxSize(-1, FromDIP(PAGE_TITLE_HEIGHT))); - m_staticText_printing->SetMinSize(wxSize(PAGE_TITLE_TEXT_WIDTH, PAGE_TITLE_HEIGHT)); - m_bitmap_thumbnail->SetSize(TASK_THUMBNAIL_SIZE); - m_printing_sizer->SetMinSize(wxSize(PAGE_MIN_WIDTH, -1)); - m_gauge_progress->SetHeight(PROGRESSBAR_HEIGHT); m_panel_control_title->SetSize(wxSize(-1, FromDIP(PAGE_TITLE_HEIGHT))); m_staticText_control->SetMinSize(wxSize(-1, PAGE_TITLE_HEIGHT)); m_bpButton_xy->SetBitmap(m_bitmap_axis_home); @@ -3670,7 +3677,7 @@ void StatusPanel::msw_rescale() for (Button *btn : m_buttons) { btn->Rescale(); } init_scaled_buttons(); - m_gauge_progress->Rescale(); + m_bpButton_xy->Rescale(); m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE); m_tempCtrl_nozzle->Rescale(); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index 37c6de093d..d5953fa53d 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -40,15 +40,6 @@ class StepIndicator; namespace Slic3r { namespace GUI { -enum MonitorStatus { - MONITOR_UNKNOWN = 0, - MONITOR_NORMAL = 1 << 1, - MONITOR_NO_PRINTER = 1 << 2, - MONITOR_DISCONNECTED = 1 << 3, - MONITOR_DISCONNECTED_SERVER = 1 << 4, - MONITOR_CONNECTING = 1 << 5, -}; - enum CameraRecordingStatus { RECORDING_NONE, RECORDING_OFF_NORMAL, @@ -65,6 +56,79 @@ enum CameraTimelapseStatus { TIMELAPSE_ON_HOVER, }; +enum PrintingTaskType { + PRINGINT, + CALIBRATION, +}; + +class PrintingTaskPanel : public wxPanel +{ +public: + PrintingTaskPanel(wxWindow* parent, PrintingTaskType type); + ~PrintingTaskPanel(); + void create_panel(wxWindow* parent); + +private: + MachineObject* m_obj; + ScalableBitmap m_thumbnail_placeholder; + ScalableBitmap m_bitmap_use_time; + ScalableBitmap m_bitmap_use_weight; + + wxPanel * m_panel_printing_title; + wxPanel* m_staticline; + wxPanel* m_panel_error_txt; + + wxBoxSizer* m_printing_sizer; + wxStaticText * m_staticText_printing; + wxStaticText* m_staticText_subtask_value; + wxStaticText* m_staticText_consumption_of_time; + wxStaticText* m_staticText_consumption_of_weight; + wxStaticText* m_printing_stage_value; + wxStaticText* m_staticText_profile_value; + wxStaticText* m_staticText_progress_percent; + wxStaticText* m_staticText_progress_percent_icon; + wxStaticText* m_staticText_progress_left; + wxStaticText* m_staticText_layers; + wxStaticBitmap* m_bitmap_thumbnail; + wxStaticBitmap* m_bitmap_static_use_time; + wxStaticBitmap* m_bitmap_static_use_weight; + ScalableButton* m_button_pause_resume; + ScalableButton* m_button_abort; + Button* m_button_market_scoring; + Button* m_button_clean; + + ProgressBar* m_gauge_progress; + ErrorMsgStaticText* m_error_text; + PrintingTaskType m_type; + +public: + void init_bitmaps(); + void init_scaled_buttons(); + void error_info_reset(); + void show_error_msg(wxString msg); + void reset_printing_value(); + void msw_rescale(); + +public: + void enable_pause_resume_button(bool enable, std::string type); + void enable_abort_button(bool enable); + void update_subtask_name(wxString name); + void update_stage_value(wxString stage, int val); + void update_progress_percent(wxString percent, wxString icon); + void update_left_time(wxString time); + void update_left_time(int mc_left_time); + void update_layers_num(bool show, wxString num = wxEmptyString); + void show_priting_use_info(bool show, wxString time = wxEmptyString, wxString weight = wxEmptyString); + void show_profile_info(bool show, wxString profile = wxEmptyString); + +public: + ScalableButton* get_abort_button() {return m_button_abort;}; + ScalableButton* get_pause_resume_button() {return m_button_pause_resume;}; + Button* get_market_scoring_button() {return m_button_market_scoring;}; + Button* get_clean_button() {return m_button_clean;}; + wxStaticBitmap* get_bitmap_thumbnail() {return m_bitmap_thumbnail;}; +}; + class StatusBasePanel : public wxScrolledWindow { protected: @@ -208,7 +272,7 @@ protected: StepIndicator* m_calibration_flow; wxPanel * m_machine_ctrl_panel; - wxPanel * m_project_task_panel; + PrintingTaskPanel * m_project_task_panel; // Virtual event handlers, override them in your derived class virtual void on_subtask_pause_resume(wxCommandEvent &event) { event.Skip(); } @@ -239,7 +303,6 @@ public: void init_bitmaps(); wxBoxSizer *create_monitoring_page(); - wxBoxSizer *create_project_task_page(wxWindow *parent); wxBoxSizer *create_machine_control_page(wxWindow *parent); wxBoxSizer *create_temp_axis_group(wxWindow *parent); diff --git a/src/slic3r/GUI/UpgradePanel.cpp b/src/slic3r/GUI/UpgradePanel.cpp index 6e1fe6f47e..fd66268adb 100644 --- a/src/slic3r/GUI/UpgradePanel.cpp +++ b/src/slic3r/GUI/UpgradePanel.cpp @@ -1,4 +1,5 @@ #include "UpgradePanel.hpp" +#include #include #include #include "GUI.hpp" diff --git a/src/slic3r/GUI/Widgets/SideTools.cpp b/src/slic3r/GUI/Widgets/SideTools.cpp index 6d382cd18c..3deef5b55a 100644 --- a/src/slic3r/GUI/Widgets/SideTools.cpp +++ b/src/slic3r/GUI/Widgets/SideTools.cpp @@ -1,18 +1,23 @@ #include "SideTools.hpp" +#include "bambu_networking.hpp" #include #include #include "Label.hpp" #include "StateColor.hpp" +#include "../GUI_App.hpp" #include "../wxExtensions.hpp" #include "../I18N.hpp" #include "../GUI.hpp" namespace Slic3r { namespace GUI { - SideTools::SideTools(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) + SideToolsPanel::SideToolsPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) { - wxPanel::Create(parent, id, pos, wxSize(0, FromDIP(50))); - Bind(wxEVT_PAINT, &SideTools::OnPaint, this); + wxPanel::Create(parent, id, pos, size); + SetMinSize(wxSize(-1, FromDIP(50))); + SetMaxSize(wxSize(-1, FromDIP(50))); + + Bind(wxEVT_PAINT, &SideToolsPanel::OnPaint, this); SetBackgroundColour(wxColour("#FEFFFF")); m_printing_img = ScalableBitmap(this, "printer", 16); @@ -30,33 +35,33 @@ namespace Slic3r { namespace GUI { m_intetval_timer = new wxTimer(); m_intetval_timer->SetOwner(this); - this->Bind(wxEVT_TIMER, &SideTools::stop_interval, this); - this->Bind(wxEVT_ENTER_WINDOW, &SideTools::on_mouse_enter, this); - this->Bind(wxEVT_LEAVE_WINDOW, &SideTools::on_mouse_leave, this); - this->Bind(wxEVT_LEFT_DOWN, &SideTools::on_mouse_left_down, this); - this->Bind(wxEVT_LEFT_UP, &SideTools::on_mouse_left_up, this); + this->Bind(wxEVT_TIMER, &SideToolsPanel::stop_interval, this); + this->Bind(wxEVT_ENTER_WINDOW, &SideToolsPanel::on_mouse_enter, this); + this->Bind(wxEVT_LEAVE_WINDOW, &SideToolsPanel::on_mouse_leave, this); + this->Bind(wxEVT_LEFT_DOWN, &SideToolsPanel::on_mouse_left_down, this); + this->Bind(wxEVT_LEFT_UP, &SideToolsPanel::on_mouse_left_up, this); } -SideTools::~SideTools() { delete m_intetval_timer; } +SideToolsPanel::~SideToolsPanel() { delete m_intetval_timer; } -void SideTools::set_none_printer_mode() +void SideToolsPanel::set_none_printer_mode() { m_none_printer = true; Refresh(); } -void SideTools::on_timer(wxTimerEvent &event) +void SideToolsPanel::on_timer(wxTimerEvent &event) { } -void SideTools::set_current_printer_name(std::string dev_name) +void SideToolsPanel::set_current_printer_name(std::string dev_name) { m_none_printer = false; m_dev_name = from_u8(dev_name); Refresh(); } -void SideTools::set_current_printer_signal(WifiSignal sign) +void SideToolsPanel::set_current_printer_signal(WifiSignal sign) { if (last_printer_signal == sign) return; @@ -66,36 +71,36 @@ void SideTools::set_current_printer_signal(WifiSignal sign) Refresh(); } -void SideTools::start_interval() +void SideToolsPanel::start_interval() { m_intetval_timer->Start(SIDE_TOOL_CLICK_INTERVAL); m_is_in_interval = true; } -void SideTools::stop_interval(wxTimerEvent& event) +void SideToolsPanel::stop_interval(wxTimerEvent& event) { m_is_in_interval = false; m_intetval_timer->Stop(); } -bool SideTools::is_in_interval() +bool SideToolsPanel::is_in_interval() { return m_is_in_interval; } -void SideTools::msw_rescale() +void SideToolsPanel::msw_rescale() { Refresh(); } -void SideTools::OnPaint(wxPaintEvent &event) +void SideToolsPanel::OnPaint(wxPaintEvent &event) { wxPaintDC dc(this); doRender(dc); } -void SideTools::render(wxDC &dc) +void SideToolsPanel::render(wxDC &dc) { #ifdef __WXMSW__ wxSize size = GetSize(); @@ -116,7 +121,7 @@ void SideTools::render(wxDC &dc) #endif } -void SideTools::doRender(wxDC &dc) +void SideToolsPanel::doRender(wxDC &dc) { auto left = FromDIP(15); wxSize size = GetSize(); @@ -208,27 +213,335 @@ void SideTools::doRender(wxDC &dc) } } -void SideTools::on_mouse_left_down(wxMouseEvent &evt) +void SideToolsPanel::on_mouse_left_down(wxMouseEvent &evt) { m_click = true; Refresh(); } -void SideTools::on_mouse_left_up(wxMouseEvent &evt) +void SideToolsPanel::on_mouse_left_up(wxMouseEvent &evt) { m_click = false; Refresh(); } -void SideTools::on_mouse_enter(wxMouseEvent &evt) +void SideToolsPanel::on_mouse_enter(wxMouseEvent &evt) { m_hover = true; Refresh(); } -void SideTools::on_mouse_leave(wxMouseEvent &evt) +void SideToolsPanel::on_mouse_leave(wxMouseEvent &evt) { m_hover = false; Refresh(); } + +SideTools::SideTools(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) +{ + wxPanel::Create(parent, id, pos, size); + SetBackgroundColour(wxColour("#FEFFFF")); + + m_side_tools = new SideToolsPanel(this, wxID_ANY); + + m_connection_info = new Button(this, wxEmptyString); + m_connection_info->SetBackgroundColor(wxColour(255, 111, 0)); + m_connection_info->SetBorderColor(wxColour(255, 111, 0)); + m_connection_info->SetTextColor(*wxWHITE); + m_connection_info->SetFont(::Label::Body_13); + m_connection_info->SetCornerRadius(0); + m_connection_info->SetSize(wxSize(FromDIP(-1), FromDIP(25))); + m_connection_info->SetMinSize(wxSize(FromDIP(-1), FromDIP(25))); + m_connection_info->SetMaxSize(wxSize(FromDIP(-1), FromDIP(25))); + + + wxBoxSizer* connection_sizer_V = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* connection_sizer_H = new wxBoxSizer(wxHORIZONTAL); + + m_hyperlink = new wxHyperlinkCtrl(m_connection_info, wxID_ANY, _L("Failed to connect to the server"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); + m_hyperlink->SetBackgroundColour(wxColour(255, 111, 0)); + + m_more_err_open = ScalableBitmap(this, "monitir_err_open", 16); + m_more_err_close = ScalableBitmap(this, "monitir_err_close", 16); + m_more_button = new ScalableButton(m_connection_info, wxID_ANY, "monitir_err_open"); + m_more_button->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); + m_more_button->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); + m_more_button->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { + if (!m_more_err_state) { + m_more_button->SetBitmap(m_more_err_close.bmp()); + Freeze(); + m_side_error_panel->Show(); + m_more_err_state = true; + m_tabpanel->Refresh(); + m_tabpanel->Layout(); + Thaw(); + } + else { + m_more_button->SetBitmap(m_more_err_open.bmp()); + Freeze(); + m_side_error_panel->Hide(); + m_more_err_state = false; + m_tabpanel->Refresh(); + m_tabpanel->Layout(); + Thaw(); + } + + }); + + connection_sizer_H->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5); + connection_sizer_H->Add(m_more_button, 0, wxALIGN_CENTER | wxALL, 3); + connection_sizer_V->Add(connection_sizer_H, 0, wxALIGN_CENTER, 0); + + m_connection_info->SetSizer(connection_sizer_V); + m_connection_info->Layout(); + connection_sizer_V->Fit(m_connection_info); + + m_side_error_panel = new wxWindow(this, wxID_ANY); + m_side_error_panel->SetBackgroundColour(wxColour(255, 232, 214)); + m_side_error_panel->SetMinSize(wxSize(-1, -1)); + m_side_error_panel->SetMaxSize(wxSize(-1, -1)); + + m_side_error_panel->Hide(); + m_more_button->Hide(); + m_connection_info->Hide(); + + wxBoxSizer* sizer_print_failed_info = new wxBoxSizer(wxVERTICAL); + m_side_error_panel->SetSizer(sizer_print_failed_info); + + wxBoxSizer* sizer_error_code = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* sizer_extra_info = new wxBoxSizer(wxHORIZONTAL); + + m_link_network_state = new Label(m_side_error_panel, _L("Check cloud service status"), wxALIGN_CENTER_HORIZONTAL | wxST_ELLIPSIZE_END); + m_link_network_state->SetMinSize(wxSize(FromDIP(220), -1)); + m_link_network_state->SetMaxSize(wxSize(FromDIP(220), -1)); + m_link_network_state->SetForegroundColour(0x00AE42); + m_link_network_state->SetFont(::Label::Body_12); + m_link_network_state->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_network_check(); }); + m_link_network_state->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_HAND); }); + m_link_network_state->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_ARROW); }); + + auto st_title_error_code = new wxStaticText(m_side_error_panel, wxID_ANY, _L("code"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); + auto st_title_error_code_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": "); + m_st_txt_error_code = new Label(m_side_error_panel, wxEmptyString); + st_title_error_code->SetForegroundColour(0x909090); + st_title_error_code_doc->SetForegroundColour(0x909090); + m_st_txt_error_code->SetForegroundColour(0x909090); + st_title_error_code->SetFont(::Label::Body_12); + st_title_error_code_doc->SetFont(::Label::Body_12); + m_st_txt_error_code->SetFont(::Label::Body_12); + st_title_error_code->SetMinSize(wxSize(FromDIP(32), -1)); + st_title_error_code->SetMaxSize(wxSize(FromDIP(32), -1)); + m_st_txt_error_code->SetMinSize(wxSize(FromDIP(175), -1)); + m_st_txt_error_code->SetMaxSize(wxSize(FromDIP(175), -1)); + sizer_error_code->Add(st_title_error_code, 0, wxALL, 0); + sizer_error_code->Add(st_title_error_code_doc, 0, wxALL, 0); + sizer_error_code->Add(m_st_txt_error_code, 0, wxALL, 0); + + + auto st_title_error_desc = new wxStaticText(m_side_error_panel, wxID_ANY, wxT("desc"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); + auto st_title_error_desc_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": "); + m_st_txt_error_desc = new Label(m_side_error_panel, wxEmptyString); + st_title_error_desc->SetForegroundColour(0x909090); + st_title_error_desc_doc->SetForegroundColour(0x909090); + m_st_txt_error_desc->SetForegroundColour(0x909090); + st_title_error_desc->SetFont(::Label::Body_12); + st_title_error_desc_doc->SetFont(::Label::Body_12); + m_st_txt_error_desc->SetFont(::Label::Body_12); + st_title_error_desc->SetMinSize(wxSize(FromDIP(32), -1)); + st_title_error_desc->SetMaxSize(wxSize(FromDIP(32), -1)); + m_st_txt_error_desc->SetMinSize(wxSize(FromDIP(175), -1)); + m_st_txt_error_desc->SetMaxSize(wxSize(FromDIP(175), -1)); + sizer_error_desc->Add(st_title_error_desc, 0, wxALL, 0); + sizer_error_desc->Add(st_title_error_desc_doc, 0, wxALL, 0); + sizer_error_desc->Add(m_st_txt_error_desc, 0, wxALL, 0); + + auto st_title_extra_info = new wxStaticText(m_side_error_panel, wxID_ANY, wxT("info"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); + auto st_title_extra_info_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": "); + m_st_txt_extra_info = new Label(m_side_error_panel, wxEmptyString); + st_title_extra_info->SetForegroundColour(0x909090); + st_title_extra_info_doc->SetForegroundColour(0x909090); + m_st_txt_extra_info->SetForegroundColour(0x909090); + st_title_extra_info->SetFont(::Label::Body_12); + st_title_extra_info_doc->SetFont(::Label::Body_12); + m_st_txt_extra_info->SetFont(::Label::Body_12); + st_title_extra_info->SetMinSize(wxSize(FromDIP(32), -1)); + st_title_extra_info->SetMaxSize(wxSize(FromDIP(32), -1)); + m_st_txt_extra_info->SetMinSize(wxSize(FromDIP(175), -1)); + m_st_txt_extra_info->SetMaxSize(wxSize(FromDIP(175), -1)); + sizer_extra_info->Add(st_title_extra_info, 0, wxALL, 0); + sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0); + sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0); + + sizer_print_failed_info->Add(m_link_network_state, 0, wxALIGN_CENTER, 3); + sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5); + sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); + sizer_print_failed_info->Add(sizer_error_desc, 0, wxLEFT, 5); + sizer_print_failed_info->Add(0, 0, 0, wxTOP, FromDIP(3)); + sizer_print_failed_info->Add(sizer_extra_info, 0, wxLEFT, 5); + + m_st_txt_error_desc->SetLabel(""); + m_st_txt_error_desc->Wrap(FromDIP(170)); + + wxBoxSizer* m_main_sizer = new wxBoxSizer(wxVERTICAL); + m_main_sizer->Add(m_connection_info, 0, wxEXPAND, 0); + m_main_sizer->Add(m_side_error_panel, 0, wxEXPAND, 0); + m_main_sizer->Add(m_side_tools, 1, wxEXPAND, 0); + SetSizer(m_main_sizer); + Layout(); + Fit(); +} + +void SideTools::msw_rescale() +{ + m_side_tools->msw_rescale(); + m_connection_info->SetCornerRadius(0); + m_connection_info->SetSize(wxSize(FromDIP(220), FromDIP(25))); + m_connection_info->SetMinSize(wxSize(FromDIP(220), FromDIP(25))); + m_connection_info->SetMaxSize(wxSize(FromDIP(220), FromDIP(25))); +} + +bool SideTools::is_in_interval() +{ + return m_side_tools->is_in_interval(); +} + +void SideTools::set_current_printer_name(std::string dev_name) +{ + m_side_tools->set_current_printer_name(dev_name); +} + +void SideTools::set_current_printer_signal(WifiSignal sign) +{ + m_side_tools->set_current_printer_signal(sign); +} + +void SideTools::set_none_printer_mode() +{ + m_side_tools->set_none_printer_mode(); +} + +void SideTools::start_interval() +{ + m_side_tools->start_interval(); +} + +void SideTools::update_connect_err_info(int code, wxString desc, wxString info) +{ + m_st_txt_error_code->SetLabelText(wxString::Format("%d", code)); + m_st_txt_error_desc->SetLabelText(desc); + m_st_txt_extra_info->SetLabelText(info); + + m_st_txt_error_code->Wrap(FromDIP(175)); + m_st_txt_error_desc->Wrap(FromDIP(175)); + m_st_txt_extra_info->Wrap(FromDIP(175)); + + if (code == BAMBU_NETWORK_ERR_CONNECTION_TO_PRINTER_FAILED) { + m_link_network_state->Hide(); + } + else if (code == BAMBU_NETWORK_ERR_CONNECTION_TO_SERVER_FAILED) { + m_link_network_state->Show(); + } +} + +void SideTools::update_status(MachineObject* obj) +{ + if (!obj) return; + + /* Update Device Info */ + m_side_tools->set_current_printer_name(obj->dev_name); + + // update wifi signal image + int wifi_signal_val = 0; + if (!obj->is_connected() || obj->is_connecting()) { + m_side_tools->set_current_printer_signal(WifiSignal::NONE); + } + else { + if (!obj->wifi_signal.empty() && boost::ends_with(obj->wifi_signal, "dBm")) { + try { + wifi_signal_val = std::stoi(obj->wifi_signal.substr(0, obj->wifi_signal.size() - 3)); + } + catch (...) { + ; + } + if (wifi_signal_val > -45) { + m_side_tools->set_current_printer_signal(WifiSignal::STRONG); + } + else if (wifi_signal_val <= -45 && wifi_signal_val >= -60) { + m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE); + } + else { + m_side_tools->set_current_printer_signal(WifiSignal::WEAK); + } + } + else { + m_side_tools->set_current_printer_signal(WifiSignal::MIDDLE); + } + } +} + +void SideTools::show_status(int status) +{ + if (((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)) { + if ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER)) { + m_hyperlink->SetLabel(_L("Failed to connect to the server")); + update_connect_err_info(BAMBU_NETWORK_ERR_CONNECTION_TO_SERVER_FAILED, + _L("Failed to connect to cloud service"), + _L("Please click on the hyperlink above to view the cloud service status")); + } + else { + m_hyperlink->SetLabel(_L("Failed to connect to the printer")); + update_connect_err_info(BAMBU_NETWORK_ERR_CONNECTION_TO_PRINTER_FAILED, + _L("Connection to printer failed"), + _L("Please check the network connection of the printer and Studio.")); + } + + m_hyperlink->Show(); + m_connection_info->SetLabel(wxEmptyString); + m_connection_info->SetBackgroundColor(0xFF6F00); + m_connection_info->SetBorderColor(0xFF6F00); + m_connection_info->Show(); + m_more_button->Show(); + + } + else if ((status & (int)MonitorStatus::MONITOR_NORMAL) != 0) { + m_connection_info->Hide(); + m_more_button->Hide(); + m_side_error_panel->Hide(); + } + else if ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) { + m_hyperlink->Hide(); + m_connection_info->SetLabel(_L("Connecting...")); + m_connection_info->SetBackgroundColor(0x00AE42); + m_connection_info->SetBorderColor(0x00AE42); + m_connection_info->Show(); + m_more_button->Hide(); + m_side_error_panel->Hide(); + } + + if ((status & (int)MonitorStatus::MONITOR_NO_PRINTER) != 0) { + m_side_tools->set_none_printer_mode(); + m_connection_info->Hide(); + m_side_error_panel->Hide(); + m_more_button->Hide(); + } + else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0) + || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) + ) { + if (((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)) { + m_side_tools->set_current_printer_signal(WifiSignal::NONE); + } + } + Layout(); + Fit(); +} + +SideTools::~SideTools() +{ +} + }} diff --git a/src/slic3r/GUI/Widgets/SideTools.hpp b/src/slic3r/GUI/Widgets/SideTools.hpp index 09c086f1ca..8a51b3025a 100644 --- a/src/slic3r/GUI/Widgets/SideTools.hpp +++ b/src/slic3r/GUI/Widgets/SideTools.hpp @@ -4,6 +4,11 @@ #include #include #include +#include +#include "Button.hpp" +#include "Label.hpp" +#include "../GUI/Tabbook.hpp" +#include "../DeviceManager.hpp" #include "../wxExtensions.hpp" #define SIDE_TOOLS_GREY900 wxColour(38, 46, 48) @@ -19,11 +24,20 @@ enum WifiSignal { STRONG, }; +enum MonitorStatus { + MONITOR_UNKNOWN = 0, + MONITOR_NORMAL = 1 << 1, + MONITOR_NO_PRINTER = 1 << 2, + MONITOR_DISCONNECTED = 1 << 3, + MONITOR_DISCONNECTED_SERVER = 1 << 4, + MONITOR_CONNECTING = 1 << 5, +}; + #define SIDE_TOOL_CLICK_INTERVAL 20 namespace Slic3r { namespace GUI { -class SideTools : public wxPanel +class SideToolsPanel : public wxPanel { private: WifiSignal m_wifi_type{WifiSignal::NONE}; @@ -52,8 +66,8 @@ protected: bool m_is_in_interval {false}; public: - SideTools(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - ~SideTools(); + SideToolsPanel(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + ~SideToolsPanel(); void set_none_printer_mode(); void on_timer(wxTimerEvent &event); @@ -73,6 +87,43 @@ protected: void on_mouse_left_down(wxMouseEvent &evt); void on_mouse_left_up(wxMouseEvent &evt); }; + +class SideTools : public wxPanel +{ +public: + SideTools(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize); + ~SideTools(); + +private: + SideToolsPanel* m_side_tools{ nullptr }; + Tabbook* m_tabpanel{ nullptr }; + Label* m_link_network_state{ nullptr }; + Label* m_st_txt_error_code{ nullptr }; + Label* m_st_txt_error_desc{ nullptr }; + Label* m_st_txt_extra_info{ nullptr }; + wxWindow* m_side_error_panel{ nullptr }; + Button* m_connection_info{ nullptr }; + wxHyperlinkCtrl* m_hyperlink{ nullptr }; + ScalableButton* m_more_button{ nullptr }; + ScalableBitmap m_more_err_open; + ScalableBitmap m_more_err_close; + bool m_more_err_state{ false }; + +public: + void set_table_panel(Tabbook* tb) {m_tabpanel = tb;}; + void msw_rescale(); + bool is_in_interval(); + void set_current_printer_name(std::string dev_name); + void set_current_printer_signal(WifiSignal sign); + void set_none_printer_mode(); + void start_interval(); + void update_status(MachineObject* obj); + void update_connect_err_info(int code, wxString desc, wxString info); + void show_status(int status); + +public: + SideToolsPanel* get_panel() {return m_side_tools;}; +}; }} // namespace Slic3r::GUI #endif // !slic3r_GUI_SIDETOOLS_hpp_ diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index 22eca1ac95..3951e848a5 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -24,14 +24,102 @@ static std::string MachineBedTypeString[5] = { "pte" }; -static std::map calib_mode_to_name = { - {CalibMode::Calib_Flow_Rate, "flow_rate_calib_mode"}, - {CalibMode::Calib_Temp_Tower, "temp_tower_calib_mode"}, - {CalibMode::Calib_Vol_speed_Tower, "vol_speed_tower_calib_mode"}, - {CalibMode::Calib_VFA_Tower, "vfa_tower_calib_mode"}, - {CalibMode::Calib_Retraction_tower, "retration_tower_calib_mode"} + +std::string get_calib_mode_name(CalibMode cali_mode, int stage) +{ + switch(cali_mode) { + case CalibMode::Calib_Flow_Rate: + if (stage == 1) + return "flow_rate_coarse_calib_mode"; + else if (stage == 2) + return "flow_rate_fine_calib_mode"; + else + return "flow_rate_coarse_calib_mode"; + case CalibMode::Calib_Temp_Tower: + return "temp_tower_calib_mode"; + case CalibMode::Calib_Vol_speed_Tower: + return "vol_speed_tower_calib_mode"; + case CalibMode::Calib_VFA_Tower: + return "vfa_tower_calib_mode"; + case CalibMode::Calib_Retraction_tower: + return "retration_tower_calib_mode"; + default: + assert(false); + return ""; + } +} + +CalibMode CalibUtils::get_calib_mode_by_name(const std::string name, int& cali_stage) +{ + if (name == "flow_rate_coarse_calib_mode") { + cali_stage = 1; + return CalibMode::Calib_Flow_Rate; + } + else if (name == "flow_rate_fine_calib_mode") { + cali_stage = 2; + return CalibMode::Calib_Flow_Rate; + } + else if (name == "temp_tower_calib_mode") + return CalibMode::Calib_Temp_Tower; + else if (name == "vol_speed_tower_calib_mode") + return CalibMode::Calib_Vol_speed_Tower; + else if (name == "vfa_tower_calib_mode") + return CalibMode::Calib_VFA_Tower; + else if (name == "retration_tower_calib_mode") + return CalibMode::Calib_Retraction_tower; + return CalibMode::Calib_None; +} + +bool CalibUtils::validate_input_k_value(wxString k_text, float* output_value) +{ + float default_k = 0.0f; + if (k_text.IsEmpty()) { + *output_value = default_k; + return false; + } + + double k_value = 0.0; + try { + k_text.ToDouble(&k_value); + } + catch (...) { + ; + } + + if (k_value < 0 || k_value > 0.5) { + *output_value = default_k; + return false; + } + + *output_value = k_value; + return true; }; +bool CalibUtils::validate_input_flow_ratio(wxString flow_ratio, float* output_value) { + float default_flow_ratio = 1.0f; + + if (flow_ratio.IsEmpty()) { + *output_value = default_flow_ratio; + return false; + } + + double flow_ratio_value = 0.0; + try { + flow_ratio.ToDouble(&flow_ratio_value); + } + catch (...) { + ; + } + + if (flow_ratio_value <= 0.0 || flow_ratio_value >= 2.0) { + *output_value = default_flow_ratio; + return false; + } + + *output_value = flow_ratio_value; + return true; +} + static void cut_model(Model &model, std::array plane_points, ModelObjectCutAttributes attributes) { size_t obj_idx = 0; @@ -82,17 +170,7 @@ std::array get_cut_plane_points(const BoundingBoxf3 &bbox, const doubl return plane_pts; } -CalibMode CalibUtils::get_calib_mode_by_name(const std::string &name) -{ - for (auto iter = calib_mode_to_name.begin(); iter != calib_mode_to_name.end(); ++iter) { - if (iter->second == name) { - return iter->first; - } - } - return CalibMode::Calib_None; -} - -void CalibUtils::calib_PA(const X1CCalibInfos &calib_infos, std::string &error_message, int mode) +void CalibUtils::calib_PA(const X1CCalibInfos& calib_infos, int mode, std::string& error_message) { DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) @@ -572,7 +650,7 @@ void CalibUtils::calib_VFA(const CalibInfo& calib_info, std::string& error_messa cut_model(model, plane_pts, ModelObjectCutAttribute::KeepLower); } else { - error_message = "The start, end or step is not valid value."; + error_message = L("The start, end or step is not valid value."); return; } @@ -681,7 +759,7 @@ void CalibUtils::process_and_store_3mf(Model* model, const DynamicPrintConfig& f BuildVolume build_volume(bedfs, print_height); unsigned int count = model->update_print_volume_state(build_volume); if (count == 0) { - error_message = "Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small"; + error_message = L("Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small"); return; } @@ -729,7 +807,7 @@ void CalibUtils::process_and_store_3mf(Model* model, const DynamicPrintConfig& f success = Slic3r::store_bbs_3mf(store_params); } -void CalibUtils::send_to_print(const CalibInfo& calib_info, std::string &error_message) +void CalibUtils::send_to_print(const CalibInfo &calib_info, std::string &error_message, int flow_ratio_mode) { std::string dev_id = calib_info.dev_id; std::string select_ams = calib_info.select_ams; @@ -738,35 +816,35 @@ void CalibUtils::send_to_print(const CalibInfo& calib_info, std::string &error_m DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) { - error_message = "Need select printer"; + error_message = L("Need select printer"); return; } MachineObject* obj_ = dev->get_selected_machine(); if (obj_ == nullptr) { - error_message = "Need select printer"; + error_message = L("Need select printer"); return; } if (obj_->is_in_printing()) { - error_message = "Cannot send the print job when the printer is updating firmware"; + error_message = L("Cannot send the print job when the printer is updating firmware"); return; } else if (obj_->is_system_printing()) { - error_message = "The printer is executing instructions. Please restart printing after it ends"; + error_message = L("The printer is executing instructions. Please restart printing after it ends"); return; } else if (obj_->is_in_printing()) { - error_message = "The printer is busy on other print job"; + error_message = L("The printer is busy on other print job"); return; } else if (!obj_->is_function_supported(PrinterFunction::FUNC_PRINT_WITHOUT_SD) && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { - error_message = "An SD card needs to be inserted before printing."; + error_message = L("An SD card needs to be inserted before printing."); return; } if (obj_->is_lan_mode_printer()) { if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { - error_message = "An SD card needs to be inserted before printing via LAN."; + error_message = L("An SD card needs to be inserted before printing via LAN."); return; } } @@ -809,7 +887,9 @@ void CalibUtils::send_to_print(const CalibInfo& calib_info, std::string &error_m print_job->task_ams_mapping = select_ams; print_job->task_ams_mapping_info = ""; print_job->task_use_ams = select_ams == "[254]" ? false : true; - print_job->m_project_name = calib_mode_to_name[calib_info.params.mode]; + + CalibMode cali_mode = calib_info.params.mode; + print_job->m_project_name = get_calib_mode_name(cali_mode, flow_ratio_mode); print_job->has_sdcard = obj_->has_sdcard(); print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true); diff --git a/src/slic3r/Utils/CalibUtils.hpp b/src/slic3r/Utils/CalibUtils.hpp index b49432fd95..4534c7e816 100644 --- a/src/slic3r/Utils/CalibUtils.hpp +++ b/src/slic3r/Utils/CalibUtils.hpp @@ -28,9 +28,9 @@ public: CalibUtils(){}; static std::shared_ptr print_job; - static CalibMode get_calib_mode_by_name(const std::string &name); + static CalibMode get_calib_mode_by_name(const std::string name, int &cali_stage); - static void calib_PA(const X1CCalibInfos &calib_infos, std::string &error_message, int mode = 0); // 0: automatic mode; 1: manual mode. default: automatic mode + static void calib_PA(const X1CCalibInfos& calib_infos, int mode, std::string& error_message); static void emit_get_PA_calib_results(float nozzle_diameter); static bool get_PA_calib_results(std::vector &pa_calib_results); @@ -59,9 +59,12 @@ public: //help function static int get_selected_calib_idx(const std::vector &pa_calib_values, int cali_idx); + static bool validate_input_k_value(wxString k_text, float* output_value); + static bool validate_input_flow_ratio(wxString flow_ratio, float* output_value); + private: static void process_and_store_3mf(Model* model, const DynamicPrintConfig& full_config, const Calib_Params& params, std::string& error_message); - static void send_to_print(const CalibInfo& calib_info, std::string &error_message); + static void send_to_print(const CalibInfo &calib_info, std::string& error_message, int flow_ratio_mode = 0); // 0: none 1: coarse 2: fine }; }