From 073591d60070f5ea8e4eead420e85de272134396 Mon Sep 17 00:00:00 2001 From: supermerill Date: Mon, 18 May 2020 23:57:58 +0200 Subject: [PATCH] Calibration help: first 2 item - bed leveling calibration - filament flow calibration (need some more pics) --- .../bed_leveling/bed_leveling.html | 51 ++++ resources/calibration/bed_leveling/good.jpg | Bin 0 -> 7936 bytes resources/calibration/bed_leveling/high.jpg | Bin 0 -> 10625 bytes resources/calibration/bed_leveling/high_h.jpg | Bin 0 -> 7934 bytes .../calibration/bed_leveling/high_hh.jpg | Bin 0 -> 10270 bytes resources/calibration/bed_leveling/low.jpg | Bin 0 -> 7917 bytes resources/calibration/bed_leveling/low_l.jpg | Bin 0 -> 10664 bytes resources/calibration/bed_leveling/low_ll.jpg | Bin 0 -> 8028 bytes resources/calibration/bed_leveling/patch.amf | Bin 0 -> 882 bytes .../calibration/bridge_flow/bridge_flow.html | 12 + resources/calibration/calibration_cube.amf | Bin 0 -> 598 bytes resources/calibration/filament_flow/0_v1.jpg | Bin 0 -> 4015 bytes resources/calibration/filament_flow/O.amf | Bin 0 -> 5338 bytes resources/calibration/filament_flow/_0.amf | Bin 0 -> 4448 bytes .../filament_flow/filament_flow.html | 57 ++++ .../filament_flow/filament_flow_test_cube.amf | Bin 0 -> 616 bytes resources/calibration/filament_flow/m10.amf | Bin 0 -> 8525 bytes resources/calibration/filament_flow/m10.jpg | Bin 0 -> 4946 bytes resources/calibration/filament_flow/m2.amf | Bin 0 -> 5916 bytes resources/calibration/filament_flow/m20.amf | Bin 0 -> 10044 bytes resources/calibration/filament_flow/m20.jpg | Bin 0 -> 4955 bytes resources/calibration/filament_flow/m4.amf | Bin 0 -> 6257 bytes resources/calibration/filament_flow/m6.amf | Bin 0 -> 6656 bytes resources/calibration/filament_flow/m8.amf | Bin 0 -> 7925 bytes resources/calibration/filament_flow/p10.amf | Bin 0 -> 10311 bytes resources/calibration/filament_flow/p10.jpg | Bin 0 -> 4908 bytes resources/calibration/filament_flow/p20.amf | Bin 0 -> 11859 bytes resources/calibration/filament_flow/p20.jpg | Bin 0 -> 4991 bytes .../filament_temp/filament_temp.html | 59 ++++ .../filament_temp/overhang_test.amf | Bin 0 -> 52113 bytes .../over-bridge_flow_ratio_test.amf | Bin 0 -> 626 bytes .../over-bridge_tuning.html | 12 + resources/ui_layout/print.ui | 10 +- src/libslic3r/Fill/Fill.cpp | 2 +- src/libslic3r/Fill/FillBase.cpp | 2 +- src/libslic3r/GCode.cpp | 16 +- src/libslic3r/PrintConfig.cpp | 21 +- src/libslic3r/PrintConfig.hpp | 2 + src/slic3r/CMakeLists.txt | 8 + src/slic3r/GUI/3DScene.cpp | 4 +- src/slic3r/GUI/CalibrationBedDialog.cpp | 216 ++++++++++++++ src/slic3r/GUI/CalibrationBedDialog.hpp | 41 +++ src/slic3r/GUI/CalibrationBridgeDialog.cpp | 196 +++++++++++++ src/slic3r/GUI/CalibrationBridgeDialog.hpp | 39 +++ src/slic3r/GUI/CalibrationFlowDialog.cpp | 272 ++++++++++++++++++ src/slic3r/GUI/CalibrationFlowDialog.hpp | 43 +++ src/slic3r/GUI/CalibrationTempDialog.cpp | 196 +++++++++++++ src/slic3r/GUI/CalibrationTempDialog.hpp | 39 +++ src/slic3r/GUI/GUI_App.cpp | 45 +++ src/slic3r/GUI/GUI_App.hpp | 8 + src/slic3r/GUI/MainFrame.cpp | 17 ++ src/slic3r/GUI/Plater.cpp | 3 + src/slic3r/GUI/Plater.hpp | 1 + src/slic3r/GUI/Preset.cpp | 3 +- src/slic3r/GUI/Tab.cpp | 2 +- 55 files changed, 1358 insertions(+), 19 deletions(-) create mode 100644 resources/calibration/bed_leveling/bed_leveling.html create mode 100644 resources/calibration/bed_leveling/good.jpg create mode 100644 resources/calibration/bed_leveling/high.jpg create mode 100644 resources/calibration/bed_leveling/high_h.jpg create mode 100644 resources/calibration/bed_leveling/high_hh.jpg create mode 100644 resources/calibration/bed_leveling/low.jpg create mode 100644 resources/calibration/bed_leveling/low_l.jpg create mode 100644 resources/calibration/bed_leveling/low_ll.jpg create mode 100644 resources/calibration/bed_leveling/patch.amf create mode 100644 resources/calibration/bridge_flow/bridge_flow.html create mode 100644 resources/calibration/calibration_cube.amf create mode 100644 resources/calibration/filament_flow/0_v1.jpg create mode 100644 resources/calibration/filament_flow/O.amf create mode 100644 resources/calibration/filament_flow/_0.amf create mode 100644 resources/calibration/filament_flow/filament_flow.html create mode 100644 resources/calibration/filament_flow/filament_flow_test_cube.amf create mode 100644 resources/calibration/filament_flow/m10.amf create mode 100644 resources/calibration/filament_flow/m10.jpg create mode 100644 resources/calibration/filament_flow/m2.amf create mode 100644 resources/calibration/filament_flow/m20.amf create mode 100644 resources/calibration/filament_flow/m20.jpg create mode 100644 resources/calibration/filament_flow/m4.amf create mode 100644 resources/calibration/filament_flow/m6.amf create mode 100644 resources/calibration/filament_flow/m8.amf create mode 100644 resources/calibration/filament_flow/p10.amf create mode 100644 resources/calibration/filament_flow/p10.jpg create mode 100644 resources/calibration/filament_flow/p20.amf create mode 100644 resources/calibration/filament_flow/p20.jpg create mode 100644 resources/calibration/filament_temp/filament_temp.html create mode 100644 resources/calibration/filament_temp/overhang_test.amf create mode 100644 resources/calibration/over-bridge_tuning/over-bridge_flow_ratio_test.amf create mode 100644 resources/calibration/over-bridge_tuning/over-bridge_tuning.html create mode 100644 src/slic3r/GUI/CalibrationBedDialog.cpp create mode 100644 src/slic3r/GUI/CalibrationBedDialog.hpp create mode 100644 src/slic3r/GUI/CalibrationBridgeDialog.cpp create mode 100644 src/slic3r/GUI/CalibrationBridgeDialog.hpp create mode 100644 src/slic3r/GUI/CalibrationFlowDialog.cpp create mode 100644 src/slic3r/GUI/CalibrationFlowDialog.hpp create mode 100644 src/slic3r/GUI/CalibrationTempDialog.cpp create mode 100644 src/slic3r/GUI/CalibrationTempDialog.hpp diff --git a/resources/calibration/bed_leveling/bed_leveling.html b/resources/calibration/bed_leveling/bed_leveling.html new file mode 100644 index 000000000..b102b3dcf --- /dev/null +++ b/resources/calibration/bed_leveling/bed_leveling.html @@ -0,0 +1,51 @@ + + + + + Bed level calibration + + +

Bed level calibration

+

This calibration is the first one to do, because it's mandatory to make a print stick on the build plate.

+

This calibration is made to do the fine tuning. Please level roughly the printer before: move your nozzle to 0.2mm, then you must be able to move a paper between the nozzle and the plater, but you have to be able to feel the nozzle touching it. With that, you should be able to level the bed with a ~0.1mm precision.

+

How it works

+

First, select your printer and your default print profile, with the filament profile for a filament you have. Note that this works with your first extruder if you have multiple ones.

+

When clicking on the Generate button, the program will create and slice the test print. You have to send it to your printer and print it. After the print end, check the result of each corners and the middle one against the photo below. You will have to tune your printer/firmware to correct the height if needed.

+

Results

+ + + + + + + + + + + + + + + + + + + + +
too low, by fartoo low, by fartoo low, by fartoo low, by fartoo low, by fartoo low, by fartoo low, by far
Too far awayToo farToo far:
You can spot
a little gap
perfectToo nearTrap!
It's too near:
check the thickness
with your fingers!
Far too near
Dangerous
for the bed
+

How to tune your printer

+

If your printer has screws, use them to lift or drop the bed below the patch that need an adjust. Don't forget to print the test after the adjust to verify the compensation. Be careful, most of the time, a half-turn means 0.2mm of height, which equals (often) to the height of the first layer, so  if you lift the bed, never turn more than that and prefer adjusting by quarter-turn at most.

+

If it doesn’t, you have to use the software or modify the firmware configuration, refer to the manual of your printer.

+

Advices

+

If your filament have a hard time sticking to the bed, you can try to :

+ +

Notes

+

After the filament flow calibration, if it appears that the flow was very wrong, you may want to redo this calibration just after.

+

Most of the calibrations need to done is the right order. This one is the first to do.

+ + + \ No newline at end of file diff --git a/resources/calibration/bed_leveling/good.jpg b/resources/calibration/bed_leveling/good.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ee032e80a407743dadb0c03be4dd70d819de7f0 GIT binary patch literal 7936 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/bed_leveling/high.jpg b/resources/calibration/bed_leveling/high.jpg new file mode 100644 index 0000000000000000000000000000000000000000..63db23fffcb017db9a4f7d8949a290486f16bc2a GIT binary patch literal 10625 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/bed_leveling/high_h.jpg b/resources/calibration/bed_leveling/high_h.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea7ed9d36e1926cf839d6085e5c579d58e05a071 GIT binary patch literal 7934 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

3Ktyp;C)!Hek84qNJ! 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 To8zKb>N=pzn#KI>pN0Pg!D8H2 literal 0 HcmV?d00001 diff --git a/resources/calibration/bed_leveling/low.jpg b/resources/calibration/bed_leveling/low.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c33b2b9a1ab99772f837e7204e7dd9b379fdd66 GIT binary patch literal 7917 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/bed_leveling/low_l.jpg b/resources/calibration/bed_leveling/low_l.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e708d1c1ff591ee4453d538dd55273c3d63caff5 GIT binary patch literal 10664 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 BYrp^i literal 0 HcmV?d00001 diff --git a/resources/calibration/bed_leveling/low_ll.jpg b/resources/calibration/bed_leveling/low_ll.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f54ad6219093d888bac8a32224b24e8c477528ee GIT binary patch literal 8028 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 B9oPT> literal 0 HcmV?d00001 diff --git a/resources/calibration/bed_leveling/patch.amf b/resources/calibration/bed_leveling/patch.amf new file mode 100644 index 0000000000000000000000000000000000000000..172cb018dae1d52c78cc5015388312735816c257 GIT binary patch literal 882 zcmWIWW@Zs#U|`^2XqdMlfUo-4wSP z-r)}Owu3bud{?u=ug(kK{rnW;^2DR=t{GFlTwl-GIL&bN6{RKODbf{b68k^59gyp* zOp|fh>VG;ZH;H>@o5mv}&+g}2e?I^ISj#|uk?P~0*D7=`Rpma*oVIl53fEM()2x$~ z=Y5zZ{q?2mnzP5fI^N%}TVu99bJ`!F_AL+pJ^4LXvX${xj`I^mM<%bAVMjbQWUebm z>v!yYuk<9pW()6(yN2#R4E@i%5IW)@#uh$(_I{;xy(W>fS9tpG-2Y&w!D8{aQ@>}mZf(QNzlNXEFDoc6S~#oiabo=pwoNB^ z9@@vYN*?-NXy^7mSc>KUp$nU**p|rJH>6IV+j}=b!fu1iqso0E^X=Pzc)YkE_)+nR zR_Frr{`XN=c$r*lZ+t3{;Cq~WnwMi&Emx7c%=u6+g>t5!BFhBMO**tfBz$qyoQs`q za}(}x>@)bnv-d`|uEzhP)87mJyOV2Bb9?6I?+N;)0{<_Gm1j1rd&sW&m$_&r_PoHDn@nG9c$2sfUxfi|@c(5=t zdi94nnNDF95y92(Of~(VBxaR<(6f^4HuG_eC2c$pCtO8Uv#}4#m*)MaBD3okTF+0Eg;wSk4Z$>5&2He>Mm{Y)DOCyMaXPN+SRyL3TBM_PcX;o$r F4**EBo3Q`@ literal 0 HcmV?d00001 diff --git a/resources/calibration/bridge_flow/bridge_flow.html b/resources/calibration/bridge_flow/bridge_flow.html new file mode 100644 index 000000000..dfc4dae70 --- /dev/null +++ b/resources/calibration/bridge_flow/bridge_flow.html @@ -0,0 +1,12 @@ + + + + + Document HTML + + +

hello you

+bonjour le monde + + + \ No newline at end of file diff --git a/resources/calibration/calibration_cube.amf b/resources/calibration/calibration_cube.amf new file mode 100644 index 0000000000000000000000000000000000000000..d0d300547ad274007b7f22846a4c82e255f65eef GIT binary patch literal 598 zcmWIWW@Zs#U|`^2NZhp{;Hk}(|7RE(7)&`C7(k-Qi8+}`MTsSu`FZilrAeuJiMeTe zr}_5JHV|k#e{#LUzI4O;E=F;oYr|~A-|jR@yHT3DfJt5H=hv-@8>G`$hkDK8{`9&( z{h0AK_D?s$FWq#$-MQ@CgzpU#nN9P#0`1dZ9RI%Dw@dEjtPQJ5%C-hbu42Bq z(QDC*x?u)KWlDeWN>*ht+SUKsbh6w@?0$ki&v)(DaRPUjS?F)KIQC$9pvcq%-MTD^ zZ>ATXiWEwk^Mq3`_>te4@*i_VJLdIR{5ZHd&HShSgHwX8Z5s;TC)J+Sa+qSQ`DvQw z+uQ#8PCw*Hx>lmUY@?Eufmgu`HdC(`?i-c%WJbxVFI!f4_xfdDmpgUW*k2_+l1r;y z5+$eJRNbiXE?WA3NT{BD_7U%v0je&xE=j5l-E*Yk_lG#tME(1}|-az}-v-o}E9r8|xs zY8BIq5VMwk9^2k+-*I>9$_<4THyt;gpZoUip&K`Mq})vVdwbcTeWDNJ3#$_L9atv7 zzjgYKWKDD5dspT%X|`AW-L{SU?)fafa~9uAQ(U z$j(^MES$dVYyO1Q|C?X@;t%jokrG@}+RyL3vBM>?P>3_h~ H!@vLlw(bnz literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/0_v1.jpg b/resources/calibration/filament_flow/0_v1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab198cde39650add22e996a559183458615b36e5 GIT binary patch literal 4015 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 Os^%qQYp_-mdF)@s%?I`X literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/O.amf b/resources/calibration/filament_flow/O.amf new file mode 100644 index 0000000000000000000000000000000000000000..702e8b729b634c08cd09ffa977178de532d37fcb GIT binary patch literal 5338 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/filament_flow.html b/resources/calibration/filament_flow/filament_flow.html new file mode 100644 index 000000000..8e4a93f65 --- /dev/null +++ b/resources/calibration/filament_flow/filament_flow.html @@ -0,0 +1,57 @@ + + + + + Filament flow calibration + + +

Filament flow calibration

+

You need to do the bed level calibration before this one.

+

This test will print five tests samples with various level of flow. You can choose the flow difference between each steps. You should start with the 10% one. After verifying the result with the help of the tabel below, you have to modify the filamant extrusion multiplier in your filament preset (if the -20 is the best, change the multiplier from 1 to 0.8, see the formula below). Don't forget to save it afterwards. You can continue with the 2.5 step if you want a bit more precision.

+

Results

+ + +

Exemple:

+ + + + + + + + + + + + + + +

So here, I should

+
too low, by fartoo low, by fartoo low, by fartoo low, by fartoo low, by far
not flatnot flatnot flatflat
But the circle
isn't flat enough
Flat surface
and good circle
+

The flow you want to choose is the lowest that don't create gaps in the top surface. Here it seems that the good flow is below +20. So you have to change your extrusion multiplier to 1.2 and print the second set of test (or put 1.15 and call it for now).

+

How to tune your printer

+

You have to change the extrusion multiplier for the filament you calibrate for (and save it). Formula for the new extrusion multipler: new_multiplier = ( (100 + choosen_number) / 100 ) * old_multiplier
+Exemple: first step, i choose the -10, so i have ((100-10)/100) * 1 = (0.9) * 1 = 0.9
+second step i chooe +5, so i have ((100+5)/100) * 0.9 = (1.05) * 0.9 = 0.945 +

+

If you want to make this change permanent and left your extrusion multipler to 1 in slic3r++, you can change your firmware configuration by mutiplying (or dividing, depends of the firmware/setting) the 'extruder speed setting' (e-step, step_distance) by this extrusion multipler.

+

Advice

+

Before doing this test, it's preferable to calibrate your extruder (it's easier on bowden setup):

+
    +
  • Remove the extruder bowden tube from the output of the extruder (or remove the extruder assembly from the nozzle assembly if you have a direct-extruder)
  • +
  • Put the filament through it (by hand or using the software control)
  • +
  • Cut the filament flush with the output of the extruder. Measure with your spring-steel ruler that you measure just 0mm. If not, note the value and don't forget to remove it from every other measure you do.
  • +
  • Ask your extruder to extrude 200mm of filament (gcode: G1 E200).
  • +
  • Measure the length o the extruded filament. Repeat this process two times more if you want to be more precise.
  • +
  • You have to change your extruder multiplier (estep, step_distance) by multipliying (or dividing, depending on your firmware) the current value by (200 / average_measured_value).
  • +

    Note that this value may change if you change the pressure the extuder exerce against the filament.

    +
+

Notes

+

It's very difficult to tune the flow below the 2% mark, and no filament is consistent enought to warrant it anyway. A filament that have a guarantee of +-0,03mm have a ~7% variation between the low and high end cross section.

+

Most of the calibrations need to done is the right order. This one should be the second.

+

You may want to re-do the bed level calibration is the result is below 0.9 or higher than 1.1.

+

Note that the filament extrusion multipler can change with a different filament material, as a softer one can be squished/dented more by the extruder and so have a lower diameter in the extruder gears.

+

If your printer extruder eat the filament and can't complete the top layer, you have to increase the ironing distribution (by 5% increment). (Expert seting, print -> infill)

+ + + \ No newline at end of file diff --git a/resources/calibration/filament_flow/filament_flow_test_cube.amf b/resources/calibration/filament_flow/filament_flow_test_cube.amf new file mode 100644 index 0000000000000000000000000000000000000000..6f5618272c5adb851d67e1292f060492ee2b38bb GIT binary patch literal 616 zcmWIWW@Zs#U|`^2@QB`F zlF-z-&yqfW`p9#Jfq7@H_sg6Gc`i$hp4?4%((ou$?@Do-ocud6&0R~251l#`slCuR zgiF(vQ!2~lxp9)0PWmj%s^9EJCE?6}{(Q{d7{xvF{$aP0JNMUAI+o0Q6uR+=1LBwf~ZT>zaRdnHgUMmq}mUQ_?DFxb9+;^XBlqE!)J653OEhHZQ3v!@N{C*5yd9 z``)E;YVXRfSZ6)SQ`n)-@u+Ug$9OjJZLaTk>&D%Ea8gMB-Idk9zuemW?3Uu51eR(; zIqyv?pX_RJc8}#=HcypjP4D%EXUi|tZ8!TYTjEf=xcT6@k3Y^A92B>xk<;5!FtN3J z`9mRY@wx5ZIx!g!n=& zqkhh$hkb|lk>7W`@7T>Oca2-=);z^$_Vpvj-{|?+2FuLZ_rCgc&l3gH?A-z~UhlWw z-nealy~p1DwXb6B8yR=aKQb}%vp~^V?~Zf#83Mc+nM4?HCk0??0D~=!APP^y2=HcQ Q11VtyLQf#g$pqp70O|}8qyPW_ literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/m10.amf b/resources/calibration/filament_flow/m10.amf new file mode 100644 index 0000000000000000000000000000000000000000..048b72a486730b1d2256839ae62381ccf7f3942a GIT binary patch literal 8525 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 a08)Mn8Ool}Su*hLhTNaLxkot{)BghFwD0i% literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/m2.amf b/resources/calibration/filament_flow/m2.amf new file mode 100644 index 0000000000000000000000000000000000000000..52b82d69c90c9c45cfa938643aab0b706f2f9738 GIT binary patch literal 5916 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/m20.amf b/resources/calibration/filament_flow/m20.amf new file mode 100644 index 0000000000000000000000000000000000000000..ba06e318a0ac9e497cb84276ea081fcf37265992 GIT binary patch literal 10044 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/m4.amf b/resources/calibration/filament_flow/m4.amf new file mode 100644 index 0000000000000000000000000000000000000000..3c1c288efc458d36891d8fd7847767ea82568d97 GIT binary patch literal 6257 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 PlkR&YD?$<$$jJT&Rhej( literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/m6.amf b/resources/calibration/filament_flow/m6.amf new file mode 100644 index 0000000000000000000000000000000000000000..5b65502c6900cd76426ffbf5fbf23769ed72710b GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/m8.amf b/resources/calibration/filament_flow/m8.amf new file mode 100644 index 0000000000000000000000000000000000000000..48543e259fc914a33572205f4b1eb2eaf0c778d1 GIT binary patch literal 7925 zcmZ`;byyVN*QcaJT1r}^L{hrD7g$PBx{;2hmy{04MY>}tDe001=}n3x7`W)WE@Hfv zE_Rc78?KC^sYCT?75v@>)03>7W4Ja?s5)tmkya>7%D4Fro3fAJ5u{4pHI|7r?bQ#P zGqtEqYg>#>u`Kf#J*@^j<$E|k>TKl$x8GeIo($X?Q*XUC?P?1Sx!6Mfy6x@mxGH$K zKO%u`^BHfLoAm}>Z11CdQT4p*zq*41Q74!8mpem?s14I4S<~L0o?fuW!|KC&Psi2K z$m(jyL+iuU)=0tc^`86sRr3>(wTG_zKl4M2Cgn^UHS>bMOg`^lPa-CdkRs(n>pZYM zi3-PY*}X&U_MmIp`TpK^aIgn*gqg2g-{Bq^&GY~c^m^DnK~~2*<}ltrpnm*z<*Qo{ zzV3B-fY0l!GWB%U6l~w0>|M?e=p@Uo-``vf_(DXPWP)nU_ipYlHhyf}1t154uFrqS zhTJ2#3*da<+Y9Pmb8QG;$OF+CISqvG;elC)?hKFEU!xoEj>=l%aqtPt!&BAcQ_G6^ zTnH(IZ{(|fE)f4NnxsMs0@?zNm%U*WxapeG+&#Up(tOxL7&N{@z<0PR=<$eT^DzL9Q;4LWqlrLQhK1wk`bau9N@kyIuZNhD5!5b@n#ZvI{qpY(%(@v< zf+Kh7H6%3A93o}4(|Unq-kdx|@Fltt#u(Kw;$=`!tntG7T0#n8#xZnhWNOkWVBgGQvSks>T4@9;3LWYp%sS4vK0$S z=F+5^5i(#k{jjC#RMG7<Hq_29&Dna)@J>trC+g5j0Ex_=+-9^a{cAP z%k|Y1f35zsX@e1L$qNF-7F2_AOw33$X+Q5;(>`28wu;tRruI5^FWg)qk8~#JZv!QB zhCGOavxgnl+DdI*U(_eb8c+A$Uaj8QWxumFSFO*k?A`|7dOO*6vXl#>@!G_LqC zq=O`f>{Ts_d8}Sz^6u@~zVR$}EJ_!&x`MC&z}{1u=XoOF(?HiD+&4zIZ9g~bgq5X0)?X_5C806O?gkYqqN2 ztL(ib4^|oX;W@dZi(Wgn(n@0qvot&(t^vpYYQC%szz_#KSCSn{UG3gr<0BUHJM+q} zJgfWR!&vCET_tgr_=y0^r80-RQ1(AW~sqJw><|Xoa|l?fty~;8^7f5o4ld= z9)HumFW5>Op*^AfT=3&OSB<6PbFo!nu-aFL6`tc2T)nTP07f#gx&a+8-m9ys>}~NnAd6^`5Y5pM2}gm1cAIFVM01@65obBesLVUw3VZ z6Ifp%lVk@QKrf~N7go04$8suk50)#Wo}9Xfx&lR^mmg%%jN^}yOpueR zK?kNCL;K@7-lec7A+u?5`M2RN64W>p&?j*u#B!+MX)i87oRqAt$j!SIf-0z=i8YOT zNyB`$5g6r2*K|~5wj&;pHII*b5)ooLw*u{;;Yq+}9h9;kCO&!v#=&dmzVUf$<=P9* zlOwQH>S2rAoGln(i)o$E=BeHN(XDe7dQc`EIg&R-LSXI^STLzE5wVt4)qnqpm0&}} z#A!n$VbdrEOci=aP^&c8D0&8ztbNv6{4{b;YXVLW4ts;T+Fm=|5Y1GDa zH$w0)_{JWxg`!{%BIMa3A|ABz=5=tj-pnhHI=ysZ@Vz{ zZ%m?ogAPzn7eQp*caO}_cFe68&~77d0ZSk^Ll>r&rcNj*s~V|ewQo91{XeKf2D_Sc zT65=}d=4D&N2}yC9g$o9oYXuNya59N)V|iTv@TgI>N!m#3AXgU1G(`1k%kRI{+>e| z=S>`ishX2SQ@g?iNgr`6ESARPLyDhm(=wQeksFqNAOC}gzny#;G_nt;K*=<8{D_w` z*3Lx*%E^fv8}d~n2MTy)j2mW^0%*ebtP_j_kMBwXi1_}H!izmGQKWEzu9?A#>5+|J zs^#$q2se(o{Y}Kl;mpv_liyA=)_z3=s>xd)0V2|uW)7PRXxaBof%D3J50>=W`>@Yz z17p-#V+>Ko2SuiJeuS1a6AZ=&3gy-xvl2MlS&c^yss$^`8#H`N(Xu#8`epyY?!aFS$Y>WcaC^$m}1T; z&LiqE4jT}iANV^)*QS6I#P+6zTc{bYTmMrA73#Q2iG-fs^YVyMf(%jVT<#)keUfC) zko|1plE;&ZXzS@6K4Zq8lHUD-lBz6NM$XeUQphwIsGNF1>+-5uDtxA?aB&h_Ye`ag zU9>LndH+yJyvy@ekDbQ{IQ@(ZHUS)1A9Fs@ApiEge4aehM=if@-RL===R4D>m|1Hd zCoaFSxfnvy+vEPP)Nuh2y42!C50jO}inL`?8CPl0%Lu!7+3t}It5L08V);JZ7D=&h zB$cjG8mVc%Bvo{kl8u0&BQg<`2Ez9eoT~5g-rE0$P^z$La@+Y_lrOEjX4qfgyQ+v~ zyrT!!FMt?SXUhM#0gkY~y|{e`=UJNE^g zW|BRfMuNHlF&k4ATy;k=v-THDi~|yVyNfM4Ggpq*I~in}1vO$xd#Q?aMZc}Px5PYd zZMm_}y$x6S9#i$2{$9e2M|lnS{1Gc27k36zRsN`g-;gbD)wT|saBLFwPAOLIBUzhp zZr*z2MOSumX+1`CElaSa(!JvCpJ0r<4>#uX#axUcvHU1izQ!Nr5W_w^c}2p)ZjgrC zUM+eAzr1|7Tt%>RjP#m995L|zgvIXRcqM{)k5#w4_X7`Nav$$;cyu-P`z+RnSmVW&eCv!x`Z2%wtDfPBd zUw<`id=?~)`53j-!xgZjbmUZ_4vL22FKEcVx{ijV{*jK_(D`&A(9s7tM3+WaK=Rfj zJ0Q9~UNm-~>to6f+apvHODBEjoxuXHhP~*Mw&>xf4t=J_lVCJOa-_^U%derhWt z1UlrD5!(j@-h;eJCtw8&$Ugle6|(|SolE`gfVFcmeSkLu;j}I z()bjds|F4f4C>J!)iR=~c>8=Ay|ID#42+-2fvV`sRFEm-&y~C{$NU|ixKGYgw_KwX z&~?R5D|r?r)EJP^Q;_h(`p+Hx3?r~L=YGZd^sZ}%aokRJzazT%*L1+iSBfaNO3{?(JbO>2mX~K}Yg!Ri?FV z?=iko5EXyH;Qtz0+}0fWAs#{u;BN_S!lf}uA*lUM|BE7~*-z2rWI*OV6)9W=XHd`aRT^Q|G|#dDVkQps zG6v4u>Q|Om*f!Q6%?+B_9J;LBq=-{}k>BLc4$b+Q?UzfbFP-hh@dC=!AkB5QsUC|^ zZx{&oI;m7Tt8|a6)kxU3Tt4A3&&cIG@%m=zh^f5n+A7{(7egWCYgF7ef%(#PT7xnV zkEi{SR`D9f7oWb=E3yW=t6Y%xWNnhRD(1VUR3&+>+NC7CNesK6H!KyZm7pwNfAH1ym4tI=#eNcYag5~wW*!|65aQ^h$ zp0~dsOI11V^l}YnFQv1P7rMK@%YrX-h zV-WstO?32rK`z^P5XFXl{|3OsZMf!BEYfJQq7kK|#^xmpaX&N9Kn%!IkIk7Hwg9%C zfuxdit3>=W#X*pDql3klMX~Vsm{IYsj1Dp#KiZ`u-gaG(H#{BTfvzSz$2J6c$04ew zwrSa{B!^f{;B$1fk3>``^XFEw<_P`7xs%GC=6f3W5f;CJo?G%(LC z<-=Lwf~;26$%I!c;9)~kVVo{gWWWM@&FI_M4G)(c-*)LpRojZ@YcmjqOqffs1Xe}U;({3cnd%Sa5PFrn&nc7?Sjo2WTwdy&sS z@5A#@-*UTSMh>Kpmbm1E<5%b#?bt`;EU{I9G*^YA0qBVxb2oX`&0JOd)`x21eSbB> zr+5(@_HR0}3!>I>Yz(-(W;_ZBvi+7xnicvCDhNO}UzV&Y!SrI)kp{+7ZUo`2e_u^o zGw#`>32-toRT5h;+DYRz;x681KUaQLu0=Y;#Zja$ERRcpqvd~S(-Zco5)L9wV9;8= zv5H6n&SOg}T8(SkpApv46ua{2szy@kNGK+!$a7tL0XI`*(&`uf<}z~upq#UdAURkc zr7a^_kPosjl0x51+LM~4SVo)b<{}Hel9EnT3aX+?^QHdBx`|CmSJQw`h=hHLXBkl$%7!$Ks{vW<%PK>9F=nI)#OF4r^CyIVr@eLO~09X%BL zDO)3H|9cEz*%k)r(C|4}u?bt>OjPy-P~1tFPZ@vhWy_mPRr>dmK3i){Y`F$;mhmw+ zv@I-Zgy4aCBu{q$w_f1B#kl7FK2AC3?*w{sU{{4;WwHWI zn$C-4(wgj*qu7_K?5f>GLgT7h9*5uO>}go8O9${V_01)Whz)tFwF$}j7t7L|;#M?; zmj((cnHTkG)r6H@to5*?C7BmD$#`&~&lc$tzBv7&s10L!*7=;Jpl(J-3>eETGc;E@XNs8+ z>XD}9{;dJ0TtZvrOfRrj#Ey`X%?dids~-Ins3SpwlYXJ1Ghqj&v$p$0_gl^OQXTHpcCU zKhIWrKrhkc{3>dNZPNp2&%fyS&8o0QwmQHIue`(iCWgz8q57vV-IImIH zsF3YSY%=|*?J$6WP9C;R?}^h8h5Q$4)S)I(`^83)38(!;h;7PTxLaI0~Mq+SZ-X(2~f{m6m>Ak8P;~*%) z4wkam4ITe$EG5$4#7EsL@l4q)7p^J5DIW~o<0B#*!p_j4TrYZFx#or&`?6#!Z6c)o z79)7ABSL8Cnag=+K@ewL&%&9T#?+^=JjSb__zRl~y7QO{9OJ zr!rysYx6aOi=wFbNNjFulkh0JATvW3I*nm2d0TPeXjjdTtonZ9`e=>UsX{(-uzZU` zVY>P~Ph)^R%JOQr;{7c5n4d7@rHj0b@Om+9z3Oi{hVXU9o5mk+$GPGuf8X-#rAOdT ziN2`hsbISyGeF+-eG-Y>wblKdGp90ESQECTWxK^;O~n|u_9xu~jA!5?w$D?rWRTBw zB>VLf-9}uxpHuT1gSU2r=u58m-PN{774{vB5HXC42OW zTS)QTvzp^Hg+aHys4ZfeWZ9EFQ&S~Er7m6Ugb6~@$v2`4I;}0REU)?Y`r2vg^SM)<2#W~2 zP2Y~lwNp}@9-e_K6(T+18)UBc@ERzXcA=*=8tU!pBs0Fs846W?Ih=3CIVB`M*$=e~ zAKzH0`Vb|PF;5SeWs-+c4E-8eHqOb;8Bi=z&`ZN}{{68-Fio7I2IVaW6EWV8r_~DX zoc(zaSIGTjb_Esse>$L`oIAgoQVvwwOH5 z=@R-Gwqv6?(cN%IZUb>L>T`-*kF98J@x7-_kAqfVw>ZP1czl?6V-dc8Uaj z+NB%}@6Bgee}?L0uD}c;Y@7>lpx;x^KAkQu6Aq;{mS{6@Fy|KvdHjPJD?5TbUtE_r zN$E!=Gw5D(=>e6w{t6m;lT=F0UqpiRSE&PbKZHXkR7t~>vC6+1An_46!MHNA$yE~i zgJtx(EfonYp`*~}`p-7Ez#;qOEGPNmEqhTX zR*Yy8b8hWH?YUtrY~j%4=^2DP2aj|BpqO6{32O?BxWGts0I(u@u%SJU8WoV~luFwz ztx>^e4W2EfaG=GgXb9G2Mn+rY2$;dloap ze!P!p&8vMLBam655V}c=)0|`J=PMKgg-L4C1LtFzX+q@g?7FP16^RT0K1Nb7)^UOlq-Wt+60;T3_<$5fDAK-NP_yT49tIDt_E0$sbQB-IzsW4;NJ4Pe_E0L^4zltPAzd2E)-3wZ~TEbcR`4%-q>MlfOLwgpUu zh3m4G*R?;WKMO;4Du_7;M*dAnk%DD(cW|o?zpD{nB)XUC=4vi=zZ&v)(ic+iwy|#h z5MZc$n=E^`)7pD?y}H2|a(jkCh$4GQD6WWZ_+$B^dT#E|VaQHVDUhzRJfPhI$Uxy`>? zPkvudG7)x*tUCh}cw8_%e|2(_T%uFp9q~;07{b|NBRDhNn~CcW65q2MkG;?M>vH2X zw~H-fuNc3_Y{02oV;JxZHrs#%La*2HCAuFjpI5=pJ0S6P|Ci(b6XA;&=-K?s!-Yh! z7U=nCaCzFS8~!}1ez6(wcze_-?7Z3S>wR~19u4N{em?enS{z^Ik?0P9UM=@*2EzYM zORTLw!F!&Dg*Tu6{XIK*>3~0|_CHN$Nj%>i#h0{QbW0d}c^5gZ-af5YFAtljhy)aj zS7-UVIlVY}Z)P1#iac{MM1e)0Es8xrxhNa z?iG*(eE)9q1!mE+0Cd6fiz${UgdbdClO zk^x@&hm_Tf{&Z%ZB)Rc92FYGGlr9JXc%0(Jr_6M=QMRUm@}kNX=KXVh~&$JFi;!BoQI z52XlH8swpX^qlfBpLcNqjB+#Xp|v>Bv92~(lCG2~yd3+9CKaS7(%7Kj&1c$8> zYTakqiyJp?E(sQ__T@@A2UUA#_4DY%o>QAnmI6EOOF&-13%|33Hu0#IKZw@c)K5#; znY7#w-Z6t~Vbn>e+)gGpzC5*iK`YKqI{q-aiW8P9L z2Xwi$_09*W`x@;yo<1Dn=ZRjgg2;TbJ?Ae(;2Rr}CFw$Ve+dnZD^{=fVg0DY1$Pu} zm$&s`CTyPJ{<|Pk$oZ0I&sM#iUbQ|fV|mBJ^I%fguN(9)$#kll>;B(!8V|g^uX^LD zd#|6oRi3g-|6;+lPtizE-?i54uIOh$64NBW7d!HVJEHOPx{0%Q_M;cd#nFgU_hilT zhaRgA%HeK0(B28x&>gq6$%E^)gYm>9dj7ixYS%skJ@2QV@Q``t53OHT&OoiOj+2r* z2QSFo;_2sQ|JFVGc`ur=Kxlw^iBpGPv*T}%(cy;=;>P)_ zO6I$K+*eLb@iCu&>h#d1&Y!B@Si^uzOFLlfFw8Rs^3(ec3Jb&f?I)%MVp44JEK=_( zuc5(>8DZ}pN9

o}=VG6lW>%9FJ6b-+#jZXtBXRkGd%(&t> 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 Qe7%KU`^Q(hAOgbw1I_VxE&u=k literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/p10.jpg b/resources/calibration/filament_flow/p10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..024dd672a9b0cdcbec1e29c2a9a1ffe63f58c916 GIT binary patch literal 4908 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 literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/p20.amf b/resources/calibration/filament_flow/p20.amf new file mode 100644 index 0000000000000000000000000000000000000000..e09d23230a4a0beeb955ffb420f5035c0448eb9b GIT binary patch literal 11859 zcmZ`~-SzO=do%i?6 zoYOPaH8VZkRrhvvoz_-EL?VQPgF}V$Novxb`)HH9%LNC=DUJa54p!^N&&zG;Y&TV~ zkz^*~5m|p)h3k24{dzWqHA;?zhSGtZ_AaI3HUZ_4Y`MvDdM;YRIeMAPH@_VpvUJ=+iT}Z4Us?R9qYC>x&yt|Ax#zMKW?vv z%w?B*HwJu8SC)D$$?thAy8IuXmlO*l)bd|%pIqO(@2&>EE!FqG56c9g1G!IS+1sJ$r5Qk=lCOkGJR9>V4}8$t9r)euBO>7Zru* z7X`gQ&wJk>55b30_mDf9=UqS7Q<`3xK&%9Ni?=OBK+RD7@?J%)%XRXnInuw@A`fqk zL&!A3X5)>nU*>Mopg)|cr_Slp!}fOz%}iW{qO2XeO_RD?PiCHVlDNtqx|ySAs??T~ zPIrgp&UH3-9ves0lIkWWz88savtlzOGf|I7T>qfr6HGoYY~ybQD4xyS8(N=qoGrTv zjo_MP2Ck_Mrqw@XF7iAC9@b69b6*dux$}B=->iQ;R=qQ~QazRm>N*j#o>-VzJbin_ zD&o0`Y3_Jnzk_IdCl9NsK*7i2!S(Jw%btRlL3DyRawNLd$d$}EyKVlzx6^L9hR1$a zsDYo(tQ~HVANM`1CEUo=eNVd&N>NHHBxKXKkOgPul^!d^nJCikd=p()M$-=*peD$Hua7 z`K}uY^w38hU8Mr^7(QOmwWRA^8TktBb=4JH(#{a8R^6kv)ni!SG_R0TkDxZsSjA#2D!gfoe!KGJa=7;bk?l& zwNfs=W`8)J_--3rW@q%&(pPu3*kh0dC+kzgckOa0X(h7p=NeH+Frj;J)|7kpbkxh- z`*Kz_f&1)qvsd7|-iI1)nE@^ucfhA7uA1RL?s;pD06V>{^4;=}*i&IPu# z-e-ZfFZlQ4HO{hDnmSC`C?vXk$EpRRBbP*8eu!AlEuFdlJn1yR{ygV8Wqlt6S@A z*=3L`_i=Z~Htz^H0P1ze>lI|3f%0LA$1kW?Y^Brbv~3Sx`R`O#?)~K*!+pL0(|)3R zgrw_?<t;npFG4S>WK&?`Kg1a>~S2s>A`yiJLyxx~L!%-y8g(u3F2b zftKwFCh9z`uzB*IAE3MPI084HTMBP)ZkaKojPsj`f~K7hFN&=Oe+YS;c}P&=3qcc^ z&1F~Pro-0SxPArH1+-GToHhuu3D>rHzieNTP0y4fUjJy0wjgl)bNRzC`g-!BYI`1& zd-m+l+@6}s${)JHS4jy8@N)eG?b}|N=yG=B8hfem#;_m>@!-vOY69;yV#=NJfn+Jw zyruQb&V`#ln|qShi)x&f-EwmjuI{%s0lRD`+!4)nd2@cf3u>3j8q0(O9%M_0H`d7; z=`8IRYm3;)n7*3D-3cnw*a4^Go2PH?v&nl6f1Z4JI<^PSXCl{)WkEB`huBU#c#QdD z881#`@FrPeT2BBLM#nb?_XYvx*e=h5*>OffCDD+z2cMnki*Rc zHGGh@3l|y3cPH$nq0cEc9G2L?1Zf#Jw?9$~JxjLT7Fkakw!$Ljb$7=Ti{5rfKa7qZ z=Y+0nK72|g3zgh&2|gOIJwI48trN^WC!wG*In?-W5; zZW~j^RccCIou&M_NlwbZ)%}zx3Wj9Lhg5G8dw)(p=FPhe24qo}WGsaehId}RgnQVF zZsO!xop=>@biR?F`8EkF)~@_ncFE%=@kZ3|93|=X*BYm`FE|eR24;sQX8vP4Vg87r zX%Ku~=sd{9eQ?z9S1E;eYHS3L>q>NImTB;l+hdY;JmQiqWdoBF^zU)IslWE9o+fe8 z6)HAmRUiMj*Dco-2-_$7UP@NcdfsMHaH}lJ3x_)YL5Gm+_+%A-^ zj+V{%+^9I#%(IbKKScMI!9!;M;qGi;p~IYp^7OWKD)HcH{ij?P^RJBdjg!{kMt16s zw)TUSu3L&z)?ZicUEZ!9*xI*cTvUE9Eja93E)Amb1NJm{mwr`QfWs*n3mf^!-F!Iq zGTf^RH@jKyjO3i}nol~W?W;l&56V5& zfCMvvm&!6LdsBQ2OoBKcnh(0kvTi9&1%pU6>(ecIb zve{YkQe3UrJ24ZSXdFYar2M%Pv+IBawPUZXWMe&08?}VfhLLyOWaaHRbQD0eHP1n* z-m^!`?E#sk!<%n2y+~OiC5dy+lYBg0mOLtn3jSqIFT^Z+nRAajOWATb;R0nr`>89jhkDzj0aT2B9&sLn0|8@6Q3z?GBhS^c* z@Ziz|`UXpncpkTWUfmEcN1i7Iur$0yiQ2s^r*-{+!7%wkp;xp#4!=t$9Y2T>qmBGv zbjHZLFSJ_9ip3#s?iYjStZhzUp#iP+RLKgrbovk%in);_K6d~!}g?I^DO)PhV4 zk45*Ln8%!J+6Iz;!?0RelVT5gXS=AO(!>`tZJMXlAWz98f3Grti{$Cg@T8fAwp^YW zKU`|cev+l9!Teilw6MRpY~6}HSNVw)9e5-gE$-nsP%kT+a&Hnf5lZpw+$Nu*0Z4k| zN!JqH!J93EhwU@ulaV`?oVSw>r51HBbmfy^Iji{MOnT2(hdX*4+s6Y=Ut_%cu=09;cyaras zELHLZLCBnHP8I{f33-VaReDgD!p(=7su7y*;$7&ywIRX}*y{oDA(I*cZ7H}NUL;OG!@7bd{rUFA0e>>LWz0e0k5Jk9Fly=+QZQLQrz|9g~fA}q&yB8?^emx z4DZo+=H5Z4gDA0xNZWMg)_7(T*|}&b#_V719&%!lLAbdLs#yKc9;>}7NMz>ZgK=UW zQ_V{)dS9AzurAuiSU>R^q=vzUB7FoSkMaV2w}9*6ig$lWTBwb`FHj|%#&9ZF{PthA zJMUiW=4T|8AfH~Fd`~Xar^%pY%PpV0`$C^gM53F$_1~HEIdu!c>BbYXb=GFL#Z2(v z=g{tg-^m}6b4Ut>OXJh+i$=VxojgfG2J(dl(I}qkYJlU-Lcz;|O9O0Sm7L*!b3qZ{yNfLkrsb%p<7jNy~u^C2+&a$IpENYMhXx~u21 zQ5;G0te$_^??9KBeGIXFw7W25aDvOu2B!LW(m%n^Q7U|3q35BR7${rp)7OPjI?qw+ zWe>SC9Aul8I%)d2ShqwUAh*%&{*f=2Cjwj6iw*k-@m6iH#PyDxN)|P(crk1d8Lb<+ zt|-{rcBtiFITk1NHas3Dv3FSIkX2qZ4M=bQGk{S)!Abh~P}OTl=~}hbYd&+oa#x?_ zrjaCezDZ&_fi2O$=__SUO1YJE(kFt7byxMe@-4bcm3-ke@k@`G6Lizt!WdQ4hh`+S z?R{WJ5O;64i(s@#?WS*hvpAo+y4&w`9qMJHZT0-6U9;`s0z+oA?MX_I%u$_>{czbO zmq_{JJ00=&`JA(Acb~IY?Ja1`e?LALeliqIJ+MGD>thvv3!4w?M}=fOAWw1BPf7(l z@tcn0?FRm^$m)(C4Zj|L$;}ST-nj3%RsDq>(YYCzU};cCp(b^XeX@;*#Es?fClKw! z73(8qq?me)DNjZS+>kw`V4W!8mYH5L8cKapQ{(+;W}-IZsdKNzeM8_a*2=jAl8CA9 z*R|2Fv(2?LeQgx``^$JVR6DhK(W0NpjlJ7_ypVKFOQa}WEEM>+bfDfpDt({M(SLex5?Dr9OIV) z?gON!9=tB1B-#GS$BW~w<_tO?*sJGn>eLxx&!@KWo%n8*d3an4J1W?h z^w7{?LE?G8#Fc+smjLkE(3TfIITFL-R1CbU8JdycZf)f0M!f69o2BeXt;kO_FX>vaLHz?4B@3W-q^k_5sXH8`Mw!=yhKjoP(&$xe%;jm zfG>+&(c${|o3fnd`<`x#nX3DzfQxE5KH{J@A8xYvA4^{oG<*WAJ-1)WT^0`QPgdm0 zpkTS_-|ic^N-`ckyiaUeUjz#MKZImaeSQV63bhvgME35`s^tID6BSOB|DCvl5tw|< z6*B*~PYrcDH!0sli%IlCZRF1rohvSZDUiMXDjjDa2OtU>S(%^f&u5W$| z7EgAPZLd-^oVnC~8w$CR#ZAY1kc@@bkX`lc<#yY?T>NONi{h5&Pq{zdrmP|pV`Cp~ zbgY%V5Sc1Mo+RIQeGzPecFeS$y%r>wu4f9c1dFayr+)713%C{mGtt-&J^eYD?jWiw zY7@aQAxX-C-2v=~1-b9NVd7a+@@A(;mf7$2lsez*#a5@Gu>A}MZy9Ks;mhCCc#=+{ zQx3Y?5m$?G(%Mhvqk4c~sBWgW0yHe7qx1pV^OCkWy=9*z7y?LXvAeDc_l3>wRBaYb zXVVAZ%#%lGPAAb6Ms*Vt^IhOSrj*5WSAZUj;c;jNM3Og^2F2z#4z5W|;~H&$F0x1E zY_~^MIU+Kwg{ssLEloiA=7|iCp{XrII+6d%%Y0}c2=?;_a$K>y1dKNtJ$Ogc9p&8r?DJr}(`~CK|b`FIGAKkpY zt^OK$+YFn)`41WEySkfK*hJfnOH@4hx^UlVTVLzDo{jH)R5j@#{frm$gAbgdE@qn}CsI@wmo6t(1qTpqyaPzkB-A5D zJSD~`v6KOR(9axOXhrz^KWpJ1SN2Hs%!*WkxT$Msj{RJddAKyXo}*UTKHH%`i{oO< zVwRf#E_>XFT}`yq^?bCb*vdi$BqTl?mi zv#jOhEA-&xDM;5=V|U4*xB3-`MQ}CbPW`jZ0*Fu@Ia`C>S=H(7CA>W~EeZ8Wy7-#5g6FNJL(YnF6kM!ys&~ zw;SNn4%8D;a}4!Rsm|g>B&6=iC25mx)LfWvM~*{!W#H6HG8e8oVV$hb9d7fF(_*K2 zL_#iM9^WFYjS0YjF5i~_R|sMYLL?jv2ie_lX*U_T{$RQGb9pO`8CA-d`NYNA&T>>e zGUs>8u*Zb1i`ngw5rr!w#>cxbjW!z_TAi!2dGVj(@&ZI97qvZH$Ci<_I1;=3J+#^<6 zcN0^*1twC$^GrrH30>DwyzQI*{e-68ptMUjjeq-TU^r{(8$7y_Dg^QCw{RCQ5KB|M zc8<=3MfS=X+?sr!Zgj!^7T%q2&r&UcT7L0gm@>O+E+S zU$TiZqxvFM|P z&C_83HzCWCA2kkB{qd<$*$;Ge@(M^l7<{QlOAx~Vp0UMLG46xVR*`4 zsdy~j^;qD9f(@vV|HOLmJF<&~@_+hzq~c0SsQU$|6EDwP3eSE}B^Idr#Ri_zh%F2} zz_P(c#tFO;<>Qn>v$?uBKvhHF(7-~bv$2duU&@9py^^g}WKA@!QThPtDsc6XCBWES-oK}Eg1h)C+Pns&h))~>o{()fis z>JnKoKU&TJj*VAMmLF=Iak0pngsMihxmXh+n)>{jh5+q1&L(7sMkMA^@_UgarjN`S zk$KX`!qPOBY0Ek{pAc%+5HhM_Z_&IK9mn|YBxo0M-c^gIa?}nZ=3MeiFW_FhNZpfq z0u-)kd9!zr7Qz=oxBf}X9+k5UG7H;teDD^!IL6S;k6*{>)Ujz4Dm;cUhLN(b{^A(v z4!SOo@5o2WSb-IKO-p&1z(c!J#Mwu`Q9kdj>wL`{3($S={~3N7WxprbRxGzhJD6EFw_jGJGx5h_WQ@Cw^H3l76%nzLnKbq^i7X z0zN))|3@fqmeFtte(FEvf}c@-P?O@kK#TTyaxp(nygh4M^^t@e>l{Kx^mG{#b%)8* z^fkSVEravdQeoz?44FT7jD*n=!xw1aOcbX1VMc>|5ZedqTlicc{M1v4B$EG=JXx{h ze@L>8#Gv;&xMCW$NvUc)#nTRcN0z#8|CPY4UkA;G8RWEE)U0Rbf zH7%Jyt~Be8)$cw#XdZRUG02S(zIxGk_9V2plK6}nn2)D-%G|wy#lL-2>neH?!-icz zLY4AMzb*=C+u8~&XRk~W5g?YExFcybE*GuCOs5x28ij$D?cww;h4DRjMjc3s52O;u zz)I7ps@pshE>ud`ntX0e?ZfIUZbn@5kr9 zKmg=^N2io1R4ijwg4u%y!%THKXBcp7=kCQH6m($^<@ ziS=E^!eu@bGFUF6sAEqYNp9Uj$pU?LWr$I+rl$V3|HKR)|A?ZoijWbYilLx^uD>4^s)h)peswD0k3`=C z-GrxHeK~>NP1epE3IX`p?@-wd;TWQGOFl8URwgWWBC{t`pU*(eXpB2Bfs}~AGuAyb zBdjV8Z;wJ$_6d&ubnOb6#7#S(vq`as)`Q0O3Fupq`>C)rWP2`Kx+4d-ys4s zITZL=l{O3Zy!;V>nO~7}XrW^C`am&;A)C zy6>JE)$EtS`RHHMXt~A9TAL22Y}C$O0VS^*faPK;8THmYi3PebT5(m{GScjw--paH z$ue9_Q=_l{q`r?+xYj9%R?5?4Few#zRNG2hVOBsl_}}Lneh7Gy3XAdiA;8>5^nz^s zBbX+O?)2lwak+!kzAU`GHpPY=crf{HLZE%+qI>$5UnMd;=>4O*j-4u>&4V-FnP%8{ zeQV#cPMi#p^7!aIIm|$ZD;LI+Ubh0*RR0i=Vl^7o6HabZB18u|TDgpERA)nZ*bHrA zfti`jl{(!jB^K?s53lsXHdJgyeFe_z+#c9vTzqw5sqGT1O}K6(JD#?>dFurB( z^_`G({R-Yn4=BXP1lKB{1i+@HfN{yV_7n*%iCmZ9EHQyWWn`3`!HGQ*8OT8rnPVA3 zIG8Yv%!vW!MC5>@K@bJI++rV$-ji)rkx}#mSkkhrzJd+;J*Ywd;qFm+p}@L=DYalY zPnB_a4CB7wuq!`Bsz!C35K`Ts>`)SXRt3;GzKvpJY_&H*RJtmjBYkQP54%Z>+=0Wp z3RHb^)^B18>h6DAytU&}UUVwOL#we1&REmwfifGDKl%9DLMi_DD=+k=K5j-L29$-YbQ zaT*YFH`Knhh=mtoKMJqXhXs1kRqf7~6liBTmI)P*cDF3OE%7ZSmOVciCV>wE+|e{6eIRf;itz z>HtX2QzrN{IUY5o35AW;ShPHe5(e7VyuAV)cbV=czDGIr9N%y+q^q`7HEIH&zaHO% zP^zE~jv4tRnQrB!8<}OGWD5h zD0&3@g86^zyu3q=ySm!6m1Vip2*zku|eo@neu#kG2p+FLYve>X}W9%izfuY;Fb7uTg&?^J^JARJEV*)>Y)3} zDaKwm`B1g=E#@0$tLu3<{b*MS65*}>H1g8c&2a|Mb0?eyCmiS*q2Lk@NoHY1=~hgp zg}z#BBjThP8GIJBYl&9)bd<(#&PE67D!aeptW9S>`m907*<1V5Ny0NSR=1jDIFG13 zld%2Fw4yVr&r*-`Yr6M2*n8N}Zhcr<$g=grh?brG2qOwb! zj*y_Bg1Om{h6!vwr>PP&-U6f{ZMgRc*fFUpiLPYldSt~{d7kS!fl`{@%=cFGoV_RN z+Tx3F84p;3L4@mBMdlDlf@DVGb*wA+ob{Se*I#7{gGt_>Q`_qnODmU;a3PDISW0HW zb=*h$KQVQ1b|T&>pFcQkHs_<(0(#w`PenrE__@TDt?bwF+jIhC#Sgk=PX-ybyRixB6d=XF0^ zGk0=$x^0~j4k?WXCfIbn{GqIXT`QW9d(flOO%SvjsWij{DC89@>{ zwLH7>8{cK+BLjpu?WX|J;m;b?0qEL(rK~jY!wQ)g&PD{*U%}#WO!1iG)JO7Uve|)O z_|N449U#Auv~8pDQ4#_$gz7w^ zGw0b66{1Hg0j6*;kcEY!W`gOXqJhRqe=Q5*II|GGRU}_DN(A;8sm?T%r!^$7P$v|E zi&+HcY~IrA5y_jPnl8}nY2H&A6Xy!Iye#X9@ea7Y54Y>+Tqgy{K>ouFi0kI55;Gb? z`~4JEF*H3A)P7F`Pq+nK9JeVUVPl9sx*@CQZLDfqlcNIM0A>kO+_nb=8#+Olr%*OKZvq_3tkP*8>^^5Vc&V#7$EKR9L!VtM- zVo+dmDMzeRd0;L%0dke00j6LkA*J907L{B`CZ3?5iq2Acv7=U^(u-TNE>ve217%e4 zXy(hVv(eXao(^)Yj;n;U0`u>BVc>u*-;vDXqfI4Q=8|iH>LE(BAvaD1*Z|JDDDIRM<>eINox#Q?;(v_a)Al*>Xk|z6HctZuNIV zm%}`0ISY)%YMXWk5CWm+pdJNnnN+nagP43WKOsleSBhd>=`3C>T=3D@DbVEsp45jZ zijT-5ZJaFI<&ui&R$*94-Lz6>l`B=s;AvQ7v$G&J+;$Hu+@#^v)k2H=V!>r!JZjjt z8)vLZq4z?luXOcZh*QenWd40mKPq_uyOe}%4mB#m1+4``__5{SS#tp&!d_6ZHYZ zuvPaOp*~pb3K{ zAqJ2N5J8MigJ7`Y;TZrU+j~%aPcL#HCOb`F!YwYaN0C1`uBKyM@3$+KcB_1Oac)`h zNhL^M36stk7TMXj*;p}vtL=pHAh|u+>@x$5>XmOK(2e zzy86EXM3hLr(#b23(!i~$0v4O=rcMZ?3IQa(}Z@i=nu*;U2tHjmt6(D@bF4Se=cUL$Z4>!=Fknt;>i zlA>l7%0^|cYn1*u@GoGGz|2gal#K34hiAv3xv5kEz_D^1s z!i#c6c6wBBluVz<(C6t#c|KRiuj66>qu{V3GV`yprKWF{UFY9;87&xc zlET4%?J8ar_*{l?TrvD=HK zXJsJpz(lT0X5^Gym(f=I4TPnL`mZJi?DJ^^DPMZDv}Xq)q;c@$qP>9^eX1pkra1Jt z>GJ_EdHvTV5yr{txalX>LH7;1wW8_as7OpzhBN@pxnYd+QwQs&y_@ab1jn{_c&O-D zgVUq{%9i2n2?O-v6!w>d?cL#}_Hy8amiFK4;Nc7Ri_nlqGJuryC4C+sa8mKs_%=&_}+52#LdLuI36C7|iVDVI681(YG*1OUD%p3f0_41Pju-@$l z-5EH(J1^`CzL}c4xPHvCxGU=Qy}LRad)az9C1W*1cz+~|KFn}^xx(G W_JwP!A*1{g;bEr`?25|$Px>ESd{%V; literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_flow/p20.jpg b/resources/calibration/filament_flow/p20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2d6080351ef69f5ee7fd201271da54f3c3cc190 GIT binary patch literal 4991 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 K(v}$Er~d^{sM)Rn literal 0 HcmV?d00001 diff --git a/resources/calibration/filament_temp/filament_temp.html b/resources/calibration/filament_temp/filament_temp.html new file mode 100644 index 000000000..2d75a944e --- /dev/null +++ b/resources/calibration/filament_temp/filament_temp.html @@ -0,0 +1,59 @@ + + + + + Filament temperature calibration + + +

Filament flow calibration

+

You need to do the bed level calibration before this one.

+

This test will print five tests samples with various level of flow. You can choose the flow difference between each steps. You should start with the 10% one. After verifying the result with the help of the tabel below, you have to modify the filamant extrusion multiplier in your filament preset (if the -20 is the best, change the multiplier from 1 to 0.8, see the formula below). Don't forget to save it afterwards. You can continue with the 2.5 step if you want a bit more precision.

+

Results

+ + + + + + + + + + + + + + + + + + + + +
too low, by fartoo low, by fartoo low, by fartoo low, by fartoo low, by fartoo low, by fartoo low, by far
not enough flowToo farToo far:
You can spot
a little gap
okokTrap!
It's too near:
check the thickness
of the patch!
Far too near.
Dangerous
for the bed
+

The flow you want to choose is the lowest that don't create gaps in the top surface.

+

How to tune your printer

+

You have to change the extrusion multiplier for the filament you calibrate for (and save it). Formula for the new extrusion multipler: new_multiplier = ( (100 + choosen_number) / 100 ) * old_multiplier
+Exemple: first step, i choose the -10, so i have ((100-10)/100) * 1 = (0.9) * 1 = 0.9
+second step i chooe +5, so i have ((100+5)/100) * 0.9 = (1.05) * 0.9 = 0.945 +

+

If you want to make this change permanent and left your extrusion multipler to 1 in slic3r++, you can change your firmware configuration by mutiplying (or dividing, depends of the firmware/setting) the 'extruder speed setting' (e-step, step_distance) by this extrusion multipler.

+

Advice

+

Before doing this test, it's preferable to calibrate your extruder (it's easier on bowden setup):

+
    +
  • Remove the extruder bowden tube from the output of the extruder (or remove the extruder assembly from the nozzle assembly if you have a direct-extruder)
  • +
  • Put the filament through it (by hand or using the software control)
  • +
  • Cut the filament flush with the output of the extruder. Measure with your spring-steel ruler that you measure just 0mm. If not, note the value and don't forget to remove it from every other measure you do.
  • +
  • Ask your extruder to extrude 200mm of filament (gcode: G1 E200).
  • +
  • Measure the length o the extruded filament. Repeat this process two times more if you want to be more precise.
  • +
  • You have to change your extruder multiplier (estep, step_distance) by multipliying (or dividing, depending on your firmware) the current value by (200 / average_measured_value).
  • +

    Note that this value may change if you change the pressure the extuder exerce against the filament.

    +
+

Notes

+

It's very difficult to tune the flow below the 2% mark, and no filament is consistent enought to warrant it anyway. A filament that have a guarantee of +-0,03mm have a ~7% variation between the low and high end cross section.

+

Most of the calibrations need to done is the right order. This one should be the second.

+

You may want to re-do the bed level calibration is the result is below 0.9 or higher than 1.1.

+

Note that the filament extrusion multipler can change with a different filament material, as a softer one can be squished/dented more by the extruder and so have a lower diameter in the extruder gears.

+

If your printer extruder eat the filament and can't complete the top layer, you have to increase the ironing distribution (by 5% increment). (Expert seting, print -> infill)

+ + + \ No newline at end of file diff --git a/resources/calibration/filament_temp/overhang_test.amf b/resources/calibration/filament_temp/overhang_test.amf new file mode 100644 index 0000000000000000000000000000000000000000..10a992bc9fe35e033d98e6025fa0365994114d52 GIT binary patch literal 52113 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 Q*+9w|fzTI7^D}{X08?ZZ*8l(j literal 0 HcmV?d00001 diff --git a/resources/calibration/over-bridge_tuning/over-bridge_tuning.html b/resources/calibration/over-bridge_tuning/over-bridge_tuning.html new file mode 100644 index 000000000..dfc4dae70 --- /dev/null +++ b/resources/calibration/over-bridge_tuning/over-bridge_tuning.html @@ -0,0 +1,12 @@ + + + + + Document HTML + + +

hello you

+bonjour le monde + + + \ No newline at end of file diff --git a/resources/ui_layout/print.ui b/resources/ui_layout/print.ui index 5e56b8444..d46b7c736 100644 --- a/resources/ui_layout/print.ui +++ b/resources/ui_layout/print.ui @@ -125,7 +125,7 @@ group:sidetext_width$3:Advanced setting:infill_first group:Advanced Infill line:Ironing tuning - setting:label_width$6:width$5:fill_smooth_width + setting:label_width$6:width$5:sidetext_width$7:fill_smooth_width setting:label_width$9:width$5:fill_smooth_distribution end_line @@ -157,16 +157,16 @@ group:Raft setting:raft_layers group:Options for support material and raft line:Z-offset - setting:support_material_contact_distance_type - setting:support_material_contact_distance_top - setting:support_material_contact_distance_bottom + setting:width$12:support_material_contact_distance_type + setting:width$6:support_material_contact_distance_top + setting:width$6:support_material_contact_distance_bottom end_line setting:support_material_pattern setting:support_material_with_sheath setting:support_material_spacing setting:support_material_angle setting:support_material_buildplate_only - setting:support_material_xy_spacing + setting:sidetext_width$7:support_material_xy_spacing setting:dont_support_bridges setting:support_material_synchronize_layers group:Options for support material interface diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 98167e139..571eefa0c 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -215,7 +215,7 @@ void make_fill(LayerRegion &layerm, ExtrusionEntityCollection &out) if (surface.has_fill_solid()) { density = 100.; - fill_pattern = ipRectilinear; + fill_pattern = ipRectilinearWGapFill; if (surface.has_pos_external() && !is_bridge) fill_pattern = surface.has_pos_top() ? layerm.region()->config().top_fill_pattern.value : layerm.region()->config().bottom_fill_pattern.value; else if (!is_bridge) diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 51f862612..eb1714de9 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -48,7 +48,7 @@ Fill* Fill::new_from_type(const InfillPattern type) case ipSmoothHilbert: return new FillSmoothHilbert(); case ipRectiWithPerimeter: return new FillRectilinear2Peri(); case ipSawtooth: return new FillRectilinearSawtooth(); - default: throw std::invalid_argument("unknown type"); + default: throw std::invalid_argument("unknown type : "+type); } } diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 2dad5a377..314074af7 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2821,7 +2821,9 @@ std::string GCode::extrude_loop_vase(const ExtrusionLoop &original_loop, const s } // calculate extrusion length per distance unit - double e_per_mm_per_height = m_writer.extruder()->e_per_mm3() * path->mm3_per_mm / this->m_layer->height; + double e_per_mm_per_height = (path->mm3_per_mm / this->m_layer->height) + * m_writer.extruder()->e_per_mm3() + * this->config().print_extrusion_multiplier.get_abs_value(1); if (m_writer.extrusion_axis().empty()) e_per_mm_per_height = 0; { std::string comment = m_config.gcode_comments ? description : ""; @@ -3322,7 +3324,9 @@ std::string GCode::extrude_multi_path3D(const ExtrusionMultiPath3D &multipath3D, gcode += this->_before_extrude(path, description, speed); // calculate extrusion length per distance unit - double e_per_mm = m_writer.extruder()->e_per_mm3() * path.mm3_per_mm; + double e_per_mm = path.mm3_per_mm + * m_writer.extruder()->e_per_mm3() + * this->config().print_extrusion_multiplier.get_abs_value(1); if (m_writer.extrusion_axis().empty()) e_per_mm = 0; double path_length = 0.; { @@ -3389,7 +3393,9 @@ std::string GCode::extrude_path_3D(const ExtrusionPath3D &path, const std::strin std::string gcode = this->_before_extrude(path, description, speed); // calculate extrusion length per distance unit - double e_per_mm = m_writer.extruder()->e_per_mm3() * path.mm3_per_mm; + double e_per_mm = path.mm3_per_mm + * m_writer.extruder()->e_per_mm3() + * this->config().print_extrusion_multiplier.get_abs_value(1); if (m_writer.extrusion_axis().empty()) e_per_mm = 0; double path_length = 0.; { @@ -3548,7 +3554,9 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &descri std::string gcode = this->_before_extrude(path, description, speed); // calculate extrusion length per distance unit - double e_per_mm = m_writer.extruder()->e_per_mm3() * path.mm3_per_mm; + double e_per_mm = path.mm3_per_mm + * m_writer.extruder()->e_per_mm3() + * this->config().print_extrusion_multiplier.get_abs_value(1); if (this->m_layer_index <= 0) e_per_mm *= this->config().first_layer_flow_ratio.get_abs_value(1); if (m_writer.extrusion_axis().empty()) e_per_mm = 0; double path_length = 0.; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a8d0df194..52ade128b 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -873,12 +873,25 @@ void PrintConfigDef::init_fff_params() def->label = L("Extrusion multiplier"); def->category = OptionCategory::filament; def->tooltip = L("This factor changes the amount of flow proportionally. You may need to tweak " - "this setting to get nice surface finish and correct single wall widths. " - "Usual values are between 0.9 and 1.1. If you think you need to change this more, " - "check filament diameter and your firmware E steps."); + "this setting to get nice surface finish and correct single wall widths. " + "Usual values are between 0.9 and 1.1. If you think you need to change this more, " + "check filament diameter and your firmware E steps."); def->mode = comSimple; def->set_default_value(new ConfigOptionFloats { 1. }); + def = this->add("print_extrusion_multiplier", coPercent); + def->label = L("Extrusion multiplier"); + def->category = OptionCategory::width; + def->tooltip = L("This factor changes the amount of flow proportionally. You may need to tweak " + "this setting to get nice surface finish and correct single wall widths. " + "Usual values are between 0.9 and 1.1. If you think you need to change this more, " + "check filament diameter and your firmware E steps." + " This print setting is multiplied against the extrusion_multiplier from the filament tab." + " Its only purpose is to offer the same functionality but with a per-object basis."); + def->mode = comSimple; + def->min = 2; + def->set_default_value(new ConfigOptionPercent(100)); + def = this->add("extrusion_width", coFloatOrPercent); def->label = L("Default extrusion width"); def->category = OptionCategory::width; @@ -1720,7 +1733,7 @@ void PrintConfigDef::init_fff_params() " It assume infinite acceleration for this time estimation, and only takes into account G1 and G0 moves. Use 0 to deactivate, negative to remove the 'D' option."); def->sidetext = L("s"); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(0)); + def->set_default_value(new ConfigOptionFloat(-1)); { struct AxisDefault { diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 49c13b9f1..85ba6f145 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -631,6 +631,7 @@ public: ConfigOptionFloat perimeter_speed; // Total number of perimeters. ConfigOptionInt perimeters; + ConfigOptionPercent print_extrusion_multiplier; ConfigOptionFloatOrPercent small_perimeter_speed; ConfigOptionEnum solid_fill_pattern; ConfigOptionFloat solid_infill_below_area; @@ -710,6 +711,7 @@ protected: OPT_PTR(perimeter_loop_seam); OPT_PTR(perimeter_speed); OPT_PTR(perimeters); + OPT_PTR(print_extrusion_multiplier); OPT_PTR(small_perimeter_speed); OPT_PTR(solid_fill_pattern); OPT_PTR(solid_infill_below_area); diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 5e0c34da0..f4943de55 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -18,6 +18,14 @@ set(SLIC3R_GUI_SOURCES GUI/BackgroundSlicingProcess.hpp GUI/BitmapCache.cpp GUI/BitmapCache.hpp + GUI/CalibrationBedDialog.cpp + GUI/CalibrationBedDialog.hpp + GUI/CalibrationBridgeDialog.cpp + GUI/CalibrationBridgeDialog.hpp + GUI/CalibrationFlowDialog.cpp + GUI/CalibrationFlowDialog.hpp + GUI/CalibrationTempDialog.cpp + GUI/CalibrationTempDialog.hpp GUI/ConfigSnapshotDialog.cpp GUI/ConfigSnapshotDialog.hpp GUI/3DScene.cpp diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index a909b9a54..228824a06 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -163,8 +163,8 @@ void GLIndexedVertexArray::render( const std::pair& tverts_range, const std::pair& qverts_range) const { - assert(this->vertices_and_normals_interleaved_VBO_id != 0); - assert(this->triangle_indices_VBO_id != 0 || this->quad_indices_VBO_id != 0); +// assert(this->vertices_and_normals_interleaved_VBO_id != 0); +// assert(this->triangle_indices_VBO_id != 0 || this->quad_indices_VBO_id != 0); // Render using the Vertex Buffer Objects. glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_and_normals_interleaved_VBO_id)); diff --git a/src/slic3r/GUI/CalibrationBedDialog.cpp b/src/slic3r/GUI/CalibrationBedDialog.cpp new file mode 100644 index 000000000..6fe4d4f01 --- /dev/null +++ b/src/slic3r/GUI/CalibrationBedDialog.cpp @@ -0,0 +1,216 @@ +#include "CalibrationBedDialog.hpp" +#include "I18N.hpp" +#include "libslic3r/Utils.hpp" +#include "GUI.hpp" +#include "GUI_ObjectList.hpp" +#include "tab.hpp" +#include +#include +#include +#include "wxExtensions.hpp" + +#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 { + + CalibrationBedDialog::CalibrationBedDialog(GUI_App* app, MainFrame* mainframe) + : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Bed calibration - test objects generation")), +#if ENABLE_SCROLLABLE + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +#else + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) +#endif // ENABLE_SCROLLABLE +{ + this->gui_app = app; + this->main_frame = mainframe; + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + + // fonts + const wxFont& font = wxGetApp().normal_font(); + const wxFont& bold_font = wxGetApp().bold_font(); + SetFont(font); + + auto main_sizer = new wxBoxSizer(wxVERTICAL); + + //html + std::cout << "display test.html\n"; + html_viewer = new wxHtmlWindow(this, wxID_ANY, + wxDefaultPosition, wxSize(800, 500), wxHW_SCROLLBAR_AUTO); + html_viewer->LoadPage("./resources/calibration/bed_leveling/bed_leveling.html"); + main_sizer->Add(html_viewer, 1, wxEXPAND | wxALL, 5); + + wxStdDialogButtonSizer* buttons = new wxStdDialogButtonSizer(); + wxButton* bt = new wxButton(this, wxID_FILE1, _(L("Generate"))); + bt->Bind(wxEVT_BUTTON, &CalibrationBedDialog::create_geometry, this); + buttons->Add(bt); + wxButton* close = new wxButton(this, wxID_CLOSE, _(L("Close"))); + close->Bind(wxEVT_BUTTON, &CalibrationBedDialog::closeMe, this); + buttons->AddButton(close); + close->SetDefault(); + close->SetFocus(); + SetAffirmativeId(wxID_CLOSE); + buttons->Realize(); + main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 5); + + SetSizer(main_sizer); + main_sizer->SetSizeHints(this); +} + +void CalibrationBedDialog::closeMe(wxCommandEvent& event_args) { + gui_app->delete_calibration_dialog(); +} + +void CalibrationBedDialog::create_geometry(wxCommandEvent& event_args) { + Plater* plat = this->main_frame->plater(); + Model& model = plat->model(); + plat->reset(); + std::vector objs_idx = plat->load_files(std::vector{ + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf"}, true, false); + + assert(objs_idx.size() == 5); + const DynamicPrintConfig* printConfig = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config(); + const DynamicPrintConfig* printerConfig = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + + /// --- scale --- + //model is created for a 0.4 nozzle, scale xy with nozzle size. + const ConfigOptionFloats* nozzle_diameter = printerConfig->option("nozzle_diameter"); + assert(nozzle_diameter->values.size() > 0); + float xyScale = nozzle_diameter->values[0] / 0.4; + //scale z with the first_layer_height + const ConfigOptionFloatOrPercent* first_layer_height = printConfig->option("first_layer_height"); + float zscale = first_layer_height->get_abs_value(nozzle_diameter->values[0]) / 0.2; + //do scaling + if (xyScale < 0.9 || 1.2 < xyScale) { + for (size_t i = 0; i < 5; i++) + model.objects[objs_idx[i]]->scale(xyScale, xyScale, zscale); + } else { + for (size_t i = 0; i < 5; i++) + model.objects[objs_idx[i]]->scale(1, 1, zscale); + } + + /// --- rotate --- + const ConfigOptionPoints* bed_shape = printerConfig->option("bed_shape"); + if (bed_shape->values.size() == 4) { + model.objects[objs_idx[0]]->rotate(PI / 4, { 0,0,1 }); + model.objects[objs_idx[1]]->rotate(5 * PI / 4, { 0,0,1 }); + model.objects[objs_idx[3]]->rotate(3 * PI / 4, { 0,0,1 }); + model.objects[objs_idx[4]]->rotate(7 * PI / 4, { 0,0,1 }); + } else { + model.objects[objs_idx[3]]->rotate(PI / 2, { 0,0,1 }); + model.objects[objs_idx[4]]->rotate(PI / 2, { 0,0,1 }); + } + + /// --- translate --- + //three first will stay with this orientation (top left, middle, bottom right) + //last two with 90deg (top left, middle, bottom right) + //get position for patches + Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); + Vec2d bed_min = BoundingBoxf(bed_shape->values).min; + float offsetx = 10 + 10 * xyScale; + float offsety = 10 + 10 * xyScale; + if (bed_shape->values.size() > 4) { + offsetx = bed_size.x() / 2 - bed_size.x() * std::sqrtf(2) / 4 + 10 * xyScale; + offsety = bed_size.y() / 2 - bed_size.y() * std::sqrtf(2) / 4 + 10 * xyScale; + } + bool large_enough = bed_shape->values.size() == 4 ? + (bed_size.x() > offsetx * 3 && bed_size.y() > offsety * 3) : + (bed_size.x() > offsetx * 2 + 10 * xyScale && bed_size.y() > offsety * 2 + 10 * xyScale); + if (!large_enough){ + //problem : too small, use arrange instead and let the user place them. + plat->arrange(); + //TODO add message + } else { + model.objects[objs_idx[0]]->translate({ bed_min.x() + offsetx, bed_min.y() + bed_size.y() - offsety,0 }); + model.objects[objs_idx[1]]->translate({ bed_min.x() + bed_size.x() - offsetx,bed_min.y() + offsety , 0 }); + model.objects[objs_idx[2]]->translate({ bed_min.x() + bed_size.x()/2, bed_min.y() + bed_size.y() / 2, 0 }); + model.objects[objs_idx[3]]->translate({ bed_min.x() + offsetx, bed_min.y() + offsety, 0 }); + model.objects[objs_idx[4]]->translate({ bed_min.x() + bed_size.x() - offsetx,bed_min.y() + bed_size.y() - offsety,0 }); + } + + /// --- main config, please modify object config when possible --- + DynamicPrintConfig new_print_config = *printConfig; //make a copy + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(true)); + new_print_config.set_key_value("skirts", new ConfigOptionInt(2)); + + /// --- custom config --- + for (size_t i = 0; i < 5; i++) { + model.objects[objs_idx[i]]->config.set_key_value("perimeters", new ConfigOptionInt(2)); + model.objects[objs_idx[i]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(2)); + model.objects[objs_idx[i]]->config.set_key_value("gap_fill", new ConfigOptionBool(false)); + model.objects[objs_idx[i]]->config.set_key_value("first_layer_extrusion_width", new ConfigOptionFloatOrPercent(140, true)); + model.objects[objs_idx[i]]->config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipRectilinearWGapFill)); + } + if (bed_shape->values.size() == 4) { + model.objects[objs_idx[0]]->config.set_key_value("fill_angle", new ConfigOptionFloat(90)); + model.objects[objs_idx[1]]->config.set_key_value("fill_angle", new ConfigOptionFloat(90)); + model.objects[objs_idx[2]]->config.set_key_value("fill_angle", new ConfigOptionFloat(45)); + model.objects[objs_idx[3]]->config.set_key_value("fill_angle", new ConfigOptionFloat(0)); + model.objects[objs_idx[4]]->config.set_key_value("fill_angle", new ConfigOptionFloat(0)); + } else { + for (size_t i = 0; i < 3; i++) + for (size_t i = 3; i < 5; i++) + model.objects[objs_idx[i]]->config.set_key_value("fill_angle", new ConfigOptionFloat(135)); + } + + //update plater + this->gui_app->get_tab(Preset::TYPE_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + plat->changed_objects(objs_idx); + this->gui_app->get_tab(Preset::TYPE_PRINT)->update_dirty(); + //update everything, easier to code. + this->gui_app->obj_list()->update_after_undo_redo(); + //if(!plat->is_background_process_update_scheduled()) + // plat->schedule_background_process(); + plat->reslice(); + plat->select_view_3D("Preview"); + +} + +void CalibrationBedDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + msw_buttons_rescale(this, em_unit(), { wxID_OK }); + + Layout(); + Fit(); + Refresh(); +} + +wxPanel* CalibrationBedDialog::create_header(wxWindow* parent, const wxFont& bold_font) +{ + wxPanel* panel = new wxPanel(parent); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + + wxFont header_font = bold_font; +#ifdef __WXOSX__ + header_font.SetPointSize(14); +#else + header_font.SetPointSize(bold_font.GetPointSize() + 2); +#endif // __WXOSX__ + + sizer->AddStretchSpacer(); + + // text + wxStaticText* text = new wxStaticText(panel, wxID_ANY, _(L("Keyboard shortcuts"))); + text->SetFont(header_font); + sizer->Add(text, 0, wxALIGN_CENTER_VERTICAL); + + sizer->AddStretchSpacer(); + + panel->SetSizer(sizer); + return panel; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/CalibrationBedDialog.hpp b/src/slic3r/GUI/CalibrationBedDialog.hpp new file mode 100644 index 000000000..9b48dad70 --- /dev/null +++ b/src/slic3r/GUI/CalibrationBedDialog.hpp @@ -0,0 +1,41 @@ +#ifndef slic3r_GUI_CalibrationBedDialog_hpp_ +#define slic3r_GUI_CalibrationBedDialog_hpp_ + +#include +#include +#include + +#include "GUI_App.hpp" +#include "GUI_Utils.hpp" +#include "MainFrame.hpp" +#include "wxExtensions.hpp" +#include + +namespace Slic3r { +namespace GUI { + +class CalibrationBedDialog : public DPIDialog +{ + +public: + CalibrationBedDialog(GUI_App* app, MainFrame* mainframe); + +protected: + void on_dpi_changed(const wxRect &suggested_rect) override; + +private: + + void closeMe(wxCommandEvent& event_args); + void create_geometry(wxCommandEvent& event_args); + wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); + + wxHtmlWindow* html_viewer; + MainFrame* main_frame; + GUI_App* gui_app; + +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/CalibrationBridgeDialog.cpp b/src/slic3r/GUI/CalibrationBridgeDialog.cpp new file mode 100644 index 000000000..5c0251889 --- /dev/null +++ b/src/slic3r/GUI/CalibrationBridgeDialog.cpp @@ -0,0 +1,196 @@ +#include "CalibrationBridgeDialog.hpp" +#include "I18N.hpp" +#include "libslic3r/Utils.hpp" +#include "GUI.hpp" +#include "tab.hpp" +#include +#include +#include +#include "wxExtensions.hpp" + +#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 { + + CalibrationBridgeDialog::CalibrationBridgeDialog(GUI_App* app, MainFrame* mainframe) + : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Bridge calibration - test objects generation")), +#if ENABLE_SCROLLABLE + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +#else + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) +#endif // ENABLE_SCROLLABLE +{ + this->gui_app = app; + this->main_frame = mainframe; + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + + // fonts + const wxFont& font = wxGetApp().normal_font(); + const wxFont& bold_font = wxGetApp().bold_font(); + SetFont(font); + + auto main_sizer = new wxBoxSizer(wxVERTICAL); + + //html + std::cout << "display test.html\n"; + html_viewer = new wxHtmlWindow(this, wxID_ANY, + wxDefaultPosition, wxSize(400, 400), wxHW_SCROLLBAR_AUTO); + html_viewer->LoadPage("./resources/calibration/bed_leveling/bed_leveling.html"); + main_sizer->Add(html_viewer, 1, wxEXPAND | wxALL, 5); + + wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxAPPLY| wxCLOSE); + buttons->GetApplyButton()->Bind(wxEVT_BUTTON, &CalibrationBridgeDialog::create_geometry, this); + this->SetEscapeId(wxCLOSE); + main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 5); + + SetSizer(main_sizer); + main_sizer->SetSizeHints(this); +} + +void CalibrationBridgeDialog::create_geometry(wxCommandEvent& event_args) { + Plater* plat = this->main_frame->plater(); + Model& model = plat->model(); + plat->reset(); + std::vector objs_idx = plat->load_files(std::vector{ + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf"}, true, false); + + assert(objs_idx.size() == 5); + const DynamicPrintConfig* printConfig = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config(); + const DynamicPrintConfig* printerConfig = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + + /// --- scale --- + //model is created for a 0.4 nozzle, scale xy with nozzle size. + const ConfigOptionFloats* nozzle_diameter = printerConfig->option("nozzle_diameter"); + assert(nozzle_diameter->values.size() > 0); + float xyScale = nozzle_diameter->values[0] / 0.4; + //scale z with the first_layer_height + const ConfigOptionFloatOrPercent* first_layer_height = printConfig->option("first_layer_height"); + float zscale = first_layer_height->get_abs_value(nozzle_diameter->values[0]) / 0.2; + //do scaling + if (xyScale < 0.9 || 1.2 < xyScale) { + for (size_t i = 0; i < 5; i++) + model.objects[objs_idx[i]]->scale(xyScale, xyScale, zscale); + } + + /// --- rotate --- + const ConfigOptionPoints* bed_shape = printerConfig->option("bed_shape"); + if (bed_shape->values.size() == 4) { + model.objects[objs_idx[0]]->rotate(PI / 4, { 0,0,1 }); + model.objects[objs_idx[1]]->rotate(5 * PI / 4, { 0,0,1 }); + model.objects[objs_idx[3]]->rotate(3 * PI / 4, { 0,0,1 }); + model.objects[objs_idx[4]]->rotate(7 * PI / 4, { 0,0,1 }); + } else { + model.objects[objs_idx[3]]->rotate(PI / 2, { 0,0,1 }); + model.objects[objs_idx[4]]->rotate(PI / 2, { 0,0,1 }); + } + + /// --- translate --- + //three first will stay with this orientation (top left, middle, bottom right) + //last two with 90deg (top left, middle, bottom right) + //get position for patches + Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); + Vec2d bed_min = BoundingBoxf(bed_shape->values).min; + float offsetx = 10 + 10 * xyScale; + float offsety = 10 + 10 * xyScale; + if (bed_shape->values.size() > 4) { + offsetx = bed_size.x() / 2 - bed_size.x() * std::sqrtf(2) / 4 + 10 * xyScale; + offsety = bed_size.y() / 2 - bed_size.y() * std::sqrtf(2) / 4 + 10 * xyScale; + } + bool large_enough = bed_shape->values.size() == 4 ? + (bed_size.x() > offsetx * 3 && bed_size.y() > offsety * 3) : + (bed_size.x() > offsetx * 2 + 10 * xyScale && bed_size.y() > offsety * 2 + 10 * xyScale); + if (!large_enough){ + //problem : too small, use arrange instead and let the user place them. + model.arrange_objects(20); + //TODO add message + } else { + model.objects[objs_idx[0]]->translate({ bed_min.x() + offsetx, bed_min.y() + bed_size.y() - offsety,0 }); + model.objects[objs_idx[1]]->translate({ bed_min.x() + bed_size.x() - offsetx,bed_min.y() + offsety , 0 }); + model.objects[objs_idx[2]]->translate({ bed_min.x() + bed_size.x()/2, bed_min.y() + bed_size.y() / 2, 0 }); + model.objects[objs_idx[3]]->translate({ bed_min.x() + offsetx, bed_min.y() + offsety, 0 }); + model.objects[objs_idx[4]]->translate({ bed_min.x() + bed_size.x() - offsetx,bed_min.y() + bed_size.y() - offsety,0 }); + } + + /// --- main config, please modify object config when possible --- + DynamicPrintConfig new_print_config = *printConfig; //make a copy + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(true)); + new_print_config.set_key_value("skirts", new ConfigOptionInt(0)); + + /// --- custom config --- + for (size_t i = 0; i < 5; i++) { + model.objects[objs_idx[i]]->config.set_key_value("perimeters", new ConfigOptionInt(2)); + model.objects[objs_idx[i]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(2)); + model.objects[objs_idx[i]]->config.set_key_value("gap_fill", new ConfigOptionBool(false)); + model.objects[objs_idx[i]]->config.set_key_value("first_layer_extrusion_width", new ConfigOptionFloatOrPercent(140, true)); + model.objects[objs_idx[i]]->config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipRectilinearWGapFill)); + } + if (bed_shape->values.size() == 4) { + model.objects[objs_idx[0]]->config.set_key_value("fill_angle", new ConfigOptionFloat(90)); + model.objects[objs_idx[1]]->config.set_key_value("fill_angle", new ConfigOptionFloat(90)); + model.objects[objs_idx[2]]->config.set_key_value("fill_angle", new ConfigOptionFloat(45)); + model.objects[objs_idx[3]]->config.set_key_value("fill_angle", new ConfigOptionFloat(0)); + model.objects[objs_idx[4]]->config.set_key_value("fill_angle", new ConfigOptionFloat(0)); + } else { + for (size_t i = 0; i < 3; i++) + for (size_t i = 3; i < 5; i++) + model.objects[objs_idx[i]]->config.set_key_value("fill_angle", new ConfigOptionFloat(135)); + } + + //update plater + this->gui_app->get_tab(Preset::TYPE_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + plat->changed_objects(objs_idx); + //if(!plat->is_background_process_update_scheduled()) + // plat->schedule_background_process(); + plat->reslice(); + plat->select_view_3D("Preview"); +} + +void CalibrationBridgeDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + msw_buttons_rescale(this, em_unit(), { wxID_OK }); + + Layout(); + Fit(); + Refresh(); +} + +wxPanel* CalibrationBridgeDialog::create_header(wxWindow* parent, const wxFont& bold_font) +{ + wxPanel* panel = new wxPanel(parent); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + + wxFont header_font = bold_font; +#ifdef __WXOSX__ + header_font.SetPointSize(14); +#else + header_font.SetPointSize(bold_font.GetPointSize() + 2); +#endif // __WXOSX__ + + sizer->AddStretchSpacer(); + + // text + wxStaticText* text = new wxStaticText(panel, wxID_ANY, _(L("Keyboard shortcuts"))); + text->SetFont(header_font); + sizer->Add(text, 0, wxALIGN_CENTER_VERTICAL); + + sizer->AddStretchSpacer(); + + panel->SetSizer(sizer); + return panel; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/CalibrationBridgeDialog.hpp b/src/slic3r/GUI/CalibrationBridgeDialog.hpp new file mode 100644 index 000000000..6d255d32d --- /dev/null +++ b/src/slic3r/GUI/CalibrationBridgeDialog.hpp @@ -0,0 +1,39 @@ +#ifndef slic3r_GUI_CalibrationBridgeDialog_hpp_ +#define slic3r_GUI_CalibrationBridgeDialog_hpp_ + +#include +#include +#include + +#include "GUI_App.hpp" +#include "GUI_Utils.hpp" +#include "MainFrame.hpp" +#include "wxExtensions.hpp" +#include + +namespace Slic3r { +namespace GUI { + +class CalibrationBridgeDialog : public DPIDialog +{ + +public: + CalibrationBridgeDialog(GUI_App* app, MainFrame* mainframe); + +protected: + void on_dpi_changed(const wxRect &suggested_rect) override; + +private: + void create_geometry(wxCommandEvent& event_args); + wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); + + wxHtmlWindow* html_viewer; + MainFrame* main_frame; + GUI_App* gui_app; + +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/CalibrationFlowDialog.cpp b/src/slic3r/GUI/CalibrationFlowDialog.cpp new file mode 100644 index 000000000..e910e6a94 --- /dev/null +++ b/src/slic3r/GUI/CalibrationFlowDialog.cpp @@ -0,0 +1,272 @@ +#include "CalibrationFlowDialog.hpp" +#include "I18N.hpp" +#include "libslic3r/Utils.hpp" +#include "GLCanvas3D.hpp " +#include "GUI.hpp" +#include "GUI_ObjectList.hpp" +#include "tab.hpp" +#include +#include +#include +#include "wxExtensions.hpp" + +#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 { + + CalibrationFlowDialog::CalibrationFlowDialog(GUI_App* app, MainFrame* mainframe) + : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Flow calibration - test objects generation")), +#if ENABLE_SCROLLABLE + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +#else + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) +#endif // ENABLE_SCROLLABLE +{ + this->gui_app = app; + this->main_frame = mainframe; + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + + // fonts + const wxFont& font = wxGetApp().normal_font(); + const wxFont& bold_font = wxGetApp().bold_font(); + SetFont(font); + + auto main_sizer = new wxBoxSizer(wxVERTICAL); + + //html + html_viewer = new wxHtmlWindow(this, wxID_ANY, + wxDefaultPosition, wxSize(600, 500), wxHW_SCROLLBAR_AUTO); + html_viewer->SetMinSize(wxSize(1000, 500)); + html_viewer->LoadPage("./resources/calibration/filament_flow/filament_flow.html"); + main_sizer->Add(html_viewer, 1, wxEXPAND | wxALL, 5); + + wxStdDialogButtonSizer* buttons = new wxStdDialogButtonSizer(); + wxButton* bt = new wxButton(this, wxID_FILE1, _(L("Generate 10% intervals"))); + bt->Bind(wxEVT_BUTTON, &CalibrationFlowDialog::create_geometry_10, this); + buttons->Add(bt); + bt = new wxButton(this, wxID_FILE2, _(L("Generate 2.5% intervals"))); + bt->Bind(wxEVT_BUTTON, &CalibrationFlowDialog::create_geometry_2_5, this); + buttons->Add(bt); + wxButton* close = new wxButton(this, wxID_CLOSE, _(L("Close"))); + close->Bind(wxEVT_BUTTON, &CalibrationFlowDialog::closeMe, this); + buttons->AddButton(close); + close->SetDefault(); + close->SetFocus(); + SetAffirmativeId(wxID_CLOSE); + buttons->Realize(); + main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 5); + + SetSizer(main_sizer); + main_sizer->SetSizeHints(this); + + this->SetEscapeId(wxCLOSE); + this->SetAffirmativeId(wxCLOSE); +} + +void CalibrationFlowDialog::closeMe(wxCommandEvent& event_args) { + gui_app->delete_calibration_dialog(); +} + +void CalibrationFlowDialog::create_geometry_10(wxCommandEvent& event_args) { + create_geometry(80.f, 10.f); +} + +void CalibrationFlowDialog::create_geometry_2_5(wxCommandEvent& event_args) { + create_geometry(92.f, 2.F); +} + +void CalibrationFlowDialog::add_part(ModelObject* model_object, std::string input_file, Vec3d move, Vec3d scale) { + Model model; + try { + model = Model::read_from_file(input_file); + } + catch (std::exception & e) { + auto msg = _(L("Error!")) + " " + input_file + " : " + e.what() + "."; + show_error(this, msg); + exit(1); + } + + for (ModelObject *object : model.objects) { + Vec3d delta = Vec3d::Zero(); + if (model_object->origin_translation != Vec3d::Zero()) + { + object->center_around_origin(); + delta = model_object->origin_translation - object->origin_translation; + } + for (ModelVolume *volume : object->volumes) { + volume->translate(delta + move); + if (scale != Vec3d{ 1,1,1 }) + volume->scale(scale); + ModelVolume* new_volume = model_object->add_volume(*volume); + new_volume->set_type(ModelVolumeType::MODEL_PART); + new_volume->name = boost::filesystem::path(input_file).filename().string(); + + //volumes_info.push_back(std::make_pair(from_u8(new_volume->name), new_volume->get_mesh_errors_count() > 0)); + + // set a default extruder value, since user can't add it manually + new_volume->config.set_key_value("extruder", new ConfigOptionInt(0)); + + //move to bed + /* const TriangleMesh& hull = new_volume->get_convex_hull(); + float min_z = std::numeric_limits::max(); + for (const stl_facet& facet : hull.stl.facet_start) { + for (int i = 0; i < 3; ++i) + min_z = std::min(min_z, Vec3f::UnitZ().dot(facet.vertex[i])); + } + volume->translate(Vec3d(0,0,-min_z));*/ + } + } +} + +void CalibrationFlowDialog::create_geometry(float start, float delta) { + Plater* plat = this->main_frame->plater(); + Model& model = plat->model(); + plat->reset(); + std::vector objs_idx = plat->load_files(std::vector{ + "./resources/calibration/filament_flow/filament_flow_test_cube.amf", + "./resources/calibration/filament_flow/filament_flow_test_cube.amf", + "./resources/calibration/filament_flow/filament_flow_test_cube.amf", + "./resources/calibration/filament_flow/filament_flow_test_cube.amf", + "./resources/calibration/filament_flow/filament_flow_test_cube.amf"}, true, false); + + + assert(objs_idx.size() == 5); + const DynamicPrintConfig* printConfig = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config(); + const DynamicPrintConfig* printerConfig = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + + /// --- scale --- + // model is created for a 0.4 nozzle, scale xy with nozzle size. + const ConfigOptionFloats* nozzle_diameter = printerConfig->option("nozzle_diameter"); + assert(nozzle_diameter->values.size() > 0); + float xyScale = nozzle_diameter->values[0] / 0.4; + //scale z to have 6 layers + const ConfigOptionFloatOrPercent* first_layer_height = printConfig->option("first_layer_height"); + const ConfigOptionFloat* layer_height = printConfig->option("layer_height"); + float zscale = first_layer_height->get_abs_value(nozzle_diameter->values[0]) + 5 * layer_height->value; + zscale *= (1 + 0.3 * (10. / delta)); + //do scaling + if (xyScale < 0.9 || 1.2 < xyScale) { + for (size_t i = 0; i < 5; i++) + model.objects[objs_idx[i]]->scale(xyScale, xyScale, zscale); + } else { + for (size_t i = 0; i < 5; i++) + model.objects[objs_idx[i]]->scale(1, 1, zscale); + } + + //add sub-part after scale + float zshift = (1 - zscale) / 2; + if (delta == 10.f && start == 80.f) { + add_part(model.objects[objs_idx[0]], "./resources/calibration/filament_flow/m20.amf", Vec3d{ 9,0,zshift }); + add_part(model.objects[objs_idx[1]], "./resources/calibration/filament_flow/m10.amf", Vec3d{ 9,0,zshift }); + add_part(model.objects[objs_idx[2]], "./resources/calibration/filament_flow/_0.amf", Vec3d{ 9,0,zshift }); + add_part(model.objects[objs_idx[3]], "./resources/calibration/filament_flow/p10.amf", Vec3d{ 9,0,zshift }); + add_part(model.objects[objs_idx[4]], "./resources/calibration/filament_flow/p20.amf", Vec3d{ 9,0,zshift }); + } else if (delta == 2.f && start == 92.f) { + add_part(model.objects[objs_idx[0]], "./resources/calibration/filament_flow/m8.amf", Vec3d{ 9,0,zshift }); + add_part(model.objects[objs_idx[1]], "./resources/calibration/filament_flow/m6.amf", Vec3d{ 9,0,zshift }); + add_part(model.objects[objs_idx[2]], "./resources/calibration/filament_flow/m4.amf", Vec3d{ 9,0,zshift }); + add_part(model.objects[objs_idx[3]], "./resources/calibration/filament_flow/m2.amf", Vec3d{ 9,0,zshift }); + add_part(model.objects[objs_idx[4]], "./resources/calibration/filament_flow/_0.amf", Vec3d{ 9,0,zshift }); + } + for (size_t i = 0; i < 5; i++) { + add_part(model.objects[objs_idx[i]], "./resources/calibration/filament_flow/O.amf", Vec3d{ 0,0,zscale/2.f + 0.5 }, Vec3d{1,1,xyScale }); + } + + /// --- translate ---; + const ConfigOptionFloat* extruder_clearance_radius = printConfig->option("extruder_clearance_radius"); + const ConfigOptionPoints* bed_shape = printerConfig->option("bed_shape"); + Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); + Vec2d bed_min = BoundingBoxf(bed_shape->values).min; + float offsetx = 5 + extruder_clearance_radius->value + 10 * xyScale; + float offsety = 5 + extruder_clearance_radius->value + 10 * xyScale; + model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2 - offsetx, bed_min.y() + bed_size.y() / 2 - offsety * 1.5, 0 }); + model.objects[objs_idx[1]]->translate({ bed_min.x() + bed_size.x() / 2 - offsetx, bed_min.y() + bed_size.y() / 2 , 0 }); + model.objects[objs_idx[2]]->translate({ bed_min.x() + bed_size.x() / 2 - offsetx, bed_min.y() + bed_size.y() / 2 + offsety * 1.5, 0 }); + model.objects[objs_idx[3]]->translate({ bed_min.x() + bed_size.x() / 2 + offsetx, bed_min.y() + bed_size.y() / 2 - offsety , 0 }); + model.objects[objs_idx[4]]->translate({ bed_min.x() + bed_size.x() / 2 + offsetx, bed_min.y() + bed_size.y() / 2 + offsety , 0 }); + //TODO: if not enough space, forget about complete_objects + + + /// --- main config, please modify object config when possible --- + DynamicPrintConfig new_print_config = *printConfig; //make a copy + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(true)); + + /// --- custom config --- + for (size_t i = 0; i < 5; i++) { + model.objects[objs_idx[i]]->config.set_key_value("brim_width", new ConfigOptionFloat(nozzle_diameter->values[0] * 3)); + model.objects[objs_idx[i]]->config.set_key_value("brim_ears", new ConfigOptionBool(false)); + model.objects[objs_idx[i]]->config.set_key_value("perimeters", new ConfigOptionInt(3)); + model.objects[objs_idx[i]]->config.set_key_value("only_one_perimeter_top", new ConfigOptionBool(true)); + model.objects[objs_idx[i]]->config.set_key_value("enforce_full_fill_volume", new ConfigOptionBool(true)); + model.objects[objs_idx[i]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(5)); + model.objects[objs_idx[i]]->config.set_key_value("top_solid_layers", new ConfigOptionInt(100)); + model.objects[objs_idx[i]]->config.set_key_value("thin_walls", new ConfigOptionBool(true)); + model.objects[objs_idx[i]]->config.set_key_value("thin_walls_min_width", new ConfigOptionFloatOrPercent(50,true)); + model.objects[objs_idx[i]]->config.set_key_value("gap_fill", new ConfigOptionBool(true)); + model.objects[objs_idx[i]]->config.set_key_value("layer_height", new ConfigOptionFloat(nozzle_diameter->values[0]/2)); + model.objects[objs_idx[i]]->config.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(nozzle_diameter->values[0] / 2, false)); + model.objects[objs_idx[i]]->config.set_key_value("external_infill_margin", new ConfigOptionFloatOrPercent(100, true)); + model.objects[objs_idx[i]]->config.set_key_value("solid_fill_pattern", new ConfigOptionEnum(ipRectilinearWGapFill)); + model.objects[objs_idx[i]]->config.set_key_value("top_fill_pattern", new ConfigOptionEnum(ipSmooth)); + //set extrusion mult : 80 90 100 110 120 + model.objects[objs_idx[i]]->config.set_key_value("print_extrusion_multiplier", new ConfigOptionPercent(start + (float)i * delta)); + } + + //update plater + this->gui_app->get_tab(Preset::TYPE_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + plat->changed_objects(objs_idx); + this->gui_app->get_tab(Preset::TYPE_PRINT)->update_dirty(); + //update everything, easier to code. + ObjectList* obj = this->gui_app->obj_list(); + obj->update_after_undo_redo(); + + + plat->reslice(); + plat->select_view_3D("Preview"); +} + +void CalibrationFlowDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + msw_buttons_rescale(this, em_unit(), { wxID_OK }); + + Layout(); + Fit(); + Refresh(); +} + +wxPanel* CalibrationFlowDialog::create_header(wxWindow* parent, const wxFont& bold_font) +{ + wxPanel* panel = new wxPanel(parent); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + + wxFont header_font = bold_font; +#ifdef __WXOSX__ + header_font.SetPointSize(14); +#else + header_font.SetPointSize(bold_font.GetPointSize() + 2); +#endif // __WXOSX__ + + sizer->AddStretchSpacer(); + + // text + wxStaticText* text = new wxStaticText(panel, wxID_ANY, _(L("Keyboard shortcuts"))); + text->SetFont(header_font); + sizer->Add(text, 0, wxALIGN_CENTER_VERTICAL); + + sizer->AddStretchSpacer(); + + panel->SetSizer(sizer); + return panel; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/CalibrationFlowDialog.hpp b/src/slic3r/GUI/CalibrationFlowDialog.hpp new file mode 100644 index 000000000..ef0693bd1 --- /dev/null +++ b/src/slic3r/GUI/CalibrationFlowDialog.hpp @@ -0,0 +1,43 @@ +#ifndef slic3r_GUI_CalibrationFlowDialog_hpp_ +#define slic3r_GUI_CalibrationFlowDialog_hpp_ + +#include +#include +#include + +#include "GUI_App.hpp" +#include "GUI_Utils.hpp" +#include "MainFrame.hpp" +#include "wxExtensions.hpp" +#include + +namespace Slic3r { +namespace GUI { + +class CalibrationFlowDialog : public DPIDialog +{ + +public: + CalibrationFlowDialog(GUI_App* app, MainFrame* mainframe); + +protected: + void on_dpi_changed(const wxRect &suggested_rect) override; + +private: + void closeMe(wxCommandEvent& event_args); + void create_geometry_10(wxCommandEvent& event_args); + void create_geometry_2_5(wxCommandEvent& event_args); + void add_part(ModelObject* model_object, std::string input_file, Vec3d move, Vec3d scale = Vec3d{ 1,1,1 }); + void create_geometry(float start, float delta); + wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); + + wxHtmlWindow* html_viewer; + MainFrame* main_frame; + GUI_App* gui_app; + +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/CalibrationTempDialog.cpp b/src/slic3r/GUI/CalibrationTempDialog.cpp new file mode 100644 index 000000000..2d7bea034 --- /dev/null +++ b/src/slic3r/GUI/CalibrationTempDialog.cpp @@ -0,0 +1,196 @@ +#include "CalibrationTempDialog.hpp" +#include "I18N.hpp" +#include "libslic3r/Utils.hpp" +#include "GUI.hpp" +#include "tab.hpp" +#include +#include +#include +#include "wxExtensions.hpp" + +#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 { + + CalibrationTempDialog::CalibrationTempDialog(GUI_App* app, MainFrame* mainframe) + : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Temp calibration - test objects generation")), +#if ENABLE_SCROLLABLE + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +#else + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) +#endif // ENABLE_SCROLLABLE +{ + this->gui_app = app; + this->main_frame = mainframe; + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + + // fonts + const wxFont& font = wxGetApp().normal_font(); + const wxFont& bold_font = wxGetApp().bold_font(); + SetFont(font); + + auto main_sizer = new wxBoxSizer(wxVERTICAL); + + //html + std::cout << "display test.html\n"; + html_viewer = new wxHtmlWindow(this, wxID_ANY, + wxDefaultPosition, wxSize(400, 400), wxHW_SCROLLBAR_AUTO); + html_viewer->LoadPage("./resources/calibration/bed_leveling/bed_leveling.html"); + main_sizer->Add(html_viewer, 1, wxEXPAND | wxALL, 5); + + wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxAPPLY| wxCLOSE); + buttons->GetApplyButton()->Bind(wxEVT_BUTTON, &CalibrationTempDialog::create_geometry, this); + this->SetEscapeId(wxCLOSE); + main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 5); + + SetSizer(main_sizer); + main_sizer->SetSizeHints(this); +} + +void CalibrationTempDialog::create_geometry(wxCommandEvent& event_args) { + Plater* plat = this->main_frame->plater(); + Model& model = plat->model(); + plat->reset(); + std::vector objs_idx = plat->load_files(std::vector{ + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf", + "./resources/calibration/bed_leveling/patch.amf"}, true, false); + + assert(objs_idx.size() == 5); + const DynamicPrintConfig* printConfig = this->gui_app->get_tab(Preset::TYPE_PRINT)->get_config(); + const DynamicPrintConfig* printerConfig = this->gui_app->get_tab(Preset::TYPE_PRINTER)->get_config(); + + /// --- scale --- + //model is created for a 0.4 nozzle, scale xy with nozzle size. + const ConfigOptionFloats* nozzle_diameter = printerConfig->option("nozzle_diameter"); + assert(nozzle_diameter->values.size() > 0); + float xyScale = nozzle_diameter->values[0] / 0.4; + //scale z with the first_layer_height + const ConfigOptionFloatOrPercent* first_layer_height = printConfig->option("first_layer_height"); + float zscale = first_layer_height->get_abs_value(nozzle_diameter->values[0]) / 0.2; + //do scaling + if (xyScale < 0.9 || 1.2 < xyScale) { + for (size_t i = 0; i < 5; i++) + model.objects[objs_idx[i]]->scale(xyScale, xyScale, zscale); + } + + /// --- rotate --- + const ConfigOptionPoints* bed_shape = printerConfig->option("bed_shape"); + if (bed_shape->values.size() == 4) { + model.objects[objs_idx[0]]->rotate(PI / 4, { 0,0,1 }); + model.objects[objs_idx[1]]->rotate(5 * PI / 4, { 0,0,1 }); + model.objects[objs_idx[3]]->rotate(3 * PI / 4, { 0,0,1 }); + model.objects[objs_idx[4]]->rotate(7 * PI / 4, { 0,0,1 }); + } else { + model.objects[objs_idx[3]]->rotate(PI / 2, { 0,0,1 }); + model.objects[objs_idx[4]]->rotate(PI / 2, { 0,0,1 }); + } + + /// --- translate --- + //three first will stay with this orientation (top left, middle, bottom right) + //last two with 90deg (top left, middle, bottom right) + //get position for patches + Vec2d bed_size = BoundingBoxf(bed_shape->values).size(); + Vec2d bed_min = BoundingBoxf(bed_shape->values).min; + float offsetx = 10 + 10 * xyScale; + float offsety = 10 + 10 * xyScale; + if (bed_shape->values.size() > 4) { + offsetx = bed_size.x() / 2 - bed_size.x() * std::sqrtf(2) / 4 + 10 * xyScale; + offsety = bed_size.y() / 2 - bed_size.y() * std::sqrtf(2) / 4 + 10 * xyScale; + } + bool large_enough = bed_shape->values.size() == 4 ? + (bed_size.x() > offsetx * 3 && bed_size.y() > offsety * 3) : + (bed_size.x() > offsetx * 2 + 10 * xyScale && bed_size.y() > offsety * 2 + 10 * xyScale); + if (!large_enough){ + //problem : too small, use arrange instead and let the user place them. + model.arrange_objects(20); + //TODO add message + } else { + model.objects[objs_idx[0]]->translate({ bed_min.x() + offsetx, bed_min.y() + bed_size.y() - offsety,0 }); + model.objects[objs_idx[1]]->translate({ bed_min.x() + bed_size.x() - offsetx,bed_min.y() + offsety , 0 }); + model.objects[objs_idx[2]]->translate({ bed_min.x() + bed_size.x()/2, bed_min.y() + bed_size.y() / 2, 0 }); + model.objects[objs_idx[3]]->translate({ bed_min.x() + offsetx, bed_min.y() + offsety, 0 }); + model.objects[objs_idx[4]]->translate({ bed_min.x() + bed_size.x() - offsetx,bed_min.y() + bed_size.y() - offsety,0 }); + } + + /// --- main config, please modify object config when possible --- + DynamicPrintConfig new_print_config = *printConfig; //make a copy + new_print_config.set_key_value("complete_objects", new ConfigOptionBool(true)); + new_print_config.set_key_value("skirts", new ConfigOptionInt(0)); + + /// --- custom config --- + for (size_t i = 0; i < 5; i++) { + model.objects[objs_idx[i]]->config.set_key_value("perimeters", new ConfigOptionInt(2)); + model.objects[objs_idx[i]]->config.set_key_value("bottom_solid_layers", new ConfigOptionInt(2)); + model.objects[objs_idx[i]]->config.set_key_value("gap_fill", new ConfigOptionBool(false)); + model.objects[objs_idx[i]]->config.set_key_value("first_layer_extrusion_width", new ConfigOptionFloatOrPercent(140, true)); + model.objects[objs_idx[i]]->config.set_key_value("bottom_fill_pattern", new ConfigOptionEnum(ipRectilinearWGapFill)); + } + if (bed_shape->values.size() == 4) { + model.objects[objs_idx[0]]->config.set_key_value("fill_angle", new ConfigOptionFloat(90)); + model.objects[objs_idx[1]]->config.set_key_value("fill_angle", new ConfigOptionFloat(90)); + model.objects[objs_idx[2]]->config.set_key_value("fill_angle", new ConfigOptionFloat(45)); + model.objects[objs_idx[3]]->config.set_key_value("fill_angle", new ConfigOptionFloat(0)); + model.objects[objs_idx[4]]->config.set_key_value("fill_angle", new ConfigOptionFloat(0)); + } else { + for (size_t i = 0; i < 3; i++) + for (size_t i = 3; i < 5; i++) + model.objects[objs_idx[i]]->config.set_key_value("fill_angle", new ConfigOptionFloat(135)); + } + + //update plater + this->gui_app->get_tab(Preset::TYPE_PRINT)->load_config(new_print_config); + plat->on_config_change(new_print_config); + plat->changed_objects(objs_idx); + //if(!plat->is_background_process_update_scheduled()) + // plat->schedule_background_process(); + plat->reslice(); + plat->select_view_3D("Preview"); +} + +void CalibrationTempDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + msw_buttons_rescale(this, em_unit(), { wxID_OK }); + + Layout(); + Fit(); + Refresh(); +} + +wxPanel* CalibrationTempDialog::create_header(wxWindow* parent, const wxFont& bold_font) +{ + wxPanel* panel = new wxPanel(parent); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + + wxFont header_font = bold_font; +#ifdef __WXOSX__ + header_font.SetPointSize(14); +#else + header_font.SetPointSize(bold_font.GetPointSize() + 2); +#endif // __WXOSX__ + + sizer->AddStretchSpacer(); + + // text + wxStaticText* text = new wxStaticText(panel, wxID_ANY, _(L("Keyboard shortcuts"))); + text->SetFont(header_font); + sizer->Add(text, 0, wxALIGN_CENTER_VERTICAL); + + sizer->AddStretchSpacer(); + + panel->SetSizer(sizer); + return panel; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/CalibrationTempDialog.hpp b/src/slic3r/GUI/CalibrationTempDialog.hpp new file mode 100644 index 000000000..2de42fdc4 --- /dev/null +++ b/src/slic3r/GUI/CalibrationTempDialog.hpp @@ -0,0 +1,39 @@ +#ifndef slic3r_GUI_CalibrationTempDialog_hpp_ +#define slic3r_GUI_CalibrationTempDialog_hpp_ + +#include +#include +#include + +#include "GUI_App.hpp" +#include "GUI_Utils.hpp" +#include "MainFrame.hpp" +#include "wxExtensions.hpp" +#include + +namespace Slic3r { +namespace GUI { + +class CalibrationTempDialog : public DPIDialog +{ + +public: + CalibrationTempDialog(GUI_App* app, MainFrame* mainframe); + +protected: + void on_dpi_changed(const wxRect &suggested_rect) override; + +private: + void create_geometry(wxCommandEvent& event_args); + wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); + + wxHtmlWindow* html_viewer; + MainFrame* main_frame; + GUI_App* gui_app; + +}; + +} // namespace GUI +} // namespace Slic3r + +#endif diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 1328937e1..89ba2d4a4 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -40,6 +40,10 @@ #include "../Utils/PrintHost.hpp" #include "../Utils/MacDarkMode.hpp" #include "slic3r/Config/Snapshot.hpp" +#include "CalibrationBedDialog.hpp" +#include "CalibrationBridgeDialog.hpp" +#include "CalibrationFlowDialog.hpp" +#include "CalibrationTempDialog.hpp" #include "ConfigSnapshotDialog.hpp" #include "FirmwareDialog.hpp" #include "Preferences.hpp" @@ -206,6 +210,8 @@ GUI_App::GUI_App() GUI_App::~GUI_App() { + delete_calibration_dialog(); + if (app_config != nullptr) delete app_config; @@ -280,6 +286,7 @@ bool GUI_App::on_init_inner() // initialize label colors and fonts init_label_colours(); init_fonts(); + wxImage::AddHandler(new wxJPEGHandler()); // If load_language() fails, the application closes. load_language(wxString(), true); @@ -532,6 +539,44 @@ void GUI_App::keyboard_shortcuts() dlg.ShowModal(); } +void GUI_App::delete_calibration_dialog() { + if (not_modal_dialog.get() != nullptr) { + not_modal_dialog->Destroy(); + } + not_modal_dialog.release(); +} + +void GUI_App::bed_leveling_dialog() +{ + delete_calibration_dialog(); + not_modal_dialog.reset(new CalibrationBedDialog(this, mainframe)); + not_modal_dialog->Show(); +} +void GUI_App::flow_ratio_dialog() +{ + delete_calibration_dialog(); + not_modal_dialog.reset(new CalibrationFlowDialog(this, mainframe)); + not_modal_dialog->Show(); +} +void GUI_App::over_bridge_dialog() +{ + delete_calibration_dialog(); + not_modal_dialog.reset(new CalibrationFlowDialog(this, mainframe)); + not_modal_dialog->Show(); +} +void GUI_App::bridge_tuning_dialog() +{ + delete_calibration_dialog(); + not_modal_dialog.reset(new CalibrationBridgeDialog(this, mainframe)); + not_modal_dialog->Show(); +} +void GUI_App::filament_temperature_dialog() +{ + delete_calibration_dialog(); + not_modal_dialog.reset(new CalibrationTempDialog(this, mainframe)); + not_modal_dialog->Show(); +} + // static method accepting a wxWindow object as first parameter bool GUI_App::catch_error(std::function cb, // wxMessageDialog* message_dialog, diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index d02a60ba9..068b92613 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -131,6 +131,13 @@ public: void recreate_GUI(); void system_info(); void keyboard_shortcuts(); + void delete_calibration_dialog(); + void bed_leveling_dialog(); + void flow_ratio_dialog(); + void filament_temperature_dialog(); + void bridge_tuning_dialog(); + void over_bridge_dialog(); + //void support_tuning(); //have to do multiple, in a submenu void load_project(wxWindow *parent, wxString& input_file) const; void import_model(wxWindow *parent, wxArrayString& input_files) const; static bool catch_error(std::function cb, const std::string& err); @@ -175,6 +182,7 @@ public: PresetUpdater* preset_updater{ nullptr }; MainFrame* mainframe{ nullptr }; Plater* plater_{ nullptr }; + std::unique_ptr not_modal_dialog; wxNotebook* tab_panel() const ; int extruders_cnt() const; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 9ea306979..3bd78e396 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -759,6 +759,22 @@ void MainFrame::init_menubar() [this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this); } + // objects menu + auto objectsMenu = new wxMenu(); + { + append_menu_item(objectsMenu, wxID_ANY, _(L("Bed/Extruder levelling")), _(L("Create a test print to help you to level your printer bed.")), + [this](wxCommandEvent&) { wxGetApp().bed_leveling_dialog(); }); + append_menu_item(objectsMenu, wxID_ANY, _(L("Flow tuning")), _(L("Create a test print to help you to set your filament extrusion multiplier.")), + [this](wxCommandEvent&) { wxGetApp().flow_ratio_dialog(); }); + //append_menu_item(objectsMenu, wxID_ANY, _(L("Ironing pattern tuning")), _(L("Create a test print to help you to set your over-bridge flow ratio.")), + // [this](wxCommandEvent&) { wxGetApp().over_bridge_dialog(); }); + //append_menu_item(objectsMenu, wxID_ANY, _(L("Filament temperature tuning")), _(L("Create a test print to help you to set your filament temperature.")), + // [this](wxCommandEvent&) { wxGetApp().filament_temperature_dialog(); }); + //append_menu_item(objectsMenu, wxID_ANY, _(L("Bridge pattern tuning")), _(L("Create a test print to help you to set your over-bridge flow ratio.")), + // [this](wxCommandEvent&) { wxGetApp().bridge_tuning_dialog(); }); + + } + // Help menu auto helpMenu = new wxMenu(); { @@ -809,6 +825,7 @@ void MainFrame::init_menubar() if (viewMenu) menubar->Append(viewMenu, _(L("&View"))); // Add additional menus from C++ wxGetApp().add_config_menu(menubar); + menubar->Append(objectsMenu, _(L("C&alibration"))); menubar->Append(helpMenu, _(L("&Help"))); SetMenuBar(menubar); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index b5cdcca4e..a76ae3c2b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -4779,6 +4779,9 @@ void Plater::remove_selected() Plater::TakeSnapshot snapshot(this, _(L("Delete Selected Objects"))); this->p->view3D->delete_selected(); } +void Plater::arrange() { + p->arrange(); +} void Plater::increase_instances(size_t num) { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 32709a4bd..d1256f7b1 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -213,6 +213,7 @@ public: void fix_through_netfabb(const int obj_idx, const int vol_idx = -1); void send_gcode(); void eject_drive(); + void arrange(); void take_snapshot(const std::string &snapshot_name); void take_snapshot(const wxString &snapshot_name); diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index a0dc06a35..2e20a376d 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -519,7 +519,8 @@ const std::vector& Preset::print_options() , "curve_smoothing_precision" , "curve_smoothing_cutoff_dist" , "curve_smoothing_angle_convex" - , "curve_smoothing_angle_concave" + , "curve_smoothing_angle_concave", + "print_extrusion_multiplier" }; return s_opts; } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 162c9293e..9cc4aa095 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -726,7 +726,7 @@ void Tab::update_tab_ui() void Tab::load_config(const DynamicPrintConfig& config) { bool modified = 0; - for(auto opt_key : m_config->diff(config)) { + for (auto opt_key : m_config->diff(config)) { m_config->set_key_value(opt_key, config.option(opt_key)->clone()); modified = 1; }