mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-15 10:47:50 -06:00
Merge branch 'feature/calib_pa' into SoftFever
This commit is contained in:
commit
473b1805ed
73 changed files with 1776 additions and 668 deletions
|
@ -704,6 +704,7 @@ elseif (SLIC3R_FHS)
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}x${SIZE}/apps RENAME BambuStudio.png
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}x${SIZE}/apps RENAME BambuStudio.png
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
install(DIRECTORY ${SLIC3R_RESOURCES_DIR}/udev/ DESTINATION lib/udev/rules.d)
|
||||||
elseif (CMAKE_MACOSX_BUNDLE)
|
elseif (CMAKE_MACOSX_BUNDLE)
|
||||||
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/BambuStudio.app/Contents/resources")
|
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/BambuStudio.app/Contents/resources")
|
||||||
else ()
|
else ()
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -1328,9 +1328,6 @@ msgstr ""
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1773,8 +1770,8 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Bambu Studio\n"
|
"Project-Id-Version: Bambu Studio\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"PO-Revision-Date: \n"
|
"PO-Revision-Date: \n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -1395,9 +1395,6 @@ msgstr ""
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1906,9 +1903,12 @@ msgstr ""
|
||||||
"Der Wert wird auf 0 zurückgesetzt."
|
"Der Wert wird auf 0 zurückgesetzt."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Der Spiralmodus funktioniert nur, wenn die Wand 1 Linienweite breit sind, \n"
|
||||||
|
"Support ist deaktiviert, die oberen Schalenschichten sind 0 und die Dichte "
|
||||||
|
"der Füllung ist 0\n"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Change these settings automatically? \n"
|
"Change these settings automatically? \n"
|
||||||
|
@ -7988,16 +7988,6 @@ msgid ""
|
||||||
"density to improve the strength of the model?"
|
"density to improve the strength of the model?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Spiral mode only works when wall loops is 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0 and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Der Spiralmodus funktioniert nur, wenn die Wand 1 Linienweite breit "
|
|
||||||
#~ "sind, \n"
|
|
||||||
#~ "Support ist deaktiviert, die oberen Schalenschichten sind 0 und die "
|
|
||||||
#~ "Dichte der Füllung ist 0\n"
|
|
||||||
|
|
||||||
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
||||||
#~ msgstr "Wählen sie eine oder mer Dateien (3mf/step/stl/obj/amf):"
|
#~ msgstr "Wählen sie eine oder mer Dateien (3mf/step/stl/obj/amf):"
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Bambu Studio\n"
|
"Project-Id-Version: Bambu Studio\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
@ -1361,9 +1361,6 @@ msgstr ""
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1862,9 +1859,11 @@ msgstr ""
|
||||||
"The value will be reset to 0."
|
"The value will be reset to 0."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Spiral mode only works when wall loops is set to 1, \n"
|
||||||
|
"support is disabled, top shell layers is 0, and sparse infill density is 0\n"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Change these settings automatically? \n"
|
"Change these settings automatically? \n"
|
||||||
|
@ -7851,15 +7850,6 @@ msgid ""
|
||||||
"density to improve the strength of the model?"
|
"density to improve the strength of the model?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Spiral mode only works when wall loops is 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0 and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Spiral mode only works when wall loops is set to 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0, and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
|
|
||||||
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
||||||
#~ msgstr "Choose one or more files (3mf/step/stl/obj/amf):"
|
#~ msgstr "Choose one or more files (3mf/step/stl/obj/amf):"
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Bambu Studio\n"
|
"Project-Id-Version: Bambu Studio\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"PO-Revision-Date: \n"
|
"PO-Revision-Date: \n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -1392,9 +1392,6 @@ msgstr ""
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1899,9 +1896,12 @@ msgstr ""
|
||||||
"El valor se restablecerá a 0."
|
"El valor se restablecerá a 0."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"El modo espiral sólo funciona cuando los bucles de pared son 1, \n"
|
||||||
|
"el soporte está desactivado, las capas superiores de la cáscara es 0 y la "
|
||||||
|
"densidad de relleno dispersa es 0\n"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Change these settings automatically? \n"
|
"Change these settings automatically? \n"
|
||||||
|
@ -7976,15 +7976,6 @@ msgid ""
|
||||||
"density to improve the strength of the model?"
|
"density to improve the strength of the model?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Spiral mode only works when wall loops is 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0 and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "El modo espiral sólo funciona cuando los bucles de pared son 1, \n"
|
|
||||||
#~ "el soporte está desactivado, las capas superiores de la cáscara es 0 y la "
|
|
||||||
#~ "densidad de relleno dispersa es 0\n"
|
|
||||||
|
|
||||||
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
||||||
#~ msgstr "Elija uno o varios archivos (3mf/step/stl/obj/amf):"
|
#~ msgstr "Elija uno o varios archivos (3mf/step/stl/obj/amf):"
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Bambu Studio\n"
|
"Project-Id-Version: Bambu Studio\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"PO-Revision-Date: \n"
|
"PO-Revision-Date: \n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -1386,9 +1386,6 @@ msgstr ""
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1880,9 +1877,12 @@ msgstr ""
|
||||||
"La valeur sera remise à 0."
|
"La valeur sera remise à 0."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Le mode spirale ne fonctionne que lorsque les boucles murales sont à 1, \n"
|
||||||
|
"le support est désactivé, les couches de coque supérieures sont à 0 et la "
|
||||||
|
"densité de remplissage clairsemée est à 0\n"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Change these settings automatically? \n"
|
"Change these settings automatically? \n"
|
||||||
|
@ -7977,15 +7977,6 @@ msgid ""
|
||||||
"density to improve the strength of the model?"
|
"density to improve the strength of the model?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Spiral mode only works when wall loops is 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0 and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Le mode spirale ne fonctionne que lorsque les boucles murales sont à 1, \n"
|
|
||||||
#~ "le support est désactivé, les couches de coque supérieures sont à 0 et la "
|
|
||||||
#~ "densité de remplissage clairsemée est à 0\n"
|
|
||||||
|
|
||||||
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
||||||
#~ msgstr "Choisissez un ou plusieurs fichiers (3mf/step/stl/obj/amf) :"
|
#~ msgstr "Choisissez un ou plusieurs fichiers (3mf/step/stl/obj/amf) :"
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Bambu Studio\n"
|
"Project-Id-Version: Bambu Studio\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"PO-Revision-Date: \n"
|
"PO-Revision-Date: \n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -1387,9 +1387,6 @@ msgstr ""
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr "A LAN-on keresztüli nyomtatáshoz helyezz be egy SD kártyát."
|
msgstr "A LAN-on keresztüli nyomtatáshoz helyezz be egy SD kártyát."
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1895,9 +1892,12 @@ msgstr ""
|
||||||
"Az érték 0-ra áll vissza."
|
"Az érték 0-ra áll vissza."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"A spirál mód csak akkor működik, ha a falak száma 1,\n"
|
||||||
|
"a támaszok ki vannak kapcsolva, a felső rétegek száma 0 és a hiányos "
|
||||||
|
"kitöltés sűrűsége 0\n"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Change these settings automatically? \n"
|
"Change these settings automatically? \n"
|
||||||
|
@ -7960,15 +7960,6 @@ msgid ""
|
||||||
"density to improve the strength of the model?"
|
"density to improve the strength of the model?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Spiral mode only works when wall loops is 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0 and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "A spirál mód csak akkor működik, ha a falak száma 1,\n"
|
|
||||||
#~ "a támaszok ki vannak kapcsolva, a felső rétegek száma 0 és a hiányos "
|
|
||||||
#~ "kitöltés sűrűsége 0\n"
|
|
||||||
|
|
||||||
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
||||||
#~ msgstr "Válassz ki egy vagy több fájlt (3mf/step/stl/obj/amf):"
|
#~ msgstr "Válassz ki egy vagy több fájlt (3mf/step/stl/obj/amf):"
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Bambu Studio\n"
|
"Project-Id-Version: Bambu Studio\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"PO-Revision-Date: \n"
|
"PO-Revision-Date: \n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -1393,9 +1393,6 @@ msgstr ""
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1901,9 +1898,12 @@ msgstr ""
|
||||||
"De waarde wordt teruggezet naar 0."
|
"De waarde wordt teruggezet naar 0."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Spiraal modus werkt alleen indien indien er 1 wall gekozen is, \n"
|
||||||
|
"support uitgeschakeld is, er 0 top layers gekozen zijn en de vulling "
|
||||||
|
"dichtheid 0 is\n"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Change these settings automatically? \n"
|
"Change these settings automatically? \n"
|
||||||
|
@ -7998,15 +7998,6 @@ msgid ""
|
||||||
"density to improve the strength of the model?"
|
"density to improve the strength of the model?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Spiral mode only works when wall loops is 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0 and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Spiraal modus werkt alleen indien indien er 1 wall gekozen is, \n"
|
|
||||||
#~ "support uitgeschakeld is, er 0 top layers gekozen zijn en de vulling "
|
|
||||||
#~ "dichtheid 0 is\n"
|
|
||||||
|
|
||||||
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
||||||
#~ msgstr "Kies een of meer bestanden (3mf/step/stl/obj/amf):"
|
#~ msgstr "Kies een of meer bestanden (3mf/step/stl/obj/amf):"
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Bambu Studio\n"
|
"Project-Id-Version: Bambu Studio\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"PO-Revision-Date: \n"
|
"PO-Revision-Date: \n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -1373,9 +1373,6 @@ msgstr ""
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -1871,9 +1868,11 @@ msgstr ""
|
||||||
"Värdet kommer att återställas till 0."
|
"Värdet kommer att återställas till 0."
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Spiral läge fungerar bara när vägg antalet är 1,\n"
|
||||||
|
"support är inaktiverad, top lager är 0 och låg ifyllnads densitet är 0\n"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Change these settings automatically? \n"
|
"Change these settings automatically? \n"
|
||||||
|
@ -7854,14 +7853,6 @@ msgid ""
|
||||||
"density to improve the strength of the model?"
|
"density to improve the strength of the model?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Spiral mode only works when wall loops is 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0 and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Spiral läge fungerar bara när vägg antalet är 1,\n"
|
|
||||||
#~ "support är inaktiverad, top lager är 0 och låg ifyllnads densitet är 0\n"
|
|
||||||
|
|
||||||
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
#~ msgid "Choose one or more files (3mf/step/stl/obj/amf):"
|
||||||
#~ msgstr "Välj en eller flera filer (3mf/step/stl/obj/amf):"
|
#~ msgstr "Välj en eller flera filer (3mf/step/stl/obj/amf):"
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Slic3rPE\n"
|
"Project-Id-Version: Slic3rPE\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2022-12-17 12:28+0800\n"
|
"POT-Creation-Date: 2022-12-13 20:02+0800\n"
|
||||||
"PO-Revision-Date: 2022-12-13 20:18+0800\n"
|
"PO-Revision-Date: 2022-12-13 20:18+0800\n"
|
||||||
"Last-Translator: Jiang Yue <maze1024@gmail.com>\n"
|
"Last-Translator: Jiang Yue <maze1024@gmail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -1342,9 +1342,6 @@ msgstr "已发送完成,即将自动跳转到设备页面(%s秒)"
|
||||||
msgid "An SD card needs to be inserted before printing via LAN."
|
msgid "An SD card needs to be inserted before printing via LAN."
|
||||||
msgstr "需要插入SD卡后方可发送局域网打印"
|
msgstr "需要插入SD卡后方可发送局域网打印"
|
||||||
|
|
||||||
msgid "Failed to send the print job. Please try again."
|
|
||||||
msgstr "无法发送打印任务,请重试。"
|
|
||||||
|
|
||||||
msgid "Send to Printer failed. Please try again."
|
msgid "Send to Printer failed. Please try again."
|
||||||
msgstr "发送到打印机失败。请重试。"
|
msgstr "发送到打印机失败。请重试。"
|
||||||
|
|
||||||
|
@ -1827,9 +1824,10 @@ msgstr ""
|
||||||
"这个数值将被重置为0。"
|
"这个数值将被重置为0。"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Spiral mode only works when wall loops is 1, support is disabled, top shell "
|
"Spiral mode only works when wall loops is 1, \n"
|
||||||
"layers is 0, sparse infill density is 0 and timelapse type is traditional"
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"
|
||||||
msgstr "旋转模式只能在外墙层数为1,关闭支撑,顶层层数为0,稀疏填充密度为0,传统延时摄影时有效"
|
msgstr ""
|
||||||
|
"旋转模式只能在外墙层数为1,关闭支撑,顶层层数为0,稀疏填充密度为0时有效。\n"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Change these settings automatically? \n"
|
"Change these settings automatically? \n"
|
||||||
|
@ -7843,14 +7841,6 @@ msgstr ""
|
||||||
"提高强度\n"
|
"提高强度\n"
|
||||||
"你知道吗?你可以使用更多的墙层数和更高的疏散填充密度来提高模型的强度。"
|
"你知道吗?你可以使用更多的墙层数和更高的疏散填充密度来提高模型的强度。"
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Spiral mode only works when wall loops is 1, \n"
|
|
||||||
#~ "support is disabled, top shell layers is 0 and sparse infill density is "
|
|
||||||
#~ "0\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "旋转模式只能在外墙层数为1,关闭支撑,顶层层数为0,稀疏填充密度为0时有"
|
|
||||||
#~ "效。\n"
|
|
||||||
|
|
||||||
#~ msgid ""
|
#~ msgid ""
|
||||||
#~ "When sparse infill density is low, the internal solid infill or internal "
|
#~ "When sparse infill density is low, the internal solid infill or internal "
|
||||||
#~ "bridge may have no archor at the end of line. This cause falling and bad "
|
#~ "bridge may have no archor at the end of line. This cause falling and bad "
|
||||||
|
@ -8641,6 +8631,9 @@ msgstr ""
|
||||||
#~ msgid "Uploading print job timed out. Please try again."
|
#~ msgid "Uploading print job timed out. Please try again."
|
||||||
#~ msgstr "上传打印任务超时,请重试。"
|
#~ msgstr "上传打印任务超时,请重试。"
|
||||||
|
|
||||||
|
#~ msgid "Failed to send the print job. Please try again."
|
||||||
|
#~ msgstr "无法发送打印任务,请重试。"
|
||||||
|
|
||||||
#~ msgid "Sending print task timed out. Please try again."
|
#~ msgid "Sending print task timed out. Please try again."
|
||||||
#~ msgstr "发送打印任务超时,请重试。"
|
#~ msgstr "发送打印任务超时,请重试。"
|
||||||
|
|
||||||
|
|
|
@ -10,5 +10,5 @@ cd %WP%
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake .. -G "Visual Studio 16 2019" -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./BambuStudio-SoftFever" -DCMAKE_BUILD_TYPE=Release -DWIN10SDK_PATH="C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0"
|
cmake .. -G "Visual Studio 16 2019" -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./BambuStudio-SoftFever" -DCMAKE_BUILD_TYPE=Release -DWIN10SDK_PATH="C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0"
|
||||||
cmake --build . --config Release --target ALL_BUILD -- -m
|
@REM cmake --build . --config Release --target ALL_BUILD -- -m
|
||||||
cmake --build . --target install --config Release
|
@REM cmake --build . --target install --config Release
|
|
@ -293,7 +293,7 @@ if(NOT TBB_FOUND)
|
||||||
# Create targets
|
# Create targets
|
||||||
##################################
|
##################################
|
||||||
|
|
||||||
if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND AND NOT TARGET TBB::tbb)
|
if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND)
|
||||||
add_library(TBB::tbb UNKNOWN IMPORTED)
|
add_library(TBB::tbb UNKNOWN IMPORTED)
|
||||||
set_target_properties(TBB::tbb PROPERTIES
|
set_target_properties(TBB::tbb PROPERTIES
|
||||||
INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}"
|
INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}"
|
||||||
|
|
23
deps/Boost/Boost.cmake
vendored
23
deps/Boost/Boost.cmake
vendored
|
@ -8,10 +8,12 @@ else()
|
||||||
set(_build_cmd ./b2)
|
set(_build_cmd ./b2)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/common.jam ./tools/build/src/tools/common.jam)
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
set(_boost_toolset gcc)
|
|
||||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam)
|
configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam)
|
||||||
set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam)
|
set(_boost_toolset gcc)
|
||||||
|
set(_patch_command ${_patch_command} && ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam)
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
# https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html
|
# https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html
|
||||||
if (MSVC_VERSION EQUAL 1800)
|
if (MSVC_VERSION EQUAL 1800)
|
||||||
|
@ -26,9 +28,6 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
elseif (MSVC_VERSION LESS 1930)
|
elseif (MSVC_VERSION LESS 1930)
|
||||||
# 1920-1929 = VS 16.0 (v142 toolset)
|
# 1920-1929 = VS 16.0 (v142 toolset)
|
||||||
set(_boost_toolset "msvc-14.2")
|
set(_boost_toolset "msvc-14.2")
|
||||||
elseif (MSVC_VERSION LESS 1940)
|
|
||||||
# 1930-1939 = VS 17.0 (v143 toolset)
|
|
||||||
set(_boost_toolset "msvc-14.3")
|
|
||||||
else ()
|
else ()
|
||||||
message(FATAL_ERROR "Unsupported MSVC version")
|
message(FATAL_ERROR "Unsupported MSVC version")
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -36,9 +35,7 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(_boost_toolset "clang-win")
|
set(_boost_toolset "clang-win")
|
||||||
else()
|
else()
|
||||||
set(_boost_toolset clang)
|
set(_boost_toolset "clang")
|
||||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam)
|
|
||||||
set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam)
|
|
||||||
endif()
|
endif()
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
|
||||||
set(_boost_toolset "intel")
|
set(_boost_toolset "intel")
|
||||||
|
@ -73,9 +70,7 @@ file(TO_NATIVE_PATH ${DESTDIR}/usr/local/ _prefix)
|
||||||
set(_boost_flags "")
|
set(_boost_flags "")
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
set(_boost_flags "cflags=-fPIC;cxxflags=-fPIC")
|
set(_boost_flags "cflags=-fPIC;cxxflags=-fPIC")
|
||||||
endif ()
|
elseif(APPLE)
|
||||||
|
|
||||||
if(APPLE)
|
|
||||||
set(_boost_flags
|
set(_boost_flags
|
||||||
"cflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET};"
|
"cflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET};"
|
||||||
"cxxflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET};"
|
"cxxflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET};"
|
||||||
|
@ -97,7 +92,7 @@ if (_cfg_rel GREATER -1 OR _cfg_relwdeb GREATER -1 OR _cfg_minsizerel GREATER -1
|
||||||
list(APPEND _boost_variants release)
|
list(APPEND _boost_variants release)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if ( (NOT MSVC AND _cfg_deb GREATER -1) OR (MSVC AND ${DEP_DEBUG}) )
|
if (_cfg_deb GREATER -1 OR (MSVC AND ${DEP_DEBUG}) )
|
||||||
list(APPEND _boost_variants debug)
|
list(APPEND _boost_variants debug)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -124,8 +119,8 @@ set(_install_cmd ${_build_cmd} --prefix=${_prefix} install)
|
||||||
|
|
||||||
ExternalProject_Add(
|
ExternalProject_Add(
|
||||||
dep_Boost
|
dep_Boost
|
||||||
URL "https://boostorg.jfrog.io/artifactory/main/release/1.78.0/source/boost_1_78_0.zip"
|
URL "https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz"
|
||||||
URL_HASH SHA256=f22143b5528e081123c3c5ed437e92f648fe69748e95fa6e2bd41484e2986cc3
|
URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a
|
||||||
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Boost
|
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Boost
|
||||||
CONFIGURE_COMMAND "${_bootstrap_cmd}"
|
CONFIGURE_COMMAND "${_bootstrap_cmd}"
|
||||||
PATCH_COMMAND ${_patch_command}
|
PATCH_COMMAND ${_patch_command}
|
||||||
|
|
1095
deps/Boost/common.jam
vendored
Normal file
1095
deps/Boost/common.jam
vendored
Normal file
File diff suppressed because it is too large
Load diff
2
deps/Boost/user-config.jam
vendored
2
deps/Boost/user-config.jam
vendored
|
@ -1 +1 @@
|
||||||
using @_boost_toolset@ : : @CMAKE_CXX_COMPILER@ ;
|
using gcc : : @CMAKE_CXX_COMPILER@ ;
|
3
deps/CURL/CURL.cmake
vendored
3
deps/CURL/CURL.cmake
vendored
|
@ -25,8 +25,7 @@ set(_curl_platform_flags
|
||||||
)
|
)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
#set(_curl_platform_flags ${_curl_platform_flags} -DCMAKE_USE_SCHANNEL=ON)
|
set(_curl_platform_flags ${_curl_platform_flags} -DCMAKE_USE_SCHANNEL=ON)
|
||||||
set(_curl_platform_flags ${_curl_platform_flags} -DCMAKE_USE_OPENSSL=ON -DCURL_CA_PATH:STRING=none)
|
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
set(_curl_platform_flags
|
set(_curl_platform_flags
|
||||||
|
|
||||||
|
|
4
deps/deps-windows.cmake
vendored
4
deps/deps-windows.cmake
vendored
|
@ -15,10 +15,6 @@ elseif (MSVC_VERSION LESS 1930)
|
||||||
# 1920-1929 = VS 16.0 (v142 toolset)
|
# 1920-1929 = VS 16.0 (v142 toolset)
|
||||||
set(DEP_VS_VER "16")
|
set(DEP_VS_VER "16")
|
||||||
set(DEP_BOOST_TOOLSET "msvc-14.2")
|
set(DEP_BOOST_TOOLSET "msvc-14.2")
|
||||||
elseif (MSVC_VERSION LESS 1940)
|
|
||||||
# 1930-1939 = VS 17.0 (v143 toolset)
|
|
||||||
set(DEP_VS_VER "17")
|
|
||||||
set(DEP_BOOST_TOOLSET "msvc-14.3")
|
|
||||||
else ()
|
else ()
|
||||||
message(FATAL_ERROR "Unsupported MSVC version")
|
message(FATAL_ERROR "Unsupported MSVC version")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
BIN
resources/calib/pressure_advance_test.stl
Normal file
BIN
resources/calib/pressure_advance_test.stl
Normal file
Binary file not shown.
|
@ -21,7 +21,7 @@
|
||||||
"FUNC_SEND_TO_SDCARD": false
|
"FUNC_SEND_TO_SDCARD": false
|
||||||
},
|
},
|
||||||
"camera_resolution":["720p"],
|
"camera_resolution":["720p"],
|
||||||
"bed_temperature_limit": 100,
|
"bed_temperature_limit": 120,
|
||||||
"model_id": "C11",
|
"model_id": "C11",
|
||||||
"printer_type": "C11",
|
"printer_type": "C11",
|
||||||
"printer_thumbnail_image": "printer_thumbnail_p1p"
|
"printer_thumbnail_image": "printer_thumbnail_p1p"
|
||||||
|
@ -32,6 +32,7 @@
|
||||||
"FUNC_LOCAL_TUNNEL": false
|
"FUNC_LOCAL_TUNNEL": false
|
||||||
},
|
},
|
||||||
"camera_resolution":["720p","1080p"],
|
"camera_resolution":["720p","1080p"],
|
||||||
|
"bed_temperature_limit": 120,
|
||||||
"model_id": "BL-P002",
|
"model_id": "BL-P002",
|
||||||
"printer_type": "3DPrinter-X1",
|
"printer_type": "3DPrinter-X1",
|
||||||
"printer_thumbnail_image": "printer_thumbnail"
|
"printer_thumbnail_image": "printer_thumbnail"
|
||||||
|
@ -43,6 +44,7 @@
|
||||||
},
|
},
|
||||||
"model_id": "BL-P001",
|
"model_id": "BL-P001",
|
||||||
"camera_resolution":["720p","1080p"],
|
"camera_resolution":["720p","1080p"],
|
||||||
|
"bed_temperature_limit": 120,
|
||||||
"printer_type": "3DPrinter-X1-Carbon",
|
"printer_type": "3DPrinter-X1-Carbon",
|
||||||
"printer_thumbnail_image": "printer_thumbnail"
|
"printer_thumbnail_image": "printer_thumbnail"
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
15
resources/images/calib_sf.svg
Normal file
15
resources/images/calib_sf.svg
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_8074_35820)">
|
||||||
|
<path d="M2.1084 3.09195C2.1084 2.81581 2.33226 2.59195 2.6084 2.59195H11.3915C11.6677 2.59195 11.8915 2.81581 11.8915 3.09195V11.8751C11.8915 12.1512 11.6677 12.3751 11.3915 12.3751H2.6084C2.33226 12.3751 2.1084 12.1512 2.1084 11.8751V3.09195Z" fill="#505050"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.1084 3.59195V11.3751H10.8915V3.59195H3.1084ZM2.6084 2.59195C2.33226 2.59195 2.1084 2.81581 2.1084 3.09195V11.8751C2.1084 12.1512 2.33226 12.3751 2.6084 12.3751H11.3915C11.6677 12.3751 11.8915 12.1512 11.8915 11.8751V3.09195C11.8915 2.81581 11.6677 2.59195 11.3915 2.59195H2.6084Z" fill="#F7F7F7"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.6709 5.48537L6.6709 0.48352L7.6709 0.483521L7.6709 5.48537L6.6709 5.48537Z" fill="#F7F7F7"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.6709 14.4835L6.6709 9.48166L7.6709 9.48166L7.6709 14.4835L6.6709 14.4835Z" fill="#F7F7F7"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.99815 6.93469L14 6.93469L14 7.93469L8.99815 7.93469L8.99815 6.93469Z" fill="#F7F7F7"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.000104992 6.93469L5.00195 6.93469L5.00195 7.93469L0.000104904 7.93469L0.000104992 6.93469Z" fill="#F7F7F7"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_8074_35820">
|
||||||
|
<rect width="14" height="14" fill="white" transform="translate(0 14.4835) rotate(-90)"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
17
resources/images/calib_sf_inactive.svg
Normal file
17
resources/images/calib_sf_inactive.svg
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g opacity="0.5">
|
||||||
|
<g clip-path="url(#clip0_8074_35820)">
|
||||||
|
<path d="M2.1084 3.09195C2.1084 2.81581 2.33226 2.59195 2.6084 2.59195H11.3915C11.6677 2.59195 11.8915 2.81581 11.8915 3.09195V11.8751C11.8915 12.1512 11.6677 12.3751 11.3915 12.3751H2.6084C2.33226 12.3751 2.1084 12.1512 2.1084 11.8751V3.09195Z" fill="#505050"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.1084 3.59195V11.3751H10.8915V3.59195H3.1084ZM2.6084 2.59195C2.33226 2.59195 2.1084 2.81581 2.1084 3.09195V11.8751C2.1084 12.1512 2.33226 12.3751 2.6084 12.3751H11.3915C11.6677 12.3751 11.8915 12.1512 11.8915 11.8751V3.09195C11.8915 2.81581 11.6677 2.59195 11.3915 2.59195H2.6084Z" fill="#F7F7F7"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.6709 5.48537L6.6709 0.48352L7.6709 0.483521L7.6709 5.48537L6.6709 5.48537Z" fill="#F7F7F7"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.6709 14.4835L6.6709 9.48166L7.6709 9.48166L7.6709 14.4835L6.6709 14.4835Z" fill="#F7F7F7"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.99815 6.93469L14 6.93469L14 7.93469L8.99815 7.93469L8.99815 6.93469Z" fill="#F7F7F7"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.000104992 6.93469L5.00195 6.93469L5.00195 7.93469L0.000104904 7.93469L0.000104992 6.93469Z" fill="#F7F7F7"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_8074_35820">
|
||||||
|
<rect width="14" height="14" fill="white" transform="translate(0 14.4835) rotate(-90)"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -3,7 +3,6 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <mutex>
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
#include <boost/filesystem/operations.hpp>
|
#include <boost/filesystem/operations.hpp>
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
bool write_to_pot(boost::filesystem::path path, const std::vector<std::pair<std::string, std::string>>& data)
|
bool write_to_pot(boost::filesystem::path path, const std::vector<std::pair<std::string, std::string>>& data)
|
||||||
{
|
{
|
||||||
boost::nowide::ofstream file(path.string(), std::ios_base::app);
|
boost::filesystem::ofstream file(std::move(path), std::ios_base::app);
|
||||||
for (const auto& element : data)
|
for (const auto& element : data)
|
||||||
{
|
{
|
||||||
//Example of .pot element
|
//Example of .pot element
|
||||||
|
|
|
@ -369,6 +369,8 @@ set(lisbslic3r_sources
|
||||||
Arachne/WallToolPaths.cpp
|
Arachne/WallToolPaths.cpp
|
||||||
Shape/TextShape.hpp
|
Shape/TextShape.hpp
|
||||||
Shape/TextShape.cpp
|
Shape/TextShape.cpp
|
||||||
|
calib.hpp
|
||||||
|
calib.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef slic3r_Format_3mf_hpp_
|
#ifndef slic3r_Format_3mf_hpp_
|
||||||
#define slic3r_Format_3mf_hpp_
|
#define slic3r_Format_3mf_hpp_
|
||||||
#include <expat.h>
|
#include "../expat.h"
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
// PrusaFileParser is used to check 3mf file is from Prusa
|
// PrusaFileParser is used to check 3mf file is from Prusa
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
#include <boost/algorithm/string/predicate.hpp>
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
#include <boost/filesystem/operations.hpp>
|
#include <boost/filesystem/operations.hpp>
|
||||||
#include <boost/filesystem/string_file.hpp>
|
|
||||||
#include <boost/nowide/fstream.hpp>
|
#include <boost/nowide/fstream.hpp>
|
||||||
#include <boost/nowide/cstdio.hpp>
|
#include <boost/nowide/cstdio.hpp>
|
||||||
#include <boost/spirit/include/karma.hpp>
|
#include <boost/spirit/include/karma.hpp>
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include "SVG.hpp"
|
#include "SVG.hpp"
|
||||||
|
|
||||||
#include <tbb/parallel_for.h>
|
#include <tbb/parallel_for.h>
|
||||||
|
#include "calib.hpp"
|
||||||
// Intel redesigned some TBB interface considerably when merging TBB with their oneAPI set of libraries, see GH #7332.
|
// Intel redesigned some TBB interface considerably when merging TBB with their oneAPI set of libraries, see GH #7332.
|
||||||
// We are using quite an old TBB 2017 U7. Before we update our build servers, let's use the old API, which is deprecated in up to date TBB.
|
// We are using quite an old TBB 2017 U7. Before we update our build servers, let's use the old API, which is deprecated in up to date TBB.
|
||||||
#if ! defined(TBB_VERSION_MAJOR)
|
#if ! defined(TBB_VERSION_MAJOR)
|
||||||
|
@ -1633,73 +1633,165 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
|
||||||
this->m_objSupportsWithBrim.insert(iter->first);
|
this->m_objSupportsWithBrim.insert(iter->first);
|
||||||
}
|
}
|
||||||
if (this->m_objsWithBrim.empty() && this->m_objSupportsWithBrim.empty()) m_brim_done = true;
|
if (this->m_objsWithBrim.empty() && this->m_objSupportsWithBrim.empty()) m_brim_done = true;
|
||||||
|
if (print.is_calib_mode() == Calib_PA_DDE || print.is_calib_mode() == Calib_PA_Bowden) {
|
||||||
|
std::string gcode;
|
||||||
|
auto s = m_config.inner_wall_speed.value;
|
||||||
|
gcode += m_writer.set_acceleration((unsigned int)floor(m_config.outer_wall_acceleration.value + 0.5));
|
||||||
|
|
||||||
//BBS: open spaghetti detector
|
if (m_config.default_jerk.value > 0) {
|
||||||
if (is_bbl_printers) {
|
double jerk = m_config.outer_wall_jerk.value;
|
||||||
// if (print.config().spaghetti_detector.value)
|
gcode += m_writer.set_jerk_xy((unsigned int)floor(jerk + 0.5));
|
||||||
file.write("M981 S1 P20000 ;open spaghetti detector\n");
|
}
|
||||||
|
m_config.outer_wall_speed = print.default_region_config().outer_wall_speed;
|
||||||
|
m_config.inner_wall_speed = print.default_region_config().inner_wall_speed;
|
||||||
|
calib_pressure_advance pa_test(this);
|
||||||
|
if(print.is_calib_mode() == Calib_PA_DDE)
|
||||||
|
gcode += pa_test.generate_test();
|
||||||
|
else
|
||||||
|
gcode +=pa_test.generate_test(0.0,0.02);
|
||||||
|
|
||||||
|
file.write(gcode);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
//BBS: open spaghetti detector
|
||||||
|
if (is_bbl_printers) {
|
||||||
|
// if (print.config().spaghetti_detector.value)
|
||||||
|
file.write("M981 S1 P20000 ;open spaghetti detector\n");
|
||||||
|
}
|
||||||
|
|
||||||
// Do all objects for each layer.
|
// Do all objects for each layer.
|
||||||
if (print.config().print_sequence == PrintSequence::ByObject) {
|
if (print.config().print_sequence == PrintSequence::ByObject) {
|
||||||
size_t finished_objects = 0;
|
size_t finished_objects = 0;
|
||||||
const PrintObject *prev_object = (*print_object_instance_sequential_active)->print_object;
|
const PrintObject* prev_object = (*print_object_instance_sequential_active)->print_object;
|
||||||
for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++ print_object_instance_sequential_active) {
|
for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++print_object_instance_sequential_active) {
|
||||||
const PrintObject &object = *(*print_object_instance_sequential_active)->print_object;
|
const PrintObject& object = *(*print_object_instance_sequential_active)->print_object;
|
||||||
if (&object != prev_object || tool_ordering.first_extruder() != final_extruder_id) {
|
if (&object != prev_object || tool_ordering.first_extruder() != final_extruder_id) {
|
||||||
tool_ordering = ToolOrdering(object, final_extruder_id);
|
tool_ordering = ToolOrdering(object, final_extruder_id);
|
||||||
unsigned int new_extruder_id = tool_ordering.first_extruder();
|
unsigned int new_extruder_id = tool_ordering.first_extruder();
|
||||||
if (new_extruder_id == (unsigned int)-1)
|
if (new_extruder_id == (unsigned int)-1)
|
||||||
// Skip this object.
|
// Skip this object.
|
||||||
continue;
|
continue;
|
||||||
initial_extruder_id = new_extruder_id;
|
initial_extruder_id = new_extruder_id;
|
||||||
final_extruder_id = tool_ordering.last_extruder();
|
final_extruder_id = tool_ordering.last_extruder();
|
||||||
assert(final_extruder_id != (unsigned int)-1);
|
assert(final_extruder_id != (unsigned int)-1);
|
||||||
}
|
}
|
||||||
print.throw_if_canceled();
|
print.throw_if_canceled();
|
||||||
this->set_origin(unscale((*print_object_instance_sequential_active)->shift));
|
this->set_origin(unscale((*print_object_instance_sequential_active)->shift));
|
||||||
|
|
||||||
// BBS: prime extruder if extruder change happens before this object instance
|
// BBS: prime extruder if extruder change happens before this object instance
|
||||||
bool prime_extruder = false;
|
bool prime_extruder = false;
|
||||||
if (finished_objects > 0) {
|
if (finished_objects > 0) {
|
||||||
// Move to the origin position for the copy we're going to print.
|
// Move to the origin position for the copy we're going to print.
|
||||||
// This happens before Z goes down to layer 0 again, so that no collision happens hopefully.
|
// This happens before Z goes down to layer 0 again, so that no collision happens hopefully.
|
||||||
m_enable_cooling_markers = false; // we're not filtering these moves through CoolingBuffer
|
m_enable_cooling_markers = false; // we're not filtering these moves through CoolingBuffer
|
||||||
m_avoid_crossing_perimeters.use_external_mp_once();
|
m_avoid_crossing_perimeters.use_external_mp_once();
|
||||||
// BBS. change tool before moving to origin point.
|
// BBS. change tool before moving to origin point.
|
||||||
if (m_writer.need_toolchange(initial_extruder_id)) {
|
if (m_writer.need_toolchange(initial_extruder_id)) {
|
||||||
const PrintObjectConfig& object_config = object.config();
|
const PrintObjectConfig& object_config = object.config();
|
||||||
coordf_t initial_layer_print_height = print.config().initial_layer_print_height.value;
|
coordf_t initial_layer_print_height = print.config().initial_layer_print_height.value;
|
||||||
file.write(this->set_extruder(initial_extruder_id, initial_layer_print_height));
|
file.write(this->set_extruder(initial_extruder_id, initial_layer_print_height));
|
||||||
prime_extruder = true;
|
prime_extruder = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
file.write(this->retract());
|
||||||
|
}
|
||||||
|
file.write(m_writer.travel_to_z(m_max_layer_z));
|
||||||
|
file.write(this->travel_to(Point(0, 0), erNone, "move to origin position for next object"));
|
||||||
|
m_enable_cooling_markers = true;
|
||||||
|
// Disable motion planner when traveling to first object point.
|
||||||
|
m_avoid_crossing_perimeters.disable_once();
|
||||||
|
// Ff we are printing the bottom layer of an object, and we have already finished
|
||||||
|
// another one, set first layer temperatures. This happens before the Z move
|
||||||
|
// is triggered, so machine has more time to reach such temperatures.
|
||||||
|
m_placeholder_parser.set("current_object_idx", int(finished_objects));
|
||||||
|
//BBS: remove printing_by_object_gcode
|
||||||
|
//std::string printing_by_object_gcode = this->placeholder_parser_process("printing_by_object_gcode", print.config().printing_by_object_gcode.value, initial_extruder_id);
|
||||||
|
std::string printing_by_object_gcode;
|
||||||
|
// Set first layer bed and extruder temperatures, don't wait for it to reach the temperature.
|
||||||
|
this->_print_first_layer_bed_temperature(file, print, printing_by_object_gcode, initial_extruder_id, false);
|
||||||
|
this->_print_first_layer_extruder_temperatures(file, print, printing_by_object_gcode, initial_extruder_id, false);
|
||||||
|
file.writeln(printing_by_object_gcode);
|
||||||
}
|
}
|
||||||
else {
|
// Reset the cooling buffer internal state (the current position, feed rate, accelerations).
|
||||||
file.write(this->retract());
|
m_cooling_buffer->reset(this->writer().get_position());
|
||||||
|
m_cooling_buffer->set_current_extruder(initial_extruder_id);
|
||||||
|
// Process all layers of a single object instance (sequential mode) with a parallel pipeline:
|
||||||
|
// Generate G-code, run the filters (vase mode, cooling buffer), run the G-code analyser
|
||||||
|
// and export G-code into file.
|
||||||
|
this->process_layers(print, tool_ordering, collect_layers_to_print(object), *print_object_instance_sequential_active - object.instances().data(), file, prime_extruder);
|
||||||
|
//BBS: close powerlost recovery
|
||||||
|
{
|
||||||
|
if (is_bbl_printers && m_second_layer_things_done) {
|
||||||
|
file.write("; close powerlost recovery\n");
|
||||||
|
file.write("M1003 S0\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
file.write(m_writer.travel_to_z(m_max_layer_z));
|
#ifdef HAS_PRESSURE_EQUALIZER
|
||||||
file.write(this->travel_to(Point(0, 0), erNone, "move to origin position for next object"));
|
if (m_pressure_equalizer)
|
||||||
m_enable_cooling_markers = true;
|
file.write(m_pressure_equalizer->process("", true));
|
||||||
// Disable motion planner when traveling to first object point.
|
#endif /* HAS_PRESSURE_EQUALIZER */
|
||||||
m_avoid_crossing_perimeters.disable_once();
|
++finished_objects;
|
||||||
// Ff we are printing the bottom layer of an object, and we have already finished
|
// Flag indicating whether the nozzle temperature changes from 1st to 2nd layer were performed.
|
||||||
// another one, set first layer temperatures. This happens before the Z move
|
// Reset it when starting another object from 1st layer.
|
||||||
// is triggered, so machine has more time to reach such temperatures.
|
m_second_layer_things_done = false;
|
||||||
m_placeholder_parser.set("current_object_idx", int(finished_objects));
|
prev_object = &object;
|
||||||
//BBS: remove printing_by_object_gcode
|
|
||||||
//std::string printing_by_object_gcode = this->placeholder_parser_process("printing_by_object_gcode", print.config().printing_by_object_gcode.value, initial_extruder_id);
|
|
||||||
std::string printing_by_object_gcode;
|
|
||||||
// Set first layer bed and extruder temperatures, don't wait for it to reach the temperature.
|
|
||||||
this->_print_first_layer_bed_temperature(file, print, printing_by_object_gcode, initial_extruder_id, false);
|
|
||||||
this->_print_first_layer_extruder_temperatures(file, print, printing_by_object_gcode, initial_extruder_id, false);
|
|
||||||
file.writeln(printing_by_object_gcode);
|
|
||||||
}
|
}
|
||||||
// Reset the cooling buffer internal state (the current position, feed rate, accelerations).
|
}
|
||||||
m_cooling_buffer->reset(this->writer().get_position());
|
else {
|
||||||
m_cooling_buffer->set_current_extruder(initial_extruder_id);
|
// Sort layers by Z.
|
||||||
// Process all layers of a single object instance (sequential mode) with a parallel pipeline:
|
// All extrusion moves with the same top layer height are extruded uninterrupted.
|
||||||
|
std::vector<std::pair<coordf_t, std::vector<LayerToPrint>>> layers_to_print = collect_layers_to_print(print);
|
||||||
|
// Prusa Multi-Material wipe tower.
|
||||||
|
if (has_wipe_tower && !layers_to_print.empty()) {
|
||||||
|
m_wipe_tower.reset(new WipeTowerIntegration(print.config(), print.get_plate_index(), print.get_plate_origin(), *print.wipe_tower_data().priming.get(), print.wipe_tower_data().tool_changes, *print.wipe_tower_data().final_purge.get()));
|
||||||
|
//BBS
|
||||||
|
//file.write(m_writer.travel_to_z(initial_layer_print_height + m_config.z_offset.value, "Move to the first layer height"));
|
||||||
|
file.write(m_writer.travel_to_z(initial_layer_print_height, "Move to the first layer height"));
|
||||||
|
#if 0
|
||||||
|
if (print.config().single_extruder_multi_material_priming) {
|
||||||
|
file.write(m_wipe_tower->prime(*this));
|
||||||
|
// Verify, whether the print overaps the priming extrusions.
|
||||||
|
BoundingBoxf bbox_print(get_print_extrusions_extents(print));
|
||||||
|
coordf_t twolayers_printz = ((layers_to_print.size() == 1) ? layers_to_print.front() : layers_to_print[1]).first + EPSILON;
|
||||||
|
for (const PrintObject* print_object : print.objects())
|
||||||
|
bbox_print.merge(get_print_object_extrusions_extents(*print_object, twolayers_printz));
|
||||||
|
bbox_print.merge(get_wipe_tower_extrusions_extents(print, twolayers_printz));
|
||||||
|
BoundingBoxf bbox_prime(get_wipe_tower_priming_extrusions_extents(print));
|
||||||
|
bbox_prime.offset(0.5f);
|
||||||
|
bool overlap = bbox_prime.overlap(bbox_print);
|
||||||
|
|
||||||
|
if (print.config().gcode_flavor == gcfMarlinLegacy || print.config().gcode_flavor == gcfMarlinFirmware) {
|
||||||
|
file.write(this->retract());
|
||||||
|
file.write("M300 S800 P500\n"); // Beep for 500ms, tone 800Hz.
|
||||||
|
if (overlap) {
|
||||||
|
// Wait for the user to remove the priming extrusions.
|
||||||
|
file.write("M1 Remove priming towers and click button.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Just wait for a bit to let the user check, that the priming succeeded.
|
||||||
|
//TODO Add a message explaining what the printer is waiting for. This needs a firmware fix.
|
||||||
|
file.write("M1 S10\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//BBS: only support Marlin
|
||||||
|
//else {
|
||||||
|
// This is not Marlin, M1 command is probably not supported.
|
||||||
|
//if (overlap) {
|
||||||
|
// print.active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL,
|
||||||
|
// _(L("Your print is very close to the priming regions. "
|
||||||
|
// "Make sure there is no collision.")));
|
||||||
|
//} else {
|
||||||
|
// // Just continue printing, no action necessary.
|
||||||
|
//}
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
print.throw_if_canceled();
|
||||||
|
}
|
||||||
|
// Process all layers of all objects (non-sequential mode) with a parallel pipeline:
|
||||||
// Generate G-code, run the filters (vase mode, cooling buffer), run the G-code analyser
|
// Generate G-code, run the filters (vase mode, cooling buffer), run the G-code analyser
|
||||||
// and export G-code into file.
|
// and export G-code into file.
|
||||||
this->process_layers(print, tool_ordering, collect_layers_to_print(object), *print_object_instance_sequential_active - object.instances().data(), file, prime_extruder);
|
this->process_layers(print, tool_ordering, print_object_instances_ordering, layers_to_print, file);
|
||||||
//BBS: close powerlost recovery
|
//BBS: close powerlost recovery
|
||||||
{
|
{
|
||||||
if (is_bbl_printers && m_second_layer_things_done) {
|
if (is_bbl_printers && m_second_layer_things_done) {
|
||||||
|
@ -1711,82 +1803,11 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
|
||||||
if (m_pressure_equalizer)
|
if (m_pressure_equalizer)
|
||||||
file.write(m_pressure_equalizer->process("", true));
|
file.write(m_pressure_equalizer->process("", true));
|
||||||
#endif /* HAS_PRESSURE_EQUALIZER */
|
#endif /* HAS_PRESSURE_EQUALIZER */
|
||||||
++ finished_objects;
|
if (m_wipe_tower)
|
||||||
// Flag indicating whether the nozzle temperature changes from 1st to 2nd layer were performed.
|
// Purge the extruder, pull out the active filament.
|
||||||
// Reset it when starting another object from 1st layer.
|
file.write(m_wipe_tower->finalize(*this));
|
||||||
m_second_layer_things_done = false;
|
|
||||||
prev_object = &object;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// Sort layers by Z.
|
|
||||||
// All extrusion moves with the same top layer height are extruded uninterrupted.
|
|
||||||
std::vector<std::pair<coordf_t, std::vector<LayerToPrint>>> layers_to_print = collect_layers_to_print(print);
|
|
||||||
// Prusa Multi-Material wipe tower.
|
|
||||||
if (has_wipe_tower && ! layers_to_print.empty()) {
|
|
||||||
m_wipe_tower.reset(new WipeTowerIntegration(print.config(), print.get_plate_index(), print.get_plate_origin(), * print.wipe_tower_data().priming.get(), print.wipe_tower_data().tool_changes, *print.wipe_tower_data().final_purge.get()));
|
|
||||||
//BBS
|
|
||||||
//file.write(m_writer.travel_to_z(initial_layer_print_height + m_config.z_offset.value, "Move to the first layer height"));
|
|
||||||
file.write(m_writer.travel_to_z(initial_layer_print_height, "Move to the first layer height"));
|
|
||||||
#if 0
|
|
||||||
if (print.config().single_extruder_multi_material_priming) {
|
|
||||||
file.write(m_wipe_tower->prime(*this));
|
|
||||||
// Verify, whether the print overaps the priming extrusions.
|
|
||||||
BoundingBoxf bbox_print(get_print_extrusions_extents(print));
|
|
||||||
coordf_t twolayers_printz = ((layers_to_print.size() == 1) ? layers_to_print.front() : layers_to_print[1]).first + EPSILON;
|
|
||||||
for (const PrintObject *print_object : print.objects())
|
|
||||||
bbox_print.merge(get_print_object_extrusions_extents(*print_object, twolayers_printz));
|
|
||||||
bbox_print.merge(get_wipe_tower_extrusions_extents(print, twolayers_printz));
|
|
||||||
BoundingBoxf bbox_prime(get_wipe_tower_priming_extrusions_extents(print));
|
|
||||||
bbox_prime.offset(0.5f);
|
|
||||||
bool overlap = bbox_prime.overlap(bbox_print);
|
|
||||||
|
|
||||||
if (print.config().gcode_flavor == gcfMarlinLegacy || print.config().gcode_flavor == gcfMarlinFirmware) {
|
|
||||||
file.write(this->retract());
|
|
||||||
file.write("M300 S800 P500\n"); // Beep for 500ms, tone 800Hz.
|
|
||||||
if (overlap) {
|
|
||||||
// Wait for the user to remove the priming extrusions.
|
|
||||||
file.write("M1 Remove priming towers and click button.\n");
|
|
||||||
} else {
|
|
||||||
// Just wait for a bit to let the user check, that the priming succeeded.
|
|
||||||
//TODO Add a message explaining what the printer is waiting for. This needs a firmware fix.
|
|
||||||
file.write("M1 S10\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//BBS: only support Marlin
|
|
||||||
//else {
|
|
||||||
// This is not Marlin, M1 command is probably not supported.
|
|
||||||
//if (overlap) {
|
|
||||||
// print.active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL,
|
|
||||||
// _(L("Your print is very close to the priming regions. "
|
|
||||||
// "Make sure there is no collision.")));
|
|
||||||
//} else {
|
|
||||||
// // Just continue printing, no action necessary.
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
print.throw_if_canceled();
|
|
||||||
}
|
|
||||||
// Process all layers of all objects (non-sequential mode) with a parallel pipeline:
|
|
||||||
// Generate G-code, run the filters (vase mode, cooling buffer), run the G-code analyser
|
|
||||||
// and export G-code into file.
|
|
||||||
this->process_layers(print, tool_ordering, print_object_instances_ordering, layers_to_print, file);
|
|
||||||
//BBS: close powerlost recovery
|
|
||||||
{
|
|
||||||
if (is_bbl_printers && m_second_layer_things_done) {
|
|
||||||
file.write("; close powerlost recovery\n");
|
|
||||||
file.write("M1003 S0\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef HAS_PRESSURE_EQUALIZER
|
|
||||||
if (m_pressure_equalizer)
|
|
||||||
file.write(m_pressure_equalizer->process("", true));
|
|
||||||
#endif /* HAS_PRESSURE_EQUALIZER */
|
|
||||||
if (m_wipe_tower)
|
|
||||||
// Purge the extruder, pull out the active filament.
|
|
||||||
file.write(m_wipe_tower->finalize(*this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//BBS: the last retraction
|
//BBS: the last retraction
|
||||||
// Write end commands to file.
|
// Write end commands to file.
|
||||||
file.write(this->retract(false, true));
|
file.write(this->retract(false, true));
|
||||||
|
|
|
@ -194,6 +194,12 @@ public:
|
||||||
void set_layer_count(unsigned int value) { m_layer_count = value; }
|
void set_layer_count(unsigned int value) { m_layer_count = value; }
|
||||||
void apply_print_config(const PrintConfig &print_config);
|
void apply_print_config(const PrintConfig &print_config);
|
||||||
|
|
||||||
|
std::string travel_to(const Point& point, ExtrusionRole role, std::string comment);
|
||||||
|
bool needs_retraction(const Polyline& travel, ExtrusionRole role = erNone);
|
||||||
|
std::string retract(bool toolchange = false, bool is_last_retraction = false);
|
||||||
|
std::string unretract() { return m_writer.unlift() + m_writer.unretract(); }
|
||||||
|
std::string set_extruder(unsigned int extruder_id, double print_z);
|
||||||
|
|
||||||
// append full config to the given string
|
// append full config to the given string
|
||||||
static void append_full_config(const Print& print, std::string& str);
|
static void append_full_config(const Print& print, std::string& str);
|
||||||
|
|
||||||
|
@ -398,15 +404,9 @@ private:
|
||||||
// For sequential print, the instance of the object to be printing has to be defined.
|
// For sequential print, the instance of the object to be printing has to be defined.
|
||||||
const size_t single_object_instance_idx);
|
const size_t single_object_instance_idx);
|
||||||
|
|
||||||
std::string extrude_perimeters(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region);
|
std::string extrude_perimeters(const Print& print, const std::vector<ObjectByExtruder::Island::Region>& by_region);
|
||||||
std::string extrude_infill(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region, bool ironing);
|
std::string extrude_infill(const Print& print, const std::vector<ObjectByExtruder::Island::Region>& by_region, bool ironing);
|
||||||
std::string extrude_support(const ExtrusionEntityCollection &support_fills);
|
std::string extrude_support(const ExtrusionEntityCollection& support_fills);
|
||||||
|
|
||||||
std::string travel_to(const Point &point, ExtrusionRole role, std::string comment);
|
|
||||||
bool needs_retraction(const Polyline &travel, ExtrusionRole role = erNone);
|
|
||||||
std::string retract(bool toolchange = false, bool is_last_retraction = false);
|
|
||||||
std::string unretract() { return m_writer.unlift() + m_writer.unretract(); }
|
|
||||||
std::string set_extruder(unsigned int extruder_id, double print_z);
|
|
||||||
std::set<ObjectID> m_objsWithBrim; // indicates the objs with brim
|
std::set<ObjectID> m_objsWithBrim; // indicates the objs with brim
|
||||||
std::set<ObjectID> m_objSupportsWithBrim; // indicates the objs' supports with brim
|
std::set<ObjectID> m_objSupportsWithBrim; // indicates the objs' supports with brim
|
||||||
// Cache for custom seam enforcers/blockers for each layer.
|
// Cache for custom seam enforcers/blockers for each layer.
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <mutex>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
#include <boost/algorithm/string/predicate.hpp>
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <boost/filesystem/string_file.hpp>
|
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
#include <boost/nowide/iostream.hpp>
|
#include <boost/nowide/iostream.hpp>
|
||||||
|
|
||||||
|
|
|
@ -88,6 +88,12 @@ enum PrintObjectStep {
|
||||||
posInfill, posIroning, posSupportMaterial, posSimplifyPath, posSimplifySupportPath, posCount,
|
posInfill, posIroning, posSupportMaterial, posSimplifyPath, posSimplifySupportPath, posCount,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum CalibMode {
|
||||||
|
Calib_None = 0,
|
||||||
|
Calib_PA_DDE,
|
||||||
|
Calib_PA_Bowden
|
||||||
|
};
|
||||||
|
|
||||||
// A PrintRegion object represents a group of volumes to print
|
// A PrintRegion object represents a group of volumes to print
|
||||||
// sharing the same config (including the same assigned extruder(s))
|
// sharing the same config (including the same assigned extruder(s))
|
||||||
class PrintRegion
|
class PrintRegion
|
||||||
|
@ -735,7 +741,8 @@ public:
|
||||||
//SoftFever
|
//SoftFever
|
||||||
bool &is_BBL_printer() { return m_isBBLPrinter; }
|
bool &is_BBL_printer() { return m_isBBLPrinter; }
|
||||||
const bool is_BBL_printer() const { return m_isBBLPrinter; }
|
const bool is_BBL_printer() const { return m_isBBLPrinter; }
|
||||||
|
CalibMode& is_calib_mode() { return m_calib_mode; }
|
||||||
|
const CalibMode is_calib_mode() const { return m_calib_mode; }
|
||||||
protected:
|
protected:
|
||||||
// Invalidates the step, and its depending steps in Print.
|
// Invalidates the step, and its depending steps in Print.
|
||||||
bool invalidate_step(PrintStep step);
|
bool invalidate_step(PrintStep step);
|
||||||
|
@ -788,6 +795,9 @@ private:
|
||||||
//BBS: modified_count
|
//BBS: modified_count
|
||||||
int m_modified_count {0};
|
int m_modified_count {0};
|
||||||
|
|
||||||
|
//SoftFever: calibration mode, change to enum later
|
||||||
|
CalibMode m_calib_mode;
|
||||||
|
|
||||||
// To allow GCode to set the Print's GCodeExport step status.
|
// To allow GCode to set the Print's GCodeExport step status.
|
||||||
friend class GCode;
|
friend class GCode;
|
||||||
// Allow PrintObject to access m_mutex and m_cancel_callback.
|
// Allow PrintObject to access m_mutex and m_cancel_callback.
|
||||||
|
|
|
@ -2889,7 +2889,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int
|
||||||
// Generate intermediate layers.
|
// Generate intermediate layers.
|
||||||
// The first intermediate layer is the same as the 1st layer if there is no raft,
|
// The first intermediate layer is the same as the 1st layer if there is no raft,
|
||||||
// or the bottom of the first intermediate layer is aligned with the bottom of the raft contact layer.
|
// or the bottom of the first intermediate layer is aligned with the bottom of the raft contact layer.
|
||||||
// Intermediate layers are always printed with a normal extrusion flow (non-bridging).
|
// Intermediate layers are always printed with a normal etrusion flow (non-bridging).
|
||||||
size_t idx_layer_object = 0;
|
size_t idx_layer_object = 0;
|
||||||
size_t idx_extreme_first = 0;
|
size_t idx_extreme_first = 0;
|
||||||
if (! extremes.empty() && std::abs(extremes.front()->extreme_z() - m_slicing_params.raft_interface_top_z) < EPSILON) {
|
if (! extremes.empty() && std::abs(extremes.front()->extreme_z() - m_slicing_params.raft_interface_top_z) < EPSILON) {
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#define TAU (2.0 * M_PI)
|
#define TAU (2.0 * M_PI)
|
||||||
#define NO_INDEX (std::numeric_limits<unsigned int>::max())
|
#define NO_INDEX (std::numeric_limits<unsigned int>::max())
|
||||||
|
|
||||||
// #define SUPPORT_TREE_DEBUG_TO_SVG
|
//#define SUPPORT_TREE_DEBUG_TO_SVG
|
||||||
|
|
||||||
namespace Slic3r
|
namespace Slic3r
|
||||||
{
|
{
|
||||||
|
@ -1399,6 +1399,7 @@ void TreeSupport::generate_toolpaths()
|
||||||
|
|
||||||
const size_t wall_count = object_config.tree_support_wall_count.value;
|
const size_t wall_count = object_config.tree_support_wall_count.value;
|
||||||
const bool with_infill = object_config.support_base_pattern != smpNone && object_config.support_base_pattern != smpDefault;
|
const bool with_infill = object_config.support_base_pattern != smpNone && object_config.support_base_pattern != smpDefault;
|
||||||
|
auto m_support_material_flow = support_material_flow(m_object, float(m_slicing_params.layer_height));
|
||||||
|
|
||||||
// coconut: use same intensity settings as SupportMaterial.cpp
|
// coconut: use same intensity settings as SupportMaterial.cpp
|
||||||
auto m_support_material_interface_flow = support_material_interface_flow(m_object, float(m_slicing_params.layer_height));
|
auto m_support_material_interface_flow = support_material_interface_flow(m_object, float(m_slicing_params.layer_height));
|
||||||
|
@ -1406,6 +1407,8 @@ void TreeSupport::generate_toolpaths()
|
||||||
coordf_t bottom_interface_spacing = object_config.support_bottom_interface_spacing.value + m_support_material_interface_flow.spacing();
|
coordf_t bottom_interface_spacing = object_config.support_bottom_interface_spacing.value + m_support_material_interface_flow.spacing();
|
||||||
coordf_t interface_density = std::min(1., m_support_material_interface_flow.spacing() / interface_spacing);
|
coordf_t interface_density = std::min(1., m_support_material_interface_flow.spacing() / interface_spacing);
|
||||||
coordf_t bottom_interface_density = std::min(1., m_support_material_interface_flow.spacing() / bottom_interface_spacing);
|
coordf_t bottom_interface_density = std::min(1., m_support_material_interface_flow.spacing() / bottom_interface_spacing);
|
||||||
|
coordf_t support_spacing = object_config.support_base_pattern_spacing.value + m_support_material_flow.spacing();
|
||||||
|
coordf_t support_density = std::min(1., m_support_material_flow.spacing() / support_spacing);
|
||||||
|
|
||||||
const coordf_t branch_radius = object_config.tree_support_branch_diameter.value / 2;
|
const coordf_t branch_radius = object_config.tree_support_branch_diameter.value / 2;
|
||||||
const coordf_t branch_radius_scaled = scale_(branch_radius);
|
const coordf_t branch_radius_scaled = scale_(branch_radius);
|
||||||
|
@ -1515,9 +1518,6 @@ void TreeSupport::generate_toolpaths()
|
||||||
|
|
||||||
TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_id);
|
TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_id);
|
||||||
Flow support_flow(support_extrusion_width, ts_layer->height, nozzle_diameter);
|
Flow support_flow(support_extrusion_width, ts_layer->height, nozzle_diameter);
|
||||||
coordf_t support_spacing = object_config.support_base_pattern_spacing.value + support_flow.spacing();
|
|
||||||
coordf_t support_density = std::min(1., support_flow.spacing() / support_spacing);
|
|
||||||
|
|
||||||
ts_layer->support_fills.no_sort = false;
|
ts_layer->support_fills.no_sort = false;
|
||||||
|
|
||||||
for (auto& area_group : ts_layer->area_groups) {
|
for (auto& area_group : ts_layer->area_groups) {
|
||||||
|
@ -1569,11 +1569,12 @@ void TreeSupport::generate_toolpaths()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// base_areas
|
// base_areas
|
||||||
filler_support->spacing = support_flow.spacing();
|
filler_support->spacing = m_support_material_flow.spacing();
|
||||||
Flow flow = (layer_id == 0 && m_raft_layers == 0) ? m_object->print()->brim_flow() : support_flow;
|
Flow flow = (layer_id == 0 && m_raft_layers == 0) ? m_object->print()->brim_flow() :
|
||||||
if (area_group.dist_to_top < 10 / layer_height && !with_infill) {
|
(m_support_params.base_fill_pattern == ipRectilinear && (layer_id % num_layers_to_change_infill_direction == 0) ? support_transition_flow(m_object) : support_flow);
|
||||||
// at least 2 walls for the top tips
|
if (area_group.dist_to_top < 10 / layer_height) {
|
||||||
make_perimeter_and_inner_brim(ts_layer->support_fills.entities, *m_object->print(), poly, std::max(wall_count, size_t(2)), flow, false);
|
// extra 2 walls for the top tips
|
||||||
|
make_perimeter_and_inner_brim(ts_layer->support_fills.entities, *m_object->print(), poly, wall_count + 2, flow, false);
|
||||||
} else {
|
} else {
|
||||||
if (with_infill && layer_id > 0 && m_support_params.base_fill_pattern != ipLightning) {
|
if (with_infill && layer_id > 0 && m_support_params.base_fill_pattern != ipLightning) {
|
||||||
filler_support->angle = Geometry::deg2rad(object_config.support_angle.value);
|
filler_support->angle = Geometry::deg2rad(object_config.support_angle.value);
|
||||||
|
@ -1892,7 +1893,7 @@ void TreeSupport::generate_support_areas()
|
||||||
profiler.stage_finish(STAGE_DROP_DOWN_NODES);
|
profiler.stage_finish(STAGE_DROP_DOWN_NODES);
|
||||||
|
|
||||||
// Adjust support layer heights
|
// Adjust support layer heights
|
||||||
// adjust_layer_heights(contact_nodes);
|
adjust_layer_heights(contact_nodes);
|
||||||
|
|
||||||
//Generate support areas.
|
//Generate support areas.
|
||||||
profiler.stage_start(STAGE_DRAW_CIRCLES);
|
profiler.stage_start(STAGE_DRAW_CIRCLES);
|
||||||
|
@ -2022,24 +2023,20 @@ void TreeSupport::draw_circles(const std::vector<std::vector<Node*>>& contact_no
|
||||||
{
|
{
|
||||||
if (print->canceled())
|
if (print->canceled())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
const std::vector<Node*>& curr_layer_nodes = contact_nodes[layer_nr];
|
const std::vector<Node*>& curr_layer_nodes = contact_nodes[layer_nr];
|
||||||
TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_nr + m_raft_layers);
|
TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_nr + m_raft_layers);
|
||||||
assert(ts_layer != nullptr);
|
assert(ts_layer != nullptr);
|
||||||
|
|
||||||
// skip if current layer has no points. This fixes potential crash in get_collision (see jira BBL001-355)
|
// skip if current layer has no points. This fixes potential crash in get_collision (see jira BBL001-355)
|
||||||
if (curr_layer_nodes.empty()) {
|
if (curr_layer_nodes.empty())
|
||||||
ts_layer->print_z = 0.0;
|
|
||||||
ts_layer->height = 0.0;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
Node* first_node = curr_layer_nodes.front();
|
Node* first_node = curr_layer_nodes.front();
|
||||||
ts_layer->print_z = first_node->print_z;
|
ts_layer->print_z = first_node->print_z;
|
||||||
ts_layer->height = first_node->height;
|
ts_layer->height = first_node->height;
|
||||||
if (ts_layer->height < EPSILON) {
|
|
||||||
|
if (ts_layer->height < EPSILON)
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
ExPolygons& base_areas = ts_layer->base_areas;
|
ExPolygons& base_areas = ts_layer->base_areas;
|
||||||
ExPolygons& roof_areas = ts_layer->roof_areas;
|
ExPolygons& roof_areas = ts_layer->roof_areas;
|
||||||
|
@ -2060,16 +2057,16 @@ void TreeSupport::draw_circles(const std::vector<std::vector<Node*>>& contact_no
|
||||||
|
|
||||||
const Node& node = *p_node;
|
const Node& node = *p_node;
|
||||||
ExPolygon area;
|
ExPolygon area;
|
||||||
// Generate directly from overhang polygon if one of the following is true:
|
// 直接从overhang多边形生成,如果<EFBFBD>?
|
||||||
// 1) node is a normal part of hybrid support
|
// 1) 是混合支撑里的普通部分,
|
||||||
// 2) top interface layers are enabled
|
// 2) 启用了顶部接触层<EFBFBD>?
|
||||||
// 3) node is virtual
|
// 3) 是顶部空<EFBFBD>?
|
||||||
if (node.type == ePolygon || (top_interface_layers>0 &&node.support_roof_layers_below > 0) || node.distance_to_top<0) {
|
if (node.type == ePolygon || (top_interface_layers>0 &&node.support_roof_layers_below > 0) || node.distance_to_top<0) {
|
||||||
if (node.overhang->contour.size() > 100 || node.overhang->holes.size()>1)
|
if (node.overhang->contour.size() > 100 || node.overhang->holes.size()>1)
|
||||||
area = *node.overhang;
|
area = *node.overhang;
|
||||||
else {
|
else {
|
||||||
auto tmp = offset_ex({ *node.overhang }, scale_(m_ts_data->m_xy_distance));
|
auto tmp = offset_ex({ *node.overhang }, scale_(m_ts_data->m_xy_distance));
|
||||||
if(!tmp.empty()) // can be empty for non-manifold models
|
if(!tmp.empty()) // 对于有缺陷的模型,overhang膨胀以后可能是空的!
|
||||||
area = tmp[0];
|
area = tmp[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2399,22 +2396,7 @@ void TreeSupport::draw_circles(const std::vector<std::vector<Node*>>& contact_no
|
||||||
char fname[10]; sprintf(fname, "%d_%.2f", layer_nr, ts_layer->print_z);
|
char fname[10]; sprintf(fname, "%d_%.2f", layer_nr, ts_layer->print_z);
|
||||||
draw_contours_and_nodes_to_svg(-1, base_areas, roof_areas, roof_1st_layer, {}, {}, get_svg_filename(fname, "circles"), { "base", "roof", "roof1st" });
|
draw_contours_and_nodes_to_svg(-1, base_areas, roof_areas, roof_1st_layer, {}, {}, get_svg_filename(fname, "circles"), { "base", "roof", "roof1st" });
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
// export layer & print_z log
|
|
||||||
std::ofstream draw_circles_layer_out;
|
|
||||||
draw_circles_layer_out.open("./SVG/layer_heights_draw_circles.txt");
|
|
||||||
if (draw_circles_layer_out.is_open()) {
|
|
||||||
for (int layer_nr = m_object->layer_count() - 1; layer_nr > 0; layer_nr--) {
|
|
||||||
TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_nr + m_raft_layers);
|
|
||||||
ExPolygons& base_areas = ts_layer->base_areas;
|
|
||||||
ExPolygons& roof_areas = ts_layer->roof_areas;
|
|
||||||
ExPolygons& roof_1st_layer = ts_layer->roof_1st_layer;
|
|
||||||
ExPolygons& floor_areas = ts_layer->floor_areas;
|
|
||||||
if (base_areas.empty() && roof_areas.empty() && roof_1st_layer.empty()) continue;
|
|
||||||
draw_circles_layer_out << layer_nr << " " << ts_layer->print_z << " " << ts_layer->height << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // SUPPORT_TREE_DEBUG_TO_SVG
|
|
||||||
|
|
||||||
TreeSupportLayerPtrs& ts_layers = m_object->tree_support_layers();
|
TreeSupportLayerPtrs& ts_layers = m_object->tree_support_layers();
|
||||||
auto iter = std::remove_if(ts_layers.begin(), ts_layers.end(), [](TreeSupportLayer* ts_layer) { return ts_layer->height < EPSILON; });
|
auto iter = std::remove_if(ts_layers.begin(), ts_layers.end(), [](TreeSupportLayer* ts_layer) { return ts_layer->height < EPSILON; });
|
||||||
|
@ -2428,7 +2410,7 @@ void TreeSupport::draw_circles(const std::vector<std::vector<Node*>>& contact_no
|
||||||
void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
{
|
{
|
||||||
const PrintObjectConfig &config = m_object->config();
|
const PrintObjectConfig &config = m_object->config();
|
||||||
// Use Minimum Spanning Tree to connect the points on each layer and move them while dropping them down.
|
//Use Minimum Spanning Tree to connect the points on each layer and move them while dropping them down.
|
||||||
const coordf_t layer_height = config.layer_height.value;
|
const coordf_t layer_height = config.layer_height.value;
|
||||||
const double angle = config.tree_support_branch_angle.value * M_PI / 180.;
|
const double angle = config.tree_support_branch_angle.value * M_PI / 180.;
|
||||||
const int wall_count = std::max(1, config.tree_support_wall_count.value);
|
const int wall_count = std::max(1, config.tree_support_wall_count.value);
|
||||||
|
@ -2442,7 +2424,6 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
const bool support_on_buildplate_only = config.support_on_build_plate_only.value;
|
const bool support_on_buildplate_only = config.support_on_build_plate_only.value;
|
||||||
const size_t bottom_interface_layers = config.support_interface_bottom_layers.value;
|
const size_t bottom_interface_layers = config.support_interface_bottom_layers.value;
|
||||||
const size_t top_interface_layers = config.support_interface_top_layers.value;
|
const size_t top_interface_layers = config.support_interface_top_layers.value;
|
||||||
std::vector<std::pair<coordf_t, coordf_t>> layer_heights = plan_layer_heights(contact_nodes);
|
|
||||||
|
|
||||||
std::unordered_set<Node*> to_free_node_set;
|
std::unordered_set<Node*> to_free_node_set;
|
||||||
m_spanning_trees.resize(contact_nodes.size());
|
m_spanning_trees.resize(contact_nodes.size());
|
||||||
|
@ -2486,22 +2467,16 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
BOOST_LOG_TRIVIAL(debug) << "before m_avoidance_cache.size()=" << m_ts_data->m_avoidance_cache.size();
|
BOOST_LOG_TRIVIAL(debug) << "before m_avoidance_cache.size()=" << m_ts_data->m_avoidance_cache.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t layer_nr = contact_nodes.size() - 1; layer_nr > 0; layer_nr--) // Skip layer 0, since we can't drop down the vertices there.
|
for (size_t layer_nr = contact_nodes.size() - 1; layer_nr > 0; layer_nr--) //Skip layer 0, since we can't drop down the vertices there.
|
||||||
{
|
{
|
||||||
if (m_object->print()->canceled())
|
if (m_object->print()->canceled())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
auto& layer_contact_nodes = contact_nodes[layer_nr];
|
auto& layer_contact_nodes = contact_nodes[layer_nr];
|
||||||
if (layer_contact_nodes.empty())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
int jump_nr = 1;
|
|
||||||
while (layer_heights[layer_nr - jump_nr].second < EPSILON)
|
|
||||||
jump_nr++;
|
|
||||||
|
|
||||||
std::deque<std::pair<size_t, Node*>> unsupported_branch_leaves; // All nodes that are leaves on this layer that would result in unsupported ('mid-air') branches.
|
std::deque<std::pair<size_t, Node*>> unsupported_branch_leaves; // All nodes that are leaves on this layer that would result in unsupported ('mid-air') branches.
|
||||||
const Layer* ts_layer = m_object->get_tree_support_layer(layer_nr);
|
const Layer* ts_layer = m_object->get_tree_support_layer(layer_nr);
|
||||||
|
if (layer_contact_nodes.empty())
|
||||||
|
continue;
|
||||||
m_object->print()->set_status(60, (boost::format(_L("Support: propagate branches at layer %d")) % layer_nr).str());
|
m_object->print()->set_status(60, (boost::format(_L("Support: propagate branches at layer %d")) % layer_nr).str());
|
||||||
|
|
||||||
Polygons layer_contours = std::move(m_ts_data->get_contours_with_holes(layer_nr));
|
Polygons layer_contours = std::move(m_ts_data->get_contours_with_holes(layer_nr));
|
||||||
|
@ -2537,8 +2512,8 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
if (node.distance_to_top < 0) {
|
if (node.distance_to_top < 0) {
|
||||||
// virtual node do not merge or move
|
// virtual node do not merge or move
|
||||||
Node* next_node = new Node(p_node->position, p_node->distance_to_top + 1, p_node->skin_direction, p_node->support_roof_layers_below - 1, p_node->to_buildplate, p_node,
|
Node* next_node = new Node(p_node->position, p_node->distance_to_top + 1, p_node->skin_direction, p_node->support_roof_layers_below - 1, p_node->to_buildplate, p_node,
|
||||||
layer_heights[layer_nr - jump_nr].first, layer_heights[layer_nr - jump_nr].second);
|
m_object->get_layer(layer_nr - 1)->print_z, m_object->get_layer(layer_nr - 1)->height);
|
||||||
contact_nodes[layer_nr - jump_nr].emplace_back(next_node);
|
contact_nodes[layer_nr - 1].emplace_back(next_node);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (support_on_buildplate_only && !node.to_buildplate) //Can't rest on model and unable to reach the build plate. Then we must drop the node and leave parts unsupported.
|
if (support_on_buildplate_only && !node.to_buildplate) //Can't rest on model and unable to reach the build plate. Then we must drop the node and leave parts unsupported.
|
||||||
|
@ -2555,8 +2530,8 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
// polygon node do not merge or move
|
// polygon node do not merge or move
|
||||||
const bool to_buildplate = !is_inside_ex(m_ts_data->m_layer_outlines[layer_nr], p_node->position);
|
const bool to_buildplate = !is_inside_ex(m_ts_data->m_layer_outlines[layer_nr], p_node->position);
|
||||||
Node *next_node = new Node(p_node->position, p_node->distance_to_top + 1, p_node->skin_direction, p_node->support_roof_layers_below - 1, to_buildplate, p_node,
|
Node *next_node = new Node(p_node->position, p_node->distance_to_top + 1, p_node->skin_direction, p_node->support_roof_layers_below - 1, to_buildplate, p_node,
|
||||||
layer_heights[layer_nr - jump_nr].first, layer_heights[layer_nr - jump_nr].second);
|
m_object->get_layer(layer_nr - 1)->print_z, m_object->get_layer(layer_nr - 1)->height);
|
||||||
contact_nodes[layer_nr - jump_nr].emplace_back(next_node);
|
contact_nodes[layer_nr - 1].emplace_back(next_node);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* Find which part this node is located in and group the nodes in
|
/* Find which part this node is located in and group the nodes in
|
||||||
|
@ -2633,7 +2608,7 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
|
|
||||||
const coordf_t branch_radius_node = calc_branch_radius(branch_radius, node.distance_to_top, tip_layers, diameter_angle_scale_factor);
|
const coordf_t branch_radius_node = calc_branch_radius(branch_radius, node.distance_to_top, tip_layers, diameter_angle_scale_factor);
|
||||||
|
|
||||||
auto avoid_layer = m_ts_data->get_avoidance(branch_radius_node, layer_nr - jump_nr);
|
auto avoid_layer = m_ts_data->get_avoidance(branch_radius_node, layer_nr - 1);
|
||||||
if (group_index == 0)
|
if (group_index == 0)
|
||||||
{
|
{
|
||||||
//Avoid collisions.
|
//Avoid collisions.
|
||||||
|
@ -2645,11 +2620,11 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
size_t new_distance_to_top = std::max(node.distance_to_top, neighbour->distance_to_top) + 1;
|
size_t new_distance_to_top = std::max(node.distance_to_top, neighbour->distance_to_top) + 1;
|
||||||
size_t new_support_roof_layers_below = std::max(node.support_roof_layers_below, neighbour->support_roof_layers_below) - 1;
|
size_t new_support_roof_layers_below = std::max(node.support_roof_layers_below, neighbour->support_roof_layers_below) - 1;
|
||||||
|
|
||||||
const bool to_buildplate = !is_inside_ex(m_ts_data->get_avoidance(0, layer_nr - jump_nr), next_position);
|
const bool to_buildplate = !is_inside_ex(m_ts_data->get_avoidance(0, layer_nr - 1), next_position);
|
||||||
Node * next_node = new Node(next_position, new_distance_to_top, node.skin_direction, new_support_roof_layers_below, to_buildplate, p_node,
|
Node * next_node = new Node(next_position, new_distance_to_top, node.skin_direction, new_support_roof_layers_below, to_buildplate, p_node,
|
||||||
layer_heights[layer_nr - jump_nr].first, layer_heights[layer_nr - jump_nr].second);
|
m_object->get_layer(layer_nr - 1)->print_z, p_node->height);
|
||||||
next_node->movement = next_position - node.position;
|
next_node->movement = next_position - node.position;
|
||||||
contact_nodes[layer_nr - jump_nr].push_back(next_node);
|
contact_nodes[layer_nr - 1].push_back(next_node);
|
||||||
|
|
||||||
// Make sure the next pass doesn't drop down either of these (since that already happened).
|
// Make sure the next pass doesn't drop down either of these (since that already happened).
|
||||||
node.merged_neighbours.push_front(neighbour);
|
node.merged_neighbours.push_front(neighbour);
|
||||||
|
@ -2733,8 +2708,8 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
|
|
||||||
Point direction = neighbour - node.position;
|
Point direction = neighbour - node.position;
|
||||||
Node *neighbour_node = nodes_per_part[group_index][neighbour];
|
Node *neighbour_node = nodes_per_part[group_index][neighbour];
|
||||||
coordf_t branch_bottom_radius = calc_branch_radius(branch_radius, node.distance_to_top + 1, tip_layers, diameter_angle_scale_factor);
|
coordf_t branch_bottom_radius = calc_branch_radius(branch_radius, node.distance_to_top + layer_nr, tip_layers, diameter_angle_scale_factor);
|
||||||
coordf_t neighbour_bottom_radius = calc_branch_radius(branch_radius, neighbour_node->distance_to_top + 1, tip_layers, diameter_angle_scale_factor);
|
coordf_t neighbour_bottom_radius = calc_branch_radius(branch_radius, neighbour_node->distance_to_top + layer_nr, tip_layers, diameter_angle_scale_factor);
|
||||||
const coordf_t min_overlap = branch_radius;
|
const coordf_t min_overlap = branch_radius;
|
||||||
double max_converge_distance = tan_angle * (ts_layer->print_z - DO_NOT_MOVER_UNDER_MM) + branch_bottom_radius + neighbour_bottom_radius - min_overlap;
|
double max_converge_distance = tan_angle * (ts_layer->print_z - DO_NOT_MOVER_UNDER_MM) + branch_bottom_radius + neighbour_bottom_radius - min_overlap;
|
||||||
if (vsize2_with_unscale(direction) > max_converge_distance * max_converge_distance)
|
if (vsize2_with_unscale(direction) > max_converge_distance * max_converge_distance)
|
||||||
|
@ -2765,7 +2740,7 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
branch_radius_temp = branch_radius_node;
|
branch_radius_temp = branch_radius_node;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
auto avoid_layer = m_ts_data->get_avoidance(branch_radius_node, layer_nr - jump_nr);
|
auto avoid_layer = m_ts_data->get_avoidance(branch_radius_node, layer_nr - 1);
|
||||||
|
|
||||||
Point to_outside = projection_onto_ex(avoid_layer, node.position);
|
Point to_outside = projection_onto_ex(avoid_layer, node.position);
|
||||||
Point movement = to_outside - node.position;
|
Point movement = to_outside - node.position;
|
||||||
|
@ -2810,15 +2785,15 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
|
|
||||||
const bool to_buildplate = !is_inside_ex(m_ts_data->m_layer_outlines[layer_nr], next_layer_vertex);// !is_inside_ex(m_ts_data->get_avoidance(m_ts_data->m_xy_distance, layer_nr - 1), next_layer_vertex);
|
const bool to_buildplate = !is_inside_ex(m_ts_data->m_layer_outlines[layer_nr], next_layer_vertex);// !is_inside_ex(m_ts_data->get_avoidance(m_ts_data->m_xy_distance, layer_nr - 1), next_layer_vertex);
|
||||||
Node * next_node = new Node(next_layer_vertex, node.distance_to_top + 1, node.skin_direction, node.support_roof_layers_below - 1, to_buildplate, p_node,
|
Node * next_node = new Node(next_layer_vertex, node.distance_to_top + 1, node.skin_direction, node.support_roof_layers_below - 1, to_buildplate, p_node,
|
||||||
layer_heights[layer_nr - jump_nr].first, layer_heights[layer_nr - jump_nr].second);
|
m_object->get_layer(layer_nr - 1)->print_z, m_object->get_layer(layer_nr-1)->height);
|
||||||
next_node->movement = movement;
|
next_node->movement = movement;
|
||||||
contact_nodes[layer_nr - jump_nr].push_back(next_node);
|
contact_nodes[layer_nr - 1].push_back(next_node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SUPPORT_TREE_DEBUG_TO_SVG
|
#ifdef SUPPORT_TREE_DEBUG_TO_SVG
|
||||||
draw_contours_and_nodes_to_svg(layer_nr, m_ts_data->get_avoidance(0, layer_nr), m_ts_data->get_avoidance(branch_radius_temp, layer_nr), m_ts_data->m_layer_outlines_below[layer_nr],
|
draw_contours_and_nodes_to_svg(layer_nr, m_ts_data->get_avoidance(0, layer_nr), m_ts_data->get_avoidance(branch_radius_temp, layer_nr), m_ts_data->m_layer_outlines_below[layer_nr],
|
||||||
contact_nodes[layer_nr], contact_nodes[layer_nr - jump_nr], "contact_points", { "overhang","avoid","outline" }, { "blue","red","yellow" });
|
contact_nodes[layer_nr], contact_nodes[layer_nr - 1], "contact_points", { "overhang","avoid","outline" }, { "blue","red","yellow" });
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Prune all branches that couldn't find support on either the model or the buildplate (resulting in 'mid-air' branches).
|
// Prune all branches that couldn't find support on either the model or the buildplate (resulting in 'mid-air' branches).
|
||||||
|
@ -2865,27 +2840,6 @@ void TreeSupport::drop_nodes(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
delete node;
|
delete node;
|
||||||
}
|
}
|
||||||
to_free_node_set.clear();
|
to_free_node_set.clear();
|
||||||
|
|
||||||
// Merge empty contact_nodes layers
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef SUPPORT_TREE_DEBUG_TO_SVG
|
|
||||||
// export all print_z and layer height into .txt
|
|
||||||
std::ofstream layer_heights_out;
|
|
||||||
layer_heights_out.open("./SVG/layer_heights_drop_nodes.txt");
|
|
||||||
//layer_heights_out.open("layer_heights_out.txt");
|
|
||||||
if (layer_heights_out.is_open()) {
|
|
||||||
for (int i = 0; i < layer_heights.size(); i++) {
|
|
||||||
if (contact_nodes[i].empty()) {
|
|
||||||
layer_heights_out << 0 << " " << 0 << std::endl;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
layer_heights_out << contact_nodes[i][0]->print_z << " " << contact_nodes[i][0]->height << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
layer_heights_out.close();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TreeSupport::adjust_layer_heights(std::vector<std::vector<Node*>>& contact_nodes)
|
void TreeSupport::adjust_layer_heights(std::vector<std::vector<Node*>>& contact_nodes)
|
||||||
|
@ -2895,7 +2849,6 @@ void TreeSupport::adjust_layer_heights(std::vector<std::vector<Node*>>& contact_
|
||||||
|
|
||||||
const PrintConfig& print_config = m_object->print()->config();
|
const PrintConfig& print_config = m_object->print()->config();
|
||||||
const PrintObjectConfig& config = m_object->config();
|
const PrintObjectConfig& config = m_object->config();
|
||||||
|
|
||||||
if (!print_config.independent_support_layer_height) {
|
if (!print_config.independent_support_layer_height) {
|
||||||
for (int layer_nr = 0; layer_nr < contact_nodes.size(); layer_nr++) {
|
for (int layer_nr = 0; layer_nr < contact_nodes.size(); layer_nr++) {
|
||||||
std::vector<Node*>& curr_layer_nodes = contact_nodes[layer_nr];
|
std::vector<Node*>& curr_layer_nodes = contact_nodes[layer_nr];
|
||||||
|
@ -2979,108 +2932,6 @@ void TreeSupport::adjust_layer_heights(std::vector<std::vector<Node*>>& contact_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::pair<coordf_t, coordf_t>> TreeSupport::plan_layer_heights(std::vector<std::vector<Node*>>& contact_nodes)
|
|
||||||
{
|
|
||||||
const PrintObjectConfig& config = m_object->config();
|
|
||||||
const coordf_t max_layer_height = m_slicing_params.max_layer_height;
|
|
||||||
const coordf_t layer_height = config.layer_height.value;
|
|
||||||
coordf_t z_distance_top = m_slicing_params.gap_support_object;
|
|
||||||
// BBS: add extra distance if thick bridge is enabled
|
|
||||||
// Note: normal support uses print_z, but tree support uses integer layers, so we need to subtract layer_height
|
|
||||||
if (!m_slicing_params.soluble_interface && m_object_config->thick_bridges) {
|
|
||||||
z_distance_top += m_object->layers()[0]->regions()[0]->region().bridging_height_avg(m_object->print()->config()) - layer_height;
|
|
||||||
}
|
|
||||||
const size_t support_roof_layers = config.support_interface_top_layers.value;
|
|
||||||
const int z_distance_top_layers = round_up_divide(scale_(z_distance_top), scale_(layer_height)) + 1;
|
|
||||||
std::vector<std::pair<coordf_t, coordf_t>> layer_heights(contact_nodes.size(), std::pair<coordf_t, coordf_t>(0.0, 0.0));
|
|
||||||
std::vector<int> bounds;
|
|
||||||
|
|
||||||
if (layer_height == max_layer_height)
|
|
||||||
return std::vector<std::pair<coordf_t, coordf_t>>();
|
|
||||||
|
|
||||||
bounds.push_back(0);
|
|
||||||
// Keep first layer still
|
|
||||||
layer_heights[0].first = m_object->get_layer(0)->print_z;
|
|
||||||
layer_heights[0].second = m_object->get_layer(0)->height;
|
|
||||||
// Collect top contact layers
|
|
||||||
for (int layer_nr = 1; layer_nr < contact_nodes.size(); layer_nr++)
|
|
||||||
{
|
|
||||||
if (!contact_nodes[layer_nr].empty())
|
|
||||||
for (int i = 0; i < support_roof_layers + z_distance_top_layers + 1; i++) {
|
|
||||||
if (layer_nr - i > 0) {
|
|
||||||
bounds.push_back(layer_nr - i);
|
|
||||||
layer_heights[layer_nr - i].first = m_object->get_layer(layer_nr - i)->print_z;
|
|
||||||
layer_heights[layer_nr - i].second = m_object->get_layer(layer_nr - i)->height;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::set<int> s(bounds.begin(), bounds.end());
|
|
||||||
bounds.assign(s.begin(), s.end());
|
|
||||||
|
|
||||||
for (size_t idx_extreme = 0; idx_extreme < bounds.size(); idx_extreme++) {
|
|
||||||
int extr2_layer_nr = bounds[idx_extreme];
|
|
||||||
coordf_t extr2z = m_object->get_layer(extr2_layer_nr)->bottom_z();
|
|
||||||
int extr1_layer_nr = idx_extreme == 0 ? -1 : bounds[idx_extreme - 1];
|
|
||||||
coordf_t extr1z = idx_extreme == 0 ? 0.f : m_object->get_layer(extr1_layer_nr)->print_z;
|
|
||||||
coordf_t dist = extr2z - extr1z;
|
|
||||||
|
|
||||||
// Insert intermediate layers.
|
|
||||||
size_t n_layers_extra = size_t(ceil(dist / (m_slicing_params.max_suport_layer_height + EPSILON)));
|
|
||||||
int actual_internel_layers = extr2_layer_nr - extr1_layer_nr - 1;
|
|
||||||
int extr_layers_left = extr2_layer_nr - extr1_layer_nr - n_layers_extra - 1;
|
|
||||||
if (n_layers_extra < 1)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
coordf_t step = dist / coordf_t(n_layers_extra);
|
|
||||||
coordf_t print_z = extr1z + step;
|
|
||||||
assert(step >= layer_height - EPSILON);
|
|
||||||
for (int layer_nr = extr1_layer_nr + 1; layer_nr < extr2_layer_nr; layer_nr++) {
|
|
||||||
// if (curr_layer_nodes.empty()) continue;
|
|
||||||
if (std::abs(print_z - m_object->get_layer(layer_nr)->print_z) < step / 2 + EPSILON || extr_layers_left < 1) {
|
|
||||||
layer_heights[layer_nr].first = print_z;
|
|
||||||
layer_heights[layer_nr].second = step;
|
|
||||||
print_z += step;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// can't clear curr_layer_nodes, or the model will have empty layers
|
|
||||||
layer_heights[layer_nr].first = 0.0;
|
|
||||||
layer_heights[layer_nr].second = 0.0;
|
|
||||||
extr_layers_left--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SUPPORT_TREE_DEBUG_TO_SVG
|
|
||||||
// export all print_z and layer height into .txt
|
|
||||||
std::ofstream layer_heights_out;
|
|
||||||
layer_heights_out.open("./SVG/layer_heights_out.txt");
|
|
||||||
//layer_heights_out.open("layer_heights_out.txt");
|
|
||||||
if (layer_heights_out.is_open()) {
|
|
||||||
for (int i = 0; i < layer_heights.size(); i++) {
|
|
||||||
layer_heights_out << layer_heights[i].first << " " << layer_heights[i].second << std::endl;
|
|
||||||
}
|
|
||||||
layer_heights_out.close();
|
|
||||||
}
|
|
||||||
// check bounds
|
|
||||||
if (1)
|
|
||||||
{
|
|
||||||
std::ofstream bounds_out;
|
|
||||||
bounds_out.open("bounds.txt");
|
|
||||||
if (bounds_out.is_open()) {
|
|
||||||
for (int i = 0; i < bounds.size(); i++) {
|
|
||||||
bounds_out << bounds[i] << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return layer_heights;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TreeSupport::generate_contact_points(std::vector<std::vector<TreeSupport::Node*>>& contact_nodes)
|
void TreeSupport::generate_contact_points(std::vector<std::vector<TreeSupport::Node*>>& contact_nodes)
|
||||||
{
|
{
|
||||||
const PrintObjectConfig &config = m_object->config();
|
const PrintObjectConfig &config = m_object->config();
|
||||||
|
@ -3267,16 +3118,6 @@ void TreeSupport::generate_contact_points(std::vector<std::vector<TreeSupport::N
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "avg_node_per_layer=" << avg_node_per_layer << ", nodes_angle=" << nodes_angle;
|
BOOST_LOG_TRIVIAL(info) << "avg_node_per_layer=" << avg_node_per_layer << ", nodes_angle=" << nodes_angle;
|
||||||
}
|
}
|
||||||
#ifdef SUPPORT_TREE_DEBUG_TO_SVG
|
|
||||||
std::ofstream contact_nodes_out;
|
|
||||||
contact_nodes_out.open("./SVG/contact_nodes.txt");
|
|
||||||
if (contact_nodes_out.is_open()) {
|
|
||||||
for (int i = 0; i < contact_nodes.size(); i++) {
|
|
||||||
if (!contact_nodes[i].empty())
|
|
||||||
contact_nodes_out << i << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // SUPPORT_TREE_DEBUG_TO_SVG
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TreeSupport::insert_dropped_node(std::vector<Node*>& nodes_layer, Node* p_node)
|
void TreeSupport::insert_dropped_node(std::vector<Node*>& nodes_layer, Node* p_node)
|
||||||
|
|
|
@ -170,7 +170,7 @@ public:
|
||||||
struct LineHash {
|
struct LineHash {
|
||||||
size_t operator()(const Line& line) const {
|
size_t operator()(const Line& line) const {
|
||||||
return (std::hash<coord_t>()(line.a(0)) ^ std::hash<coord_t>()(line.b(1))) * 102 +
|
return (std::hash<coord_t>()(line.a(0)) ^ std::hash<coord_t>()(line.b(1))) * 102 +
|
||||||
(std::hash<coord_t>()(line.a(1)) ^ std::hash<coord_t>()(line.b(0))) * 10222;
|
(std::hash<coord_t>()(line.a(0)) ^ std::hash<coord_t>()(line.b(1))) * 10222;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -401,12 +401,6 @@ private:
|
||||||
|
|
||||||
void adjust_layer_heights(std::vector<std::vector<Node*>>& contact_nodes);
|
void adjust_layer_heights(std::vector<std::vector<Node*>>& contact_nodes);
|
||||||
|
|
||||||
/*! BBS: MusangKing: maximum layer height
|
|
||||||
* \brief Optimize the generation of tree support by pre-planning the layer_heights
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
std::vector<std::pair<coordf_t, coordf_t>> plan_layer_heights(std::vector<std::vector<Node*>>& contact_nodes);
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Creates points where support contacts the model.
|
* \brief Creates points where support contacts the model.
|
||||||
*
|
*
|
||||||
|
|
202
src/libslic3r/calib.cpp
Normal file
202
src/libslic3r/calib.cpp
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
#include "calib.hpp"
|
||||||
|
#include "Point.hpp"
|
||||||
|
#include "PrintConfig.hpp"
|
||||||
|
#include "GCodeWriter.hpp"
|
||||||
|
#include "GCode.hpp"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
calib_pressure_advance::calib_pressure_advance(GCode* gcodegen) :mp_gcodegen(gcodegen), m_length_short(20.0), m_length_long(40.0), m_space_y(3.5) {}
|
||||||
|
|
||||||
|
std::string calib_pressure_advance::generate_test(double start_pa/*= 0*/, double step_pa /*= 0.005*/, int count/*= 10*/) {
|
||||||
|
auto bed_sizes = mp_gcodegen->config().printable_area.values;
|
||||||
|
auto w = bed_sizes[2].x() - bed_sizes[0].x();
|
||||||
|
auto h = bed_sizes[2].y() - bed_sizes[0].y();
|
||||||
|
count = std::min(count, int((h - 10) / m_space_y));
|
||||||
|
|
||||||
|
auto startx = (w - 100) / 2;
|
||||||
|
auto starty = (h - count * m_space_y) / 2;
|
||||||
|
m_length_long = 40 + std::min(w - 120.0, 30.0);
|
||||||
|
return print_pa_lines(startx, starty, start_pa, step_pa, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string calib_pressure_advance::move_to(Vec2d pt) {
|
||||||
|
std::stringstream gcode;
|
||||||
|
gcode << mp_gcodegen->retract();
|
||||||
|
gcode << mp_gcodegen->writer().travel_to_xyz(Vec3d(pt.x(), pt.y(), 0.2));
|
||||||
|
gcode << mp_gcodegen->unretract();
|
||||||
|
return gcode.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string calib_pressure_advance::print_pa_lines(double start_x, double start_y, double start_pa, double step_pa, int num) {
|
||||||
|
|
||||||
|
auto& writer = mp_gcodegen->writer();
|
||||||
|
const double e_calib = 0.05; // filament_mm/extrusion_mm
|
||||||
|
const double e = 0.038; // filament_mm/extrusion_mm
|
||||||
|
|
||||||
|
const double fast = mp_gcodegen->config().get_abs_value("outer_wall_speed") * 60.0;
|
||||||
|
const double slow = std::max(1200.0, fast * 0.1);
|
||||||
|
std::stringstream gcode;
|
||||||
|
gcode << mp_gcodegen->writer().travel_to_z(0.2);
|
||||||
|
double y_pos = start_y;
|
||||||
|
|
||||||
|
// prime line
|
||||||
|
auto prime_x = std::max(start_x - 5, 0.5);
|
||||||
|
gcode << move_to(Vec2d(prime_x, y_pos + (num - 4) * m_space_y));
|
||||||
|
gcode << writer.set_speed(slow);
|
||||||
|
gcode << writer.extrude_to_xy(Vec2d(prime_x, y_pos + 3 * m_space_y), e_calib * m_space_y * num * 1.1);
|
||||||
|
|
||||||
|
for (int i = 0; i < num; ++i) {
|
||||||
|
|
||||||
|
gcode << writer.set_pressure_advance(start_pa + i * step_pa);
|
||||||
|
gcode << move_to(Vec2d(start_x, y_pos + i * m_space_y));
|
||||||
|
gcode << writer.set_speed(slow);
|
||||||
|
gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short, y_pos + i * m_space_y), e_calib * m_length_short);
|
||||||
|
gcode << writer.set_speed(fast);
|
||||||
|
gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long, y_pos + i * m_space_y), e_calib * m_length_long);
|
||||||
|
gcode << writer.set_speed(slow);
|
||||||
|
gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long + m_length_short, y_pos + i * m_space_y), e_calib * m_length_short);
|
||||||
|
|
||||||
|
}
|
||||||
|
gcode << writer.set_pressure_advance(0.0);
|
||||||
|
|
||||||
|
// draw indicator lines
|
||||||
|
gcode << writer.set_speed(fast);
|
||||||
|
gcode << move_to(Vec2d(start_x + m_length_short, y_pos + (num - 1) * m_space_y + 2));
|
||||||
|
gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short, y_pos + (num - 1) * m_space_y + 7), e * 7);
|
||||||
|
gcode << move_to(Vec2d(start_x + m_length_short + m_length_long, y_pos + (num - 1) * m_space_y + 7));
|
||||||
|
gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long, y_pos + (num - 1) * m_space_y + 2), e * 7);
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < num; i += 2) {
|
||||||
|
gcode << draw_number(start_x + m_length_short + m_length_long + m_length_short + 3, y_pos + i * m_space_y + m_space_y / 2, start_pa + i * step_pa);
|
||||||
|
|
||||||
|
}
|
||||||
|
return gcode.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string calib_pressure_advance::draw_digit(double startx, double starty, char c) {
|
||||||
|
auto& writer = mp_gcodegen->writer();
|
||||||
|
std::stringstream gcode;
|
||||||
|
const double lw = 0.48;
|
||||||
|
const double len = 2;
|
||||||
|
const double gap = lw / 2.0;
|
||||||
|
const double e = 0.04; // filament_mm/extrusion_mm
|
||||||
|
|
||||||
|
// 0-------1
|
||||||
|
// | |
|
||||||
|
// 3-------2
|
||||||
|
// | |
|
||||||
|
// 4-------5
|
||||||
|
const Vec2d p0(startx, starty);
|
||||||
|
const Vec2d p1(startx + len, starty);
|
||||||
|
const Vec2d p2(startx + len, starty - len);
|
||||||
|
const Vec2d p3(startx, starty - len);
|
||||||
|
const Vec2d p4(startx, starty - len * 2);
|
||||||
|
const Vec2d p5(startx + len, starty - len * 2);
|
||||||
|
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '0':
|
||||||
|
gcode << move_to(p0);
|
||||||
|
gcode << writer.extrude_to_xy(p1, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p5, e * len * 2);
|
||||||
|
gcode << writer.extrude_to_xy(p4, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p0 - Vec2d(0, gap), e * len * 2);
|
||||||
|
break;
|
||||||
|
case '1':
|
||||||
|
gcode << move_to(p0 + Vec2d(len / 2, 0));
|
||||||
|
gcode << writer.extrude_to_xy(p4 + Vec2d(len / 2, 0), e * len * 2);
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
gcode << move_to(p0);
|
||||||
|
gcode << writer.extrude_to_xy(p1, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p2, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p3, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p4, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p5, e * len);
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
gcode << move_to(p0);
|
||||||
|
gcode << writer.extrude_to_xy(p1, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p5, e * len * 2);
|
||||||
|
gcode << writer.extrude_to_xy(p4, e * len);
|
||||||
|
gcode << move_to(p2 - Vec2d(gap, 0));
|
||||||
|
gcode << writer.extrude_to_xy(p3, e * len);
|
||||||
|
break;
|
||||||
|
case '4':
|
||||||
|
gcode << move_to(p0);
|
||||||
|
gcode << writer.extrude_to_xy(p3, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p2, e * len);
|
||||||
|
gcode << move_to(p1);
|
||||||
|
gcode << writer.extrude_to_xy(p5, e * len * 2);
|
||||||
|
break;
|
||||||
|
case '5':
|
||||||
|
gcode << move_to(p1);
|
||||||
|
gcode << writer.extrude_to_xy(p0, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p3, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p2, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p5, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p4, e * len);
|
||||||
|
break;
|
||||||
|
case '6':
|
||||||
|
gcode << move_to(p1);
|
||||||
|
gcode << writer.extrude_to_xy(p0, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p4, e * len * 2);
|
||||||
|
gcode << writer.extrude_to_xy(p5, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p2, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p3, e * len);
|
||||||
|
break;
|
||||||
|
case '7':
|
||||||
|
gcode << move_to(p0);
|
||||||
|
gcode << writer.extrude_to_xy(p1, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p5, e * len * 2);
|
||||||
|
break;
|
||||||
|
case '8':
|
||||||
|
gcode << move_to(p2);
|
||||||
|
gcode << writer.extrude_to_xy(p3, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p4, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p5, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p1, e * len * 2);
|
||||||
|
gcode << writer.extrude_to_xy(p0, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p3, e * len);
|
||||||
|
break;
|
||||||
|
case '9':
|
||||||
|
gcode << move_to(p5);
|
||||||
|
gcode << writer.extrude_to_xy(p1, e * len * 2);
|
||||||
|
gcode << writer.extrude_to_xy(p0, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p3, e * len);
|
||||||
|
gcode << writer.extrude_to_xy(p2, e * len);
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
gcode << move_to(p4 + Vec2d(len / 2, 0));
|
||||||
|
gcode << writer.extrude_to_xy(p4 + Vec2d(len / 2, len / 2), e * len);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return gcode.str();
|
||||||
|
}
|
||||||
|
// draw number
|
||||||
|
std::string calib_pressure_advance::draw_number(double startx, double starty, double value) {
|
||||||
|
double spacing = 3.0;
|
||||||
|
auto sNumber = std::to_string(value);
|
||||||
|
sNumber.erase(sNumber.find_last_not_of('0') + 1, std::string::npos);
|
||||||
|
sNumber.erase(sNumber.find_last_not_of('.') + 1, std::string::npos);
|
||||||
|
std::stringstream gcode;
|
||||||
|
gcode << mp_gcodegen->writer().set_speed(3600);
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < sNumber.length(); ++i) {
|
||||||
|
if (i > 5)
|
||||||
|
break;
|
||||||
|
gcode << draw_digit(startx + i * spacing, starty, sNumber[i]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return gcode.str();
|
||||||
|
}
|
||||||
|
} // namespace Slic3r
|
26
src/libslic3r/calib.hpp
Normal file
26
src/libslic3r/calib.hpp
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "Point.hpp"
|
||||||
|
namespace Slic3r {
|
||||||
|
|
||||||
|
class GCode;
|
||||||
|
class calib_pressure_advance
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
calib_pressure_advance(GCode* gcodegen);
|
||||||
|
~calib_pressure_advance() {}
|
||||||
|
|
||||||
|
std::string generate_test(double start_pa = 0, double step_pa = 0.002, int count = 50);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string move_to(Vec2d pt);
|
||||||
|
std::string print_pa_lines(double start_x, double start_y, double start_pa, double step_pa, int num);
|
||||||
|
std::string draw_digit(double startx, double starty, char c);
|
||||||
|
std::string draw_number(double startx, double starty, double value);
|
||||||
|
private:
|
||||||
|
GCode* mp_gcodegen;
|
||||||
|
double m_length_short, m_length_long;
|
||||||
|
double m_space_y;
|
||||||
|
};
|
||||||
|
} // namespace Slic3r
|
|
@ -1405,7 +1405,7 @@ bool bbl_calc_md5(std::string &filename, std::string &md5_out)
|
||||||
unsigned char digest[16];
|
unsigned char digest[16];
|
||||||
MD5_CTX ctx;
|
MD5_CTX ctx;
|
||||||
MD5_Init(&ctx);
|
MD5_Init(&ctx);
|
||||||
boost::nowide::ifstream ifs(filename, std::ios::binary);
|
boost::filesystem::ifstream ifs(filename, std::ios::binary);
|
||||||
std::string buf(64 * 1024, 0);
|
std::string buf(64 * 1024, 0);
|
||||||
const std::size_t & size = boost::filesystem::file_size(filename);
|
const std::size_t & size = boost::filesystem::file_size(filename);
|
||||||
std::size_t left_size = size;
|
std::size_t left_size = size;
|
||||||
|
|
|
@ -41,7 +41,11 @@ export LD_LIBRARY_PATH="\$DIR/bin"
|
||||||
|
|
||||||
# FIXME: BambuStudio segfault workarounds
|
# FIXME: BambuStudio segfault workarounds
|
||||||
# 1) BambuStudio will segfault on systems where locale info is not as expected (i.e. Holo-ISO arch-based distro)
|
# 1) BambuStudio will segfault on systems where locale info is not as expected (i.e. Holo-ISO arch-based distro)
|
||||||
|
# 2) BambuStudio will segfault with a boost logging error if ~/.config/BambuStudio doesn't exist on first run
|
||||||
export LC_ALL=C
|
export LC_ALL=C
|
||||||
|
# FIXME: BambuStudio doesn't respect dark mode; use GTK_THEME workaround from sigxcpu76 │
|
||||||
|
export GTK_THEME=Adwaita:light
|
||||||
|
mkdir -p \${HOME}/.config/BambuStudio/ 2> /dev/null
|
||||||
|
|
||||||
exec "\$DIR/bin/@SLIC3R_APP_CMD@" "\$@"
|
exec "\$DIR/bin/@SLIC3R_APP_CMD@" "\$@"
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -64,7 +64,7 @@ void AMSMaterialsSetting::create()
|
||||||
m_clrData->SetChooseFull(true);
|
m_clrData->SetChooseFull(true);
|
||||||
m_clrData->SetChooseAlpha(false);
|
m_clrData->SetChooseAlpha(false);
|
||||||
|
|
||||||
m_clr_picker = new Button(this, wxEmptyString, wxEmptyString, wxBU_AUTODRAW);
|
m_clr_picker = new Button(this, "", "");
|
||||||
m_clr_picker->SetCanFocus(false);
|
m_clr_picker->SetCanFocus(false);
|
||||||
m_clr_picker->SetSize(FromDIP(50), FromDIP(25));
|
m_clr_picker->SetSize(FromDIP(50), FromDIP(25));
|
||||||
m_clr_picker->SetMinSize(wxSize(FromDIP(50), FromDIP(25)));
|
m_clr_picker->SetMinSize(wxSize(FromDIP(50), FromDIP(25)));
|
||||||
|
@ -364,12 +364,7 @@ void AMSMaterialsSetting::on_clr_picker(wxCommandEvent & event)
|
||||||
show_flag = true;
|
show_flag = true;
|
||||||
if (clr_dialog->ShowModal() == wxID_OK) {
|
if (clr_dialog->ShowModal() == wxID_OK) {
|
||||||
m_clrData = &(clr_dialog->GetColourData());
|
m_clrData = &(clr_dialog->GetColourData());
|
||||||
m_clr_picker->SetBackgroundColor(wxColour(
|
m_clr_picker->SetBackgroundColor(m_clrData->GetColour());
|
||||||
m_clrData->GetColour().Red(),
|
|
||||||
m_clrData->GetColour().Green(),
|
|
||||||
m_clrData->GetColour().Blue(),
|
|
||||||
254
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,19 +374,13 @@ bool AMSMaterialsSetting::Show(bool show)
|
||||||
m_button_confirm->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
m_button_confirm->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
||||||
m_input_nozzle_max->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
m_input_nozzle_max->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
||||||
m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
||||||
m_clr_picker->SetBackgroundColour(m_clr_picker->GetParent()->GetBackgroundColour());
|
|
||||||
}
|
}
|
||||||
return DPIDialog::Show(show);
|
return DPIDialog::Show(show);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_min, wxString temp_max)
|
void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_min, wxString temp_max)
|
||||||
{
|
{
|
||||||
m_clr_picker->SetBackgroundColor(wxColour(
|
m_clr_picker->SetBackgroundColor(m_clrData->GetColour());
|
||||||
m_clrData->GetColour().Red(),
|
|
||||||
m_clrData->GetColour().Green(),
|
|
||||||
m_clrData->GetColour().Blue(),
|
|
||||||
254
|
|
||||||
));
|
|
||||||
|
|
||||||
if (!m_is_third) {
|
if (!m_is_third) {
|
||||||
m_button_confirm->Hide();
|
m_button_confirm->Hide();
|
||||||
|
|
|
@ -83,7 +83,7 @@ protected:
|
||||||
Button * m_button_confirm;
|
Button * m_button_confirm;
|
||||||
wxStaticText* m_tip_readonly;
|
wxStaticText* m_tip_readonly;
|
||||||
Button * m_button_close;
|
Button * m_button_close;
|
||||||
Button * m_clr_picker;
|
Button * m_clr_picker;
|
||||||
wxColourData * m_clrData;
|
wxColourData * m_clrData;
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
wxComboBox *m_comboBox_filament_mac;
|
wxComboBox *m_comboBox_filament_mac;
|
||||||
|
|
|
@ -200,11 +200,6 @@ void AMSSetting::create()
|
||||||
m_panel_img->Layout();
|
m_panel_img->Layout();
|
||||||
m_sizer_img->Fit(m_panel_img);
|
m_sizer_img->Fit(m_panel_img);
|
||||||
|
|
||||||
m_sizer_remain_block = new wxBoxSizer(wxVERTICAL);
|
|
||||||
m_sizer_remain_block->Add(m_sizer_remain, 0, wxEXPAND | wxTOP, FromDIP(8));
|
|
||||||
m_sizer_remain_block->Add(0, 0, 0, wxTOP, 8);
|
|
||||||
m_sizer_remain_block->Add(m_sizer_remain_tip, 0, wxLEFT, 18);
|
|
||||||
m_sizer_remain_block->Add(0, 0, 0, wxTOP, 15);
|
|
||||||
|
|
||||||
m_sizerl_body->Add(m_sizer_Insert_material, 0, wxEXPAND, 0);
|
m_sizerl_body->Add(m_sizer_Insert_material, 0, wxEXPAND, 0);
|
||||||
m_sizerl_body->Add(0, 0, 0, wxTOP, 8);
|
m_sizerl_body->Add(0, 0, 0, wxTOP, 8);
|
||||||
|
@ -214,7 +209,10 @@ void AMSSetting::create()
|
||||||
m_sizerl_body->Add(0, 0, 0, wxTOP, 8);
|
m_sizerl_body->Add(0, 0, 0, wxTOP, 8);
|
||||||
m_sizerl_body->Add(m_sizer_starting_tip, 0, wxLEFT, 18);
|
m_sizerl_body->Add(m_sizer_starting_tip, 0, wxLEFT, 18);
|
||||||
m_sizerl_body->Add(0, 0, 0, wxTOP, 15);
|
m_sizerl_body->Add(0, 0, 0, wxTOP, 15);
|
||||||
m_sizerl_body->Add(m_sizer_remain_block, 0, wxEXPAND, 0);
|
m_sizerl_body->Add(m_sizer_remain, 0, wxEXPAND | wxTOP, FromDIP(8));
|
||||||
|
m_sizerl_body->Add(0, 0, 0, wxTOP, 8);
|
||||||
|
m_sizerl_body->Add(m_sizer_remain_tip, 0, wxLEFT, 18);
|
||||||
|
m_sizerl_body->Add(0, 0, 0, wxTOP, 15);
|
||||||
m_sizerl_body->Add(m_sizer_switch_filament, 0, wxEXPAND | wxTOP, FromDIP(8));
|
m_sizerl_body->Add(m_sizer_switch_filament, 0, wxEXPAND | wxTOP, FromDIP(8));
|
||||||
m_sizerl_body->Add(0, 0, 0, wxTOP, 8);
|
m_sizerl_body->Add(0, 0, 0, wxTOP, 8);
|
||||||
m_sizerl_body->Add(m_sizer_switch_filament_tip, 0, wxLEFT, 18);
|
m_sizerl_body->Add(m_sizer_switch_filament_tip, 0, wxLEFT, 18);
|
||||||
|
@ -233,17 +231,6 @@ void AMSSetting::create()
|
||||||
|
|
||||||
this->Centre(wxBOTH);
|
this->Centre(wxBOTH);
|
||||||
wxGetApp().UpdateDlgDarkUI(this);
|
wxGetApp().UpdateDlgDarkUI(this);
|
||||||
|
|
||||||
Bind(wxEVT_SHOW, [this](auto& e) {
|
|
||||||
if (this->IsShown()) {
|
|
||||||
if (ams_support_remain) {
|
|
||||||
m_sizer_remain_block->Show(true);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_sizer_remain_block->Show(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMSSetting::update_insert_material_read_mode(bool selected)
|
void AMSSetting::update_insert_material_read_mode(bool selected)
|
||||||
|
|
|
@ -39,7 +39,6 @@ public:
|
||||||
wxString append_title(wxString text);
|
wxString append_title(wxString text);
|
||||||
wxStaticText *append_text(wxString text);
|
wxStaticText *append_text(wxString text);
|
||||||
MachineObject *obj{nullptr};
|
MachineObject *obj{nullptr};
|
||||||
bool ams_support_remain{false};
|
|
||||||
int ams_id { 0 };
|
int ams_id { 0 };
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -73,7 +72,6 @@ protected:
|
||||||
wxBoxSizer *m_sizer_starting_tip_inline;
|
wxBoxSizer *m_sizer_starting_tip_inline;
|
||||||
wxBoxSizer *m_sizer_remain_inline;
|
wxBoxSizer *m_sizer_remain_inline;
|
||||||
wxBoxSizer *m_sizer_switch_filament_inline;
|
wxBoxSizer *m_sizer_switch_filament_inline;
|
||||||
wxBoxSizer *m_sizer_remain_block;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
||||||
|
|
|
@ -456,9 +456,7 @@ void AuFile::on_set_cover()
|
||||||
{
|
{
|
||||||
if (wxGetApp().plater()->model().model_info == nullptr) { wxGetApp().plater()->model().model_info = std::make_shared<ModelInfo>(); }
|
if (wxGetApp().plater()->model().model_info == nullptr) { wxGetApp().plater()->model().model_info = std::make_shared<ModelInfo>(); }
|
||||||
|
|
||||||
fs::path path(into_path(m_file_name));
|
wxGetApp().plater()->model().model_info->cover_file = m_file_name.ToStdString();
|
||||||
wxGetApp().plater()->model().model_info->cover_file = path.string();
|
|
||||||
//wxGetApp().plater()->model().model_info->cover_file = m_file_name.ToStdString();
|
|
||||||
|
|
||||||
auto full_path = m_file_path.branch_path();
|
auto full_path = m_file_path.branch_path();
|
||||||
auto full_root_path = full_path.branch_path();
|
auto full_root_path = full_path.branch_path();
|
||||||
|
@ -698,8 +696,7 @@ void AuFolderPanel::update_cover()
|
||||||
if (wxGetApp().plater()->model().model_info != nullptr) {
|
if (wxGetApp().plater()->model().model_info != nullptr) {
|
||||||
for (auto i = 0; i < m_aufiles_list.GetCount(); i++) {
|
for (auto i = 0; i < m_aufiles_list.GetCount(); i++) {
|
||||||
AuFiles *aufile = m_aufiles_list[i];
|
AuFiles *aufile = m_aufiles_list[i];
|
||||||
|
if (wxGetApp().plater()->model().model_info->cover_file == aufile->file->m_file_name) {
|
||||||
if (wxString::FromUTF8(wxGetApp().plater()->model().model_info->cover_file) == aufile->file->m_file_name) {
|
|
||||||
aufile->file->set_cover(true);
|
aufile->file->set_cover(true);
|
||||||
} else {
|
} else {
|
||||||
aufile->file->set_cover(false);
|
aufile->file->set_cover(false);
|
||||||
|
|
|
@ -24,6 +24,7 @@ enum CUSTOM_ID
|
||||||
ID_TITLE,
|
ID_TITLE,
|
||||||
ID_MODEL_STORE,
|
ID_MODEL_STORE,
|
||||||
ID_PUBLISH,
|
ID_PUBLISH,
|
||||||
|
ID_CALIB,
|
||||||
ID_TOOL_BAR = 3200,
|
ID_TOOL_BAR = 3200,
|
||||||
ID_AMS_NOTEBOOK,
|
ID_AMS_NOTEBOOK,
|
||||||
};
|
};
|
||||||
|
@ -194,7 +195,7 @@ void BBLTopbar::Init(wxFrame* parent)
|
||||||
m_frame = parent;
|
m_frame = parent;
|
||||||
m_skip_popup_file_menu = false;
|
m_skip_popup_file_menu = false;
|
||||||
m_skip_popup_dropdown_menu = false;
|
m_skip_popup_dropdown_menu = false;
|
||||||
|
m_skip_popup_calib_menu = false;
|
||||||
wxInitAllImageHandlers();
|
wxInitAllImageHandlers();
|
||||||
|
|
||||||
this->AddSpacer(5);
|
this->AddSpacer(5);
|
||||||
|
@ -241,6 +242,13 @@ void BBLTopbar::Init(wxFrame* parent)
|
||||||
wxBitmap redo_inactive_bitmap = create_scaled_bitmap("topbar_redo_inactive", nullptr, TOPBAR_ICON_SIZE);
|
wxBitmap redo_inactive_bitmap = create_scaled_bitmap("topbar_redo_inactive", nullptr, TOPBAR_ICON_SIZE);
|
||||||
m_redo_item->SetDisabledBitmap(redo_inactive_bitmap);
|
m_redo_item->SetDisabledBitmap(redo_inactive_bitmap);
|
||||||
|
|
||||||
|
this->AddSpacer(FromDIP(10));
|
||||||
|
|
||||||
|
wxBitmap calib_bitmap = create_scaled_bitmap("calib_sf", nullptr, TOPBAR_ICON_SIZE);
|
||||||
|
wxBitmap calib_bitmap_inactive = create_scaled_bitmap("calib_sf_inactive", nullptr, TOPBAR_ICON_SIZE);
|
||||||
|
m_calib_item = this->AddTool(ID_CALIB, "Calibration", calib_bitmap);
|
||||||
|
m_calib_item->SetDisabledBitmap(calib_bitmap_inactive);
|
||||||
|
|
||||||
this->AddSpacer(FromDIP(10));
|
this->AddSpacer(FromDIP(10));
|
||||||
this->AddStretchSpacer(1);
|
this->AddStretchSpacer(1);
|
||||||
|
|
||||||
|
@ -298,6 +306,7 @@ void BBLTopbar::Init(wxFrame* parent)
|
||||||
this->Bind(wxEVT_MENU_CLOSE, &BBLTopbar::OnMenuClose, this);
|
this->Bind(wxEVT_MENU_CLOSE, &BBLTopbar::OnMenuClose, this);
|
||||||
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnFileToolItem, this, ID_TOP_FILE_MENU);
|
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnFileToolItem, this, ID_TOP_FILE_MENU);
|
||||||
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnDropdownToolItem, this, ID_TOP_DROPDOWN_MENU);
|
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnDropdownToolItem, this, ID_TOP_DROPDOWN_MENU);
|
||||||
|
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnCalibToolItem, this, ID_CALIB);
|
||||||
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnIconize, this, wxID_ICONIZE_FRAME);
|
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnIconize, this, wxID_ICONIZE_FRAME);
|
||||||
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnFullScreen, this, wxID_MAXIMIZE_FRAME);
|
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnFullScreen, this, wxID_MAXIMIZE_FRAME);
|
||||||
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnCloseFrame, this, wxID_CLOSE_FRAME);
|
this->Bind(wxEVT_AUITOOLBAR_TOOL_DROPDOWN, &BBLTopbar::OnCloseFrame, this, wxID_CLOSE_FRAME);
|
||||||
|
@ -353,17 +362,19 @@ void BBLTopbar::OnRedo(wxAuiToolBarEvent& event)
|
||||||
plater->redo();
|
plater->redo();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BBLTopbar::EnableUndoRedoItems()
|
void BBLTopbar::Enable3DEditorItems()
|
||||||
{
|
{
|
||||||
this->EnableTool(m_undo_item->GetId(), true);
|
this->EnableTool(m_undo_item->GetId(), true);
|
||||||
this->EnableTool(m_redo_item->GetId(), true);
|
this->EnableTool(m_redo_item->GetId(), true);
|
||||||
|
this->EnableTool(m_calib_item->GetId(), true);
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BBLTopbar::DisableUndoRedoItems()
|
void BBLTopbar::Disable3DEditorItems()
|
||||||
{
|
{
|
||||||
this->EnableTool(m_undo_item->GetId(), false);
|
this->EnableTool(m_undo_item->GetId(), false);
|
||||||
this->EnableTool(m_redo_item->GetId(), false);
|
this->EnableTool(m_redo_item->GetId(), false);
|
||||||
|
this->EnableTool(m_calib_item->GetId(), false);
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -416,6 +427,11 @@ wxMenu* BBLTopbar::GetTopMenu()
|
||||||
return &m_top_menu;
|
return &m_top_menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxMenu* BBLTopbar::GetCalibMenu()
|
||||||
|
{
|
||||||
|
return &m_calib_menu;
|
||||||
|
}
|
||||||
|
|
||||||
void BBLTopbar::SetTitle(wxString title)
|
void BBLTopbar::SetTitle(wxString title)
|
||||||
{
|
{
|
||||||
wxGCDC dc(this);
|
wxGCDC dc(this);
|
||||||
|
@ -468,6 +484,9 @@ void BBLTopbar::Rescale() {
|
||||||
item->SetBitmap(create_scaled_bitmap("topbar_redo", this, TOPBAR_ICON_SIZE));
|
item->SetBitmap(create_scaled_bitmap("topbar_redo", this, TOPBAR_ICON_SIZE));
|
||||||
item->SetDisabledBitmap(create_scaled_bitmap("topbar_redo_inactive", nullptr, TOPBAR_ICON_SIZE));
|
item->SetDisabledBitmap(create_scaled_bitmap("topbar_redo_inactive", nullptr, TOPBAR_ICON_SIZE));
|
||||||
|
|
||||||
|
item = this->FindTool(ID_CALIB);
|
||||||
|
item->SetBitmap(create_scaled_bitmap("ams_readonly", this, TOPBAR_ICON_SIZE));
|
||||||
|
|
||||||
item = this->FindTool(ID_TITLE);
|
item = this->FindTool(ID_TITLE);
|
||||||
|
|
||||||
/*item = this->FindTool(ID_PUBLISH);
|
/*item = this->FindTool(ID_PUBLISH);
|
||||||
|
@ -581,6 +600,24 @@ void BBLTopbar::OnDropdownToolItem(wxAuiToolBarEvent& evt)
|
||||||
tb->SetToolSticky(evt.GetId(), false);
|
tb->SetToolSticky(evt.GetId(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BBLTopbar::OnCalibToolItem(wxAuiToolBarEvent& evt)
|
||||||
|
{
|
||||||
|
wxAuiToolBar* tb = static_cast<wxAuiToolBar*>(evt.GetEventObject());
|
||||||
|
|
||||||
|
tb->SetToolSticky(evt.GetId(), true);
|
||||||
|
|
||||||
|
if (!m_skip_popup_calib_menu) {
|
||||||
|
auto rec = this->GetToolRect(ID_CALIB);
|
||||||
|
PopupMenu(&m_calib_menu, wxPoint(rec.GetLeft(), this->GetSize().GetHeight() - 2));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_skip_popup_calib_menu = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure the button is "un-stuck"
|
||||||
|
tb->SetToolSticky(evt.GetId(), false);
|
||||||
|
}
|
||||||
|
|
||||||
void BBLTopbar::OnMouseLeftDown(wxMouseEvent& event)
|
void BBLTopbar::OnMouseLeftDown(wxMouseEvent& event)
|
||||||
{
|
{
|
||||||
wxPoint mouse_pos = ::wxGetMousePosition();
|
wxPoint mouse_pos = ::wxGetMousePosition();
|
||||||
|
|
|
@ -24,6 +24,7 @@ public:
|
||||||
void OnCloseFrame(wxAuiToolBarEvent& event);
|
void OnCloseFrame(wxAuiToolBarEvent& event);
|
||||||
void OnFileToolItem(wxAuiToolBarEvent& evt);
|
void OnFileToolItem(wxAuiToolBarEvent& evt);
|
||||||
void OnDropdownToolItem(wxAuiToolBarEvent& evt);
|
void OnDropdownToolItem(wxAuiToolBarEvent& evt);
|
||||||
|
void OnCalibToolItem(wxAuiToolBarEvent& evt);
|
||||||
void OnMouseLeftDClock(wxMouseEvent& mouse);
|
void OnMouseLeftDClock(wxMouseEvent& mouse);
|
||||||
void OnMouseLeftDown(wxMouseEvent& event);
|
void OnMouseLeftDown(wxMouseEvent& event);
|
||||||
void OnMouseLeftUp(wxMouseEvent& event);
|
void OnMouseLeftUp(wxMouseEvent& event);
|
||||||
|
@ -42,13 +43,14 @@ public:
|
||||||
void SetFileMenu(wxMenu* file_menu);
|
void SetFileMenu(wxMenu* file_menu);
|
||||||
void AddDropDownSubMenu(wxMenu* sub_menu, const wxString& title);
|
void AddDropDownSubMenu(wxMenu* sub_menu, const wxString& title);
|
||||||
void AddDropDownMenuItem(wxMenuItem* menu_item);
|
void AddDropDownMenuItem(wxMenuItem* menu_item);
|
||||||
wxMenu *GetTopMenu();
|
wxMenu* GetTopMenu();
|
||||||
|
wxMenu *GetCalibMenu();
|
||||||
void SetTitle(wxString title);
|
void SetTitle(wxString title);
|
||||||
void SetMaximizedSize();
|
void SetMaximizedSize();
|
||||||
void SetWindowSize();
|
void SetWindowSize();
|
||||||
|
|
||||||
void EnableUndoRedoItems();
|
void Enable3DEditorItems();
|
||||||
void DisableUndoRedoItems();
|
void Disable3DEditorItems();
|
||||||
|
|
||||||
void SaveNormalRect();
|
void SaveNormalRect();
|
||||||
|
|
||||||
|
@ -60,6 +62,7 @@ private:
|
||||||
wxPoint m_delta;
|
wxPoint m_delta;
|
||||||
wxMenu m_top_menu;
|
wxMenu m_top_menu;
|
||||||
wxMenu* m_file_menu;
|
wxMenu* m_file_menu;
|
||||||
|
wxMenu m_calib_menu;
|
||||||
wxAuiToolBarItem* m_title_item;
|
wxAuiToolBarItem* m_title_item;
|
||||||
wxAuiToolBarItem* m_account_item;
|
wxAuiToolBarItem* m_account_item;
|
||||||
wxAuiToolBarItem* m_model_store_item;
|
wxAuiToolBarItem* m_model_store_item;
|
||||||
|
@ -67,6 +70,7 @@ private:
|
||||||
wxAuiToolBarItem *m_publish_item;
|
wxAuiToolBarItem *m_publish_item;
|
||||||
wxAuiToolBarItem* m_undo_item;
|
wxAuiToolBarItem* m_undo_item;
|
||||||
wxAuiToolBarItem* m_redo_item;
|
wxAuiToolBarItem* m_redo_item;
|
||||||
|
wxAuiToolBarItem* m_calib_item;
|
||||||
wxAuiToolBarItem* maximize_btn;
|
wxAuiToolBarItem* maximize_btn;
|
||||||
|
|
||||||
wxBitmap m_publish_bitmap;
|
wxBitmap m_publish_bitmap;
|
||||||
|
@ -78,4 +82,5 @@ private:
|
||||||
int m_toolbar_h;
|
int m_toolbar_h;
|
||||||
bool m_skip_popup_file_menu;
|
bool m_skip_popup_file_menu;
|
||||||
bool m_skip_popup_dropdown_menu;
|
bool m_skip_popup_dropdown_menu;
|
||||||
|
bool m_skip_popup_calib_menu;
|
||||||
};
|
};
|
||||||
|
|
|
@ -120,6 +120,7 @@ public:
|
||||||
// Get the current print. It is either m_fff_print or m_sla_print.
|
// Get the current print. It is either m_fff_print or m_sla_print.
|
||||||
const PrintBase* current_print() const { return m_print; }
|
const PrintBase* current_print() const { return m_print; }
|
||||||
const Print* fff_print() const { return m_fff_print; }
|
const Print* fff_print() const { return m_fff_print; }
|
||||||
|
Print* fff_print() { return m_fff_print; }
|
||||||
const SLAPrint* sla_print() const { return m_sla_print; }
|
const SLAPrint* sla_print() const { return m_sla_print; }
|
||||||
// Take the project path (if provided), extract the name of the project, run it through the macro processor and save it next to the project file.
|
// Take the project path (if provided), extract the name of the project, run it through the macro processor and save it next to the project file.
|
||||||
// If the project_path is empty, just run output_filepath().
|
// If the project_path is empty, just run output_filepath().
|
||||||
|
|
|
@ -271,7 +271,6 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
|
||||||
}
|
}
|
||||||
|
|
||||||
double sparse_infill_density = config->option<ConfigOptionPercent>("sparse_infill_density")->value;
|
double sparse_infill_density = config->option<ConfigOptionPercent>("sparse_infill_density")->value;
|
||||||
auto timelapse_type = config->opt_enum<TimelapseType>("timelapse_type");
|
|
||||||
|
|
||||||
if (config->opt_bool("spiral_mode") &&
|
if (config->opt_bool("spiral_mode") &&
|
||||||
! (config->opt_int("wall_loops") == 1 &&
|
! (config->opt_int("wall_loops") == 1 &&
|
||||||
|
@ -280,12 +279,12 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
|
||||||
! config->opt_bool("enable_support") &&
|
! config->opt_bool("enable_support") &&
|
||||||
config->opt_int("enforce_support_layers") == 0 &&
|
config->opt_int("enforce_support_layers") == 0 &&
|
||||||
config->opt_bool("ensure_vertical_shell_thickness") &&
|
config->opt_bool("ensure_vertical_shell_thickness") &&
|
||||||
! config->opt_bool("detect_thin_wall") &&
|
! config->opt_bool("detect_thin_wall")))
|
||||||
config->opt_enum<TimelapseType>("timelapse_type") == TimelapseType::tlTraditional))
|
|
||||||
{
|
{
|
||||||
wxString msg_text = _(L("Spiral mode only works when wall loops is 1, support is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional"));
|
wxString msg_text = _(L("Spiral mode only works when wall loops is 1, \n"
|
||||||
|
"support is disabled, top shell layers is 0 and sparse infill density is 0\n"));
|
||||||
if (is_global_config)
|
if (is_global_config)
|
||||||
msg_text += "\n\n" + _(L("Change these settings automatically? \n"
|
msg_text += "\n" + _(L("Change these settings automatically? \n"
|
||||||
"Yes - Change these settings and enable spiral mode automatically\n"
|
"Yes - Change these settings and enable spiral mode automatically\n"
|
||||||
"No - Give up using spiral mode this time"));
|
"No - Give up using spiral mode this time"));
|
||||||
MessageDialog dialog(m_msg_dlg_parent, msg_text, "",
|
MessageDialog dialog(m_msg_dlg_parent, msg_text, "",
|
||||||
|
@ -302,9 +301,7 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
|
||||||
new_conf.set_key_value("enforce_support_layers", new ConfigOptionInt(0));
|
new_conf.set_key_value("enforce_support_layers", new ConfigOptionInt(0));
|
||||||
new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(true));
|
new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(true));
|
||||||
new_conf.set_key_value("detect_thin_wall", new ConfigOptionBool(false));
|
new_conf.set_key_value("detect_thin_wall", new ConfigOptionBool(false));
|
||||||
new_conf.set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
|
|
||||||
sparse_infill_density = 0;
|
sparse_infill_density = 0;
|
||||||
timelapse_type = TimelapseType::tlTraditional;
|
|
||||||
support = false;
|
support = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -313,7 +310,6 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
|
||||||
apply(config, &new_conf);
|
apply(config, &new_conf);
|
||||||
if (cb_value_change) {
|
if (cb_value_change) {
|
||||||
cb_value_change("sparse_infill_density", sparse_infill_density);
|
cb_value_change("sparse_infill_density", sparse_infill_density);
|
||||||
cb_value_change("timelapse_type", timelapse_type);
|
|
||||||
if (!support)
|
if (!support)
|
||||||
cb_value_change("enable_support", false);
|
cb_value_change("enable_support", false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1259,29 +1259,6 @@ bool MachineObject::is_recording()
|
||||||
return camera_recording;
|
return camera_recording;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MachineObject::parse_version_func()
|
|
||||||
{
|
|
||||||
auto ota_version = module_vers.find("ota");
|
|
||||||
if (printer_type == "BL-P001" ||
|
|
||||||
printer_type == "BL-P002") {
|
|
||||||
if (ota_version != module_vers.end()) {
|
|
||||||
if (ota_version->second.sw_ver.compare("01.01.01.00") <= 0) {
|
|
||||||
ams_support_remain = false;
|
|
||||||
ams_support_auto_switch_filament_flag = false;
|
|
||||||
is_xcam_buildplate_supported = false;
|
|
||||||
xcam_support_recovery_step_loss = false;
|
|
||||||
is_support_send_to_sdcard = false;
|
|
||||||
} else {
|
|
||||||
ams_support_remain = true;
|
|
||||||
ams_support_auto_switch_filament_flag = true;
|
|
||||||
is_xcam_buildplate_supported = true;
|
|
||||||
xcam_support_recovery_step_loss = true;
|
|
||||||
is_support_send_to_sdcard = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int MachineObject::command_get_version(bool with_retry)
|
int MachineObject::command_get_version(bool with_retry)
|
||||||
{
|
{
|
||||||
BOOST_LOG_TRIVIAL(info) << "command_get_version";
|
BOOST_LOG_TRIVIAL(info) << "command_get_version";
|
||||||
|
@ -2013,15 +1990,9 @@ bool MachineObject::is_function_supported(PrinterFunction func)
|
||||||
func_name = "FUNC_AI_MONITORING";
|
func_name = "FUNC_AI_MONITORING";
|
||||||
break;
|
break;
|
||||||
case FUNC_BUILDPLATE_MARKER_DETECT:
|
case FUNC_BUILDPLATE_MARKER_DETECT:
|
||||||
parse_version_func();
|
|
||||||
if (!is_xcam_buildplate_supported)
|
|
||||||
return false;
|
|
||||||
func_name = "FUNC_BUILDPLATE_MARKER_DETECT";
|
func_name = "FUNC_BUILDPLATE_MARKER_DETECT";
|
||||||
break;
|
break;
|
||||||
case FUNC_AUTO_RECOVERY_STEP_LOSS:
|
case FUNC_AUTO_RECOVERY_STEP_LOSS:
|
||||||
parse_version_func();
|
|
||||||
if (!xcam_support_recovery_step_loss)
|
|
||||||
return false;
|
|
||||||
func_name = "FUNC_AUTO_RECOVERY_STEP_LOSS";
|
func_name = "FUNC_AUTO_RECOVERY_STEP_LOSS";
|
||||||
break;
|
break;
|
||||||
case FUNC_FLOW_CALIBRATION:
|
case FUNC_FLOW_CALIBRATION:
|
||||||
|
@ -2055,15 +2026,9 @@ bool MachineObject::is_function_supported(PrinterFunction func)
|
||||||
func_name = "FUNC_ALTER_RESOLUTION";
|
func_name = "FUNC_ALTER_RESOLUTION";
|
||||||
break;
|
break;
|
||||||
case FUNC_SEND_TO_SDCARD:
|
case FUNC_SEND_TO_SDCARD:
|
||||||
parse_version_func();
|
|
||||||
if (!is_support_send_to_sdcard)
|
|
||||||
return false;
|
|
||||||
func_name = "FUNC_SEND_TO_SDCARD";
|
func_name = "FUNC_SEND_TO_SDCARD";
|
||||||
break;
|
break;
|
||||||
case FUNC_AUTO_SWITCH_FILAMENT:
|
case FUNC_AUTO_SWITCH_FILAMENT:
|
||||||
parse_version_func();
|
|
||||||
if (!ams_support_auto_switch_filament_flag)
|
|
||||||
return false;
|
|
||||||
func_name = "FUNC_AUTO_SWITCH_FILAMENT";
|
func_name = "FUNC_AUTO_SWITCH_FILAMENT";
|
||||||
break;
|
break;
|
||||||
case FUNC_VIRTUAL_CAMERA:
|
case FUNC_VIRTUAL_CAMERA:
|
||||||
|
@ -2650,9 +2615,6 @@ int MachineObject::parse_json(std::string payload)
|
||||||
else {
|
else {
|
||||||
if (jj["xcam"].contains("buildplate_marker_detector")) {
|
if (jj["xcam"].contains("buildplate_marker_detector")) {
|
||||||
xcam_buildplate_marker_detector = jj["xcam"]["buildplate_marker_detector"].get<bool>();
|
xcam_buildplate_marker_detector = jj["xcam"]["buildplate_marker_detector"].get<bool>();
|
||||||
is_xcam_buildplate_supported = true;
|
|
||||||
} else {
|
|
||||||
is_xcam_buildplate_supported = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2912,8 +2874,6 @@ int MachineObject::parse_json(std::string payload)
|
||||||
}
|
}
|
||||||
if (tray_it->contains("remain")) {
|
if (tray_it->contains("remain")) {
|
||||||
curr_tray->remain = (*tray_it)["remain"].get<int>();
|
curr_tray->remain = (*tray_it)["remain"].get<int>();
|
||||||
} else {
|
|
||||||
curr_tray->remain = -1;
|
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (!ams_id.empty() && !curr_tray->id.empty()) {
|
if (!ams_id.empty() && !curr_tray->id.empty()) {
|
||||||
|
@ -3061,7 +3021,6 @@ int MachineObject::parse_json(std::string payload)
|
||||||
ver_info.hw_ver = (*it)["hw_ver"].get<std::string>();
|
ver_info.hw_ver = (*it)["hw_ver"].get<std::string>();
|
||||||
module_vers.emplace(ver_info.name, ver_info);
|
module_vers.emplace(ver_info.name, ver_info);
|
||||||
}
|
}
|
||||||
parse_version_func();
|
|
||||||
bool get_version_result = true;
|
bool get_version_result = true;
|
||||||
if (j["info"].contains("result"))
|
if (j["info"].contains("result"))
|
||||||
if (j["info"]["result"].get<std::string>() == "fail")
|
if (j["info"]["result"].get<std::string>() == "fail")
|
||||||
|
|
|
@ -423,10 +423,8 @@ public:
|
||||||
bool ams_insert_flag { false };
|
bool ams_insert_flag { false };
|
||||||
bool ams_power_on_flag { false };
|
bool ams_power_on_flag { false };
|
||||||
bool ams_calibrate_remain_flag { false };
|
bool ams_calibrate_remain_flag { false };
|
||||||
bool ams_support_auto_switch_filament_flag { true };
|
|
||||||
bool ams_auto_switch_filament_flag { false };
|
bool ams_auto_switch_filament_flag { false };
|
||||||
bool ams_support_use_ams { false };
|
bool ams_support_use_ams { false };
|
||||||
bool ams_support_remain { true };
|
|
||||||
int ams_humidity;
|
int ams_humidity;
|
||||||
int ams_user_setting_hold_count = 0;
|
int ams_user_setting_hold_count = 0;
|
||||||
AmsStatusMain ams_status_main;
|
AmsStatusMain ams_status_main;
|
||||||
|
@ -581,10 +579,8 @@ public:
|
||||||
bool xcam_ai_monitoring{ false };
|
bool xcam_ai_monitoring{ false };
|
||||||
int xcam_ai_monitoring_hold_count = 0;
|
int xcam_ai_monitoring_hold_count = 0;
|
||||||
std::string xcam_ai_monitoring_sensitivity;
|
std::string xcam_ai_monitoring_sensitivity;
|
||||||
bool is_xcam_buildplate_supported { true };
|
|
||||||
bool xcam_buildplate_marker_detector{ false };
|
bool xcam_buildplate_marker_detector{ false };
|
||||||
int xcam_buildplate_marker_hold_count = 0;
|
int xcam_buildplate_marker_hold_count = 0;
|
||||||
bool xcam_support_recovery_step_loss { true };
|
|
||||||
bool xcam_auto_recovery_step_loss{ false };
|
bool xcam_auto_recovery_step_loss{ false };
|
||||||
int xcam_auto_recovery_hold_count = 0;
|
int xcam_auto_recovery_hold_count = 0;
|
||||||
int ams_print_option_count = 0;
|
int ams_print_option_count = 0;
|
||||||
|
@ -592,7 +588,6 @@ public:
|
||||||
/* sdcard */
|
/* sdcard */
|
||||||
MachineObject::SdcardState sdcard_state { NO_SDCARD };
|
MachineObject::SdcardState sdcard_state { NO_SDCARD };
|
||||||
MachineObject::SdcardState get_sdcard_state();
|
MachineObject::SdcardState get_sdcard_state();
|
||||||
bool is_support_send_to_sdcard { true };
|
|
||||||
|
|
||||||
/* HMS */
|
/* HMS */
|
||||||
std::vector<HMSItem> hms_list;
|
std::vector<HMSItem> hms_list;
|
||||||
|
@ -627,8 +622,6 @@ public:
|
||||||
|
|
||||||
MachineObject(NetworkAgent* agent, std::string name, std::string id, std::string ip);
|
MachineObject(NetworkAgent* agent, std::string name, std::string id, std::string ip);
|
||||||
~MachineObject();
|
~MachineObject();
|
||||||
|
|
||||||
void parse_version_func();
|
|
||||||
/* command commands */
|
/* command commands */
|
||||||
int command_get_version(bool with_retry = true);
|
int command_get_version(bool with_retry = true);
|
||||||
int command_request_push_all();
|
int command_request_push_all();
|
||||||
|
|
|
@ -32,6 +32,7 @@ wxDEFINE_EVENT(EVT_GLTOOLBAR_PRINT_SELECT, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER_ALL, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER_ALL, SimpleEvent);
|
||||||
|
|
||||||
|
|
||||||
wxDEFINE_EVENT(EVT_GLTOOLBAR_ADD, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLTOOLBAR_ADD, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLTOOLBAR_DELETE, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLTOOLBAR_DELETE, SimpleEvent);
|
||||||
wxDEFINE_EVENT(EVT_GLTOOLBAR_DELETE_ALL, SimpleEvent);
|
wxDEFINE_EVENT(EVT_GLTOOLBAR_DELETE_ALL, SimpleEvent);
|
||||||
|
|
|
@ -32,6 +32,7 @@ wxDECLARE_EVENT(EVT_GLTOOLBAR_PRINT_SELECT, SimpleEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER, SimpleEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER_ALL, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLTOOLBAR_SEND_TO_PRINTER_ALL, SimpleEvent);
|
||||||
|
|
||||||
|
|
||||||
wxDECLARE_EVENT(EVT_GLTOOLBAR_ADD, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLTOOLBAR_ADD, SimpleEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLTOOLBAR_DELETE, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLTOOLBAR_DELETE, SimpleEvent);
|
||||||
wxDECLARE_EVENT(EVT_GLTOOLBAR_DELETE_ALL, SimpleEvent);
|
wxDECLARE_EVENT(EVT_GLTOOLBAR_DELETE_ALL, SimpleEvent);
|
||||||
|
|
|
@ -728,7 +728,7 @@ static const FileWildcards file_wildcards_by_type[FT_SIZE] = {
|
||||||
/* FT_OBJ */ { "OBJ files"sv, { ".obj"sv } },
|
/* FT_OBJ */ { "OBJ files"sv, { ".obj"sv } },
|
||||||
/* FT_AMF */ { "AMF files"sv, { ".amf"sv, ".zip.amf"sv, ".xml"sv } },
|
/* FT_AMF */ { "AMF files"sv, { ".amf"sv, ".zip.amf"sv, ".xml"sv } },
|
||||||
/* FT_3MF */ { "3MF files"sv, { ".3mf"sv } },
|
/* FT_3MF */ { "3MF files"sv, { ".3mf"sv } },
|
||||||
/* FT_GCODE */ { "G-code files"sv, { ".gcode"sv } },
|
/* FT_GCODE */ { "G-code files"sv, { ".gcode"sv, ".3mf"sv } },
|
||||||
/* FT_MODEL */ {"Supported files"sv, {".3mf"sv, ".stl"sv, ".stp"sv, ".step"sv, ".svg"sv, ".amf"sv, ".obj"sv }},
|
/* FT_MODEL */ {"Supported files"sv, {".3mf"sv, ".stl"sv, ".stp"sv, ".step"sv, ".svg"sv, ".amf"sv, ".obj"sv }},
|
||||||
/* FT_PROJECT */ { "Project files"sv, { ".3mf"sv} },
|
/* FT_PROJECT */ { "Project files"sv, { ".3mf"sv} },
|
||||||
/* FT_GALLERY */ { "Known files"sv, { ".stl"sv, ".obj"sv } },
|
/* FT_GALLERY */ { "Known files"sv, { ".stl"sv, ".obj"sv } },
|
||||||
|
@ -1892,9 +1892,6 @@ void GUI_App::init_app_config()
|
||||||
if (! wxGetEnv(wxS("XDG_CONFIG_HOME"), &dir) || dir.empty() )
|
if (! wxGetEnv(wxS("XDG_CONFIG_HOME"), &dir) || dir.empty() )
|
||||||
dir = wxFileName::GetHomeDir() + wxS("/.config");
|
dir = wxFileName::GetHomeDir() + wxS("/.config");
|
||||||
set_data_dir((dir + "/" + GetAppName()).ToUTF8().data());
|
set_data_dir((dir + "/" + GetAppName()).ToUTF8().data());
|
||||||
boost::filesystem::path data_dir_path(data_dir());
|
|
||||||
if (!boost::filesystem::exists(data_dir_path))
|
|
||||||
boost::filesystem::create_directory(data_dir_path);
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
m_datadir_redefined = true;
|
m_datadir_redefined = true;
|
||||||
|
@ -3238,7 +3235,7 @@ void GUI_App::load_gcode(wxWindow* parent, wxString& input_file) const
|
||||||
{
|
{
|
||||||
input_file.Clear();
|
input_file.Clear();
|
||||||
wxFileDialog dialog(parent ? parent : GetTopWindow(),
|
wxFileDialog dialog(parent ? parent : GetTopWindow(),
|
||||||
_L("Choose one file (gcode/.gco/.g/.ngc/ngc):"),
|
_L("Choose one file (gcode/3mf):"),
|
||||||
app_config->get_last_dir(), "",
|
app_config->get_last_dir(), "",
|
||||||
file_wildcards(FT_GCODE), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
file_wildcards(FT_GCODE), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||||||
|
|
||||||
|
|
|
@ -201,7 +201,7 @@ void GridCellFilamentsEditor::BeginEdit(int row, int col, wxGrid* grid)
|
||||||
{
|
{
|
||||||
// This event handler is needed to properly dismiss the editor when the popup is closed
|
// This event handler is needed to properly dismiss the editor when the popup is closed
|
||||||
m_control->Bind(wxEVT_COMBOBOX_CLOSEUP, &GridCellFilamentsEditor::OnComboCloseUp, this);
|
m_control->Bind(wxEVT_COMBOBOX_CLOSEUP, &GridCellFilamentsEditor::OnComboCloseUp, this);
|
||||||
evtHandler = static_cast<wxGridCellEditorEvtHandler*>(m_control->GetEventHandler());
|
evtHandler = wxDynamicCast(m_control->GetEventHandler(), wxGridCellEditorEvtHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't immediately end if we get a kill focus event within BeginEdit
|
// Don't immediately end if we get a kill focus event within BeginEdit
|
||||||
|
@ -403,7 +403,7 @@ void GridCellChoiceEditor::BeginEdit(int row, int col, wxGrid *grid)
|
||||||
if (m_control) {
|
if (m_control) {
|
||||||
// This event handler is needed to properly dismiss the editor when the popup is closed
|
// This event handler is needed to properly dismiss the editor when the popup is closed
|
||||||
m_control->Bind(wxEVT_COMBOBOX_CLOSEUP, &GridCellChoiceEditor::OnComboCloseUp, this);
|
m_control->Bind(wxEVT_COMBOBOX_CLOSEUP, &GridCellChoiceEditor::OnComboCloseUp, this);
|
||||||
evtHandler = static_cast<wxGridCellEditorEvtHandler*>(m_control->GetEventHandler());
|
evtHandler = wxDynamicCast(m_control->GetEventHandler(), wxGridCellEditorEvtHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't immediately end if we get a kill focus event within BeginEdit
|
// Don't immediately end if we get a kill focus event within BeginEdit
|
||||||
|
|
|
@ -904,10 +904,10 @@ void MainFrame::init_tabpanel()
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
if (sel == tp3DEditor) {
|
if (sel == tp3DEditor) {
|
||||||
m_topbar->EnableUndoRedoItems();
|
m_topbar->Enable3DEditorItems();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_topbar->DisableUndoRedoItems();
|
m_topbar->Disable3DEditorItems();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1360,6 +1360,9 @@ wxBoxSizer* MainFrame::create_side_tools()
|
||||||
m_print_option_btn = new SideButton(this, "", "sidebutton_dropdown", 0, FromDIP(14));
|
m_print_option_btn = new SideButton(this, "", "sidebutton_dropdown", 0, FromDIP(14));
|
||||||
|
|
||||||
update_side_button_style();
|
update_side_button_style();
|
||||||
|
m_print_option_btn->Enable();
|
||||||
|
sizer->Add(FromDIP(15), 0, 0, 0, 0);
|
||||||
|
|
||||||
m_slice_option_btn->Enable();
|
m_slice_option_btn->Enable();
|
||||||
m_print_option_btn->Enable();
|
m_print_option_btn->Enable();
|
||||||
sizer->Add(m_slice_option_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(1));
|
sizer->Add(m_slice_option_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(1));
|
||||||
|
@ -1556,6 +1559,7 @@ wxBoxSizer* MainFrame::create_side_tools()
|
||||||
p->append_button(send_to_printer_btn);
|
p->append_button(send_to_printer_btn);
|
||||||
p->append_button(send_to_printer_all_btn);
|
p->append_button(send_to_printer_all_btn);
|
||||||
p->append_button(export_sliced_file_btn);
|
p->append_button(export_sliced_file_btn);
|
||||||
|
//p->append_button(export_gcode_btn);
|
||||||
p->append_button(export_all_sliced_file_btn);
|
p->append_button(export_all_sliced_file_btn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1703,6 +1707,7 @@ void MainFrame::update_side_button_style()
|
||||||
// BBS
|
// BBS
|
||||||
int em = em_unit();
|
int em = em_unit();
|
||||||
|
|
||||||
|
m_slice_btn->SetLayoutStyle(1);
|
||||||
/*m_slice_btn->SetLayoutStyle(1);
|
/*m_slice_btn->SetLayoutStyle(1);
|
||||||
m_slice_btn->SetTextLayout(SideButton::EHorizontalOrientation::HO_Center, FromDIP(15));
|
m_slice_btn->SetTextLayout(SideButton::EHorizontalOrientation::HO_Center, FromDIP(15));
|
||||||
m_slice_btn->SetMinSize(wxSize(-1, FromDIP(24)));
|
m_slice_btn->SetMinSize(wxSize(-1, FromDIP(24)));
|
||||||
|
@ -2454,6 +2459,14 @@ void MainFrame::init_menubar_as_editor()
|
||||||
//m_topbar->AddDropDownMenuItem(language_item);
|
//m_topbar->AddDropDownMenuItem(language_item);
|
||||||
//m_topbar->AddDropDownMenuItem(config_item);
|
//m_topbar->AddDropDownMenuItem(config_item);
|
||||||
m_topbar->AddDropDownSubMenu(helpMenu, _L("Help"));
|
m_topbar->AddDropDownSubMenu(helpMenu, _L("Help"));
|
||||||
|
|
||||||
|
// SoftFever calibrations
|
||||||
|
append_menu_item(m_topbar->GetCalibMenu(), wxID_ANY, _L("PA - DDE"), _L("Calibrate PA - DDE"),
|
||||||
|
[this](wxCommandEvent&) { if (m_plater) m_plater->calib_pa(false); }, "", nullptr,
|
||||||
|
[this]() {return m_plater->is_view3D_shown();; }, this);
|
||||||
|
append_menu_item(m_topbar->GetCalibMenu(), wxID_ANY, _L("PA - Bowden"), _L("Calibrate PA - Bowden"),
|
||||||
|
[this](wxCommandEvent&) { if (m_plater) m_plater->calib_pa(true); }, "", nullptr,
|
||||||
|
[this]() {return m_plater->is_view3D_shown();; }, this);
|
||||||
#else
|
#else
|
||||||
m_menubar->Append(fileMenu, wxString::Format("&%s", _L("File")));
|
m_menubar->Append(fileMenu, wxString::Format("&%s", _L("File")));
|
||||||
if (editMenu)
|
if (editMenu)
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
#include "MsgDialog.hpp"
|
#include "MsgDialog.hpp"
|
||||||
#include "DownloadProgressDialog.hpp"
|
#include "DownloadProgressDialog.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/string_file.hpp>
|
|
||||||
#undef pid_t
|
#undef pid_t
|
||||||
#include <boost/process.hpp>
|
#include <boost/process.hpp>
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
|
|
|
@ -1198,28 +1198,6 @@ std::vector<int> PartPlate::get_extruders() const
|
||||||
return plate_extruders;
|
return plate_extruders;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> PartPlate::get_used_extruders()
|
|
||||||
{
|
|
||||||
std::vector<int> used_extruders;
|
|
||||||
// if gcode.3mf file
|
|
||||||
if (m_model->objects.empty()) {
|
|
||||||
for (int i = 0; i < slice_filaments_info.size(); i++) {
|
|
||||||
used_extruders.push_back(slice_filaments_info[i].id + 1);
|
|
||||||
}
|
|
||||||
return used_extruders;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeProcessorResult* result = get_slice_result();
|
|
||||||
if (!result)
|
|
||||||
return used_extruders;
|
|
||||||
|
|
||||||
PrintEstimatedStatistics& ps = result->print_statistics;
|
|
||||||
for (auto it = ps.volumes_per_extruder.begin(); it != ps.volumes_per_extruder.end(); it++) {
|
|
||||||
used_extruders.push_back(it->first + 1);
|
|
||||||
}
|
|
||||||
return used_extruders;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vec3d PartPlate::estimate_wipe_tower_size(const double w, const double wipe_volume) const
|
Vec3d PartPlate::estimate_wipe_tower_size(const double w, const double wipe_volume) const
|
||||||
{
|
{
|
||||||
Vec3d wipe_tower_size;
|
Vec3d wipe_tower_size;
|
||||||
|
|
|
@ -259,7 +259,6 @@ public:
|
||||||
Vec3d get_origin() { return m_origin; }
|
Vec3d get_origin() { return m_origin; }
|
||||||
Vec3d estimate_wipe_tower_size(const double w, const double wipe_volume) const;
|
Vec3d estimate_wipe_tower_size(const double w, const double wipe_volume) const;
|
||||||
std::vector<int> get_extruders() const;
|
std::vector<int> get_extruders() const;
|
||||||
std::vector<int> get_used_extruders();
|
|
||||||
|
|
||||||
/* instance related operations*/
|
/* instance related operations*/
|
||||||
//judge whether instance is bound in plate or not
|
//judge whether instance is bound in plate or not
|
||||||
|
|
|
@ -7398,7 +7398,7 @@ Print& Plater::fff_print() { return p->fff_print; }
|
||||||
const SLAPrint& Plater::sla_print() const { return p->sla_print; }
|
const SLAPrint& Plater::sla_print() const { return p->sla_print; }
|
||||||
SLAPrint& Plater::sla_print() { return p->sla_print; }
|
SLAPrint& Plater::sla_print() { return p->sla_print; }
|
||||||
|
|
||||||
int Plater::new_project(bool skip_confirm, bool silent)
|
int Plater::new_project(bool skip_confirm, bool silent, const wxString& project_name)
|
||||||
{
|
{
|
||||||
bool transfer_preset_changes = false;
|
bool transfer_preset_changes = false;
|
||||||
// BBS: save confirm
|
// BBS: save confirm
|
||||||
|
@ -7438,7 +7438,10 @@ int Plater::new_project(bool skip_confirm, bool silent)
|
||||||
//reset project
|
//reset project
|
||||||
p->project.reset();
|
p->project.reset();
|
||||||
//set project name
|
//set project name
|
||||||
p->set_project_name(_L("Untitled"));
|
if (project_name.empty())
|
||||||
|
p->set_project_name(_L("Untitled"));
|
||||||
|
else
|
||||||
|
p->set_project_name(project_name);
|
||||||
|
|
||||||
Plater::TakeSnapshot snapshot(this, "New Project", UndoRedo::SnapshotType::ProjectSeparator);
|
Plater::TakeSnapshot snapshot(this, "New Project", UndoRedo::SnapshotType::ProjectSeparator);
|
||||||
|
|
||||||
|
@ -7800,16 +7803,22 @@ bool Plater::up_to_date(bool saved, bool backup)
|
||||||
!Slic3r::has_other_changes(backup));
|
!Slic3r::has_other_changes(backup));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plater::add_model(bool imperial_units/* = false*/)
|
void Plater::add_model(bool imperial_units/* = false*/, std::string fname/* = ""*/)
|
||||||
{
|
{
|
||||||
wxArrayString input_files;
|
|
||||||
wxGetApp().import_model(this, input_files);
|
|
||||||
if (input_files.empty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::vector<fs::path> paths;
|
std::vector<fs::path> paths;
|
||||||
for (const auto &file : input_files)
|
|
||||||
paths.emplace_back(into_path(file));
|
if(fname.empty()){
|
||||||
|
wxArrayString input_files;
|
||||||
|
wxGetApp().import_model(this, input_files);
|
||||||
|
if (input_files.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (const auto &file : input_files)
|
||||||
|
paths.emplace_back(into_path(file));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
paths.emplace_back(fname);
|
||||||
|
}
|
||||||
|
|
||||||
std::string snapshot_label;
|
std::string snapshot_label;
|
||||||
assert(! paths.empty());
|
assert(! paths.empty());
|
||||||
|
@ -7856,6 +7865,16 @@ void Plater::add_model(bool imperial_units/* = false*/)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Plater::calib_pa(bool bowden) {
|
||||||
|
const auto calib_pa_name = "Pressure Advance Test";
|
||||||
|
new_project(false, false, calib_pa_name);
|
||||||
|
add_model(false, Slic3r::resources_dir() + "/calib/pressure_advance_test.stl");
|
||||||
|
wxGetApp().mainframe->select_tab(size_t(MainFrame::tp3DEditor));
|
||||||
|
|
||||||
|
p->background_process.fff_print()->is_calib_mode() = bowden ? Calib_PA_Bowden : Calib_PA_DDE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void Plater::import_sl1_archive()
|
void Plater::import_sl1_archive()
|
||||||
{
|
{
|
||||||
if (!p->m_ui_jobs.is_any_running())
|
if (!p->m_ui_jobs.is_any_running())
|
||||||
|
@ -8627,6 +8646,9 @@ void Plater::add_file()
|
||||||
break;
|
break;
|
||||||
default:break;
|
default:break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SoftFever: ugly fix so we can exist pa calib mode
|
||||||
|
p->background_process.fff_print()->is_calib_mode() = Calib_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plater::update() { p->update(); }
|
void Plater::update() { p->update(); }
|
||||||
|
|
|
@ -202,7 +202,7 @@ public:
|
||||||
const SLAPrint& sla_print() const;
|
const SLAPrint& sla_print() const;
|
||||||
SLAPrint& sla_print();
|
SLAPrint& sla_print();
|
||||||
|
|
||||||
int new_project(bool skip_confirm = false, bool silent = false);
|
int new_project(bool skip_confirm = false, bool silent = false, const wxString& project_name = wxString());
|
||||||
// BBS: save & backup
|
// BBS: save & backup
|
||||||
void load_project(wxString const & filename = "", wxString const & originfile = "-");
|
void load_project(wxString const & filename = "", wxString const & originfile = "-");
|
||||||
int save_project(bool saveAs = false);
|
int save_project(bool saveAs = false);
|
||||||
|
@ -217,7 +217,7 @@ public:
|
||||||
bool open_3mf_file(const fs::path &file_path);
|
bool open_3mf_file(const fs::path &file_path);
|
||||||
int get_3mf_file_count(std::vector<fs::path> paths);
|
int get_3mf_file_count(std::vector<fs::path> paths);
|
||||||
void add_file();
|
void add_file();
|
||||||
void add_model(bool imperial_units = false);
|
void add_model(bool imperial_units = false, std::string fname = "");
|
||||||
void import_sl1_archive();
|
void import_sl1_archive();
|
||||||
void extract_config_from_project();
|
void extract_config_from_project();
|
||||||
void load_gcode();
|
void load_gcode();
|
||||||
|
@ -225,6 +225,9 @@ public:
|
||||||
void reload_gcode_from_disk();
|
void reload_gcode_from_disk();
|
||||||
void refresh_print();
|
void refresh_print();
|
||||||
|
|
||||||
|
// SoftFever
|
||||||
|
void calib_pa(bool bowden = false);
|
||||||
|
|
||||||
//BBS: add only gcode mode
|
//BBS: add only gcode mode
|
||||||
bool only_gcode_mode() { return m_only_gcode; }
|
bool only_gcode_mode() { return m_only_gcode; }
|
||||||
void set_only_gcode(bool only_gcode) { m_only_gcode = only_gcode; }
|
void set_only_gcode(bool only_gcode) { m_only_gcode = only_gcode; }
|
||||||
|
|
|
@ -2930,7 +2930,7 @@ void SelectMachineDialog::set_default()
|
||||||
}
|
}
|
||||||
|
|
||||||
// material info
|
// material info
|
||||||
auto extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_used_extruders();
|
auto extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_extruders();
|
||||||
BitmapCache bmcache;
|
BitmapCache bmcache;
|
||||||
|
|
||||||
MaterialHash::iterator iter = m_materialList.begin();
|
MaterialHash::iterator iter = m_materialList.begin();
|
||||||
|
|
|
@ -2707,7 +2707,7 @@ void Selection::paste_objects_from_clipboard()
|
||||||
auto start_offset = in_current ? src_object->instances.front()->get_offset() : plate->get_build_volume().center();
|
auto start_offset = in_current ? src_object->instances.front()->get_offset() : plate->get_build_volume().center();
|
||||||
auto point_offset = start_offset - start_point;
|
auto point_offset = start_offset - start_point;
|
||||||
auto empty_cell = wxGetApp().plater()->canvas3D()->get_nearest_empty_cell({start_point(0), start_point(1)}, {bbox.size()(0)+1, bbox.size()(1)+1});
|
auto empty_cell = wxGetApp().plater()->canvas3D()->get_nearest_empty_cell({start_point(0), start_point(1)}, {bbox.size()(0)+1, bbox.size()(1)+1});
|
||||||
displacement = {empty_cell.x() + point_offset.x(), empty_cell.y() + point_offset.y(), start_offset(2)};
|
displacement = {empty_cell.x() + point_offset.x(), empty_cell.y() + point_offset.y(), start_point(2)};
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ModelInstance* inst : dst_object->instances)
|
for (ModelInstance* inst : dst_object->instances)
|
||||||
|
|
|
@ -1807,7 +1807,6 @@ void StatusPanel::update_ams(MachineObject *obj)
|
||||||
// update obj in sub dlg
|
// update obj in sub dlg
|
||||||
if (m_ams_setting_dlg) {
|
if (m_ams_setting_dlg) {
|
||||||
m_ams_setting_dlg->obj = obj;
|
m_ams_setting_dlg->obj = obj;
|
||||||
|
|
||||||
if (obj && m_ams_setting_dlg->IsShown()) {
|
if (obj && m_ams_setting_dlg->IsShown()) {
|
||||||
m_ams_setting_dlg->update_insert_material_read_mode(obj->ams_insert_flag);
|
m_ams_setting_dlg->update_insert_material_read_mode(obj->ams_insert_flag);
|
||||||
m_ams_setting_dlg->update_starting_read_mode(obj->ams_power_on_flag);
|
m_ams_setting_dlg->update_starting_read_mode(obj->ams_power_on_flag);
|
||||||
|
@ -2446,7 +2445,6 @@ void StatusPanel::on_ams_setting_click(SimpleEvent &event)
|
||||||
try {
|
try {
|
||||||
int ams_id_int = atoi(ams_id.c_str());
|
int ams_id_int = atoi(ams_id.c_str());
|
||||||
m_ams_setting_dlg->ams_id = ams_id_int;
|
m_ams_setting_dlg->ams_id = ams_id_int;
|
||||||
m_ams_setting_dlg->ams_support_remain = obj->ams_support_remain;
|
|
||||||
m_ams_setting_dlg->Show();
|
m_ams_setting_dlg->Show();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
;
|
;
|
||||||
|
|
|
@ -4,13 +4,9 @@
|
||||||
|
|
||||||
#include <wx/webviewarchivehandler.h>
|
#include <wx/webviewarchivehandler.h>
|
||||||
#include <wx/webviewfshandler.h>
|
#include <wx/webviewfshandler.h>
|
||||||
#if wxUSE_WEBVIEW_EDGE
|
|
||||||
#include <wx/msw/webview_edge.h>
|
#include <wx/msw/webview_edge.h>
|
||||||
#endif
|
|
||||||
#include <wx/uri.h>
|
#include <wx/uri.h>
|
||||||
#if defined(__WIN32__) || defined(__WXMAC__)
|
|
||||||
#include "wx/private/jsscriptwrapper.h"
|
#include "wx/private/jsscriptwrapper.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
#include "../WebView2.h"
|
#include "../WebView2.h"
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
|
|
||||||
#include <cstdint> // uint8_t
|
#include <cstdint> // uint8_t
|
||||||
#include <ctype.h> // ::tolower, ::toupper
|
#include <ctype.h> // ::tolower, ::toupper
|
||||||
#include <cwctype> // ::towlower
|
|
||||||
#include <cstring> // memcpy
|
#include <cstring> // memcpy
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <boost/filesystem/string_file.hpp>
|
|
||||||
#include <boost/filesystem/fstream.hpp>
|
#include <boost/filesystem/fstream.hpp>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/log/trivial.hpp>
|
#include <boost/log/trivial.hpp>
|
||||||
|
|
|
@ -11,4 +11,4 @@ if(NOT DEFINED BBL_INTERNAL_TESTING)
|
||||||
set(BBL_INTERNAL_TESTING "1")
|
set(BBL_INTERNAL_TESTING "1")
|
||||||
endif()
|
endif()
|
||||||
set(SLIC3R_VERSION "01.04.00.18")
|
set(SLIC3R_VERSION "01.04.00.18")
|
||||||
set(SoftFever_VERSION "1.4.0")
|
set(SoftFever_VERSION "1.4.1_dev")
|
Loading…
Add table
Add a link
Reference in a new issue