From 4a125a07765a1cd066c6026193076595c0a156e5 Mon Sep 17 00:00:00 2001 From: legend069 <40685552+legend069@users.noreply.github.com> Date: Sat, 10 Feb 2024 14:51:14 +0100 Subject: [PATCH] pressure advance calibration tool tested with fair few combinations of nozzle sizes, layer height, base layer height, extrusion role widths. seems solid on that part now. added "verify" extended feature, this is just for users to see what ER roles need a new PA value TODO: bug test, for any values that get used if percent/float ect TODO: find calculation for external/internal bridges, overhang, ironing, support material/interface TODO: add more info to .html file. TODO: needed a more clear description of path when reading code, TODO: considering adding a "wave 90 bend" model, the "wave" style should make it more obvious between PA values instead of focusing on the corner. --- resources/calibration/filament_pressure/0.3mf | Bin 0 -> 1846 bytes resources/calibration/filament_pressure/1.3mf | Bin 0 -> 1645 bytes resources/calibration/filament_pressure/2.3mf | Bin 0 -> 1981 bytes resources/calibration/filament_pressure/3.3mf | Bin 0 -> 1994 bytes resources/calibration/filament_pressure/4.3mf | Bin 0 -> 1904 bytes resources/calibration/filament_pressure/5.3mf | Bin 0 -> 2002 bytes resources/calibration/filament_pressure/6.3mf | Bin 0 -> 2009 bytes resources/calibration/filament_pressure/7.3mf | Bin 0 -> 1737 bytes resources/calibration/filament_pressure/8.3mf | Bin 0 -> 2042 bytes resources/calibration/filament_pressure/9.3mf | Bin 0 -> 2003 bytes .../filament_pressure/base_plate.3mf | Bin 0 -> 1663 bytes .../filament_pressure/filament_pressure.html | 41 + .../filament_pressure/pa_border.3mf | Bin 0 -> 1672 bytes .../calibration/filament_pressure/point.3mf | Bin 0 -> 1642 bytes .../scaled_with_nozzle_size/90_bend_0.10.3mf | Bin 0 -> 1882 bytes .../scaled_with_nozzle_size/90_bend_0.20.3mf | Bin 0 -> 1880 bytes .../scaled_with_nozzle_size/90_bend_0.30.3mf | Bin 0 -> 1875 bytes .../scaled_with_nozzle_size/90_bend_0.40.3mf | Bin 0 -> 1868 bytes .../scaled_with_nozzle_size/90_bend_0.50.3mf | Bin 0 -> 1891 bytes .../scaled_with_nozzle_size/90_bend_0.60.3mf | Bin 0 -> 1896 bytes .../scaled_with_nozzle_size/90_bend_0.70.3mf | Bin 0 -> 1896 bytes .../scaled_with_nozzle_size/90_bend_0.80.3mf | Bin 0 -> 1891 bytes .../scaled_with_nozzle_size/90_bend_0.90.3mf | Bin 0 -> 1899 bytes .../scaled_with_nozzle_size/90_bend_1.00.3mf | Bin 0 -> 1895 bytes .../scaled_with_nozzle_size/90_bend_1.10.3mf | Bin 0 -> 1908 bytes .../scaled_with_nozzle_size/90_bend_1.20.3mf | Bin 0 -> 1904 bytes .../scaled_with_nozzle_size/90_bend_1.30.3mf | Bin 0 -> 1905 bytes .../scaled_with_nozzle_size/90_bend_1.40.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_1.50.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_1.60.3mf | Bin 0 -> 1895 bytes .../scaled_with_nozzle_size/90_bend_1.70.3mf | Bin 0 -> 1898 bytes .../scaled_with_nozzle_size/90_bend_1.80.3mf | Bin 0 -> 1904 bytes .../scaled_with_nozzle_size/90_bend_1.90.3mf | Bin 0 -> 1894 bytes .../scaled_with_nozzle_size/90_bend_2.00.3mf | Bin 0 -> 1890 bytes resources/localization/list.txt | 1 + src/slic3r/CMakeLists.txt | 2 + .../GUI/CalibrationPressureAdvDialog.cpp | 823 ++++++++++++++++++ .../GUI/CalibrationPressureAdvDialog.hpp | 37 + src/slic3r/GUI/GUI_App.cpp | 5 + src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 2 + 41 files changed, 912 insertions(+) create mode 100644 resources/calibration/filament_pressure/0.3mf create mode 100644 resources/calibration/filament_pressure/1.3mf create mode 100644 resources/calibration/filament_pressure/2.3mf create mode 100644 resources/calibration/filament_pressure/3.3mf create mode 100644 resources/calibration/filament_pressure/4.3mf create mode 100644 resources/calibration/filament_pressure/5.3mf create mode 100644 resources/calibration/filament_pressure/6.3mf create mode 100644 resources/calibration/filament_pressure/7.3mf create mode 100644 resources/calibration/filament_pressure/8.3mf create mode 100644 resources/calibration/filament_pressure/9.3mf create mode 100644 resources/calibration/filament_pressure/base_plate.3mf create mode 100644 resources/calibration/filament_pressure/filament_pressure.html create mode 100644 resources/calibration/filament_pressure/pa_border.3mf create mode 100644 resources/calibration/filament_pressure/point.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.20.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.30.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.50.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.00.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.70.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.90.3mf create mode 100644 resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf create mode 100644 src/slic3r/GUI/CalibrationPressureAdvDialog.cpp create mode 100644 src/slic3r/GUI/CalibrationPressureAdvDialog.hpp diff --git a/resources/calibration/filament_pressure/0.3mf b/resources/calibration/filament_pressure/0.3mf new file mode 100644 index 0000000000000000000000000000000000000000..f18107e0e8281f4ecefcd353be1ad3d275b1cf12 GIT binary patch literal 1846 zcmWIWW@gc4U|`??Vg`mI^2aLwLxBK;2!pYUzHv%!eoAVN9++fg5MYSn0V`!lW`@vn z!(;Pj8;I1tTk@Cvi7m5Pd?UxL=_@bAsrg3NHyHYzKH|=zmi7I0`Fca&OIJ;1ewvUV zKfm~0`^((A?|013Ir1gnEoV)XQ|)`>5`Xn>vZLD8;^3n4-#>%zeVdvi!%&{=IB&|W z{MvdE|4mO9U%!_0;&|P1n~U4)BDU_CT^6$}7dN zCowyo%RLk|cJ|^aX1njkpWH0}D@%y$QsRtBM*}NWgEcE} z7c9+M`1t;dAL+r@pB3craH7f}@=-KlxV_u$f`ed^Sb*8m3EYU(Bwn zkolGQ{z|ALlWy6a!Y_4>`|hZJ;C%nS(|-OJ|Ne8{wLhb|mS##Ank|e>@7`s7@X@!2 z4{u*@>QK4YS|q+((YIBawXxu`#^k)1u!(1Gw1sB!ytpY;Q$DpukE6C!{kXa=m*2yz z1jgqbd1snx${5b?DG(0kQj6ny6r}I@aiT^2gi|w>BdrCiCaV3oFC544NaM%GD?4{y zZFYaLG;rFY$nU{Lh(xBFxk8z*h9OsA$AGS<9U$CLLso7rX zc$@uUS7W}Q_L_pjx)wJa?V2~gJ~Ugt(1W|?!@aE^4xZyYx30U9N&XVkd|SR7mIrT^ zUY4AGwua}0E?XhDq_~Ppp0iZ$61M&`^JMNgonzg(DDTyw3DTb7Mk!vOxwgJe)=@a` zQ+mV8C*no$irD)hLMQdKE;7Y%o>UPL^vL8t@uZk>-I6-TN9NBi&#Mydzqn7qo%@pC z&M%kRKh9V+JFmScGU}Yjr3Y^gc^~w>;E=C)MYr+myouVqi8`~gk}u!X@D=41s=CKy z5)M=&$IHj-!0JC~^6%5yXM1EUl4cgFe1ERUkv{p3z4W$EMXP4NDrHzSY13Q|r|DA* zpScAdy6f|yS9;^5V}&y|m^3T;@n>$GwAT3ZBO4aa=w%v`r!6LEmS?J#=c$}N<7+Nj zD(q!mcv5-BqDz$tr)zcjTONr04{V69XAD5eq#Pl7mtmPy7???;o%8cbQu9jULn;eW zi(~aFa&tiWG=vF~Ki@$phPgp!y^a_N*lGXZQw+}x7Ij%t%D*oE0e4Hutu$Y?g){Z; zZZE$S>bOyCPpZ-9zr4Zk)7~EuJeI<2_G#IgB@8ADx85)>TC}cW!tUj(PyhNVqR1(C z?8=Eo4Lhx=XBgs^8@V{VD@pt^Yllp==+?^1wkvM0+7+&*z!>B>)7j{@>)v)h|Gp!q z&&=KYP0>mJ=;una)25exo!Mw|#p;c{hI~|k{gslQb5g#0I7^Rg`?B&!N8r7!agVQL zI$u69TXV-bmg{q()>(D`*uDABelDqlOL^n(U;q1b;>7OnCO2mMD|0g_7PxWY=DGhT zCttpjWhq#w!p6P;oOt!e}!zs8ajSavd@dXgSZd z&-upgyH}bzB=%N()T(WqkXOIqr=q9p{d>9^8gk`n-;$pdRNV-?qq*#$HEXJ(;{@Y< zk}=B@PQ9&SU;a3&a>u0=#_2)!Eh;}wsu{D zzT>g;=#R4u%k=6tEUIJs)qLxq%lw+z+>dp`daveXZ9N(Mr0a~X_LQergEW=q95k zKXj9^CPoR2#JCh%d7vAP8d2zmqePnoMzq~vfw(!qn~hBe>U>C;KsZo48DKOIG}=$F d!u7F(SXbB}e2{d2H!GOO4Accu4+=d71^`pQ`E39I literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/1.3mf b/resources/calibration/filament_pressure/1.3mf new file mode 100644 index 0000000000000000000000000000000000000000..dd8f331777cdd958faca0ed394aaf231542546ae GIT binary patch literal 1645 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 TI>4J1EXxek1yTGVY>3RFEycMpm8FtL~ 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/5.3mf b/resources/calibration/filament_pressure/5.3mf new file mode 100644 index 0000000000000000000000000000000000000000..37135fa686054839c97f3b2ca723f1f731a187c8 GIT binary patch literal 2002 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 T9pKFh<}m|xfz*RSkAVRI<&(vC literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/8.3mf b/resources/calibration/filament_pressure/8.3mf new file mode 100644 index 0000000000000000000000000000000000000000..8804502d5dc5a843e711f7cce55469b7cb8a139c GIT binary patch literal 2042 zcmZ{l3pCW}8^?bJ!xB5zRJ6k^V>8Se*OfG`Gn_Wc7`K|Dq9K#UU1k~~l64&+cMiGV zV%-h7tSlK*7?<27`cp`hajSo#JxBfjzjJ=i^Lu~q`#$G=KhJZ%58i~APYD13!Ot%M zbWZl5KJ7ga01Bw%l+~|XcfCS#L4UD400eLl`?3^}=iBvZXS*oVno!$3{Z9s$25F3Y zq%MY|W)Lt2MGn&gOwIok(m9|L!J_*u<(xeKB)AgOVK2Kp>dE$F2+416jC0sVtJwZ3 z$xJ(aSkJrC{Ncd}Q-?X}jzQ(7Pxm!#Wyk`}3yhc=cMROmf6_IpQ{Z8N?}Ui$aazN* zt+K1{d=x!(&*+qK8(!ae3aVe>HBK!kX^+sbvbBknFfwDToPC9qC$7!F*R!Oex`WhC zi@I3ZO=M?3pI$de_nbH=4$p*zDGWrN`B5zmH_lntvc53el(7CZSGr^hkNOGu!fsQN z8x#U=$+LS~DrI!S-sev^j<0?*&QSTCEZj4%`{$S#|Dy6kZIVqHQ&US#lTz;NMhTpM z;NdvBbKWc;Hg-cB{}+&zLPLY;pkBn%e5wBebMB3$k#QoFS)%2kgYd`v^Hy9}PuxFh zH6e4QXmK@T@>F;e~Y6;G42lO@)XOE@|%jW&vMKqGi2?K z8i6ujJ^yKIrP3aNUA!Gpxnmf^_{=7X$xtNT2B{CpqfJ}q%hn1 zicajdLt?ZTIc~pTbfDIgi3DOw1sH5cZ?3F%B8B_vlTD5f5MB!waq4Z3C6_d2ji=k6 zt6n2ZEqBcp2i9QRK(1!9#gxPhgfxRFzqZa-nlm8gqi~!yKq#7vzzCfXb?U#jjOn=c zA0I!|J!;v^1Gzd^uKG(K@{NU$E3}7ly0|U5_zk#dwO4So(hHLZrUzujV9gRr5(K zaZ>#i4@x-o+~G&ZLW9f=bcI&ILA8}Q!`Y+Ry~gC18ixfE7#0Yn`9fuAT?~gH)1Qpu z6i1&6!dQ)E-cK#-G08W&Se0sT(xaH4sF)*i6$xzxNW%e(4RzM0-eHRQj{%F4dv7M= zldjz{IU9)Lxad1Z;m3aSBtp+O1yEGnnyiy8Wt2(?^IEDSA*T>aW?_cO!eM0}5(+0KCd>GE_>zQ6H<059OdZYQ9=9 zykBG5B})7GBpmP~yf<9TAd`Z^<<-tT-TNs_z#!AIvJ~LO>%G zk&AxfukXgTU7$8jyKh}iXGPlFoqpe}y2&}Y3dA`kXnR}9sYAMzv@2DTHa3>{z1Lcq zx%CM-AL&20nGok6Qqty}3+G?Z#3T3~xSJ-SZr6G}$Qor*lT>PuRM<0FC)o_wW;5sC z!`hRm%l3kOIS*sYLlM&8R*?^?HxTBq(V&2TRIXgE4Zn?rgs#sfZxE#Ef#dRo}6?JXAhsyjQ-OlLX zkFkm;Wa!y*_NUI+J`VY~*sVt1{m48Artg16Cj1%MMGumTr!soS?w}Ip*=1C*hl&*4 zE!3(434SW{2s^|aUKwyJLgNqPO?W^`!2jz;u)T`~eD*sWzVA&E-}R=wEx@;t_m|(d zk^g5gN_v!k@z<&V~31(pc literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/9.3mf b/resources/calibration/filament_pressure/9.3mf new file mode 100644 index 0000000000000000000000000000000000000000..58fe1bbf199caf3c2ad2101b58878f2098fd9815 GIT binary patch literal 2003 zcmZ{l3p~^N8^?df=CU|DHCh*A|3=C^w~^diN|+Iaa-3TKnhax@bU|q|Ws+7de`lCQ z<&q}3bqF09P6gpWDh{-1)DR+(8UBqevTKw^#R_dj6<8>#Q35VZzpXA|n)(!+z_gK=y zh>3M*A(XZ$#zyG6;D7l5Qj{FKF!P9&yMg%B3Yg+vu5qS{KF>D>I6cxX36fy;KD3XC zeLZ($YQL=pf+beav(dl~U665|(?qw6EbgEW3MyPT=OYx!Q+|o$+^C%SL&#}CUA1Sy z;oo~oXATm>BG1&Mjbl_kwrS-%8gu&c-nbR)DJ>@8&130j?lnHJqJ*e$y;JR0NA=~< z2marQmRKvdoU}*HYX(S!n;pm+o1kHRu2hPYDC5L4V*o z%PN@2W6x?;`XAHrAdU4kakketeGv#!Y+dl2eH0pT%$w3C!UWPYIn+Tc)!8IfpvPX- zdDG?H^JlMk==$f|jcfIC2e%|c)Iu-5w%-9OQ5h^;J9%02ES;)L-w=H~F@P>M#9IcT z&7p55bu#7xpoVf`@Hv0tL{|4Z^_UDrP?^r8_Av`P47FM zes@ZZE2mzYjZ6wH%tY8%2~B76l@=b3?sJZ|pXr!v3NFaOY_1ada$zM=7Fs9XrOELyyZ*$&cq9GFz<_wK}hctcNzz4VAV#I+oxO%gd1`OK|P))AljbhC@B zg;|@e9eg@)4B4$*FIBoj%ih9<6aTrHn4zvv)(tDVteTN_eiv&o%r5F~xTH*QQ$wOA z))6D^cJi2q%k*kar43VRKPlL&uBtLA&L~TKv7cv%zy`t;Zbt zv!20wuIlCS1N&J?*rfIY)UdpG#5D41m+7w_s?}jv-v07aE9l;8%GjMjCbk;G2ais) z_(&Mm67b7c?#k~5LU1b-M8V5I@J&J1EGmefV+bjNK#Bultto@IzwWs0#m?FbZtj;FTideBXHX7?O=7Bft6A4aDGghHt2?Fe15qy=#pkrLkhVP(t%~$vZSGJnkrXoVlg4UG7$~N*_YAORK}mCz1QX=u}0yr-p=Rk3;Z;JkZAey=~~&9$ijPuuYN-YT|^c@CY%U2 zG+44rsGu^-jLM~`2q{mL8jN7)I+W@hd#n3}@iatj^!u%+;+Ui}rJqo{cMiPN*U>>n z9i2Hm78=v*A=*++Q?BiG z_vSXpli%L8@y-5}tPTk#Rc#VE-*1vU0SXLGm*$>^%qH~JJLSY?LWlLeFLslNJig~h zQk%Z+mC;+D6R|MfC3OOLf41$f?<)*0f{Ha|#_c8LwDh$&7a5Q~@NZ*gqx8qlF8U=7 zKMozl4?{<~1^7Pm%J%y{^FKBt;)iB*kWRMmldmk)_sLh34e>+SDB$HY<6IyRJ?Zh6 rnJmA^O22*ctE6QoK>pq*zw{LL)dIj$80P~18kGfPfu;3J^Z?*5BsNjL literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/base_plate.3mf b/resources/calibration/filament_pressure/base_plate.3mf new file mode 100644 index 0000000000000000000000000000000000000000..4815007b066426f9d35d8fd4537465b549689bd0 GIT binary patch literal 1663 zcmWIWW@gc4U|`??Vg?3}Yguvsp+JB^gu&QF-#8^VKP5Fs4@@#L2rx`x2PK?oZT&Fg{|glx9*x464M=aH@sq#?}W#*U!R|UDvtZ6B7=7DL-y=; zX2mx96Z2-q-v1ORefNg!b=ywY^H;7IP-dQ{t>r5HlvS#)tz$OHx^$D??xqVYhu_6b-5~B`aC$=0-ZdZA zUn>(*{%vyL!SV7LhchIWPJAq==2R1VAxf)J;!jpuil-lov9!WhlcLN!94Gi=%B%Ls ze>GVU7Gg2WH9qXZp16nl+cj$*-;VZ~=CO${c3H_^_af`dEjMnLiq-K4yiPy=xsdgI z`|jQO@!DrxrBbJCbT|?ysIrH%S&2U~;Cbtb&uYGprOrLuP|>_x=+nkSUv4fl;ooc( z(YE_hS&8S{Q~oF1pM2OoV;8@h|2r*F*Nx@P`}11eKJYcGZVWH{FFm1h=XcR_b8Bth z@uo{#&e2{|{6FBptxIkV-#?jcQdw`dY|91SE4ABit-Q=*)%H$caq^QsC97k3tHZ5} z+nT3}>fJl?R$Qip`}p*nM+rwiR?5UYn=V|qjN425&hCFU@;h!kDDG_1m^?BAu=Naj_oNZDQ(ecFrIHxLuA|jpJUvi}ML%PPzV14e%{D)nw!hOCyZ4VV0423^gy>y{ zrFLOpYL9l#&nrpID~S)OEJ!Vm)vL(O0VVhlXhMGnN$(7EgU)&#F%YoR{=ugho*69a zvZR!MUH${^mXcd(zG@3+>fPO5eks&(qu8EQqtAbNgWspUKO%T6h1u-WvNcN>Ocrjv zVP3RoUB!gm%U7TN^;JZXQ|{Q66O9^nT2s$3#4R^+ad=mf_+{1(nQGCkm6vT-++MXS zTup&7$Z@8#(QVhg?SB4!M^2xayZM`;dB|Yb) zeD`pc9@+L~<&TcQdt2ikU&(a7d}6ldj&m&6=R~cu>i)5N^Pl}(QU{mv#^1mG_vyrm z-QP`a%=lO4W>73}9iYLFFQdpr#mWZb|Yi!VyeDc08mk)WXB zW`u;%W@u2Q_MhcCWFXLTo@<};joo*zG<8Vqt@x-_+c+Vwe#1{iPuKhRbTu^O%G16j zKP#xZ5qL*)*+Fa8R7J-L#``2=mM5HgTgAToaaQGyODl}igX~*WewxT7S&CA+) zGWbc?8C~ruPuKiza}(IwC!5L|G1orn<2JosrgaL8&mDhk?wBeb;LXUS%Yds$l!1Dz z0Z4I*DY8J^9N^8y vrUP|8BupS2W~dm9=7C1LAS+xSxRQ`%gYZGp0p6@&9y0?o14un6^cWZbKij29 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/filament_pressure.html b/resources/calibration/filament_pressure/filament_pressure.html new file mode 100644 index 00000000000..019e9cee723 --- /dev/null +++ b/resources/calibration/filament_pressure/filament_pressure.html @@ -0,0 +1,41 @@ + + + + + Pressure Advance Calibration + + + + + + + + + + + +
+

Pressure/Linear Advance

+
+ + +
Needs:Bed Leveling and Layer Squish to be perfect
+
+
+ +

this test is still in development, beta should work "ok" for now though.
your current print settings will need to be saved before clicking "generate" since it uses the saved values to create the model

+

note: this test will auto pull all your currently loaded config parameters and generate a model for you to print!
for to help with firmware speed/processing limitations it's reccomended to have most extrusion roles similar set to speeds.

+ +

How to tune your printer for Pressure/Linear Advance

+

todo add detaisl here

+

Advice

+

Before doing this test, it's preferable to tune everything else first!
i would reccomended setting XXXX to the same speeds, XXX to a slow speed, and everything else you can send it with.

+

note: having large variance with ER speeds can reduce print quality/dimensional accuracy this is effect is mainly caused by the inner perimeter getting pulled closer to the external perimeter as it cools down, since each perimeter would be at different temperatues.

+

TODO add things about PA and setting first layer correctly
add notes about fan speed and disabling fan speed for this test, or do i have check box in GUI that would auto change relavent UI tab?

+
    +
  • bullet points
  • +
+

Notes

+

TODO: add cred for andrew ellis testing method

+ + diff --git a/resources/calibration/filament_pressure/pa_border.3mf b/resources/calibration/filament_pressure/pa_border.3mf new file mode 100644 index 0000000000000000000000000000000000000000..baf634479558412f218141813812dac189bc5bcc GIT binary patch literal 1672 zcmWIWW@gc4U|`??Vg?4SLTAqZP$0k{!eH#8Z=8~wpOTuR2PPRA1Q=GbgOxIDWrEO4 zLr>@3HW08`?(n}c;k?n;I*FhnO{OnF3o?rNenhBisRT~YP=0y6T=U{aSqIO#w+wP7 zZZ_V$`^m07m08l8+7s85hF?s09LzNL%BpvAT2?dXPQN_+_4)ay!n89uns#qo)PL+t z^f9-e9J=!6xw`DOujbzLxVyz>(VF|#rq#MHhr=zM8z`KhQH96q~iTj}L1x)KsA zp58ILbIS4g-M@3hcNN}_)3{uevbwT(%B-__zqu=aIj;7U(rHij;_o}s>cdoVyC6Bs z^7;I;KlPXCt$ldILP#g6?1S+sZr)yn<%~<-@su1(3pcP|cH{19q3VO8=5tE+w08Yl z<;y%}#&bFOx|-vrUcVUKB);tsxbXUr_yx^FAC-S_s9Fo0$?3RqSs`(YzsJ6*yDlC+ zykPmfE2|bg)Tz3o__@w?|D9z&`ttHMqm^!EzSy+nX#Rw>Wt=NE-~L>^ke&7L-wFfU z`Qave_wN4vZR?_yJgpv^E(BK|*=zCakoKlUA3~-SF}hAlXOufvXV`v!ZqxFvU;1{5 zHFKU`G>#LyeMxn@_I3t;mXC1~Ig6C~x%ar9pRsJe=Ar}qA6Wi6Zt{I`TU^z>I}bKdu2YU2-{5D?W0q?K4r7bFQ@I_ z>c#8-vId|edyWvj%dliG3{3XX&iQ#Isd**wA(aKG#j$!7xjCSe9|BGB?;r`EVQ$b_ zuOkKmcG^Gq6vH!vMO~JZ@~_K(z}-@EE6rDJ;Y_`|+siM7I&Ku(lWO$&FK_VswD(5@ zkEJl1eOk6=34_VPtvAez7Okt8uzUIH)4#roD00djyK}cFa|l!bT+!}y0_iWzwgNDGjlh8Q*_cl`nl5VwCSZ^XEvH# zv3g^#Asf2E}7oRse#&e9{>zO4Mw5qNKF+~X^m&X-Tj*4%N9<@%hcbynR!c5nW( zpG)fCQr`Ic*Z)49II;V?$&DHR%G?Z!1#VopdG7zo$(OHWSqj$eWkwCM;%kqm!Geq% z7-aE9sX4{^dLR-MRNRb^Fxm_as?`3oT!#z}_|-)(LJTl-{FStI7!Cw<(e*UPj{f$_QHkIfxZ z#RI$jT#oYHScbNIJlq70hF1U}gZR J2ZbI30|3(Lw_gAN literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/point.3mf b/resources/calibration/filament_pressure/point.3mf new file mode 100644 index 0000000000000000000000000000000000000000..5a5e03157c1d3fb073decf0736c6d68a94c3d130 GIT binary patch literal 1642 zcmWIWW@gc4U|`??Vg`mgN;%5^p+JB^gu&QF-#8^VKP5Fs4@@#L2ry)`gOxH&XM)gE zLr>@3HW08`?(n}c;k=P*;I+dOCV2}kn9k%nn}5NH&_zy4ter-a>T0J~9Vv@mx{>#W znB|6%6cN7L7U3+mas znUkAqn!v z?DK_!etcWLf2fVRaCqU~pk<;b!n&WSn9j5<3I9~GH*oQm8GWsqak5jxjixHxa*K#Q zt@$sdtKO_Mm#;ld@t}&@>iLdwnHdb0-xPYcEm+&Fmt5zvahJK}H7AWk){Bc;oBplH zWu9_lI-mT$+M}jkyX4qj^zRV35N*3nHE!0Nwe0F*E;BYxH`t-BV(W2v#=ni`$?jR9 z7Yc-|-%iNfzhM5m~=t~0AV zm3E4s45>_A(K4MSF{pLssfr`dubt24)}2{-x8MN7wTX-VtXcEN;Oiotz#odq{tWl4 zIj0D;drnvyYU;mXj_;=z+;?}?`~CSU9e|RsIYRUUR2HNb z$Ldw&=77?62sBNWju;5oY5(9;49^S}by-r%zb^j)cT35wG+(uaGxhFn zFTWJ(xKV6Rs?q1ayut6&-X9S>mcnfIY1x`33?>V=-Y_p(w60>p?&Ygb|N1JT$SHU1 z%85n|JFTf_7~+;2xj4KlN>vhfKBT*2>GaD{ima6|Sbh800w9+32?G-gZC#z9Xm4 z%-#G=(MkX4=Ss8Frk8%5*=Tab>W#gId{lw`m6D!wQoegQOOI^(vhqhq;JvMJkFR7p zUp_HgbH_QB>vN*kS#|%|z4_06E~$e{dE@V2|NC^}#P07VH)i}Rb2BIwxN+g;x&J38 zU%rxMDOk6c88yg?uRWdy3o>qCki{3J<`nDefk;qLaWg`~XfrgZQv1(x9WoGTInTAv z`NrqNnTqd%7ALa^-2?lAje+-3Yv+x$K}dYpSB-1mk^@ zG0PK9y{%$j{y3|0$E6j<=|T1_DnCxDveuqU?4RM|AGZ7ud(oRMc2RSG_QR^k9EU(ujXZKJsJF@>x{1Ul&5Qcx48*y?UPMq zjhJhn^l_VBFVi{&#^;VdHg`-F5AbGW(q+I^`pG~&)&QhI;ec5dN???QP%RATCZi@l zbd#|rMhT3>coUj9(G5q9D0IV7qD=xL+IUzXZVvEfW7B~;9}*@I4l`5?M)N?U{SQJP cxIW-ugD3<^2Y9oBdCUyV3?TKO&|_c#0Kv7TrT_o{ literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.10.3mf new file mode 100644 index 0000000000000000000000000000000000000000..a43b1d3d8476e2212aa3c787c2b41fdef9ec84b0 GIT binary patch literal 1882 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.40.3mf new file mode 100644 index 0000000000000000000000000000000000000000..70dd9d8936527328a3bb1f27409bc21009aaf436 GIT binary patch literal 1868 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 ZBbWrzKz4vPD;r3R83;k@L7~UM003nI5as{? literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.60.3mf new file mode 100644 index 0000000000000000000000000000000000000000..d4414a24389a793e637f5b0ed36bf9a32f15a823 GIT binary patch literal 1896 zcmWIWW@gc4U|`??Vg?4=wUt5tp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|W8%Wrom8 z!*Ay;u@I=8H}#qPgzq!EcV2FqIX!eqtz_ob$GS>(=bGlO>j?z2J6|?T=XW-1+L4^Q<#dbC*APJ^g(Ble+<(*O&_I zMW48ydVH`{{hyMRnPu$ZkM0&@=r3y7tY$*Qlzmg!dk1` zXlhfb?&M7mz5kt@^gk;rpLcoKL$U>WR|~`SR>c|Gs860@sI1TO-Z`1S$}?3YE?pTrZR>`^Q;wN+KV;{3IaL#t zTE}5q6?6AsdVJ^gri%2%NmY?w4w}r7ymQlZr~j+gimeR(!s=X)E;OI}$(UK?CsrZo z+xe9(rtkej@r~D>l)2Q&F!?A5SvZOXaXkxsT=!&|^z1ahNlPQQWyRS3^!a^{wmB>RN>lFyj0KsnNdz#&a-F1>R-Nf=C-{NsJ?ziUi@*` zo7fY}X6&sju?xH1_tRCc{QlfKF^A^&{@c0N>eR2^(nY5;t$tR#j9kvZcWY~>w9J~A zhYQ~7vHxKcUu&^LW`e%SqXgEUB7AwZ%<^}%J5Gn$8S{m$D@cpwYA^S6N#&{IJ*6eQ zs^P&Eh9lLP3y(-SUeZWx$|~h$EfNk1?O4R0VtV~gj)U{r+Z`tzEHAPZ=7zo&D|KL*$&kPoISyIZsF8={{OUbP?U$uoZ z_3myjzZB}YQEX4D(dWOs!SB=F9}zs3!ff_w*_tH`CJVRTFfUrPu42OO<*QHs`YNKx zDR=D3iAD`Ot*K`i;+7k^IJ_%K{4#5YOtt9N%FDJZZm-%EuBN~kI-TY0_N&o2QO0(0ZmwuhuXmZ8sjlG6^RDu1KlAd!?zI!-Jk8Jz0@<&JDy{&PN zuVgx3J~3N!$2pekbE4K+b^qAC`OkhXse?;-Gc>4D`_FP6G7xAv z&$Z9_#_qdUnmQ!*R(#Z|ZJdx-zu~8%r|bQDx*8gCwKTfK$)}Bl3pW)*lw)_x#(VH!HQFDLx$g<_; z?NYwuvGeGUvkc4h>NYH@WBb*7>!8d0n%Ufsb;EkE=4EX?8T_Q{jIQ>Sr)z$evl=Z-%%cT5!z@MdJvWx!ST%RoKW0Hi_TfLRkrVAKRqEez-; zqb5Ield&d735>*e9a`O>8;%-L=!T<2n*>I*aj`<&9N^8yrUP|8BupS2sGSTjng<%~ gzYzM^K`Pn6Bm)CTI>4Ki4J5`4gdp{x&|_c#0PLa}@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.70.3mf new file mode 100644 index 0000000000000000000000000000000000000000..e3f3e98bab214395290973607fe5ed9693fcb892 GIT binary patch literal 1896 zcmWIWW@gc4U|`??Vj##oxAH#}2r!5+7`x~jr{w0Rq~_>>Nk#?%26kSE(y7c4dTF?C z{t^oT+w)$Z)4%NFn_08+-+ZO7kJ*D@bwp32BST(sevi!WI<*QS^C$H(-<%x1#v|-Uz=nx%PE?s`jpA)g^X(2OgcS3#fC5d~>f_4S_wPx4HMy3bb>>fN z+9Q^ldYL6sA30UNZOZ@ku<}Je`*OWvA)iarWz%n+KRKV@`UkJPT!+2;uj>mx2gUzc zzGPm8gyFK@-e80a)smxW1ePY356|OrPUCidbmkvGES>k%6 zQczuUL3;Uz?b=tf{a)N$Ar-GyYrtF1=3nObZgOP6dcFrY&pqb!Wh(f{d})asf99En zAG|yEG(6%jeD=i5rB24EyG5?Q^3X!_fX8)DR!L7U)PJb?eDkrZm*2Z6Jn%d5-{8aS z3s-Kxos_};eok-ugH2m6^k;J`UT}Ku6+7=uY6NfOS>1#@5n%?I;m1lGZ$5aZ@w;h@c&+99-LH+W*8RQU%bnb=bm89N9j%;_ zOa6*%tk$!rPM4ZvDfuQPdb8w{oj1c4ENd0h2sz_cbvx%<$+Er!Vn&^}t(o~haAhnv zF^!j4=&q|a{hjHhj8w<8f1lEflLh=5(p*mcsdPJBsrflS?cf@VYrd6or^;+Pz2~Xr zsW#nc&Chu$rZ{<>&Z$jFg{+%HEc_E9*M`16v&Ukw2cKeiX0WKsl2ZP4`46~TN^Yh3sx6$U zcXxaFrBKI>VtZ1JKL6znexLUKh~TjlX0uPr)+}K#S-ACvdC{VE6%%$ZUw!)5R}n={ zxnoyOG-}vsO+CX9x7^6Z;ay4MmsvYxsztX}UbbCvd)2ORH3h~X$C=JXw_W$P`}y}B zIeljC=5LBl`bR%knw>Vi^y|z^0=03hb|x^qiCO-NRXWWZRdOKRN>MZH;?; zCDZxxiP@Sv&aqsd6SdB&`^WChfA(`p9bC#AfB*X5rxPc3e>b@?<6oJZL9xJ%3pdaG zKRNmGl`Koay1mS(K~{Y2@ibVFaRY-az9==PSYHoBf`W>h5fVn5p+S|}f0pZzfk4Z7 zu6@oocHh0y)FH9A;-gk=GSt+w^*w)+sPPcl@!rW2$(7HzSiS1Fo`P2I{c}APou!%$h&~qb7iAVL&$- zHTj{Nj5RSzU?j%t(CP-=aMXxGHykC}Bru|lixuML0B<%n9jNmmVFKYm?PP$_JkV(W fh0wgal07K! literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.80.3mf new file mode 100644 index 0000000000000000000000000000000000000000..802393609ddc39bd5e04f48e1f2e00e191996db1 GIT binary patch literal 1891 zcmWIWW@gc4U|`??Vg?4q^Y3T>hXMfx5e8!yedCne{FKxjJuu10Ai%)R3s%Z7ff+(C z4L_Z?#6l#t-1{^CiOp;|_oghUzT9OpdzzbZr2DZQLQyte30^O2YVUKGt(w$1(`l|w z(1XXt=W1`12G`WSi+Zkee5K^CNe2Bw?%$GD%>K7gWwX^T$)CTT_Mdk(zp|;6;f}v* zWzegV4}U#vPWJi7UGFHI(YE;0kqbW)?|!VaD_ZzWFrvn==Muk0cde8_`a9{+N$WCi zFPrSu$70E^>uz~-_xJxg`oCUYcsu2##Rk(odp&g1_?OSMSzfpzeW8NvEKS3{Rdao& zK8Za&HS35_{jMYXXWg28c;!`<2}iE{n0ds{d9ui7jiVQ|Z)*4Geb01Ruxmco3fA>I zANifPj+|64ebwvHiuvjlKYm;9Q9hSBWwOlq4^0#GEo)b##QXFA{qX71srHqX6N4X0 z&uSI^aM*^+@}aPY%#jOxj~`o{QD45&TS({9bkX!k{gd;{Isdekmmi5Q|8+h3dbsmf zXRfUm3>Nuj`}1Epy`Ve%z4z^=?}z{Xjlb^|#HnUN)&u&3pt?BI>3nG0ETX4NJ zv`$*G+WN=s>z{V2e7U+}&OEVN1KxBt?cHqOJ@-#I&-Wnmk*kPg=V#$VOXB1%%}6~` z$*8Bl;D_@Z(;c$b_V<{46oe`Z1>7TdWZmhzQ}TGz9q-RN=fitftMjCIvxw!l{Ap|a ze{)u)=Oj1IJC@en4>qk`E8l)LNT2s*_A)*HZzef;H+yswF2w&nVz&K_K=t)A^6HP* z-q@`>JL%oCi$5cBtIyXz;rf5~q^?L!?w9_zR|C!R=NLyz{grvJ^!c2_lMZn1mbqhY z5wY`->#m_l=o&XgI-98#(|0gLk%JUGO5RWj)XbL3mgdeejj-;9#32-x0oIM-{FS=qeh zIj46s=iaSP*fRRvy_2I3E{T;q%$nM}Tk$PhrvI*$=g?K8X07P5UpqtmgRCHb?@%ALC;c*Du6pgKK)aeYIX z*WBX69JX18nY+Th7mGIQ)D$znGUQNquvHTMXSMj@o{%5;X$Ke0n!RlwPpamb*hr~e zrJ>yBLONx}a@X{HX9`44_@Hq~IO3wlO-pV4a~TutjBjpK@ZK?H!_-YzdUtrl$~|`v zPYIQCJ$q4*~U#djS2pY`CfegI02<_OWd49n5Nz#JXzoS#>cnpYAZQdy8% z9IIE6n*++!Axx0W{0>4f%nds0b;LlxPWuO+Vt8h-sLPU4{&o2exLZnYrTMBYoT+zr zd-NX zX71*1icb1RKUbQaHof%g%tn(dR&VSzNzx&;36+ z`SO)4OToIm%&0+DeC_cxSdei8gDk!%HK$l#4@823iklGyUv!%XzMS z&Np`7z0%YnvA5!*R&C>iy!s746+K<=-_zC5kSkC7mi(-s>PFxl&1DCzSyL4qCm8RO zj9H#=>TMPK^2b?~J1(s-P7ktgQTcIFm9_R>&f6JU1xN)r#xNryUk5tYoBZ? zYs6gpq>tP5dYRTKFg|zuvAJWacz`z}lP&|UVqXU8u?8Rw3J1(eKmwx@fNEhtHyJhg zp__~~F-l-0#!Jwe2HkMfh(b3UCE6q~qK%am;^qKvHZ~oo^C4jZ;Xv(VfYChAX#a}P d#|~1-2qu9vkR9O7$_5f+211Z}Q0Or*003^_7100y literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_0.90.3mf new file mode 100644 index 0000000000000000000000000000000000000000..c8915c80977dcc3a4485b422480f4b11b70164eb GIT binary patch literal 1899 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.10.3mf new file mode 100644 index 0000000000000000000000000000000000000000..06f9975daba62563824c4693b908708ea447b795 GIT binary patch literal 1908 zcmZ{l3p|s17{}km<}zcG9J$3QQrOsbgf1*pTICwaWiE|~5fe&s?dsa0NF!>dNXm5# z(U3MPquiSklT+)$aSey)d_L-&_w#w5=Y2o_|MR^6_xn7*&tr)f64nL)Ky>j2fNLi* zr508$I3NRHOi`F)e*VXZzR2$u1i%3i*!QhKj?l8F+OtS^^ktkw@MBU>ONQNaEK^mw zOMh?8qqZG*m7-e|i%61Aw>Bj3CZj32TwQ0Xx$KtSX8z6DVphv1LT{5ni(BDrkxB>j z;>PW5_Q8`*$>vIZO7yzf!4t11(tH(x5D%P7s-fWQIT_TWq1&CW+((+{Z|!KSh_EeV zWJ)^adjqnB@tE-^kxdbBX|GYA!^!2O8&zrhC4~(pVS5d_=}8Ohwf&X;{;A#u#V;8K z_*T!!W`(ds6T-pWI76(ByJFflblTMlnEgH3pl|OL7u-i*DJCYUM{UY$dagmjV)yI9 ztj8%=DGeiNBUj;jvuYQPe!i?JAT!dy(-n3Jn-XVE#@6$AZi)KMxWqvHdSSH?htIap zisZAa=0Dy~vGABvZ|>WM#cUp!^@ayB5&J%v@y4Hwy|CCzD-xIHaQW-JTu@K5rNqAN zk&Y+w1n*@da8&Wh+wr4nyrmHMq8x6m@<3(9}mTW=HXsqg7cJYe~>!doS`G(0TJq`RHnagqGnw8tk!bG+TG?|a(ZK8 zGJhe8=i47k}T(Dw$k ze3iByCRozWPXBoI7^v=XBUG~1E;-5JWN~!3yhufDoRnZ4v%V%S{FGv0VZbS8#tyzQ znK{szTevYtUi6T*v3Pg-7TvwB(rUhzw@J5*Nim}mR^w5H6F2J=bS%%T*OlA1xyP83 zu){knrj##+k5MA~wZL8|CtYhQjW(}FpNBq^4>9Y3akI!a*#%=5enj<1Rop`p#PLsV zP7RS*u8Y}+EDYy$hCEF(hT?ldFCpB&9F|W~6^e`R-iOL;Rp#^|x^^1|obhr6*&A=C za_DZc%4O-;{sL;-W!!Kry?Y!ZN{F1flsd~&fbsD3b6;fHth=OplY2AtnP^066+%<< zI#o9~tTEm3Yw4YnwujA+AW_8(yGOyYF5$OvGi(;}P{U;mf^OvmK^B<4739LRLR5#M z%|v83jC{>v&p9ZEM>&3b0NFJsY`IF}qPEEP9}-`?C~-#ok8dMb>->zo@(Nx3qK?Mk0NwMQoi-u0rJv(WNqdxwt!BBDlUHL{>rgV%l_gDxT? z1QLCNP{<{_gbE5;W>m6*ikQ?Y-k<}IeJ);W(pBBx5q(jvCiKhJvr);UbH&rD=4QOt z+8P?lA)XT+!vUwetopX()o%wARdLCf+VxH}*JmG3i_ivr!YaA>7%yw1*iBO{YT&aR zx1{s~7Iw4-k-!h7yN*((4O_2UkYV&&gL8>gVLE$|mI|TA?oXFCX^mhvYOUssc@b^`r#i*tIOY{KXA5u>xSpWb4 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.20.3mf new file mode 100644 index 0000000000000000000000000000000000000000..2ba7117cff7141d8adcdfdd3f2ff69b18684ad9e GIT binary patch literal 1904 zcmWIWW@gc4U|`??Vg?3*`TRWpp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|WANWrom8 z!+rDT7zo&I5Bkqsbe@eT&Mxdi%qow)A**i9QNC6otYsIL5awA|n||P)YNk*5)w7BR z>*jq=dp2`!in+h;kty%U)27>|aPlwP<0a<`&jm67^Em)d)U%l^)(+1L9(ea~Lido`D$<>pS` zbvIx0ib$KFZdCTJ^gIT=d0YLrvA(^%dv|_(aS&T(Oi|pW+8JD@{w`UtyH+G{UQWf# zH;-F7g)VHi`f+#KCr$N#o-1VJ)awLz%h{~0)xSIHpHOH2(6hUT-BC*Dx#XoUcTK*S z>nNV%KEhP^L-E|4JEH3M?U^Pvs1!X`;cPm4rqHq|ls9#y^m5Nx=VZFoeNuW^%=BCS zv^Uht_}nW~4i6r^oUg|@<8l7A&0 zc%Qdyvuw1k-M3?X!G_HT8sF+z>{#5Z)*AvN?`>^SL7oipty*98H%^h)@>j6fs+oXdV!d*!+si@JeIgTT^>ZgMeyj z!|W4ssR?JMT4h!>Z@JDH-ORdo%Tu)pNJ4O^!Eu9xSJew~@M z|6WOMVu=RRTe)MpJ|4<%V_m+_DJ)CRn)8mw>Smf*ug%O{)>XPG3jz$IFI-RCyxiE5 zNq33xc57zo9SpaeU(K4`@gT6<<8hpCZxD~s=QGj){f-uluLLzeKa=ErzVuABDRMz->+J(jvNuPF-ep+!76xYT zXy^RAlGMDC_>jti)Z$pZirgGf4i901Rax2YOZQ)G4yW7hzg*t8&+mmYa`7dwq`?U8*1dpXKn|)fgW(kAI!mT&Vix#b` zn6P{K>eIiziYRi*9lLU(QNvDa>KTT(?Q_1d`|g#d4vD=LAGK;5C*;*{_^IgWdjFoThK5{u+PCCq1ywf! z?`SSNXw90c=s3Z6pJdGPgi~*;*q1-fs@!pDg>ib2eT&MEld7z>=Mwv8`1pq{Kg3@2 zW{X|a+@C$NY`J;6l<#=#Jo@7-!!o_P4U6j7el_1Z=rX@%Huq!Qu->bASzAvAKj}K7 zt3BoEn%`}10$clJQ&}VC+9!S7rq|1~PJ!{c(eLX;3&| z)(8?9H3C!%1G>qm$q(IRtcg(qBQf5GRy*j1qec|E;V982fe~#&tPnQ`c(bwTK%EZ> r69@-tCj*S;fkrzM8(bedh{Xpc85ls)0p6@&S!SRvka|$)F)#oCM}ige literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.30.3mf new file mode 100644 index 0000000000000000000000000000000000000000..31490cbc46d2c2185875806be680d8025ddc6106 GIT binary patch literal 1905 zcmZ`)3pmqj82`_*xg?X@ER<8EFxo^exrERnO;VQDZO)mrXs!_^r*e&kCR-x4dV1NREw$(?UICc62!3X(Wf&dr*mHBQ8Tn8`e9Cr>Wdz*r%&|yxNT>|mxOt}$? zjy23k+sQv@Ur&pcyS$o)HN|%cqw;Q69LMH3Ds6iGY>57)h|^G0Q>*Tr!&na zM$@eMYJiYVb#x2dQ4>BhYyWCG$43_kI_`Wp#Z>)Jkb?gGfm{4n$A+KPU=xRNt@^l5 zCq-p%L}Z=f+&a(8_n+se7c&d?n-D)R^Kg0nR!N_p`=(GCbE0wc=7fvW&gp4j94{lT z#b?^LiaNASFt9-(+XiiS_g1enbH`*^&#srp5-qRy;dj5ycv{@NA&C_{g^o3oNx<$t zuW&B+M6N+aOAd(gKD_aUQdNH}PVF?oxu*3_G7D>&XdoI|!Knj)+$ETd^A2Y&`eTT)=O>!=VS42nco8TFH|`HY*-~ zeG2xw$`}j$fO@I?%`wXhvGW0O^j(aJh5tnFITG$;cyQS4mqNNN!GUU+IKsxz)L4GU zayJP_V?(dwB@S!qf&{&*z6R!m@g%peN$un0%QAboM+jHDE#67ac!RFbIK%Db#P6(y zX$4?2FF4FX4kg-8Ts(mB4H^lHkT#$=jEJ%_QSck}qij!OBMf7k(+mIRws?!x<+T?t z%*uk-`Z&?GW6w*B(aqwHlvLjvA4>bvdBm0dGQUhE9bF2d)bfU(A}46_E@zP(yAIv5 zN`i56t62nbP)IGVB)D@sx0{aN9UY%>LXsm)%G09?6UNHhRR;pnEGQ)V7GW zYJYH`L84s2N!CVQySQ>RTS<9;H++^ADeC>oEdomZAU#ti--WEQ1@5r1!>Wm4PMlFB zHp!+O^R{6HE}0<>WmTD;V}Y2qciw10<}lU7zb^6kT*7jD+YN>v2Zr#Ttd zaj$WfT>S~K(IhiJ8!*f&Z8JV|vmiLBGWRa$^OS;yq&PCZ;jrkuH zTzjM%s#qGr-+ue`oeFoYbs(&Dx(({JUG+uhJ&7z1mr*jUu|vP^Q-~2~>x<9aV#5~G z5lij09=?_>{_#x+rz*(+R+%7AbZKvA>EXT>q79#&vFTCMidMQufoYtmvSjwL6rwgq z2H({>H;|khCp2uMeGS}cK!&wFZ*Th6K;^f1o5+P%gO@`_e$|)u12XA($na+fK4g95 zf?R+~8nlQ}$r4nA%RH$k2C(SArD|;2D&Mw5U4mB!Pi#I%Ng_oQ&1g8}#YpVx& zO&=fhJ=?bT%_e58nK(hiItg8)awzvm7F~7u^hpd_Lb%YnvICA>F69Kj9_GyR^Zz zKbEVflQNM1<-$%_X`&iI`~bu9*hCpJL9AdMXvkVraw%2W1p^Y(1OBfGs4jgha$Yas z@M}we|I!kcT!5b=FE78JBmZYH!hb2o?xnu-bMWPf`Z@Trw84K#o4okqn_Vyvi0;z! s7cp7fEZqtG&?}eH4u<^e2VGdnewP5SaO{E+|9%Rd_gb)DKo0=^0h|^qr2qf` literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.40.3mf new file mode 100644 index 0000000000000000000000000000000000000000..317d409fc190a3fb257d5aecb8f1f4214eef36b4 GIT binary patch literal 1894 zcmZ`)3pkW%6#k7nnQ@EBeF}{-LuTA_ncP_!5}`)5Gg_@E_gmyrgrSIBQzD}zOoQBt z5Mj2M+;eGY?37z$?Xa8HM9)5I_xqpkoag($bI$ku?>X;(uy))$2mk;CHYNZ(oGC0 zCMC%5;LYh`8Qnb-Pd|U6%)W3B246~eqO4&n4{0_@mL6sefABa!WDUU`QkoP8j1&)x zNHftGNzaswW$u@!3;EjgMIP?6nFu~HYNxU{_5eiQ%0Ry^EgC8OJaRUqZ&|L0(%9gH zI1PDGa3Qt-SYdpu|E%>@N9VZ|XPfbm<7F=DtEG194@gbg`G)d5N!c<+ z4uEaJLgem?GGepyH$mYozgE|<4Kw?1tw0bE@UGo#7)FD%j zx#|s_7&ll&*ZTP*BPG193bL2bg8Fm`tX$g=v7d#$m3r9Yrt&e;BSUJnXS%1NI6EE! zY4dbgtF;;|sao?8qQsvvPaep^hfx4)fR4(o(IWijDVfrqcbfx+HGhq8s)4 znK`mnXxrFg+uVIT%lE>^k*NY!Y@oron-Lw z*N`VCQ+I=-Tr_d`_7k+0KuJx+Y;Am+mgalQ0(28*cw7J zY#K(7iz!yNIJirMQPLW%D=hVwHDmEyn98vq+S)<%@ALI;pFyHBV+S54#bYi-2s ztt>iP9Wqd-cNeqTgLgfuZKn)5u7IZzofPViwu{&L;-xHi&bW<~v+z?I%eRGT@1nIA z=M=HqNG;%u?Egk;i49VFnECkz5_|(aox{!(0!|=9&-rk8?F`!F^Zcd)3Y>av+cZUu z_p`w;SMMV`&5MH|6@HV#@qr^=_NsSskZ)^4`i^3%q#6lYtj{7x7Q7bP#5(ZYI-l;9 z7X#=!lp$UJqKeRK4W$pd*Zz=%2`Y5ZI%D9*`!ag~T&b41>3ra+<=i^Ch@F(Mek0Q8 z{d!kbB`zmSj+xe|MN`6Iht#(2o&xd;?2tw~D@>6CKAXI6BSStiLl)t&YkwnD1U;kj!o%|NT@*rlmy0b7JuG%=PQZf1-!7 z*MluJ14M^j4O72#W%Sd|>Wf7+ac_q#V1Sk$UOZCJ^>m?j^sck%(aOTc?&8+ zTCY&6rfB?cLd|AF4R2|&iO{CdrF|D;uK7k+uEK0ACdLtPxI&26%Fpl5hYvZ9soiTa zjb|Knq0_kz_F zdA@VL^?SywpR}`kfqTfP%AzQ~wYZTM^TNnHVLHNv_{R4vrR&IaQV(MPjhXVlu2_mv zQsoJ}#|lhNFV!H4pb8}}28K;e%#_C3ae)xP|NZ&pwm$6AhUVb#V;_M2&rCLA-m#T- f_P>7o97~?B5&$^cSUX-m&O7dnhhxt{4*>oF{>U30 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.50.3mf new file mode 100644 index 0000000000000000000000000000000000000000..6992e6a0a3aca4061d2962db035dbddefd64fe9d GIT binary patch literal 1894 zcmWIWW@gc4U|`??Vg`m8)tPetp+JB^gu&QF-#8^VKP5Fs4@@#L2r#hof|W8%W`@v9 z!%yeUF%XH}9`v7aXSUokQ-h|mVAog6g07~?Hs%Ux$tfEwHi^GqeQ=(;)MZCsG08I@ zEuY)H*?H2=etU1J$l-|Zv3@Ha3woEVd0zT`#$?a1GAFzGUmxtUtM#O~58RzGSzVLA z`nv4R$r;@jGqcUUB*%NUe_bp6VcUyks}hQ&8jhy^RfxI2c;f4yM`rDcdbVWk>}7ea zBFv8GYJ(TddGY4A{AVZgcei_uav5_&)f;X#ZBJh8q0njlHa$g}x3|f+IiXhFRo!scm9I`rS8Jy`>T<=MIP|J3 z?8%dKU1>+1pT8OS@9#e-wUMt`;%Gq&tC!u;zvgGHpWVHqAEfWx6)eB`GA=K6+OJR36N;8C zbeS18Pi}>QC zb>2{=Zf4EY9$lw$6i#hiNmOWq6D1NaeLjSeUS@}@UFxepDSn4vO}l!d=2go*vyE4ErH{m!e!hKjhgkL2 z)X+0=wpRJ8*S`PhtydgB_m0n@>u%p~#K@%XO_F_CGpo-ouIifM3D1JeM_lardIcBC zo-^0Ac8kfx@SPBsD*V9qQ-m+CmRbIec89mPoiX3NmFAR9BQ+&dC4}+d zN=6SwX=BxA98GSV!Xc}(H73knpye!5tFYSgxjM5{mYy;j^Gg@$6FVoVtFE8;%qB5& zLvx<)PPSQ(124@8Gsp}(R^S-tmKAPG&cvpf%$aWVJxlD&sg-#@GBvbMo%+67VN30- zBV{|fnXNfj9ZH+(K6zD-)~t?HrqfxPQP~fVO7dP>u5PX06MRf7Z}}Y2vKeeE=c+Mo z*Ph2A*EaR}@tT?H#^ux4;~$9qU)|_m&k%r;sX0RQF2gdlFfda`JLl(>q~?{xhg24% z7RTyU0YEb6kPlz(0R1MZfRTWP*(3uo%x z-Clkv)N!NOo>ZgHe|dx7r@cQScr1n4?9;L}OBhTRZoOe%v}j$$gx$+mpZ@h#M3GbO z*p(BF8g^P!&oIO-H*#@!SCaT;)()9!(XEx2ZCBi0wJTgrficK&rnAv)*S+n2{(VPI zpP9S)o1&Bc(a)7;r%f;YIv3v8M{ajK9m-5Enzy9~>#EISCO>WHiSLS9=EO6t(&2#@x zPQH94%TlmzFEeV86<>Qi4HjhFz#xk+O3f+O*8`EDpyFnPgwbYbP^I>t^fsq)mLMt0|!%-s&-Efp>lfZ~J4pxYp1H9STbfC_Mgb9QLwUYrx^FX8h f2SOh^NF@uHWMBYE2Y9oxfy9`B5TqUydJGHzDGdu= literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.60.3mf new file mode 100644 index 0000000000000000000000000000000000000000..71c89d2145c7b2dc8fa07ecb4fecccf83f8349c6 GIT binary patch literal 1895 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_1.80.3mf new file mode 100644 index 0000000000000000000000000000000000000000..6ce9f6fc688a43c7dfe7f38fcde02a19c96d26d0 GIT binary patch literal 1904 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf b/resources/calibration/filament_pressure/scaled_with_nozzle_size/90_bend_2.00.3mf new file mode 100644 index 0000000000000000000000000000000000000000..31df1df8cc034555643c82d67c8cb1c597174d2f GIT binary patch literal 1890 zcmZ`)2{hDQ6#v^s4KhlStXZ-RKFTD*M6yO?IU`DDgkuTApbwEEsv%3ZIU*XQIreR+ zA!IBwV$=w26Iu)@%UBwpiOzTA``$b6-t&L&zWd()ckl0AJ1ZVuC;$LE)&~F>WMhx6 zZ8iuX3h0<>>LC3CktjcnUy=)e0DMBfOaUyy9pIs*|M&B+9$K zxmgya-c@1=Q_MGt3eSh(QfhhLg(-KX*(cy;gjX$e{l4WSEsphPbTix-rwTooF4}}n z>1I~**J2qEn!zs@)LCcG=Tp{1kSImk_D>SL%n!LPvY*%V?;?6B+B_qJK*D#MS)6? zJ1Juyh;@)6Il{aV=-Mlp9w~CWE_T9&%PpNT&^zMglj)QBV~<%?J9jSZ1lxpUWbL47 zQ5VFGp>(S@pviO03ZFzrL)4d5r0ugp@5qt&TN z|EiN|PrHKGh8p|!u6oyC=R4rKYLwK|{?UT7-640*zzeN}oR88QN$^1&b#d=5!oK!a zEOXO05QS#Mu!wZs}7 z&jwO?5UglSmT3W-Z`3n#n7)@xa23}Vja`uLgbJF=GacKf^%zsQ(x4`7I=Rkku*;zu zY8)!CUm4juG1oLa_1;=47Fxtpj{%8&d@riWQNSdLM<3vxgM2W}cUc;ZxNqh1w&Xv1)BvVV+r}(ezWP#GU)cvypJb_Xu{kn&N>= z3(0#Vim1JzK8+%&>YgyQ>u5&Ht#frM^#M6rnb!}FwsjlWOt4Lbn~b4sd~9G0V7G

J8509%7&^Ly?{Gj+thd(?J<|rAbDkPZN%X5l993|XC+xK zdw8~q_Q=VWgwwWn+IxC&)eCYbG&_Do==K~LSnjPnOglDZq%4EDY(zufqDa^@?+k6P zn=54{o_SO2&Y=0240h$JG*Eb7OvRF%#mTpCpvub97_SA-iOZ4nGovaGTlM)+a_|(L zC;QLgFLW~_`SA?jh=zd@olEvc@d_-mB3~561Dj=S>x6IP51y(qMBtWgNrC(Wn&d~# z8#`Eiz(bAbio$5n^0n8krul#83NWBfw}%3JYsn5DlX{_Q>Eq=qH_RZlccf5!E;yr$ zvvnG`xe2mdlW +#include +#include +#include "wxExtensions.hpp" +#include "Jobs/ArrangeJob.hpp" +#include + +#pragma optimize("", off) +#if ENABLE_SCROLLABLE +static wxSize get_screen_size(wxWindow* window) +{ + const auto idx = wxDisplay::GetFromWindow(window); + wxDisplay display(idx != wxNOT_FOUND ? idx : 0u); + return display.GetClientArea().GetSize(); +} +#endif // ENABLE_SCROLLABLE + +namespace Slic3r { +namespace GUI { + +void CalibrationPressureAdvDialog::create_buttons(wxStdDialogButtonSizer* buttons){ + + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; //there a better way to only load the flavor ? + + wxString choices_first_layerPA[] = { + "0.025", + "0.030", + "0.035", + "0.040", + "0.045", + "0.050" + }; + firstPa = new wxComboBox(this, wxID_ANY, wxString{ "0.040" }, wxDefaultPosition, wxDefaultSize, 6, choices_first_layerPA); + firstPa->SetToolTip(_L("Select the first layer PA value to be used for the first layer only.")); + firstPa->SetSelection(3);// starting at 0! + + + wxString choices_start_PA[] = { + "0.0", + "0.010", + "0.020", + "0.030", + "0.040", + "0.050" + }; + startPa = new wxComboBox(this, wxID_ANY, wxString{ "0.0" }, wxDefaultPosition, wxDefaultSize, 6, choices_start_PA); + startPa->SetToolTip(_L("Select the starting PA value to be used.")); + startPa->SetSelection(0); + + wxString choices_end_PA[] = { + "0.10", + "0.20", + "0.30", + "0.40", + "0.50", + "0.60", + "0.70", + "0.80", + "0.90", + "1.00" + }; + endPa = new wxComboBox(this, wxID_ANY, wxString{ "0.10" }, wxDefaultPosition, wxDefaultSize, 10, choices_end_PA); + endPa->SetToolTip(_L("Select the ending PA value to be used.")); + endPa->SetSelection(0); + + wxString choices_increment_PA[] = { + "0.0010",///1000 hits + "0.0025", + "0.0035", + "0.005", //200 hits + "0.006", + "0.007", + "0.01",//100 hits + "0.1"//10 hits + }; + paIncrement = new wxComboBox(this, wxID_ANY, wxString{ "0.0025" }, wxDefaultPosition, wxDefaultSize, 8, choices_increment_PA); + paIncrement->SetToolTip(_L("Select the PA increment amount.")); + paIncrement->SetSelection(1); + + wxString choices_extrusion_role[] = { + "InternalInfill", + "BridgeInfill", + "ExternalPerimeter", + "GapFill", + "InternalBridgeInfill", + "Ironing", + "OverhangPerimeter", + "Perimeter", + "SolidInfill", + "SupportMaterial", + "SupportMaterialInterface", + "ThinWall", + "TopSolidInfill", + "FirstLayer", + // "Verify"//if this selected, disable/hide other buttons? + // 'verify' this choice will require the user to manually add in the PA numbers with the GUI from their realworld tests. + // the code will then load a 90_bend for each ER role, and give each bend seperate ER speed/width/ect values + // when printed and user added in the PA numbers correctly. it should make it easy to spot what ER roles need adjusting. + //TODO: once the main pressure advance feature is added, this can pull that values and insert here to save the manual adding in the numbers. + // supermerill: i don't understand, so I deactivated the feature for now. + }; + erPa = new wxComboBox(this, wxID_ANY, wxString{ "InternalInfill" }, wxDefaultPosition, wxDefaultSize, 14, choices_extrusion_role); + erPa->SetToolTip(_L("Select the extrusion role you want to generate a calibration for")); + erPa->SetSelection(0); + + + wxString number_of_runs[] = {"1","2","3","4","5"}; + nbRuns = new wxComboBox(this, wxID_ANY, wxString{ "1" }, wxDefaultPosition, wxDefaultSize, 5, number_of_runs); + nbRuns->SetToolTip(_L("Select the number of tests to generate, max 2 is reccomended due to bed size limits")); + nbRuns->SetSelection(0); + + enableST = new wxCheckBox(this, wxID_ANY, _L(""), wxDefaultPosition, wxDefaultSize ); + enableST->SetToolTip(_L("generate smooth time values")); + enableST->SetValue(false); + + // TODO : add another row of boxes for the 2nd/3rd ect of tests to create, user adjust parameters of new row for the 2nd/3rd test + // this will allow multi plate PA tests to be run + + + std::string prefix = (gcfMarlinFirmware == flavor || gcfMarlinLegacy == flavor) ? " LA " : ((gcfKlipper == flavor || gcfRepRap == flavor) ? " PA " : "unsupported firmware type"); + + if (prefix != "unsupported firmware type"){ + wxBoxSizer* vertical =new wxBoxSizer(wxVERTICAL); + wxBoxSizer* hsizer_common =new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* hsizer_pa =new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* hsizer_speed =new wxBoxSizer(wxHORIZONTAL); + vertical->Add(hsizer_common); + vertical->Add(hsizer_pa); + vertical->Add(hsizer_speed); + + hsizer_common->Add(new wxStaticText(this, wxID_ANY, _L("Number of tests: "))); + hsizer_common->Add(nbRuns); + + hsizer_pa->Add(new wxStaticText(this, wxID_ANY, _L("First Layers" + prefix + "value: "))); + hsizer_pa->Add(firstPa); + hsizer_pa->AddSpacer(15); + hsizer_pa->Add(new wxStaticText(this, wxID_ANY, _L("Starting" + prefix + "value: "))); + hsizer_pa->Add(startPa); + hsizer_pa->AddSpacer(15); + hsizer_pa->Add(new wxStaticText(this, wxID_ANY, _L("Ending" + prefix + "value: "))); + hsizer_pa->Add(endPa); + hsizer_pa->AddSpacer(15); + hsizer_pa->Add(new wxStaticText(this, wxID_ANY, _L(prefix + "increments: "))); + hsizer_pa->Add(paIncrement); + + hsizer_speed->Add(new wxStaticText(this, wxID_ANY, _L("Extrusion role: "))); + hsizer_speed->Add(erPa); + if (gcfKlipper == flavor) { + hsizer_speed->AddSpacer(15); + hsizer_speed->Add(new wxStaticText(this, wxID_ANY, _L("Smooth time: "))); + hsizer_speed->Add(enableST); + } + hsizer_speed->AddSpacer(25); + + wxButton* bt = new wxButton(this, wxID_FILE1, _L("Generate")); + bt->Bind(wxEVT_BUTTON, &CalibrationPressureAdvDialog::create_geometry, this); + + vertical->Add(bt); + + buttons->Add(vertical); + } else { + buttons->Add(new wxStaticText(this, wxID_ANY, _L(prefix))); + } +} + +void CalibrationPressureAdvDialog::create_geometry(wxCommandEvent& event_args) { + /* + firstPa + startPa + endPa + paIncrement + erPa + enableST + */ + double first_pa, start_pa, end_pa, pa_increment = 0.01; + bool smooth_time = enableST->IsChecked(); + size_t nb_runs = nbRuns->GetSelection(); + nb_runs=nb_runs+1; + first_pa = firstPa->GetValue().ToDouble(&first_pa); + + if (!firstPa->GetValue().ToDouble(&first_pa)) { + first_pa = 0.025; + } + start_pa = startPa->GetValue().ToDouble(&start_pa); + if (!startPa->GetValue().ToDouble(&start_pa)) { + start_pa = 0.0; + } + end_pa = endPa->GetValue().ToDouble(&end_pa); + if (!endPa->GetValue().ToDouble(&end_pa)) { + end_pa = 1.0; + } + pa_increment = paIncrement->GetValue().ToDouble(&pa_increment); + if (!paIncrement->GetValue().ToDouble(&pa_increment)) { + pa_increment = 0.05; + } + + std::string extrusion_role = erPa->GetValue().ToStdString(); + std::string choice_extrusion_role[] = { + "InternalInfill", + "BridgeInfill", + "ExternalPerimeter", + "GapFill", + "InternalBridgeInfill", + "Ironing", + "OverhangPerimeter", + "Perimeter", + "SolidInfill", + "SupportMaterial", + "SupportMaterialInterface", + "ThinWall", + "TopSolidInfill", + "FirstLayer"//i've got added them all right? + }; + + std::unordered_map er_width_ToOptionKey = { + {"InternalInfill", "infill_extrusion_width"}, + //{"BridgeInfill", "placeholder"},//special calc required + {"ExternalPerimeter", "external_perimeter_extrusion_width"}, + //{"GapFill", "placeholder"},//special calc required + //{"InternalBridgeInfill", "placeholder"},//special calc required, TODO:find out where/how this is calculated + {"Ironing", "top_infill_extrusion_width"}, + {"OverhangPerimeter", "overhangs_width"}, + {"Perimeter", "perimeter_extrusion_width"}, + {"SolidInfill", "solid_infill_extrusion_width"}, + {"SupportMaterial", "support_material_extrusion_width"}, + {"SupportMaterialInterface", "support_material_extrusion_width"}, + {"ThinWall", "external_perimeter_extrusion_width"}, + {"TopSolidInfill", "top_infill_extrusion_width"}, + {"FirstLayer", "first_layer_extrusion_width"} + + }; + + std::unordered_map er_accel_ToOptionKey = { + {"InternalInfill", "infill_acceleration"}, + {"BridgeInfill", "bridge_acceleration"}, + {"ExternalPerimeter", "external_perimeter_acceleration"}, + {"GapFill", "gap_fill_acceleration"}, + {"InternalBridgeInfill", "bridge_internal_acceleration"}, + {"Ironing", "ironing_acceleration"}, + {"OverhangPerimeter", "overhangs_acceleration"}, + {"Perimeter", "perimeter_acceleration"}, + {"SolidInfill", "solid_infill_acceleration"}, + {"SupportMaterial", "support_material_acceleration"}, + {"SupportMaterialInterface", "support_material_interface_acceleration"}, + {"ThinWall", "top_solid_infill_acceleration"}, + {"TopSolidInfill", "top_solid_infill_acceleration"}, + {"FirstLayer", "first_layer_acceleration"} + }; + + std::unordered_map er_spacing_ToOptionKey = { + {"InternalInfill", "infill_extrusion_spacing"}, + //{"BridgeInfill", "placeholder"}, + {"ExternalPerimeter", "external_perimeter_extrusion_spacing"}, + //{"GapFill", "placeholder"},//special calc required for commented ones + //{"InternalBridgeInfill", "placeholder"}, + //{"Ironing", "ironing_spacing"}, TOFIX? TYPE: coFloat + {"Ironing", "top_infill_extrusion_spacing"}, + {"OverhangPerimeter", "external_perimeter_extrusion_spacing"}, + {"Perimeter", "perimeter_extrusion_spacing"}, + {"SolidInfill", "solid_infill_extrusion_spacing"}, + {"SupportMaterial", "external_perimeter_extrusion_spacing"}, //TOFIX? TYPE: coFloat + {"SupportMaterialInterface", "external_perimeter_extrusion_spacing"}, //TOFIX? TYPE: coFloat + {"ThinWall", "external_perimeter_extrusion_spacing"}, + {"TopSolidInfill", "top_infill_extrusion_spacing"}, + {"FirstLayer", "first_layer_extrusion_spacing"} + }; + + std::unordered_map er_speed_ToOptionKey = { + {"InternalInfill", "infill_speed"}, + {"BridgeInfill", "bridge_speed"}, + {"ExternalPerimeter", "external_perimeter_speed"}, + {"GapFill", "gap_fill_speed"}, + {"InternalBridgeInfill", "bridge_speed_internal"}, + {"Ironing", "ironing_speed"}, + {"OverhangPerimeter", "overhangs_speed"}, + {"Perimeter", "perimeter_speed"}, + {"SolidInfill", "solid_infill_speed"}, + {"SupportMaterial", "support_material_speed"}, + {"SupportMaterialInterface", "support_material_interface_speed"}, + {"ThinWall", "thin_walls_speed"}, + {"TopSolidInfill", "top_solid_infill_speed"}, + {"FirstLayer", "first_layer_speed"} + }; + +/* +struct ExtrusionSettings {// think a struct is better instead of all the maps ? + std::string extrusionWidth; + std::string acceleration; + std::string speed; +}; + + std::unordered_map extrusionRoleToOptionKey = { + {"InternalInfill", {"infill_extrusion_width", "infill_acceleration", "placeholder"}}, + //{"BridgeInfill", {"placeholder", "bridge_acceleration", "placeholder"}},//special calc required + {"ExternalPerimeter", {"external_perimeter_extrusion_width", "external_perimeter_acceleration"}}, + //{"GapFill", {"placeholder", "gap_fill_acceleration"}},//special calc required + //{"InternalBridgeInfill", {"placeholder", "bridge_internal_acceleration"}},//special calc required + {"Ironing", {"top_infill_extrusion_width", "ironing_acceleration"}}, + {"OverhangPerimeter", {"overhangs_width", "overhangs_acceleration"}}, + {"Perimeter", {"perimeter_extrusion_width", "perimeter_acceleration"}}, + {"SolidInfill", {"solid_infill_extrusion_width", "solid_infill_acceleration"}}, + {"SupportMaterial", {"support_material_extrusion_width", "support_material_acceleration"}}, + {"SupportMaterialInterface", {"support_material_extrusion_width", "support_material_interface_acceleration"}}, + {"ThinWall", {"external_perimeter_extrusion_width", "thin_walls_acceleration"}}, + {"TopSolidInfill", {"top_infill_extrusion_width", "top_solid_infill_acceleration"}} + };*/ + + int countincrements = 0; + int sizeofarray = static_cast((end_pa - start_pa) / pa_increment) + 2;//'+2' needed for odd/even numbers + std::vector pa_values(sizeofarray); + std::vector c_pa_values_c(sizeofarray); + + double incremented_pa_value = start_pa; + while (incremented_pa_value <= end_pa + pa_increment / 2) {//this makes a number to be used to load x number of 90 bend models for the PA test. + if (incremented_pa_value <= end_pa) { + double rounded_Pa = std::round(incremented_pa_value * 1000000.0) / 1000000.0; + pa_values[countincrements] = rounded_Pa;//store PA numbers in array to be used later. + c_pa_values_c[countincrements] = rounded_Pa; + countincrements++; + incremented_pa_value += pa_increment; + } + else { + pa_values[countincrements] = end_pa; + countincrements++;//failsafe if werid input numbers are provided that can't add the "ending pa" number to the array. + break; } + + }// is there a limit of how many models SS can load ? might be good to set a failsafe just so it won't load 10k+ models... + + bool has_to_arrange = false; + Plater* plat = this->main_frame->plater(); + Model& model = plat->model(); + if (!plat->new_project(L("Pressure calibration"))) + return; + + bool autocenter = gui_app->app_config->get("autocenter") == "1"; + if (autocenter) { + //disable auto-center for this calibration. + gui_app->app_config->set("autocenter", "0"); + } + + std::vector items; + for (size_t i = 0; i < nb_runs; i++){ + items.emplace_back((boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "base_plate.3mf").string()); + } + std::vector objs_idx = plat->load_files(items, true, false, false, false); + assert(objs_idx.size() == nb_runs); + const DynamicPrintConfig* print_config = this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->get_config(); + const DynamicPrintConfig* filament_config = this->gui_app->get_tab(Preset::TYPE_FFF_FILAMENT)->get_config(); + const DynamicPrintConfig* printer_config = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + + // --- scale --- + //models is created for nozzles from 0.1-2mm walls should be nozzle_size*4 spaced, scale xy model by widths down is futher + const ConfigOptionFloats* nozzle_diameter_config = printer_config->option("nozzle_diameter"); + assert(nozzle_diameter_config->values.size() > 0); + double nozzle_diameter = nozzle_diameter_config->values[0];//get extruderID too? + double first_layer_height = print_config->get_abs_value("first_layer_height", nozzle_diameter); + double base_layer_height = print_config->get_computed_value("layer_height",0); + GCodeFlavor flavor = printer_config->option>("gcode_flavor")->value; + + double er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); + double er_accel = print_config->get_abs_value("solid_infill_acceleration", nozzle_diameter); + double er_speed = print_config->get_abs_value("solid_infill_speed", nozzle_diameter); + double er_spacing = print_config->get_abs_value("external_perimeter_extrusion_spacing",1.0); + + double default_er_width = print_config->get_abs_value("extrusion_width", nozzle_diameter); + double default_er_speed = print_config->get_abs_value("default_speed", nozzle_diameter); + double default_er_accel = print_config->get_abs_value("default_acceleration", nozzle_diameter); + double default_er_spacing = print_config->get_abs_value("extrusion_spacing", nozzle_diameter); + double spacing_ratio = print_config->get_abs_value("perimeter_overlap",1.0); + double spacing_ratio_external = print_config->get_abs_value("external_perimeter_overlap",1.0); + double filament_max_overlap = filament_config->get_computed_value("filament_max_overlap",0);//maybe check for extruderID ? + + if (extrusion_role == "Verify") { + countincrements = 13; + er_width = default_er_width; + er_spacing = default_er_spacing; + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round + } + else{ + for (int i = 0; i < sizeof(choice_extrusion_role) / sizeof(choice_extrusion_role[0]); i++) { + + if (er_width_ToOptionKey.find(extrusion_role) != er_width_ToOptionKey.end()) { + + er_width = print_config->get_abs_value(er_width_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//look at maps at match speed/width ect to the selecter ER role + er_speed = print_config->get_abs_value(er_speed_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//need to load this here?? + er_accel = print_config->get_abs_value(er_accel_ToOptionKey[extrusion_role].c_str(), nozzle_diameter);//need to load this here?? + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[extrusion_role].c_str(), nozzle_diameter); + + //potential BUG if any of the values are 0 everything else would fail, need to pull the default value too and assign that? + if(er_width == 0){er_width =default_er_width; } + if(er_speed == 0){er_speed =default_er_speed; } + if(er_accel == 0){er_accel =default_er_accel; } + if(er_spacing == 0){er_spacing = default_er_spacing; } + + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; + } else { + er_width = print_config->get_abs_value("solid_infill_extrusion_width", nozzle_diameter); //used for gapfill_width/bridges selection. TODO: add the bits for this here since gapfill/bridges need special calculations + er_width = er_width * 100 / nozzle_diameter; + er_width = std::round(er_width * 100.0) / 100.0; // Change number to percentage and round + + } + + } + } + + + //-- magical scaling is done here :) + //the 90_bend models need to be scaled correctly so there is no 'gapfill' since gapfill will effect results. + double xyzScale = nozzle_diameter / 0.4; + double er_width_to_scale = magical_scaling(nozzle_diameter,er_width,filament_max_overlap,spacing_ratio,spacing_ratio_external,base_layer_height,er_spacing); + //-- magical scaling + std::vector < std::vector> pressure_tower; + + std::string nozzle_diameter_str = std::to_string(nozzle_diameter); + nozzle_diameter_str.erase(nozzle_diameter_str.find_last_not_of('0') + 2, std::string::npos); + + + if (nozzle_diameter_str.back() == '.') {//if nozzle_diameter_str broke fix it by adding '0' to end, prob not needed? + nozzle_diameter_str += '0'; + } + + /*size_t decimal_pos = nozzle_diameter_str.find('.'); + // maybe adjust for this ? + // some users might have 0.0x nozzle size. if that's the case then they should just need to create the file and it should load. ie; 90_bend_0.450.3mf + if (decimal_pos != std::string::npos) { + size_t non_zero_pos = nozzle_diameter_str.find_first_not_of('0', decimal_pos + 2); + nozzle_diameter_str.erase(non_zero_pos, std::string::npos); + }*/ + + std::string bend_90_nozzle_size_3mf = "90_bend_" + nozzle_diameter_str + ".3mf"; + + for (size_t id_item = 0; id_item < nb_runs; id_item++) { + + pressure_tower.emplace_back(); + + double initial_model_height = 0.2; + double initial_90_bend_x = 41.20;//fusion=41.200 mm + double initial_90_bend_y = 20.93;//fusion=20.930 mm + double initial_number_x = 2.06;//fusion=2.063 mm + double initial_number_y = 4.12;//fusion=4.125 mm + double initial_border_x = 1.6;//fusion= 1.6mm + double initial_point_xy = 0.69;//fusion = 0.687 mm + + double z_scaled_model_height = initial_model_height * (first_layer_height / initial_model_height); + double xy_scaled_90_bend_x = initial_90_bend_x * er_width_to_scale; + double xy_scaled_90_bend_y = initial_90_bend_y * er_width_to_scale; + double xy_scaled_x = initial_border_x * er_width_to_scale; + double xy_scaled_number_x = initial_number_x * xyzScale * er_width_to_scale; + double xy_scaled_number_y = initial_number_y * xyzScale * er_width_to_scale; + double xy_scaled_point_xy = initial_point_xy * xyzScale * er_width_to_scale; + + + double thickness_offset = nozzle_diameter * er_width_to_scale * 2; + double z_scale_90_bend = xyzScale * 1.8 / initial_model_height; + double z_scale_factor = 0.0; + double new_z_world_coords = first_layer_height / 2.0 -base_layer_height; + + if(base_layer_height <= first_layer_height){//normal conditions firstlayer is greater than base + z_scale_factor = first_layer_height / initial_model_height; + }else{ + z_scale_factor = first_layer_height + first_layer_height; + } + // BUG: output error if first layer height is lower than base layer height + // this can cause the numbers to not "show up" on the preview because the z scale is calculated wrong. + // ie; first_layer_height=0.1 and base_layer_height =0.20 + //BUG: if first/base layer height are both .02 numbers don't show up when sliced. doesn't happen with windows, it did for linux ? + + + + std::vector bend_90_positions; + std::vector number_positions; + + if (extrusion_role == "Verify") { + + int nb_bends = 0; + for (const std::string& role : choice_extrusion_role) {//dynamic add and scale each 90bend model per extrusion role. + + if (er_width_ToOptionKey.find(role) != er_width_ToOptionKey.end()) { + + er_width = std::round((print_config->get_abs_value(er_width_ToOptionKey[role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = print_config->get_abs_value(er_spacing_ToOptionKey[role].c_str(), nozzle_diameter); + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + thickness_offset = nozzle_diameter * er_width_to_scale * 2; + + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); + + Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); + nb_bends++; + } + else{ + er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_spacing = default_er_spacing; + er_width_to_scale = magical_scaling(nozzle_diameter, er_width, filament_max_overlap, spacing_ratio, spacing_ratio_external, base_layer_height, er_spacing); + thickness_offset = nozzle_diameter * er_width_to_scale * 2; + + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, (initial_90_bend_y/2) * nb_bends , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); + + Eigen::Vector3d modelPosition(-0.8, (initial_90_bend_y/2) * nb_bends, xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); + nb_bends++; + + } + + } + } + else{//not verify + for (int nb_bends = 0; nb_bends < countincrements; nb_bends++){ + //const double magical_transformation_y_pos = 10.47; + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "scaled_with_nozzle_size" / bend_90_nozzle_size_3mf).string(), + Vec3d{ -0.8, double(nb_bends) * (thickness_offset*2) *2 , xyzScale - base_layer_height }, Vec3d{ er_width_to_scale, er_width_to_scale, z_scale_90_bend }); + pressure_tower.back().push_back(model.objects[objs_idx[id_item]]); + + Eigen::Vector3d modelPosition(-0.8, (double(nb_bends) * (thickness_offset*2) *2) , xyzScale - base_layer_height ); + bend_90_positions.push_back(modelPosition); + } + } + + for (int nb_bends = 0; nb_bends < countincrements;nb_bends++){ + + if(nb_bends == 1 && extrusion_role != "Verify") {//only load once. this onyl determines when the borders get loaded, keeping at top of list makes it easier to scroll down to. it can't be '0' since it needs the numbers positions! + + const double extra_size_y = xy_scaled_90_bend_y / 4; + const double extra_size_x = xy_scaled_number_x; + + const double magical_transformation_x_pos = 20.6;//what is this, and how is this calculated ? >:( + const double magical_transformation_y_pos = 10.47;//load a model without moving its pos to find see what it is.the number doesn't seem to change regardless of layer heights/nozzle size + Eigen::Vector3d bend_pos_first = bend_90_positions[0]; + Eigen::Vector3d bend_pos_mid = bend_90_positions[countincrements/2]; + Eigen::Vector3d bend_pos_last = bend_90_positions[countincrements-1]; + + Eigen::Vector3d number_pos_first = number_positions[0]; + Eigen::Vector3d number_pos_mid = number_positions[3]; + Eigen::Vector3d number_pos_last = number_positions[6]; + double numbers_total_width = (number_pos_last.x() + (xy_scaled_number_x / 2)) - (number_pos_first.x() - (xy_scaled_number_x / 2)); + + double scaled_r_border_x_percentage = ((numbers_total_width + extra_size_x) / initial_border_x) * 100; + double scaled_r_border_x_mm = (scaled_r_border_x_percentage / 100) * initial_border_x; + double scaled_tb_border_x = scaled_r_border_x_mm + xy_scaled_90_bend_x; + double scaled_tb_border_x_percentage = ((scaled_tb_border_x /* + extra_size_x*/) / initial_border_x) * 100; + + + double total_height = (bend_pos_last.y() + (xy_scaled_90_bend_y / 2)) - (bend_pos_first.y() - (xy_scaled_90_bend_y / 2)); + double scaled_border_y_percentage = ((total_height + extra_size_y) / initial_90_bend_y) * 100; + double border_scaled_y = (initial_border_x*(xy_scaled_x * 1.5)) / initial_90_bend_y;//need to fix for larger nozzle sizes. + + + double right_border_pos_x = number_pos_mid.x(); + double top_border_x_pos = ((number_pos_last.x() + (xy_scaled_number_x / 2)) + (bend_pos_first.x() - (xy_scaled_90_bend_x / 2))) / 2; + double left_border_pos_x = bend_pos_first.x() - (xy_scaled_90_bend_x / 2); + + //---------- + add_part(model.objects[objs_idx[id_item]], + (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ left_border_pos_x + magical_transformation_x_pos, bend_pos_mid.y(), new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ xy_scaled_x * 1.5, scaled_border_y_percentage*0.01, z_scale_factor }); // Left border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ right_border_pos_x + magical_transformation_x_pos , bend_pos_mid.y(), new_z_world_coords }, + /*scale*/Vec3d{ scaled_r_border_x_percentage*0.01 , scaled_border_y_percentage*0.01 , z_scale_factor });// right border + + bool enable_top_bottom = true; + if(enable_top_bottom == true){//remove later + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_first.y() - (xy_scaled_90_bend_y /1.8), new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//bottom border + //---------- + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "pa_border.3mf").string(), + Vec3d{ top_border_x_pos + magical_transformation_x_pos , bend_pos_last.y() + (xy_scaled_90_bend_y /1.8) , new_z_world_coords }, //need to fix to adjust for nozzle_diameter since it breaks bottom_solid_layers + /*scale*/Vec3d{ scaled_tb_border_x_percentage*0.01, border_scaled_y, z_scale_factor });//top border + } + + // position in printer coords are half of scaled size! + // scale model in percentage from original models xy values! + //---------- + } + //} + + if (extrusion_role != "Verify") {// possible to load the words for each ER role? + + if (nb_bends % 2 == 1) { // Skip generating every second number + continue; + } + + Eigen::Vector3d bend_90_pos = bend_90_positions[nb_bends]; + const double magical_transformation_y_pos = 10.47; + const double magical_transformation_num_x_pos = 1.03; + const double magical_transformation_num_y_pos = 2.06;// -2.03 + const double magical_transformation_z_pos = 0.12;//0.1 is the transformation value, but set slightly higher so numbers would be "inside" right border this might be dependant on z_scale_factor + + double bend_90_y = bend_90_pos.y() + magical_transformation_y_pos + (xy_scaled_90_bend_y/2); + double bend_90_x = bend_90_pos.x() + magical_transformation_num_x_pos; + double xpos_initial = bend_90_x + (xy_scaled_90_bend_x/2) - xy_scaled_number_x + nozzle_diameter; + double ypos_inital = bend_90_y /*+ (xy_scaled_number_y/2)*/; + double ypos_point = bend_90_y - (xy_scaled_number_y/2) - nozzle_diameter; + + double xpos = xpos_initial; + double ypos = ypos_inital; + + std::string pa_values_string = std::to_string(pa_values[nb_bends]); + std::string threemf =".3mf"; + + for (int j = 0; j < 7; ++j) {//not sure how the code will respond with a positive array list? ie ; 100.2 this moves decimal point thus breaking the code from loading model since "..3mf" not a real file + + std::string numered3mfpath = pa_values_string[j] + threemf; + + if (pa_values_string[j] == '.') { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / "point.3mf").string(), + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter , ypos_point, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale+(xyzScale/2), z_scale_factor }); + + Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos_point, z_scaled_model_height - magical_transformation_z_pos ); + number_positions.push_back(modelPosition); + xpos = xpos + xy_scaled_point_xy + (nozzle_diameter * 2 ); + } + else if (std::isdigit(pa_values_string[j])) { + + add_part(model.objects[objs_idx[id_item]], (boost::filesystem::path(Slic3r::resources_dir()) / "calibration" / "filament_pressure" / numered3mfpath).string(), + Vec3d{ xpos + xy_scaled_number_x + nozzle_diameter, ypos, z_scaled_model_height - magical_transformation_z_pos }, Vec3d{ xyzScale * er_width_to_scale, xyzScale * er_width_to_scale, z_scale_factor }); + + Eigen::Vector3d modelPosition(xpos + xy_scaled_number_x + nozzle_diameter + magical_transformation_num_x_pos, ypos, z_scaled_model_height - magical_transformation_z_pos ); + number_positions.push_back(modelPosition); + xpos = xpos + xy_scaled_number_x + nozzle_diameter; + } + } + } + } + } + + + /// --- translate --- + //bool autocenter = gui_app->app_config->get("autocenter") == "1"; + has_to_arrange = true; + /*if (!autocenter) { + const ConfigOptionPoints* bed_shape = printer_config->option("bed_shape"); + Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); + Vec2d bed_min = BoundingBoxf(bed_shape->values).min; + model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, 5 * xyzScale - 5 }); + }*/ + + std::string set_advance_prefix =""; + if (gcfKlipper == flavor) { + if(smooth_time == false){ + set_advance_prefix = "SET_PRESSURE_ADVANCE ADVANCE="; + } + else{ + set_advance_prefix = "SET_PRESSURE_ADVANCE SMOOTH_TIME="; + } + } + else if (gcfMarlinFirmware == flavor) { + set_advance_prefix = "M900 K"; + } + else if(gcfRepRap == flavor){ + set_advance_prefix = "M572 S"; + } + + /// --- main config, modify object config when possible --- + DynamicPrintConfig new_print_config = *print_config; + DynamicPrintConfig new_printer_config = *printer_config; + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(false)); //true is required for multi tests on single plate. + new_print_config.set_key_value("gap_fill_enabled", new ConfigOptionBool(true)); //should be false?, enabled for testing + new_print_config.set_key_value("top_solid_layers", new ConfigOptionInt(0)); + new_print_config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(false)); + new_print_config.set_key_value("bottom_solid_layers", new ConfigOptionInt(1)); + new_print_config.set_key_value("fill_density", new ConfigOptionPercent(0)); + new_print_config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0.0,false)); + new_print_config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipMonotonicWGapFill)); + new_print_config.set_key_value("seam_position", new ConfigOptionEnum(spRear));//BUG: should be fixed in 2.7 merge/SS 2.5.59.7, when this is changed the "perimeters & shell" doesn't turn red indicating a change. + new_print_config.set_key_value("avoid_crossing_perimeters", new ConfigOptionBool(false)); + new_print_config.set_key_value("perimeter_overlap", new ConfigOptionPercent(100)); + new_print_config.set_key_value("external_perimeter_overlap", new ConfigOptionPercent(100)); + new_printer_config.set_key_value("before_layer_gcode", new ConfigOptionString(std::string("{if layer_num == 0} ") + set_advance_prefix + std::to_string(first_pa) + " {endif}")); + + for (size_t i = 0; i < nb_runs; i++) { + /* + gcfRepRap, + gcfSprinter, + gcfRepetier, + gcfTeacup, + gcfMakerWare, + gcfMarlinLegacy, + gcfMarlinFirmware, + gcfLerdge, + gcfKlipper, + gcfSailfish, + gcfMach3, + gcfMachinekit, + gcfSmoothie, + gcfNoExtrusion*/ + + size_t num_part = 0; + const int extra_vol = 1; + for (ModelObject* part : pressure_tower[i]) {//loop though each part/volume and assign the modifers + + std::string er_role =""; + if (extrusion_role == "Verify") { + er_role = choice_extrusion_role[num_part]; + if (er_width_ToOptionKey.find(er_role) != er_width_ToOptionKey.end()) { + + er_width = std::round((print_config->get_abs_value(er_width_ToOptionKey[er_role].c_str(), nozzle_diameter) * 100 / nozzle_diameter) * 100.0) / 100.0; + er_speed = print_config->get_abs_value(er_speed_ToOptionKey[er_role].c_str(), nozzle_diameter); + er_accel = print_config->get_abs_value(er_accel_ToOptionKey[er_role].c_str(), nozzle_diameter); + } + else{ + er_width = std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0; + er_speed = default_er_speed; + er_accel = default_er_accel; + } + } + + + er_width = (er_width == 0) ? std::round((default_er_width * 100 / nozzle_diameter) * 100.0) / 100.0 : er_width; + er_speed = (er_speed == 0) ? default_er_speed : er_speed; + er_accel = (er_accel == 0) ? default_er_accel : er_accel; + + /// --- custom config --- // this is for forcing each model to have x print modifiers + + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_extrusion_width", new ConfigOptionFloatOrPercent(er_width, true));//TODO: check widths and ect breaks if any values are in mm/percentage + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_speed", new ConfigOptionFloatOrPercent(er_speed, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("external_perimeter_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("gap_fill_acceleration", new ConfigOptionFloatOrPercent(er_accel, false)); + if (extrusion_role == "Verify") { + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + " ; " + er_role ));//user manual type in values + } + else{//add '\n' in? answer: you can, not mandatory as it's verified. + model.objects[objs_idx[i]]->volumes[num_part + extra_vol]->config.set_key_value("region_gcode", new ConfigOptionString(set_advance_prefix + std::to_string(pa_values[num_part]) + " ; " + extrusion_role )); + } + num_part++; + } + } + + //update plater + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + this->gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_printer_config); + plat->on_config_change(new_printer_config); + plat->changed_objects(objs_idx); + this->gui_app->get_tab(Preset::TYPE_FFF_PRINT)->update_dirty(); + this->gui_app->get_tab(Preset::TYPE_PRINTER)->update_dirty(); + plat->is_preview_shown(); + //update everything, easier to code. + ObjectList* obj = this->gui_app->obj_list(); + obj->update_after_undo_redo(); + + + // arrange if needed, after new settings, to take them into account + if (has_to_arrange) { + //update print config (done at reslice but we need it here) + if (plat->printer_technology() == ptFFF) + plat->fff_print().apply(plat->model(), *plat->config()); + std::shared_ptr fake_statusbar = std::make_shared(); + ArrangeJob arranger(std::dynamic_pointer_cast(fake_statusbar), plat); + arranger.prepare_all(); + arranger.process(); + arranger.finalize(); + } + + + if (extrusion_role != "Verify") {//don't auto slice so user can manual add PA values + //plat->reslice(); //forces a slice of plater. + } + + if (autocenter) { + //re-enable auto-center after this calibration. + gui_app->app_config->set("autocenter", "1"); + } +} + +double CalibrationPressureAdvDialog::magical_scaling(double nozzle_diameter, double er_width, double filament_max_overlap, double spacing_ratio, double spacing_ratio_external, double base_layer_height, double er_spacing ){ + + double xyzScale = nozzle_diameter / 0.4; + double er_width_decimal = er_width * nozzle_diameter / 100.0;//models are generated to be default width of x4 lines for the walls ie; 0.4mm nozzle is 1.6mm thick walls + double er_width_to_scale =1.0; + double overlap_ratio = 1; + if (filament_max_overlap) {overlap_ratio = filament_max_overlap;} + + spacing_ratio = std::min(overlap_ratio * 0.5f, spacing_ratio_external / 2.0); + double new_scale_spacing = er_width_decimal-base_layer_height*float(1. -0.25 *PI)* spacing_ratio; + double spacing_value = std::round((new_scale_spacing / nozzle_diameter) * 100); //spacing_value = Round((Spacing / Max Nozzle Diameter) * 100) + er_spacing = (std::round(spacing_value * 10000) / 10000) *0.01; + + + if (xyzScale > 4 ) { + er_width_to_scale = 1.0; + } + else{ + er_width_to_scale = er_spacing -(nozzle_diameter/2*0.01);//need to scale slightly under to help with models being correct TODO: test more configurations of nozzle sizes/layer heights + //if use has the 'wrong' min layer height for a nozzle size, the model will get filled with "gapfill" not a normal extrusion, need to test more for what variables 'break' it + } + + return er_width_to_scale; +} + +} // namespace GUI +} // namespace Slic3r +#pragma optimize("", on) \ No newline at end of file diff --git a/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp new file mode 100644 index 00000000000..4521e07daba --- /dev/null +++ b/src/slic3r/GUI/CalibrationPressureAdvDialog.hpp @@ -0,0 +1,37 @@ +#ifndef slic3r_GUI_CalibrationPressureAdvDialog_hpp_ +#define slic3r_GUI_CalibrationPressureAdvDialog_hpp_ + +#include "CalibrationAbstractDialog.hpp" +//pressure advance PressureAdv +namespace Slic3r { +namespace GUI { + +class CalibrationPressureAdvDialog : public CalibrationAbstractDialog +{ + +public: + CalibrationPressureAdvDialog(GUI_App* app, MainFrame* mainframe) : CalibrationAbstractDialog(app, mainframe, "Pressure calibration") + { create(boost::filesystem::path("calibration") / "filament_pressure", "filament_pressure.html", wxSize(1600, 600)); Centre(wxBOTH);} + virtual ~CalibrationPressureAdvDialog(){ } + +protected: + void create_buttons(wxStdDialogButtonSizer* sizer) override; + void create_geometry(wxCommandEvent& event_args); + double magical_scaling(double, double, double, double, double, double, double ); + + //i've set choice boxes for now just to save me typing numbers in when i want to test it :) + wxComboBox* firstPa; //first layer PA -user manual entry + wxComboBox* startPa; //starting PA value -user manual entry + //wxTextCtrl* firstPa; //edit to suit for manual data entry, + wxComboBox* endPa; //ending PA value -user manual entry + wxComboBox* paIncrement;//increment PA by this value -user manual entry~~ or have drop down box ? + wxComboBox* erPa; //extrusion role Pressure/Linear Advance -user choice select + wxComboBox* nbRuns; + wxCheckBox* enableST; // checkbox for "smooth_time" - klipper only feature? + +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index ab46ddf558c..4e40b329444 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -66,6 +66,7 @@ #include "CalibrationOverBridgeDialog.hpp" #include "CalibrationTempDialog.hpp" #include "CalibrationRetractionDialog.hpp" +#include "CalibrationPressureAdvDialog.hpp" #include "ConfigSnapshotDialog.hpp" #include "CreateMMUTiledCanvas.hpp" #include "FreeCADDialog.hpp" @@ -1981,6 +1982,10 @@ void GUI_App::calibration_retraction_dialog() { change_calibration_dialog(nullptr, new CalibrationRetractionDialog(this, mainframe)); } +void GUI_App::calibration_pressureadv_dialog() +{ + change_calibration_dialog(nullptr, new CalibrationPressureAdvDialog(this, mainframe)); +} void GUI_App::freecad_script_dialog() { change_calibration_dialog(nullptr, new FreeCADDialog(this, mainframe)); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 3dc7f0c9081..25654af8e90 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -253,6 +253,7 @@ class GUI_App : public wxApp void over_bridge_dialog(); void calibration_cube_dialog(); void calibration_retraction_dialog(); + void calibration_pressureadv_dialog(); void freecad_script_dialog(); void tiled_canvas_dialog(); //void support_tuning(); //have to do multiple, in a submenu diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 0307adeed63..b1deae00296 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1960,6 +1960,8 @@ void MainFrame::init_menubar_as_editor() [this](wxCommandEvent&) { wxGetApp().filament_temperature_dialog(); }); append_menu_item(m_calibration_menu, wxID_ANY, _(L("Extruder retraction calibration")), _(L("Create a test print to help you to set your retraction length.")), [this](wxCommandEvent&) { wxGetApp().calibration_retraction_dialog(); }); + append_menu_item(m_calibration_menu, wxID_ANY, _(L("Pressure calibration")), _(L("Create a model for tuning Pressure Linear advance.")), + [this](wxCommandEvent&) { wxGetApp().calibration_pressureadv_dialog(); }); m_calibration_menu->AppendSeparator(); append_menu_item(m_calibration_menu, wxID_ANY, _(L("Bridge flow calibration")), _(L("Create a test print to help you to set your bridge flow ratio.")), [this](wxCommandEvent&) { wxGetApp().bridge_tuning_dialog(); });